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
18 * along with GNU Zebra; see the file COPYING. If not, write to the Free
19 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
39 #include "ospfd/ospfd.h"
40 #include "ospfd/ospf_asbr.h"
41 #include "ospfd/ospf_lsa.h"
42 #include "ospfd/ospf_lsdb.h"
43 #include "ospfd/ospf_ism.h"
44 #include "ospfd/ospf_interface.h"
45 #include "ospfd/ospf_nsm.h"
46 #include "ospfd/ospf_neighbor.h"
47 #include "ospfd/ospf_flood.h"
48 #include "ospfd/ospf_abr.h"
49 #include "ospfd/ospf_spf.h"
50 #include "ospfd/ospf_route.h"
51 #include "ospfd/ospf_zebra.h"
52 /*#include "ospfd/ospf_routemap.h" */
53 #include "ospfd/ospf_vty.h"
54 #include "ospfd/ospf_dump.h"
55 #include "ospfd/ospf_bfd.h"
57 static const char *ospf_network_type_str
[] =
68 /* Utility functions. */
70 ospf_str2area_id (const char *str
, struct in_addr
*area_id
, int *format
)
75 /* match "A.B.C.D". */
76 if (strchr (str
, '.') != NULL
)
78 ret
= inet_aton (str
, area_id
);
81 *format
= OSPF_AREA_ID_FORMAT_ADDRESS
;
83 /* match "<0-4294967295>". */
89 ret
= strtoul (str
, &endptr
, 10);
90 if (*endptr
!= '\0' || errno
|| ret
> UINT32_MAX
)
93 area_id
->s_addr
= htonl (ret
);
94 *format
= OSPF_AREA_ID_FORMAT_DECIMAL
;
102 str2metric (const char *str
, int *metric
)
108 *metric
= strtol (str
, NULL
, 10);
109 if (*metric
< 0 && *metric
> 16777214)
111 /* vty_out (vty, "OSPF metric value is invalid%s", VTY_NEWLINE); */
119 str2metric_type (const char *str
, int *metric_type
)
125 if (strncmp (str
, "1", 1) == 0)
126 *metric_type
= EXTERNAL_METRIC_TYPE_1
;
127 else if (strncmp (str
, "2", 1) == 0)
128 *metric_type
= EXTERNAL_METRIC_TYPE_2
;
136 ospf_oi_count (struct interface
*ifp
)
138 struct route_node
*rn
;
141 for (rn
= route_top (IF_OIFS (ifp
)); rn
; rn
= route_next (rn
))
148 DEFUN_NOSH (router_ospf
,
150 "router ospf [(1-65535)]",
151 "Enable a routing process\n"
152 "Start OSPF configuration\n"
156 u_short instance
= 0;
158 ospf
= ospf_lookup();
161 vty_out (vty
, "There isn't active ospf instance %s", VTY_NEWLINE
);
166 VTY_GET_INTEGER ("Instance", instance
, argv
[2]->arg
);
168 /* The following logic to set the vty qobj index is in place to be able
169 to ignore the commands which dont belong to this instance. */
170 if (ospf
->instance
!= instance
)
171 VTY_PUSH_CONTEXT_NULL(OSPF_NODE
);
174 if (IS_DEBUG_OSPF_EVENT
)
175 zlog_debug ("Config command 'router ospf %d' received", instance
);
176 ospf
->oi_running
= 1;
177 VTY_PUSH_CONTEXT(OSPF_NODE
, ospf
);
178 ospf_router_id_update (ospf
);
184 DEFUN (no_router_ospf
,
186 "no router ospf [(1-65535)]",
188 "Enable a routing process\n"
189 "Start OSPF configuration\n"
193 u_short instance
= 0;
196 VTY_GET_INTEGER ("Instance", instance
, argv
[3]->arg
);
198 if ((ospf
= ospf_lookup_instance (instance
)) == NULL
)
207 DEFUN (ospf_router_id
,
209 "ospf router-id A.B.C.D",
210 "OSPF specific commands\n"
211 "router-id for the OSPF process\n"
212 "OSPF router-id in IP address format\n")
214 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
216 struct listnode
*node
;
217 struct ospf_area
*area
;
218 struct in_addr router_id
;
221 ret
= inet_aton (argv
[idx_ipv4
]->arg
, &router_id
);
224 vty_out (vty
, "Please specify Router ID by A.B.C.D%s", VTY_NEWLINE
);
228 ospf
->router_id_static
= router_id
;
230 for (ALL_LIST_ELEMENTS_RO (ospf
->areas
, node
, area
))
233 vty_out (vty
, "For this router-id change to take effect,"
234 " save config and restart ospfd%s", VTY_NEWLINE
);
238 ospf_router_id_update (ospf
);
243 DEFUN_HIDDEN (ospf_router_id_old
,
244 ospf_router_id_old_cmd
,
246 "router-id for the OSPF process\n"
247 "OSPF router-id in IP address format\n")
249 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
251 struct listnode
*node
;
252 struct ospf_area
*area
;
253 struct in_addr router_id
;
256 ret
= inet_aton (argv
[idx_ipv4
]->arg
, &router_id
);
259 vty_out (vty
, "Please specify Router ID by A.B.C.D%s", VTY_NEWLINE
);
263 ospf
->router_id_static
= router_id
;
265 for (ALL_LIST_ELEMENTS_RO (ospf
->areas
, node
, area
))
268 vty_out (vty
, "For this router-id change to take effect,"
269 " save config and restart ospfd%s", VTY_NEWLINE
);
273 ospf_router_id_update (ospf
);
278 DEFUN (no_ospf_router_id
,
279 no_ospf_router_id_cmd
,
280 "no ospf router-id [A.B.C.D]",
282 "OSPF specific commands\n"
283 "router-id for the OSPF process\n"
284 "OSPF router-id in IP address format\n")
286 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
287 struct listnode
*node
;
288 struct ospf_area
*area
;
290 ospf
->router_id_static
.s_addr
= 0;
292 for (ALL_LIST_ELEMENTS_RO (ospf
->areas
, node
, area
))
295 vty_out (vty
, "For this router-id change to take effect,"
296 " save config and restart ospfd%s", VTY_NEWLINE
);
300 ospf_router_id_update (ospf
);
307 ospf_passive_interface_default (struct ospf
*ospf
, u_char newval
)
310 struct interface
*ifp
;
311 struct ospf_interface
*oi
;
313 ospf
->passive_interface_default
= newval
;
315 for (ALL_LIST_ELEMENTS_RO (om
->iflist
, ln
, ifp
))
318 OSPF_IF_PARAM_CONFIGURED (IF_DEF_PARAMS (ifp
), passive_interface
))
319 UNSET_IF_PARAM (IF_DEF_PARAMS (ifp
), passive_interface
);
321 for (ALL_LIST_ELEMENTS_RO (ospf
->oiflist
, ln
, oi
))
323 if (OSPF_IF_PARAM_CONFIGURED (oi
->params
, passive_interface
))
324 UNSET_IF_PARAM (oi
->params
, passive_interface
);
325 /* update multicast memberships */
326 ospf_if_set_multicast(oi
);
331 ospf_passive_interface_update_addr (struct ospf
*ospf
, struct interface
*ifp
,
332 struct ospf_if_params
*params
, u_char value
,
337 params
->passive_interface
= value
;
338 if (params
!= IF_DEF_PARAMS (ifp
))
340 if (OSPF_IF_PARAM_CONFIGURED (IF_DEF_PARAMS (ifp
), passive_interface
))
341 dflt
= IF_DEF_PARAMS (ifp
)->passive_interface
;
343 dflt
= ospf
->passive_interface_default
;
346 SET_IF_PARAM (params
, passive_interface
);
348 UNSET_IF_PARAM (params
, passive_interface
);
350 ospf_free_if_params (ifp
, addr
);
351 ospf_if_update_params (ifp
, addr
);
356 ospf_passive_interface_update (struct ospf
*ospf
, struct interface
*ifp
,
357 struct ospf_if_params
*params
, u_char value
)
359 params
->passive_interface
= value
;
360 if (params
== IF_DEF_PARAMS (ifp
))
362 if (value
!= ospf
->passive_interface_default
)
363 SET_IF_PARAM (params
, passive_interface
);
365 UNSET_IF_PARAM (params
, passive_interface
);
369 DEFUN (ospf_passive_interface
,
370 ospf_passive_interface_addr_cmd
,
371 "passive-interface <IFNAME [A.B.C.D]|default>",
372 "Suppress routing updates on an interface\n"
375 "Suppress routing updates on interfaces by default\n")
377 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
379 struct interface
*ifp
;
380 struct in_addr addr
= { .s_addr
= INADDR_ANY
};
382 struct ospf_if_params
*params
;
383 struct route_node
*rn
;
385 if (strcmp (argv
[1]->text
, "default") == 0)
387 ospf_passive_interface_default (ospf
, OSPF_IF_PASSIVE
);
391 ifp
= if_get_by_name (argv
[1]->arg
, VRF_DEFAULT
);
393 params
= IF_DEF_PARAMS (ifp
);
397 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
400 vty_out (vty
, "Please specify interface address by A.B.C.D%s",
405 params
= ospf_get_if_params (ifp
, addr
);
406 ospf_if_update_params (ifp
, addr
);
407 ospf_passive_interface_update_addr (ospf
, ifp
, params
,
408 OSPF_IF_PASSIVE
, addr
);
411 ospf_passive_interface_update (ospf
, ifp
, params
, OSPF_IF_PASSIVE
);
413 /* XXX We should call ospf_if_set_multicast on exactly those
414 * interfaces for which the passive property changed. It is too much
415 * work to determine this set, so we do this for every interface.
416 * This is safe and reasonable because ospf_if_set_multicast uses a
417 * record of joined groups to avoid systems calls if the desired
418 * memberships match the current memership.
421 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next (rn
))
423 struct ospf_interface
*oi
= rn
->info
;
425 if (oi
&& (OSPF_IF_PARAM(oi
, passive_interface
) == OSPF_IF_PASSIVE
))
426 ospf_if_set_multicast(oi
);
429 * XXX It is not clear what state transitions the interface needs to
430 * undergo when going from active to passive. Fixing this will
431 * require precise identification of interfaces having such a
438 DEFUN (no_ospf_passive_interface
,
439 no_ospf_passive_interface_addr_cmd
,
440 "no passive-interface <IFNAME [A.B.C.D]|default>",
442 "Allow routing updates on an interface\n"
445 "Allow routing updates on interfaces by default\n")
447 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
449 struct interface
*ifp
;
450 struct in_addr addr
= { .s_addr
= INADDR_ANY
};
451 struct ospf_if_params
*params
;
453 struct route_node
*rn
;
455 if (strcmp (argv
[2]->text
, "default") == 0)
457 ospf_passive_interface_default (ospf
, OSPF_IF_ACTIVE
);
461 ifp
= if_get_by_name (argv
[2]->arg
, VRF_DEFAULT
);
463 params
= IF_DEF_PARAMS (ifp
);
467 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
470 vty_out (vty
, "Please specify interface address by A.B.C.D%s",
475 params
= ospf_lookup_if_params (ifp
, addr
);
478 ospf_passive_interface_update_addr (ospf
, ifp
, params
, OSPF_IF_ACTIVE
,
481 ospf_passive_interface_update (ospf
, ifp
, params
, OSPF_IF_ACTIVE
);
483 /* XXX We should call ospf_if_set_multicast on exactly those
484 * interfaces for which the passive property changed. It is too much
485 * work to determine this set, so we do this for every interface.
486 * This is safe and reasonable because ospf_if_set_multicast uses a
487 * record of joined groups to avoid systems calls if the desired
488 * memberships match the current memership.
490 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next (rn
))
492 struct ospf_interface
*oi
= rn
->info
;
494 if (oi
&& (OSPF_IF_PARAM(oi
, passive_interface
) == OSPF_IF_ACTIVE
))
495 ospf_if_set_multicast(oi
);
503 DEFUN (ospf_network_area
,
504 ospf_network_area_cmd
,
505 "network A.B.C.D/M area <A.B.C.D|(0-4294967295)>",
506 "Enable routing on an IP network\n"
507 "OSPF network prefix\n"
508 "Set the OSPF area ID\n"
509 "OSPF area ID in IP address format\n"
510 "OSPF area ID as a decimal value\n")
512 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
513 int idx_ipv4_prefixlen
= 1;
514 int idx_ipv4_number
= 3;
515 struct prefix_ipv4 p
;
516 struct in_addr area_id
;
521 vty_out (vty
, "The network command is not supported in multi-instance ospf%s",
526 if (ospf
->if_ospf_cli_count
> 0)
528 vty_out (vty
, "Please remove all ip ospf area x.x.x.x commands first.%s",
533 /* Get network prefix and Area ID. */
534 VTY_GET_IPV4_PREFIX ("network prefix", p
, argv
[idx_ipv4_prefixlen
]->arg
);
535 VTY_GET_OSPF_AREA_ID (area_id
, format
, argv
[idx_ipv4_number
]->arg
);
537 ret
= ospf_network_set (ospf
, &p
, area_id
);
540 vty_out (vty
, "There is already same network statement.%s", VTY_NEWLINE
);
547 DEFUN (no_ospf_network_area
,
548 no_ospf_network_area_cmd
,
549 "no network A.B.C.D/M area <A.B.C.D|(0-4294967295)>",
551 "Enable routing on an IP network\n"
552 "OSPF network prefix\n"
553 "Set the OSPF area ID\n"
554 "OSPF area ID in IP address format\n"
555 "OSPF area ID as a decimal value\n")
557 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
558 int idx_ipv4_prefixlen
= 2;
559 int idx_ipv4_number
= 4;
560 struct prefix_ipv4 p
;
561 struct in_addr area_id
;
566 vty_out (vty
, "The network command is not supported in multi-instance ospf%s",
571 /* Get network prefix and Area ID. */
572 VTY_GET_IPV4_PREFIX ("network prefix", p
, argv
[idx_ipv4_prefixlen
]->arg
);
573 VTY_GET_OSPF_AREA_ID (area_id
, format
, argv
[idx_ipv4_number
]->arg
);
575 ret
= ospf_network_unset (ospf
, &p
, area_id
);
578 vty_out (vty
, "Can't find specified network area configuration.%s",
586 DEFUN (ospf_area_range
,
588 "area <A.B.C.D|(0-4294967295)> range A.B.C.D/M [advertise [cost (0-16777215)]]",
589 "OSPF area parameters\n"
590 "OSPF area ID in IP address format\n"
591 "OSPF area ID as a decimal value\n"
592 "Summarize routes matching address/mask (border routers only)\n"
593 "Area range prefix\n"
594 "Advertise this range (default)\n"
595 "User specified metric for this range\n"
596 "Advertised metric for this range\n")
598 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
599 int idx_ipv4_number
= 1;
600 int idx_ipv4_prefixlen
= 3;
602 struct prefix_ipv4 p
;
603 struct in_addr area_id
;
607 VTY_GET_OSPF_AREA_ID (area_id
, format
, argv
[idx_ipv4_number
]->arg
);
608 VTY_GET_IPV4_PREFIX ("area range", p
, argv
[idx_ipv4_prefixlen
]->arg
);
610 ospf_area_range_set (ospf
, area_id
, &p
, OSPF_AREA_RANGE_ADVERTISE
);
613 VTY_GET_INTEGER ("range cost", cost
, argv
[idx_cost
]->arg
);
614 ospf_area_range_cost_set (ospf
, area_id
, &p
, cost
);
620 DEFUN (ospf_area_range_cost
,
621 ospf_area_range_cost_cmd
,
622 "area <A.B.C.D|(0-4294967295)> range A.B.C.D/M cost (0-16777215)",
623 "OSPF area parameters\n"
624 "OSPF area ID in IP address format\n"
625 "OSPF area ID as a decimal value\n"
626 "Summarize routes matching address/mask (border routers only)\n"
627 "Area range prefix\n"
628 "User specified metric for this range\n"
629 "Advertised metric for this range\n")
631 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
632 int idx_ipv4_number
= 1;
633 int idx_ipv4_prefixlen
= 3;
635 struct prefix_ipv4 p
;
636 struct in_addr area_id
;
640 VTY_GET_OSPF_AREA_ID (area_id
, format
, argv
[idx_ipv4_number
]->arg
);
641 VTY_GET_IPV4_PREFIX ("area range", p
, argv
[idx_ipv4_prefixlen
]->arg
);
643 ospf_area_range_set (ospf
, area_id
, &p
, OSPF_AREA_RANGE_ADVERTISE
);
645 VTY_GET_INTEGER ("range cost", cost
, argv
[idx_cost
]->arg
);
646 ospf_area_range_cost_set (ospf
, area_id
, &p
, cost
);
651 DEFUN (ospf_area_range_not_advertise
,
652 ospf_area_range_not_advertise_cmd
,
653 "area <A.B.C.D|(0-4294967295)> range A.B.C.D/M not-advertise",
654 "OSPF area parameters\n"
655 "OSPF area ID in IP address format\n"
656 "OSPF area ID as a decimal value\n"
657 "Summarize routes matching address/mask (border routers only)\n"
658 "Area range prefix\n"
659 "DoNotAdvertise this range\n")
661 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
662 int idx_ipv4_number
= 1;
663 int idx_ipv4_prefixlen
= 3;
664 struct prefix_ipv4 p
;
665 struct in_addr area_id
;
668 VTY_GET_OSPF_AREA_ID (area_id
, format
, argv
[idx_ipv4_number
]->arg
);
669 VTY_GET_IPV4_PREFIX ("area range", p
, argv
[idx_ipv4_prefixlen
]->arg
);
671 ospf_area_range_set (ospf
, area_id
, &p
, 0);
676 DEFUN (no_ospf_area_range
,
677 no_ospf_area_range_cmd
,
678 "no area <A.B.C.D|(0-4294967295)> range A.B.C.D/M [<cost (0-16777215)|advertise [cost (0-16777215)]|not-advertise>]",
680 "OSPF area parameters\n"
681 "OSPF area ID in IP address format\n"
682 "OSPF area ID as a decimal value\n"
683 "Summarize routes matching address/mask (border routers only)\n"
684 "Area range prefix\n"
685 "User specified metric for this range\n"
686 "Advertised metric for this range\n"
687 "Advertise this range (default)\n"
688 "User specified metric for this range\n"
689 "Advertised metric for this range\n"
690 "DoNotAdvertise this range\n")
692 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
693 int idx_ipv4_number
= 2;
694 int idx_ipv4_prefixlen
= 4;
695 struct prefix_ipv4 p
;
696 struct in_addr area_id
;
699 VTY_GET_OSPF_AREA_ID (area_id
, format
, argv
[idx_ipv4_number
]->arg
);
700 VTY_GET_IPV4_PREFIX ("area range", p
, argv
[idx_ipv4_prefixlen
]->arg
);
702 ospf_area_range_unset (ospf
, area_id
, &p
);
707 DEFUN (ospf_area_range_substitute
,
708 ospf_area_range_substitute_cmd
,
709 "area <A.B.C.D|(0-4294967295)> range A.B.C.D/M substitute A.B.C.D/M",
710 "OSPF area parameters\n"
711 "OSPF area ID in IP address format\n"
712 "OSPF area ID as a decimal value\n"
713 "Summarize routes matching address/mask (border routers only)\n"
714 "Area range prefix\n"
715 "Announce area range as another prefix\n"
716 "Network prefix to be announced instead of range\n")
718 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
719 int idx_ipv4_number
= 1;
720 int idx_ipv4_prefixlen
= 3;
721 int idx_ipv4_prefixlen_2
= 5;
722 struct prefix_ipv4 p
, s
;
723 struct in_addr area_id
;
726 VTY_GET_OSPF_AREA_ID (area_id
, format
, argv
[idx_ipv4_number
]->arg
);
727 VTY_GET_IPV4_PREFIX ("area range", p
, argv
[idx_ipv4_prefixlen
]->arg
);
728 VTY_GET_IPV4_PREFIX ("substituted network prefix", s
, argv
[idx_ipv4_prefixlen_2
]->arg
);
730 ospf_area_range_substitute_set (ospf
, area_id
, &p
, &s
);
735 DEFUN (no_ospf_area_range_substitute
,
736 no_ospf_area_range_substitute_cmd
,
737 "no area <A.B.C.D|(0-4294967295)> range A.B.C.D/M substitute A.B.C.D/M",
739 "OSPF area parameters\n"
740 "OSPF area ID in IP address format\n"
741 "OSPF area ID as a decimal value\n"
742 "Summarize routes matching address/mask (border routers only)\n"
743 "Area range prefix\n"
744 "Announce area range as another prefix\n"
745 "Network prefix to be announced instead of range\n")
747 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
748 int idx_ipv4_number
= 2;
749 int idx_ipv4_prefixlen
= 4;
750 int idx_ipv4_prefixlen_2
= 6;
751 struct prefix_ipv4 p
, s
;
752 struct in_addr area_id
;
755 VTY_GET_OSPF_AREA_ID (area_id
, format
, argv
[idx_ipv4_number
]->arg
);
756 VTY_GET_IPV4_PREFIX ("area range", p
, argv
[idx_ipv4_prefixlen
]->arg
);
757 VTY_GET_IPV4_PREFIX ("substituted network prefix", s
, argv
[idx_ipv4_prefixlen_2
]->arg
);
759 ospf_area_range_substitute_unset (ospf
, area_id
, &p
);
765 /* Command Handler Logic in VLink stuff is delicate!!
767 ALTER AT YOUR OWN RISK!!!!
769 Various dummy values are used to represent 'NoChange' state for
770 VLink configuration NOT being changed by a VLink command, and
771 special syntax is used within the command strings so that the
772 typed in command verbs can be seen in the configuration command
773 bacckend handler. This is to drastically reduce the verbeage
774 required to coe up with a reasonably compatible Cisco VLink command
776 - Matthew Grant <grantma@anathoth.gen.nz>
777 Wed, 21 Feb 2001 15:13:52 +1300
780 /* Configuration data for virtual links
782 struct ospf_vl_config_data
{
783 struct vty
*vty
; /* vty stuff */
784 struct in_addr area_id
; /* area ID from command line */
785 int format
; /* command line area ID format */
786 struct in_addr vl_peer
; /* command line vl_peer */
787 int auth_type
; /* Authehntication type, if given */
788 char *auth_key
; /* simple password if present */
789 int crypto_key_id
; /* Cryptographic key ID */
790 char *md5_key
; /* MD5 authentication key */
791 int hello_interval
; /* Obvious what these are... */
792 int retransmit_interval
;
798 ospf_vl_config_data_init (struct ospf_vl_config_data
*vl_config
,
801 memset (vl_config
, 0, sizeof (struct ospf_vl_config_data
));
802 vl_config
->auth_type
= OSPF_AUTH_CMD_NOTSEEN
;
803 vl_config
->vty
= vty
;
806 static struct ospf_vl_data
*
807 ospf_find_vl_data (struct ospf
*ospf
, struct ospf_vl_config_data
*vl_config
)
809 struct ospf_area
*area
;
810 struct ospf_vl_data
*vl_data
;
812 struct in_addr area_id
;
814 vty
= vl_config
->vty
;
815 area_id
= vl_config
->area_id
;
817 if (area_id
.s_addr
== OSPF_AREA_BACKBONE
)
820 "Configuring VLs over the backbone is not allowed%s",
824 area
= ospf_area_get (ospf
, area_id
, vl_config
->format
);
826 if (area
->external_routing
!= OSPF_AREA_DEFAULT
)
828 if (vl_config
->format
== OSPF_AREA_ID_FORMAT_ADDRESS
)
829 vty_out (vty
, "Area %s is %s%s",
831 area
->external_routing
== OSPF_AREA_NSSA
?"nssa":"stub",
834 vty_out (vty
, "Area %ld is %s%s",
835 (u_long
)ntohl (area_id
.s_addr
),
836 area
->external_routing
== OSPF_AREA_NSSA
?"nssa":"stub",
841 if ((vl_data
= ospf_vl_lookup (ospf
, area
, vl_config
->vl_peer
)) == NULL
)
843 vl_data
= ospf_vl_data_new (area
, vl_config
->vl_peer
);
844 if (vl_data
->vl_oi
== NULL
)
846 vl_data
->vl_oi
= ospf_vl_new (ospf
, vl_data
);
847 ospf_vl_add (ospf
, vl_data
);
848 ospf_spf_calculate_schedule (ospf
, SPF_FLAG_CONFIG_CHANGE
);
856 ospf_vl_set_security (struct ospf_vl_data
*vl_data
,
857 struct ospf_vl_config_data
*vl_config
)
859 struct crypt_key
*ck
;
861 struct interface
*ifp
= vl_data
->vl_oi
->ifp
;
863 vty
= vl_config
->vty
;
865 if (vl_config
->auth_type
!= OSPF_AUTH_CMD_NOTSEEN
)
867 SET_IF_PARAM (IF_DEF_PARAMS (ifp
), auth_type
);
868 IF_DEF_PARAMS (ifp
)->auth_type
= vl_config
->auth_type
;
871 if (vl_config
->auth_key
)
873 memset(IF_DEF_PARAMS (ifp
)->auth_simple
, 0, OSPF_AUTH_SIMPLE_SIZE
+1);
874 strncpy ((char *) IF_DEF_PARAMS (ifp
)->auth_simple
, vl_config
->auth_key
,
875 OSPF_AUTH_SIMPLE_SIZE
);
877 else if (vl_config
->md5_key
)
879 if (ospf_crypt_key_lookup (IF_DEF_PARAMS (ifp
)->auth_crypt
, vl_config
->crypto_key_id
)
882 vty_out (vty
, "OSPF: Key %d already exists%s",
883 vl_config
->crypto_key_id
, VTY_NEWLINE
);
886 ck
= ospf_crypt_key_new ();
887 ck
->key_id
= vl_config
->crypto_key_id
;
888 memset(ck
->auth_key
, 0, OSPF_AUTH_MD5_SIZE
+1);
889 strncpy ((char *) ck
->auth_key
, vl_config
->md5_key
, OSPF_AUTH_MD5_SIZE
);
891 ospf_crypt_key_add (IF_DEF_PARAMS (ifp
)->auth_crypt
, ck
);
893 else if (vl_config
->crypto_key_id
!= 0)
897 if (ospf_crypt_key_lookup (IF_DEF_PARAMS (ifp
)->auth_crypt
,
898 vl_config
->crypto_key_id
) == NULL
)
900 vty_out (vty
, "OSPF: Key %d does not exist%s",
901 vl_config
->crypto_key_id
, VTY_NEWLINE
);
905 ospf_crypt_key_delete (IF_DEF_PARAMS (ifp
)->auth_crypt
, vl_config
->crypto_key_id
);
913 ospf_vl_set_timers (struct ospf_vl_data
*vl_data
,
914 struct ospf_vl_config_data
*vl_config
)
916 struct interface
*ifp
= vl_data
->vl_oi
->ifp
;
917 /* Virtual Link data initialised to defaults, so only set
919 if (vl_config
->hello_interval
)
921 SET_IF_PARAM (IF_DEF_PARAMS (ifp
), v_hello
);
922 IF_DEF_PARAMS (ifp
)->v_hello
= vl_config
->hello_interval
;
925 if (vl_config
->dead_interval
)
927 SET_IF_PARAM (IF_DEF_PARAMS (ifp
), v_wait
);
928 IF_DEF_PARAMS (ifp
)->v_wait
= vl_config
->dead_interval
;
931 if (vl_config
->retransmit_interval
)
933 SET_IF_PARAM (IF_DEF_PARAMS (ifp
), retransmit_interval
);
934 IF_DEF_PARAMS (ifp
)->retransmit_interval
= vl_config
->retransmit_interval
;
937 if (vl_config
->transmit_delay
)
939 SET_IF_PARAM (IF_DEF_PARAMS (ifp
), transmit_delay
);
940 IF_DEF_PARAMS (ifp
)->transmit_delay
= vl_config
->transmit_delay
;
947 /* The business end of all of the above */
949 ospf_vl_set (struct ospf
*ospf
, struct ospf_vl_config_data
*vl_config
)
951 struct ospf_vl_data
*vl_data
;
954 vl_data
= ospf_find_vl_data (ospf
, vl_config
);
958 /* Process this one first as it can have a fatal result, which can
959 only logically occur if the virtual link exists already
960 Thus a command error does not result in a change to the
961 running configuration such as unexpectedly altered timer
963 ret
= ospf_vl_set_security (vl_data
, vl_config
);
964 if (ret
!= CMD_SUCCESS
)
967 /* Set any time based parameters, these area already range checked */
969 ret
= ospf_vl_set_timers (vl_data
, vl_config
);
970 if (ret
!= CMD_SUCCESS
)
977 /* This stuff exists to make specifying all the alias commands A LOT simpler
979 #define VLINK_HELPSTR_IPADDR \
980 "OSPF area parameters\n" \
981 "OSPF area ID in IP address format\n" \
982 "OSPF area ID as a decimal value\n" \
983 "Configure a virtual link\n" \
984 "Router ID of the remote ABR\n"
986 #define VLINK_HELPSTR_AUTHTYPE_SIMPLE \
987 "Enable authentication on this virtual link\n" \
990 #define VLINK_HELPSTR_AUTHTYPE_ALL \
991 VLINK_HELPSTR_AUTHTYPE_SIMPLE \
992 "Use null authentication\n" \
993 "Use message-digest authentication\n"
995 #define VLINK_HELPSTR_TIME_PARAM_NOSECS \
996 "Time between HELLO packets\n" \
997 "Time between retransmitting lost link state advertisements\n" \
998 "Link state transmit delay\n" \
999 "Interval time after which a neighbor is declared down\n"
1001 #define VLINK_HELPSTR_TIME_PARAM \
1002 VLINK_HELPSTR_TIME_PARAM_NOSECS \
1005 #define VLINK_HELPSTR_AUTH_SIMPLE \
1006 "Authentication password (key)\n" \
1007 "The OSPF password (key)"
1009 #define VLINK_HELPSTR_AUTH_MD5 \
1010 "Message digest authentication password (key)\n" \
1013 "Use MD5 algorithm\n" \
1014 "The OSPF password (key)"
1016 DEFUN (ospf_area_vlink
,
1017 ospf_area_vlink_cmd
,
1018 "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>]",
1019 VLINK_HELPSTR_IPADDR
1020 "Enable authentication on this virtual link\n" \
1021 "Use null authentication\n" \
1022 "Use message-digest authentication\n"
1023 "Message digest authentication password (key)\n" \
1025 "Use MD5 algorithm\n" \
1026 "The OSPF password (key)")
1028 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
1029 int idx_ipv4_number
= 1;
1031 struct ospf_vl_config_data vl_config
;
1032 char auth_key
[OSPF_AUTH_SIMPLE_SIZE
+1];
1033 char md5_key
[OSPF_AUTH_MD5_SIZE
+1];
1037 ospf_vl_config_data_init(&vl_config
, vty
);
1039 /* Read off first 2 parameters and check them */
1040 ret
= ospf_str2area_id (argv
[idx_ipv4_number
]->arg
, &vl_config
.area_id
, &vl_config
.format
);
1043 vty_out (vty
, "OSPF area ID is invalid%s", VTY_NEWLINE
);
1047 ret
= inet_aton (argv
[idx_ipv4
]->arg
, &vl_config
.vl_peer
);
1050 vty_out (vty
, "Please specify valid Router ID as a.b.c.d%s",
1057 /* Thats all folks! - BUGS B. strikes again!!!*/
1059 return ospf_vl_set (ospf
, &vl_config
);
1062 /* Deal with other parameters */
1063 for (i
=5; i
< argc
; i
++)
1066 /* vty_out (vty, "argv[%d]->arg - %s%s", i, argv[i]->text, VTY_NEWLINE); */
1068 switch (argv
[i
]->arg
[0])
1072 if (i
>5 || strncmp (argv
[i
]->arg
, "authentication-", 15) == 0)
1074 /* authentication-key - this option can occur anywhere on
1075 command line. At start of command line
1076 must check for authentication option. */
1077 memset (auth_key
, 0, OSPF_AUTH_SIMPLE_SIZE
+ 1);
1078 strncpy (auth_key
, argv
[i
+1]->text
, OSPF_AUTH_SIMPLE_SIZE
);
1079 vl_config
.auth_key
= auth_key
;
1082 else if (strncmp (argv
[i
]->arg
, "authentication", 14) == 0)
1084 /* authentication - this option can only occur at start
1086 vl_config
.auth_type
= OSPF_AUTH_SIMPLE
;
1089 if (strncmp (argv
[i
+1]->arg
, "n", 1) == 0)
1091 /* "authentication null" */
1092 vl_config
.auth_type
= OSPF_AUTH_NULL
;
1095 else if (strncmp (argv
[i
+1]->arg
, "m", 1) == 0
1096 && strcmp (argv
[i
+1]->arg
, "message-digest-") != 0)
1098 /* "authentication message-digest" */
1099 vl_config
.auth_type
= OSPF_AUTH_CRYPTOGRAPHIC
;
1107 /* message-digest-key */
1111 vl_config
.crypto_key_id
= strtol (argv
[i
]->arg
, NULL
, 10);
1112 if (vl_config
.crypto_key_id
< 0)
1117 memset(md5_key
, 0, OSPF_AUTH_MD5_SIZE
+1);
1118 strncpy (md5_key
, argv
[i
]->arg
, OSPF_AUTH_MD5_SIZE
);
1119 vl_config
.md5_key
= md5_key
;
1123 vl_config
.md5_key
= NULL
;
1129 /* Action configuration */
1131 return ospf_vl_set (ospf
, &vl_config
);
1135 DEFUN (ospf_area_vlink_intervals
,
1136 ospf_area_vlink_intervals_cmd
,
1137 "area <A.B.C.D|(0-4294967295)> virtual-link A.B.C.D"
1138 "<hello-interval|retransmit-interval|transmit-delay|dead-interval> (1-65535)"
1139 "[<hello-interval|retransmit-interval|transmit-delay|dead-interval> (1-65535)"
1140 "[<hello-interval|retransmit-interval|transmit-delay|dead-interval> (1-65535)"
1141 "[<hello-interval|retransmit-interval|transmit-delay|dead-interval> (1-65535)"
1143 VLINK_HELPSTR_IPADDR
1144 VLINK_HELPSTR_TIME_PARAM
1145 VLINK_HELPSTR_TIME_PARAM
1146 VLINK_HELPSTR_TIME_PARAM
1147 VLINK_HELPSTR_TIME_PARAM
)
1149 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
1150 struct ospf_vl_config_data vl_config
;
1153 ospf_vl_config_data_init(&vl_config
, vty
);
1155 char *area_id
= argv
[1]->arg
;
1156 char *router_id
= argv
[3]->arg
;
1158 ret
= ospf_str2area_id (area_id
, &vl_config
.area_id
, &vl_config
.format
);
1161 vty_out (vty
, "OSPF area ID is invalid%s", VTY_NEWLINE
);
1165 ret
= inet_aton (router_id
, &vl_config
.vl_peer
);
1168 vty_out (vty
, "Please specify valid Router ID as a.b.c.d%s", VTY_NEWLINE
);
1171 for (unsigned int i
= 0; i
< 4; i
++)
1174 if (argv_find (argv
, argc
, "hello-interval", &idx
))
1175 vl_config
.hello_interval
= strtol(argv
[idx
+1]->arg
, NULL
, 10);
1176 else if (argv_find (argv
, argc
, "retransmit-interval", &idx
))
1177 vl_config
.retransmit_interval
= strtol(argv
[idx
+1]->arg
, NULL
, 10);
1178 else if (argv_find (argv
, argc
, "transmit-delay", &idx
))
1179 vl_config
.transmit_delay
= strtol(argv
[idx
+1]->arg
, NULL
, 10);
1180 else if (argv_find (argv
, argc
, "dead-interval", &idx
))
1181 vl_config
.dead_interval
= strtol(argv
[idx
+1]->arg
, NULL
, 10);
1184 /* Action configuration */
1185 return ospf_vl_set (ospf
, &vl_config
);
1188 DEFUN (no_ospf_area_vlink
,
1189 no_ospf_area_vlink_cmd
,
1190 "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>]",
1192 VLINK_HELPSTR_IPADDR
1193 "Enable authentication on this virtual link\n" \
1194 "Use null authentication\n" \
1195 "Use message-digest authentication\n"
1196 "Message digest authentication password (key)\n" \
1198 "Use MD5 algorithm\n" \
1199 "The OSPF password (key)")
1201 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
1202 int idx_ipv4_number
= 2;
1204 struct ospf_area
*area
;
1205 struct ospf_vl_config_data vl_config
;
1206 struct ospf_vl_data
*vl_data
= NULL
;
1207 char auth_key
[OSPF_AUTH_SIMPLE_SIZE
+1];
1211 ospf_vl_config_data_init(&vl_config
, vty
);
1213 ret
= ospf_str2area_id (argv
[idx_ipv4_number
]->arg
, &vl_config
.area_id
, &format
);
1216 vty_out (vty
, "OSPF area ID is invalid%s", VTY_NEWLINE
);
1220 area
= ospf_area_lookup_by_area_id (ospf
, vl_config
.area_id
);
1223 vty_out (vty
, "Area does not exist%s", VTY_NEWLINE
);
1227 ret
= inet_aton (argv
[idx_ipv4
]->arg
, &vl_config
.vl_peer
);
1230 vty_out (vty
, "Please specify valid Router ID as a.b.c.d%s",
1237 /* Basic VLink no command */
1238 /* Thats all folks! - BUGS B. strikes again!!!*/
1239 if ((vl_data
= ospf_vl_lookup (ospf
, area
, vl_config
.vl_peer
)))
1240 ospf_vl_delete (ospf
, vl_data
);
1242 ospf_area_check_free (ospf
, vl_config
.area_id
);
1247 /* If we are down here, we are reseting parameters */
1249 /* Deal with other parameters */
1250 for (i
=6; i
< argc
; i
++)
1252 /* vty_out (vty, "argv[%d] - %s%s", i, argv[i], VTY_NEWLINE); */
1254 switch (argv
[i
]->arg
[0])
1258 if (i
> 2 || strncmp (argv
[i
]->text
, "authentication-", 15) == 0)
1260 /* authentication-key - this option can occur anywhere on
1261 command line. At start of command line
1262 must check for authentication option. */
1263 memset (auth_key
, 0, OSPF_AUTH_SIMPLE_SIZE
+ 1);
1264 vl_config
.auth_key
= auth_key
;
1266 else if (strncmp (argv
[i
]->text
, "authentication", 14) == 0)
1268 /* authentication - this option can only occur at start
1270 vl_config
.auth_type
= OSPF_AUTH_NOTSET
;
1275 /* message-digest-key */
1276 /* Delete one key */
1280 vl_config
.crypto_key_id
= strtol (argv
[i
]->arg
, NULL
, 10);
1281 if (vl_config
.crypto_key_id
< 0)
1283 vl_config
.md5_key
= NULL
;
1293 /* Action configuration */
1295 return ospf_vl_set (ospf
, &vl_config
);
1298 DEFUN (no_ospf_area_vlink_intervals
,
1299 no_ospf_area_vlink_intervals_cmd
,
1300 "no area <A.B.C.D|(0-4294967295)> virtual-link A.B.C.D"
1301 "<hello-interval|retransmit-interval|transmit-delay|dead-interval> (1-65535)"
1302 "[<hello-interval|retransmit-interval|transmit-delay|dead-interval> (1-65535)"
1303 "[<hello-interval|retransmit-interval|transmit-delay|dead-interval> (1-65535)"
1304 "[<hello-interval|retransmit-interval|transmit-delay|dead-interval> (1-65535)"
1307 VLINK_HELPSTR_IPADDR
1308 VLINK_HELPSTR_TIME_PARAM
1309 VLINK_HELPSTR_TIME_PARAM
1310 VLINK_HELPSTR_TIME_PARAM
1311 VLINK_HELPSTR_TIME_PARAM
)
1313 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
1314 struct ospf_vl_config_data vl_config
;
1317 ospf_vl_config_data_init(&vl_config
, vty
);
1319 char *area_id
= argv
[2]->arg
;
1320 char *router_id
= argv
[4]->arg
;
1322 ret
= ospf_str2area_id (area_id
, &vl_config
.area_id
, &vl_config
.format
);
1325 vty_out (vty
, "OSPF area ID is invalid%s", VTY_NEWLINE
);
1329 ret
= inet_aton (router_id
, &vl_config
.vl_peer
);
1332 vty_out (vty
, "Please specify valid Router ID as a.b.c.d%s", VTY_NEWLINE
);
1336 for (unsigned int i
= 0; i
< 4; i
++)
1339 if (argv_find (argv
, argc
, "hello-interval", &idx
))
1340 vl_config
.hello_interval
= OSPF_HELLO_INTERVAL_DEFAULT
;
1341 else if (argv_find (argv
, argc
, "retransmit-interval", &idx
))
1342 vl_config
.retransmit_interval
= OSPF_RETRANSMIT_INTERVAL_DEFAULT
;
1343 else if (argv_find (argv
, argc
, "transmit-delay", &idx
))
1344 vl_config
.transmit_delay
= OSPF_TRANSMIT_DELAY_DEFAULT
;
1345 else if (argv_find (argv
, argc
, "dead-interval", &idx
))
1346 vl_config
.dead_interval
= OSPF_ROUTER_DEAD_INTERVAL_DEFAULT
;
1349 /* Action configuration */
1350 return ospf_vl_set (ospf
, &vl_config
);
1353 DEFUN (ospf_area_shortcut
,
1354 ospf_area_shortcut_cmd
,
1355 "area <A.B.C.D|(0-4294967295)> shortcut <default|enable|disable>",
1356 "OSPF area parameters\n"
1357 "OSPF area ID in IP address format\n"
1358 "OSPF area ID as a decimal value\n"
1359 "Configure the area's shortcutting mode\n"
1360 "Set default shortcutting behavior\n"
1361 "Enable shortcutting through the area\n"
1362 "Disable shortcutting through the area\n")
1364 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
1365 int idx_ipv4_number
= 1;
1366 int idx_enable_disable
= 3;
1367 struct ospf_area
*area
;
1368 struct in_addr area_id
;
1372 VTY_GET_OSPF_AREA_ID_NO_BB ("shortcut", area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1374 area
= ospf_area_get (ospf
, area_id
, format
);
1376 if (strncmp (argv
[idx_enable_disable
]->arg
, "de", 2) == 0)
1377 mode
= OSPF_SHORTCUT_DEFAULT
;
1378 else if (strncmp (argv
[idx_enable_disable
]->arg
, "di", 2) == 0)
1379 mode
= OSPF_SHORTCUT_DISABLE
;
1380 else if (strncmp (argv
[idx_enable_disable
]->arg
, "e", 1) == 0)
1381 mode
= OSPF_SHORTCUT_ENABLE
;
1385 ospf_area_shortcut_set (ospf
, area
, mode
);
1387 if (ospf
->abr_type
!= OSPF_ABR_SHORTCUT
)
1388 vty_out (vty
, "Shortcut area setting will take effect "
1389 "only when the router is configured as Shortcut ABR%s",
1395 DEFUN (no_ospf_area_shortcut
,
1396 no_ospf_area_shortcut_cmd
,
1397 "no area <A.B.C.D|(0-4294967295)> shortcut <enable|disable>",
1399 "OSPF area parameters\n"
1400 "OSPF area ID in IP address format\n"
1401 "OSPF area ID as a decimal value\n"
1402 "Deconfigure the area's shortcutting mode\n"
1403 "Deconfigure enabled shortcutting through the area\n"
1404 "Deconfigure disabled shortcutting through the area\n")
1406 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
1407 int idx_ipv4_number
= 2;
1408 struct ospf_area
*area
;
1409 struct in_addr area_id
;
1412 VTY_GET_OSPF_AREA_ID_NO_BB ("shortcut", area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1414 area
= ospf_area_lookup_by_area_id (ospf
, area_id
);
1418 ospf_area_shortcut_unset (ospf
, area
);
1424 DEFUN (ospf_area_stub
,
1426 "area <A.B.C.D|(0-4294967295)> stub",
1427 "OSPF area parameters\n"
1428 "OSPF area ID in IP address format\n"
1429 "OSPF area ID as a decimal value\n"
1430 "Configure OSPF area as stub\n")
1432 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
1433 int idx_ipv4_number
= 1;
1434 struct in_addr area_id
;
1437 VTY_GET_OSPF_AREA_ID_NO_BB ("stub", area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1439 ret
= ospf_area_stub_set (ospf
, area_id
);
1442 vty_out (vty
, "First deconfigure all virtual link through this area%s",
1447 ospf_area_no_summary_unset (ospf
, area_id
);
1452 DEFUN (ospf_area_stub_no_summary
,
1453 ospf_area_stub_no_summary_cmd
,
1454 "area <A.B.C.D|(0-4294967295)> stub no-summary",
1455 "OSPF stub parameters\n"
1456 "OSPF area ID in IP address format\n"
1457 "OSPF area ID as a decimal value\n"
1458 "Configure OSPF area as stub\n"
1459 "Do not inject inter-area routes into stub\n")
1461 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
1462 int idx_ipv4_number
= 1;
1463 struct in_addr area_id
;
1466 VTY_GET_OSPF_AREA_ID_NO_BB ("stub", area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1468 ret
= ospf_area_stub_set (ospf
, area_id
);
1471 vty_out (vty
, "%% Area cannot be stub as it contains a virtual link%s",
1476 ospf_area_no_summary_set (ospf
, area_id
);
1481 DEFUN (no_ospf_area_stub
,
1482 no_ospf_area_stub_cmd
,
1483 "no area <A.B.C.D|(0-4294967295)> stub",
1485 "OSPF area parameters\n"
1486 "OSPF area ID in IP address format\n"
1487 "OSPF area ID as a decimal value\n"
1488 "Configure OSPF area as stub\n")
1490 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
1491 int idx_ipv4_number
= 2;
1492 struct in_addr area_id
;
1495 VTY_GET_OSPF_AREA_ID_NO_BB ("stub", area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1497 ospf_area_stub_unset (ospf
, area_id
);
1498 ospf_area_no_summary_unset (ospf
, area_id
);
1503 DEFUN (no_ospf_area_stub_no_summary
,
1504 no_ospf_area_stub_no_summary_cmd
,
1505 "no area <A.B.C.D|(0-4294967295)> stub no-summary",
1507 "OSPF area parameters\n"
1508 "OSPF area ID in IP address format\n"
1509 "OSPF area ID as a decimal value\n"
1510 "Configure OSPF area as stub\n"
1511 "Do not inject inter-area routes into area\n")
1513 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
1514 int idx_ipv4_number
= 2;
1515 struct in_addr area_id
;
1518 VTY_GET_OSPF_AREA_ID_NO_BB ("stub", area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1519 ospf_area_no_summary_unset (ospf
, area_id
);
1525 ospf_area_nssa_cmd_handler (struct vty
*vty
, int argc
, struct cmd_token
**argv
,
1528 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
1529 struct in_addr area_id
;
1532 VTY_GET_OSPF_AREA_ID_NO_BB ("NSSA", area_id
, format
, argv
[1]->arg
);
1534 ret
= ospf_area_nssa_set (ospf
, area_id
);
1537 vty_out (vty
, "%% Area cannot be nssa as it contains a virtual link%s",
1544 if (strncmp (argv
[3]->text
, "translate-c", 11) == 0)
1545 ospf_area_nssa_translator_role_set (ospf
, area_id
,
1546 OSPF_NSSA_ROLE_CANDIDATE
);
1547 else if (strncmp (argv
[3]->text
, "translate-n", 11) == 0)
1548 ospf_area_nssa_translator_role_set (ospf
, area_id
,
1549 OSPF_NSSA_ROLE_NEVER
);
1550 else if (strncmp (argv
[3]->text
, "translate-a", 11) == 0)
1551 ospf_area_nssa_translator_role_set (ospf
, area_id
,
1552 OSPF_NSSA_ROLE_ALWAYS
);
1556 ospf_area_nssa_translator_role_set (ospf
, area_id
,
1557 OSPF_NSSA_ROLE_CANDIDATE
);
1561 ospf_area_no_summary_set (ospf
, area_id
);
1563 ospf_area_no_summary_unset (ospf
, area_id
);
1565 ospf_schedule_abr_task (ospf
);
1570 DEFUN (ospf_area_nssa_translate_no_summary
,
1571 ospf_area_nssa_translate_no_summary_cmd
,
1572 "area <A.B.C.D|(0-4294967295)> nssa <translate-candidate|translate-never|translate-always> no-summary",
1573 "OSPF area parameters\n"
1574 "OSPF area ID in IP address format\n"
1575 "OSPF area ID as a decimal value\n"
1576 "Configure OSPF area as nssa\n"
1577 "Configure NSSA-ABR for translate election (default)\n"
1578 "Configure NSSA-ABR to never translate\n"
1579 "Configure NSSA-ABR to always translate\n"
1580 "Do not inject inter-area routes into nssa\n")
1582 return ospf_area_nssa_cmd_handler (vty
, argc
, argv
, 1);
1585 DEFUN (ospf_area_nssa_translate
,
1586 ospf_area_nssa_translate_cmd
,
1587 "area <A.B.C.D|(0-4294967295)> nssa <translate-candidate|translate-never|translate-always>",
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 "Configure NSSA-ABR for translate election (default)\n"
1593 "Configure NSSA-ABR to never translate\n"
1594 "Configure NSSA-ABR to always translate\n")
1596 return ospf_area_nssa_cmd_handler (vty
, argc
, argv
, 0);
1599 DEFUN (ospf_area_nssa
,
1601 "area <A.B.C.D|(0-4294967295)> nssa",
1602 "OSPF area parameters\n"
1603 "OSPF area ID in IP address format\n"
1604 "OSPF area ID as a decimal value\n"
1605 "Configure OSPF area as nssa\n")
1607 return ospf_area_nssa_cmd_handler (vty
, argc
, argv
, 0);
1610 DEFUN (ospf_area_nssa_no_summary
,
1611 ospf_area_nssa_no_summary_cmd
,
1612 "area <A.B.C.D|(0-4294967295)> nssa no-summary",
1613 "OSPF area parameters\n"
1614 "OSPF area ID in IP address format\n"
1615 "OSPF area ID as a decimal value\n"
1616 "Configure OSPF area as nssa\n"
1617 "Do not inject inter-area routes into nssa\n")
1619 return ospf_area_nssa_cmd_handler (vty
, argc
, argv
, 1);
1622 DEFUN (no_ospf_area_nssa
,
1623 no_ospf_area_nssa_cmd
,
1624 "no area <A.B.C.D|(0-4294967295)> nssa [<translate-candidate|translate-never|translate-always> [no-summary]]",
1626 "OSPF area parameters\n"
1627 "OSPF area ID in IP address format\n"
1628 "OSPF area ID as a decimal value\n"
1629 "Configure OSPF area as nssa\n"
1630 "Configure NSSA-ABR for translate election (default)\n"
1631 "Configure NSSA-ABR to never translate\n"
1632 "Configure NSSA-ABR to always translate\n"
1633 "Do not inject inter-area routes into nssa\n")
1635 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
1636 int idx_ipv4_number
= 2;
1637 struct in_addr area_id
;
1640 VTY_GET_OSPF_AREA_ID_NO_BB ("NSSA", area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1642 ospf_area_nssa_unset (ospf
, area_id
);
1643 ospf_area_no_summary_unset (ospf
, area_id
);
1645 ospf_schedule_abr_task (ospf
);
1651 DEFUN (ospf_area_default_cost
,
1652 ospf_area_default_cost_cmd
,
1653 "area <A.B.C.D|(0-4294967295)> default-cost (0-16777215)",
1654 "OSPF area parameters\n"
1655 "OSPF area ID in IP address format\n"
1656 "OSPF area ID as a decimal value\n"
1657 "Set the summary-default cost of a NSSA or stub area\n"
1658 "Stub's advertised default summary cost\n")
1660 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
1661 int idx_ipv4_number
= 1;
1663 struct ospf_area
*area
;
1664 struct in_addr area_id
;
1667 struct prefix_ipv4 p
;
1669 VTY_GET_OSPF_AREA_ID_NO_BB ("default-cost", area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1670 VTY_GET_INTEGER_RANGE ("stub default cost", cost
, argv
[idx_number
]->arg
, 0, 16777215);
1672 area
= ospf_area_get (ospf
, area_id
, format
);
1674 if (area
->external_routing
== OSPF_AREA_DEFAULT
)
1676 vty_out (vty
, "The area is neither stub, nor NSSA%s", VTY_NEWLINE
);
1680 area
->default_cost
= cost
;
1683 p
.prefix
.s_addr
= OSPF_DEFAULT_DESTINATION
;
1685 if (IS_DEBUG_OSPF_EVENT
)
1686 zlog_debug ("ospf_abr_announce_stub_defaults(): "
1687 "announcing 0.0.0.0/0 to area %s",
1688 inet_ntoa (area
->area_id
));
1689 ospf_abr_announce_network_to_area (&p
, area
->default_cost
, area
);
1694 DEFUN (no_ospf_area_default_cost
,
1695 no_ospf_area_default_cost_cmd
,
1696 "no area <A.B.C.D|(0-4294967295)> default-cost (0-16777215)",
1698 "OSPF area parameters\n"
1699 "OSPF area ID in IP address format\n"
1700 "OSPF area ID as a decimal value\n"
1701 "Set the summary-default cost of a NSSA or stub area\n"
1702 "Stub's advertised default summary cost\n")
1704 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
1705 int idx_ipv4_number
= 2;
1707 struct ospf_area
*area
;
1708 struct in_addr area_id
;
1710 struct prefix_ipv4 p
;
1712 VTY_GET_OSPF_AREA_ID_NO_BB ("default-cost", area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1713 VTY_CHECK_INTEGER_RANGE ("stub default cost", argv
[idx_number
]->arg
, 0, OSPF_LS_INFINITY
);
1715 area
= ospf_area_lookup_by_area_id (ospf
, area_id
);
1719 if (area
->external_routing
== OSPF_AREA_DEFAULT
)
1721 vty_out (vty
, "The area is neither stub, nor NSSA%s", VTY_NEWLINE
);
1725 area
->default_cost
= 1;
1728 p
.prefix
.s_addr
= OSPF_DEFAULT_DESTINATION
;
1730 if (IS_DEBUG_OSPF_EVENT
)
1731 zlog_debug ("ospf_abr_announce_stub_defaults(): "
1732 "announcing 0.0.0.0/0 to area %s",
1733 inet_ntoa (area
->area_id
));
1734 ospf_abr_announce_network_to_area (&p
, area
->default_cost
, area
);
1737 ospf_area_check_free (ospf
, area_id
);
1742 DEFUN (ospf_area_export_list
,
1743 ospf_area_export_list_cmd
,
1744 "area <A.B.C.D|(0-4294967295)> export-list NAME",
1745 "OSPF area parameters\n"
1746 "OSPF area ID in IP address format\n"
1747 "OSPF area ID as a decimal value\n"
1748 "Set the filter for networks announced to other areas\n"
1749 "Name of the access-list\n")
1751 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
1752 int idx_ipv4_number
= 1;
1753 struct ospf_area
*area
;
1754 struct in_addr area_id
;
1757 VTY_GET_OSPF_AREA_ID (area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1759 area
= ospf_area_get (ospf
, area_id
, format
);
1760 ospf_area_export_list_set (ospf
, area
, argv
[3]->arg
);
1765 DEFUN (no_ospf_area_export_list
,
1766 no_ospf_area_export_list_cmd
,
1767 "no area <A.B.C.D|(0-4294967295)> export-list NAME",
1769 "OSPF area parameters\n"
1770 "OSPF area ID in IP address format\n"
1771 "OSPF area ID as a decimal value\n"
1772 "Unset the filter for networks announced to other areas\n"
1773 "Name of the access-list\n")
1775 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
1776 int idx_ipv4_number
= 2;
1777 struct ospf_area
*area
;
1778 struct in_addr area_id
;
1781 VTY_GET_OSPF_AREA_ID (area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1783 area
= ospf_area_lookup_by_area_id (ospf
, area_id
);
1787 ospf_area_export_list_unset (ospf
, area
);
1793 DEFUN (ospf_area_import_list
,
1794 ospf_area_import_list_cmd
,
1795 "area <A.B.C.D|(0-4294967295)> import-list NAME",
1796 "OSPF area parameters\n"
1797 "OSPF area ID in IP address format\n"
1798 "OSPF area ID as a decimal value\n"
1799 "Set the filter for networks from other areas announced to the specified one\n"
1800 "Name of the access-list\n")
1802 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
1803 int idx_ipv4_number
= 1;
1804 struct ospf_area
*area
;
1805 struct in_addr area_id
;
1808 VTY_GET_OSPF_AREA_ID (area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1810 area
= ospf_area_get (ospf
, area_id
, format
);
1811 ospf_area_import_list_set (ospf
, area
, argv
[3]->arg
);
1816 DEFUN (no_ospf_area_import_list
,
1817 no_ospf_area_import_list_cmd
,
1818 "no area <A.B.C.D|(0-4294967295)> import-list NAME",
1820 "OSPF area parameters\n"
1821 "OSPF area ID in IP address format\n"
1822 "OSPF area ID as a decimal value\n"
1823 "Unset the filter for networks announced to other areas\n"
1824 "Name of the access-list\n")
1826 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
1827 int idx_ipv4_number
= 2;
1828 struct ospf_area
*area
;
1829 struct in_addr area_id
;
1832 VTY_GET_OSPF_AREA_ID (area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1834 area
= ospf_area_lookup_by_area_id (ospf
, area_id
);
1838 ospf_area_import_list_unset (ospf
, area
);
1843 DEFUN (ospf_area_filter_list
,
1844 ospf_area_filter_list_cmd
,
1845 "area <A.B.C.D|(0-4294967295)> filter-list prefix WORD <in|out>",
1846 "OSPF area parameters\n"
1847 "OSPF area ID in IP address format\n"
1848 "OSPF area ID as a decimal value\n"
1849 "Filter networks between OSPF areas\n"
1850 "Filter prefixes between OSPF areas\n"
1851 "Name of an IP prefix-list\n"
1852 "Filter networks sent to this area\n"
1853 "Filter networks sent from this area\n")
1855 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
1856 int idx_ipv4_number
= 1;
1859 struct ospf_area
*area
;
1860 struct in_addr area_id
;
1861 struct prefix_list
*plist
;
1864 VTY_GET_OSPF_AREA_ID (area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1866 area
= ospf_area_get (ospf
, area_id
, format
);
1867 plist
= prefix_list_lookup (AFI_IP
, argv
[idx_word
]->arg
);
1868 if (strncmp (argv
[idx_in_out
]->arg
, "in", 2) == 0)
1870 PREFIX_LIST_IN (area
) = plist
;
1871 if (PREFIX_NAME_IN (area
))
1872 free (PREFIX_NAME_IN (area
));
1874 PREFIX_NAME_IN (area
) = strdup (argv
[idx_word
]->arg
);
1875 ospf_schedule_abr_task (ospf
);
1879 PREFIX_LIST_OUT (area
) = plist
;
1880 if (PREFIX_NAME_OUT (area
))
1881 free (PREFIX_NAME_OUT (area
));
1883 PREFIX_NAME_OUT (area
) = strdup (argv
[idx_word
]->arg
);
1884 ospf_schedule_abr_task (ospf
);
1890 DEFUN (no_ospf_area_filter_list
,
1891 no_ospf_area_filter_list_cmd
,
1892 "no area <A.B.C.D|(0-4294967295)> filter-list prefix WORD <in|out>",
1894 "OSPF area parameters\n"
1895 "OSPF area ID in IP address format\n"
1896 "OSPF area ID as a decimal value\n"
1897 "Filter networks between OSPF areas\n"
1898 "Filter prefixes between OSPF areas\n"
1899 "Name of an IP prefix-list\n"
1900 "Filter networks sent to this area\n"
1901 "Filter networks sent from this area\n")
1903 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
1904 int idx_ipv4_number
= 2;
1907 struct ospf_area
*area
;
1908 struct in_addr area_id
;
1911 VTY_GET_OSPF_AREA_ID (area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1913 if ((area
= ospf_area_lookup_by_area_id (ospf
, area_id
)) == NULL
)
1916 if (strncmp (argv
[idx_in_out
]->arg
, "in", 2) == 0)
1918 if (PREFIX_NAME_IN (area
))
1919 if (strcmp (PREFIX_NAME_IN (area
), argv
[idx_word
]->arg
) != 0)
1922 PREFIX_LIST_IN (area
) = NULL
;
1923 if (PREFIX_NAME_IN (area
))
1924 free (PREFIX_NAME_IN (area
));
1926 PREFIX_NAME_IN (area
) = NULL
;
1928 ospf_schedule_abr_task (ospf
);
1932 if (PREFIX_NAME_OUT (area
))
1933 if (strcmp (PREFIX_NAME_OUT (area
), argv
[idx_word
]->arg
) != 0)
1936 PREFIX_LIST_OUT (area
) = NULL
;
1937 if (PREFIX_NAME_OUT (area
))
1938 free (PREFIX_NAME_OUT (area
));
1940 PREFIX_NAME_OUT (area
) = NULL
;
1942 ospf_schedule_abr_task (ospf
);
1949 DEFUN (ospf_area_authentication_message_digest
,
1950 ospf_area_authentication_message_digest_cmd
,
1951 "area <A.B.C.D|(0-4294967295)> authentication message-digest",
1952 "OSPF area parameters\n"
1953 "OSPF area ID in IP address format\n"
1954 "OSPF area ID as a decimal value\n"
1955 "Enable authentication\n"
1956 "Use message-digest authentication\n")
1958 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
1959 int idx_ipv4_number
= 1;
1960 struct ospf_area
*area
;
1961 struct in_addr area_id
;
1964 VTY_GET_OSPF_AREA_ID (area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1966 area
= ospf_area_get (ospf
, area_id
, format
);
1967 area
->auth_type
= OSPF_AUTH_CRYPTOGRAPHIC
;
1972 DEFUN (ospf_area_authentication
,
1973 ospf_area_authentication_cmd
,
1974 "area <A.B.C.D|(0-4294967295)> authentication",
1975 "OSPF area parameters\n"
1976 "OSPF area ID in IP address format\n"
1977 "OSPF area ID as a decimal value\n"
1978 "Enable authentication\n")
1980 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
1981 int idx_ipv4_number
= 1;
1982 struct ospf_area
*area
;
1983 struct in_addr area_id
;
1986 VTY_GET_OSPF_AREA_ID (area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1988 area
= ospf_area_get (ospf
, area_id
, format
);
1989 area
->auth_type
= OSPF_AUTH_SIMPLE
;
1994 DEFUN (no_ospf_area_authentication
,
1995 no_ospf_area_authentication_cmd
,
1996 "no area <A.B.C.D|(0-4294967295)> authentication",
1998 "OSPF area parameters\n"
1999 "OSPF area ID in IP address format\n"
2000 "OSPF area ID as a decimal value\n"
2001 "Enable authentication\n")
2003 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
2004 int idx_ipv4_number
= 2;
2005 struct ospf_area
*area
;
2006 struct in_addr area_id
;
2009 VTY_GET_OSPF_AREA_ID (area_id
, format
, argv
[idx_ipv4_number
]->arg
);
2011 area
= ospf_area_lookup_by_area_id (ospf
, area_id
);
2015 area
->auth_type
= OSPF_AUTH_NULL
;
2017 ospf_area_check_free (ospf
, area_id
);
2023 DEFUN (ospf_abr_type
,
2025 "ospf abr-type <cisco|ibm|shortcut|standard>",
2026 "OSPF specific commands\n"
2027 "Set OSPF ABR type\n"
2028 "Alternative ABR, cisco implementation\n"
2029 "Alternative ABR, IBM implementation\n"
2031 "Standard behavior (RFC2328)\n")
2033 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
2035 u_char abr_type
= OSPF_ABR_UNKNOWN
;
2037 if (strncmp (argv
[idx_vendor
]->arg
, "c", 1) == 0)
2038 abr_type
= OSPF_ABR_CISCO
;
2039 else if (strncmp (argv
[idx_vendor
]->arg
, "i", 1) == 0)
2040 abr_type
= OSPF_ABR_IBM
;
2041 else if (strncmp (argv
[idx_vendor
]->arg
, "sh", 2) == 0)
2042 abr_type
= OSPF_ABR_SHORTCUT
;
2043 else if (strncmp (argv
[idx_vendor
]->arg
, "st", 2) == 0)
2044 abr_type
= OSPF_ABR_STAND
;
2048 /* If ABR type value is changed, schedule ABR task. */
2049 if (ospf
->abr_type
!= abr_type
)
2051 ospf
->abr_type
= abr_type
;
2052 ospf_schedule_abr_task (ospf
);
2058 DEFUN (no_ospf_abr_type
,
2059 no_ospf_abr_type_cmd
,
2060 "no ospf abr-type <cisco|ibm|shortcut|standard>",
2062 "OSPF specific commands\n"
2063 "Set OSPF ABR type\n"
2064 "Alternative ABR, cisco implementation\n"
2065 "Alternative ABR, IBM implementation\n"
2069 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
2071 u_char abr_type
= OSPF_ABR_UNKNOWN
;
2073 if (strncmp (argv
[idx_vendor
]->arg
, "c", 1) == 0)
2074 abr_type
= OSPF_ABR_CISCO
;
2075 else if (strncmp (argv
[idx_vendor
]->arg
, "i", 1) == 0)
2076 abr_type
= OSPF_ABR_IBM
;
2077 else if (strncmp (argv
[idx_vendor
]->arg
, "sh", 2) == 0)
2078 abr_type
= OSPF_ABR_SHORTCUT
;
2079 else if (strncmp (argv
[idx_vendor
]->arg
, "st", 2) == 0)
2080 abr_type
= OSPF_ABR_STAND
;
2084 /* If ABR type value is changed, schedule ABR task. */
2085 if (ospf
->abr_type
== abr_type
)
2087 ospf
->abr_type
= OSPF_ABR_DEFAULT
;
2088 ospf_schedule_abr_task (ospf
);
2094 DEFUN (ospf_log_adjacency_changes
,
2095 ospf_log_adjacency_changes_cmd
,
2096 "log-adjacency-changes",
2097 "Log changes in adjacency state\n")
2099 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
2101 SET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_CHANGES
);
2102 UNSET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_DETAIL
);
2106 DEFUN (ospf_log_adjacency_changes_detail
,
2107 ospf_log_adjacency_changes_detail_cmd
,
2108 "log-adjacency-changes detail",
2109 "Log changes in adjacency state\n"
2110 "Log all state changes\n")
2112 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
2114 SET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_CHANGES
);
2115 SET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_DETAIL
);
2119 DEFUN (no_ospf_log_adjacency_changes
,
2120 no_ospf_log_adjacency_changes_cmd
,
2121 "no log-adjacency-changes",
2123 "Log changes in adjacency state\n")
2125 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
2127 UNSET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_DETAIL
);
2128 UNSET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_CHANGES
);
2132 DEFUN (no_ospf_log_adjacency_changes_detail
,
2133 no_ospf_log_adjacency_changes_detail_cmd
,
2134 "no log-adjacency-changes detail",
2136 "Log changes in adjacency state\n"
2137 "Log all state changes\n")
2139 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
2141 UNSET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_DETAIL
);
2145 DEFUN (ospf_compatible_rfc1583
,
2146 ospf_compatible_rfc1583_cmd
,
2147 "compatible rfc1583",
2148 "OSPF compatibility list\n"
2149 "compatible with RFC 1583\n")
2151 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
2153 if (!CHECK_FLAG (ospf
->config
, OSPF_RFC1583_COMPATIBLE
))
2155 SET_FLAG (ospf
->config
, OSPF_RFC1583_COMPATIBLE
);
2156 ospf_spf_calculate_schedule (ospf
, SPF_FLAG_CONFIG_CHANGE
);
2161 DEFUN (no_ospf_compatible_rfc1583
,
2162 no_ospf_compatible_rfc1583_cmd
,
2163 "no compatible rfc1583",
2165 "OSPF compatibility list\n"
2166 "compatible with RFC 1583\n")
2168 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
2170 if (CHECK_FLAG (ospf
->config
, OSPF_RFC1583_COMPATIBLE
))
2172 UNSET_FLAG (ospf
->config
, OSPF_RFC1583_COMPATIBLE
);
2173 ospf_spf_calculate_schedule (ospf
, SPF_FLAG_CONFIG_CHANGE
);
2178 ALIAS (ospf_compatible_rfc1583
,
2179 ospf_rfc1583_flag_cmd
,
2180 "ospf rfc1583compatibility",
2181 "OSPF specific commands\n"
2182 "Enable the RFC1583Compatibility flag\n")
2184 ALIAS (no_ospf_compatible_rfc1583
,
2185 no_ospf_rfc1583_flag_cmd
,
2186 "no ospf rfc1583compatibility",
2188 "OSPF specific commands\n"
2189 "Disable the RFC1583Compatibility flag\n")
2192 ospf_timers_spf_set (struct vty
*vty
, unsigned int delay
,
2196 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
2198 ospf
->spf_delay
= delay
;
2199 ospf
->spf_holdtime
= hold
;
2200 ospf
->spf_max_holdtime
= max
;
2205 DEFUN (ospf_timers_min_ls_interval
,
2206 ospf_timers_min_ls_interval_cmd
,
2207 "timers throttle lsa all (0-5000)",
2208 "Adjust routing timers\n"
2209 "Throttling adaptive timer\n"
2210 "LSA delay between transmissions\n"
2212 "Delay (msec) between sending LSAs\n")
2214 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
2216 unsigned int interval
;
2220 vty_out (vty
, "Insufficient arguments%s", VTY_NEWLINE
);
2224 VTY_GET_INTEGER ("LSA interval", interval
, argv
[idx_number
]->arg
);
2226 ospf
->min_ls_interval
= interval
;
2231 DEFUN (no_ospf_timers_min_ls_interval
,
2232 no_ospf_timers_min_ls_interval_cmd
,
2233 "no timers throttle lsa all [(0-5000)]",
2235 "Adjust routing timers\n"
2236 "Throttling adaptive timer\n"
2237 "LSA delay between transmissions\n"
2239 "Delay (msec) between sending LSAs\n")
2241 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
2242 ospf
->min_ls_interval
= OSPF_MIN_LS_INTERVAL
;
2248 DEFUN (ospf_timers_min_ls_arrival
,
2249 ospf_timers_min_ls_arrival_cmd
,
2250 "timers lsa arrival (0-1000)",
2251 "Adjust routing timers\n"
2252 "Throttling link state advertisement delays\n"
2253 "OSPF minimum arrival interval delay\n"
2254 "Delay (msec) between accepted LSAs\n")
2256 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
2258 unsigned int arrival
;
2262 vty_out (vty
, "Insufficient arguments%s", VTY_NEWLINE
);
2266 VTY_GET_INTEGER_RANGE ("minimum LSA inter-arrival time", arrival
, argv
[idx_number
]->arg
, 0, 1000);
2268 ospf
->min_ls_arrival
= arrival
;
2273 DEFUN (no_ospf_timers_min_ls_arrival
,
2274 no_ospf_timers_min_ls_arrival_cmd
,
2275 "no timers lsa arrival [(0-1000)]",
2277 "Adjust routing timers\n"
2278 "Throttling link state advertisement delays\n"
2279 "OSPF minimum arrival interval delay\n"
2280 "Delay (msec) between accepted LSAs\n")
2282 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
2284 ospf
->min_ls_arrival
= OSPF_MIN_LS_ARRIVAL
;
2290 DEFUN (ospf_timers_throttle_spf
,
2291 ospf_timers_throttle_spf_cmd
,
2292 "timers throttle spf (0-600000) (0-600000) (0-600000)",
2293 "Adjust routing timers\n"
2294 "Throttling adaptive timer\n"
2296 "Delay (msec) from first change received till SPF calculation\n"
2297 "Initial hold time (msec) between consecutive SPF calculations\n"
2298 "Maximum hold time (msec)\n")
2301 int idx_number_2
= 4;
2302 int idx_number_3
= 5;
2303 unsigned int delay
, hold
, max
;
2307 vty_out (vty
, "Insufficient arguments%s", VTY_NEWLINE
);
2311 VTY_GET_INTEGER_RANGE ("SPF delay timer", delay
, argv
[idx_number
]->arg
, 0, 600000);
2312 VTY_GET_INTEGER_RANGE ("SPF hold timer", hold
, argv
[idx_number_2
]->arg
, 0, 600000);
2313 VTY_GET_INTEGER_RANGE ("SPF max-hold timer", max
, argv
[idx_number_3
]->arg
, 0, 600000);
2315 return ospf_timers_spf_set (vty
, delay
, hold
, max
);
2318 DEFUN (no_ospf_timers_throttle_spf
,
2319 no_ospf_timers_throttle_spf_cmd
,
2320 "no timers throttle spf [(0-600000)(0-600000)(0-600000)]",
2322 "Adjust routing timers\n"
2323 "Throttling adaptive timer\n"
2325 "Delay (msec) from first change received till SPF calculation\n"
2326 "Initial hold time (msec) between consecutive SPF calculations\n"
2327 "Maximum hold time (msec)\n")
2329 return ospf_timers_spf_set (vty
,
2330 OSPF_SPF_DELAY_DEFAULT
,
2331 OSPF_SPF_HOLDTIME_DEFAULT
,
2332 OSPF_SPF_MAX_HOLDTIME_DEFAULT
);
2336 DEFUN (ospf_timers_lsa
,
2337 ospf_timers_lsa_cmd
,
2338 "timers lsa min-arrival (0-600000)",
2339 "Adjust routing timers\n"
2341 "Minimum delay in receiving new version of a LSA\n"
2342 "Delay in milliseconds\n")
2344 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
2346 unsigned int minarrival
;
2350 vty_out (vty
, "Insufficient number of arguments%s", VTY_NEWLINE
);
2354 VTY_GET_INTEGER ("LSA min-arrival", minarrival
, argv
[idx_number
]->arg
);
2356 ospf
->min_ls_arrival
= minarrival
;
2361 DEFUN (no_ospf_timers_lsa
,
2362 no_ospf_timers_lsa_cmd
,
2363 "no timers lsa min-arrival [(0-600000)]",
2365 "Adjust routing timers\n"
2367 "Minimum delay in receiving new version of a LSA\n"
2368 "Delay in milliseconds\n")
2370 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
2371 unsigned int minarrival
;
2375 VTY_GET_INTEGER ("LSA min-arrival", minarrival
, argv
[4]->arg
);
2377 if (ospf
->min_ls_arrival
!= minarrival
||
2378 minarrival
== OSPF_MIN_LS_ARRIVAL
)
2382 ospf
->min_ls_arrival
= OSPF_MIN_LS_ARRIVAL
;
2387 DEFUN (ospf_neighbor
,
2389 "neighbor A.B.C.D [priority (0-255) [poll-interval (1-65535)]]",
2391 "Neighbor IP address\n"
2392 "Neighbor Priority\n"
2394 "Dead Neighbor Polling interval\n"
2397 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
2401 struct in_addr nbr_addr
;
2402 unsigned int priority
= OSPF_NEIGHBOR_PRIORITY_DEFAULT
;
2403 unsigned int interval
= OSPF_POLL_INTERVAL_DEFAULT
;
2405 VTY_GET_IPV4_ADDRESS ("neighbor address", nbr_addr
, argv
[idx_ipv4
]->arg
);
2408 VTY_GET_INTEGER_RANGE ("neighbor priority", priority
, argv
[idx_pri
]->arg
, 0, 255);
2411 VTY_GET_INTEGER_RANGE ("poll interval", interval
, argv
[idx_poll
]->arg
, 1, 65535);
2413 ospf_nbr_nbma_set (ospf
, nbr_addr
);
2416 ospf_nbr_nbma_priority_set (ospf
, nbr_addr
, priority
);
2419 ospf_nbr_nbma_poll_interval_set (ospf
, nbr_addr
, interval
);
2424 DEFUN (ospf_neighbor_poll_interval
,
2425 ospf_neighbor_poll_interval_cmd
,
2426 "neighbor A.B.C.D poll-interval (1-65535) [priority (0-255)]",
2428 "Neighbor IP address\n"
2429 "Dead Neighbor Polling interval\n"
2431 "OSPF priority of non-broadcast neighbor\n"
2434 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
2438 struct in_addr nbr_addr
;
2439 unsigned int priority
= OSPF_NEIGHBOR_PRIORITY_DEFAULT
;
2440 unsigned int interval
= OSPF_POLL_INTERVAL_DEFAULT
;
2442 VTY_GET_IPV4_ADDRESS ("neighbor address", nbr_addr
, argv
[idx_ipv4
]->arg
);
2444 VTY_GET_INTEGER_RANGE ("poll interval", interval
, argv
[idx_poll
]->arg
, 1, 65535);
2447 VTY_GET_INTEGER_RANGE ("neighbor priority", priority
, argv
[idx_pri
]->arg
, 0, 255);
2449 ospf_nbr_nbma_set (ospf
, nbr_addr
);
2450 ospf_nbr_nbma_poll_interval_set (ospf
, nbr_addr
, interval
);
2453 ospf_nbr_nbma_priority_set (ospf
, nbr_addr
, priority
);
2458 DEFUN (no_ospf_neighbor
,
2459 no_ospf_neighbor_cmd
,
2460 "no neighbor A.B.C.D [priority (0-255) [poll-interval (1-65525)]]",
2463 "Neighbor IP address\n"
2464 "Neighbor Priority\n"
2466 "Dead Neighbor Polling interval\n"
2469 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
2471 struct in_addr nbr_addr
;
2473 VTY_GET_IPV4_ADDRESS ("neighbor address", nbr_addr
, argv
[idx_ipv4
]->arg
);
2475 (void)ospf_nbr_nbma_unset (ospf
, nbr_addr
);
2480 DEFUN (no_ospf_neighbor_poll
,
2481 no_ospf_neighbor_poll_cmd
,
2482 "no neighbor A.B.C.D poll-interval (1-65535) [priority (0-255)]",
2485 "Neighbor IP address\n"
2486 "Dead Neighbor Polling interval\n"
2488 "Neighbor Priority\n"
2491 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
2493 struct in_addr nbr_addr
;
2495 VTY_GET_IPV4_ADDRESS ("neighbor address", nbr_addr
, argv
[idx_ipv4
]->arg
);
2497 (void)ospf_nbr_nbma_unset (ospf
, nbr_addr
);
2502 DEFUN (ospf_refresh_timer
,
2503 ospf_refresh_timer_cmd
,
2504 "refresh timer (10-1800)",
2505 "Adjust refresh parameters\n"
2506 "Set refresh timer\n"
2507 "Timer value in seconds\n")
2509 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
2511 unsigned int interval
;
2513 VTY_GET_INTEGER_RANGE ("refresh timer", interval
, argv
[idx_number
]->arg
, 10, 1800);
2514 interval
= (interval
/ OSPF_LSA_REFRESHER_GRANULARITY
) * OSPF_LSA_REFRESHER_GRANULARITY
;
2516 ospf_timers_refresh_set (ospf
, interval
);
2521 DEFUN (no_ospf_refresh_timer
,
2522 no_ospf_refresh_timer_val_cmd
,
2523 "no refresh timer [(10-1800)]",
2525 "Adjust refresh parameters\n"
2526 "Unset refresh timer\n"
2527 "Timer value in seconds\n")
2529 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
2531 unsigned int interval
;
2535 VTY_GET_INTEGER_RANGE ("refresh timer", interval
, argv
[idx_number
]->arg
, 10, 1800);
2537 if (ospf
->lsa_refresh_interval
!= interval
||
2538 interval
== OSPF_LSA_REFRESH_INTERVAL_DEFAULT
)
2542 ospf_timers_refresh_unset (ospf
);
2548 DEFUN (ospf_auto_cost_reference_bandwidth
,
2549 ospf_auto_cost_reference_bandwidth_cmd
,
2550 "auto-cost reference-bandwidth (1-4294967)",
2551 "Calculate OSPF interface cost according to bandwidth\n"
2552 "Use reference bandwidth method to assign OSPF cost\n"
2553 "The reference bandwidth in terms of Mbits per second\n")
2555 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
2558 struct listnode
*node
;
2559 struct interface
*ifp
;
2561 refbw
= strtol (argv
[idx_number
]->arg
, NULL
, 10);
2562 if (refbw
< 1 || refbw
> 4294967)
2564 vty_out (vty
, "reference-bandwidth value is invalid%s", VTY_NEWLINE
);
2568 /* If reference bandwidth is changed. */
2569 if ((refbw
) == ospf
->ref_bandwidth
)
2572 ospf
->ref_bandwidth
= refbw
;
2573 for (ALL_LIST_ELEMENTS_RO (om
->iflist
, node
, ifp
))
2574 ospf_if_recalculate_output_cost (ifp
);
2579 DEFUN (no_ospf_auto_cost_reference_bandwidth
,
2580 no_ospf_auto_cost_reference_bandwidth_cmd
,
2581 "no auto-cost reference-bandwidth [(1-4294967)]",
2583 "Calculate OSPF interface cost according to bandwidth\n"
2584 "Use reference bandwidth method to assign OSPF cost\n"
2585 "The reference bandwidth in terms of Mbits per second\n")
2587 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
2588 struct listnode
*node
, *nnode
;
2589 struct interface
*ifp
;
2591 if (ospf
->ref_bandwidth
== OSPF_DEFAULT_REF_BANDWIDTH
)
2594 ospf
->ref_bandwidth
= OSPF_DEFAULT_REF_BANDWIDTH
;
2595 vty_out (vty
, "%% OSPF: Reference bandwidth is changed.%s", VTY_NEWLINE
);
2596 vty_out (vty
, " Please ensure reference bandwidth is consistent across all routers%s", VTY_NEWLINE
);
2598 for (ALL_LIST_ELEMENTS (om
->iflist
, node
, nnode
, ifp
))
2599 ospf_if_recalculate_output_cost (ifp
);
2604 DEFUN (ospf_write_multiplier
,
2605 ospf_write_multiplier_cmd
,
2606 "ospf write-multiplier (1-100)",
2607 "OSPF specific commands\n"
2608 "Write multiplier\n"
2609 "Maximum number of interface serviced per write\n")
2611 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
2613 u_int32_t write_oi_count
;
2620 write_oi_count
= strtol (argv
[idx_number
]->arg
, NULL
, 10);
2621 if (write_oi_count
< 1 || write_oi_count
> 100)
2623 vty_out (vty
, "write-multiplier value is invalid%s", VTY_NEWLINE
);
2627 ospf
->write_oi_count
= write_oi_count
;
2631 ALIAS (ospf_write_multiplier
,
2632 write_multiplier_cmd
,
2633 "write-multiplier (1-100)",
2634 "Write multiplier\n"
2635 "Maximum number of interface serviced per write\n")
2637 DEFUN (no_ospf_write_multiplier
,
2638 no_ospf_write_multiplier_cmd
,
2639 "no ospf write-multiplier (1-100)",
2641 "OSPF specific commands\n"
2642 "Write multiplier\n"
2643 "Maximum number of interface serviced per write\n")
2645 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
2647 ospf
->write_oi_count
= OSPF_WRITE_INTERFACE_COUNT_DEFAULT
;
2651 ALIAS (no_ospf_write_multiplier
,
2652 no_write_multiplier_cmd
,
2653 "no write-multiplier (1-100)",
2655 "Write multiplier\n"
2656 "Maximum number of interface serviced per write\n")
2658 const char *ospf_abr_type_descr_str
[] =
2661 "Standard (RFC2328)",
2663 "Alternative Cisco",
2664 "Alternative Shortcut"
2667 const char *ospf_shortcut_mode_descr_str
[] =
2675 show_ip_ospf_area (struct vty
*vty
, struct ospf_area
*area
, json_object
*json_areas
, u_char use_json
)
2677 json_object
*json_area
= NULL
;
2680 json_area
= json_object_new_object();
2684 vty_out (vty
, " Area ID: %s", inet_ntoa (area
->area_id
));
2686 /* Show Area type/mode. */
2687 if (OSPF_IS_AREA_BACKBONE (area
))
2690 json_object_boolean_true_add(json_area
, "backbone");
2692 vty_out (vty
, " (Backbone)%s", VTY_NEWLINE
);
2698 if (area
->external_routing
== OSPF_AREA_STUB
)
2700 if (area
->no_summary
)
2701 json_object_boolean_true_add(json_area
, "stubNoSummary");
2702 if (area
->shortcut_configured
)
2703 json_object_boolean_true_add(json_area
, "stubShortcut");
2705 else if (area
->external_routing
== OSPF_AREA_NSSA
)
2707 if (area
->no_summary
)
2708 json_object_boolean_true_add(json_area
, "nssaNoSummary");
2709 if (area
->shortcut_configured
)
2710 json_object_boolean_true_add(json_area
, "nssaShortcut");
2713 json_object_string_add(json_area
,"shortcuttingMode",
2714 ospf_shortcut_mode_descr_str
[area
->shortcut_configured
]);
2715 if (area
->shortcut_capability
)
2716 json_object_boolean_true_add(json_area
,"sBitConcensus");
2720 if (area
->external_routing
== OSPF_AREA_STUB
)
2721 vty_out (vty
, " (Stub%s%s)",
2722 area
->no_summary
? ", no summary" : "",
2723 area
->shortcut_configured
? "; " : "");
2724 else if (area
->external_routing
== OSPF_AREA_NSSA
)
2725 vty_out (vty
, " (NSSA%s%s)",
2726 area
->no_summary
? ", no summary" : "",
2727 area
->shortcut_configured
? "; " : "");
2729 vty_out (vty
, "%s", VTY_NEWLINE
);
2730 vty_out (vty
, " Shortcutting mode: %s",
2731 ospf_shortcut_mode_descr_str
[area
->shortcut_configured
]);
2732 vty_out (vty
, ", S-bit consensus: %s%s",
2733 area
->shortcut_capability
? "ok" : "no", VTY_NEWLINE
);
2737 /* Show number of interfaces */
2740 json_object_int_add(json_area
, "areaIfTotalCounter", listcount (area
->oiflist
));
2741 json_object_int_add(json_area
, "areaIfActiveCounter", area
->act_ints
);
2744 vty_out (vty
, " Number of interfaces in this area: Total: %d, "
2745 "Active: %d%s", listcount (area
->oiflist
),
2746 area
->act_ints
, VTY_NEWLINE
);
2748 if (area
->external_routing
== OSPF_AREA_NSSA
)
2752 json_object_boolean_true_add(json_area
, "nssa");
2753 if (! IS_OSPF_ABR (area
->ospf
))
2754 json_object_boolean_false_add(json_area
, "abr");
2755 else if (area
->NSSATranslatorState
)
2757 json_object_boolean_true_add(json_area
, "abr");
2758 if (area
->NSSATranslatorRole
== OSPF_NSSA_ROLE_CANDIDATE
)
2759 json_object_boolean_true_add(json_area
, "nssaTranslatorElected");
2760 else if (area
->NSSATranslatorRole
== OSPF_NSSA_ROLE_ALWAYS
)
2761 json_object_boolean_true_add(json_area
, "nssaTranslatorAlways");
2765 json_object_boolean_true_add(json_area
, "abr");
2766 if (area
->NSSATranslatorRole
== OSPF_NSSA_ROLE_CANDIDATE
)
2767 json_object_boolean_false_add(json_area
, "nssaTranslatorElected");
2769 json_object_boolean_true_add(json_area
, "nssaTranslatorNever");
2774 vty_out (vty
, " It is an NSSA configuration. %s Elected NSSA/ABR performs type-7/type-5 LSA translation. %s", VTY_NEWLINE
, VTY_NEWLINE
);
2775 if (! IS_OSPF_ABR (area
->ospf
))
2776 vty_out (vty
, " It is not ABR, therefore not Translator. %s",
2778 else if (area
->NSSATranslatorState
)
2780 vty_out (vty
, " We are an ABR and ");
2781 if (area
->NSSATranslatorRole
== OSPF_NSSA_ROLE_CANDIDATE
)
2782 vty_out (vty
, "the NSSA Elected Translator. %s",
2784 else if (area
->NSSATranslatorRole
== OSPF_NSSA_ROLE_ALWAYS
)
2785 vty_out (vty
, "always an NSSA Translator. %s",
2790 vty_out (vty
, " We are an ABR, but ");
2791 if (area
->NSSATranslatorRole
== OSPF_NSSA_ROLE_CANDIDATE
)
2792 vty_out (vty
, "not the NSSA Elected Translator. %s",
2795 vty_out (vty
, "never an NSSA Translator. %s",
2801 /* Stub-router state for this area */
2802 if (CHECK_FLAG (area
->stub_router_state
, OSPF_AREA_IS_STUB_ROUTED
))
2804 char timebuf
[OSPF_TIME_DUMP_SIZE
];
2808 json_object_boolean_true_add(json_area
, "originStubMaxDistRouterLsa");
2809 if (CHECK_FLAG(area
->stub_router_state
, OSPF_AREA_ADMIN_STUB_ROUTED
))
2810 json_object_boolean_true_add(json_area
, "indefiniteActiveAdmin");
2811 if (area
->t_stub_router
)
2814 time_store
= monotime_until(&area
->t_stub_router
->u
.sands
, NULL
) / 1000LL;
2815 json_object_int_add(json_area
, "activeStartupRemainderMsecs", time_store
);
2820 vty_out (vty
, " Originating stub / maximum-distance Router-LSA%s",
2822 if (CHECK_FLAG(area
->stub_router_state
, OSPF_AREA_ADMIN_STUB_ROUTED
))
2823 vty_out (vty
, " Administratively activated (indefinitely)%s",
2825 if (area
->t_stub_router
)
2826 vty_out (vty
, " Active from startup, %s remaining%s",
2827 ospf_timer_dump (area
->t_stub_router
, timebuf
,
2828 sizeof(timebuf
)), VTY_NEWLINE
);
2834 /* Show number of fully adjacent neighbors. */
2835 json_object_int_add(json_area
, "nbrFullAdjacentCounter", area
->full_nbrs
);
2837 /* Show authentication type. */
2838 if (area
->auth_type
== OSPF_AUTH_NULL
)
2839 json_object_string_add(json_area
, "authentication", "authenticationNone");
2840 else if (area
->auth_type
== OSPF_AUTH_SIMPLE
)
2841 json_object_string_add(json_area
, "authentication", "authenticationSimplePassword");
2842 else if (area
->auth_type
== OSPF_AUTH_CRYPTOGRAPHIC
)
2843 json_object_string_add(json_area
, "authentication", "authenticationMessageDigest");
2845 if (!OSPF_IS_AREA_BACKBONE (area
))
2846 json_object_int_add(json_area
, "virtualAdjacenciesPassingCounter", area
->full_vls
);
2848 /* Show SPF calculation times. */
2849 json_object_int_add(json_area
, "spfExecutedCounter", area
->spf_calculation
);
2850 json_object_int_add(json_area
, "lsaNumber", area
->lsdb
->total
);
2851 json_object_int_add(json_area
, "lsaRouterNumber", ospf_lsdb_count (area
->lsdb
, OSPF_ROUTER_LSA
));
2852 json_object_int_add(json_area
, "lsaRouterChecksum", ospf_lsdb_checksum (area
->lsdb
, OSPF_ROUTER_LSA
));
2853 json_object_int_add(json_area
, "lsaNetworkNumber", ospf_lsdb_count (area
->lsdb
, OSPF_NETWORK_LSA
));
2854 json_object_int_add(json_area
, "lsaNetworkChecksum", ospf_lsdb_checksum (area
->lsdb
, OSPF_NETWORK_LSA
));
2855 json_object_int_add(json_area
, "lsaSummaryNumber", ospf_lsdb_count (area
->lsdb
, OSPF_SUMMARY_LSA
));
2856 json_object_int_add(json_area
, "lsaSummaryChecksum", ospf_lsdb_checksum (area
->lsdb
, OSPF_SUMMARY_LSA
));
2857 json_object_int_add(json_area
, "lsaAsbrNumber", ospf_lsdb_count (area
->lsdb
, OSPF_ASBR_SUMMARY_LSA
));
2858 json_object_int_add(json_area
, "lsaAsbrChecksum", ospf_lsdb_checksum (area
->lsdb
, OSPF_ASBR_SUMMARY_LSA
));
2859 json_object_int_add(json_area
, "lsaNssaNumber", ospf_lsdb_count (area
->lsdb
, OSPF_AS_NSSA_LSA
));
2860 json_object_int_add(json_area
, "lsaNssaChecksum", ospf_lsdb_checksum (area
->lsdb
, OSPF_AS_NSSA_LSA
));
2864 /* Show number of fully adjacent neighbors. */
2865 vty_out (vty
, " Number of fully adjacent neighbors in this area:"
2866 " %d%s", area
->full_nbrs
, VTY_NEWLINE
);
2868 /* Show authentication type. */
2869 vty_out (vty
, " Area has ");
2870 if (area
->auth_type
== OSPF_AUTH_NULL
)
2871 vty_out (vty
, "no authentication%s", VTY_NEWLINE
);
2872 else if (area
->auth_type
== OSPF_AUTH_SIMPLE
)
2873 vty_out (vty
, "simple password authentication%s", VTY_NEWLINE
);
2874 else if (area
->auth_type
== OSPF_AUTH_CRYPTOGRAPHIC
)
2875 vty_out (vty
, "message digest authentication%s", VTY_NEWLINE
);
2877 if (!OSPF_IS_AREA_BACKBONE (area
))
2878 vty_out (vty
, " Number of full virtual adjacencies going through"
2879 " this area: %d%s", area
->full_vls
, VTY_NEWLINE
);
2881 /* Show SPF calculation times. */
2882 vty_out (vty
, " SPF algorithm executed %d times%s",
2883 area
->spf_calculation
, VTY_NEWLINE
);
2885 /* Show number of LSA. */
2886 vty_out (vty
, " Number of LSA %ld%s", area
->lsdb
->total
, VTY_NEWLINE
);
2887 vty_out (vty
, " Number of router LSA %ld. Checksum Sum 0x%08x%s",
2888 ospf_lsdb_count (area
->lsdb
, OSPF_ROUTER_LSA
),
2889 ospf_lsdb_checksum (area
->lsdb
, OSPF_ROUTER_LSA
), VTY_NEWLINE
);
2890 vty_out (vty
, " Number of network LSA %ld. Checksum Sum 0x%08x%s",
2891 ospf_lsdb_count (area
->lsdb
, OSPF_NETWORK_LSA
),
2892 ospf_lsdb_checksum (area
->lsdb
, OSPF_NETWORK_LSA
), VTY_NEWLINE
);
2893 vty_out (vty
, " Number of summary LSA %ld. Checksum Sum 0x%08x%s",
2894 ospf_lsdb_count (area
->lsdb
, OSPF_SUMMARY_LSA
),
2895 ospf_lsdb_checksum (area
->lsdb
, OSPF_SUMMARY_LSA
), VTY_NEWLINE
);
2896 vty_out (vty
, " Number of ASBR summary LSA %ld. Checksum Sum 0x%08x%s",
2897 ospf_lsdb_count (area
->lsdb
, OSPF_ASBR_SUMMARY_LSA
),
2898 ospf_lsdb_checksum (area
->lsdb
, OSPF_ASBR_SUMMARY_LSA
), VTY_NEWLINE
);
2899 vty_out (vty
, " Number of NSSA LSA %ld. Checksum Sum 0x%08x%s",
2900 ospf_lsdb_count (area
->lsdb
, OSPF_AS_NSSA_LSA
),
2901 ospf_lsdb_checksum (area
->lsdb
, OSPF_AS_NSSA_LSA
), VTY_NEWLINE
);
2906 json_object_int_add(json_area
, "lsaOpaqueLinkNumber", ospf_lsdb_count (area
->lsdb
, OSPF_OPAQUE_LINK_LSA
));
2907 json_object_int_add(json_area
, "lsaOpaqueLinkChecksum", ospf_lsdb_checksum (area
->lsdb
, OSPF_OPAQUE_LINK_LSA
));
2908 json_object_int_add(json_area
, "lsaOpaqueAreaNumber", ospf_lsdb_count (area
->lsdb
, OSPF_OPAQUE_AREA_LSA
));
2909 json_object_int_add(json_area
, "lsaOpaqueAreaChecksum", ospf_lsdb_checksum (area
->lsdb
, OSPF_OPAQUE_AREA_LSA
));
2913 vty_out (vty
, " Number of opaque link LSA %ld. Checksum Sum 0x%08x%s",
2914 ospf_lsdb_count (area
->lsdb
, OSPF_OPAQUE_LINK_LSA
),
2915 ospf_lsdb_checksum (area
->lsdb
, OSPF_OPAQUE_LINK_LSA
), VTY_NEWLINE
);
2916 vty_out (vty
, " Number of opaque area LSA %ld. Checksum Sum 0x%08x%s",
2917 ospf_lsdb_count (area
->lsdb
, OSPF_OPAQUE_AREA_LSA
),
2918 ospf_lsdb_checksum (area
->lsdb
, OSPF_OPAQUE_AREA_LSA
), VTY_NEWLINE
);
2922 json_object_object_add(json_areas
, inet_ntoa (area
->area_id
), json_area
);
2924 vty_out (vty
, "%s", VTY_NEWLINE
);
2928 show_ip_ospf_common (struct vty
*vty
, struct ospf
*ospf
, u_char use_json
)
2930 struct listnode
*node
, *nnode
;
2931 struct ospf_area
* area
;
2932 struct timeval result
;
2933 char timebuf
[OSPF_TIME_DUMP_SIZE
];
2934 json_object
*json
= NULL
;
2935 json_object
*json_areas
= NULL
;
2939 json
= json_object_new_object();
2940 json_areas
= json_object_new_object();
2947 json_object_int_add(json
, "ospfInstance", ospf
->instance
);
2951 vty_out (vty
, "%sOSPF Instance: %d%s%s", VTY_NEWLINE
, ospf
->instance
,
2952 VTY_NEWLINE
, VTY_NEWLINE
);
2956 /* Show Router ID. */
2959 json_object_string_add(json
, "routerId", inet_ntoa (ospf
->router_id
));
2963 vty_out (vty
, " OSPF Routing Process, Router ID: %s%s",
2964 inet_ntoa (ospf
->router_id
),
2968 /* Graceful shutdown */
2969 if (ospf
->t_deferred_shutdown
)
2974 time_store
= monotime_until(&ospf
->t_deferred_shutdown
->u
.sands
, NULL
) / 1000LL;
2975 json_object_int_add(json
, "deferredShutdownMsecs", time_store
);
2979 vty_out (vty
, " Deferred shutdown in progress, %s remaining%s",
2980 ospf_timer_dump (ospf
->t_deferred_shutdown
,
2981 timebuf
, sizeof (timebuf
)), VTY_NEWLINE
);
2985 /* Show capability. */
2988 json_object_boolean_true_add(json
, "tosRoutesOnly");
2989 json_object_boolean_true_add(json
, "rfc2328Conform");
2990 if (CHECK_FLAG (ospf
->config
, OSPF_RFC1583_COMPATIBLE
))
2992 json_object_boolean_true_add(json
, "rfc1583Compatibility");
2997 vty_out (vty
, " Supports only single TOS (TOS0) routes%s", VTY_NEWLINE
);
2998 vty_out (vty
, " This implementation conforms to RFC2328%s", VTY_NEWLINE
);
2999 vty_out (vty
, " RFC1583Compatibility flag is %s%s",
3000 CHECK_FLAG (ospf
->config
, OSPF_RFC1583_COMPATIBLE
) ?
3001 "enabled" : "disabled", VTY_NEWLINE
);
3006 if (CHECK_FLAG (ospf
->config
, OSPF_OPAQUE_CAPABLE
))
3008 json_object_boolean_true_add(json
, "opaqueCapable");
3013 vty_out (vty
, " OpaqueCapability flag is %s%s",
3014 CHECK_FLAG (ospf
->config
, OSPF_OPAQUE_CAPABLE
) ? "enabled" : "disabled",
3018 /* Show stub-router configuration */
3019 if (ospf
->stub_router_startup_time
!= OSPF_STUB_ROUTER_UNCONFIGURED
3020 || ospf
->stub_router_shutdown_time
!= OSPF_STUB_ROUTER_UNCONFIGURED
)
3024 json_object_boolean_true_add(json
, "stubAdvertisement");
3025 if (ospf
->stub_router_startup_time
!= OSPF_STUB_ROUTER_UNCONFIGURED
)
3026 json_object_int_add(json
,"postStartEnabledMsecs", ospf
->stub_router_startup_time
/ 1000);
3027 if (ospf
->stub_router_shutdown_time
!= OSPF_STUB_ROUTER_UNCONFIGURED
)
3028 json_object_int_add(json
,"preShutdownEnabledMsecs", ospf
->stub_router_shutdown_time
/ 1000);
3032 vty_out (vty
, " Stub router advertisement is configured%s",
3034 if (ospf
->stub_router_startup_time
!= OSPF_STUB_ROUTER_UNCONFIGURED
)
3035 vty_out (vty
, " Enabled for %us after start-up%s",
3036 ospf
->stub_router_startup_time
, VTY_NEWLINE
);
3037 if (ospf
->stub_router_shutdown_time
!= OSPF_STUB_ROUTER_UNCONFIGURED
)
3038 vty_out (vty
, " Enabled for %us prior to full shutdown%s",
3039 ospf
->stub_router_shutdown_time
, VTY_NEWLINE
);
3043 /* Show SPF timers. */
3046 json_object_int_add(json
, "spfScheduleDelayMsecs", ospf
->spf_delay
);
3047 json_object_int_add(json
, "holdtimeMinMsecs", ospf
->spf_holdtime
);
3048 json_object_int_add(json
, "holdtimeMaxMsecs", ospf
->spf_max_holdtime
);
3049 json_object_int_add(json
, "holdtimeMultplier", ospf
->spf_hold_multiplier
);
3053 vty_out (vty
, " Initial SPF scheduling delay %d millisec(s)%s"
3054 " Minimum hold time between consecutive SPFs %d millisec(s)%s"
3055 " Maximum hold time between consecutive SPFs %d millisec(s)%s"
3056 " Hold time multiplier is currently %d%s",
3057 ospf
->spf_delay
, VTY_NEWLINE
,
3058 ospf
->spf_holdtime
, VTY_NEWLINE
,
3059 ospf
->spf_max_holdtime
, VTY_NEWLINE
,
3060 ospf
->spf_hold_multiplier
, VTY_NEWLINE
);
3065 if (ospf
->ts_spf
.tv_sec
|| ospf
->ts_spf
.tv_usec
)
3067 long time_store
= 0;
3069 time_store
= monotime_since(&ospf
->ts_spf
, NULL
) / 1000LL;
3070 json_object_int_add(json
, "spfLastExecutedMsecs", time_store
);
3072 time_store
= (1000 * ospf
->ts_spf_duration
.tv_sec
) + (ospf
->ts_spf_duration
.tv_usec
/ 1000);
3073 json_object_int_add(json
, "spfLastDurationMsecs", time_store
);
3076 json_object_boolean_true_add(json
, "spfHasNotRun");
3080 vty_out (vty
, " SPF algorithm ");
3081 if (ospf
->ts_spf
.tv_sec
|| ospf
->ts_spf
.tv_usec
)
3083 monotime_since(&ospf
->ts_spf
, &result
);
3084 vty_out (vty
, "last executed %s ago%s",
3085 ospf_timeval_dump (&result
, timebuf
, sizeof (timebuf
)),
3087 vty_out (vty
, " Last SPF duration %s%s",
3088 ospf_timeval_dump (&ospf
->ts_spf_duration
, timebuf
, sizeof (timebuf
)),
3092 vty_out (vty
, "has not been run%s", VTY_NEWLINE
);
3097 if (ospf
->t_spf_calc
)
3100 time_store
= monotime_until(&ospf
->t_spf_calc
->u
.sands
, NULL
) / 1000LL;
3101 json_object_int_add(json
, "spfTimerDueInMsecs", time_store
);
3104 json_object_int_add(json
, "lsaMinIntervalMsecs", ospf
->min_ls_interval
);
3105 json_object_int_add(json
, "lsaMinArrivalMsecs", ospf
->min_ls_arrival
);
3106 /* Show write multiplier values */
3107 json_object_int_add(json
, "writeMultiplier", ospf
->write_oi_count
);
3108 /* Show refresh parameters. */
3109 json_object_int_add(json
, "refreshTimerMsecs", ospf
->lsa_refresh_interval
* 1000);
3113 vty_out (vty
, " SPF timer %s%s%s",
3114 (ospf
->t_spf_calc
? "due in " : "is "),
3115 ospf_timer_dump (ospf
->t_spf_calc
, timebuf
, sizeof (timebuf
)),
3118 vty_out (vty
, " LSA minimum interval %d msecs%s",
3119 ospf
->min_ls_interval
, VTY_NEWLINE
);
3120 vty_out (vty
, " LSA minimum arrival %d msecs%s",
3121 ospf
->min_ls_arrival
, VTY_NEWLINE
);
3123 /* Show write multiplier values */
3124 vty_out (vty
, " Write Multiplier set to %d %s",
3125 ospf
->write_oi_count
, VTY_NEWLINE
);
3127 /* Show refresh parameters. */
3128 vty_out (vty
, " Refresh timer %d secs%s",
3129 ospf
->lsa_refresh_interval
, VTY_NEWLINE
);
3132 /* Show ABR/ASBR flags. */
3133 if (CHECK_FLAG (ospf
->flags
, OSPF_FLAG_ABR
))
3136 json_object_string_add(json
, "abrType", ospf_abr_type_descr_str
[ospf
->abr_type
]);
3138 vty_out (vty
, " This router is an ABR, ABR type is: %s%s",
3139 ospf_abr_type_descr_str
[ospf
->abr_type
], VTY_NEWLINE
);
3141 if (CHECK_FLAG (ospf
->flags
, OSPF_FLAG_ASBR
))
3144 json_object_string_add(json
, "asbrRouter", "injectingExternalRoutingInformation");
3146 vty_out (vty
, " This router is an ASBR "
3147 "(injecting external routing information)%s", VTY_NEWLINE
);
3150 /* Show Number of AS-external-LSAs. */
3153 json_object_int_add(json
, "lsaExternalCounter",
3154 ospf_lsdb_count (ospf
->lsdb
, OSPF_AS_EXTERNAL_LSA
));
3155 json_object_int_add(json
, "lsaExternalChecksum",
3156 ospf_lsdb_checksum (ospf
->lsdb
, OSPF_AS_EXTERNAL_LSA
));
3160 vty_out (vty
, " Number of external LSA %ld. Checksum Sum 0x%08x%s",
3161 ospf_lsdb_count (ospf
->lsdb
, OSPF_AS_EXTERNAL_LSA
),
3162 ospf_lsdb_checksum (ospf
->lsdb
, OSPF_AS_EXTERNAL_LSA
), VTY_NEWLINE
);
3167 json_object_int_add(json
, "lsaAsopaqueCounter",
3168 ospf_lsdb_count (ospf
->lsdb
, OSPF_OPAQUE_AS_LSA
));
3169 json_object_int_add(json
, "lsaAsOpaqueChecksum",
3170 ospf_lsdb_checksum (ospf
->lsdb
, OSPF_OPAQUE_AS_LSA
));
3174 vty_out (vty
, " Number of opaque AS LSA %ld. Checksum Sum 0x%08x%s",
3175 ospf_lsdb_count (ospf
->lsdb
, OSPF_OPAQUE_AS_LSA
),
3176 ospf_lsdb_checksum (ospf
->lsdb
, OSPF_OPAQUE_AS_LSA
), VTY_NEWLINE
);
3179 /* Show number of areas attached. */
3181 json_object_int_add(json
, "attachedAreaCounter", listcount (ospf
->areas
));
3183 vty_out (vty
, " Number of areas attached to this router: %d%s",
3184 listcount (ospf
->areas
), VTY_NEWLINE
);
3186 if (CHECK_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_CHANGES
))
3188 if (CHECK_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_DETAIL
))
3191 json_object_boolean_true_add(json
, "adjacencyChangesLoggedAll");
3193 vty_out(vty
, " All adjacency changes are logged%s",VTY_NEWLINE
);
3198 json_object_boolean_true_add(json
, "adjacencyChangesLogged");
3200 vty_out(vty
, " Adjacency changes are logged%s",VTY_NEWLINE
);
3203 /* Show each area status. */
3204 for (ALL_LIST_ELEMENTS (ospf
->areas
, node
, nnode
, area
))
3205 show_ip_ospf_area (vty
, area
, json_areas
, use_json
);
3209 json_object_object_add(json
, "areas", json_areas
);
3210 vty_out (vty
, "%s%s", json_object_to_json_string_ext(json
, JSON_C_TO_STRING_PRETTY
), VTY_NEWLINE
);
3211 json_object_free(json
);
3214 vty_out (vty
, "%s",VTY_NEWLINE
);
3219 DEFUN (show_ip_ospf
,
3221 "show ip ospf [json]",
3224 "OSPF information\n"
3228 u_char uj
= use_json(argc
, argv
);
3230 if ((ospf
= ospf_lookup()) == NULL
|| !ospf
->oi_running
)
3233 return (show_ip_ospf_common(vty
, ospf
, uj
));
3236 DEFUN (show_ip_ospf_instance
,
3237 show_ip_ospf_instance_cmd
,
3238 "show ip ospf (1-65535) [json]",
3241 "OSPF information\n"
3247 u_short instance
= 0;
3248 u_char uj
= use_json(argc
, argv
);
3250 VTY_GET_INTEGER ("Instance", instance
, argv
[idx_number
]->arg
);
3251 if ((ospf
= ospf_lookup_instance (instance
)) == NULL
|| !ospf
->oi_running
)
3254 return (show_ip_ospf_common(vty
, ospf
, uj
));
3258 show_ip_ospf_interface_sub (struct vty
*vty
, struct ospf
*ospf
, struct interface
*ifp
,
3259 json_object
*json_interface_sub
, u_char use_json
)
3262 struct ospf_neighbor
*nbr
;
3263 struct route_node
*rn
;
3265 /* Is interface up? */
3268 is_up
= if_is_operative(ifp
);
3270 json_object_boolean_true_add(json_interface_sub
, "ifUp");
3272 json_object_boolean_false_add(json_interface_sub
, "ifDown");
3274 json_object_int_add(json_interface_sub
, "ifIndex", ifp
->ifindex
);
3275 json_object_int_add(json_interface_sub
, "mtuBytes", ifp
->mtu
);
3276 json_object_int_add(json_interface_sub
, "bandwidthMbit", ifp
->bandwidth
);
3277 json_object_string_add(json_interface_sub
, "ifFlags", if_flag_dump(ifp
->flags
));
3281 vty_out (vty
, "%s is %s%s", ifp
->name
,
3282 ((is_up
= if_is_operative(ifp
)) ? "up" : "down"), VTY_NEWLINE
);
3283 vty_out (vty
, " ifindex %u, MTU %u bytes, BW %u Mbit %s%s",
3284 ifp
->ifindex
, ifp
->mtu
, ifp
->bandwidth
, if_flag_dump(ifp
->flags
),
3288 /* Is interface OSPF enabled? */
3291 if (ospf_oi_count(ifp
) == 0)
3293 json_object_boolean_false_add(json_interface_sub
, "ospfEnabled");
3298 json_object_boolean_false_add(json_interface_sub
, "ospfRunning");
3302 json_object_boolean_true_add(json_interface_sub
, "ospfEnabled");
3306 if (ospf_oi_count(ifp
) == 0)
3308 vty_out (vty
, " OSPF not enabled on this interface%s", VTY_NEWLINE
);
3313 vty_out (vty
, " OSPF is enabled, but not running on this interface%s",
3319 for (rn
= route_top (IF_OIFS (ifp
)); rn
; rn
= route_next (rn
))
3321 struct ospf_interface
*oi
= rn
->info
;
3326 if (CHECK_FLAG(oi
->connected
->flags
, ZEBRA_IFA_UNNUMBERED
))
3329 json_object_boolean_true_add(json_interface_sub
, "ifUnnumbered");
3331 vty_out (vty
, " This interface is UNNUMBERED,");
3335 /* Show OSPF interface information. */
3338 json_object_string_add(json_interface_sub
, "ipAddress", inet_ntoa (oi
->address
->u
.prefix4
));
3339 json_object_int_add(json_interface_sub
, "ipAddressPrefixlen", oi
->address
->prefixlen
);
3342 vty_out (vty
, " Internet Address %s/%d,",
3343 inet_ntoa (oi
->address
->u
.prefix4
), oi
->address
->prefixlen
);
3345 if (oi
->connected
->destination
|| oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
3347 struct in_addr
*dest
;
3350 if (CONNECTED_PEER(oi
->connected
)
3351 || oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
3356 /* For Vlinks, showing the peer address is probably more
3357 * * * * * informative than the local interface that is being used
3359 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
3360 dest
= &oi
->vl_data
->peer_addr
;
3362 dest
= &oi
->connected
->destination
->u
.prefix4
;
3366 json_object_string_add(json_interface_sub
, "ospfIfType", dstr
);
3367 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
3368 json_object_string_add(json_interface_sub
, "vlinkPeer", inet_ntoa (*dest
));
3370 json_object_string_add(json_interface_sub
, "localIfUsed", inet_ntoa (*dest
));
3373 vty_out (vty
, " %s %s,", dstr
, inet_ntoa (*dest
));
3378 json_object_string_add(json_interface_sub
, "area", ospf_area_desc_string (oi
->area
));
3379 if (OSPF_IF_PARAM(oi
, mtu_ignore
))
3380 json_object_boolean_true_add(json_interface_sub
, "mtuMismatchDetect");
3381 json_object_string_add(json_interface_sub
, "routerId", inet_ntoa (ospf
->router_id
));
3382 json_object_string_add(json_interface_sub
, "networkType", ospf_network_type_str
[oi
->type
]);
3383 json_object_int_add(json_interface_sub
, "cost", oi
->output_cost
);
3384 json_object_int_add(json_interface_sub
, "transmitDelayMsecs", 1000 / OSPF_IF_PARAM (oi
,transmit_delay
));
3385 json_object_string_add(json_interface_sub
, "state", LOOKUP (ospf_ism_state_msg
, oi
->state
));
3386 json_object_int_add(json_interface_sub
, "priority", PRIORITY (oi
));
3390 vty_out (vty
, " Area %s%s", ospf_area_desc_string (oi
->area
),
3393 vty_out (vty
, " MTU mismatch detection:%s%s",
3394 OSPF_IF_PARAM(oi
, mtu_ignore
) ? "disabled" : "enabled", VTY_NEWLINE
);
3396 vty_out (vty
, " Router ID %s, Network Type %s, Cost: %d%s",
3397 inet_ntoa (ospf
->router_id
), ospf_network_type_str
[oi
->type
],
3398 oi
->output_cost
, VTY_NEWLINE
);
3400 vty_out (vty
, " Transmit Delay is %d sec, State %s, Priority %d%s",
3401 OSPF_IF_PARAM (oi
,transmit_delay
), LOOKUP (ospf_ism_state_msg
, oi
->state
),
3402 PRIORITY (oi
), VTY_NEWLINE
);
3405 /* Show DR information. */
3406 if (DR (oi
).s_addr
== 0)
3409 vty_out (vty
, " No backup designated router on this network%s",
3414 nbr
= ospf_nbr_lookup_by_addr (oi
->nbrs
, &BDR (oi
));
3418 vty_out (vty
, " No backup designated router on this network%s",
3425 json_object_string_add(json_interface_sub
, "bdrId", inet_ntoa (nbr
->router_id
));
3426 json_object_string_add(json_interface_sub
, "bdrAddress", inet_ntoa (nbr
->address
.u
.prefix4
));
3430 vty_out (vty
, " Backup Designated Router (ID) %s,",
3431 inet_ntoa (nbr
->router_id
));
3432 vty_out (vty
, " Interface Address %s%s",
3433 inet_ntoa (nbr
->address
.u
.prefix4
), VTY_NEWLINE
);
3438 /* Next network-LSA sequence number we'll use, if we're elected DR */
3439 if (oi
->params
&& ntohl (oi
->params
->network_lsa_seqnum
) != OSPF_INITIAL_SEQUENCE_NUMBER
)
3442 json_object_int_add(json_interface_sub
, "networkLsaSequence", ntohl (oi
->params
->network_lsa_seqnum
));
3444 vty_out (vty
, " Saved Network-LSA sequence number 0x%x%s",
3445 ntohl (oi
->params
->network_lsa_seqnum
), VTY_NEWLINE
);
3450 if (OI_MEMBER_CHECK(oi
, MEMBER_ALLROUTERS
)
3451 || OI_MEMBER_CHECK(oi
, MEMBER_DROUTERS
))
3453 if (OI_MEMBER_CHECK(oi
, MEMBER_ALLROUTERS
))
3454 json_object_boolean_true_add(json_interface_sub
, "mcastMemberOspfAllRouters");
3455 if (OI_MEMBER_CHECK(oi
, MEMBER_DROUTERS
))
3456 json_object_boolean_true_add(json_interface_sub
, "mcastMemberOspfDesignatedRouters");
3461 vty_out (vty
, " Multicast group memberships:");
3462 if (OI_MEMBER_CHECK(oi
, MEMBER_ALLROUTERS
)
3463 || OI_MEMBER_CHECK(oi
, MEMBER_DROUTERS
))
3465 if (OI_MEMBER_CHECK(oi
, MEMBER_ALLROUTERS
))
3466 vty_out (vty
, " OSPFAllRouters");
3467 if (OI_MEMBER_CHECK(oi
, MEMBER_DROUTERS
))
3468 vty_out (vty
, " OSPFDesignatedRouters");
3471 vty_out (vty
, " <None>");
3472 vty_out (vty
, "%s", VTY_NEWLINE
);
3477 if (OSPF_IF_PARAM (oi
, fast_hello
) == 0)
3478 json_object_int_add(json_interface_sub
, "timerMsecs", 1000 /OSPF_IF_PARAM (oi
, v_hello
));
3480 json_object_int_add(json_interface_sub
, "timerMsecs", 1000 / OSPF_IF_PARAM (oi
, fast_hello
));
3481 json_object_int_add(json_interface_sub
, "timerDeadMsecs", 1000 / OSPF_IF_PARAM (oi
, v_wait
));
3482 json_object_int_add(json_interface_sub
, "timerWaitMsecs", 1000 / OSPF_IF_PARAM (oi
, v_wait
));
3483 json_object_int_add(json_interface_sub
, "timerRetransmit", 1000 / OSPF_IF_PARAM (oi
, retransmit_interval
));
3487 vty_out (vty
, " Timer intervals configured,");
3488 vty_out (vty
, " Hello ");
3489 if (OSPF_IF_PARAM (oi
, fast_hello
) == 0)
3490 vty_out (vty
, "%ds,", OSPF_IF_PARAM (oi
, v_hello
));
3492 vty_out (vty
, "%dms,", 1000 / OSPF_IF_PARAM (oi
, fast_hello
));
3493 vty_out (vty
, " Dead %ds, Wait %ds, Retransmit %d%s",
3494 OSPF_IF_PARAM (oi
, v_wait
),
3495 OSPF_IF_PARAM (oi
, v_wait
),
3496 OSPF_IF_PARAM (oi
, retransmit_interval
),
3500 if (OSPF_IF_PASSIVE_STATUS (oi
) == OSPF_IF_ACTIVE
)
3502 char timebuf
[OSPF_TIME_DUMP_SIZE
];
3505 long time_store
= 0;
3507 time_store
= monotime_until(&oi
->t_hello
->u
.sands
, NULL
) / 1000LL;
3508 json_object_int_add(json_interface_sub
, "timerHelloInMsecs", time_store
);
3511 vty_out (vty
, " Hello due in %s%s",
3512 ospf_timer_dump (oi
->t_hello
, timebuf
, sizeof(timebuf
)),
3515 else /* passive-interface is set */
3518 json_object_boolean_true_add(json_interface_sub
, "timerPassiveIface");
3520 vty_out (vty
, " No Hellos (Passive interface)%s", VTY_NEWLINE
);
3525 json_object_int_add(json_interface_sub
, "nbrCount", ospf_nbr_count (oi
, 0));
3526 json_object_int_add(json_interface_sub
, "nbrAdjacentCount", ospf_nbr_count (oi
, NSM_Full
));
3529 vty_out (vty
, " Neighbor Count is %d, Adjacent neighbor count is %d%s",
3530 ospf_nbr_count (oi
, 0), ospf_nbr_count (oi
, NSM_Full
),
3532 ospf_bfd_interface_show(vty
, ifp
, json_interface_sub
, use_json
);
3537 show_ip_ospf_interface_common (struct vty
*vty
, struct ospf
*ospf
, int argc
,
3538 struct cmd_token
**argv
, int iface_argv
, u_char use_json
)
3540 struct interface
*ifp
;
3541 struct listnode
*node
;
3542 json_object
*json
= NULL
;
3543 json_object
*json_interface_sub
= NULL
;
3547 json
= json_object_new_object();
3548 json_interface_sub
= json_object_new_object();
3554 json_object_int_add(json
, "ospfInstance", ospf
->instance
);
3556 vty_out (vty
, "%sOSPF Instance: %d%s%s", VTY_NEWLINE
, ospf
->instance
,
3557 VTY_NEWLINE
, VTY_NEWLINE
);
3560 if (argc
== iface_argv
)
3562 /* Show All Interfaces.*/
3563 for (ALL_LIST_ELEMENTS_RO (vrf_iflist (VRF_DEFAULT
), node
, ifp
))
3565 if (ospf_oi_count(ifp
))
3567 show_ip_ospf_interface_sub (vty
, ospf
, ifp
, json_interface_sub
, use_json
);
3569 json_object_object_add (json
, ifp
->name
, json_interface_sub
);
3575 /* Interface name is specified. */
3576 if ((ifp
= if_lookup_by_name (argv
[iface_argv
]->arg
, VRF_DEFAULT
)) == NULL
)
3579 json_object_boolean_true_add(json
, "noSuchIface");
3581 vty_out (vty
, "No such interface name%s", VTY_NEWLINE
);
3585 show_ip_ospf_interface_sub (vty
, ospf
, ifp
, json_interface_sub
, use_json
);
3587 json_object_object_add(json
, ifp
->name
, json_interface_sub
);
3593 vty_out (vty
, "%s%s", json_object_to_json_string_ext(json
, JSON_C_TO_STRING_PRETTY
), VTY_NEWLINE
);
3594 json_object_free(json
);
3597 vty_out (vty
, "%s", VTY_NEWLINE
);
3602 DEFUN (show_ip_ospf_interface
,
3603 show_ip_ospf_interface_cmd
,
3604 "show ip ospf interface [INTERFACE] [json]",
3607 "OSPF information\n"
3608 "Interface information\n"
3613 u_char uj
= use_json(argc
, argv
);
3615 if ((ospf
= ospf_lookup()) == NULL
|| !ospf
->oi_running
)
3621 return show_ip_ospf_interface_common(vty
, ospf
, argc
, argv
, 4, uj
);
3624 DEFUN (show_ip_ospf_instance_interface
,
3625 show_ip_ospf_instance_interface_cmd
,
3626 "show ip ospf (1-65535) interface [INTERFACE] [json]",
3629 "OSPF information\n"
3631 "Interface information\n"
3637 u_short instance
= 0;
3638 u_char uj
= use_json(argc
, argv
);
3640 VTY_GET_INTEGER ("Instance", instance
, argv
[idx_number
]->arg
);
3641 if ((ospf
= ospf_lookup_instance (instance
)) == NULL
|| !ospf
->oi_running
)
3647 return show_ip_ospf_interface_common(vty
, ospf
, argc
, argv
, 5, uj
);
3651 show_ip_ospf_neighbour_header (struct vty
*vty
)
3653 vty_out (vty
, "%s%-15s %3s %-15s %9s %-15s %-20s %5s %5s %5s%s",
3655 "Neighbor ID", "Pri", "State", "Dead Time",
3656 "Address", "Interface", "RXmtL", "RqstL", "DBsmL",
3661 show_ip_ospf_neighbor_sub (struct vty
*vty
, struct ospf_interface
*oi
, json_object
*json
, u_char use_json
)
3663 struct route_node
*rn
;
3664 struct ospf_neighbor
*nbr
;
3666 char timebuf
[OSPF_TIME_DUMP_SIZE
];
3667 json_object
*json_neighbor
= NULL
;
3669 for (rn
= route_top (oi
->nbrs
); rn
; rn
= route_next (rn
))
3671 if ((nbr
= rn
->info
))
3673 /* Do not show myself. */
3674 if (nbr
!= oi
->nbr_self
)
3676 /* Down state is not shown. */
3677 if (nbr
->state
!= NSM_Down
)
3681 json_neighbor
= json_object_new_object();
3682 ospf_nbr_state_message (nbr
, msgbuf
, 16);
3686 time_store
= monotime_until(&nbr
->t_inactivity
->u
.sands
, NULL
) / 1000LL;
3688 json_object_int_add (json_neighbor
, "priority", nbr
->priority
);
3689 json_object_string_add (json_neighbor
, "state", msgbuf
);
3690 json_object_int_add (json_neighbor
, "deadTimeMsecs", time_store
);
3691 json_object_string_add (json_neighbor
, "address", inet_ntoa (nbr
->src
));
3692 json_object_string_add (json_neighbor
, "ifaceName", IF_NAME (oi
));
3693 json_object_int_add (json_neighbor
, "retransmitCounter", ospf_ls_retransmit_count (nbr
));
3694 json_object_int_add (json_neighbor
, "requestCounter", ospf_ls_request_count (nbr
));
3695 json_object_int_add (json_neighbor
, "dbSummaryCounter", ospf_db_summary_count (nbr
));
3696 if (nbr
->state
== NSM_Attempt
&& nbr
->router_id
.s_addr
== 0)
3697 json_object_object_add(json
, "neighbor", json_neighbor
);
3699 json_object_object_add(json
, inet_ntoa (nbr
->router_id
), json_neighbor
);
3703 ospf_nbr_state_message (nbr
, msgbuf
, 16);
3705 if (nbr
->state
== NSM_Attempt
&& nbr
->router_id
.s_addr
== 0)
3706 vty_out (vty
, "%-15s %3d %-15s ",
3710 vty_out (vty
, "%-15s %3d %-15s ",
3711 inet_ntoa (nbr
->router_id
), nbr
->priority
,
3714 vty_out (vty
, "%9s ",
3715 ospf_timer_dump (nbr
->t_inactivity
, timebuf
,
3717 vty_out (vty
, "%-15s ", inet_ntoa (nbr
->src
));
3718 vty_out (vty
, "%-20s %5ld %5ld %5d%s",
3719 IF_NAME (oi
), ospf_ls_retransmit_count (nbr
),
3720 ospf_ls_request_count (nbr
), ospf_db_summary_count (nbr
),
3730 show_ip_ospf_neighbor_common (struct vty
*vty
, struct ospf
*ospf
, u_char use_json
)
3732 struct ospf_interface
*oi
;
3733 struct listnode
*node
;
3734 json_object
*json
= NULL
;
3737 json
= json_object_new_object();
3739 show_ip_ospf_neighbour_header (vty
);
3744 json_object_int_add(json
, "ospfInstance", ospf
->instance
);
3746 vty_out (vty
, "%sOSPF Instance: %d%s%s", VTY_NEWLINE
, ospf
->instance
,
3747 VTY_NEWLINE
, VTY_NEWLINE
);
3750 for (ALL_LIST_ELEMENTS_RO (ospf
->oiflist
, node
, oi
))
3751 show_ip_ospf_neighbor_sub (vty
, oi
, json
, use_json
);
3755 vty_out (vty
, "%s%s", json_object_to_json_string_ext(json
, JSON_C_TO_STRING_PRETTY
), VTY_NEWLINE
);
3756 json_object_free(json
);
3759 vty_out (vty
, "%s", VTY_NEWLINE
);
3764 DEFUN (show_ip_ospf_neighbor
,
3765 show_ip_ospf_neighbor_cmd
,
3766 "show ip ospf neighbor [json]",
3769 "OSPF information\n"
3774 u_char uj
= use_json(argc
, argv
);
3776 if ((ospf
= ospf_lookup()) == NULL
|| !ospf
->oi_running
)
3779 return show_ip_ospf_neighbor_common(vty
, ospf
, uj
);
3783 DEFUN (show_ip_ospf_instance_neighbor
,
3784 show_ip_ospf_instance_neighbor_cmd
,
3785 "show ip ospf (1-65535) neighbor [json]",
3788 "OSPF information\n"
3795 u_short instance
= 0;
3796 u_char uj
= use_json(argc
, argv
);
3798 VTY_GET_INTEGER ("Instance", instance
, argv
[idx_number
]->arg
);
3799 if ((ospf
= ospf_lookup_instance(instance
)) == NULL
|| !ospf
->oi_running
)
3802 return show_ip_ospf_neighbor_common(vty
, ospf
, uj
);
3806 show_ip_ospf_neighbor_all_common (struct vty
*vty
, struct ospf
*ospf
, u_char use_json
)
3808 struct listnode
*node
;
3809 struct ospf_interface
*oi
;
3810 json_object
*json
= NULL
;
3811 json_object
*json_neighbor_sub
= NULL
;
3815 json
= json_object_new_object();
3816 json_neighbor_sub
= json_object_new_object();
3819 show_ip_ospf_neighbour_header (vty
);
3824 json_object_int_add(json
, "ospfInstance", ospf
->instance
);
3826 vty_out (vty
, "%sOSPF Instance: %d%s%s", VTY_NEWLINE
, ospf
->instance
,
3827 VTY_NEWLINE
, VTY_NEWLINE
);
3830 for (ALL_LIST_ELEMENTS_RO (ospf
->oiflist
, node
, oi
))
3832 struct listnode
*nbr_node
;
3833 struct ospf_nbr_nbma
*nbr_nbma
;
3835 show_ip_ospf_neighbor_sub (vty
, oi
, json
, use_json
);
3837 /* print Down neighbor status */
3838 for (ALL_LIST_ELEMENTS_RO (oi
->nbr_nbma
, nbr_node
, nbr_nbma
))
3840 if (nbr_nbma
->nbr
== NULL
3841 || nbr_nbma
->nbr
->state
== NSM_Down
)
3845 json_object_int_add (json_neighbor_sub
, "nbrNbmaPriority", nbr_nbma
->priority
);
3846 json_object_boolean_true_add (json_neighbor_sub
, "nbrNbmaDown");
3847 json_object_string_add (json_neighbor_sub
, "nbrNbmaIfaceName", IF_NAME (oi
));
3848 json_object_int_add (json_neighbor_sub
, "nbrNbmaRetransmitCounter", 0);
3849 json_object_int_add (json_neighbor_sub
, "nbrNbmaRequestCounter", 0);
3850 json_object_int_add (json_neighbor_sub
, "nbrNbmaDbSummaryCounter", 0);
3851 json_object_object_add(json
, inet_ntoa (nbr_nbma
->addr
), json_neighbor_sub
);
3855 vty_out (vty
, "%-15s %3d %-15s %9s ",
3856 "-", nbr_nbma
->priority
, "Down", "-");
3857 vty_out (vty
, "%-15s %-20s %5d %5d %5d%s",
3858 inet_ntoa (nbr_nbma
->addr
), IF_NAME (oi
),
3859 0, 0, 0, VTY_NEWLINE
);
3867 vty_out (vty
, "%s%s", json_object_to_json_string_ext(json
, JSON_C_TO_STRING_PRETTY
), VTY_NEWLINE
);
3868 json_object_free(json
);
3871 vty_out (vty
, "%s", VTY_NEWLINE
);
3876 DEFUN (show_ip_ospf_neighbor_all
,
3877 show_ip_ospf_neighbor_all_cmd
,
3878 "show ip ospf neighbor all [json]",
3881 "OSPF information\n"
3883 "include down status neighbor\n"
3887 u_char uj
= use_json(argc
, argv
);
3889 if ((ospf
= ospf_lookup()) == NULL
|| !ospf
->oi_running
)
3892 return show_ip_ospf_neighbor_all_common(vty
, ospf
, uj
);
3895 DEFUN (show_ip_ospf_instance_neighbor_all
,
3896 show_ip_ospf_instance_neighbor_all_cmd
,
3897 "show ip ospf (1-65535) neighbor all [json]",
3900 "OSPF information\n"
3903 "include down status neighbor\n"
3908 u_short instance
= 0;
3909 u_char uj
= use_json(argc
, argv
);
3911 VTY_GET_INTEGER ("Instance", instance
, argv
[idx_number
]->arg
);
3912 if ((ospf
= ospf_lookup_instance(instance
)) == NULL
|| !ospf
->oi_running
)
3915 return show_ip_ospf_neighbor_all_common(vty
, ospf
, uj
);
3919 show_ip_ospf_neighbor_int_common (struct vty
*vty
, struct ospf
*ospf
, int arg_base
,
3920 struct cmd_token
**argv
, u_char use_json
)
3922 struct interface
*ifp
;
3923 struct route_node
*rn
;
3924 json_object
*json
= NULL
;
3927 json
= json_object_new_object();
3929 show_ip_ospf_neighbour_header (vty
);
3934 json_object_int_add(json
, "ospfInstance", ospf
->instance
);
3936 vty_out (vty
, "%sOSPF Instance: %d%s%s", VTY_NEWLINE
, ospf
->instance
,
3937 VTY_NEWLINE
, VTY_NEWLINE
);
3940 ifp
= if_lookup_by_name (argv
[arg_base
]->arg
, VRF_DEFAULT
);
3944 json_object_boolean_true_add(json
, "noSuchIface");
3946 vty_out (vty
, "No such interface.%s", VTY_NEWLINE
);
3950 for (rn
= route_top (IF_OIFS (ifp
)); rn
; rn
= route_next (rn
))
3952 struct ospf_interface
*oi
= rn
->info
;
3957 show_ip_ospf_neighbor_sub (vty
, oi
, json
, use_json
);
3962 vty_out (vty
, "%s%s", json_object_to_json_string_ext(json
, JSON_C_TO_STRING_PRETTY
), VTY_NEWLINE
);
3963 json_object_free(json
);
3966 vty_out (vty
, "%s", VTY_NEWLINE
);
3971 DEFUN (show_ip_ospf_neighbor_int
,
3972 show_ip_ospf_neighbor_int_cmd
,
3973 "show ip ospf neighbor IFNAME [json]",
3976 "OSPF information\n"
3982 u_char uj
= use_json(argc
, argv
);
3984 if ((ospf
= ospf_lookup()) == NULL
|| !ospf
->oi_running
)
3987 return show_ip_ospf_neighbor_int_common(vty
, ospf
, 0, argv
, uj
);
3990 DEFUN (show_ip_ospf_instance_neighbor_int
,
3991 show_ip_ospf_instance_neighbor_int_cmd
,
3992 "show ip ospf (1-65535) neighbor IFNAME [json]",
3995 "OSPF information\n"
4003 u_short instance
= 0;
4004 u_char uj
= use_json(argc
, argv
);
4006 VTY_GET_INTEGER ("Instance", instance
, argv
[idx_number
]->arg
);
4007 if ((ospf
= ospf_lookup_instance(instance
)) == NULL
|| !ospf
->oi_running
)
4010 return show_ip_ospf_neighbor_int_common(vty
, ospf
, 1, argv
, uj
);
4014 show_ip_ospf_nbr_nbma_detail_sub (struct vty
*vty
, struct ospf_interface
*oi
, struct ospf_nbr_nbma
*nbr_nbma
,
4015 u_char use_json
, json_object
*json
)
4017 char timebuf
[OSPF_TIME_DUMP_SIZE
];
4018 json_object
*json_sub
= NULL
;
4021 json_sub
= json_object_new_object();
4022 else /* Show neighbor ID. */
4023 vty_out (vty
, " Neighbor %s,", "-");
4025 /* Show interface address. */
4027 json_object_string_add(json_sub
, "ifaceAddress", inet_ntoa (nbr_nbma
->addr
));
4029 vty_out (vty
, " interface address %s%s",
4030 inet_ntoa (nbr_nbma
->addr
), VTY_NEWLINE
);
4035 json_object_string_add(json_sub
, "areaId", ospf_area_desc_string (oi
->area
));
4036 json_object_string_add(json_sub
, "iface", IF_NAME (oi
));
4039 vty_out (vty
, " In the area %s via interface %s%s",
4040 ospf_area_desc_string (oi
->area
), IF_NAME (oi
), VTY_NEWLINE
);
4042 /* Show neighbor priority and state. */
4045 json_object_int_add(json_sub
, "nbrPriority", nbr_nbma
->priority
);
4046 json_object_string_add(json_sub
, "nbrState", "down");
4049 vty_out (vty
, " Neighbor priority is %d, State is %s,",
4050 nbr_nbma
->priority
, "Down");
4052 /* Show state changes. */
4054 json_object_int_add(json_sub
, "stateChangeCounter", nbr_nbma
->state_change
);
4056 vty_out (vty
, " %d state changes%s", nbr_nbma
->state_change
, VTY_NEWLINE
);
4058 /* Show PollInterval */
4060 json_object_int_add(json_sub
, "pollInterval", nbr_nbma
->v_poll
);
4062 vty_out (vty
, " Poll interval %d%s", nbr_nbma
->v_poll
, VTY_NEWLINE
);
4064 /* Show poll-interval timer. */
4068 time_store
= monotime_until(&nbr_nbma
->t_poll
->u
.sands
, NULL
) / 1000LL;
4069 json_object_int_add(json_sub
, "pollIntervalTimerDueMsec", time_store
);
4072 vty_out (vty
, " Poll timer due in %s%s",
4073 ospf_timer_dump (nbr_nbma
->t_poll
, timebuf
, sizeof(timebuf
)),
4076 /* Show poll-interval timer thread. */
4079 if (nbr_nbma
->t_poll
!= NULL
)
4080 json_object_string_add(json_sub
, "pollIntervalTimerThread", "on");
4083 vty_out (vty
, " Thread Poll Timer %s%s",
4084 nbr_nbma
->t_poll
!= NULL
? "on" : "off", VTY_NEWLINE
);
4087 json_object_object_add(json
, "noNbrId", json_sub
);
4091 show_ip_ospf_neighbor_detail_sub (struct vty
*vty
, struct ospf_interface
*oi
,
4092 struct ospf_neighbor
*nbr
, u_char use_json
, json_object
*json
)
4094 char timebuf
[OSPF_TIME_DUMP_SIZE
];
4095 json_object
*json_sub
= NULL
;
4098 json_sub
= json_object_new_object();
4101 /* Show neighbor ID. */
4102 if (nbr
->state
== NSM_Attempt
&& nbr
->router_id
.s_addr
== 0)
4103 vty_out (vty
, " Neighbor %s,", "-");
4105 vty_out (vty
, " Neighbor %s,", inet_ntoa (nbr
->router_id
));
4108 /* Show interface address. */
4110 json_object_string_add(json_sub
, "ifaceAddress", inet_ntoa (nbr
->address
.u
.prefix4
));
4112 vty_out (vty
, " interface address %s%s",
4113 inet_ntoa (nbr
->address
.u
.prefix4
), VTY_NEWLINE
);
4118 json_object_string_add(json_sub
, "areaId", ospf_area_desc_string (oi
->area
));
4119 json_object_string_add(json_sub
, "ifaceName", oi
->ifp
->name
);
4122 vty_out (vty
, " In the area %s via interface %s%s",
4123 ospf_area_desc_string (oi
->area
), oi
->ifp
->name
, VTY_NEWLINE
);
4125 /* Show neighbor priority and state. */
4128 json_object_int_add(json_sub
, "nbrPriority", nbr
->priority
);
4129 json_object_string_add(json_sub
, "nbrState", LOOKUP (ospf_nsm_state_msg
, nbr
->state
));
4132 vty_out (vty
, " Neighbor priority is %d, State is %s,",
4133 nbr
->priority
, LOOKUP (ospf_nsm_state_msg
, nbr
->state
));
4135 /* Show state changes. */
4137 json_object_int_add(json_sub
, "stateChangeCounter", nbr
->state_change
);
4139 vty_out (vty
, " %d state changes%s", nbr
->state_change
, VTY_NEWLINE
);
4141 if (nbr
->ts_last_progress
.tv_sec
|| nbr
->ts_last_progress
.tv_usec
)
4146 time_store
= monotime_since(&nbr
->ts_last_progress
, &res
) / 1000LL;
4149 json_object_int_add(json_sub
, "lastPrgrsvChangeMsec", time_store
);
4153 vty_out (vty
, " Most recent state change statistics:%s",
4155 vty_out (vty
, " Progressive change %s ago%s",
4156 ospf_timeval_dump (&res
, timebuf
, sizeof(timebuf
)),
4161 if (nbr
->ts_last_regress
.tv_sec
|| nbr
->ts_last_regress
.tv_usec
)
4166 time_store
= monotime_since(&nbr
->ts_last_regress
, &res
) / 1000LL;
4169 json_object_int_add(json_sub
, "lastRegressiveChangeMsec", time_store
);
4170 if (nbr
->last_regress_str
)
4171 json_object_string_add(json_sub
, "lastRegressiveChangeReason", nbr
->last_regress_str
);
4175 vty_out (vty
, " Regressive change %s ago, due to %s%s",
4176 ospf_timeval_dump (&res
, timebuf
, sizeof(timebuf
)),
4177 (nbr
->last_regress_str
? nbr
->last_regress_str
: "??"),
4182 /* Show Designated Rotuer ID. */
4184 json_object_string_add(json_sub
, "routerDesignatedId", inet_ntoa (nbr
->d_router
));
4186 vty_out (vty
, " DR is %s,", inet_ntoa (nbr
->d_router
));
4188 /* Show Backup Designated Rotuer ID. */
4190 json_object_string_add(json_sub
, "routerDesignatedBackupId", inet_ntoa (nbr
->bd_router
));
4192 vty_out (vty
, " BDR is %s%s", inet_ntoa (nbr
->bd_router
), VTY_NEWLINE
);
4197 json_object_int_add(json_sub
, "optionsCounter", nbr
->options
);
4198 json_object_string_add(json_sub
, "optionsList", ospf_options_dump (nbr
->options
));
4201 vty_out (vty
, " Options %d %s%s", nbr
->options
,
4202 ospf_options_dump (nbr
->options
), VTY_NEWLINE
);
4204 /* Show Router Dead interval timer. */
4207 if (nbr
->t_inactivity
)
4210 time_store
= monotime_until(&nbr
->t_inactivity
->u
.sands
, NULL
) / 1000LL;
4211 json_object_int_add(json_sub
, "routerDeadIntervalTimerDueMsec", time_store
);
4214 json_object_int_add(json_sub
, "routerDeadIntervalTimerDueMsec", -1);
4217 vty_out (vty
, " Dead timer due in %s%s",
4218 ospf_timer_dump (nbr
->t_inactivity
, timebuf
, sizeof (timebuf
)),
4221 /* Show Database Summary list. */
4223 json_object_int_add(json_sub
, "databaseSummaryListCounter", ospf_db_summary_count (nbr
));
4225 vty_out (vty
, " Database Summary List %d%s",
4226 ospf_db_summary_count (nbr
), VTY_NEWLINE
);
4228 /* Show Link State Request list. */
4230 json_object_int_add(json_sub
, "linkStateRequestListCounter", ospf_ls_request_count (nbr
));
4232 vty_out (vty
, " Link State Request List %ld%s",
4233 ospf_ls_request_count (nbr
), VTY_NEWLINE
);
4235 /* Show Link State Retransmission list. */
4237 json_object_int_add(json_sub
, "linkStateRetransmissionListCounter", ospf_ls_retransmit_count (nbr
));
4239 vty_out (vty
, " Link State Retransmission List %ld%s",
4240 ospf_ls_retransmit_count (nbr
), VTY_NEWLINE
);
4242 /* Show inactivity timer thread. */
4245 if (nbr
->t_inactivity
!= NULL
)
4246 json_object_string_add(json_sub
, "threadInactivityTimer", "on");
4249 vty_out (vty
, " Thread Inactivity Timer %s%s",
4250 nbr
->t_inactivity
!= NULL
? "on" : "off", VTY_NEWLINE
);
4252 /* Show Database Description retransmission thread. */
4255 if (nbr
->t_db_desc
!= NULL
)
4256 json_object_string_add(json_sub
, "threadDatabaseDescriptionRetransmission", "on");
4259 vty_out (vty
, " Thread Database Description Retransmision %s%s",
4260 nbr
->t_db_desc
!= NULL
? "on" : "off", VTY_NEWLINE
);
4262 /* Show Link State Request Retransmission thread. */
4265 if (nbr
->t_ls_req
!= NULL
)
4266 json_object_string_add(json_sub
, "threadLinkStateRequestRetransmission", "on");
4269 vty_out (vty
, " Thread Link State Request Retransmission %s%s",
4270 nbr
->t_ls_req
!= NULL
? "on" : "off", VTY_NEWLINE
);
4272 /* Show Link State Update Retransmission thread. */
4275 if (nbr
->t_ls_upd
!= NULL
)
4276 json_object_string_add(json_sub
, "threadLinkStateUpdateRetransmission", "on");
4279 vty_out (vty
, " Thread Link State Update Retransmission %s%s%s",
4280 nbr
->t_ls_upd
!= NULL
? "on" : "off", VTY_NEWLINE
, VTY_NEWLINE
);
4284 if (nbr
->state
== NSM_Attempt
&& nbr
->router_id
.s_addr
== 0)
4285 json_object_object_add(json
, "noNbrId", json_sub
);
4287 json_object_object_add(json
, inet_ntoa (nbr
->router_id
), json_sub
);
4290 ospf_bfd_show_info(vty
, nbr
->bfd_info
, json
, use_json
, 0);
4294 show_ip_ospf_neighbor_id_common (struct vty
*vty
, struct ospf
*ospf
,
4295 int arg_base
, struct cmd_token
**argv
, u_char use_json
)
4297 struct listnode
*node
;
4298 struct ospf_neighbor
*nbr
;
4299 struct ospf_interface
*oi
;
4300 struct in_addr router_id
;
4302 json_object
*json
= NULL
;
4305 json
= json_object_new_object();
4310 json_object_int_add(json
, "ospfInstance", ospf
->instance
);
4312 vty_out (vty
, "%sOSPF Instance: %d%s%s", VTY_NEWLINE
, ospf
->instance
,
4313 VTY_NEWLINE
, VTY_NEWLINE
);
4316 ret
= inet_aton (argv
[arg_base
]->arg
, &router_id
);
4320 vty_out (vty
, "Please specify Neighbor ID by A.B.C.D%s", VTY_NEWLINE
);
4324 for (ALL_LIST_ELEMENTS_RO (ospf
->oiflist
, node
, oi
))
4326 if ((nbr
= ospf_nbr_lookup_by_routerid (oi
->nbrs
, &router_id
)))
4328 show_ip_ospf_neighbor_detail_sub (vty
, oi
, nbr
, use_json
, json
);
4334 vty_out (vty
, "%s%s", json_object_to_json_string_ext(json
, JSON_C_TO_STRING_PRETTY
), VTY_NEWLINE
);
4335 json_object_free(json
);
4338 vty_out (vty
, "%s", VTY_NEWLINE
);
4343 DEFUN (show_ip_ospf_neighbor_id
,
4344 show_ip_ospf_neighbor_id_cmd
,
4345 "show ip ospf neighbor A.B.C.D [json]",
4348 "OSPF information\n"
4354 u_char uj
= use_json(argc
, argv
);
4356 if ((ospf
= ospf_lookup()) == NULL
|| !ospf
->oi_running
)
4359 return show_ip_ospf_neighbor_id_common(vty
, ospf
, 0, argv
, uj
);
4362 DEFUN (show_ip_ospf_instance_neighbor_id
,
4363 show_ip_ospf_instance_neighbor_id_cmd
,
4364 "show ip ospf (1-65535) neighbor A.B.C.D [json]",
4367 "OSPF information\n"
4375 u_short instance
= 0;
4376 u_char uj
= use_json(argc
, argv
);
4378 VTY_GET_INTEGER ("Instance", instance
, argv
[idx_number
]->arg
);
4379 if ((ospf
= ospf_lookup_instance(instance
)) == NULL
|| !ospf
->oi_running
)
4382 return show_ip_ospf_neighbor_id_common(vty
, ospf
, 1, argv
, uj
);
4386 show_ip_ospf_neighbor_detail_common (struct vty
*vty
, struct ospf
*ospf
, u_char use_json
)
4388 struct ospf_interface
*oi
;
4389 struct listnode
*node
;
4390 json_object
*json
= NULL
;
4393 json
= json_object_new_object();
4398 json_object_int_add(json
, "ospfInstance", ospf
->instance
);
4400 vty_out (vty
, "%sOSPF Instance: %d%s%s", VTY_NEWLINE
, ospf
->instance
,
4401 VTY_NEWLINE
, VTY_NEWLINE
);
4404 for (ALL_LIST_ELEMENTS_RO (ospf
->oiflist
, node
, oi
))
4406 struct route_node
*rn
;
4407 struct ospf_neighbor
*nbr
;
4409 for (rn
= route_top (oi
->nbrs
); rn
; rn
= route_next (rn
))
4411 if ((nbr
= rn
->info
))
4413 if (nbr
!= oi
->nbr_self
)
4415 if (nbr
->state
!= NSM_Down
)
4417 show_ip_ospf_neighbor_detail_sub (vty
, oi
, nbr
, use_json
, json
);
4426 vty_out (vty
, "%s%s", json_object_to_json_string_ext(json
, JSON_C_TO_STRING_PRETTY
), VTY_NEWLINE
);
4427 json_object_free(json
);
4430 vty_out (vty
, "%s", VTY_NEWLINE
);
4435 DEFUN (show_ip_ospf_neighbor_detail
,
4436 show_ip_ospf_neighbor_detail_cmd
,
4437 "show ip ospf neighbor detail [json]",
4440 "OSPF information\n"
4442 "detail of all neighbors\n"
4446 u_char uj
= use_json(argc
, argv
);
4448 if ((ospf
= ospf_lookup()) == NULL
|| !ospf
->oi_running
)
4451 return show_ip_ospf_neighbor_detail_common(vty
, ospf
, uj
);
4454 DEFUN (show_ip_ospf_instance_neighbor_detail
,
4455 show_ip_ospf_instance_neighbor_detail_cmd
,
4456 "show ip ospf (1-65535) neighbor detail [json]",
4459 "OSPF information\n"
4462 "detail of all neighbors\n"
4467 u_short instance
= 0;
4468 u_char uj
= use_json(argc
, argv
);
4470 VTY_GET_INTEGER ("Instance", instance
, argv
[idx_number
]->arg
);
4471 if ((ospf
= ospf_lookup_instance (instance
)) == NULL
|| !ospf
->oi_running
)
4474 return show_ip_ospf_neighbor_detail_common(vty
, ospf
, uj
);
4478 show_ip_ospf_neighbor_detail_all_common (struct vty
*vty
, struct ospf
*ospf
, u_char use_json
)
4480 struct listnode
*node
;
4481 struct ospf_interface
*oi
;
4482 json_object
*json
= NULL
;
4485 json
= json_object_new_object();
4490 json_object_int_add(json
, "ospfInstance", ospf
->instance
);
4492 vty_out (vty
, "%sOSPF Instance: %d%s%s", VTY_NEWLINE
, ospf
->instance
,
4493 VTY_NEWLINE
, VTY_NEWLINE
);
4496 for (ALL_LIST_ELEMENTS_RO (ospf
->oiflist
, node
, oi
))
4498 struct route_node
*rn
;
4499 struct ospf_neighbor
*nbr
;
4500 struct ospf_nbr_nbma
*nbr_nbma
;
4502 for (rn
= route_top (oi
->nbrs
); rn
; rn
= route_next (rn
))
4503 if ((nbr
= rn
->info
))
4504 if (nbr
!= oi
->nbr_self
)
4505 if (nbr
->state
!= NSM_Down
)
4506 show_ip_ospf_neighbor_detail_sub (vty
, oi
, rn
->info
, use_json
, json
);
4508 if (oi
->type
== OSPF_IFTYPE_NBMA
)
4510 struct listnode
*nd
;
4512 for (ALL_LIST_ELEMENTS_RO (oi
->nbr_nbma
, nd
, nbr_nbma
))
4514 if (nbr_nbma
->nbr
== NULL
|| nbr_nbma
->nbr
->state
== NSM_Down
)
4515 show_ip_ospf_nbr_nbma_detail_sub (vty
, oi
, nbr_nbma
, use_json
, json
);
4522 vty_out (vty
, "%s%s", json_object_to_json_string_ext(json
, JSON_C_TO_STRING_PRETTY
), VTY_NEWLINE
);
4523 json_object_free(json
);
4527 vty_out (vty
, "%s", VTY_NEWLINE
);
4533 DEFUN (show_ip_ospf_neighbor_detail_all
,
4534 show_ip_ospf_neighbor_detail_all_cmd
,
4535 "show ip ospf neighbor detail all [json]",
4538 "OSPF information\n"
4540 "detail of all neighbors\n"
4541 "include down status neighbor\n"
4545 u_char uj
= use_json(argc
, argv
);
4547 if ((ospf
= ospf_lookup()) == NULL
|| !ospf
->oi_running
)
4550 return show_ip_ospf_neighbor_detail_all_common(vty
, ospf
, uj
);
4553 DEFUN (show_ip_ospf_instance_neighbor_detail_all
,
4554 show_ip_ospf_instance_neighbor_detail_all_cmd
,
4555 "show ip ospf (1-65535) neighbor detail all [json]",
4558 "OSPF information\n"
4561 "detail of all neighbors\n"
4562 "include down status neighbor\n"
4567 u_short instance
= 0;
4568 u_char uj
= use_json(argc
, argv
);
4570 VTY_GET_INTEGER ("Instance", instance
, argv
[idx_number
]->arg
);
4571 if ((ospf
= ospf_lookup_instance(instance
)) == NULL
|| !ospf
->oi_running
)
4574 return show_ip_ospf_neighbor_detail_all_common(vty
, ospf
, uj
);
4578 show_ip_ospf_neighbor_int_detail_common (struct vty
*vty
, struct ospf
*ospf
,
4579 int arg_base
, struct cmd_token
**argv
, u_char use_json
)
4581 struct ospf_interface
*oi
;
4582 struct interface
*ifp
;
4583 struct route_node
*rn
, *nrn
;
4584 struct ospf_neighbor
*nbr
;
4585 json_object
*json
= NULL
;
4588 json
= json_object_new_object();
4593 json_object_int_add(json
, "ospfInstance", ospf
->instance
);
4595 vty_out (vty
, "%sOSPF Instance: %d%s%s", VTY_NEWLINE
, ospf
->instance
,
4596 VTY_NEWLINE
, VTY_NEWLINE
);
4599 ifp
= if_lookup_by_name (argv
[arg_base
]->arg
, VRF_DEFAULT
);
4603 vty_out (vty
, "No such interface.%s", VTY_NEWLINE
);
4607 for (rn
= route_top (IF_OIFS (ifp
)); rn
; rn
= route_next (rn
))
4609 if ((oi
= rn
->info
))
4611 for (nrn
= route_top (oi
->nbrs
); nrn
; nrn
= route_next (nrn
))
4613 if ((nbr
= nrn
->info
))
4615 if (nbr
!= oi
->nbr_self
)
4617 if (nbr
->state
!= NSM_Down
)
4618 show_ip_ospf_neighbor_detail_sub (vty
, oi
, nbr
, use_json
, json
);
4627 vty_out (vty
, "%s%s", json_object_to_json_string_ext(json
, JSON_C_TO_STRING_PRETTY
), VTY_NEWLINE
);
4628 json_object_free(json
);
4631 vty_out (vty
, "%s", VTY_NEWLINE
);
4636 DEFUN (show_ip_ospf_neighbor_int_detail
,
4637 show_ip_ospf_neighbor_int_detail_cmd
,
4638 "show ip ospf neighbor IFNAME detail [json]",
4641 "OSPF information\n"
4644 "detail of all neighbors\n"
4648 u_char uj
= use_json(argc
, argv
);
4650 if ((ospf
= ospf_lookup()) == NULL
|| !ospf
->oi_running
)
4653 return show_ip_ospf_neighbor_int_detail_common(vty
, ospf
, 0, argv
, uj
);
4656 DEFUN (show_ip_ospf_instance_neighbor_int_detail
,
4657 show_ip_ospf_instance_neighbor_int_detail_cmd
,
4658 "show ip ospf (1-65535) neighbor IFNAME detail [json]",
4661 "OSPF information\n"
4665 "detail of all neighbors\n"
4670 u_short instance
= 0;
4671 u_char uj
= use_json(argc
, argv
);
4673 VTY_GET_INTEGER ("Instance", instance
, argv
[idx_number
]->arg
);
4674 if ((ospf
= ospf_lookup_instance(instance
)) == NULL
|| !ospf
->oi_running
)
4677 return show_ip_ospf_neighbor_int_detail_common(vty
, ospf
, 1, argv
, uj
);
4680 /* Show functions */
4682 show_lsa_summary (struct vty
*vty
, struct ospf_lsa
*lsa
, int self
)
4684 struct router_lsa
*rl
;
4685 struct summary_lsa
*sl
;
4686 struct as_external_lsa
*asel
;
4687 struct prefix_ipv4 p
;
4690 /* If self option is set, check LSA self flag. */
4691 if (self
== 0 || IS_LSA_SELF (lsa
))
4693 /* LSA common part show. */
4694 vty_out (vty
, "%-15s ", inet_ntoa (lsa
->data
->id
));
4695 vty_out (vty
, "%-15s %4d 0x%08lx 0x%04x",
4696 inet_ntoa (lsa
->data
->adv_router
), LS_AGE (lsa
),
4697 (u_long
)ntohl (lsa
->data
->ls_seqnum
), ntohs (lsa
->data
->checksum
));
4698 /* LSA specific part show. */
4699 switch (lsa
->data
->type
)
4701 case OSPF_ROUTER_LSA
:
4702 rl
= (struct router_lsa
*) lsa
->data
;
4703 vty_out (vty
, " %-d", ntohs (rl
->links
));
4705 case OSPF_SUMMARY_LSA
:
4706 sl
= (struct summary_lsa
*) lsa
->data
;
4709 p
.prefix
= sl
->header
.id
;
4710 p
.prefixlen
= ip_masklen (sl
->mask
);
4711 apply_mask_ipv4 (&p
);
4713 vty_out (vty
, " %s/%d", inet_ntoa (p
.prefix
), p
.prefixlen
);
4715 case OSPF_AS_EXTERNAL_LSA
:
4716 case OSPF_AS_NSSA_LSA
:
4717 asel
= (struct as_external_lsa
*) lsa
->data
;
4720 p
.prefix
= asel
->header
.id
;
4721 p
.prefixlen
= ip_masklen (asel
->mask
);
4722 apply_mask_ipv4 (&p
);
4724 vty_out (vty
, " %s %s/%d [0x%lx]",
4725 IS_EXTERNAL_METRIC (asel
->e
[0].tos
) ? "E2" : "E1",
4726 inet_ntoa (p
.prefix
), p
.prefixlen
,
4727 (u_long
)ntohl (asel
->e
[0].route_tag
));
4729 case OSPF_NETWORK_LSA
:
4730 case OSPF_ASBR_SUMMARY_LSA
:
4731 case OSPF_OPAQUE_LINK_LSA
:
4732 case OSPF_OPAQUE_AREA_LSA
:
4733 case OSPF_OPAQUE_AS_LSA
:
4737 vty_out (vty
, VTY_NEWLINE
);
4743 static const char *show_database_desc
[] =
4746 "Router Link States",
4748 "Summary Link States",
4749 "ASBR-Summary Link States",
4750 "AS External Link States",
4751 "Group Membership LSA",
4752 "NSSA-external Link States",
4754 "Link-Local Opaque-LSA",
4755 "Area-Local Opaque-LSA",
4756 "AS-external Opaque-LSA",
4759 static const char *show_database_header
[] =
4762 "Link ID ADV Router Age Seq# CkSum Link count",
4763 "Link ID ADV Router Age Seq# CkSum",
4764 "Link ID ADV Router Age Seq# CkSum Route",
4765 "Link ID ADV Router Age Seq# CkSum",
4766 "Link ID ADV Router Age Seq# CkSum Route",
4767 " --- header for Group Member ----",
4768 "Link ID ADV Router Age Seq# CkSum Route",
4770 "Opaque-Type/Id ADV Router Age Seq# CkSum",
4771 "Opaque-Type/Id ADV Router Age Seq# CkSum",
4772 "Opaque-Type/Id ADV Router Age Seq# CkSum",
4776 show_ip_ospf_database_header (struct vty
*vty
, struct ospf_lsa
*lsa
)
4778 struct router_lsa
*rlsa
= (struct router_lsa
*) lsa
->data
;
4780 vty_out (vty
, " LS age: %d%s", LS_AGE (lsa
), VTY_NEWLINE
);
4781 vty_out (vty
, " Options: 0x%-2x : %s%s",
4783 ospf_options_dump(lsa
->data
->options
),
4785 vty_out (vty
, " LS Flags: 0x%-2x %s%s",
4787 ((lsa
->flags
& OSPF_LSA_LOCAL_XLT
) ? "(Translated from Type-7)" : ""),
4790 if (lsa
->data
->type
== OSPF_ROUTER_LSA
)
4792 vty_out (vty
, " Flags: 0x%x" , rlsa
->flags
);
4795 vty_out (vty
, " :%s%s%s%s",
4796 IS_ROUTER_LSA_BORDER (rlsa
) ? " ABR" : "",
4797 IS_ROUTER_LSA_EXTERNAL (rlsa
) ? " ASBR" : "",
4798 IS_ROUTER_LSA_VIRTUAL (rlsa
) ? " VL-endpoint" : "",
4799 IS_ROUTER_LSA_SHORTCUT (rlsa
) ? " Shortcut" : "");
4801 vty_out (vty
, "%s", VTY_NEWLINE
);
4803 vty_out (vty
, " LS Type: %s%s",
4804 LOOKUP (ospf_lsa_type_msg
, lsa
->data
->type
), VTY_NEWLINE
);
4805 vty_out (vty
, " Link State ID: %s %s%s", inet_ntoa (lsa
->data
->id
),
4806 LOOKUP (ospf_link_state_id_type_msg
, lsa
->data
->type
), VTY_NEWLINE
);
4807 vty_out (vty
, " Advertising Router: %s%s",
4808 inet_ntoa (lsa
->data
->adv_router
), VTY_NEWLINE
);
4809 vty_out (vty
, " LS Seq Number: %08lx%s", (u_long
)ntohl (lsa
->data
->ls_seqnum
),
4811 vty_out (vty
, " Checksum: 0x%04x%s", ntohs (lsa
->data
->checksum
),
4813 vty_out (vty
, " Length: %d%s", ntohs (lsa
->data
->length
), VTY_NEWLINE
);
4816 const char *link_type_desc
[] =
4819 "another Router (point-to-point)",
4820 "a Transit Network",
4825 const char *link_id_desc
[] =
4828 "Neighboring Router ID",
4829 "Designated Router address",
4831 "Neighboring Router ID",
4834 const char *link_data_desc
[] =
4837 "Router Interface address",
4838 "Router Interface address",
4840 "Router Interface address",
4843 /* Show router-LSA each Link information. */
4845 show_ip_ospf_database_router_links (struct vty
*vty
,
4846 struct router_lsa
*rl
)
4851 len
= ntohs (rl
->header
.length
) - 4;
4852 for (i
= 0; i
< ntohs (rl
->links
) && len
> 0; len
-= 12, i
++)
4854 type
= rl
->link
[i
].type
;
4856 vty_out (vty
, " Link connected to: %s%s",
4857 link_type_desc
[type
], VTY_NEWLINE
);
4858 vty_out (vty
, " (Link ID) %s: %s%s", link_id_desc
[type
],
4859 inet_ntoa (rl
->link
[i
].link_id
), VTY_NEWLINE
);
4860 vty_out (vty
, " (Link Data) %s: %s%s", link_data_desc
[type
],
4861 inet_ntoa (rl
->link
[i
].link_data
), VTY_NEWLINE
);
4862 vty_out (vty
, " Number of TOS metrics: 0%s", VTY_NEWLINE
);
4863 vty_out (vty
, " TOS 0 Metric: %d%s",
4864 ntohs (rl
->link
[i
].metric
), VTY_NEWLINE
);
4865 vty_out (vty
, "%s", VTY_NEWLINE
);
4869 /* Show router-LSA detail information. */
4871 show_router_lsa_detail (struct vty
*vty
, struct ospf_lsa
*lsa
)
4875 struct router_lsa
*rl
= (struct router_lsa
*) lsa
->data
;
4877 show_ip_ospf_database_header (vty
, lsa
);
4879 vty_out (vty
, " Number of Links: %d%s%s", ntohs (rl
->links
),
4880 VTY_NEWLINE
, VTY_NEWLINE
);
4882 show_ip_ospf_database_router_links (vty
, rl
);
4883 vty_out (vty
, "%s", VTY_NEWLINE
);
4889 /* Show network-LSA detail information. */
4891 show_network_lsa_detail (struct vty
*vty
, struct ospf_lsa
*lsa
)
4897 struct network_lsa
*nl
= (struct network_lsa
*) lsa
->data
;
4899 show_ip_ospf_database_header (vty
, lsa
);
4901 vty_out (vty
, " Network Mask: /%d%s",
4902 ip_masklen (nl
->mask
), VTY_NEWLINE
);
4904 length
= ntohs (lsa
->data
->length
) - OSPF_LSA_HEADER_SIZE
- 4;
4906 for (i
= 0; length
> 0; i
++, length
-= 4)
4907 vty_out (vty
, " Attached Router: %s%s",
4908 inet_ntoa (nl
->routers
[i
]), VTY_NEWLINE
);
4910 vty_out (vty
, "%s", VTY_NEWLINE
);
4916 /* Show summary-LSA detail information. */
4918 show_summary_lsa_detail (struct vty
*vty
, struct ospf_lsa
*lsa
)
4922 struct summary_lsa
*sl
= (struct summary_lsa
*) lsa
->data
;
4924 show_ip_ospf_database_header (vty
, lsa
);
4926 vty_out (vty
, " Network Mask: /%d%s", ip_masklen (sl
->mask
),
4928 vty_out (vty
, " TOS: 0 Metric: %d%s", GET_METRIC (sl
->metric
),
4930 vty_out (vty
, "%s", VTY_NEWLINE
);
4936 /* Show summary-ASBR-LSA detail information. */
4938 show_summary_asbr_lsa_detail (struct vty
*vty
, struct ospf_lsa
*lsa
)
4942 struct summary_lsa
*sl
= (struct summary_lsa
*) lsa
->data
;
4944 show_ip_ospf_database_header (vty
, lsa
);
4946 vty_out (vty
, " Network Mask: /%d%s",
4947 ip_masklen (sl
->mask
), VTY_NEWLINE
);
4948 vty_out (vty
, " TOS: 0 Metric: %d%s", GET_METRIC (sl
->metric
),
4950 vty_out (vty
, "%s", VTY_NEWLINE
);
4956 /* Show AS-external-LSA detail information. */
4958 show_as_external_lsa_detail (struct vty
*vty
, struct ospf_lsa
*lsa
)
4962 struct as_external_lsa
*al
= (struct as_external_lsa
*) lsa
->data
;
4964 show_ip_ospf_database_header (vty
, lsa
);
4966 vty_out (vty
, " Network Mask: /%d%s",
4967 ip_masklen (al
->mask
), VTY_NEWLINE
);
4968 vty_out (vty
, " Metric Type: %s%s",
4969 IS_EXTERNAL_METRIC (al
->e
[0].tos
) ?
4970 "2 (Larger than any link state path)" : "1", VTY_NEWLINE
);
4971 vty_out (vty
, " TOS: 0%s", VTY_NEWLINE
);
4972 vty_out (vty
, " Metric: %d%s",
4973 GET_METRIC (al
->e
[0].metric
), VTY_NEWLINE
);
4974 vty_out (vty
, " Forward Address: %s%s",
4975 inet_ntoa (al
->e
[0].fwd_addr
), VTY_NEWLINE
);
4977 vty_out (vty
, " External Route Tag: %"ROUTE_TAG_PRI
"%s%s",
4978 (route_tag_t
)ntohl (al
->e
[0].route_tag
), VTY_NEWLINE
, VTY_NEWLINE
);
4985 show_as_external_lsa_stdvty (struct ospf_lsa
*lsa
)
4987 struct as_external_lsa
*al
= (struct as_external_lsa
*) lsa
->data
;
4989 /* show_ip_ospf_database_header (vty, lsa); */
4991 zlog_debug( " Network Mask: /%d%s",
4992 ip_masklen (al
->mask
), "\n");
4993 zlog_debug( " Metric Type: %s%s",
4994 IS_EXTERNAL_METRIC (al
->e
[0].tos
) ?
4995 "2 (Larger than any link state path)" : "1", "\n");
4996 zlog_debug( " TOS: 0%s", "\n");
4997 zlog_debug( " Metric: %d%s",
4998 GET_METRIC (al
->e
[0].metric
), "\n");
4999 zlog_debug( " Forward Address: %s%s",
5000 inet_ntoa (al
->e
[0].fwd_addr
), "\n");
5002 zlog_debug( " External Route Tag: %"ROUTE_TAG_PRI
"%s%s",
5003 (route_tag_t
)ntohl (al
->e
[0].route_tag
), "\n", "\n");
5008 /* Show AS-NSSA-LSA detail information. */
5010 show_as_nssa_lsa_detail (struct vty
*vty
, struct ospf_lsa
*lsa
)
5014 struct as_external_lsa
*al
= (struct as_external_lsa
*) lsa
->data
;
5016 show_ip_ospf_database_header (vty
, lsa
);
5018 vty_out (vty
, " Network Mask: /%d%s",
5019 ip_masklen (al
->mask
), VTY_NEWLINE
);
5020 vty_out (vty
, " Metric Type: %s%s",
5021 IS_EXTERNAL_METRIC (al
->e
[0].tos
) ?
5022 "2 (Larger than any link state path)" : "1", VTY_NEWLINE
);
5023 vty_out (vty
, " TOS: 0%s", VTY_NEWLINE
);
5024 vty_out (vty
, " Metric: %d%s",
5025 GET_METRIC (al
->e
[0].metric
), VTY_NEWLINE
);
5026 vty_out (vty
, " NSSA: Forward Address: %s%s",
5027 inet_ntoa (al
->e
[0].fwd_addr
), VTY_NEWLINE
);
5029 vty_out (vty
, " External Route Tag: %"ROUTE_TAG_PRI
"%s%s",
5030 (route_tag_t
)ntohl (al
->e
[0].route_tag
), VTY_NEWLINE
, VTY_NEWLINE
);
5037 show_func_dummy (struct vty
*vty
, struct ospf_lsa
*lsa
)
5043 show_opaque_lsa_detail (struct vty
*vty
, struct ospf_lsa
*lsa
)
5047 show_ip_ospf_database_header (vty
, lsa
);
5048 show_opaque_info_detail (vty
, lsa
);
5050 vty_out (vty
, "%s", VTY_NEWLINE
);
5055 int (*show_function
[])(struct vty
*, struct ospf_lsa
*) =
5058 show_router_lsa_detail
,
5059 show_network_lsa_detail
,
5060 show_summary_lsa_detail
,
5061 show_summary_asbr_lsa_detail
,
5062 show_as_external_lsa_detail
,
5064 show_as_nssa_lsa_detail
, /* almost same as external */
5066 show_opaque_lsa_detail
,
5067 show_opaque_lsa_detail
,
5068 show_opaque_lsa_detail
,
5072 show_lsa_prefix_set (struct vty
*vty
, struct prefix_ls
*lp
, struct in_addr
*id
,
5073 struct in_addr
*adv_router
)
5075 memset (lp
, 0, sizeof (struct prefix_ls
));
5079 else if (adv_router
== NULL
)
5088 lp
->adv_router
= *adv_router
;
5093 show_lsa_detail_proc (struct vty
*vty
, struct route_table
*rt
,
5094 struct in_addr
*id
, struct in_addr
*adv_router
)
5096 struct prefix_ls lp
;
5097 struct route_node
*rn
, *start
;
5098 struct ospf_lsa
*lsa
;
5100 show_lsa_prefix_set (vty
, &lp
, id
, adv_router
);
5101 start
= route_node_get (rt
, (struct prefix
*) &lp
);
5104 route_lock_node (start
);
5105 for (rn
= start
; rn
; rn
= route_next_until (rn
, start
))
5106 if ((lsa
= rn
->info
))
5108 if (show_function
[lsa
->data
->type
] != NULL
)
5109 show_function
[lsa
->data
->type
] (vty
, lsa
);
5111 route_unlock_node (start
);
5115 /* Show detail LSA information
5116 -- if id is NULL then show all LSAs. */
5118 show_lsa_detail (struct vty
*vty
, struct ospf
*ospf
, int type
,
5119 struct in_addr
*id
, struct in_addr
*adv_router
)
5121 struct listnode
*node
;
5122 struct ospf_area
*area
;
5126 case OSPF_AS_EXTERNAL_LSA
:
5127 case OSPF_OPAQUE_AS_LSA
:
5128 vty_out (vty
, " %s %s%s",
5129 show_database_desc
[type
],
5130 VTY_NEWLINE
, VTY_NEWLINE
);
5131 show_lsa_detail_proc (vty
, AS_LSDB (ospf
, type
), id
, adv_router
);
5134 for (ALL_LIST_ELEMENTS_RO (ospf
->areas
, node
, area
))
5136 vty_out (vty
, "%s %s (Area %s)%s%s",
5137 VTY_NEWLINE
, show_database_desc
[type
],
5138 ospf_area_desc_string (area
), VTY_NEWLINE
, VTY_NEWLINE
);
5139 show_lsa_detail_proc (vty
, AREA_LSDB (area
, type
), id
, adv_router
);
5146 show_lsa_detail_adv_router_proc (struct vty
*vty
, struct route_table
*rt
,
5147 struct in_addr
*adv_router
)
5149 struct route_node
*rn
;
5150 struct ospf_lsa
*lsa
;
5152 for (rn
= route_top (rt
); rn
; rn
= route_next (rn
))
5153 if ((lsa
= rn
->info
))
5154 if (IPV4_ADDR_SAME (adv_router
, &lsa
->data
->adv_router
))
5156 if (CHECK_FLAG (lsa
->flags
, OSPF_LSA_LOCAL_XLT
))
5158 if (show_function
[lsa
->data
->type
] != NULL
)
5159 show_function
[lsa
->data
->type
] (vty
, lsa
);
5163 /* Show detail LSA information. */
5165 show_lsa_detail_adv_router (struct vty
*vty
, struct ospf
*ospf
, int type
,
5166 struct in_addr
*adv_router
)
5168 struct listnode
*node
;
5169 struct ospf_area
*area
;
5173 case OSPF_AS_EXTERNAL_LSA
:
5174 case OSPF_OPAQUE_AS_LSA
:
5175 vty_out (vty
, " %s %s%s",
5176 show_database_desc
[type
],
5177 VTY_NEWLINE
, VTY_NEWLINE
);
5178 show_lsa_detail_adv_router_proc (vty
, AS_LSDB (ospf
, type
),
5182 for (ALL_LIST_ELEMENTS_RO (ospf
->areas
, node
, area
))
5184 vty_out (vty
, "%s %s (Area %s)%s%s",
5185 VTY_NEWLINE
, show_database_desc
[type
],
5186 ospf_area_desc_string (area
), VTY_NEWLINE
, VTY_NEWLINE
);
5187 show_lsa_detail_adv_router_proc (vty
, AREA_LSDB (area
, type
),
5195 show_ip_ospf_database_summary (struct vty
*vty
, struct ospf
*ospf
, int self
)
5197 struct ospf_lsa
*lsa
;
5198 struct route_node
*rn
;
5199 struct ospf_area
*area
;
5200 struct listnode
*node
;
5203 for (ALL_LIST_ELEMENTS_RO (ospf
->areas
, node
, area
))
5205 for (type
= OSPF_MIN_LSA
; type
< OSPF_MAX_LSA
; type
++)
5209 case OSPF_AS_EXTERNAL_LSA
:
5210 case OSPF_OPAQUE_AS_LSA
:
5215 if (ospf_lsdb_count_self (area
->lsdb
, type
) > 0 ||
5216 (!self
&& ospf_lsdb_count (area
->lsdb
, type
) > 0))
5218 vty_out (vty
, " %s (Area %s)%s%s",
5219 show_database_desc
[type
],
5220 ospf_area_desc_string (area
),
5221 VTY_NEWLINE
, VTY_NEWLINE
);
5222 vty_out (vty
, "%s%s", show_database_header
[type
], VTY_NEWLINE
);
5224 LSDB_LOOP (AREA_LSDB (area
, type
), rn
, lsa
)
5225 show_lsa_summary (vty
, lsa
, self
);
5227 vty_out (vty
, "%s", VTY_NEWLINE
);
5232 for (type
= OSPF_MIN_LSA
; type
< OSPF_MAX_LSA
; type
++)
5236 case OSPF_AS_EXTERNAL_LSA
:
5237 case OSPF_OPAQUE_AS_LSA
:
5242 if (ospf_lsdb_count_self (ospf
->lsdb
, type
) ||
5243 (!self
&& ospf_lsdb_count (ospf
->lsdb
, type
)))
5245 vty_out (vty
, " %s%s%s",
5246 show_database_desc
[type
],
5247 VTY_NEWLINE
, VTY_NEWLINE
);
5248 vty_out (vty
, "%s%s", show_database_header
[type
],
5251 LSDB_LOOP (AS_LSDB (ospf
, type
), rn
, lsa
)
5252 show_lsa_summary (vty
, lsa
, self
);
5254 vty_out (vty
, "%s", VTY_NEWLINE
);
5258 vty_out (vty
, "%s", VTY_NEWLINE
);
5262 show_ip_ospf_database_maxage (struct vty
*vty
, struct ospf
*ospf
)
5264 struct route_node
*rn
;
5266 vty_out (vty
, "%s MaxAge Link States:%s%s",
5267 VTY_NEWLINE
, VTY_NEWLINE
, VTY_NEWLINE
);
5269 for (rn
= route_top (ospf
->maxage_lsa
); rn
; rn
= route_next (rn
))
5271 struct ospf_lsa
*lsa
;
5273 if ((lsa
= rn
->info
) != NULL
)
5275 vty_out (vty
, "Link type: %d%s", lsa
->data
->type
, VTY_NEWLINE
);
5276 vty_out (vty
, "Link State ID: %s%s",
5277 inet_ntoa (lsa
->data
->id
), VTY_NEWLINE
);
5278 vty_out (vty
, "Advertising Router: %s%s",
5279 inet_ntoa (lsa
->data
->adv_router
), VTY_NEWLINE
);
5280 vty_out (vty
, "LSA lock count: %d%s", lsa
->lock
, VTY_NEWLINE
);
5281 vty_out (vty
, "%s", VTY_NEWLINE
);
5286 #define OSPF_LSA_TYPE_NSSA_DESC "NSSA external link state\n"
5287 #define OSPF_LSA_TYPE_NSSA_CMD_STR "|nssa-external"
5289 #define OSPF_LSA_TYPE_OPAQUE_LINK_DESC "Link local Opaque-LSA\n"
5290 #define OSPF_LSA_TYPE_OPAQUE_AREA_DESC "Link area Opaque-LSA\n"
5291 #define OSPF_LSA_TYPE_OPAQUE_AS_DESC "Link AS Opaque-LSA\n"
5292 #define OSPF_LSA_TYPE_OPAQUE_CMD_STR "|opaque-link|opaque-area|opaque-as"
5294 #define OSPF_LSA_TYPES_DESC \
5295 "ASBR summary link states\n" \
5296 "External link states\n" \
5297 "Network link states\n" \
5298 "Router link states\n" \
5299 "Network summary link states\n" \
5300 OSPF_LSA_TYPE_NSSA_DESC \
5301 OSPF_LSA_TYPE_OPAQUE_LINK_DESC \
5302 OSPF_LSA_TYPE_OPAQUE_AREA_DESC \
5303 OSPF_LSA_TYPE_OPAQUE_AS_DESC
5306 show_ip_ospf_database_common (struct vty
*vty
, struct ospf
*ospf
,
5307 int arg_base
, int argc
, struct cmd_token
**argv
)
5311 struct in_addr id
, adv_router
;
5314 vty_out (vty
, "%sOSPF Instance: %d%s", VTY_NEWLINE
, ospf
->instance
,
5317 vty_out (vty
, "%s OSPF Router with ID (%s)%s%s", VTY_NEWLINE
,
5318 inet_ntoa (ospf
->router_id
), VTY_NEWLINE
, VTY_NEWLINE
);
5321 if (argc
== arg_base
+ 4)
5323 show_ip_ospf_database_summary (vty
, ospf
, 0);
5327 /* Set database type to show. */
5328 if (strncmp (argv
[arg_base
+ idx_type
]->text
, "r", 1) == 0)
5329 type
= OSPF_ROUTER_LSA
;
5330 else if (strncmp (argv
[arg_base
+ idx_type
]->text
, "ne", 2) == 0)
5331 type
= OSPF_NETWORK_LSA
;
5332 else if (strncmp (argv
[arg_base
+ idx_type
]->text
, "ns", 2) == 0)
5333 type
= OSPF_AS_NSSA_LSA
;
5334 else if (strncmp (argv
[arg_base
+ idx_type
]->text
, "su", 2) == 0)
5335 type
= OSPF_SUMMARY_LSA
;
5336 else if (strncmp (argv
[arg_base
+ idx_type
]->text
, "a", 1) == 0)
5337 type
= OSPF_ASBR_SUMMARY_LSA
;
5338 else if (strncmp (argv
[arg_base
+ idx_type
]->text
, "e", 1) == 0)
5339 type
= OSPF_AS_EXTERNAL_LSA
;
5340 else if (strncmp (argv
[arg_base
+ idx_type
]->text
, "se", 2) == 0)
5342 show_ip_ospf_database_summary (vty
, ospf
, 1);
5345 else if (strncmp (argv
[arg_base
+ idx_type
]->text
, "m", 1) == 0)
5347 show_ip_ospf_database_maxage (vty
, ospf
);
5350 else if (strncmp (argv
[arg_base
+ idx_type
]->text
, "opaque-l", 8) == 0)
5351 type
= OSPF_OPAQUE_LINK_LSA
;
5352 else if (strncmp (argv
[arg_base
+ idx_type
]->text
, "opaque-ar", 9) == 0)
5353 type
= OSPF_OPAQUE_AREA_LSA
;
5354 else if (strncmp (argv
[arg_base
+ idx_type
]->text
, "opaque-as", 9) == 0)
5355 type
= OSPF_OPAQUE_AS_LSA
;
5359 /* `show ip ospf database LSA'. */
5360 if (argc
== arg_base
+ 5)
5361 show_lsa_detail (vty
, ospf
, type
, NULL
, NULL
);
5362 else if (argc
>= arg_base
+ 6)
5364 ret
= inet_aton (argv
[arg_base
+ 5]->arg
, &id
);
5368 /* `show ip ospf database LSA ID'. */
5369 if (argc
== arg_base
+ 6)
5370 show_lsa_detail (vty
, ospf
, type
, &id
, NULL
);
5371 /* `show ip ospf database LSA ID adv-router ADV_ROUTER'. */
5372 else if (argc
== arg_base
+ 7)
5374 if (strncmp (argv
[arg_base
+ 6]->text
, "s", 1) == 0)
5375 adv_router
= ospf
->router_id
;
5378 ret
= inet_aton (argv
[arg_base
+ 7]->arg
, &adv_router
);
5382 show_lsa_detail (vty
, ospf
, type
, &id
, &adv_router
);
5389 DEFUN (show_ip_ospf_database_max
,
5390 show_ip_ospf_database_max_cmd
,
5391 "show ip ospf database <max-age|self-originate>",
5394 "OSPF information\n"
5395 "Database summary\n"
5396 "LSAs in MaxAge list\n"
5397 "Self-originated link states\n")
5401 if ((ospf
= ospf_lookup()) == NULL
|| !ospf
->oi_running
)
5404 return (show_ip_ospf_database_common(vty
, ospf
, 0, argc
, argv
));
5407 DEFUN (show_ip_ospf_instance_database
,
5408 show_ip_ospf_instance_database_cmd
,
5409 "show ip ospf [(1-65535)] 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>]]]",
5412 "OSPF information\n"
5414 "Database summary\n"
5416 "Link State ID (as an IP address)\n"
5417 "Self-originated link states\n"
5418 "Advertising Router link states\n"
5419 "Advertising Router (as an IP address)\n")
5422 u_short instance
= 0;
5425 if (argv_find (argv
, argc
, "(1-65535)", &idx
))
5427 VTY_GET_INTEGER ("Instance", instance
, argv
[idx
]->arg
);
5428 ospf
= ospf_lookup_instance (instance
);
5431 ospf
= ospf_lookup();
5434 if (!ospf
|| !ospf
->oi_running
)
5437 return (show_ip_ospf_database_common(vty
, ospf
, idx
? 1 : 0, argc
, argv
));
5440 DEFUN (show_ip_ospf_instance_database_max
,
5441 show_ip_ospf_instance_database_max_cmd
,
5442 "show ip ospf (1-65535) database <max-age|self-originate>",
5445 "OSPF information\n"
5447 "Database summary\n"
5448 "LSAs in MaxAge list\n"
5449 "Self-originated link states\n")
5453 u_short instance
= 0;
5455 VTY_GET_INTEGER ("Instance", instance
, argv
[idx_number
]->arg
);
5457 if ((ospf
= ospf_lookup_instance (instance
)) == NULL
|| !ospf
->oi_running
)
5460 return (show_ip_ospf_database_common(vty
, ospf
, 1, argc
, argv
));
5465 show_ip_ospf_database_type_adv_router_common (struct vty
*vty
, struct ospf
*ospf
,
5466 int arg_base
, int argc
, struct cmd_token
**argv
)
5470 struct in_addr adv_router
;
5473 vty_out (vty
, "%sOSPF Instance: %d%s", VTY_NEWLINE
, ospf
->instance
,
5476 vty_out (vty
, "%s OSPF Router with ID (%s)%s%s", VTY_NEWLINE
,
5477 inet_ntoa (ospf
->router_id
), VTY_NEWLINE
, VTY_NEWLINE
);
5479 if (argc
!= arg_base
+ 7)
5482 /* Set database type to show. */
5483 if (strncmp (argv
[arg_base
+ idx_type
]->text
, "r", 1) == 0)
5484 type
= OSPF_ROUTER_LSA
;
5485 else if (strncmp (argv
[arg_base
+ idx_type
]->text
, "ne", 2) == 0)
5486 type
= OSPF_NETWORK_LSA
;
5487 else if (strncmp (argv
[arg_base
+ idx_type
]->text
, "ns", 2) == 0)
5488 type
= OSPF_AS_NSSA_LSA
;
5489 else if (strncmp (argv
[arg_base
+ idx_type
]->text
, "s", 1) == 0)
5490 type
= OSPF_SUMMARY_LSA
;
5491 else if (strncmp (argv
[arg_base
+ idx_type
]->text
, "a", 1) == 0)
5492 type
= OSPF_ASBR_SUMMARY_LSA
;
5493 else if (strncmp (argv
[arg_base
+ idx_type
]->text
, "e", 1) == 0)
5494 type
= OSPF_AS_EXTERNAL_LSA
;
5495 else if (strncmp (argv
[arg_base
+ idx_type
]->text
, "opaque-l", 8) == 0)
5496 type
= OSPF_OPAQUE_LINK_LSA
;
5497 else if (strncmp (argv
[arg_base
+ idx_type
]->text
, "opaque-ar", 9) == 0)
5498 type
= OSPF_OPAQUE_AREA_LSA
;
5499 else if (strncmp (argv
[arg_base
+ idx_type
]->text
, "opaque-as", 9) == 0)
5500 type
= OSPF_OPAQUE_AS_LSA
;
5504 /* `show ip ospf database LSA adv-router ADV_ROUTER'. */
5505 if (strncmp (argv
[arg_base
+ 5]->text
, "s", 1) == 0)
5506 adv_router
= ospf
->router_id
;
5509 ret
= inet_aton (argv
[arg_base
+ 6]->arg
, &adv_router
);
5514 show_lsa_detail_adv_router (vty
, ospf
, type
, &adv_router
);
5519 DEFUN (show_ip_ospf_database_type_adv_router
,
5520 show_ip_ospf_database_type_adv_router_cmd
,
5521 "show ip ospf database <asbr-summary|external|network|router|summary|nssa-external|opaque-link|opaque-area|opaque-as> <adv-router A.B.C.D|self-originate>",
5524 "OSPF information\n"
5525 "Database summary\n"
5527 "Advertising Router link states\n"
5528 "Advertising Router (as an IP address)\n"
5529 "Self-originated link states\n")
5533 if ((ospf
= ospf_lookup()) == NULL
|| !ospf
->oi_running
)
5536 return (show_ip_ospf_database_type_adv_router_common(vty
, ospf
, 0, argc
, argv
));
5539 DEFUN (show_ip_ospf_instance_database_type_adv_router
,
5540 show_ip_ospf_instance_database_type_adv_router_cmd
,
5541 "show ip ospf (1-65535) database <asbr-summary|external|network|router|summary|nssa-external|opaque-link|opaque-area|opaque-as> <adv-router A.B.C.D|self-originate>",
5544 "OSPF information\n"
5546 "Database summary\n"
5548 "Advertising Router link states\n"
5549 "Advertising Router (as an IP address)\n"
5550 "Self-originated link states\n")
5554 u_short instance
= 0;
5556 VTY_GET_INTEGER ("Instance", instance
, argv
[idx_number
]->arg
);
5558 if ((ospf
= ospf_lookup_instance (instance
)) == NULL
|| !ospf
->oi_running
)
5561 return (show_ip_ospf_database_type_adv_router_common(vty
, ospf
, 1, argc
, argv
));
5564 DEFUN (ip_ospf_authentication_args
,
5565 ip_ospf_authentication_args_addr_cmd
,
5566 "ip ospf authentication <null|message-digest> [A.B.C.D]",
5568 "OSPF interface commands\n"
5569 "Enable authentication on this interface\n"
5570 "Use null authentication\n"
5571 "Use message-digest authentication\n"
5572 "Address of interface\n")
5574 VTY_DECLVAR_CONTEXT(interface
, ifp
);
5575 int idx_encryption
= 3;
5577 struct in_addr addr
;
5579 struct ospf_if_params
*params
;
5581 params
= IF_DEF_PARAMS (ifp
);
5585 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
5588 vty_out (vty
, "Please specify interface address by A.B.C.D%s",
5593 params
= ospf_get_if_params (ifp
, addr
);
5594 ospf_if_update_params (ifp
, addr
);
5597 /* Handle null authentication */
5598 if ( argv
[idx_encryption
]->arg
[0] == 'n' )
5600 SET_IF_PARAM (params
, auth_type
);
5601 params
->auth_type
= OSPF_AUTH_NULL
;
5605 /* Handle message-digest authentication */
5606 if ( argv
[idx_encryption
]->arg
[0] == 'm' )
5608 SET_IF_PARAM (params
, auth_type
);
5609 params
->auth_type
= OSPF_AUTH_CRYPTOGRAPHIC
;
5613 vty_out (vty
, "You shouldn't get here!%s", VTY_NEWLINE
);
5617 DEFUN (ip_ospf_authentication
,
5618 ip_ospf_authentication_addr_cmd
,
5619 "ip ospf authentication [A.B.C.D]",
5621 "OSPF interface commands\n"
5622 "Enable authentication on this interface\n"
5623 "Address of interface")
5625 VTY_DECLVAR_CONTEXT(interface
, ifp
);
5627 struct in_addr addr
;
5629 struct ospf_if_params
*params
;
5631 params
= IF_DEF_PARAMS (ifp
);
5635 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
5638 vty_out (vty
, "Please specify interface address by A.B.C.D%s",
5643 params
= ospf_get_if_params (ifp
, addr
);
5644 ospf_if_update_params (ifp
, addr
);
5647 SET_IF_PARAM (params
, auth_type
);
5648 params
->auth_type
= OSPF_AUTH_SIMPLE
;
5653 DEFUN (no_ip_ospf_authentication_args
,
5654 no_ip_ospf_authentication_args_addr_cmd
,
5655 "no ip ospf authentication <null|message-digest> [A.B.C.D]",
5658 "OSPF interface commands\n"
5659 "Enable authentication on this interface\n"
5660 "Use null authentication\n"
5661 "Use message-digest authentication\n"
5662 "Address of interface")
5664 VTY_DECLVAR_CONTEXT(interface
, ifp
);
5665 int idx_encryption
= 4;
5667 struct in_addr addr
;
5669 struct ospf_if_params
*params
;
5670 struct route_node
*rn
;
5673 params
= IF_DEF_PARAMS (ifp
);
5677 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
5680 vty_out (vty
, "Please specify interface address by A.B.C.D%s",
5685 params
= ospf_lookup_if_params (ifp
, addr
);
5688 vty_out (vty
, "Ip Address specified is unknown%s", VTY_NEWLINE
);
5691 params
->auth_type
= OSPF_AUTH_NOTSET
;
5692 UNSET_IF_PARAM (params
, auth_type
);
5693 if (params
!= IF_DEF_PARAMS (ifp
))
5695 ospf_free_if_params (ifp
, addr
);
5696 ospf_if_update_params (ifp
, addr
);
5701 if ( argv
[idx_encryption
]->arg
[0] == 'n' )
5703 auth_type
= OSPF_AUTH_NULL
;
5705 else if ( argv
[idx_encryption
]->arg
[0] == 'm' )
5707 auth_type
= OSPF_AUTH_CRYPTOGRAPHIC
;
5711 vty_out (vty
, "Unexpected input encountered%s", VTY_NEWLINE
);
5715 * Here we have a case where the user has entered
5716 * 'no ip ospf authentication (null | message_digest )'
5717 * we need to find if we have any ip addresses underneath it that
5718 * correspond to the associated type.
5720 if (params
->auth_type
== auth_type
)
5722 params
->auth_type
= OSPF_AUTH_NOTSET
;
5723 UNSET_IF_PARAM (params
, auth_type
);
5726 for (rn
= route_top (IF_OIFS_PARAMS (ifp
)); rn
; rn
= route_next (rn
))
5728 if ((params
= rn
->info
))
5730 if (params
->auth_type
== auth_type
)
5732 params
->auth_type
= OSPF_AUTH_NOTSET
;
5733 UNSET_IF_PARAM (params
, auth_type
);
5734 if (params
!= IF_DEF_PARAMS (ifp
))
5736 ospf_free_if_params (ifp
, rn
->p
.u
.prefix4
);
5737 ospf_if_update_params(ifp
, rn
->p
.u
.prefix4
);
5747 DEFUN (no_ip_ospf_authentication
,
5748 no_ip_ospf_authentication_addr_cmd
,
5749 "no ip ospf authentication [A.B.C.D]",
5752 "OSPF interface commands\n"
5753 "Enable authentication on this interface\n"
5754 "Address of interface")
5756 VTY_DECLVAR_CONTEXT(interface
, ifp
);
5758 struct in_addr addr
;
5760 struct ospf_if_params
*params
;
5761 struct route_node
*rn
;
5763 params
= IF_DEF_PARAMS (ifp
);
5767 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
5770 vty_out (vty
, "Please specify interface address by A.B.C.D%s",
5775 params
= ospf_lookup_if_params (ifp
, addr
);
5778 vty_out (vty
, "Ip Address specified is unknown%s", VTY_NEWLINE
);
5782 params
->auth_type
= OSPF_AUTH_NOTSET
;
5783 UNSET_IF_PARAM (params
, auth_type
);
5784 if (params
!= IF_DEF_PARAMS (ifp
))
5786 ospf_free_if_params (ifp
, addr
);
5787 ospf_if_update_params (ifp
, addr
);
5793 * When a user enters 'no ip ospf authentication'
5794 * We should remove all authentication types from
5797 if ((params
->auth_type
== OSPF_AUTH_NULL
) ||
5798 (params
->auth_type
== OSPF_AUTH_CRYPTOGRAPHIC
) ||
5799 (params
->auth_type
== OSPF_AUTH_SIMPLE
))
5801 params
->auth_type
= OSPF_AUTH_NOTSET
;
5802 UNSET_IF_PARAM (params
, auth_type
);
5805 for (rn
= route_top (IF_OIFS_PARAMS (ifp
)); rn
; rn
= route_next (rn
))
5807 if ((params
= rn
->info
))
5810 if ((params
->auth_type
== OSPF_AUTH_NULL
) ||
5811 (params
->auth_type
== OSPF_AUTH_CRYPTOGRAPHIC
) ||
5812 (params
->auth_type
== OSPF_AUTH_SIMPLE
))
5814 params
->auth_type
= OSPF_AUTH_NOTSET
;
5815 UNSET_IF_PARAM (params
, auth_type
);
5816 if (params
!= IF_DEF_PARAMS (ifp
))
5818 ospf_free_if_params (ifp
, rn
->p
.u
.prefix4
);
5819 ospf_if_update_params(ifp
, rn
->p
.u
.prefix4
);
5830 DEFUN (ip_ospf_authentication_key
,
5831 ip_ospf_authentication_key_addr_cmd
,
5832 "ip ospf authentication-key AUTH_KEY [A.B.C.D]",
5834 "OSPF interface commands\n"
5835 "Authentication password (key)\n"
5836 "The OSPF password (key)\n"
5837 "Address of interface")
5839 VTY_DECLVAR_CONTEXT(interface
, ifp
);
5841 struct in_addr addr
;
5842 struct ospf_if_params
*params
;
5844 params
= IF_DEF_PARAMS (ifp
);
5846 if (argv_find (argv
, argc
, "A.B.C.D", &idx
))
5848 if (!inet_aton(argv
[idx
]->arg
, &addr
))
5850 vty_out (vty
, "Please specify interface address by A.B.C.D%s",
5855 params
= ospf_get_if_params (ifp
, addr
);
5856 ospf_if_update_params (ifp
, addr
);
5859 memset (params
->auth_simple
, 0, OSPF_AUTH_SIMPLE_SIZE
+ 1);
5860 strncpy ((char *) params
->auth_simple
, argv
[3]->arg
, OSPF_AUTH_SIMPLE_SIZE
);
5861 SET_IF_PARAM (params
, auth_simple
);
5866 DEFUN_HIDDEN (ospf_authentication_key
,
5867 ospf_authentication_key_cmd
,
5868 "ospf authentication-key AUTH_KEY [A.B.C.D]",
5869 "OSPF interface commands\n"
5870 "Authentication password (key)\n"
5871 "The OSPF password (key)\n"
5872 "Address of interface\n")
5874 return ip_ospf_authentication_key (self
, vty
, argc
, argv
);
5877 DEFUN (no_ip_ospf_authentication_key
,
5878 no_ip_ospf_authentication_key_authkey_addr_cmd
,
5879 "no ip ospf authentication-key [AUTH_KEY [A.B.C.D]]",
5882 "OSPF interface commands\n"
5883 "Authentication password (key)\n"
5884 "The OSPF password (key)")
5886 VTY_DECLVAR_CONTEXT(interface
, ifp
);
5888 struct in_addr addr
;
5889 struct ospf_if_params
*params
;
5890 params
= IF_DEF_PARAMS (ifp
);
5892 if (argv_find (argv
, argc
, "A.B.C.D", &idx
))
5894 if (!inet_aton(argv
[idx
]->arg
, &addr
))
5896 vty_out (vty
, "Please specify interface address by A.B.C.D%s",
5901 params
= ospf_lookup_if_params (ifp
, addr
);
5906 memset (params
->auth_simple
, 0, OSPF_AUTH_SIMPLE_SIZE
);
5907 UNSET_IF_PARAM (params
, auth_simple
);
5909 if (params
!= IF_DEF_PARAMS (ifp
))
5911 ospf_free_if_params (ifp
, addr
);
5912 ospf_if_update_params (ifp
, addr
);
5918 DEFUN_HIDDEN (no_ospf_authentication_key
,
5919 no_ospf_authentication_key_authkey_addr_cmd
,
5920 "no ospf authentication-key [AUTH_KEY [A.B.C.D]]",
5922 "OSPF interface commands\n"
5923 "Authentication password (key)\n"
5924 "The OSPF password (key)")
5926 return no_ip_ospf_authentication_key (self
, vty
, argc
, argv
);
5929 DEFUN (ip_ospf_message_digest_key
,
5930 ip_ospf_message_digest_key_cmd
,
5931 "ip ospf message-digest-key (1-255) md5 KEY [A.B.C.D]",
5933 "OSPF interface commands\n"
5934 "Message digest authentication password (key)\n"
5936 "Use MD5 algorithm\n"
5937 "The OSPF password (key)\n"
5938 "Address of interface\n")
5940 VTY_DECLVAR_CONTEXT(interface
, ifp
);
5941 struct crypt_key
*ck
;
5943 struct in_addr addr
;
5944 struct ospf_if_params
*params
;
5946 params
= IF_DEF_PARAMS (ifp
);
5949 argv_find (argv
, argc
, "(1-255)", &idx
);
5950 char *keyid
= argv
[idx
]->arg
;
5951 argv_find (argv
, argc
, "KEY", &idx
);
5952 char *cryptkey
= argv
[idx
]->arg
;
5954 if (argv_find (argv
, argc
, "A.B.C.D", &idx
))
5956 if (!inet_aton(argv
[idx
]->arg
, &addr
))
5958 vty_out (vty
, "Please specify interface address by A.B.C.D%s",
5963 params
= ospf_get_if_params (ifp
, addr
);
5964 ospf_if_update_params (ifp
, addr
);
5967 key_id
= strtol (keyid
, NULL
, 10);
5968 if (ospf_crypt_key_lookup (params
->auth_crypt
, key_id
) != NULL
)
5970 vty_out (vty
, "OSPF: Key %d already exists%s", key_id
, VTY_NEWLINE
);
5974 ck
= ospf_crypt_key_new ();
5975 ck
->key_id
= (u_char
) key_id
;
5976 memset (ck
->auth_key
, 0, OSPF_AUTH_MD5_SIZE
+1);
5977 strncpy ((char *) ck
->auth_key
, cryptkey
, OSPF_AUTH_MD5_SIZE
);
5979 ospf_crypt_key_add (params
->auth_crypt
, ck
);
5980 SET_IF_PARAM (params
, auth_crypt
);
5985 DEFUN_HIDDEN (ospf_message_digest_key
,
5986 ospf_message_digest_key_cmd
,
5987 "ospf message-digest-key (1-255) md5 KEY [A.B.C.D]",
5988 "OSPF interface commands\n"
5989 "Message digest authentication password (key)\n"
5991 "Use MD5 algorithm\n"
5992 "The OSPF password (key)\n"
5993 "Address of interface\n")
5995 return ip_ospf_message_digest_key (self
, vty
, argc
, argv
);
5998 DEFUN (no_ip_ospf_message_digest_key
,
5999 no_ip_ospf_message_digest_key_cmd
,
6000 "no ip ospf message-digest-key (1-255) [md5 KEY] [A.B.C.D]",
6003 "OSPF interface commands\n"
6004 "Message digest authentication password (key)\n"
6006 "Use MD5 algorithm\n"
6007 "The OSPF password (key)\n"
6008 "Address of interface\n")
6010 VTY_DECLVAR_CONTEXT(interface
, ifp
);
6012 struct crypt_key
*ck
;
6014 struct in_addr addr
;
6015 struct ospf_if_params
*params
;
6016 params
= IF_DEF_PARAMS (ifp
);
6018 argv_find (argv
, argc
, "(1-255)", &idx
);
6019 char *keyid
= argv
[idx
]->arg
;
6021 if (argv_find (argv
, argc
, "A.B.C.D", &idx
))
6023 if (!inet_aton(argv
[idx
]->arg
, &addr
))
6025 vty_out (vty
, "Please specify interface address by A.B.C.D%s",
6030 params
= ospf_lookup_if_params (ifp
, addr
);
6035 key_id
= strtol (keyid
, NULL
, 10);
6036 ck
= ospf_crypt_key_lookup (params
->auth_crypt
, key_id
);
6039 vty_out (vty
, "OSPF: Key %d does not exist%s", key_id
, VTY_NEWLINE
);
6043 ospf_crypt_key_delete (params
->auth_crypt
, key_id
);
6045 if (params
!= IF_DEF_PARAMS (ifp
))
6047 ospf_free_if_params (ifp
, addr
);
6048 ospf_if_update_params (ifp
, addr
);
6054 DEFUN_HIDDEN (no_ospf_message_digest_key
,
6055 no_ospf_message_digest_key_cmd
,
6056 "no ospf message-digest-key (1-255) [md5 KEY] [A.B.C.D]",
6058 "OSPF interface commands\n"
6059 "Message digest authentication password (key)\n"
6061 "Address of interface")
6063 return no_ip_ospf_message_digest_key (self
, vty
, argc
, argv
);
6066 DEFUN (ip_ospf_cost
,
6068 "ip ospf cost (1-65535) [A.B.C.D]",
6070 "OSPF interface commands\n"
6073 "Address of interface\n")
6075 VTY_DECLVAR_CONTEXT(interface
, ifp
);
6078 struct in_addr addr
;
6079 struct ospf_if_params
*params
;
6080 params
= IF_DEF_PARAMS (ifp
);
6083 char *coststr
= NULL
, *ifaddr
= NULL
;
6084 coststr
= argv_find (argv
, argc
, "(1-65535)", &idx
) ? argv
[idx
]->arg
: NULL
;
6085 ifaddr
= argv_find (argv
, argc
, "A.B.C.D", &idx
) ? argv
[idx
]->arg
: NULL
;
6087 cost
= strtol (coststr
, NULL
, 10);
6091 if(!inet_aton(ifaddr
, &addr
))
6093 vty_out (vty
, "Please specify interface address by A.B.C.D%s",
6098 params
= ospf_get_if_params (ifp
, addr
);
6099 ospf_if_update_params (ifp
, addr
);
6102 SET_IF_PARAM (params
, output_cost_cmd
);
6103 params
->output_cost_cmd
= cost
;
6105 ospf_if_recalculate_output_cost (ifp
);
6110 DEFUN_HIDDEN (ospf_cost
,
6112 "ospf cost (1-65535) [A.B.C.D]",
6113 "OSPF interface commands\n"
6116 "Address of interface\n")
6118 return ip_ospf_cost (self
, vty
, argc
, argv
);
6121 DEFUN (no_ip_ospf_cost
,
6122 no_ip_ospf_cost_cmd
,
6123 "no ip ospf cost [(1-65535)] [A.B.C.D]",
6125 "OSPF interface commands\n"
6127 "Address of interface")
6129 VTY_DECLVAR_CONTEXT(interface
, ifp
);
6131 struct in_addr addr
;
6132 struct ospf_if_params
*params
;
6134 params
= IF_DEF_PARAMS (ifp
);
6137 char *ifaddr
= NULL
;
6138 ifaddr
= argv_find (argv
, argc
, "A.B.C.D", &idx
) ? argv
[idx
]->arg
: NULL
;
6140 /* According to the semantics we are mimicking "no ip ospf cost N" is
6141 * always treated as "no ip ospf cost" regardless of the actual value
6142 * of N already configured for the interface. Thus ignore cost. */
6146 if (!inet_aton(ifaddr
, &addr
))
6148 vty_out (vty
, "Please specify interface address by A.B.C.D%s",
6153 params
= ospf_lookup_if_params (ifp
, addr
);
6158 UNSET_IF_PARAM (params
, output_cost_cmd
);
6160 if (params
!= IF_DEF_PARAMS (ifp
))
6162 ospf_free_if_params (ifp
, addr
);
6163 ospf_if_update_params (ifp
, addr
);
6166 ospf_if_recalculate_output_cost (ifp
);
6171 DEFUN_HIDDEN (no_ospf_cost
,
6173 "no ospf cost [(1-65535)] [A.B.C.D]",
6175 "OSPF interface commands\n"
6178 "Address of interface\n")
6180 return no_ip_ospf_cost (self
, vty
, argc
, argv
);
6184 ospf_nbr_timer_update (struct ospf_interface
*oi
)
6186 struct route_node
*rn
;
6187 struct ospf_neighbor
*nbr
;
6189 for (rn
= route_top (oi
->nbrs
); rn
; rn
= route_next (rn
))
6190 if ((nbr
= rn
->info
))
6192 nbr
->v_inactivity
= OSPF_IF_PARAM (oi
, v_wait
);
6193 nbr
->v_db_desc
= OSPF_IF_PARAM (oi
, retransmit_interval
);
6194 nbr
->v_ls_req
= OSPF_IF_PARAM (oi
, retransmit_interval
);
6195 nbr
->v_ls_upd
= OSPF_IF_PARAM (oi
, retransmit_interval
);
6200 ospf_vty_dead_interval_set (struct vty
*vty
, const char *interval_str
,
6201 const char *nbr_str
,
6202 const char *fast_hello_str
)
6204 VTY_DECLVAR_CONTEXT(interface
, ifp
);
6207 struct in_addr addr
;
6209 struct ospf_if_params
*params
;
6210 struct ospf_interface
*oi
;
6211 struct route_node
*rn
;
6213 params
= IF_DEF_PARAMS (ifp
);
6217 ret
= inet_aton(nbr_str
, &addr
);
6220 vty_out (vty
, "Please specify interface address by A.B.C.D%s",
6225 params
= ospf_get_if_params (ifp
, addr
);
6226 ospf_if_update_params (ifp
, addr
);
6231 VTY_GET_INTEGER_RANGE ("Router Dead Interval", seconds
, interval_str
,
6234 /* reset fast_hello too, just to be sure */
6235 UNSET_IF_PARAM (params
, fast_hello
);
6236 params
->fast_hello
= OSPF_FAST_HELLO_DEFAULT
;
6238 else if (fast_hello_str
)
6240 VTY_GET_INTEGER_RANGE ("Hello Multiplier", hellomult
, fast_hello_str
,
6242 /* 1s dead-interval with sub-second hellos desired */
6243 seconds
= OSPF_ROUTER_DEAD_INTERVAL_MINIMAL
;
6244 SET_IF_PARAM (params
, fast_hello
);
6245 params
->fast_hello
= hellomult
;
6249 vty_out (vty
, "Please specify dead-interval or hello-multiplier%s",
6254 SET_IF_PARAM (params
, v_wait
);
6255 params
->v_wait
= seconds
;
6257 /* Update timer values in neighbor structure. */
6261 if ((ospf
= ospf_lookup()))
6263 oi
= ospf_if_lookup_by_local_addr (ospf
, ifp
, addr
);
6265 ospf_nbr_timer_update (oi
);
6270 for (rn
= route_top (IF_OIFS (ifp
)); rn
; rn
= route_next (rn
))
6271 if ((oi
= rn
->info
))
6272 ospf_nbr_timer_update (oi
);
6278 DEFUN (ip_ospf_dead_interval
,
6279 ip_ospf_dead_interval_cmd
,
6280 "ip ospf dead-interval (1-65535) [A.B.C.D]",
6282 "OSPF interface commands\n"
6283 "Interval time after which a neighbor is declared down\n"
6285 "Address of interface\n")
6288 char *interval
= argv_find (argv
, argc
, "(1-65535)", &idx
) ? argv
[idx
]->arg
: NULL
;
6289 char *ifaddr
= argv_find (argv
, argc
, "A.B.C.D", &idx
) ? argv
[idx
]->arg
: NULL
;
6290 return ospf_vty_dead_interval_set (vty
, interval
, ifaddr
, NULL
);
6294 DEFUN_HIDDEN (ospf_dead_interval
,
6295 ospf_dead_interval_cmd
,
6296 "ospf dead-interval (1-65535) [A.B.C.D]",
6297 "OSPF interface commands\n"
6298 "Interval time after which a neighbor is declared down\n"
6300 "Address of interface\n")
6302 return ip_ospf_dead_interval (self
, vty
, argc
, argv
);
6305 DEFUN (ip_ospf_dead_interval_minimal
,
6306 ip_ospf_dead_interval_minimal_addr_cmd
,
6307 "ip ospf dead-interval minimal hello-multiplier (1-10) [A.B.C.D]",
6309 "OSPF interface commands\n"
6310 "Interval time after which a neighbor is declared down\n"
6311 "Minimal 1s dead-interval with fast sub-second hellos\n"
6312 "Hello multiplier factor\n"
6313 "Number of Hellos to send each second\n"
6314 "Address of interface\n")
6319 return ospf_vty_dead_interval_set (vty
, NULL
, argv
[idx_ipv4
]->arg
, argv
[idx_number
]->arg
);
6321 return ospf_vty_dead_interval_set (vty
, NULL
, NULL
, argv
[idx_number
]->arg
);
6324 DEFUN (no_ip_ospf_dead_interval
,
6325 no_ip_ospf_dead_interval_cmd
,
6326 "no ip ospf dead-interval [<(1-65535)|minimal hello-multiplier (1-10)> [A.B.C.D]]",
6329 "OSPF interface commands\n"
6330 "Interval time after which a neighbor is declared down\n"
6332 "Address of interface")
6334 VTY_DECLVAR_CONTEXT(interface
, ifp
);
6335 int idx_ipv4
= argc
- 1;
6336 struct in_addr addr
;
6338 struct ospf_if_params
*params
;
6339 struct ospf_interface
*oi
;
6340 struct route_node
*rn
;
6342 params
= IF_DEF_PARAMS (ifp
);
6344 if (argv
[idx_ipv4
]->type
== IPV4_TKN
)
6346 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
6349 vty_out (vty
, "Please specify interface address by A.B.C.D%s",
6354 params
= ospf_lookup_if_params (ifp
, addr
);
6359 UNSET_IF_PARAM (params
, v_wait
);
6360 params
->v_wait
= OSPF_ROUTER_DEAD_INTERVAL_DEFAULT
;
6362 UNSET_IF_PARAM (params
, fast_hello
);
6363 params
->fast_hello
= OSPF_FAST_HELLO_DEFAULT
;
6365 if (params
!= IF_DEF_PARAMS (ifp
))
6367 ospf_free_if_params (ifp
, addr
);
6368 ospf_if_update_params (ifp
, addr
);
6371 /* Update timer values in neighbor structure. */
6376 if ((ospf
= ospf_lookup()))
6378 oi
= ospf_if_lookup_by_local_addr (ospf
, ifp
, addr
);
6380 ospf_nbr_timer_update (oi
);
6385 for (rn
= route_top (IF_OIFS (ifp
)); rn
; rn
= route_next (rn
))
6386 if ((oi
= rn
->info
))
6387 ospf_nbr_timer_update (oi
);
6393 DEFUN_HIDDEN (no_ospf_dead_interval
,
6394 no_ospf_dead_interval_cmd
,
6395 "no ospf dead-interval [<(1-65535)|minimal hello-multiplier (1-10)> [A.B.C.D]]",
6397 "OSPF interface commands\n"
6398 "Interval time after which a neighbor is declared down\n"
6400 "Address of interface")
6402 return no_ip_ospf_dead_interval (self
, vty
, argc
, argv
);
6405 DEFUN (ip_ospf_hello_interval
,
6406 ip_ospf_hello_interval_cmd
,
6407 "ip ospf hello-interval (1-65535) [A.B.C.D]",
6409 "OSPF interface commands\n"
6410 "Time between HELLO packets\n"
6412 "Address of interface\n")
6414 VTY_DECLVAR_CONTEXT(interface
, ifp
);
6416 struct in_addr addr
;
6417 struct ospf_if_params
*params
;
6418 params
= IF_DEF_PARAMS (ifp
);
6419 u_int32_t seconds
= 0;
6421 argv_find (argv
, argc
, "(1-65535)", &idx
);
6422 seconds
= strtol (argv
[idx
]->arg
, NULL
, 10);
6424 if (argv_find (argv
, argc
, "A.B.C.D", &idx
))
6426 if(!inet_aton(argv
[idx
]->arg
, &addr
))
6428 vty_out (vty
, "Please specify interface address by A.B.C.D%s",
6433 params
= ospf_get_if_params (ifp
, addr
);
6434 ospf_if_update_params (ifp
, addr
);
6437 SET_IF_PARAM (params
, v_hello
);
6438 params
->v_hello
= seconds
;
6443 DEFUN_HIDDEN (ospf_hello_interval
,
6444 ospf_hello_interval_cmd
,
6445 "ospf hello-interval (1-65535) [A.B.C.D]",
6446 "OSPF interface commands\n"
6447 "Time between HELLO packets\n"
6449 "Address of interface\n")
6451 return ip_ospf_hello_interval (self
, vty
, argc
, argv
);
6454 DEFUN (no_ip_ospf_hello_interval
,
6455 no_ip_ospf_hello_interval_cmd
,
6456 "no ip ospf hello-interval [(1-65535) [A.B.C.D]]",
6459 "OSPF interface commands\n"
6460 "Time between HELLO packets\n" // ignored
6462 "Address of interface\n")
6464 VTY_DECLVAR_CONTEXT(interface
, ifp
);
6466 struct in_addr addr
;
6467 struct ospf_if_params
*params
;
6468 params
= IF_DEF_PARAMS (ifp
);
6470 if (argv_find (argv
, argc
, "A.B.C.D", &idx
))
6472 if(!inet_aton(argv
[idx
]->arg
, &addr
))
6474 vty_out (vty
, "Please specify interface address by A.B.C.D%s",
6479 params
= ospf_lookup_if_params (ifp
, addr
);
6484 UNSET_IF_PARAM (params
, v_hello
);
6485 params
->v_hello
= OSPF_HELLO_INTERVAL_DEFAULT
;
6487 if (params
!= IF_DEF_PARAMS (ifp
))
6489 ospf_free_if_params (ifp
, addr
);
6490 ospf_if_update_params (ifp
, addr
);
6496 DEFUN_HIDDEN (no_ospf_hello_interval
,
6497 no_ospf_hello_interval_cmd
,
6498 "no ospf hello-interval [(1-65535) [A.B.C.D]]",
6500 "OSPF interface commands\n"
6501 "Time between HELLO packets\n" // ignored
6503 "Address of interface\n")
6505 return no_ip_ospf_hello_interval (self
, vty
, argc
, argv
);
6508 DEFUN (ip_ospf_network
,
6509 ip_ospf_network_cmd
,
6510 "ip ospf network <broadcast|non-broadcast|point-to-multipoint|point-to-point>",
6512 "OSPF interface commands\n"
6514 "Specify OSPF broadcast multi-access network\n"
6515 "Specify OSPF NBMA network\n"
6516 "Specify OSPF point-to-multipoint network\n"
6517 "Specify OSPF point-to-point network\n")
6519 VTY_DECLVAR_CONTEXT(interface
, ifp
);
6521 int old_type
= IF_DEF_PARAMS (ifp
)->type
;
6522 struct route_node
*rn
;
6524 if (old_type
== OSPF_IFTYPE_LOOPBACK
)
6526 vty_out (vty
, "This is a loopback interface. Can't set network type.%s", VTY_NEWLINE
);
6530 if (argv_find (argv
, argc
, "broadcast", &idx
))
6531 IF_DEF_PARAMS (ifp
)->type
= OSPF_IFTYPE_BROADCAST
;
6532 else if (argv_find (argv
, argc
, "non-broadcast", &idx
))
6533 IF_DEF_PARAMS (ifp
)->type
= OSPF_IFTYPE_NBMA
;
6534 else if (argv_find (argv
, argc
, "point-to-multipoint", &idx
))
6535 IF_DEF_PARAMS (ifp
)->type
= OSPF_IFTYPE_POINTOMULTIPOINT
;
6536 else if (argv_find (argv
, argc
, "point-to-point", &idx
))
6537 IF_DEF_PARAMS (ifp
)->type
= OSPF_IFTYPE_POINTOPOINT
;
6539 if (IF_DEF_PARAMS (ifp
)->type
== old_type
)
6542 SET_IF_PARAM (IF_DEF_PARAMS (ifp
), type
);
6544 for (rn
= route_top (IF_OIFS (ifp
)); rn
; rn
= route_next (rn
))
6546 struct ospf_interface
*oi
= rn
->info
;
6551 oi
->type
= IF_DEF_PARAMS (ifp
)->type
;
6553 if (oi
->state
> ISM_Down
)
6555 OSPF_ISM_EVENT_EXECUTE (oi
, ISM_InterfaceDown
);
6556 OSPF_ISM_EVENT_EXECUTE (oi
, ISM_InterfaceUp
);
6563 DEFUN_HIDDEN (ospf_network
,
6565 "ospf network <broadcast|non-broadcast|point-to-multipoint|point-to-point>",
6566 "OSPF interface commands\n"
6568 "Specify OSPF broadcast multi-access network\n"
6569 "Specify OSPF NBMA network\n"
6570 "Specify OSPF point-to-multipoint network\n"
6571 "Specify OSPF point-to-point network\n")
6573 return ip_ospf_network (self
, vty
, argc
, argv
);
6576 DEFUN (no_ip_ospf_network
,
6577 no_ip_ospf_network_cmd
,
6578 "no ip ospf network [<broadcast|non-broadcast|point-to-multipoint|point-to-point>]",
6581 "OSPF interface commands\n"
6583 "Specify OSPF broadcast multi-access network\n"
6584 "Specify OSPF NBMA network\n"
6585 "Specify OSPF point-to-multipoint network\n"
6586 "Specify OSPF point-to-point network\n")
6588 VTY_DECLVAR_CONTEXT(interface
, ifp
);
6589 int old_type
= IF_DEF_PARAMS (ifp
)->type
;
6590 struct route_node
*rn
;
6592 IF_DEF_PARAMS (ifp
)->type
= ospf_default_iftype(ifp
);
6594 if (IF_DEF_PARAMS (ifp
)->type
== old_type
)
6597 for (rn
= route_top (IF_OIFS (ifp
)); rn
; rn
= route_next (rn
))
6599 struct ospf_interface
*oi
= rn
->info
;
6604 oi
->type
= IF_DEF_PARAMS (ifp
)->type
;
6606 if (oi
->state
> ISM_Down
)
6608 OSPF_ISM_EVENT_EXECUTE (oi
, ISM_InterfaceDown
);
6609 OSPF_ISM_EVENT_EXECUTE (oi
, ISM_InterfaceUp
);
6616 DEFUN_HIDDEN (no_ospf_network
,
6617 no_ospf_network_cmd
,
6618 "no ospf network [<broadcast|non-broadcast|point-to-multipoint|point-to-point>]",
6620 "OSPF interface commands\n"
6622 "Specify OSPF broadcast multi-access network\n"
6623 "Specify OSPF NBMA network\n"
6624 "Specify OSPF point-to-multipoint network\n"
6625 "Specify OSPF point-to-point network\n")
6627 return no_ip_ospf_network (self
, vty
, argc
, argv
);
6630 DEFUN (ip_ospf_priority
,
6631 ip_ospf_priority_cmd
,
6632 "ip ospf priority (0-255) [A.B.C.D]",
6634 "OSPF interface commands\n"
6637 "Address of interface")
6639 VTY_DECLVAR_CONTEXT(interface
, ifp
);
6642 struct route_node
*rn
;
6643 struct in_addr addr
;
6644 struct ospf_if_params
*params
;
6645 params
= IF_DEF_PARAMS (ifp
);
6647 argv_find (argv
, argc
, "(0-255)", &idx
);
6648 priority
= strtol (argv
[idx
]->arg
, NULL
, 10);
6650 if (argv_find (argv
, argc
, "A.B.C.D", &idx
))
6652 if (!inet_aton(argv
[idx
]->arg
, &addr
))
6654 vty_out (vty
, "Please specify interface address by A.B.C.D%s",
6659 params
= ospf_get_if_params (ifp
, addr
);
6660 ospf_if_update_params (ifp
, addr
);
6663 SET_IF_PARAM (params
, priority
);
6664 params
->priority
= priority
;
6666 for (rn
= route_top (IF_OIFS (ifp
)); rn
; rn
= route_next (rn
))
6668 struct ospf_interface
*oi
= rn
->info
;
6673 if (PRIORITY (oi
) != OSPF_IF_PARAM (oi
, priority
))
6675 PRIORITY (oi
) = OSPF_IF_PARAM (oi
, priority
);
6676 OSPF_ISM_EVENT_SCHEDULE (oi
, ISM_NeighborChange
);
6683 DEFUN_HIDDEN (ospf_priority
,
6685 "ospf priority (0-255) [A.B.C.D]",
6686 "OSPF interface commands\n"
6689 "Address of interface")
6691 return ip_ospf_priority (self
, vty
, argc
, argv
);
6694 DEFUN (no_ip_ospf_priority
,
6695 no_ip_ospf_priority_cmd
,
6696 "no ip ospf priority [(0-255) [A.B.C.D]]",
6699 "OSPF interface commands\n"
6700 "Router priority\n" // ignored
6702 "Address of interface")
6704 VTY_DECLVAR_CONTEXT(interface
, ifp
);
6706 struct route_node
*rn
;
6707 struct in_addr addr
;
6708 struct ospf_if_params
*params
;
6710 params
= IF_DEF_PARAMS (ifp
);
6712 if (argv_find (argv
, argc
, "A.B.C.D", &idx
))
6714 if (!inet_aton(argv
[idx
]->arg
, &addr
))
6716 vty_out (vty
, "Please specify interface address by A.B.C.D%s",
6721 params
= ospf_lookup_if_params (ifp
, addr
);
6726 UNSET_IF_PARAM (params
, priority
);
6727 params
->priority
= OSPF_ROUTER_PRIORITY_DEFAULT
;
6729 if (params
!= IF_DEF_PARAMS (ifp
))
6731 ospf_free_if_params (ifp
, addr
);
6732 ospf_if_update_params (ifp
, addr
);
6735 for (rn
= route_top (IF_OIFS (ifp
)); rn
; rn
= route_next (rn
))
6737 struct ospf_interface
*oi
= rn
->info
;
6742 if (PRIORITY (oi
) != OSPF_IF_PARAM (oi
, priority
))
6744 PRIORITY (oi
) = OSPF_IF_PARAM (oi
, priority
);
6745 OSPF_ISM_EVENT_SCHEDULE (oi
, ISM_NeighborChange
);
6752 DEFUN_HIDDEN (no_ospf_priority
,
6753 no_ospf_priority_cmd
,
6754 "no ospf priority [(0-255) [A.B.C.D]]",
6756 "OSPF interface commands\n"
6759 "Address of interface")
6761 return no_ip_ospf_priority (self
, vty
, argc
, argv
);
6764 DEFUN (ip_ospf_retransmit_interval
,
6765 ip_ospf_retransmit_interval_addr_cmd
,
6766 "ip ospf retransmit-interval (3-65535) [A.B.C.D]",
6768 "OSPF interface commands\n"
6769 "Time between retransmitting lost link state advertisements\n"
6771 "Address of interface")
6773 VTY_DECLVAR_CONTEXT(interface
, ifp
);
6776 struct in_addr addr
;
6777 struct ospf_if_params
*params
;
6778 params
= IF_DEF_PARAMS (ifp
);
6780 argv_find (argv
, argc
, "(3-65535)", &idx
);
6781 seconds
= strtol (argv
[idx
]->arg
, NULL
, 10);
6783 if (argv_find (argv
, argc
, "A.B.C.D", &idx
))
6785 if (!inet_aton(argv
[idx
]->arg
, &addr
))
6787 vty_out (vty
, "Please specify interface address by A.B.C.D%s",
6792 params
= ospf_get_if_params (ifp
, addr
);
6793 ospf_if_update_params (ifp
, addr
);
6796 SET_IF_PARAM (params
, retransmit_interval
);
6797 params
->retransmit_interval
= seconds
;
6802 DEFUN_HIDDEN (ospf_retransmit_interval
,
6803 ospf_retransmit_interval_cmd
,
6804 "ospf retransmit-interval (3-65535) [A.B.C.D]",
6805 "OSPF interface commands\n"
6806 "Time between retransmitting lost link state advertisements\n"
6808 "Address of interface")
6810 return ip_ospf_retransmit_interval (self
, vty
, argc
, argv
);
6813 DEFUN (no_ip_ospf_retransmit_interval
,
6814 no_ip_ospf_retransmit_interval_addr_cmd
,
6815 "no ip ospf retransmit-interval [(3-65535)] [A.B.C.D]",
6818 "OSPF interface commands\n"
6819 "Time between retransmitting lost link state advertisements\n"
6821 "Address of interface\n")
6823 VTY_DECLVAR_CONTEXT(interface
, ifp
);
6825 struct in_addr addr
;
6826 struct ospf_if_params
*params
;
6828 params
= IF_DEF_PARAMS (ifp
);
6830 if (argv_find (argv
, argc
, "A.B.C.D", &idx
))
6832 if (!inet_aton(argv
[idx
]->arg
, &addr
))
6834 vty_out (vty
, "Please specify interface address by A.B.C.D%s",
6839 params
= ospf_lookup_if_params (ifp
, addr
);
6844 UNSET_IF_PARAM (params
, retransmit_interval
);
6845 params
->retransmit_interval
= OSPF_RETRANSMIT_INTERVAL_DEFAULT
;
6847 if (params
!= IF_DEF_PARAMS (ifp
))
6849 ospf_free_if_params (ifp
, addr
);
6850 ospf_if_update_params (ifp
, addr
);
6856 DEFUN_HIDDEN (no_ospf_retransmit_interval
,
6857 no_ospf_retransmit_interval_cmd
,
6858 "no ospf retransmit-interval [(3-65535)] [A.B.C.D]",
6860 "OSPF interface commands\n"
6861 "Time between retransmitting lost link state advertisements\n"
6863 "Address of interface\n")
6865 return no_ip_ospf_retransmit_interval (self
, vty
, argc
, argv
);
6868 DEFUN (ip_ospf_transmit_delay
,
6869 ip_ospf_transmit_delay_addr_cmd
,
6870 "ip ospf transmit-delay (1-65535) [A.B.C.D]",
6872 "OSPF interface commands\n"
6873 "Link state transmit delay\n"
6875 "Address of interface")
6877 VTY_DECLVAR_CONTEXT(interface
, ifp
);
6880 struct in_addr addr
;
6881 struct ospf_if_params
*params
;
6883 params
= IF_DEF_PARAMS (ifp
);
6884 argv_find (argv
, argc
, "(1-65535)", &idx
);
6885 seconds
= strtol (argv
[idx
]->arg
, NULL
, 10);
6887 if (argv_find (argv
, argc
, "A.B.C.D", &idx
))
6889 if (!inet_aton(argv
[idx
]->arg
, &addr
))
6891 vty_out (vty
, "Please specify interface address by A.B.C.D%s",
6896 params
= ospf_get_if_params (ifp
, addr
);
6897 ospf_if_update_params (ifp
, addr
);
6900 SET_IF_PARAM (params
, transmit_delay
);
6901 params
->transmit_delay
= seconds
;
6906 DEFUN_HIDDEN (ospf_transmit_delay
,
6907 ospf_transmit_delay_cmd
,
6908 "ospf transmit-delay (1-65535) [A.B.C.D]",
6909 "OSPF interface commands\n"
6910 "Link state transmit delay\n"
6912 "Address of interface")
6914 return ip_ospf_transmit_delay (self
, vty
, argc
, argv
);
6917 DEFUN (no_ip_ospf_transmit_delay
,
6918 no_ip_ospf_transmit_delay_addr_cmd
,
6919 "no ip ospf transmit-delay [(1-65535)] [A.B.C.D]",
6922 "OSPF interface commands\n"
6923 "Link state transmit delay\n"
6924 "Address of interface")
6926 VTY_DECLVAR_CONTEXT(interface
, ifp
);
6928 struct in_addr addr
;
6929 struct ospf_if_params
*params
;
6931 params
= IF_DEF_PARAMS (ifp
);
6933 if (argv_find (argv
, argc
, "A.B.C.D", &idx
))
6935 if (!inet_aton(argv
[idx
]->arg
, &addr
))
6937 vty_out (vty
, "Please specify interface address by A.B.C.D%s",
6942 params
= ospf_lookup_if_params (ifp
, addr
);
6947 UNSET_IF_PARAM (params
, transmit_delay
);
6948 params
->transmit_delay
= OSPF_TRANSMIT_DELAY_DEFAULT
;
6950 if (params
!= IF_DEF_PARAMS (ifp
))
6952 ospf_free_if_params (ifp
, addr
);
6953 ospf_if_update_params (ifp
, addr
);
6960 DEFUN_HIDDEN (no_ospf_transmit_delay
,
6961 no_ospf_transmit_delay_cmd
,
6962 "no ospf transmit-delay",
6964 "OSPF interface commands\n"
6965 "Link state transmit delay\n")
6967 return no_ip_ospf_transmit_delay (self
, vty
, argc
, argv
);
6970 DEFUN (ip_ospf_area
,
6972 "ip ospf [(1-65535)] area <A.B.C.D|(0-4294967295)>",
6974 "OSPF interface commands\n"
6976 "Enable OSPF on this interface\n"
6977 "OSPF area ID in IP address format\n"
6978 "OSPF area ID as a decimal value\n")
6980 VTY_DECLVAR_CONTEXT(interface
, ifp
);
6983 struct in_addr area_id
;
6985 struct ospf_if_params
*params
;
6986 struct route_node
*rn
;
6987 u_short instance
= 0;
6989 if (argv_find (argv
, argc
, "(1-65535)", &idx
))
6990 instance
= strtol (argv
[idx
]->arg
, NULL
, 10);
6991 char *areaid
= argv
[argc
- 1]->arg
;
6993 ospf
= ospf_lookup_instance (instance
);
6996 params
= IF_DEF_PARAMS (ifp
);
6997 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
))
6999 ospf_interface_unset (ifp
);
7000 ospf
= ospf_lookup();
7001 ospf
->if_ospf_cli_count
--;
7006 ret
= ospf_str2area_id (areaid
, &area_id
, &format
);
7009 vty_out (vty
, "Please specify area by A.B.C.D|<0-4294967295>%s",
7013 if (memcmp (ifp
->name
, "VLINK", 5) == 0)
7015 vty_out (vty
, "Cannot enable OSPF on a virtual link.%s", VTY_NEWLINE
);
7019 params
= IF_DEF_PARAMS (ifp
);
7020 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
))
7023 "Must remove previous area config before changing ospf area %s",
7028 for (rn
= route_top (ospf
->networks
); rn
; rn
= route_next (rn
))
7030 if (rn
->info
!= NULL
)
7032 vty_out (vty
, "Please remove all network commands first.%s", VTY_NEWLINE
);
7037 /* enable ospf on this interface with area_id */
7038 ospf_interface_set (ifp
, area_id
);
7039 ospf
->if_ospf_cli_count
++;
7044 DEFUN (no_ip_ospf_area
,
7045 no_ip_ospf_area_cmd
,
7046 "no ip ospf [(1-65535)] area [<A.B.C.D|(0-4294967295)>]",
7049 "OSPF interface commands\n"
7051 "Disable OSPF on this interface\n"
7052 "OSPF area ID in IP address format\n"
7053 "OSPF area ID as a decimal value\n")
7055 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7058 struct ospf_if_params
*params
;
7059 u_short instance
= 0;
7061 if (argv_find (argv
, argc
, "(1-65535)", &idx
))
7062 instance
= strtol (argv
[idx
]->arg
, NULL
, 10);
7064 if ((ospf
= ospf_lookup_instance (instance
)) == NULL
)
7067 params
= IF_DEF_PARAMS (ifp
);
7068 if (!OSPF_IF_PARAM_CONFIGURED(params
, if_area
))
7070 vty_out (vty
, "Can't find specified interface area configuration.%s", VTY_NEWLINE
);
7074 ospf_interface_unset (ifp
);
7075 ospf
->if_ospf_cli_count
--;
7079 DEFUN (ospf_redistribute_source
,
7080 ospf_redistribute_source_cmd
,
7081 "redistribute " FRR_REDIST_STR_OSPFD
" [<metric (0-16777214)|metric-type (1-2)|route-map WORD>]",
7083 FRR_REDIST_HELP_STR_OSPFD
7084 "Metric for redistributed routes\n"
7085 "OSPF default metric\n"
7086 "OSPF exterior metric type for redistributed routes\n"
7087 "Set OSPF External Type 1 metrics\n"
7088 "Set OSPF External Type 2 metrics\n"
7089 "Route map reference\n"
7090 "Pointer to route-map entries\n")
7092 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
7093 int idx_protocol
= 1;
7097 struct ospf_redist
*red
;
7103 /* Get distribute source. */
7104 source
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
7108 red
= ospf_redist_add(ospf
, source
, 0);
7110 /* Get metric value. */
7111 if (argv_find (argv
, argc
, "(0-16777214)", &idx
)) {
7112 if (!str2metric (argv
[idx
]->arg
, &metric
))
7115 /* Get metric type. */
7116 else if (argv_find (argv
, argc
, "(1-2)", &idx
)) {
7117 if (!str2metric_type (argv
[idx
]->arg
, &type
))
7121 else if (argv_find (argv
, argc
, "WORD", &idx
)) {
7122 ospf_routemap_set (red
, argv
[idx
]->arg
);
7125 ospf_routemap_unset (red
);
7127 return ospf_redistribute_set (ospf
, source
, 0, type
, metric
);
7130 DEFUN (no_ospf_redistribute_source
,
7131 no_ospf_redistribute_source_cmd
,
7132 "no redistribute " FRR_REDIST_STR_OSPFD
" [<metric (0-16777214)|metric-type (1-2)|route-map WORD>]",
7135 FRR_REDIST_HELP_STR_OSPFD
7136 "Metric for redistributed routes\n"
7137 "OSPF default metric\n"
7138 "OSPF exterior metric type for redistributed routes\n"
7139 "Set OSPF External Type 1 metrics\n"
7140 "Set OSPF External Type 2 metrics\n"
7141 "Route map reference\n"
7142 "Pointer to route-map entries\n")
7144 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
7145 int idx_protocol
= 2;
7147 struct ospf_redist
*red
;
7149 source
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
7153 red
= ospf_redist_lookup(ospf
, source
, 0);
7157 ospf_routemap_unset (red
);
7158 return ospf_redistribute_unset (ospf
, source
, 0);
7161 DEFUN (ospf_redistribute_instance_source
,
7162 ospf_redistribute_instance_source_cmd
,
7163 "redistribute <ospf|table> (1-65535) [<metric (0-16777214)|metric-type (1-2)|route-map WORD>]",
7165 "Open Shortest Path First\n"
7166 "Non-main Kernel Routing Table\n"
7167 "Instance ID/Table ID\n"
7168 "Metric for redistributed routes\n"
7169 "OSPF default metric\n"
7170 "OSPF exterior metric type for redistributed routes\n"
7171 "Set OSPF External Type 1 metrics\n"
7172 "Set OSPF External Type 2 metrics\n"
7173 "Route map reference\n"
7174 "Pointer to route-map entries\n")
7176 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
7177 int idx_ospf_table
= 1;
7179 int idx_redist_param
= 3;
7184 struct ospf_redist
*red
;
7189 source
= proto_redistnum (AFI_IP
, argv
[idx_ospf_table
]->text
);
7191 VTY_GET_INTEGER ("Instance ID", instance
, argv
[idx_number
]->arg
);
7196 if ((source
== ZEBRA_ROUTE_OSPF
) && !ospf
->instance
)
7198 vty_out (vty
, "Instance redistribution in non-instanced OSPF not allowed%s",
7203 if ((source
== ZEBRA_ROUTE_OSPF
) && (ospf
->instance
== instance
))
7205 vty_out (vty
, "Same instance OSPF redistribution not allowed%s",
7210 /* Get metric value. */
7211 if (strcmp (argv
[idx_redist_param
]->arg
, "metric") == 0)
7212 if (!str2metric (argv
[idx_redist_param
+1]->arg
, &metric
))
7215 /* Get metric type. */
7216 if (strcmp (argv
[idx_redist_param
]->arg
, "metric-type") == 0)
7217 if (!str2metric_type (argv
[idx_redist_param
+1]->arg
, &type
))
7220 red
= ospf_redist_add(ospf
, source
, instance
);
7222 if (strcmp (argv
[idx_redist_param
]->arg
, "route-map") == 0)
7223 ospf_routemap_set (red
, argv
[idx_redist_param
+1]->arg
);
7225 ospf_routemap_unset (red
);
7227 return ospf_redistribute_set (ospf
, source
, instance
, type
, metric
);
7230 DEFUN (no_ospf_redistribute_instance_source
,
7231 no_ospf_redistribute_instance_source_cmd
,
7232 "no redistribute <ospf|table> (1-65535) [<metric (0-16777214)|metric-type (1-2)|route-map WORD>]",
7235 "Open Shortest Path First\n"
7236 "Non-main Kernel Routing Table\n"
7237 "Instance ID/Table Id\n"
7238 "Metric for redistributed routes\n"
7239 "OSPF default metric\n"
7240 "OSPF exterior metric type for redistributed routes\n"
7241 "Set OSPF External Type 1 metrics\n"
7242 "Set OSPF External Type 2 metrics\n"
7243 "Route map reference\n"
7244 "Pointer to route-map entries\n")
7246 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
7247 int idx_ospf_table
= 2;
7250 struct ospf_redist
*red
;
7253 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
7254 source
= ZEBRA_ROUTE_OSPF
;
7256 source
= ZEBRA_ROUTE_TABLE
;
7258 VTY_GET_INTEGER ("Instance ID", instance
, argv
[idx_number
]->arg
);
7260 if ((source
== ZEBRA_ROUTE_OSPF
) && !ospf
->instance
)
7262 vty_out (vty
, "Instance redistribution in non-instanced OSPF not allowed%s",
7267 if ((source
== ZEBRA_ROUTE_OSPF
) && (ospf
->instance
== instance
))
7269 vty_out (vty
, "Same instance OSPF redistribution not allowed%s",
7274 red
= ospf_redist_lookup(ospf
, source
, instance
);
7278 ospf_routemap_unset (red
);
7279 return ospf_redistribute_unset (ospf
, source
, instance
);
7282 DEFUN (ospf_distribute_list_out
,
7283 ospf_distribute_list_out_cmd
,
7284 "distribute-list WORD out " FRR_REDIST_STR_OSPFD
,
7285 "Filter networks in routing updates\n"
7286 "Access-list name\n"
7288 FRR_REDIST_HELP_STR_OSPFD
)
7290 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
7294 char *proto
= argv
[argc
- 1]->text
;
7296 /* Get distribute source. */
7297 source
= proto_redistnum(AFI_IP
, proto
);
7301 return ospf_distribute_list_out_set (ospf
, source
, argv
[idx_word
]->arg
);
7304 DEFUN (no_ospf_distribute_list_out
,
7305 no_ospf_distribute_list_out_cmd
,
7306 "no distribute-list WORD out " FRR_REDIST_STR_OSPFD
,
7308 "Filter networks in routing updates\n"
7309 "Access-list name\n"
7311 FRR_REDIST_HELP_STR_OSPFD
)
7313 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
7317 char *proto
= argv
[argc
- 1]->text
;
7318 source
= proto_redistnum(AFI_IP
, proto
);
7322 return ospf_distribute_list_out_unset (ospf
, source
, argv
[idx_word
]->arg
);
7325 /* Default information originate. */
7326 DEFUN (ospf_default_information_originate
,
7327 ospf_default_information_originate_cmd
,
7328 "default-information originate [<always|metric (0-16777214)|metric-type (1-2)|route-map WORD>]",
7329 "Control distribution of default information\n"
7330 "Distribute a default route\n"
7331 "Always advertise default route\n"
7332 "OSPF default metric\n"
7334 "OSPF metric type for default routes\n"
7335 "Set OSPF External Type 1 metrics\n"
7336 "Set OSPF External Type 2 metrics\n"
7337 "Route map reference\n"
7338 "Pointer to route-map entries\n")
7340 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
7341 int default_originate
= DEFAULT_ORIGINATE_ZEBRA
;
7344 struct ospf_redist
*red
;
7347 red
= ospf_redist_add(ospf
, DEFAULT_ROUTE
, 0);
7349 /* Check whether "always" was specified */
7350 if (argv_find (argv
, argc
, "always", &idx
))
7351 default_originate
= DEFAULT_ORIGINATE_ALWAYS
;
7352 /* Get metric value */
7353 else if (argv_find (argv
, argc
, "(0-16777214)", &idx
)) {
7354 if (!str2metric (argv
[idx
]->arg
, &metric
))
7357 /* Get metric type. */
7358 else if (argv_find (argv
, argc
, "(1-2)", &idx
)) {
7359 if (!str2metric_type (argv
[idx
]->arg
, &type
))
7363 else if (argv_find (argv
, argc
, "WORD", &idx
))
7364 ospf_routemap_set (red
, argv
[idx
]->arg
);
7366 ospf_routemap_unset (red
);
7368 return ospf_redistribute_default_set (ospf
, default_originate
,
7372 DEFUN (no_ospf_default_information_originate
,
7373 no_ospf_default_information_originate_cmd
,
7374 "no default-information originate [<always|metric (0-16777214)|metric-type (1-2)|route-map WORD>]",
7376 "Control distribution of default information\n"
7377 "Distribute a default route\n"
7378 "Always advertise default route\n"
7379 "OSPF default metric\n"
7381 "OSPF metric type for default routes\n"
7382 "Set OSPF External Type 1 metrics\n"
7383 "Set OSPF External Type 2 metrics\n"
7384 "Route map reference\n"
7385 "Pointer to route-map entries\n")
7387 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
7388 struct prefix_ipv4 p
;
7389 struct ospf_external
*ext
;
7390 struct ospf_redist
*red
;
7393 p
.prefix
.s_addr
= 0;
7396 ospf_external_lsa_flush (ospf
, DEFAULT_ROUTE
, &p
, 0);
7398 if ((ext
= ospf_external_lookup(DEFAULT_ROUTE
, 0)) &&
7399 EXTERNAL_INFO (ext
)) {
7400 ospf_external_info_delete (DEFAULT_ROUTE
, 0, p
);
7401 ospf_external_del (DEFAULT_ROUTE
, 0);
7404 red
= ospf_redist_lookup(ospf
, DEFAULT_ROUTE
, 0);
7408 ospf_routemap_unset (red
);
7409 return ospf_redistribute_default_unset (ospf
);
7412 DEFUN (ospf_default_metric
,
7413 ospf_default_metric_cmd
,
7414 "default-metric (0-16777214)",
7415 "Set metric of redistributed routes\n"
7418 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
7422 if (!str2metric (argv
[idx_number
]->arg
, &metric
))
7425 ospf
->default_metric
= metric
;
7430 DEFUN (no_ospf_default_metric
,
7431 no_ospf_default_metric_cmd
,
7432 "no default-metric [(0-16777214)]",
7434 "Set metric of redistributed routes\n"
7437 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
7439 ospf
->default_metric
= -1;
7445 DEFUN (ospf_distance
,
7448 "Administrative distance\n"
7449 "OSPF Administrative distance\n")
7451 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
7454 ospf
->distance_all
= atoi (argv
[idx_number
]->arg
);
7459 DEFUN (no_ospf_distance
,
7460 no_ospf_distance_cmd
,
7461 "no distance (1-255)",
7463 "Administrative distance\n"
7464 "OSPF Administrative distance\n")
7466 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
7468 ospf
->distance_all
= 0;
7473 DEFUN (no_ospf_distance_ospf
,
7474 no_ospf_distance_ospf_cmd
,
7475 "no distance ospf [{intra-area [(1-255)]|inter-area [(1-255)]|external [(1-255)]}]",
7477 "Administrative distance\n"
7478 "OSPF administrative distance\n"
7479 "Intra-area routes\n"
7480 "Distance for intra-area routes\n"
7481 "Inter-area routes\n"
7482 "Distance for inter-area routes\n"
7484 "Distance for external routes\n")
7486 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
7492 if (argv_find (argv
, argc
, "intra-area", &idx
) || argc
== 3)
7493 idx
= ospf
->distance_intra
= 0;
7494 if (argv_find (argv
, argc
, "inter-area", &idx
) || argc
== 3)
7495 idx
= ospf
->distance_inter
= 0;
7496 if (argv_find (argv
, argc
, "external", &idx
) || argc
== 3)
7497 ospf
->distance_external
= 0;
7502 DEFUN (ospf_distance_ospf
,
7503 ospf_distance_ospf_cmd
,
7504 "distance ospf {intra-area (1-255)|inter-area (1-255)|external (1-255)}",
7505 "Administrative distance\n"
7506 "OSPF administrative distance\n"
7507 "Intra-area routes\n"
7508 "Distance for intra-area routes\n"
7509 "Inter-area routes\n"
7510 "Distance for inter-area routes\n"
7512 "Distance for external routes\n")
7514 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
7517 if (argv_find (argv
, argc
, "intra-area", &idx
))
7518 ospf
->distance_intra
= atoi(argv
[idx
+ 1]->arg
);
7520 if (argv_find (argv
, argc
, "inter-area", &idx
))
7521 ospf
->distance_inter
= atoi(argv
[idx
+ 1]->arg
);
7523 if (argv_find (argv
, argc
, "external", &idx
))
7524 ospf
->distance_external
= atoi(argv
[idx
+ 1]->arg
);
7530 DEFUN (ospf_distance_source
,
7531 ospf_distance_source_cmd
,
7532 "distance (1-255) A.B.C.D/M",
7533 "Administrative distance\n"
7535 "IP source prefix\n")
7537 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
7539 int idx_ipv4_prefixlen
= 2;
7544 ospf_distance_set (vty
, ospf
, argv
[idx_number
]->arg
, argv
[idx_ipv4_prefixlen
]->arg
, NULL
);
7549 DEFUN (no_ospf_distance_source
,
7550 no_ospf_distance_source_cmd
,
7551 "no distance (1-255) A.B.C.D/M",
7553 "Administrative distance\n"
7555 "IP source prefix\n")
7557 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
7559 int idx_ipv4_prefixlen
= 3;
7564 ospf_distance_unset (vty
, ospf
, argv
[idx_number
]->arg
, argv
[idx_ipv4_prefixlen
]->arg
, NULL
);
7569 DEFUN (ospf_distance_source_access_list
,
7570 ospf_distance_source_access_list_cmd
,
7571 "distance (1-255) A.B.C.D/M WORD",
7572 "Administrative distance\n"
7574 "IP source prefix\n"
7575 "Access list name\n")
7577 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
7579 int idx_ipv4_prefixlen
= 2;
7585 ospf_distance_set (vty
, ospf
, argv
[idx_number
]->arg
, argv
[idx_ipv4_prefixlen
]->arg
, argv
[idx_word
]->arg
);
7590 DEFUN (no_ospf_distance_source_access_list
,
7591 no_ospf_distance_source_access_list_cmd
,
7592 "no distance (1-255) A.B.C.D/M WORD",
7594 "Administrative distance\n"
7596 "IP source prefix\n"
7597 "Access list name\n")
7599 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
7601 int idx_ipv4_prefixlen
= 3;
7607 ospf_distance_unset (vty
, ospf
, argv
[idx_number
]->arg
, argv
[idx_ipv4_prefixlen
]->arg
, argv
[idx_word
]->arg
);
7613 DEFUN (ip_ospf_mtu_ignore
,
7614 ip_ospf_mtu_ignore_addr_cmd
,
7615 "ip ospf mtu-ignore [A.B.C.D]",
7617 "OSPF interface commands\n"
7618 "Disable MTU mismatch detection on this interface\n"
7619 "Address of interface")
7621 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7623 struct in_addr addr
;
7626 struct ospf_if_params
*params
;
7627 params
= IF_DEF_PARAMS (ifp
);
7631 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
7634 vty_out (vty
, "Please specify interface address by A.B.C.D%s",
7638 params
= ospf_get_if_params (ifp
, addr
);
7639 ospf_if_update_params (ifp
, addr
);
7641 params
->mtu_ignore
= 1;
7642 if (params
->mtu_ignore
!= OSPF_MTU_IGNORE_DEFAULT
)
7643 SET_IF_PARAM (params
, mtu_ignore
);
7646 UNSET_IF_PARAM (params
, mtu_ignore
);
7647 if (params
!= IF_DEF_PARAMS (ifp
))
7649 ospf_free_if_params (ifp
, addr
);
7650 ospf_if_update_params (ifp
, addr
);
7656 DEFUN (no_ip_ospf_mtu_ignore
,
7657 no_ip_ospf_mtu_ignore_addr_cmd
,
7658 "no ip ospf mtu-ignore [A.B.C.D]",
7660 "OSPF interface commands\n"
7661 "Disable MTU mismatch detection on this interface\n"
7662 "Address of interface")
7664 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7666 struct in_addr addr
;
7669 struct ospf_if_params
*params
;
7670 params
= IF_DEF_PARAMS (ifp
);
7674 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
7677 vty_out (vty
, "Please specify interface address by A.B.C.D%s",
7681 params
= ospf_get_if_params (ifp
, addr
);
7682 ospf_if_update_params (ifp
, addr
);
7684 params
->mtu_ignore
= 0;
7685 if (params
->mtu_ignore
!= OSPF_MTU_IGNORE_DEFAULT
)
7686 SET_IF_PARAM (params
, mtu_ignore
);
7689 UNSET_IF_PARAM (params
, mtu_ignore
);
7690 if (params
!= IF_DEF_PARAMS (ifp
))
7692 ospf_free_if_params (ifp
, addr
);
7693 ospf_if_update_params (ifp
, addr
);
7700 DEFUN (ospf_max_metric_router_lsa_admin
,
7701 ospf_max_metric_router_lsa_admin_cmd
,
7702 "max-metric router-lsa administrative",
7703 "OSPF maximum / infinite-distance metric\n"
7704 "Advertise own Router-LSA with infinite distance (stub router)\n"
7705 "Administratively applied, for an indefinite period\n")
7707 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
7708 struct listnode
*ln
;
7709 struct ospf_area
*area
;
7711 for (ALL_LIST_ELEMENTS_RO (ospf
->areas
, ln
, area
))
7713 SET_FLAG (area
->stub_router_state
, OSPF_AREA_ADMIN_STUB_ROUTED
);
7715 if (!CHECK_FLAG (area
->stub_router_state
, OSPF_AREA_IS_STUB_ROUTED
))
7716 ospf_router_lsa_update_area (area
);
7719 /* Allows for areas configured later to get the property */
7720 ospf
->stub_router_admin_set
= OSPF_STUB_ROUTER_ADMINISTRATIVE_SET
;
7725 DEFUN (no_ospf_max_metric_router_lsa_admin
,
7726 no_ospf_max_metric_router_lsa_admin_cmd
,
7727 "no max-metric router-lsa administrative",
7729 "OSPF maximum / infinite-distance metric\n"
7730 "Advertise own Router-LSA with infinite distance (stub router)\n"
7731 "Administratively applied, for an indefinite period\n")
7733 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
7734 struct listnode
*ln
;
7735 struct ospf_area
*area
;
7737 for (ALL_LIST_ELEMENTS_RO (ospf
->areas
, ln
, area
))
7739 UNSET_FLAG (area
->stub_router_state
, OSPF_AREA_ADMIN_STUB_ROUTED
);
7741 /* Don't trample on the start-up stub timer */
7742 if (CHECK_FLAG (area
->stub_router_state
, OSPF_AREA_IS_STUB_ROUTED
)
7743 && !area
->t_stub_router
)
7745 UNSET_FLAG (area
->stub_router_state
, OSPF_AREA_IS_STUB_ROUTED
);
7746 ospf_router_lsa_update_area (area
);
7749 ospf
->stub_router_admin_set
= OSPF_STUB_ROUTER_ADMINISTRATIVE_UNSET
;
7753 DEFUN (ospf_max_metric_router_lsa_startup
,
7754 ospf_max_metric_router_lsa_startup_cmd
,
7755 "max-metric router-lsa on-startup (5-86400)",
7756 "OSPF maximum / infinite-distance metric\n"
7757 "Advertise own Router-LSA with infinite distance (stub router)\n"
7758 "Automatically advertise stub Router-LSA on startup of OSPF\n"
7759 "Time (seconds) to advertise self as stub-router\n")
7761 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
7763 unsigned int seconds
;
7767 vty_out (vty
, "%% Must supply stub-router period");
7771 VTY_GET_INTEGER ("stub-router startup period", seconds
, argv
[idx_number
]->arg
);
7773 ospf
->stub_router_startup_time
= seconds
;
7778 DEFUN (no_ospf_max_metric_router_lsa_startup
,
7779 no_ospf_max_metric_router_lsa_startup_cmd
,
7780 "no max-metric router-lsa on-startup [(5-86400)]",
7782 "OSPF maximum / infinite-distance metric\n"
7783 "Advertise own Router-LSA with infinite distance (stub router)\n"
7784 "Automatically advertise stub Router-LSA on startup of OSPF\n"
7785 "Time (seconds) to advertise self as stub-router\n")
7787 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
7788 struct listnode
*ln
;
7789 struct ospf_area
*area
;
7791 ospf
->stub_router_startup_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
7793 for (ALL_LIST_ELEMENTS_RO (ospf
->areas
, ln
, area
))
7795 SET_FLAG (area
->stub_router_state
, OSPF_AREA_WAS_START_STUB_ROUTED
);
7796 OSPF_TIMER_OFF (area
->t_stub_router
);
7798 /* Don't trample on admin stub routed */
7799 if (!CHECK_FLAG (area
->stub_router_state
, OSPF_AREA_ADMIN_STUB_ROUTED
))
7801 UNSET_FLAG (area
->stub_router_state
, OSPF_AREA_IS_STUB_ROUTED
);
7802 ospf_router_lsa_update_area (area
);
7809 DEFUN (ospf_max_metric_router_lsa_shutdown
,
7810 ospf_max_metric_router_lsa_shutdown_cmd
,
7811 "max-metric router-lsa on-shutdown (5-100)",
7812 "OSPF maximum / infinite-distance metric\n"
7813 "Advertise own Router-LSA with infinite distance (stub router)\n"
7814 "Advertise stub-router prior to full shutdown of OSPF\n"
7815 "Time (seconds) to wait till full shutdown\n")
7817 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
7819 unsigned int seconds
;
7823 vty_out (vty
, "%% Must supply stub-router shutdown period");
7827 VTY_GET_INTEGER ("stub-router shutdown wait period", seconds
, argv
[idx_number
]->arg
);
7829 ospf
->stub_router_shutdown_time
= seconds
;
7834 DEFUN (no_ospf_max_metric_router_lsa_shutdown
,
7835 no_ospf_max_metric_router_lsa_shutdown_cmd
,
7836 "no max-metric router-lsa on-shutdown [(5-100)]",
7838 "OSPF maximum / infinite-distance metric\n"
7839 "Advertise own Router-LSA with infinite distance (stub router)\n"
7840 "Advertise stub-router prior to full shutdown of OSPF\n"
7841 "Time (seconds) to wait till full shutdown\n")
7843 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
7845 ospf
->stub_router_shutdown_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
7851 config_write_stub_router (struct vty
*vty
, struct ospf
*ospf
)
7853 struct listnode
*ln
;
7854 struct ospf_area
*area
;
7856 if (ospf
->stub_router_startup_time
!= OSPF_STUB_ROUTER_UNCONFIGURED
)
7857 vty_out (vty
, " max-metric router-lsa on-startup %u%s",
7858 ospf
->stub_router_startup_time
, VTY_NEWLINE
);
7859 if (ospf
->stub_router_shutdown_time
!= OSPF_STUB_ROUTER_UNCONFIGURED
)
7860 vty_out (vty
, " max-metric router-lsa on-shutdown %u%s",
7861 ospf
->stub_router_shutdown_time
, VTY_NEWLINE
);
7862 for (ALL_LIST_ELEMENTS_RO (ospf
->areas
, ln
, area
))
7864 if (CHECK_FLAG (area
->stub_router_state
, OSPF_AREA_ADMIN_STUB_ROUTED
))
7866 vty_out (vty
, " max-metric router-lsa administrative%s",
7875 show_ip_ospf_route_network (struct vty
*vty
, struct route_table
*rt
)
7877 struct route_node
*rn
;
7878 struct ospf_route
*or;
7879 struct listnode
*pnode
, *pnnode
;
7880 struct ospf_path
*path
;
7882 vty_out (vty
, "============ OSPF network routing table ============%s",
7885 for (rn
= route_top (rt
); rn
; rn
= route_next (rn
))
7886 if ((or = rn
->info
) != NULL
)
7889 snprintf (buf1
, 19, "%s/%d",
7890 inet_ntoa (rn
->p
.u
.prefix4
), rn
->p
.prefixlen
);
7892 switch (or->path_type
)
7894 case OSPF_PATH_INTER_AREA
:
7895 if (or->type
== OSPF_DESTINATION_NETWORK
)
7896 vty_out (vty
, "N IA %-18s [%d] area: %s%s", buf1
, or->cost
,
7897 inet_ntoa (or->u
.std
.area_id
), VTY_NEWLINE
);
7898 else if (or->type
== OSPF_DESTINATION_DISCARD
)
7899 vty_out (vty
, "D IA %-18s Discard entry%s", buf1
, VTY_NEWLINE
);
7901 case OSPF_PATH_INTRA_AREA
:
7902 vty_out (vty
, "N %-18s [%d] area: %s%s", buf1
, or->cost
,
7903 inet_ntoa (or->u
.std
.area_id
), VTY_NEWLINE
);
7909 if (or->type
== OSPF_DESTINATION_NETWORK
)
7910 for (ALL_LIST_ELEMENTS (or->paths
, pnode
, pnnode
, path
))
7912 if (if_lookup_by_index(path
->ifindex
, VRF_DEFAULT
))
7914 if (path
->nexthop
.s_addr
== 0)
7915 vty_out (vty
, "%24s directly attached to %s%s",
7916 "", ifindex2ifname (path
->ifindex
, VRF_DEFAULT
), VTY_NEWLINE
);
7918 vty_out (vty
, "%24s via %s, %s%s", "",
7919 inet_ntoa (path
->nexthop
),
7920 ifindex2ifname (path
->ifindex
, VRF_DEFAULT
), VTY_NEWLINE
);
7924 vty_out (vty
, "%s", VTY_NEWLINE
);
7928 show_ip_ospf_route_router (struct vty
*vty
, struct route_table
*rtrs
)
7930 struct route_node
*rn
;
7931 struct ospf_route
*or;
7932 struct listnode
*pnode
;
7933 struct listnode
*node
;
7934 struct ospf_path
*path
;
7936 vty_out (vty
, "============ OSPF router routing table =============%s",
7938 for (rn
= route_top (rtrs
); rn
; rn
= route_next (rn
))
7943 vty_out (vty
, "R %-15s ", inet_ntoa (rn
->p
.u
.prefix4
));
7945 for (ALL_LIST_ELEMENTS_RO ((struct list
*)rn
->info
, node
, or))
7948 vty_out (vty
, "%24s", "");
7951 vty_out (vty
, "%s [%d] area: %s",
7952 (or->path_type
== OSPF_PATH_INTER_AREA
? "IA" : " "),
7953 or->cost
, inet_ntoa (or->u
.std
.area_id
));
7955 vty_out (vty
, "%s%s%s",
7956 (or->u
.std
.flags
& ROUTER_LSA_BORDER
? ", ABR" : ""),
7957 (or->u
.std
.flags
& ROUTER_LSA_EXTERNAL
? ", ASBR" : ""),
7960 for (ALL_LIST_ELEMENTS_RO (or->paths
, pnode
, path
))
7962 if (if_lookup_by_index(path
->ifindex
, VRF_DEFAULT
))
7964 if (path
->nexthop
.s_addr
== 0)
7965 vty_out (vty
, "%24s directly attached to %s%s",
7966 "", ifindex2ifname (path
->ifindex
, VRF_DEFAULT
),
7969 vty_out (vty
, "%24s via %s, %s%s", "",
7970 inet_ntoa (path
->nexthop
),
7971 ifindex2ifname (path
->ifindex
, VRF_DEFAULT
),
7977 vty_out (vty
, "%s", VTY_NEWLINE
);
7981 show_ip_ospf_route_external (struct vty
*vty
, struct route_table
*rt
)
7983 struct route_node
*rn
;
7984 struct ospf_route
*er
;
7985 struct listnode
*pnode
, *pnnode
;
7986 struct ospf_path
*path
;
7988 vty_out (vty
, "============ OSPF external routing table ===========%s",
7990 for (rn
= route_top (rt
); rn
; rn
= route_next (rn
))
7991 if ((er
= rn
->info
) != NULL
)
7994 snprintf (buf1
, 19, "%s/%d",
7995 inet_ntoa (rn
->p
.u
.prefix4
), rn
->p
.prefixlen
);
7997 switch (er
->path_type
)
7999 case OSPF_PATH_TYPE1_EXTERNAL
:
8000 vty_out (vty
, "N E1 %-18s [%d] tag: %"ROUTE_TAG_PRI
"%s", buf1
,
8001 er
->cost
, er
->u
.ext
.tag
, VTY_NEWLINE
);
8003 case OSPF_PATH_TYPE2_EXTERNAL
:
8004 vty_out (vty
, "N E2 %-18s [%d/%d] tag: %"ROUTE_TAG_PRI
"%s", buf1
, er
->cost
,
8005 er
->u
.ext
.type2_cost
, er
->u
.ext
.tag
, VTY_NEWLINE
);
8009 for (ALL_LIST_ELEMENTS (er
->paths
, pnode
, pnnode
, path
))
8011 if (if_lookup_by_index(path
->ifindex
, VRF_DEFAULT
))
8013 if (path
->nexthop
.s_addr
== 0)
8014 vty_out (vty
, "%24s directly attached to %s%s",
8015 "", ifindex2ifname (path
->ifindex
, VRF_DEFAULT
), VTY_NEWLINE
);
8017 vty_out (vty
, "%24s via %s, %s%s", "",
8018 inet_ntoa (path
->nexthop
),
8019 ifindex2ifname (path
->ifindex
, VRF_DEFAULT
),
8024 vty_out (vty
, "%s", VTY_NEWLINE
);
8028 show_ip_ospf_border_routers_common (struct vty
*vty
, struct ospf
*ospf
)
8031 vty_out (vty
, "%sOSPF Instance: %d%s%s", VTY_NEWLINE
, ospf
->instance
,
8032 VTY_NEWLINE
, VTY_NEWLINE
);
8034 if (ospf
->new_table
== NULL
)
8036 vty_out (vty
, "No OSPF routing information exist%s", VTY_NEWLINE
);
8040 /* Show Network routes.
8041 show_ip_ospf_route_network (vty, ospf->new_table); */
8043 /* Show Router routes. */
8044 show_ip_ospf_route_router (vty
, ospf
->new_rtrs
);
8046 vty_out (vty
, "%s", VTY_NEWLINE
);
8051 DEFUN (show_ip_ospf_border_routers
,
8052 show_ip_ospf_border_routers_cmd
,
8053 "show ip ospf border-routers",
8056 "OSPF information\n"
8057 "Show all the ABR's and ASBR's\n")
8061 if ((ospf
= ospf_lookup ()) == NULL
|| !ospf
->oi_running
)
8064 return show_ip_ospf_border_routers_common(vty
, ospf
);
8067 DEFUN (show_ip_ospf_instance_border_routers
,
8068 show_ip_ospf_instance_border_routers_cmd
,
8069 "show ip ospf (1-65535) border-routers",
8072 "OSPF information\n"
8074 "Show all the ABR's and ASBR's\n")
8078 u_short instance
= 0;
8080 VTY_GET_INTEGER ("Instance", instance
, argv
[idx_number
]->arg
);
8081 if ((ospf
= ospf_lookup_instance (instance
)) == NULL
|| !ospf
->oi_running
)
8084 return show_ip_ospf_border_routers_common(vty
, ospf
);
8088 show_ip_ospf_route_common (struct vty
*vty
, struct ospf
*ospf
)
8091 vty_out (vty
, "%sOSPF Instance: %d%s%s", VTY_NEWLINE
, ospf
->instance
,
8092 VTY_NEWLINE
, VTY_NEWLINE
);
8094 if (ospf
->new_table
== NULL
)
8096 vty_out (vty
, "No OSPF routing information exist%s", VTY_NEWLINE
);
8100 /* Show Network routes. */
8101 show_ip_ospf_route_network (vty
, ospf
->new_table
);
8103 /* Show Router routes. */
8104 show_ip_ospf_route_router (vty
, ospf
->new_rtrs
);
8106 /* Show AS External routes. */
8107 show_ip_ospf_route_external (vty
, ospf
->old_external_route
);
8109 vty_out (vty
, "%s", VTY_NEWLINE
);
8114 DEFUN (show_ip_ospf_route
,
8115 show_ip_ospf_route_cmd
,
8116 "show ip ospf route",
8119 "OSPF information\n"
8120 "OSPF routing table\n")
8124 if ((ospf
= ospf_lookup ()) == NULL
|| !ospf
->oi_running
)
8127 return show_ip_ospf_route_common(vty
, ospf
);
8130 DEFUN (show_ip_ospf_instance_route
,
8131 show_ip_ospf_instance_route_cmd
,
8132 "show ip ospf (1-65535) route",
8135 "OSPF information\n"
8137 "OSPF routing table\n")
8141 u_short instance
= 0;
8143 VTY_GET_INTEGER ("Instance", instance
, argv
[idx_number
]->arg
);
8144 if ((ospf
= ospf_lookup_instance (instance
)) == NULL
|| !ospf
->oi_running
)
8147 return show_ip_ospf_route_common(vty
, ospf
);
8150 const char *ospf_abr_type_str
[] =
8159 const char *ospf_shortcut_mode_str
[] =
8168 area_id2str (char *buf
, int length
, struct ospf_area
*area
)
8170 memset (buf
, 0, length
);
8172 if (area
->format
== OSPF_AREA_ID_FORMAT_ADDRESS
)
8173 strncpy (buf
, inet_ntoa (area
->area_id
), length
);
8175 sprintf (buf
, "%lu", (unsigned long) ntohl (area
->area_id
.s_addr
));
8179 const char *ospf_int_type_str
[] =
8181 "unknown", /* should never be used. */
8185 "point-to-multipoint",
8186 "virtual-link", /* should never be used. */
8190 /* Configuration write function for ospfd. */
8192 config_write_interface (struct vty
*vty
)
8194 struct listnode
*n1
, *n2
;
8195 struct interface
*ifp
;
8196 struct crypt_key
*ck
;
8198 struct route_node
*rn
= NULL
;
8199 struct ospf_if_params
*params
;
8200 struct ospf
*ospf
= ospf_lookup();
8202 for (ALL_LIST_ELEMENTS_RO (vrf_iflist (VRF_DEFAULT
), n1
, ifp
))
8204 if (memcmp (ifp
->name
, "VLINK", 5) == 0)
8207 if (ifp
->ifindex
== IFINDEX_DELETED
)
8210 vty_out (vty
, "!%s", VTY_NEWLINE
);
8211 vty_out (vty
, "interface %s%s", ifp
->name
,
8214 vty_out (vty
, " description %s%s", ifp
->desc
,
8219 params
= IF_DEF_PARAMS (ifp
);
8222 /* Interface Network print. */
8223 if (OSPF_IF_PARAM_CONFIGURED (params
, type
) &&
8224 params
->type
!= OSPF_IFTYPE_LOOPBACK
)
8226 if (params
->type
!= ospf_default_iftype(ifp
))
8228 vty_out (vty
, " ip ospf network %s",
8229 ospf_int_type_str
[params
->type
]);
8230 if (params
!= IF_DEF_PARAMS (ifp
))
8231 vty_out (vty
, " %s", inet_ntoa (rn
->p
.u
.prefix4
));
8232 vty_out (vty
, "%s", VTY_NEWLINE
);
8236 /* OSPF interface authentication print */
8237 if (OSPF_IF_PARAM_CONFIGURED (params
, auth_type
) &&
8238 params
->auth_type
!= OSPF_AUTH_NOTSET
)
8240 const char *auth_str
;
8242 /* Translation tables are not that much help here due to syntax
8243 of the simple option */
8244 switch (params
->auth_type
)
8247 case OSPF_AUTH_NULL
:
8251 case OSPF_AUTH_SIMPLE
:
8255 case OSPF_AUTH_CRYPTOGRAPHIC
:
8256 auth_str
= " message-digest";
8264 vty_out (vty
, " ip ospf authentication%s", auth_str
);
8265 if (params
!= IF_DEF_PARAMS (ifp
))
8266 vty_out (vty
, " %s", inet_ntoa (rn
->p
.u
.prefix4
));
8267 vty_out (vty
, "%s", VTY_NEWLINE
);
8270 /* Simple Authentication Password print. */
8271 if (OSPF_IF_PARAM_CONFIGURED (params
, auth_simple
) &&
8272 params
->auth_simple
[0] != '\0')
8274 vty_out (vty
, " ip ospf authentication-key %s",
8275 params
->auth_simple
);
8276 if (params
!= IF_DEF_PARAMS (ifp
))
8277 vty_out (vty
, " %s", inet_ntoa (rn
->p
.u
.prefix4
));
8278 vty_out (vty
, "%s", VTY_NEWLINE
);
8281 /* Cryptographic Authentication Key print. */
8282 for (ALL_LIST_ELEMENTS_RO (params
->auth_crypt
, n2
, ck
))
8284 vty_out (vty
, " ip ospf message-digest-key %d md5 %s",
8285 ck
->key_id
, ck
->auth_key
);
8286 if (params
!= IF_DEF_PARAMS (ifp
))
8287 vty_out (vty
, " %s", inet_ntoa (rn
->p
.u
.prefix4
));
8288 vty_out (vty
, "%s", VTY_NEWLINE
);
8291 /* Interface Output Cost print. */
8292 if (OSPF_IF_PARAM_CONFIGURED (params
, output_cost_cmd
))
8294 vty_out (vty
, " ip ospf cost %u", params
->output_cost_cmd
);
8295 if (params
!= IF_DEF_PARAMS (ifp
))
8296 vty_out (vty
, " %s", inet_ntoa (rn
->p
.u
.prefix4
));
8297 vty_out (vty
, "%s", VTY_NEWLINE
);
8300 /* Hello Interval print. */
8301 if (OSPF_IF_PARAM_CONFIGURED (params
, v_hello
) &&
8302 params
->v_hello
!= OSPF_HELLO_INTERVAL_DEFAULT
)
8304 vty_out (vty
, " ip ospf hello-interval %u", params
->v_hello
);
8305 if (params
!= IF_DEF_PARAMS (ifp
))
8306 vty_out (vty
, " %s", inet_ntoa (rn
->p
.u
.prefix4
));
8307 vty_out (vty
, "%s", VTY_NEWLINE
);
8311 /* Router Dead Interval print. */
8312 if (OSPF_IF_PARAM_CONFIGURED (params
, v_wait
) &&
8313 params
->v_wait
!= OSPF_ROUTER_DEAD_INTERVAL_DEFAULT
)
8315 vty_out (vty
, " ip ospf dead-interval ");
8318 if (OSPF_IF_PARAM_CONFIGURED (params
, fast_hello
))
8319 vty_out (vty
, "minimal hello-multiplier %d",
8320 params
->fast_hello
);
8322 vty_out (vty
, "%u", params
->v_wait
);
8324 if (params
!= IF_DEF_PARAMS (ifp
))
8325 vty_out (vty
, " %s", inet_ntoa (rn
->p
.u
.prefix4
));
8326 vty_out (vty
, "%s", VTY_NEWLINE
);
8329 /* Router Priority print. */
8330 if (OSPF_IF_PARAM_CONFIGURED (params
, priority
) &&
8331 params
->priority
!= OSPF_ROUTER_PRIORITY_DEFAULT
)
8333 vty_out (vty
, " ip ospf priority %u", params
->priority
);
8334 if (params
!= IF_DEF_PARAMS (ifp
))
8335 vty_out (vty
, " %s", inet_ntoa (rn
->p
.u
.prefix4
));
8336 vty_out (vty
, "%s", VTY_NEWLINE
);
8339 /* Retransmit Interval print. */
8340 if (OSPF_IF_PARAM_CONFIGURED (params
, retransmit_interval
) &&
8341 params
->retransmit_interval
!= OSPF_RETRANSMIT_INTERVAL_DEFAULT
)
8343 vty_out (vty
, " ip ospf retransmit-interval %u",
8344 params
->retransmit_interval
);
8345 if (params
!= IF_DEF_PARAMS (ifp
))
8346 vty_out (vty
, " %s", inet_ntoa (rn
->p
.u
.prefix4
));
8347 vty_out (vty
, "%s", VTY_NEWLINE
);
8350 /* Transmit Delay print. */
8351 if (OSPF_IF_PARAM_CONFIGURED (params
, transmit_delay
) &&
8352 params
->transmit_delay
!= OSPF_TRANSMIT_DELAY_DEFAULT
)
8354 vty_out (vty
, " ip ospf transmit-delay %u", params
->transmit_delay
);
8355 if (params
!= IF_DEF_PARAMS (ifp
))
8356 vty_out (vty
, " %s", inet_ntoa (rn
->p
.u
.prefix4
));
8357 vty_out (vty
, "%s", VTY_NEWLINE
);
8361 if (OSPF_IF_PARAM_CONFIGURED (params
, if_area
))
8364 vty_out (vty
, " ip ospf %d area %s%s", ospf
->instance
,
8365 inet_ntoa (params
->if_area
), VTY_NEWLINE
);
8367 vty_out (vty
, " ip ospf area %s%s",
8368 inet_ntoa (params
->if_area
), VTY_NEWLINE
);
8373 ospf_bfd_write_config(vty
, params
);
8375 /* MTU ignore print. */
8376 if (OSPF_IF_PARAM_CONFIGURED (params
, mtu_ignore
) &&
8377 params
->mtu_ignore
!= OSPF_MTU_IGNORE_DEFAULT
)
8379 if (params
->mtu_ignore
== 0)
8380 vty_out (vty
, " no ip ospf mtu-ignore");
8382 vty_out (vty
, " ip ospf mtu-ignore");
8383 if (params
!= IF_DEF_PARAMS (ifp
))
8384 vty_out (vty
, " %s", inet_ntoa (rn
->p
.u
.prefix4
));
8385 vty_out (vty
, "%s", VTY_NEWLINE
);
8392 rn
= route_top (IF_OIFS_PARAMS (ifp
));
8394 rn
= route_next (rn
);
8404 ospf_opaque_config_write_if (vty
, ifp
);
8411 config_write_network_area (struct vty
*vty
, struct ospf
*ospf
)
8413 struct route_node
*rn
;
8414 u_char buf
[INET_ADDRSTRLEN
];
8416 /* `network area' print. */
8417 for (rn
= route_top (ospf
->networks
); rn
; rn
= route_next (rn
))
8420 struct ospf_network
*n
= rn
->info
;
8422 memset (buf
, 0, INET_ADDRSTRLEN
);
8424 /* Create Area ID string by specified Area ID format. */
8425 if (n
->format
== OSPF_AREA_ID_FORMAT_ADDRESS
)
8426 strncpy ((char *) buf
, inet_ntoa (n
->area_id
), INET_ADDRSTRLEN
);
8428 sprintf ((char *) buf
, "%lu",
8429 (unsigned long int) ntohl (n
->area_id
.s_addr
));
8431 /* Network print. */
8432 vty_out (vty
, " network %s/%d area %s%s",
8433 inet_ntoa (rn
->p
.u
.prefix4
), rn
->p
.prefixlen
,
8441 config_write_ospf_area (struct vty
*vty
, struct ospf
*ospf
)
8443 struct listnode
*node
;
8444 struct ospf_area
*area
;
8445 u_char buf
[INET_ADDRSTRLEN
];
8447 /* Area configuration print. */
8448 for (ALL_LIST_ELEMENTS_RO (ospf
->areas
, node
, area
))
8450 struct route_node
*rn1
;
8452 area_id2str ((char *) buf
, INET_ADDRSTRLEN
, area
);
8454 if (area
->auth_type
!= OSPF_AUTH_NULL
)
8456 if (area
->auth_type
== OSPF_AUTH_SIMPLE
)
8457 vty_out (vty
, " area %s authentication%s", buf
, VTY_NEWLINE
);
8459 vty_out (vty
, " area %s authentication message-digest%s",
8463 if (area
->shortcut_configured
!= OSPF_SHORTCUT_DEFAULT
)
8464 vty_out (vty
, " area %s shortcut %s%s", buf
,
8465 ospf_shortcut_mode_str
[area
->shortcut_configured
],
8468 if ((area
->external_routing
== OSPF_AREA_STUB
)
8469 || (area
->external_routing
== OSPF_AREA_NSSA
)
8472 if (area
->external_routing
== OSPF_AREA_STUB
)
8473 vty_out (vty
, " area %s stub", buf
);
8474 else if (area
->external_routing
== OSPF_AREA_NSSA
)
8476 vty_out (vty
, " area %s nssa", buf
);
8477 switch (area
->NSSATranslatorRole
)
8479 case OSPF_NSSA_ROLE_NEVER
:
8480 vty_out (vty
, " translate-never");
8482 case OSPF_NSSA_ROLE_ALWAYS
:
8483 vty_out (vty
, " translate-always");
8485 case OSPF_NSSA_ROLE_CANDIDATE
:
8487 vty_out (vty
, " translate-candidate");
8491 if (area
->no_summary
)
8492 vty_out (vty
, " no-summary");
8494 vty_out (vty
, "%s", VTY_NEWLINE
);
8496 if (area
->default_cost
!= 1)
8497 vty_out (vty
, " area %s default-cost %d%s", buf
,
8498 area
->default_cost
, VTY_NEWLINE
);
8501 for (rn1
= route_top (area
->ranges
); rn1
; rn1
= route_next (rn1
))
8504 struct ospf_area_range
*range
= rn1
->info
;
8506 vty_out (vty
, " area %s range %s/%d", buf
,
8507 inet_ntoa (rn1
->p
.u
.prefix4
), rn1
->p
.prefixlen
);
8509 if (range
->cost_config
!= OSPF_AREA_RANGE_COST_UNSPEC
)
8510 vty_out (vty
, " cost %d", range
->cost_config
);
8512 if (!CHECK_FLAG (range
->flags
, OSPF_AREA_RANGE_ADVERTISE
))
8513 vty_out (vty
, " not-advertise");
8515 if (CHECK_FLAG (range
->flags
, OSPF_AREA_RANGE_SUBSTITUTE
))
8516 vty_out (vty
, " substitute %s/%d",
8517 inet_ntoa (range
->subst_addr
), range
->subst_masklen
);
8519 vty_out (vty
, "%s", VTY_NEWLINE
);
8522 if (EXPORT_NAME (area
))
8523 vty_out (vty
, " area %s export-list %s%s", buf
,
8524 EXPORT_NAME (area
), VTY_NEWLINE
);
8526 if (IMPORT_NAME (area
))
8527 vty_out (vty
, " area %s import-list %s%s", buf
,
8528 IMPORT_NAME (area
), VTY_NEWLINE
);
8530 if (PREFIX_NAME_IN (area
))
8531 vty_out (vty
, " area %s filter-list prefix %s in%s", buf
,
8532 PREFIX_NAME_IN (area
), VTY_NEWLINE
);
8534 if (PREFIX_NAME_OUT (area
))
8535 vty_out (vty
, " area %s filter-list prefix %s out%s", buf
,
8536 PREFIX_NAME_OUT (area
), VTY_NEWLINE
);
8543 config_write_ospf_nbr_nbma (struct vty
*vty
, struct ospf
*ospf
)
8545 struct ospf_nbr_nbma
*nbr_nbma
;
8546 struct route_node
*rn
;
8548 /* Static Neighbor configuration print. */
8549 for (rn
= route_top (ospf
->nbr_nbma
); rn
; rn
= route_next (rn
))
8550 if ((nbr_nbma
= rn
->info
))
8552 vty_out (vty
, " neighbor %s", inet_ntoa (nbr_nbma
->addr
));
8554 if (nbr_nbma
->priority
!= OSPF_NEIGHBOR_PRIORITY_DEFAULT
)
8555 vty_out (vty
, " priority %d", nbr_nbma
->priority
);
8557 if (nbr_nbma
->v_poll
!= OSPF_POLL_INTERVAL_DEFAULT
)
8558 vty_out (vty
, " poll-interval %d", nbr_nbma
->v_poll
);
8560 vty_out (vty
, "%s", VTY_NEWLINE
);
8567 config_write_virtual_link (struct vty
*vty
, struct ospf
*ospf
)
8569 struct listnode
*node
;
8570 struct ospf_vl_data
*vl_data
;
8571 u_char buf
[INET_ADDRSTRLEN
];
8573 /* Virtual-Link print */
8574 for (ALL_LIST_ELEMENTS_RO (ospf
->vlinks
, node
, vl_data
))
8576 struct listnode
*n2
;
8577 struct crypt_key
*ck
;
8578 struct ospf_interface
*oi
;
8580 if (vl_data
!= NULL
)
8582 memset (buf
, 0, INET_ADDRSTRLEN
);
8584 if (vl_data
->format
== OSPF_AREA_ID_FORMAT_ADDRESS
)
8585 strncpy ((char *) buf
, inet_ntoa (vl_data
->vl_area_id
), INET_ADDRSTRLEN
);
8587 sprintf ((char *) buf
, "%lu",
8588 (unsigned long int) ntohl (vl_data
->vl_area_id
.s_addr
));
8589 oi
= vl_data
->vl_oi
;
8592 if (OSPF_IF_PARAM (oi
, v_hello
) != OSPF_HELLO_INTERVAL_DEFAULT
||
8593 OSPF_IF_PARAM (oi
, v_wait
) != OSPF_ROUTER_DEAD_INTERVAL_DEFAULT
||
8594 OSPF_IF_PARAM (oi
, retransmit_interval
) != OSPF_RETRANSMIT_INTERVAL_DEFAULT
||
8595 OSPF_IF_PARAM (oi
, transmit_delay
) != OSPF_TRANSMIT_DELAY_DEFAULT
)
8596 vty_out (vty
, " area %s virtual-link %s hello-interval %d retransmit-interval %d transmit-delay %d dead-interval %d%s",
8598 inet_ntoa (vl_data
->vl_peer
),
8599 OSPF_IF_PARAM (oi
, v_hello
),
8600 OSPF_IF_PARAM (oi
, retransmit_interval
),
8601 OSPF_IF_PARAM (oi
, transmit_delay
),
8602 OSPF_IF_PARAM (oi
, v_wait
),
8605 vty_out (vty
, " area %s virtual-link %s%s", buf
,
8606 inet_ntoa (vl_data
->vl_peer
), VTY_NEWLINE
);
8608 if (IF_DEF_PARAMS (vl_data
->vl_oi
->ifp
)->auth_simple
[0] != '\0')
8609 vty_out (vty
, " area %s virtual-link %s authentication-key %s%s",
8611 inet_ntoa (vl_data
->vl_peer
),
8612 IF_DEF_PARAMS (vl_data
->vl_oi
->ifp
)->auth_simple
,
8615 for (ALL_LIST_ELEMENTS_RO (IF_DEF_PARAMS (vl_data
->vl_oi
->ifp
)->auth_crypt
,
8617 vty_out (vty
, " area %s virtual-link %s"
8618 " message-digest-key %d md5 %s%s",
8620 inet_ntoa (vl_data
->vl_peer
),
8621 ck
->key_id
, ck
->auth_key
, VTY_NEWLINE
);
8631 config_write_ospf_redistribute (struct vty
*vty
, struct ospf
*ospf
)
8635 /* redistribute print. */
8636 for (type
= 0; type
< ZEBRA_ROUTE_MAX
; type
++)
8638 struct list
*red_list
;
8639 struct listnode
*node
;
8640 struct ospf_redist
*red
;
8642 red_list
= ospf
->redist
[type
];
8646 for (ALL_LIST_ELEMENTS_RO(red_list
, node
, red
))
8648 vty_out (vty
, " redistribute %s", zebra_route_string(type
));
8650 vty_out (vty
, " %d", red
->instance
);
8652 if (red
->dmetric
.value
>= 0)
8653 vty_out (vty
, " metric %d", red
->dmetric
.value
);
8655 if (red
->dmetric
.type
== EXTERNAL_METRIC_TYPE_1
)
8656 vty_out (vty
, " metric-type 1");
8658 if (ROUTEMAP_NAME (red
))
8659 vty_out (vty
, " route-map %s", ROUTEMAP_NAME (red
));
8661 vty_out (vty
, "%s", VTY_NEWLINE
);
8669 config_write_ospf_default_metric (struct vty
*vty
, struct ospf
*ospf
)
8671 if (ospf
->default_metric
!= -1)
8672 vty_out (vty
, " default-metric %d%s", ospf
->default_metric
,
8678 config_write_ospf_distribute (struct vty
*vty
, struct ospf
*ospf
)
8681 struct ospf_redist
*red
;
8685 /* distribute-list print. */
8686 for (type
= 0; type
< ZEBRA_ROUTE_MAX
; type
++)
8687 if (DISTRIBUTE_NAME (ospf
, type
))
8688 vty_out (vty
, " distribute-list %s out %s%s",
8689 DISTRIBUTE_NAME (ospf
, type
),
8690 zebra_route_string(type
), VTY_NEWLINE
);
8692 /* default-information print. */
8693 if (ospf
->default_originate
!= DEFAULT_ORIGINATE_NONE
)
8695 vty_out (vty
, " default-information originate");
8696 if (ospf
->default_originate
== DEFAULT_ORIGINATE_ALWAYS
)
8697 vty_out (vty
, " always");
8699 red
= ospf_redist_lookup(ospf
, DEFAULT_ROUTE
, 0);
8702 if (red
->dmetric
.value
>= 0)
8703 vty_out (vty
, " metric %d",
8704 red
->dmetric
.value
);
8705 if (red
->dmetric
.type
== EXTERNAL_METRIC_TYPE_1
)
8706 vty_out (vty
, " metric-type 1");
8708 if (ROUTEMAP_NAME (red
))
8709 vty_out (vty
, " route-map %s",
8710 ROUTEMAP_NAME (red
));
8713 vty_out (vty
, "%s", VTY_NEWLINE
);
8722 config_write_ospf_distance (struct vty
*vty
, struct ospf
*ospf
)
8724 struct route_node
*rn
;
8725 struct ospf_distance
*odistance
;
8727 if (ospf
->distance_all
)
8728 vty_out (vty
, " distance %d%s", ospf
->distance_all
, VTY_NEWLINE
);
8730 if (ospf
->distance_intra
8731 || ospf
->distance_inter
8732 || ospf
->distance_external
)
8734 vty_out (vty
, " distance ospf");
8736 if (ospf
->distance_intra
)
8737 vty_out (vty
, " intra-area %d", ospf
->distance_intra
);
8738 if (ospf
->distance_inter
)
8739 vty_out (vty
, " inter-area %d", ospf
->distance_inter
);
8740 if (ospf
->distance_external
)
8741 vty_out (vty
, " external %d", ospf
->distance_external
);
8743 vty_out (vty
, "%s", VTY_NEWLINE
);
8746 for (rn
= route_top (ospf
->distance_table
); rn
; rn
= route_next (rn
))
8747 if ((odistance
= rn
->info
) != NULL
)
8749 vty_out (vty
, " distance %d %s/%d %s%s", odistance
->distance
,
8750 inet_ntoa (rn
->p
.u
.prefix4
), rn
->p
.prefixlen
,
8751 odistance
->access_list
? odistance
->access_list
: "",
8757 /* OSPF configuration write function. */
8759 ospf_config_write (struct vty
*vty
)
8762 struct interface
*ifp
;
8763 struct ospf_interface
*oi
;
8764 struct listnode
*node
;
8767 ospf
= ospf_lookup ();
8768 if (ospf
!= NULL
&& ospf
->oi_running
)
8770 /* `router ospf' print. */
8772 vty_out (vty
, "router ospf %d%s", ospf
->instance
, VTY_NEWLINE
);
8774 vty_out (vty
, "router ospf%s", VTY_NEWLINE
);
8778 if (!ospf
->networks
)
8781 /* Router ID print. */
8782 if (ospf
->router_id_static
.s_addr
!= 0)
8783 vty_out (vty
, " ospf router-id %s%s",
8784 inet_ntoa (ospf
->router_id_static
), VTY_NEWLINE
);
8786 /* ABR type print. */
8787 if (ospf
->abr_type
!= OSPF_ABR_DEFAULT
)
8788 vty_out (vty
, " ospf abr-type %s%s",
8789 ospf_abr_type_str
[ospf
->abr_type
], VTY_NEWLINE
);
8791 /* log-adjacency-changes flag print. */
8792 if (CHECK_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_CHANGES
))
8794 if (CHECK_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_DETAIL
))
8795 vty_out(vty
, " log-adjacency-changes detail%s", VTY_NEWLINE
);
8796 else if (!DFLT_OSPF_LOG_ADJACENCY_CHANGES
)
8797 vty_out(vty
, " log-adjacency-changes%s", VTY_NEWLINE
);
8799 else if (DFLT_OSPF_LOG_ADJACENCY_CHANGES
)
8801 vty_out(vty
, " no log-adjacency-changes%s", VTY_NEWLINE
);
8804 /* RFC1583 compatibility flag print -- Compatible with CISCO 12.1. */
8805 if (CHECK_FLAG (ospf
->config
, OSPF_RFC1583_COMPATIBLE
))
8806 vty_out (vty
, " compatible rfc1583%s", VTY_NEWLINE
);
8808 /* auto-cost reference-bandwidth configuration. */
8809 if (ospf
->ref_bandwidth
!= OSPF_DEFAULT_REF_BANDWIDTH
)
8811 vty_out (vty
, "! Important: ensure reference bandwidth "
8812 "is consistent across all routers%s", VTY_NEWLINE
);
8813 vty_out (vty
, " auto-cost reference-bandwidth %d%s",
8814 ospf
->ref_bandwidth
, VTY_NEWLINE
);
8817 /* SPF timers print. */
8818 if (ospf
->spf_delay
!= OSPF_SPF_DELAY_DEFAULT
||
8819 ospf
->spf_holdtime
!= OSPF_SPF_HOLDTIME_DEFAULT
||
8820 ospf
->spf_max_holdtime
!= OSPF_SPF_MAX_HOLDTIME_DEFAULT
)
8821 vty_out (vty
, " timers throttle spf %d %d %d%s",
8822 ospf
->spf_delay
, ospf
->spf_holdtime
,
8823 ospf
->spf_max_holdtime
, VTY_NEWLINE
);
8825 /* LSA timers print. */
8826 if (ospf
->min_ls_interval
!= OSPF_MIN_LS_INTERVAL
)
8827 vty_out (vty
, " timers throttle lsa all %d%s",
8828 ospf
->min_ls_interval
, VTY_NEWLINE
);
8829 if (ospf
->min_ls_arrival
!= OSPF_MIN_LS_ARRIVAL
)
8830 vty_out (vty
, " timers lsa min-arrival %d%s",
8831 ospf
->min_ls_arrival
, VTY_NEWLINE
);
8833 /* Write multiplier print. */
8834 if (ospf
->write_oi_count
!= OSPF_WRITE_INTERFACE_COUNT_DEFAULT
)
8835 vty_out (vty
, " ospf write-multiplier %d%s",
8836 ospf
->write_oi_count
, VTY_NEWLINE
);
8838 /* Max-metric router-lsa print */
8839 config_write_stub_router (vty
, ospf
);
8841 /* SPF refresh parameters print. */
8842 if (ospf
->lsa_refresh_interval
!= OSPF_LSA_REFRESH_INTERVAL_DEFAULT
)
8843 vty_out (vty
, " refresh timer %d%s",
8844 ospf
->lsa_refresh_interval
, VTY_NEWLINE
);
8846 /* Redistribute information print. */
8847 config_write_ospf_redistribute (vty
, ospf
);
8849 /* passive-interface print. */
8850 if (ospf
->passive_interface_default
== OSPF_IF_PASSIVE
)
8851 vty_out (vty
, " passive-interface default%s", VTY_NEWLINE
);
8853 for (ALL_LIST_ELEMENTS_RO (om
->iflist
, node
, ifp
))
8854 if (OSPF_IF_PARAM_CONFIGURED (IF_DEF_PARAMS (ifp
), passive_interface
)
8855 && IF_DEF_PARAMS (ifp
)->passive_interface
!=
8856 ospf
->passive_interface_default
)
8858 vty_out (vty
, " %spassive-interface %s%s",
8859 IF_DEF_PARAMS (ifp
)->passive_interface
? "" : "no ",
8860 ifp
->name
, VTY_NEWLINE
);
8862 for (ALL_LIST_ELEMENTS_RO (ospf
->oiflist
, node
, oi
))
8864 if (!OSPF_IF_PARAM_CONFIGURED (oi
->params
, passive_interface
))
8866 if (OSPF_IF_PARAM_CONFIGURED (IF_DEF_PARAMS (oi
->ifp
),
8869 if (oi
->params
->passive_interface
== IF_DEF_PARAMS (oi
->ifp
)->passive_interface
)
8872 else if (oi
->params
->passive_interface
== ospf
->passive_interface_default
)
8875 vty_out (vty
, " %spassive-interface %s %s%s",
8876 oi
->params
->passive_interface
? "" : "no ",
8878 inet_ntoa (oi
->address
->u
.prefix4
), VTY_NEWLINE
);
8881 /* Network area print. */
8882 config_write_network_area (vty
, ospf
);
8884 /* Area config print. */
8885 config_write_ospf_area (vty
, ospf
);
8887 /* static neighbor print. */
8888 config_write_ospf_nbr_nbma (vty
, ospf
);
8890 /* Virtual-Link print. */
8891 config_write_virtual_link (vty
, ospf
);
8893 /* Default metric configuration. */
8894 config_write_ospf_default_metric (vty
, ospf
);
8896 /* Distribute-list and default-information print. */
8897 config_write_ospf_distribute (vty
, ospf
);
8899 /* Distance configuration. */
8900 config_write_ospf_distance (vty
, ospf
);
8902 ospf_opaque_config_write_router (vty
, ospf
);
8909 ospf_vty_show_init (void)
8911 /* "show ip ospf" commands. */
8912 install_element (VIEW_NODE
, &show_ip_ospf_cmd
);
8914 install_element (VIEW_NODE
, &show_ip_ospf_instance_cmd
);
8916 /* "show ip ospf database" commands. */
8917 install_element (VIEW_NODE
, &show_ip_ospf_database_type_adv_router_cmd
);
8918 install_element (VIEW_NODE
, &show_ip_ospf_database_max_cmd
);
8920 install_element (VIEW_NODE
, &show_ip_ospf_instance_database_type_adv_router_cmd
);
8921 install_element (VIEW_NODE
, &show_ip_ospf_instance_database_cmd
);
8922 install_element (VIEW_NODE
, &show_ip_ospf_instance_database_max_cmd
);
8924 /* "show ip ospf interface" commands. */
8925 install_element (VIEW_NODE
, &show_ip_ospf_interface_cmd
);
8927 install_element (VIEW_NODE
, &show_ip_ospf_instance_interface_cmd
);
8929 /* "show ip ospf neighbor" commands. */
8930 install_element (VIEW_NODE
, &show_ip_ospf_neighbor_int_detail_cmd
);
8931 install_element (VIEW_NODE
, &show_ip_ospf_neighbor_int_cmd
);
8932 install_element (VIEW_NODE
, &show_ip_ospf_neighbor_id_cmd
);
8933 install_element (VIEW_NODE
, &show_ip_ospf_neighbor_detail_all_cmd
);
8934 install_element (VIEW_NODE
, &show_ip_ospf_neighbor_detail_cmd
);
8935 install_element (VIEW_NODE
, &show_ip_ospf_neighbor_cmd
);
8936 install_element (VIEW_NODE
, &show_ip_ospf_neighbor_all_cmd
);
8938 install_element (VIEW_NODE
, &show_ip_ospf_instance_neighbor_int_detail_cmd
);
8939 install_element (VIEW_NODE
, &show_ip_ospf_instance_neighbor_int_cmd
);
8940 install_element (VIEW_NODE
, &show_ip_ospf_instance_neighbor_id_cmd
);
8941 install_element (VIEW_NODE
, &show_ip_ospf_instance_neighbor_detail_all_cmd
);
8942 install_element (VIEW_NODE
, &show_ip_ospf_instance_neighbor_detail_cmd
);
8943 install_element (VIEW_NODE
, &show_ip_ospf_instance_neighbor_cmd
);
8944 install_element (VIEW_NODE
, &show_ip_ospf_instance_neighbor_all_cmd
);
8946 /* "show ip ospf route" commands. */
8947 install_element (VIEW_NODE
, &show_ip_ospf_route_cmd
);
8948 install_element (VIEW_NODE
, &show_ip_ospf_border_routers_cmd
);
8950 install_element (VIEW_NODE
, &show_ip_ospf_instance_route_cmd
);
8951 install_element (VIEW_NODE
, &show_ip_ospf_instance_border_routers_cmd
);
8955 /* ospfd's interface node. */
8956 static struct cmd_node interface_node
=
8963 /* Initialization of OSPF interface. */
8965 ospf_vty_if_init (void)
8967 /* Install interface node. */
8968 install_node (&interface_node
, config_write_interface
);
8971 /* "ip ospf authentication" commands. */
8972 install_element (INTERFACE_NODE
, &ip_ospf_authentication_args_addr_cmd
);
8973 install_element (INTERFACE_NODE
, &ip_ospf_authentication_addr_cmd
);
8974 install_element (INTERFACE_NODE
, &no_ip_ospf_authentication_args_addr_cmd
);
8975 install_element (INTERFACE_NODE
, &no_ip_ospf_authentication_addr_cmd
);
8976 install_element (INTERFACE_NODE
, &ip_ospf_authentication_key_addr_cmd
);
8977 install_element (INTERFACE_NODE
, &no_ip_ospf_authentication_key_authkey_addr_cmd
);
8978 install_element (INTERFACE_NODE
, &no_ospf_authentication_key_authkey_addr_cmd
);
8980 /* "ip ospf message-digest-key" commands. */
8981 install_element (INTERFACE_NODE
, &ip_ospf_message_digest_key_cmd
);
8982 install_element (INTERFACE_NODE
, &no_ip_ospf_message_digest_key_cmd
);
8984 /* "ip ospf cost" commands. */
8985 install_element (INTERFACE_NODE
, &ip_ospf_cost_cmd
);
8986 install_element (INTERFACE_NODE
, &no_ip_ospf_cost_cmd
);
8988 /* "ip ospf mtu-ignore" commands. */
8989 install_element (INTERFACE_NODE
, &ip_ospf_mtu_ignore_addr_cmd
);
8990 install_element (INTERFACE_NODE
, &no_ip_ospf_mtu_ignore_addr_cmd
);
8992 /* "ip ospf dead-interval" commands. */
8993 install_element (INTERFACE_NODE
, &ip_ospf_dead_interval_cmd
);
8994 install_element (INTERFACE_NODE
, &ip_ospf_dead_interval_minimal_addr_cmd
);
8995 install_element (INTERFACE_NODE
, &no_ip_ospf_dead_interval_cmd
);
8997 /* "ip ospf hello-interval" commands. */
8998 install_element (INTERFACE_NODE
, &ip_ospf_hello_interval_cmd
);
8999 install_element (INTERFACE_NODE
, &no_ip_ospf_hello_interval_cmd
);
9001 /* "ip ospf network" commands. */
9002 install_element (INTERFACE_NODE
, &ip_ospf_network_cmd
);
9003 install_element (INTERFACE_NODE
, &no_ip_ospf_network_cmd
);
9005 /* "ip ospf priority" commands. */
9006 install_element (INTERFACE_NODE
, &ip_ospf_priority_cmd
);
9007 install_element (INTERFACE_NODE
, &no_ip_ospf_priority_cmd
);
9009 /* "ip ospf retransmit-interval" commands. */
9010 install_element (INTERFACE_NODE
, &ip_ospf_retransmit_interval_addr_cmd
);
9011 install_element (INTERFACE_NODE
, &no_ip_ospf_retransmit_interval_addr_cmd
);
9013 /* "ip ospf transmit-delay" commands. */
9014 install_element (INTERFACE_NODE
, &ip_ospf_transmit_delay_addr_cmd
);
9015 install_element (INTERFACE_NODE
, &no_ip_ospf_transmit_delay_addr_cmd
);
9017 /* "ip ospf area" commands. */
9018 install_element (INTERFACE_NODE
, &ip_ospf_area_cmd
);
9019 install_element (INTERFACE_NODE
, &no_ip_ospf_area_cmd
);
9021 /* These commands are compatibitliy for previous version. */
9022 install_element (INTERFACE_NODE
, &ospf_authentication_key_cmd
);
9023 install_element (INTERFACE_NODE
, &ospf_message_digest_key_cmd
);
9024 install_element (INTERFACE_NODE
, &no_ospf_message_digest_key_cmd
);
9025 install_element (INTERFACE_NODE
, &ospf_dead_interval_cmd
);
9026 install_element (INTERFACE_NODE
, &no_ospf_dead_interval_cmd
);
9027 install_element (INTERFACE_NODE
, &ospf_hello_interval_cmd
);
9028 install_element (INTERFACE_NODE
, &no_ospf_hello_interval_cmd
);
9029 install_element (INTERFACE_NODE
, &ospf_cost_cmd
);
9030 install_element (INTERFACE_NODE
, &no_ospf_cost_cmd
);
9031 install_element (INTERFACE_NODE
, &ospf_network_cmd
);
9032 install_element (INTERFACE_NODE
, &no_ospf_network_cmd
);
9033 install_element (INTERFACE_NODE
, &ospf_priority_cmd
);
9034 install_element (INTERFACE_NODE
, &no_ospf_priority_cmd
);
9035 install_element (INTERFACE_NODE
, &ospf_retransmit_interval_cmd
);
9036 install_element (INTERFACE_NODE
, &no_ospf_retransmit_interval_cmd
);
9037 install_element (INTERFACE_NODE
, &ospf_transmit_delay_cmd
);
9038 install_element (INTERFACE_NODE
, &no_ospf_transmit_delay_cmd
);
9042 ospf_vty_zebra_init (void)
9044 install_element (OSPF_NODE
, &ospf_redistribute_source_cmd
);
9045 install_element (OSPF_NODE
, &no_ospf_redistribute_source_cmd
);
9046 install_element (OSPF_NODE
, &ospf_redistribute_instance_source_cmd
);
9047 install_element (OSPF_NODE
, &no_ospf_redistribute_instance_source_cmd
);
9049 install_element (OSPF_NODE
, &ospf_distribute_list_out_cmd
);
9050 install_element (OSPF_NODE
, &no_ospf_distribute_list_out_cmd
);
9052 install_element (OSPF_NODE
, &ospf_default_information_originate_cmd
);
9053 install_element (OSPF_NODE
, &no_ospf_default_information_originate_cmd
);
9055 install_element (OSPF_NODE
, &ospf_default_metric_cmd
);
9056 install_element (OSPF_NODE
, &no_ospf_default_metric_cmd
);
9058 install_element (OSPF_NODE
, &ospf_distance_cmd
);
9059 install_element (OSPF_NODE
, &no_ospf_distance_cmd
);
9060 install_element (OSPF_NODE
, &no_ospf_distance_ospf_cmd
);
9061 install_element (OSPF_NODE
, &ospf_distance_ospf_cmd
);
9063 install_element (OSPF_NODE
, &ospf_distance_source_cmd
);
9064 install_element (OSPF_NODE
, &no_ospf_distance_source_cmd
);
9065 install_element (OSPF_NODE
, &ospf_distance_source_access_list_cmd
);
9066 install_element (OSPF_NODE
, &no_ospf_distance_source_access_list_cmd
);
9070 static struct cmd_node ospf_node
=
9073 "%s(config-router)# ",
9078 ospf_interface_clear (struct interface
*ifp
)
9080 if (!if_is_operative (ifp
)) return;
9082 if (IS_DEBUG_OSPF (ism
, ISM_EVENTS
))
9083 zlog_debug("ISM[%s]: clear by reset", ifp
->name
);
9088 DEFUN (clear_ip_ospf_interface
,
9089 clear_ip_ospf_interface_cmd
,
9090 "clear ip ospf interface [IFNAME]",
9093 "OSPF information\n"
9094 "Interface information\n"
9098 struct interface
*ifp
;
9099 struct listnode
*node
;
9101 if (argc
== 4) /* Clear all the ospfv2 interfaces. */
9103 for (ALL_LIST_ELEMENTS_RO (vrf_iflist (VRF_DEFAULT
), node
, ifp
))
9104 ospf_interface_clear(ifp
);
9106 else /* Interface name is specified. */
9108 if ((ifp
= if_lookup_by_name (argv
[idx_ifname
]->text
, VRF_DEFAULT
)) == NULL
)
9109 vty_out (vty
, "No such interface name%s", VTY_NEWLINE
);
9111 ospf_interface_clear(ifp
);
9118 ospf_vty_clear_init (void)
9120 install_element (ENABLE_NODE
, &clear_ip_ospf_interface_cmd
);
9124 /* Install OSPF related vty commands. */
9126 ospf_vty_init (void)
9128 /* Install ospf top node. */
9129 install_node (&ospf_node
, ospf_config_write
);
9131 /* "router ospf" commands. */
9132 install_element (CONFIG_NODE
, &router_ospf_cmd
);
9133 install_element (CONFIG_NODE
, &no_router_ospf_cmd
);
9136 install_default (OSPF_NODE
);
9138 /* "ospf router-id" commands. */
9139 install_element (OSPF_NODE
, &ospf_router_id_cmd
);
9140 install_element (OSPF_NODE
, &ospf_router_id_old_cmd
);
9141 install_element (OSPF_NODE
, &no_ospf_router_id_cmd
);
9143 /* "passive-interface" commands. */
9144 install_element (OSPF_NODE
, &ospf_passive_interface_addr_cmd
);
9145 install_element (OSPF_NODE
, &no_ospf_passive_interface_addr_cmd
);
9147 /* "ospf abr-type" commands. */
9148 install_element (OSPF_NODE
, &ospf_abr_type_cmd
);
9149 install_element (OSPF_NODE
, &no_ospf_abr_type_cmd
);
9151 /* "ospf log-adjacency-changes" commands. */
9152 install_element (OSPF_NODE
, &ospf_log_adjacency_changes_cmd
);
9153 install_element (OSPF_NODE
, &ospf_log_adjacency_changes_detail_cmd
);
9154 install_element (OSPF_NODE
, &no_ospf_log_adjacency_changes_cmd
);
9155 install_element (OSPF_NODE
, &no_ospf_log_adjacency_changes_detail_cmd
);
9157 /* "ospf rfc1583-compatible" commands. */
9158 install_element (OSPF_NODE
, &ospf_compatible_rfc1583_cmd
);
9159 install_element (OSPF_NODE
, &no_ospf_compatible_rfc1583_cmd
);
9160 install_element (OSPF_NODE
, &ospf_rfc1583_flag_cmd
);
9161 install_element (OSPF_NODE
, &no_ospf_rfc1583_flag_cmd
);
9163 /* "network area" commands. */
9164 install_element (OSPF_NODE
, &ospf_network_area_cmd
);
9165 install_element (OSPF_NODE
, &no_ospf_network_area_cmd
);
9167 /* "area authentication" commands. */
9168 install_element (OSPF_NODE
, &ospf_area_authentication_message_digest_cmd
);
9169 install_element (OSPF_NODE
, &ospf_area_authentication_cmd
);
9170 install_element (OSPF_NODE
, &no_ospf_area_authentication_cmd
);
9172 /* "area range" commands. */
9173 install_element (OSPF_NODE
, &ospf_area_range_cmd
);
9174 install_element (OSPF_NODE
, &ospf_area_range_cost_cmd
);
9175 install_element (OSPF_NODE
, &ospf_area_range_not_advertise_cmd
);
9176 install_element (OSPF_NODE
, &no_ospf_area_range_cmd
);
9177 install_element (OSPF_NODE
, &ospf_area_range_substitute_cmd
);
9178 install_element (OSPF_NODE
, &no_ospf_area_range_substitute_cmd
);
9180 /* "area virtual-link" commands. */
9181 install_element (OSPF_NODE
, &ospf_area_vlink_cmd
);
9182 install_element (OSPF_NODE
, &ospf_area_vlink_intervals_cmd
);
9183 install_element (OSPF_NODE
, &no_ospf_area_vlink_cmd
);
9184 install_element (OSPF_NODE
, &no_ospf_area_vlink_intervals_cmd
);
9195 /* "area stub" commands. */
9196 install_element (OSPF_NODE
, &ospf_area_stub_no_summary_cmd
);
9197 install_element (OSPF_NODE
, &ospf_area_stub_cmd
);
9198 install_element (OSPF_NODE
, &no_ospf_area_stub_no_summary_cmd
);
9199 install_element (OSPF_NODE
, &no_ospf_area_stub_cmd
);
9201 /* "area nssa" commands. */
9202 install_element (OSPF_NODE
, &ospf_area_nssa_cmd
);
9203 install_element (OSPF_NODE
, &ospf_area_nssa_translate_no_summary_cmd
);
9204 install_element (OSPF_NODE
, &ospf_area_nssa_translate_cmd
);
9205 install_element (OSPF_NODE
, &ospf_area_nssa_no_summary_cmd
);
9206 install_element (OSPF_NODE
, &no_ospf_area_nssa_cmd
);
9208 install_element (OSPF_NODE
, &ospf_area_default_cost_cmd
);
9209 install_element (OSPF_NODE
, &no_ospf_area_default_cost_cmd
);
9211 install_element (OSPF_NODE
, &ospf_area_shortcut_cmd
);
9212 install_element (OSPF_NODE
, &no_ospf_area_shortcut_cmd
);
9214 install_element (OSPF_NODE
, &ospf_area_export_list_cmd
);
9215 install_element (OSPF_NODE
, &no_ospf_area_export_list_cmd
);
9217 install_element (OSPF_NODE
, &ospf_area_filter_list_cmd
);
9218 install_element (OSPF_NODE
, &no_ospf_area_filter_list_cmd
);
9220 install_element (OSPF_NODE
, &ospf_area_import_list_cmd
);
9221 install_element (OSPF_NODE
, &no_ospf_area_import_list_cmd
);
9223 /* SPF timer commands */
9224 install_element (OSPF_NODE
, &ospf_timers_throttle_spf_cmd
);
9225 install_element (OSPF_NODE
, &no_ospf_timers_throttle_spf_cmd
);
9227 /* LSA timers commands */
9228 install_element (OSPF_NODE
, &ospf_timers_min_ls_interval_cmd
);
9229 install_element (OSPF_NODE
, &no_ospf_timers_min_ls_interval_cmd
);
9230 install_element (OSPF_NODE
, &ospf_timers_min_ls_arrival_cmd
);
9231 install_element (OSPF_NODE
, &no_ospf_timers_min_ls_arrival_cmd
);
9232 install_element (OSPF_NODE
, &ospf_timers_lsa_cmd
);
9233 install_element (OSPF_NODE
, &no_ospf_timers_lsa_cmd
);
9235 /* refresh timer commands */
9236 install_element (OSPF_NODE
, &ospf_refresh_timer_cmd
);
9237 install_element (OSPF_NODE
, &no_ospf_refresh_timer_val_cmd
);
9239 /* max-metric commands */
9240 install_element (OSPF_NODE
, &ospf_max_metric_router_lsa_admin_cmd
);
9241 install_element (OSPF_NODE
, &no_ospf_max_metric_router_lsa_admin_cmd
);
9242 install_element (OSPF_NODE
, &ospf_max_metric_router_lsa_startup_cmd
);
9243 install_element (OSPF_NODE
, &no_ospf_max_metric_router_lsa_startup_cmd
);
9244 install_element (OSPF_NODE
, &ospf_max_metric_router_lsa_shutdown_cmd
);
9245 install_element (OSPF_NODE
, &no_ospf_max_metric_router_lsa_shutdown_cmd
);
9247 /* reference bandwidth commands */
9248 install_element (OSPF_NODE
, &ospf_auto_cost_reference_bandwidth_cmd
);
9249 install_element (OSPF_NODE
, &no_ospf_auto_cost_reference_bandwidth_cmd
);
9251 /* "neighbor" commands. */
9252 install_element (OSPF_NODE
, &ospf_neighbor_cmd
);
9253 install_element (OSPF_NODE
, &ospf_neighbor_poll_interval_cmd
);
9254 install_element (OSPF_NODE
, &no_ospf_neighbor_cmd
);
9255 install_element (OSPF_NODE
, &no_ospf_neighbor_poll_cmd
);
9257 /* write multiplier commands */
9258 install_element (OSPF_NODE
, &ospf_write_multiplier_cmd
);
9259 install_element (OSPF_NODE
, &write_multiplier_cmd
);
9260 install_element (OSPF_NODE
, &no_ospf_write_multiplier_cmd
);
9261 install_element (OSPF_NODE
, &no_write_multiplier_cmd
);
9263 /* Init interface related vty commands. */
9264 ospf_vty_if_init ();
9266 /* Init zebra related vty commands. */
9267 ospf_vty_zebra_init ();