2 * IS-IS Rout(e)ing protocol - isis_circuit.h
4 * Copyright (C) 2001,2002 Sampo Saaristo
5 * Tampere University of Technology
6 * Institute of Communications Engineering
7 * Copyright (C) 2016 David Lamparter, for NetDEF, Inc.
9 * This program is free software; you can redistribute it and/or modify it
10 * under the terms of the GNU General Public Licenseas published by the Free
11 * Software Foundation; either version 2 of the License, or (at your option)
14 * This program is distributed in the hope that it will be useful,but WITHOUT
15 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
19 * You should have received a copy of the GNU General Public License along
20 * with this program; see the file COPYING; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
27 #include "spf_backoff.h"
29 #include "isis_circuit.h"
31 #include "isis_misc.h"
35 static struct isis_circuit
*isis_circuit_lookup(struct vty
*vty
)
37 struct interface
*ifp
= VTY_GET_CONTEXT(interface
);
38 struct isis_circuit
*circuit
;
41 vty_out(vty
, "Invalid interface \n");
45 circuit
= circuit_scan_by_ifp(ifp
);
47 vty_out(vty
, "ISIS is not enabled on circuit %s\n", ifp
->name
);
54 DEFUN (ip_router_isis
,
56 "ip router isis WORD",
57 "Interface Internet Protocol config commands\n"
58 "IP router interface commands\n"
59 "IS-IS Routing for IP\n"
60 "Routing process tag\n")
64 VTY_DECLVAR_CONTEXT(interface
, ifp
);
65 struct isis_circuit
*circuit
;
66 struct isis_area
*area
;
67 const char *af
= argv
[idx_afi
]->arg
;
68 const char *area_tag
= argv
[idx_word
]->arg
;
70 /* Prevent more than one area per circuit */
71 circuit
= circuit_scan_by_ifp(ifp
);
72 if (circuit
&& circuit
->area
) {
73 if (strcmp(circuit
->area
->area_tag
, area_tag
)) {
74 vty_out(vty
, "ISIS circuit is already defined on %s\n",
75 circuit
->area
->area_tag
);
76 return CMD_ERR_NOTHING_TODO
;
80 area
= isis_area_lookup(area_tag
);
82 area
= isis_area_create(area_tag
);
84 if (!circuit
|| !circuit
->area
) {
85 circuit
= isis_circuit_create(area
, ifp
);
87 if (circuit
->state
!= C_STATE_CONF
88 && circuit
->state
!= C_STATE_UP
) {
90 "Couldn't bring up interface, please check log.\n");
91 return CMD_WARNING_CONFIG_FAILED
;
95 bool ip
= circuit
->ip_router
, ipv6
= circuit
->ipv6_router
;
101 isis_circuit_af_set(circuit
, ip
, ipv6
);
105 DEFUN (ip6_router_isis
,
107 "ipv6 router isis WORD",
108 "Interface Internet Protocol config commands\n"
109 "IP router interface commands\n"
110 "IS-IS Routing for IP\n"
111 "Routing process tag\n")
113 return ip_router_isis(self
, vty
, argc
, argv
);
116 DEFUN (no_ip_router_isis
,
117 no_ip_router_isis_cmd
,
118 "no <ip|ipv6> router isis WORD",
120 "Interface Internet Protocol config commands\n"
121 "IP router interface commands\n"
122 "IP router interface commands\n"
123 "IS-IS Routing for IP\n"
124 "Routing process tag\n")
128 VTY_DECLVAR_CONTEXT(interface
, ifp
);
129 struct isis_area
*area
;
130 struct isis_circuit
*circuit
;
131 const char *af
= argv
[idx_afi
]->arg
;
132 const char *area_tag
= argv
[idx_word
]->arg
;
134 area
= isis_area_lookup(area_tag
);
136 vty_out(vty
, "Can't find ISIS instance %s\n",
138 return CMD_ERR_NO_MATCH
;
141 circuit
= circuit_lookup_by_ifp(ifp
, area
->circuit_list
);
143 vty_out(vty
, "ISIS is not enabled on circuit %s\n", ifp
->name
);
144 return CMD_ERR_NO_MATCH
;
147 bool ip
= circuit
->ip_router
, ipv6
= circuit
->ipv6_router
;
153 isis_circuit_af_set(circuit
, ip
, ipv6
);
161 "Configure the passive mode for interface\n")
163 struct isis_circuit
*circuit
= isis_circuit_lookup(vty
);
165 return CMD_ERR_NO_MATCH
;
167 CMD_FERR_RETURN(isis_circuit_passive_set(circuit
, 1),
168 "Cannot set passive: $ERR");
172 DEFUN (no_isis_passive
,
177 "Configure the passive mode for interface\n")
179 struct isis_circuit
*circuit
= isis_circuit_lookup(vty
);
181 return CMD_ERR_NO_MATCH
;
183 CMD_FERR_RETURN(isis_circuit_passive_set(circuit
, 0),
184 "Cannot set no passive: $ERR");
188 DEFUN (isis_circuit_type
,
189 isis_circuit_type_cmd
,
190 "isis circuit-type <level-1|level-1-2|level-2-only>",
192 "Configure circuit type for interface\n"
193 "Level-1 only adjacencies are formed\n"
194 "Level-1-2 adjacencies are formed\n"
195 "Level-2 only adjacencies are formed\n")
199 struct isis_circuit
*circuit
= isis_circuit_lookup(vty
);
201 return CMD_ERR_NO_MATCH
;
203 is_type
= string2circuit_t(argv
[idx_level
]->arg
);
205 vty_out(vty
, "Unknown circuit-type \n");
206 return CMD_WARNING_CONFIG_FAILED
;
209 if (circuit
->state
== C_STATE_UP
210 && circuit
->area
->is_type
!= IS_LEVEL_1_AND_2
211 && circuit
->area
->is_type
!= is_type
) {
212 vty_out(vty
, "Invalid circuit level for area %s.\n",
213 circuit
->area
->area_tag
);
214 return CMD_WARNING_CONFIG_FAILED
;
216 isis_circuit_is_type_set(circuit
, is_type
);
221 DEFUN (no_isis_circuit_type
,
222 no_isis_circuit_type_cmd
,
223 "no isis circuit-type <level-1|level-1-2|level-2-only>",
226 "Configure circuit type for interface\n"
227 "Level-1 only adjacencies are formed\n"
228 "Level-1-2 adjacencies are formed\n"
229 "Level-2 only adjacencies are formed\n")
232 struct isis_circuit
*circuit
= isis_circuit_lookup(vty
);
234 return CMD_ERR_NO_MATCH
;
237 * Set the circuits level to its default value
239 if (circuit
->state
== C_STATE_UP
)
240 is_type
= circuit
->area
->is_type
;
242 is_type
= IS_LEVEL_1_AND_2
;
243 isis_circuit_is_type_set(circuit
, is_type
);
250 "isis network point-to-point",
253 "point-to-point network type\n")
255 struct isis_circuit
*circuit
= isis_circuit_lookup(vty
);
257 return CMD_ERR_NO_MATCH
;
259 if (isis_circuit_circ_type_set(circuit
, CIRCUIT_T_P2P
)) {
261 "isis network point-to-point is valid only on broadcast interfaces\n");
262 return CMD_WARNING_CONFIG_FAILED
;
268 DEFUN (no_isis_network
,
270 "no isis network point-to-point",
273 "Set network type for circuit\n"
274 "point-to-point network type\n")
276 struct isis_circuit
*circuit
= isis_circuit_lookup(vty
);
278 return CMD_ERR_NO_MATCH
;
280 if (isis_circuit_circ_type_set(circuit
, CIRCUIT_T_BROADCAST
)) {
282 "isis network point-to-point is valid only on broadcast interfaces\n");
283 return CMD_WARNING_CONFIG_FAILED
;
291 "isis password <md5|clear> WORD",
293 "Configure the authentication password for a circuit\n"
294 "HMAC-MD5 authentication\n"
295 "Cleartext password\n"
296 "Circuit password\n")
298 int idx_encryption
= 2;
300 struct isis_circuit
*circuit
= isis_circuit_lookup(vty
);
304 return CMD_ERR_NO_MATCH
;
306 if (argv
[idx_encryption
]->arg
[0] == 'm')
307 rv
= isis_circuit_passwd_hmac_md5_set(circuit
,
308 argv
[idx_word
]->arg
);
310 rv
= isis_circuit_passwd_cleartext_set(circuit
,
311 argv
[idx_word
]->arg
);
313 CMD_FERR_RETURN(rv
, "Failed to set circuit password: $ERR");
317 DEFUN (no_isis_passwd
,
319 "no isis password [<md5|clear> WORD]",
322 "Configure the authentication password for a circuit\n"
323 "HMAC-MD5 authentication\n"
324 "Cleartext password\n"
325 "Circuit password\n")
327 struct isis_circuit
*circuit
= isis_circuit_lookup(vty
);
329 return CMD_ERR_NO_MATCH
;
331 CMD_FERR_RETURN(isis_circuit_passwd_unset(circuit
),
332 "Failed to unset circuit password: $ERR");
337 DEFUN (isis_priority
,
339 "isis priority (0-127)",
341 "Set priority for Designated Router election\n"
346 struct isis_circuit
*circuit
= isis_circuit_lookup(vty
);
348 return CMD_ERR_NO_MATCH
;
350 prio
= atoi(argv
[idx_number
]->arg
);
351 if (prio
< MIN_PRIORITY
|| prio
> MAX_PRIORITY
) {
352 vty_out(vty
, "Invalid priority %d - should be <0-127>\n", prio
);
353 return CMD_WARNING_CONFIG_FAILED
;
356 circuit
->priority
[0] = prio
;
357 circuit
->priority
[1] = prio
;
362 DEFUN (no_isis_priority
,
363 no_isis_priority_cmd
,
364 "no isis priority [(0-127)]",
367 "Set priority for Designated Router election\n"
370 struct isis_circuit
*circuit
= isis_circuit_lookup(vty
);
372 return CMD_ERR_NO_MATCH
;
374 circuit
->priority
[0] = DEFAULT_PRIORITY
;
375 circuit
->priority
[1] = DEFAULT_PRIORITY
;
381 DEFUN (isis_priority_l1
,
382 isis_priority_l1_cmd
,
383 "isis priority (0-127) level-1",
385 "Set priority for Designated Router election\n"
387 "Specify priority for level-1 routing\n")
391 struct isis_circuit
*circuit
= isis_circuit_lookup(vty
);
393 return CMD_ERR_NO_MATCH
;
395 prio
= atoi(argv
[idx_number
]->arg
);
396 if (prio
< MIN_PRIORITY
|| prio
> MAX_PRIORITY
) {
397 vty_out(vty
, "Invalid priority %d - should be <0-127>\n", prio
);
398 return CMD_WARNING_CONFIG_FAILED
;
401 circuit
->priority
[0] = prio
;
406 DEFUN (no_isis_priority_l1
,
407 no_isis_priority_l1_cmd
,
408 "no isis priority [(0-127)] level-1",
411 "Set priority for Designated Router election\n"
413 "Specify priority for level-1 routing\n")
415 struct isis_circuit
*circuit
= isis_circuit_lookup(vty
);
417 return CMD_ERR_NO_MATCH
;
419 circuit
->priority
[0] = DEFAULT_PRIORITY
;
425 DEFUN (isis_priority_l2
,
426 isis_priority_l2_cmd
,
427 "isis priority (0-127) level-2",
429 "Set priority for Designated Router election\n"
431 "Specify priority for level-2 routing\n")
435 struct isis_circuit
*circuit
= isis_circuit_lookup(vty
);
437 return CMD_ERR_NO_MATCH
;
439 prio
= atoi(argv
[idx_number
]->arg
);
440 if (prio
< MIN_PRIORITY
|| prio
> MAX_PRIORITY
) {
441 vty_out(vty
, "Invalid priority %d - should be <0-127>\n", prio
);
442 return CMD_WARNING_CONFIG_FAILED
;
445 circuit
->priority
[1] = prio
;
450 DEFUN (no_isis_priority_l2
,
451 no_isis_priority_l2_cmd
,
452 "no isis priority [(0-127)] level-2",
455 "Set priority for Designated Router election\n"
457 "Specify priority for level-2 routing\n")
459 struct isis_circuit
*circuit
= isis_circuit_lookup(vty
);
461 return CMD_ERR_NO_MATCH
;
463 circuit
->priority
[1] = DEFAULT_PRIORITY
;
472 "isis metric (0-16777215)",
474 "Set default metric for circuit\n"
475 "Default metric value\n")
479 struct isis_circuit
*circuit
= isis_circuit_lookup(vty
);
481 return CMD_ERR_NO_MATCH
;
483 met
= atoi(argv
[idx_number
]->arg
);
485 /* RFC3787 section 5.1 */
486 if (circuit
->area
&& circuit
->area
->oldmetric
== 1
487 && met
> MAX_NARROW_LINK_METRIC
) {
489 "Invalid metric %d - should be <0-63> "
490 "when narrow metric type enabled\n",
492 return CMD_WARNING_CONFIG_FAILED
;
496 if (circuit
->area
&& circuit
->area
->newmetric
== 1
497 && met
> MAX_WIDE_LINK_METRIC
) {
499 "Invalid metric %d - should be <0-16777215> "
500 "when wide metric type enabled\n",
502 return CMD_WARNING_CONFIG_FAILED
;
505 CMD_FERR_RETURN(isis_circuit_metric_set(circuit
, IS_LEVEL_1
, met
),
506 "Failed to set L1 metric: $ERR");
507 CMD_FERR_RETURN(isis_circuit_metric_set(circuit
, IS_LEVEL_2
, met
),
508 "Failed to set L2 metric: $ERR");
513 DEFUN (no_isis_metric
,
515 "no isis metric [(0-16777215)]",
518 "Set default metric for circuit\n"
519 "Default metric value\n")
521 struct isis_circuit
*circuit
= isis_circuit_lookup(vty
);
523 return CMD_ERR_NO_MATCH
;
525 CMD_FERR_RETURN(isis_circuit_metric_set(circuit
, IS_LEVEL_1
,
526 DEFAULT_CIRCUIT_METRIC
),
527 "Failed to set L1 metric: $ERR");
528 CMD_FERR_RETURN(isis_circuit_metric_set(circuit
, IS_LEVEL_2
,
529 DEFAULT_CIRCUIT_METRIC
),
530 "Failed to set L2 metric: $ERR");
535 DEFUN (isis_metric_l1
,
537 "isis metric (0-16777215) level-1",
539 "Set default metric for circuit\n"
540 "Default metric value\n"
541 "Specify metric for level-1 routing\n")
545 struct isis_circuit
*circuit
= isis_circuit_lookup(vty
);
547 return CMD_ERR_NO_MATCH
;
549 met
= atoi(argv
[idx_number
]->arg
);
550 CMD_FERR_RETURN(isis_circuit_metric_set(circuit
, IS_LEVEL_1
, met
),
551 "Failed to set L1 metric: $ERR");
556 DEFUN (no_isis_metric_l1
,
557 no_isis_metric_l1_cmd
,
558 "no isis metric [(0-16777215)] level-1",
561 "Set default metric for circuit\n"
562 "Default metric value\n"
563 "Specify metric for level-1 routing\n")
565 struct isis_circuit
*circuit
= isis_circuit_lookup(vty
);
567 return CMD_ERR_NO_MATCH
;
569 CMD_FERR_RETURN(isis_circuit_metric_set(circuit
, IS_LEVEL_1
,
570 DEFAULT_CIRCUIT_METRIC
),
571 "Failed to set L1 metric: $ERR");
576 DEFUN (isis_metric_l2
,
578 "isis metric (0-16777215) level-2",
580 "Set default metric for circuit\n"
581 "Default metric value\n"
582 "Specify metric for level-2 routing\n")
586 struct isis_circuit
*circuit
= isis_circuit_lookup(vty
);
588 return CMD_ERR_NO_MATCH
;
590 met
= atoi(argv
[idx_number
]->arg
);
591 CMD_FERR_RETURN(isis_circuit_metric_set(circuit
, IS_LEVEL_2
, met
),
592 "Failed to set L2 metric: $ERR");
597 DEFUN (no_isis_metric_l2
,
598 no_isis_metric_l2_cmd
,
599 "no isis metric [(0-16777215)] level-2",
602 "Set default metric for circuit\n"
603 "Default metric value\n"
604 "Specify metric for level-2 routing\n")
606 struct isis_circuit
*circuit
= isis_circuit_lookup(vty
);
608 return CMD_ERR_NO_MATCH
;
610 CMD_FERR_RETURN(isis_circuit_metric_set(circuit
, IS_LEVEL_2
,
611 DEFAULT_CIRCUIT_METRIC
),
612 "Failed to set L2 metric: $ERR");
618 DEFUN (isis_hello_interval
,
619 isis_hello_interval_cmd
,
620 "isis hello-interval (1-600)",
622 "Set Hello interval\n"
623 "Holdtime 1 seconds, interval depends on multiplier\n")
627 struct isis_circuit
*circuit
= isis_circuit_lookup(vty
);
629 return CMD_ERR_NO_MATCH
;
631 interval
= atoi(argv
[idx_number
]->arg
);
632 if (interval
< MIN_HELLO_INTERVAL
|| interval
> MAX_HELLO_INTERVAL
) {
633 vty_out(vty
, "Invalid hello-interval %d - should be <1-600>\n",
635 return CMD_WARNING_CONFIG_FAILED
;
638 circuit
->hello_interval
[0] = (uint16_t)interval
;
639 circuit
->hello_interval
[1] = (uint16_t)interval
;
645 DEFUN (no_isis_hello_interval
,
646 no_isis_hello_interval_cmd
,
647 "no isis hello-interval [(1-600)]",
650 "Set Hello interval\n"
651 "Holdtime 1 second, interval depends on multiplier\n")
653 struct isis_circuit
*circuit
= isis_circuit_lookup(vty
);
655 return CMD_ERR_NO_MATCH
;
657 circuit
->hello_interval
[0] = DEFAULT_HELLO_INTERVAL
;
658 circuit
->hello_interval
[1] = DEFAULT_HELLO_INTERVAL
;
664 DEFUN (isis_hello_interval_l1
,
665 isis_hello_interval_l1_cmd
,
666 "isis hello-interval (1-600) level-1",
668 "Set Hello interval\n"
669 "Holdtime 1 second, interval depends on multiplier\n"
670 "Specify hello-interval for level-1 IIHs\n")
674 struct isis_circuit
*circuit
= isis_circuit_lookup(vty
);
676 return CMD_ERR_NO_MATCH
;
678 interval
= atoi(argv
[idx_number
]->arg
);
679 if (interval
< MIN_HELLO_INTERVAL
|| interval
> MAX_HELLO_INTERVAL
) {
680 vty_out(vty
, "Invalid hello-interval %ld - should be <1-600>\n",
682 return CMD_WARNING_CONFIG_FAILED
;
685 circuit
->hello_interval
[0] = (uint16_t)interval
;
691 DEFUN (no_isis_hello_interval_l1
,
692 no_isis_hello_interval_l1_cmd
,
693 "no isis hello-interval [(1-600)] level-1",
696 "Set Hello interval\n"
697 "Holdtime 1 second, interval depends on multiplier\n"
698 "Specify hello-interval for level-1 IIHs\n")
700 struct isis_circuit
*circuit
= isis_circuit_lookup(vty
);
702 return CMD_ERR_NO_MATCH
;
704 circuit
->hello_interval
[0] = DEFAULT_HELLO_INTERVAL
;
710 DEFUN (isis_hello_interval_l2
,
711 isis_hello_interval_l2_cmd
,
712 "isis hello-interval (1-600) level-2",
714 "Set Hello interval\n"
715 "Holdtime 1 second, interval depends on multiplier\n"
716 "Specify hello-interval for level-2 IIHs\n")
720 struct isis_circuit
*circuit
= isis_circuit_lookup(vty
);
722 return CMD_ERR_NO_MATCH
;
724 interval
= atoi(argv
[idx_number
]->arg
);
725 if (interval
< MIN_HELLO_INTERVAL
|| interval
> MAX_HELLO_INTERVAL
) {
726 vty_out(vty
, "Invalid hello-interval %ld - should be <1-600>\n",
728 return CMD_WARNING_CONFIG_FAILED
;
731 circuit
->hello_interval
[1] = (uint16_t)interval
;
737 DEFUN (no_isis_hello_interval_l2
,
738 no_isis_hello_interval_l2_cmd
,
739 "no isis hello-interval [(1-600)] level-2",
742 "Set Hello interval\n"
743 "Holdtime 1 second, interval depends on multiplier\n"
744 "Specify hello-interval for level-2 IIHs\n")
746 struct isis_circuit
*circuit
= isis_circuit_lookup(vty
);
748 return CMD_ERR_NO_MATCH
;
750 circuit
->hello_interval
[1] = DEFAULT_HELLO_INTERVAL
;
756 DEFUN (isis_hello_multiplier
,
757 isis_hello_multiplier_cmd
,
758 "isis hello-multiplier (2-100)",
760 "Set multiplier for Hello holding time\n"
761 "Hello multiplier value\n")
765 struct isis_circuit
*circuit
= isis_circuit_lookup(vty
);
767 return CMD_ERR_NO_MATCH
;
769 mult
= atoi(argv
[idx_number
]->arg
);
770 if (mult
< MIN_HELLO_MULTIPLIER
|| mult
> MAX_HELLO_MULTIPLIER
) {
772 "Invalid hello-multiplier %d - should be <2-100>\n",
774 return CMD_WARNING_CONFIG_FAILED
;
777 circuit
->hello_multiplier
[0] = (uint16_t)mult
;
778 circuit
->hello_multiplier
[1] = (uint16_t)mult
;
784 DEFUN (no_isis_hello_multiplier
,
785 no_isis_hello_multiplier_cmd
,
786 "no isis hello-multiplier [(2-100)]",
789 "Set multiplier for Hello holding time\n"
790 "Hello multiplier value\n")
792 struct isis_circuit
*circuit
= isis_circuit_lookup(vty
);
794 return CMD_ERR_NO_MATCH
;
796 circuit
->hello_multiplier
[0] = DEFAULT_HELLO_MULTIPLIER
;
797 circuit
->hello_multiplier
[1] = DEFAULT_HELLO_MULTIPLIER
;
803 DEFUN (isis_hello_multiplier_l1
,
804 isis_hello_multiplier_l1_cmd
,
805 "isis hello-multiplier (2-100) level-1",
807 "Set multiplier for Hello holding time\n"
808 "Hello multiplier value\n"
809 "Specify hello multiplier for level-1 IIHs\n")
813 struct isis_circuit
*circuit
= isis_circuit_lookup(vty
);
815 return CMD_ERR_NO_MATCH
;
817 mult
= atoi(argv
[idx_number
]->arg
);
818 if (mult
< MIN_HELLO_MULTIPLIER
|| mult
> MAX_HELLO_MULTIPLIER
) {
820 "Invalid hello-multiplier %d - should be <2-100>\n",
822 return CMD_WARNING_CONFIG_FAILED
;
825 circuit
->hello_multiplier
[0] = (uint16_t)mult
;
831 DEFUN (no_isis_hello_multiplier_l1
,
832 no_isis_hello_multiplier_l1_cmd
,
833 "no isis hello-multiplier [(2-100)] level-1",
836 "Set multiplier for Hello holding time\n"
837 "Hello multiplier value\n"
838 "Specify hello multiplier for level-1 IIHs\n")
840 struct isis_circuit
*circuit
= isis_circuit_lookup(vty
);
842 return CMD_ERR_NO_MATCH
;
844 circuit
->hello_multiplier
[0] = DEFAULT_HELLO_MULTIPLIER
;
850 DEFUN (isis_hello_multiplier_l2
,
851 isis_hello_multiplier_l2_cmd
,
852 "isis hello-multiplier (2-100) level-2",
854 "Set multiplier for Hello holding time\n"
855 "Hello multiplier value\n"
856 "Specify hello multiplier for level-2 IIHs\n")
860 struct isis_circuit
*circuit
= isis_circuit_lookup(vty
);
862 return CMD_ERR_NO_MATCH
;
864 mult
= atoi(argv
[idx_number
]->arg
);
865 if (mult
< MIN_HELLO_MULTIPLIER
|| mult
> MAX_HELLO_MULTIPLIER
) {
867 "Invalid hello-multiplier %d - should be <2-100>\n",
869 return CMD_WARNING_CONFIG_FAILED
;
872 circuit
->hello_multiplier
[1] = (uint16_t)mult
;
878 DEFUN (no_isis_hello_multiplier_l2
,
879 no_isis_hello_multiplier_l2_cmd
,
880 "no isis hello-multiplier [(2-100)] level-2",
883 "Set multiplier for Hello holding time\n"
884 "Hello multiplier value\n"
885 "Specify hello multiplier for level-2 IIHs\n")
887 struct isis_circuit
*circuit
= isis_circuit_lookup(vty
);
889 return CMD_ERR_NO_MATCH
;
891 circuit
->hello_multiplier
[1] = DEFAULT_HELLO_MULTIPLIER
;
897 DEFUN (isis_hello_padding
,
898 isis_hello_padding_cmd
,
899 "isis hello padding",
901 "Add padding to IS-IS hello packets\n"
902 "Pad hello packets\n")
904 struct isis_circuit
*circuit
= isis_circuit_lookup(vty
);
906 return CMD_ERR_NO_MATCH
;
908 circuit
->pad_hellos
= 1;
913 DEFUN (no_isis_hello_padding
,
914 no_isis_hello_padding_cmd
,
915 "no isis hello padding",
918 "Add padding to IS-IS hello packets\n"
919 "Pad hello packets\n")
921 struct isis_circuit
*circuit
= isis_circuit_lookup(vty
);
923 return CMD_ERR_NO_MATCH
;
925 circuit
->pad_hellos
= 0;
930 DEFUN (isis_threeway_adj
,
931 isis_threeway_adj_cmd
,
932 "[no] isis three-way-handshake",
935 "Enable/Disable three-way handshake\n")
937 struct isis_circuit
*circuit
= isis_circuit_lookup(vty
);
939 return CMD_ERR_NO_MATCH
;
941 circuit
->disable_threeway_adj
= !strcmp(argv
[0]->text
, "no");
945 DEFUN (csnp_interval
,
947 "isis csnp-interval (1-600)",
949 "Set CSNP interval in seconds\n"
950 "CSNP interval value\n")
953 unsigned long interval
;
954 struct isis_circuit
*circuit
= isis_circuit_lookup(vty
);
956 return CMD_ERR_NO_MATCH
;
958 interval
= atol(argv
[idx_number
]->arg
);
959 if (interval
< MIN_CSNP_INTERVAL
|| interval
> MAX_CSNP_INTERVAL
) {
960 vty_out(vty
, "Invalid csnp-interval %lu - should be <1-600>\n",
962 return CMD_WARNING_CONFIG_FAILED
;
965 circuit
->csnp_interval
[0] = (uint16_t)interval
;
966 circuit
->csnp_interval
[1] = (uint16_t)interval
;
972 DEFUN (no_csnp_interval
,
973 no_csnp_interval_cmd
,
974 "no isis csnp-interval [(1-600)]",
977 "Set CSNP interval in seconds\n"
978 "CSNP interval value\n")
980 struct isis_circuit
*circuit
= isis_circuit_lookup(vty
);
982 return CMD_ERR_NO_MATCH
;
984 circuit
->csnp_interval
[0] = DEFAULT_CSNP_INTERVAL
;
985 circuit
->csnp_interval
[1] = DEFAULT_CSNP_INTERVAL
;
991 DEFUN (csnp_interval_l1
,
992 csnp_interval_l1_cmd
,
993 "isis csnp-interval (1-600) level-1",
995 "Set CSNP interval in seconds\n"
996 "CSNP interval value\n"
997 "Specify interval for level-1 CSNPs\n")
1000 unsigned long interval
;
1001 struct isis_circuit
*circuit
= isis_circuit_lookup(vty
);
1003 return CMD_ERR_NO_MATCH
;
1005 interval
= atol(argv
[idx_number
]->arg
);
1006 if (interval
< MIN_CSNP_INTERVAL
|| interval
> MAX_CSNP_INTERVAL
) {
1007 vty_out(vty
, "Invalid csnp-interval %lu - should be <1-600>\n",
1009 return CMD_WARNING_CONFIG_FAILED
;
1012 circuit
->csnp_interval
[0] = (uint16_t)interval
;
1018 DEFUN (no_csnp_interval_l1
,
1019 no_csnp_interval_l1_cmd
,
1020 "no isis csnp-interval [(1-600)] level-1",
1023 "Set CSNP interval in seconds\n"
1024 "CSNP interval value\n"
1025 "Specify interval for level-1 CSNPs\n")
1027 struct isis_circuit
*circuit
= isis_circuit_lookup(vty
);
1029 return CMD_ERR_NO_MATCH
;
1031 circuit
->csnp_interval
[0] = DEFAULT_CSNP_INTERVAL
;
1037 DEFUN (csnp_interval_l2
,
1038 csnp_interval_l2_cmd
,
1039 "isis csnp-interval (1-600) level-2",
1041 "Set CSNP interval in seconds\n"
1042 "CSNP interval value\n"
1043 "Specify interval for level-2 CSNPs\n")
1046 unsigned long interval
;
1047 struct isis_circuit
*circuit
= isis_circuit_lookup(vty
);
1049 return CMD_ERR_NO_MATCH
;
1051 interval
= atol(argv
[idx_number
]->arg
);
1052 if (interval
< MIN_CSNP_INTERVAL
|| interval
> MAX_CSNP_INTERVAL
) {
1053 vty_out(vty
, "Invalid csnp-interval %lu - should be <1-600>\n",
1055 return CMD_WARNING_CONFIG_FAILED
;
1058 circuit
->csnp_interval
[1] = (uint16_t)interval
;
1064 DEFUN (no_csnp_interval_l2
,
1065 no_csnp_interval_l2_cmd
,
1066 "no isis csnp-interval [(1-600)] level-2",
1069 "Set CSNP interval in seconds\n"
1070 "CSNP interval value\n"
1071 "Specify interval for level-2 CSNPs\n")
1073 struct isis_circuit
*circuit
= isis_circuit_lookup(vty
);
1075 return CMD_ERR_NO_MATCH
;
1077 circuit
->csnp_interval
[1] = DEFAULT_CSNP_INTERVAL
;
1083 DEFUN (psnp_interval
,
1085 "isis psnp-interval (1-120)",
1087 "Set PSNP interval in seconds\n"
1088 "PSNP interval value\n")
1091 unsigned long interval
;
1092 struct isis_circuit
*circuit
= isis_circuit_lookup(vty
);
1094 return CMD_ERR_NO_MATCH
;
1096 interval
= atol(argv
[idx_number
]->arg
);
1097 if (interval
< MIN_PSNP_INTERVAL
|| interval
> MAX_PSNP_INTERVAL
) {
1098 vty_out(vty
, "Invalid psnp-interval %lu - should be <1-120>\n",
1100 return CMD_WARNING_CONFIG_FAILED
;
1103 circuit
->psnp_interval
[0] = (uint16_t)interval
;
1104 circuit
->psnp_interval
[1] = (uint16_t)interval
;
1110 DEFUN (no_psnp_interval
,
1111 no_psnp_interval_cmd
,
1112 "no isis psnp-interval [(1-120)]",
1115 "Set PSNP interval in seconds\n"
1116 "PSNP interval value\n")
1118 struct isis_circuit
*circuit
= isis_circuit_lookup(vty
);
1120 return CMD_ERR_NO_MATCH
;
1122 circuit
->psnp_interval
[0] = DEFAULT_PSNP_INTERVAL
;
1123 circuit
->psnp_interval
[1] = DEFAULT_PSNP_INTERVAL
;
1129 DEFUN (psnp_interval_l1
,
1130 psnp_interval_l1_cmd
,
1131 "isis psnp-interval (1-120) level-1",
1133 "Set PSNP interval in seconds\n"
1134 "PSNP interval value\n"
1135 "Specify interval for level-1 PSNPs\n")
1138 unsigned long interval
;
1139 struct isis_circuit
*circuit
= isis_circuit_lookup(vty
);
1141 return CMD_ERR_NO_MATCH
;
1143 interval
= atol(argv
[idx_number
]->arg
);
1144 if (interval
< MIN_PSNP_INTERVAL
|| interval
> MAX_PSNP_INTERVAL
) {
1145 vty_out(vty
, "Invalid psnp-interval %lu - should be <1-120>\n",
1147 return CMD_WARNING_CONFIG_FAILED
;
1150 circuit
->psnp_interval
[0] = (uint16_t)interval
;
1156 DEFUN (no_psnp_interval_l1
,
1157 no_psnp_interval_l1_cmd
,
1158 "no isis psnp-interval [(1-120)] level-1",
1161 "Set PSNP interval in seconds\n"
1162 "PSNP interval value\n"
1163 "Specify interval for level-1 PSNPs\n")
1165 struct isis_circuit
*circuit
= isis_circuit_lookup(vty
);
1167 return CMD_ERR_NO_MATCH
;
1169 circuit
->psnp_interval
[0] = DEFAULT_PSNP_INTERVAL
;
1175 DEFUN (psnp_interval_l2
,
1176 psnp_interval_l2_cmd
,
1177 "isis psnp-interval (1-120) level-2",
1179 "Set PSNP interval in seconds\n"
1180 "PSNP interval value\n"
1181 "Specify interval for level-2 PSNPs\n")
1184 unsigned long interval
;
1185 struct isis_circuit
*circuit
= isis_circuit_lookup(vty
);
1187 return CMD_ERR_NO_MATCH
;
1189 interval
= atol(argv
[idx_number
]->arg
);
1190 if (interval
< MIN_PSNP_INTERVAL
|| interval
> MAX_PSNP_INTERVAL
) {
1191 vty_out(vty
, "Invalid psnp-interval %lu - should be <1-120>\n",
1193 return CMD_WARNING_CONFIG_FAILED
;
1196 circuit
->psnp_interval
[1] = (uint16_t)interval
;
1202 DEFUN (no_psnp_interval_l2
,
1203 no_psnp_interval_l2_cmd
,
1204 "no isis psnp-interval [(1-120)] level-2",
1207 "Set PSNP interval in seconds\n"
1208 "PSNP interval value\n"
1209 "Specify interval for level-2 PSNPs\n")
1211 struct isis_circuit
*circuit
= isis_circuit_lookup(vty
);
1213 return CMD_ERR_NO_MATCH
;
1215 circuit
->psnp_interval
[1] = DEFAULT_PSNP_INTERVAL
;
1220 DEFUN (circuit_topology
,
1221 circuit_topology_cmd
,
1222 "isis topology " ISIS_MT_NAMES
,
1224 "Configure interface IS-IS topologies\n"
1225 ISIS_MT_DESCRIPTIONS
)
1227 struct isis_circuit
*circuit
= isis_circuit_lookup(vty
);
1229 return CMD_ERR_NO_MATCH
;
1230 const char *arg
= argv
[2]->arg
;
1231 uint16_t mtid
= isis_str2mtid(arg
);
1233 if (circuit
->area
&& circuit
->area
->oldmetric
) {
1235 "Multi topology IS-IS can only be used with wide metrics\n");
1236 return CMD_WARNING_CONFIG_FAILED
;
1239 if (mtid
== (uint16_t)-1) {
1240 vty_out(vty
, "Don't know topology '%s'\n", arg
);
1241 return CMD_WARNING_CONFIG_FAILED
;
1244 return isis_circuit_mt_enabled_set(circuit
, mtid
, true);
1247 DEFUN (no_circuit_topology
,
1248 no_circuit_topology_cmd
,
1249 "no isis topology " ISIS_MT_NAMES
,
1252 "Configure interface IS-IS topologies\n"
1253 ISIS_MT_DESCRIPTIONS
)
1255 struct isis_circuit
*circuit
= isis_circuit_lookup(vty
);
1257 return CMD_ERR_NO_MATCH
;
1258 const char *arg
= argv
[3]->arg
;
1259 uint16_t mtid
= isis_str2mtid(arg
);
1261 if (circuit
->area
&& circuit
->area
->oldmetric
) {
1263 "Multi topology IS-IS can only be used with wide metrics\n");
1264 return CMD_WARNING_CONFIG_FAILED
;
1267 if (mtid
== (uint16_t)-1) {
1268 vty_out(vty
, "Don't know topology '%s'\n", arg
);
1269 return CMD_WARNING_CONFIG_FAILED
;
1272 return isis_circuit_mt_enabled_set(circuit
, mtid
, false);
1275 static int validate_metric_style_narrow(struct vty
*vty
, struct isis_area
*area
)
1277 struct isis_circuit
*circuit
;
1278 struct listnode
*node
;
1281 return CMD_WARNING_CONFIG_FAILED
;
1284 vty_out(vty
, "ISIS area is invalid\n");
1285 return CMD_WARNING_CONFIG_FAILED
;
1288 for (ALL_LIST_ELEMENTS_RO(area
->circuit_list
, node
, circuit
)) {
1289 if ((area
->is_type
& IS_LEVEL_1
)
1290 && (circuit
->is_type
& IS_LEVEL_1
)
1291 && (circuit
->te_metric
[0] > MAX_NARROW_LINK_METRIC
)) {
1292 vty_out(vty
, "ISIS circuit %s metric is invalid\n",
1293 circuit
->interface
->name
);
1294 return CMD_WARNING_CONFIG_FAILED
;
1296 if ((area
->is_type
& IS_LEVEL_2
)
1297 && (circuit
->is_type
& IS_LEVEL_2
)
1298 && (circuit
->te_metric
[1] > MAX_NARROW_LINK_METRIC
)) {
1299 vty_out(vty
, "ISIS circuit %s metric is invalid\n",
1300 circuit
->interface
->name
);
1301 return CMD_WARNING_CONFIG_FAILED
;
1308 DEFUN (metric_style
,
1310 "metric-style <narrow|transition|wide>",
1311 "Use old-style (ISO 10589) or new-style packet formats\n"
1312 "Use old style of TLVs with narrow metric\n"
1313 "Send and accept both styles of TLVs during transition\n"
1314 "Use new style of TLVs to carry wider metric\n")
1316 int idx_metric_style
= 1;
1317 VTY_DECLVAR_CONTEXT(isis_area
, area
);
1320 if (strncmp(argv
[idx_metric_style
]->arg
, "w", 1) == 0) {
1321 isis_area_metricstyle_set(area
, false, true);
1325 if (area_is_mt(area
)) {
1327 "Narrow metrics cannot be used while multi topology IS-IS is active\n");
1328 return CMD_WARNING_CONFIG_FAILED
;
1331 ret
= validate_metric_style_narrow(vty
, area
);
1332 if (ret
!= CMD_SUCCESS
)
1335 if (strncmp(argv
[idx_metric_style
]->arg
, "t", 1) == 0)
1336 isis_area_metricstyle_set(area
, true, true);
1337 else if (strncmp(argv
[idx_metric_style
]->arg
, "n", 1) == 0)
1338 isis_area_metricstyle_set(area
, true, false);
1344 DEFUN (no_metric_style
,
1345 no_metric_style_cmd
,
1348 "Use old-style (ISO 10589) or new-style packet formats\n")
1350 VTY_DECLVAR_CONTEXT(isis_area
, area
);
1353 if (area_is_mt(area
)) {
1355 "Narrow metrics cannot be used while multi topology IS-IS is active\n");
1356 return CMD_WARNING_CONFIG_FAILED
;
1359 ret
= validate_metric_style_narrow(vty
, area
);
1360 if (ret
!= CMD_SUCCESS
)
1363 isis_area_metricstyle_set(area
, true, false);
1367 DEFUN (set_overload_bit
,
1368 set_overload_bit_cmd
,
1370 "Set overload bit to avoid any transit traffic\n")
1372 VTY_DECLVAR_CONTEXT(isis_area
, area
);
1374 isis_area_overload_bit_set(area
, true);
1378 DEFUN (no_set_overload_bit
,
1379 no_set_overload_bit_cmd
,
1380 "no set-overload-bit",
1381 "Reset overload bit to accept transit traffic\n"
1382 "Reset overload bit\n")
1384 VTY_DECLVAR_CONTEXT(isis_area
, area
);
1386 isis_area_overload_bit_set(area
, false);
1390 DEFUN (set_attached_bit
,
1391 set_attached_bit_cmd
,
1393 "Set attached bit to identify as L1/L2 router for inter-area traffic\n")
1395 VTY_DECLVAR_CONTEXT(isis_area
, area
);
1397 isis_area_attached_bit_set(area
, true);
1401 DEFUN (no_set_attached_bit
,
1402 no_set_attached_bit_cmd
,
1403 "no set-attached-bit",
1405 "Reset attached bit\n")
1407 VTY_DECLVAR_CONTEXT(isis_area
, area
);
1409 isis_area_attached_bit_set(area
, false);
1413 DEFUN (dynamic_hostname
,
1414 dynamic_hostname_cmd
,
1416 "Dynamic hostname for IS-IS\n"
1417 "Dynamic hostname\n")
1419 VTY_DECLVAR_CONTEXT(isis_area
, area
);
1421 isis_area_dynhostname_set(area
, true);
1425 DEFUN (no_dynamic_hostname
,
1426 no_dynamic_hostname_cmd
,
1427 "no hostname dynamic",
1429 "Dynamic hostname for IS-IS\n"
1430 "Dynamic hostname\n")
1432 VTY_DECLVAR_CONTEXT(isis_area
, area
);
1434 isis_area_dynhostname_set(area
, false);
1438 static int area_lsp_mtu_set(struct vty
*vty
, unsigned int lsp_mtu
)
1440 VTY_DECLVAR_CONTEXT(isis_area
, area
);
1441 struct listnode
*node
;
1442 struct isis_circuit
*circuit
;
1444 for (ALL_LIST_ELEMENTS_RO(area
->circuit_list
, node
, circuit
)) {
1445 if (circuit
->state
!= C_STATE_INIT
1446 && circuit
->state
!= C_STATE_UP
)
1448 if (lsp_mtu
> isis_circuit_pdu_size(circuit
)) {
1450 "ISIS area contains circuit %s, which has a maximum PDU size of %zu.\n",
1451 circuit
->interface
->name
,
1452 isis_circuit_pdu_size(circuit
));
1453 return CMD_WARNING_CONFIG_FAILED
;
1457 isis_area_lsp_mtu_set(area
, lsp_mtu
);
1461 DEFUN (area_lsp_mtu
,
1463 "lsp-mtu (128-4352)",
1464 "Configure the maximum size of generated LSPs\n"
1465 "Maximum size of generated LSPs\n")
1468 unsigned int lsp_mtu
;
1470 lsp_mtu
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
1472 return area_lsp_mtu_set(vty
, lsp_mtu
);
1476 DEFUN (no_area_lsp_mtu
,
1477 no_area_lsp_mtu_cmd
,
1478 "no lsp-mtu [(128-4352)]",
1480 "Configure the maximum size of generated LSPs\n"
1481 "Maximum size of generated LSPs\n")
1483 return area_lsp_mtu_set(vty
, DEFAULT_LSP_MTU
);
1489 "is-type <level-1|level-1-2|level-2-only>",
1490 "IS Level for this routing process (OSI only)\n"
1491 "Act as a station router only\n"
1492 "Act as both a station router and an area router\n"
1493 "Act as an area router only\n")
1496 VTY_DECLVAR_CONTEXT(isis_area
, area
);
1499 type
= string2circuit_t(argv
[idx_level
]->arg
);
1501 vty_out(vty
, "Unknown IS level \n");
1505 isis_area_is_type_set(area
, type
);
1512 "no is-type <level-1|level-1-2|level-2-only>",
1514 "IS Level for this routing process (OSI only)\n"
1515 "Act as a station router only\n"
1516 "Act as both a station router and an area router\n"
1517 "Act as an area router only\n")
1519 VTY_DECLVAR_CONTEXT(isis_area
, area
);
1523 * Put the is-type back to defaults:
1524 * - level-1-2 on first area
1525 * - level-1 for the rest
1527 if (listgetdata(listhead(isis
->area_list
)) == area
)
1528 type
= IS_LEVEL_1_AND_2
;
1532 isis_area_is_type_set(area
, type
);
1537 static int set_lsp_gen_interval(struct vty
*vty
, struct isis_area
*area
,
1538 uint16_t interval
, int level
)
1542 for (lvl
= IS_LEVEL_1
; lvl
<= IS_LEVEL_2
; ++lvl
) {
1546 if (interval
>= area
->lsp_refresh
[lvl
- 1]) {
1548 "LSP gen interval %us must be less than "
1549 "the LSP refresh interval %us\n",
1550 interval
, area
->lsp_refresh
[lvl
- 1]);
1551 return CMD_WARNING_CONFIG_FAILED
;
1555 for (lvl
= IS_LEVEL_1
; lvl
<= IS_LEVEL_2
; ++lvl
) {
1558 area
->lsp_gen_interval
[lvl
- 1] = interval
;
1564 DEFUN (lsp_gen_interval
,
1565 lsp_gen_interval_cmd
,
1566 "lsp-gen-interval [<level-1|level-2>] (1-120)",
1567 "Minimum interval between regenerating same LSP\n"
1568 "Set interval for level 1 only\n"
1569 "Set interval for level 2 only\n"
1570 "Minimum interval in seconds\n")
1573 VTY_DECLVAR_CONTEXT(isis_area
, area
);
1578 level
|= argv_find(argv
, argc
, "level-1", &idx
) ? IS_LEVEL_1
: 0;
1579 level
|= argv_find(argv
, argc
, "level-2", &idx
) ? IS_LEVEL_2
: 0;
1581 level
= IS_LEVEL_1
| IS_LEVEL_2
;
1583 argv_find(argv
, argc
, "(1-120)", &idx
);
1585 interval
= atoi(argv
[idx
]->arg
);
1586 return set_lsp_gen_interval(vty
, area
, interval
, level
);
1589 DEFUN (no_lsp_gen_interval
,
1590 no_lsp_gen_interval_cmd
,
1591 "no lsp-gen-interval [<level-1|level-2>] [(1-120)]",
1593 "Minimum interval between regenerating same LSP\n"
1594 "Set interval for level 1 only\n"
1595 "Set interval for level 2 only\n"
1596 "Minimum interval in seconds\n")
1599 VTY_DECLVAR_CONTEXT(isis_area
, area
);
1604 level
|= argv_find(argv
, argc
, "level-1", &idx
) ? IS_LEVEL_1
: 0;
1605 level
|= argv_find(argv
, argc
, "level-2", &idx
) ? IS_LEVEL_2
: 0;
1607 level
= IS_LEVEL_1
| IS_LEVEL_2
;
1609 interval
= DEFAULT_MIN_LSP_GEN_INTERVAL
;
1610 return set_lsp_gen_interval(vty
, area
, interval
, level
);
1613 DEFUN (spf_interval
,
1615 "spf-interval (1-120)",
1616 "Minimum interval between SPF calculations\n"
1617 "Minimum interval between consecutive SPFs in seconds\n")
1620 VTY_DECLVAR_CONTEXT(isis_area
, area
);
1623 interval
= atoi(argv
[idx_number
]->arg
);
1624 area
->min_spf_interval
[0] = interval
;
1625 area
->min_spf_interval
[1] = interval
;
1631 DEFUN (no_spf_interval
,
1632 no_spf_interval_cmd
,
1633 "no spf-interval [[<level-1|level-2>] (1-120)]",
1635 "Minimum interval between SPF calculations\n"
1636 "Set interval for level 1 only\n"
1637 "Set interval for level 2 only\n"
1638 "Minimum interval between consecutive SPFs in seconds\n")
1640 VTY_DECLVAR_CONTEXT(isis_area
, area
);
1642 area
->min_spf_interval
[0] = MINIMUM_SPF_INTERVAL
;
1643 area
->min_spf_interval
[1] = MINIMUM_SPF_INTERVAL
;
1649 DEFUN (spf_interval_l1
,
1650 spf_interval_l1_cmd
,
1651 "spf-interval level-1 (1-120)",
1652 "Minimum interval between SPF calculations\n"
1653 "Set interval for level 1 only\n"
1654 "Minimum interval between consecutive SPFs in seconds\n")
1657 VTY_DECLVAR_CONTEXT(isis_area
, area
);
1660 interval
= atoi(argv
[idx_number
]->arg
);
1661 area
->min_spf_interval
[0] = interval
;
1666 DEFUN (no_spf_interval_l1
,
1667 no_spf_interval_l1_cmd
,
1668 "no spf-interval level-1",
1670 "Minimum interval between SPF calculations\n"
1671 "Set interval for level 1 only\n")
1673 VTY_DECLVAR_CONTEXT(isis_area
, area
);
1675 area
->min_spf_interval
[0] = MINIMUM_SPF_INTERVAL
;
1681 DEFUN (spf_interval_l2
,
1682 spf_interval_l2_cmd
,
1683 "spf-interval level-2 (1-120)",
1684 "Minimum interval between SPF calculations\n"
1685 "Set interval for level 2 only\n"
1686 "Minimum interval between consecutive SPFs in seconds\n")
1689 VTY_DECLVAR_CONTEXT(isis_area
, area
);
1692 interval
= atoi(argv
[idx_number
]->arg
);
1693 area
->min_spf_interval
[1] = interval
;
1698 DEFUN (no_spf_interval_l2
,
1699 no_spf_interval_l2_cmd
,
1700 "no spf-interval level-2",
1702 "Minimum interval between SPF calculations\n"
1703 "Set interval for level 2 only\n")
1705 VTY_DECLVAR_CONTEXT(isis_area
, area
);
1707 area
->min_spf_interval
[1] = MINIMUM_SPF_INTERVAL
;
1712 DEFUN (no_spf_delay_ietf
,
1713 no_spf_delay_ietf_cmd
,
1714 "no spf-delay-ietf",
1716 "IETF SPF delay algorithm\n")
1718 VTY_DECLVAR_CONTEXT(isis_area
, area
);
1720 spf_backoff_free(area
->spf_delay_ietf
[0]);
1721 spf_backoff_free(area
->spf_delay_ietf
[1]);
1722 area
->spf_delay_ietf
[0] = NULL
;
1723 area
->spf_delay_ietf
[1] = NULL
;
1728 DEFUN (spf_delay_ietf
,
1730 "spf-delay-ietf init-delay (0-60000) short-delay (0-60000) long-delay (0-60000) holddown (0-60000) time-to-learn (0-60000)",
1731 "IETF SPF delay algorithm\n"
1732 "Delay used while in QUIET state\n"
1733 "Delay used while in QUIET state in milliseconds\n"
1734 "Delay used while in SHORT_WAIT state\n"
1735 "Delay used while in SHORT_WAIT state in milliseconds\n"
1736 "Delay used while in LONG_WAIT\n"
1737 "Delay used while in LONG_WAIT state in milliseconds\n"
1738 "Time with no received IGP events before considering IGP stable\n"
1739 "Time with no received IGP events before considering IGP stable (in milliseconds)\n"
1740 "Maximum duration needed to learn all the events related to a single failure\n"
1741 "Maximum duration needed to learn all the events related to a single failure (in milliseconds)\n")
1743 VTY_DECLVAR_CONTEXT(isis_area
, area
);
1745 long init_delay
= atol(argv
[2]->arg
);
1746 long short_delay
= atol(argv
[4]->arg
);
1747 long long_delay
= atol(argv
[6]->arg
);
1748 long holddown
= atol(argv
[8]->arg
);
1749 long timetolearn
= atol(argv
[10]->arg
);
1751 size_t bufsiz
= strlen(area
->area_tag
) + sizeof("IS-IS Lx");
1752 char *buf
= XCALLOC(MTYPE_TMP
, bufsiz
);
1754 snprintf(buf
, bufsiz
, "IS-IS %s L1", area
->area_tag
);
1755 spf_backoff_free(area
->spf_delay_ietf
[0]);
1756 area
->spf_delay_ietf
[0] =
1757 spf_backoff_new(master
, buf
, init_delay
, short_delay
,
1758 long_delay
, holddown
, timetolearn
);
1760 snprintf(buf
, bufsiz
, "IS-IS %s L2", area
->area_tag
);
1761 spf_backoff_free(area
->spf_delay_ietf
[1]);
1762 area
->spf_delay_ietf
[1] =
1763 spf_backoff_new(master
, buf
, init_delay
, short_delay
,
1764 long_delay
, holddown
, timetolearn
);
1766 XFREE(MTYPE_TMP
, buf
);
1770 static int area_max_lsp_lifetime_set(struct vty
*vty
, int level
,
1773 VTY_DECLVAR_CONTEXT(isis_area
, area
);
1775 uint16_t refresh_interval
= interval
- 300;
1776 int set_refresh_interval
[ISIS_LEVELS
] = {0, 0};
1778 for (lvl
= IS_LEVEL_1
; lvl
<= IS_LEVEL_2
; lvl
++) {
1782 if (refresh_interval
< area
->lsp_refresh
[lvl
- 1]) {
1784 "Level %d Max LSP lifetime %us must be 300s greater than "
1785 "the configured LSP refresh interval %us\n",
1786 lvl
, interval
, area
->lsp_refresh
[lvl
- 1]);
1788 "Automatically reducing level %d LSP refresh interval "
1790 lvl
, refresh_interval
);
1791 set_refresh_interval
[lvl
- 1] = 1;
1793 if (refresh_interval
1794 <= area
->lsp_gen_interval
[lvl
- 1]) {
1796 "LSP refresh interval %us must be greater than "
1797 "the configured LSP gen interval %us\n",
1799 area
->lsp_gen_interval
[lvl
- 1]);
1800 return CMD_WARNING_CONFIG_FAILED
;
1805 for (lvl
= IS_LEVEL_1
; lvl
<= IS_LEVEL_2
; lvl
++) {
1808 isis_area_max_lsp_lifetime_set(area
, lvl
, interval
);
1809 if (set_refresh_interval
[lvl
- 1])
1810 isis_area_lsp_refresh_set(area
, lvl
, refresh_interval
);
1816 DEFUN (max_lsp_lifetime
,
1817 max_lsp_lifetime_cmd
,
1818 "max-lsp-lifetime [<level-1|level-2>] (350-65535)",
1819 "Maximum LSP lifetime\n"
1820 "Maximum LSP lifetime for Level 1 only\n"
1821 "Maximum LSP lifetime for Level 2 only\n"
1822 "LSP lifetime in seconds\n")
1825 unsigned int level
= IS_LEVEL_1_AND_2
;
1827 if (argv_find(argv
, argc
, "level-1", &idx
))
1829 else if (argv_find(argv
, argc
, "level-2", &idx
))
1832 argv_find(argv
, argc
, "(350-65535)", &idx
);
1833 int lifetime
= atoi(argv
[idx
]->arg
);
1835 return area_max_lsp_lifetime_set(vty
, level
, lifetime
);
1839 DEFUN (no_max_lsp_lifetime
,
1840 no_max_lsp_lifetime_cmd
,
1841 "no max-lsp-lifetime [<level-1|level-2>] [(350-65535)]",
1843 "Maximum LSP lifetime\n"
1844 "Maximum LSP lifetime for Level 1 only\n"
1845 "Maximum LSP lifetime for Level 2 only\n"
1846 "LSP lifetime in seconds\n")
1849 unsigned int level
= IS_LEVEL_1_AND_2
;
1851 if (argv_find(argv
, argc
, "level-1", &idx
))
1853 else if (argv_find(argv
, argc
, "level-2", &idx
))
1856 return area_max_lsp_lifetime_set(vty
, level
, DEFAULT_LSP_LIFETIME
);
1859 static int area_lsp_refresh_interval_set(struct vty
*vty
, int level
,
1862 VTY_DECLVAR_CONTEXT(isis_area
, area
);
1865 for (lvl
= IS_LEVEL_1
; lvl
<= IS_LEVEL_2
; ++lvl
) {
1868 if (interval
<= area
->lsp_gen_interval
[lvl
- 1]) {
1870 "LSP refresh interval %us must be greater than "
1871 "the configured LSP gen interval %us\n",
1872 interval
, area
->lsp_gen_interval
[lvl
- 1]);
1873 return CMD_WARNING_CONFIG_FAILED
;
1875 if (interval
> (area
->max_lsp_lifetime
[lvl
- 1] - 300)) {
1877 "LSP refresh interval %us must be less than "
1878 "the configured LSP lifetime %us less 300\n",
1879 interval
, area
->max_lsp_lifetime
[lvl
- 1]);
1880 return CMD_WARNING_CONFIG_FAILED
;
1884 for (lvl
= IS_LEVEL_1
; lvl
<= IS_LEVEL_2
; ++lvl
) {
1887 isis_area_lsp_refresh_set(area
, lvl
, interval
);
1893 DEFUN (lsp_refresh_interval
,
1894 lsp_refresh_interval_cmd
,
1895 "lsp-refresh-interval [<level-1|level-2>] (1-65235)",
1896 "LSP refresh interval\n"
1897 "LSP refresh interval for Level 1 only\n"
1898 "LSP refresh interval for Level 2 only\n"
1899 "LSP refresh interval in seconds\n")
1902 unsigned int level
= IS_LEVEL_1_AND_2
;
1903 unsigned int interval
= 0;
1905 if (argv_find(argv
, argc
, "level-1", &idx
))
1907 else if (argv_find(argv
, argc
, "level-2", &idx
))
1910 interval
= atoi(argv
[argc
- 1]->arg
);
1911 return area_lsp_refresh_interval_set(vty
, level
, interval
);
1914 DEFUN (no_lsp_refresh_interval
,
1915 no_lsp_refresh_interval_cmd
,
1916 "no lsp-refresh-interval [<level-1|level-2>] [(1-65235)]",
1918 "LSP refresh interval\n"
1919 "LSP refresh interval for Level 1 only\n"
1920 "LSP refresh interval for Level 2 only\n"
1921 "LSP refresh interval in seconds\n")
1924 unsigned int level
= IS_LEVEL_1_AND_2
;
1926 if (argv_find(argv
, argc
, "level-1", &idx
))
1928 else if (argv_find(argv
, argc
, "level-2", &idx
))
1931 return area_lsp_refresh_interval_set(vty
, level
,
1932 DEFAULT_MAX_LSP_GEN_INTERVAL
);
1935 static int area_passwd_set(struct vty
*vty
, int level
,
1936 int (*type_set
)(struct isis_area
*area
, int level
,
1939 const char *passwd
, uint8_t snp_auth
)
1941 VTY_DECLVAR_CONTEXT(isis_area
, area
);
1943 if (passwd
&& strlen(passwd
) > 254) {
1944 vty_out(vty
, "Too long area password (>254)\n");
1945 return CMD_WARNING_CONFIG_FAILED
;
1948 type_set(area
, level
, passwd
, snp_auth
);
1953 DEFUN (area_passwd_md5
,
1954 area_passwd_md5_cmd
,
1955 "area-password md5 WORD [authenticate snp <send-only|validate>]",
1956 "Configure the authentication password for an area\n"
1957 "Authentication type\n"
1958 "Level-wide password\n"
1961 "Send but do not check PDUs on receiving\n"
1962 "Send and check PDUs on receiving\n")
1964 int idx_password
= 0;
1967 uint8_t snp_auth
= 0;
1968 int level
= strmatch(argv
[idx_password
]->text
, "domain-password")
1973 snp_auth
= SNP_AUTH_SEND
;
1974 if (strmatch(argv
[idx_type
]->text
, "validate"))
1975 snp_auth
|= SNP_AUTH_RECV
;
1978 return area_passwd_set(vty
, level
, isis_area_passwd_hmac_md5_set
,
1979 argv
[idx_word
]->arg
, snp_auth
);
1982 DEFUN (domain_passwd_md5
,
1983 domain_passwd_md5_cmd
,
1984 "domain-password md5 WORD [authenticate snp <send-only|validate>]",
1985 "Set the authentication password for a routing domain\n"
1986 "Authentication type\n"
1987 "Level-wide password\n"
1990 "Send but do not check PDUs on receiving\n"
1991 "Send and check PDUs on receiving\n")
1993 return area_passwd_md5(self
, vty
, argc
, argv
);
1996 DEFUN (area_passwd_clear
,
1997 area_passwd_clear_cmd
,
1998 "area-password clear WORD [authenticate snp <send-only|validate>]",
1999 "Configure the authentication password for an area\n"
2000 "Authentication type\n"
2004 "Send but do not check PDUs on receiving\n"
2005 "Send and check PDUs on receiving\n")
2007 int idx_password
= 0;
2010 uint8_t snp_auth
= 0;
2011 int level
= strmatch(argv
[idx_password
]->text
, "domain-password")
2016 snp_auth
= SNP_AUTH_SEND
;
2017 if (strmatch(argv
[idx_type
]->text
, "validate"))
2018 snp_auth
|= SNP_AUTH_RECV
;
2021 return area_passwd_set(vty
, level
, isis_area_passwd_cleartext_set
,
2022 argv
[idx_word
]->arg
, snp_auth
);
2025 DEFUN (domain_passwd_clear
,
2026 domain_passwd_clear_cmd
,
2027 "domain-password clear WORD [authenticate snp <send-only|validate>]",
2028 "Set the authentication password for a routing domain\n"
2029 "Authentication type\n"
2033 "Send but do not check PDUs on receiving\n"
2034 "Send and check PDUs on receiving\n")
2036 return area_passwd_clear(self
, vty
, argc
, argv
);
2039 DEFUN (no_area_passwd
,
2041 "no <area-password|domain-password>",
2043 "Configure the authentication password for an area\n"
2044 "Set the authentication password for a routing domain\n")
2046 int idx_password
= 1;
2047 int level
= strmatch(argv
[idx_password
]->text
, "domain-password")
2050 VTY_DECLVAR_CONTEXT(isis_area
, area
);
2052 return isis_area_passwd_unset(area
, level
);
2055 void isis_vty_init(void)
2057 install_element(INTERFACE_NODE
, &ip_router_isis_cmd
);
2058 install_element(INTERFACE_NODE
, &ip6_router_isis_cmd
);
2059 install_element(INTERFACE_NODE
, &no_ip_router_isis_cmd
);
2061 install_element(INTERFACE_NODE
, &isis_passive_cmd
);
2062 install_element(INTERFACE_NODE
, &no_isis_passive_cmd
);
2064 install_element(INTERFACE_NODE
, &isis_circuit_type_cmd
);
2065 install_element(INTERFACE_NODE
, &no_isis_circuit_type_cmd
);
2067 install_element(INTERFACE_NODE
, &isis_network_cmd
);
2068 install_element(INTERFACE_NODE
, &no_isis_network_cmd
);
2070 install_element(INTERFACE_NODE
, &isis_passwd_cmd
);
2071 install_element(INTERFACE_NODE
, &no_isis_passwd_cmd
);
2073 install_element(INTERFACE_NODE
, &isis_priority_cmd
);
2074 install_element(INTERFACE_NODE
, &no_isis_priority_cmd
);
2075 install_element(INTERFACE_NODE
, &isis_priority_l1_cmd
);
2076 install_element(INTERFACE_NODE
, &no_isis_priority_l1_cmd
);
2077 install_element(INTERFACE_NODE
, &isis_priority_l2_cmd
);
2078 install_element(INTERFACE_NODE
, &no_isis_priority_l2_cmd
);
2080 install_element(INTERFACE_NODE
, &isis_metric_cmd
);
2081 install_element(INTERFACE_NODE
, &no_isis_metric_cmd
);
2082 install_element(INTERFACE_NODE
, &isis_metric_l1_cmd
);
2083 install_element(INTERFACE_NODE
, &no_isis_metric_l1_cmd
);
2084 install_element(INTERFACE_NODE
, &isis_metric_l2_cmd
);
2085 install_element(INTERFACE_NODE
, &no_isis_metric_l2_cmd
);
2087 install_element(INTERFACE_NODE
, &isis_hello_interval_cmd
);
2088 install_element(INTERFACE_NODE
, &no_isis_hello_interval_cmd
);
2089 install_element(INTERFACE_NODE
, &isis_hello_interval_l1_cmd
);
2090 install_element(INTERFACE_NODE
, &no_isis_hello_interval_l1_cmd
);
2091 install_element(INTERFACE_NODE
, &isis_hello_interval_l2_cmd
);
2092 install_element(INTERFACE_NODE
, &no_isis_hello_interval_l2_cmd
);
2094 install_element(INTERFACE_NODE
, &isis_hello_multiplier_cmd
);
2095 install_element(INTERFACE_NODE
, &no_isis_hello_multiplier_cmd
);
2096 install_element(INTERFACE_NODE
, &isis_hello_multiplier_l1_cmd
);
2097 install_element(INTERFACE_NODE
, &no_isis_hello_multiplier_l1_cmd
);
2098 install_element(INTERFACE_NODE
, &isis_hello_multiplier_l2_cmd
);
2099 install_element(INTERFACE_NODE
, &no_isis_hello_multiplier_l2_cmd
);
2101 install_element(INTERFACE_NODE
, &isis_hello_padding_cmd
);
2102 install_element(INTERFACE_NODE
, &no_isis_hello_padding_cmd
);
2104 install_element(INTERFACE_NODE
, &isis_threeway_adj_cmd
);
2106 install_element(INTERFACE_NODE
, &csnp_interval_cmd
);
2107 install_element(INTERFACE_NODE
, &no_csnp_interval_cmd
);
2108 install_element(INTERFACE_NODE
, &csnp_interval_l1_cmd
);
2109 install_element(INTERFACE_NODE
, &no_csnp_interval_l1_cmd
);
2110 install_element(INTERFACE_NODE
, &csnp_interval_l2_cmd
);
2111 install_element(INTERFACE_NODE
, &no_csnp_interval_l2_cmd
);
2113 install_element(INTERFACE_NODE
, &psnp_interval_cmd
);
2114 install_element(INTERFACE_NODE
, &no_psnp_interval_cmd
);
2115 install_element(INTERFACE_NODE
, &psnp_interval_l1_cmd
);
2116 install_element(INTERFACE_NODE
, &no_psnp_interval_l1_cmd
);
2117 install_element(INTERFACE_NODE
, &psnp_interval_l2_cmd
);
2118 install_element(INTERFACE_NODE
, &no_psnp_interval_l2_cmd
);
2120 install_element(INTERFACE_NODE
, &circuit_topology_cmd
);
2121 install_element(INTERFACE_NODE
, &no_circuit_topology_cmd
);
2123 install_element(ISIS_NODE
, &metric_style_cmd
);
2124 install_element(ISIS_NODE
, &no_metric_style_cmd
);
2126 install_element(ISIS_NODE
, &set_overload_bit_cmd
);
2127 install_element(ISIS_NODE
, &no_set_overload_bit_cmd
);
2129 install_element(ISIS_NODE
, &set_attached_bit_cmd
);
2130 install_element(ISIS_NODE
, &no_set_attached_bit_cmd
);
2132 install_element(ISIS_NODE
, &dynamic_hostname_cmd
);
2133 install_element(ISIS_NODE
, &no_dynamic_hostname_cmd
);
2135 install_element(ISIS_NODE
, &area_lsp_mtu_cmd
);
2136 install_element(ISIS_NODE
, &no_area_lsp_mtu_cmd
);
2138 install_element(ISIS_NODE
, &is_type_cmd
);
2139 install_element(ISIS_NODE
, &no_is_type_cmd
);
2141 install_element(ISIS_NODE
, &lsp_gen_interval_cmd
);
2142 install_element(ISIS_NODE
, &no_lsp_gen_interval_cmd
);
2144 install_element(ISIS_NODE
, &spf_interval_cmd
);
2145 install_element(ISIS_NODE
, &no_spf_interval_cmd
);
2146 install_element(ISIS_NODE
, &spf_interval_l1_cmd
);
2147 install_element(ISIS_NODE
, &no_spf_interval_l1_cmd
);
2148 install_element(ISIS_NODE
, &spf_interval_l2_cmd
);
2149 install_element(ISIS_NODE
, &no_spf_interval_l2_cmd
);
2151 install_element(ISIS_NODE
, &max_lsp_lifetime_cmd
);
2152 install_element(ISIS_NODE
, &no_max_lsp_lifetime_cmd
);
2154 install_element(ISIS_NODE
, &lsp_refresh_interval_cmd
);
2155 install_element(ISIS_NODE
, &no_lsp_refresh_interval_cmd
);
2157 install_element(ISIS_NODE
, &area_passwd_md5_cmd
);
2158 install_element(ISIS_NODE
, &area_passwd_clear_cmd
);
2159 install_element(ISIS_NODE
, &domain_passwd_md5_cmd
);
2160 install_element(ISIS_NODE
, &domain_passwd_clear_cmd
);
2161 install_element(ISIS_NODE
, &no_area_passwd_cmd
);
2163 install_element(ISIS_NODE
, &spf_delay_ietf_cmd
);
2164 install_element(ISIS_NODE
, &no_spf_delay_ietf_cmd
);