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 void area_id2str(char *buf
, int length
, struct in_addr
*area_id
,
78 memset(buf
, 0, length
);
80 if (area_id_fmt
== OSPF_AREA_ID_FMT_DOTTEDQUAD
)
81 strncpy(buf
, inet_ntoa(*area_id
), length
);
83 sprintf(buf
, "%lu", (unsigned long)ntohl(area_id
->s_addr
));
86 static int str2metric(const char *str
, int *metric
)
92 *metric
= strtol(str
, NULL
, 10);
93 if (*metric
< 0 && *metric
> 16777214) {
94 /* vty_out (vty, "OSPF metric value is invalid\n"); */
101 static int str2metric_type(const char *str
, int *metric_type
)
107 if (strncmp(str
, "1", 1) == 0)
108 *metric_type
= EXTERNAL_METRIC_TYPE_1
;
109 else if (strncmp(str
, "2", 1) == 0)
110 *metric_type
= EXTERNAL_METRIC_TYPE_2
;
117 int ospf_oi_count(struct interface
*ifp
)
119 struct route_node
*rn
;
122 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
))
129 #define OSPF_FIND_VRF_ARGS(argv, argc, idx_vrf, vrf_name, all_vrf) \
130 if (argv_find(argv, argc, "vrf", &idx_vrf)) { \
131 vrf_name = argv[idx_vrf + 1]->arg; \
132 all_vrf = strmatch(vrf_name, "all"); \
135 static struct ospf
*ospf_cmd_lookup_ospf(struct vty
*vty
,
136 struct cmd_token
*argv
[],
137 const int argc
, uint32_t enable
,
140 struct ospf
*ospf
= NULL
;
141 int idx_vrf
= 0, idx_inst
= 0;
142 const char *vrf_name
= NULL
;
145 if (argv_find(argv
, argc
, "(1-65535)", &idx_inst
))
146 *instance
= strtoul(argv
[idx_inst
]->arg
, NULL
, 10);
148 if (argv_find(argv
, argc
, "vrf", &idx_vrf
)) {
149 vrf_name
= argv
[idx_vrf
+ 1]->arg
;
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
, u_char 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 u_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 ospf_interface_area_set(ospf
, ifp
);
249 ospf
->if_ospf_cli_count
++;
253 ospf_router_id_update(ospf
);
259 DEFUN (no_router_ospf
,
261 "no router ospf [{(1-65535)|vrf NAME}]",
263 "Enable a routing process\n"
264 "Start OSPF configuration\n"
269 u_short instance
= 0;
271 ospf
= ospf_cmd_lookup_ospf(vty
, argv
, argc
, 0, &instance
);
274 return CMD_NOT_MY_INSTANCE
;
284 DEFPY (ospf_router_id
,
286 "ospf router-id A.B.C.D",
287 "OSPF specific commands\n"
288 "router-id for the OSPF process\n"
289 "OSPF router-id in IP address format\n")
291 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
293 struct listnode
*node
;
294 struct ospf_area
*area
;
296 ospf
->router_id_static
= router_id
;
298 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
))
299 if (area
->full_nbrs
) {
301 "For this router-id change to take effect,"
302 " save config and restart ospfd\n");
306 ospf_router_id_update(ospf
);
311 DEFUN_HIDDEN (ospf_router_id_old
,
312 ospf_router_id_old_cmd
,
314 "router-id for the OSPF process\n"
315 "OSPF router-id in IP address format\n")
317 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
319 struct listnode
*node
;
320 struct ospf_area
*area
;
321 struct in_addr router_id
;
324 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &router_id
);
326 vty_out(vty
, "Please specify Router ID by A.B.C.D\n");
327 return CMD_WARNING_CONFIG_FAILED
;
330 ospf
->router_id_static
= router_id
;
332 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
))
333 if (area
->full_nbrs
) {
335 "For this router-id change to take effect,"
336 " save config and restart ospfd\n");
340 ospf_router_id_update(ospf
);
345 DEFPY (no_ospf_router_id
,
346 no_ospf_router_id_cmd
,
347 "no ospf router-id [A.B.C.D]",
349 "OSPF specific commands\n"
350 "router-id for the OSPF process\n"
351 "OSPF router-id in IP address format\n")
353 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
354 struct listnode
*node
;
355 struct ospf_area
*area
;
358 if (!IPV4_ADDR_SAME(&ospf
->router_id_static
, &router_id
)) {
359 vty_out(vty
, "%% OSPF router-id doesn't match\n");
360 return CMD_WARNING_CONFIG_FAILED
;
364 ospf
->router_id_static
.s_addr
= 0;
366 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
))
367 if (area
->full_nbrs
) {
369 "For this router-id change to take effect,"
370 " save config and restart ospfd\n");
374 ospf_router_id_update(ospf
);
380 static void ospf_passive_interface_default(struct ospf
*ospf
, u_char newval
)
382 struct vrf
*vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
384 struct interface
*ifp
;
385 struct ospf_interface
*oi
;
387 ospf
->passive_interface_default
= newval
;
389 FOR_ALL_INTERFACES (vrf
, ifp
) {
390 if (ifp
&& OSPF_IF_PARAM_CONFIGURED(IF_DEF_PARAMS(ifp
),
392 UNSET_IF_PARAM(IF_DEF_PARAMS(ifp
), passive_interface
);
394 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, ln
, oi
)) {
395 if (OSPF_IF_PARAM_CONFIGURED(oi
->params
, passive_interface
))
396 UNSET_IF_PARAM(oi
->params
, passive_interface
);
397 /* update multicast memberships */
398 ospf_if_set_multicast(oi
);
402 static void ospf_passive_interface_update_addr(struct ospf
*ospf
,
403 struct interface
*ifp
,
404 struct ospf_if_params
*params
,
410 params
->passive_interface
= value
;
411 if (params
!= IF_DEF_PARAMS(ifp
)) {
412 if (OSPF_IF_PARAM_CONFIGURED(IF_DEF_PARAMS(ifp
),
414 dflt
= IF_DEF_PARAMS(ifp
)->passive_interface
;
416 dflt
= ospf
->passive_interface_default
;
419 SET_IF_PARAM(params
, passive_interface
);
421 UNSET_IF_PARAM(params
, passive_interface
);
423 ospf_free_if_params(ifp
, addr
);
424 ospf_if_update_params(ifp
, addr
);
428 static void ospf_passive_interface_update(struct ospf
*ospf
,
429 struct interface
*ifp
,
430 struct ospf_if_params
*params
,
433 params
->passive_interface
= value
;
434 if (params
== IF_DEF_PARAMS(ifp
)) {
435 if (value
!= ospf
->passive_interface_default
)
436 SET_IF_PARAM(params
, passive_interface
);
438 UNSET_IF_PARAM(params
, passive_interface
);
442 DEFUN (ospf_passive_interface
,
443 ospf_passive_interface_addr_cmd
,
444 "passive-interface <IFNAME [A.B.C.D]|default>",
445 "Suppress routing updates on an interface\n"
448 "Suppress routing updates on interfaces by default\n")
450 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
452 struct interface
*ifp
= NULL
;
453 struct in_addr addr
= {.s_addr
= INADDR_ANY
};
455 struct ospf_if_params
*params
;
456 struct route_node
*rn
;
458 if (strmatch(argv
[1]->text
, "default")) {
459 ospf_passive_interface_default(ospf
, OSPF_IF_PASSIVE
);
462 if (ospf
->vrf_id
!= VRF_UNKNOWN
)
463 ifp
= if_get_by_name(argv
[1]->arg
, ospf
->vrf_id
, 0);
466 vty_out(vty
, "interface %s not found.\n", (char *)argv
[1]->arg
);
467 return CMD_WARNING_CONFIG_FAILED
;
470 params
= IF_DEF_PARAMS(ifp
);
473 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
476 "Please specify interface address by A.B.C.D\n");
477 return CMD_WARNING_CONFIG_FAILED
;
480 params
= ospf_get_if_params(ifp
, addr
);
481 ospf_if_update_params(ifp
, addr
);
482 ospf_passive_interface_update_addr(ospf
, ifp
, params
,
483 OSPF_IF_PASSIVE
, addr
);
486 ospf_passive_interface_update(ospf
, ifp
, params
, OSPF_IF_PASSIVE
);
488 /* XXX We should call ospf_if_set_multicast on exactly those
489 * interfaces for which the passive property changed. It is too much
490 * work to determine this set, so we do this for every interface.
491 * This is safe and reasonable because ospf_if_set_multicast uses a
492 * record of joined groups to avoid systems calls if the desired
493 * memberships match the current memership.
496 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
497 struct ospf_interface
*oi
= rn
->info
;
499 if (oi
&& (OSPF_IF_PARAM(oi
, passive_interface
)
501 ospf_if_set_multicast(oi
);
504 * XXX It is not clear what state transitions the interface needs to
505 * undergo when going from active to passive. Fixing this will
506 * require precise identification of interfaces having such a
513 DEFUN (no_ospf_passive_interface
,
514 no_ospf_passive_interface_addr_cmd
,
515 "no passive-interface <IFNAME [A.B.C.D]|default>",
517 "Allow routing updates on an interface\n"
520 "Allow routing updates on interfaces by default\n")
522 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
524 struct interface
*ifp
= NULL
;
525 struct in_addr addr
= {.s_addr
= INADDR_ANY
};
526 struct ospf_if_params
*params
;
528 struct route_node
*rn
;
530 if (strmatch(argv
[2]->text
, "default")) {
531 ospf_passive_interface_default(ospf
, OSPF_IF_ACTIVE
);
535 if (ospf
->vrf_id
!= VRF_UNKNOWN
)
536 ifp
= if_get_by_name(argv
[2]->arg
, ospf
->vrf_id
, 0);
539 vty_out(vty
, "interface %s not found.\n", (char *)argv
[2]->arg
);
540 return CMD_WARNING_CONFIG_FAILED
;
543 params
= IF_DEF_PARAMS(ifp
);
546 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
549 "Please specify interface address by A.B.C.D\n");
550 return CMD_WARNING_CONFIG_FAILED
;
553 params
= ospf_lookup_if_params(ifp
, addr
);
556 ospf_passive_interface_update_addr(ospf
, ifp
, params
,
557 OSPF_IF_ACTIVE
, addr
);
559 ospf_passive_interface_update(ospf
, ifp
, params
, OSPF_IF_ACTIVE
);
561 /* XXX We should call ospf_if_set_multicast on exactly those
562 * interfaces for which the passive property changed. It is too much
563 * work to determine this set, so we do this for every interface.
564 * This is safe and reasonable because ospf_if_set_multicast uses a
565 * record of joined groups to avoid systems calls if the desired
566 * memberships match the current memership.
568 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
569 struct ospf_interface
*oi
= rn
->info
;
572 && (OSPF_IF_PARAM(oi
, passive_interface
) == OSPF_IF_ACTIVE
))
573 ospf_if_set_multicast(oi
);
580 DEFUN (ospf_network_area
,
581 ospf_network_area_cmd
,
582 "network A.B.C.D/M area <A.B.C.D|(0-4294967295)>",
583 "Enable routing on an IP network\n"
584 "OSPF network prefix\n"
585 "Set the OSPF area ID\n"
586 "OSPF area ID in IP address format\n"
587 "OSPF area ID as a decimal value\n")
589 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
590 int idx_ipv4_prefixlen
= 1;
591 int idx_ipv4_number
= 3;
592 struct prefix_ipv4 p
;
593 struct in_addr area_id
;
596 if (ospf
->instance
) {
598 "The network command is not supported in multi-instance ospf\n");
599 return CMD_WARNING_CONFIG_FAILED
;
602 if (ospf
->if_ospf_cli_count
> 0) {
604 "Please remove all ip ospf area x.x.x.x commands first.\n");
605 if (IS_DEBUG_OSPF_EVENT
)
607 "%s ospf vrf %s num of %u ip osp area x config",
609 ospf
->name
? ospf
->name
: "NIL",
610 ospf
->if_ospf_cli_count
);
611 return CMD_WARNING_CONFIG_FAILED
;
614 /* Get network prefix and Area ID. */
615 str2prefix_ipv4(argv
[idx_ipv4_prefixlen
]->arg
, &p
);
616 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
618 ret
= ospf_network_set(ospf
, &p
, area_id
, format
);
620 vty_out(vty
, "There is already same network statement.\n");
621 return CMD_WARNING_CONFIG_FAILED
;
627 DEFUN (no_ospf_network_area
,
628 no_ospf_network_area_cmd
,
629 "no network A.B.C.D/M area <A.B.C.D|(0-4294967295)>",
631 "Enable routing on an IP network\n"
632 "OSPF network prefix\n"
633 "Set the OSPF area ID\n"
634 "OSPF area ID in IP address format\n"
635 "OSPF area ID as a decimal value\n")
637 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
638 int idx_ipv4_prefixlen
= 2;
639 int idx_ipv4_number
= 4;
640 struct prefix_ipv4 p
;
641 struct in_addr area_id
;
644 if (ospf
->instance
) {
646 "The network command is not supported in multi-instance ospf\n");
647 return CMD_WARNING_CONFIG_FAILED
;
650 /* Get network prefix and Area ID. */
651 str2prefix_ipv4(argv
[idx_ipv4_prefixlen
]->arg
, &p
);
652 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
654 ret
= ospf_network_unset(ospf
, &p
, area_id
);
657 "Can't find specified network area configuration.\n");
658 return CMD_WARNING_CONFIG_FAILED
;
664 DEFUN (ospf_area_range
,
666 "area <A.B.C.D|(0-4294967295)> range A.B.C.D/M [advertise [cost (0-16777215)]]",
667 "OSPF area parameters\n"
668 "OSPF area ID in IP address format\n"
669 "OSPF area ID as a decimal value\n"
670 "Summarize routes matching address/mask (border routers only)\n"
671 "Area range prefix\n"
672 "Advertise this range (default)\n"
673 "User specified metric for this range\n"
674 "Advertised metric for this range\n")
676 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
677 int idx_ipv4_number
= 1;
678 int idx_ipv4_prefixlen
= 3;
680 struct prefix_ipv4 p
;
681 struct in_addr area_id
;
685 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
686 str2prefix_ipv4(argv
[idx_ipv4_prefixlen
]->arg
, &p
);
688 ospf_area_range_set(ospf
, area_id
, &p
, OSPF_AREA_RANGE_ADVERTISE
);
690 cost
= strtoul(argv
[idx_cost
]->arg
, NULL
, 10);
691 ospf_area_range_cost_set(ospf
, area_id
, &p
, cost
);
697 DEFUN (ospf_area_range_cost
,
698 ospf_area_range_cost_cmd
,
699 "area <A.B.C.D|(0-4294967295)> range A.B.C.D/M cost (0-16777215)",
700 "OSPF area parameters\n"
701 "OSPF area ID in IP address format\n"
702 "OSPF area ID as a decimal value\n"
703 "Summarize routes matching address/mask (border routers only)\n"
704 "Area range prefix\n"
705 "User specified metric for this range\n"
706 "Advertised metric for this range\n")
708 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
709 int idx_ipv4_number
= 1;
710 int idx_ipv4_prefixlen
= 3;
712 struct prefix_ipv4 p
;
713 struct in_addr area_id
;
717 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
718 str2prefix_ipv4(argv
[idx_ipv4_prefixlen
]->arg
, &p
);
720 ospf_area_range_set(ospf
, area_id
, &p
, OSPF_AREA_RANGE_ADVERTISE
);
721 ospf_area_display_format_set(ospf
, ospf_area_get(ospf
, area_id
),
724 cost
= strtoul(argv
[idx_cost
]->arg
, NULL
, 10);
725 ospf_area_range_cost_set(ospf
, area_id
, &p
, cost
);
730 DEFUN (ospf_area_range_not_advertise
,
731 ospf_area_range_not_advertise_cmd
,
732 "area <A.B.C.D|(0-4294967295)> range A.B.C.D/M not-advertise",
733 "OSPF area parameters\n"
734 "OSPF area ID in IP address format\n"
735 "OSPF area ID as a decimal value\n"
736 "Summarize routes matching address/mask (border routers only)\n"
737 "Area range prefix\n"
738 "DoNotAdvertise this range\n")
740 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
741 int idx_ipv4_number
= 1;
742 int idx_ipv4_prefixlen
= 3;
743 struct prefix_ipv4 p
;
744 struct in_addr area_id
;
747 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
748 str2prefix_ipv4(argv
[idx_ipv4_prefixlen
]->arg
, &p
);
750 ospf_area_range_set(ospf
, area_id
, &p
, 0);
751 ospf_area_display_format_set(ospf
, ospf_area_get(ospf
, area_id
),
757 DEFUN (no_ospf_area_range
,
758 no_ospf_area_range_cmd
,
759 "no area <A.B.C.D|(0-4294967295)> range A.B.C.D/M [<cost (0-16777215)|advertise [cost (0-16777215)]|not-advertise>]",
761 "OSPF area parameters\n"
762 "OSPF area ID in IP address format\n"
763 "OSPF area ID as a decimal value\n"
764 "Summarize routes matching address/mask (border routers only)\n"
765 "Area range prefix\n"
766 "User specified metric for this range\n"
767 "Advertised metric for this range\n"
768 "Advertise this range (default)\n"
769 "User specified metric for this range\n"
770 "Advertised metric for this range\n"
771 "DoNotAdvertise this range\n")
773 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
774 int idx_ipv4_number
= 2;
775 int idx_ipv4_prefixlen
= 4;
776 struct prefix_ipv4 p
;
777 struct in_addr area_id
;
780 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
781 str2prefix_ipv4(argv
[idx_ipv4_prefixlen
]->arg
, &p
);
783 ospf_area_range_unset(ospf
, area_id
, &p
);
788 DEFUN (ospf_area_range_substitute
,
789 ospf_area_range_substitute_cmd
,
790 "area <A.B.C.D|(0-4294967295)> range A.B.C.D/M substitute A.B.C.D/M",
791 "OSPF area parameters\n"
792 "OSPF area ID in IP address format\n"
793 "OSPF area ID as a decimal value\n"
794 "Summarize routes matching address/mask (border routers only)\n"
795 "Area range prefix\n"
796 "Announce area range as another prefix\n"
797 "Network prefix to be announced instead of range\n")
799 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
800 int idx_ipv4_number
= 1;
801 int idx_ipv4_prefixlen
= 3;
802 int idx_ipv4_prefixlen_2
= 5;
803 struct prefix_ipv4 p
, s
;
804 struct in_addr area_id
;
807 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
808 str2prefix_ipv4(argv
[idx_ipv4_prefixlen
]->arg
, &p
);
809 str2prefix_ipv4(argv
[idx_ipv4_prefixlen_2
]->arg
, &s
);
811 ospf_area_range_substitute_set(ospf
, area_id
, &p
, &s
);
812 ospf_area_display_format_set(ospf
, ospf_area_get(ospf
, area_id
),
818 DEFUN (no_ospf_area_range_substitute
,
819 no_ospf_area_range_substitute_cmd
,
820 "no area <A.B.C.D|(0-4294967295)> range A.B.C.D/M substitute A.B.C.D/M",
822 "OSPF area parameters\n"
823 "OSPF area ID in IP address format\n"
824 "OSPF area ID as a decimal value\n"
825 "Summarize routes matching address/mask (border routers only)\n"
826 "Area range prefix\n"
827 "Announce area range as another prefix\n"
828 "Network prefix to be announced instead of range\n")
830 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
831 int idx_ipv4_number
= 2;
832 int idx_ipv4_prefixlen
= 4;
833 int idx_ipv4_prefixlen_2
= 6;
834 struct prefix_ipv4 p
, s
;
835 struct in_addr area_id
;
838 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
839 str2prefix_ipv4(argv
[idx_ipv4_prefixlen
]->arg
, &p
);
840 str2prefix_ipv4(argv
[idx_ipv4_prefixlen_2
]->arg
, &s
);
842 ospf_area_range_substitute_unset(ospf
, area_id
, &p
);
848 /* Command Handler Logic in VLink stuff is delicate!!
850 ALTER AT YOUR OWN RISK!!!!
852 Various dummy values are used to represent 'NoChange' state for
853 VLink configuration NOT being changed by a VLink command, and
854 special syntax is used within the command strings so that the
855 typed in command verbs can be seen in the configuration command
856 bacckend handler. This is to drastically reduce the verbeage
857 required to coe up with a reasonably compatible Cisco VLink command
859 - Matthew Grant <grantma@anathoth.gen.nz>
860 Wed, 21 Feb 2001 15:13:52 +1300
863 /* Configuration data for virtual links
865 struct ospf_vl_config_data
{
866 struct vty
*vty
; /* vty stuff */
867 struct in_addr area_id
; /* area ID from command line */
868 int area_id_fmt
; /* command line area ID format */
869 struct in_addr vl_peer
; /* command line vl_peer */
870 int auth_type
; /* Authehntication type, if given */
871 char *auth_key
; /* simple password if present */
872 int crypto_key_id
; /* Cryptographic key ID */
873 char *md5_key
; /* MD5 authentication key */
874 int hello_interval
; /* Obvious what these are... */
875 int retransmit_interval
;
880 static void ospf_vl_config_data_init(struct ospf_vl_config_data
*vl_config
,
883 memset(vl_config
, 0, sizeof(struct ospf_vl_config_data
));
884 vl_config
->auth_type
= OSPF_AUTH_CMD_NOTSEEN
;
885 vl_config
->vty
= vty
;
888 static struct ospf_vl_data
*
889 ospf_find_vl_data(struct ospf
*ospf
, struct ospf_vl_config_data
*vl_config
)
891 struct ospf_area
*area
;
892 struct ospf_vl_data
*vl_data
;
894 struct in_addr area_id
;
896 vty
= vl_config
->vty
;
897 area_id
= vl_config
->area_id
;
899 if (area_id
.s_addr
== OSPF_AREA_BACKBONE
) {
901 "Configuring VLs over the backbone is not allowed\n");
904 area
= ospf_area_get(ospf
, area_id
);
905 ospf_area_display_format_set(ospf
, area
, vl_config
->area_id_fmt
);
907 if (area
->external_routing
!= OSPF_AREA_DEFAULT
) {
908 if (vl_config
->area_id_fmt
== OSPF_AREA_ID_FMT_DOTTEDQUAD
)
909 vty_out(vty
, "Area %s is %s\n", inet_ntoa(area_id
),
910 area
->external_routing
== OSPF_AREA_NSSA
914 vty_out(vty
, "Area %ld is %s\n",
915 (u_long
)ntohl(area_id
.s_addr
),
916 area
->external_routing
== OSPF_AREA_NSSA
922 if ((vl_data
= ospf_vl_lookup(ospf
, area
, vl_config
->vl_peer
))
924 vl_data
= ospf_vl_data_new(area
, vl_config
->vl_peer
);
925 if (vl_data
->vl_oi
== NULL
) {
926 vl_data
->vl_oi
= ospf_vl_new(ospf
, vl_data
);
927 ospf_vl_add(ospf
, vl_data
);
928 ospf_spf_calculate_schedule(ospf
,
929 SPF_FLAG_CONFIG_CHANGE
);
936 static int ospf_vl_set_security(struct ospf_vl_data
*vl_data
,
937 struct ospf_vl_config_data
*vl_config
)
939 struct crypt_key
*ck
;
941 struct interface
*ifp
= vl_data
->vl_oi
->ifp
;
943 vty
= vl_config
->vty
;
945 if (vl_config
->auth_type
!= OSPF_AUTH_CMD_NOTSEEN
) {
946 SET_IF_PARAM(IF_DEF_PARAMS(ifp
), auth_type
);
947 IF_DEF_PARAMS(ifp
)->auth_type
= vl_config
->auth_type
;
950 if (vl_config
->auth_key
) {
951 memset(IF_DEF_PARAMS(ifp
)->auth_simple
, 0,
952 OSPF_AUTH_SIMPLE_SIZE
+ 1);
953 strncpy((char *)IF_DEF_PARAMS(ifp
)->auth_simple
,
954 vl_config
->auth_key
, OSPF_AUTH_SIMPLE_SIZE
);
955 } else if (vl_config
->md5_key
) {
956 if (ospf_crypt_key_lookup(IF_DEF_PARAMS(ifp
)->auth_crypt
,
957 vl_config
->crypto_key_id
)
959 vty_out(vty
, "OSPF: Key %d already exists\n",
960 vl_config
->crypto_key_id
);
963 ck
= ospf_crypt_key_new();
964 ck
->key_id
= vl_config
->crypto_key_id
;
965 memset(ck
->auth_key
, 0, OSPF_AUTH_MD5_SIZE
+ 1);
966 strncpy((char *)ck
->auth_key
, vl_config
->md5_key
,
969 ospf_crypt_key_add(IF_DEF_PARAMS(ifp
)->auth_crypt
, ck
);
970 } else if (vl_config
->crypto_key_id
!= 0) {
973 if (ospf_crypt_key_lookup(IF_DEF_PARAMS(ifp
)->auth_crypt
,
974 vl_config
->crypto_key_id
)
976 vty_out(vty
, "OSPF: Key %d does not exist\n",
977 vl_config
->crypto_key_id
);
978 return CMD_WARNING_CONFIG_FAILED
;
981 ospf_crypt_key_delete(IF_DEF_PARAMS(ifp
)->auth_crypt
,
982 vl_config
->crypto_key_id
);
988 static int ospf_vl_set_timers(struct ospf_vl_data
*vl_data
,
989 struct ospf_vl_config_data
*vl_config
)
991 struct interface
*ifp
= vl_data
->vl_oi
->ifp
;
992 /* Virtual Link data initialised to defaults, so only set
994 if (vl_config
->hello_interval
) {
995 SET_IF_PARAM(IF_DEF_PARAMS(ifp
), v_hello
);
996 IF_DEF_PARAMS(ifp
)->v_hello
= vl_config
->hello_interval
;
999 if (vl_config
->dead_interval
) {
1000 SET_IF_PARAM(IF_DEF_PARAMS(ifp
), v_wait
);
1001 IF_DEF_PARAMS(ifp
)->v_wait
= vl_config
->dead_interval
;
1004 if (vl_config
->retransmit_interval
) {
1005 SET_IF_PARAM(IF_DEF_PARAMS(ifp
), retransmit_interval
);
1006 IF_DEF_PARAMS(ifp
)->retransmit_interval
=
1007 vl_config
->retransmit_interval
;
1010 if (vl_config
->transmit_delay
) {
1011 SET_IF_PARAM(IF_DEF_PARAMS(ifp
), transmit_delay
);
1012 IF_DEF_PARAMS(ifp
)->transmit_delay
= vl_config
->transmit_delay
;
1019 /* The business end of all of the above */
1020 static int ospf_vl_set(struct ospf
*ospf
, struct ospf_vl_config_data
*vl_config
)
1022 struct ospf_vl_data
*vl_data
;
1025 vl_data
= ospf_find_vl_data(ospf
, vl_config
);
1027 return CMD_WARNING_CONFIG_FAILED
;
1029 /* Process this one first as it can have a fatal result, which can
1030 only logically occur if the virtual link exists already
1031 Thus a command error does not result in a change to the
1032 running configuration such as unexpectedly altered timer
1034 ret
= ospf_vl_set_security(vl_data
, vl_config
);
1035 if (ret
!= CMD_SUCCESS
)
1038 /* Set any time based parameters, these area already range checked */
1040 ret
= ospf_vl_set_timers(vl_data
, vl_config
);
1041 if (ret
!= CMD_SUCCESS
)
1047 /* This stuff exists to make specifying all the alias commands A LOT simpler
1049 #define VLINK_HELPSTR_IPADDR \
1050 "OSPF area parameters\n" \
1051 "OSPF area ID in IP address format\n" \
1052 "OSPF area ID as a decimal value\n" \
1053 "Configure a virtual link\n" \
1054 "Router ID of the remote ABR\n"
1056 #define VLINK_HELPSTR_AUTHTYPE_SIMPLE \
1057 "Enable authentication on this virtual link\n" \
1060 #define VLINK_HELPSTR_AUTHTYPE_ALL \
1061 VLINK_HELPSTR_AUTHTYPE_SIMPLE \
1062 "Use null authentication\n" \
1063 "Use message-digest authentication\n"
1065 #define VLINK_HELPSTR_TIME_PARAM \
1066 "Time between HELLO packets\n" \
1068 "Time between retransmitting lost link state advertisements\n" \
1070 "Link state transmit delay\n" \
1072 "Interval time after which a neighbor is declared down\n" \
1075 #define VLINK_HELPSTR_AUTH_SIMPLE \
1076 "Authentication password (key)\n" \
1077 "The OSPF password (key)\n"
1079 #define VLINK_HELPSTR_AUTH_MD5 \
1080 "Message digest authentication password (key)\n" \
1082 "Use MD5 algorithm\n" \
1083 "The OSPF password (key)\n"
1085 DEFUN (ospf_area_vlink
,
1086 ospf_area_vlink_cmd
,
1087 "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>]",
1088 VLINK_HELPSTR_IPADDR
1089 "Enable authentication on this virtual link\n"
1090 "Use message-digest authentication\n"
1091 "Use null authentication\n"
1092 VLINK_HELPSTR_AUTH_MD5
1093 VLINK_HELPSTR_AUTH_SIMPLE
)
1095 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1096 int idx_ipv4_number
= 1;
1098 struct ospf_vl_config_data vl_config
;
1099 char auth_key
[OSPF_AUTH_SIMPLE_SIZE
+ 1];
1100 char md5_key
[OSPF_AUTH_MD5_SIZE
+ 1];
1104 ospf_vl_config_data_init(&vl_config
, vty
);
1106 /* Read off first 2 parameters and check them */
1107 ret
= str2area_id(argv
[idx_ipv4_number
]->arg
, &vl_config
.area_id
,
1108 &vl_config
.area_id_fmt
);
1110 vty_out(vty
, "OSPF area ID is invalid\n");
1111 return CMD_WARNING_CONFIG_FAILED
;
1114 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &vl_config
.vl_peer
);
1116 vty_out(vty
, "Please specify valid Router ID as a.b.c.d\n");
1117 return CMD_WARNING_CONFIG_FAILED
;
1121 /* Thats all folks! - BUGS B. strikes again!!!*/
1123 return ospf_vl_set(ospf
, &vl_config
);
1126 if (argv_find(argv
, argc
, "authentication", &idx
)) {
1127 /* authentication - this option can only occur
1128 at start of command line */
1129 vl_config
.auth_type
= OSPF_AUTH_SIMPLE
;
1132 if (argv_find(argv
, argc
, "message-digest", &idx
)) {
1133 /* authentication message-digest */
1134 vl_config
.auth_type
= OSPF_AUTH_CRYPTOGRAPHIC
;
1135 } else if (argv_find(argv
, argc
, "null", &idx
)) {
1136 /* "authentication null" */
1137 vl_config
.auth_type
= OSPF_AUTH_NULL
;
1140 if (argv_find(argv
, argc
, "message-digest-key", &idx
)) {
1141 vl_config
.md5_key
= NULL
;
1142 vl_config
.crypto_key_id
= strtol(argv
[idx
+ 1]->arg
, NULL
, 10);
1143 if (vl_config
.crypto_key_id
< 0)
1144 return CMD_WARNING_CONFIG_FAILED
;
1146 memset(md5_key
, 0, OSPF_AUTH_MD5_SIZE
+ 1);
1147 strncpy(md5_key
, argv
[idx
+ 3]->arg
, OSPF_AUTH_MD5_SIZE
);
1148 vl_config
.md5_key
= md5_key
;
1151 if (argv_find(argv
, argc
, "authentication-key", &idx
)) {
1152 memset(auth_key
, 0, OSPF_AUTH_SIMPLE_SIZE
+ 1);
1153 strncpy(auth_key
, argv
[idx
+ 1]->arg
, OSPF_AUTH_SIMPLE_SIZE
);
1154 vl_config
.auth_key
= auth_key
;
1157 /* Action configuration */
1159 return ospf_vl_set(ospf
, &vl_config
);
1162 DEFUN (no_ospf_area_vlink
,
1163 no_ospf_area_vlink_cmd
,
1164 "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>]",
1166 VLINK_HELPSTR_IPADDR
1167 "Enable authentication on this virtual link\n" \
1168 "Use message-digest authentication\n" \
1169 "Use null authentication\n" \
1170 VLINK_HELPSTR_AUTH_MD5
1171 VLINK_HELPSTR_AUTH_SIMPLE
)
1173 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1174 int idx_ipv4_number
= 2;
1176 struct ospf_area
*area
;
1177 struct ospf_vl_config_data vl_config
;
1178 struct ospf_vl_data
*vl_data
= NULL
;
1179 char auth_key
[OSPF_AUTH_SIMPLE_SIZE
+ 1];
1183 ospf_vl_config_data_init(&vl_config
, vty
);
1185 ret
= str2area_id(argv
[idx_ipv4_number
]->arg
, &vl_config
.area_id
,
1188 vty_out(vty
, "OSPF area ID is invalid\n");
1189 return CMD_WARNING_CONFIG_FAILED
;
1192 area
= ospf_area_lookup_by_area_id(ospf
, vl_config
.area_id
);
1194 vty_out(vty
, "Area does not exist\n");
1195 return CMD_WARNING_CONFIG_FAILED
;
1198 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &vl_config
.vl_peer
);
1200 vty_out(vty
, "Please specify valid Router ID as a.b.c.d\n");
1201 return CMD_WARNING_CONFIG_FAILED
;
1205 /* Basic VLink no command */
1206 /* Thats all folks! - BUGS B. strikes again!!!*/
1207 if ((vl_data
= ospf_vl_lookup(ospf
, area
, vl_config
.vl_peer
)))
1208 ospf_vl_delete(ospf
, vl_data
);
1210 ospf_area_check_free(ospf
, vl_config
.area_id
);
1215 /* If we are down here, we are reseting parameters */
1216 /* Deal with other parameters */
1218 if (argv_find(argv
, argc
, "authentication", &idx
)) {
1219 /* authentication - this option can only occur
1220 at start of command line */
1221 vl_config
.auth_type
= OSPF_AUTH_NOTSET
;
1224 if (argv_find(argv
, argc
, "message-digest-key", &idx
)) {
1225 vl_config
.md5_key
= NULL
;
1226 vl_config
.crypto_key_id
= strtol(argv
[idx
+ 1]->arg
, NULL
, 10);
1227 if (vl_config
.crypto_key_id
< 0)
1228 return CMD_WARNING_CONFIG_FAILED
;
1231 if (argv_find(argv
, argc
, "authentication-key", &idx
)) {
1232 /* Reset authentication-key to 0 */
1233 memset(auth_key
, 0, OSPF_AUTH_SIMPLE_SIZE
+ 1);
1234 vl_config
.auth_key
= auth_key
;
1237 /* Action configuration */
1239 return ospf_vl_set(ospf
, &vl_config
);
1242 DEFUN (ospf_area_vlink_intervals
,
1243 ospf_area_vlink_intervals_cmd
,
1244 "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)}",
1245 VLINK_HELPSTR_IPADDR
1246 VLINK_HELPSTR_TIME_PARAM
)
1248 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1249 struct ospf_vl_config_data vl_config
;
1252 ospf_vl_config_data_init(&vl_config
, vty
);
1254 char *area_id
= argv
[1]->arg
;
1255 char *router_id
= argv
[3]->arg
;
1257 ret
= str2area_id(area_id
, &vl_config
.area_id
, &vl_config
.area_id_fmt
);
1259 vty_out(vty
, "OSPF area ID is invalid\n");
1260 return CMD_WARNING_CONFIG_FAILED
;
1263 ret
= inet_aton(router_id
, &vl_config
.vl_peer
);
1265 vty_out(vty
, "Please specify valid Router ID as a.b.c.d\n");
1266 return CMD_WARNING_CONFIG_FAILED
;
1269 for (int idx
= 4; idx
< argc
; idx
++) {
1270 if (strmatch(argv
[idx
]->text
, "hello-interval"))
1271 vl_config
.hello_interval
=
1272 strtol(argv
[++idx
]->arg
, NULL
, 10);
1273 else if (strmatch(argv
[idx
]->text
, "retransmit-interval"))
1274 vl_config
.retransmit_interval
=
1275 strtol(argv
[++idx
]->arg
, NULL
, 10);
1276 else if (strmatch(argv
[idx
]->text
, "transmit-delay"))
1277 vl_config
.transmit_delay
=
1278 strtol(argv
[++idx
]->arg
, NULL
, 10);
1279 else if (strmatch(argv
[idx
]->text
, "dead-interval"))
1280 vl_config
.dead_interval
=
1281 strtol(argv
[++idx
]->arg
, NULL
, 10);
1284 /* Action configuration */
1285 return ospf_vl_set(ospf
, &vl_config
);
1288 DEFUN (no_ospf_area_vlink_intervals
,
1289 no_ospf_area_vlink_intervals_cmd
,
1290 "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)}",
1292 VLINK_HELPSTR_IPADDR
1293 VLINK_HELPSTR_TIME_PARAM
)
1295 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1296 struct ospf_vl_config_data vl_config
;
1299 ospf_vl_config_data_init(&vl_config
, vty
);
1301 char *area_id
= argv
[2]->arg
;
1302 char *router_id
= argv
[4]->arg
;
1304 ret
= str2area_id(area_id
, &vl_config
.area_id
, &vl_config
.area_id_fmt
);
1306 vty_out(vty
, "OSPF area ID is invalid\n");
1307 return CMD_WARNING_CONFIG_FAILED
;
1310 ret
= inet_aton(router_id
, &vl_config
.vl_peer
);
1312 vty_out(vty
, "Please specify valid Router ID as a.b.c.d\n");
1313 return CMD_WARNING_CONFIG_FAILED
;
1316 for (int idx
= 5; idx
< argc
; idx
++) {
1317 if (strmatch(argv
[idx
]->text
, "hello-interval"))
1318 vl_config
.hello_interval
= OSPF_HELLO_INTERVAL_DEFAULT
;
1319 else if (strmatch(argv
[idx
]->text
, "retransmit-interval"))
1320 vl_config
.retransmit_interval
=
1321 OSPF_RETRANSMIT_INTERVAL_DEFAULT
;
1322 else if (strmatch(argv
[idx
]->text
, "transmit-delay"))
1323 vl_config
.transmit_delay
= OSPF_TRANSMIT_DELAY_DEFAULT
;
1324 else if (strmatch(argv
[idx
]->text
, "dead-interval"))
1325 vl_config
.dead_interval
=
1326 OSPF_ROUTER_DEAD_INTERVAL_DEFAULT
;
1329 /* Action configuration */
1330 return ospf_vl_set(ospf
, &vl_config
);
1333 DEFUN (ospf_area_shortcut
,
1334 ospf_area_shortcut_cmd
,
1335 "area <A.B.C.D|(0-4294967295)> shortcut <default|enable|disable>",
1336 "OSPF area parameters\n"
1337 "OSPF area ID in IP address format\n"
1338 "OSPF area ID as a decimal value\n"
1339 "Configure the area's shortcutting mode\n"
1340 "Set default shortcutting behavior\n"
1341 "Enable shortcutting through the area\n"
1342 "Disable shortcutting through the area\n")
1344 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1345 int idx_ipv4_number
= 1;
1346 int idx_enable_disable
= 3;
1347 struct ospf_area
*area
;
1348 struct in_addr area_id
;
1352 VTY_GET_OSPF_AREA_ID_NO_BB("shortcut", area_id
, format
,
1353 argv
[idx_ipv4_number
]->arg
);
1355 area
= ospf_area_get(ospf
, area_id
);
1356 ospf_area_display_format_set(ospf
, area
, format
);
1358 if (strncmp(argv
[idx_enable_disable
]->arg
, "de", 2) == 0)
1359 mode
= OSPF_SHORTCUT_DEFAULT
;
1360 else if (strncmp(argv
[idx_enable_disable
]->arg
, "di", 2) == 0)
1361 mode
= OSPF_SHORTCUT_DISABLE
;
1362 else if (strncmp(argv
[idx_enable_disable
]->arg
, "e", 1) == 0)
1363 mode
= OSPF_SHORTCUT_ENABLE
;
1365 return CMD_WARNING_CONFIG_FAILED
;
1367 ospf_area_shortcut_set(ospf
, area
, mode
);
1369 if (ospf
->abr_type
!= OSPF_ABR_SHORTCUT
)
1371 "Shortcut area setting will take effect "
1372 "only when the router is configured as Shortcut ABR\n");
1377 DEFUN (no_ospf_area_shortcut
,
1378 no_ospf_area_shortcut_cmd
,
1379 "no area <A.B.C.D|(0-4294967295)> shortcut <enable|disable>",
1381 "OSPF area parameters\n"
1382 "OSPF area ID in IP address format\n"
1383 "OSPF area ID as a decimal value\n"
1384 "Deconfigure the area's shortcutting mode\n"
1385 "Deconfigure enabled shortcutting through the area\n"
1386 "Deconfigure disabled shortcutting through the area\n")
1388 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1389 int idx_ipv4_number
= 2;
1390 struct ospf_area
*area
;
1391 struct in_addr area_id
;
1394 VTY_GET_OSPF_AREA_ID_NO_BB("shortcut", area_id
, format
,
1395 argv
[idx_ipv4_number
]->arg
);
1397 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1401 ospf_area_shortcut_unset(ospf
, area
);
1407 DEFUN (ospf_area_stub
,
1409 "area <A.B.C.D|(0-4294967295)> stub",
1410 "OSPF area parameters\n"
1411 "OSPF area ID in IP address format\n"
1412 "OSPF area ID as a decimal value\n"
1413 "Configure OSPF area as stub\n")
1415 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1416 int idx_ipv4_number
= 1;
1417 struct in_addr area_id
;
1420 VTY_GET_OSPF_AREA_ID_NO_BB("stub", area_id
, format
,
1421 argv
[idx_ipv4_number
]->arg
);
1423 ret
= ospf_area_stub_set(ospf
, area_id
);
1424 ospf_area_display_format_set(ospf
, ospf_area_get(ospf
, area_id
),
1428 "First deconfigure all virtual link through this area\n");
1429 return CMD_WARNING_CONFIG_FAILED
;
1432 ospf_area_no_summary_unset(ospf
, area_id
);
1437 DEFUN (ospf_area_stub_no_summary
,
1438 ospf_area_stub_no_summary_cmd
,
1439 "area <A.B.C.D|(0-4294967295)> stub no-summary",
1440 "OSPF stub parameters\n"
1441 "OSPF area ID in IP address format\n"
1442 "OSPF area ID as a decimal value\n"
1443 "Configure OSPF area as stub\n"
1444 "Do not inject inter-area routes into stub\n")
1446 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1447 int idx_ipv4_number
= 1;
1448 struct in_addr area_id
;
1451 VTY_GET_OSPF_AREA_ID_NO_BB("stub", area_id
, format
,
1452 argv
[idx_ipv4_number
]->arg
);
1454 ret
= ospf_area_stub_set(ospf
, area_id
);
1455 ospf_area_display_format_set(ospf
, ospf_area_get(ospf
, area_id
),
1459 "%% Area cannot be stub as it contains a virtual link\n");
1460 return CMD_WARNING_CONFIG_FAILED
;
1463 ospf_area_no_summary_set(ospf
, area_id
);
1468 DEFUN (no_ospf_area_stub
,
1469 no_ospf_area_stub_cmd
,
1470 "no area <A.B.C.D|(0-4294967295)> stub",
1472 "OSPF area parameters\n"
1473 "OSPF area ID in IP address format\n"
1474 "OSPF area ID as a decimal value\n"
1475 "Configure OSPF area as stub\n")
1477 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1478 int idx_ipv4_number
= 2;
1479 struct in_addr area_id
;
1482 VTY_GET_OSPF_AREA_ID_NO_BB("stub", area_id
, format
,
1483 argv
[idx_ipv4_number
]->arg
);
1485 ospf_area_stub_unset(ospf
, area_id
);
1486 ospf_area_no_summary_unset(ospf
, area_id
);
1491 DEFUN (no_ospf_area_stub_no_summary
,
1492 no_ospf_area_stub_no_summary_cmd
,
1493 "no area <A.B.C.D|(0-4294967295)> stub no-summary",
1495 "OSPF area parameters\n"
1496 "OSPF area ID in IP address format\n"
1497 "OSPF area ID as a decimal value\n"
1498 "Configure OSPF area as stub\n"
1499 "Do not inject inter-area routes into area\n")
1501 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1502 int idx_ipv4_number
= 2;
1503 struct in_addr area_id
;
1506 VTY_GET_OSPF_AREA_ID_NO_BB("stub", area_id
, format
,
1507 argv
[idx_ipv4_number
]->arg
);
1508 ospf_area_no_summary_unset(ospf
, area_id
);
1513 static int ospf_area_nssa_cmd_handler(struct vty
*vty
, int argc
,
1514 struct cmd_token
**argv
, int cfg_nosum
,
1517 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1518 struct in_addr area_id
;
1521 VTY_GET_OSPF_AREA_ID_NO_BB("NSSA", area_id
, format
, argv
[1]->arg
);
1523 ret
= ospf_area_nssa_set(ospf
, area_id
);
1524 ospf_area_display_format_set(ospf
, ospf_area_get(ospf
, area_id
),
1528 "%% Area cannot be nssa as it contains a virtual link\n");
1529 return CMD_WARNING_CONFIG_FAILED
;
1533 if (strncmp(argv
[3]->text
, "translate-c", 11) == 0)
1534 ospf_area_nssa_translator_role_set(
1535 ospf
, area_id
, OSPF_NSSA_ROLE_CANDIDATE
);
1536 else if (strncmp(argv
[3]->text
, "translate-n", 11) == 0)
1537 ospf_area_nssa_translator_role_set(
1538 ospf
, area_id
, OSPF_NSSA_ROLE_NEVER
);
1539 else if (strncmp(argv
[3]->text
, "translate-a", 11) == 0)
1540 ospf_area_nssa_translator_role_set(
1541 ospf
, area_id
, OSPF_NSSA_ROLE_ALWAYS
);
1543 ospf_area_nssa_translator_role_set(ospf
, area_id
,
1544 OSPF_NSSA_ROLE_CANDIDATE
);
1549 ospf_area_no_summary_set(ospf
, area_id
);
1551 ospf_area_no_summary_unset(ospf
, area_id
);
1554 ospf_schedule_abr_task(ospf
);
1560 DEFUN (ospf_area_nssa_translate
,
1561 ospf_area_nssa_translate_cmd
,
1562 "area <A.B.C.D|(0-4294967295)> nssa <translate-candidate|translate-never|translate-always>",
1563 "OSPF area parameters\n"
1564 "OSPF area ID in IP address format\n"
1565 "OSPF area ID as a decimal value\n"
1566 "Configure OSPF area as nssa\n"
1567 "Configure NSSA-ABR for translate election (default)\n"
1568 "Configure NSSA-ABR to never translate\n"
1569 "Configure NSSA-ABR to always translate\n")
1571 return ospf_area_nssa_cmd_handler(vty
, argc
, argv
, 0, 0);
1574 DEFUN (ospf_area_nssa
,
1576 "area <A.B.C.D|(0-4294967295)> nssa",
1577 "OSPF area parameters\n"
1578 "OSPF area ID in IP address format\n"
1579 "OSPF area ID as a decimal value\n"
1580 "Configure OSPF area as nssa\n")
1582 return ospf_area_nssa_cmd_handler(vty
, argc
, argv
, 0, 0);
1585 DEFUN (ospf_area_nssa_no_summary
,
1586 ospf_area_nssa_no_summary_cmd
,
1587 "area <A.B.C.D|(0-4294967295)> nssa no-summary",
1588 "OSPF area parameters\n"
1589 "OSPF area ID in IP address format\n"
1590 "OSPF area ID as a decimal value\n"
1591 "Configure OSPF area as nssa\n"
1592 "Do not inject inter-area routes into nssa\n")
1594 int idx_ipv4_number
= 1;
1595 struct in_addr area_id
;
1598 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1599 VTY_GET_OSPF_AREA_ID_NO_BB("NSSA", area_id
, format
,
1600 argv
[idx_ipv4_number
]->arg
);
1602 ospf_area_display_format_set(ospf
, ospf_area_get(ospf
, area_id
),
1604 ospf_area_nssa_no_summary_set(ospf
, area_id
);
1606 ospf_schedule_abr_task(ospf
);
1611 DEFUN (no_ospf_area_nssa_no_summary
,
1612 no_ospf_area_nssa_no_summary_cmd
,
1613 "no area <A.B.C.D|(0-4294967295)> nssa no-summary",
1615 "OSPF area parameters\n"
1616 "OSPF area ID in IP address format\n"
1617 "OSPF area ID as a decimal value\n"
1618 "Configure OSPF area as nssa\n"
1619 "Do not inject inter-area routes into nssa\n")
1621 int idx_ipv4_number
= 2;
1622 struct in_addr area_id
;
1625 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1627 VTY_GET_OSPF_AREA_ID_NO_BB("nssa", area_id
, format
,
1628 argv
[idx_ipv4_number
]->arg
);
1630 ospf_area_display_format_set(ospf
, ospf_area_get(ospf
, area_id
),
1632 ospf_area_no_summary_unset(ospf
, area_id
);
1634 ospf_schedule_abr_task(ospf
);
1639 DEFUN (no_ospf_area_nssa
,
1640 no_ospf_area_nssa_cmd
,
1641 "no area <A.B.C.D|(0-4294967295)> nssa [<translate-candidate|translate-never|translate-always>]",
1643 "OSPF area parameters\n"
1644 "OSPF area ID in IP address format\n"
1645 "OSPF area ID as a decimal value\n"
1646 "Configure OSPF area as nssa\n"
1647 "Configure NSSA-ABR for translate election (default)\n"
1648 "Configure NSSA-ABR to never translate\n"
1649 "Configure NSSA-ABR to always translate\n")
1651 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1652 int idx_ipv4_number
= 2;
1653 struct in_addr area_id
;
1656 VTY_GET_OSPF_AREA_ID_NO_BB("NSSA", area_id
, format
,
1657 argv
[idx_ipv4_number
]->arg
);
1659 ospf_area_nssa_unset(ospf
, area_id
, argc
);
1661 ospf_schedule_abr_task(ospf
);
1667 DEFUN (ospf_area_default_cost
,
1668 ospf_area_default_cost_cmd
,
1669 "area <A.B.C.D|(0-4294967295)> default-cost (0-16777215)",
1670 "OSPF area parameters\n"
1671 "OSPF area ID in IP address format\n"
1672 "OSPF area ID as a decimal value\n"
1673 "Set the summary-default cost of a NSSA or stub area\n"
1674 "Stub's advertised default summary cost\n")
1676 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1677 int idx_ipv4_number
= 1;
1679 struct ospf_area
*area
;
1680 struct in_addr area_id
;
1683 struct prefix_ipv4 p
;
1685 VTY_GET_OSPF_AREA_ID_NO_BB("default-cost", area_id
, format
,
1686 argv
[idx_ipv4_number
]->arg
);
1687 cost
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
1689 area
= ospf_area_get(ospf
, area_id
);
1690 ospf_area_display_format_set(ospf
, area
, format
);
1692 if (area
->external_routing
== OSPF_AREA_DEFAULT
) {
1693 vty_out(vty
, "The area is neither stub, nor NSSA\n");
1694 return CMD_WARNING_CONFIG_FAILED
;
1697 area
->default_cost
= cost
;
1700 p
.prefix
.s_addr
= OSPF_DEFAULT_DESTINATION
;
1702 if (IS_DEBUG_OSPF_EVENT
)
1704 "ospf_abr_announce_stub_defaults(): "
1705 "announcing 0.0.0.0/0 to area %s",
1706 inet_ntoa(area
->area_id
));
1707 ospf_abr_announce_network_to_area(&p
, area
->default_cost
, area
);
1712 DEFUN (no_ospf_area_default_cost
,
1713 no_ospf_area_default_cost_cmd
,
1714 "no area <A.B.C.D|(0-4294967295)> default-cost (0-16777215)",
1716 "OSPF area parameters\n"
1717 "OSPF area ID in IP address format\n"
1718 "OSPF area ID as a decimal value\n"
1719 "Set the summary-default cost of a NSSA or stub area\n"
1720 "Stub's advertised default summary cost\n")
1722 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1723 int idx_ipv4_number
= 2;
1724 struct ospf_area
*area
;
1725 struct in_addr area_id
;
1727 struct prefix_ipv4 p
;
1729 VTY_GET_OSPF_AREA_ID_NO_BB("default-cost", area_id
, format
,
1730 argv
[idx_ipv4_number
]->arg
);
1732 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1736 if (area
->external_routing
== OSPF_AREA_DEFAULT
) {
1737 vty_out(vty
, "The area is neither stub, nor NSSA\n");
1738 return CMD_WARNING_CONFIG_FAILED
;
1741 area
->default_cost
= 1;
1744 p
.prefix
.s_addr
= OSPF_DEFAULT_DESTINATION
;
1746 if (IS_DEBUG_OSPF_EVENT
)
1748 "ospf_abr_announce_stub_defaults(): "
1749 "announcing 0.0.0.0/0 to area %s",
1750 inet_ntoa(area
->area_id
));
1751 ospf_abr_announce_network_to_area(&p
, area
->default_cost
, area
);
1754 ospf_area_check_free(ospf
, area_id
);
1759 DEFUN (ospf_area_export_list
,
1760 ospf_area_export_list_cmd
,
1761 "area <A.B.C.D|(0-4294967295)> export-list NAME",
1762 "OSPF area parameters\n"
1763 "OSPF area ID in IP address format\n"
1764 "OSPF area ID as a decimal value\n"
1765 "Set the filter for networks announced to other areas\n"
1766 "Name of the access-list\n")
1768 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1769 int idx_ipv4_number
= 1;
1770 struct ospf_area
*area
;
1771 struct in_addr area_id
;
1774 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1776 area
= ospf_area_get(ospf
, area_id
);
1777 ospf_area_display_format_set(ospf
, area
, format
);
1778 ospf_area_export_list_set(ospf
, area
, argv
[3]->arg
);
1783 DEFUN (no_ospf_area_export_list
,
1784 no_ospf_area_export_list_cmd
,
1785 "no area <A.B.C.D|(0-4294967295)> export-list NAME",
1787 "OSPF area parameters\n"
1788 "OSPF area ID in IP address format\n"
1789 "OSPF area ID as a decimal value\n"
1790 "Unset the filter for networks announced to other areas\n"
1791 "Name of the access-list\n")
1793 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1794 int idx_ipv4_number
= 2;
1795 struct ospf_area
*area
;
1796 struct in_addr area_id
;
1799 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1801 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1805 ospf_area_export_list_unset(ospf
, area
);
1811 DEFUN (ospf_area_import_list
,
1812 ospf_area_import_list_cmd
,
1813 "area <A.B.C.D|(0-4294967295)> import-list NAME",
1814 "OSPF area parameters\n"
1815 "OSPF area ID in IP address format\n"
1816 "OSPF area ID as a decimal value\n"
1817 "Set the filter for networks from other areas announced to the specified one\n"
1818 "Name of the access-list\n")
1820 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1821 int idx_ipv4_number
= 1;
1822 struct ospf_area
*area
;
1823 struct in_addr area_id
;
1826 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1828 area
= ospf_area_get(ospf
, area_id
);
1829 ospf_area_display_format_set(ospf
, area
, format
);
1830 ospf_area_import_list_set(ospf
, area
, argv
[3]->arg
);
1835 DEFUN (no_ospf_area_import_list
,
1836 no_ospf_area_import_list_cmd
,
1837 "no area <A.B.C.D|(0-4294967295)> import-list NAME",
1839 "OSPF area parameters\n"
1840 "OSPF area ID in IP address format\n"
1841 "OSPF area ID as a decimal value\n"
1842 "Unset the filter for networks announced to other areas\n"
1843 "Name of the access-list\n")
1845 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1846 int idx_ipv4_number
= 2;
1847 struct ospf_area
*area
;
1848 struct in_addr area_id
;
1851 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1853 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1857 ospf_area_import_list_unset(ospf
, area
);
1862 DEFUN (ospf_area_filter_list
,
1863 ospf_area_filter_list_cmd
,
1864 "area <A.B.C.D|(0-4294967295)> filter-list prefix WORD <in|out>",
1865 "OSPF area parameters\n"
1866 "OSPF area ID in IP address format\n"
1867 "OSPF area ID as a decimal value\n"
1868 "Filter networks between OSPF areas\n"
1869 "Filter prefixes between OSPF areas\n"
1870 "Name of an IP prefix-list\n"
1871 "Filter networks sent to this area\n"
1872 "Filter networks sent from this area\n")
1874 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1875 int idx_ipv4_number
= 1;
1878 struct ospf_area
*area
;
1879 struct in_addr area_id
;
1880 struct prefix_list
*plist
;
1883 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1885 area
= ospf_area_get(ospf
, area_id
);
1886 ospf_area_display_format_set(ospf
, area
, format
);
1887 plist
= prefix_list_lookup(AFI_IP
, argv
[idx_word
]->arg
);
1888 if (strncmp(argv
[idx_in_out
]->arg
, "in", 2) == 0) {
1889 PREFIX_LIST_IN(area
) = plist
;
1890 if (PREFIX_NAME_IN(area
))
1891 free(PREFIX_NAME_IN(area
));
1893 PREFIX_NAME_IN(area
) = strdup(argv
[idx_word
]->arg
);
1894 ospf_schedule_abr_task(ospf
);
1896 PREFIX_LIST_OUT(area
) = plist
;
1897 if (PREFIX_NAME_OUT(area
))
1898 free(PREFIX_NAME_OUT(area
));
1900 PREFIX_NAME_OUT(area
) = strdup(argv
[idx_word
]->arg
);
1901 ospf_schedule_abr_task(ospf
);
1907 DEFUN (no_ospf_area_filter_list
,
1908 no_ospf_area_filter_list_cmd
,
1909 "no area <A.B.C.D|(0-4294967295)> filter-list prefix WORD <in|out>",
1911 "OSPF area parameters\n"
1912 "OSPF area ID in IP address format\n"
1913 "OSPF area ID as a decimal value\n"
1914 "Filter networks between OSPF areas\n"
1915 "Filter prefixes between OSPF areas\n"
1916 "Name of an IP prefix-list\n"
1917 "Filter networks sent to this area\n"
1918 "Filter networks sent from this area\n")
1920 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1921 int idx_ipv4_number
= 2;
1924 struct ospf_area
*area
;
1925 struct in_addr area_id
;
1928 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1930 if ((area
= ospf_area_lookup_by_area_id(ospf
, area_id
)) == NULL
)
1933 if (strncmp(argv
[idx_in_out
]->arg
, "in", 2) == 0) {
1934 if (PREFIX_NAME_IN(area
))
1935 if (strcmp(PREFIX_NAME_IN(area
), argv
[idx_word
]->arg
)
1939 PREFIX_LIST_IN(area
) = NULL
;
1940 if (PREFIX_NAME_IN(area
))
1941 free(PREFIX_NAME_IN(area
));
1943 PREFIX_NAME_IN(area
) = NULL
;
1945 ospf_schedule_abr_task(ospf
);
1947 if (PREFIX_NAME_OUT(area
))
1948 if (strcmp(PREFIX_NAME_OUT(area
), argv
[idx_word
]->arg
)
1952 PREFIX_LIST_OUT(area
) = NULL
;
1953 if (PREFIX_NAME_OUT(area
))
1954 free(PREFIX_NAME_OUT(area
));
1956 PREFIX_NAME_OUT(area
) = NULL
;
1958 ospf_schedule_abr_task(ospf
);
1965 DEFUN (ospf_area_authentication_message_digest
,
1966 ospf_area_authentication_message_digest_cmd
,
1967 "[no] area <A.B.C.D|(0-4294967295)> authentication message-digest",
1969 "OSPF area parameters\n"
1970 "OSPF area ID in IP address format\n"
1971 "OSPF area ID as a decimal value\n"
1972 "Enable authentication\n"
1973 "Use message-digest authentication\n")
1975 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1977 struct ospf_area
*area
;
1978 struct in_addr area_id
;
1981 argv_find(argv
, argc
, "area", &idx
);
1982 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx
+ 1]->arg
);
1984 area
= ospf_area_get(ospf
, area_id
);
1985 ospf_area_display_format_set(ospf
, area
, format
);
1986 area
->auth_type
= strmatch(argv
[0]->text
, "no")
1988 : OSPF_AUTH_CRYPTOGRAPHIC
;
1993 DEFUN (ospf_area_authentication
,
1994 ospf_area_authentication_cmd
,
1995 "area <A.B.C.D|(0-4294967295)> authentication",
1996 "OSPF area parameters\n"
1997 "OSPF area ID in IP address format\n"
1998 "OSPF area ID as a decimal value\n"
1999 "Enable authentication\n")
2001 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2002 int idx_ipv4_number
= 1;
2003 struct ospf_area
*area
;
2004 struct in_addr area_id
;
2007 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
2009 area
= ospf_area_get(ospf
, area_id
);
2010 ospf_area_display_format_set(ospf
, area
, format
);
2011 area
->auth_type
= OSPF_AUTH_SIMPLE
;
2016 DEFUN (no_ospf_area_authentication
,
2017 no_ospf_area_authentication_cmd
,
2018 "no area <A.B.C.D|(0-4294967295)> authentication",
2020 "OSPF area parameters\n"
2021 "OSPF area ID in IP address format\n"
2022 "OSPF area ID as a decimal value\n"
2023 "Enable authentication\n")
2025 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2026 int idx_ipv4_number
= 2;
2027 struct ospf_area
*area
;
2028 struct in_addr area_id
;
2031 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
2033 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
2037 area
->auth_type
= OSPF_AUTH_NULL
;
2039 ospf_area_check_free(ospf
, area_id
);
2045 DEFUN (ospf_abr_type
,
2047 "ospf abr-type <cisco|ibm|shortcut|standard>",
2048 "OSPF specific commands\n"
2049 "Set OSPF ABR type\n"
2050 "Alternative ABR, cisco implementation\n"
2051 "Alternative ABR, IBM implementation\n"
2053 "Standard behavior (RFC2328)\n")
2055 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2057 u_char abr_type
= OSPF_ABR_UNKNOWN
;
2059 if (strncmp(argv
[idx_vendor
]->arg
, "c", 1) == 0)
2060 abr_type
= OSPF_ABR_CISCO
;
2061 else if (strncmp(argv
[idx_vendor
]->arg
, "i", 1) == 0)
2062 abr_type
= OSPF_ABR_IBM
;
2063 else if (strncmp(argv
[idx_vendor
]->arg
, "sh", 2) == 0)
2064 abr_type
= OSPF_ABR_SHORTCUT
;
2065 else if (strncmp(argv
[idx_vendor
]->arg
, "st", 2) == 0)
2066 abr_type
= OSPF_ABR_STAND
;
2068 return CMD_WARNING_CONFIG_FAILED
;
2070 /* If ABR type value is changed, schedule ABR task. */
2071 if (ospf
->abr_type
!= abr_type
) {
2072 ospf
->abr_type
= abr_type
;
2073 ospf_schedule_abr_task(ospf
);
2079 DEFUN (no_ospf_abr_type
,
2080 no_ospf_abr_type_cmd
,
2081 "no ospf abr-type <cisco|ibm|shortcut|standard>",
2083 "OSPF specific commands\n"
2084 "Set OSPF ABR type\n"
2085 "Alternative ABR, cisco implementation\n"
2086 "Alternative ABR, IBM implementation\n"
2090 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2092 u_char abr_type
= OSPF_ABR_UNKNOWN
;
2094 if (strncmp(argv
[idx_vendor
]->arg
, "c", 1) == 0)
2095 abr_type
= OSPF_ABR_CISCO
;
2096 else if (strncmp(argv
[idx_vendor
]->arg
, "i", 1) == 0)
2097 abr_type
= OSPF_ABR_IBM
;
2098 else if (strncmp(argv
[idx_vendor
]->arg
, "sh", 2) == 0)
2099 abr_type
= OSPF_ABR_SHORTCUT
;
2100 else if (strncmp(argv
[idx_vendor
]->arg
, "st", 2) == 0)
2101 abr_type
= OSPF_ABR_STAND
;
2103 return CMD_WARNING_CONFIG_FAILED
;
2105 /* If ABR type value is changed, schedule ABR task. */
2106 if (ospf
->abr_type
== abr_type
) {
2107 ospf
->abr_type
= OSPF_ABR_DEFAULT
;
2108 ospf_schedule_abr_task(ospf
);
2114 DEFUN (ospf_log_adjacency_changes
,
2115 ospf_log_adjacency_changes_cmd
,
2116 "log-adjacency-changes",
2117 "Log changes in adjacency state\n")
2119 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2121 SET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_CHANGES
);
2122 UNSET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_DETAIL
);
2126 DEFUN (ospf_log_adjacency_changes_detail
,
2127 ospf_log_adjacency_changes_detail_cmd
,
2128 "log-adjacency-changes detail",
2129 "Log changes in adjacency state\n"
2130 "Log all state changes\n")
2132 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2134 SET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_CHANGES
);
2135 SET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_DETAIL
);
2139 DEFUN (no_ospf_log_adjacency_changes
,
2140 no_ospf_log_adjacency_changes_cmd
,
2141 "no log-adjacency-changes",
2143 "Log changes in adjacency state\n")
2145 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2147 UNSET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_DETAIL
);
2148 UNSET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_CHANGES
);
2152 DEFUN (no_ospf_log_adjacency_changes_detail
,
2153 no_ospf_log_adjacency_changes_detail_cmd
,
2154 "no log-adjacency-changes detail",
2156 "Log changes in adjacency state\n"
2157 "Log all state changes\n")
2159 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2161 UNSET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_DETAIL
);
2165 DEFUN (ospf_compatible_rfc1583
,
2166 ospf_compatible_rfc1583_cmd
,
2167 "compatible rfc1583",
2168 "OSPF compatibility list\n"
2169 "compatible with RFC 1583\n")
2171 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2173 if (!CHECK_FLAG(ospf
->config
, OSPF_RFC1583_COMPATIBLE
)) {
2174 SET_FLAG(ospf
->config
, OSPF_RFC1583_COMPATIBLE
);
2175 ospf_spf_calculate_schedule(ospf
, SPF_FLAG_CONFIG_CHANGE
);
2180 DEFUN (no_ospf_compatible_rfc1583
,
2181 no_ospf_compatible_rfc1583_cmd
,
2182 "no compatible rfc1583",
2184 "OSPF compatibility list\n"
2185 "compatible with RFC 1583\n")
2187 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2189 if (CHECK_FLAG(ospf
->config
, OSPF_RFC1583_COMPATIBLE
)) {
2190 UNSET_FLAG(ospf
->config
, OSPF_RFC1583_COMPATIBLE
);
2191 ospf_spf_calculate_schedule(ospf
, SPF_FLAG_CONFIG_CHANGE
);
2196 ALIAS(ospf_compatible_rfc1583
, ospf_rfc1583_flag_cmd
,
2197 "ospf rfc1583compatibility",
2198 "OSPF specific commands\n"
2199 "Enable the RFC1583Compatibility flag\n")
2201 ALIAS(no_ospf_compatible_rfc1583
, no_ospf_rfc1583_flag_cmd
,
2202 "no ospf rfc1583compatibility", NO_STR
2203 "OSPF specific commands\n"
2204 "Disable the RFC1583Compatibility flag\n")
2206 static int ospf_timers_spf_set(struct vty
*vty
, unsigned int delay
,
2207 unsigned int hold
, unsigned int max
)
2209 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2211 ospf
->spf_delay
= delay
;
2212 ospf
->spf_holdtime
= hold
;
2213 ospf
->spf_max_holdtime
= max
;
2218 DEFUN (ospf_timers_min_ls_interval
,
2219 ospf_timers_min_ls_interval_cmd
,
2220 "timers throttle lsa all (0-5000)",
2221 "Adjust routing timers\n"
2222 "Throttling adaptive timer\n"
2223 "LSA delay between transmissions\n"
2225 "Delay (msec) between sending LSAs\n")
2227 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2229 unsigned int interval
;
2232 vty_out(vty
, "Insufficient arguments\n");
2233 return CMD_WARNING_CONFIG_FAILED
;
2236 interval
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2238 ospf
->min_ls_interval
= interval
;
2243 DEFUN (no_ospf_timers_min_ls_interval
,
2244 no_ospf_timers_min_ls_interval_cmd
,
2245 "no timers throttle lsa all [(0-5000)]",
2247 "Adjust routing timers\n"
2248 "Throttling adaptive timer\n"
2249 "LSA delay between transmissions\n"
2251 "Delay (msec) between sending LSAs\n")
2253 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2254 ospf
->min_ls_interval
= OSPF_MIN_LS_INTERVAL
;
2259 DEFUN (ospf_timers_throttle_spf
,
2260 ospf_timers_throttle_spf_cmd
,
2261 "timers throttle spf (0-600000) (0-600000) (0-600000)",
2262 "Adjust routing timers\n"
2263 "Throttling adaptive timer\n"
2265 "Delay (msec) from first change received till SPF calculation\n"
2266 "Initial hold time (msec) between consecutive SPF calculations\n"
2267 "Maximum hold time (msec)\n")
2270 int idx_number_2
= 4;
2271 int idx_number_3
= 5;
2272 unsigned int delay
, hold
, max
;
2275 vty_out(vty
, "Insufficient arguments\n");
2276 return CMD_WARNING_CONFIG_FAILED
;
2279 delay
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2280 hold
= strtoul(argv
[idx_number_2
]->arg
, NULL
, 10);
2281 max
= strtoul(argv
[idx_number_3
]->arg
, NULL
, 10);
2283 return ospf_timers_spf_set(vty
, delay
, hold
, max
);
2286 DEFUN (no_ospf_timers_throttle_spf
,
2287 no_ospf_timers_throttle_spf_cmd
,
2288 "no timers throttle spf [(0-600000)(0-600000)(0-600000)]",
2290 "Adjust routing timers\n"
2291 "Throttling adaptive timer\n"
2293 "Delay (msec) from first change received till SPF calculation\n"
2294 "Initial hold time (msec) between consecutive SPF calculations\n"
2295 "Maximum hold time (msec)\n")
2297 return ospf_timers_spf_set(vty
, OSPF_SPF_DELAY_DEFAULT
,
2298 OSPF_SPF_HOLDTIME_DEFAULT
,
2299 OSPF_SPF_MAX_HOLDTIME_DEFAULT
);
2303 DEFUN (ospf_timers_lsa_min_arrival
,
2304 ospf_timers_lsa_min_arrival_cmd
,
2305 "timers lsa min-arrival (0-600000)",
2306 "Adjust routing timers\n"
2308 "Minimum delay in receiving new version of a LSA\n"
2309 "Delay in milliseconds\n")
2311 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2312 ospf
->min_ls_arrival
= strtoul(argv
[argc
- 1]->arg
, NULL
, 10);
2316 DEFUN (no_ospf_timers_lsa_min_arrival
,
2317 no_ospf_timers_lsa_min_arrival_cmd
,
2318 "no timers lsa min-arrival [(0-600000)]",
2320 "Adjust routing timers\n"
2322 "Minimum delay in receiving new version of a LSA\n"
2323 "Delay in milliseconds\n")
2325 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2326 unsigned int minarrival
;
2329 minarrival
= strtoul(argv
[argc
- 1]->arg
, NULL
, 10);
2331 if (ospf
->min_ls_arrival
!= minarrival
2332 || minarrival
== OSPF_MIN_LS_ARRIVAL
)
2336 ospf
->min_ls_arrival
= OSPF_MIN_LS_ARRIVAL
;
2341 #if CONFDATE > 20180708
2342 CPP_NOTICE("ospf: `timers lsa arrival (0-1000)` deprecated 2017/07/08")
2344 ALIAS_HIDDEN(ospf_timers_lsa_min_arrival
, ospf_timers_lsa_arrival_cmd
,
2345 "timers lsa arrival (0-1000)",
2346 "adjust routing timers\n"
2347 "throttling link state advertisement delays\n"
2348 "ospf minimum arrival interval delay\n"
2349 "delay (msec) between accepted lsas\n");
2351 #if CONFDATE > 20180708
2352 CPP_NOTICE("ospf: `no timers lsa arrival (0-1000)` deprecated 2017/07/08")
2354 ALIAS_HIDDEN(no_ospf_timers_lsa_min_arrival
, no_ospf_timers_lsa_arrival_cmd
,
2355 "no timers lsa arrival (0-1000)", NO_STR
2356 "adjust routing timers\n"
2357 "throttling link state advertisement delays\n"
2358 "ospf minimum arrival interval delay\n"
2359 "delay (msec) between accepted lsas\n");
2362 DEFUN (ospf_neighbor
,
2364 "neighbor A.B.C.D [priority (0-255) [poll-interval (1-65535)]]",
2366 "Neighbor IP address\n"
2367 "Neighbor Priority\n"
2369 "Dead Neighbor Polling interval\n"
2372 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2376 struct in_addr nbr_addr
;
2377 unsigned int priority
= OSPF_NEIGHBOR_PRIORITY_DEFAULT
;
2378 unsigned int interval
= OSPF_POLL_INTERVAL_DEFAULT
;
2380 if (!inet_aton(argv
[idx_ipv4
]->arg
, &nbr_addr
)) {
2381 vty_out(vty
, "Please specify Neighbor ID by A.B.C.D\n");
2382 return CMD_WARNING_CONFIG_FAILED
;
2386 priority
= strtoul(argv
[idx_pri
]->arg
, NULL
, 10);
2389 interval
= strtoul(argv
[idx_poll
]->arg
, NULL
, 10);
2391 ospf_nbr_nbma_set(ospf
, nbr_addr
);
2394 ospf_nbr_nbma_priority_set(ospf
, nbr_addr
, priority
);
2397 ospf_nbr_nbma_poll_interval_set(ospf
, nbr_addr
, interval
);
2402 DEFUN (ospf_neighbor_poll_interval
,
2403 ospf_neighbor_poll_interval_cmd
,
2404 "neighbor A.B.C.D poll-interval (1-65535) [priority (0-255)]",
2406 "Neighbor IP address\n"
2407 "Dead Neighbor Polling interval\n"
2409 "OSPF priority of non-broadcast neighbor\n"
2412 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2416 struct in_addr nbr_addr
;
2417 unsigned int priority
= OSPF_NEIGHBOR_PRIORITY_DEFAULT
;
2418 unsigned int interval
= OSPF_POLL_INTERVAL_DEFAULT
;
2420 if (!inet_aton(argv
[idx_ipv4
]->arg
, &nbr_addr
)) {
2421 vty_out(vty
, "Please specify Neighbor ID by A.B.C.D\n");
2422 return CMD_WARNING_CONFIG_FAILED
;
2425 interval
= strtoul(argv
[idx_poll
]->arg
, NULL
, 10);
2428 priority
= strtoul(argv
[idx_pri
]->arg
, NULL
, 10);
2430 ospf_nbr_nbma_set(ospf
, nbr_addr
);
2431 ospf_nbr_nbma_poll_interval_set(ospf
, nbr_addr
, interval
);
2434 ospf_nbr_nbma_priority_set(ospf
, nbr_addr
, priority
);
2439 DEFUN (no_ospf_neighbor
,
2440 no_ospf_neighbor_cmd
,
2441 "no neighbor A.B.C.D [priority (0-255) [poll-interval (1-65525)]]",
2444 "Neighbor IP address\n"
2445 "Neighbor Priority\n"
2447 "Dead Neighbor Polling interval\n"
2450 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2452 struct in_addr nbr_addr
;
2454 if (!inet_aton(argv
[idx_ipv4
]->arg
, &nbr_addr
)) {
2455 vty_out(vty
, "Please specify Neighbor ID by A.B.C.D\n");
2456 return CMD_WARNING_CONFIG_FAILED
;
2459 (void)ospf_nbr_nbma_unset(ospf
, nbr_addr
);
2464 DEFUN (no_ospf_neighbor_poll
,
2465 no_ospf_neighbor_poll_cmd
,
2466 "no neighbor A.B.C.D poll-interval (1-65535) [priority (0-255)]",
2469 "Neighbor IP address\n"
2470 "Dead Neighbor Polling interval\n"
2472 "Neighbor Priority\n"
2475 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2477 struct in_addr nbr_addr
;
2479 if (!inet_aton(argv
[idx_ipv4
]->arg
, &nbr_addr
)) {
2480 vty_out(vty
, "Please specify Neighbor ID by A.B.C.D\n");
2481 return CMD_WARNING_CONFIG_FAILED
;
2484 (void)ospf_nbr_nbma_unset(ospf
, nbr_addr
);
2489 DEFUN (ospf_refresh_timer
,
2490 ospf_refresh_timer_cmd
,
2491 "refresh timer (10-1800)",
2492 "Adjust refresh parameters\n"
2493 "Set refresh timer\n"
2494 "Timer value in seconds\n")
2496 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2498 unsigned int interval
;
2500 interval
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2501 interval
= (interval
/ OSPF_LSA_REFRESHER_GRANULARITY
)
2502 * OSPF_LSA_REFRESHER_GRANULARITY
;
2504 ospf_timers_refresh_set(ospf
, interval
);
2509 DEFUN (no_ospf_refresh_timer
,
2510 no_ospf_refresh_timer_val_cmd
,
2511 "no refresh timer [(10-1800)]",
2513 "Adjust refresh parameters\n"
2514 "Unset refresh timer\n"
2515 "Timer value in seconds\n")
2517 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2519 unsigned int interval
;
2522 interval
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2524 if (ospf
->lsa_refresh_interval
!= interval
2525 || interval
== OSPF_LSA_REFRESH_INTERVAL_DEFAULT
)
2529 ospf_timers_refresh_unset(ospf
);
2535 DEFUN (ospf_auto_cost_reference_bandwidth
,
2536 ospf_auto_cost_reference_bandwidth_cmd
,
2537 "auto-cost reference-bandwidth (1-4294967)",
2538 "Calculate OSPF interface cost according to bandwidth\n"
2539 "Use reference bandwidth method to assign OSPF cost\n"
2540 "The reference bandwidth in terms of Mbits per second\n")
2542 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2543 struct vrf
*vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
2546 struct interface
*ifp
;
2548 refbw
= strtol(argv
[idx_number
]->arg
, NULL
, 10);
2549 if (refbw
< 1 || refbw
> 4294967) {
2550 vty_out(vty
, "reference-bandwidth value is invalid\n");
2551 return CMD_WARNING_CONFIG_FAILED
;
2554 /* If reference bandwidth is changed. */
2555 if ((refbw
) == ospf
->ref_bandwidth
)
2558 ospf
->ref_bandwidth
= refbw
;
2559 FOR_ALL_INTERFACES (vrf
, ifp
)
2560 ospf_if_recalculate_output_cost(ifp
);
2565 DEFUN (no_ospf_auto_cost_reference_bandwidth
,
2566 no_ospf_auto_cost_reference_bandwidth_cmd
,
2567 "no auto-cost reference-bandwidth [(1-4294967)]",
2569 "Calculate OSPF interface cost according to bandwidth\n"
2570 "Use reference bandwidth method to assign OSPF cost\n"
2571 "The reference bandwidth in terms of Mbits per second\n")
2573 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2574 struct vrf
*vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
2575 struct interface
*ifp
;
2577 if (ospf
->ref_bandwidth
== OSPF_DEFAULT_REF_BANDWIDTH
)
2580 ospf
->ref_bandwidth
= OSPF_DEFAULT_REF_BANDWIDTH
;
2581 vty_out(vty
, "%% OSPF: Reference bandwidth is changed.\n");
2583 " Please ensure reference bandwidth is consistent across all routers\n");
2585 FOR_ALL_INTERFACES (vrf
, ifp
)
2586 ospf_if_recalculate_output_cost(ifp
);
2591 DEFUN (ospf_write_multiplier
,
2592 ospf_write_multiplier_cmd
,
2593 "ospf write-multiplier (1-100)",
2594 "OSPF specific commands\n"
2595 "Write multiplier\n"
2596 "Maximum number of interface serviced per write\n")
2598 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2600 u_int32_t write_oi_count
;
2607 write_oi_count
= strtol(argv
[idx_number
]->arg
, NULL
, 10);
2608 if (write_oi_count
< 1 || write_oi_count
> 100) {
2609 vty_out(vty
, "write-multiplier value is invalid\n");
2610 return CMD_WARNING_CONFIG_FAILED
;
2613 ospf
->write_oi_count
= write_oi_count
;
2617 ALIAS(ospf_write_multiplier
, write_multiplier_cmd
, "write-multiplier (1-100)",
2618 "Write multiplier\n"
2619 "Maximum number of interface serviced per write\n")
2621 DEFUN (no_ospf_write_multiplier
,
2622 no_ospf_write_multiplier_cmd
,
2623 "no ospf write-multiplier (1-100)",
2625 "OSPF specific commands\n"
2626 "Write multiplier\n"
2627 "Maximum number of interface serviced per write\n")
2629 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2631 ospf
->write_oi_count
= OSPF_WRITE_INTERFACE_COUNT_DEFAULT
;
2635 ALIAS(no_ospf_write_multiplier
, no_write_multiplier_cmd
,
2636 "no write-multiplier (1-100)", NO_STR
2637 "Write multiplier\n"
2638 "Maximum number of interface serviced per write\n")
2640 const char *ospf_abr_type_descr_str
[] = {"Unknown", "Standard (RFC2328)",
2641 "Alternative IBM", "Alternative Cisco",
2642 "Alternative Shortcut"};
2644 const char *ospf_shortcut_mode_descr_str
[] = {"Default", "Enabled", "Disabled"};
2646 static void show_ip_ospf_area(struct vty
*vty
, struct ospf_area
*area
,
2647 json_object
*json_areas
, u_char use_json
)
2649 json_object
*json_area
= NULL
;
2652 json_area
= json_object_new_object();
2656 vty_out(vty
, " Area ID: %s", inet_ntoa(area
->area_id
));
2658 /* Show Area type/mode. */
2659 if (OSPF_IS_AREA_BACKBONE(area
)) {
2661 json_object_boolean_true_add(json_area
, "backbone");
2663 vty_out(vty
, " (Backbone)\n");
2666 if (area
->external_routing
== OSPF_AREA_STUB
) {
2667 if (area
->no_summary
)
2668 json_object_boolean_true_add(
2669 json_area
, "stubNoSummary");
2670 if (area
->shortcut_configured
)
2671 json_object_boolean_true_add(
2672 json_area
, "stubShortcut");
2673 } else if (area
->external_routing
== OSPF_AREA_NSSA
) {
2674 if (area
->no_summary
)
2675 json_object_boolean_true_add(
2676 json_area
, "nssaNoSummary");
2677 if (area
->shortcut_configured
)
2678 json_object_boolean_true_add(
2679 json_area
, "nssaShortcut");
2682 json_object_string_add(
2683 json_area
, "shortcuttingMode",
2684 ospf_shortcut_mode_descr_str
2685 [area
->shortcut_configured
]);
2686 if (area
->shortcut_capability
)
2687 json_object_boolean_true_add(json_area
,
2690 if (area
->external_routing
== OSPF_AREA_STUB
)
2691 vty_out(vty
, " (Stub%s%s)",
2692 area
->no_summary
? ", no summary" : "",
2693 area
->shortcut_configured
? "; " : "");
2694 else if (area
->external_routing
== OSPF_AREA_NSSA
)
2695 vty_out(vty
, " (NSSA%s%s)",
2696 area
->no_summary
? ", no summary" : "",
2697 area
->shortcut_configured
? "; " : "");
2700 vty_out(vty
, " Shortcutting mode: %s",
2701 ospf_shortcut_mode_descr_str
2702 [area
->shortcut_configured
]);
2703 vty_out(vty
, ", S-bit consensus: %s\n",
2704 area
->shortcut_capability
? "ok" : "no");
2708 /* Show number of interfaces */
2710 json_object_int_add(json_area
, "areaIfTotalCounter",
2711 listcount(area
->oiflist
));
2712 json_object_int_add(json_area
, "areaIfActiveCounter",
2716 " Number of interfaces in this area: Total: %d, "
2718 listcount(area
->oiflist
), area
->act_ints
);
2720 if (area
->external_routing
== OSPF_AREA_NSSA
) {
2722 json_object_boolean_true_add(json_area
, "nssa");
2723 if (!IS_OSPF_ABR(area
->ospf
))
2724 json_object_boolean_false_add(json_area
, "abr");
2725 else if (area
->NSSATranslatorState
) {
2726 json_object_boolean_true_add(json_area
, "abr");
2727 if (area
->NSSATranslatorRole
2728 == OSPF_NSSA_ROLE_CANDIDATE
)
2729 json_object_boolean_true_add(
2731 "nssaTranslatorElected");
2732 else if (area
->NSSATranslatorRole
2733 == OSPF_NSSA_ROLE_ALWAYS
)
2734 json_object_boolean_true_add(
2736 "nssaTranslatorAlways");
2738 json_object_boolean_true_add(json_area
, "abr");
2739 if (area
->NSSATranslatorRole
2740 == OSPF_NSSA_ROLE_CANDIDATE
)
2741 json_object_boolean_false_add(
2743 "nssaTranslatorElected");
2745 json_object_boolean_true_add(
2747 "nssaTranslatorNever");
2751 " It is an NSSA configuration. \n Elected NSSA/ABR performs type-7/type-5 LSA translation. \n");
2752 if (!IS_OSPF_ABR(area
->ospf
))
2754 " It is not ABR, therefore not Translator. \n");
2755 else if (area
->NSSATranslatorState
) {
2756 vty_out(vty
, " We are an ABR and ");
2757 if (area
->NSSATranslatorRole
2758 == OSPF_NSSA_ROLE_CANDIDATE
)
2760 "the NSSA Elected Translator. \n");
2761 else if (area
->NSSATranslatorRole
2762 == OSPF_NSSA_ROLE_ALWAYS
)
2764 "always an NSSA Translator. \n");
2766 vty_out(vty
, " We are an ABR, but ");
2767 if (area
->NSSATranslatorRole
2768 == OSPF_NSSA_ROLE_CANDIDATE
)
2770 "not the NSSA Elected Translator. \n");
2773 "never an NSSA Translator. \n");
2778 /* Stub-router state for this area */
2779 if (CHECK_FLAG(area
->stub_router_state
, OSPF_AREA_IS_STUB_ROUTED
)) {
2780 char timebuf
[OSPF_TIME_DUMP_SIZE
];
2783 json_object_boolean_true_add(
2784 json_area
, "originStubMaxDistRouterLsa");
2785 if (CHECK_FLAG(area
->stub_router_state
,
2786 OSPF_AREA_ADMIN_STUB_ROUTED
))
2787 json_object_boolean_true_add(
2788 json_area
, "indefiniteActiveAdmin");
2789 if (area
->t_stub_router
) {
2793 &area
->t_stub_router
->u
.sands
,
2796 json_object_int_add(
2798 "activeStartupRemainderMsecs",
2803 " Originating stub / maximum-distance Router-LSA\n");
2804 if (CHECK_FLAG(area
->stub_router_state
,
2805 OSPF_AREA_ADMIN_STUB_ROUTED
))
2807 " Administratively activated (indefinitely)\n");
2808 if (area
->t_stub_router
)
2810 " Active from startup, %s remaining\n",
2811 ospf_timer_dump(area
->t_stub_router
,
2818 /* Show number of fully adjacent neighbors. */
2819 json_object_int_add(json_area
, "nbrFullAdjacentCounter",
2822 /* Show authentication type. */
2823 if (area
->auth_type
== OSPF_AUTH_NULL
)
2824 json_object_string_add(json_area
, "authentication",
2825 "authenticationNone");
2826 else if (area
->auth_type
== OSPF_AUTH_SIMPLE
)
2827 json_object_string_add(json_area
, "authentication",
2828 "authenticationSimplePassword");
2829 else if (area
->auth_type
== OSPF_AUTH_CRYPTOGRAPHIC
)
2830 json_object_string_add(json_area
, "authentication",
2831 "authenticationMessageDigest");
2833 if (!OSPF_IS_AREA_BACKBONE(area
))
2834 json_object_int_add(json_area
,
2835 "virtualAdjacenciesPassingCounter",
2838 /* Show SPF calculation times. */
2839 json_object_int_add(json_area
, "spfExecutedCounter",
2840 area
->spf_calculation
);
2841 json_object_int_add(json_area
, "lsaNumber", area
->lsdb
->total
);
2842 json_object_int_add(
2843 json_area
, "lsaRouterNumber",
2844 ospf_lsdb_count(area
->lsdb
, OSPF_ROUTER_LSA
));
2845 json_object_int_add(
2846 json_area
, "lsaRouterChecksum",
2847 ospf_lsdb_checksum(area
->lsdb
, OSPF_ROUTER_LSA
));
2848 json_object_int_add(
2849 json_area
, "lsaNetworkNumber",
2850 ospf_lsdb_count(area
->lsdb
, OSPF_NETWORK_LSA
));
2851 json_object_int_add(
2852 json_area
, "lsaNetworkChecksum",
2853 ospf_lsdb_checksum(area
->lsdb
, OSPF_NETWORK_LSA
));
2854 json_object_int_add(
2855 json_area
, "lsaSummaryNumber",
2856 ospf_lsdb_count(area
->lsdb
, OSPF_SUMMARY_LSA
));
2857 json_object_int_add(
2858 json_area
, "lsaSummaryChecksum",
2859 ospf_lsdb_checksum(area
->lsdb
, OSPF_SUMMARY_LSA
));
2860 json_object_int_add(
2861 json_area
, "lsaAsbrNumber",
2862 ospf_lsdb_count(area
->lsdb
, OSPF_ASBR_SUMMARY_LSA
));
2863 json_object_int_add(
2864 json_area
, "lsaAsbrChecksum",
2865 ospf_lsdb_checksum(area
->lsdb
, OSPF_ASBR_SUMMARY_LSA
));
2866 json_object_int_add(
2867 json_area
, "lsaNssaNumber",
2868 ospf_lsdb_count(area
->lsdb
, OSPF_AS_NSSA_LSA
));
2869 json_object_int_add(
2870 json_area
, "lsaNssaChecksum",
2871 ospf_lsdb_checksum(area
->lsdb
, OSPF_AS_NSSA_LSA
));
2873 /* Show number of fully adjacent neighbors. */
2875 " Number of fully adjacent neighbors in this area:"
2879 /* Show authentication type. */
2880 vty_out(vty
, " Area has ");
2881 if (area
->auth_type
== OSPF_AUTH_NULL
)
2882 vty_out(vty
, "no authentication\n");
2883 else if (area
->auth_type
== OSPF_AUTH_SIMPLE
)
2884 vty_out(vty
, "simple password authentication\n");
2885 else if (area
->auth_type
== OSPF_AUTH_CRYPTOGRAPHIC
)
2886 vty_out(vty
, "message digest authentication\n");
2888 if (!OSPF_IS_AREA_BACKBONE(area
))
2890 " Number of full virtual adjacencies going through"
2894 /* Show SPF calculation times. */
2895 vty_out(vty
, " SPF algorithm executed %d times\n",
2896 area
->spf_calculation
);
2898 /* Show number of LSA. */
2899 vty_out(vty
, " Number of LSA %ld\n", area
->lsdb
->total
);
2901 " Number of router LSA %ld. Checksum Sum 0x%08x\n",
2902 ospf_lsdb_count(area
->lsdb
, OSPF_ROUTER_LSA
),
2903 ospf_lsdb_checksum(area
->lsdb
, OSPF_ROUTER_LSA
));
2905 " Number of network LSA %ld. Checksum Sum 0x%08x\n",
2906 ospf_lsdb_count(area
->lsdb
, OSPF_NETWORK_LSA
),
2907 ospf_lsdb_checksum(area
->lsdb
, OSPF_NETWORK_LSA
));
2909 " Number of summary LSA %ld. Checksum Sum 0x%08x\n",
2910 ospf_lsdb_count(area
->lsdb
, OSPF_SUMMARY_LSA
),
2911 ospf_lsdb_checksum(area
->lsdb
, OSPF_SUMMARY_LSA
));
2913 " Number of ASBR summary LSA %ld. Checksum Sum 0x%08x\n",
2914 ospf_lsdb_count(area
->lsdb
, OSPF_ASBR_SUMMARY_LSA
),
2915 ospf_lsdb_checksum(area
->lsdb
, OSPF_ASBR_SUMMARY_LSA
));
2916 vty_out(vty
, " Number of NSSA LSA %ld. Checksum Sum 0x%08x\n",
2917 ospf_lsdb_count(area
->lsdb
, OSPF_AS_NSSA_LSA
),
2918 ospf_lsdb_checksum(area
->lsdb
, OSPF_AS_NSSA_LSA
));
2922 json_object_int_add(
2923 json_area
, "lsaOpaqueLinkNumber",
2924 ospf_lsdb_count(area
->lsdb
, OSPF_OPAQUE_LINK_LSA
));
2925 json_object_int_add(
2926 json_area
, "lsaOpaqueLinkChecksum",
2927 ospf_lsdb_checksum(area
->lsdb
, OSPF_OPAQUE_LINK_LSA
));
2928 json_object_int_add(
2929 json_area
, "lsaOpaqueAreaNumber",
2930 ospf_lsdb_count(area
->lsdb
, OSPF_OPAQUE_AREA_LSA
));
2931 json_object_int_add(
2932 json_area
, "lsaOpaqueAreaChecksum",
2933 ospf_lsdb_checksum(area
->lsdb
, OSPF_OPAQUE_AREA_LSA
));
2936 " Number of opaque link LSA %ld. Checksum Sum 0x%08x\n",
2937 ospf_lsdb_count(area
->lsdb
, OSPF_OPAQUE_LINK_LSA
),
2938 ospf_lsdb_checksum(area
->lsdb
, OSPF_OPAQUE_LINK_LSA
));
2940 " Number of opaque area LSA %ld. Checksum Sum 0x%08x\n",
2941 ospf_lsdb_count(area
->lsdb
, OSPF_OPAQUE_AREA_LSA
),
2942 ospf_lsdb_checksum(area
->lsdb
, OSPF_OPAQUE_AREA_LSA
));
2946 json_object_object_add(json_areas
, inet_ntoa(area
->area_id
),
2952 static int show_ip_ospf_common(struct vty
*vty
, struct ospf
*ospf
,
2953 json_object
*json
, u_char use_vrf
)
2955 struct listnode
*node
, *nnode
;
2956 struct ospf_area
*area
;
2957 struct timeval result
;
2958 char timebuf
[OSPF_TIME_DUMP_SIZE
];
2959 json_object
*json_vrf
= NULL
;
2960 json_object
*json_areas
= NULL
;
2964 json_vrf
= json_object_new_object();
2967 json_areas
= json_object_new_object();
2970 if (ospf
->instance
) {
2972 json_object_int_add(json
, "ospfInstance",
2975 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
2979 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
2981 /* Show Router ID. */
2983 json_object_string_add(json_vrf
, "routerId",
2984 inet_ntoa(ospf
->router_id
));
2986 vty_out(vty
, " OSPF Routing Process, Router ID: %s\n",
2987 inet_ntoa(ospf
->router_id
));
2990 /* Graceful shutdown */
2991 if (ospf
->t_deferred_shutdown
) {
2996 &ospf
->t_deferred_shutdown
->u
.sands
,
2999 json_object_int_add(json_vrf
, "deferredShutdownMsecs",
3003 " Deferred shutdown in progress, %s remaining\n",
3004 ospf_timer_dump(ospf
->t_deferred_shutdown
,
3005 timebuf
, sizeof(timebuf
)));
3009 /* Show capability. */
3011 json_object_boolean_true_add(json_vrf
, "tosRoutesOnly");
3012 json_object_boolean_true_add(json_vrf
, "rfc2328Conform");
3013 if (CHECK_FLAG(ospf
->config
, OSPF_RFC1583_COMPATIBLE
)) {
3014 json_object_boolean_true_add(json_vrf
,
3015 "rfc1583Compatibility");
3018 vty_out(vty
, " Supports only single TOS (TOS0) routes\n");
3019 vty_out(vty
, " This implementation conforms to RFC2328\n");
3020 vty_out(vty
, " RFC1583Compatibility flag is %s\n",
3021 CHECK_FLAG(ospf
->config
, OSPF_RFC1583_COMPATIBLE
)
3027 if (CHECK_FLAG(ospf
->config
, OSPF_OPAQUE_CAPABLE
)) {
3028 json_object_boolean_true_add(json_vrf
, "opaqueCapable");
3031 vty_out(vty
, " OpaqueCapability flag is %s\n",
3032 CHECK_FLAG(ospf
->config
, OSPF_OPAQUE_CAPABLE
)
3037 /* Show stub-router configuration */
3038 if (ospf
->stub_router_startup_time
!= OSPF_STUB_ROUTER_UNCONFIGURED
3039 || ospf
->stub_router_shutdown_time
3040 != OSPF_STUB_ROUTER_UNCONFIGURED
) {
3042 json_object_boolean_true_add(json_vrf
,
3043 "stubAdvertisement");
3044 if (ospf
->stub_router_startup_time
3045 != OSPF_STUB_ROUTER_UNCONFIGURED
)
3046 json_object_int_add(
3047 json_vrf
, "postStartEnabledMsecs",
3048 ospf
->stub_router_startup_time
/ 1000);
3049 if (ospf
->stub_router_shutdown_time
3050 != OSPF_STUB_ROUTER_UNCONFIGURED
)
3051 json_object_int_add(
3052 json_vrf
, "preShutdownEnabledMsecs",
3053 ospf
->stub_router_shutdown_time
/ 1000);
3056 " Stub router advertisement is configured\n");
3057 if (ospf
->stub_router_startup_time
3058 != OSPF_STUB_ROUTER_UNCONFIGURED
)
3060 " Enabled for %us after start-up\n",
3061 ospf
->stub_router_startup_time
);
3062 if (ospf
->stub_router_shutdown_time
3063 != OSPF_STUB_ROUTER_UNCONFIGURED
)
3065 " Enabled for %us prior to full shutdown\n",
3066 ospf
->stub_router_shutdown_time
);
3070 /* Show SPF timers. */
3072 json_object_int_add(json_vrf
, "spfScheduleDelayMsecs",
3074 json_object_int_add(json_vrf
, "holdtimeMinMsecs",
3075 ospf
->spf_holdtime
);
3076 json_object_int_add(json_vrf
, "holdtimeMaxMsecs",
3077 ospf
->spf_max_holdtime
);
3078 json_object_int_add(json_vrf
, "holdtimeMultplier",
3079 ospf
->spf_hold_multiplier
);
3082 " Initial SPF scheduling delay %d millisec(s)\n"
3083 " Minimum hold time between consecutive SPFs %d millisec(s)\n"
3084 " Maximum hold time between consecutive SPFs %d millisec(s)\n"
3085 " Hold time multiplier is currently %d\n",
3086 ospf
->spf_delay
, ospf
->spf_holdtime
,
3087 ospf
->spf_max_holdtime
, ospf
->spf_hold_multiplier
);
3091 if (ospf
->ts_spf
.tv_sec
|| ospf
->ts_spf
.tv_usec
) {
3092 long time_store
= 0;
3095 monotime_since(&ospf
->ts_spf
, NULL
) / 1000LL;
3096 json_object_int_add(json_vrf
, "spfLastExecutedMsecs",
3099 time_store
= (1000 * ospf
->ts_spf_duration
.tv_sec
)
3100 + (ospf
->ts_spf_duration
.tv_usec
/ 1000);
3101 json_object_int_add(json_vrf
, "spfLastDurationMsecs",
3104 json_object_boolean_true_add(json_vrf
, "spfHasNotRun");
3106 vty_out(vty
, " SPF algorithm ");
3107 if (ospf
->ts_spf
.tv_sec
|| ospf
->ts_spf
.tv_usec
) {
3108 monotime_since(&ospf
->ts_spf
, &result
);
3109 vty_out(vty
, "last executed %s ago\n",
3110 ospf_timeval_dump(&result
, timebuf
,
3112 vty_out(vty
, " Last SPF duration %s\n",
3113 ospf_timeval_dump(&ospf
->ts_spf_duration
,
3114 timebuf
, sizeof(timebuf
)));
3116 vty_out(vty
, "has not been run\n");
3120 if (ospf
->t_spf_calc
) {
3123 monotime_until(&ospf
->t_spf_calc
->u
.sands
, NULL
)
3125 json_object_int_add(json_vrf
, "spfTimerDueInMsecs",
3129 json_object_int_add(json_vrf
, "lsaMinIntervalMsecs",
3130 ospf
->min_ls_interval
);
3131 json_object_int_add(json_vrf
, "lsaMinArrivalMsecs",
3132 ospf
->min_ls_arrival
);
3133 /* Show write multiplier values */
3134 json_object_int_add(json_vrf
, "writeMultiplier",
3135 ospf
->write_oi_count
);
3136 /* Show refresh parameters. */
3137 json_object_int_add(json_vrf
, "refreshTimerMsecs",
3138 ospf
->lsa_refresh_interval
* 1000);
3140 vty_out(vty
, " SPF timer %s%s\n",
3141 (ospf
->t_spf_calc
? "due in " : "is "),
3142 ospf_timer_dump(ospf
->t_spf_calc
, timebuf
,
3145 vty_out(vty
, " LSA minimum interval %d msecs\n",
3146 ospf
->min_ls_interval
);
3147 vty_out(vty
, " LSA minimum arrival %d msecs\n",
3148 ospf
->min_ls_arrival
);
3150 /* Show write multiplier values */
3151 vty_out(vty
, " Write Multiplier set to %d \n",
3152 ospf
->write_oi_count
);
3154 /* Show refresh parameters. */
3155 vty_out(vty
, " Refresh timer %d secs\n",
3156 ospf
->lsa_refresh_interval
);
3159 /* Show ABR/ASBR flags. */
3160 if (CHECK_FLAG(ospf
->flags
, OSPF_FLAG_ABR
)) {
3162 json_object_string_add(
3163 json_vrf
, "abrType",
3164 ospf_abr_type_descr_str
[ospf
->abr_type
]);
3167 " This router is an ABR, ABR type is: %s\n",
3168 ospf_abr_type_descr_str
[ospf
->abr_type
]);
3170 if (CHECK_FLAG(ospf
->flags
, OSPF_FLAG_ASBR
)) {
3172 json_object_string_add(
3173 json_vrf
, "asbrRouter",
3174 "injectingExternalRoutingInformation");
3177 " This router is an ASBR "
3178 "(injecting external routing information)\n");
3181 /* Show Number of AS-external-LSAs. */
3183 json_object_int_add(
3184 json_vrf
, "lsaExternalCounter",
3185 ospf_lsdb_count(ospf
->lsdb
, OSPF_AS_EXTERNAL_LSA
));
3186 json_object_int_add(
3187 json_vrf
, "lsaExternalChecksum",
3188 ospf_lsdb_checksum(ospf
->lsdb
, OSPF_AS_EXTERNAL_LSA
));
3191 " Number of external LSA %ld. Checksum Sum 0x%08x\n",
3192 ospf_lsdb_count(ospf
->lsdb
, OSPF_AS_EXTERNAL_LSA
),
3193 ospf_lsdb_checksum(ospf
->lsdb
, OSPF_AS_EXTERNAL_LSA
));
3197 json_object_int_add(
3198 json_vrf
, "lsaAsopaqueCounter",
3199 ospf_lsdb_count(ospf
->lsdb
, OSPF_OPAQUE_AS_LSA
));
3200 json_object_int_add(
3201 json_vrf
, "lsaAsOpaqueChecksum",
3202 ospf_lsdb_checksum(ospf
->lsdb
, OSPF_OPAQUE_AS_LSA
));
3205 " Number of opaque AS LSA %ld. Checksum Sum 0x%08x\n",
3206 ospf_lsdb_count(ospf
->lsdb
, OSPF_OPAQUE_AS_LSA
),
3207 ospf_lsdb_checksum(ospf
->lsdb
, OSPF_OPAQUE_AS_LSA
));
3210 /* Show number of areas attached. */
3212 json_object_int_add(json_vrf
, "attachedAreaCounter",
3213 listcount(ospf
->areas
));
3215 vty_out(vty
, " Number of areas attached to this router: %d\n",
3216 listcount(ospf
->areas
));
3218 if (CHECK_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_CHANGES
)) {
3219 if (CHECK_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_DETAIL
)) {
3221 json_object_boolean_true_add(
3222 json_vrf
, "adjacencyChangesLoggedAll");
3225 " All adjacency changes are logged\n");
3228 json_object_boolean_true_add(
3229 json_vrf
, "adjacencyChangesLogged");
3231 vty_out(vty
, " Adjacency changes are logged\n");
3234 /* Show each area status. */
3235 for (ALL_LIST_ELEMENTS(ospf
->areas
, node
, nnode
, area
))
3236 show_ip_ospf_area(vty
, area
, json_areas
, json
? 1 : 0);
3240 json_object_object_add(json_vrf
, "areas", json_areas
);
3241 if (ospf
->vrf_id
== VRF_DEFAULT
)
3242 json_object_object_add(json
, "default",
3245 json_object_object_add(json
, ospf
->name
,
3248 json_object_object_add(json
, "areas", json_areas
);
3256 DEFUN (show_ip_ospf
,
3258 "show ip ospf [vrf <NAME|all>] [json]",
3261 "OSPF information\n"
3267 u_char uj
= use_json(argc
, argv
);
3268 struct listnode
*node
= NULL
;
3269 char *vrf_name
= NULL
;
3270 bool all_vrf
= FALSE
;
3271 int ret
= CMD_SUCCESS
;
3274 json_object
*json
= NULL
;
3277 if (listcount(om
->ospf
) == 0)
3280 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
3283 json
= json_object_new_object();
3285 /* vrf input is provided could be all or specific vrf*/
3289 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
3290 if (!ospf
->oi_running
)
3292 ret
= show_ip_ospf_common(vty
, ospf
, json
,
3296 vty_out(vty
, "%s\n",
3297 json_object_to_json_string_ext(
3298 json
, JSON_C_TO_STRING_PRETTY
));
3299 json_object_free(json
);
3303 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
3304 if ((ospf
== NULL
) || !ospf
->oi_running
) {
3306 json_object_free(json
);
3310 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
3311 /* Display default ospf (instance 0) info */
3312 if (ospf
== NULL
|| !ospf
->oi_running
) {
3314 json_object_free(json
);
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 u_short instance
= 0;
3345 u_char 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
, u_char use_vrf
,
3691 json_object
*json
, u_char 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
, u_char use_vrf
, u_char 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 u_char 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;
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
);
3979 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
3980 if (ospf
== NULL
|| !ospf
->oi_running
) {
3982 json_object_free(json
);
3985 ret
= show_ip_ospf_interface_common(vty
, ospf
, intf_name
,
3989 /* Display default ospf (instance 0) info */
3990 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
3991 if (ospf
== NULL
|| !ospf
->oi_running
) {
3993 json_object_free(json
);
3996 ret
= show_ip_ospf_interface_common(vty
, ospf
, intf_name
,
4001 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
4002 json
, JSON_C_TO_STRING_PRETTY
));
4003 json_object_free(json
);
4009 DEFUN (show_ip_ospf_instance_interface
,
4010 show_ip_ospf_instance_interface_cmd
,
4011 "show ip ospf (1-65535) interface [INTERFACE] [json]",
4014 "OSPF information\n"
4016 "Interface information\n"
4023 u_short instance
= 0;
4024 u_char uj
= use_json(argc
, argv
);
4025 char *intf_name
= NULL
;
4026 int ret
= CMD_SUCCESS
;
4027 json_object
*json
= NULL
;
4029 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
4030 ospf
= ospf_lookup_instance(instance
);
4032 return CMD_NOT_MY_INSTANCE
;
4034 if (!ospf
->oi_running
)
4038 json
= json_object_new_object();
4040 if (argv_find(argv
, argc
, "INTERFACE", &idx_intf
))
4041 intf_name
= argv
[idx_intf
]->arg
;
4043 ret
= show_ip_ospf_interface_common(vty
, ospf
, intf_name
, 0, json
, uj
);
4046 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
4047 json
, JSON_C_TO_STRING_PRETTY
));
4048 json_object_free(json
);
4054 DEFUN (show_ip_ospf_interface_traffic
,
4055 show_ip_ospf_interface_traffic_cmd
,
4056 "show ip ospf [vrf <NAME|all>] interface traffic [INTERFACE] [json]",
4059 "OSPF information\n"
4062 "Interface information\n"
4063 "Protocol Packet counters\n"
4067 struct ospf
*ospf
= NULL
;
4068 struct listnode
*node
= NULL
;
4069 char *vrf_name
= NULL
, *intf_name
= NULL
;
4070 bool all_vrf
= FALSE
;
4072 int idx_vrf
= 0, idx_intf
= 0;
4073 u_char uj
= use_json(argc
, argv
);
4074 json_object
*json
= NULL
;
4075 int ret
= CMD_SUCCESS
;
4076 int display_once
= 0;
4079 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
4081 if (argv_find(argv
, argc
, "INTERFACE", &idx_intf
))
4082 intf_name
= argv
[idx_intf
]->arg
;
4085 json
= json_object_new_object();
4090 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
4091 if (!ospf
->oi_running
)
4094 ret
= show_ip_ospf_interface_traffic_common(
4095 vty
, ospf
, intf_name
, json
,
4096 display_once
, use_vrf
, uj
);
4101 vty_out(vty
, "%s\n",
4102 json_object_to_json_string_ext(
4103 json
, JSON_C_TO_STRING_PRETTY
));
4104 json_object_free(json
);
4109 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
4110 if (ospf
== NULL
|| !ospf
->oi_running
) {
4112 json_object_free(json
);
4116 ret
= show_ip_ospf_interface_traffic_common(
4117 vty
, ospf
, intf_name
, json
, display_once
, use_vrf
, uj
);
4119 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
4120 if (ospf
== NULL
|| !ospf
->oi_running
) {
4122 json_object_free(json
);
4126 ret
= show_ip_ospf_interface_traffic_common(
4127 vty
, ospf
, intf_name
, json
, display_once
, use_vrf
, uj
);
4131 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
4132 json
, JSON_C_TO_STRING_PRETTY
));
4133 json_object_free(json
);
4140 static void show_ip_ospf_neighbour_header(struct vty
*vty
)
4142 vty_out(vty
, "\n%-15s %3s %-15s %9s %-15s %-20s %5s %5s %5s\n",
4143 "Neighbor ID", "Pri", "State", "Dead Time", "Address",
4144 "Interface", "RXmtL", "RqstL", "DBsmL");
4147 static void show_ip_ospf_neighbor_sub(struct vty
*vty
,
4148 struct ospf_interface
*oi
,
4149 json_object
*json
, u_char use_json
)
4151 struct route_node
*rn
;
4152 struct ospf_neighbor
*nbr
, *prev_nbr
= NULL
;
4154 char timebuf
[OSPF_TIME_DUMP_SIZE
];
4155 json_object
*json_neighbor
= NULL
, *json_neigh_array
= NULL
;
4157 for (rn
= route_top(oi
->nbrs
); rn
; rn
= route_next(rn
)) {
4158 if ((nbr
= rn
->info
)) {
4159 /* Do not show myself. */
4160 if (nbr
== oi
->nbr_self
)
4162 /* Down state is not shown. */
4163 if (nbr
->state
== NSM_Down
)
4166 char neigh_str
[INET_ADDRSTRLEN
];
4169 && !IPV4_ADDR_SAME(&prev_nbr
->src
,
4171 /* Start new neigh list */
4172 json_neigh_array
= NULL
;
4175 if (nbr
->state
== NSM_Attempt
4176 && nbr
->router_id
.s_addr
== 0)
4177 strlcpy(neigh_str
, "neighbor",
4181 inet_ntoa(nbr
->router_id
),
4184 json_object_object_get_ex(json
, neigh_str
,
4187 if (!json_neigh_array
) {
4189 json_object_new_array();
4190 json_object_object_add(
4195 json_neighbor
= json_object_new_object();
4197 ospf_nbr_state_message(nbr
, msgbuf
, 16);
4203 &nbr
->t_inactivity
->u
.sands
,
4207 json_object_int_add(json_neighbor
, "priority",
4209 json_object_string_add(json_neighbor
, "state",
4211 json_object_int_add(json_neighbor
,
4214 json_object_string_add(json_neighbor
, "address",
4215 inet_ntoa(nbr
->src
));
4216 json_object_string_add(json_neighbor
,
4219 json_object_int_add(
4220 json_neighbor
, "retransmitCounter",
4221 ospf_ls_retransmit_count(nbr
));
4222 json_object_int_add(json_neighbor
,
4224 ospf_ls_request_count(nbr
));
4225 json_object_int_add(json_neighbor
,
4227 ospf_db_summary_count(nbr
));
4229 json_object_array_add(json_neigh_array
,
4232 ospf_nbr_state_message(nbr
, msgbuf
, 16);
4234 if (nbr
->state
== NSM_Attempt
4235 && nbr
->router_id
.s_addr
== 0)
4236 vty_out(vty
, "%-15s %3d %-15s ", "-",
4237 nbr
->priority
, msgbuf
);
4239 vty_out(vty
, "%-15s %3d %-15s ",
4240 inet_ntoa(nbr
->router_id
),
4241 nbr
->priority
, msgbuf
);
4243 vty_out(vty
, "%9s ",
4244 ospf_timer_dump(nbr
->t_inactivity
,
4247 vty_out(vty
, "%-15s ", inet_ntoa(nbr
->src
));
4248 vty_out(vty
, "%-20s %5ld %5ld %5d\n",
4250 ospf_ls_retransmit_count(nbr
),
4251 ospf_ls_request_count(nbr
),
4252 ospf_db_summary_count(nbr
));
4259 static int show_ip_ospf_neighbor_common(struct vty
*vty
, struct ospf
*ospf
,
4260 json_object
*json
, u_char use_json
,
4263 struct ospf_interface
*oi
;
4264 struct listnode
*node
;
4265 json_object
*json_vrf
= NULL
;
4266 json_object
*json_nbr_sub
= NULL
;
4270 json_vrf
= json_object_new_object();
4273 json_nbr_sub
= json_object_new_object();
4276 if (ospf
->instance
) {
4278 json_object_int_add(json
, "ospfInstance",
4281 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
4284 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
4286 show_ip_ospf_neighbour_header(vty
);
4288 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
4289 if (ospf_interface_neighbor_count(oi
) == 0)
4291 show_ip_ospf_neighbor_sub(vty
, oi
, json_nbr_sub
, use_json
);
4295 json_object_object_add(json_vrf
, "neighbors", json_nbr_sub
);
4297 if (ospf
->vrf_id
== VRF_DEFAULT
)
4298 json_object_object_add(json
, "default",
4301 json_object_object_add(json
, ospf
->name
,
4310 DEFUN (show_ip_ospf_neighbor
,
4311 show_ip_ospf_neighbor_cmd
,
4312 "show ip ospf [vrf <NAME|all>] neighbor [json]",
4315 "OSPF information\n"
4322 u_char uj
= use_json(argc
, argv
);
4323 struct listnode
*node
= NULL
;
4324 char *vrf_name
= NULL
;
4325 bool all_vrf
= FALSE
;
4326 int ret
= CMD_SUCCESS
;
4330 json_object
*json
= NULL
;
4332 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
4335 json
= json_object_new_object();
4337 /* vrf input is provided could be all or specific vrf*/
4341 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
4342 if (!ospf
->oi_running
)
4344 ret
= show_ip_ospf_neighbor_common(
4345 vty
, ospf
, json
, uj
, use_vrf
);
4349 vty_out(vty
, "%s\n",
4350 json_object_to_json_string_ext(
4351 json
, JSON_C_TO_STRING_PRETTY
));
4352 json_object_free(json
);
4358 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
4359 if (ospf
== NULL
|| !ospf
->oi_running
) {
4361 json_object_free(json
);
4365 /* Display default ospf (instance 0) info */
4366 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
4367 if (ospf
== NULL
|| !ospf
->oi_running
) {
4369 json_object_free(json
);
4375 ret
= show_ip_ospf_neighbor_common(vty
, ospf
, json
, uj
,
4379 vty_out(vty
, "%s\n",
4380 json_object_to_json_string_ext(
4381 json
, JSON_C_TO_STRING_PRETTY
));
4386 json_object_free(json
);
4392 DEFUN (show_ip_ospf_instance_neighbor
,
4393 show_ip_ospf_instance_neighbor_cmd
,
4394 "show ip ospf (1-65535) neighbor [json]",
4397 "OSPF information\n"
4404 u_short instance
= 0;
4405 u_char uj
= use_json(argc
, argv
);
4406 json_object
*json
= NULL
;
4407 int ret
= CMD_SUCCESS
;
4409 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
4410 ospf
= ospf_lookup_instance(instance
);
4412 return CMD_NOT_MY_INSTANCE
;
4414 if (!ospf
->oi_running
)
4418 json
= json_object_new_object();
4420 ret
= show_ip_ospf_neighbor_common(vty
, ospf
, json
, uj
, 0);
4423 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
4424 json
, JSON_C_TO_STRING_PRETTY
));
4425 json_object_free(json
);
4431 static int show_ip_ospf_neighbor_all_common(struct vty
*vty
, struct ospf
*ospf
,
4432 json_object
*json
, u_char use_json
,
4435 struct listnode
*node
;
4436 struct ospf_interface
*oi
;
4437 json_object
*json_vrf
= NULL
;
4438 json_object
*json_neighbor_sub
= NULL
;
4442 json_vrf
= json_object_new_object();
4445 json_neighbor_sub
= json_object_new_object();
4448 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
4450 show_ip_ospf_neighbour_header(vty
);
4452 if (ospf
->instance
) {
4454 json_object_int_add(json_vrf
, "ospfInstance",
4457 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
4460 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
4461 struct listnode
*nbr_node
;
4462 struct ospf_nbr_nbma
*nbr_nbma
;
4464 show_ip_ospf_neighbor_sub(vty
, oi
, json_vrf
, use_json
);
4466 /* print Down neighbor status */
4467 for (ALL_LIST_ELEMENTS_RO(oi
->nbr_nbma
, nbr_node
, nbr_nbma
)) {
4468 if (nbr_nbma
->nbr
== NULL
4469 || nbr_nbma
->nbr
->state
== NSM_Down
) {
4471 json_object_int_add(json_neighbor_sub
,
4473 nbr_nbma
->priority
);
4474 json_object_boolean_true_add(
4477 json_object_string_add(
4481 json_object_int_add(
4483 "nbrNbmaRetransmitCounter", 0);
4484 json_object_int_add(
4486 "nbrNbmaRequestCounter", 0);
4487 json_object_int_add(
4489 "nbrNbmaDbSummaryCounter", 0);
4490 json_object_object_add(
4492 inet_ntoa(nbr_nbma
->addr
),
4495 vty_out(vty
, "%-15s %3d %-15s %9s ",
4496 "-", nbr_nbma
->priority
, "Down",
4499 "%-15s %-20s %5d %5d %5d\n",
4500 inet_ntoa(nbr_nbma
->addr
),
4501 IF_NAME(oi
), 0, 0, 0);
4509 if (ospf
->vrf_id
== VRF_DEFAULT
)
4510 json_object_object_add(json
, "default",
4513 json_object_object_add(json
, ospf
->name
,
4522 DEFUN (show_ip_ospf_neighbor_all
,
4523 show_ip_ospf_neighbor_all_cmd
,
4524 "show ip ospf [vrf <NAME|all>] neighbor all [json]",
4527 "OSPF information\n"
4531 "include down status neighbor\n"
4535 u_char uj
= use_json(argc
, argv
);
4536 struct listnode
*node
= NULL
;
4537 char *vrf_name
= NULL
;
4538 bool all_vrf
= FALSE
;
4539 int ret
= CMD_SUCCESS
;
4543 json_object
*json
= NULL
;
4545 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
4548 json
= json_object_new_object();
4550 /* vrf input is provided could be all or specific vrf*/
4554 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
4555 if (!ospf
->oi_running
)
4557 ret
= show_ip_ospf_neighbor_all_common(
4558 vty
, ospf
, json
, uj
, use_vrf
);
4562 vty_out(vty
, "%s\n",
4563 json_object_to_json_string_ext(
4564 json
, JSON_C_TO_STRING_PRETTY
));
4565 json_object_free(json
);
4571 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
4572 if (ospf
== NULL
|| !ospf
->oi_running
) {
4574 json_object_free(json
);
4578 /* Display default ospf (instance 0) info */
4579 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
4580 if (ospf
== NULL
|| !ospf
->oi_running
) {
4582 json_object_free(json
);
4588 ret
= show_ip_ospf_neighbor_all_common(vty
, ospf
, json
, uj
,
4591 vty_out(vty
, "%s\n",
4592 json_object_to_json_string_ext(
4593 json
, JSON_C_TO_STRING_PRETTY
));
4598 json_object_free(json
);
4603 DEFUN (show_ip_ospf_instance_neighbor_all
,
4604 show_ip_ospf_instance_neighbor_all_cmd
,
4605 "show ip ospf (1-65535) neighbor all [json]",
4608 "OSPF information\n"
4611 "include down status neighbor\n"
4616 u_short instance
= 0;
4617 u_char uj
= use_json(argc
, argv
);
4618 json_object
*json
= NULL
;
4619 int ret
= CMD_SUCCESS
;
4621 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
4622 ospf
= ospf_lookup_instance(instance
);
4624 return CMD_NOT_MY_INSTANCE
;
4626 if (!ospf
->oi_running
)
4629 json
= json_object_new_object();
4631 ret
= show_ip_ospf_neighbor_all_common(vty
, ospf
, json
, uj
, 0);
4634 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
4635 json
, JSON_C_TO_STRING_PRETTY
));
4636 json_object_free(json
);
4642 static int show_ip_ospf_neighbor_int_common(struct vty
*vty
, struct ospf
*ospf
,
4644 struct cmd_token
**argv
,
4645 u_char use_json
, u_char use_vrf
)
4647 struct interface
*ifp
;
4648 struct route_node
*rn
;
4649 json_object
*json
= NULL
;
4652 json
= json_object_new_object();
4654 if (ospf
->instance
) {
4656 json_object_int_add(json
, "ospfInstance",
4659 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
4662 ospf_show_vrf_name(ospf
, vty
, json
, use_vrf
);
4664 ifp
= if_lookup_by_name_all_vrf(argv
[arg_base
]->arg
);
4667 json_object_boolean_true_add(json
, "noSuchIface");
4669 vty_out(vty
, "No such interface.\n");
4673 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
4674 struct ospf_interface
*oi
= rn
->info
;
4679 show_ip_ospf_neighbor_sub(vty
, oi
, json
, use_json
);
4683 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
4684 json
, JSON_C_TO_STRING_PRETTY
));
4685 json_object_free(json
);
4692 DEFUN (show_ip_ospf_neighbor_int
,
4693 show_ip_ospf_neighbor_int_cmd
,
4694 "show ip ospf neighbor IFNAME [json]",
4697 "OSPF information\n"
4704 u_char uj
= use_json(argc
, argv
);
4705 struct listnode
*node
= NULL
;
4706 int ret
= CMD_SUCCESS
;
4707 struct interface
*ifp
= NULL
;
4710 show_ip_ospf_neighbour_header(vty
);
4712 ifp
= if_lookup_by_name_all_vrf(argv
[idx_ifname
]->arg
);
4713 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
4714 if (!ospf
->oi_running
)
4716 if (!ifp
|| ifp
->vrf_id
!= ospf
->vrf_id
)
4718 ret
= show_ip_ospf_neighbor_int_common(vty
, ospf
, idx_ifname
,
4725 DEFUN (show_ip_ospf_instance_neighbor_int
,
4726 show_ip_ospf_instance_neighbor_int_cmd
,
4727 "show ip ospf (1-65535) neighbor IFNAME [json]",
4730 "OSPF information\n"
4739 u_short instance
= 0;
4740 u_char uj
= use_json(argc
, argv
);
4743 show_ip_ospf_neighbour_header(vty
);
4745 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
4746 ospf
= ospf_lookup_instance(instance
);
4748 return CMD_NOT_MY_INSTANCE
;
4750 if (!ospf
->oi_running
)
4754 show_ip_ospf_neighbour_header(vty
);
4756 return show_ip_ospf_neighbor_int_common(vty
, ospf
, idx_ifname
, argv
, uj
,
4760 static void show_ip_ospf_nbr_nbma_detail_sub(struct vty
*vty
,
4761 struct ospf_interface
*oi
,
4762 struct ospf_nbr_nbma
*nbr_nbma
,
4763 u_char use_json
, json_object
*json
)
4765 char timebuf
[OSPF_TIME_DUMP_SIZE
];
4766 json_object
*json_sub
= NULL
;
4769 json_sub
= json_object_new_object();
4770 else /* Show neighbor ID. */
4771 vty_out(vty
, " Neighbor %s,", "-");
4773 /* Show interface address. */
4775 json_object_string_add(json_sub
, "ifaceAddress",
4776 inet_ntoa(nbr_nbma
->addr
));
4778 vty_out(vty
, " interface address %s\n",
4779 inet_ntoa(nbr_nbma
->addr
));
4783 json_object_string_add(json_sub
, "areaId",
4784 ospf_area_desc_string(oi
->area
));
4785 json_object_string_add(json_sub
, "iface", IF_NAME(oi
));
4787 vty_out(vty
, " In the area %s via interface %s\n",
4788 ospf_area_desc_string(oi
->area
), IF_NAME(oi
));
4790 /* Show neighbor priority and state. */
4792 json_object_int_add(json_sub
, "nbrPriority",
4793 nbr_nbma
->priority
);
4794 json_object_string_add(json_sub
, "nbrState", "down");
4796 vty_out(vty
, " Neighbor priority is %d, State is %s,",
4797 nbr_nbma
->priority
, "Down");
4799 /* Show state changes. */
4801 json_object_int_add(json_sub
, "stateChangeCounter",
4802 nbr_nbma
->state_change
);
4804 vty_out(vty
, " %d state changes\n", nbr_nbma
->state_change
);
4806 /* Show PollInterval */
4808 json_object_int_add(json_sub
, "pollInterval", nbr_nbma
->v_poll
);
4810 vty_out(vty
, " Poll interval %d\n", nbr_nbma
->v_poll
);
4812 /* Show poll-interval timer. */
4815 time_store
= monotime_until(&nbr_nbma
->t_poll
->u
.sands
, NULL
)
4817 json_object_int_add(json_sub
, "pollIntervalTimerDueMsec",
4820 vty_out(vty
, " Poll timer due in %s\n",
4821 ospf_timer_dump(nbr_nbma
->t_poll
, timebuf
,
4824 /* Show poll-interval timer thread. */
4826 if (nbr_nbma
->t_poll
!= NULL
)
4827 json_object_string_add(json_sub
,
4828 "pollIntervalTimerThread", "on");
4830 vty_out(vty
, " Thread Poll Timer %s\n",
4831 nbr_nbma
->t_poll
!= NULL
? "on" : "off");
4834 json_object_object_add(json
, "noNbrId", json_sub
);
4837 static void show_ip_ospf_neighbor_detail_sub(struct vty
*vty
,
4838 struct ospf_interface
*oi
,
4839 struct ospf_neighbor
*nbr
,
4840 json_object
*json
, u_char use_json
)
4842 char timebuf
[OSPF_TIME_DUMP_SIZE
];
4843 json_object
*json_sub
= NULL
;
4846 json_sub
= json_object_new_object();
4848 /* Show neighbor ID. */
4849 if (nbr
->state
== NSM_Attempt
&& nbr
->router_id
.s_addr
== 0)
4850 vty_out(vty
, " Neighbor %s,", "-");
4852 vty_out(vty
, " Neighbor %s,",
4853 inet_ntoa(nbr
->router_id
));
4856 /* Show interface address. */
4858 json_object_string_add(json_sub
, "ifaceAddress",
4859 inet_ntoa(nbr
->address
.u
.prefix4
));
4861 vty_out(vty
, " interface address %s\n",
4862 inet_ntoa(nbr
->address
.u
.prefix4
));
4866 json_object_string_add(json_sub
, "areaId",
4867 ospf_area_desc_string(oi
->area
));
4868 json_object_string_add(json_sub
, "ifaceName", oi
->ifp
->name
);
4870 vty_out(vty
, " In the area %s via interface %s\n",
4871 ospf_area_desc_string(oi
->area
), oi
->ifp
->name
);
4873 /* Show neighbor priority and state. */
4875 json_object_int_add(json_sub
, "nbrPriority", nbr
->priority
);
4876 json_object_string_add(
4877 json_sub
, "nbrState",
4878 lookup_msg(ospf_nsm_state_msg
, nbr
->state
, NULL
));
4880 vty_out(vty
, " Neighbor priority is %d, State is %s,",
4882 lookup_msg(ospf_nsm_state_msg
, nbr
->state
, NULL
));
4884 /* Show state changes. */
4886 json_object_int_add(json_sub
, "stateChangeCounter",
4889 vty_out(vty
, " %d state changes\n", nbr
->state_change
);
4891 if (nbr
->ts_last_progress
.tv_sec
|| nbr
->ts_last_progress
.tv_usec
) {
4896 monotime_since(&nbr
->ts_last_progress
, &res
) / 1000LL;
4898 json_object_int_add(json_sub
, "lastPrgrsvChangeMsec",
4902 " Most recent state change statistics:\n");
4903 vty_out(vty
, " Progressive change %s ago\n",
4904 ospf_timeval_dump(&res
, timebuf
,
4909 if (nbr
->ts_last_regress
.tv_sec
|| nbr
->ts_last_regress
.tv_usec
) {
4914 monotime_since(&nbr
->ts_last_regress
, &res
) / 1000LL;
4916 json_object_int_add(json_sub
,
4917 "lastRegressiveChangeMsec",
4919 if (nbr
->last_regress_str
)
4920 json_object_string_add(
4921 json_sub
, "lastRegressiveChangeReason",
4922 nbr
->last_regress_str
);
4925 " Regressive change %s ago, due to %s\n",
4926 ospf_timeval_dump(&res
, timebuf
,
4928 (nbr
->last_regress_str
? nbr
->last_regress_str
4933 /* Show Designated Rotuer ID. */
4935 json_object_string_add(json_sub
, "routerDesignatedId",
4936 inet_ntoa(nbr
->d_router
));
4938 vty_out(vty
, " DR is %s,", inet_ntoa(nbr
->d_router
));
4940 /* Show Backup Designated Rotuer ID. */
4942 json_object_string_add(json_sub
, "routerDesignatedBackupId",
4943 inet_ntoa(nbr
->bd_router
));
4945 vty_out(vty
, " BDR is %s\n", inet_ntoa(nbr
->bd_router
));
4949 json_object_int_add(json_sub
, "optionsCounter", nbr
->options
);
4950 json_object_string_add(json_sub
, "optionsList",
4951 ospf_options_dump(nbr
->options
));
4953 vty_out(vty
, " Options %d %s\n", nbr
->options
,
4954 ospf_options_dump(nbr
->options
));
4956 /* Show Router Dead interval timer. */
4958 if (nbr
->t_inactivity
) {
4960 time_store
= monotime_until(&nbr
->t_inactivity
->u
.sands
,
4963 json_object_int_add(json_sub
,
4964 "routerDeadIntervalTimerDueMsec",
4967 json_object_int_add(
4968 json_sub
, "routerDeadIntervalTimerDueMsec", -1);
4970 vty_out(vty
, " Dead timer due in %s\n",
4971 ospf_timer_dump(nbr
->t_inactivity
, timebuf
,
4974 /* Show Database Summary list. */
4976 json_object_int_add(json_sub
, "databaseSummaryListCounter",
4977 ospf_db_summary_count(nbr
));
4979 vty_out(vty
, " Database Summary List %d\n",
4980 ospf_db_summary_count(nbr
));
4982 /* Show Link State Request list. */
4984 json_object_int_add(json_sub
, "linkStateRequestListCounter",
4985 ospf_ls_request_count(nbr
));
4987 vty_out(vty
, " Link State Request List %ld\n",
4988 ospf_ls_request_count(nbr
));
4990 /* Show Link State Retransmission list. */
4992 json_object_int_add(json_sub
,
4993 "linkStateRetransmissionListCounter",
4994 ospf_ls_retransmit_count(nbr
));
4996 vty_out(vty
, " Link State Retransmission List %ld\n",
4997 ospf_ls_retransmit_count(nbr
));
4999 /* Show inactivity timer thread. */
5001 if (nbr
->t_inactivity
!= NULL
)
5002 json_object_string_add(json_sub
,
5003 "threadInactivityTimer", "on");
5005 vty_out(vty
, " Thread Inactivity Timer %s\n",
5006 nbr
->t_inactivity
!= NULL
? "on" : "off");
5008 /* Show Database Description retransmission thread. */
5010 if (nbr
->t_db_desc
!= NULL
)
5011 json_object_string_add(
5013 "threadDatabaseDescriptionRetransmission",
5017 " Thread Database Description Retransmision %s\n",
5018 nbr
->t_db_desc
!= NULL
? "on" : "off");
5020 /* Show Link State Request Retransmission thread. */
5022 if (nbr
->t_ls_req
!= NULL
)
5023 json_object_string_add(
5025 "threadLinkStateRequestRetransmission", "on");
5028 " Thread Link State Request Retransmission %s\n",
5029 nbr
->t_ls_req
!= NULL
? "on" : "off");
5031 /* Show Link State Update Retransmission thread. */
5033 if (nbr
->t_ls_upd
!= NULL
)
5034 json_object_string_add(
5035 json_sub
, "threadLinkStateUpdateRetransmission",
5039 " Thread Link State Update Retransmission %s\n\n",
5040 nbr
->t_ls_upd
!= NULL
? "on" : "off");
5043 if (nbr
->state
== NSM_Attempt
&& nbr
->router_id
.s_addr
== 0)
5044 json_object_object_add(json
, "noNbrId", json_sub
);
5046 json_object_object_add(json
, inet_ntoa(nbr
->router_id
),
5050 ospf_bfd_show_info(vty
, nbr
->bfd_info
, json
, use_json
, 0);
5053 static int show_ip_ospf_neighbor_id_common(struct vty
*vty
, struct ospf
*ospf
,
5055 struct cmd_token
**argv
,
5056 u_char use_json
, u_char use_vrf
)
5058 struct listnode
*node
;
5059 struct ospf_neighbor
*nbr
;
5060 struct ospf_interface
*oi
;
5061 struct in_addr router_id
;
5063 json_object
*json
= NULL
;
5066 json
= json_object_new_object();
5068 if (ospf
->instance
) {
5070 json_object_int_add(json
, "ospfInstance",
5073 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
5076 ospf_show_vrf_name(ospf
, vty
, json
, use_vrf
);
5078 ret
= inet_aton(argv
[arg_base
]->arg
, &router_id
);
5081 vty_out(vty
, "Please specify Neighbor ID by A.B.C.D\n");
5083 vty_out(vty
, "{}\n");
5084 json_object_free(json
);
5089 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
5090 if ((nbr
= ospf_nbr_lookup_by_routerid(oi
->nbrs
, &router_id
))) {
5091 show_ip_ospf_neighbor_detail_sub(vty
, oi
, nbr
, json
,
5097 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
5098 json
, JSON_C_TO_STRING_PRETTY
));
5099 json_object_free(json
);
5106 DEFUN (show_ip_ospf_neighbor_id
,
5107 show_ip_ospf_neighbor_id_cmd
,
5108 "show ip ospf neighbor A.B.C.D [json]",
5111 "OSPF information\n"
5117 u_char uj
= use_json(argc
, argv
);
5118 struct listnode
*node
= NULL
;
5119 int ret
= CMD_SUCCESS
;
5121 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
5122 if (!ospf
->oi_running
)
5124 ret
= show_ip_ospf_neighbor_id_common(vty
, ospf
, 0, argv
, uj
,
5131 DEFUN (show_ip_ospf_instance_neighbor_id
,
5132 show_ip_ospf_instance_neighbor_id_cmd
,
5133 "show ip ospf (1-65535) neighbor A.B.C.D [json]",
5136 "OSPF information\n"
5143 int idx_router_id
= 5;
5145 u_short instance
= 0;
5146 u_char uj
= use_json(argc
, argv
);
5148 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
5149 ospf
= ospf_lookup_instance(instance
);
5151 return CMD_NOT_MY_INSTANCE
;
5153 if (!ospf
->oi_running
)
5156 return show_ip_ospf_neighbor_id_common(vty
, ospf
, idx_router_id
, argv
,
5160 static int show_ip_ospf_neighbor_detail_common(struct vty
*vty
,
5163 u_char use_json
, u_char use_vrf
)
5165 struct ospf_interface
*oi
;
5166 struct listnode
*node
;
5167 json_object
*json_vrf
= NULL
;
5171 json_vrf
= json_object_new_object();
5175 if (ospf
->instance
) {
5177 json_object_int_add(json_vrf
, "ospfInstance",
5180 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
5183 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
5185 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
5186 struct route_node
*rn
;
5187 struct ospf_neighbor
*nbr
;
5189 for (rn
= route_top(oi
->nbrs
); rn
; rn
= route_next(rn
)) {
5190 if ((nbr
= rn
->info
)) {
5191 if (nbr
!= oi
->nbr_self
) {
5192 if (nbr
->state
!= NSM_Down
) {
5193 show_ip_ospf_neighbor_detail_sub(
5194 vty
, oi
, nbr
, json_vrf
,
5204 if (ospf
->vrf_id
== VRF_DEFAULT
)
5205 json_object_object_add(json
, "default",
5208 json_object_object_add(json
, ospf
->name
,
5217 DEFUN (show_ip_ospf_neighbor_detail
,
5218 show_ip_ospf_neighbor_detail_cmd
,
5219 "show ip ospf [vrf <NAME|all>] neighbor detail [json]",
5222 "OSPF information\n"
5226 "detail of all neighbors\n"
5230 u_char uj
= use_json(argc
, argv
);
5231 struct listnode
*node
= NULL
;
5232 char *vrf_name
= NULL
;
5233 bool all_vrf
= FALSE
;
5234 int ret
= CMD_SUCCESS
;
5238 json_object
*json
= NULL
;
5240 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
5243 json
= json_object_new_object();
5245 /* vrf input is provided could be all or specific vrf*/
5249 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
5250 if (!ospf
->oi_running
)
5252 ret
= show_ip_ospf_neighbor_detail_common(
5253 vty
, ospf
, json
, uj
, use_vrf
);
5256 vty_out(vty
, "%s\n",
5257 json_object_to_json_string_ext(
5258 json
, JSON_C_TO_STRING_PRETTY
));
5259 json_object_free(json
);
5264 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
5265 if (ospf
== NULL
|| !ospf
->oi_running
) {
5267 json_object_free(json
);
5271 /* Display default ospf (instance 0) info */
5272 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
5273 if (ospf
== NULL
|| !ospf
->oi_running
) {
5275 json_object_free(json
);
5281 ret
= show_ip_ospf_neighbor_detail_common(vty
, ospf
, json
, uj
,
5284 vty_out(vty
, "%s\n",
5285 json_object_to_json_string_ext(
5286 json
, JSON_C_TO_STRING_PRETTY
));
5291 json_object_free(json
);
5296 DEFUN (show_ip_ospf_instance_neighbor_detail
,
5297 show_ip_ospf_instance_neighbor_detail_cmd
,
5298 "show ip ospf (1-65535) neighbor detail [json]",
5301 "OSPF information\n"
5304 "detail of all neighbors\n"
5309 u_short instance
= 0;
5310 u_char uj
= use_json(argc
, argv
);
5311 json_object
*json
= NULL
;
5312 int ret
= CMD_SUCCESS
;
5314 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
5315 ospf
= ospf_lookup_instance(instance
);
5317 return CMD_NOT_MY_INSTANCE
;
5319 if (!ospf
->oi_running
)
5323 json
= json_object_new_object();
5325 ret
= show_ip_ospf_neighbor_detail_common(vty
, ospf
, json
, uj
, 0);
5328 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
5329 json
, JSON_C_TO_STRING_PRETTY
));
5330 json_object_free(json
);
5336 static int show_ip_ospf_neighbor_detail_all_common(struct vty
*vty
,
5342 struct listnode
*node
;
5343 struct ospf_interface
*oi
;
5344 json_object
*json_vrf
= NULL
;
5348 json_vrf
= json_object_new_object();
5353 if (ospf
->instance
) {
5355 json_object_int_add(json
, "ospfInstance",
5358 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
5361 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
5363 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
5364 struct route_node
*rn
;
5365 struct ospf_neighbor
*nbr
;
5366 struct ospf_nbr_nbma
*nbr_nbma
;
5368 for (rn
= route_top(oi
->nbrs
); rn
; rn
= route_next(rn
))
5369 if ((nbr
= rn
->info
))
5370 if (nbr
!= oi
->nbr_self
)
5371 if (nbr
->state
!= NSM_Down
)
5372 show_ip_ospf_neighbor_detail_sub(
5374 json_vrf
, use_json
);
5376 if (oi
->type
== OSPF_IFTYPE_NBMA
) {
5377 struct listnode
*nd
;
5379 for (ALL_LIST_ELEMENTS_RO(oi
->nbr_nbma
, nd
, nbr_nbma
)) {
5380 if (nbr_nbma
->nbr
== NULL
5381 || nbr_nbma
->nbr
->state
== NSM_Down
)
5382 show_ip_ospf_nbr_nbma_detail_sub(
5383 vty
, oi
, nbr_nbma
, use_json
,
5391 if (ospf
->vrf_id
== VRF_DEFAULT
)
5392 json_object_object_add(json
, "default",
5395 json_object_object_add(json
, ospf
->name
,
5405 DEFUN (show_ip_ospf_neighbor_detail_all
,
5406 show_ip_ospf_neighbor_detail_all_cmd
,
5407 "show ip ospf [vrf <NAME|all>] neighbor detail all [json]",
5410 "OSPF information\n"
5414 "detail of all neighbors\n"
5415 "include down status neighbor\n"
5419 u_char uj
= use_json(argc
, argv
);
5420 struct listnode
*node
= NULL
;
5421 char *vrf_name
= NULL
;
5422 bool all_vrf
= FALSE
;
5423 int ret
= CMD_SUCCESS
;
5427 json_object
*json
= NULL
;
5429 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
5432 json
= json_object_new_object();
5434 /* vrf input is provided could be all or specific vrf*/
5438 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
5439 if (!ospf
->oi_running
)
5441 ret
= show_ip_ospf_neighbor_detail_all_common(
5442 vty
, ospf
, json
, uj
, use_vrf
);
5446 vty_out(vty
, "%s\n",
5447 json_object_to_json_string_ext(
5448 json
, JSON_C_TO_STRING_PRETTY
));
5449 json_object_free(json
);
5454 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
5455 if (ospf
== NULL
|| !ospf
->oi_running
) {
5457 json_object_free(json
);
5461 /* Display default ospf (instance 0) info */
5462 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
5463 if (ospf
== NULL
|| !ospf
->oi_running
) {
5465 json_object_free(json
);
5471 ret
= show_ip_ospf_neighbor_detail_all_common(vty
, ospf
, json
,
5474 vty_out(vty
, "%s\n",
5475 json_object_to_json_string_ext(
5476 json
, JSON_C_TO_STRING_PRETTY
));
5481 json_object_free(json
);
5486 DEFUN (show_ip_ospf_instance_neighbor_detail_all
,
5487 show_ip_ospf_instance_neighbor_detail_all_cmd
,
5488 "show ip ospf (1-65535) neighbor detail all [json]",
5491 "OSPF information\n"
5494 "detail of all neighbors\n"
5495 "include down status neighbor\n"
5500 u_short instance
= 0;
5501 u_char uj
= use_json(argc
, argv
);
5502 json_object
*json
= NULL
;
5503 int ret
= CMD_SUCCESS
;
5505 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
5506 ospf
= ospf_lookup_instance(instance
);
5508 return CMD_NOT_MY_INSTANCE
;
5510 if (!ospf
->oi_running
)
5514 json
= json_object_new_object();
5516 ret
= show_ip_ospf_neighbor_detail_all_common(vty
, ospf
, json
, uj
, 0);
5519 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
5520 json
, JSON_C_TO_STRING_PRETTY
));
5521 json_object_free(json
);
5527 static int show_ip_ospf_neighbor_int_detail_common(struct vty
*vty
,
5530 struct cmd_token
**argv
,
5533 struct ospf_interface
*oi
;
5534 struct interface
*ifp
;
5535 struct route_node
*rn
, *nrn
;
5536 struct ospf_neighbor
*nbr
;
5537 json_object
*json
= NULL
;
5540 json
= json_object_new_object();
5542 if (ospf
->instance
) {
5544 json_object_int_add(json
, "ospfInstance",
5547 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
5550 ifp
= if_lookup_by_name_all_vrf(argv
[arg_base
]->arg
);
5553 vty_out(vty
, "No such interface.\n");
5555 vty_out(vty
, "{}\n");
5556 json_object_free(json
);
5561 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
5562 if ((oi
= rn
->info
)) {
5563 for (nrn
= route_top(oi
->nbrs
); nrn
;
5564 nrn
= route_next(nrn
)) {
5565 if ((nbr
= nrn
->info
)) {
5566 if (nbr
!= oi
->nbr_self
) {
5567 if (nbr
->state
!= NSM_Down
)
5568 show_ip_ospf_neighbor_detail_sub(
5578 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
5579 json
, JSON_C_TO_STRING_PRETTY
));
5580 json_object_free(json
);
5587 DEFUN (show_ip_ospf_neighbor_int_detail
,
5588 show_ip_ospf_neighbor_int_detail_cmd
,
5589 "show ip ospf neighbor IFNAME detail [json]",
5592 "OSPF information\n"
5595 "detail of all neighbors\n"
5599 u_char uj
= use_json(argc
, argv
);
5600 struct listnode
*node
= NULL
;
5601 int ret
= CMD_SUCCESS
;
5603 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
5604 if (!ospf
->oi_running
)
5606 ret
= show_ip_ospf_neighbor_int_detail_common(vty
, ospf
, 0,
5613 DEFUN (show_ip_ospf_instance_neighbor_int_detail
,
5614 show_ip_ospf_instance_neighbor_int_detail_cmd
,
5615 "show ip ospf (1-65535) neighbor IFNAME detail [json]",
5618 "OSPF information\n"
5622 "detail of all neighbors\n"
5628 u_short instance
= 0;
5629 u_char uj
= use_json(argc
, argv
);
5631 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
5632 ospf
= ospf_lookup_instance(instance
);
5634 return CMD_NOT_MY_INSTANCE
;
5636 if (!ospf
->oi_running
)
5639 return show_ip_ospf_neighbor_int_detail_common(vty
, ospf
, idx_ifname
,
5643 /* Show functions */
5644 static int show_lsa_summary(struct vty
*vty
, struct ospf_lsa
*lsa
, int self
)
5646 struct router_lsa
*rl
;
5647 struct summary_lsa
*sl
;
5648 struct as_external_lsa
*asel
;
5649 struct prefix_ipv4 p
;
5652 /* If self option is set, check LSA self flag. */
5653 if (self
== 0 || IS_LSA_SELF(lsa
)) {
5654 /* LSA common part show. */
5655 vty_out(vty
, "%-15s ", inet_ntoa(lsa
->data
->id
));
5656 vty_out(vty
, "%-15s %4d 0x%08lx 0x%04x",
5657 inet_ntoa(lsa
->data
->adv_router
), LS_AGE(lsa
),
5658 (u_long
)ntohl(lsa
->data
->ls_seqnum
),
5659 ntohs(lsa
->data
->checksum
));
5660 /* LSA specific part show. */
5661 switch (lsa
->data
->type
) {
5662 case OSPF_ROUTER_LSA
:
5663 rl
= (struct router_lsa
*)lsa
->data
;
5664 vty_out(vty
, " %-d", ntohs(rl
->links
));
5666 case OSPF_SUMMARY_LSA
:
5667 sl
= (struct summary_lsa
*)lsa
->data
;
5670 p
.prefix
= sl
->header
.id
;
5671 p
.prefixlen
= ip_masklen(sl
->mask
);
5672 apply_mask_ipv4(&p
);
5674 vty_out(vty
, " %s/%d", inet_ntoa(p
.prefix
),
5677 case OSPF_AS_EXTERNAL_LSA
:
5678 case OSPF_AS_NSSA_LSA
:
5679 asel
= (struct as_external_lsa
*)lsa
->data
;
5682 p
.prefix
= asel
->header
.id
;
5683 p
.prefixlen
= ip_masklen(asel
->mask
);
5684 apply_mask_ipv4(&p
);
5686 vty_out(vty
, " %s %s/%d [0x%lx]",
5687 IS_EXTERNAL_METRIC(asel
->e
[0].tos
)
5690 inet_ntoa(p
.prefix
), p
.prefixlen
,
5691 (u_long
)ntohl(asel
->e
[0].route_tag
));
5693 case OSPF_NETWORK_LSA
:
5694 case OSPF_ASBR_SUMMARY_LSA
:
5695 case OSPF_OPAQUE_LINK_LSA
:
5696 case OSPF_OPAQUE_AREA_LSA
:
5697 case OSPF_OPAQUE_AS_LSA
:
5707 static const char *show_database_desc
[] = {
5709 "Router Link States",
5711 "Summary Link States",
5712 "ASBR-Summary Link States",
5713 "AS External Link States",
5714 "Group Membership LSA",
5715 "NSSA-external Link States",
5717 "Link-Local Opaque-LSA",
5718 "Area-Local Opaque-LSA",
5719 "AS-external Opaque-LSA",
5722 static const char *show_database_header
[] = {
5724 "Link ID ADV Router Age Seq# CkSum Link count",
5725 "Link ID ADV Router Age Seq# CkSum",
5726 "Link ID ADV Router Age Seq# CkSum Route",
5727 "Link ID ADV Router Age Seq# CkSum",
5728 "Link ID ADV Router Age Seq# CkSum Route",
5729 " --- header for Group Member ----",
5730 "Link ID ADV Router Age Seq# CkSum Route",
5732 "Opaque-Type/Id ADV Router Age Seq# CkSum",
5733 "Opaque-Type/Id ADV Router Age Seq# CkSum",
5734 "Opaque-Type/Id ADV Router Age Seq# CkSum",
5737 static void show_ip_ospf_database_header(struct vty
*vty
, struct ospf_lsa
*lsa
)
5739 struct router_lsa
*rlsa
= (struct router_lsa
*)lsa
->data
;
5741 vty_out(vty
, " LS age: %d\n", LS_AGE(lsa
));
5742 vty_out(vty
, " Options: 0x%-2x : %s\n", lsa
->data
->options
,
5743 ospf_options_dump(lsa
->data
->options
));
5744 vty_out(vty
, " LS Flags: 0x%-2x %s\n", lsa
->flags
,
5745 ((lsa
->flags
& OSPF_LSA_LOCAL_XLT
) ? "(Translated from Type-7)"
5748 if (lsa
->data
->type
== OSPF_ROUTER_LSA
) {
5749 vty_out(vty
, " Flags: 0x%x", rlsa
->flags
);
5752 vty_out(vty
, " :%s%s%s%s",
5753 IS_ROUTER_LSA_BORDER(rlsa
) ? " ABR" : "",
5754 IS_ROUTER_LSA_EXTERNAL(rlsa
) ? " ASBR" : "",
5755 IS_ROUTER_LSA_VIRTUAL(rlsa
) ? " VL-endpoint"
5757 IS_ROUTER_LSA_SHORTCUT(rlsa
) ? " Shortcut"
5762 vty_out(vty
, " LS Type: %s\n",
5763 lookup_msg(ospf_lsa_type_msg
, lsa
->data
->type
, NULL
));
5764 vty_out(vty
, " Link State ID: %s %s\n", inet_ntoa(lsa
->data
->id
),
5765 lookup_msg(ospf_link_state_id_type_msg
, lsa
->data
->type
, NULL
));
5766 vty_out(vty
, " Advertising Router: %s\n",
5767 inet_ntoa(lsa
->data
->adv_router
));
5768 vty_out(vty
, " LS Seq Number: %08lx\n",
5769 (u_long
)ntohl(lsa
->data
->ls_seqnum
));
5770 vty_out(vty
, " Checksum: 0x%04x\n", ntohs(lsa
->data
->checksum
));
5771 vty_out(vty
, " Length: %d\n\n", ntohs(lsa
->data
->length
));
5774 const char *link_type_desc
[] = {
5776 "another Router (point-to-point)",
5777 "a Transit Network",
5782 const char *link_id_desc
[] = {
5783 "(null)", "Neighboring Router ID", "Designated Router address",
5784 "Net", "Neighboring Router ID",
5787 const char *link_data_desc
[] = {
5788 "(null)", "Router Interface address", "Router Interface address",
5789 "Network Mask", "Router Interface address",
5792 /* Show router-LSA each Link information. */
5793 static void show_ip_ospf_database_router_links(struct vty
*vty
,
5794 struct router_lsa
*rl
)
5799 len
= ntohs(rl
->header
.length
) - 4;
5800 for (i
= 0; i
< ntohs(rl
->links
) && len
> 0; len
-= 12, i
++) {
5801 type
= rl
->link
[i
].type
;
5803 vty_out(vty
, " Link connected to: %s\n",
5804 link_type_desc
[type
]);
5805 vty_out(vty
, " (Link ID) %s: %s\n", link_id_desc
[type
],
5806 inet_ntoa(rl
->link
[i
].link_id
));
5807 vty_out(vty
, " (Link Data) %s: %s\n", link_data_desc
[type
],
5808 inet_ntoa(rl
->link
[i
].link_data
));
5809 vty_out(vty
, " Number of TOS metrics: 0\n");
5810 vty_out(vty
, " TOS 0 Metric: %d\n",
5811 ntohs(rl
->link
[i
].metric
));
5816 /* Show router-LSA detail information. */
5817 static int show_router_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
)
5820 struct router_lsa
*rl
= (struct router_lsa
*)lsa
->data
;
5822 show_ip_ospf_database_header(vty
, lsa
);
5824 vty_out(vty
, " Number of Links: %d\n\n", ntohs(rl
->links
));
5826 show_ip_ospf_database_router_links(vty
, rl
);
5833 /* Show network-LSA detail information. */
5834 static int show_network_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
)
5839 struct network_lsa
*nl
= (struct network_lsa
*)lsa
->data
;
5841 show_ip_ospf_database_header(vty
, lsa
);
5843 vty_out(vty
, " Network Mask: /%d\n", ip_masklen(nl
->mask
));
5845 length
= ntohs(lsa
->data
->length
) - OSPF_LSA_HEADER_SIZE
- 4;
5847 for (i
= 0; length
> 0; i
++, length
-= 4)
5848 vty_out(vty
, " Attached Router: %s\n",
5849 inet_ntoa(nl
->routers
[i
]));
5857 /* Show summary-LSA detail information. */
5858 static int show_summary_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
)
5861 struct summary_lsa
*sl
= (struct summary_lsa
*)lsa
->data
;
5863 show_ip_ospf_database_header(vty
, lsa
);
5865 vty_out(vty
, " Network Mask: /%d\n", ip_masklen(sl
->mask
));
5866 vty_out(vty
, " TOS: 0 Metric: %d\n",
5867 GET_METRIC(sl
->metric
));
5874 /* Show summary-ASBR-LSA detail information. */
5875 static int show_summary_asbr_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
)
5878 struct summary_lsa
*sl
= (struct summary_lsa
*)lsa
->data
;
5880 show_ip_ospf_database_header(vty
, lsa
);
5882 vty_out(vty
, " Network Mask: /%d\n", ip_masklen(sl
->mask
));
5883 vty_out(vty
, " TOS: 0 Metric: %d\n",
5884 GET_METRIC(sl
->metric
));
5891 /* Show AS-external-LSA detail information. */
5892 static int show_as_external_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
)
5895 struct as_external_lsa
*al
=
5896 (struct as_external_lsa
*)lsa
->data
;
5898 show_ip_ospf_database_header(vty
, lsa
);
5900 vty_out(vty
, " Network Mask: /%d\n", ip_masklen(al
->mask
));
5901 vty_out(vty
, " Metric Type: %s\n",
5902 IS_EXTERNAL_METRIC(al
->e
[0].tos
)
5903 ? "2 (Larger than any link state path)"
5905 vty_out(vty
, " TOS: 0\n");
5906 vty_out(vty
, " Metric: %d\n",
5907 GET_METRIC(al
->e
[0].metric
));
5908 vty_out(vty
, " Forward Address: %s\n",
5909 inet_ntoa(al
->e
[0].fwd_addr
));
5912 " External Route Tag: %" ROUTE_TAG_PRI
"\n\n",
5913 (route_tag_t
)ntohl(al
->e
[0].route_tag
));
5920 show_as_external_lsa_stdvty (struct ospf_lsa
*lsa
)
5922 struct as_external_lsa
*al
= (struct as_external_lsa
*) lsa
->data
;
5924 /* show_ip_ospf_database_header (vty, lsa); */
5926 zlog_debug( " Network Mask: /%d%s",
5927 ip_masklen (al
->mask
), "\n");
5928 zlog_debug( " Metric Type: %s%s",
5929 IS_EXTERNAL_METRIC (al
->e
[0].tos
) ?
5930 "2 (Larger than any link state path)" : "1", "\n");
5931 zlog_debug( " TOS: 0%s", "\n");
5932 zlog_debug( " Metric: %d%s",
5933 GET_METRIC (al
->e
[0].metric
), "\n");
5934 zlog_debug( " Forward Address: %s%s",
5935 inet_ntoa (al
->e
[0].fwd_addr
), "\n");
5937 zlog_debug( " External Route Tag: %"ROUTE_TAG_PRI
"%s%s",
5938 (route_tag_t
)ntohl (al
->e
[0].route_tag
), "\n", "\n");
5943 /* Show AS-NSSA-LSA detail information. */
5944 static int show_as_nssa_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
)
5947 struct as_external_lsa
*al
=
5948 (struct as_external_lsa
*)lsa
->data
;
5950 show_ip_ospf_database_header(vty
, lsa
);
5952 vty_out(vty
, " Network Mask: /%d\n", ip_masklen(al
->mask
));
5953 vty_out(vty
, " Metric Type: %s\n",
5954 IS_EXTERNAL_METRIC(al
->e
[0].tos
)
5955 ? "2 (Larger than any link state path)"
5957 vty_out(vty
, " TOS: 0\n");
5958 vty_out(vty
, " Metric: %d\n",
5959 GET_METRIC(al
->e
[0].metric
));
5960 vty_out(vty
, " NSSA: Forward Address: %s\n",
5961 inet_ntoa(al
->e
[0].fwd_addr
));
5964 " External Route Tag: %" ROUTE_TAG_PRI
"\n\n",
5965 (route_tag_t
)ntohl(al
->e
[0].route_tag
));
5971 static int show_func_dummy(struct vty
*vty
, struct ospf_lsa
*lsa
)
5976 static int show_opaque_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
)
5979 show_ip_ospf_database_header(vty
, lsa
);
5980 show_opaque_info_detail(vty
, lsa
);
5987 int (*show_function
[])(struct vty
*, struct ospf_lsa
*) = {
5989 show_router_lsa_detail
,
5990 show_network_lsa_detail
,
5991 show_summary_lsa_detail
,
5992 show_summary_asbr_lsa_detail
,
5993 show_as_external_lsa_detail
,
5995 show_as_nssa_lsa_detail
, /* almost same as external */
5997 show_opaque_lsa_detail
,
5998 show_opaque_lsa_detail
,
5999 show_opaque_lsa_detail
,
6002 static void show_lsa_prefix_set(struct vty
*vty
, struct prefix_ls
*lp
,
6003 struct in_addr
*id
, struct in_addr
*adv_router
)
6005 memset(lp
, 0, sizeof(struct prefix_ls
));
6009 else if (adv_router
== NULL
) {
6015 lp
->adv_router
= *adv_router
;
6019 static void show_lsa_detail_proc(struct vty
*vty
, struct route_table
*rt
,
6020 struct in_addr
*id
, struct in_addr
*adv_router
)
6022 struct prefix_ls lp
;
6023 struct route_node
*rn
, *start
;
6024 struct ospf_lsa
*lsa
;
6026 show_lsa_prefix_set(vty
, &lp
, id
, adv_router
);
6027 start
= route_node_get(rt
, (struct prefix
*)&lp
);
6029 route_lock_node(start
);
6030 for (rn
= start
; rn
; rn
= route_next_until(rn
, start
))
6031 if ((lsa
= rn
->info
)) {
6032 if (show_function
[lsa
->data
->type
] != NULL
)
6033 show_function
[lsa
->data
->type
](vty
,
6036 route_unlock_node(start
);
6040 /* Show detail LSA information
6041 -- if id is NULL then show all LSAs. */
6042 static void show_lsa_detail(struct vty
*vty
, struct ospf
*ospf
, int type
,
6043 struct in_addr
*id
, struct in_addr
*adv_router
)
6045 struct listnode
*node
;
6046 struct ospf_area
*area
;
6049 case OSPF_AS_EXTERNAL_LSA
:
6050 case OSPF_OPAQUE_AS_LSA
:
6051 vty_out(vty
, " %s \n\n",
6052 show_database_desc
[type
]);
6053 show_lsa_detail_proc(vty
, AS_LSDB(ospf
, type
), id
, adv_router
);
6056 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
)) {
6057 vty_out(vty
, "\n %s (Area %s)\n\n",
6058 show_database_desc
[type
],
6059 ospf_area_desc_string(area
));
6060 show_lsa_detail_proc(vty
, AREA_LSDB(area
, type
), id
,
6067 static void show_lsa_detail_adv_router_proc(struct vty
*vty
,
6068 struct route_table
*rt
,
6069 struct in_addr
*adv_router
)
6071 struct route_node
*rn
;
6072 struct ospf_lsa
*lsa
;
6074 for (rn
= route_top(rt
); rn
; rn
= route_next(rn
))
6075 if ((lsa
= rn
->info
))
6076 if (IPV4_ADDR_SAME(adv_router
,
6077 &lsa
->data
->adv_router
)) {
6078 if (CHECK_FLAG(lsa
->flags
, OSPF_LSA_LOCAL_XLT
))
6080 if (show_function
[lsa
->data
->type
] != NULL
)
6081 show_function
[lsa
->data
->type
](vty
,
6086 /* Show detail LSA information. */
6087 static void show_lsa_detail_adv_router(struct vty
*vty
, struct ospf
*ospf
,
6088 int type
, struct in_addr
*adv_router
)
6090 struct listnode
*node
;
6091 struct ospf_area
*area
;
6094 case OSPF_AS_EXTERNAL_LSA
:
6095 case OSPF_OPAQUE_AS_LSA
:
6096 vty_out(vty
, " %s \n\n",
6097 show_database_desc
[type
]);
6098 show_lsa_detail_adv_router_proc(vty
, AS_LSDB(ospf
, type
),
6102 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
)) {
6103 vty_out(vty
, "\n %s (Area %s)\n\n",
6104 show_database_desc
[type
],
6105 ospf_area_desc_string(area
));
6106 show_lsa_detail_adv_router_proc(
6107 vty
, AREA_LSDB(area
, type
), adv_router
);
6113 static void show_ip_ospf_database_summary(struct vty
*vty
, struct ospf
*ospf
,
6116 struct ospf_lsa
*lsa
;
6117 struct route_node
*rn
;
6118 struct ospf_area
*area
;
6119 struct listnode
*node
;
6122 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
)) {
6123 for (type
= OSPF_MIN_LSA
; type
< OSPF_MAX_LSA
; type
++) {
6125 case OSPF_AS_EXTERNAL_LSA
:
6126 case OSPF_OPAQUE_AS_LSA
:
6131 if (ospf_lsdb_count_self(area
->lsdb
, type
) > 0
6133 && ospf_lsdb_count(area
->lsdb
, type
) > 0)) {
6134 vty_out(vty
, " %s (Area %s)\n\n",
6135 show_database_desc
[type
],
6136 ospf_area_desc_string(area
));
6137 vty_out(vty
, "%s\n",
6138 show_database_header
[type
]);
6140 LSDB_LOOP (AREA_LSDB(area
, type
), rn
, lsa
)
6141 show_lsa_summary(vty
, lsa
, self
);
6148 for (type
= OSPF_MIN_LSA
; type
< OSPF_MAX_LSA
; type
++) {
6150 case OSPF_AS_EXTERNAL_LSA
:
6151 case OSPF_OPAQUE_AS_LSA
:
6156 if (ospf_lsdb_count_self(ospf
->lsdb
, type
)
6157 || (!self
&& ospf_lsdb_count(ospf
->lsdb
, type
))) {
6158 vty_out(vty
, " %s\n\n",
6159 show_database_desc
[type
]);
6160 vty_out(vty
, "%s\n", show_database_header
[type
]);
6162 LSDB_LOOP (AS_LSDB(ospf
, type
), rn
, lsa
)
6163 show_lsa_summary(vty
, lsa
, self
);
6172 static void show_ip_ospf_database_maxage(struct vty
*vty
, struct ospf
*ospf
)
6174 struct route_node
*rn
;
6176 vty_out(vty
, "\n MaxAge Link States:\n\n");
6178 for (rn
= route_top(ospf
->maxage_lsa
); rn
; rn
= route_next(rn
)) {
6179 struct ospf_lsa
*lsa
;
6181 if ((lsa
= rn
->info
) != NULL
) {
6182 vty_out(vty
, "Link type: %d\n", lsa
->data
->type
);
6183 vty_out(vty
, "Link State ID: %s\n",
6184 inet_ntoa(lsa
->data
->id
));
6185 vty_out(vty
, "Advertising Router: %s\n",
6186 inet_ntoa(lsa
->data
->adv_router
));
6187 vty_out(vty
, "LSA lock count: %d\n", lsa
->lock
);
6193 #define OSPF_LSA_TYPE_NSSA_DESC "NSSA external link state\n"
6194 #define OSPF_LSA_TYPE_NSSA_CMD_STR "|nssa-external"
6196 #define OSPF_LSA_TYPE_OPAQUE_LINK_DESC "Link local Opaque-LSA\n"
6197 #define OSPF_LSA_TYPE_OPAQUE_AREA_DESC "Link area Opaque-LSA\n"
6198 #define OSPF_LSA_TYPE_OPAQUE_AS_DESC "Link AS Opaque-LSA\n"
6199 #define OSPF_LSA_TYPE_OPAQUE_CMD_STR "|opaque-link|opaque-area|opaque-as"
6201 #define OSPF_LSA_TYPES_DESC \
6202 "ASBR summary link states\n" \
6203 "External link states\n" \
6204 "Network link states\n" \
6205 "Router link states\n" \
6206 "Network summary link states\n" OSPF_LSA_TYPE_NSSA_DESC \
6207 OSPF_LSA_TYPE_OPAQUE_LINK_DESC OSPF_LSA_TYPE_OPAQUE_AREA_DESC \
6208 OSPF_LSA_TYPE_OPAQUE_AS_DESC
6210 static int show_ip_ospf_database_common(struct vty
*vty
, struct ospf
*ospf
,
6211 int arg_base
, int argc
,
6212 struct cmd_token
**argv
, u_char use_vrf
)
6216 struct in_addr id
, adv_router
;
6219 vty_out(vty
, "\nOSPF Instance: %d\n", ospf
->instance
);
6221 ospf_show_vrf_name(ospf
, vty
, NULL
, use_vrf
);
6223 vty_out(vty
, "\n OSPF Router with ID (%s)\n\n",
6224 inet_ntoa(ospf
->router_id
));
6227 if (argc
== arg_base
+ 4) {
6228 show_ip_ospf_database_summary(vty
, ospf
, 0);
6232 /* Set database type to show. */
6233 if (strncmp(argv
[arg_base
+ idx_type
]->text
, "r", 1) == 0)
6234 type
= OSPF_ROUTER_LSA
;
6235 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "ne", 2) == 0)
6236 type
= OSPF_NETWORK_LSA
;
6237 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "ns", 2) == 0)
6238 type
= OSPF_AS_NSSA_LSA
;
6239 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "su", 2) == 0)
6240 type
= OSPF_SUMMARY_LSA
;
6241 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "a", 1) == 0)
6242 type
= OSPF_ASBR_SUMMARY_LSA
;
6243 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "e", 1) == 0)
6244 type
= OSPF_AS_EXTERNAL_LSA
;
6245 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "se", 2) == 0) {
6246 show_ip_ospf_database_summary(vty
, ospf
, 1);
6248 } else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "m", 1) == 0) {
6249 show_ip_ospf_database_maxage(vty
, ospf
);
6251 } else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "opaque-l", 8) == 0)
6252 type
= OSPF_OPAQUE_LINK_LSA
;
6253 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "opaque-ar", 9) == 0)
6254 type
= OSPF_OPAQUE_AREA_LSA
;
6255 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "opaque-as", 9) == 0)
6256 type
= OSPF_OPAQUE_AS_LSA
;
6260 /* `show ip ospf database LSA'. */
6261 if (argc
== arg_base
+ 5)
6262 show_lsa_detail(vty
, ospf
, type
, NULL
, NULL
);
6263 else if (argc
>= arg_base
+ 6) {
6264 ret
= inet_aton(argv
[arg_base
+ 5]->arg
, &id
);
6268 /* `show ip ospf database LSA ID'. */
6269 if (argc
== arg_base
+ 6)
6270 show_lsa_detail(vty
, ospf
, type
, &id
, NULL
);
6271 /* `show ip ospf database LSA ID adv-router ADV_ROUTER'. */
6272 else if (argc
== arg_base
+ 7) {
6273 if (strncmp(argv
[arg_base
+ 6]->text
, "s", 1) == 0)
6274 adv_router
= ospf
->router_id
;
6276 ret
= inet_aton(argv
[arg_base
+ 7]->arg
,
6281 show_lsa_detail(vty
, ospf
, type
, &id
, &adv_router
);
6288 DEFUN (show_ip_ospf_database_max
,
6289 show_ip_ospf_database_max_cmd
,
6290 "show ip ospf [vrf <NAME|all>] database <max-age|self-originate>",
6293 "OSPF information\n"
6296 "Database summary\n"
6297 "LSAs in MaxAge list\n"
6298 "Self-originated link states\n")
6300 struct ospf
*ospf
= NULL
;
6301 struct listnode
*node
= NULL
;
6302 char *vrf_name
= NULL
;
6303 bool all_vrf
= FALSE
;
6304 int ret
= CMD_SUCCESS
;
6309 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
6314 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
6315 if (!ospf
->oi_running
)
6317 ret
= show_ip_ospf_database_common(
6318 vty
, ospf
, idx_vrf
? 2 : 0, argc
, argv
,
6322 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
6323 if (ospf
== NULL
|| !ospf
->oi_running
)
6325 ret
= (show_ip_ospf_database_common(
6326 vty
, ospf
, idx_vrf
? 2 : 0, argc
, argv
,
6330 /* Display default ospf (instance 0) info */
6331 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
6332 if (ospf
== NULL
|| !ospf
->oi_running
)
6334 ret
= show_ip_ospf_database_common(vty
, ospf
, 0, argc
, argv
,
6341 DEFUN (show_ip_ospf_instance_database
,
6342 show_ip_ospf_instance_database_cmd
,
6343 "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>]]]",
6346 "OSPF information\n"
6349 "Database summary\n"
6351 "Link State ID (as an IP address)\n"
6352 "Self-originated link states\n"
6353 "Advertising Router link states\n"
6354 "Advertising Router (as an IP address)\n")
6357 u_short instance
= 0;
6358 struct listnode
*node
= NULL
;
6359 char *vrf_name
= NULL
;
6360 bool all_vrf
= FALSE
;
6361 int ret
= CMD_SUCCESS
;
6366 if (argv_find(argv
, argc
, "(1-65535)", &idx
)) {
6367 instance
= strtoul(argv
[idx
]->arg
, NULL
, 10);
6368 ospf
= ospf_lookup_instance(instance
);
6370 return CMD_NOT_MY_INSTANCE
;
6371 if (!ospf
->oi_running
)
6374 return (show_ip_ospf_database_common(vty
, ospf
, idx
? 1 : 0,
6375 argc
, argv
, use_vrf
));
6376 } else if (argv_find(argv
, argc
, "vrf", &idx
)) {
6377 vrf_name
= argv
[++idx
]->arg
;
6378 all_vrf
= strmatch(vrf_name
, "all");
6384 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
6385 if (!ospf
->oi_running
)
6387 ret
= (show_ip_ospf_database_common(
6388 vty
, ospf
, idx
? 2 : 0, argc
, argv
,
6392 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
6393 if ((ospf
== NULL
) || !ospf
->oi_running
)
6395 ret
= (show_ip_ospf_database_common(
6396 vty
, ospf
, idx
? 2 : 0, argc
, argv
, use_vrf
));
6399 /* Display default ospf (instance 0) info */
6400 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
6401 if (ospf
== NULL
|| !ospf
->oi_running
)
6403 ret
= (show_ip_ospf_database_common(vty
, ospf
, 0, argc
, argv
,
6410 DEFUN (show_ip_ospf_instance_database_max
,
6411 show_ip_ospf_instance_database_max_cmd
,
6412 "show ip ospf (1-65535) database <max-age|self-originate>",
6415 "OSPF information\n"
6417 "Database summary\n"
6418 "LSAs in MaxAge list\n"
6419 "Self-originated link states\n")
6423 u_short instance
= 0;
6425 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
6427 ospf
= ospf_lookup_instance(instance
);
6429 return CMD_NOT_MY_INSTANCE
;
6431 if (!ospf
->oi_running
)
6434 return show_ip_ospf_database_common(vty
, ospf
, 1, argc
, argv
, 0);
6438 static int show_ip_ospf_database_type_adv_router_common(struct vty
*vty
,
6440 int arg_base
, int argc
,
6441 struct cmd_token
**argv
,
6446 struct in_addr adv_router
;
6449 vty_out(vty
, "\nOSPF Instance: %d\n", ospf
->instance
);
6451 ospf_show_vrf_name(ospf
, vty
, NULL
, use_vrf
);
6453 vty_out(vty
, "\n OSPF Router with ID (%s)\n\n",
6454 inet_ntoa(ospf
->router_id
));
6456 /* Set database type to show. */
6457 if (strncmp(argv
[arg_base
+ idx_type
]->text
, "r", 1) == 0)
6458 type
= OSPF_ROUTER_LSA
;
6459 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "ne", 2) == 0)
6460 type
= OSPF_NETWORK_LSA
;
6461 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "ns", 2) == 0)
6462 type
= OSPF_AS_NSSA_LSA
;
6463 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "s", 1) == 0)
6464 type
= OSPF_SUMMARY_LSA
;
6465 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "a", 1) == 0)
6466 type
= OSPF_ASBR_SUMMARY_LSA
;
6467 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "e", 1) == 0)
6468 type
= OSPF_AS_EXTERNAL_LSA
;
6469 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "opaque-l", 8) == 0)
6470 type
= OSPF_OPAQUE_LINK_LSA
;
6471 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "opaque-ar", 9) == 0)
6472 type
= OSPF_OPAQUE_AREA_LSA
;
6473 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "opaque-as", 9) == 0)
6474 type
= OSPF_OPAQUE_AS_LSA
;
6478 /* `show ip ospf database LSA adv-router ADV_ROUTER'. */
6479 if (strncmp(argv
[arg_base
+ 5]->text
, "s", 1) == 0)
6480 adv_router
= ospf
->router_id
;
6482 ret
= inet_aton(argv
[arg_base
+ 6]->arg
, &adv_router
);
6487 show_lsa_detail_adv_router(vty
, ospf
, type
, &adv_router
);
6492 DEFUN (show_ip_ospf_instance_database_type_adv_router
,
6493 show_ip_ospf_instance_database_type_adv_router_cmd
,
6494 "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>",
6497 "OSPF information\n"
6500 "Database summary\n"
6502 "Advertising Router link states\n"
6503 "Advertising Router (as an IP address)\n"
6504 "Self-originated link states\n")
6506 struct ospf
*ospf
= NULL
;
6507 u_short instance
= 0;
6508 struct listnode
*node
= NULL
;
6509 char *vrf_name
= NULL
;
6510 bool all_vrf
= FALSE
;
6511 int ret
= CMD_SUCCESS
;
6513 int idx
= 0, idx_vrf
= 0;
6516 if (argv_find(argv
, argc
, "(1-65535)", &idx
)) {
6517 instance
= strtoul(argv
[idx
]->arg
, NULL
, 10);
6518 ospf
= ospf_lookup_instance(instance
);
6520 return CMD_NOT_MY_INSTANCE
;
6521 if (!ospf
->oi_running
)
6523 return (show_ip_ospf_database_type_adv_router_common(
6524 vty
, ospf
, idx
? 1 : 0, argc
, argv
, use_vrf
));
6527 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
6532 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
6533 if (!ospf
->oi_running
)
6535 ret
= show_ip_ospf_database_type_adv_router_common(
6536 vty
, ospf
, idx
? 1 : 0, argc
, argv
,
6540 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
6541 if ((ospf
== NULL
) || !ospf
->oi_running
)
6543 ret
= show_ip_ospf_database_type_adv_router_common(
6544 vty
, ospf
, idx
? 1 : 0, argc
, argv
, use_vrf
);
6547 /* Display default ospf (instance 0) info */
6548 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
6549 if (ospf
== NULL
|| !ospf
->oi_running
)
6551 ret
= show_ip_ospf_database_type_adv_router_common(
6552 vty
, ospf
, idx
? 1 : 0, argc
, argv
, use_vrf
);
6555 /*return (show_ip_ospf_database_type_adv_router_common(
6556 vty, ospf, idx ? 1 : 0, argc, argv));*/
6559 DEFUN (ip_ospf_authentication_args
,
6560 ip_ospf_authentication_args_addr_cmd
,
6561 "ip ospf authentication <null|message-digest> [A.B.C.D]",
6563 "OSPF interface commands\n"
6564 "Enable authentication on this interface\n"
6565 "Use null authentication\n"
6566 "Use message-digest authentication\n"
6567 "Address of interface\n")
6569 VTY_DECLVAR_CONTEXT(interface
, ifp
);
6570 int idx_encryption
= 3;
6572 struct in_addr addr
;
6574 struct ospf_if_params
*params
;
6576 params
= IF_DEF_PARAMS(ifp
);
6579 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
6582 "Please specify interface address by A.B.C.D\n");
6583 return CMD_WARNING_CONFIG_FAILED
;
6586 params
= ospf_get_if_params(ifp
, addr
);
6587 ospf_if_update_params(ifp
, addr
);
6590 /* Handle null authentication */
6591 if (argv
[idx_encryption
]->arg
[0] == 'n') {
6592 SET_IF_PARAM(params
, auth_type
);
6593 params
->auth_type
= OSPF_AUTH_NULL
;
6597 /* Handle message-digest authentication */
6598 if (argv
[idx_encryption
]->arg
[0] == 'm') {
6599 SET_IF_PARAM(params
, auth_type
);
6600 params
->auth_type
= OSPF_AUTH_CRYPTOGRAPHIC
;
6604 vty_out(vty
, "You shouldn't get here!\n");
6605 return CMD_WARNING_CONFIG_FAILED
;
6608 DEFUN (ip_ospf_authentication
,
6609 ip_ospf_authentication_addr_cmd
,
6610 "ip ospf authentication [A.B.C.D]",
6612 "OSPF interface commands\n"
6613 "Enable authentication on this interface\n"
6614 "Address of interface\n")
6616 VTY_DECLVAR_CONTEXT(interface
, ifp
);
6618 struct in_addr addr
;
6620 struct ospf_if_params
*params
;
6622 params
= IF_DEF_PARAMS(ifp
);
6625 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
6628 "Please specify interface address by A.B.C.D\n");
6629 return CMD_WARNING_CONFIG_FAILED
;
6632 params
= ospf_get_if_params(ifp
, addr
);
6633 ospf_if_update_params(ifp
, addr
);
6636 SET_IF_PARAM(params
, auth_type
);
6637 params
->auth_type
= OSPF_AUTH_SIMPLE
;
6642 DEFUN (no_ip_ospf_authentication_args
,
6643 no_ip_ospf_authentication_args_addr_cmd
,
6644 "no ip ospf authentication <null|message-digest> [A.B.C.D]",
6647 "OSPF interface commands\n"
6648 "Enable authentication on this interface\n"
6649 "Use null authentication\n"
6650 "Use message-digest authentication\n"
6651 "Address of interface\n")
6653 VTY_DECLVAR_CONTEXT(interface
, ifp
);
6654 int idx_encryption
= 4;
6656 struct in_addr addr
;
6658 struct ospf_if_params
*params
;
6659 struct route_node
*rn
;
6662 params
= IF_DEF_PARAMS(ifp
);
6665 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
6668 "Please specify interface address by A.B.C.D\n");
6669 return CMD_WARNING_CONFIG_FAILED
;
6672 params
= ospf_lookup_if_params(ifp
, addr
);
6673 if (params
== NULL
) {
6674 vty_out(vty
, "Ip Address specified is unknown\n");
6675 return CMD_WARNING_CONFIG_FAILED
;
6677 params
->auth_type
= OSPF_AUTH_NOTSET
;
6678 UNSET_IF_PARAM(params
, auth_type
);
6679 if (params
!= IF_DEF_PARAMS(ifp
)) {
6680 ospf_free_if_params(ifp
, addr
);
6681 ospf_if_update_params(ifp
, addr
);
6684 if (argv
[idx_encryption
]->arg
[0] == 'n') {
6685 auth_type
= OSPF_AUTH_NULL
;
6686 } else if (argv
[idx_encryption
]->arg
[0] == 'm') {
6687 auth_type
= OSPF_AUTH_CRYPTOGRAPHIC
;
6689 vty_out(vty
, "Unexpected input encountered\n");
6690 return CMD_WARNING_CONFIG_FAILED
;
6693 * Here we have a case where the user has entered
6694 * 'no ip ospf authentication (null | message_digest )'
6695 * we need to find if we have any ip addresses underneath it
6697 * correspond to the associated type.
6699 if (params
->auth_type
== auth_type
) {
6700 params
->auth_type
= OSPF_AUTH_NOTSET
;
6701 UNSET_IF_PARAM(params
, auth_type
);
6704 for (rn
= route_top(IF_OIFS_PARAMS(ifp
)); rn
;
6705 rn
= route_next(rn
)) {
6706 if ((params
= rn
->info
)) {
6707 if (params
->auth_type
== auth_type
) {
6708 params
->auth_type
= OSPF_AUTH_NOTSET
;
6709 UNSET_IF_PARAM(params
, auth_type
);
6710 if (params
!= IF_DEF_PARAMS(ifp
)) {
6711 ospf_free_if_params(
6712 ifp
, rn
->p
.u
.prefix4
);
6713 ospf_if_update_params(
6714 ifp
, rn
->p
.u
.prefix4
);
6724 DEFUN (no_ip_ospf_authentication
,
6725 no_ip_ospf_authentication_addr_cmd
,
6726 "no ip ospf authentication [A.B.C.D]",
6729 "OSPF interface commands\n"
6730 "Enable authentication on this interface\n"
6731 "Address of interface\n")
6733 VTY_DECLVAR_CONTEXT(interface
, ifp
);
6735 struct in_addr addr
;
6737 struct ospf_if_params
*params
;
6738 struct route_node
*rn
;
6740 params
= IF_DEF_PARAMS(ifp
);
6743 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
6746 "Please specify interface address by A.B.C.D\n");
6747 return CMD_WARNING_CONFIG_FAILED
;
6750 params
= ospf_lookup_if_params(ifp
, addr
);
6751 if (params
== NULL
) {
6752 vty_out(vty
, "Ip Address specified is unknown\n");
6753 return CMD_WARNING_CONFIG_FAILED
;
6756 params
->auth_type
= OSPF_AUTH_NOTSET
;
6757 UNSET_IF_PARAM(params
, auth_type
);
6758 if (params
!= IF_DEF_PARAMS(ifp
)) {
6759 ospf_free_if_params(ifp
, addr
);
6760 ospf_if_update_params(ifp
, addr
);
6764 * When a user enters 'no ip ospf authentication'
6765 * We should remove all authentication types from
6768 if ((params
->auth_type
== OSPF_AUTH_NULL
)
6769 || (params
->auth_type
== OSPF_AUTH_CRYPTOGRAPHIC
)
6770 || (params
->auth_type
== OSPF_AUTH_SIMPLE
)) {
6771 params
->auth_type
= OSPF_AUTH_NOTSET
;
6772 UNSET_IF_PARAM(params
, auth_type
);
6775 for (rn
= route_top(IF_OIFS_PARAMS(ifp
)); rn
;
6776 rn
= route_next(rn
)) {
6777 if ((params
= rn
->info
)) {
6779 if ((params
->auth_type
== OSPF_AUTH_NULL
)
6780 || (params
->auth_type
6781 == OSPF_AUTH_CRYPTOGRAPHIC
)
6782 || (params
->auth_type
6783 == OSPF_AUTH_SIMPLE
)) {
6784 params
->auth_type
= OSPF_AUTH_NOTSET
;
6785 UNSET_IF_PARAM(params
, auth_type
);
6786 if (params
!= IF_DEF_PARAMS(ifp
)) {
6787 ospf_free_if_params(
6788 ifp
, rn
->p
.u
.prefix4
);
6789 ospf_if_update_params(
6790 ifp
, rn
->p
.u
.prefix4
);
6801 DEFUN (ip_ospf_authentication_key
,
6802 ip_ospf_authentication_key_addr_cmd
,
6803 "ip ospf authentication-key AUTH_KEY [A.B.C.D]",
6805 "OSPF interface commands\n"
6806 "Authentication password (key)\n"
6807 "The OSPF password (key)\n"
6808 "Address of interface\n")
6810 VTY_DECLVAR_CONTEXT(interface
, ifp
);
6812 struct in_addr addr
;
6813 struct ospf_if_params
*params
;
6815 params
= IF_DEF_PARAMS(ifp
);
6817 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
6818 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
6820 "Please specify interface address by A.B.C.D\n");
6821 return CMD_WARNING_CONFIG_FAILED
;
6824 params
= ospf_get_if_params(ifp
, addr
);
6825 ospf_if_update_params(ifp
, addr
);
6828 memset(params
->auth_simple
, 0, OSPF_AUTH_SIMPLE_SIZE
+ 1);
6829 strncpy((char *)params
->auth_simple
, argv
[3]->arg
,
6830 OSPF_AUTH_SIMPLE_SIZE
);
6831 SET_IF_PARAM(params
, auth_simple
);
6836 DEFUN_HIDDEN (ospf_authentication_key
,
6837 ospf_authentication_key_cmd
,
6838 "ospf authentication-key AUTH_KEY [A.B.C.D]",
6839 "OSPF interface commands\n"
6840 VLINK_HELPSTR_AUTH_SIMPLE
6841 "Address of interface\n")
6843 return ip_ospf_authentication_key(self
, vty
, argc
, argv
);
6846 DEFUN (no_ip_ospf_authentication_key
,
6847 no_ip_ospf_authentication_key_authkey_addr_cmd
,
6848 "no ip ospf authentication-key [AUTH_KEY [A.B.C.D]]",
6851 "OSPF interface commands\n"
6852 VLINK_HELPSTR_AUTH_SIMPLE
6853 "Address of interface\n")
6855 VTY_DECLVAR_CONTEXT(interface
, ifp
);
6857 struct in_addr addr
;
6858 struct ospf_if_params
*params
;
6859 params
= IF_DEF_PARAMS(ifp
);
6861 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
6862 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
6864 "Please specify interface address by A.B.C.D\n");
6865 return CMD_WARNING_CONFIG_FAILED
;
6868 params
= ospf_lookup_if_params(ifp
, addr
);
6873 memset(params
->auth_simple
, 0, OSPF_AUTH_SIMPLE_SIZE
);
6874 UNSET_IF_PARAM(params
, auth_simple
);
6876 if (params
!= IF_DEF_PARAMS(ifp
)) {
6877 ospf_free_if_params(ifp
, addr
);
6878 ospf_if_update_params(ifp
, addr
);
6884 DEFUN_HIDDEN (no_ospf_authentication_key
,
6885 no_ospf_authentication_key_authkey_addr_cmd
,
6886 "no ospf authentication-key [AUTH_KEY [A.B.C.D]]",
6888 "OSPF interface commands\n"
6889 VLINK_HELPSTR_AUTH_SIMPLE
6890 "Address of interface\n")
6892 return no_ip_ospf_authentication_key(self
, vty
, argc
, argv
);
6895 DEFUN (ip_ospf_message_digest_key
,
6896 ip_ospf_message_digest_key_cmd
,
6897 "ip ospf message-digest-key (1-255) md5 KEY [A.B.C.D]",
6899 "OSPF interface commands\n"
6900 "Message digest authentication password (key)\n"
6902 "Use MD5 algorithm\n"
6903 "The OSPF password (key)\n"
6904 "Address of interface\n")
6906 VTY_DECLVAR_CONTEXT(interface
, ifp
);
6907 struct crypt_key
*ck
;
6909 struct in_addr addr
;
6910 struct ospf_if_params
*params
;
6912 params
= IF_DEF_PARAMS(ifp
);
6915 argv_find(argv
, argc
, "(1-255)", &idx
);
6916 char *keyid
= argv
[idx
]->arg
;
6917 argv_find(argv
, argc
, "KEY", &idx
);
6918 char *cryptkey
= argv
[idx
]->arg
;
6920 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
6921 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
6923 "Please specify interface address by A.B.C.D\n");
6924 return CMD_WARNING_CONFIG_FAILED
;
6927 params
= ospf_get_if_params(ifp
, addr
);
6928 ospf_if_update_params(ifp
, addr
);
6931 key_id
= strtol(keyid
, NULL
, 10);
6932 if (ospf_crypt_key_lookup(params
->auth_crypt
, key_id
) != NULL
) {
6933 vty_out(vty
, "OSPF: Key %d already exists\n", key_id
);
6937 ck
= ospf_crypt_key_new();
6938 ck
->key_id
= (u_char
)key_id
;
6939 memset(ck
->auth_key
, 0, OSPF_AUTH_MD5_SIZE
+ 1);
6940 strncpy((char *)ck
->auth_key
, cryptkey
, OSPF_AUTH_MD5_SIZE
);
6942 ospf_crypt_key_add(params
->auth_crypt
, ck
);
6943 SET_IF_PARAM(params
, auth_crypt
);
6948 DEFUN_HIDDEN (ospf_message_digest_key
,
6949 ospf_message_digest_key_cmd
,
6950 "ospf message-digest-key (1-255) md5 KEY [A.B.C.D]",
6951 "OSPF interface commands\n"
6952 "Message digest authentication password (key)\n"
6954 "Use MD5 algorithm\n"
6955 "The OSPF password (key)\n"
6956 "Address of interface\n")
6958 return ip_ospf_message_digest_key(self
, vty
, argc
, argv
);
6961 DEFUN (no_ip_ospf_message_digest_key
,
6962 no_ip_ospf_message_digest_key_cmd
,
6963 "no ip ospf message-digest-key (1-255) [md5 KEY] [A.B.C.D]",
6966 "OSPF interface commands\n"
6967 "Message digest authentication password (key)\n"
6969 "Use MD5 algorithm\n"
6970 "The OSPF password (key)\n"
6971 "Address of interface\n")
6973 VTY_DECLVAR_CONTEXT(interface
, ifp
);
6975 struct crypt_key
*ck
;
6977 struct in_addr addr
;
6978 struct ospf_if_params
*params
;
6979 params
= IF_DEF_PARAMS(ifp
);
6981 argv_find(argv
, argc
, "(1-255)", &idx
);
6982 char *keyid
= argv
[idx
]->arg
;
6984 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
6985 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
6987 "Please specify interface address by A.B.C.D\n");
6988 return CMD_WARNING_CONFIG_FAILED
;
6991 params
= ospf_lookup_if_params(ifp
, addr
);
6996 key_id
= strtol(keyid
, NULL
, 10);
6997 ck
= ospf_crypt_key_lookup(params
->auth_crypt
, key_id
);
6999 vty_out(vty
, "OSPF: Key %d does not exist\n", key_id
);
7000 return CMD_WARNING_CONFIG_FAILED
;
7003 ospf_crypt_key_delete(params
->auth_crypt
, key_id
);
7005 if (params
!= IF_DEF_PARAMS(ifp
)) {
7006 ospf_free_if_params(ifp
, addr
);
7007 ospf_if_update_params(ifp
, addr
);
7013 DEFUN_HIDDEN (no_ospf_message_digest_key
,
7014 no_ospf_message_digest_key_cmd
,
7015 "no ospf message-digest-key (1-255) [md5 KEY] [A.B.C.D]",
7017 "OSPF interface commands\n"
7018 "Message digest authentication password (key)\n"
7020 "Use MD5 algorithm\n"
7021 "The OSPF password (key)\n"
7022 "Address of interface\n")
7024 return no_ip_ospf_message_digest_key(self
, vty
, argc
, argv
);
7027 DEFUN (ip_ospf_cost
,
7029 "ip ospf cost (1-65535) [A.B.C.D]",
7031 "OSPF interface commands\n"
7034 "Address of interface\n")
7036 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7038 u_int32_t cost
= OSPF_OUTPUT_COST_DEFAULT
;
7039 struct in_addr addr
;
7040 struct ospf_if_params
*params
;
7041 params
= IF_DEF_PARAMS(ifp
);
7044 char *coststr
= NULL
, *ifaddr
= NULL
;
7046 argv_find(argv
, argc
, "(1-65535)", &idx
);
7047 coststr
= argv
[idx
]->arg
;
7048 cost
= strtol(coststr
, NULL
, 10);
7050 ifaddr
= argv_find(argv
, argc
, "A.B.C.D", &idx
) ? argv
[idx
]->arg
: NULL
;
7052 if (!inet_aton(ifaddr
, &addr
)) {
7054 "Please specify interface address by A.B.C.D\n");
7055 return CMD_WARNING_CONFIG_FAILED
;
7058 params
= ospf_get_if_params(ifp
, addr
);
7059 ospf_if_update_params(ifp
, addr
);
7062 SET_IF_PARAM(params
, output_cost_cmd
);
7063 params
->output_cost_cmd
= cost
;
7065 ospf_if_recalculate_output_cost(ifp
);
7070 DEFUN_HIDDEN (ospf_cost
,
7072 "ospf cost (1-65535) [A.B.C.D]",
7073 "OSPF interface commands\n"
7076 "Address of interface\n")
7078 return ip_ospf_cost(self
, vty
, argc
, argv
);
7081 DEFUN (no_ip_ospf_cost
,
7082 no_ip_ospf_cost_cmd
,
7083 "no ip ospf cost [(1-65535)] [A.B.C.D]",
7086 "OSPF interface commands\n"
7089 "Address of interface\n")
7091 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7093 struct in_addr addr
;
7094 struct ospf_if_params
*params
;
7096 params
= IF_DEF_PARAMS(ifp
);
7099 char *ifaddr
= NULL
;
7100 ifaddr
= argv_find(argv
, argc
, "A.B.C.D", &idx
) ? argv
[idx
]->arg
: NULL
;
7102 /* According to the semantics we are mimicking "no ip ospf cost N" is
7103 * always treated as "no ip ospf cost" regardless of the actual value
7104 * of N already configured for the interface. Thus ignore cost. */
7107 if (!inet_aton(ifaddr
, &addr
)) {
7109 "Please specify interface address by A.B.C.D\n");
7110 return CMD_WARNING_CONFIG_FAILED
;
7113 params
= ospf_lookup_if_params(ifp
, addr
);
7118 UNSET_IF_PARAM(params
, output_cost_cmd
);
7120 if (params
!= IF_DEF_PARAMS(ifp
)) {
7121 ospf_free_if_params(ifp
, addr
);
7122 ospf_if_update_params(ifp
, addr
);
7125 ospf_if_recalculate_output_cost(ifp
);
7130 DEFUN_HIDDEN (no_ospf_cost
,
7132 "no ospf cost [(1-65535)] [A.B.C.D]",
7134 "OSPF interface commands\n"
7137 "Address of interface\n")
7139 return no_ip_ospf_cost(self
, vty
, argc
, argv
);
7142 static void ospf_nbr_timer_update(struct ospf_interface
*oi
)
7144 struct route_node
*rn
;
7145 struct ospf_neighbor
*nbr
;
7147 for (rn
= route_top(oi
->nbrs
); rn
; rn
= route_next(rn
))
7148 if ((nbr
= rn
->info
)) {
7149 nbr
->v_inactivity
= OSPF_IF_PARAM(oi
, v_wait
);
7150 nbr
->v_db_desc
= OSPF_IF_PARAM(oi
, retransmit_interval
);
7151 nbr
->v_ls_req
= OSPF_IF_PARAM(oi
, retransmit_interval
);
7152 nbr
->v_ls_upd
= OSPF_IF_PARAM(oi
, retransmit_interval
);
7156 static int ospf_vty_dead_interval_set(struct vty
*vty
, const char *interval_str
,
7157 const char *nbr_str
,
7158 const char *fast_hello_str
)
7160 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7163 struct in_addr addr
;
7165 struct ospf_if_params
*params
;
7166 struct ospf_interface
*oi
;
7167 struct route_node
*rn
;
7169 params
= IF_DEF_PARAMS(ifp
);
7172 ret
= inet_aton(nbr_str
, &addr
);
7175 "Please specify interface address by A.B.C.D\n");
7176 return CMD_WARNING_CONFIG_FAILED
;
7179 params
= ospf_get_if_params(ifp
, addr
);
7180 ospf_if_update_params(ifp
, addr
);
7184 seconds
= strtoul(interval_str
, NULL
, 10);
7186 /* reset fast_hello too, just to be sure */
7187 UNSET_IF_PARAM(params
, fast_hello
);
7188 params
->fast_hello
= OSPF_FAST_HELLO_DEFAULT
;
7189 } else if (fast_hello_str
) {
7190 hellomult
= strtoul(fast_hello_str
, NULL
, 10);
7191 /* 1s dead-interval with sub-second hellos desired */
7192 seconds
= OSPF_ROUTER_DEAD_INTERVAL_MINIMAL
;
7193 SET_IF_PARAM(params
, fast_hello
);
7194 params
->fast_hello
= hellomult
;
7197 "Please specify dead-interval or hello-multiplier\n");
7198 return CMD_WARNING_CONFIG_FAILED
;
7201 SET_IF_PARAM(params
, v_wait
);
7202 params
->v_wait
= seconds
;
7204 /* Update timer values in neighbor structure. */
7206 struct ospf
*ospf
= NULL
;
7208 ospf
= ospf_lookup_by_vrf_id(ifp
->vrf_id
);
7210 oi
= ospf_if_lookup_by_local_addr(ospf
, ifp
, addr
);
7212 ospf_nbr_timer_update(oi
);
7215 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
))
7216 if ((oi
= rn
->info
))
7217 ospf_nbr_timer_update(oi
);
7223 DEFUN (ip_ospf_dead_interval
,
7224 ip_ospf_dead_interval_cmd
,
7225 "ip ospf dead-interval (1-65535) [A.B.C.D]",
7227 "OSPF interface commands\n"
7228 "Interval time after which a neighbor is declared down\n"
7230 "Address of interface\n")
7233 char *interval
= argv_find(argv
, argc
, "(1-65535)", &idx
)
7237 argv_find(argv
, argc
, "A.B.C.D", &idx
) ? argv
[idx
]->arg
: NULL
;
7238 return ospf_vty_dead_interval_set(vty
, interval
, ifaddr
, NULL
);
7242 DEFUN_HIDDEN (ospf_dead_interval
,
7243 ospf_dead_interval_cmd
,
7244 "ospf dead-interval (1-65535) [A.B.C.D]",
7245 "OSPF interface commands\n"
7246 "Interval time after which a neighbor is declared down\n"
7248 "Address of interface\n")
7250 return ip_ospf_dead_interval(self
, vty
, argc
, argv
);
7253 DEFUN (ip_ospf_dead_interval_minimal
,
7254 ip_ospf_dead_interval_minimal_addr_cmd
,
7255 "ip ospf dead-interval minimal hello-multiplier (1-10) [A.B.C.D]",
7257 "OSPF interface commands\n"
7258 "Interval time after which a neighbor is declared down\n"
7259 "Minimal 1s dead-interval with fast sub-second hellos\n"
7260 "Hello multiplier factor\n"
7261 "Number of Hellos to send each second\n"
7262 "Address of interface\n")
7267 return ospf_vty_dead_interval_set(
7268 vty
, NULL
, argv
[idx_ipv4
]->arg
, argv
[idx_number
]->arg
);
7270 return ospf_vty_dead_interval_set(vty
, NULL
, NULL
,
7271 argv
[idx_number
]->arg
);
7274 DEFUN (no_ip_ospf_dead_interval
,
7275 no_ip_ospf_dead_interval_cmd
,
7276 "no ip ospf dead-interval [<(1-65535)|minimal hello-multiplier (1-10)> [A.B.C.D]]",
7279 "OSPF interface commands\n"
7280 "Interval time after which a neighbor is declared down\n"
7282 "Minimal 1s dead-interval with fast sub-second hellos\n"
7283 "Hello multiplier factor\n"
7284 "Number of Hellos to send each second\n"
7285 "Address of interface\n")
7287 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7288 int idx_ipv4
= argc
- 1;
7289 struct in_addr addr
= {.s_addr
= 0L};
7291 struct ospf_if_params
*params
;
7292 struct ospf_interface
*oi
;
7293 struct route_node
*rn
;
7295 params
= IF_DEF_PARAMS(ifp
);
7297 if (argv
[idx_ipv4
]->type
== IPV4_TKN
) {
7298 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
7301 "Please specify interface address by A.B.C.D\n");
7302 return CMD_WARNING_CONFIG_FAILED
;
7305 params
= ospf_lookup_if_params(ifp
, addr
);
7310 UNSET_IF_PARAM(params
, v_wait
);
7311 params
->v_wait
= OSPF_ROUTER_DEAD_INTERVAL_DEFAULT
;
7313 UNSET_IF_PARAM(params
, fast_hello
);
7314 params
->fast_hello
= OSPF_FAST_HELLO_DEFAULT
;
7316 if (params
!= IF_DEF_PARAMS(ifp
)) {
7317 ospf_free_if_params(ifp
, addr
);
7318 ospf_if_update_params(ifp
, addr
);
7321 /* Update timer values in neighbor structure. */
7323 struct ospf
*ospf
= NULL
;
7325 ospf
= ospf_lookup_by_vrf_id(ifp
->vrf_id
);
7327 oi
= ospf_if_lookup_by_local_addr(ospf
, ifp
, addr
);
7329 ospf_nbr_timer_update(oi
);
7332 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
))
7333 if ((oi
= rn
->info
))
7334 ospf_nbr_timer_update(oi
);
7340 DEFUN_HIDDEN (no_ospf_dead_interval
,
7341 no_ospf_dead_interval_cmd
,
7342 "no ospf dead-interval [<(1-65535)|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"
7347 "Minimal 1s dead-interval with fast sub-second hellos\n"
7348 "Hello multiplier factor\n"
7349 "Number of Hellos to send each second\n"
7350 "Address of interface\n")
7352 return no_ip_ospf_dead_interval(self
, vty
, argc
, argv
);
7355 DEFUN (ip_ospf_hello_interval
,
7356 ip_ospf_hello_interval_cmd
,
7357 "ip ospf hello-interval (1-65535) [A.B.C.D]",
7359 "OSPF interface commands\n"
7360 "Time between HELLO packets\n"
7362 "Address of interface\n")
7364 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7366 struct in_addr addr
;
7367 struct ospf_if_params
*params
;
7368 params
= IF_DEF_PARAMS(ifp
);
7369 u_int32_t seconds
= 0;
7371 argv_find(argv
, argc
, "(1-65535)", &idx
);
7372 seconds
= strtol(argv
[idx
]->arg
, NULL
, 10);
7374 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7375 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7377 "Please specify interface address by A.B.C.D\n");
7378 return CMD_WARNING_CONFIG_FAILED
;
7381 params
= ospf_get_if_params(ifp
, addr
);
7382 ospf_if_update_params(ifp
, addr
);
7385 SET_IF_PARAM(params
, v_hello
);
7386 params
->v_hello
= seconds
;
7391 DEFUN_HIDDEN (ospf_hello_interval
,
7392 ospf_hello_interval_cmd
,
7393 "ospf hello-interval (1-65535) [A.B.C.D]",
7394 "OSPF interface commands\n"
7395 "Time between HELLO packets\n"
7397 "Address of interface\n")
7399 return ip_ospf_hello_interval(self
, vty
, argc
, argv
);
7402 DEFUN (no_ip_ospf_hello_interval
,
7403 no_ip_ospf_hello_interval_cmd
,
7404 "no ip ospf hello-interval [(1-65535) [A.B.C.D]]",
7407 "OSPF interface commands\n"
7408 "Time between HELLO packets\n" // ignored
7410 "Address of interface\n")
7412 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7414 struct in_addr addr
;
7415 struct ospf_if_params
*params
;
7417 params
= IF_DEF_PARAMS(ifp
);
7419 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7420 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7422 "Please specify interface address by A.B.C.D\n");
7423 return CMD_WARNING_CONFIG_FAILED
;
7426 params
= ospf_lookup_if_params(ifp
, addr
);
7431 UNSET_IF_PARAM(params
, v_hello
);
7432 params
->v_hello
= OSPF_HELLO_INTERVAL_DEFAULT
;
7434 if (params
!= IF_DEF_PARAMS(ifp
)) {
7435 ospf_free_if_params(ifp
, addr
);
7436 ospf_if_update_params(ifp
, addr
);
7442 DEFUN_HIDDEN (no_ospf_hello_interval
,
7443 no_ospf_hello_interval_cmd
,
7444 "no ospf hello-interval [(1-65535) [A.B.C.D]]",
7446 "OSPF interface commands\n"
7447 "Time between HELLO packets\n" // ignored
7449 "Address of interface\n")
7451 return no_ip_ospf_hello_interval(self
, vty
, argc
, argv
);
7454 DEFUN (ip_ospf_network
,
7455 ip_ospf_network_cmd
,
7456 "ip ospf network <broadcast|non-broadcast|point-to-multipoint|point-to-point>",
7458 "OSPF interface commands\n"
7460 "Specify OSPF broadcast multi-access network\n"
7461 "Specify OSPF NBMA network\n"
7462 "Specify OSPF point-to-multipoint network\n"
7463 "Specify OSPF point-to-point network\n")
7465 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7467 int old_type
= IF_DEF_PARAMS(ifp
)->type
;
7468 struct route_node
*rn
;
7470 if (old_type
== OSPF_IFTYPE_LOOPBACK
) {
7472 "This is a loopback interface. Can't set network type.\n");
7473 return CMD_WARNING_CONFIG_FAILED
;
7476 if (argv_find(argv
, argc
, "broadcast", &idx
))
7477 IF_DEF_PARAMS(ifp
)->type
= OSPF_IFTYPE_BROADCAST
;
7478 else if (argv_find(argv
, argc
, "non-broadcast", &idx
))
7479 IF_DEF_PARAMS(ifp
)->type
= OSPF_IFTYPE_NBMA
;
7480 else if (argv_find(argv
, argc
, "point-to-multipoint", &idx
))
7481 IF_DEF_PARAMS(ifp
)->type
= OSPF_IFTYPE_POINTOMULTIPOINT
;
7482 else if (argv_find(argv
, argc
, "point-to-point", &idx
))
7483 IF_DEF_PARAMS(ifp
)->type
= OSPF_IFTYPE_POINTOPOINT
;
7485 if (IF_DEF_PARAMS(ifp
)->type
== old_type
)
7488 SET_IF_PARAM(IF_DEF_PARAMS(ifp
), type
);
7490 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
7491 struct ospf_interface
*oi
= rn
->info
;
7496 oi
->type
= IF_DEF_PARAMS(ifp
)->type
;
7498 if (oi
->state
> ISM_Down
) {
7499 OSPF_ISM_EVENT_EXECUTE(oi
, ISM_InterfaceDown
);
7500 OSPF_ISM_EVENT_EXECUTE(oi
, ISM_InterfaceUp
);
7507 DEFUN_HIDDEN (ospf_network
,
7509 "ospf network <broadcast|non-broadcast|point-to-multipoint|point-to-point>",
7510 "OSPF interface commands\n"
7512 "Specify OSPF broadcast multi-access network\n"
7513 "Specify OSPF NBMA network\n"
7514 "Specify OSPF point-to-multipoint network\n"
7515 "Specify OSPF point-to-point network\n")
7517 return ip_ospf_network(self
, vty
, argc
, argv
);
7520 DEFUN (no_ip_ospf_network
,
7521 no_ip_ospf_network_cmd
,
7522 "no ip ospf network [<broadcast|non-broadcast|point-to-multipoint|point-to-point>]",
7525 "OSPF interface commands\n"
7527 "Specify OSPF broadcast multi-access network\n"
7528 "Specify OSPF NBMA network\n"
7529 "Specify OSPF point-to-multipoint network\n"
7530 "Specify OSPF point-to-point network\n")
7532 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7533 int old_type
= IF_DEF_PARAMS(ifp
)->type
;
7534 struct route_node
*rn
;
7536 IF_DEF_PARAMS(ifp
)->type
= ospf_default_iftype(ifp
);
7538 if (IF_DEF_PARAMS(ifp
)->type
== old_type
)
7541 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
7542 struct ospf_interface
*oi
= rn
->info
;
7547 oi
->type
= IF_DEF_PARAMS(ifp
)->type
;
7549 if (oi
->state
> ISM_Down
) {
7550 OSPF_ISM_EVENT_EXECUTE(oi
, ISM_InterfaceDown
);
7551 OSPF_ISM_EVENT_EXECUTE(oi
, ISM_InterfaceUp
);
7558 DEFUN_HIDDEN (no_ospf_network
,
7559 no_ospf_network_cmd
,
7560 "no ospf network [<broadcast|non-broadcast|point-to-multipoint|point-to-point>]",
7562 "OSPF interface commands\n"
7564 "Specify OSPF broadcast multi-access network\n"
7565 "Specify OSPF NBMA network\n"
7566 "Specify OSPF point-to-multipoint network\n"
7567 "Specify OSPF point-to-point network\n")
7569 return no_ip_ospf_network(self
, vty
, argc
, argv
);
7572 DEFUN (ip_ospf_priority
,
7573 ip_ospf_priority_cmd
,
7574 "ip ospf priority (0-255) [A.B.C.D]",
7576 "OSPF interface commands\n"
7579 "Address of interface\n")
7581 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7584 struct route_node
*rn
;
7585 struct in_addr addr
;
7586 struct ospf_if_params
*params
;
7587 params
= IF_DEF_PARAMS(ifp
);
7589 argv_find(argv
, argc
, "(0-255)", &idx
);
7590 priority
= strtol(argv
[idx
]->arg
, NULL
, 10);
7592 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7593 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7595 "Please specify interface address by A.B.C.D\n");
7596 return CMD_WARNING_CONFIG_FAILED
;
7599 params
= ospf_get_if_params(ifp
, addr
);
7600 ospf_if_update_params(ifp
, addr
);
7603 SET_IF_PARAM(params
, priority
);
7604 params
->priority
= priority
;
7606 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
7607 struct ospf_interface
*oi
= rn
->info
;
7612 if (PRIORITY(oi
) != OSPF_IF_PARAM(oi
, priority
)) {
7613 PRIORITY(oi
) = OSPF_IF_PARAM(oi
, priority
);
7614 OSPF_ISM_EVENT_SCHEDULE(oi
, ISM_NeighborChange
);
7621 DEFUN_HIDDEN (ospf_priority
,
7623 "ospf priority (0-255) [A.B.C.D]",
7624 "OSPF interface commands\n"
7627 "Address of interface\n")
7629 return ip_ospf_priority(self
, vty
, argc
, argv
);
7632 DEFUN (no_ip_ospf_priority
,
7633 no_ip_ospf_priority_cmd
,
7634 "no ip ospf priority [(0-255) [A.B.C.D]]",
7637 "OSPF interface commands\n"
7638 "Router priority\n" // ignored
7640 "Address of interface\n")
7642 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7644 struct route_node
*rn
;
7645 struct in_addr addr
;
7646 struct ospf_if_params
*params
;
7648 params
= IF_DEF_PARAMS(ifp
);
7650 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7651 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7653 "Please specify interface address by A.B.C.D\n");
7654 return CMD_WARNING_CONFIG_FAILED
;
7657 params
= ospf_lookup_if_params(ifp
, addr
);
7662 UNSET_IF_PARAM(params
, priority
);
7663 params
->priority
= OSPF_ROUTER_PRIORITY_DEFAULT
;
7665 if (params
!= IF_DEF_PARAMS(ifp
)) {
7666 ospf_free_if_params(ifp
, addr
);
7667 ospf_if_update_params(ifp
, addr
);
7670 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
7671 struct ospf_interface
*oi
= rn
->info
;
7676 if (PRIORITY(oi
) != OSPF_IF_PARAM(oi
, priority
)) {
7677 PRIORITY(oi
) = OSPF_IF_PARAM(oi
, priority
);
7678 OSPF_ISM_EVENT_SCHEDULE(oi
, ISM_NeighborChange
);
7685 DEFUN_HIDDEN (no_ospf_priority
,
7686 no_ospf_priority_cmd
,
7687 "no ospf priority [(0-255) [A.B.C.D]]",
7689 "OSPF interface commands\n"
7692 "Address of interface\n")
7694 return no_ip_ospf_priority(self
, vty
, argc
, argv
);
7697 DEFUN (ip_ospf_retransmit_interval
,
7698 ip_ospf_retransmit_interval_addr_cmd
,
7699 "ip ospf retransmit-interval (3-65535) [A.B.C.D]",
7701 "OSPF interface commands\n"
7702 "Time between retransmitting lost link state advertisements\n"
7704 "Address of interface\n")
7706 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7709 struct in_addr addr
;
7710 struct ospf_if_params
*params
;
7711 params
= IF_DEF_PARAMS(ifp
);
7713 argv_find(argv
, argc
, "(3-65535)", &idx
);
7714 seconds
= strtol(argv
[idx
]->arg
, NULL
, 10);
7716 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7717 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7719 "Please specify interface address by A.B.C.D\n");
7720 return CMD_WARNING_CONFIG_FAILED
;
7723 params
= ospf_get_if_params(ifp
, addr
);
7724 ospf_if_update_params(ifp
, addr
);
7727 SET_IF_PARAM(params
, retransmit_interval
);
7728 params
->retransmit_interval
= seconds
;
7733 DEFUN_HIDDEN (ospf_retransmit_interval
,
7734 ospf_retransmit_interval_cmd
,
7735 "ospf retransmit-interval (3-65535) [A.B.C.D]",
7736 "OSPF interface commands\n"
7737 "Time between retransmitting lost link state advertisements\n"
7739 "Address of interface\n")
7741 return ip_ospf_retransmit_interval(self
, vty
, argc
, argv
);
7744 DEFUN (no_ip_ospf_retransmit_interval
,
7745 no_ip_ospf_retransmit_interval_addr_cmd
,
7746 "no ip ospf retransmit-interval [(3-65535)] [A.B.C.D]",
7749 "OSPF interface commands\n"
7750 "Time between retransmitting lost link state advertisements\n"
7752 "Address of interface\n")
7754 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7756 struct in_addr addr
;
7757 struct ospf_if_params
*params
;
7759 params
= IF_DEF_PARAMS(ifp
);
7761 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7762 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7764 "Please specify interface address by A.B.C.D\n");
7765 return CMD_WARNING_CONFIG_FAILED
;
7768 params
= ospf_lookup_if_params(ifp
, addr
);
7773 UNSET_IF_PARAM(params
, retransmit_interval
);
7774 params
->retransmit_interval
= OSPF_RETRANSMIT_INTERVAL_DEFAULT
;
7776 if (params
!= IF_DEF_PARAMS(ifp
)) {
7777 ospf_free_if_params(ifp
, addr
);
7778 ospf_if_update_params(ifp
, addr
);
7784 DEFUN_HIDDEN (no_ospf_retransmit_interval
,
7785 no_ospf_retransmit_interval_cmd
,
7786 "no 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 return no_ip_ospf_retransmit_interval(self
, vty
, argc
, argv
);
7796 DEFUN (ip_ospf_transmit_delay
,
7797 ip_ospf_transmit_delay_addr_cmd
,
7798 "ip ospf transmit-delay (1-65535) [A.B.C.D]",
7800 "OSPF interface commands\n"
7801 "Link state transmit delay\n"
7803 "Address of interface\n")
7805 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7808 struct in_addr addr
;
7809 struct ospf_if_params
*params
;
7811 params
= IF_DEF_PARAMS(ifp
);
7812 argv_find(argv
, argc
, "(1-65535)", &idx
);
7813 seconds
= strtol(argv
[idx
]->arg
, NULL
, 10);
7815 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7816 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7818 "Please specify interface address by A.B.C.D\n");
7819 return CMD_WARNING_CONFIG_FAILED
;
7822 params
= ospf_get_if_params(ifp
, addr
);
7823 ospf_if_update_params(ifp
, addr
);
7826 SET_IF_PARAM(params
, transmit_delay
);
7827 params
->transmit_delay
= seconds
;
7832 DEFUN_HIDDEN (ospf_transmit_delay
,
7833 ospf_transmit_delay_cmd
,
7834 "ospf transmit-delay (1-65535) [A.B.C.D]",
7835 "OSPF interface commands\n"
7836 "Link state transmit delay\n"
7838 "Address of interface\n")
7840 return ip_ospf_transmit_delay(self
, vty
, argc
, argv
);
7843 DEFUN (no_ip_ospf_transmit_delay
,
7844 no_ip_ospf_transmit_delay_addr_cmd
,
7845 "no ip ospf transmit-delay [(1-65535)] [A.B.C.D]",
7848 "OSPF interface commands\n"
7849 "Link state transmit delay\n"
7851 "Address of interface\n")
7853 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7855 struct in_addr addr
;
7856 struct ospf_if_params
*params
;
7858 params
= IF_DEF_PARAMS(ifp
);
7860 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7861 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7863 "Please specify interface address by A.B.C.D\n");
7864 return CMD_WARNING_CONFIG_FAILED
;
7867 params
= ospf_lookup_if_params(ifp
, addr
);
7872 UNSET_IF_PARAM(params
, transmit_delay
);
7873 params
->transmit_delay
= OSPF_TRANSMIT_DELAY_DEFAULT
;
7875 if (params
!= IF_DEF_PARAMS(ifp
)) {
7876 ospf_free_if_params(ifp
, addr
);
7877 ospf_if_update_params(ifp
, addr
);
7884 DEFUN_HIDDEN (no_ospf_transmit_delay
,
7885 no_ospf_transmit_delay_cmd
,
7886 "no ospf transmit-delay [(1-65535) [A.B.C.D]]",
7888 "OSPF interface commands\n"
7889 "Link state transmit delay\n"
7891 "Address of interface\n")
7893 return no_ip_ospf_transmit_delay(self
, vty
, argc
, argv
);
7896 DEFUN (ip_ospf_area
,
7898 "ip ospf [(1-65535)] area <A.B.C.D|(0-4294967295)> [A.B.C.D]",
7900 "OSPF interface commands\n"
7902 "Enable OSPF on this interface\n"
7903 "OSPF area ID in IP address format\n"
7904 "OSPF area ID as a decimal value\n"
7905 "Address of interface\n")
7907 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7910 struct in_addr area_id
;
7911 struct in_addr addr
;
7912 struct ospf_if_params
*params
= NULL
;
7913 struct route_node
*rn
;
7914 struct ospf
*ospf
= NULL
;
7915 u_short instance
= 0;
7918 if (argv_find(argv
, argc
, "(1-65535)", &idx
))
7919 instance
= strtol(argv
[idx
]->arg
, NULL
, 10);
7921 argv_find(argv
, argc
, "area", &idx
);
7922 areaid
= argv
[idx
+ 1]->arg
;
7924 if (ifp
->vrf_id
&& !instance
)
7925 ospf
= ospf_lookup_by_vrf_id(ifp
->vrf_id
);
7927 ospf
= ospf_lookup_instance(instance
);
7929 if (instance
&& ospf
== NULL
) {
7930 params
= IF_DEF_PARAMS(ifp
);
7931 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
)) {
7932 UNSET_IF_PARAM(params
, if_area
);
7933 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
7934 ospf_interface_area_unset(ospf
, ifp
);
7935 ospf
->if_ospf_cli_count
--;
7937 return CMD_NOT_MY_INSTANCE
;
7940 ret
= str2area_id(areaid
, &area_id
, &format
);
7942 vty_out(vty
, "Please specify area by A.B.C.D|<0-4294967295>\n");
7943 return CMD_WARNING_CONFIG_FAILED
;
7945 if (memcmp(ifp
->name
, "VLINK", 5) == 0) {
7946 vty_out(vty
, "Cannot enable OSPF on a virtual link.\n");
7947 return CMD_WARNING_CONFIG_FAILED
;
7950 params
= IF_DEF_PARAMS(ifp
);
7951 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
)
7952 && !IPV4_ADDR_SAME(¶ms
->if_area
, &area_id
)) {
7954 "Must remove previous area config before changing ospf area \n");
7955 return CMD_WARNING_CONFIG_FAILED
;
7958 // Check if we have an address arg and proccess it
7959 if (argc
== idx
+ 3) {
7960 if (!inet_aton(argv
[idx
+ 2]->arg
, &addr
)) {
7962 "Please specify Intf Address by A.B.C.D\n");
7963 return CMD_WARNING_CONFIG_FAILED
;
7965 // update/create address-level params
7966 params
= ospf_get_if_params((ifp
), (addr
));
7967 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
)) {
7969 "Must remove previous area/address config before changing ospf area");
7970 return CMD_WARNING_CONFIG_FAILED
;
7972 ospf_if_update_params((ifp
), (addr
));
7976 for (rn
= route_top(ospf
->networks
); rn
; rn
= route_next(rn
)) {
7977 if (rn
->info
!= NULL
) {
7979 "Please remove all network commands first.\n");
7980 return CMD_WARNING_CONFIG_FAILED
;
7985 /* enable ospf on this interface with area_id */
7987 SET_IF_PARAM(params
, if_area
);
7988 params
->if_area
= area_id
;
7989 params
->if_area_id_fmt
= format
;
7993 ospf_interface_area_set(ospf
, ifp
);
7994 ospf
->if_ospf_cli_count
++;
8000 DEFUN (no_ip_ospf_area
,
8001 no_ip_ospf_area_cmd
,
8002 "no ip ospf [(1-65535)] area [<A.B.C.D|(0-4294967295)> [A.B.C.D]]",
8005 "OSPF interface commands\n"
8007 "Disable OSPF on this interface\n"
8008 "OSPF area ID in IP address format\n"
8009 "OSPF area ID as a decimal value\n"
8010 "Address of interface\n")
8012 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8015 struct ospf_if_params
*params
;
8016 u_short instance
= 0;
8017 struct in_addr addr
;
8019 if (argv_find(argv
, argc
, "(1-65535)", &idx
))
8020 instance
= strtol(argv
[idx
]->arg
, NULL
, 10);
8022 if (ifp
->vrf_id
&& !instance
)
8023 ospf
= ospf_lookup_by_vrf_id(ifp
->vrf_id
);
8025 ospf
= ospf_lookup_instance(instance
);
8028 return CMD_NOT_MY_INSTANCE
;
8030 argv_find(argv
, argc
, "area", &idx
);
8032 // Check if we have an address arg and proccess it
8033 if (argc
== idx
+ 3) {
8034 if (!inet_aton(argv
[idx
+ 2]->arg
, &addr
)) {
8036 "Please specify Intf Address by A.B.C.D\n");
8037 return CMD_WARNING_CONFIG_FAILED
;
8039 params
= ospf_lookup_if_params(ifp
, addr
);
8040 if ((params
) == NULL
)
8043 params
= IF_DEF_PARAMS(ifp
);
8045 if (!OSPF_IF_PARAM_CONFIGURED(params
, if_area
)) {
8047 "Can't find specified interface area configuration.\n");
8048 return CMD_WARNING_CONFIG_FAILED
;
8051 UNSET_IF_PARAM(params
, if_area
);
8052 if (params
!= IF_DEF_PARAMS((ifp
))) {
8053 ospf_free_if_params((ifp
), (addr
));
8054 ospf_if_update_params((ifp
), (addr
));
8057 ospf_interface_area_unset(ospf
, ifp
);
8058 ospf
->if_ospf_cli_count
--;
8062 DEFUN (ospf_redistribute_source
,
8063 ospf_redistribute_source_cmd
,
8064 "redistribute " FRR_REDIST_STR_OSPFD
" [{metric (0-16777214)|metric-type (1-2)|route-map WORD}]",
8066 FRR_REDIST_HELP_STR_OSPFD
8067 "Metric for redistributed routes\n"
8068 "OSPF default metric\n"
8069 "OSPF exterior metric type for redistributed routes\n"
8070 "Set OSPF External Type 1/2 metrics\n"
8071 "Route map reference\n"
8072 "Pointer to route-map entries\n")
8074 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8075 int idx_protocol
= 1;
8079 struct ospf_redist
*red
;
8085 /* Get distribute source. */
8086 source
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
8088 return CMD_WARNING_CONFIG_FAILED
;
8090 red
= ospf_redist_add(ospf
, source
, 0);
8092 /* Get metric value. */
8093 if (argv_find(argv
, argc
, "(0-16777214)", &idx
)) {
8094 if (!str2metric(argv
[idx
]->arg
, &metric
))
8095 return CMD_WARNING_CONFIG_FAILED
;
8098 /* Get metric type. */
8099 if (argv_find(argv
, argc
, "(1-2)", &idx
)) {
8100 if (!str2metric_type(argv
[idx
]->arg
, &type
))
8101 return CMD_WARNING_CONFIG_FAILED
;
8105 if (argv_find(argv
, argc
, "WORD", &idx
)) {
8106 ospf_routemap_set(red
, argv
[idx
]->arg
);
8108 ospf_routemap_unset(red
);
8110 return ospf_redistribute_set(ospf
, source
, 0, type
, metric
);
8113 DEFUN (no_ospf_redistribute_source
,
8114 no_ospf_redistribute_source_cmd
,
8115 "no redistribute " FRR_REDIST_STR_OSPFD
" [{metric (0-16777214)|metric-type (1-2)|route-map WORD}]",
8118 FRR_REDIST_HELP_STR_OSPFD
8119 "Metric for redistributed routes\n"
8120 "OSPF default metric\n"
8121 "OSPF exterior metric type for redistributed routes\n"
8122 "Set OSPF External Type 1/2 metrics\n"
8123 "Route map reference\n"
8124 "Pointer to route-map entries\n")
8126 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8127 int idx_protocol
= 2;
8129 struct ospf_redist
*red
;
8131 source
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
8133 return CMD_WARNING_CONFIG_FAILED
;
8135 red
= ospf_redist_lookup(ospf
, source
, 0);
8139 ospf_routemap_unset(red
);
8140 return ospf_redistribute_unset(ospf
, source
, 0);
8143 DEFUN (ospf_redistribute_instance_source
,
8144 ospf_redistribute_instance_source_cmd
,
8145 "redistribute <ospf|table> (1-65535) [{metric (0-16777214)|metric-type (1-2)|route-map WORD}]",
8147 "Open Shortest Path First\n"
8148 "Non-main Kernel Routing Table\n"
8149 "Instance ID/Table ID\n"
8150 "Metric for redistributed routes\n"
8151 "OSPF default metric\n"
8152 "OSPF exterior metric type for redistributed routes\n"
8153 "Set OSPF External Type 1/2 metrics\n"
8154 "Route map reference\n"
8155 "Pointer to route-map entries\n")
8157 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8158 int idx_ospf_table
= 1;
8165 struct ospf_redist
*red
;
8170 source
= proto_redistnum(AFI_IP
, argv
[idx_ospf_table
]->text
);
8172 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
8177 if ((source
== ZEBRA_ROUTE_OSPF
) && !ospf
->instance
) {
8179 "Instance redistribution in non-instanced OSPF not allowed\n");
8180 return CMD_WARNING_CONFIG_FAILED
;
8183 if ((source
== ZEBRA_ROUTE_OSPF
) && (ospf
->instance
== instance
)) {
8184 vty_out(vty
, "Same instance OSPF redistribution not allowed\n");
8185 return CMD_WARNING_CONFIG_FAILED
;
8188 /* Get metric value. */
8189 if (argv_find(argv
, argc
, "metric", &idx
))
8190 if (!str2metric(argv
[idx
+ 1]->arg
, &metric
))
8191 return CMD_WARNING_CONFIG_FAILED
;
8194 /* Get metric type. */
8195 if (argv_find(argv
, argc
, "metric-type", &idx
))
8196 if (!str2metric_type(argv
[idx
+ 1]->arg
, &type
))
8197 return CMD_WARNING_CONFIG_FAILED
;
8199 red
= ospf_redist_add(ospf
, source
, instance
);
8202 if (argv_find(argv
, argc
, "route-map", &idx
))
8203 ospf_routemap_set(red
, argv
[idx
+ 1]->arg
);
8205 ospf_routemap_unset(red
);
8207 return ospf_redistribute_set(ospf
, source
, instance
, type
, metric
);
8210 DEFUN (no_ospf_redistribute_instance_source
,
8211 no_ospf_redistribute_instance_source_cmd
,
8212 "no redistribute <ospf|table> (1-65535) [{metric (0-16777214)|metric-type (1-2)|route-map WORD}]",
8215 "Open Shortest Path First\n"
8216 "Non-main Kernel Routing Table\n"
8217 "Instance ID/Table Id\n"
8218 "Metric for redistributed routes\n"
8219 "OSPF default metric\n"
8220 "OSPF exterior metric type for redistributed routes\n"
8221 "Set OSPF External Type 1/2 metrics\n"
8222 "Route map reference\n"
8223 "Pointer to route-map entries\n")
8225 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8226 int idx_ospf_table
= 2;
8229 struct ospf_redist
*red
;
8232 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
8233 source
= ZEBRA_ROUTE_OSPF
;
8235 source
= ZEBRA_ROUTE_TABLE
;
8237 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
8239 if ((source
== ZEBRA_ROUTE_OSPF
) && !ospf
->instance
) {
8241 "Instance redistribution in non-instanced OSPF not allowed\n");
8242 return CMD_WARNING_CONFIG_FAILED
;
8245 if ((source
== ZEBRA_ROUTE_OSPF
) && (ospf
->instance
== instance
)) {
8246 vty_out(vty
, "Same instance OSPF redistribution not allowed\n");
8247 return CMD_WARNING_CONFIG_FAILED
;
8250 red
= ospf_redist_lookup(ospf
, source
, instance
);
8254 ospf_routemap_unset(red
);
8255 return ospf_redistribute_unset(ospf
, source
, instance
);
8258 DEFUN (ospf_distribute_list_out
,
8259 ospf_distribute_list_out_cmd
,
8260 "distribute-list WORD out " FRR_REDIST_STR_OSPFD
,
8261 "Filter networks in routing updates\n"
8262 "Access-list name\n"
8264 FRR_REDIST_HELP_STR_OSPFD
)
8266 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8270 char *proto
= argv
[argc
- 1]->text
;
8272 /* Get distribute source. */
8273 source
= proto_redistnum(AFI_IP
, proto
);
8275 return CMD_WARNING_CONFIG_FAILED
;
8277 return ospf_distribute_list_out_set(ospf
, source
, argv
[idx_word
]->arg
);
8280 DEFUN (no_ospf_distribute_list_out
,
8281 no_ospf_distribute_list_out_cmd
,
8282 "no distribute-list WORD out " FRR_REDIST_STR_OSPFD
,
8284 "Filter networks in routing updates\n"
8285 "Access-list name\n"
8287 FRR_REDIST_HELP_STR_OSPFD
)
8289 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8293 char *proto
= argv
[argc
- 1]->text
;
8294 source
= proto_redistnum(AFI_IP
, proto
);
8296 return CMD_WARNING_CONFIG_FAILED
;
8298 return ospf_distribute_list_out_unset(ospf
, source
,
8299 argv
[idx_word
]->arg
);
8302 /* Default information originate. */
8303 DEFUN (ospf_default_information_originate
,
8304 ospf_default_information_originate_cmd
,
8305 "default-information originate [{always|metric (0-16777214)|metric-type (1-2)|route-map WORD}]",
8306 "Control distribution of default information\n"
8307 "Distribute a default route\n"
8308 "Always advertise default route\n"
8309 "OSPF default metric\n"
8311 "OSPF metric type for default routes\n"
8312 "Set OSPF External Type 1/2 metrics\n"
8313 "Route map reference\n"
8314 "Pointer to route-map entries\n")
8316 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8317 int default_originate
= DEFAULT_ORIGINATE_ZEBRA
;
8320 struct ospf_redist
*red
;
8323 red
= ospf_redist_add(ospf
, DEFAULT_ROUTE
, 0);
8325 /* Check whether "always" was specified */
8326 if (argv_find(argv
, argc
, "always", &idx
))
8327 default_originate
= DEFAULT_ORIGINATE_ALWAYS
;
8329 /* Get metric value */
8330 if (argv_find(argv
, argc
, "(0-16777214)", &idx
)) {
8331 if (!str2metric(argv
[idx
]->arg
, &metric
))
8332 return CMD_WARNING_CONFIG_FAILED
;
8335 /* Get metric type. */
8336 if (argv_find(argv
, argc
, "(1-2)", &idx
)) {
8337 if (!str2metric_type(argv
[idx
]->arg
, &type
))
8338 return CMD_WARNING_CONFIG_FAILED
;
8342 if (argv_find(argv
, argc
, "WORD", &idx
))
8343 ospf_routemap_set(red
, argv
[idx
]->arg
);
8345 ospf_routemap_unset(red
);
8347 return ospf_redistribute_default_set(ospf
, default_originate
, type
,
8351 DEFUN (no_ospf_default_information_originate
,
8352 no_ospf_default_information_originate_cmd
,
8353 "no default-information originate [{always|metric (0-16777214)|metric-type (1-2)|route-map WORD}]",
8355 "Control distribution of default information\n"
8356 "Distribute a default route\n"
8357 "Always advertise default route\n"
8358 "OSPF default metric\n"
8360 "OSPF metric type for default routes\n"
8361 "Set OSPF External Type 1/2 metrics\n"
8362 "Route map reference\n"
8363 "Pointer to route-map entries\n")
8365 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8366 struct prefix_ipv4 p
;
8367 struct ospf_external
*ext
;
8368 struct ospf_redist
*red
;
8371 p
.prefix
.s_addr
= 0;
8374 ospf_external_lsa_flush(ospf
, DEFAULT_ROUTE
, &p
, 0);
8376 ext
= ospf_external_lookup(ospf
, DEFAULT_ROUTE
, 0);
8377 if (ext
&& EXTERNAL_INFO(ext
)) {
8378 ospf_external_info_delete(ospf
, DEFAULT_ROUTE
, 0, p
);
8379 ospf_external_del(ospf
, DEFAULT_ROUTE
, 0);
8382 red
= ospf_redist_lookup(ospf
, DEFAULT_ROUTE
, 0);
8386 ospf_routemap_unset(red
);
8387 return ospf_redistribute_default_unset(ospf
);
8390 DEFUN (ospf_default_metric
,
8391 ospf_default_metric_cmd
,
8392 "default-metric (0-16777214)",
8393 "Set metric of redistributed routes\n"
8396 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8400 if (!str2metric(argv
[idx_number
]->arg
, &metric
))
8401 return CMD_WARNING_CONFIG_FAILED
;
8403 ospf
->default_metric
= metric
;
8408 DEFUN (no_ospf_default_metric
,
8409 no_ospf_default_metric_cmd
,
8410 "no default-metric [(0-16777214)]",
8412 "Set metric of redistributed routes\n"
8415 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8417 ospf
->default_metric
= -1;
8423 DEFUN (ospf_distance
,
8426 "Administrative distance\n"
8427 "OSPF Administrative distance\n")
8429 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8432 ospf
->distance_all
= atoi(argv
[idx_number
]->arg
);
8437 DEFUN (no_ospf_distance
,
8438 no_ospf_distance_cmd
,
8439 "no distance (1-255)",
8441 "Administrative distance\n"
8442 "OSPF Administrative distance\n")
8444 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8446 ospf
->distance_all
= 0;
8451 DEFUN (no_ospf_distance_ospf
,
8452 no_ospf_distance_ospf_cmd
,
8453 "no distance ospf [{intra-area [(1-255)]|inter-area [(1-255)]|external [(1-255)]}]",
8455 "Administrative distance\n"
8456 "OSPF administrative distance\n"
8457 "Intra-area routes\n"
8458 "Distance for intra-area routes\n"
8459 "Inter-area routes\n"
8460 "Distance for inter-area routes\n"
8462 "Distance for external routes\n")
8464 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8470 if (argv_find(argv
, argc
, "intra-area", &idx
) || argc
== 3)
8471 idx
= ospf
->distance_intra
= 0;
8472 if (argv_find(argv
, argc
, "inter-area", &idx
) || argc
== 3)
8473 idx
= ospf
->distance_inter
= 0;
8474 if (argv_find(argv
, argc
, "external", &idx
) || argc
== 3)
8475 ospf
->distance_external
= 0;
8480 DEFUN (ospf_distance_ospf
,
8481 ospf_distance_ospf_cmd
,
8482 "distance ospf {intra-area (1-255)|inter-area (1-255)|external (1-255)}",
8483 "Administrative distance\n"
8484 "OSPF administrative distance\n"
8485 "Intra-area routes\n"
8486 "Distance for intra-area routes\n"
8487 "Inter-area routes\n"
8488 "Distance for inter-area routes\n"
8490 "Distance for external routes\n")
8492 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8495 ospf
->distance_intra
= 0;
8496 ospf
->distance_inter
= 0;
8497 ospf
->distance_external
= 0;
8499 if (argv_find(argv
, argc
, "intra-area", &idx
))
8500 ospf
->distance_intra
= atoi(argv
[idx
+ 1]->arg
);
8502 if (argv_find(argv
, argc
, "inter-area", &idx
))
8503 ospf
->distance_inter
= atoi(argv
[idx
+ 1]->arg
);
8505 if (argv_find(argv
, argc
, "external", &idx
))
8506 ospf
->distance_external
= atoi(argv
[idx
+ 1]->arg
);
8512 DEFUN (ospf_distance_source
,
8513 ospf_distance_source_cmd
,
8514 "distance (1-255) A.B.C.D/M",
8515 "Administrative distance\n"
8517 "IP source prefix\n")
8519 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
8521 int idx_ipv4_prefixlen
= 2;
8526 ospf_distance_set (vty
, ospf
, argv
[idx_number
]->arg
, argv
[idx_ipv4_prefixlen
]->arg
, NULL
);
8531 DEFUN (no_ospf_distance_source
,
8532 no_ospf_distance_source_cmd
,
8533 "no distance (1-255) A.B.C.D/M",
8535 "Administrative distance\n"
8537 "IP source prefix\n")
8539 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
8541 int idx_ipv4_prefixlen
= 3;
8546 ospf_distance_unset (vty
, ospf
, argv
[idx_number
]->arg
, argv
[idx_ipv4_prefixlen
]->arg
, NULL
);
8551 DEFUN (ospf_distance_source_access_list
,
8552 ospf_distance_source_access_list_cmd
,
8553 "distance (1-255) A.B.C.D/M WORD",
8554 "Administrative distance\n"
8556 "IP source prefix\n"
8557 "Access list name\n")
8559 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
8561 int idx_ipv4_prefixlen
= 2;
8567 ospf_distance_set (vty
, ospf
, argv
[idx_number
]->arg
, argv
[idx_ipv4_prefixlen
]->arg
, argv
[idx_word
]->arg
);
8572 DEFUN (no_ospf_distance_source_access_list
,
8573 no_ospf_distance_source_access_list_cmd
,
8574 "no distance (1-255) A.B.C.D/M WORD",
8576 "Administrative distance\n"
8578 "IP source prefix\n"
8579 "Access list name\n")
8581 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
8583 int idx_ipv4_prefixlen
= 3;
8589 ospf_distance_unset (vty
, ospf
, argv
[idx_number
]->arg
, argv
[idx_ipv4_prefixlen
]->arg
, argv
[idx_word
]->arg
);
8595 DEFUN (ip_ospf_mtu_ignore
,
8596 ip_ospf_mtu_ignore_addr_cmd
,
8597 "ip ospf mtu-ignore [A.B.C.D]",
8599 "OSPF interface commands\n"
8600 "Disable MTU mismatch detection on this interface\n"
8601 "Address of interface\n")
8603 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8605 struct in_addr addr
;
8608 struct ospf_if_params
*params
;
8609 params
= IF_DEF_PARAMS(ifp
);
8612 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
8615 "Please specify interface address by A.B.C.D\n");
8616 return CMD_WARNING_CONFIG_FAILED
;
8618 params
= ospf_get_if_params(ifp
, addr
);
8619 ospf_if_update_params(ifp
, addr
);
8621 params
->mtu_ignore
= 1;
8622 if (params
->mtu_ignore
!= OSPF_MTU_IGNORE_DEFAULT
)
8623 SET_IF_PARAM(params
, mtu_ignore
);
8625 UNSET_IF_PARAM(params
, mtu_ignore
);
8626 if (params
!= IF_DEF_PARAMS(ifp
)) {
8627 ospf_free_if_params(ifp
, addr
);
8628 ospf_if_update_params(ifp
, addr
);
8634 DEFUN (no_ip_ospf_mtu_ignore
,
8635 no_ip_ospf_mtu_ignore_addr_cmd
,
8636 "no ip ospf mtu-ignore [A.B.C.D]",
8639 "OSPF interface commands\n"
8640 "Disable MTU mismatch detection on this interface\n"
8641 "Address of interface\n")
8643 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8645 struct in_addr addr
;
8648 struct ospf_if_params
*params
;
8649 params
= IF_DEF_PARAMS(ifp
);
8652 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
8655 "Please specify interface address by A.B.C.D\n");
8656 return CMD_WARNING_CONFIG_FAILED
;
8658 params
= ospf_get_if_params(ifp
, addr
);
8659 ospf_if_update_params(ifp
, addr
);
8661 params
->mtu_ignore
= 0;
8662 if (params
->mtu_ignore
!= OSPF_MTU_IGNORE_DEFAULT
)
8663 SET_IF_PARAM(params
, mtu_ignore
);
8665 UNSET_IF_PARAM(params
, mtu_ignore
);
8666 if (params
!= IF_DEF_PARAMS(ifp
)) {
8667 ospf_free_if_params(ifp
, addr
);
8668 ospf_if_update_params(ifp
, addr
);
8675 DEFUN (ospf_max_metric_router_lsa_admin
,
8676 ospf_max_metric_router_lsa_admin_cmd
,
8677 "max-metric router-lsa administrative",
8678 "OSPF maximum / infinite-distance metric\n"
8679 "Advertise own Router-LSA with infinite distance (stub router)\n"
8680 "Administratively applied, for an indefinite period\n")
8682 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8683 struct listnode
*ln
;
8684 struct ospf_area
*area
;
8686 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, ln
, area
)) {
8687 SET_FLAG(area
->stub_router_state
, OSPF_AREA_ADMIN_STUB_ROUTED
);
8689 if (!CHECK_FLAG(area
->stub_router_state
,
8690 OSPF_AREA_IS_STUB_ROUTED
))
8691 ospf_router_lsa_update_area(area
);
8694 /* Allows for areas configured later to get the property */
8695 ospf
->stub_router_admin_set
= OSPF_STUB_ROUTER_ADMINISTRATIVE_SET
;
8700 DEFUN (no_ospf_max_metric_router_lsa_admin
,
8701 no_ospf_max_metric_router_lsa_admin_cmd
,
8702 "no max-metric router-lsa administrative",
8704 "OSPF maximum / infinite-distance metric\n"
8705 "Advertise own Router-LSA with infinite distance (stub router)\n"
8706 "Administratively applied, for an indefinite period\n")
8708 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8709 struct listnode
*ln
;
8710 struct ospf_area
*area
;
8712 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, ln
, area
)) {
8713 UNSET_FLAG(area
->stub_router_state
,
8714 OSPF_AREA_ADMIN_STUB_ROUTED
);
8716 /* Don't trample on the start-up stub timer */
8717 if (CHECK_FLAG(area
->stub_router_state
,
8718 OSPF_AREA_IS_STUB_ROUTED
)
8719 && !area
->t_stub_router
) {
8720 UNSET_FLAG(area
->stub_router_state
,
8721 OSPF_AREA_IS_STUB_ROUTED
);
8722 ospf_router_lsa_update_area(area
);
8725 ospf
->stub_router_admin_set
= OSPF_STUB_ROUTER_ADMINISTRATIVE_UNSET
;
8729 DEFUN (ospf_max_metric_router_lsa_startup
,
8730 ospf_max_metric_router_lsa_startup_cmd
,
8731 "max-metric router-lsa on-startup (5-86400)",
8732 "OSPF maximum / infinite-distance metric\n"
8733 "Advertise own Router-LSA with infinite distance (stub router)\n"
8734 "Automatically advertise stub Router-LSA on startup of OSPF\n"
8735 "Time (seconds) to advertise self as stub-router\n")
8737 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8739 unsigned int seconds
;
8742 vty_out(vty
, "%% Must supply stub-router period");
8743 return CMD_WARNING_CONFIG_FAILED
;
8746 seconds
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
8748 ospf
->stub_router_startup_time
= seconds
;
8753 DEFUN (no_ospf_max_metric_router_lsa_startup
,
8754 no_ospf_max_metric_router_lsa_startup_cmd
,
8755 "no max-metric router-lsa on-startup [(5-86400)]",
8757 "OSPF maximum / infinite-distance metric\n"
8758 "Advertise own Router-LSA with infinite distance (stub router)\n"
8759 "Automatically advertise stub Router-LSA on startup of OSPF\n"
8760 "Time (seconds) to advertise self as stub-router\n")
8762 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8763 struct listnode
*ln
;
8764 struct ospf_area
*area
;
8766 ospf
->stub_router_startup_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
8768 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, ln
, area
)) {
8769 SET_FLAG(area
->stub_router_state
,
8770 OSPF_AREA_WAS_START_STUB_ROUTED
);
8771 OSPF_TIMER_OFF(area
->t_stub_router
);
8773 /* Don't trample on admin stub routed */
8774 if (!CHECK_FLAG(area
->stub_router_state
,
8775 OSPF_AREA_ADMIN_STUB_ROUTED
)) {
8776 UNSET_FLAG(area
->stub_router_state
,
8777 OSPF_AREA_IS_STUB_ROUTED
);
8778 ospf_router_lsa_update_area(area
);
8785 DEFUN (ospf_max_metric_router_lsa_shutdown
,
8786 ospf_max_metric_router_lsa_shutdown_cmd
,
8787 "max-metric router-lsa on-shutdown (5-100)",
8788 "OSPF maximum / infinite-distance metric\n"
8789 "Advertise own Router-LSA with infinite distance (stub router)\n"
8790 "Advertise stub-router prior to full shutdown of OSPF\n"
8791 "Time (seconds) to wait till full shutdown\n")
8793 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8795 unsigned int seconds
;
8798 vty_out(vty
, "%% Must supply stub-router shutdown period");
8799 return CMD_WARNING_CONFIG_FAILED
;
8802 seconds
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
8804 ospf
->stub_router_shutdown_time
= seconds
;
8809 DEFUN (no_ospf_max_metric_router_lsa_shutdown
,
8810 no_ospf_max_metric_router_lsa_shutdown_cmd
,
8811 "no max-metric router-lsa on-shutdown [(5-100)]",
8813 "OSPF maximum / infinite-distance metric\n"
8814 "Advertise own Router-LSA with infinite distance (stub router)\n"
8815 "Advertise stub-router prior to full shutdown of OSPF\n"
8816 "Time (seconds) to wait till full shutdown\n")
8818 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8820 ospf
->stub_router_shutdown_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
8825 static void config_write_stub_router(struct vty
*vty
, struct ospf
*ospf
)
8827 struct listnode
*ln
;
8828 struct ospf_area
*area
;
8830 if (ospf
->stub_router_startup_time
!= OSPF_STUB_ROUTER_UNCONFIGURED
)
8831 vty_out(vty
, " max-metric router-lsa on-startup %u\n",
8832 ospf
->stub_router_startup_time
);
8833 if (ospf
->stub_router_shutdown_time
!= OSPF_STUB_ROUTER_UNCONFIGURED
)
8834 vty_out(vty
, " max-metric router-lsa on-shutdown %u\n",
8835 ospf
->stub_router_shutdown_time
);
8836 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, ln
, area
)) {
8837 if (CHECK_FLAG(area
->stub_router_state
,
8838 OSPF_AREA_ADMIN_STUB_ROUTED
)) {
8839 vty_out(vty
, " max-metric router-lsa administrative\n");
8846 static void show_ip_ospf_route_network(struct vty
*vty
, struct ospf
*ospf
,
8847 struct route_table
*rt
,
8850 struct route_node
*rn
;
8851 struct ospf_route
* or ;
8852 struct listnode
*pnode
, *pnnode
;
8853 struct ospf_path
*path
;
8854 json_object
*json_route
= NULL
, *json_nexthop_array
= NULL
,
8855 *json_nexthop
= NULL
;
8859 "============ OSPF network routing table ============\n");
8861 for (rn
= route_top(rt
); rn
; rn
= route_next(rn
)) {
8862 if ((or = rn
->info
) == NULL
)
8864 char buf1
[PREFIX2STR_BUFFER
];
8866 memset(buf1
, 0, sizeof(buf1
));
8867 prefix2str(&rn
->p
, buf1
, sizeof(buf1
));
8869 json_route
= json_object_new_object();
8871 json_object_object_add(json
, buf1
, json_route
);
8872 json_object_to_json_string_ext(
8873 json
, JSON_C_TO_STRING_NOSLASHESCAPE
);
8876 switch (or->path_type
) {
8877 case OSPF_PATH_INTER_AREA
:
8878 if (or->type
== OSPF_DESTINATION_NETWORK
) {
8880 json_object_string_add(json_route
,
8883 json_object_int_add(json_route
, "cost",
8885 json_object_string_add(
8887 inet_ntoa(or->u
.std
.area_id
));
8890 "N IA %-18s [%d] area: %s\n",
8892 inet_ntoa(or->u
.std
.area_id
));
8894 } else if (or->type
== OSPF_DESTINATION_DISCARD
) {
8896 json_object_string_add(json_route
,
8901 "D IA %-18s Discard entry\n",
8906 case OSPF_PATH_INTRA_AREA
:
8908 json_object_string_add(json_route
, "routeType",
8910 json_object_int_add(json_route
, "cost",
8912 json_object_string_add(
8914 inet_ntoa(or->u
.std
.area_id
));
8916 vty_out(vty
, "N %-18s [%d] area: %s\n",
8918 inet_ntoa(or->u
.std
.area_id
));
8925 if (or->type
== OSPF_DESTINATION_NETWORK
) {
8927 json_nexthop_array
= json_object_new_array();
8928 json_object_object_add(json_route
, "nexthops",
8929 json_nexthop_array
);
8932 for (ALL_LIST_ELEMENTS(or->paths
, pnode
, pnnode
,
8935 json_nexthop
= json_object_new_object();
8936 json_object_array_add(
8940 if (if_lookup_by_index(path
->ifindex
,
8943 if (path
->nexthop
.s_addr
== 0) {
8945 json_object_string_add(
8948 json_object_string_add(
8950 "directly attached to",
8956 "%24s directly attached to %s\n",
8964 json_object_string_add(
8969 json_object_string_add(
8977 "%24s via %s, %s\n",
8990 json_object_free(json_route
);
8996 static void show_ip_ospf_route_router(struct vty
*vty
, struct ospf
*ospf
,
8997 struct route_table
*rtrs
,
9000 struct route_node
*rn
;
9001 struct ospf_route
* or ;
9002 struct listnode
*pnode
;
9003 struct listnode
*node
;
9004 struct ospf_path
*path
;
9005 json_object
*json_route
= NULL
, *json_nexthop_array
= NULL
,
9006 *json_nexthop
= NULL
;
9010 "============ OSPF router routing table =============\n");
9012 for (rn
= route_top(rtrs
); rn
; rn
= route_next(rn
)) {
9013 if (rn
->info
== NULL
)
9017 json_route
= json_object_new_object();
9019 json_object_object_add(json
, inet_ntoa(rn
->p
.u
.prefix4
),
9021 json_object_string_add(json_route
, "routeType", "R ");
9023 vty_out(vty
, "R %-15s ",
9024 inet_ntoa(rn
->p
.u
.prefix4
));
9027 for (ALL_LIST_ELEMENTS_RO((struct list
*)rn
->info
, node
, or)) {
9030 vty_out(vty
, "%24s", "");
9035 json_object_int_add(json_route
, "cost",
9037 json_object_string_add(
9039 inet_ntoa(or->u
.std
.area_id
));
9040 if (or->path_type
== OSPF_PATH_INTER_AREA
)
9041 json_object_boolean_true_add(json_route
,
9043 if (or->u
.std
.flags
& ROUTER_LSA_BORDER
)
9044 json_object_string_add(json_route
,
9047 else if (or->u
.std
.flags
& ROUTER_LSA_EXTERNAL
)
9048 json_object_string_add(json_route
,
9052 vty_out(vty
, "%s [%d] area: %s",
9053 (or->path_type
== OSPF_PATH_INTER_AREA
9056 or->cost
, inet_ntoa(or->u
.std
.area_id
));
9058 vty_out(vty
, "%s%s\n",
9059 (or->u
.std
.flags
& ROUTER_LSA_BORDER
9062 (or->u
.std
.flags
& ROUTER_LSA_EXTERNAL
9068 json_nexthop_array
= json_object_new_array();
9069 json_object_object_add(json_route
, "nexthops",
9070 json_nexthop_array
);
9073 for (ALL_LIST_ELEMENTS_RO(or->paths
, pnode
, path
)) {
9075 json_nexthop
= json_object_new_object();
9076 json_object_array_add(
9080 if (if_lookup_by_index(path
->ifindex
,
9082 if (path
->nexthop
.s_addr
== 0) {
9084 json_object_string_add(
9087 json_object_string_add(
9089 "directly attached to",
9095 "%24s directly attached to %s\n",
9103 json_object_string_add(
9108 json_object_string_add(
9116 "%24s via %s, %s\n",
9129 json_object_free(json_route
);
9135 static void show_ip_ospf_route_external(struct vty
*vty
, struct ospf
*ospf
,
9136 struct route_table
*rt
,
9139 struct route_node
*rn
;
9140 struct ospf_route
*er
;
9141 struct listnode
*pnode
, *pnnode
;
9142 struct ospf_path
*path
;
9143 json_object
*json_route
= NULL
, *json_nexthop_array
= NULL
,
9144 *json_nexthop
= NULL
;
9148 "============ OSPF external routing table ===========\n");
9150 for (rn
= route_top(rt
); rn
; rn
= route_next(rn
)) {
9151 if ((er
= rn
->info
) == NULL
)
9156 snprintf(buf1
, 19, "%s/%d", inet_ntoa(rn
->p
.u
.prefix4
),
9158 json_route
= json_object_new_object();
9160 json_object_object_add(json
, buf1
, json_route
);
9161 json_object_to_json_string_ext(
9162 json
, JSON_C_TO_STRING_NOSLASHESCAPE
);
9165 switch (er
->path_type
) {
9166 case OSPF_PATH_TYPE1_EXTERNAL
:
9168 json_object_string_add(json_route
, "routeType",
9170 json_object_int_add(json_route
, "cost",
9174 "N E1 %-18s [%d] tag: %" ROUTE_TAG_PRI
9176 buf1
, er
->cost
, er
->u
.ext
.tag
);
9179 case OSPF_PATH_TYPE2_EXTERNAL
:
9181 json_object_string_add(json_route
, "routeType",
9183 json_object_int_add(json_route
, "cost",
9187 "N E2 %-18s [%d/%d] tag: %" ROUTE_TAG_PRI
9189 buf1
, er
->cost
, er
->u
.ext
.type2_cost
,
9196 json_nexthop_array
= json_object_new_array();
9197 json_object_object_add(json_route
, "nexthops",
9198 json_nexthop_array
);
9201 for (ALL_LIST_ELEMENTS(er
->paths
, pnode
, pnnode
, path
)) {
9203 json_nexthop
= json_object_new_object();
9204 json_object_array_add(json_nexthop_array
,
9208 if (if_lookup_by_index(path
->ifindex
, ospf
->vrf_id
)) {
9209 if (path
->nexthop
.s_addr
== 0) {
9211 json_object_string_add(
9214 json_object_string_add(
9216 "directly attached to",
9222 "%24s directly attached to %s\n",
9230 json_object_string_add(
9234 json_object_string_add(
9235 json_nexthop
, "via",
9241 "%24s via %s, %s\n",
9253 json_object_free(json_route
);
9259 static int show_ip_ospf_border_routers_common(struct vty
*vty
,
9260 struct ospf
*ospf
, u_char use_vrf
)
9263 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
9265 ospf_show_vrf_name(ospf
, vty
, NULL
, use_vrf
);
9267 if (ospf
->new_table
== NULL
) {
9268 vty_out(vty
, "No OSPF routing information exist\n");
9272 /* Show Network routes.
9273 show_ip_ospf_route_network (vty, ospf->new_table); */
9275 /* Show Router routes. */
9276 show_ip_ospf_route_router(vty
, ospf
, ospf
->new_rtrs
, NULL
);
9283 DEFUN (show_ip_ospf_border_routers
,
9284 show_ip_ospf_border_routers_cmd
,
9285 "show ip ospf [vrf <NAME|all>] border-routers",
9288 "OSPF information\n"
9291 "Show all the ABR's and ASBR's\n")
9293 struct ospf
*ospf
= NULL
;
9294 struct listnode
*node
= NULL
;
9295 char *vrf_name
= NULL
;
9296 bool all_vrf
= FALSE
;
9297 int ret
= CMD_SUCCESS
;
9302 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
9307 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
9308 if (!ospf
->oi_running
)
9311 ret
= show_ip_ospf_border_routers_common(
9312 vty
, ospf
, use_vrf
);
9315 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
9316 if (ospf
== NULL
|| !ospf
->oi_running
)
9319 ret
= show_ip_ospf_border_routers_common(vty
, ospf
,
9323 /* Display default ospf (instance 0) info */
9324 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
9325 if (ospf
== NULL
|| !ospf
->oi_running
)
9327 ret
= show_ip_ospf_border_routers_common(vty
, ospf
, use_vrf
);
9333 DEFUN (show_ip_ospf_instance_border_routers
,
9334 show_ip_ospf_instance_border_routers_cmd
,
9335 "show ip ospf (1-65535) border-routers",
9338 "OSPF information\n"
9340 "Show all the ABR's and ASBR's\n")
9344 u_short instance
= 0;
9346 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
9347 ospf
= ospf_lookup_instance(instance
);
9349 return CMD_NOT_MY_INSTANCE
;
9351 if (!ospf
->oi_running
)
9354 return show_ip_ospf_border_routers_common(vty
, ospf
, 0);
9357 static int show_ip_ospf_route_common(struct vty
*vty
, struct ospf
*ospf
,
9358 json_object
*json
, u_char use_vrf
)
9360 json_object
*json_vrf
= NULL
;
9363 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
9368 json_vrf
= json_object_new_object();
9373 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
9375 if (ospf
->new_table
== NULL
) {
9376 vty_out(vty
, "No OSPF routing information exist\n");
9380 /* Show Network routes. */
9381 show_ip_ospf_route_network(vty
, ospf
, ospf
->new_table
, json_vrf
);
9383 /* Show Router routes. */
9384 show_ip_ospf_route_router(vty
, ospf
, ospf
->new_rtrs
, json_vrf
);
9386 /* Show AS External routes. */
9387 show_ip_ospf_route_external(vty
, ospf
, ospf
->old_external_route
,
9392 // json_object_object_add(json_vrf, "areas",
9394 if (ospf
->vrf_id
== VRF_DEFAULT
)
9395 json_object_object_add(json
, "default",
9398 json_object_object_add(json
, ospf
->name
,
9408 DEFUN (show_ip_ospf_route
,
9409 show_ip_ospf_route_cmd
,
9410 "show ip ospf [vrf <NAME|all>] route [json]",
9413 "OSPF information\n"
9416 "OSPF routing table\n"
9419 struct ospf
*ospf
= NULL
;
9420 struct listnode
*node
= NULL
;
9421 char *vrf_name
= NULL
;
9422 bool all_vrf
= FALSE
;
9423 int ret
= CMD_SUCCESS
;
9427 u_char uj
= use_json(argc
, argv
);
9428 json_object
*json
= NULL
;
9431 json
= json_object_new_object();
9433 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
9435 /* vrf input is provided could be all or specific vrf*/
9439 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
9440 if (!ospf
->oi_running
)
9442 ret
= show_ip_ospf_route_common(vty
, ospf
, json
,
9447 /* Keep Non-pretty format */
9448 vty_out(vty
, "%s\n",
9449 json_object_to_json_string(json
));
9450 json_object_free(json
);
9455 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
9456 if (ospf
== NULL
|| !ospf
->oi_running
) {
9458 json_object_free(json
);
9462 /* Display default ospf (instance 0) info */
9463 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
9464 if (ospf
== NULL
|| !ospf
->oi_running
) {
9466 json_object_free(json
);
9472 ret
= show_ip_ospf_route_common(vty
, ospf
, json
, use_vrf
);
9473 /* Keep Non-pretty format */
9475 vty_out(vty
, "%s\n", json_object_to_json_string(json
));
9479 json_object_free(json
);
9484 DEFUN (show_ip_ospf_instance_route
,
9485 show_ip_ospf_instance_route_cmd
,
9486 "show ip ospf (1-65535) route",
9489 "OSPF information\n"
9491 "OSPF routing table\n")
9495 u_short instance
= 0;
9497 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
9498 ospf
= ospf_lookup_instance(instance
);
9500 return CMD_NOT_MY_INSTANCE
;
9502 if (!ospf
->oi_running
)
9505 return show_ip_ospf_route_common(vty
, ospf
, NULL
, 0);
9509 DEFUN (show_ip_ospf_vrfs
,
9510 show_ip_ospf_vrfs_cmd
,
9511 "show ip ospf vrfs [json]",
9514 "OSPF information\n"
9518 u_char uj
= use_json(argc
, argv
);
9519 json_object
*json
= NULL
;
9520 json_object
*json_vrfs
= NULL
;
9521 struct ospf
*ospf
= NULL
;
9522 struct listnode
*node
= NULL
;
9524 static char header
[] = "Name Id RouterId ";
9527 json
= json_object_new_object();
9528 json_vrfs
= json_object_new_object();
9531 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
9532 json_object
*json_vrf
= NULL
;
9533 const char *name
= NULL
;
9534 int64_t vrf_id_ui
= 0;
9538 if (!uj
&& count
== 1)
9539 vty_out(vty
, "%s\n", header
);
9541 json_vrf
= json_object_new_object();
9543 if (ospf
->vrf_id
== 0)
9544 name
= VRF_DEFAULT_NAME
;
9548 vrf_id_ui
= (ospf
->vrf_id
== VRF_UNKNOWN
)
9550 : (int64_t)ospf
->vrf_id
;
9553 json_object_int_add(json_vrf
, "vrfId", vrf_id_ui
);
9554 json_object_string_add(json_vrf
, "routerId",
9555 inet_ntoa(ospf
->router_id
));
9557 json_object_object_add(json_vrfs
, name
, json_vrf
);
9560 vty_out(vty
, "%-25s %-5d %-16s \n", name
,
9561 ospf
->vrf_id
, inet_ntoa(ospf
->router_id
));
9566 json_object_object_add(json
, "vrfs", json_vrfs
);
9567 json_object_int_add(json
, "totalVrfs", count
);
9569 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
9570 json
, JSON_C_TO_STRING_PRETTY
));
9571 json_object_free(json
);
9574 vty_out(vty
, "\nTotal number of OSPF VRFs: %d\n",
9581 const char *ospf_abr_type_str
[] = {"unknown", "standard", "ibm", "cisco",
9584 const char *ospf_shortcut_mode_str
[] = {"default", "enable", "disable"};
9586 const char *ospf_int_type_str
[] = {"unknown", /* should never be used. */
9587 "point-to-point", "broadcast",
9588 "non-broadcast", "point-to-multipoint",
9589 "virtual-link", /* should never be used. */
9592 static int config_write_interface_one(struct vty
*vty
, struct vrf
*vrf
)
9594 struct listnode
*node
;
9595 struct interface
*ifp
;
9596 struct crypt_key
*ck
;
9597 struct route_node
*rn
= NULL
;
9598 struct ospf_if_params
*params
;
9600 struct ospf
*ospf
= vrf
->info
;
9602 FOR_ALL_INTERFACES (vrf
, ifp
) {
9604 if (memcmp(ifp
->name
, "VLINK", 5) == 0)
9607 vty_frame(vty
, "!\n");
9608 if (ifp
->vrf_id
== VRF_DEFAULT
)
9609 vty_frame(vty
, "interface %s\n", ifp
->name
);
9611 vty_frame(vty
, "interface %s vrf %s\n", ifp
->name
,
9614 vty_out(vty
, " description %s\n", ifp
->desc
);
9618 params
= IF_DEF_PARAMS(ifp
);
9621 /* Interface Network print. */
9622 if (OSPF_IF_PARAM_CONFIGURED(params
, type
)
9623 && params
->type
!= OSPF_IFTYPE_LOOPBACK
) {
9624 if (params
->type
!= ospf_default_iftype(ifp
)) {
9625 vty_out(vty
, " ip ospf network %s",
9628 if (params
!= IF_DEF_PARAMS(ifp
))
9636 /* OSPF interface authentication print */
9637 if (OSPF_IF_PARAM_CONFIGURED(params
, auth_type
)
9638 && params
->auth_type
!= OSPF_AUTH_NOTSET
) {
9639 const char *auth_str
;
9641 /* Translation tables are not that much help
9642 * here due to syntax
9643 * of the simple option */
9644 switch (params
->auth_type
) {
9646 case OSPF_AUTH_NULL
:
9650 case OSPF_AUTH_SIMPLE
:
9654 case OSPF_AUTH_CRYPTOGRAPHIC
:
9655 auth_str
= " message-digest";
9663 vty_out(vty
, " ip ospf authentication%s",
9665 if (params
!= IF_DEF_PARAMS(ifp
))
9667 inet_ntoa(rn
->p
.u
.prefix4
));
9671 /* Simple Authentication Password print. */
9672 if (OSPF_IF_PARAM_CONFIGURED(params
, auth_simple
)
9673 && params
->auth_simple
[0] != '\0') {
9674 vty_out(vty
, " ip ospf authentication-key %s",
9675 params
->auth_simple
);
9676 if (params
!= IF_DEF_PARAMS(ifp
))
9678 inet_ntoa(rn
->p
.u
.prefix4
));
9682 /* Cryptographic Authentication Key print. */
9683 if (params
&& params
->auth_crypt
) {
9684 for (ALL_LIST_ELEMENTS_RO(params
->auth_crypt
,
9687 " ip ospf message-digest-key %d md5 %s",
9688 ck
->key_id
, ck
->auth_key
);
9689 if (params
!= IF_DEF_PARAMS(ifp
))
9697 /* Interface Output Cost print. */
9698 if (OSPF_IF_PARAM_CONFIGURED(params
, output_cost_cmd
)) {
9699 vty_out(vty
, " ip ospf cost %u",
9700 params
->output_cost_cmd
);
9701 if (params
!= IF_DEF_PARAMS(ifp
))
9703 inet_ntoa(rn
->p
.u
.prefix4
));
9707 /* Hello Interval print. */
9708 if (OSPF_IF_PARAM_CONFIGURED(params
, v_hello
)
9709 && params
->v_hello
!= OSPF_HELLO_INTERVAL_DEFAULT
) {
9710 vty_out(vty
, " ip ospf hello-interval %u",
9712 if (params
!= IF_DEF_PARAMS(ifp
))
9714 inet_ntoa(rn
->p
.u
.prefix4
));
9719 /* Router Dead Interval print. */
9720 if (OSPF_IF_PARAM_CONFIGURED(params
, v_wait
)
9722 != OSPF_ROUTER_DEAD_INTERVAL_DEFAULT
) {
9723 vty_out(vty
, " ip ospf dead-interval ");
9726 if (OSPF_IF_PARAM_CONFIGURED(params
,
9729 "minimal hello-multiplier %d",
9730 params
->fast_hello
);
9732 vty_out(vty
, "%u", params
->v_wait
);
9734 if (params
!= IF_DEF_PARAMS(ifp
))
9736 inet_ntoa(rn
->p
.u
.prefix4
));
9740 /* Router Priority print. */
9741 if (OSPF_IF_PARAM_CONFIGURED(params
, priority
)
9743 != OSPF_ROUTER_PRIORITY_DEFAULT
) {
9744 vty_out(vty
, " ip ospf priority %u",
9746 if (params
!= IF_DEF_PARAMS(ifp
))
9748 inet_ntoa(rn
->p
.u
.prefix4
));
9752 /* Retransmit Interval print. */
9753 if (OSPF_IF_PARAM_CONFIGURED(params
,
9754 retransmit_interval
)
9755 && params
->retransmit_interval
9756 != OSPF_RETRANSMIT_INTERVAL_DEFAULT
) {
9757 vty_out(vty
, " ip ospf retransmit-interval %u",
9758 params
->retransmit_interval
);
9759 if (params
!= IF_DEF_PARAMS(ifp
))
9761 inet_ntoa(rn
->p
.u
.prefix4
));
9765 /* Transmit Delay print. */
9766 if (OSPF_IF_PARAM_CONFIGURED(params
, transmit_delay
)
9767 && params
->transmit_delay
9768 != OSPF_TRANSMIT_DELAY_DEFAULT
) {
9769 vty_out(vty
, " ip ospf transmit-delay %u",
9770 params
->transmit_delay
);
9771 if (params
!= IF_DEF_PARAMS(ifp
))
9773 inet_ntoa(rn
->p
.u
.prefix4
));
9778 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
)) {
9779 if (ospf
&& ospf
->instance
)
9780 vty_out(vty
, " ip ospf %d",
9783 vty_out(vty
, " ip ospf");
9786 size_t buflen
= MAX(strlen("4294967295"),
9787 strlen("255.255.255.255"));
9790 area_id2str(buf
, sizeof(buf
), ¶ms
->if_area
,
9791 params
->if_area_id_fmt
);
9792 vty_out(vty
, " area %s", buf
);
9793 if (params
!= IF_DEF_PARAMS(ifp
))
9795 inet_ntoa(rn
->p
.u
.prefix4
));
9800 if (params
->bfd_info
)
9801 ospf_bfd_write_config(vty
, params
);
9803 /* MTU ignore print. */
9804 if (OSPF_IF_PARAM_CONFIGURED(params
, mtu_ignore
)
9805 && params
->mtu_ignore
!= OSPF_MTU_IGNORE_DEFAULT
) {
9806 if (params
->mtu_ignore
== 0)
9807 vty_out(vty
, " no ip ospf mtu-ignore");
9809 vty_out(vty
, " ip ospf mtu-ignore");
9810 if (params
!= IF_DEF_PARAMS(ifp
))
9812 inet_ntoa(rn
->p
.u
.prefix4
));
9819 rn
= route_top(IF_OIFS_PARAMS(ifp
));
9821 rn
= route_next(rn
);
9831 ospf_opaque_config_write_if(vty
, ifp
);
9833 vty_endframe(vty
, NULL
);
9839 /* Configuration write function for ospfd. */
9840 static int config_write_interface(struct vty
*vty
)
9843 struct vrf
*vrf
= NULL
;
9845 /* Display all VRF aware OSPF interface configuration */
9846 RB_FOREACH (vrf
, vrf_name_head
, &vrfs_by_name
) {
9847 write
+= config_write_interface_one(vty
, vrf
);
9853 static int config_write_network_area(struct vty
*vty
, struct ospf
*ospf
)
9855 struct route_node
*rn
;
9856 u_char buf
[INET_ADDRSTRLEN
];
9858 /* `network area' print. */
9859 for (rn
= route_top(ospf
->networks
); rn
; rn
= route_next(rn
))
9861 struct ospf_network
*n
= rn
->info
;
9863 memset(buf
, 0, INET_ADDRSTRLEN
);
9865 /* Create Area ID string by specified Area ID format. */
9866 if (n
->area_id_fmt
== OSPF_AREA_ID_FMT_DOTTEDQUAD
)
9867 strncpy((char *)buf
, inet_ntoa(n
->area_id
),
9870 sprintf((char *)buf
, "%lu",
9871 (unsigned long int)ntohl(
9872 n
->area_id
.s_addr
));
9874 /* Network print. */
9875 vty_out(vty
, " network %s/%d area %s\n",
9876 inet_ntoa(rn
->p
.u
.prefix4
), rn
->p
.prefixlen
,
9883 static int config_write_ospf_area(struct vty
*vty
, struct ospf
*ospf
)
9885 struct listnode
*node
;
9886 struct ospf_area
*area
;
9887 u_char buf
[INET_ADDRSTRLEN
];
9889 /* Area configuration print. */
9890 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
)) {
9891 struct route_node
*rn1
;
9893 area_id2str((char *)buf
, INET_ADDRSTRLEN
, &area
->area_id
,
9896 if (area
->auth_type
!= OSPF_AUTH_NULL
) {
9897 if (area
->auth_type
== OSPF_AUTH_SIMPLE
)
9898 vty_out(vty
, " area %s authentication\n", buf
);
9901 " area %s authentication message-digest\n",
9905 if (area
->shortcut_configured
!= OSPF_SHORTCUT_DEFAULT
)
9906 vty_out(vty
, " area %s shortcut %s\n", buf
,
9907 ospf_shortcut_mode_str
9908 [area
->shortcut_configured
]);
9910 if ((area
->external_routing
== OSPF_AREA_STUB
)
9911 || (area
->external_routing
== OSPF_AREA_NSSA
)) {
9912 if (area
->external_routing
== OSPF_AREA_STUB
) {
9913 vty_out(vty
, " area %s stub", buf
);
9914 if (area
->no_summary
)
9915 vty_out(vty
, " no-summary\n");
9917 } else if (area
->external_routing
== OSPF_AREA_NSSA
) {
9918 switch (area
->NSSATranslatorRole
) {
9919 case OSPF_NSSA_ROLE_NEVER
:
9921 " area %s nssa translate-never\n",
9924 case OSPF_NSSA_ROLE_ALWAYS
:
9926 " area %s nssa translate-always\n",
9929 case OSPF_NSSA_ROLE_CANDIDATE
:
9930 vty_out(vty
, " area %s nssa \n", buf
);
9933 if (area
->no_summary
)
9935 " area %s nssa no-summary\n",
9939 if (area
->default_cost
!= 1)
9940 vty_out(vty
, " area %s default-cost %d\n", buf
,
9941 area
->default_cost
);
9944 for (rn1
= route_top(area
->ranges
); rn1
; rn1
= route_next(rn1
))
9946 struct ospf_area_range
*range
= rn1
->info
;
9948 vty_out(vty
, " area %s range %s/%d", buf
,
9949 inet_ntoa(rn1
->p
.u
.prefix4
),
9952 if (range
->cost_config
9953 != OSPF_AREA_RANGE_COST_UNSPEC
)
9954 vty_out(vty
, " cost %d",
9955 range
->cost_config
);
9957 if (!CHECK_FLAG(range
->flags
,
9958 OSPF_AREA_RANGE_ADVERTISE
))
9959 vty_out(vty
, " not-advertise");
9961 if (CHECK_FLAG(range
->flags
,
9962 OSPF_AREA_RANGE_SUBSTITUTE
))
9963 vty_out(vty
, " substitute %s/%d",
9964 inet_ntoa(range
->subst_addr
),
9965 range
->subst_masklen
);
9970 if (EXPORT_NAME(area
))
9971 vty_out(vty
, " area %s export-list %s\n", buf
,
9974 if (IMPORT_NAME(area
))
9975 vty_out(vty
, " area %s import-list %s\n", buf
,
9978 if (PREFIX_NAME_IN(area
))
9979 vty_out(vty
, " area %s filter-list prefix %s in\n", buf
,
9980 PREFIX_NAME_IN(area
));
9982 if (PREFIX_NAME_OUT(area
))
9983 vty_out(vty
, " area %s filter-list prefix %s out\n",
9984 buf
, PREFIX_NAME_OUT(area
));
9990 static int config_write_ospf_nbr_nbma(struct vty
*vty
, struct ospf
*ospf
)
9992 struct ospf_nbr_nbma
*nbr_nbma
;
9993 struct route_node
*rn
;
9995 /* Static Neighbor configuration print. */
9996 for (rn
= route_top(ospf
->nbr_nbma
); rn
; rn
= route_next(rn
))
9997 if ((nbr_nbma
= rn
->info
)) {
9998 vty_out(vty
, " neighbor %s", inet_ntoa(nbr_nbma
->addr
));
10000 if (nbr_nbma
->priority
10001 != OSPF_NEIGHBOR_PRIORITY_DEFAULT
)
10002 vty_out(vty
, " priority %d",
10003 nbr_nbma
->priority
);
10005 if (nbr_nbma
->v_poll
!= OSPF_POLL_INTERVAL_DEFAULT
)
10006 vty_out(vty
, " poll-interval %d",
10009 vty_out(vty
, "\n");
10015 static int config_write_virtual_link(struct vty
*vty
, struct ospf
*ospf
)
10017 struct listnode
*node
;
10018 struct ospf_vl_data
*vl_data
;
10019 char buf
[INET_ADDRSTRLEN
];
10021 /* Virtual-Link print */
10022 for (ALL_LIST_ELEMENTS_RO(ospf
->vlinks
, node
, vl_data
)) {
10023 struct listnode
*n2
;
10024 struct crypt_key
*ck
;
10025 struct ospf_interface
*oi
;
10027 if (vl_data
!= NULL
) {
10028 memset(buf
, 0, INET_ADDRSTRLEN
);
10030 area_id2str(buf
, sizeof(buf
), &vl_data
->vl_area_id
,
10031 vl_data
->vl_area_id_fmt
);
10032 oi
= vl_data
->vl_oi
;
10035 if (OSPF_IF_PARAM(oi
, v_hello
)
10036 != OSPF_HELLO_INTERVAL_DEFAULT
10037 || OSPF_IF_PARAM(oi
, v_wait
)
10038 != OSPF_ROUTER_DEAD_INTERVAL_DEFAULT
10039 || OSPF_IF_PARAM(oi
, retransmit_interval
)
10040 != OSPF_RETRANSMIT_INTERVAL_DEFAULT
10041 || OSPF_IF_PARAM(oi
, transmit_delay
)
10042 != OSPF_TRANSMIT_DELAY_DEFAULT
)
10044 " area %s virtual-link %s hello-interval %d retransmit-interval %d transmit-delay %d dead-interval %d\n",
10045 buf
, inet_ntoa(vl_data
->vl_peer
),
10046 OSPF_IF_PARAM(oi
, v_hello
),
10047 OSPF_IF_PARAM(oi
, retransmit_interval
),
10048 OSPF_IF_PARAM(oi
, transmit_delay
),
10049 OSPF_IF_PARAM(oi
, v_wait
));
10051 vty_out(vty
, " area %s virtual-link %s\n", buf
,
10052 inet_ntoa(vl_data
->vl_peer
));
10054 if (IF_DEF_PARAMS(vl_data
->vl_oi
->ifp
)->auth_simple
[0]
10057 " area %s virtual-link %s authentication-key %s\n",
10058 buf
, inet_ntoa(vl_data
->vl_peer
),
10059 IF_DEF_PARAMS(vl_data
->vl_oi
->ifp
)
10062 for (ALL_LIST_ELEMENTS_RO(
10063 IF_DEF_PARAMS(vl_data
->vl_oi
->ifp
)
10067 " area %s virtual-link %s"
10068 " message-digest-key %d md5 %s\n",
10069 buf
, inet_ntoa(vl_data
->vl_peer
),
10070 ck
->key_id
, ck
->auth_key
);
10078 static int config_write_ospf_redistribute(struct vty
*vty
, struct ospf
*ospf
)
10082 /* redistribute print. */
10083 for (type
= 0; type
< ZEBRA_ROUTE_MAX
; type
++) {
10084 struct list
*red_list
;
10085 struct listnode
*node
;
10086 struct ospf_redist
*red
;
10088 red_list
= ospf
->redist
[type
];
10092 for (ALL_LIST_ELEMENTS_RO(red_list
, node
, red
)) {
10093 vty_out(vty
, " redistribute %s",
10094 zebra_route_string(type
));
10096 vty_out(vty
, " %d", red
->instance
);
10098 if (red
->dmetric
.value
>= 0)
10099 vty_out(vty
, " metric %d", red
->dmetric
.value
);
10101 if (red
->dmetric
.type
== EXTERNAL_METRIC_TYPE_1
)
10102 vty_out(vty
, " metric-type 1");
10104 if (ROUTEMAP_NAME(red
))
10105 vty_out(vty
, " route-map %s",
10106 ROUTEMAP_NAME(red
));
10108 vty_out(vty
, "\n");
10115 static int config_write_ospf_default_metric(struct vty
*vty
, struct ospf
*ospf
)
10117 if (ospf
->default_metric
!= -1)
10118 vty_out(vty
, " default-metric %d\n", ospf
->default_metric
);
10122 static int config_write_ospf_distribute(struct vty
*vty
, struct ospf
*ospf
)
10125 struct ospf_redist
*red
;
10128 /* distribute-list print. */
10129 for (type
= 0; type
< ZEBRA_ROUTE_MAX
; type
++)
10130 if (DISTRIBUTE_NAME(ospf
, type
))
10131 vty_out(vty
, " distribute-list %s out %s\n",
10132 DISTRIBUTE_NAME(ospf
, type
),
10133 zebra_route_string(type
));
10135 /* default-information print. */
10136 if (ospf
->default_originate
!= DEFAULT_ORIGINATE_NONE
) {
10137 vty_out(vty
, " default-information originate");
10138 if (ospf
->default_originate
== DEFAULT_ORIGINATE_ALWAYS
)
10139 vty_out(vty
, " always");
10141 red
= ospf_redist_lookup(ospf
, DEFAULT_ROUTE
, 0);
10143 if (red
->dmetric
.value
>= 0)
10144 vty_out(vty
, " metric %d",
10145 red
->dmetric
.value
);
10147 if (red
->dmetric
.type
== EXTERNAL_METRIC_TYPE_1
)
10148 vty_out(vty
, " metric-type 1");
10150 if (ROUTEMAP_NAME(red
))
10151 vty_out(vty
, " route-map %s",
10152 ROUTEMAP_NAME(red
));
10155 vty_out(vty
, "\n");
10162 static int config_write_ospf_distance(struct vty
*vty
, struct ospf
*ospf
)
10164 struct route_node
*rn
;
10165 struct ospf_distance
*odistance
;
10167 if (ospf
->distance_all
)
10168 vty_out(vty
, " distance %d\n", ospf
->distance_all
);
10170 if (ospf
->distance_intra
|| ospf
->distance_inter
10171 || ospf
->distance_external
) {
10172 vty_out(vty
, " distance ospf");
10174 if (ospf
->distance_intra
)
10175 vty_out(vty
, " intra-area %d", ospf
->distance_intra
);
10176 if (ospf
->distance_inter
)
10177 vty_out(vty
, " inter-area %d", ospf
->distance_inter
);
10178 if (ospf
->distance_external
)
10179 vty_out(vty
, " external %d", ospf
->distance_external
);
10181 vty_out(vty
, "\n");
10184 for (rn
= route_top(ospf
->distance_table
); rn
; rn
= route_next(rn
))
10185 if ((odistance
= rn
->info
) != NULL
) {
10186 vty_out(vty
, " distance %d %s/%d %s\n",
10187 odistance
->distance
, inet_ntoa(rn
->p
.u
.prefix4
),
10189 odistance
->access_list
? odistance
->access_list
10195 static int ospf_config_write_one(struct vty
*vty
, struct ospf
*ospf
)
10197 struct vrf
*vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
10198 struct interface
*ifp
;
10199 struct ospf_interface
*oi
;
10200 struct listnode
*node
= NULL
;
10203 /* `router ospf' print. */
10204 if (ospf
->instance
&& ospf
->name
) {
10205 vty_out(vty
, "router ospf %d vrf %s\n", ospf
->instance
,
10207 } else if (ospf
->instance
) {
10208 vty_out(vty
, "router ospf %d\n", ospf
->instance
);
10209 } else if (ospf
->name
) {
10210 vty_out(vty
, "router ospf vrf %s\n", ospf
->name
);
10212 vty_out(vty
, "router ospf\n");
10214 if (!ospf
->networks
) {
10219 /* Router ID print. */
10220 if (ospf
->router_id_static
.s_addr
!= 0)
10221 vty_out(vty
, " ospf router-id %s\n",
10222 inet_ntoa(ospf
->router_id_static
));
10224 /* ABR type print. */
10225 if (ospf
->abr_type
!= OSPF_ABR_DEFAULT
)
10226 vty_out(vty
, " ospf abr-type %s\n",
10227 ospf_abr_type_str
[ospf
->abr_type
]);
10229 /* log-adjacency-changes flag print. */
10230 if (CHECK_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_CHANGES
)) {
10231 if (CHECK_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_DETAIL
))
10232 vty_out(vty
, " log-adjacency-changes detail\n");
10233 else if (!DFLT_OSPF_LOG_ADJACENCY_CHANGES
)
10234 vty_out(vty
, " log-adjacency-changes\n");
10235 } else if (DFLT_OSPF_LOG_ADJACENCY_CHANGES
) {
10236 vty_out(vty
, " no log-adjacency-changes\n");
10239 /* RFC1583 compatibility flag print -- Compatible with CISCO
10241 if (CHECK_FLAG(ospf
->config
, OSPF_RFC1583_COMPATIBLE
))
10242 vty_out(vty
, " compatible rfc1583\n");
10244 /* auto-cost reference-bandwidth configuration. */
10245 if (ospf
->ref_bandwidth
!= OSPF_DEFAULT_REF_BANDWIDTH
) {
10247 "! Important: ensure reference bandwidth "
10248 "is consistent across all routers\n");
10249 vty_out(vty
, " auto-cost reference-bandwidth %d\n",
10250 ospf
->ref_bandwidth
);
10253 /* SPF timers print. */
10254 if (ospf
->spf_delay
!= OSPF_SPF_DELAY_DEFAULT
10255 || ospf
->spf_holdtime
!= OSPF_SPF_HOLDTIME_DEFAULT
10256 || ospf
->spf_max_holdtime
!= OSPF_SPF_MAX_HOLDTIME_DEFAULT
)
10257 vty_out(vty
, " timers throttle spf %d %d %d\n", ospf
->spf_delay
,
10258 ospf
->spf_holdtime
, ospf
->spf_max_holdtime
);
10260 /* LSA timers print. */
10261 if (ospf
->min_ls_interval
!= OSPF_MIN_LS_INTERVAL
)
10262 vty_out(vty
, " timers throttle lsa all %d\n",
10263 ospf
->min_ls_interval
);
10264 if (ospf
->min_ls_arrival
!= OSPF_MIN_LS_ARRIVAL
)
10265 vty_out(vty
, " timers lsa min-arrival %d\n",
10266 ospf
->min_ls_arrival
);
10268 /* Write multiplier print. */
10269 if (ospf
->write_oi_count
!= OSPF_WRITE_INTERFACE_COUNT_DEFAULT
)
10270 vty_out(vty
, " ospf write-multiplier %d\n",
10271 ospf
->write_oi_count
);
10273 /* Max-metric router-lsa print */
10274 config_write_stub_router(vty
, ospf
);
10276 /* SPF refresh parameters print. */
10277 if (ospf
->lsa_refresh_interval
!= OSPF_LSA_REFRESH_INTERVAL_DEFAULT
)
10278 vty_out(vty
, " refresh timer %d\n", ospf
->lsa_refresh_interval
);
10280 /* Redistribute information print. */
10281 config_write_ospf_redistribute(vty
, ospf
);
10283 /* passive-interface print. */
10284 if (ospf
->passive_interface_default
== OSPF_IF_PASSIVE
)
10285 vty_out(vty
, " passive-interface default\n");
10287 FOR_ALL_INTERFACES (vrf
, ifp
)
10288 if (OSPF_IF_PARAM_CONFIGURED(IF_DEF_PARAMS(ifp
),
10290 && IF_DEF_PARAMS(ifp
)->passive_interface
10291 != ospf
->passive_interface_default
) {
10292 vty_out(vty
, " %spassive-interface %s\n",
10293 IF_DEF_PARAMS(ifp
)->passive_interface
? ""
10297 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
10298 if (!OSPF_IF_PARAM_CONFIGURED(oi
->params
, passive_interface
))
10300 if (OSPF_IF_PARAM_CONFIGURED(IF_DEF_PARAMS(oi
->ifp
),
10301 passive_interface
)) {
10302 if (oi
->params
->passive_interface
10303 == IF_DEF_PARAMS(oi
->ifp
)->passive_interface
)
10305 } else if (oi
->params
->passive_interface
10306 == ospf
->passive_interface_default
)
10309 vty_out(vty
, " %spassive-interface %s %s\n",
10310 oi
->params
->passive_interface
? "" : "no ",
10311 oi
->ifp
->name
, inet_ntoa(oi
->address
->u
.prefix4
));
10314 /* Network area print. */
10315 config_write_network_area(vty
, ospf
);
10317 /* Area config print. */
10318 config_write_ospf_area(vty
, ospf
);
10320 /* static neighbor print. */
10321 config_write_ospf_nbr_nbma(vty
, ospf
);
10323 /* Virtual-Link print. */
10324 config_write_virtual_link(vty
, ospf
);
10326 /* Default metric configuration. */
10327 config_write_ospf_default_metric(vty
, ospf
);
10329 /* Distribute-list and default-information print. */
10330 config_write_ospf_distribute(vty
, ospf
);
10332 /* Distance configuration. */
10333 config_write_ospf_distance(vty
, ospf
);
10335 ospf_opaque_config_write_router(vty
, ospf
);
10341 /* OSPF configuration write function. */
10342 static int ospf_config_write(struct vty
*vty
)
10345 struct listnode
*ospf_node
= NULL
;
10348 if (listcount(om
->ospf
) == 0)
10351 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, ospf_node
, ospf
)) {
10352 /* VRF Default check if it is running.
10353 * Upon daemon start, there could be default instance
10354 * in absence of 'router ospf'/oi_running is disabled. */
10355 if (ospf
->vrf_id
== VRF_DEFAULT
&& ospf
->oi_running
)
10356 write
+= ospf_config_write_one(vty
, ospf
);
10357 /* For Non-Default VRF simply display the configuration,
10358 * even if it is not oi_running. */
10359 else if (ospf
->vrf_id
!= VRF_DEFAULT
)
10360 write
+= ospf_config_write_one(vty
, ospf
);
10365 void ospf_vty_show_init(void)
10367 /* "show ip ospf" commands. */
10368 install_element(VIEW_NODE
, &show_ip_ospf_cmd
);
10370 install_element(VIEW_NODE
, &show_ip_ospf_instance_cmd
);
10372 /* "show ip ospf database" commands. */
10373 install_element(VIEW_NODE
, &show_ip_ospf_database_max_cmd
);
10375 install_element(VIEW_NODE
,
10376 &show_ip_ospf_instance_database_type_adv_router_cmd
);
10377 install_element(VIEW_NODE
, &show_ip_ospf_instance_database_cmd
);
10378 install_element(VIEW_NODE
, &show_ip_ospf_instance_database_max_cmd
);
10380 /* "show ip ospf interface" commands. */
10381 install_element(VIEW_NODE
, &show_ip_ospf_interface_cmd
);
10383 install_element(VIEW_NODE
, &show_ip_ospf_instance_interface_cmd
);
10384 /* "show ip ospf interface traffic */
10385 install_element(VIEW_NODE
, &show_ip_ospf_interface_traffic_cmd
);
10387 /* "show ip ospf neighbor" commands. */
10388 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_int_detail_cmd
);
10389 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_int_cmd
);
10390 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_id_cmd
);
10391 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_detail_all_cmd
);
10392 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_detail_cmd
);
10393 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_cmd
);
10394 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_all_cmd
);
10396 install_element(VIEW_NODE
,
10397 &show_ip_ospf_instance_neighbor_int_detail_cmd
);
10398 install_element(VIEW_NODE
, &show_ip_ospf_instance_neighbor_int_cmd
);
10399 install_element(VIEW_NODE
, &show_ip_ospf_instance_neighbor_id_cmd
);
10400 install_element(VIEW_NODE
,
10401 &show_ip_ospf_instance_neighbor_detail_all_cmd
);
10402 install_element(VIEW_NODE
, &show_ip_ospf_instance_neighbor_detail_cmd
);
10403 install_element(VIEW_NODE
, &show_ip_ospf_instance_neighbor_cmd
);
10404 install_element(VIEW_NODE
, &show_ip_ospf_instance_neighbor_all_cmd
);
10406 /* "show ip ospf route" commands. */
10407 install_element(VIEW_NODE
, &show_ip_ospf_route_cmd
);
10408 install_element(VIEW_NODE
, &show_ip_ospf_border_routers_cmd
);
10410 install_element(VIEW_NODE
, &show_ip_ospf_instance_route_cmd
);
10411 install_element(VIEW_NODE
, &show_ip_ospf_instance_border_routers_cmd
);
10413 /* "show ip ospf vrfs" commands. */
10414 install_element(VIEW_NODE
, &show_ip_ospf_vrfs_cmd
);
10418 /* ospfd's interface node. */
10419 static struct cmd_node interface_node
= {INTERFACE_NODE
, "%s(config-if)# ", 1};
10421 /* Initialization of OSPF interface. */
10422 static void ospf_vty_if_init(void)
10424 /* Install interface node. */
10425 install_node(&interface_node
, config_write_interface
);
10428 /* "ip ospf authentication" commands. */
10429 install_element(INTERFACE_NODE
, &ip_ospf_authentication_args_addr_cmd
);
10430 install_element(INTERFACE_NODE
, &ip_ospf_authentication_addr_cmd
);
10431 install_element(INTERFACE_NODE
,
10432 &no_ip_ospf_authentication_args_addr_cmd
);
10433 install_element(INTERFACE_NODE
, &no_ip_ospf_authentication_addr_cmd
);
10434 install_element(INTERFACE_NODE
, &ip_ospf_authentication_key_addr_cmd
);
10435 install_element(INTERFACE_NODE
,
10436 &no_ip_ospf_authentication_key_authkey_addr_cmd
);
10437 install_element(INTERFACE_NODE
,
10438 &no_ospf_authentication_key_authkey_addr_cmd
);
10440 /* "ip ospf message-digest-key" commands. */
10441 install_element(INTERFACE_NODE
, &ip_ospf_message_digest_key_cmd
);
10442 install_element(INTERFACE_NODE
, &no_ip_ospf_message_digest_key_cmd
);
10444 /* "ip ospf cost" commands. */
10445 install_element(INTERFACE_NODE
, &ip_ospf_cost_cmd
);
10446 install_element(INTERFACE_NODE
, &no_ip_ospf_cost_cmd
);
10448 /* "ip ospf mtu-ignore" commands. */
10449 install_element(INTERFACE_NODE
, &ip_ospf_mtu_ignore_addr_cmd
);
10450 install_element(INTERFACE_NODE
, &no_ip_ospf_mtu_ignore_addr_cmd
);
10452 /* "ip ospf dead-interval" commands. */
10453 install_element(INTERFACE_NODE
, &ip_ospf_dead_interval_cmd
);
10454 install_element(INTERFACE_NODE
,
10455 &ip_ospf_dead_interval_minimal_addr_cmd
);
10456 install_element(INTERFACE_NODE
, &no_ip_ospf_dead_interval_cmd
);
10458 /* "ip ospf hello-interval" commands. */
10459 install_element(INTERFACE_NODE
, &ip_ospf_hello_interval_cmd
);
10460 install_element(INTERFACE_NODE
, &no_ip_ospf_hello_interval_cmd
);
10462 /* "ip ospf network" commands. */
10463 install_element(INTERFACE_NODE
, &ip_ospf_network_cmd
);
10464 install_element(INTERFACE_NODE
, &no_ip_ospf_network_cmd
);
10466 /* "ip ospf priority" commands. */
10467 install_element(INTERFACE_NODE
, &ip_ospf_priority_cmd
);
10468 install_element(INTERFACE_NODE
, &no_ip_ospf_priority_cmd
);
10470 /* "ip ospf retransmit-interval" commands. */
10471 install_element(INTERFACE_NODE
, &ip_ospf_retransmit_interval_addr_cmd
);
10472 install_element(INTERFACE_NODE
,
10473 &no_ip_ospf_retransmit_interval_addr_cmd
);
10475 /* "ip ospf transmit-delay" commands. */
10476 install_element(INTERFACE_NODE
, &ip_ospf_transmit_delay_addr_cmd
);
10477 install_element(INTERFACE_NODE
, &no_ip_ospf_transmit_delay_addr_cmd
);
10479 /* "ip ospf area" commands. */
10480 install_element(INTERFACE_NODE
, &ip_ospf_area_cmd
);
10481 install_element(INTERFACE_NODE
, &no_ip_ospf_area_cmd
);
10483 /* These commands are compatibitliy for previous version. */
10484 install_element(INTERFACE_NODE
, &ospf_authentication_key_cmd
);
10485 install_element(INTERFACE_NODE
, &ospf_message_digest_key_cmd
);
10486 install_element(INTERFACE_NODE
, &no_ospf_message_digest_key_cmd
);
10487 install_element(INTERFACE_NODE
, &ospf_dead_interval_cmd
);
10488 install_element(INTERFACE_NODE
, &no_ospf_dead_interval_cmd
);
10489 install_element(INTERFACE_NODE
, &ospf_hello_interval_cmd
);
10490 install_element(INTERFACE_NODE
, &no_ospf_hello_interval_cmd
);
10491 install_element(INTERFACE_NODE
, &ospf_cost_cmd
);
10492 install_element(INTERFACE_NODE
, &no_ospf_cost_cmd
);
10493 install_element(INTERFACE_NODE
, &ospf_network_cmd
);
10494 install_element(INTERFACE_NODE
, &no_ospf_network_cmd
);
10495 install_element(INTERFACE_NODE
, &ospf_priority_cmd
);
10496 install_element(INTERFACE_NODE
, &no_ospf_priority_cmd
);
10497 install_element(INTERFACE_NODE
, &ospf_retransmit_interval_cmd
);
10498 install_element(INTERFACE_NODE
, &no_ospf_retransmit_interval_cmd
);
10499 install_element(INTERFACE_NODE
, &ospf_transmit_delay_cmd
);
10500 install_element(INTERFACE_NODE
, &no_ospf_transmit_delay_cmd
);
10503 static void ospf_vty_zebra_init(void)
10505 install_element(OSPF_NODE
, &ospf_redistribute_source_cmd
);
10506 install_element(OSPF_NODE
, &no_ospf_redistribute_source_cmd
);
10507 install_element(OSPF_NODE
, &ospf_redistribute_instance_source_cmd
);
10508 install_element(OSPF_NODE
, &no_ospf_redistribute_instance_source_cmd
);
10510 install_element(OSPF_NODE
, &ospf_distribute_list_out_cmd
);
10511 install_element(OSPF_NODE
, &no_ospf_distribute_list_out_cmd
);
10513 install_element(OSPF_NODE
, &ospf_default_information_originate_cmd
);
10514 install_element(OSPF_NODE
, &no_ospf_default_information_originate_cmd
);
10516 install_element(OSPF_NODE
, &ospf_default_metric_cmd
);
10517 install_element(OSPF_NODE
, &no_ospf_default_metric_cmd
);
10519 install_element(OSPF_NODE
, &ospf_distance_cmd
);
10520 install_element(OSPF_NODE
, &no_ospf_distance_cmd
);
10521 install_element(OSPF_NODE
, &no_ospf_distance_ospf_cmd
);
10522 install_element(OSPF_NODE
, &ospf_distance_ospf_cmd
);
10524 install_element (OSPF_NODE
, &ospf_distance_source_cmd
);
10525 install_element (OSPF_NODE
, &no_ospf_distance_source_cmd
);
10526 install_element (OSPF_NODE
, &ospf_distance_source_access_list_cmd
);
10527 install_element (OSPF_NODE
, &no_ospf_distance_source_access_list_cmd
);
10531 static struct cmd_node ospf_node
= {OSPF_NODE
, "%s(config-router)# ", 1};
10533 static void ospf_interface_clear(struct interface
*ifp
)
10535 if (!if_is_operative(ifp
))
10538 if (IS_DEBUG_OSPF(ism
, ISM_EVENTS
))
10539 zlog_debug("ISM[%s]: clear by reset", ifp
->name
);
10541 ospf_if_reset(ifp
);
10544 DEFUN (clear_ip_ospf_interface
,
10545 clear_ip_ospf_interface_cmd
,
10546 "clear ip ospf interface [IFNAME]",
10549 "OSPF information\n"
10550 "Interface information\n"
10551 "Interface name\n")
10553 int idx_ifname
= 4;
10554 struct interface
*ifp
;
10555 struct listnode
*node
;
10556 struct ospf
*ospf
= NULL
;
10558 if (argc
== 4) /* Clear all the ospfv2 interfaces. */
10560 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
10561 struct vrf
*vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
10562 FOR_ALL_INTERFACES (vrf
, ifp
)
10563 ospf_interface_clear(ifp
);
10566 /* Interface name is specified. */
10567 ifp
= if_lookup_by_name_all_vrf(argv
[idx_ifname
]->arg
);
10569 vty_out(vty
, "No such interface name\n");
10571 ospf_interface_clear(ifp
);
10574 return CMD_SUCCESS
;
10577 void ospf_vty_clear_init(void)
10579 install_element(ENABLE_NODE
, &clear_ip_ospf_interface_cmd
);
10583 /* Install OSPF related vty commands. */
10584 void ospf_vty_init(void)
10586 /* Install ospf top node. */
10587 install_node(&ospf_node
, ospf_config_write
);
10589 /* "router ospf" commands. */
10590 install_element(CONFIG_NODE
, &router_ospf_cmd
);
10591 install_element(CONFIG_NODE
, &no_router_ospf_cmd
);
10594 install_default(OSPF_NODE
);
10596 /* "ospf router-id" commands. */
10597 install_element(OSPF_NODE
, &ospf_router_id_cmd
);
10598 install_element(OSPF_NODE
, &ospf_router_id_old_cmd
);
10599 install_element(OSPF_NODE
, &no_ospf_router_id_cmd
);
10601 /* "passive-interface" commands. */
10602 install_element(OSPF_NODE
, &ospf_passive_interface_addr_cmd
);
10603 install_element(OSPF_NODE
, &no_ospf_passive_interface_addr_cmd
);
10605 /* "ospf abr-type" commands. */
10606 install_element(OSPF_NODE
, &ospf_abr_type_cmd
);
10607 install_element(OSPF_NODE
, &no_ospf_abr_type_cmd
);
10609 /* "ospf log-adjacency-changes" commands. */
10610 install_element(OSPF_NODE
, &ospf_log_adjacency_changes_cmd
);
10611 install_element(OSPF_NODE
, &ospf_log_adjacency_changes_detail_cmd
);
10612 install_element(OSPF_NODE
, &no_ospf_log_adjacency_changes_cmd
);
10613 install_element(OSPF_NODE
, &no_ospf_log_adjacency_changes_detail_cmd
);
10615 /* "ospf rfc1583-compatible" commands. */
10616 install_element(OSPF_NODE
, &ospf_compatible_rfc1583_cmd
);
10617 install_element(OSPF_NODE
, &no_ospf_compatible_rfc1583_cmd
);
10618 install_element(OSPF_NODE
, &ospf_rfc1583_flag_cmd
);
10619 install_element(OSPF_NODE
, &no_ospf_rfc1583_flag_cmd
);
10621 /* "network area" commands. */
10622 install_element(OSPF_NODE
, &ospf_network_area_cmd
);
10623 install_element(OSPF_NODE
, &no_ospf_network_area_cmd
);
10625 /* "area authentication" commands. */
10626 install_element(OSPF_NODE
,
10627 &ospf_area_authentication_message_digest_cmd
);
10628 install_element(OSPF_NODE
, &ospf_area_authentication_cmd
);
10629 install_element(OSPF_NODE
, &no_ospf_area_authentication_cmd
);
10631 /* "area range" commands. */
10632 install_element(OSPF_NODE
, &ospf_area_range_cmd
);
10633 install_element(OSPF_NODE
, &ospf_area_range_cost_cmd
);
10634 install_element(OSPF_NODE
, &ospf_area_range_not_advertise_cmd
);
10635 install_element(OSPF_NODE
, &no_ospf_area_range_cmd
);
10636 install_element(OSPF_NODE
, &ospf_area_range_substitute_cmd
);
10637 install_element(OSPF_NODE
, &no_ospf_area_range_substitute_cmd
);
10639 /* "area virtual-link" commands. */
10640 install_element(OSPF_NODE
, &ospf_area_vlink_cmd
);
10641 install_element(OSPF_NODE
, &ospf_area_vlink_intervals_cmd
);
10642 install_element(OSPF_NODE
, &no_ospf_area_vlink_cmd
);
10643 install_element(OSPF_NODE
, &no_ospf_area_vlink_intervals_cmd
);
10646 /* "area stub" commands. */
10647 install_element(OSPF_NODE
, &ospf_area_stub_no_summary_cmd
);
10648 install_element(OSPF_NODE
, &ospf_area_stub_cmd
);
10649 install_element(OSPF_NODE
, &no_ospf_area_stub_no_summary_cmd
);
10650 install_element(OSPF_NODE
, &no_ospf_area_stub_cmd
);
10652 /* "area nssa" commands. */
10653 install_element(OSPF_NODE
, &ospf_area_nssa_cmd
);
10654 install_element(OSPF_NODE
, &ospf_area_nssa_translate_cmd
);
10655 install_element(OSPF_NODE
, &ospf_area_nssa_no_summary_cmd
);
10656 install_element(OSPF_NODE
, &no_ospf_area_nssa_no_summary_cmd
);
10657 install_element(OSPF_NODE
, &no_ospf_area_nssa_cmd
);
10659 install_element(OSPF_NODE
, &ospf_area_default_cost_cmd
);
10660 install_element(OSPF_NODE
, &no_ospf_area_default_cost_cmd
);
10662 install_element(OSPF_NODE
, &ospf_area_shortcut_cmd
);
10663 install_element(OSPF_NODE
, &no_ospf_area_shortcut_cmd
);
10665 install_element(OSPF_NODE
, &ospf_area_export_list_cmd
);
10666 install_element(OSPF_NODE
, &no_ospf_area_export_list_cmd
);
10668 install_element(OSPF_NODE
, &ospf_area_filter_list_cmd
);
10669 install_element(OSPF_NODE
, &no_ospf_area_filter_list_cmd
);
10671 install_element(OSPF_NODE
, &ospf_area_import_list_cmd
);
10672 install_element(OSPF_NODE
, &no_ospf_area_import_list_cmd
);
10674 /* SPF timer commands */
10675 install_element(OSPF_NODE
, &ospf_timers_throttle_spf_cmd
);
10676 install_element(OSPF_NODE
, &no_ospf_timers_throttle_spf_cmd
);
10678 /* LSA timers commands */
10679 install_element(OSPF_NODE
, &ospf_timers_min_ls_interval_cmd
);
10680 install_element(OSPF_NODE
, &no_ospf_timers_min_ls_interval_cmd
);
10681 install_element(OSPF_NODE
, &ospf_timers_lsa_min_arrival_cmd
);
10682 install_element(OSPF_NODE
, &no_ospf_timers_lsa_min_arrival_cmd
);
10683 install_element(OSPF_NODE
, &ospf_timers_lsa_arrival_cmd
);
10684 install_element(OSPF_NODE
, &no_ospf_timers_lsa_arrival_cmd
);
10686 /* refresh timer commands */
10687 install_element(OSPF_NODE
, &ospf_refresh_timer_cmd
);
10688 install_element(OSPF_NODE
, &no_ospf_refresh_timer_val_cmd
);
10690 /* max-metric commands */
10691 install_element(OSPF_NODE
, &ospf_max_metric_router_lsa_admin_cmd
);
10692 install_element(OSPF_NODE
, &no_ospf_max_metric_router_lsa_admin_cmd
);
10693 install_element(OSPF_NODE
, &ospf_max_metric_router_lsa_startup_cmd
);
10694 install_element(OSPF_NODE
, &no_ospf_max_metric_router_lsa_startup_cmd
);
10695 install_element(OSPF_NODE
, &ospf_max_metric_router_lsa_shutdown_cmd
);
10696 install_element(OSPF_NODE
, &no_ospf_max_metric_router_lsa_shutdown_cmd
);
10698 /* reference bandwidth commands */
10699 install_element(OSPF_NODE
, &ospf_auto_cost_reference_bandwidth_cmd
);
10700 install_element(OSPF_NODE
, &no_ospf_auto_cost_reference_bandwidth_cmd
);
10702 /* "neighbor" commands. */
10703 install_element(OSPF_NODE
, &ospf_neighbor_cmd
);
10704 install_element(OSPF_NODE
, &ospf_neighbor_poll_interval_cmd
);
10705 install_element(OSPF_NODE
, &no_ospf_neighbor_cmd
);
10706 install_element(OSPF_NODE
, &no_ospf_neighbor_poll_cmd
);
10708 /* write multiplier commands */
10709 install_element(OSPF_NODE
, &ospf_write_multiplier_cmd
);
10710 install_element(OSPF_NODE
, &write_multiplier_cmd
);
10711 install_element(OSPF_NODE
, &no_ospf_write_multiplier_cmd
);
10712 install_element(OSPF_NODE
, &no_write_multiplier_cmd
);
10714 /* Init interface related vty commands. */
10715 ospf_vty_if_init();
10717 /* Init zebra related vty commands. */
10718 ospf_vty_zebra_init();