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 *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 strncpy((char *)IF_DEF_PARAMS(ifp
)->auth_simple
,
958 vl_config
->auth_key
, OSPF_AUTH_SIMPLE_SIZE
);
959 } else if (vl_config
->md5_key
) {
960 if (ospf_crypt_key_lookup(IF_DEF_PARAMS(ifp
)->auth_crypt
,
961 vl_config
->crypto_key_id
)
963 vty_out(vty
, "OSPF: Key %d already exists\n",
964 vl_config
->crypto_key_id
);
967 ck
= ospf_crypt_key_new();
968 ck
->key_id
= vl_config
->crypto_key_id
;
969 memset(ck
->auth_key
, 0, OSPF_AUTH_MD5_SIZE
+ 1);
970 strncpy((char *)ck
->auth_key
, vl_config
->md5_key
,
973 ospf_crypt_key_add(IF_DEF_PARAMS(ifp
)->auth_crypt
, ck
);
974 } else if (vl_config
->crypto_key_id
!= 0) {
977 if (ospf_crypt_key_lookup(IF_DEF_PARAMS(ifp
)->auth_crypt
,
978 vl_config
->crypto_key_id
)
980 vty_out(vty
, "OSPF: Key %d does not exist\n",
981 vl_config
->crypto_key_id
);
982 return CMD_WARNING_CONFIG_FAILED
;
985 ospf_crypt_key_delete(IF_DEF_PARAMS(ifp
)->auth_crypt
,
986 vl_config
->crypto_key_id
);
992 static int ospf_vl_set_timers(struct ospf_vl_data
*vl_data
,
993 struct ospf_vl_config_data
*vl_config
)
995 struct interface
*ifp
= vl_data
->vl_oi
->ifp
;
996 /* Virtual Link data initialised to defaults, so only set
998 if (vl_config
->hello_interval
) {
999 SET_IF_PARAM(IF_DEF_PARAMS(ifp
), v_hello
);
1000 IF_DEF_PARAMS(ifp
)->v_hello
= vl_config
->hello_interval
;
1003 if (vl_config
->dead_interval
) {
1004 SET_IF_PARAM(IF_DEF_PARAMS(ifp
), v_wait
);
1005 IF_DEF_PARAMS(ifp
)->v_wait
= vl_config
->dead_interval
;
1008 if (vl_config
->retransmit_interval
) {
1009 SET_IF_PARAM(IF_DEF_PARAMS(ifp
), retransmit_interval
);
1010 IF_DEF_PARAMS(ifp
)->retransmit_interval
=
1011 vl_config
->retransmit_interval
;
1014 if (vl_config
->transmit_delay
) {
1015 SET_IF_PARAM(IF_DEF_PARAMS(ifp
), transmit_delay
);
1016 IF_DEF_PARAMS(ifp
)->transmit_delay
= vl_config
->transmit_delay
;
1023 /* The business end of all of the above */
1024 static int ospf_vl_set(struct ospf
*ospf
, struct ospf_vl_config_data
*vl_config
)
1026 struct ospf_vl_data
*vl_data
;
1029 vl_data
= ospf_find_vl_data(ospf
, vl_config
);
1031 return CMD_WARNING_CONFIG_FAILED
;
1033 /* Process this one first as it can have a fatal result, which can
1034 only logically occur if the virtual link exists already
1035 Thus a command error does not result in a change to the
1036 running configuration such as unexpectedly altered timer
1038 ret
= ospf_vl_set_security(vl_data
, vl_config
);
1039 if (ret
!= CMD_SUCCESS
)
1042 /* Set any time based parameters, these area already range checked */
1044 ret
= ospf_vl_set_timers(vl_data
, vl_config
);
1045 if (ret
!= CMD_SUCCESS
)
1051 /* This stuff exists to make specifying all the alias commands A LOT simpler
1053 #define VLINK_HELPSTR_IPADDR \
1054 "OSPF area parameters\n" \
1055 "OSPF area ID in IP address format\n" \
1056 "OSPF area ID as a decimal value\n" \
1057 "Configure a virtual link\n" \
1058 "Router ID of the remote ABR\n"
1060 #define VLINK_HELPSTR_AUTHTYPE_SIMPLE \
1061 "Enable authentication on this virtual link\n" \
1064 #define VLINK_HELPSTR_AUTHTYPE_ALL \
1065 VLINK_HELPSTR_AUTHTYPE_SIMPLE \
1066 "Use null authentication\n" \
1067 "Use message-digest authentication\n"
1069 #define VLINK_HELPSTR_TIME_PARAM \
1070 "Time between HELLO packets\n" \
1072 "Time between retransmitting lost link state advertisements\n" \
1074 "Link state transmit delay\n" \
1076 "Interval time after which a neighbor is declared down\n" \
1079 #define VLINK_HELPSTR_AUTH_SIMPLE \
1080 "Authentication password (key)\n" \
1081 "The OSPF password (key)\n"
1083 #define VLINK_HELPSTR_AUTH_MD5 \
1084 "Message digest authentication password (key)\n" \
1086 "Use MD5 algorithm\n" \
1087 "The OSPF password (key)\n"
1089 DEFUN (ospf_area_vlink
,
1090 ospf_area_vlink_cmd
,
1091 "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>]",
1092 VLINK_HELPSTR_IPADDR
1093 "Enable authentication on this virtual link\n"
1094 "Use message-digest authentication\n"
1095 "Use null authentication\n"
1096 VLINK_HELPSTR_AUTH_MD5
1097 VLINK_HELPSTR_AUTH_SIMPLE
)
1099 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1100 int idx_ipv4_number
= 1;
1102 struct ospf_vl_config_data vl_config
;
1103 char auth_key
[OSPF_AUTH_SIMPLE_SIZE
+ 1];
1104 char md5_key
[OSPF_AUTH_MD5_SIZE
+ 1];
1108 ospf_vl_config_data_init(&vl_config
, vty
);
1110 /* Read off first 2 parameters and check them */
1111 ret
= str2area_id(argv
[idx_ipv4_number
]->arg
, &vl_config
.area_id
,
1112 &vl_config
.area_id_fmt
);
1114 vty_out(vty
, "OSPF area ID is invalid\n");
1115 return CMD_WARNING_CONFIG_FAILED
;
1118 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &vl_config
.vl_peer
);
1120 vty_out(vty
, "Please specify valid Router ID as a.b.c.d\n");
1121 return CMD_WARNING_CONFIG_FAILED
;
1125 /* Thats all folks! - BUGS B. strikes again!!!*/
1127 return ospf_vl_set(ospf
, &vl_config
);
1130 if (argv_find(argv
, argc
, "authentication", &idx
)) {
1131 /* authentication - this option can only occur
1132 at start of command line */
1133 vl_config
.auth_type
= OSPF_AUTH_SIMPLE
;
1136 if (argv_find(argv
, argc
, "message-digest", &idx
)) {
1137 /* authentication message-digest */
1138 vl_config
.auth_type
= OSPF_AUTH_CRYPTOGRAPHIC
;
1139 } else if (argv_find(argv
, argc
, "null", &idx
)) {
1140 /* "authentication null" */
1141 vl_config
.auth_type
= OSPF_AUTH_NULL
;
1144 if (argv_find(argv
, argc
, "message-digest-key", &idx
)) {
1145 vl_config
.md5_key
= NULL
;
1146 vl_config
.crypto_key_id
= strtol(argv
[idx
+ 1]->arg
, NULL
, 10);
1147 if (vl_config
.crypto_key_id
< 0)
1148 return CMD_WARNING_CONFIG_FAILED
;
1150 memset(md5_key
, 0, OSPF_AUTH_MD5_SIZE
+ 1);
1151 strncpy(md5_key
, argv
[idx
+ 3]->arg
, OSPF_AUTH_MD5_SIZE
);
1152 vl_config
.md5_key
= md5_key
;
1155 if (argv_find(argv
, argc
, "authentication-key", &idx
)) {
1156 memset(auth_key
, 0, OSPF_AUTH_SIMPLE_SIZE
+ 1);
1157 strncpy(auth_key
, argv
[idx
+ 1]->arg
, OSPF_AUTH_SIMPLE_SIZE
);
1158 vl_config
.auth_key
= auth_key
;
1161 /* Action configuration */
1163 return ospf_vl_set(ospf
, &vl_config
);
1166 DEFUN (no_ospf_area_vlink
,
1167 no_ospf_area_vlink_cmd
,
1168 "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>]",
1170 VLINK_HELPSTR_IPADDR
1171 "Enable authentication on this virtual link\n" \
1172 "Use message-digest authentication\n" \
1173 "Use null authentication\n" \
1174 VLINK_HELPSTR_AUTH_MD5
1175 VLINK_HELPSTR_AUTH_SIMPLE
)
1177 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1178 int idx_ipv4_number
= 2;
1180 struct ospf_area
*area
;
1181 struct ospf_vl_config_data vl_config
;
1182 struct ospf_vl_data
*vl_data
= NULL
;
1183 char auth_key
[OSPF_AUTH_SIMPLE_SIZE
+ 1];
1187 ospf_vl_config_data_init(&vl_config
, vty
);
1189 ret
= str2area_id(argv
[idx_ipv4_number
]->arg
, &vl_config
.area_id
,
1192 vty_out(vty
, "OSPF area ID is invalid\n");
1193 return CMD_WARNING_CONFIG_FAILED
;
1196 area
= ospf_area_lookup_by_area_id(ospf
, vl_config
.area_id
);
1198 vty_out(vty
, "Area does not exist\n");
1199 return CMD_WARNING_CONFIG_FAILED
;
1202 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &vl_config
.vl_peer
);
1204 vty_out(vty
, "Please specify valid Router ID as a.b.c.d\n");
1205 return CMD_WARNING_CONFIG_FAILED
;
1209 /* Basic VLink no command */
1210 /* Thats all folks! - BUGS B. strikes again!!!*/
1211 if ((vl_data
= ospf_vl_lookup(ospf
, area
, vl_config
.vl_peer
)))
1212 ospf_vl_delete(ospf
, vl_data
);
1214 ospf_area_check_free(ospf
, vl_config
.area_id
);
1219 /* If we are down here, we are reseting parameters */
1220 /* Deal with other parameters */
1222 if (argv_find(argv
, argc
, "authentication", &idx
)) {
1223 /* authentication - this option can only occur
1224 at start of command line */
1225 vl_config
.auth_type
= OSPF_AUTH_NOTSET
;
1228 if (argv_find(argv
, argc
, "message-digest-key", &idx
)) {
1229 vl_config
.md5_key
= NULL
;
1230 vl_config
.crypto_key_id
= strtol(argv
[idx
+ 1]->arg
, NULL
, 10);
1231 if (vl_config
.crypto_key_id
< 0)
1232 return CMD_WARNING_CONFIG_FAILED
;
1235 if (argv_find(argv
, argc
, "authentication-key", &idx
)) {
1236 /* Reset authentication-key to 0 */
1237 memset(auth_key
, 0, OSPF_AUTH_SIMPLE_SIZE
+ 1);
1238 vl_config
.auth_key
= auth_key
;
1241 /* Action configuration */
1243 return ospf_vl_set(ospf
, &vl_config
);
1246 DEFUN (ospf_area_vlink_intervals
,
1247 ospf_area_vlink_intervals_cmd
,
1248 "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)}",
1249 VLINK_HELPSTR_IPADDR
1250 VLINK_HELPSTR_TIME_PARAM
)
1252 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1253 struct ospf_vl_config_data vl_config
;
1256 ospf_vl_config_data_init(&vl_config
, vty
);
1258 char *area_id
= argv
[1]->arg
;
1259 char *router_id
= argv
[3]->arg
;
1261 ret
= str2area_id(area_id
, &vl_config
.area_id
, &vl_config
.area_id_fmt
);
1263 vty_out(vty
, "OSPF area ID is invalid\n");
1264 return CMD_WARNING_CONFIG_FAILED
;
1267 ret
= inet_aton(router_id
, &vl_config
.vl_peer
);
1269 vty_out(vty
, "Please specify valid Router ID as a.b.c.d\n");
1270 return CMD_WARNING_CONFIG_FAILED
;
1273 for (int idx
= 4; idx
< argc
; idx
++) {
1274 if (strmatch(argv
[idx
]->text
, "hello-interval"))
1275 vl_config
.hello_interval
=
1276 strtol(argv
[++idx
]->arg
, NULL
, 10);
1277 else if (strmatch(argv
[idx
]->text
, "retransmit-interval"))
1278 vl_config
.retransmit_interval
=
1279 strtol(argv
[++idx
]->arg
, NULL
, 10);
1280 else if (strmatch(argv
[idx
]->text
, "transmit-delay"))
1281 vl_config
.transmit_delay
=
1282 strtol(argv
[++idx
]->arg
, NULL
, 10);
1283 else if (strmatch(argv
[idx
]->text
, "dead-interval"))
1284 vl_config
.dead_interval
=
1285 strtol(argv
[++idx
]->arg
, NULL
, 10);
1288 /* Action configuration */
1289 return ospf_vl_set(ospf
, &vl_config
);
1292 DEFUN (no_ospf_area_vlink_intervals
,
1293 no_ospf_area_vlink_intervals_cmd
,
1294 "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)}",
1296 VLINK_HELPSTR_IPADDR
1297 VLINK_HELPSTR_TIME_PARAM
)
1299 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1300 struct ospf_vl_config_data vl_config
;
1303 ospf_vl_config_data_init(&vl_config
, vty
);
1305 char *area_id
= argv
[2]->arg
;
1306 char *router_id
= argv
[4]->arg
;
1308 ret
= str2area_id(area_id
, &vl_config
.area_id
, &vl_config
.area_id_fmt
);
1310 vty_out(vty
, "OSPF area ID is invalid\n");
1311 return CMD_WARNING_CONFIG_FAILED
;
1314 ret
= inet_aton(router_id
, &vl_config
.vl_peer
);
1316 vty_out(vty
, "Please specify valid Router ID as a.b.c.d\n");
1317 return CMD_WARNING_CONFIG_FAILED
;
1320 for (int idx
= 5; idx
< argc
; idx
++) {
1321 if (strmatch(argv
[idx
]->text
, "hello-interval"))
1322 vl_config
.hello_interval
= OSPF_HELLO_INTERVAL_DEFAULT
;
1323 else if (strmatch(argv
[idx
]->text
, "retransmit-interval"))
1324 vl_config
.retransmit_interval
=
1325 OSPF_RETRANSMIT_INTERVAL_DEFAULT
;
1326 else if (strmatch(argv
[idx
]->text
, "transmit-delay"))
1327 vl_config
.transmit_delay
= OSPF_TRANSMIT_DELAY_DEFAULT
;
1328 else if (strmatch(argv
[idx
]->text
, "dead-interval"))
1329 vl_config
.dead_interval
=
1330 OSPF_ROUTER_DEAD_INTERVAL_DEFAULT
;
1333 /* Action configuration */
1334 return ospf_vl_set(ospf
, &vl_config
);
1337 DEFUN (ospf_area_shortcut
,
1338 ospf_area_shortcut_cmd
,
1339 "area <A.B.C.D|(0-4294967295)> shortcut <default|enable|disable>",
1340 "OSPF area parameters\n"
1341 "OSPF area ID in IP address format\n"
1342 "OSPF area ID as a decimal value\n"
1343 "Configure the area's shortcutting mode\n"
1344 "Set default shortcutting behavior\n"
1345 "Enable shortcutting through the area\n"
1346 "Disable shortcutting through the area\n")
1348 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1349 int idx_ipv4_number
= 1;
1350 int idx_enable_disable
= 3;
1351 struct ospf_area
*area
;
1352 struct in_addr area_id
;
1356 VTY_GET_OSPF_AREA_ID_NO_BB("shortcut", area_id
, format
,
1357 argv
[idx_ipv4_number
]->arg
);
1359 area
= ospf_area_get(ospf
, area_id
);
1360 ospf_area_display_format_set(ospf
, area
, format
);
1362 if (strncmp(argv
[idx_enable_disable
]->arg
, "de", 2) == 0)
1363 mode
= OSPF_SHORTCUT_DEFAULT
;
1364 else if (strncmp(argv
[idx_enable_disable
]->arg
, "di", 2) == 0)
1365 mode
= OSPF_SHORTCUT_DISABLE
;
1366 else if (strncmp(argv
[idx_enable_disable
]->arg
, "e", 1) == 0)
1367 mode
= OSPF_SHORTCUT_ENABLE
;
1369 return CMD_WARNING_CONFIG_FAILED
;
1371 ospf_area_shortcut_set(ospf
, area
, mode
);
1373 if (ospf
->abr_type
!= OSPF_ABR_SHORTCUT
)
1375 "Shortcut area setting will take effect "
1376 "only when the router is configured as Shortcut ABR\n");
1381 DEFUN (no_ospf_area_shortcut
,
1382 no_ospf_area_shortcut_cmd
,
1383 "no area <A.B.C.D|(0-4294967295)> shortcut <enable|disable>",
1385 "OSPF area parameters\n"
1386 "OSPF area ID in IP address format\n"
1387 "OSPF area ID as a decimal value\n"
1388 "Deconfigure the area's shortcutting mode\n"
1389 "Deconfigure enabled shortcutting through the area\n"
1390 "Deconfigure disabled shortcutting through the area\n")
1392 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1393 int idx_ipv4_number
= 2;
1394 struct ospf_area
*area
;
1395 struct in_addr area_id
;
1398 VTY_GET_OSPF_AREA_ID_NO_BB("shortcut", area_id
, format
,
1399 argv
[idx_ipv4_number
]->arg
);
1401 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1405 ospf_area_shortcut_unset(ospf
, area
);
1411 DEFUN (ospf_area_stub
,
1413 "area <A.B.C.D|(0-4294967295)> stub",
1414 "OSPF area parameters\n"
1415 "OSPF area ID in IP address format\n"
1416 "OSPF area ID as a decimal value\n"
1417 "Configure OSPF area as stub\n")
1419 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1420 int idx_ipv4_number
= 1;
1421 struct in_addr area_id
;
1424 VTY_GET_OSPF_AREA_ID_NO_BB("stub", area_id
, format
,
1425 argv
[idx_ipv4_number
]->arg
);
1427 ret
= ospf_area_stub_set(ospf
, area_id
);
1428 ospf_area_display_format_set(ospf
, ospf_area_get(ospf
, area_id
),
1432 "First deconfigure all virtual link through this area\n");
1433 return CMD_WARNING_CONFIG_FAILED
;
1436 ospf_area_no_summary_unset(ospf
, area_id
);
1441 DEFUN (ospf_area_stub_no_summary
,
1442 ospf_area_stub_no_summary_cmd
,
1443 "area <A.B.C.D|(0-4294967295)> stub no-summary",
1444 "OSPF stub parameters\n"
1445 "OSPF area ID in IP address format\n"
1446 "OSPF area ID as a decimal value\n"
1447 "Configure OSPF area as stub\n"
1448 "Do not inject inter-area routes into stub\n")
1450 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1451 int idx_ipv4_number
= 1;
1452 struct in_addr area_id
;
1455 VTY_GET_OSPF_AREA_ID_NO_BB("stub", area_id
, format
,
1456 argv
[idx_ipv4_number
]->arg
);
1458 ret
= ospf_area_stub_set(ospf
, area_id
);
1459 ospf_area_display_format_set(ospf
, ospf_area_get(ospf
, area_id
),
1463 "%% Area cannot be stub as it contains a virtual link\n");
1464 return CMD_WARNING_CONFIG_FAILED
;
1467 ospf_area_no_summary_set(ospf
, area_id
);
1472 DEFUN (no_ospf_area_stub
,
1473 no_ospf_area_stub_cmd
,
1474 "no area <A.B.C.D|(0-4294967295)> stub",
1476 "OSPF area parameters\n"
1477 "OSPF area ID in IP address format\n"
1478 "OSPF area ID as a decimal value\n"
1479 "Configure OSPF area as stub\n")
1481 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1482 int idx_ipv4_number
= 2;
1483 struct in_addr area_id
;
1486 VTY_GET_OSPF_AREA_ID_NO_BB("stub", area_id
, format
,
1487 argv
[idx_ipv4_number
]->arg
);
1489 ospf_area_stub_unset(ospf
, area_id
);
1490 ospf_area_no_summary_unset(ospf
, area_id
);
1495 DEFUN (no_ospf_area_stub_no_summary
,
1496 no_ospf_area_stub_no_summary_cmd
,
1497 "no area <A.B.C.D|(0-4294967295)> stub no-summary",
1499 "OSPF area parameters\n"
1500 "OSPF area ID in IP address format\n"
1501 "OSPF area ID as a decimal value\n"
1502 "Configure OSPF area as stub\n"
1503 "Do not inject inter-area routes into area\n")
1505 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1506 int idx_ipv4_number
= 2;
1507 struct in_addr area_id
;
1510 VTY_GET_OSPF_AREA_ID_NO_BB("stub", area_id
, format
,
1511 argv
[idx_ipv4_number
]->arg
);
1512 ospf_area_no_summary_unset(ospf
, area_id
);
1517 static int ospf_area_nssa_cmd_handler(struct vty
*vty
, int argc
,
1518 struct cmd_token
**argv
, int cfg_nosum
,
1521 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1522 struct in_addr area_id
;
1525 VTY_GET_OSPF_AREA_ID_NO_BB("NSSA", area_id
, format
, argv
[1]->arg
);
1527 ret
= ospf_area_nssa_set(ospf
, area_id
);
1528 ospf_area_display_format_set(ospf
, ospf_area_get(ospf
, area_id
),
1532 "%% Area cannot be nssa as it contains a virtual link\n");
1533 return CMD_WARNING_CONFIG_FAILED
;
1537 if (strncmp(argv
[3]->text
, "translate-c", 11) == 0)
1538 ospf_area_nssa_translator_role_set(
1539 ospf
, area_id
, OSPF_NSSA_ROLE_CANDIDATE
);
1540 else if (strncmp(argv
[3]->text
, "translate-n", 11) == 0)
1541 ospf_area_nssa_translator_role_set(
1542 ospf
, area_id
, OSPF_NSSA_ROLE_NEVER
);
1543 else if (strncmp(argv
[3]->text
, "translate-a", 11) == 0)
1544 ospf_area_nssa_translator_role_set(
1545 ospf
, area_id
, OSPF_NSSA_ROLE_ALWAYS
);
1547 ospf_area_nssa_translator_role_set(ospf
, area_id
,
1548 OSPF_NSSA_ROLE_CANDIDATE
);
1553 ospf_area_no_summary_set(ospf
, area_id
);
1555 ospf_area_no_summary_unset(ospf
, area_id
);
1558 ospf_schedule_abr_task(ospf
);
1564 DEFUN (ospf_area_nssa_translate
,
1565 ospf_area_nssa_translate_cmd
,
1566 "area <A.B.C.D|(0-4294967295)> nssa <translate-candidate|translate-never|translate-always>",
1567 "OSPF area parameters\n"
1568 "OSPF area ID in IP address format\n"
1569 "OSPF area ID as a decimal value\n"
1570 "Configure OSPF area as nssa\n"
1571 "Configure NSSA-ABR for translate election (default)\n"
1572 "Configure NSSA-ABR to never translate\n"
1573 "Configure NSSA-ABR to always translate\n")
1575 return ospf_area_nssa_cmd_handler(vty
, argc
, argv
, 0, 0);
1578 DEFUN (ospf_area_nssa
,
1580 "area <A.B.C.D|(0-4294967295)> nssa",
1581 "OSPF area parameters\n"
1582 "OSPF area ID in IP address format\n"
1583 "OSPF area ID as a decimal value\n"
1584 "Configure OSPF area as nssa\n")
1586 return ospf_area_nssa_cmd_handler(vty
, argc
, argv
, 0, 0);
1589 DEFUN (ospf_area_nssa_no_summary
,
1590 ospf_area_nssa_no_summary_cmd
,
1591 "area <A.B.C.D|(0-4294967295)> nssa no-summary",
1592 "OSPF area parameters\n"
1593 "OSPF area ID in IP address format\n"
1594 "OSPF area ID as a decimal value\n"
1595 "Configure OSPF area as nssa\n"
1596 "Do not inject inter-area routes into nssa\n")
1598 int idx_ipv4_number
= 1;
1599 struct in_addr area_id
;
1602 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1603 VTY_GET_OSPF_AREA_ID_NO_BB("NSSA", area_id
, format
,
1604 argv
[idx_ipv4_number
]->arg
);
1606 ospf_area_display_format_set(ospf
, ospf_area_get(ospf
, area_id
),
1608 ospf_area_nssa_no_summary_set(ospf
, area_id
);
1610 ospf_schedule_abr_task(ospf
);
1615 DEFUN (no_ospf_area_nssa_no_summary
,
1616 no_ospf_area_nssa_no_summary_cmd
,
1617 "no area <A.B.C.D|(0-4294967295)> nssa no-summary",
1619 "OSPF area parameters\n"
1620 "OSPF area ID in IP address format\n"
1621 "OSPF area ID as a decimal value\n"
1622 "Configure OSPF area as nssa\n"
1623 "Do not inject inter-area routes into nssa\n")
1625 int idx_ipv4_number
= 2;
1626 struct in_addr area_id
;
1629 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1631 VTY_GET_OSPF_AREA_ID_NO_BB("nssa", area_id
, format
,
1632 argv
[idx_ipv4_number
]->arg
);
1634 ospf_area_display_format_set(ospf
, ospf_area_get(ospf
, area_id
),
1636 ospf_area_no_summary_unset(ospf
, area_id
);
1638 ospf_schedule_abr_task(ospf
);
1643 DEFUN (no_ospf_area_nssa
,
1644 no_ospf_area_nssa_cmd
,
1645 "no area <A.B.C.D|(0-4294967295)> nssa [<translate-candidate|translate-never|translate-always>]",
1647 "OSPF area parameters\n"
1648 "OSPF area ID in IP address format\n"
1649 "OSPF area ID as a decimal value\n"
1650 "Configure OSPF area as nssa\n"
1651 "Configure NSSA-ABR for translate election (default)\n"
1652 "Configure NSSA-ABR to never translate\n"
1653 "Configure NSSA-ABR to always translate\n")
1655 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1656 int idx_ipv4_number
= 2;
1657 struct in_addr area_id
;
1660 VTY_GET_OSPF_AREA_ID_NO_BB("NSSA", area_id
, format
,
1661 argv
[idx_ipv4_number
]->arg
);
1663 ospf_area_nssa_unset(ospf
, area_id
, argc
);
1665 ospf_schedule_abr_task(ospf
);
1671 DEFUN (ospf_area_default_cost
,
1672 ospf_area_default_cost_cmd
,
1673 "area <A.B.C.D|(0-4294967295)> default-cost (0-16777215)",
1674 "OSPF area parameters\n"
1675 "OSPF area ID in IP address format\n"
1676 "OSPF area ID as a decimal value\n"
1677 "Set the summary-default cost of a NSSA or stub area\n"
1678 "Stub's advertised default summary cost\n")
1680 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1681 int idx_ipv4_number
= 1;
1683 struct ospf_area
*area
;
1684 struct in_addr area_id
;
1687 struct prefix_ipv4 p
;
1689 VTY_GET_OSPF_AREA_ID_NO_BB("default-cost", area_id
, format
,
1690 argv
[idx_ipv4_number
]->arg
);
1691 cost
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
1693 area
= ospf_area_get(ospf
, area_id
);
1694 ospf_area_display_format_set(ospf
, area
, format
);
1696 if (area
->external_routing
== OSPF_AREA_DEFAULT
) {
1697 vty_out(vty
, "The area is neither stub, nor NSSA\n");
1698 return CMD_WARNING_CONFIG_FAILED
;
1701 area
->default_cost
= cost
;
1704 p
.prefix
.s_addr
= OSPF_DEFAULT_DESTINATION
;
1706 if (IS_DEBUG_OSPF_EVENT
)
1708 "ospf_abr_announce_stub_defaults(): "
1709 "announcing 0.0.0.0/0 to area %s",
1710 inet_ntoa(area
->area_id
));
1711 ospf_abr_announce_network_to_area(&p
, area
->default_cost
, area
);
1716 DEFUN (no_ospf_area_default_cost
,
1717 no_ospf_area_default_cost_cmd
,
1718 "no area <A.B.C.D|(0-4294967295)> default-cost (0-16777215)",
1720 "OSPF area parameters\n"
1721 "OSPF area ID in IP address format\n"
1722 "OSPF area ID as a decimal value\n"
1723 "Set the summary-default cost of a NSSA or stub area\n"
1724 "Stub's advertised default summary cost\n")
1726 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1727 int idx_ipv4_number
= 2;
1728 struct ospf_area
*area
;
1729 struct in_addr area_id
;
1731 struct prefix_ipv4 p
;
1733 VTY_GET_OSPF_AREA_ID_NO_BB("default-cost", area_id
, format
,
1734 argv
[idx_ipv4_number
]->arg
);
1736 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1740 if (area
->external_routing
== OSPF_AREA_DEFAULT
) {
1741 vty_out(vty
, "The area is neither stub, nor NSSA\n");
1742 return CMD_WARNING_CONFIG_FAILED
;
1745 area
->default_cost
= 1;
1748 p
.prefix
.s_addr
= OSPF_DEFAULT_DESTINATION
;
1750 if (IS_DEBUG_OSPF_EVENT
)
1752 "ospf_abr_announce_stub_defaults(): "
1753 "announcing 0.0.0.0/0 to area %s",
1754 inet_ntoa(area
->area_id
));
1755 ospf_abr_announce_network_to_area(&p
, area
->default_cost
, area
);
1758 ospf_area_check_free(ospf
, area_id
);
1763 DEFUN (ospf_area_export_list
,
1764 ospf_area_export_list_cmd
,
1765 "area <A.B.C.D|(0-4294967295)> export-list NAME",
1766 "OSPF area parameters\n"
1767 "OSPF area ID in IP address format\n"
1768 "OSPF area ID as a decimal value\n"
1769 "Set the filter for networks announced to other areas\n"
1770 "Name of the access-list\n")
1772 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1773 int idx_ipv4_number
= 1;
1774 struct ospf_area
*area
;
1775 struct in_addr area_id
;
1778 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1780 area
= ospf_area_get(ospf
, area_id
);
1781 ospf_area_display_format_set(ospf
, area
, format
);
1782 ospf_area_export_list_set(ospf
, area
, argv
[3]->arg
);
1787 DEFUN (no_ospf_area_export_list
,
1788 no_ospf_area_export_list_cmd
,
1789 "no area <A.B.C.D|(0-4294967295)> export-list NAME",
1791 "OSPF area parameters\n"
1792 "OSPF area ID in IP address format\n"
1793 "OSPF area ID as a decimal value\n"
1794 "Unset the filter for networks announced to other areas\n"
1795 "Name of the access-list\n")
1797 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1798 int idx_ipv4_number
= 2;
1799 struct ospf_area
*area
;
1800 struct in_addr area_id
;
1803 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1805 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1809 ospf_area_export_list_unset(ospf
, area
);
1815 DEFUN (ospf_area_import_list
,
1816 ospf_area_import_list_cmd
,
1817 "area <A.B.C.D|(0-4294967295)> import-list NAME",
1818 "OSPF area parameters\n"
1819 "OSPF area ID in IP address format\n"
1820 "OSPF area ID as a decimal value\n"
1821 "Set the filter for networks from other areas announced to the specified one\n"
1822 "Name of the access-list\n")
1824 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1825 int idx_ipv4_number
= 1;
1826 struct ospf_area
*area
;
1827 struct in_addr area_id
;
1830 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1832 area
= ospf_area_get(ospf
, area_id
);
1833 ospf_area_display_format_set(ospf
, area
, format
);
1834 ospf_area_import_list_set(ospf
, area
, argv
[3]->arg
);
1839 DEFUN (no_ospf_area_import_list
,
1840 no_ospf_area_import_list_cmd
,
1841 "no area <A.B.C.D|(0-4294967295)> import-list NAME",
1843 "OSPF area parameters\n"
1844 "OSPF area ID in IP address format\n"
1845 "OSPF area ID as a decimal value\n"
1846 "Unset the filter for networks announced to other areas\n"
1847 "Name of the access-list\n")
1849 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1850 int idx_ipv4_number
= 2;
1851 struct ospf_area
*area
;
1852 struct in_addr area_id
;
1855 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1857 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1861 ospf_area_import_list_unset(ospf
, area
);
1866 DEFUN (ospf_area_filter_list
,
1867 ospf_area_filter_list_cmd
,
1868 "area <A.B.C.D|(0-4294967295)> filter-list prefix WORD <in|out>",
1869 "OSPF area parameters\n"
1870 "OSPF area ID in IP address format\n"
1871 "OSPF area ID as a decimal value\n"
1872 "Filter networks between OSPF areas\n"
1873 "Filter prefixes between OSPF areas\n"
1874 "Name of an IP prefix-list\n"
1875 "Filter networks sent to this area\n"
1876 "Filter networks sent from this area\n")
1878 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1879 int idx_ipv4_number
= 1;
1882 struct ospf_area
*area
;
1883 struct in_addr area_id
;
1884 struct prefix_list
*plist
;
1887 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1889 area
= ospf_area_get(ospf
, area_id
);
1890 ospf_area_display_format_set(ospf
, area
, format
);
1891 plist
= prefix_list_lookup(AFI_IP
, argv
[idx_word
]->arg
);
1892 if (strncmp(argv
[idx_in_out
]->arg
, "in", 2) == 0) {
1893 PREFIX_LIST_IN(area
) = plist
;
1894 if (PREFIX_NAME_IN(area
))
1895 free(PREFIX_NAME_IN(area
));
1897 PREFIX_NAME_IN(area
) = strdup(argv
[idx_word
]->arg
);
1898 ospf_schedule_abr_task(ospf
);
1900 PREFIX_LIST_OUT(area
) = plist
;
1901 if (PREFIX_NAME_OUT(area
))
1902 free(PREFIX_NAME_OUT(area
));
1904 PREFIX_NAME_OUT(area
) = strdup(argv
[idx_word
]->arg
);
1905 ospf_schedule_abr_task(ospf
);
1911 DEFUN (no_ospf_area_filter_list
,
1912 no_ospf_area_filter_list_cmd
,
1913 "no area <A.B.C.D|(0-4294967295)> filter-list prefix WORD <in|out>",
1915 "OSPF area parameters\n"
1916 "OSPF area ID in IP address format\n"
1917 "OSPF area ID as a decimal value\n"
1918 "Filter networks between OSPF areas\n"
1919 "Filter prefixes between OSPF areas\n"
1920 "Name of an IP prefix-list\n"
1921 "Filter networks sent to this area\n"
1922 "Filter networks sent from this area\n")
1924 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1925 int idx_ipv4_number
= 2;
1928 struct ospf_area
*area
;
1929 struct in_addr area_id
;
1932 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1934 if ((area
= ospf_area_lookup_by_area_id(ospf
, area_id
)) == NULL
)
1937 if (strncmp(argv
[idx_in_out
]->arg
, "in", 2) == 0) {
1938 if (PREFIX_NAME_IN(area
))
1939 if (strcmp(PREFIX_NAME_IN(area
), argv
[idx_word
]->arg
)
1943 PREFIX_LIST_IN(area
) = NULL
;
1944 if (PREFIX_NAME_IN(area
))
1945 free(PREFIX_NAME_IN(area
));
1947 PREFIX_NAME_IN(area
) = NULL
;
1949 ospf_schedule_abr_task(ospf
);
1951 if (PREFIX_NAME_OUT(area
))
1952 if (strcmp(PREFIX_NAME_OUT(area
), argv
[idx_word
]->arg
)
1956 PREFIX_LIST_OUT(area
) = NULL
;
1957 if (PREFIX_NAME_OUT(area
))
1958 free(PREFIX_NAME_OUT(area
));
1960 PREFIX_NAME_OUT(area
) = NULL
;
1962 ospf_schedule_abr_task(ospf
);
1969 DEFUN (ospf_area_authentication_message_digest
,
1970 ospf_area_authentication_message_digest_cmd
,
1971 "[no] area <A.B.C.D|(0-4294967295)> authentication message-digest",
1973 "OSPF area parameters\n"
1974 "OSPF area ID in IP address format\n"
1975 "OSPF area ID as a decimal value\n"
1976 "Enable authentication\n"
1977 "Use message-digest authentication\n")
1979 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1981 struct ospf_area
*area
;
1982 struct in_addr area_id
;
1985 argv_find(argv
, argc
, "area", &idx
);
1986 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx
+ 1]->arg
);
1988 area
= ospf_area_get(ospf
, area_id
);
1989 ospf_area_display_format_set(ospf
, area
, format
);
1990 area
->auth_type
= strmatch(argv
[0]->text
, "no")
1992 : OSPF_AUTH_CRYPTOGRAPHIC
;
1997 DEFUN (ospf_area_authentication
,
1998 ospf_area_authentication_cmd
,
1999 "area <A.B.C.D|(0-4294967295)> authentication",
2000 "OSPF area parameters\n"
2001 "OSPF area ID in IP address format\n"
2002 "OSPF area ID as a decimal value\n"
2003 "Enable authentication\n")
2005 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2006 int idx_ipv4_number
= 1;
2007 struct ospf_area
*area
;
2008 struct in_addr area_id
;
2011 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
2013 area
= ospf_area_get(ospf
, area_id
);
2014 ospf_area_display_format_set(ospf
, area
, format
);
2015 area
->auth_type
= OSPF_AUTH_SIMPLE
;
2020 DEFUN (no_ospf_area_authentication
,
2021 no_ospf_area_authentication_cmd
,
2022 "no area <A.B.C.D|(0-4294967295)> authentication",
2024 "OSPF area parameters\n"
2025 "OSPF area ID in IP address format\n"
2026 "OSPF area ID as a decimal value\n"
2027 "Enable authentication\n")
2029 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2030 int idx_ipv4_number
= 2;
2031 struct ospf_area
*area
;
2032 struct in_addr area_id
;
2035 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
2037 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
2041 area
->auth_type
= OSPF_AUTH_NULL
;
2043 ospf_area_check_free(ospf
, area_id
);
2049 DEFUN (ospf_abr_type
,
2051 "ospf abr-type <cisco|ibm|shortcut|standard>",
2052 "OSPF specific commands\n"
2053 "Set OSPF ABR type\n"
2054 "Alternative ABR, cisco implementation\n"
2055 "Alternative ABR, IBM implementation\n"
2057 "Standard behavior (RFC2328)\n")
2059 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2061 uint8_t abr_type
= OSPF_ABR_UNKNOWN
;
2063 if (strncmp(argv
[idx_vendor
]->arg
, "c", 1) == 0)
2064 abr_type
= OSPF_ABR_CISCO
;
2065 else if (strncmp(argv
[idx_vendor
]->arg
, "i", 1) == 0)
2066 abr_type
= OSPF_ABR_IBM
;
2067 else if (strncmp(argv
[idx_vendor
]->arg
, "sh", 2) == 0)
2068 abr_type
= OSPF_ABR_SHORTCUT
;
2069 else if (strncmp(argv
[idx_vendor
]->arg
, "st", 2) == 0)
2070 abr_type
= OSPF_ABR_STAND
;
2072 return CMD_WARNING_CONFIG_FAILED
;
2074 /* If ABR type value is changed, schedule ABR task. */
2075 if (ospf
->abr_type
!= abr_type
) {
2076 ospf
->abr_type
= abr_type
;
2077 ospf_schedule_abr_task(ospf
);
2083 DEFUN (no_ospf_abr_type
,
2084 no_ospf_abr_type_cmd
,
2085 "no ospf abr-type <cisco|ibm|shortcut|standard>",
2087 "OSPF specific commands\n"
2088 "Set OSPF ABR type\n"
2089 "Alternative ABR, cisco implementation\n"
2090 "Alternative ABR, IBM implementation\n"
2094 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2096 uint8_t abr_type
= OSPF_ABR_UNKNOWN
;
2098 if (strncmp(argv
[idx_vendor
]->arg
, "c", 1) == 0)
2099 abr_type
= OSPF_ABR_CISCO
;
2100 else if (strncmp(argv
[idx_vendor
]->arg
, "i", 1) == 0)
2101 abr_type
= OSPF_ABR_IBM
;
2102 else if (strncmp(argv
[idx_vendor
]->arg
, "sh", 2) == 0)
2103 abr_type
= OSPF_ABR_SHORTCUT
;
2104 else if (strncmp(argv
[idx_vendor
]->arg
, "st", 2) == 0)
2105 abr_type
= OSPF_ABR_STAND
;
2107 return CMD_WARNING_CONFIG_FAILED
;
2109 /* If ABR type value is changed, schedule ABR task. */
2110 if (ospf
->abr_type
== abr_type
) {
2111 ospf
->abr_type
= OSPF_ABR_DEFAULT
;
2112 ospf_schedule_abr_task(ospf
);
2118 DEFUN (ospf_log_adjacency_changes
,
2119 ospf_log_adjacency_changes_cmd
,
2120 "log-adjacency-changes",
2121 "Log changes in adjacency state\n")
2123 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2125 SET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_CHANGES
);
2126 UNSET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_DETAIL
);
2130 DEFUN (ospf_log_adjacency_changes_detail
,
2131 ospf_log_adjacency_changes_detail_cmd
,
2132 "log-adjacency-changes detail",
2133 "Log changes in adjacency state\n"
2134 "Log all state changes\n")
2136 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2138 SET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_CHANGES
);
2139 SET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_DETAIL
);
2143 DEFUN (no_ospf_log_adjacency_changes
,
2144 no_ospf_log_adjacency_changes_cmd
,
2145 "no log-adjacency-changes",
2147 "Log changes in adjacency state\n")
2149 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2151 UNSET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_DETAIL
);
2152 UNSET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_CHANGES
);
2156 DEFUN (no_ospf_log_adjacency_changes_detail
,
2157 no_ospf_log_adjacency_changes_detail_cmd
,
2158 "no log-adjacency-changes detail",
2160 "Log changes in adjacency state\n"
2161 "Log all state changes\n")
2163 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2165 UNSET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_DETAIL
);
2169 DEFUN (ospf_compatible_rfc1583
,
2170 ospf_compatible_rfc1583_cmd
,
2171 "compatible rfc1583",
2172 "OSPF compatibility list\n"
2173 "compatible with RFC 1583\n")
2175 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2177 if (!CHECK_FLAG(ospf
->config
, OSPF_RFC1583_COMPATIBLE
)) {
2178 SET_FLAG(ospf
->config
, OSPF_RFC1583_COMPATIBLE
);
2179 ospf_spf_calculate_schedule(ospf
, SPF_FLAG_CONFIG_CHANGE
);
2184 DEFUN (no_ospf_compatible_rfc1583
,
2185 no_ospf_compatible_rfc1583_cmd
,
2186 "no compatible rfc1583",
2188 "OSPF compatibility list\n"
2189 "compatible with RFC 1583\n")
2191 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2193 if (CHECK_FLAG(ospf
->config
, OSPF_RFC1583_COMPATIBLE
)) {
2194 UNSET_FLAG(ospf
->config
, OSPF_RFC1583_COMPATIBLE
);
2195 ospf_spf_calculate_schedule(ospf
, SPF_FLAG_CONFIG_CHANGE
);
2200 ALIAS(ospf_compatible_rfc1583
, ospf_rfc1583_flag_cmd
,
2201 "ospf rfc1583compatibility",
2202 "OSPF specific commands\n"
2203 "Enable the RFC1583Compatibility flag\n")
2205 ALIAS(no_ospf_compatible_rfc1583
, no_ospf_rfc1583_flag_cmd
,
2206 "no ospf rfc1583compatibility", NO_STR
2207 "OSPF specific commands\n"
2208 "Disable the RFC1583Compatibility flag\n")
2210 static int ospf_timers_spf_set(struct vty
*vty
, unsigned int delay
,
2211 unsigned int hold
, unsigned int max
)
2213 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2215 ospf
->spf_delay
= delay
;
2216 ospf
->spf_holdtime
= hold
;
2217 ospf
->spf_max_holdtime
= max
;
2222 DEFUN (ospf_timers_min_ls_interval
,
2223 ospf_timers_min_ls_interval_cmd
,
2224 "timers throttle lsa all (0-5000)",
2225 "Adjust routing timers\n"
2226 "Throttling adaptive timer\n"
2227 "LSA delay between transmissions\n"
2229 "Delay (msec) between sending LSAs\n")
2231 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2233 unsigned int interval
;
2236 vty_out(vty
, "Insufficient arguments\n");
2237 return CMD_WARNING_CONFIG_FAILED
;
2240 interval
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2242 ospf
->min_ls_interval
= interval
;
2247 DEFUN (no_ospf_timers_min_ls_interval
,
2248 no_ospf_timers_min_ls_interval_cmd
,
2249 "no timers throttle lsa all [(0-5000)]",
2251 "Adjust routing timers\n"
2252 "Throttling adaptive timer\n"
2253 "LSA delay between transmissions\n"
2255 "Delay (msec) between sending LSAs\n")
2257 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2258 ospf
->min_ls_interval
= OSPF_MIN_LS_INTERVAL
;
2263 DEFUN (ospf_timers_throttle_spf
,
2264 ospf_timers_throttle_spf_cmd
,
2265 "timers throttle spf (0-600000) (0-600000) (0-600000)",
2266 "Adjust routing timers\n"
2267 "Throttling adaptive timer\n"
2269 "Delay (msec) from first change received till SPF calculation\n"
2270 "Initial hold time (msec) between consecutive SPF calculations\n"
2271 "Maximum hold time (msec)\n")
2274 int idx_number_2
= 4;
2275 int idx_number_3
= 5;
2276 unsigned int delay
, hold
, max
;
2279 vty_out(vty
, "Insufficient arguments\n");
2280 return CMD_WARNING_CONFIG_FAILED
;
2283 delay
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2284 hold
= strtoul(argv
[idx_number_2
]->arg
, NULL
, 10);
2285 max
= strtoul(argv
[idx_number_3
]->arg
, NULL
, 10);
2287 return ospf_timers_spf_set(vty
, delay
, hold
, max
);
2290 DEFUN (no_ospf_timers_throttle_spf
,
2291 no_ospf_timers_throttle_spf_cmd
,
2292 "no timers throttle spf [(0-600000)(0-600000)(0-600000)]",
2294 "Adjust routing timers\n"
2295 "Throttling adaptive timer\n"
2297 "Delay (msec) from first change received till SPF calculation\n"
2298 "Initial hold time (msec) between consecutive SPF calculations\n"
2299 "Maximum hold time (msec)\n")
2301 return ospf_timers_spf_set(vty
, OSPF_SPF_DELAY_DEFAULT
,
2302 OSPF_SPF_HOLDTIME_DEFAULT
,
2303 OSPF_SPF_MAX_HOLDTIME_DEFAULT
);
2307 DEFUN (ospf_timers_lsa_min_arrival
,
2308 ospf_timers_lsa_min_arrival_cmd
,
2309 "timers lsa min-arrival (0-600000)",
2310 "Adjust routing timers\n"
2312 "Minimum delay in receiving new version of a LSA\n"
2313 "Delay in milliseconds\n")
2315 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2316 ospf
->min_ls_arrival
= strtoul(argv
[argc
- 1]->arg
, NULL
, 10);
2320 DEFUN (no_ospf_timers_lsa_min_arrival
,
2321 no_ospf_timers_lsa_min_arrival_cmd
,
2322 "no timers lsa min-arrival [(0-600000)]",
2324 "Adjust routing timers\n"
2326 "Minimum delay in receiving new version of a LSA\n"
2327 "Delay in milliseconds\n")
2329 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2330 unsigned int minarrival
;
2333 minarrival
= strtoul(argv
[argc
- 1]->arg
, NULL
, 10);
2335 if (ospf
->min_ls_arrival
!= minarrival
2336 || minarrival
== OSPF_MIN_LS_ARRIVAL
)
2340 ospf
->min_ls_arrival
= OSPF_MIN_LS_ARRIVAL
;
2345 DEFUN (ospf_neighbor
,
2347 "neighbor A.B.C.D [priority (0-255) [poll-interval (1-65535)]]",
2349 "Neighbor IP address\n"
2350 "Neighbor Priority\n"
2352 "Dead Neighbor Polling interval\n"
2355 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2359 struct in_addr nbr_addr
;
2360 unsigned int priority
= OSPF_NEIGHBOR_PRIORITY_DEFAULT
;
2361 unsigned int interval
= OSPF_POLL_INTERVAL_DEFAULT
;
2363 if (!inet_aton(argv
[idx_ipv4
]->arg
, &nbr_addr
)) {
2364 vty_out(vty
, "Please specify Neighbor ID by A.B.C.D\n");
2365 return CMD_WARNING_CONFIG_FAILED
;
2369 priority
= strtoul(argv
[idx_pri
]->arg
, NULL
, 10);
2372 interval
= strtoul(argv
[idx_poll
]->arg
, NULL
, 10);
2374 ospf_nbr_nbma_set(ospf
, nbr_addr
);
2377 ospf_nbr_nbma_priority_set(ospf
, nbr_addr
, priority
);
2380 ospf_nbr_nbma_poll_interval_set(ospf
, nbr_addr
, interval
);
2385 DEFUN (ospf_neighbor_poll_interval
,
2386 ospf_neighbor_poll_interval_cmd
,
2387 "neighbor A.B.C.D poll-interval (1-65535) [priority (0-255)]",
2389 "Neighbor IP address\n"
2390 "Dead Neighbor Polling interval\n"
2392 "OSPF priority of non-broadcast neighbor\n"
2395 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2399 struct in_addr nbr_addr
;
2400 unsigned int priority
;
2401 unsigned int interval
;
2403 if (!inet_aton(argv
[idx_ipv4
]->arg
, &nbr_addr
)) {
2404 vty_out(vty
, "Please specify Neighbor ID by A.B.C.D\n");
2405 return CMD_WARNING_CONFIG_FAILED
;
2408 interval
= strtoul(argv
[idx_poll
]->arg
, NULL
, 10);
2410 priority
= argc
> 4 ? strtoul(argv
[idx_pri
]->arg
, NULL
, 10)
2411 : OSPF_NEIGHBOR_PRIORITY_DEFAULT
;
2413 ospf_nbr_nbma_set(ospf
, nbr_addr
);
2414 ospf_nbr_nbma_poll_interval_set(ospf
, nbr_addr
, interval
);
2417 ospf_nbr_nbma_priority_set(ospf
, nbr_addr
, priority
);
2422 DEFUN (no_ospf_neighbor
,
2423 no_ospf_neighbor_cmd
,
2424 "no neighbor A.B.C.D [priority (0-255) [poll-interval (1-65525)]]",
2427 "Neighbor IP address\n"
2428 "Neighbor Priority\n"
2430 "Dead Neighbor Polling interval\n"
2433 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2435 struct in_addr nbr_addr
;
2437 if (!inet_aton(argv
[idx_ipv4
]->arg
, &nbr_addr
)) {
2438 vty_out(vty
, "Please specify Neighbor ID by A.B.C.D\n");
2439 return CMD_WARNING_CONFIG_FAILED
;
2442 (void)ospf_nbr_nbma_unset(ospf
, nbr_addr
);
2447 DEFUN (no_ospf_neighbor_poll
,
2448 no_ospf_neighbor_poll_cmd
,
2449 "no neighbor A.B.C.D poll-interval (1-65535) [priority (0-255)]",
2452 "Neighbor IP address\n"
2453 "Dead Neighbor Polling interval\n"
2455 "Neighbor Priority\n"
2458 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2460 struct in_addr nbr_addr
;
2462 if (!inet_aton(argv
[idx_ipv4
]->arg
, &nbr_addr
)) {
2463 vty_out(vty
, "Please specify Neighbor ID by A.B.C.D\n");
2464 return CMD_WARNING_CONFIG_FAILED
;
2467 (void)ospf_nbr_nbma_unset(ospf
, nbr_addr
);
2472 DEFUN (ospf_refresh_timer
,
2473 ospf_refresh_timer_cmd
,
2474 "refresh timer (10-1800)",
2475 "Adjust refresh parameters\n"
2476 "Set refresh timer\n"
2477 "Timer value in seconds\n")
2479 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2481 unsigned int interval
;
2483 interval
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2484 interval
= (interval
/ OSPF_LSA_REFRESHER_GRANULARITY
)
2485 * OSPF_LSA_REFRESHER_GRANULARITY
;
2487 ospf_timers_refresh_set(ospf
, interval
);
2492 DEFUN (no_ospf_refresh_timer
,
2493 no_ospf_refresh_timer_val_cmd
,
2494 "no refresh timer [(10-1800)]",
2496 "Adjust refresh parameters\n"
2497 "Unset refresh timer\n"
2498 "Timer value in seconds\n")
2500 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2502 unsigned int interval
;
2505 interval
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2507 if (ospf
->lsa_refresh_interval
!= interval
2508 || interval
== OSPF_LSA_REFRESH_INTERVAL_DEFAULT
)
2512 ospf_timers_refresh_unset(ospf
);
2518 DEFUN (ospf_auto_cost_reference_bandwidth
,
2519 ospf_auto_cost_reference_bandwidth_cmd
,
2520 "auto-cost reference-bandwidth (1-4294967)",
2521 "Calculate OSPF interface cost according to bandwidth\n"
2522 "Use reference bandwidth method to assign OSPF cost\n"
2523 "The reference bandwidth in terms of Mbits per second\n")
2525 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2526 struct vrf
*vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
2529 struct interface
*ifp
;
2531 refbw
= strtol(argv
[idx_number
]->arg
, NULL
, 10);
2532 if (refbw
< 1 || refbw
> 4294967) {
2533 vty_out(vty
, "reference-bandwidth value is invalid\n");
2534 return CMD_WARNING_CONFIG_FAILED
;
2537 /* If reference bandwidth is changed. */
2538 if ((refbw
) == ospf
->ref_bandwidth
)
2541 ospf
->ref_bandwidth
= refbw
;
2542 FOR_ALL_INTERFACES (vrf
, ifp
)
2543 ospf_if_recalculate_output_cost(ifp
);
2548 DEFUN (no_ospf_auto_cost_reference_bandwidth
,
2549 no_ospf_auto_cost_reference_bandwidth_cmd
,
2550 "no auto-cost reference-bandwidth [(1-4294967)]",
2552 "Calculate OSPF interface cost according to bandwidth\n"
2553 "Use reference bandwidth method to assign OSPF cost\n"
2554 "The reference bandwidth in terms of Mbits per second\n")
2556 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2557 struct vrf
*vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
2558 struct interface
*ifp
;
2560 if (ospf
->ref_bandwidth
== OSPF_DEFAULT_REF_BANDWIDTH
)
2563 ospf
->ref_bandwidth
= OSPF_DEFAULT_REF_BANDWIDTH
;
2564 vty_out(vty
, "%% OSPF: Reference bandwidth is changed.\n");
2566 " Please ensure reference bandwidth is consistent across all routers\n");
2568 FOR_ALL_INTERFACES (vrf
, ifp
)
2569 ospf_if_recalculate_output_cost(ifp
);
2574 DEFUN (ospf_write_multiplier
,
2575 ospf_write_multiplier_cmd
,
2576 "ospf write-multiplier (1-100)",
2577 "OSPF specific commands\n"
2578 "Write multiplier\n"
2579 "Maximum number of interface serviced per write\n")
2581 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2583 uint32_t write_oi_count
;
2590 write_oi_count
= strtol(argv
[idx_number
]->arg
, NULL
, 10);
2591 if (write_oi_count
< 1 || write_oi_count
> 100) {
2592 vty_out(vty
, "write-multiplier value is invalid\n");
2593 return CMD_WARNING_CONFIG_FAILED
;
2596 ospf
->write_oi_count
= write_oi_count
;
2600 ALIAS(ospf_write_multiplier
, write_multiplier_cmd
, "write-multiplier (1-100)",
2601 "Write multiplier\n"
2602 "Maximum number of interface serviced per write\n")
2604 DEFUN (no_ospf_write_multiplier
,
2605 no_ospf_write_multiplier_cmd
,
2606 "no ospf write-multiplier (1-100)",
2608 "OSPF specific commands\n"
2609 "Write multiplier\n"
2610 "Maximum number of interface serviced per write\n")
2612 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2614 ospf
->write_oi_count
= OSPF_WRITE_INTERFACE_COUNT_DEFAULT
;
2618 ALIAS(no_ospf_write_multiplier
, no_write_multiplier_cmd
,
2619 "no write-multiplier (1-100)", NO_STR
2620 "Write multiplier\n"
2621 "Maximum number of interface serviced per write\n")
2623 const char *ospf_abr_type_descr_str
[] = {"Unknown", "Standard (RFC2328)",
2624 "Alternative IBM", "Alternative Cisco",
2625 "Alternative Shortcut"};
2627 const char *ospf_shortcut_mode_descr_str
[] = {"Default", "Enabled", "Disabled"};
2629 static void show_ip_ospf_area(struct vty
*vty
, struct ospf_area
*area
,
2630 json_object
*json_areas
, bool use_json
)
2632 json_object
*json_area
= NULL
;
2635 json_area
= json_object_new_object();
2639 vty_out(vty
, " Area ID: %s", inet_ntoa(area
->area_id
));
2641 /* Show Area type/mode. */
2642 if (OSPF_IS_AREA_BACKBONE(area
)) {
2644 json_object_boolean_true_add(json_area
, "backbone");
2646 vty_out(vty
, " (Backbone)\n");
2649 if (area
->external_routing
== OSPF_AREA_STUB
) {
2650 if (area
->no_summary
)
2651 json_object_boolean_true_add(
2652 json_area
, "stubNoSummary");
2653 if (area
->shortcut_configured
)
2654 json_object_boolean_true_add(
2655 json_area
, "stubShortcut");
2656 } else if (area
->external_routing
== OSPF_AREA_NSSA
) {
2657 if (area
->no_summary
)
2658 json_object_boolean_true_add(
2659 json_area
, "nssaNoSummary");
2660 if (area
->shortcut_configured
)
2661 json_object_boolean_true_add(
2662 json_area
, "nssaShortcut");
2665 json_object_string_add(
2666 json_area
, "shortcuttingMode",
2667 ospf_shortcut_mode_descr_str
2668 [area
->shortcut_configured
]);
2669 if (area
->shortcut_capability
)
2670 json_object_boolean_true_add(json_area
,
2673 if (area
->external_routing
== OSPF_AREA_STUB
)
2674 vty_out(vty
, " (Stub%s%s)",
2675 area
->no_summary
? ", no summary" : "",
2676 area
->shortcut_configured
? "; " : "");
2677 else if (area
->external_routing
== OSPF_AREA_NSSA
)
2678 vty_out(vty
, " (NSSA%s%s)",
2679 area
->no_summary
? ", no summary" : "",
2680 area
->shortcut_configured
? "; " : "");
2683 vty_out(vty
, " Shortcutting mode: %s",
2684 ospf_shortcut_mode_descr_str
2685 [area
->shortcut_configured
]);
2686 vty_out(vty
, ", S-bit consensus: %s\n",
2687 area
->shortcut_capability
? "ok" : "no");
2691 /* Show number of interfaces */
2693 json_object_int_add(json_area
, "areaIfTotalCounter",
2694 listcount(area
->oiflist
));
2695 json_object_int_add(json_area
, "areaIfActiveCounter",
2699 " Number of interfaces in this area: Total: %d, "
2701 listcount(area
->oiflist
), area
->act_ints
);
2703 if (area
->external_routing
== OSPF_AREA_NSSA
) {
2705 json_object_boolean_true_add(json_area
, "nssa");
2706 if (!IS_OSPF_ABR(area
->ospf
))
2707 json_object_boolean_false_add(json_area
, "abr");
2708 else if (area
->NSSATranslatorState
) {
2709 json_object_boolean_true_add(json_area
, "abr");
2710 if (area
->NSSATranslatorRole
2711 == OSPF_NSSA_ROLE_CANDIDATE
)
2712 json_object_boolean_true_add(
2714 "nssaTranslatorElected");
2715 else if (area
->NSSATranslatorRole
2716 == OSPF_NSSA_ROLE_ALWAYS
)
2717 json_object_boolean_true_add(
2719 "nssaTranslatorAlways");
2721 json_object_boolean_true_add(json_area
, "abr");
2722 if (area
->NSSATranslatorRole
2723 == OSPF_NSSA_ROLE_CANDIDATE
)
2724 json_object_boolean_false_add(
2726 "nssaTranslatorElected");
2728 json_object_boolean_true_add(
2730 "nssaTranslatorNever");
2734 " It is an NSSA configuration. \n Elected NSSA/ABR performs type-7/type-5 LSA translation. \n");
2735 if (!IS_OSPF_ABR(area
->ospf
))
2737 " It is not ABR, therefore not Translator. \n");
2738 else if (area
->NSSATranslatorState
) {
2739 vty_out(vty
, " We are an ABR and ");
2740 if (area
->NSSATranslatorRole
2741 == OSPF_NSSA_ROLE_CANDIDATE
)
2743 "the NSSA Elected Translator. \n");
2744 else if (area
->NSSATranslatorRole
2745 == OSPF_NSSA_ROLE_ALWAYS
)
2747 "always an NSSA Translator. \n");
2749 vty_out(vty
, " We are an ABR, but ");
2750 if (area
->NSSATranslatorRole
2751 == OSPF_NSSA_ROLE_CANDIDATE
)
2753 "not the NSSA Elected Translator. \n");
2756 "never an NSSA Translator. \n");
2761 /* Stub-router state for this area */
2762 if (CHECK_FLAG(area
->stub_router_state
, OSPF_AREA_IS_STUB_ROUTED
)) {
2763 char timebuf
[OSPF_TIME_DUMP_SIZE
];
2766 json_object_boolean_true_add(
2767 json_area
, "originStubMaxDistRouterLsa");
2768 if (CHECK_FLAG(area
->stub_router_state
,
2769 OSPF_AREA_ADMIN_STUB_ROUTED
))
2770 json_object_boolean_true_add(
2771 json_area
, "indefiniteActiveAdmin");
2772 if (area
->t_stub_router
) {
2776 &area
->t_stub_router
->u
.sands
,
2779 json_object_int_add(
2781 "activeStartupRemainderMsecs",
2786 " Originating stub / maximum-distance Router-LSA\n");
2787 if (CHECK_FLAG(area
->stub_router_state
,
2788 OSPF_AREA_ADMIN_STUB_ROUTED
))
2790 " Administratively activated (indefinitely)\n");
2791 if (area
->t_stub_router
)
2793 " Active from startup, %s remaining\n",
2794 ospf_timer_dump(area
->t_stub_router
,
2801 /* Show number of fully adjacent neighbors. */
2802 json_object_int_add(json_area
, "nbrFullAdjacentCounter",
2805 /* Show authentication type. */
2806 if (area
->auth_type
== OSPF_AUTH_NULL
)
2807 json_object_string_add(json_area
, "authentication",
2808 "authenticationNone");
2809 else if (area
->auth_type
== OSPF_AUTH_SIMPLE
)
2810 json_object_string_add(json_area
, "authentication",
2811 "authenticationSimplePassword");
2812 else if (area
->auth_type
== OSPF_AUTH_CRYPTOGRAPHIC
)
2813 json_object_string_add(json_area
, "authentication",
2814 "authenticationMessageDigest");
2816 if (!OSPF_IS_AREA_BACKBONE(area
))
2817 json_object_int_add(json_area
,
2818 "virtualAdjacenciesPassingCounter",
2821 /* Show SPF calculation times. */
2822 json_object_int_add(json_area
, "spfExecutedCounter",
2823 area
->spf_calculation
);
2824 json_object_int_add(json_area
, "lsaNumber", area
->lsdb
->total
);
2825 json_object_int_add(
2826 json_area
, "lsaRouterNumber",
2827 ospf_lsdb_count(area
->lsdb
, OSPF_ROUTER_LSA
));
2828 json_object_int_add(
2829 json_area
, "lsaRouterChecksum",
2830 ospf_lsdb_checksum(area
->lsdb
, OSPF_ROUTER_LSA
));
2831 json_object_int_add(
2832 json_area
, "lsaNetworkNumber",
2833 ospf_lsdb_count(area
->lsdb
, OSPF_NETWORK_LSA
));
2834 json_object_int_add(
2835 json_area
, "lsaNetworkChecksum",
2836 ospf_lsdb_checksum(area
->lsdb
, OSPF_NETWORK_LSA
));
2837 json_object_int_add(
2838 json_area
, "lsaSummaryNumber",
2839 ospf_lsdb_count(area
->lsdb
, OSPF_SUMMARY_LSA
));
2840 json_object_int_add(
2841 json_area
, "lsaSummaryChecksum",
2842 ospf_lsdb_checksum(area
->lsdb
, OSPF_SUMMARY_LSA
));
2843 json_object_int_add(
2844 json_area
, "lsaAsbrNumber",
2845 ospf_lsdb_count(area
->lsdb
, OSPF_ASBR_SUMMARY_LSA
));
2846 json_object_int_add(
2847 json_area
, "lsaAsbrChecksum",
2848 ospf_lsdb_checksum(area
->lsdb
, OSPF_ASBR_SUMMARY_LSA
));
2849 json_object_int_add(
2850 json_area
, "lsaNssaNumber",
2851 ospf_lsdb_count(area
->lsdb
, OSPF_AS_NSSA_LSA
));
2852 json_object_int_add(
2853 json_area
, "lsaNssaChecksum",
2854 ospf_lsdb_checksum(area
->lsdb
, OSPF_AS_NSSA_LSA
));
2856 /* Show number of fully adjacent neighbors. */
2858 " Number of fully adjacent neighbors in this area:"
2862 /* Show authentication type. */
2863 vty_out(vty
, " Area has ");
2864 if (area
->auth_type
== OSPF_AUTH_NULL
)
2865 vty_out(vty
, "no authentication\n");
2866 else if (area
->auth_type
== OSPF_AUTH_SIMPLE
)
2867 vty_out(vty
, "simple password authentication\n");
2868 else if (area
->auth_type
== OSPF_AUTH_CRYPTOGRAPHIC
)
2869 vty_out(vty
, "message digest authentication\n");
2871 if (!OSPF_IS_AREA_BACKBONE(area
))
2873 " Number of full virtual adjacencies going through"
2877 /* Show SPF calculation times. */
2878 vty_out(vty
, " SPF algorithm executed %d times\n",
2879 area
->spf_calculation
);
2881 /* Show number of LSA. */
2882 vty_out(vty
, " Number of LSA %ld\n", area
->lsdb
->total
);
2884 " Number of router LSA %ld. Checksum Sum 0x%08x\n",
2885 ospf_lsdb_count(area
->lsdb
, OSPF_ROUTER_LSA
),
2886 ospf_lsdb_checksum(area
->lsdb
, OSPF_ROUTER_LSA
));
2888 " Number of network LSA %ld. Checksum Sum 0x%08x\n",
2889 ospf_lsdb_count(area
->lsdb
, OSPF_NETWORK_LSA
),
2890 ospf_lsdb_checksum(area
->lsdb
, OSPF_NETWORK_LSA
));
2892 " Number of summary LSA %ld. Checksum Sum 0x%08x\n",
2893 ospf_lsdb_count(area
->lsdb
, OSPF_SUMMARY_LSA
),
2894 ospf_lsdb_checksum(area
->lsdb
, OSPF_SUMMARY_LSA
));
2896 " Number of ASBR summary LSA %ld. Checksum Sum 0x%08x\n",
2897 ospf_lsdb_count(area
->lsdb
, OSPF_ASBR_SUMMARY_LSA
),
2898 ospf_lsdb_checksum(area
->lsdb
, OSPF_ASBR_SUMMARY_LSA
));
2899 vty_out(vty
, " Number of NSSA LSA %ld. Checksum Sum 0x%08x\n",
2900 ospf_lsdb_count(area
->lsdb
, OSPF_AS_NSSA_LSA
),
2901 ospf_lsdb_checksum(area
->lsdb
, OSPF_AS_NSSA_LSA
));
2905 json_object_int_add(
2906 json_area
, "lsaOpaqueLinkNumber",
2907 ospf_lsdb_count(area
->lsdb
, OSPF_OPAQUE_LINK_LSA
));
2908 json_object_int_add(
2909 json_area
, "lsaOpaqueLinkChecksum",
2910 ospf_lsdb_checksum(area
->lsdb
, OSPF_OPAQUE_LINK_LSA
));
2911 json_object_int_add(
2912 json_area
, "lsaOpaqueAreaNumber",
2913 ospf_lsdb_count(area
->lsdb
, OSPF_OPAQUE_AREA_LSA
));
2914 json_object_int_add(
2915 json_area
, "lsaOpaqueAreaChecksum",
2916 ospf_lsdb_checksum(area
->lsdb
, OSPF_OPAQUE_AREA_LSA
));
2919 " Number of opaque link LSA %ld. Checksum Sum 0x%08x\n",
2920 ospf_lsdb_count(area
->lsdb
, OSPF_OPAQUE_LINK_LSA
),
2921 ospf_lsdb_checksum(area
->lsdb
, OSPF_OPAQUE_LINK_LSA
));
2923 " Number of opaque area LSA %ld. Checksum Sum 0x%08x\n",
2924 ospf_lsdb_count(area
->lsdb
, OSPF_OPAQUE_AREA_LSA
),
2925 ospf_lsdb_checksum(area
->lsdb
, OSPF_OPAQUE_AREA_LSA
));
2929 json_object_object_add(json_areas
, inet_ntoa(area
->area_id
),
2935 static int show_ip_ospf_common(struct vty
*vty
, struct ospf
*ospf
,
2936 json_object
*json
, uint8_t use_vrf
)
2938 struct listnode
*node
, *nnode
;
2939 struct ospf_area
*area
;
2940 struct timeval result
;
2941 char timebuf
[OSPF_TIME_DUMP_SIZE
];
2942 json_object
*json_vrf
= NULL
;
2943 json_object
*json_areas
= NULL
;
2947 json_vrf
= json_object_new_object();
2950 json_areas
= json_object_new_object();
2953 if (ospf
->instance
) {
2955 json_object_int_add(json
, "ospfInstance",
2958 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
2962 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
2964 /* Show Router ID. */
2966 json_object_string_add(json_vrf
, "routerId",
2967 inet_ntoa(ospf
->router_id
));
2969 vty_out(vty
, " OSPF Routing Process, Router ID: %s\n",
2970 inet_ntoa(ospf
->router_id
));
2973 /* Graceful shutdown */
2974 if (ospf
->t_deferred_shutdown
) {
2979 &ospf
->t_deferred_shutdown
->u
.sands
,
2982 json_object_int_add(json_vrf
, "deferredShutdownMsecs",
2986 " Deferred shutdown in progress, %s remaining\n",
2987 ospf_timer_dump(ospf
->t_deferred_shutdown
,
2988 timebuf
, sizeof(timebuf
)));
2992 /* Show capability. */
2994 json_object_boolean_true_add(json_vrf
, "tosRoutesOnly");
2995 json_object_boolean_true_add(json_vrf
, "rfc2328Conform");
2996 if (CHECK_FLAG(ospf
->config
, OSPF_RFC1583_COMPATIBLE
)) {
2997 json_object_boolean_true_add(json_vrf
,
2998 "rfc1583Compatibility");
3001 vty_out(vty
, " Supports only single TOS (TOS0) routes\n");
3002 vty_out(vty
, " This implementation conforms to RFC2328\n");
3003 vty_out(vty
, " RFC1583Compatibility flag is %s\n",
3004 CHECK_FLAG(ospf
->config
, OSPF_RFC1583_COMPATIBLE
)
3010 if (CHECK_FLAG(ospf
->config
, OSPF_OPAQUE_CAPABLE
)) {
3011 json_object_boolean_true_add(json_vrf
, "opaqueCapable");
3014 vty_out(vty
, " OpaqueCapability flag is %s\n",
3015 CHECK_FLAG(ospf
->config
, OSPF_OPAQUE_CAPABLE
)
3020 /* Show stub-router configuration */
3021 if (ospf
->stub_router_startup_time
!= OSPF_STUB_ROUTER_UNCONFIGURED
3022 || ospf
->stub_router_shutdown_time
3023 != OSPF_STUB_ROUTER_UNCONFIGURED
) {
3025 json_object_boolean_true_add(json_vrf
,
3026 "stubAdvertisement");
3027 if (ospf
->stub_router_startup_time
3028 != OSPF_STUB_ROUTER_UNCONFIGURED
)
3029 json_object_int_add(
3030 json_vrf
, "postStartEnabledMsecs",
3031 ospf
->stub_router_startup_time
/ 1000);
3032 if (ospf
->stub_router_shutdown_time
3033 != OSPF_STUB_ROUTER_UNCONFIGURED
)
3034 json_object_int_add(
3035 json_vrf
, "preShutdownEnabledMsecs",
3036 ospf
->stub_router_shutdown_time
/ 1000);
3039 " Stub router advertisement is configured\n");
3040 if (ospf
->stub_router_startup_time
3041 != OSPF_STUB_ROUTER_UNCONFIGURED
)
3043 " Enabled for %us after start-up\n",
3044 ospf
->stub_router_startup_time
);
3045 if (ospf
->stub_router_shutdown_time
3046 != OSPF_STUB_ROUTER_UNCONFIGURED
)
3048 " Enabled for %us prior to full shutdown\n",
3049 ospf
->stub_router_shutdown_time
);
3053 /* Show SPF timers. */
3055 json_object_int_add(json_vrf
, "spfScheduleDelayMsecs",
3057 json_object_int_add(json_vrf
, "holdtimeMinMsecs",
3058 ospf
->spf_holdtime
);
3059 json_object_int_add(json_vrf
, "holdtimeMaxMsecs",
3060 ospf
->spf_max_holdtime
);
3061 json_object_int_add(json_vrf
, "holdtimeMultplier",
3062 ospf
->spf_hold_multiplier
);
3065 " Initial SPF scheduling delay %d millisec(s)\n"
3066 " Minimum hold time between consecutive SPFs %d millisec(s)\n"
3067 " Maximum hold time between consecutive SPFs %d millisec(s)\n"
3068 " Hold time multiplier is currently %d\n",
3069 ospf
->spf_delay
, ospf
->spf_holdtime
,
3070 ospf
->spf_max_holdtime
, ospf
->spf_hold_multiplier
);
3074 if (ospf
->ts_spf
.tv_sec
|| ospf
->ts_spf
.tv_usec
) {
3075 long time_store
= 0;
3078 monotime_since(&ospf
->ts_spf
, NULL
) / 1000LL;
3079 json_object_int_add(json_vrf
, "spfLastExecutedMsecs",
3082 time_store
= (1000 * ospf
->ts_spf_duration
.tv_sec
)
3083 + (ospf
->ts_spf_duration
.tv_usec
/ 1000);
3084 json_object_int_add(json_vrf
, "spfLastDurationMsecs",
3087 json_object_boolean_true_add(json_vrf
, "spfHasNotRun");
3089 vty_out(vty
, " SPF algorithm ");
3090 if (ospf
->ts_spf
.tv_sec
|| ospf
->ts_spf
.tv_usec
) {
3091 monotime_since(&ospf
->ts_spf
, &result
);
3092 vty_out(vty
, "last executed %s ago\n",
3093 ospf_timeval_dump(&result
, timebuf
,
3095 vty_out(vty
, " Last SPF duration %s\n",
3096 ospf_timeval_dump(&ospf
->ts_spf_duration
,
3097 timebuf
, sizeof(timebuf
)));
3099 vty_out(vty
, "has not been run\n");
3103 if (ospf
->t_spf_calc
) {
3106 monotime_until(&ospf
->t_spf_calc
->u
.sands
, NULL
)
3108 json_object_int_add(json_vrf
, "spfTimerDueInMsecs",
3112 json_object_int_add(json_vrf
, "lsaMinIntervalMsecs",
3113 ospf
->min_ls_interval
);
3114 json_object_int_add(json_vrf
, "lsaMinArrivalMsecs",
3115 ospf
->min_ls_arrival
);
3116 /* Show write multiplier values */
3117 json_object_int_add(json_vrf
, "writeMultiplier",
3118 ospf
->write_oi_count
);
3119 /* Show refresh parameters. */
3120 json_object_int_add(json_vrf
, "refreshTimerMsecs",
3121 ospf
->lsa_refresh_interval
* 1000);
3123 vty_out(vty
, " SPF timer %s%s\n",
3124 (ospf
->t_spf_calc
? "due in " : "is "),
3125 ospf_timer_dump(ospf
->t_spf_calc
, timebuf
,
3128 vty_out(vty
, " LSA minimum interval %d msecs\n",
3129 ospf
->min_ls_interval
);
3130 vty_out(vty
, " LSA minimum arrival %d msecs\n",
3131 ospf
->min_ls_arrival
);
3133 /* Show write multiplier values */
3134 vty_out(vty
, " Write Multiplier set to %d \n",
3135 ospf
->write_oi_count
);
3137 /* Show refresh parameters. */
3138 vty_out(vty
, " Refresh timer %d secs\n",
3139 ospf
->lsa_refresh_interval
);
3142 /* Show ABR/ASBR flags. */
3143 if (CHECK_FLAG(ospf
->flags
, OSPF_FLAG_ABR
)) {
3145 json_object_string_add(
3146 json_vrf
, "abrType",
3147 ospf_abr_type_descr_str
[ospf
->abr_type
]);
3150 " This router is an ABR, ABR type is: %s\n",
3151 ospf_abr_type_descr_str
[ospf
->abr_type
]);
3153 if (CHECK_FLAG(ospf
->flags
, OSPF_FLAG_ASBR
)) {
3155 json_object_string_add(
3156 json_vrf
, "asbrRouter",
3157 "injectingExternalRoutingInformation");
3160 " This router is an ASBR "
3161 "(injecting external routing information)\n");
3164 /* Show Number of AS-external-LSAs. */
3166 json_object_int_add(
3167 json_vrf
, "lsaExternalCounter",
3168 ospf_lsdb_count(ospf
->lsdb
, OSPF_AS_EXTERNAL_LSA
));
3169 json_object_int_add(
3170 json_vrf
, "lsaExternalChecksum",
3171 ospf_lsdb_checksum(ospf
->lsdb
, OSPF_AS_EXTERNAL_LSA
));
3174 " Number of external LSA %ld. Checksum Sum 0x%08x\n",
3175 ospf_lsdb_count(ospf
->lsdb
, OSPF_AS_EXTERNAL_LSA
),
3176 ospf_lsdb_checksum(ospf
->lsdb
, OSPF_AS_EXTERNAL_LSA
));
3180 json_object_int_add(
3181 json_vrf
, "lsaAsopaqueCounter",
3182 ospf_lsdb_count(ospf
->lsdb
, OSPF_OPAQUE_AS_LSA
));
3183 json_object_int_add(
3184 json_vrf
, "lsaAsOpaqueChecksum",
3185 ospf_lsdb_checksum(ospf
->lsdb
, OSPF_OPAQUE_AS_LSA
));
3188 " Number of opaque AS LSA %ld. Checksum Sum 0x%08x\n",
3189 ospf_lsdb_count(ospf
->lsdb
, OSPF_OPAQUE_AS_LSA
),
3190 ospf_lsdb_checksum(ospf
->lsdb
, OSPF_OPAQUE_AS_LSA
));
3193 /* Show number of areas attached. */
3195 json_object_int_add(json_vrf
, "attachedAreaCounter",
3196 listcount(ospf
->areas
));
3198 vty_out(vty
, " Number of areas attached to this router: %d\n",
3199 listcount(ospf
->areas
));
3201 if (CHECK_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_CHANGES
)) {
3202 if (CHECK_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_DETAIL
)) {
3204 json_object_boolean_true_add(
3205 json_vrf
, "adjacencyChangesLoggedAll");
3208 " All adjacency changes are logged\n");
3211 json_object_boolean_true_add(
3212 json_vrf
, "adjacencyChangesLogged");
3214 vty_out(vty
, " Adjacency changes are logged\n");
3217 /* Show each area status. */
3218 for (ALL_LIST_ELEMENTS(ospf
->areas
, node
, nnode
, area
))
3219 show_ip_ospf_area(vty
, area
, json_areas
, json
? 1 : 0);
3223 json_object_object_add(json_vrf
, "areas", json_areas
);
3224 if (ospf
->vrf_id
== VRF_DEFAULT
)
3225 json_object_object_add(json
, "default",
3228 json_object_object_add(json
, ospf
->name
,
3231 json_object_object_add(json
, "areas", json_areas
);
3239 DEFUN (show_ip_ospf
,
3241 "show ip ospf [vrf <NAME|all>] [json]",
3244 "OSPF information\n"
3250 bool uj
= use_json(argc
, argv
);
3251 struct listnode
*node
= NULL
;
3252 char *vrf_name
= NULL
;
3253 bool all_vrf
= FALSE
;
3254 int ret
= CMD_SUCCESS
;
3257 json_object
*json
= NULL
;
3258 uint8_t use_vrf
= 0;
3260 if (listcount(om
->ospf
) == 0)
3263 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
3266 json
= json_object_new_object();
3268 /* vrf input is provided could be all or specific vrf*/
3270 bool ospf_output
= FALSE
;
3275 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
3276 if (!ospf
->oi_running
)
3279 ret
= show_ip_ospf_common(vty
, ospf
, json
,
3283 vty_out(vty
, "%s\n",
3284 json_object_to_json_string_ext(
3285 json
, JSON_C_TO_STRING_PRETTY
));
3286 json_object_free(json
);
3287 } else if (!ospf_output
)
3288 vty_out(vty
, "%% OSPF instance not found\n");
3291 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
3292 if ((ospf
== NULL
) || !ospf
->oi_running
) {
3294 vty_out(vty
, "%s\n",
3295 json_object_to_json_string_ext(
3296 json
, JSON_C_TO_STRING_PRETTY
));
3297 json_object_free(json
);
3299 vty_out(vty
, "%% OSPF instance not found\n");
3304 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
3305 /* Display default ospf (instance 0) info */
3306 if (ospf
== NULL
|| !ospf
->oi_running
) {
3308 vty_out(vty
, "%s\n",
3309 json_object_to_json_string_ext(
3310 json
, JSON_C_TO_STRING_PRETTY
));
3311 json_object_free(json
);
3313 vty_out(vty
, "%% OSPF instance not found\n");
3320 show_ip_ospf_common(vty
, ospf
, json
, use_vrf
);
3322 vty_out(vty
, "%s\n",
3323 json_object_to_json_string_ext(
3324 json
, JSON_C_TO_STRING_PRETTY
));
3328 json_object_free(json
);
3333 DEFUN (show_ip_ospf_instance
,
3334 show_ip_ospf_instance_cmd
,
3335 "show ip ospf (1-65535) [json]",
3338 "OSPF information\n"
3344 unsigned short instance
= 0;
3345 bool uj
= use_json(argc
, argv
);
3346 int ret
= CMD_SUCCESS
;
3347 json_object
*json
= NULL
;
3349 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
3350 ospf
= ospf_lookup_instance(instance
);
3352 return CMD_NOT_MY_INSTANCE
;
3354 if (!ospf
->oi_running
)
3358 json
= json_object_new_object();
3360 ret
= show_ip_ospf_common(vty
, ospf
, json
, 0);
3363 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
3364 json
, JSON_C_TO_STRING_PRETTY
));
3365 json_object_free(json
);
3371 static void show_ip_ospf_interface_sub(struct vty
*vty
, struct ospf
*ospf
,
3372 struct interface
*ifp
,
3373 json_object
*json_interface_sub
,
3377 struct ospf_neighbor
*nbr
;
3378 struct route_node
*rn
;
3379 uint32_t bandwidth
= ifp
->bandwidth
? ifp
->bandwidth
: ifp
->speed
;
3381 /* Is interface up? */
3383 is_up
= if_is_operative(ifp
);
3385 json_object_boolean_true_add(json_interface_sub
,
3388 json_object_boolean_false_add(json_interface_sub
,
3391 json_object_int_add(json_interface_sub
, "ifIndex",
3393 json_object_int_add(json_interface_sub
, "mtuBytes", ifp
->mtu
);
3394 json_object_int_add(json_interface_sub
, "bandwidthMbit",
3396 json_object_string_add(json_interface_sub
, "ifFlags",
3397 if_flag_dump(ifp
->flags
));
3399 vty_out(vty
, "%s is %s\n", ifp
->name
,
3400 ((is_up
= if_is_operative(ifp
)) ? "up" : "down"));
3401 vty_out(vty
, " ifindex %u, MTU %u bytes, BW %u Mbit %s\n",
3402 ifp
->ifindex
, ifp
->mtu
, bandwidth
,
3403 if_flag_dump(ifp
->flags
));
3406 /* Is interface OSPF enabled? */
3408 if (ospf_oi_count(ifp
) == 0) {
3409 json_object_boolean_false_add(json_interface_sub
,
3412 } else if (!is_up
) {
3413 json_object_boolean_false_add(json_interface_sub
,
3417 json_object_boolean_true_add(json_interface_sub
,
3420 if (ospf_oi_count(ifp
) == 0) {
3421 vty_out(vty
, " OSPF not enabled on this interface\n");
3423 } else if (!is_up
) {
3425 " OSPF is enabled, but not running on this interface\n");
3430 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
3431 struct ospf_interface
*oi
= rn
->info
;
3436 if (CHECK_FLAG(oi
->connected
->flags
, ZEBRA_IFA_UNNUMBERED
)) {
3438 json_object_boolean_true_add(json_interface_sub
,
3441 vty_out(vty
, " This interface is UNNUMBERED,");
3443 /* Show OSPF interface information. */
3445 json_object_string_add(
3446 json_interface_sub
, "ipAddress",
3447 inet_ntoa(oi
->address
->u
.prefix4
));
3448 json_object_int_add(json_interface_sub
,
3449 "ipAddressPrefixlen",
3450 oi
->address
->prefixlen
);
3452 vty_out(vty
, " Internet Address %s/%d,",
3453 inet_ntoa(oi
->address
->u
.prefix4
),
3454 oi
->address
->prefixlen
);
3456 if (oi
->connected
->destination
3457 || oi
->type
== OSPF_IFTYPE_VIRTUALLINK
) {
3458 struct in_addr
*dest
;
3461 if (CONNECTED_PEER(oi
->connected
)
3462 || oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
3467 /* For Vlinks, showing the peer address is
3469 * * * * * informative than the local
3470 * interface that is being used
3472 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
3473 dest
= &oi
->vl_data
->peer_addr
;
3475 dest
= &oi
->connected
->destination
->u
3479 json_object_string_add(
3481 "ospfIfType", dstr
);
3482 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
3483 json_object_string_add(
3488 json_object_string_add(
3493 vty_out(vty
, " %s %s,", dstr
,
3498 json_object_string_add(json_interface_sub
, "area",
3499 ospf_area_desc_string(oi
->area
));
3500 if (OSPF_IF_PARAM(oi
, mtu_ignore
))
3501 json_object_boolean_true_add(
3503 "mtuMismatchDetect");
3504 json_object_string_add(json_interface_sub
, "routerId",
3505 inet_ntoa(ospf
->router_id
));
3506 json_object_string_add(json_interface_sub
,
3508 ospf_network_type_str
[oi
->type
]);
3509 json_object_int_add(json_interface_sub
, "cost",
3511 json_object_int_add(
3512 json_interface_sub
, "transmitDelayMsecs",
3513 1000 / OSPF_IF_PARAM(oi
, transmit_delay
));
3514 json_object_string_add(json_interface_sub
, "state",
3515 lookup_msg(ospf_ism_state_msg
,
3517 json_object_int_add(json_interface_sub
, "priority",
3520 vty_out(vty
, " Area %s\n",
3521 ospf_area_desc_string(oi
->area
));
3523 vty_out(vty
, " MTU mismatch detection: %s\n",
3524 OSPF_IF_PARAM(oi
, mtu_ignore
) ? "disabled"
3528 " Router ID %s, Network Type %s, Cost: %d\n",
3529 inet_ntoa(ospf
->router_id
),
3530 ospf_network_type_str
[oi
->type
],
3534 " Transmit Delay is %d sec, State %s, Priority %d\n",
3535 OSPF_IF_PARAM(oi
, transmit_delay
),
3536 lookup_msg(ospf_ism_state_msg
, oi
->state
, NULL
),
3540 /* Show DR information. */
3541 if (DR(oi
).s_addr
== 0) {
3544 " No backup designated router on this network\n");
3546 nbr
= ospf_nbr_lookup_by_addr(oi
->nbrs
, &BDR(oi
));
3550 " No backup designated router on this network\n");
3553 json_object_string_add(
3554 json_interface_sub
, "bdrId",
3555 inet_ntoa(nbr
->router_id
));
3556 json_object_string_add(
3559 inet_ntoa(nbr
->address
.u
3563 " Backup Designated Router (ID) %s,",
3564 inet_ntoa(nbr
->router_id
));
3565 vty_out(vty
, " Interface Address %s\n",
3566 inet_ntoa(nbr
->address
.u
3572 /* Next network-LSA sequence number we'll use, if we're elected
3575 && ntohl(oi
->params
->network_lsa_seqnum
)
3576 != OSPF_INITIAL_SEQUENCE_NUMBER
) {
3578 json_object_int_add(
3580 "networkLsaSequence",
3581 ntohl(oi
->params
->network_lsa_seqnum
));
3584 " Saved Network-LSA sequence number 0x%x\n",
3585 ntohl(oi
->params
->network_lsa_seqnum
));
3589 if (OI_MEMBER_CHECK(oi
, MEMBER_ALLROUTERS
)
3590 || OI_MEMBER_CHECK(oi
, MEMBER_DROUTERS
)) {
3591 if (OI_MEMBER_CHECK(oi
, MEMBER_ALLROUTERS
))
3592 json_object_boolean_true_add(
3594 "mcastMemberOspfAllRouters");
3595 if (OI_MEMBER_CHECK(oi
, MEMBER_DROUTERS
))
3596 json_object_boolean_true_add(
3598 "mcastMemberOspfDesignatedRouters");
3601 vty_out(vty
, " Multicast group memberships:");
3602 if (OI_MEMBER_CHECK(oi
, MEMBER_ALLROUTERS
)
3603 || OI_MEMBER_CHECK(oi
, MEMBER_DROUTERS
)) {
3604 if (OI_MEMBER_CHECK(oi
, MEMBER_ALLROUTERS
))
3605 vty_out(vty
, " OSPFAllRouters");
3606 if (OI_MEMBER_CHECK(oi
, MEMBER_DROUTERS
))
3607 vty_out(vty
, " OSPFDesignatedRouters");
3609 vty_out(vty
, " <None>");
3614 if (OSPF_IF_PARAM(oi
, fast_hello
) == 0)
3615 json_object_int_add(
3616 json_interface_sub
, "timerMsecs",
3617 1000 / OSPF_IF_PARAM(oi
, v_hello
));
3619 json_object_int_add(
3620 json_interface_sub
, "timerMsecs",
3621 1000 / OSPF_IF_PARAM(oi
, fast_hello
));
3622 json_object_int_add(json_interface_sub
,
3624 1000 / OSPF_IF_PARAM(oi
, v_wait
));
3625 json_object_int_add(json_interface_sub
,
3627 1000 / OSPF_IF_PARAM(oi
, v_wait
));
3628 json_object_int_add(
3629 json_interface_sub
, "timerRetransmit",
3630 1000 / OSPF_IF_PARAM(oi
, retransmit_interval
));
3632 vty_out(vty
, " Timer intervals configured,");
3633 vty_out(vty
, " Hello ");
3634 if (OSPF_IF_PARAM(oi
, fast_hello
) == 0)
3635 vty_out(vty
, "%ds,",
3636 OSPF_IF_PARAM(oi
, v_hello
));
3638 vty_out(vty
, "%dms,",
3639 1000 / OSPF_IF_PARAM(oi
, fast_hello
));
3640 vty_out(vty
, " Dead %ds, Wait %ds, Retransmit %d\n",
3641 OSPF_IF_PARAM(oi
, v_wait
),
3642 OSPF_IF_PARAM(oi
, v_wait
),
3643 OSPF_IF_PARAM(oi
, retransmit_interval
));
3646 if (OSPF_IF_PASSIVE_STATUS(oi
) == OSPF_IF_ACTIVE
) {
3647 char timebuf
[OSPF_TIME_DUMP_SIZE
];
3649 long time_store
= 0;
3653 &oi
->t_hello
->u
.sands
,
3656 json_object_int_add(json_interface_sub
,
3657 "timerHelloInMsecs",
3660 vty_out(vty
, " Hello due in %s\n",
3661 ospf_timer_dump(oi
->t_hello
, timebuf
,
3663 } else /* passive-interface is set */
3666 json_object_boolean_true_add(
3668 "timerPassiveIface");
3671 " No Hellos (Passive interface)\n");
3675 json_object_int_add(json_interface_sub
, "nbrCount",
3676 ospf_nbr_count(oi
, 0));
3677 json_object_int_add(json_interface_sub
,
3679 ospf_nbr_count(oi
, NSM_Full
));
3682 " Neighbor Count is %d, Adjacent neighbor count is %d\n",
3683 ospf_nbr_count(oi
, 0),
3684 ospf_nbr_count(oi
, NSM_Full
));
3685 ospf_bfd_interface_show(vty
, ifp
, json_interface_sub
, use_json
);
3689 static int show_ip_ospf_interface_common(struct vty
*vty
, struct ospf
*ospf
,
3690 char *intf_name
, uint8_t use_vrf
,
3691 json_object
*json
, bool use_json
)
3693 struct interface
*ifp
;
3694 struct vrf
*vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
3695 json_object
*json_vrf
= NULL
;
3696 json_object
*json_interface_sub
= NULL
, *json_interface
= NULL
;
3700 json_vrf
= json_object_new_object();
3703 json_interface
= json_object_new_object();
3706 if (ospf
->instance
) {
3708 json_object_int_add(json
, "ospfInstance",
3711 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
3714 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
3716 if (intf_name
== NULL
) {
3717 /* Show All Interfaces.*/
3718 FOR_ALL_INTERFACES (vrf
, ifp
) {
3719 if (ospf_oi_count(ifp
)) {
3721 json_interface_sub
=
3722 json_object_new_object();
3724 show_ip_ospf_interface_sub(vty
, ospf
, ifp
,
3729 json_object_object_add(
3730 json_interface
, ifp
->name
,
3731 json_interface_sub
);
3736 json_object_object_add(json_vrf
, "interfaces",
3739 /* Interface name is specified. */
3740 ifp
= if_lookup_by_name(intf_name
, ospf
->vrf_id
);
3743 json_object_boolean_true_add(json_vrf
,
3746 vty_out(vty
, "No such interface name\n");
3749 json_interface_sub
= json_object_new_object();
3750 json_interface
= json_object_new_object();
3753 show_ip_ospf_interface_sub(
3754 vty
, ospf
, ifp
, json_interface_sub
, use_json
);
3757 json_object_object_add(json_interface
,
3759 json_interface_sub
);
3760 json_object_object_add(json_vrf
, "interfaces",
3768 if (ospf
->vrf_id
== VRF_DEFAULT
)
3769 json_object_object_add(json
, "default",
3772 json_object_object_add(json
, ospf
->name
,
3781 static void show_ip_ospf_interface_traffic_sub(struct vty
*vty
,
3782 struct ospf_interface
*oi
,
3783 json_object
*json_interface_sub
,
3787 json_object_int_add(json_interface_sub
, "ifIndex",
3789 json_object_int_add(json_interface_sub
, "helloIn",
3791 json_object_int_add(json_interface_sub
, "helloOut",
3793 json_object_int_add(json_interface_sub
, "dbDescIn",
3795 json_object_int_add(json_interface_sub
, "dbDescOut",
3797 json_object_int_add(json_interface_sub
, "lsReqIn",
3799 json_object_int_add(json_interface_sub
, "lsReqOut",
3801 json_object_int_add(json_interface_sub
, "lsUpdIn",
3803 json_object_int_add(json_interface_sub
, "lsUpdOut",
3805 json_object_int_add(json_interface_sub
, "lsAckIn",
3807 json_object_int_add(json_interface_sub
, "lsAckOut",
3811 "%-10s %8u/%-8u %7u/%-7u %7u/%-7u %7u/%-7u %7u/%-7u\n",
3812 oi
->ifp
->name
, oi
->hello_in
, oi
->hello_out
,
3813 oi
->db_desc_in
, oi
->db_desc_out
, oi
->ls_req_in
,
3814 oi
->ls_req_out
, oi
->ls_upd_in
, oi
->ls_upd_out
,
3815 oi
->ls_ack_in
, oi
->ls_ack_out
);
3819 /* OSPFv2 Packet Counters */
3820 static int show_ip_ospf_interface_traffic_common(
3821 struct vty
*vty
, struct ospf
*ospf
, char *intf_name
, json_object
*json
,
3822 int display_once
, uint8_t use_vrf
, bool use_json
)
3824 struct vrf
*vrf
= NULL
;
3825 struct interface
*ifp
= NULL
;
3826 json_object
*json_vrf
= NULL
;
3827 json_object
*json_interface_sub
= NULL
;
3829 if (!use_json
&& !display_once
) {
3831 vty_out(vty
, "%-12s%-17s%-17s%-17s%-17s%-17s\n", "Interface",
3832 " HELLO", " DB-Desc", " LS-Req", " LS-Update",
3834 vty_out(vty
, "%-10s%-18s%-18s%-17s%-17s%-17s\n", "",
3835 " Rx/Tx", " Rx/Tx", " Rx/Tx", " Rx/Tx",
3838 "--------------------------------------------------------------------------------------------\n");
3839 } else if (use_json
) {
3841 json_vrf
= json_object_new_object();
3846 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
3848 if (intf_name
== NULL
) {
3849 vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
3850 FOR_ALL_INTERFACES (vrf
, ifp
) {
3851 struct route_node
*rn
;
3852 struct ospf_interface
*oi
;
3854 if (ospf_oi_count(ifp
) == 0)
3857 for (rn
= route_top(IF_OIFS(ifp
)); rn
;
3858 rn
= route_next(rn
)) {
3865 json_interface_sub
=
3866 json_object_new_object();
3869 show_ip_ospf_interface_traffic_sub(
3870 vty
, oi
, json_interface_sub
, use_json
);
3872 json_object_object_add(
3873 json_vrf
, ifp
->name
,
3874 json_interface_sub
);
3879 /* Interface name is specified. */
3880 ifp
= if_lookup_by_name(intf_name
, ospf
->vrf_id
);
3882 struct route_node
*rn
;
3883 struct ospf_interface
*oi
;
3885 if (ospf_oi_count(ifp
) == 0) {
3887 " OSPF not enabled on this interface %s\n",
3892 for (rn
= route_top(IF_OIFS(ifp
)); rn
;
3893 rn
= route_next(rn
)) {
3897 json_interface_sub
=
3898 json_object_new_object();
3901 show_ip_ospf_interface_traffic_sub(
3902 vty
, oi
, json_interface_sub
, use_json
);
3904 json_object_object_add(
3905 json_vrf
, ifp
->name
,
3906 json_interface_sub
);
3914 if (ospf
->vrf_id
== VRF_DEFAULT
)
3915 json_object_object_add(json
, "default",
3918 json_object_object_add(json
, ospf
->name
,
3927 DEFUN (show_ip_ospf_interface
,
3928 show_ip_ospf_interface_cmd
,
3929 "show ip ospf [vrf <NAME|all>] interface [INTERFACE] [json]",
3932 "OSPF information\n"
3935 "Interface information\n"
3940 bool uj
= use_json(argc
, argv
);
3941 struct listnode
*node
= NULL
;
3942 char *vrf_name
= NULL
, *intf_name
= NULL
;
3943 bool all_vrf
= FALSE
;
3944 int ret
= CMD_SUCCESS
;
3946 int idx_vrf
= 0, idx_intf
= 0;
3947 uint8_t use_vrf
= 0;
3948 json_object
*json
= NULL
;
3950 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
3952 if (argv_find(argv
, argc
, "INTERFACE", &idx_intf
))
3953 intf_name
= argv
[idx_intf
]->arg
;
3956 json
= json_object_new_object();
3958 /* vrf input is provided could be all or specific vrf*/
3962 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
3963 if (!ospf
->oi_running
)
3965 ret
= show_ip_ospf_interface_common(
3966 vty
, ospf
, intf_name
, use_vrf
, json
,
3971 vty_out(vty
, "%s\n",
3972 json_object_to_json_string_ext(
3973 json
, JSON_C_TO_STRING_PRETTY
));
3974 json_object_free(json
);
3976 vty_out(vty
, "%% OSPF instance not found\n");
3980 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
3981 if (ospf
== NULL
|| !ospf
->oi_running
) {
3983 vty_out(vty
, "%s\n",
3984 json_object_to_json_string_ext(
3985 json
, JSON_C_TO_STRING_PRETTY
));
3986 json_object_free(json
);
3988 vty_out(vty
, "%% OSPF instance not found\n");
3992 ret
= show_ip_ospf_interface_common(vty
, ospf
, intf_name
,
3996 /* Display default ospf (instance 0) info */
3997 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
3998 if (ospf
== NULL
|| !ospf
->oi_running
) {
4000 vty_out(vty
, "%s\n",
4001 json_object_to_json_string_ext(
4002 json
, JSON_C_TO_STRING_PRETTY
));
4003 json_object_free(json
);
4005 vty_out(vty
, "%% OSPF instance not found\n");
4009 ret
= show_ip_ospf_interface_common(vty
, ospf
, intf_name
,
4014 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
4015 json
, JSON_C_TO_STRING_PRETTY
));
4016 json_object_free(json
);
4022 DEFUN (show_ip_ospf_instance_interface
,
4023 show_ip_ospf_instance_interface_cmd
,
4024 "show ip ospf (1-65535) interface [INTERFACE] [json]",
4027 "OSPF information\n"
4029 "Interface information\n"
4036 unsigned short instance
= 0;
4037 bool uj
= use_json(argc
, argv
);
4038 char *intf_name
= NULL
;
4039 int ret
= CMD_SUCCESS
;
4040 json_object
*json
= NULL
;
4042 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
4043 ospf
= ospf_lookup_instance(instance
);
4045 return CMD_NOT_MY_INSTANCE
;
4047 if (!ospf
->oi_running
)
4051 json
= json_object_new_object();
4053 if (argv_find(argv
, argc
, "INTERFACE", &idx_intf
))
4054 intf_name
= argv
[idx_intf
]->arg
;
4056 ret
= show_ip_ospf_interface_common(vty
, ospf
, intf_name
, 0, json
, uj
);
4059 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
4060 json
, JSON_C_TO_STRING_PRETTY
));
4061 json_object_free(json
);
4067 DEFUN (show_ip_ospf_interface_traffic
,
4068 show_ip_ospf_interface_traffic_cmd
,
4069 "show ip ospf [vrf <NAME|all>] interface traffic [INTERFACE] [json]",
4072 "OSPF information\n"
4075 "Interface information\n"
4076 "Protocol Packet counters\n"
4080 struct ospf
*ospf
= NULL
;
4081 struct listnode
*node
= NULL
;
4082 char *vrf_name
= NULL
, *intf_name
= NULL
;
4083 bool all_vrf
= FALSE
;
4085 int idx_vrf
= 0, idx_intf
= 0;
4086 bool uj
= use_json(argc
, argv
);
4087 json_object
*json
= NULL
;
4088 int ret
= CMD_SUCCESS
;
4089 int display_once
= 0;
4090 uint8_t use_vrf
= 0;
4092 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
4094 if (argv_find(argv
, argc
, "INTERFACE", &idx_intf
))
4095 intf_name
= argv
[idx_intf
]->arg
;
4098 json
= json_object_new_object();
4103 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
4104 if (!ospf
->oi_running
)
4107 ret
= show_ip_ospf_interface_traffic_common(
4108 vty
, ospf
, intf_name
, json
,
4109 display_once
, use_vrf
, uj
);
4114 vty_out(vty
, "%s\n",
4115 json_object_to_json_string_ext(
4116 json
, JSON_C_TO_STRING_PRETTY
));
4117 json_object_free(json
);
4122 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
4123 if (ospf
== NULL
|| !ospf
->oi_running
) {
4125 json_object_free(json
);
4129 ret
= show_ip_ospf_interface_traffic_common(
4130 vty
, ospf
, intf_name
, json
, display_once
, use_vrf
, uj
);
4132 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
4133 if (ospf
== NULL
|| !ospf
->oi_running
) {
4135 json_object_free(json
);
4139 ret
= show_ip_ospf_interface_traffic_common(
4140 vty
, ospf
, intf_name
, json
, display_once
, use_vrf
, uj
);
4144 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
4145 json
, JSON_C_TO_STRING_PRETTY
));
4146 json_object_free(json
);
4153 static void show_ip_ospf_neighbour_header(struct vty
*vty
)
4155 vty_out(vty
, "\n%-15s %3s %-15s %9s %-15s %-20s %5s %5s %5s\n",
4156 "Neighbor ID", "Pri", "State", "Dead Time", "Address",
4157 "Interface", "RXmtL", "RqstL", "DBsmL");
4160 static void show_ip_ospf_neighbor_sub(struct vty
*vty
,
4161 struct ospf_interface
*oi
,
4162 json_object
*json
, bool use_json
)
4164 struct route_node
*rn
;
4165 struct ospf_neighbor
*nbr
, *prev_nbr
= NULL
;
4167 char timebuf
[OSPF_TIME_DUMP_SIZE
];
4168 json_object
*json_neighbor
= NULL
, *json_neigh_array
= NULL
;
4170 for (rn
= route_top(oi
->nbrs
); rn
; rn
= route_next(rn
)) {
4171 if ((nbr
= rn
->info
)) {
4172 /* Do not show myself. */
4173 if (nbr
== oi
->nbr_self
)
4175 /* Down state is not shown. */
4176 if (nbr
->state
== NSM_Down
)
4179 char neigh_str
[INET_ADDRSTRLEN
];
4182 && !IPV4_ADDR_SAME(&prev_nbr
->src
,
4184 /* Start new neigh list */
4185 json_neigh_array
= NULL
;
4188 if (nbr
->state
== NSM_Attempt
4189 && nbr
->router_id
.s_addr
== 0)
4190 strlcpy(neigh_str
, "neighbor",
4194 inet_ntoa(nbr
->router_id
),
4197 json_object_object_get_ex(json
, neigh_str
,
4200 if (!json_neigh_array
) {
4202 json_object_new_array();
4203 json_object_object_add(
4208 json_neighbor
= json_object_new_object();
4210 ospf_nbr_state_message(nbr
, msgbuf
, 16);
4216 &nbr
->t_inactivity
->u
.sands
,
4220 json_object_int_add(json_neighbor
, "priority",
4222 json_object_string_add(json_neighbor
, "state",
4224 json_object_int_add(json_neighbor
,
4227 json_object_string_add(json_neighbor
, "address",
4228 inet_ntoa(nbr
->src
));
4229 json_object_string_add(json_neighbor
,
4232 json_object_int_add(
4233 json_neighbor
, "retransmitCounter",
4234 ospf_ls_retransmit_count(nbr
));
4235 json_object_int_add(json_neighbor
,
4237 ospf_ls_request_count(nbr
));
4238 json_object_int_add(json_neighbor
,
4240 ospf_db_summary_count(nbr
));
4242 json_object_array_add(json_neigh_array
,
4245 ospf_nbr_state_message(nbr
, msgbuf
, 16);
4247 if (nbr
->state
== NSM_Attempt
4248 && nbr
->router_id
.s_addr
== 0)
4249 vty_out(vty
, "%-15s %3d %-15s ", "-",
4250 nbr
->priority
, msgbuf
);
4252 vty_out(vty
, "%-15s %3d %-15s ",
4253 inet_ntoa(nbr
->router_id
),
4254 nbr
->priority
, msgbuf
);
4256 vty_out(vty
, "%9s ",
4257 ospf_timer_dump(nbr
->t_inactivity
,
4260 vty_out(vty
, "%-15s ", inet_ntoa(nbr
->src
));
4261 vty_out(vty
, "%-20s %5ld %5ld %5d\n",
4263 ospf_ls_retransmit_count(nbr
),
4264 ospf_ls_request_count(nbr
),
4265 ospf_db_summary_count(nbr
));
4272 static int show_ip_ospf_neighbor_common(struct vty
*vty
, struct ospf
*ospf
,
4273 json_object
*json
, bool use_json
,
4276 struct ospf_interface
*oi
;
4277 struct listnode
*node
;
4278 json_object
*json_vrf
= NULL
;
4279 json_object
*json_nbr_sub
= NULL
;
4283 json_vrf
= json_object_new_object();
4286 json_nbr_sub
= json_object_new_object();
4289 if (ospf
->instance
) {
4291 json_object_int_add(json
, "ospfInstance",
4294 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
4297 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
4299 show_ip_ospf_neighbour_header(vty
);
4301 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
4302 if (ospf_interface_neighbor_count(oi
) == 0)
4304 show_ip_ospf_neighbor_sub(vty
, oi
, json_nbr_sub
, use_json
);
4308 json_object_object_add(json_vrf
, "neighbors", json_nbr_sub
);
4310 if (ospf
->vrf_id
== VRF_DEFAULT
)
4311 json_object_object_add(json
, "default",
4314 json_object_object_add(json
, ospf
->name
,
4323 DEFUN (show_ip_ospf_neighbor
,
4324 show_ip_ospf_neighbor_cmd
,
4325 "show ip ospf [vrf <NAME|all>] neighbor [json]",
4328 "OSPF information\n"
4335 bool uj
= use_json(argc
, argv
);
4336 struct listnode
*node
= NULL
;
4337 char *vrf_name
= NULL
;
4338 bool all_vrf
= FALSE
;
4339 int ret
= CMD_SUCCESS
;
4342 uint8_t use_vrf
= 0;
4343 json_object
*json
= NULL
;
4345 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
4348 json
= json_object_new_object();
4350 /* vrf input is provided could be all or specific vrf*/
4354 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
4355 if (!ospf
->oi_running
)
4357 ret
= show_ip_ospf_neighbor_common(
4358 vty
, ospf
, json
, uj
, use_vrf
);
4362 vty_out(vty
, "%s\n",
4363 json_object_to_json_string_ext(
4364 json
, JSON_C_TO_STRING_PRETTY
));
4365 json_object_free(json
);
4367 vty_out(vty
, "OSPF instance not found\n");
4372 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
4373 if (ospf
== NULL
|| !ospf
->oi_running
) {
4375 vty_out(vty
, "%s\n",
4376 json_object_to_json_string_ext(
4377 json
, JSON_C_TO_STRING_PRETTY
));
4378 json_object_free(json
);
4380 vty_out(vty
, "%% OSPF instance not found\n");
4385 /* Display default ospf (instance 0) info */
4386 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
4387 if (ospf
== NULL
|| !ospf
->oi_running
) {
4389 vty_out(vty
, "%s\n",
4390 json_object_to_json_string_ext(
4391 json
, JSON_C_TO_STRING_PRETTY
));
4392 json_object_free(json
);
4394 vty_out(vty
, "%% OSPF instance not found\n");
4401 ret
= show_ip_ospf_neighbor_common(vty
, ospf
, json
, uj
,
4405 vty_out(vty
, "%s\n",
4406 json_object_to_json_string_ext(
4407 json
, JSON_C_TO_STRING_PRETTY
));
4412 json_object_free(json
);
4418 DEFUN (show_ip_ospf_instance_neighbor
,
4419 show_ip_ospf_instance_neighbor_cmd
,
4420 "show ip ospf (1-65535) neighbor [json]",
4423 "OSPF information\n"
4430 unsigned short instance
= 0;
4431 bool uj
= use_json(argc
, argv
);
4432 json_object
*json
= NULL
;
4433 int ret
= CMD_SUCCESS
;
4435 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
4436 ospf
= ospf_lookup_instance(instance
);
4438 return CMD_NOT_MY_INSTANCE
;
4440 if (!ospf
->oi_running
)
4444 json
= json_object_new_object();
4446 ret
= show_ip_ospf_neighbor_common(vty
, ospf
, json
, uj
, 0);
4449 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
4450 json
, JSON_C_TO_STRING_PRETTY
));
4451 json_object_free(json
);
4457 static int show_ip_ospf_neighbor_all_common(struct vty
*vty
, struct ospf
*ospf
,
4458 json_object
*json
, bool use_json
,
4461 struct listnode
*node
;
4462 struct ospf_interface
*oi
;
4463 json_object
*json_vrf
= NULL
;
4464 json_object
*json_neighbor_sub
= NULL
;
4468 json_vrf
= json_object_new_object();
4471 json_neighbor_sub
= json_object_new_object();
4474 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
4476 show_ip_ospf_neighbour_header(vty
);
4478 if (ospf
->instance
) {
4480 json_object_int_add(json_vrf
, "ospfInstance",
4483 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
4486 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
4487 struct listnode
*nbr_node
;
4488 struct ospf_nbr_nbma
*nbr_nbma
;
4490 show_ip_ospf_neighbor_sub(vty
, oi
, json_vrf
, use_json
);
4492 /* print Down neighbor status */
4493 for (ALL_LIST_ELEMENTS_RO(oi
->nbr_nbma
, nbr_node
, nbr_nbma
)) {
4494 if (nbr_nbma
->nbr
== NULL
4495 || nbr_nbma
->nbr
->state
== NSM_Down
) {
4497 json_object_int_add(json_neighbor_sub
,
4499 nbr_nbma
->priority
);
4500 json_object_boolean_true_add(
4503 json_object_string_add(
4507 json_object_int_add(
4509 "nbrNbmaRetransmitCounter", 0);
4510 json_object_int_add(
4512 "nbrNbmaRequestCounter", 0);
4513 json_object_int_add(
4515 "nbrNbmaDbSummaryCounter", 0);
4516 json_object_object_add(
4518 inet_ntoa(nbr_nbma
->addr
),
4521 vty_out(vty
, "%-15s %3d %-15s %9s ",
4522 "-", nbr_nbma
->priority
, "Down",
4525 "%-15s %-20s %5d %5d %5d\n",
4526 inet_ntoa(nbr_nbma
->addr
),
4527 IF_NAME(oi
), 0, 0, 0);
4535 if (ospf
->vrf_id
== VRF_DEFAULT
)
4536 json_object_object_add(json
, "default",
4539 json_object_object_add(json
, ospf
->name
,
4548 DEFUN (show_ip_ospf_neighbor_all
,
4549 show_ip_ospf_neighbor_all_cmd
,
4550 "show ip ospf [vrf <NAME|all>] neighbor all [json]",
4553 "OSPF information\n"
4557 "include down status neighbor\n"
4561 bool uj
= use_json(argc
, argv
);
4562 struct listnode
*node
= NULL
;
4563 char *vrf_name
= NULL
;
4564 bool all_vrf
= FALSE
;
4565 int ret
= CMD_SUCCESS
;
4568 uint8_t use_vrf
= 0;
4569 json_object
*json
= NULL
;
4571 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
4574 json
= json_object_new_object();
4576 /* vrf input is provided could be all or specific vrf*/
4580 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
4581 if (!ospf
->oi_running
)
4583 ret
= show_ip_ospf_neighbor_all_common(
4584 vty
, ospf
, json
, uj
, use_vrf
);
4588 vty_out(vty
, "%s\n",
4589 json_object_to_json_string_ext(
4590 json
, JSON_C_TO_STRING_PRETTY
));
4591 json_object_free(json
);
4597 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
4598 if (ospf
== NULL
|| !ospf
->oi_running
) {
4600 json_object_free(json
);
4604 /* Display default ospf (instance 0) info */
4605 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
4606 if (ospf
== NULL
|| !ospf
->oi_running
) {
4608 json_object_free(json
);
4614 ret
= show_ip_ospf_neighbor_all_common(vty
, ospf
, json
, uj
,
4617 vty_out(vty
, "%s\n",
4618 json_object_to_json_string_ext(
4619 json
, JSON_C_TO_STRING_PRETTY
));
4624 json_object_free(json
);
4629 DEFUN (show_ip_ospf_instance_neighbor_all
,
4630 show_ip_ospf_instance_neighbor_all_cmd
,
4631 "show ip ospf (1-65535) neighbor all [json]",
4634 "OSPF information\n"
4637 "include down status neighbor\n"
4642 unsigned short instance
= 0;
4643 bool uj
= use_json(argc
, argv
);
4644 json_object
*json
= NULL
;
4645 int ret
= CMD_SUCCESS
;
4647 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
4648 ospf
= ospf_lookup_instance(instance
);
4650 return CMD_NOT_MY_INSTANCE
;
4652 if (!ospf
->oi_running
)
4655 json
= json_object_new_object();
4657 ret
= show_ip_ospf_neighbor_all_common(vty
, ospf
, json
, uj
, 0);
4660 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
4661 json
, JSON_C_TO_STRING_PRETTY
));
4662 json_object_free(json
);
4668 static int show_ip_ospf_neighbor_int_common(struct vty
*vty
, struct ospf
*ospf
,
4670 struct cmd_token
**argv
,
4671 bool use_json
, uint8_t use_vrf
)
4673 struct interface
*ifp
;
4674 struct route_node
*rn
;
4675 json_object
*json
= NULL
;
4678 json
= json_object_new_object();
4680 if (ospf
->instance
) {
4682 json_object_int_add(json
, "ospfInstance",
4685 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
4688 ospf_show_vrf_name(ospf
, vty
, json
, use_vrf
);
4690 ifp
= if_lookup_by_name(argv
[arg_base
]->arg
, ospf
->vrf_id
);
4693 json_object_boolean_true_add(json
, "noSuchIface");
4695 vty_out(vty
, "No such interface.\n");
4699 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
4700 struct ospf_interface
*oi
= rn
->info
;
4705 show_ip_ospf_neighbor_sub(vty
, oi
, json
, use_json
);
4709 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
4710 json
, JSON_C_TO_STRING_PRETTY
));
4711 json_object_free(json
);
4718 DEFUN (show_ip_ospf_neighbor_int
,
4719 show_ip_ospf_neighbor_int_cmd
,
4720 "show ip ospf [vrf <NAME>] neighbor IFNAME [json]",
4723 "OSPF information\n"
4732 bool uj
= use_json(argc
, argv
);
4733 int ret
= CMD_SUCCESS
;
4734 struct interface
*ifp
= NULL
;
4735 char *vrf_name
= NULL
;
4736 vrf_id_t vrf_id
= VRF_DEFAULT
;
4737 struct vrf
*vrf
= NULL
;
4739 if (argv_find(argv
, argc
, "vrf", &idx_vrf
))
4740 vrf_name
= argv
[idx_vrf
+ 1]->arg
;
4741 if (vrf_name
&& strmatch(vrf_name
, VRF_DEFAULT_NAME
))
4744 vrf
= vrf_lookup_by_name(vrf_name
);
4746 vrf_id
= vrf
->vrf_id
;
4748 ospf
= ospf_lookup_by_vrf_id(vrf_id
);
4750 if (!ospf
|| !ospf
->oi_running
)
4754 show_ip_ospf_neighbour_header(vty
);
4756 argv_find(argv
, argc
, "IFNAME", &idx_ifname
);
4758 ifp
= if_lookup_by_name(argv
[idx_ifname
]->arg
, vrf_id
);
4762 ret
= show_ip_ospf_neighbor_int_common(vty
, ospf
, idx_ifname
,
4767 DEFUN (show_ip_ospf_instance_neighbor_int
,
4768 show_ip_ospf_instance_neighbor_int_cmd
,
4769 "show ip ospf (1-65535) neighbor IFNAME [json]",
4772 "OSPF information\n"
4781 unsigned short instance
= 0;
4782 bool uj
= use_json(argc
, argv
);
4785 show_ip_ospf_neighbour_header(vty
);
4787 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
4788 ospf
= ospf_lookup_instance(instance
);
4790 return CMD_NOT_MY_INSTANCE
;
4792 if (!ospf
->oi_running
)
4796 show_ip_ospf_neighbour_header(vty
);
4798 return show_ip_ospf_neighbor_int_common(vty
, ospf
, idx_ifname
, argv
, uj
,
4802 static void show_ip_ospf_nbr_nbma_detail_sub(struct vty
*vty
,
4803 struct ospf_interface
*oi
,
4804 struct ospf_nbr_nbma
*nbr_nbma
,
4805 bool use_json
, json_object
*json
)
4807 char timebuf
[OSPF_TIME_DUMP_SIZE
];
4808 json_object
*json_sub
= NULL
;
4811 json_sub
= json_object_new_object();
4812 else /* Show neighbor ID. */
4813 vty_out(vty
, " Neighbor %s,", "-");
4815 /* Show interface address. */
4817 json_object_string_add(json_sub
, "ifaceAddress",
4818 inet_ntoa(nbr_nbma
->addr
));
4820 vty_out(vty
, " interface address %s\n",
4821 inet_ntoa(nbr_nbma
->addr
));
4825 json_object_string_add(json_sub
, "areaId",
4826 ospf_area_desc_string(oi
->area
));
4827 json_object_string_add(json_sub
, "iface", IF_NAME(oi
));
4829 vty_out(vty
, " In the area %s via interface %s\n",
4830 ospf_area_desc_string(oi
->area
), IF_NAME(oi
));
4832 /* Show neighbor priority and state. */
4834 json_object_int_add(json_sub
, "nbrPriority",
4835 nbr_nbma
->priority
);
4836 json_object_string_add(json_sub
, "nbrState", "down");
4838 vty_out(vty
, " Neighbor priority is %d, State is %s,",
4839 nbr_nbma
->priority
, "Down");
4841 /* Show state changes. */
4843 json_object_int_add(json_sub
, "stateChangeCounter",
4844 nbr_nbma
->state_change
);
4846 vty_out(vty
, " %d state changes\n", nbr_nbma
->state_change
);
4848 /* Show PollInterval */
4850 json_object_int_add(json_sub
, "pollInterval", nbr_nbma
->v_poll
);
4852 vty_out(vty
, " Poll interval %d\n", nbr_nbma
->v_poll
);
4854 /* Show poll-interval timer. */
4855 if (nbr_nbma
->t_poll
) {
4858 time_store
= monotime_until(&nbr_nbma
->t_poll
->u
.sands
,
4860 json_object_int_add(json_sub
,
4861 "pollIntervalTimerDueMsec",
4864 vty_out(vty
, " Poll timer due in %s\n",
4865 ospf_timer_dump(nbr_nbma
->t_poll
, timebuf
,
4869 /* Show poll-interval timer thread. */
4871 if (nbr_nbma
->t_poll
!= NULL
)
4872 json_object_string_add(json_sub
,
4873 "pollIntervalTimerThread", "on");
4875 vty_out(vty
, " Thread Poll Timer %s\n",
4876 nbr_nbma
->t_poll
!= NULL
? "on" : "off");
4879 json_object_object_add(json
, "noNbrId", json_sub
);
4882 static void show_ip_ospf_neighbor_detail_sub(struct vty
*vty
,
4883 struct ospf_interface
*oi
,
4884 struct ospf_neighbor
*nbr
,
4885 json_object
*json
, bool use_json
)
4887 char timebuf
[OSPF_TIME_DUMP_SIZE
];
4888 json_object
*json_sub
= NULL
;
4891 json_sub
= json_object_new_object();
4893 /* Show neighbor ID. */
4894 if (nbr
->state
== NSM_Attempt
&& nbr
->router_id
.s_addr
== 0)
4895 vty_out(vty
, " Neighbor %s,", "-");
4897 vty_out(vty
, " Neighbor %s,",
4898 inet_ntoa(nbr
->router_id
));
4901 /* Show interface address. */
4903 json_object_string_add(json_sub
, "ifaceAddress",
4904 inet_ntoa(nbr
->address
.u
.prefix4
));
4906 vty_out(vty
, " interface address %s\n",
4907 inet_ntoa(nbr
->address
.u
.prefix4
));
4911 json_object_string_add(json_sub
, "areaId",
4912 ospf_area_desc_string(oi
->area
));
4913 json_object_string_add(json_sub
, "ifaceName", oi
->ifp
->name
);
4915 vty_out(vty
, " In the area %s via interface %s\n",
4916 ospf_area_desc_string(oi
->area
), oi
->ifp
->name
);
4918 /* Show neighbor priority and state. */
4920 json_object_int_add(json_sub
, "nbrPriority", nbr
->priority
);
4921 json_object_string_add(
4922 json_sub
, "nbrState",
4923 lookup_msg(ospf_nsm_state_msg
, nbr
->state
, NULL
));
4925 vty_out(vty
, " Neighbor priority is %d, State is %s,",
4927 lookup_msg(ospf_nsm_state_msg
, nbr
->state
, NULL
));
4929 /* Show state changes. */
4931 json_object_int_add(json_sub
, "stateChangeCounter",
4934 vty_out(vty
, " %d state changes\n", nbr
->state_change
);
4936 if (nbr
->ts_last_progress
.tv_sec
|| nbr
->ts_last_progress
.tv_usec
) {
4941 monotime_since(&nbr
->ts_last_progress
, &res
) / 1000LL;
4943 json_object_int_add(json_sub
, "lastPrgrsvChangeMsec",
4947 " Most recent state change statistics:\n");
4948 vty_out(vty
, " Progressive change %s ago\n",
4949 ospf_timeval_dump(&res
, timebuf
,
4954 if (nbr
->ts_last_regress
.tv_sec
|| nbr
->ts_last_regress
.tv_usec
) {
4959 monotime_since(&nbr
->ts_last_regress
, &res
) / 1000LL;
4961 json_object_int_add(json_sub
,
4962 "lastRegressiveChangeMsec",
4964 if (nbr
->last_regress_str
)
4965 json_object_string_add(
4966 json_sub
, "lastRegressiveChangeReason",
4967 nbr
->last_regress_str
);
4970 " Regressive change %s ago, due to %s\n",
4971 ospf_timeval_dump(&res
, timebuf
,
4973 (nbr
->last_regress_str
? nbr
->last_regress_str
4978 /* Show Designated Rotuer ID. */
4980 json_object_string_add(json_sub
, "routerDesignatedId",
4981 inet_ntoa(nbr
->d_router
));
4983 vty_out(vty
, " DR is %s,", inet_ntoa(nbr
->d_router
));
4985 /* Show Backup Designated Rotuer ID. */
4987 json_object_string_add(json_sub
, "routerDesignatedBackupId",
4988 inet_ntoa(nbr
->bd_router
));
4990 vty_out(vty
, " BDR is %s\n", inet_ntoa(nbr
->bd_router
));
4994 json_object_int_add(json_sub
, "optionsCounter", nbr
->options
);
4995 json_object_string_add(json_sub
, "optionsList",
4996 ospf_options_dump(nbr
->options
));
4998 vty_out(vty
, " Options %d %s\n", nbr
->options
,
4999 ospf_options_dump(nbr
->options
));
5001 /* Show Router Dead interval timer. */
5003 if (nbr
->t_inactivity
) {
5005 time_store
= monotime_until(&nbr
->t_inactivity
->u
.sands
,
5008 json_object_int_add(json_sub
,
5009 "routerDeadIntervalTimerDueMsec",
5012 json_object_int_add(
5013 json_sub
, "routerDeadIntervalTimerDueMsec", -1);
5015 vty_out(vty
, " Dead timer due in %s\n",
5016 ospf_timer_dump(nbr
->t_inactivity
, timebuf
,
5019 /* Show Database Summary list. */
5021 json_object_int_add(json_sub
, "databaseSummaryListCounter",
5022 ospf_db_summary_count(nbr
));
5024 vty_out(vty
, " Database Summary List %d\n",
5025 ospf_db_summary_count(nbr
));
5027 /* Show Link State Request list. */
5029 json_object_int_add(json_sub
, "linkStateRequestListCounter",
5030 ospf_ls_request_count(nbr
));
5032 vty_out(vty
, " Link State Request List %ld\n",
5033 ospf_ls_request_count(nbr
));
5035 /* Show Link State Retransmission list. */
5037 json_object_int_add(json_sub
,
5038 "linkStateRetransmissionListCounter",
5039 ospf_ls_retransmit_count(nbr
));
5041 vty_out(vty
, " Link State Retransmission List %ld\n",
5042 ospf_ls_retransmit_count(nbr
));
5044 /* Show inactivity timer thread. */
5046 if (nbr
->t_inactivity
!= NULL
)
5047 json_object_string_add(json_sub
,
5048 "threadInactivityTimer", "on");
5050 vty_out(vty
, " Thread Inactivity Timer %s\n",
5051 nbr
->t_inactivity
!= NULL
? "on" : "off");
5053 /* Show Database Description retransmission thread. */
5055 if (nbr
->t_db_desc
!= NULL
)
5056 json_object_string_add(
5058 "threadDatabaseDescriptionRetransmission",
5062 " Thread Database Description Retransmision %s\n",
5063 nbr
->t_db_desc
!= NULL
? "on" : "off");
5065 /* Show Link State Request Retransmission thread. */
5067 if (nbr
->t_ls_req
!= NULL
)
5068 json_object_string_add(
5070 "threadLinkStateRequestRetransmission", "on");
5073 " Thread Link State Request Retransmission %s\n",
5074 nbr
->t_ls_req
!= NULL
? "on" : "off");
5076 /* Show Link State Update Retransmission thread. */
5078 if (nbr
->t_ls_upd
!= NULL
)
5079 json_object_string_add(
5080 json_sub
, "threadLinkStateUpdateRetransmission",
5084 " Thread Link State Update Retransmission %s\n\n",
5085 nbr
->t_ls_upd
!= NULL
? "on" : "off");
5088 if (nbr
->state
== NSM_Attempt
&& nbr
->router_id
.s_addr
== 0)
5089 json_object_object_add(json
, "noNbrId", json_sub
);
5091 json_object_object_add(json
, inet_ntoa(nbr
->router_id
),
5095 ospf_bfd_show_info(vty
, nbr
->bfd_info
, json
, use_json
, 0);
5098 static int show_ip_ospf_neighbor_id_common(struct vty
*vty
, struct ospf
*ospf
,
5100 struct cmd_token
**argv
,
5101 bool use_json
, uint8_t use_vrf
)
5103 struct listnode
*node
;
5104 struct ospf_neighbor
*nbr
;
5105 struct ospf_interface
*oi
;
5106 struct in_addr router_id
;
5108 json_object
*json
= NULL
;
5111 json
= json_object_new_object();
5113 if (ospf
->instance
) {
5115 json_object_int_add(json
, "ospfInstance",
5118 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
5121 ospf_show_vrf_name(ospf
, vty
, json
, use_vrf
);
5123 ret
= inet_aton(argv
[arg_base
]->arg
, &router_id
);
5126 vty_out(vty
, "Please specify Neighbor ID by A.B.C.D\n");
5128 vty_out(vty
, "{}\n");
5129 json_object_free(json
);
5134 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
5135 if ((nbr
= ospf_nbr_lookup_by_routerid(oi
->nbrs
, &router_id
))) {
5136 show_ip_ospf_neighbor_detail_sub(vty
, oi
, nbr
, json
,
5142 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
5143 json
, JSON_C_TO_STRING_PRETTY
));
5144 json_object_free(json
);
5151 DEFUN (show_ip_ospf_neighbor_id
,
5152 show_ip_ospf_neighbor_id_cmd
,
5153 "show ip ospf neighbor A.B.C.D [json]",
5156 "OSPF information\n"
5162 bool uj
= use_json(argc
, argv
);
5163 struct listnode
*node
= NULL
;
5164 int ret
= CMD_SUCCESS
;
5166 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
5167 if (!ospf
->oi_running
)
5169 ret
= show_ip_ospf_neighbor_id_common(vty
, ospf
, 0, argv
, uj
,
5176 DEFUN (show_ip_ospf_instance_neighbor_id
,
5177 show_ip_ospf_instance_neighbor_id_cmd
,
5178 "show ip ospf (1-65535) neighbor A.B.C.D [json]",
5181 "OSPF information\n"
5188 int idx_router_id
= 5;
5190 unsigned short instance
= 0;
5191 bool uj
= use_json(argc
, argv
);
5193 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
5194 ospf
= ospf_lookup_instance(instance
);
5196 return CMD_NOT_MY_INSTANCE
;
5198 if (!ospf
->oi_running
)
5201 return show_ip_ospf_neighbor_id_common(vty
, ospf
, idx_router_id
, argv
,
5205 static int show_ip_ospf_neighbor_detail_common(struct vty
*vty
,
5207 json_object
*json
, bool use_json
,
5210 struct ospf_interface
*oi
;
5211 struct listnode
*node
;
5212 json_object
*json_vrf
= NULL
;
5216 json_vrf
= json_object_new_object();
5220 if (ospf
->instance
) {
5222 json_object_int_add(json_vrf
, "ospfInstance",
5225 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
5228 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
5230 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
5231 struct route_node
*rn
;
5232 struct ospf_neighbor
*nbr
;
5234 for (rn
= route_top(oi
->nbrs
); rn
; rn
= route_next(rn
)) {
5235 if ((nbr
= rn
->info
)) {
5236 if (nbr
!= oi
->nbr_self
) {
5237 if (nbr
->state
!= NSM_Down
) {
5238 show_ip_ospf_neighbor_detail_sub(
5239 vty
, oi
, nbr
, json_vrf
,
5249 if (ospf
->vrf_id
== VRF_DEFAULT
)
5250 json_object_object_add(json
, "default",
5253 json_object_object_add(json
, ospf
->name
,
5262 DEFUN (show_ip_ospf_neighbor_detail
,
5263 show_ip_ospf_neighbor_detail_cmd
,
5264 "show ip ospf [vrf <NAME|all>] neighbor detail [json]",
5267 "OSPF information\n"
5271 "detail of all neighbors\n"
5275 bool uj
= use_json(argc
, argv
);
5276 struct listnode
*node
= NULL
;
5277 char *vrf_name
= NULL
;
5278 bool all_vrf
= FALSE
;
5279 int ret
= CMD_SUCCESS
;
5282 uint8_t use_vrf
= 0;
5283 json_object
*json
= NULL
;
5285 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
5288 json
= json_object_new_object();
5290 /* vrf input is provided could be all or specific vrf*/
5294 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
5295 if (!ospf
->oi_running
)
5297 ret
= show_ip_ospf_neighbor_detail_common(
5298 vty
, ospf
, json
, uj
, use_vrf
);
5301 vty_out(vty
, "%s\n",
5302 json_object_to_json_string_ext(
5303 json
, JSON_C_TO_STRING_PRETTY
));
5304 json_object_free(json
);
5309 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
5310 if (ospf
== NULL
|| !ospf
->oi_running
) {
5312 json_object_free(json
);
5316 /* Display default ospf (instance 0) info */
5317 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
5318 if (ospf
== NULL
|| !ospf
->oi_running
) {
5320 json_object_free(json
);
5326 ret
= show_ip_ospf_neighbor_detail_common(vty
, ospf
, json
, uj
,
5329 vty_out(vty
, "%s\n",
5330 json_object_to_json_string_ext(
5331 json
, JSON_C_TO_STRING_PRETTY
));
5336 json_object_free(json
);
5341 DEFUN (show_ip_ospf_instance_neighbor_detail
,
5342 show_ip_ospf_instance_neighbor_detail_cmd
,
5343 "show ip ospf (1-65535) neighbor detail [json]",
5346 "OSPF information\n"
5349 "detail of all neighbors\n"
5354 unsigned short instance
= 0;
5355 bool uj
= use_json(argc
, argv
);
5356 json_object
*json
= NULL
;
5357 int ret
= CMD_SUCCESS
;
5359 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
5360 ospf
= ospf_lookup_instance(instance
);
5362 return CMD_NOT_MY_INSTANCE
;
5364 if (!ospf
->oi_running
)
5368 json
= json_object_new_object();
5370 ret
= show_ip_ospf_neighbor_detail_common(vty
, ospf
, json
, uj
, 0);
5373 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
5374 json
, JSON_C_TO_STRING_PRETTY
));
5375 json_object_free(json
);
5381 static int show_ip_ospf_neighbor_detail_all_common(struct vty
*vty
,
5387 struct listnode
*node
;
5388 struct ospf_interface
*oi
;
5389 json_object
*json_vrf
= NULL
;
5393 json_vrf
= json_object_new_object();
5398 if (ospf
->instance
) {
5400 json_object_int_add(json
, "ospfInstance",
5403 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
5406 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
5408 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
5409 struct route_node
*rn
;
5410 struct ospf_neighbor
*nbr
;
5411 struct ospf_nbr_nbma
*nbr_nbma
;
5413 for (rn
= route_top(oi
->nbrs
); rn
; rn
= route_next(rn
))
5414 if ((nbr
= rn
->info
))
5415 if (nbr
!= oi
->nbr_self
)
5416 if (nbr
->state
!= NSM_Down
)
5417 show_ip_ospf_neighbor_detail_sub(
5419 json_vrf
, use_json
);
5421 if (oi
->type
== OSPF_IFTYPE_NBMA
) {
5422 struct listnode
*nd
;
5424 for (ALL_LIST_ELEMENTS_RO(oi
->nbr_nbma
, nd
, nbr_nbma
)) {
5425 if (nbr_nbma
->nbr
== NULL
5426 || nbr_nbma
->nbr
->state
== NSM_Down
)
5427 show_ip_ospf_nbr_nbma_detail_sub(
5428 vty
, oi
, nbr_nbma
, use_json
,
5436 if (ospf
->vrf_id
== VRF_DEFAULT
)
5437 json_object_object_add(json
, "default",
5440 json_object_object_add(json
, ospf
->name
,
5450 DEFUN (show_ip_ospf_neighbor_detail_all
,
5451 show_ip_ospf_neighbor_detail_all_cmd
,
5452 "show ip ospf [vrf <NAME|all>] neighbor detail all [json]",
5455 "OSPF information\n"
5459 "detail of all neighbors\n"
5460 "include down status neighbor\n"
5464 bool uj
= use_json(argc
, argv
);
5465 struct listnode
*node
= NULL
;
5466 char *vrf_name
= NULL
;
5467 bool all_vrf
= FALSE
;
5468 int ret
= CMD_SUCCESS
;
5471 uint8_t use_vrf
= 0;
5472 json_object
*json
= NULL
;
5474 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
5477 json
= json_object_new_object();
5479 /* vrf input is provided could be all or specific vrf*/
5483 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
5484 if (!ospf
->oi_running
)
5486 ret
= show_ip_ospf_neighbor_detail_all_common(
5487 vty
, ospf
, json
, uj
, use_vrf
);
5491 vty_out(vty
, "%s\n",
5492 json_object_to_json_string_ext(
5493 json
, JSON_C_TO_STRING_PRETTY
));
5494 json_object_free(json
);
5499 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
5500 if (ospf
== NULL
|| !ospf
->oi_running
) {
5502 json_object_free(json
);
5506 /* Display default ospf (instance 0) info */
5507 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
5508 if (ospf
== NULL
|| !ospf
->oi_running
) {
5510 json_object_free(json
);
5516 ret
= show_ip_ospf_neighbor_detail_all_common(vty
, ospf
, json
,
5519 vty_out(vty
, "%s\n",
5520 json_object_to_json_string_ext(
5521 json
, JSON_C_TO_STRING_PRETTY
));
5526 json_object_free(json
);
5531 DEFUN (show_ip_ospf_instance_neighbor_detail_all
,
5532 show_ip_ospf_instance_neighbor_detail_all_cmd
,
5533 "show ip ospf (1-65535) neighbor detail all [json]",
5536 "OSPF information\n"
5539 "detail of all neighbors\n"
5540 "include down status neighbor\n"
5545 unsigned short instance
= 0;
5546 bool uj
= use_json(argc
, argv
);
5547 json_object
*json
= NULL
;
5548 int ret
= CMD_SUCCESS
;
5550 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
5551 ospf
= ospf_lookup_instance(instance
);
5553 return CMD_NOT_MY_INSTANCE
;
5555 if (!ospf
->oi_running
)
5559 json
= json_object_new_object();
5561 ret
= show_ip_ospf_neighbor_detail_all_common(vty
, ospf
, json
, uj
, 0);
5564 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
5565 json
, JSON_C_TO_STRING_PRETTY
));
5566 json_object_free(json
);
5572 static int show_ip_ospf_neighbor_int_detail_common(struct vty
*vty
,
5575 struct cmd_token
**argv
,
5578 struct ospf_interface
*oi
;
5579 struct interface
*ifp
;
5580 struct route_node
*rn
, *nrn
;
5581 struct ospf_neighbor
*nbr
;
5582 json_object
*json
= NULL
;
5585 json
= json_object_new_object();
5587 if (ospf
->instance
) {
5589 json_object_int_add(json
, "ospfInstance",
5592 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
5595 ifp
= if_lookup_by_name(argv
[arg_base
]->arg
, ospf
->vrf_id
);
5598 vty_out(vty
, "No such interface.\n");
5600 vty_out(vty
, "{}\n");
5601 json_object_free(json
);
5606 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
5607 if ((oi
= rn
->info
)) {
5608 for (nrn
= route_top(oi
->nbrs
); nrn
;
5609 nrn
= route_next(nrn
)) {
5610 if ((nbr
= nrn
->info
)) {
5611 if (nbr
!= oi
->nbr_self
) {
5612 if (nbr
->state
!= NSM_Down
)
5613 show_ip_ospf_neighbor_detail_sub(
5623 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
5624 json
, JSON_C_TO_STRING_PRETTY
));
5625 json_object_free(json
);
5632 DEFUN (show_ip_ospf_neighbor_int_detail
,
5633 show_ip_ospf_neighbor_int_detail_cmd
,
5634 "show ip ospf neighbor IFNAME detail [json]",
5637 "OSPF information\n"
5640 "detail of all neighbors\n"
5644 bool uj
= use_json(argc
, argv
);
5645 struct listnode
*node
= NULL
;
5646 int ret
= CMD_SUCCESS
;
5647 bool ospf_output
= FALSE
;
5649 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
5650 if (!ospf
->oi_running
)
5653 ret
= show_ip_ospf_neighbor_int_detail_common(vty
, ospf
, 0,
5658 vty_out(vty
, "%% OSPF instance not found\n");
5663 DEFUN (show_ip_ospf_instance_neighbor_int_detail
,
5664 show_ip_ospf_instance_neighbor_int_detail_cmd
,
5665 "show ip ospf (1-65535) neighbor IFNAME detail [json]",
5668 "OSPF information\n"
5672 "detail of all neighbors\n"
5678 unsigned short instance
= 0;
5679 bool uj
= use_json(argc
, argv
);
5681 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
5682 ospf
= ospf_lookup_instance(instance
);
5684 return CMD_NOT_MY_INSTANCE
;
5686 if (!ospf
->oi_running
)
5689 return show_ip_ospf_neighbor_int_detail_common(vty
, ospf
, idx_ifname
,
5693 /* Show functions */
5694 static int show_lsa_summary(struct vty
*vty
, struct ospf_lsa
*lsa
, int self
)
5696 struct router_lsa
*rl
;
5697 struct summary_lsa
*sl
;
5698 struct as_external_lsa
*asel
;
5699 struct prefix_ipv4 p
;
5702 /* If self option is set, check LSA self flag. */
5703 if (self
== 0 || IS_LSA_SELF(lsa
)) {
5704 /* LSA common part show. */
5705 vty_out(vty
, "%-15s ", inet_ntoa(lsa
->data
->id
));
5706 vty_out(vty
, "%-15s %4d 0x%08lx 0x%04x",
5707 inet_ntoa(lsa
->data
->adv_router
), LS_AGE(lsa
),
5708 (unsigned long)ntohl(lsa
->data
->ls_seqnum
),
5709 ntohs(lsa
->data
->checksum
));
5710 /* LSA specific part show. */
5711 switch (lsa
->data
->type
) {
5712 case OSPF_ROUTER_LSA
:
5713 rl
= (struct router_lsa
*)lsa
->data
;
5714 vty_out(vty
, " %-d", ntohs(rl
->links
));
5716 case OSPF_SUMMARY_LSA
:
5717 sl
= (struct summary_lsa
*)lsa
->data
;
5720 p
.prefix
= sl
->header
.id
;
5721 p
.prefixlen
= ip_masklen(sl
->mask
);
5722 apply_mask_ipv4(&p
);
5724 vty_out(vty
, " %s/%d", inet_ntoa(p
.prefix
),
5727 case OSPF_AS_EXTERNAL_LSA
:
5728 case OSPF_AS_NSSA_LSA
:
5729 asel
= (struct as_external_lsa
*)lsa
->data
;
5732 p
.prefix
= asel
->header
.id
;
5733 p
.prefixlen
= ip_masklen(asel
->mask
);
5734 apply_mask_ipv4(&p
);
5736 vty_out(vty
, " %s %s/%d [0x%lx]",
5737 IS_EXTERNAL_METRIC(asel
->e
[0].tos
)
5740 inet_ntoa(p
.prefix
), p
.prefixlen
,
5741 (unsigned long)ntohl(
5742 asel
->e
[0].route_tag
));
5744 case OSPF_NETWORK_LSA
:
5745 case OSPF_ASBR_SUMMARY_LSA
:
5746 case OSPF_OPAQUE_LINK_LSA
:
5747 case OSPF_OPAQUE_AREA_LSA
:
5748 case OSPF_OPAQUE_AS_LSA
:
5758 static const char *show_database_desc
[] = {
5760 "Router Link States",
5762 "Summary Link States",
5763 "ASBR-Summary Link States",
5764 "AS External Link States",
5765 "Group Membership LSA",
5766 "NSSA-external Link States",
5768 "Link-Local Opaque-LSA",
5769 "Area-Local Opaque-LSA",
5770 "AS-external Opaque-LSA",
5773 static const char *show_database_header
[] = {
5775 "Link ID ADV Router Age Seq# CkSum Link count",
5776 "Link ID ADV Router Age Seq# CkSum",
5777 "Link ID ADV Router Age Seq# CkSum Route",
5778 "Link ID ADV Router Age Seq# CkSum",
5779 "Link ID ADV Router Age Seq# CkSum Route",
5780 " --- header for Group Member ----",
5781 "Link ID ADV Router Age Seq# CkSum Route",
5783 "Opaque-Type/Id ADV Router Age Seq# CkSum",
5784 "Opaque-Type/Id ADV Router Age Seq# CkSum",
5785 "Opaque-Type/Id ADV Router Age Seq# CkSum",
5788 static void show_ip_ospf_database_header(struct vty
*vty
, struct ospf_lsa
*lsa
)
5790 struct router_lsa
*rlsa
= (struct router_lsa
*)lsa
->data
;
5792 vty_out(vty
, " LS age: %d\n", LS_AGE(lsa
));
5793 vty_out(vty
, " Options: 0x%-2x : %s\n", lsa
->data
->options
,
5794 ospf_options_dump(lsa
->data
->options
));
5795 vty_out(vty
, " LS Flags: 0x%-2x %s\n", lsa
->flags
,
5796 ((lsa
->flags
& OSPF_LSA_LOCAL_XLT
) ? "(Translated from Type-7)"
5799 if (lsa
->data
->type
== OSPF_ROUTER_LSA
) {
5800 vty_out(vty
, " Flags: 0x%x", rlsa
->flags
);
5803 vty_out(vty
, " :%s%s%s%s",
5804 IS_ROUTER_LSA_BORDER(rlsa
) ? " ABR" : "",
5805 IS_ROUTER_LSA_EXTERNAL(rlsa
) ? " ASBR" : "",
5806 IS_ROUTER_LSA_VIRTUAL(rlsa
) ? " VL-endpoint"
5808 IS_ROUTER_LSA_SHORTCUT(rlsa
) ? " Shortcut"
5813 vty_out(vty
, " LS Type: %s\n",
5814 lookup_msg(ospf_lsa_type_msg
, lsa
->data
->type
, NULL
));
5815 vty_out(vty
, " Link State ID: %s %s\n", inet_ntoa(lsa
->data
->id
),
5816 lookup_msg(ospf_link_state_id_type_msg
, lsa
->data
->type
, NULL
));
5817 vty_out(vty
, " Advertising Router: %s\n",
5818 inet_ntoa(lsa
->data
->adv_router
));
5819 vty_out(vty
, " LS Seq Number: %08lx\n",
5820 (unsigned long)ntohl(lsa
->data
->ls_seqnum
));
5821 vty_out(vty
, " Checksum: 0x%04x\n", ntohs(lsa
->data
->checksum
));
5822 vty_out(vty
, " Length: %d\n\n", ntohs(lsa
->data
->length
));
5825 const char *link_type_desc
[] = {
5827 "another Router (point-to-point)",
5828 "a Transit Network",
5833 const char *link_id_desc
[] = {
5834 "(null)", "Neighboring Router ID", "Designated Router address",
5835 "Net", "Neighboring Router ID",
5838 const char *link_data_desc
[] = {
5839 "(null)", "Router Interface address", "Router Interface address",
5840 "Network Mask", "Router Interface address",
5843 /* Show router-LSA each Link information. */
5844 static void show_ip_ospf_database_router_links(struct vty
*vty
,
5845 struct router_lsa
*rl
)
5850 len
= ntohs(rl
->header
.length
) - 4;
5851 for (i
= 0; i
< ntohs(rl
->links
) && len
> 0; len
-= 12, i
++) {
5852 type
= rl
->link
[i
].type
;
5854 vty_out(vty
, " Link connected to: %s\n",
5855 link_type_desc
[type
]);
5856 vty_out(vty
, " (Link ID) %s: %s\n", link_id_desc
[type
],
5857 inet_ntoa(rl
->link
[i
].link_id
));
5858 vty_out(vty
, " (Link Data) %s: %s\n", link_data_desc
[type
],
5859 inet_ntoa(rl
->link
[i
].link_data
));
5860 vty_out(vty
, " Number of TOS metrics: 0\n");
5861 vty_out(vty
, " TOS 0 Metric: %d\n",
5862 ntohs(rl
->link
[i
].metric
));
5867 /* Show router-LSA detail information. */
5868 static int show_router_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
)
5871 struct router_lsa
*rl
= (struct router_lsa
*)lsa
->data
;
5873 show_ip_ospf_database_header(vty
, lsa
);
5875 vty_out(vty
, " Number of Links: %d\n\n", ntohs(rl
->links
));
5877 show_ip_ospf_database_router_links(vty
, rl
);
5884 /* Show network-LSA detail information. */
5885 static int show_network_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
)
5890 struct network_lsa
*nl
= (struct network_lsa
*)lsa
->data
;
5892 show_ip_ospf_database_header(vty
, lsa
);
5894 vty_out(vty
, " Network Mask: /%d\n", ip_masklen(nl
->mask
));
5896 length
= ntohs(lsa
->data
->length
) - OSPF_LSA_HEADER_SIZE
- 4;
5898 for (i
= 0; length
> 0; i
++, length
-= 4)
5899 vty_out(vty
, " Attached Router: %s\n",
5900 inet_ntoa(nl
->routers
[i
]));
5908 /* Show summary-LSA detail information. */
5909 static int show_summary_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
)
5912 struct summary_lsa
*sl
= (struct summary_lsa
*)lsa
->data
;
5914 show_ip_ospf_database_header(vty
, lsa
);
5916 vty_out(vty
, " Network Mask: /%d\n", ip_masklen(sl
->mask
));
5917 vty_out(vty
, " TOS: 0 Metric: %d\n",
5918 GET_METRIC(sl
->metric
));
5925 /* Show summary-ASBR-LSA detail information. */
5926 static int show_summary_asbr_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
)
5929 struct summary_lsa
*sl
= (struct summary_lsa
*)lsa
->data
;
5931 show_ip_ospf_database_header(vty
, lsa
);
5933 vty_out(vty
, " Network Mask: /%d\n", ip_masklen(sl
->mask
));
5934 vty_out(vty
, " TOS: 0 Metric: %d\n",
5935 GET_METRIC(sl
->metric
));
5942 /* Show AS-external-LSA detail information. */
5943 static int show_as_external_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
)
5946 struct as_external_lsa
*al
=
5947 (struct as_external_lsa
*)lsa
->data
;
5949 show_ip_ospf_database_header(vty
, lsa
);
5951 vty_out(vty
, " Network Mask: /%d\n", ip_masklen(al
->mask
));
5952 vty_out(vty
, " Metric Type: %s\n",
5953 IS_EXTERNAL_METRIC(al
->e
[0].tos
)
5954 ? "2 (Larger than any link state path)"
5956 vty_out(vty
, " TOS: 0\n");
5957 vty_out(vty
, " Metric: %d\n",
5958 GET_METRIC(al
->e
[0].metric
));
5959 vty_out(vty
, " Forward Address: %s\n",
5960 inet_ntoa(al
->e
[0].fwd_addr
));
5963 " External Route Tag: %" ROUTE_TAG_PRI
"\n\n",
5964 (route_tag_t
)ntohl(al
->e
[0].route_tag
));
5971 show_as_external_lsa_stdvty (struct ospf_lsa
*lsa
)
5973 struct as_external_lsa
*al
= (struct as_external_lsa
*) lsa
->data
;
5975 /* show_ip_ospf_database_header (vty, lsa); */
5977 zlog_debug( " Network Mask: /%d%s",
5978 ip_masklen (al
->mask
), "\n");
5979 zlog_debug( " Metric Type: %s%s",
5980 IS_EXTERNAL_METRIC (al
->e
[0].tos
) ?
5981 "2 (Larger than any link state path)" : "1", "\n");
5982 zlog_debug( " TOS: 0%s", "\n");
5983 zlog_debug( " Metric: %d%s",
5984 GET_METRIC (al
->e
[0].metric
), "\n");
5985 zlog_debug( " Forward Address: %s%s",
5986 inet_ntoa (al
->e
[0].fwd_addr
), "\n");
5988 zlog_debug( " External Route Tag: %"ROUTE_TAG_PRI
"%s%s",
5989 (route_tag_t
)ntohl (al
->e
[0].route_tag
), "\n", "\n");
5994 /* Show AS-NSSA-LSA detail information. */
5995 static int show_as_nssa_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
)
5998 struct as_external_lsa
*al
=
5999 (struct as_external_lsa
*)lsa
->data
;
6001 show_ip_ospf_database_header(vty
, lsa
);
6003 vty_out(vty
, " Network Mask: /%d\n", ip_masklen(al
->mask
));
6004 vty_out(vty
, " Metric Type: %s\n",
6005 IS_EXTERNAL_METRIC(al
->e
[0].tos
)
6006 ? "2 (Larger than any link state path)"
6008 vty_out(vty
, " TOS: 0\n");
6009 vty_out(vty
, " Metric: %d\n",
6010 GET_METRIC(al
->e
[0].metric
));
6011 vty_out(vty
, " NSSA: Forward Address: %s\n",
6012 inet_ntoa(al
->e
[0].fwd_addr
));
6015 " External Route Tag: %" ROUTE_TAG_PRI
"\n\n",
6016 (route_tag_t
)ntohl(al
->e
[0].route_tag
));
6022 static int show_func_dummy(struct vty
*vty
, struct ospf_lsa
*lsa
)
6027 static int show_opaque_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
)
6030 show_ip_ospf_database_header(vty
, lsa
);
6031 show_opaque_info_detail(vty
, lsa
);
6038 int (*show_function
[])(struct vty
*, struct ospf_lsa
*) = {
6040 show_router_lsa_detail
,
6041 show_network_lsa_detail
,
6042 show_summary_lsa_detail
,
6043 show_summary_asbr_lsa_detail
,
6044 show_as_external_lsa_detail
,
6046 show_as_nssa_lsa_detail
, /* almost same as external */
6048 show_opaque_lsa_detail
,
6049 show_opaque_lsa_detail
,
6050 show_opaque_lsa_detail
,
6053 static void show_lsa_prefix_set(struct vty
*vty
, struct prefix_ls
*lp
,
6054 struct in_addr
*id
, struct in_addr
*adv_router
)
6056 memset(lp
, 0, sizeof(struct prefix_ls
));
6060 else if (adv_router
== NULL
) {
6066 lp
->adv_router
= *adv_router
;
6070 static void show_lsa_detail_proc(struct vty
*vty
, struct route_table
*rt
,
6071 struct in_addr
*id
, struct in_addr
*adv_router
)
6073 struct prefix_ls lp
;
6074 struct route_node
*rn
, *start
;
6075 struct ospf_lsa
*lsa
;
6077 show_lsa_prefix_set(vty
, &lp
, id
, adv_router
);
6078 start
= route_node_get(rt
, (struct prefix
*)&lp
);
6080 route_lock_node(start
);
6081 for (rn
= start
; rn
; rn
= route_next_until(rn
, start
))
6082 if ((lsa
= rn
->info
)) {
6083 if (show_function
[lsa
->data
->type
] != NULL
)
6084 show_function
[lsa
->data
->type
](vty
,
6087 route_unlock_node(start
);
6091 /* Show detail LSA information
6092 -- if id is NULL then show all LSAs. */
6093 static void show_lsa_detail(struct vty
*vty
, struct ospf
*ospf
, int type
,
6094 struct in_addr
*id
, struct in_addr
*adv_router
)
6096 struct listnode
*node
;
6097 struct ospf_area
*area
;
6100 case OSPF_AS_EXTERNAL_LSA
:
6101 case OSPF_OPAQUE_AS_LSA
:
6102 vty_out(vty
, " %s \n\n",
6103 show_database_desc
[type
]);
6104 show_lsa_detail_proc(vty
, AS_LSDB(ospf
, type
), id
, adv_router
);
6107 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
)) {
6108 vty_out(vty
, "\n %s (Area %s)\n\n",
6109 show_database_desc
[type
],
6110 ospf_area_desc_string(area
));
6111 show_lsa_detail_proc(vty
, AREA_LSDB(area
, type
), id
,
6118 static void show_lsa_detail_adv_router_proc(struct vty
*vty
,
6119 struct route_table
*rt
,
6120 struct in_addr
*adv_router
)
6122 struct route_node
*rn
;
6123 struct ospf_lsa
*lsa
;
6125 for (rn
= route_top(rt
); rn
; rn
= route_next(rn
))
6126 if ((lsa
= rn
->info
))
6127 if (IPV4_ADDR_SAME(adv_router
,
6128 &lsa
->data
->adv_router
)) {
6129 if (CHECK_FLAG(lsa
->flags
, OSPF_LSA_LOCAL_XLT
))
6131 if (show_function
[lsa
->data
->type
] != NULL
)
6132 show_function
[lsa
->data
->type
](vty
,
6137 /* Show detail LSA information. */
6138 static void show_lsa_detail_adv_router(struct vty
*vty
, struct ospf
*ospf
,
6139 int type
, struct in_addr
*adv_router
)
6141 struct listnode
*node
;
6142 struct ospf_area
*area
;
6145 case OSPF_AS_EXTERNAL_LSA
:
6146 case OSPF_OPAQUE_AS_LSA
:
6147 vty_out(vty
, " %s \n\n",
6148 show_database_desc
[type
]);
6149 show_lsa_detail_adv_router_proc(vty
, AS_LSDB(ospf
, type
),
6153 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
)) {
6154 vty_out(vty
, "\n %s (Area %s)\n\n",
6155 show_database_desc
[type
],
6156 ospf_area_desc_string(area
));
6157 show_lsa_detail_adv_router_proc(
6158 vty
, AREA_LSDB(area
, type
), adv_router
);
6164 static void show_ip_ospf_database_summary(struct vty
*vty
, struct ospf
*ospf
,
6167 struct ospf_lsa
*lsa
;
6168 struct route_node
*rn
;
6169 struct ospf_area
*area
;
6170 struct listnode
*node
;
6173 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
)) {
6174 for (type
= OSPF_MIN_LSA
; type
< OSPF_MAX_LSA
; type
++) {
6176 case OSPF_AS_EXTERNAL_LSA
:
6177 case OSPF_OPAQUE_AS_LSA
:
6182 if (ospf_lsdb_count_self(area
->lsdb
, type
) > 0
6184 && ospf_lsdb_count(area
->lsdb
, type
) > 0)) {
6185 vty_out(vty
, " %s (Area %s)\n\n",
6186 show_database_desc
[type
],
6187 ospf_area_desc_string(area
));
6188 vty_out(vty
, "%s\n",
6189 show_database_header
[type
]);
6191 LSDB_LOOP (AREA_LSDB(area
, type
), rn
, lsa
)
6192 show_lsa_summary(vty
, lsa
, self
);
6199 for (type
= OSPF_MIN_LSA
; type
< OSPF_MAX_LSA
; type
++) {
6201 case OSPF_AS_EXTERNAL_LSA
:
6202 case OSPF_OPAQUE_AS_LSA
:
6207 if (ospf_lsdb_count_self(ospf
->lsdb
, type
)
6208 || (!self
&& ospf_lsdb_count(ospf
->lsdb
, type
))) {
6209 vty_out(vty
, " %s\n\n",
6210 show_database_desc
[type
]);
6211 vty_out(vty
, "%s\n", show_database_header
[type
]);
6213 LSDB_LOOP (AS_LSDB(ospf
, type
), rn
, lsa
)
6214 show_lsa_summary(vty
, lsa
, self
);
6223 static void show_ip_ospf_database_maxage(struct vty
*vty
, struct ospf
*ospf
)
6225 struct route_node
*rn
;
6227 vty_out(vty
, "\n MaxAge Link States:\n\n");
6229 for (rn
= route_top(ospf
->maxage_lsa
); rn
; rn
= route_next(rn
)) {
6230 struct ospf_lsa
*lsa
;
6232 if ((lsa
= rn
->info
) != NULL
) {
6233 vty_out(vty
, "Link type: %d\n", lsa
->data
->type
);
6234 vty_out(vty
, "Link State ID: %s\n",
6235 inet_ntoa(lsa
->data
->id
));
6236 vty_out(vty
, "Advertising Router: %s\n",
6237 inet_ntoa(lsa
->data
->adv_router
));
6238 vty_out(vty
, "LSA lock count: %d\n", lsa
->lock
);
6244 #define OSPF_LSA_TYPE_NSSA_DESC "NSSA external link state\n"
6245 #define OSPF_LSA_TYPE_NSSA_CMD_STR "|nssa-external"
6247 #define OSPF_LSA_TYPE_OPAQUE_LINK_DESC "Link local Opaque-LSA\n"
6248 #define OSPF_LSA_TYPE_OPAQUE_AREA_DESC "Link area Opaque-LSA\n"
6249 #define OSPF_LSA_TYPE_OPAQUE_AS_DESC "Link AS Opaque-LSA\n"
6250 #define OSPF_LSA_TYPE_OPAQUE_CMD_STR "|opaque-link|opaque-area|opaque-as"
6252 #define OSPF_LSA_TYPES_DESC \
6253 "ASBR summary link states\n" \
6254 "External link states\n" \
6255 "Network link states\n" \
6256 "Router link states\n" \
6257 "Network summary link states\n" OSPF_LSA_TYPE_NSSA_DESC \
6258 OSPF_LSA_TYPE_OPAQUE_LINK_DESC OSPF_LSA_TYPE_OPAQUE_AREA_DESC \
6259 OSPF_LSA_TYPE_OPAQUE_AS_DESC
6261 static int show_ip_ospf_database_common(struct vty
*vty
, struct ospf
*ospf
,
6262 int arg_base
, int argc
,
6263 struct cmd_token
**argv
,
6268 struct in_addr id
, adv_router
;
6271 vty_out(vty
, "\nOSPF Instance: %d\n", ospf
->instance
);
6273 ospf_show_vrf_name(ospf
, vty
, NULL
, use_vrf
);
6275 vty_out(vty
, "\n OSPF Router with ID (%s)\n\n",
6276 inet_ntoa(ospf
->router_id
));
6279 if (argc
== arg_base
+ 4) {
6280 show_ip_ospf_database_summary(vty
, ospf
, 0);
6284 /* Set database type to show. */
6285 if (strncmp(argv
[arg_base
+ idx_type
]->text
, "r", 1) == 0)
6286 type
= OSPF_ROUTER_LSA
;
6287 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "ne", 2) == 0)
6288 type
= OSPF_NETWORK_LSA
;
6289 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "ns", 2) == 0)
6290 type
= OSPF_AS_NSSA_LSA
;
6291 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "su", 2) == 0)
6292 type
= OSPF_SUMMARY_LSA
;
6293 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "a", 1) == 0)
6294 type
= OSPF_ASBR_SUMMARY_LSA
;
6295 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "e", 1) == 0)
6296 type
= OSPF_AS_EXTERNAL_LSA
;
6297 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "se", 2) == 0) {
6298 show_ip_ospf_database_summary(vty
, ospf
, 1);
6300 } else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "m", 1) == 0) {
6301 show_ip_ospf_database_maxage(vty
, ospf
);
6303 } else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "opaque-l", 8) == 0)
6304 type
= OSPF_OPAQUE_LINK_LSA
;
6305 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "opaque-ar", 9) == 0)
6306 type
= OSPF_OPAQUE_AREA_LSA
;
6307 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "opaque-as", 9) == 0)
6308 type
= OSPF_OPAQUE_AS_LSA
;
6312 /* `show ip ospf database LSA'. */
6313 if (argc
== arg_base
+ 5)
6314 show_lsa_detail(vty
, ospf
, type
, NULL
, NULL
);
6315 else if (argc
>= arg_base
+ 6) {
6316 ret
= inet_aton(argv
[arg_base
+ 5]->arg
, &id
);
6320 /* `show ip ospf database LSA ID'. */
6321 if (argc
== arg_base
+ 6)
6322 show_lsa_detail(vty
, ospf
, type
, &id
, NULL
);
6323 /* `show ip ospf database LSA ID adv-router ADV_ROUTER'. */
6324 else if (argc
== arg_base
+ 7) {
6325 if (strncmp(argv
[arg_base
+ 6]->text
, "s", 1) == 0)
6326 adv_router
= ospf
->router_id
;
6328 ret
= inet_aton(argv
[arg_base
+ 7]->arg
,
6333 show_lsa_detail(vty
, ospf
, type
, &id
, &adv_router
);
6340 DEFUN (show_ip_ospf_database_max
,
6341 show_ip_ospf_database_max_cmd
,
6342 "show ip ospf [vrf <NAME|all>] database <max-age|self-originate>",
6345 "OSPF information\n"
6348 "Database summary\n"
6349 "LSAs in MaxAge list\n"
6350 "Self-originated link states\n")
6352 struct ospf
*ospf
= NULL
;
6353 struct listnode
*node
= NULL
;
6354 char *vrf_name
= NULL
;
6355 bool all_vrf
= FALSE
;
6356 int ret
= CMD_SUCCESS
;
6359 uint8_t use_vrf
= 0;
6361 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
6364 bool ospf_output
= FALSE
;
6369 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
6370 if (!ospf
->oi_running
)
6373 ret
= show_ip_ospf_database_common(
6374 vty
, ospf
, idx_vrf
? 2 : 0, argc
, argv
,
6379 vty_out(vty
, "%% OSPF instance not found\n");
6381 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
6382 if (ospf
== NULL
|| !ospf
->oi_running
) {
6383 vty_out(vty
, "%% OSPF instance not found\n");
6386 ret
= (show_ip_ospf_database_common(
6387 vty
, ospf
, idx_vrf
? 2 : 0, argc
, argv
,
6391 /* Display default ospf (instance 0) info */
6392 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
6393 if (ospf
== NULL
|| !ospf
->oi_running
) {
6394 vty_out(vty
, "%% OSPF instance not found\n");
6398 ret
= show_ip_ospf_database_common(vty
, ospf
, 0, argc
, argv
,
6405 DEFUN (show_ip_ospf_instance_database
,
6406 show_ip_ospf_instance_database_cmd
,
6407 "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>]]]",
6410 "OSPF information\n"
6413 "Database summary\n"
6415 "Link State ID (as an IP address)\n"
6416 "Self-originated link states\n"
6417 "Advertising Router link states\n"
6418 "Advertising Router (as an IP address)\n")
6421 unsigned short instance
= 0;
6422 struct listnode
*node
= NULL
;
6423 char *vrf_name
= NULL
;
6424 bool all_vrf
= FALSE
;
6425 int ret
= CMD_SUCCESS
;
6428 uint8_t use_vrf
= 0;
6430 if (argv_find(argv
, argc
, "(1-65535)", &idx
)) {
6431 instance
= strtoul(argv
[idx
]->arg
, NULL
, 10);
6432 ospf
= ospf_lookup_instance(instance
);
6434 return CMD_NOT_MY_INSTANCE
;
6435 if (!ospf
->oi_running
)
6438 return (show_ip_ospf_database_common(vty
, ospf
, idx
? 1 : 0,
6439 argc
, argv
, use_vrf
));
6440 } else if (argv_find(argv
, argc
, "vrf", &idx
)) {
6441 vrf_name
= argv
[++idx
]->arg
;
6442 all_vrf
= strmatch(vrf_name
, "all");
6448 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
6449 if (!ospf
->oi_running
)
6451 ret
= (show_ip_ospf_database_common(
6452 vty
, ospf
, idx
? 2 : 0, argc
, argv
,
6456 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
6457 if ((ospf
== NULL
) || !ospf
->oi_running
) {
6458 vty_out(vty
, "%% OSPF instance not found\n");
6462 ret
= (show_ip_ospf_database_common(
6463 vty
, ospf
, idx
? 2 : 0, argc
, argv
, use_vrf
));
6466 /* Display default ospf (instance 0) info */
6467 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
6468 if (ospf
== NULL
|| !ospf
->oi_running
) {
6469 vty_out(vty
, "%% OSPF instance not found\n");
6473 ret
= (show_ip_ospf_database_common(vty
, ospf
, 0, argc
, argv
,
6480 DEFUN (show_ip_ospf_instance_database_max
,
6481 show_ip_ospf_instance_database_max_cmd
,
6482 "show ip ospf (1-65535) database <max-age|self-originate>",
6485 "OSPF information\n"
6487 "Database summary\n"
6488 "LSAs in MaxAge list\n"
6489 "Self-originated link states\n")
6493 unsigned short instance
= 0;
6495 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
6497 ospf
= ospf_lookup_instance(instance
);
6499 return CMD_NOT_MY_INSTANCE
;
6501 if (!ospf
->oi_running
) {
6502 vty_out(vty
, "%% OSPF instance not found\n");
6506 return show_ip_ospf_database_common(vty
, ospf
, 1, argc
, argv
, 0);
6510 static int show_ip_ospf_database_type_adv_router_common(struct vty
*vty
,
6512 int arg_base
, int argc
,
6513 struct cmd_token
**argv
,
6518 struct in_addr adv_router
;
6521 vty_out(vty
, "\nOSPF Instance: %d\n", ospf
->instance
);
6523 ospf_show_vrf_name(ospf
, vty
, NULL
, use_vrf
);
6525 vty_out(vty
, "\n OSPF Router with ID (%s)\n\n",
6526 inet_ntoa(ospf
->router_id
));
6528 /* Set database type to show. */
6529 if (strncmp(argv
[arg_base
+ idx_type
]->text
, "r", 1) == 0)
6530 type
= OSPF_ROUTER_LSA
;
6531 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "ne", 2) == 0)
6532 type
= OSPF_NETWORK_LSA
;
6533 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "ns", 2) == 0)
6534 type
= OSPF_AS_NSSA_LSA
;
6535 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "s", 1) == 0)
6536 type
= OSPF_SUMMARY_LSA
;
6537 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "a", 1) == 0)
6538 type
= OSPF_ASBR_SUMMARY_LSA
;
6539 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "e", 1) == 0)
6540 type
= OSPF_AS_EXTERNAL_LSA
;
6541 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "opaque-l", 8) == 0)
6542 type
= OSPF_OPAQUE_LINK_LSA
;
6543 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "opaque-ar", 9) == 0)
6544 type
= OSPF_OPAQUE_AREA_LSA
;
6545 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "opaque-as", 9) == 0)
6546 type
= OSPF_OPAQUE_AS_LSA
;
6550 /* `show ip ospf database LSA adv-router ADV_ROUTER'. */
6551 if (strncmp(argv
[arg_base
+ 5]->text
, "s", 1) == 0)
6552 adv_router
= ospf
->router_id
;
6554 ret
= inet_aton(argv
[arg_base
+ 6]->arg
, &adv_router
);
6559 show_lsa_detail_adv_router(vty
, ospf
, type
, &adv_router
);
6564 DEFUN (show_ip_ospf_instance_database_type_adv_router
,
6565 show_ip_ospf_instance_database_type_adv_router_cmd
,
6566 "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>",
6569 "OSPF information\n"
6572 "Database summary\n"
6574 "Advertising Router link states\n"
6575 "Advertising Router (as an IP address)\n"
6576 "Self-originated link states\n")
6578 struct ospf
*ospf
= NULL
;
6579 unsigned short instance
= 0;
6580 struct listnode
*node
= NULL
;
6581 char *vrf_name
= NULL
;
6582 bool all_vrf
= FALSE
;
6583 int ret
= CMD_SUCCESS
;
6585 int idx
= 0, idx_vrf
= 0;
6586 uint8_t use_vrf
= 0;
6588 if (argv_find(argv
, argc
, "(1-65535)", &idx
)) {
6589 instance
= strtoul(argv
[idx
]->arg
, NULL
, 10);
6590 ospf
= ospf_lookup_instance(instance
);
6592 return CMD_NOT_MY_INSTANCE
;
6593 if (!ospf
->oi_running
) {
6594 vty_out(vty
, "%% OSPF instance not found\n");
6598 return (show_ip_ospf_database_type_adv_router_common(
6599 vty
, ospf
, idx
? 1 : 0, argc
, argv
, use_vrf
));
6602 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
6605 bool ospf_output
= FALSE
;
6610 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
6611 if (!ospf
->oi_running
)
6614 ret
= show_ip_ospf_database_type_adv_router_common(
6615 vty
, ospf
, idx
? 1 : 0, argc
, argv
,
6619 vty_out(vty
, "%% OSPF instance not found\n");
6621 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
6622 if ((ospf
== NULL
) || !ospf
->oi_running
) {
6623 vty_out(vty
, "%% OSPF instance not found\n");
6627 ret
= show_ip_ospf_database_type_adv_router_common(
6628 vty
, ospf
, idx
? 1 : 0, argc
, argv
, use_vrf
);
6631 /* Display default ospf (instance 0) info */
6632 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
6633 if (ospf
== NULL
|| !ospf
->oi_running
) {
6634 vty_out(vty
, "%% OSPF instance not found\n");
6638 ret
= show_ip_ospf_database_type_adv_router_common(
6639 vty
, ospf
, idx
? 1 : 0, argc
, argv
, use_vrf
);
6642 /*return (show_ip_ospf_database_type_adv_router_common(
6643 vty, ospf, idx ? 1 : 0, argc, argv));*/
6646 DEFUN (ip_ospf_authentication_args
,
6647 ip_ospf_authentication_args_addr_cmd
,
6648 "ip ospf authentication <null|message-digest> [A.B.C.D]",
6650 "OSPF interface commands\n"
6651 "Enable authentication on this interface\n"
6652 "Use null authentication\n"
6653 "Use message-digest authentication\n"
6654 "Address of interface\n")
6656 VTY_DECLVAR_CONTEXT(interface
, ifp
);
6657 int idx_encryption
= 3;
6659 struct in_addr addr
;
6661 struct ospf_if_params
*params
;
6663 params
= IF_DEF_PARAMS(ifp
);
6666 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
6669 "Please specify interface address by A.B.C.D\n");
6670 return CMD_WARNING_CONFIG_FAILED
;
6673 params
= ospf_get_if_params(ifp
, addr
);
6674 ospf_if_update_params(ifp
, addr
);
6677 /* Handle null authentication */
6678 if (argv
[idx_encryption
]->arg
[0] == 'n') {
6679 SET_IF_PARAM(params
, auth_type
);
6680 params
->auth_type
= OSPF_AUTH_NULL
;
6684 /* Handle message-digest authentication */
6685 if (argv
[idx_encryption
]->arg
[0] == 'm') {
6686 SET_IF_PARAM(params
, auth_type
);
6687 params
->auth_type
= OSPF_AUTH_CRYPTOGRAPHIC
;
6691 vty_out(vty
, "You shouldn't get here!\n");
6692 return CMD_WARNING_CONFIG_FAILED
;
6695 DEFUN (ip_ospf_authentication
,
6696 ip_ospf_authentication_addr_cmd
,
6697 "ip ospf authentication [A.B.C.D]",
6699 "OSPF interface commands\n"
6700 "Enable authentication on this interface\n"
6701 "Address of interface\n")
6703 VTY_DECLVAR_CONTEXT(interface
, ifp
);
6705 struct in_addr addr
;
6707 struct ospf_if_params
*params
;
6709 params
= IF_DEF_PARAMS(ifp
);
6712 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
6715 "Please specify interface address by A.B.C.D\n");
6716 return CMD_WARNING_CONFIG_FAILED
;
6719 params
= ospf_get_if_params(ifp
, addr
);
6720 ospf_if_update_params(ifp
, addr
);
6723 SET_IF_PARAM(params
, auth_type
);
6724 params
->auth_type
= OSPF_AUTH_SIMPLE
;
6729 DEFUN (no_ip_ospf_authentication_args
,
6730 no_ip_ospf_authentication_args_addr_cmd
,
6731 "no ip ospf authentication <null|message-digest> [A.B.C.D]",
6734 "OSPF interface commands\n"
6735 "Enable authentication on this interface\n"
6736 "Use null authentication\n"
6737 "Use message-digest authentication\n"
6738 "Address of interface\n")
6740 VTY_DECLVAR_CONTEXT(interface
, ifp
);
6741 int idx_encryption
= 4;
6743 struct in_addr addr
;
6745 struct ospf_if_params
*params
;
6746 struct route_node
*rn
;
6749 params
= IF_DEF_PARAMS(ifp
);
6752 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
6755 "Please specify interface address by A.B.C.D\n");
6756 return CMD_WARNING_CONFIG_FAILED
;
6759 params
= ospf_lookup_if_params(ifp
, addr
);
6760 if (params
== NULL
) {
6761 vty_out(vty
, "Ip Address specified is unknown\n");
6762 return CMD_WARNING_CONFIG_FAILED
;
6764 params
->auth_type
= OSPF_AUTH_NOTSET
;
6765 UNSET_IF_PARAM(params
, auth_type
);
6766 if (params
!= IF_DEF_PARAMS(ifp
)) {
6767 ospf_free_if_params(ifp
, addr
);
6768 ospf_if_update_params(ifp
, addr
);
6771 if (argv
[idx_encryption
]->arg
[0] == 'n') {
6772 auth_type
= OSPF_AUTH_NULL
;
6773 } else if (argv
[idx_encryption
]->arg
[0] == 'm') {
6774 auth_type
= OSPF_AUTH_CRYPTOGRAPHIC
;
6776 vty_out(vty
, "Unexpected input encountered\n");
6777 return CMD_WARNING_CONFIG_FAILED
;
6780 * Here we have a case where the user has entered
6781 * 'no ip ospf authentication (null | message_digest )'
6782 * we need to find if we have any ip addresses underneath it
6784 * correspond to the associated type.
6786 if (params
->auth_type
== auth_type
) {
6787 params
->auth_type
= OSPF_AUTH_NOTSET
;
6788 UNSET_IF_PARAM(params
, auth_type
);
6791 for (rn
= route_top(IF_OIFS_PARAMS(ifp
)); rn
;
6792 rn
= route_next(rn
)) {
6793 if ((params
= rn
->info
)) {
6794 if (params
->auth_type
== auth_type
) {
6795 params
->auth_type
= OSPF_AUTH_NOTSET
;
6796 UNSET_IF_PARAM(params
, auth_type
);
6797 if (params
!= IF_DEF_PARAMS(ifp
)) {
6798 ospf_free_if_params(
6799 ifp
, rn
->p
.u
.prefix4
);
6800 ospf_if_update_params(
6801 ifp
, rn
->p
.u
.prefix4
);
6811 DEFUN (no_ip_ospf_authentication
,
6812 no_ip_ospf_authentication_addr_cmd
,
6813 "no ip ospf authentication [A.B.C.D]",
6816 "OSPF interface commands\n"
6817 "Enable authentication on this interface\n"
6818 "Address of interface\n")
6820 VTY_DECLVAR_CONTEXT(interface
, ifp
);
6822 struct in_addr addr
;
6824 struct ospf_if_params
*params
;
6825 struct route_node
*rn
;
6827 params
= IF_DEF_PARAMS(ifp
);
6830 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
6833 "Please specify interface address by A.B.C.D\n");
6834 return CMD_WARNING_CONFIG_FAILED
;
6837 params
= ospf_lookup_if_params(ifp
, addr
);
6838 if (params
== NULL
) {
6839 vty_out(vty
, "Ip Address specified is unknown\n");
6840 return CMD_WARNING_CONFIG_FAILED
;
6843 params
->auth_type
= OSPF_AUTH_NOTSET
;
6844 UNSET_IF_PARAM(params
, auth_type
);
6845 if (params
!= IF_DEF_PARAMS(ifp
)) {
6846 ospf_free_if_params(ifp
, addr
);
6847 ospf_if_update_params(ifp
, addr
);
6851 * When a user enters 'no ip ospf authentication'
6852 * We should remove all authentication types from
6855 if ((params
->auth_type
== OSPF_AUTH_NULL
)
6856 || (params
->auth_type
== OSPF_AUTH_CRYPTOGRAPHIC
)
6857 || (params
->auth_type
== OSPF_AUTH_SIMPLE
)) {
6858 params
->auth_type
= OSPF_AUTH_NOTSET
;
6859 UNSET_IF_PARAM(params
, auth_type
);
6862 for (rn
= route_top(IF_OIFS_PARAMS(ifp
)); rn
;
6863 rn
= route_next(rn
)) {
6864 if ((params
= rn
->info
)) {
6866 if ((params
->auth_type
== OSPF_AUTH_NULL
)
6867 || (params
->auth_type
6868 == OSPF_AUTH_CRYPTOGRAPHIC
)
6869 || (params
->auth_type
6870 == OSPF_AUTH_SIMPLE
)) {
6871 params
->auth_type
= OSPF_AUTH_NOTSET
;
6872 UNSET_IF_PARAM(params
, auth_type
);
6873 if (params
!= IF_DEF_PARAMS(ifp
)) {
6874 ospf_free_if_params(
6875 ifp
, rn
->p
.u
.prefix4
);
6876 ospf_if_update_params(
6877 ifp
, rn
->p
.u
.prefix4
);
6888 DEFUN (ip_ospf_authentication_key
,
6889 ip_ospf_authentication_key_addr_cmd
,
6890 "ip ospf authentication-key AUTH_KEY [A.B.C.D]",
6892 "OSPF interface commands\n"
6893 "Authentication password (key)\n"
6894 "The OSPF password (key)\n"
6895 "Address of interface\n")
6897 VTY_DECLVAR_CONTEXT(interface
, ifp
);
6899 struct in_addr addr
;
6900 struct ospf_if_params
*params
;
6902 params
= IF_DEF_PARAMS(ifp
);
6904 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
6905 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
6907 "Please specify interface address by A.B.C.D\n");
6908 return CMD_WARNING_CONFIG_FAILED
;
6911 params
= ospf_get_if_params(ifp
, addr
);
6912 ospf_if_update_params(ifp
, addr
);
6915 memset(params
->auth_simple
, 0, OSPF_AUTH_SIMPLE_SIZE
+ 1);
6916 strncpy((char *)params
->auth_simple
, argv
[3]->arg
,
6917 OSPF_AUTH_SIMPLE_SIZE
);
6918 SET_IF_PARAM(params
, auth_simple
);
6923 DEFUN_HIDDEN (ospf_authentication_key
,
6924 ospf_authentication_key_cmd
,
6925 "ospf authentication-key AUTH_KEY [A.B.C.D]",
6926 "OSPF interface commands\n"
6927 VLINK_HELPSTR_AUTH_SIMPLE
6928 "Address of interface\n")
6930 return ip_ospf_authentication_key(self
, vty
, argc
, argv
);
6933 DEFUN (no_ip_ospf_authentication_key
,
6934 no_ip_ospf_authentication_key_authkey_addr_cmd
,
6935 "no ip ospf authentication-key [AUTH_KEY [A.B.C.D]]",
6938 "OSPF interface commands\n"
6939 VLINK_HELPSTR_AUTH_SIMPLE
6940 "Address of interface\n")
6942 VTY_DECLVAR_CONTEXT(interface
, ifp
);
6944 struct in_addr addr
;
6945 struct ospf_if_params
*params
;
6946 params
= IF_DEF_PARAMS(ifp
);
6948 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
6949 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
6951 "Please specify interface address by A.B.C.D\n");
6952 return CMD_WARNING_CONFIG_FAILED
;
6955 params
= ospf_lookup_if_params(ifp
, addr
);
6960 memset(params
->auth_simple
, 0, OSPF_AUTH_SIMPLE_SIZE
);
6961 UNSET_IF_PARAM(params
, auth_simple
);
6963 if (params
!= IF_DEF_PARAMS(ifp
)) {
6964 ospf_free_if_params(ifp
, addr
);
6965 ospf_if_update_params(ifp
, addr
);
6971 DEFUN_HIDDEN (no_ospf_authentication_key
,
6972 no_ospf_authentication_key_authkey_addr_cmd
,
6973 "no ospf authentication-key [AUTH_KEY [A.B.C.D]]",
6975 "OSPF interface commands\n"
6976 VLINK_HELPSTR_AUTH_SIMPLE
6977 "Address of interface\n")
6979 return no_ip_ospf_authentication_key(self
, vty
, argc
, argv
);
6982 DEFUN (ip_ospf_message_digest_key
,
6983 ip_ospf_message_digest_key_cmd
,
6984 "ip ospf message-digest-key (1-255) md5 KEY [A.B.C.D]",
6986 "OSPF interface commands\n"
6987 "Message digest authentication password (key)\n"
6989 "Use MD5 algorithm\n"
6990 "The OSPF password (key)\n"
6991 "Address of interface\n")
6993 VTY_DECLVAR_CONTEXT(interface
, ifp
);
6994 struct crypt_key
*ck
;
6996 struct in_addr addr
;
6997 struct ospf_if_params
*params
;
6999 params
= IF_DEF_PARAMS(ifp
);
7002 argv_find(argv
, argc
, "(1-255)", &idx
);
7003 char *keyid
= argv
[idx
]->arg
;
7004 argv_find(argv
, argc
, "KEY", &idx
);
7005 char *cryptkey
= argv
[idx
]->arg
;
7007 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7008 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7010 "Please specify interface address by A.B.C.D\n");
7011 return CMD_WARNING_CONFIG_FAILED
;
7014 params
= ospf_get_if_params(ifp
, addr
);
7015 ospf_if_update_params(ifp
, addr
);
7018 key_id
= strtol(keyid
, NULL
, 10);
7019 if (ospf_crypt_key_lookup(params
->auth_crypt
, key_id
) != NULL
) {
7020 vty_out(vty
, "OSPF: Key %d already exists\n", key_id
);
7024 ck
= ospf_crypt_key_new();
7025 ck
->key_id
= (uint8_t)key_id
;
7026 memset(ck
->auth_key
, 0, OSPF_AUTH_MD5_SIZE
+ 1);
7027 strncpy((char *)ck
->auth_key
, cryptkey
, OSPF_AUTH_MD5_SIZE
);
7029 ospf_crypt_key_add(params
->auth_crypt
, ck
);
7030 SET_IF_PARAM(params
, auth_crypt
);
7035 DEFUN_HIDDEN (ospf_message_digest_key
,
7036 ospf_message_digest_key_cmd
,
7037 "ospf message-digest-key (1-255) md5 KEY [A.B.C.D]",
7038 "OSPF interface commands\n"
7039 "Message digest authentication password (key)\n"
7041 "Use MD5 algorithm\n"
7042 "The OSPF password (key)\n"
7043 "Address of interface\n")
7045 return ip_ospf_message_digest_key(self
, vty
, argc
, argv
);
7048 DEFUN (no_ip_ospf_message_digest_key
,
7049 no_ip_ospf_message_digest_key_cmd
,
7050 "no ip ospf message-digest-key (1-255) [md5 KEY] [A.B.C.D]",
7053 "OSPF interface commands\n"
7054 "Message digest authentication password (key)\n"
7056 "Use MD5 algorithm\n"
7057 "The OSPF password (key)\n"
7058 "Address of interface\n")
7060 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7062 struct crypt_key
*ck
;
7064 struct in_addr addr
;
7065 struct ospf_if_params
*params
;
7066 params
= IF_DEF_PARAMS(ifp
);
7068 argv_find(argv
, argc
, "(1-255)", &idx
);
7069 char *keyid
= argv
[idx
]->arg
;
7071 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7072 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7074 "Please specify interface address by A.B.C.D\n");
7075 return CMD_WARNING_CONFIG_FAILED
;
7078 params
= ospf_lookup_if_params(ifp
, addr
);
7083 key_id
= strtol(keyid
, NULL
, 10);
7084 ck
= ospf_crypt_key_lookup(params
->auth_crypt
, key_id
);
7086 vty_out(vty
, "OSPF: Key %d does not exist\n", key_id
);
7087 return CMD_WARNING_CONFIG_FAILED
;
7090 ospf_crypt_key_delete(params
->auth_crypt
, key_id
);
7092 if (params
!= IF_DEF_PARAMS(ifp
)) {
7093 ospf_free_if_params(ifp
, addr
);
7094 ospf_if_update_params(ifp
, addr
);
7100 DEFUN_HIDDEN (no_ospf_message_digest_key
,
7101 no_ospf_message_digest_key_cmd
,
7102 "no ospf message-digest-key (1-255) [md5 KEY] [A.B.C.D]",
7104 "OSPF interface commands\n"
7105 "Message digest authentication password (key)\n"
7107 "Use MD5 algorithm\n"
7108 "The OSPF password (key)\n"
7109 "Address of interface\n")
7111 return no_ip_ospf_message_digest_key(self
, vty
, argc
, argv
);
7114 DEFUN (ip_ospf_cost
,
7116 "ip ospf cost (1-65535) [A.B.C.D]",
7118 "OSPF interface commands\n"
7121 "Address of interface\n")
7123 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7125 uint32_t cost
= OSPF_OUTPUT_COST_DEFAULT
;
7126 struct in_addr addr
;
7127 struct ospf_if_params
*params
;
7128 params
= IF_DEF_PARAMS(ifp
);
7131 char *coststr
= NULL
, *ifaddr
= NULL
;
7133 argv_find(argv
, argc
, "(1-65535)", &idx
);
7134 coststr
= argv
[idx
]->arg
;
7135 cost
= strtol(coststr
, NULL
, 10);
7137 ifaddr
= argv_find(argv
, argc
, "A.B.C.D", &idx
) ? argv
[idx
]->arg
: NULL
;
7139 if (!inet_aton(ifaddr
, &addr
)) {
7141 "Please specify interface address by A.B.C.D\n");
7142 return CMD_WARNING_CONFIG_FAILED
;
7145 params
= ospf_get_if_params(ifp
, addr
);
7146 ospf_if_update_params(ifp
, addr
);
7149 SET_IF_PARAM(params
, output_cost_cmd
);
7150 params
->output_cost_cmd
= cost
;
7152 ospf_if_recalculate_output_cost(ifp
);
7157 DEFUN_HIDDEN (ospf_cost
,
7159 "ospf cost (1-65535) [A.B.C.D]",
7160 "OSPF interface commands\n"
7163 "Address of interface\n")
7165 return ip_ospf_cost(self
, vty
, argc
, argv
);
7168 DEFUN (no_ip_ospf_cost
,
7169 no_ip_ospf_cost_cmd
,
7170 "no ip ospf cost [(1-65535)] [A.B.C.D]",
7173 "OSPF interface commands\n"
7176 "Address of interface\n")
7178 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7180 struct in_addr addr
;
7181 struct ospf_if_params
*params
;
7183 params
= IF_DEF_PARAMS(ifp
);
7186 char *ifaddr
= NULL
;
7187 ifaddr
= argv_find(argv
, argc
, "A.B.C.D", &idx
) ? argv
[idx
]->arg
: NULL
;
7189 /* According to the semantics we are mimicking "no ip ospf cost N" is
7190 * always treated as "no ip ospf cost" regardless of the actual value
7191 * of N already configured for the interface. Thus ignore cost. */
7194 if (!inet_aton(ifaddr
, &addr
)) {
7196 "Please specify interface address by A.B.C.D\n");
7197 return CMD_WARNING_CONFIG_FAILED
;
7200 params
= ospf_lookup_if_params(ifp
, addr
);
7205 UNSET_IF_PARAM(params
, output_cost_cmd
);
7207 if (params
!= IF_DEF_PARAMS(ifp
)) {
7208 ospf_free_if_params(ifp
, addr
);
7209 ospf_if_update_params(ifp
, addr
);
7212 ospf_if_recalculate_output_cost(ifp
);
7217 DEFUN_HIDDEN (no_ospf_cost
,
7219 "no ospf cost [(1-65535)] [A.B.C.D]",
7221 "OSPF interface commands\n"
7224 "Address of interface\n")
7226 return no_ip_ospf_cost(self
, vty
, argc
, argv
);
7229 static void ospf_nbr_timer_update(struct ospf_interface
*oi
)
7231 struct route_node
*rn
;
7232 struct ospf_neighbor
*nbr
;
7234 for (rn
= route_top(oi
->nbrs
); rn
; rn
= route_next(rn
))
7235 if ((nbr
= rn
->info
)) {
7236 nbr
->v_inactivity
= OSPF_IF_PARAM(oi
, v_wait
);
7237 nbr
->v_db_desc
= OSPF_IF_PARAM(oi
, retransmit_interval
);
7238 nbr
->v_ls_req
= OSPF_IF_PARAM(oi
, retransmit_interval
);
7239 nbr
->v_ls_upd
= OSPF_IF_PARAM(oi
, retransmit_interval
);
7243 static int ospf_vty_dead_interval_set(struct vty
*vty
, const char *interval_str
,
7244 const char *nbr_str
,
7245 const char *fast_hello_str
)
7247 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7250 struct in_addr addr
;
7252 struct ospf_if_params
*params
;
7253 struct ospf_interface
*oi
;
7254 struct route_node
*rn
;
7256 params
= IF_DEF_PARAMS(ifp
);
7259 ret
= inet_aton(nbr_str
, &addr
);
7262 "Please specify interface address by A.B.C.D\n");
7263 return CMD_WARNING_CONFIG_FAILED
;
7266 params
= ospf_get_if_params(ifp
, addr
);
7267 ospf_if_update_params(ifp
, addr
);
7271 seconds
= strtoul(interval_str
, NULL
, 10);
7273 /* reset fast_hello too, just to be sure */
7274 UNSET_IF_PARAM(params
, fast_hello
);
7275 params
->fast_hello
= OSPF_FAST_HELLO_DEFAULT
;
7276 } else if (fast_hello_str
) {
7277 hellomult
= strtoul(fast_hello_str
, NULL
, 10);
7278 /* 1s dead-interval with sub-second hellos desired */
7279 seconds
= OSPF_ROUTER_DEAD_INTERVAL_MINIMAL
;
7280 SET_IF_PARAM(params
, fast_hello
);
7281 params
->fast_hello
= hellomult
;
7284 "Please specify dead-interval or hello-multiplier\n");
7285 return CMD_WARNING_CONFIG_FAILED
;
7288 SET_IF_PARAM(params
, v_wait
);
7289 params
->v_wait
= seconds
;
7291 /* Update timer values in neighbor structure. */
7293 struct ospf
*ospf
= NULL
;
7295 ospf
= ospf_lookup_by_vrf_id(ifp
->vrf_id
);
7297 oi
= ospf_if_lookup_by_local_addr(ospf
, ifp
, addr
);
7299 ospf_nbr_timer_update(oi
);
7302 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
))
7303 if ((oi
= rn
->info
))
7304 ospf_nbr_timer_update(oi
);
7310 DEFUN (ip_ospf_dead_interval
,
7311 ip_ospf_dead_interval_cmd
,
7312 "ip ospf dead-interval (1-65535) [A.B.C.D]",
7314 "OSPF interface commands\n"
7315 "Interval time after which a neighbor is declared down\n"
7317 "Address of interface\n")
7320 char *interval
= argv_find(argv
, argc
, "(1-65535)", &idx
)
7324 argv_find(argv
, argc
, "A.B.C.D", &idx
) ? argv
[idx
]->arg
: NULL
;
7325 return ospf_vty_dead_interval_set(vty
, interval
, ifaddr
, NULL
);
7329 DEFUN_HIDDEN (ospf_dead_interval
,
7330 ospf_dead_interval_cmd
,
7331 "ospf dead-interval (1-65535) [A.B.C.D]",
7332 "OSPF interface commands\n"
7333 "Interval time after which a neighbor is declared down\n"
7335 "Address of interface\n")
7337 return ip_ospf_dead_interval(self
, vty
, argc
, argv
);
7340 DEFUN (ip_ospf_dead_interval_minimal
,
7341 ip_ospf_dead_interval_minimal_addr_cmd
,
7342 "ip ospf dead-interval minimal hello-multiplier (1-10) [A.B.C.D]",
7344 "OSPF interface commands\n"
7345 "Interval time after which a neighbor is declared down\n"
7346 "Minimal 1s dead-interval with fast sub-second hellos\n"
7347 "Hello multiplier factor\n"
7348 "Number of Hellos to send each second\n"
7349 "Address of interface\n")
7354 return ospf_vty_dead_interval_set(
7355 vty
, NULL
, argv
[idx_ipv4
]->arg
, argv
[idx_number
]->arg
);
7357 return ospf_vty_dead_interval_set(vty
, NULL
, NULL
,
7358 argv
[idx_number
]->arg
);
7361 DEFUN (no_ip_ospf_dead_interval
,
7362 no_ip_ospf_dead_interval_cmd
,
7363 "no ip ospf dead-interval [<(1-65535)|minimal hello-multiplier (1-10)> [A.B.C.D]]",
7366 "OSPF interface commands\n"
7367 "Interval time after which a neighbor is declared down\n"
7369 "Minimal 1s dead-interval with fast sub-second hellos\n"
7370 "Hello multiplier factor\n"
7371 "Number of Hellos to send each second\n"
7372 "Address of interface\n")
7374 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7375 int idx_ipv4
= argc
- 1;
7376 struct in_addr addr
= {.s_addr
= 0L};
7378 struct ospf_if_params
*params
;
7379 struct ospf_interface
*oi
;
7380 struct route_node
*rn
;
7382 params
= IF_DEF_PARAMS(ifp
);
7384 if (argv
[idx_ipv4
]->type
== IPV4_TKN
) {
7385 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
7388 "Please specify interface address by A.B.C.D\n");
7389 return CMD_WARNING_CONFIG_FAILED
;
7392 params
= ospf_lookup_if_params(ifp
, addr
);
7397 UNSET_IF_PARAM(params
, v_wait
);
7398 params
->v_wait
= OSPF_ROUTER_DEAD_INTERVAL_DEFAULT
;
7400 UNSET_IF_PARAM(params
, fast_hello
);
7401 params
->fast_hello
= OSPF_FAST_HELLO_DEFAULT
;
7403 if (params
!= IF_DEF_PARAMS(ifp
)) {
7404 ospf_free_if_params(ifp
, addr
);
7405 ospf_if_update_params(ifp
, addr
);
7408 /* Update timer values in neighbor structure. */
7410 struct ospf
*ospf
= NULL
;
7412 ospf
= ospf_lookup_by_vrf_id(ifp
->vrf_id
);
7414 oi
= ospf_if_lookup_by_local_addr(ospf
, ifp
, addr
);
7416 ospf_nbr_timer_update(oi
);
7419 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
))
7420 if ((oi
= rn
->info
))
7421 ospf_nbr_timer_update(oi
);
7427 DEFUN_HIDDEN (no_ospf_dead_interval
,
7428 no_ospf_dead_interval_cmd
,
7429 "no ospf dead-interval [<(1-65535)|minimal hello-multiplier (1-10)> [A.B.C.D]]",
7431 "OSPF interface commands\n"
7432 "Interval time after which a neighbor is declared down\n"
7434 "Minimal 1s dead-interval with fast sub-second hellos\n"
7435 "Hello multiplier factor\n"
7436 "Number of Hellos to send each second\n"
7437 "Address of interface\n")
7439 return no_ip_ospf_dead_interval(self
, vty
, argc
, argv
);
7442 DEFUN (ip_ospf_hello_interval
,
7443 ip_ospf_hello_interval_cmd
,
7444 "ip ospf hello-interval (1-65535) [A.B.C.D]",
7446 "OSPF interface commands\n"
7447 "Time between HELLO packets\n"
7449 "Address of interface\n")
7451 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7453 struct in_addr addr
;
7454 struct ospf_if_params
*params
;
7455 params
= IF_DEF_PARAMS(ifp
);
7456 uint32_t seconds
= 0;
7458 argv_find(argv
, argc
, "(1-65535)", &idx
);
7459 seconds
= strtol(argv
[idx
]->arg
, NULL
, 10);
7461 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7462 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7464 "Please specify interface address by A.B.C.D\n");
7465 return CMD_WARNING_CONFIG_FAILED
;
7468 params
= ospf_get_if_params(ifp
, addr
);
7469 ospf_if_update_params(ifp
, addr
);
7472 SET_IF_PARAM(params
, v_hello
);
7473 params
->v_hello
= seconds
;
7478 DEFUN_HIDDEN (ospf_hello_interval
,
7479 ospf_hello_interval_cmd
,
7480 "ospf hello-interval (1-65535) [A.B.C.D]",
7481 "OSPF interface commands\n"
7482 "Time between HELLO packets\n"
7484 "Address of interface\n")
7486 return ip_ospf_hello_interval(self
, vty
, argc
, argv
);
7489 DEFUN (no_ip_ospf_hello_interval
,
7490 no_ip_ospf_hello_interval_cmd
,
7491 "no ip ospf hello-interval [(1-65535) [A.B.C.D]]",
7494 "OSPF interface commands\n"
7495 "Time between HELLO packets\n" // ignored
7497 "Address of interface\n")
7499 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7501 struct in_addr addr
;
7502 struct ospf_if_params
*params
;
7504 params
= IF_DEF_PARAMS(ifp
);
7506 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7507 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7509 "Please specify interface address by A.B.C.D\n");
7510 return CMD_WARNING_CONFIG_FAILED
;
7513 params
= ospf_lookup_if_params(ifp
, addr
);
7518 UNSET_IF_PARAM(params
, v_hello
);
7519 params
->v_hello
= OSPF_HELLO_INTERVAL_DEFAULT
;
7521 if (params
!= IF_DEF_PARAMS(ifp
)) {
7522 ospf_free_if_params(ifp
, addr
);
7523 ospf_if_update_params(ifp
, addr
);
7529 DEFUN_HIDDEN (no_ospf_hello_interval
,
7530 no_ospf_hello_interval_cmd
,
7531 "no ospf hello-interval [(1-65535) [A.B.C.D]]",
7533 "OSPF interface commands\n"
7534 "Time between HELLO packets\n" // ignored
7536 "Address of interface\n")
7538 return no_ip_ospf_hello_interval(self
, vty
, argc
, argv
);
7541 DEFUN (ip_ospf_network
,
7542 ip_ospf_network_cmd
,
7543 "ip ospf network <broadcast|non-broadcast|point-to-multipoint|point-to-point>",
7545 "OSPF interface commands\n"
7547 "Specify OSPF broadcast multi-access network\n"
7548 "Specify OSPF NBMA network\n"
7549 "Specify OSPF point-to-multipoint network\n"
7550 "Specify OSPF point-to-point network\n")
7552 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7554 int old_type
= IF_DEF_PARAMS(ifp
)->type
;
7555 struct route_node
*rn
;
7557 if (old_type
== OSPF_IFTYPE_LOOPBACK
) {
7559 "This is a loopback interface. Can't set network type.\n");
7560 return CMD_WARNING_CONFIG_FAILED
;
7563 if (argv_find(argv
, argc
, "broadcast", &idx
))
7564 IF_DEF_PARAMS(ifp
)->type
= OSPF_IFTYPE_BROADCAST
;
7565 else if (argv_find(argv
, argc
, "non-broadcast", &idx
))
7566 IF_DEF_PARAMS(ifp
)->type
= OSPF_IFTYPE_NBMA
;
7567 else if (argv_find(argv
, argc
, "point-to-multipoint", &idx
))
7568 IF_DEF_PARAMS(ifp
)->type
= OSPF_IFTYPE_POINTOMULTIPOINT
;
7569 else if (argv_find(argv
, argc
, "point-to-point", &idx
))
7570 IF_DEF_PARAMS(ifp
)->type
= OSPF_IFTYPE_POINTOPOINT
;
7572 if (IF_DEF_PARAMS(ifp
)->type
== old_type
)
7575 SET_IF_PARAM(IF_DEF_PARAMS(ifp
), type
);
7577 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
7578 struct ospf_interface
*oi
= rn
->info
;
7583 oi
->type
= IF_DEF_PARAMS(ifp
)->type
;
7585 if (oi
->state
> ISM_Down
) {
7586 OSPF_ISM_EVENT_EXECUTE(oi
, ISM_InterfaceDown
);
7587 OSPF_ISM_EVENT_EXECUTE(oi
, ISM_InterfaceUp
);
7594 DEFUN_HIDDEN (ospf_network
,
7596 "ospf network <broadcast|non-broadcast|point-to-multipoint|point-to-point>",
7597 "OSPF interface commands\n"
7599 "Specify OSPF broadcast multi-access network\n"
7600 "Specify OSPF NBMA network\n"
7601 "Specify OSPF point-to-multipoint network\n"
7602 "Specify OSPF point-to-point network\n")
7604 return ip_ospf_network(self
, vty
, argc
, argv
);
7607 DEFUN (no_ip_ospf_network
,
7608 no_ip_ospf_network_cmd
,
7609 "no ip ospf network [<broadcast|non-broadcast|point-to-multipoint|point-to-point>]",
7612 "OSPF interface commands\n"
7614 "Specify OSPF broadcast multi-access network\n"
7615 "Specify OSPF NBMA network\n"
7616 "Specify OSPF point-to-multipoint network\n"
7617 "Specify OSPF point-to-point network\n")
7619 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7620 int old_type
= IF_DEF_PARAMS(ifp
)->type
;
7621 struct route_node
*rn
;
7623 IF_DEF_PARAMS(ifp
)->type
= ospf_default_iftype(ifp
);
7625 if (IF_DEF_PARAMS(ifp
)->type
== old_type
)
7628 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
7629 struct ospf_interface
*oi
= rn
->info
;
7634 oi
->type
= IF_DEF_PARAMS(ifp
)->type
;
7636 if (oi
->state
> ISM_Down
) {
7637 OSPF_ISM_EVENT_EXECUTE(oi
, ISM_InterfaceDown
);
7638 OSPF_ISM_EVENT_EXECUTE(oi
, ISM_InterfaceUp
);
7645 DEFUN_HIDDEN (no_ospf_network
,
7646 no_ospf_network_cmd
,
7647 "no ospf network [<broadcast|non-broadcast|point-to-multipoint|point-to-point>]",
7649 "OSPF interface commands\n"
7651 "Specify OSPF broadcast multi-access network\n"
7652 "Specify OSPF NBMA network\n"
7653 "Specify OSPF point-to-multipoint network\n"
7654 "Specify OSPF point-to-point network\n")
7656 return no_ip_ospf_network(self
, vty
, argc
, argv
);
7659 DEFUN (ip_ospf_priority
,
7660 ip_ospf_priority_cmd
,
7661 "ip ospf priority (0-255) [A.B.C.D]",
7663 "OSPF interface commands\n"
7666 "Address of interface\n")
7668 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7671 struct route_node
*rn
;
7672 struct in_addr addr
;
7673 struct ospf_if_params
*params
;
7674 params
= IF_DEF_PARAMS(ifp
);
7676 argv_find(argv
, argc
, "(0-255)", &idx
);
7677 priority
= strtol(argv
[idx
]->arg
, NULL
, 10);
7679 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7680 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7682 "Please specify interface address by A.B.C.D\n");
7683 return CMD_WARNING_CONFIG_FAILED
;
7686 params
= ospf_get_if_params(ifp
, addr
);
7687 ospf_if_update_params(ifp
, addr
);
7690 SET_IF_PARAM(params
, priority
);
7691 params
->priority
= priority
;
7693 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
7694 struct ospf_interface
*oi
= rn
->info
;
7699 if (PRIORITY(oi
) != OSPF_IF_PARAM(oi
, priority
)) {
7700 PRIORITY(oi
) = OSPF_IF_PARAM(oi
, priority
);
7701 OSPF_ISM_EVENT_SCHEDULE(oi
, ISM_NeighborChange
);
7708 DEFUN_HIDDEN (ospf_priority
,
7710 "ospf priority (0-255) [A.B.C.D]",
7711 "OSPF interface commands\n"
7714 "Address of interface\n")
7716 return ip_ospf_priority(self
, vty
, argc
, argv
);
7719 DEFUN (no_ip_ospf_priority
,
7720 no_ip_ospf_priority_cmd
,
7721 "no ip ospf priority [(0-255) [A.B.C.D]]",
7724 "OSPF interface commands\n"
7725 "Router priority\n" // ignored
7727 "Address of interface\n")
7729 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7731 struct route_node
*rn
;
7732 struct in_addr addr
;
7733 struct ospf_if_params
*params
;
7735 params
= IF_DEF_PARAMS(ifp
);
7737 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7738 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7740 "Please specify interface address by A.B.C.D\n");
7741 return CMD_WARNING_CONFIG_FAILED
;
7744 params
= ospf_lookup_if_params(ifp
, addr
);
7749 UNSET_IF_PARAM(params
, priority
);
7750 params
->priority
= OSPF_ROUTER_PRIORITY_DEFAULT
;
7752 if (params
!= IF_DEF_PARAMS(ifp
)) {
7753 ospf_free_if_params(ifp
, addr
);
7754 ospf_if_update_params(ifp
, addr
);
7757 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
7758 struct ospf_interface
*oi
= rn
->info
;
7763 if (PRIORITY(oi
) != OSPF_IF_PARAM(oi
, priority
)) {
7764 PRIORITY(oi
) = OSPF_IF_PARAM(oi
, priority
);
7765 OSPF_ISM_EVENT_SCHEDULE(oi
, ISM_NeighborChange
);
7772 DEFUN_HIDDEN (no_ospf_priority
,
7773 no_ospf_priority_cmd
,
7774 "no ospf priority [(0-255) [A.B.C.D]]",
7776 "OSPF interface commands\n"
7779 "Address of interface\n")
7781 return no_ip_ospf_priority(self
, vty
, argc
, argv
);
7784 DEFUN (ip_ospf_retransmit_interval
,
7785 ip_ospf_retransmit_interval_addr_cmd
,
7786 "ip ospf retransmit-interval (3-65535) [A.B.C.D]",
7788 "OSPF interface commands\n"
7789 "Time between retransmitting lost link state advertisements\n"
7791 "Address of interface\n")
7793 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7796 struct in_addr addr
;
7797 struct ospf_if_params
*params
;
7798 params
= IF_DEF_PARAMS(ifp
);
7800 argv_find(argv
, argc
, "(3-65535)", &idx
);
7801 seconds
= strtol(argv
[idx
]->arg
, NULL
, 10);
7803 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7804 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7806 "Please specify interface address by A.B.C.D\n");
7807 return CMD_WARNING_CONFIG_FAILED
;
7810 params
= ospf_get_if_params(ifp
, addr
);
7811 ospf_if_update_params(ifp
, addr
);
7814 SET_IF_PARAM(params
, retransmit_interval
);
7815 params
->retransmit_interval
= seconds
;
7820 DEFUN_HIDDEN (ospf_retransmit_interval
,
7821 ospf_retransmit_interval_cmd
,
7822 "ospf retransmit-interval (3-65535) [A.B.C.D]",
7823 "OSPF interface commands\n"
7824 "Time between retransmitting lost link state advertisements\n"
7826 "Address of interface\n")
7828 return ip_ospf_retransmit_interval(self
, vty
, argc
, argv
);
7831 DEFUN (no_ip_ospf_retransmit_interval
,
7832 no_ip_ospf_retransmit_interval_addr_cmd
,
7833 "no ip 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 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7843 struct in_addr addr
;
7844 struct ospf_if_params
*params
;
7846 params
= IF_DEF_PARAMS(ifp
);
7848 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7849 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7851 "Please specify interface address by A.B.C.D\n");
7852 return CMD_WARNING_CONFIG_FAILED
;
7855 params
= ospf_lookup_if_params(ifp
, addr
);
7860 UNSET_IF_PARAM(params
, retransmit_interval
);
7861 params
->retransmit_interval
= OSPF_RETRANSMIT_INTERVAL_DEFAULT
;
7863 if (params
!= IF_DEF_PARAMS(ifp
)) {
7864 ospf_free_if_params(ifp
, addr
);
7865 ospf_if_update_params(ifp
, addr
);
7871 DEFUN_HIDDEN (no_ospf_retransmit_interval
,
7872 no_ospf_retransmit_interval_cmd
,
7873 "no ospf retransmit-interval [(3-65535)] [A.B.C.D]",
7875 "OSPF interface commands\n"
7876 "Time between retransmitting lost link state advertisements\n"
7878 "Address of interface\n")
7880 return no_ip_ospf_retransmit_interval(self
, vty
, argc
, argv
);
7883 DEFUN (ip_ospf_transmit_delay
,
7884 ip_ospf_transmit_delay_addr_cmd
,
7885 "ip ospf transmit-delay (1-65535) [A.B.C.D]",
7887 "OSPF interface commands\n"
7888 "Link state transmit delay\n"
7890 "Address of interface\n")
7892 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7895 struct in_addr addr
;
7896 struct ospf_if_params
*params
;
7898 params
= IF_DEF_PARAMS(ifp
);
7899 argv_find(argv
, argc
, "(1-65535)", &idx
);
7900 seconds
= strtol(argv
[idx
]->arg
, NULL
, 10);
7902 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7903 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7905 "Please specify interface address by A.B.C.D\n");
7906 return CMD_WARNING_CONFIG_FAILED
;
7909 params
= ospf_get_if_params(ifp
, addr
);
7910 ospf_if_update_params(ifp
, addr
);
7913 SET_IF_PARAM(params
, transmit_delay
);
7914 params
->transmit_delay
= seconds
;
7919 DEFUN_HIDDEN (ospf_transmit_delay
,
7920 ospf_transmit_delay_cmd
,
7921 "ospf transmit-delay (1-65535) [A.B.C.D]",
7922 "OSPF interface commands\n"
7923 "Link state transmit delay\n"
7925 "Address of interface\n")
7927 return ip_ospf_transmit_delay(self
, vty
, argc
, argv
);
7930 DEFUN (no_ip_ospf_transmit_delay
,
7931 no_ip_ospf_transmit_delay_addr_cmd
,
7932 "no ip 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 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7942 struct in_addr addr
;
7943 struct ospf_if_params
*params
;
7945 params
= IF_DEF_PARAMS(ifp
);
7947 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7948 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7950 "Please specify interface address by A.B.C.D\n");
7951 return CMD_WARNING_CONFIG_FAILED
;
7954 params
= ospf_lookup_if_params(ifp
, addr
);
7959 UNSET_IF_PARAM(params
, transmit_delay
);
7960 params
->transmit_delay
= OSPF_TRANSMIT_DELAY_DEFAULT
;
7962 if (params
!= IF_DEF_PARAMS(ifp
)) {
7963 ospf_free_if_params(ifp
, addr
);
7964 ospf_if_update_params(ifp
, addr
);
7971 DEFUN_HIDDEN (no_ospf_transmit_delay
,
7972 no_ospf_transmit_delay_cmd
,
7973 "no ospf transmit-delay [(1-65535) [A.B.C.D]]",
7975 "OSPF interface commands\n"
7976 "Link state transmit delay\n"
7978 "Address of interface\n")
7980 return no_ip_ospf_transmit_delay(self
, vty
, argc
, argv
);
7983 DEFUN (ip_ospf_area
,
7985 "ip ospf [(1-65535)] area <A.B.C.D|(0-4294967295)> [A.B.C.D]",
7987 "OSPF interface commands\n"
7989 "Enable OSPF on this interface\n"
7990 "OSPF area ID in IP address format\n"
7991 "OSPF area ID as a decimal value\n"
7992 "Address of interface\n")
7994 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7997 struct in_addr area_id
;
7998 struct in_addr addr
;
7999 struct ospf_if_params
*params
= NULL
;
8000 struct route_node
*rn
;
8001 struct ospf
*ospf
= NULL
;
8002 unsigned short instance
= 0;
8005 if (argv_find(argv
, argc
, "(1-65535)", &idx
))
8006 instance
= strtol(argv
[idx
]->arg
, NULL
, 10);
8008 argv_find(argv
, argc
, "area", &idx
);
8009 areaid
= argv
[idx
+ 1]->arg
;
8011 if (ifp
->vrf_id
&& !instance
)
8012 ospf
= ospf_lookup_by_vrf_id(ifp
->vrf_id
);
8014 ospf
= ospf_lookup_instance(instance
);
8016 if (instance
&& ospf
== NULL
) {
8017 params
= IF_DEF_PARAMS(ifp
);
8018 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
)) {
8019 UNSET_IF_PARAM(params
, if_area
);
8020 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
8021 ospf_interface_area_unset(ospf
, ifp
);
8022 ospf
->if_ospf_cli_count
--;
8024 return CMD_NOT_MY_INSTANCE
;
8027 ret
= str2area_id(areaid
, &area_id
, &format
);
8029 vty_out(vty
, "Please specify area by A.B.C.D|<0-4294967295>\n");
8030 return CMD_WARNING_CONFIG_FAILED
;
8032 if (memcmp(ifp
->name
, "VLINK", 5) == 0) {
8033 vty_out(vty
, "Cannot enable OSPF on a virtual link.\n");
8034 return CMD_WARNING_CONFIG_FAILED
;
8037 params
= IF_DEF_PARAMS(ifp
);
8038 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
)
8039 && !IPV4_ADDR_SAME(¶ms
->if_area
, &area_id
)) {
8041 "Must remove previous area config before changing ospf area \n");
8042 return CMD_WARNING_CONFIG_FAILED
;
8045 // Check if we have an address arg and proccess it
8046 if (argc
== idx
+ 3) {
8047 if (!inet_aton(argv
[idx
+ 2]->arg
, &addr
)) {
8049 "Please specify Intf Address by A.B.C.D\n");
8050 return CMD_WARNING_CONFIG_FAILED
;
8052 // update/create address-level params
8053 params
= ospf_get_if_params((ifp
), (addr
));
8054 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
)) {
8056 "Must remove previous area/address config before changing ospf area");
8057 return CMD_WARNING_CONFIG_FAILED
;
8059 ospf_if_update_params((ifp
), (addr
));
8063 for (rn
= route_top(ospf
->networks
); rn
; rn
= route_next(rn
)) {
8064 if (rn
->info
!= NULL
) {
8066 "Please remove all network commands first.\n");
8067 return CMD_WARNING_CONFIG_FAILED
;
8072 /* enable ospf on this interface with area_id */
8074 SET_IF_PARAM(params
, if_area
);
8075 params
->if_area
= area_id
;
8076 params
->if_area_id_fmt
= format
;
8080 ospf_interface_area_set(ospf
, ifp
);
8081 ospf
->if_ospf_cli_count
++;
8087 DEFUN (no_ip_ospf_area
,
8088 no_ip_ospf_area_cmd
,
8089 "no ip ospf [(1-65535)] area [<A.B.C.D|(0-4294967295)> [A.B.C.D]]",
8092 "OSPF interface commands\n"
8094 "Disable OSPF on this interface\n"
8095 "OSPF area ID in IP address format\n"
8096 "OSPF area ID as a decimal value\n"
8097 "Address of interface\n")
8099 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8102 struct ospf_if_params
*params
;
8103 unsigned short instance
= 0;
8104 struct in_addr addr
;
8106 if (argv_find(argv
, argc
, "(1-65535)", &idx
))
8107 instance
= strtol(argv
[idx
]->arg
, NULL
, 10);
8109 if (ifp
->vrf_id
&& !instance
)
8110 ospf
= ospf_lookup_by_vrf_id(ifp
->vrf_id
);
8112 ospf
= ospf_lookup_instance(instance
);
8115 return CMD_NOT_MY_INSTANCE
;
8117 argv_find(argv
, argc
, "area", &idx
);
8119 // Check if we have an address arg and proccess it
8120 if (argc
== idx
+ 3) {
8121 if (!inet_aton(argv
[idx
+ 2]->arg
, &addr
)) {
8123 "Please specify Intf Address by A.B.C.D\n");
8124 return CMD_WARNING_CONFIG_FAILED
;
8126 params
= ospf_lookup_if_params(ifp
, addr
);
8127 if ((params
) == NULL
)
8130 params
= IF_DEF_PARAMS(ifp
);
8132 if (!OSPF_IF_PARAM_CONFIGURED(params
, if_area
)) {
8134 "Can't find specified interface area configuration.\n");
8135 return CMD_WARNING_CONFIG_FAILED
;
8138 UNSET_IF_PARAM(params
, if_area
);
8139 if (params
!= IF_DEF_PARAMS((ifp
))) {
8140 ospf_free_if_params((ifp
), (addr
));
8141 ospf_if_update_params((ifp
), (addr
));
8144 ospf_interface_area_unset(ospf
, ifp
);
8145 ospf
->if_ospf_cli_count
--;
8149 DEFUN (ospf_redistribute_source
,
8150 ospf_redistribute_source_cmd
,
8151 "redistribute " FRR_REDIST_STR_OSPFD
" [{metric (0-16777214)|metric-type (1-2)|route-map WORD}]",
8153 FRR_REDIST_HELP_STR_OSPFD
8154 "Metric for redistributed routes\n"
8155 "OSPF default metric\n"
8156 "OSPF exterior metric type for redistributed routes\n"
8157 "Set OSPF External Type 1/2 metrics\n"
8158 "Route map reference\n"
8159 "Pointer to route-map entries\n")
8161 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8162 int idx_protocol
= 1;
8166 struct ospf_redist
*red
;
8169 /* Get distribute source. */
8170 source
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
8172 return CMD_WARNING_CONFIG_FAILED
;
8174 red
= ospf_redist_add(ospf
, source
, 0);
8176 /* Get metric value. */
8177 if (argv_find(argv
, argc
, "(0-16777214)", &idx
)) {
8178 if (!str2metric(argv
[idx
]->arg
, &metric
))
8179 return CMD_WARNING_CONFIG_FAILED
;
8182 /* Get metric type. */
8183 if (argv_find(argv
, argc
, "(1-2)", &idx
)) {
8184 if (!str2metric_type(argv
[idx
]->arg
, &type
))
8185 return CMD_WARNING_CONFIG_FAILED
;
8189 if (argv_find(argv
, argc
, "WORD", &idx
)) {
8190 ospf_routemap_set(red
, argv
[idx
]->arg
);
8192 ospf_routemap_unset(red
);
8194 return ospf_redistribute_set(ospf
, source
, 0, type
, metric
);
8197 DEFUN (no_ospf_redistribute_source
,
8198 no_ospf_redistribute_source_cmd
,
8199 "no redistribute " FRR_REDIST_STR_OSPFD
" [{metric (0-16777214)|metric-type (1-2)|route-map WORD}]",
8202 FRR_REDIST_HELP_STR_OSPFD
8203 "Metric for redistributed routes\n"
8204 "OSPF default metric\n"
8205 "OSPF exterior metric type for redistributed routes\n"
8206 "Set OSPF External Type 1/2 metrics\n"
8207 "Route map reference\n"
8208 "Pointer to route-map entries\n")
8210 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8211 int idx_protocol
= 2;
8213 struct ospf_redist
*red
;
8215 source
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
8217 return CMD_WARNING_CONFIG_FAILED
;
8219 red
= ospf_redist_lookup(ospf
, source
, 0);
8223 ospf_routemap_unset(red
);
8224 ospf_redist_del(ospf
, source
, 0);
8226 return ospf_redistribute_unset(ospf
, source
, 0);
8229 DEFUN (ospf_redistribute_instance_source
,
8230 ospf_redistribute_instance_source_cmd
,
8231 "redistribute <ospf|table> (1-65535) [{metric (0-16777214)|metric-type (1-2)|route-map WORD}]",
8233 "Open Shortest Path First\n"
8234 "Non-main Kernel Routing Table\n"
8235 "Instance ID/Table ID\n"
8236 "Metric for redistributed routes\n"
8237 "OSPF default metric\n"
8238 "OSPF exterior metric type for redistributed routes\n"
8239 "Set OSPF External Type 1/2 metrics\n"
8240 "Route map reference\n"
8241 "Pointer to route-map entries\n")
8243 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8244 int idx_ospf_table
= 1;
8250 unsigned short instance
;
8251 struct ospf_redist
*red
;
8253 source
= proto_redistnum(AFI_IP
, argv
[idx_ospf_table
]->text
);
8256 vty_out(vty
, "Unknown instance redistribution\n");
8257 return CMD_WARNING_CONFIG_FAILED
;
8260 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
8262 if ((source
== ZEBRA_ROUTE_OSPF
) && !ospf
->instance
) {
8264 "Instance redistribution in non-instanced OSPF not allowed\n");
8265 return CMD_WARNING_CONFIG_FAILED
;
8268 if ((source
== ZEBRA_ROUTE_OSPF
) && (ospf
->instance
== instance
)) {
8269 vty_out(vty
, "Same instance OSPF redistribution not allowed\n");
8270 return CMD_WARNING_CONFIG_FAILED
;
8273 /* Get metric value. */
8274 if (argv_find(argv
, argc
, "metric", &idx
))
8275 if (!str2metric(argv
[idx
+ 1]->arg
, &metric
))
8276 return CMD_WARNING_CONFIG_FAILED
;
8279 /* Get metric type. */
8280 if (argv_find(argv
, argc
, "metric-type", &idx
))
8281 if (!str2metric_type(argv
[idx
+ 1]->arg
, &type
))
8282 return CMD_WARNING_CONFIG_FAILED
;
8284 red
= ospf_redist_add(ospf
, source
, instance
);
8287 if (argv_find(argv
, argc
, "route-map", &idx
))
8288 ospf_routemap_set(red
, argv
[idx
+ 1]->arg
);
8290 ospf_routemap_unset(red
);
8292 return ospf_redistribute_set(ospf
, source
, instance
, type
, metric
);
8295 DEFUN (no_ospf_redistribute_instance_source
,
8296 no_ospf_redistribute_instance_source_cmd
,
8297 "no redistribute <ospf|table> (1-65535) [{metric (0-16777214)|metric-type (1-2)|route-map WORD}]",
8300 "Open Shortest Path First\n"
8301 "Non-main Kernel Routing Table\n"
8302 "Instance ID/Table Id\n"
8303 "Metric for redistributed routes\n"
8304 "OSPF default metric\n"
8305 "OSPF exterior metric type for redistributed routes\n"
8306 "Set OSPF External Type 1/2 metrics\n"
8307 "Route map reference\n"
8308 "Pointer to route-map entries\n")
8310 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8311 int idx_ospf_table
= 2;
8313 unsigned int instance
;
8314 struct ospf_redist
*red
;
8317 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
8318 source
= ZEBRA_ROUTE_OSPF
;
8320 source
= ZEBRA_ROUTE_TABLE
;
8322 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
8324 if ((source
== ZEBRA_ROUTE_OSPF
) && !ospf
->instance
) {
8326 "Instance redistribution in non-instanced OSPF not allowed\n");
8327 return CMD_WARNING_CONFIG_FAILED
;
8330 if ((source
== ZEBRA_ROUTE_OSPF
) && (ospf
->instance
== instance
)) {
8331 vty_out(vty
, "Same instance OSPF redistribution not allowed\n");
8332 return CMD_WARNING_CONFIG_FAILED
;
8335 red
= ospf_redist_lookup(ospf
, source
, instance
);
8339 ospf_routemap_unset(red
);
8340 ospf_redist_del(ospf
, source
, instance
);
8342 return ospf_redistribute_unset(ospf
, source
, instance
);
8345 DEFUN (ospf_distribute_list_out
,
8346 ospf_distribute_list_out_cmd
,
8347 "distribute-list WORD out " FRR_REDIST_STR_OSPFD
,
8348 "Filter networks in routing updates\n"
8349 "Access-list name\n"
8351 FRR_REDIST_HELP_STR_OSPFD
)
8353 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8357 char *proto
= argv
[argc
- 1]->text
;
8359 /* Get distribute source. */
8360 source
= proto_redistnum(AFI_IP
, proto
);
8362 return CMD_WARNING_CONFIG_FAILED
;
8364 return ospf_distribute_list_out_set(ospf
, source
, argv
[idx_word
]->arg
);
8367 DEFUN (no_ospf_distribute_list_out
,
8368 no_ospf_distribute_list_out_cmd
,
8369 "no distribute-list WORD out " FRR_REDIST_STR_OSPFD
,
8371 "Filter networks in routing updates\n"
8372 "Access-list name\n"
8374 FRR_REDIST_HELP_STR_OSPFD
)
8376 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8380 char *proto
= argv
[argc
- 1]->text
;
8381 source
= proto_redistnum(AFI_IP
, proto
);
8383 return CMD_WARNING_CONFIG_FAILED
;
8385 return ospf_distribute_list_out_unset(ospf
, source
,
8386 argv
[idx_word
]->arg
);
8389 /* Default information originate. */
8390 DEFUN (ospf_default_information_originate
,
8391 ospf_default_information_originate_cmd
,
8392 "default-information originate [{always|metric (0-16777214)|metric-type (1-2)|route-map WORD}]",
8393 "Control distribution of default information\n"
8394 "Distribute a default route\n"
8395 "Always advertise default route\n"
8396 "OSPF default metric\n"
8398 "OSPF metric type for default routes\n"
8399 "Set OSPF External Type 1/2 metrics\n"
8400 "Route map reference\n"
8401 "Pointer to route-map entries\n")
8403 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8404 int default_originate
= DEFAULT_ORIGINATE_ZEBRA
;
8407 struct ospf_redist
*red
;
8409 int cur_originate
= ospf
->default_originate
;
8413 red
= ospf_redist_add(ospf
, DEFAULT_ROUTE
, 0);
8415 /* Check whether "always" was specified */
8416 if (argv_find(argv
, argc
, "always", &idx
))
8417 default_originate
= DEFAULT_ORIGINATE_ALWAYS
;
8419 /* Get metric value */
8420 if (argv_find(argv
, argc
, "(0-16777214)", &idx
)) {
8421 if (!str2metric(argv
[idx
]->arg
, &metric
))
8422 return CMD_WARNING_CONFIG_FAILED
;
8425 /* Get metric type. */
8426 if (argv_find(argv
, argc
, "(1-2)", &idx
)) {
8427 if (!str2metric_type(argv
[idx
]->arg
, &type
))
8428 return CMD_WARNING_CONFIG_FAILED
;
8432 if (argv_find(argv
, argc
, "WORD", &idx
))
8433 rtmap
= argv
[idx
]->arg
;
8435 /* To check ,if user is providing same route map */
8436 if ((rtmap
== ROUTEMAP_NAME(red
)) ||
8437 (rtmap
&& ROUTEMAP_NAME(red
)
8438 && (strcmp(rtmap
, ROUTEMAP_NAME(red
)) == 0)))
8441 /* Don't allow if the same lsa is aleardy originated. */
8443 && (red
->dmetric
.type
== type
)
8444 && (red
->dmetric
.value
== metric
)
8445 && (cur_originate
== default_originate
))
8448 /* Updating Metric details */
8449 red
->dmetric
.type
= type
;
8450 red
->dmetric
.value
= metric
;
8452 /* updating route map details */
8454 ospf_routemap_set(red
, rtmap
);
8456 ospf_routemap_unset(red
);
8458 return ospf_redistribute_default_set(ospf
, default_originate
, type
,
8462 DEFUN (no_ospf_default_information_originate
,
8463 no_ospf_default_information_originate_cmd
,
8464 "no default-information originate [{always|metric (0-16777214)|metric-type (1-2)|route-map WORD}]",
8466 "Control distribution of default information\n"
8467 "Distribute a default route\n"
8468 "Always advertise default route\n"
8469 "OSPF default metric\n"
8471 "OSPF metric type for default routes\n"
8472 "Set OSPF External Type 1/2 metrics\n"
8473 "Route map reference\n"
8474 "Pointer to route-map entries\n")
8476 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8477 struct prefix_ipv4 p
;
8478 struct ospf_external
*ext
;
8479 struct ospf_redist
*red
;
8482 p
.prefix
.s_addr
= 0;
8485 ospf_external_lsa_flush(ospf
, DEFAULT_ROUTE
, &p
, 0);
8487 ext
= ospf_external_lookup(ospf
, DEFAULT_ROUTE
, 0);
8488 if (ext
&& EXTERNAL_INFO(ext
)) {
8489 ospf_external_info_delete(ospf
, DEFAULT_ROUTE
, 0, p
);
8490 ospf_external_del(ospf
, DEFAULT_ROUTE
, 0);
8493 red
= ospf_redist_lookup(ospf
, DEFAULT_ROUTE
, 0);
8497 ospf_routemap_unset(red
);
8498 ospf_redist_del(ospf
, DEFAULT_ROUTE
, 0);
8500 return ospf_redistribute_default_unset(ospf
);
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 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 const char *ospf_abr_type_str
[] = {"unknown", "standard", "ibm", "cisco",
9712 const char *ospf_shortcut_mode_str
[] = {"default", "enable", "disable"};
9714 const char *ospf_int_type_str
[] = {"unknown", /* should never be used. */
9715 "point-to-point", "broadcast",
9716 "non-broadcast", "point-to-multipoint",
9717 "virtual-link", /* should never be used. */
9720 static int config_write_interface_one(struct vty
*vty
, struct vrf
*vrf
)
9722 struct listnode
*node
;
9723 struct interface
*ifp
;
9724 struct crypt_key
*ck
;
9725 struct route_node
*rn
= NULL
;
9726 struct ospf_if_params
*params
;
9728 struct ospf
*ospf
= vrf
->info
;
9730 FOR_ALL_INTERFACES (vrf
, ifp
) {
9732 if (memcmp(ifp
->name
, "VLINK", 5) == 0)
9735 vty_frame(vty
, "!\n");
9736 if (ifp
->vrf_id
== VRF_DEFAULT
)
9737 vty_frame(vty
, "interface %s\n", ifp
->name
);
9739 vty_frame(vty
, "interface %s vrf %s\n", ifp
->name
,
9742 vty_out(vty
, " description %s\n", ifp
->desc
);
9746 params
= IF_DEF_PARAMS(ifp
);
9749 /* Interface Network print. */
9750 if (OSPF_IF_PARAM_CONFIGURED(params
, type
)
9751 && params
->type
!= OSPF_IFTYPE_LOOPBACK
) {
9752 if (params
->type
!= ospf_default_iftype(ifp
)) {
9753 vty_out(vty
, " ip ospf network %s",
9756 if (params
!= IF_DEF_PARAMS(ifp
))
9764 /* OSPF interface authentication print */
9765 if (OSPF_IF_PARAM_CONFIGURED(params
, auth_type
)
9766 && params
->auth_type
!= OSPF_AUTH_NOTSET
) {
9767 const char *auth_str
;
9769 /* Translation tables are not that much help
9770 * here due to syntax
9771 * of the simple option */
9772 switch (params
->auth_type
) {
9774 case OSPF_AUTH_NULL
:
9778 case OSPF_AUTH_SIMPLE
:
9782 case OSPF_AUTH_CRYPTOGRAPHIC
:
9783 auth_str
= " message-digest";
9791 vty_out(vty
, " ip ospf authentication%s",
9793 if (params
!= IF_DEF_PARAMS(ifp
))
9795 inet_ntoa(rn
->p
.u
.prefix4
));
9799 /* Simple Authentication Password print. */
9800 if (OSPF_IF_PARAM_CONFIGURED(params
, auth_simple
)
9801 && params
->auth_simple
[0] != '\0') {
9802 vty_out(vty
, " ip ospf authentication-key %s",
9803 params
->auth_simple
);
9804 if (params
!= IF_DEF_PARAMS(ifp
))
9806 inet_ntoa(rn
->p
.u
.prefix4
));
9810 /* Cryptographic Authentication Key print. */
9811 if (params
&& params
->auth_crypt
) {
9812 for (ALL_LIST_ELEMENTS_RO(params
->auth_crypt
,
9815 " ip ospf message-digest-key %d md5 %s",
9816 ck
->key_id
, ck
->auth_key
);
9817 if (params
!= IF_DEF_PARAMS(ifp
))
9825 /* Interface Output Cost print. */
9826 if (OSPF_IF_PARAM_CONFIGURED(params
, output_cost_cmd
)) {
9827 vty_out(vty
, " ip ospf cost %u",
9828 params
->output_cost_cmd
);
9829 if (params
!= IF_DEF_PARAMS(ifp
))
9831 inet_ntoa(rn
->p
.u
.prefix4
));
9835 /* Hello Interval print. */
9836 if (OSPF_IF_PARAM_CONFIGURED(params
, v_hello
)
9837 && params
->v_hello
!= OSPF_HELLO_INTERVAL_DEFAULT
) {
9838 vty_out(vty
, " ip ospf hello-interval %u",
9840 if (params
!= IF_DEF_PARAMS(ifp
))
9842 inet_ntoa(rn
->p
.u
.prefix4
));
9847 /* Router Dead Interval print. */
9848 if (OSPF_IF_PARAM_CONFIGURED(params
, v_wait
)
9850 != OSPF_ROUTER_DEAD_INTERVAL_DEFAULT
) {
9851 vty_out(vty
, " ip ospf dead-interval ");
9854 if (OSPF_IF_PARAM_CONFIGURED(params
,
9857 "minimal hello-multiplier %d",
9858 params
->fast_hello
);
9860 vty_out(vty
, "%u", params
->v_wait
);
9862 if (params
!= IF_DEF_PARAMS(ifp
))
9864 inet_ntoa(rn
->p
.u
.prefix4
));
9868 /* Router Priority print. */
9869 if (OSPF_IF_PARAM_CONFIGURED(params
, priority
)
9871 != OSPF_ROUTER_PRIORITY_DEFAULT
) {
9872 vty_out(vty
, " ip ospf priority %u",
9874 if (params
!= IF_DEF_PARAMS(ifp
))
9876 inet_ntoa(rn
->p
.u
.prefix4
));
9880 /* Retransmit Interval print. */
9881 if (OSPF_IF_PARAM_CONFIGURED(params
,
9882 retransmit_interval
)
9883 && params
->retransmit_interval
9884 != OSPF_RETRANSMIT_INTERVAL_DEFAULT
) {
9885 vty_out(vty
, " ip ospf retransmit-interval %u",
9886 params
->retransmit_interval
);
9887 if (params
!= IF_DEF_PARAMS(ifp
))
9889 inet_ntoa(rn
->p
.u
.prefix4
));
9893 /* Transmit Delay print. */
9894 if (OSPF_IF_PARAM_CONFIGURED(params
, transmit_delay
)
9895 && params
->transmit_delay
9896 != OSPF_TRANSMIT_DELAY_DEFAULT
) {
9897 vty_out(vty
, " ip ospf transmit-delay %u",
9898 params
->transmit_delay
);
9899 if (params
!= IF_DEF_PARAMS(ifp
))
9901 inet_ntoa(rn
->p
.u
.prefix4
));
9906 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
)) {
9907 if (ospf
&& ospf
->instance
)
9908 vty_out(vty
, " ip ospf %d",
9911 vty_out(vty
, " ip ospf");
9913 char buf
[INET_ADDRSTRLEN
];
9915 area_id2str(buf
, sizeof(buf
), ¶ms
->if_area
,
9916 params
->if_area_id_fmt
);
9917 vty_out(vty
, " area %s", buf
);
9918 if (params
!= IF_DEF_PARAMS(ifp
))
9920 inet_ntoa(rn
->p
.u
.prefix4
));
9925 if (params
&& params
->bfd_info
)
9926 ospf_bfd_write_config(vty
, params
);
9928 /* MTU ignore print. */
9929 if (OSPF_IF_PARAM_CONFIGURED(params
, mtu_ignore
)
9930 && params
->mtu_ignore
!= OSPF_MTU_IGNORE_DEFAULT
) {
9931 if (params
->mtu_ignore
== 0)
9932 vty_out(vty
, " no ip ospf mtu-ignore");
9934 vty_out(vty
, " ip ospf mtu-ignore");
9935 if (params
!= IF_DEF_PARAMS(ifp
))
9937 inet_ntoa(rn
->p
.u
.prefix4
));
9944 rn
= route_top(IF_OIFS_PARAMS(ifp
));
9946 rn
= route_next(rn
);
9956 ospf_opaque_config_write_if(vty
, ifp
);
9958 vty_endframe(vty
, NULL
);
9964 /* Configuration write function for ospfd. */
9965 static int config_write_interface(struct vty
*vty
)
9968 struct vrf
*vrf
= NULL
;
9970 /* Display all VRF aware OSPF interface configuration */
9971 RB_FOREACH (vrf
, vrf_name_head
, &vrfs_by_name
) {
9972 write
+= config_write_interface_one(vty
, vrf
);
9978 static int config_write_network_area(struct vty
*vty
, struct ospf
*ospf
)
9980 struct route_node
*rn
;
9981 uint8_t buf
[INET_ADDRSTRLEN
];
9983 /* `network area' print. */
9984 for (rn
= route_top(ospf
->networks
); rn
; rn
= route_next(rn
))
9986 struct ospf_network
*n
= rn
->info
;
9988 /* Create Area ID string by specified Area ID format. */
9989 if (n
->area_id_fmt
== OSPF_AREA_ID_FMT_DOTTEDQUAD
)
9990 inet_ntop(AF_INET
, &n
->area_id
, (char *)buf
,
9993 sprintf((char *)buf
, "%lu",
9994 (unsigned long int)ntohl(
9995 n
->area_id
.s_addr
));
9997 /* Network print. */
9998 vty_out(vty
, " network %s/%d area %s\n",
9999 inet_ntoa(rn
->p
.u
.prefix4
), rn
->p
.prefixlen
,
10006 static int config_write_ospf_area(struct vty
*vty
, struct ospf
*ospf
)
10008 struct listnode
*node
;
10009 struct ospf_area
*area
;
10010 uint8_t buf
[INET_ADDRSTRLEN
];
10012 /* Area configuration print. */
10013 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
)) {
10014 struct route_node
*rn1
;
10016 area_id2str((char *)buf
, sizeof(buf
), &area
->area_id
,
10017 area
->area_id_fmt
);
10019 if (area
->auth_type
!= OSPF_AUTH_NULL
) {
10020 if (area
->auth_type
== OSPF_AUTH_SIMPLE
)
10021 vty_out(vty
, " area %s authentication\n", buf
);
10024 " area %s authentication message-digest\n",
10028 if (area
->shortcut_configured
!= OSPF_SHORTCUT_DEFAULT
)
10029 vty_out(vty
, " area %s shortcut %s\n", buf
,
10030 ospf_shortcut_mode_str
10031 [area
->shortcut_configured
]);
10033 if ((area
->external_routing
== OSPF_AREA_STUB
)
10034 || (area
->external_routing
== OSPF_AREA_NSSA
)) {
10035 if (area
->external_routing
== OSPF_AREA_STUB
) {
10036 vty_out(vty
, " area %s stub", buf
);
10037 if (area
->no_summary
)
10038 vty_out(vty
, " no-summary\n");
10039 vty_out(vty
, "\n");
10040 } else if (area
->external_routing
== OSPF_AREA_NSSA
) {
10041 switch (area
->NSSATranslatorRole
) {
10042 case OSPF_NSSA_ROLE_NEVER
:
10044 " area %s nssa translate-never\n",
10047 case OSPF_NSSA_ROLE_ALWAYS
:
10049 " area %s nssa translate-always\n",
10052 case OSPF_NSSA_ROLE_CANDIDATE
:
10053 vty_out(vty
, " area %s nssa \n", buf
);
10056 if (area
->no_summary
)
10058 " area %s nssa no-summary\n",
10062 if (area
->default_cost
!= 1)
10063 vty_out(vty
, " area %s default-cost %d\n", buf
,
10064 area
->default_cost
);
10067 for (rn1
= route_top(area
->ranges
); rn1
; rn1
= route_next(rn1
))
10069 struct ospf_area_range
*range
= rn1
->info
;
10071 vty_out(vty
, " area %s range %s/%d", buf
,
10072 inet_ntoa(rn1
->p
.u
.prefix4
),
10075 if (range
->cost_config
10076 != OSPF_AREA_RANGE_COST_UNSPEC
)
10077 vty_out(vty
, " cost %d",
10078 range
->cost_config
);
10080 if (!CHECK_FLAG(range
->flags
,
10081 OSPF_AREA_RANGE_ADVERTISE
))
10082 vty_out(vty
, " not-advertise");
10084 if (CHECK_FLAG(range
->flags
,
10085 OSPF_AREA_RANGE_SUBSTITUTE
))
10086 vty_out(vty
, " substitute %s/%d",
10087 inet_ntoa(range
->subst_addr
),
10088 range
->subst_masklen
);
10090 vty_out(vty
, "\n");
10093 if (EXPORT_NAME(area
))
10094 vty_out(vty
, " area %s export-list %s\n", buf
,
10095 EXPORT_NAME(area
));
10097 if (IMPORT_NAME(area
))
10098 vty_out(vty
, " area %s import-list %s\n", buf
,
10099 IMPORT_NAME(area
));
10101 if (PREFIX_NAME_IN(area
))
10102 vty_out(vty
, " area %s filter-list prefix %s in\n", buf
,
10103 PREFIX_NAME_IN(area
));
10105 if (PREFIX_NAME_OUT(area
))
10106 vty_out(vty
, " area %s filter-list prefix %s out\n",
10107 buf
, PREFIX_NAME_OUT(area
));
10113 static int config_write_ospf_nbr_nbma(struct vty
*vty
, struct ospf
*ospf
)
10115 struct ospf_nbr_nbma
*nbr_nbma
;
10116 struct route_node
*rn
;
10118 /* Static Neighbor configuration print. */
10119 for (rn
= route_top(ospf
->nbr_nbma
); rn
; rn
= route_next(rn
))
10120 if ((nbr_nbma
= rn
->info
)) {
10121 vty_out(vty
, " neighbor %s", inet_ntoa(nbr_nbma
->addr
));
10123 if (nbr_nbma
->priority
10124 != OSPF_NEIGHBOR_PRIORITY_DEFAULT
)
10125 vty_out(vty
, " priority %d",
10126 nbr_nbma
->priority
);
10128 if (nbr_nbma
->v_poll
!= OSPF_POLL_INTERVAL_DEFAULT
)
10129 vty_out(vty
, " poll-interval %d",
10132 vty_out(vty
, "\n");
10138 static int config_write_virtual_link(struct vty
*vty
, struct ospf
*ospf
)
10140 struct listnode
*node
;
10141 struct ospf_vl_data
*vl_data
;
10142 char buf
[INET_ADDRSTRLEN
];
10144 /* Virtual-Link print */
10145 for (ALL_LIST_ELEMENTS_RO(ospf
->vlinks
, node
, vl_data
)) {
10146 struct listnode
*n2
;
10147 struct crypt_key
*ck
;
10148 struct ospf_interface
*oi
;
10150 if (vl_data
!= NULL
) {
10151 area_id2str(buf
, sizeof(buf
), &vl_data
->vl_area_id
,
10152 vl_data
->vl_area_id_fmt
);
10153 oi
= vl_data
->vl_oi
;
10156 if (OSPF_IF_PARAM(oi
, v_hello
)
10157 != OSPF_HELLO_INTERVAL_DEFAULT
10158 || OSPF_IF_PARAM(oi
, v_wait
)
10159 != OSPF_ROUTER_DEAD_INTERVAL_DEFAULT
10160 || OSPF_IF_PARAM(oi
, retransmit_interval
)
10161 != OSPF_RETRANSMIT_INTERVAL_DEFAULT
10162 || OSPF_IF_PARAM(oi
, transmit_delay
)
10163 != OSPF_TRANSMIT_DELAY_DEFAULT
)
10165 " area %s virtual-link %s hello-interval %d retransmit-interval %d transmit-delay %d dead-interval %d\n",
10166 buf
, inet_ntoa(vl_data
->vl_peer
),
10167 OSPF_IF_PARAM(oi
, v_hello
),
10168 OSPF_IF_PARAM(oi
, retransmit_interval
),
10169 OSPF_IF_PARAM(oi
, transmit_delay
),
10170 OSPF_IF_PARAM(oi
, v_wait
));
10172 vty_out(vty
, " area %s virtual-link %s\n", buf
,
10173 inet_ntoa(vl_data
->vl_peer
));
10175 if (IF_DEF_PARAMS(vl_data
->vl_oi
->ifp
)->auth_simple
[0]
10178 " area %s virtual-link %s authentication-key %s\n",
10179 buf
, inet_ntoa(vl_data
->vl_peer
),
10180 IF_DEF_PARAMS(vl_data
->vl_oi
->ifp
)
10183 for (ALL_LIST_ELEMENTS_RO(
10184 IF_DEF_PARAMS(vl_data
->vl_oi
->ifp
)
10188 " area %s virtual-link %s"
10189 " message-digest-key %d md5 %s\n",
10190 buf
, inet_ntoa(vl_data
->vl_peer
),
10191 ck
->key_id
, ck
->auth_key
);
10199 static int config_write_ospf_redistribute(struct vty
*vty
, struct ospf
*ospf
)
10203 /* redistribute print. */
10204 for (type
= 0; type
< ZEBRA_ROUTE_MAX
; type
++) {
10205 struct list
*red_list
;
10206 struct listnode
*node
;
10207 struct ospf_redist
*red
;
10209 red_list
= ospf
->redist
[type
];
10213 for (ALL_LIST_ELEMENTS_RO(red_list
, node
, red
)) {
10214 vty_out(vty
, " redistribute %s",
10215 zebra_route_string(type
));
10217 vty_out(vty
, " %d", red
->instance
);
10219 if (red
->dmetric
.value
>= 0)
10220 vty_out(vty
, " metric %d", red
->dmetric
.value
);
10222 if (red
->dmetric
.type
== EXTERNAL_METRIC_TYPE_1
)
10223 vty_out(vty
, " metric-type 1");
10225 if (ROUTEMAP_NAME(red
))
10226 vty_out(vty
, " route-map %s",
10227 ROUTEMAP_NAME(red
));
10229 vty_out(vty
, "\n");
10236 static int config_write_ospf_default_metric(struct vty
*vty
, struct ospf
*ospf
)
10238 if (ospf
->default_metric
!= -1)
10239 vty_out(vty
, " default-metric %d\n", ospf
->default_metric
);
10243 static int config_write_ospf_distribute(struct vty
*vty
, struct ospf
*ospf
)
10246 struct ospf_redist
*red
;
10249 /* distribute-list print. */
10250 for (type
= 0; type
< ZEBRA_ROUTE_MAX
; type
++)
10251 if (DISTRIBUTE_NAME(ospf
, type
))
10252 vty_out(vty
, " distribute-list %s out %s\n",
10253 DISTRIBUTE_NAME(ospf
, type
),
10254 zebra_route_string(type
));
10256 /* default-information print. */
10257 if (ospf
->default_originate
!= DEFAULT_ORIGINATE_NONE
) {
10258 vty_out(vty
, " default-information originate");
10259 if (ospf
->default_originate
== DEFAULT_ORIGINATE_ALWAYS
)
10260 vty_out(vty
, " always");
10262 red
= ospf_redist_lookup(ospf
, DEFAULT_ROUTE
, 0);
10264 if (red
->dmetric
.value
>= 0)
10265 vty_out(vty
, " metric %d",
10266 red
->dmetric
.value
);
10268 if (red
->dmetric
.type
== EXTERNAL_METRIC_TYPE_1
)
10269 vty_out(vty
, " metric-type 1");
10271 if (ROUTEMAP_NAME(red
))
10272 vty_out(vty
, " route-map %s",
10273 ROUTEMAP_NAME(red
));
10276 vty_out(vty
, "\n");
10283 static int config_write_ospf_distance(struct vty
*vty
, struct ospf
*ospf
)
10285 struct route_node
*rn
;
10286 struct ospf_distance
*odistance
;
10288 if (ospf
->distance_all
)
10289 vty_out(vty
, " distance %d\n", ospf
->distance_all
);
10291 if (ospf
->distance_intra
|| ospf
->distance_inter
10292 || ospf
->distance_external
) {
10293 vty_out(vty
, " distance ospf");
10295 if (ospf
->distance_intra
)
10296 vty_out(vty
, " intra-area %d", ospf
->distance_intra
);
10297 if (ospf
->distance_inter
)
10298 vty_out(vty
, " inter-area %d", ospf
->distance_inter
);
10299 if (ospf
->distance_external
)
10300 vty_out(vty
, " external %d", ospf
->distance_external
);
10302 vty_out(vty
, "\n");
10305 for (rn
= route_top(ospf
->distance_table
); rn
; rn
= route_next(rn
))
10306 if ((odistance
= rn
->info
) != NULL
) {
10307 vty_out(vty
, " distance %d %s/%d %s\n",
10308 odistance
->distance
, inet_ntoa(rn
->p
.u
.prefix4
),
10310 odistance
->access_list
? odistance
->access_list
10316 static int ospf_config_write_one(struct vty
*vty
, struct ospf
*ospf
)
10318 struct vrf
*vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
10319 struct interface
*ifp
;
10320 struct ospf_interface
*oi
;
10321 struct listnode
*node
= NULL
;
10324 /* `router ospf' print. */
10325 if (ospf
->instance
&& ospf
->name
) {
10326 vty_out(vty
, "router ospf %d vrf %s\n", ospf
->instance
,
10328 } else if (ospf
->instance
) {
10329 vty_out(vty
, "router ospf %d\n", ospf
->instance
);
10330 } else if (ospf
->name
) {
10331 vty_out(vty
, "router ospf vrf %s\n", ospf
->name
);
10333 vty_out(vty
, "router ospf\n");
10335 if (!ospf
->networks
) {
10340 /* Router ID print. */
10341 if (ospf
->router_id_static
.s_addr
!= 0)
10342 vty_out(vty
, " ospf router-id %s\n",
10343 inet_ntoa(ospf
->router_id_static
));
10345 /* ABR type print. */
10346 if (ospf
->abr_type
!= OSPF_ABR_DEFAULT
)
10347 vty_out(vty
, " ospf abr-type %s\n",
10348 ospf_abr_type_str
[ospf
->abr_type
]);
10350 /* log-adjacency-changes flag print. */
10351 if (CHECK_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_CHANGES
)) {
10352 if (CHECK_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_DETAIL
))
10353 vty_out(vty
, " log-adjacency-changes detail\n");
10354 else if (!DFLT_OSPF_LOG_ADJACENCY_CHANGES
)
10355 vty_out(vty
, " log-adjacency-changes\n");
10356 } else if (DFLT_OSPF_LOG_ADJACENCY_CHANGES
) {
10357 vty_out(vty
, " no log-adjacency-changes\n");
10360 /* RFC1583 compatibility flag print -- Compatible with CISCO
10362 if (CHECK_FLAG(ospf
->config
, OSPF_RFC1583_COMPATIBLE
))
10363 vty_out(vty
, " compatible rfc1583\n");
10365 /* auto-cost reference-bandwidth configuration. */
10366 if (ospf
->ref_bandwidth
!= OSPF_DEFAULT_REF_BANDWIDTH
) {
10368 "! Important: ensure reference bandwidth "
10369 "is consistent across all routers\n");
10370 vty_out(vty
, " auto-cost reference-bandwidth %d\n",
10371 ospf
->ref_bandwidth
);
10374 /* SPF timers print. */
10375 if (ospf
->spf_delay
!= OSPF_SPF_DELAY_DEFAULT
10376 || ospf
->spf_holdtime
!= OSPF_SPF_HOLDTIME_DEFAULT
10377 || ospf
->spf_max_holdtime
!= OSPF_SPF_MAX_HOLDTIME_DEFAULT
)
10378 vty_out(vty
, " timers throttle spf %d %d %d\n", ospf
->spf_delay
,
10379 ospf
->spf_holdtime
, ospf
->spf_max_holdtime
);
10381 /* LSA timers print. */
10382 if (ospf
->min_ls_interval
!= OSPF_MIN_LS_INTERVAL
)
10383 vty_out(vty
, " timers throttle lsa all %d\n",
10384 ospf
->min_ls_interval
);
10385 if (ospf
->min_ls_arrival
!= OSPF_MIN_LS_ARRIVAL
)
10386 vty_out(vty
, " timers lsa min-arrival %d\n",
10387 ospf
->min_ls_arrival
);
10389 /* Write multiplier print. */
10390 if (ospf
->write_oi_count
!= OSPF_WRITE_INTERFACE_COUNT_DEFAULT
)
10391 vty_out(vty
, " ospf write-multiplier %d\n",
10392 ospf
->write_oi_count
);
10394 /* Max-metric router-lsa print */
10395 config_write_stub_router(vty
, ospf
);
10397 /* SPF refresh parameters print. */
10398 if (ospf
->lsa_refresh_interval
!= OSPF_LSA_REFRESH_INTERVAL_DEFAULT
)
10399 vty_out(vty
, " refresh timer %d\n", ospf
->lsa_refresh_interval
);
10401 /* Redistribute information print. */
10402 config_write_ospf_redistribute(vty
, ospf
);
10404 /* passive-interface print. */
10405 if (ospf
->passive_interface_default
== OSPF_IF_PASSIVE
)
10406 vty_out(vty
, " passive-interface default\n");
10408 FOR_ALL_INTERFACES (vrf
, ifp
)
10409 if (OSPF_IF_PARAM_CONFIGURED(IF_DEF_PARAMS(ifp
),
10411 && IF_DEF_PARAMS(ifp
)->passive_interface
10412 != ospf
->passive_interface_default
) {
10413 vty_out(vty
, " %spassive-interface %s\n",
10414 IF_DEF_PARAMS(ifp
)->passive_interface
? ""
10418 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
10419 if (!OSPF_IF_PARAM_CONFIGURED(oi
->params
, passive_interface
))
10421 if (OSPF_IF_PARAM_CONFIGURED(IF_DEF_PARAMS(oi
->ifp
),
10422 passive_interface
)) {
10423 if (oi
->params
->passive_interface
10424 == IF_DEF_PARAMS(oi
->ifp
)->passive_interface
)
10426 } else if (oi
->params
->passive_interface
10427 == ospf
->passive_interface_default
)
10430 vty_out(vty
, " %spassive-interface %s %s\n",
10431 oi
->params
->passive_interface
? "" : "no ",
10432 oi
->ifp
->name
, inet_ntoa(oi
->address
->u
.prefix4
));
10435 /* Network area print. */
10436 config_write_network_area(vty
, ospf
);
10438 /* Area config print. */
10439 config_write_ospf_area(vty
, ospf
);
10441 /* static neighbor print. */
10442 config_write_ospf_nbr_nbma(vty
, ospf
);
10444 /* Virtual-Link print. */
10445 config_write_virtual_link(vty
, ospf
);
10447 /* Default metric configuration. */
10448 config_write_ospf_default_metric(vty
, ospf
);
10450 /* Distribute-list and default-information print. */
10451 config_write_ospf_distribute(vty
, ospf
);
10453 /* Distance configuration. */
10454 config_write_ospf_distance(vty
, ospf
);
10456 ospf_opaque_config_write_router(vty
, ospf
);
10462 /* OSPF configuration write function. */
10463 static int ospf_config_write(struct vty
*vty
)
10466 struct listnode
*ospf_node
= NULL
;
10469 if (listcount(om
->ospf
) == 0)
10472 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, ospf_node
, ospf
)) {
10473 /* VRF Default check if it is running.
10474 * Upon daemon start, there could be default instance
10475 * in absence of 'router ospf'/oi_running is disabled. */
10476 if (ospf
->vrf_id
== VRF_DEFAULT
&& ospf
->oi_running
)
10477 write
+= ospf_config_write_one(vty
, ospf
);
10478 /* For Non-Default VRF simply display the configuration,
10479 * even if it is not oi_running. */
10480 else if (ospf
->vrf_id
!= VRF_DEFAULT
)
10481 write
+= ospf_config_write_one(vty
, ospf
);
10486 void ospf_vty_show_init(void)
10488 /* "show ip ospf" commands. */
10489 install_element(VIEW_NODE
, &show_ip_ospf_cmd
);
10491 install_element(VIEW_NODE
, &show_ip_ospf_instance_cmd
);
10493 /* "show ip ospf database" commands. */
10494 install_element(VIEW_NODE
, &show_ip_ospf_database_max_cmd
);
10496 install_element(VIEW_NODE
,
10497 &show_ip_ospf_instance_database_type_adv_router_cmd
);
10498 install_element(VIEW_NODE
, &show_ip_ospf_instance_database_cmd
);
10499 install_element(VIEW_NODE
, &show_ip_ospf_instance_database_max_cmd
);
10501 /* "show ip ospf interface" commands. */
10502 install_element(VIEW_NODE
, &show_ip_ospf_interface_cmd
);
10504 install_element(VIEW_NODE
, &show_ip_ospf_instance_interface_cmd
);
10505 /* "show ip ospf interface traffic */
10506 install_element(VIEW_NODE
, &show_ip_ospf_interface_traffic_cmd
);
10508 /* "show ip ospf neighbor" commands. */
10509 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_int_detail_cmd
);
10510 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_int_cmd
);
10511 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_id_cmd
);
10512 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_detail_all_cmd
);
10513 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_detail_cmd
);
10514 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_cmd
);
10515 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_all_cmd
);
10517 install_element(VIEW_NODE
,
10518 &show_ip_ospf_instance_neighbor_int_detail_cmd
);
10519 install_element(VIEW_NODE
, &show_ip_ospf_instance_neighbor_int_cmd
);
10520 install_element(VIEW_NODE
, &show_ip_ospf_instance_neighbor_id_cmd
);
10521 install_element(VIEW_NODE
,
10522 &show_ip_ospf_instance_neighbor_detail_all_cmd
);
10523 install_element(VIEW_NODE
, &show_ip_ospf_instance_neighbor_detail_cmd
);
10524 install_element(VIEW_NODE
, &show_ip_ospf_instance_neighbor_cmd
);
10525 install_element(VIEW_NODE
, &show_ip_ospf_instance_neighbor_all_cmd
);
10527 /* "show ip ospf route" commands. */
10528 install_element(VIEW_NODE
, &show_ip_ospf_route_cmd
);
10529 install_element(VIEW_NODE
, &show_ip_ospf_border_routers_cmd
);
10531 install_element(VIEW_NODE
, &show_ip_ospf_instance_route_cmd
);
10532 install_element(VIEW_NODE
, &show_ip_ospf_instance_border_routers_cmd
);
10534 /* "show ip ospf vrfs" commands. */
10535 install_element(VIEW_NODE
, &show_ip_ospf_vrfs_cmd
);
10539 /* ospfd's interface node. */
10540 static struct cmd_node interface_node
= {INTERFACE_NODE
, "%s(config-if)# ", 1};
10542 /* Initialization of OSPF interface. */
10543 static void ospf_vty_if_init(void)
10545 /* Install interface node. */
10546 install_node(&interface_node
, config_write_interface
);
10549 /* "ip ospf authentication" commands. */
10550 install_element(INTERFACE_NODE
, &ip_ospf_authentication_args_addr_cmd
);
10551 install_element(INTERFACE_NODE
, &ip_ospf_authentication_addr_cmd
);
10552 install_element(INTERFACE_NODE
,
10553 &no_ip_ospf_authentication_args_addr_cmd
);
10554 install_element(INTERFACE_NODE
, &no_ip_ospf_authentication_addr_cmd
);
10555 install_element(INTERFACE_NODE
, &ip_ospf_authentication_key_addr_cmd
);
10556 install_element(INTERFACE_NODE
,
10557 &no_ip_ospf_authentication_key_authkey_addr_cmd
);
10558 install_element(INTERFACE_NODE
,
10559 &no_ospf_authentication_key_authkey_addr_cmd
);
10561 /* "ip ospf message-digest-key" commands. */
10562 install_element(INTERFACE_NODE
, &ip_ospf_message_digest_key_cmd
);
10563 install_element(INTERFACE_NODE
, &no_ip_ospf_message_digest_key_cmd
);
10565 /* "ip ospf cost" commands. */
10566 install_element(INTERFACE_NODE
, &ip_ospf_cost_cmd
);
10567 install_element(INTERFACE_NODE
, &no_ip_ospf_cost_cmd
);
10569 /* "ip ospf mtu-ignore" commands. */
10570 install_element(INTERFACE_NODE
, &ip_ospf_mtu_ignore_addr_cmd
);
10571 install_element(INTERFACE_NODE
, &no_ip_ospf_mtu_ignore_addr_cmd
);
10573 /* "ip ospf dead-interval" commands. */
10574 install_element(INTERFACE_NODE
, &ip_ospf_dead_interval_cmd
);
10575 install_element(INTERFACE_NODE
,
10576 &ip_ospf_dead_interval_minimal_addr_cmd
);
10577 install_element(INTERFACE_NODE
, &no_ip_ospf_dead_interval_cmd
);
10579 /* "ip ospf hello-interval" commands. */
10580 install_element(INTERFACE_NODE
, &ip_ospf_hello_interval_cmd
);
10581 install_element(INTERFACE_NODE
, &no_ip_ospf_hello_interval_cmd
);
10583 /* "ip ospf network" commands. */
10584 install_element(INTERFACE_NODE
, &ip_ospf_network_cmd
);
10585 install_element(INTERFACE_NODE
, &no_ip_ospf_network_cmd
);
10587 /* "ip ospf priority" commands. */
10588 install_element(INTERFACE_NODE
, &ip_ospf_priority_cmd
);
10589 install_element(INTERFACE_NODE
, &no_ip_ospf_priority_cmd
);
10591 /* "ip ospf retransmit-interval" commands. */
10592 install_element(INTERFACE_NODE
, &ip_ospf_retransmit_interval_addr_cmd
);
10593 install_element(INTERFACE_NODE
,
10594 &no_ip_ospf_retransmit_interval_addr_cmd
);
10596 /* "ip ospf transmit-delay" commands. */
10597 install_element(INTERFACE_NODE
, &ip_ospf_transmit_delay_addr_cmd
);
10598 install_element(INTERFACE_NODE
, &no_ip_ospf_transmit_delay_addr_cmd
);
10600 /* "ip ospf area" commands. */
10601 install_element(INTERFACE_NODE
, &ip_ospf_area_cmd
);
10602 install_element(INTERFACE_NODE
, &no_ip_ospf_area_cmd
);
10604 /* These commands are compatibitliy for previous version. */
10605 install_element(INTERFACE_NODE
, &ospf_authentication_key_cmd
);
10606 install_element(INTERFACE_NODE
, &ospf_message_digest_key_cmd
);
10607 install_element(INTERFACE_NODE
, &no_ospf_message_digest_key_cmd
);
10608 install_element(INTERFACE_NODE
, &ospf_dead_interval_cmd
);
10609 install_element(INTERFACE_NODE
, &no_ospf_dead_interval_cmd
);
10610 install_element(INTERFACE_NODE
, &ospf_hello_interval_cmd
);
10611 install_element(INTERFACE_NODE
, &no_ospf_hello_interval_cmd
);
10612 install_element(INTERFACE_NODE
, &ospf_cost_cmd
);
10613 install_element(INTERFACE_NODE
, &no_ospf_cost_cmd
);
10614 install_element(INTERFACE_NODE
, &ospf_network_cmd
);
10615 install_element(INTERFACE_NODE
, &no_ospf_network_cmd
);
10616 install_element(INTERFACE_NODE
, &ospf_priority_cmd
);
10617 install_element(INTERFACE_NODE
, &no_ospf_priority_cmd
);
10618 install_element(INTERFACE_NODE
, &ospf_retransmit_interval_cmd
);
10619 install_element(INTERFACE_NODE
, &no_ospf_retransmit_interval_cmd
);
10620 install_element(INTERFACE_NODE
, &ospf_transmit_delay_cmd
);
10621 install_element(INTERFACE_NODE
, &no_ospf_transmit_delay_cmd
);
10624 static void ospf_vty_zebra_init(void)
10626 install_element(OSPF_NODE
, &ospf_redistribute_source_cmd
);
10627 install_element(OSPF_NODE
, &no_ospf_redistribute_source_cmd
);
10628 install_element(OSPF_NODE
, &ospf_redistribute_instance_source_cmd
);
10629 install_element(OSPF_NODE
, &no_ospf_redistribute_instance_source_cmd
);
10631 install_element(OSPF_NODE
, &ospf_distribute_list_out_cmd
);
10632 install_element(OSPF_NODE
, &no_ospf_distribute_list_out_cmd
);
10634 install_element(OSPF_NODE
, &ospf_default_information_originate_cmd
);
10635 install_element(OSPF_NODE
, &no_ospf_default_information_originate_cmd
);
10637 install_element(OSPF_NODE
, &ospf_default_metric_cmd
);
10638 install_element(OSPF_NODE
, &no_ospf_default_metric_cmd
);
10640 install_element(OSPF_NODE
, &ospf_distance_cmd
);
10641 install_element(OSPF_NODE
, &no_ospf_distance_cmd
);
10642 install_element(OSPF_NODE
, &no_ospf_distance_ospf_cmd
);
10643 install_element(OSPF_NODE
, &ospf_distance_ospf_cmd
);
10645 install_element (OSPF_NODE
, &ospf_distance_source_cmd
);
10646 install_element (OSPF_NODE
, &no_ospf_distance_source_cmd
);
10647 install_element (OSPF_NODE
, &ospf_distance_source_access_list_cmd
);
10648 install_element (OSPF_NODE
, &no_ospf_distance_source_access_list_cmd
);
10652 static struct cmd_node ospf_node
= {OSPF_NODE
, "%s(config-router)# ", 1};
10654 static void ospf_interface_clear(struct interface
*ifp
)
10656 if (!if_is_operative(ifp
))
10659 if (IS_DEBUG_OSPF(ism
, ISM_EVENTS
))
10660 zlog_debug("ISM[%s]: clear by reset", ifp
->name
);
10662 ospf_if_reset(ifp
);
10665 DEFUN (clear_ip_ospf_interface
,
10666 clear_ip_ospf_interface_cmd
,
10667 "clear ip ospf [vrf <NAME>] interface [IFNAME]",
10670 "OSPF information\n"
10672 "Interface information\n"
10673 "Interface name\n")
10675 int idx_ifname
= 0;
10677 struct interface
*ifp
;
10678 struct listnode
*node
;
10679 struct ospf
*ospf
= NULL
;
10680 char *vrf_name
= NULL
;
10681 vrf_id_t vrf_id
= VRF_DEFAULT
;
10682 struct vrf
*vrf
= NULL
;
10684 if (argv_find(argv
, argc
, "vrf", &idx_vrf
))
10685 vrf_name
= argv
[idx_vrf
+ 1]->arg
;
10686 if (vrf_name
&& strmatch(vrf_name
, VRF_DEFAULT_NAME
))
10689 vrf
= vrf_lookup_by_name(vrf_name
);
10691 vrf_id
= vrf
->vrf_id
;
10693 if (!argv_find(argv
, argc
, "IFNAME", &idx_ifname
)) {
10694 /* Clear all the ospfv2 interfaces. */
10695 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
10696 if (vrf_id
!= ospf
->vrf_id
)
10699 vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
10700 FOR_ALL_INTERFACES (vrf
, ifp
)
10701 ospf_interface_clear(ifp
);
10704 /* Interface name is specified. */
10705 ifp
= if_lookup_by_name(argv
[idx_ifname
]->arg
, vrf_id
);
10707 vty_out(vty
, "No such interface name\n");
10709 ospf_interface_clear(ifp
);
10712 return CMD_SUCCESS
;
10715 void ospf_vty_clear_init(void)
10717 install_element(ENABLE_NODE
, &clear_ip_ospf_interface_cmd
);
10721 /* Install OSPF related vty commands. */
10722 void ospf_vty_init(void)
10724 /* Install ospf top node. */
10725 install_node(&ospf_node
, ospf_config_write
);
10727 /* "router ospf" commands. */
10728 install_element(CONFIG_NODE
, &router_ospf_cmd
);
10729 install_element(CONFIG_NODE
, &no_router_ospf_cmd
);
10732 install_default(OSPF_NODE
);
10734 /* "ospf router-id" commands. */
10735 install_element(OSPF_NODE
, &ospf_router_id_cmd
);
10736 install_element(OSPF_NODE
, &ospf_router_id_old_cmd
);
10737 install_element(OSPF_NODE
, &no_ospf_router_id_cmd
);
10739 /* "passive-interface" commands. */
10740 install_element(OSPF_NODE
, &ospf_passive_interface_addr_cmd
);
10741 install_element(OSPF_NODE
, &no_ospf_passive_interface_addr_cmd
);
10743 /* "ospf abr-type" commands. */
10744 install_element(OSPF_NODE
, &ospf_abr_type_cmd
);
10745 install_element(OSPF_NODE
, &no_ospf_abr_type_cmd
);
10747 /* "ospf log-adjacency-changes" commands. */
10748 install_element(OSPF_NODE
, &ospf_log_adjacency_changes_cmd
);
10749 install_element(OSPF_NODE
, &ospf_log_adjacency_changes_detail_cmd
);
10750 install_element(OSPF_NODE
, &no_ospf_log_adjacency_changes_cmd
);
10751 install_element(OSPF_NODE
, &no_ospf_log_adjacency_changes_detail_cmd
);
10753 /* "ospf rfc1583-compatible" commands. */
10754 install_element(OSPF_NODE
, &ospf_compatible_rfc1583_cmd
);
10755 install_element(OSPF_NODE
, &no_ospf_compatible_rfc1583_cmd
);
10756 install_element(OSPF_NODE
, &ospf_rfc1583_flag_cmd
);
10757 install_element(OSPF_NODE
, &no_ospf_rfc1583_flag_cmd
);
10759 /* "network area" commands. */
10760 install_element(OSPF_NODE
, &ospf_network_area_cmd
);
10761 install_element(OSPF_NODE
, &no_ospf_network_area_cmd
);
10763 /* "area authentication" commands. */
10764 install_element(OSPF_NODE
,
10765 &ospf_area_authentication_message_digest_cmd
);
10766 install_element(OSPF_NODE
, &ospf_area_authentication_cmd
);
10767 install_element(OSPF_NODE
, &no_ospf_area_authentication_cmd
);
10769 /* "area range" commands. */
10770 install_element(OSPF_NODE
, &ospf_area_range_cmd
);
10771 install_element(OSPF_NODE
, &ospf_area_range_cost_cmd
);
10772 install_element(OSPF_NODE
, &ospf_area_range_not_advertise_cmd
);
10773 install_element(OSPF_NODE
, &no_ospf_area_range_cmd
);
10774 install_element(OSPF_NODE
, &ospf_area_range_substitute_cmd
);
10775 install_element(OSPF_NODE
, &no_ospf_area_range_substitute_cmd
);
10777 /* "area virtual-link" commands. */
10778 install_element(OSPF_NODE
, &ospf_area_vlink_cmd
);
10779 install_element(OSPF_NODE
, &ospf_area_vlink_intervals_cmd
);
10780 install_element(OSPF_NODE
, &no_ospf_area_vlink_cmd
);
10781 install_element(OSPF_NODE
, &no_ospf_area_vlink_intervals_cmd
);
10784 /* "area stub" commands. */
10785 install_element(OSPF_NODE
, &ospf_area_stub_no_summary_cmd
);
10786 install_element(OSPF_NODE
, &ospf_area_stub_cmd
);
10787 install_element(OSPF_NODE
, &no_ospf_area_stub_no_summary_cmd
);
10788 install_element(OSPF_NODE
, &no_ospf_area_stub_cmd
);
10790 /* "area nssa" commands. */
10791 install_element(OSPF_NODE
, &ospf_area_nssa_cmd
);
10792 install_element(OSPF_NODE
, &ospf_area_nssa_translate_cmd
);
10793 install_element(OSPF_NODE
, &ospf_area_nssa_no_summary_cmd
);
10794 install_element(OSPF_NODE
, &no_ospf_area_nssa_no_summary_cmd
);
10795 install_element(OSPF_NODE
, &no_ospf_area_nssa_cmd
);
10797 install_element(OSPF_NODE
, &ospf_area_default_cost_cmd
);
10798 install_element(OSPF_NODE
, &no_ospf_area_default_cost_cmd
);
10800 install_element(OSPF_NODE
, &ospf_area_shortcut_cmd
);
10801 install_element(OSPF_NODE
, &no_ospf_area_shortcut_cmd
);
10803 install_element(OSPF_NODE
, &ospf_area_export_list_cmd
);
10804 install_element(OSPF_NODE
, &no_ospf_area_export_list_cmd
);
10806 install_element(OSPF_NODE
, &ospf_area_filter_list_cmd
);
10807 install_element(OSPF_NODE
, &no_ospf_area_filter_list_cmd
);
10809 install_element(OSPF_NODE
, &ospf_area_import_list_cmd
);
10810 install_element(OSPF_NODE
, &no_ospf_area_import_list_cmd
);
10812 /* SPF timer commands */
10813 install_element(OSPF_NODE
, &ospf_timers_throttle_spf_cmd
);
10814 install_element(OSPF_NODE
, &no_ospf_timers_throttle_spf_cmd
);
10816 /* LSA timers commands */
10817 install_element(OSPF_NODE
, &ospf_timers_min_ls_interval_cmd
);
10818 install_element(OSPF_NODE
, &no_ospf_timers_min_ls_interval_cmd
);
10819 install_element(OSPF_NODE
, &ospf_timers_lsa_min_arrival_cmd
);
10820 install_element(OSPF_NODE
, &no_ospf_timers_lsa_min_arrival_cmd
);
10822 /* refresh timer commands */
10823 install_element(OSPF_NODE
, &ospf_refresh_timer_cmd
);
10824 install_element(OSPF_NODE
, &no_ospf_refresh_timer_val_cmd
);
10826 /* max-metric commands */
10827 install_element(OSPF_NODE
, &ospf_max_metric_router_lsa_admin_cmd
);
10828 install_element(OSPF_NODE
, &no_ospf_max_metric_router_lsa_admin_cmd
);
10829 install_element(OSPF_NODE
, &ospf_max_metric_router_lsa_startup_cmd
);
10830 install_element(OSPF_NODE
, &no_ospf_max_metric_router_lsa_startup_cmd
);
10831 install_element(OSPF_NODE
, &ospf_max_metric_router_lsa_shutdown_cmd
);
10832 install_element(OSPF_NODE
, &no_ospf_max_metric_router_lsa_shutdown_cmd
);
10834 /* reference bandwidth commands */
10835 install_element(OSPF_NODE
, &ospf_auto_cost_reference_bandwidth_cmd
);
10836 install_element(OSPF_NODE
, &no_ospf_auto_cost_reference_bandwidth_cmd
);
10838 /* "neighbor" commands. */
10839 install_element(OSPF_NODE
, &ospf_neighbor_cmd
);
10840 install_element(OSPF_NODE
, &ospf_neighbor_poll_interval_cmd
);
10841 install_element(OSPF_NODE
, &no_ospf_neighbor_cmd
);
10842 install_element(OSPF_NODE
, &no_ospf_neighbor_poll_cmd
);
10844 /* write multiplier commands */
10845 install_element(OSPF_NODE
, &ospf_write_multiplier_cmd
);
10846 install_element(OSPF_NODE
, &write_multiplier_cmd
);
10847 install_element(OSPF_NODE
, &no_ospf_write_multiplier_cmd
);
10848 install_element(OSPF_NODE
, &no_write_multiplier_cmd
);
10850 /* Init interface related vty commands. */
10851 ospf_vty_if_init();
10853 /* Init zebra related vty commands. */
10854 ospf_vty_zebra_init();