]> git.proxmox.com Git - mirror_frr.git/blame - isisd/isis_vty.c
zebra: On shutdown actually delete rn's assoc w/ other_tables
[mirror_frr.git] / isisd / isis_vty.c
CommitLineData
65f9a9a8
DL
1/*
2 * IS-IS Rout(e)ing protocol - isis_circuit.h
3 *
4 * Copyright (C) 2001,2002 Sampo Saaristo
d62a17ae 5 * Tampere University of Technology
65f9a9a8
DL
6 * Institute of Communications Engineering
7 * Copyright (C) 2016 David Lamparter, for NetDEF, Inc.
8 *
d62a17ae 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)
65f9a9a8
DL
12 * any later version.
13 *
d62a17ae 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
65f9a9a8 17 * more details.
896014f4
DL
18 *
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
65f9a9a8
DL
22 */
23
24#include <zebra.h>
5475ecf7
SL
25
26#include "command.h"
03f7e182 27#include "spf_backoff.h"
65f9a9a8
DL
28
29#include "isis_circuit.h"
30#include "isis_csm.h"
31#include "isis_misc.h"
064f4896 32#include "isis_mt.h"
65f9a9a8
DL
33#include "isisd.h"
34
d62a17ae 35static struct isis_circuit *isis_circuit_lookup(struct vty *vty)
65f9a9a8 36{
d62a17ae 37 struct interface *ifp = VTY_GET_CONTEXT(interface);
38 struct isis_circuit *circuit;
65f9a9a8 39
d62a17ae 40 if (!ifp) {
41 vty_out(vty, "Invalid interface \n");
42 return NULL;
43 }
65f9a9a8 44
d62a17ae 45 circuit = circuit_scan_by_ifp(ifp);
46 if (!circuit) {
47 vty_out(vty, "ISIS is not enabled on circuit %s\n", ifp->name);
48 return NULL;
49 }
65f9a9a8 50
d62a17ae 51 return circuit;
65f9a9a8
DL
52}
53
54DEFUN (ip_router_isis,
55 ip_router_isis_cmd,
12dcf78e 56 "ip router isis WORD",
65f9a9a8
DL
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")
61{
d62a17ae 62 int idx_afi = 0;
63 int idx_word = 3;
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;
69
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;
77 }
78 }
79
80 area = isis_area_lookup(area_tag);
81 if (!area)
82 area = isis_area_create(area_tag);
83
84 if (!circuit || !circuit->area) {
85 circuit = isis_circuit_create(area, ifp);
86
87 if (circuit->state != C_STATE_CONF
88 && circuit->state != C_STATE_UP) {
89 vty_out(vty,
90 "Couldn't bring up interface, please check log.\n");
91 return CMD_WARNING_CONFIG_FAILED;
92 }
93 }
94
95 bool ip = circuit->ip_router, ipv6 = circuit->ipv6_router;
96 if (af[2] != '\0')
97 ipv6 = true;
98 else
99 ip = true;
100
101 isis_circuit_af_set(circuit, ip, ipv6);
102 return CMD_SUCCESS;
65f9a9a8
DL
103}
104
12dcf78e
QY
105DEFUN (ip6_router_isis,
106 ip6_router_isis_cmd,
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")
112{
d62a17ae 113 return ip_router_isis(self, vty, argc, argv);
12dcf78e
QY
114}
115
65f9a9a8
DL
116DEFUN (no_ip_router_isis,
117 no_ip_router_isis_cmd,
6147e2c6 118 "no <ip|ipv6> router isis WORD",
65f9a9a8
DL
119 NO_STR
120 "Interface Internet Protocol config commands\n"
121 "IP router interface commands\n"
3a2d747c 122 "IP router interface commands\n"
65f9a9a8
DL
123 "IS-IS Routing for IP\n"
124 "Routing process tag\n")
125{
d62a17ae 126 int idx_afi = 1;
127 int idx_word = 4;
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;
133
134 area = isis_area_lookup(area_tag);
135 if (!area) {
136 vty_out(vty, "Can't find ISIS instance %s\n",
137 argv[idx_afi]->arg);
138 return CMD_ERR_NO_MATCH;
139 }
140
141 circuit = circuit_lookup_by_ifp(ifp, area->circuit_list);
142 if (!circuit) {
143 vty_out(vty, "ISIS is not enabled on circuit %s\n", ifp->name);
144 return CMD_ERR_NO_MATCH;
145 }
146
147 bool ip = circuit->ip_router, ipv6 = circuit->ipv6_router;
148 if (af[2] != '\0')
149 ipv6 = false;
150 else
151 ip = false;
152
153 isis_circuit_af_set(circuit, ip, ipv6);
154 return CMD_SUCCESS;
65f9a9a8
DL
155}
156
157DEFUN (isis_passive,
158 isis_passive_cmd,
159 "isis passive",
160 "IS-IS commands\n"
161 "Configure the passive mode for interface\n")
162{
d62a17ae 163 struct isis_circuit *circuit = isis_circuit_lookup(vty);
164 if (!circuit)
165 return CMD_ERR_NO_MATCH;
65f9a9a8 166
64dd3ffe
DL
167 CMD_FERR_RETURN(isis_circuit_passive_set(circuit, 1),
168 "Cannot set passive: $ERR");
d62a17ae 169 return CMD_SUCCESS;
65f9a9a8
DL
170}
171
172DEFUN (no_isis_passive,
173 no_isis_passive_cmd,
174 "no isis passive",
175 NO_STR
176 "IS-IS commands\n"
177 "Configure the passive mode for interface\n")
178{
d62a17ae 179 struct isis_circuit *circuit = isis_circuit_lookup(vty);
180 if (!circuit)
181 return CMD_ERR_NO_MATCH;
65f9a9a8 182
64dd3ffe
DL
183 CMD_FERR_RETURN(isis_circuit_passive_set(circuit, 0),
184 "Cannot set no passive: $ERR");
d62a17ae 185 return CMD_SUCCESS;
65f9a9a8
DL
186}
187
188DEFUN (isis_circuit_type,
189 isis_circuit_type_cmd,
6147e2c6 190 "isis circuit-type <level-1|level-1-2|level-2-only>",
65f9a9a8
DL
191 "IS-IS commands\n"
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")
196{
d62a17ae 197 int idx_level = 2;
198 int is_type;
199 struct isis_circuit *circuit = isis_circuit_lookup(vty);
200 if (!circuit)
201 return CMD_ERR_NO_MATCH;
65f9a9a8 202
d62a17ae 203 is_type = string2circuit_t(argv[idx_level]->arg);
204 if (!is_type) {
205 vty_out(vty, "Unknown circuit-type \n");
a5fdb4c5 206 return CMD_WARNING_CONFIG_FAILED;
d62a17ae 207 }
65f9a9a8 208
d62a17ae 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);
a5fdb4c5 214 return CMD_WARNING_CONFIG_FAILED;
d62a17ae 215 }
216 isis_circuit_is_type_set(circuit, is_type);
65f9a9a8 217
d62a17ae 218 return CMD_SUCCESS;
65f9a9a8
DL
219}
220
221DEFUN (no_isis_circuit_type,
222 no_isis_circuit_type_cmd,
6147e2c6 223 "no isis circuit-type <level-1|level-1-2|level-2-only>",
65f9a9a8
DL
224 NO_STR
225 "IS-IS commands\n"
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")
230{
d62a17ae 231 int is_type;
232 struct isis_circuit *circuit = isis_circuit_lookup(vty);
233 if (!circuit)
234 return CMD_ERR_NO_MATCH;
65f9a9a8 235
d62a17ae 236 /*
237 * Set the circuits level to its default value
238 */
239 if (circuit->state == C_STATE_UP)
240 is_type = circuit->area->is_type;
241 else
242 is_type = IS_LEVEL_1_AND_2;
243 isis_circuit_is_type_set(circuit, is_type);
65f9a9a8 244
d62a17ae 245 return CMD_SUCCESS;
65f9a9a8
DL
246}
247
248DEFUN (isis_network,
249 isis_network_cmd,
250 "isis network point-to-point",
251 "IS-IS commands\n"
252 "Set network type\n"
253 "point-to-point network type\n")
254{
d62a17ae 255 struct isis_circuit *circuit = isis_circuit_lookup(vty);
256 if (!circuit)
257 return CMD_ERR_NO_MATCH;
65f9a9a8 258
d62a17ae 259 if (isis_circuit_circ_type_set(circuit, CIRCUIT_T_P2P)) {
260 vty_out(vty,
261 "isis network point-to-point is valid only on broadcast interfaces\n");
a5fdb4c5 262 return CMD_WARNING_CONFIG_FAILED;
d62a17ae 263 }
65f9a9a8 264
d62a17ae 265 return CMD_SUCCESS;
65f9a9a8
DL
266}
267
268DEFUN (no_isis_network,
269 no_isis_network_cmd,
270 "no isis network point-to-point",
271 NO_STR
272 "IS-IS commands\n"
273 "Set network type for circuit\n"
274 "point-to-point network type\n")
275{
d62a17ae 276 struct isis_circuit *circuit = isis_circuit_lookup(vty);
277 if (!circuit)
278 return CMD_ERR_NO_MATCH;
65f9a9a8 279
d62a17ae 280 if (isis_circuit_circ_type_set(circuit, CIRCUIT_T_BROADCAST)) {
281 vty_out(vty,
282 "isis network point-to-point is valid only on broadcast interfaces\n");
a5fdb4c5 283 return CMD_WARNING_CONFIG_FAILED;
d62a17ae 284 }
65f9a9a8 285
d62a17ae 286 return CMD_SUCCESS;
65f9a9a8
DL
287}
288
50c7d14a
CF
289DEFUN (isis_passwd,
290 isis_passwd_cmd,
6147e2c6 291 "isis password <md5|clear> WORD",
50c7d14a
CF
292 "IS-IS commands\n"
293 "Configure the authentication password for a circuit\n"
294 "HMAC-MD5 authentication\n"
295 "Cleartext password\n"
296 "Circuit password\n")
297{
d62a17ae 298 int idx_encryption = 2;
299 int idx_word = 3;
300 struct isis_circuit *circuit = isis_circuit_lookup(vty);
64dd3ffe
DL
301 ferr_r rv;
302
d62a17ae 303 if (!circuit)
304 return CMD_ERR_NO_MATCH;
50c7d14a 305
d62a17ae 306 if (argv[idx_encryption]->arg[0] == 'm')
307 rv = isis_circuit_passwd_hmac_md5_set(circuit,
308 argv[idx_word]->arg);
309 else
310 rv = isis_circuit_passwd_cleartext_set(circuit,
311 argv[idx_word]->arg);
50c7d14a 312
64dd3ffe 313 CMD_FERR_RETURN(rv, "Failed to set circuit password: $ERR");
d62a17ae 314 return CMD_SUCCESS;
50c7d14a
CF
315}
316
317DEFUN (no_isis_passwd,
318 no_isis_passwd_cmd,
b44c509a 319 "no isis password [<md5|clear> WORD]",
50c7d14a
CF
320 NO_STR
321 "IS-IS commands\n"
b44c509a
DW
322 "Configure the authentication password for a circuit\n"
323 "HMAC-MD5 authentication\n"
324 "Cleartext password\n"
325 "Circuit password\n")
50c7d14a 326{
d62a17ae 327 struct isis_circuit *circuit = isis_circuit_lookup(vty);
328 if (!circuit)
329 return CMD_ERR_NO_MATCH;
50c7d14a 330
64dd3ffe
DL
331 CMD_FERR_RETURN(isis_circuit_passwd_unset(circuit),
332 "Failed to unset circuit password: $ERR");
d62a17ae 333 return CMD_SUCCESS;
50c7d14a
CF
334}
335
50c7d14a 336
65f9a9a8
DL
337DEFUN (isis_priority,
338 isis_priority_cmd,
6147e2c6 339 "isis priority (0-127)",
65f9a9a8
DL
340 "IS-IS commands\n"
341 "Set priority for Designated Router election\n"
342 "Priority value\n")
343{
d62a17ae 344 int idx_number = 2;
345 int prio;
346 struct isis_circuit *circuit = isis_circuit_lookup(vty);
347 if (!circuit)
348 return CMD_ERR_NO_MATCH;
65f9a9a8 349
d62a17ae 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);
a5fdb4c5 353 return CMD_WARNING_CONFIG_FAILED;
d62a17ae 354 }
65f9a9a8 355
d62a17ae 356 circuit->priority[0] = prio;
357 circuit->priority[1] = prio;
65f9a9a8 358
d62a17ae 359 return CMD_SUCCESS;
65f9a9a8
DL
360}
361
362DEFUN (no_isis_priority,
363 no_isis_priority_cmd,
b44c509a 364 "no isis priority [(0-127)]",
65f9a9a8
DL
365 NO_STR
366 "IS-IS commands\n"
b44c509a
DW
367 "Set priority for Designated Router election\n"
368 "Priority value\n")
65f9a9a8 369{
d62a17ae 370 struct isis_circuit *circuit = isis_circuit_lookup(vty);
371 if (!circuit)
372 return CMD_ERR_NO_MATCH;
65f9a9a8 373
d62a17ae 374 circuit->priority[0] = DEFAULT_PRIORITY;
375 circuit->priority[1] = DEFAULT_PRIORITY;
65f9a9a8 376
d62a17ae 377 return CMD_SUCCESS;
65f9a9a8
DL
378}
379
65f9a9a8
DL
380
381DEFUN (isis_priority_l1,
382 isis_priority_l1_cmd,
6147e2c6 383 "isis priority (0-127) level-1",
65f9a9a8
DL
384 "IS-IS commands\n"
385 "Set priority for Designated Router election\n"
386 "Priority value\n"
387 "Specify priority for level-1 routing\n")
388{
d62a17ae 389 int idx_number = 2;
390 int prio;
391 struct isis_circuit *circuit = isis_circuit_lookup(vty);
392 if (!circuit)
393 return CMD_ERR_NO_MATCH;
65f9a9a8 394
d62a17ae 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);
a5fdb4c5 398 return CMD_WARNING_CONFIG_FAILED;
d62a17ae 399 }
65f9a9a8 400
d62a17ae 401 circuit->priority[0] = prio;
65f9a9a8 402
d62a17ae 403 return CMD_SUCCESS;
65f9a9a8
DL
404}
405
406DEFUN (no_isis_priority_l1,
407 no_isis_priority_l1_cmd,
b44c509a 408 "no isis priority [(0-127)] level-1",
65f9a9a8
DL
409 NO_STR
410 "IS-IS commands\n"
411 "Set priority for Designated Router election\n"
b44c509a 412 "Priority value\n"
65f9a9a8
DL
413 "Specify priority for level-1 routing\n")
414{
d62a17ae 415 struct isis_circuit *circuit = isis_circuit_lookup(vty);
416 if (!circuit)
417 return CMD_ERR_NO_MATCH;
65f9a9a8 418
d62a17ae 419 circuit->priority[0] = DEFAULT_PRIORITY;
65f9a9a8 420
d62a17ae 421 return CMD_SUCCESS;
65f9a9a8
DL
422}
423
65f9a9a8
DL
424
425DEFUN (isis_priority_l2,
426 isis_priority_l2_cmd,
6147e2c6 427 "isis priority (0-127) level-2",
65f9a9a8
DL
428 "IS-IS commands\n"
429 "Set priority for Designated Router election\n"
430 "Priority value\n"
431 "Specify priority for level-2 routing\n")
432{
d62a17ae 433 int idx_number = 2;
434 int prio;
435 struct isis_circuit *circuit = isis_circuit_lookup(vty);
436 if (!circuit)
437 return CMD_ERR_NO_MATCH;
65f9a9a8 438
d62a17ae 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);
a5fdb4c5 442 return CMD_WARNING_CONFIG_FAILED;
d62a17ae 443 }
65f9a9a8 444
d62a17ae 445 circuit->priority[1] = prio;
65f9a9a8 446
d62a17ae 447 return CMD_SUCCESS;
65f9a9a8
DL
448}
449
450DEFUN (no_isis_priority_l2,
451 no_isis_priority_l2_cmd,
b44c509a 452 "no isis priority [(0-127)] level-2",
65f9a9a8
DL
453 NO_STR
454 "IS-IS commands\n"
455 "Set priority for Designated Router election\n"
b44c509a 456 "Priority value\n"
65f9a9a8
DL
457 "Specify priority for level-2 routing\n")
458{
d62a17ae 459 struct isis_circuit *circuit = isis_circuit_lookup(vty);
460 if (!circuit)
461 return CMD_ERR_NO_MATCH;
65f9a9a8 462
d62a17ae 463 circuit->priority[1] = DEFAULT_PRIORITY;
65f9a9a8 464
d62a17ae 465 return CMD_SUCCESS;
65f9a9a8
DL
466}
467
65f9a9a8
DL
468
469/* Metric command */
470DEFUN (isis_metric,
471 isis_metric_cmd,
6147e2c6 472 "isis metric (0-16777215)",
65f9a9a8
DL
473 "IS-IS commands\n"
474 "Set default metric for circuit\n"
475 "Default metric value\n")
476{
d62a17ae 477 int idx_number = 2;
478 int met;
479 struct isis_circuit *circuit = isis_circuit_lookup(vty);
480 if (!circuit)
481 return CMD_ERR_NO_MATCH;
65f9a9a8 482
d62a17ae 483 met = atoi(argv[idx_number]->arg);
65f9a9a8 484
d62a17ae 485 /* RFC3787 section 5.1 */
486 if (circuit->area && circuit->area->oldmetric == 1
487 && met > MAX_NARROW_LINK_METRIC) {
488 vty_out(vty,
489 "Invalid metric %d - should be <0-63> "
490 "when narrow metric type enabled\n",
491 met);
a5fdb4c5 492 return CMD_WARNING_CONFIG_FAILED;
d62a17ae 493 }
65f9a9a8 494
d62a17ae 495 /* RFC4444 */
496 if (circuit->area && circuit->area->newmetric == 1
497 && met > MAX_WIDE_LINK_METRIC) {
498 vty_out(vty,
499 "Invalid metric %d - should be <0-16777215> "
500 "when wide metric type enabled\n",
501 met);
a5fdb4c5 502 return CMD_WARNING_CONFIG_FAILED;
d62a17ae 503 }
65f9a9a8 504
64dd3ffe
DL
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");
d62a17ae 509 return CMD_SUCCESS;
65f9a9a8
DL
510}
511
b44c509a 512
65f9a9a8
DL
513DEFUN (no_isis_metric,
514 no_isis_metric_cmd,
b44c509a 515 "no isis metric [(0-16777215)]",
65f9a9a8
DL
516 NO_STR
517 "IS-IS commands\n"
b44c509a
DW
518 "Set default metric for circuit\n"
519 "Default metric value\n")
65f9a9a8 520{
d62a17ae 521 struct isis_circuit *circuit = isis_circuit_lookup(vty);
522 if (!circuit)
523 return CMD_ERR_NO_MATCH;
65f9a9a8 524
64dd3ffe
DL
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");
d62a17ae 531 return CMD_SUCCESS;
65f9a9a8
DL
532}
533
65f9a9a8
DL
534
535DEFUN (isis_metric_l1,
536 isis_metric_l1_cmd,
6147e2c6 537 "isis metric (0-16777215) level-1",
65f9a9a8
DL
538 "IS-IS commands\n"
539 "Set default metric for circuit\n"
540 "Default metric value\n"
541 "Specify metric for level-1 routing\n")
542{
d62a17ae 543 int idx_number = 2;
544 int met;
545 struct isis_circuit *circuit = isis_circuit_lookup(vty);
546 if (!circuit)
547 return CMD_ERR_NO_MATCH;
65f9a9a8 548
d62a17ae 549 met = atoi(argv[idx_number]->arg);
64dd3ffe
DL
550 CMD_FERR_RETURN(isis_circuit_metric_set(circuit, IS_LEVEL_1, met),
551 "Failed to set L1 metric: $ERR");
d62a17ae 552 return CMD_SUCCESS;
65f9a9a8
DL
553}
554
b44c509a 555
65f9a9a8
DL
556DEFUN (no_isis_metric_l1,
557 no_isis_metric_l1_cmd,
b44c509a 558 "no isis metric [(0-16777215)] level-1",
65f9a9a8
DL
559 NO_STR
560 "IS-IS commands\n"
561 "Set default metric for circuit\n"
b44c509a 562 "Default metric value\n"
65f9a9a8
DL
563 "Specify metric for level-1 routing\n")
564{
d62a17ae 565 struct isis_circuit *circuit = isis_circuit_lookup(vty);
566 if (!circuit)
567 return CMD_ERR_NO_MATCH;
65f9a9a8 568
64dd3ffe
DL
569 CMD_FERR_RETURN(isis_circuit_metric_set(circuit, IS_LEVEL_1,
570 DEFAULT_CIRCUIT_METRIC),
571 "Failed to set L1 metric: $ERR");
d62a17ae 572 return CMD_SUCCESS;
65f9a9a8
DL
573}
574
65f9a9a8
DL
575
576DEFUN (isis_metric_l2,
577 isis_metric_l2_cmd,
6147e2c6 578 "isis metric (0-16777215) level-2",
65f9a9a8
DL
579 "IS-IS commands\n"
580 "Set default metric for circuit\n"
581 "Default metric value\n"
582 "Specify metric for level-2 routing\n")
583{
d62a17ae 584 int idx_number = 2;
585 int met;
586 struct isis_circuit *circuit = isis_circuit_lookup(vty);
587 if (!circuit)
588 return CMD_ERR_NO_MATCH;
65f9a9a8 589
d62a17ae 590 met = atoi(argv[idx_number]->arg);
64dd3ffe
DL
591 CMD_FERR_RETURN(isis_circuit_metric_set(circuit, IS_LEVEL_2, met),
592 "Failed to set L2 metric: $ERR");
d62a17ae 593 return CMD_SUCCESS;
65f9a9a8
DL
594}
595
b44c509a 596
65f9a9a8
DL
597DEFUN (no_isis_metric_l2,
598 no_isis_metric_l2_cmd,
b44c509a 599 "no isis metric [(0-16777215)] level-2",
65f9a9a8
DL
600 NO_STR
601 "IS-IS commands\n"
602 "Set default metric for circuit\n"
b44c509a 603 "Default metric value\n"
65f9a9a8
DL
604 "Specify metric for level-2 routing\n")
605{
d62a17ae 606 struct isis_circuit *circuit = isis_circuit_lookup(vty);
607 if (!circuit)
608 return CMD_ERR_NO_MATCH;
65f9a9a8 609
64dd3ffe
DL
610 CMD_FERR_RETURN(isis_circuit_metric_set(circuit, IS_LEVEL_2,
611 DEFAULT_CIRCUIT_METRIC),
612 "Failed to set L2 metric: $ERR");
d62a17ae 613 return CMD_SUCCESS;
65f9a9a8
DL
614}
615
65f9a9a8
DL
616/* end of metrics */
617
01bb08b6
DL
618DEFUN (isis_hello_interval,
619 isis_hello_interval_cmd,
6147e2c6 620 "isis hello-interval (1-600)",
01bb08b6
DL
621 "IS-IS commands\n"
622 "Set Hello interval\n"
01bb08b6
DL
623 "Holdtime 1 seconds, interval depends on multiplier\n")
624{
d62a17ae 625 int idx_number = 2;
626 int interval;
627 struct isis_circuit *circuit = isis_circuit_lookup(vty);
628 if (!circuit)
629 return CMD_ERR_NO_MATCH;
01bb08b6 630
d62a17ae 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",
634 interval);
a5fdb4c5 635 return CMD_WARNING_CONFIG_FAILED;
d62a17ae 636 }
01bb08b6 637
d62a17ae 638 circuit->hello_interval[0] = (u_int16_t)interval;
639 circuit->hello_interval[1] = (u_int16_t)interval;
01bb08b6 640
d62a17ae 641 return CMD_SUCCESS;
01bb08b6
DL
642}
643
b44c509a 644
01bb08b6
DL
645DEFUN (no_isis_hello_interval,
646 no_isis_hello_interval_cmd,
b44c509a 647 "no isis hello-interval [(1-600)]",
01bb08b6
DL
648 NO_STR
649 "IS-IS commands\n"
b44c509a
DW
650 "Set Hello interval\n"
651 "Holdtime 1 second, interval depends on multiplier\n")
01bb08b6 652{
d62a17ae 653 struct isis_circuit *circuit = isis_circuit_lookup(vty);
654 if (!circuit)
655 return CMD_ERR_NO_MATCH;
01bb08b6 656
d62a17ae 657 circuit->hello_interval[0] = DEFAULT_HELLO_INTERVAL;
658 circuit->hello_interval[1] = DEFAULT_HELLO_INTERVAL;
01bb08b6 659
d62a17ae 660 return CMD_SUCCESS;
01bb08b6
DL
661}
662
01bb08b6
DL
663
664DEFUN (isis_hello_interval_l1,
665 isis_hello_interval_l1_cmd,
6147e2c6 666 "isis hello-interval (1-600) level-1",
01bb08b6
DL
667 "IS-IS commands\n"
668 "Set Hello interval\n"
01bb08b6
DL
669 "Holdtime 1 second, interval depends on multiplier\n"
670 "Specify hello-interval for level-1 IIHs\n")
671{
d62a17ae 672 int idx_number = 2;
673 long interval;
674 struct isis_circuit *circuit = isis_circuit_lookup(vty);
675 if (!circuit)
676 return CMD_ERR_NO_MATCH;
01bb08b6 677
d62a17ae 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",
681 interval);
a5fdb4c5 682 return CMD_WARNING_CONFIG_FAILED;
d62a17ae 683 }
01bb08b6 684
d62a17ae 685 circuit->hello_interval[0] = (u_int16_t)interval;
01bb08b6 686
d62a17ae 687 return CMD_SUCCESS;
01bb08b6
DL
688}
689
b44c509a 690
01bb08b6
DL
691DEFUN (no_isis_hello_interval_l1,
692 no_isis_hello_interval_l1_cmd,
b44c509a 693 "no isis hello-interval [(1-600)] level-1",
01bb08b6
DL
694 NO_STR
695 "IS-IS commands\n"
696 "Set Hello interval\n"
b44c509a 697 "Holdtime 1 second, interval depends on multiplier\n"
01bb08b6
DL
698 "Specify hello-interval for level-1 IIHs\n")
699{
d62a17ae 700 struct isis_circuit *circuit = isis_circuit_lookup(vty);
701 if (!circuit)
702 return CMD_ERR_NO_MATCH;
01bb08b6 703
d62a17ae 704 circuit->hello_interval[0] = DEFAULT_HELLO_INTERVAL;
01bb08b6 705
d62a17ae 706 return CMD_SUCCESS;
01bb08b6
DL
707}
708
01bb08b6
DL
709
710DEFUN (isis_hello_interval_l2,
711 isis_hello_interval_l2_cmd,
6147e2c6 712 "isis hello-interval (1-600) level-2",
01bb08b6
DL
713 "IS-IS commands\n"
714 "Set Hello interval\n"
01bb08b6
DL
715 "Holdtime 1 second, interval depends on multiplier\n"
716 "Specify hello-interval for level-2 IIHs\n")
717{
d62a17ae 718 int idx_number = 2;
719 long interval;
720 struct isis_circuit *circuit = isis_circuit_lookup(vty);
721 if (!circuit)
722 return CMD_ERR_NO_MATCH;
01bb08b6 723
d62a17ae 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",
727 interval);
a5fdb4c5 728 return CMD_WARNING_CONFIG_FAILED;
d62a17ae 729 }
01bb08b6 730
d62a17ae 731 circuit->hello_interval[1] = (u_int16_t)interval;
01bb08b6 732
d62a17ae 733 return CMD_SUCCESS;
01bb08b6
DL
734}
735
b44c509a 736
01bb08b6
DL
737DEFUN (no_isis_hello_interval_l2,
738 no_isis_hello_interval_l2_cmd,
b44c509a 739 "no isis hello-interval [(1-600)] level-2",
01bb08b6
DL
740 NO_STR
741 "IS-IS commands\n"
742 "Set Hello interval\n"
b44c509a 743 "Holdtime 1 second, interval depends on multiplier\n"
01bb08b6
DL
744 "Specify hello-interval for level-2 IIHs\n")
745{
d62a17ae 746 struct isis_circuit *circuit = isis_circuit_lookup(vty);
747 if (!circuit)
748 return CMD_ERR_NO_MATCH;
01bb08b6 749
d62a17ae 750 circuit->hello_interval[1] = DEFAULT_HELLO_INTERVAL;
01bb08b6 751
d62a17ae 752 return CMD_SUCCESS;
01bb08b6
DL
753}
754
01bb08b6
DL
755
756DEFUN (isis_hello_multiplier,
757 isis_hello_multiplier_cmd,
6147e2c6 758 "isis hello-multiplier (2-100)",
01bb08b6
DL
759 "IS-IS commands\n"
760 "Set multiplier for Hello holding time\n"
761 "Hello multiplier value\n")
762{
d62a17ae 763 int idx_number = 2;
764 int mult;
765 struct isis_circuit *circuit = isis_circuit_lookup(vty);
766 if (!circuit)
767 return CMD_ERR_NO_MATCH;
01bb08b6 768
d62a17ae 769 mult = atoi(argv[idx_number]->arg);
770 if (mult < MIN_HELLO_MULTIPLIER || mult > MAX_HELLO_MULTIPLIER) {
771 vty_out(vty,
772 "Invalid hello-multiplier %d - should be <2-100>\n",
773 mult);
a5fdb4c5 774 return CMD_WARNING_CONFIG_FAILED;
d62a17ae 775 }
01bb08b6 776
d62a17ae 777 circuit->hello_multiplier[0] = (u_int16_t)mult;
778 circuit->hello_multiplier[1] = (u_int16_t)mult;
01bb08b6 779
d62a17ae 780 return CMD_SUCCESS;
01bb08b6
DL
781}
782
b44c509a 783
01bb08b6
DL
784DEFUN (no_isis_hello_multiplier,
785 no_isis_hello_multiplier_cmd,
b44c509a 786 "no isis hello-multiplier [(2-100)]",
01bb08b6
DL
787 NO_STR
788 "IS-IS commands\n"
b44c509a
DW
789 "Set multiplier for Hello holding time\n"
790 "Hello multiplier value\n")
01bb08b6 791{
d62a17ae 792 struct isis_circuit *circuit = isis_circuit_lookup(vty);
793 if (!circuit)
794 return CMD_ERR_NO_MATCH;
01bb08b6 795
d62a17ae 796 circuit->hello_multiplier[0] = DEFAULT_HELLO_MULTIPLIER;
797 circuit->hello_multiplier[1] = DEFAULT_HELLO_MULTIPLIER;
01bb08b6 798
d62a17ae 799 return CMD_SUCCESS;
01bb08b6
DL
800}
801
01bb08b6
DL
802
803DEFUN (isis_hello_multiplier_l1,
804 isis_hello_multiplier_l1_cmd,
6147e2c6 805 "isis hello-multiplier (2-100) level-1",
01bb08b6
DL
806 "IS-IS commands\n"
807 "Set multiplier for Hello holding time\n"
808 "Hello multiplier value\n"
809 "Specify hello multiplier for level-1 IIHs\n")
810{
d62a17ae 811 int idx_number = 2;
812 int mult;
813 struct isis_circuit *circuit = isis_circuit_lookup(vty);
814 if (!circuit)
815 return CMD_ERR_NO_MATCH;
01bb08b6 816
d62a17ae 817 mult = atoi(argv[idx_number]->arg);
818 if (mult < MIN_HELLO_MULTIPLIER || mult > MAX_HELLO_MULTIPLIER) {
819 vty_out(vty,
820 "Invalid hello-multiplier %d - should be <2-100>\n",
821 mult);
a5fdb4c5 822 return CMD_WARNING_CONFIG_FAILED;
d62a17ae 823 }
01bb08b6 824
d62a17ae 825 circuit->hello_multiplier[0] = (u_int16_t)mult;
01bb08b6 826
d62a17ae 827 return CMD_SUCCESS;
01bb08b6
DL
828}
829
b44c509a 830
01bb08b6
DL
831DEFUN (no_isis_hello_multiplier_l1,
832 no_isis_hello_multiplier_l1_cmd,
b44c509a 833 "no isis hello-multiplier [(2-100)] level-1",
01bb08b6
DL
834 NO_STR
835 "IS-IS commands\n"
836 "Set multiplier for Hello holding time\n"
b44c509a 837 "Hello multiplier value\n"
01bb08b6
DL
838 "Specify hello multiplier for level-1 IIHs\n")
839{
d62a17ae 840 struct isis_circuit *circuit = isis_circuit_lookup(vty);
841 if (!circuit)
842 return CMD_ERR_NO_MATCH;
01bb08b6 843
d62a17ae 844 circuit->hello_multiplier[0] = DEFAULT_HELLO_MULTIPLIER;
01bb08b6 845
d62a17ae 846 return CMD_SUCCESS;
01bb08b6
DL
847}
848
01bb08b6
DL
849
850DEFUN (isis_hello_multiplier_l2,
851 isis_hello_multiplier_l2_cmd,
6147e2c6 852 "isis hello-multiplier (2-100) level-2",
01bb08b6
DL
853 "IS-IS commands\n"
854 "Set multiplier for Hello holding time\n"
855 "Hello multiplier value\n"
856 "Specify hello multiplier for level-2 IIHs\n")
857{
d62a17ae 858 int idx_number = 2;
859 int mult;
860 struct isis_circuit *circuit = isis_circuit_lookup(vty);
861 if (!circuit)
862 return CMD_ERR_NO_MATCH;
01bb08b6 863
d62a17ae 864 mult = atoi(argv[idx_number]->arg);
865 if (mult < MIN_HELLO_MULTIPLIER || mult > MAX_HELLO_MULTIPLIER) {
866 vty_out(vty,
867 "Invalid hello-multiplier %d - should be <2-100>\n",
868 mult);
a5fdb4c5 869 return CMD_WARNING_CONFIG_FAILED;
d62a17ae 870 }
01bb08b6 871
d62a17ae 872 circuit->hello_multiplier[1] = (u_int16_t)mult;
01bb08b6 873
d62a17ae 874 return CMD_SUCCESS;
01bb08b6
DL
875}
876
b44c509a 877
01bb08b6
DL
878DEFUN (no_isis_hello_multiplier_l2,
879 no_isis_hello_multiplier_l2_cmd,
b44c509a 880 "no isis hello-multiplier [(2-100)] level-2",
01bb08b6
DL
881 NO_STR
882 "IS-IS commands\n"
883 "Set multiplier for Hello holding time\n"
b44c509a 884 "Hello multiplier value\n"
01bb08b6
DL
885 "Specify hello multiplier for level-2 IIHs\n")
886{
d62a17ae 887 struct isis_circuit *circuit = isis_circuit_lookup(vty);
888 if (!circuit)
889 return CMD_ERR_NO_MATCH;
01bb08b6 890
d62a17ae 891 circuit->hello_multiplier[1] = DEFAULT_HELLO_MULTIPLIER;
01bb08b6 892
d62a17ae 893 return CMD_SUCCESS;
01bb08b6
DL
894}
895
01bb08b6
DL
896
897DEFUN (isis_hello_padding,
898 isis_hello_padding_cmd,
899 "isis hello padding",
900 "IS-IS commands\n"
901 "Add padding to IS-IS hello packets\n"
7111c1a0 902 "Pad hello packets\n")
01bb08b6 903{
d62a17ae 904 struct isis_circuit *circuit = isis_circuit_lookup(vty);
905 if (!circuit)
906 return CMD_ERR_NO_MATCH;
01bb08b6 907
d62a17ae 908 circuit->pad_hellos = 1;
01bb08b6 909
d62a17ae 910 return CMD_SUCCESS;
01bb08b6
DL
911}
912
913DEFUN (no_isis_hello_padding,
914 no_isis_hello_padding_cmd,
915 "no isis hello padding",
916 NO_STR
917 "IS-IS commands\n"
918 "Add padding to IS-IS hello packets\n"
7111c1a0 919 "Pad hello packets\n")
01bb08b6 920{
d62a17ae 921 struct isis_circuit *circuit = isis_circuit_lookup(vty);
922 if (!circuit)
923 return CMD_ERR_NO_MATCH;
01bb08b6 924
d62a17ae 925 circuit->pad_hellos = 0;
01bb08b6 926
d62a17ae 927 return CMD_SUCCESS;
01bb08b6
DL
928}
929
930DEFUN (csnp_interval,
931 csnp_interval_cmd,
6147e2c6 932 "isis csnp-interval (1-600)",
01bb08b6
DL
933 "IS-IS commands\n"
934 "Set CSNP interval in seconds\n"
935 "CSNP interval value\n")
936{
d62a17ae 937 int idx_number = 2;
938 unsigned long interval;
939 struct isis_circuit *circuit = isis_circuit_lookup(vty);
940 if (!circuit)
941 return CMD_ERR_NO_MATCH;
01bb08b6 942
d62a17ae 943 interval = atol(argv[idx_number]->arg);
944 if (interval < MIN_CSNP_INTERVAL || interval > MAX_CSNP_INTERVAL) {
945 vty_out(vty, "Invalid csnp-interval %lu - should be <1-600>\n",
946 interval);
a5fdb4c5 947 return CMD_WARNING_CONFIG_FAILED;
d62a17ae 948 }
01bb08b6 949
d62a17ae 950 circuit->csnp_interval[0] = (u_int16_t)interval;
951 circuit->csnp_interval[1] = (u_int16_t)interval;
01bb08b6 952
d62a17ae 953 return CMD_SUCCESS;
01bb08b6
DL
954}
955
b44c509a 956
01bb08b6
DL
957DEFUN (no_csnp_interval,
958 no_csnp_interval_cmd,
b44c509a 959 "no isis csnp-interval [(1-600)]",
01bb08b6
DL
960 NO_STR
961 "IS-IS commands\n"
b44c509a
DW
962 "Set CSNP interval in seconds\n"
963 "CSNP interval value\n")
01bb08b6 964{
d62a17ae 965 struct isis_circuit *circuit = isis_circuit_lookup(vty);
966 if (!circuit)
967 return CMD_ERR_NO_MATCH;
01bb08b6 968
d62a17ae 969 circuit->csnp_interval[0] = DEFAULT_CSNP_INTERVAL;
970 circuit->csnp_interval[1] = DEFAULT_CSNP_INTERVAL;
01bb08b6 971
d62a17ae 972 return CMD_SUCCESS;
01bb08b6
DL
973}
974
01bb08b6
DL
975
976DEFUN (csnp_interval_l1,
977 csnp_interval_l1_cmd,
6147e2c6 978 "isis csnp-interval (1-600) level-1",
01bb08b6
DL
979 "IS-IS commands\n"
980 "Set CSNP interval in seconds\n"
981 "CSNP interval value\n"
982 "Specify interval for level-1 CSNPs\n")
983{
d62a17ae 984 int idx_number = 2;
985 unsigned long interval;
986 struct isis_circuit *circuit = isis_circuit_lookup(vty);
987 if (!circuit)
988 return CMD_ERR_NO_MATCH;
01bb08b6 989
d62a17ae 990 interval = atol(argv[idx_number]->arg);
991 if (interval < MIN_CSNP_INTERVAL || interval > MAX_CSNP_INTERVAL) {
992 vty_out(vty, "Invalid csnp-interval %lu - should be <1-600>\n",
993 interval);
a5fdb4c5 994 return CMD_WARNING_CONFIG_FAILED;
d62a17ae 995 }
01bb08b6 996
d62a17ae 997 circuit->csnp_interval[0] = (u_int16_t)interval;
01bb08b6 998
d62a17ae 999 return CMD_SUCCESS;
01bb08b6
DL
1000}
1001
b44c509a 1002
01bb08b6
DL
1003DEFUN (no_csnp_interval_l1,
1004 no_csnp_interval_l1_cmd,
b44c509a 1005 "no isis csnp-interval [(1-600)] level-1",
01bb08b6
DL
1006 NO_STR
1007 "IS-IS commands\n"
1008 "Set CSNP interval in seconds\n"
b44c509a 1009 "CSNP interval value\n"
01bb08b6
DL
1010 "Specify interval for level-1 CSNPs\n")
1011{
d62a17ae 1012 struct isis_circuit *circuit = isis_circuit_lookup(vty);
1013 if (!circuit)
1014 return CMD_ERR_NO_MATCH;
01bb08b6 1015
d62a17ae 1016 circuit->csnp_interval[0] = DEFAULT_CSNP_INTERVAL;
01bb08b6 1017
d62a17ae 1018 return CMD_SUCCESS;
01bb08b6
DL
1019}
1020
01bb08b6
DL
1021
1022DEFUN (csnp_interval_l2,
1023 csnp_interval_l2_cmd,
6147e2c6 1024 "isis csnp-interval (1-600) level-2",
01bb08b6
DL
1025 "IS-IS commands\n"
1026 "Set CSNP interval in seconds\n"
1027 "CSNP interval value\n"
1028 "Specify interval for level-2 CSNPs\n")
1029{
d62a17ae 1030 int idx_number = 2;
1031 unsigned long interval;
1032 struct isis_circuit *circuit = isis_circuit_lookup(vty);
1033 if (!circuit)
1034 return CMD_ERR_NO_MATCH;
01bb08b6 1035
d62a17ae 1036 interval = atol(argv[idx_number]->arg);
1037 if (interval < MIN_CSNP_INTERVAL || interval > MAX_CSNP_INTERVAL) {
1038 vty_out(vty, "Invalid csnp-interval %lu - should be <1-600>\n",
1039 interval);
a5fdb4c5 1040 return CMD_WARNING_CONFIG_FAILED;
d62a17ae 1041 }
01bb08b6 1042
d62a17ae 1043 circuit->csnp_interval[1] = (u_int16_t)interval;
01bb08b6 1044
d62a17ae 1045 return CMD_SUCCESS;
01bb08b6
DL
1046}
1047
b44c509a 1048
01bb08b6
DL
1049DEFUN (no_csnp_interval_l2,
1050 no_csnp_interval_l2_cmd,
b44c509a 1051 "no isis csnp-interval [(1-600)] level-2",
01bb08b6
DL
1052 NO_STR
1053 "IS-IS commands\n"
1054 "Set CSNP interval in seconds\n"
b44c509a 1055 "CSNP interval value\n"
01bb08b6
DL
1056 "Specify interval for level-2 CSNPs\n")
1057{
d62a17ae 1058 struct isis_circuit *circuit = isis_circuit_lookup(vty);
1059 if (!circuit)
1060 return CMD_ERR_NO_MATCH;
01bb08b6 1061
d62a17ae 1062 circuit->csnp_interval[1] = DEFAULT_CSNP_INTERVAL;
01bb08b6 1063
d62a17ae 1064 return CMD_SUCCESS;
01bb08b6
DL
1065}
1066
01bb08b6
DL
1067
1068DEFUN (psnp_interval,
1069 psnp_interval_cmd,
6147e2c6 1070 "isis psnp-interval (1-120)",
01bb08b6
DL
1071 "IS-IS commands\n"
1072 "Set PSNP interval in seconds\n"
1073 "PSNP interval value\n")
1074{
d62a17ae 1075 int idx_number = 2;
1076 unsigned long interval;
1077 struct isis_circuit *circuit = isis_circuit_lookup(vty);
1078 if (!circuit)
1079 return CMD_ERR_NO_MATCH;
01bb08b6 1080
d62a17ae 1081 interval = atol(argv[idx_number]->arg);
1082 if (interval < MIN_PSNP_INTERVAL || interval > MAX_PSNP_INTERVAL) {
1083 vty_out(vty, "Invalid psnp-interval %lu - should be <1-120>\n",
1084 interval);
a5fdb4c5 1085 return CMD_WARNING_CONFIG_FAILED;
d62a17ae 1086 }
01bb08b6 1087
d62a17ae 1088 circuit->psnp_interval[0] = (u_int16_t)interval;
1089 circuit->psnp_interval[1] = (u_int16_t)interval;
01bb08b6 1090
d62a17ae 1091 return CMD_SUCCESS;
01bb08b6
DL
1092}
1093
b44c509a 1094
01bb08b6
DL
1095DEFUN (no_psnp_interval,
1096 no_psnp_interval_cmd,
b44c509a 1097 "no isis psnp-interval [(1-120)]",
01bb08b6
DL
1098 NO_STR
1099 "IS-IS commands\n"
b44c509a
DW
1100 "Set PSNP interval in seconds\n"
1101 "PSNP interval value\n")
01bb08b6 1102{
d62a17ae 1103 struct isis_circuit *circuit = isis_circuit_lookup(vty);
1104 if (!circuit)
1105 return CMD_ERR_NO_MATCH;
01bb08b6 1106
d62a17ae 1107 circuit->psnp_interval[0] = DEFAULT_PSNP_INTERVAL;
1108 circuit->psnp_interval[1] = DEFAULT_PSNP_INTERVAL;
01bb08b6 1109
d62a17ae 1110 return CMD_SUCCESS;
01bb08b6
DL
1111}
1112
01bb08b6
DL
1113
1114DEFUN (psnp_interval_l1,
1115 psnp_interval_l1_cmd,
6147e2c6 1116 "isis psnp-interval (1-120) level-1",
01bb08b6
DL
1117 "IS-IS commands\n"
1118 "Set PSNP interval in seconds\n"
1119 "PSNP interval value\n"
1120 "Specify interval for level-1 PSNPs\n")
1121{
d62a17ae 1122 int idx_number = 2;
1123 unsigned long interval;
1124 struct isis_circuit *circuit = isis_circuit_lookup(vty);
1125 if (!circuit)
1126 return CMD_ERR_NO_MATCH;
01bb08b6 1127
d62a17ae 1128 interval = atol(argv[idx_number]->arg);
1129 if (interval < MIN_PSNP_INTERVAL || interval > MAX_PSNP_INTERVAL) {
1130 vty_out(vty, "Invalid psnp-interval %lu - should be <1-120>\n",
1131 interval);
a5fdb4c5 1132 return CMD_WARNING_CONFIG_FAILED;
d62a17ae 1133 }
01bb08b6 1134
d62a17ae 1135 circuit->psnp_interval[0] = (u_int16_t)interval;
01bb08b6 1136
d62a17ae 1137 return CMD_SUCCESS;
01bb08b6
DL
1138}
1139
b44c509a 1140
01bb08b6
DL
1141DEFUN (no_psnp_interval_l1,
1142 no_psnp_interval_l1_cmd,
b44c509a 1143 "no isis psnp-interval [(1-120)] level-1",
01bb08b6
DL
1144 NO_STR
1145 "IS-IS commands\n"
1146 "Set PSNP interval in seconds\n"
b44c509a 1147 "PSNP interval value\n"
01bb08b6
DL
1148 "Specify interval for level-1 PSNPs\n")
1149{
d62a17ae 1150 struct isis_circuit *circuit = isis_circuit_lookup(vty);
1151 if (!circuit)
1152 return CMD_ERR_NO_MATCH;
01bb08b6 1153
d62a17ae 1154 circuit->psnp_interval[0] = DEFAULT_PSNP_INTERVAL;
01bb08b6 1155
d62a17ae 1156 return CMD_SUCCESS;
01bb08b6
DL
1157}
1158
01bb08b6
DL
1159
1160DEFUN (psnp_interval_l2,
1161 psnp_interval_l2_cmd,
6147e2c6 1162 "isis psnp-interval (1-120) level-2",
01bb08b6
DL
1163 "IS-IS commands\n"
1164 "Set PSNP interval in seconds\n"
1165 "PSNP interval value\n"
1166 "Specify interval for level-2 PSNPs\n")
1167{
d62a17ae 1168 int idx_number = 2;
1169 unsigned long interval;
1170 struct isis_circuit *circuit = isis_circuit_lookup(vty);
1171 if (!circuit)
1172 return CMD_ERR_NO_MATCH;
01bb08b6 1173
d62a17ae 1174 interval = atol(argv[idx_number]->arg);
1175 if (interval < MIN_PSNP_INTERVAL || interval > MAX_PSNP_INTERVAL) {
1176 vty_out(vty, "Invalid psnp-interval %lu - should be <1-120>\n",
1177 interval);
a5fdb4c5 1178 return CMD_WARNING_CONFIG_FAILED;
d62a17ae 1179 }
01bb08b6 1180
d62a17ae 1181 circuit->psnp_interval[1] = (u_int16_t)interval;
01bb08b6 1182
d62a17ae 1183 return CMD_SUCCESS;
01bb08b6
DL
1184}
1185
b44c509a 1186
01bb08b6
DL
1187DEFUN (no_psnp_interval_l2,
1188 no_psnp_interval_l2_cmd,
b44c509a 1189 "no isis psnp-interval [(1-120)] level-2",
01bb08b6
DL
1190 NO_STR
1191 "IS-IS commands\n"
1192 "Set PSNP interval in seconds\n"
b44c509a 1193 "PSNP interval value\n"
01bb08b6
DL
1194 "Specify interval for level-2 PSNPs\n")
1195{
d62a17ae 1196 struct isis_circuit *circuit = isis_circuit_lookup(vty);
1197 if (!circuit)
1198 return CMD_ERR_NO_MATCH;
01bb08b6 1199
d62a17ae 1200 circuit->psnp_interval[1] = DEFAULT_PSNP_INTERVAL;
01bb08b6 1201
d62a17ae 1202 return CMD_SUCCESS;
01bb08b6
DL
1203}
1204
064f4896
CF
1205DEFUN (circuit_topology,
1206 circuit_topology_cmd,
1207 "isis topology " ISIS_MT_NAMES,
1208 "IS-IS commands\n"
1209 "Configure interface IS-IS topologies\n"
1210 ISIS_MT_DESCRIPTIONS)
1211{
d62a17ae 1212 struct isis_circuit *circuit = isis_circuit_lookup(vty);
1213 if (!circuit)
1214 return CMD_ERR_NO_MATCH;
1215 const char *arg = argv[2]->arg;
1216 uint16_t mtid = isis_str2mtid(arg);
c3ea3906 1217
d62a17ae 1218 if (circuit->area && circuit->area->oldmetric) {
1219 vty_out(vty,
1220 "Multi topology IS-IS can only be used with wide metrics\n");
a5fdb4c5 1221 return CMD_WARNING_CONFIG_FAILED;
d62a17ae 1222 }
c3ea3906 1223
d62a17ae 1224 if (mtid == (uint16_t)-1) {
1225 vty_out(vty, "Don't know topology '%s'\n", arg);
a5fdb4c5 1226 return CMD_WARNING_CONFIG_FAILED;
d62a17ae 1227 }
064f4896 1228
d62a17ae 1229 return isis_circuit_mt_enabled_set(circuit, mtid, true);
064f4896
CF
1230}
1231
1232DEFUN (no_circuit_topology,
1233 no_circuit_topology_cmd,
1234 "no isis topology " ISIS_MT_NAMES,
1235 NO_STR
1236 "IS-IS commands\n"
1237 "Configure interface IS-IS topologies\n"
1238 ISIS_MT_DESCRIPTIONS)
1239{
d62a17ae 1240 struct isis_circuit *circuit = isis_circuit_lookup(vty);
1241 if (!circuit)
1242 return CMD_ERR_NO_MATCH;
1243 const char *arg = argv[3]->arg;
1244 uint16_t mtid = isis_str2mtid(arg);
1245
1246 if (circuit->area && circuit->area->oldmetric) {
1247 vty_out(vty,
1248 "Multi topology IS-IS can only be used with wide metrics\n");
a5fdb4c5 1249 return CMD_WARNING_CONFIG_FAILED;
d62a17ae 1250 }
1251
1252 if (mtid == (uint16_t)-1) {
1253 vty_out(vty, "Don't know topology '%s'\n", arg);
a5fdb4c5 1254 return CMD_WARNING_CONFIG_FAILED;
d62a17ae 1255 }
1256
1257 return isis_circuit_mt_enabled_set(circuit, mtid, false);
1258}
1259
1260static int validate_metric_style_narrow(struct vty *vty, struct isis_area *area)
1261{
1262 struct isis_circuit *circuit;
1263 struct listnode *node;
1264
1265 if (!vty)
a5fdb4c5 1266 return CMD_WARNING_CONFIG_FAILED;
d62a17ae 1267
1268 if (!area) {
1269 vty_out(vty, "ISIS area is invalid\n");
a5fdb4c5 1270 return CMD_WARNING_CONFIG_FAILED;
d62a17ae 1271 }
1272
1273 for (ALL_LIST_ELEMENTS_RO(area->circuit_list, node, circuit)) {
1274 if ((area->is_type & IS_LEVEL_1)
1275 && (circuit->is_type & IS_LEVEL_1)
1276 && (circuit->te_metric[0] > MAX_NARROW_LINK_METRIC)) {
1277 vty_out(vty, "ISIS circuit %s metric is invalid\n",
1278 circuit->interface->name);
a5fdb4c5 1279 return CMD_WARNING_CONFIG_FAILED;
d62a17ae 1280 }
1281 if ((area->is_type & IS_LEVEL_2)
1282 && (circuit->is_type & IS_LEVEL_2)
1283 && (circuit->te_metric[1] > MAX_NARROW_LINK_METRIC)) {
1284 vty_out(vty, "ISIS circuit %s metric is invalid\n",
1285 circuit->interface->name);
a5fdb4c5 1286 return CMD_WARNING_CONFIG_FAILED;
d62a17ae 1287 }
1288 }
1289
1290 return CMD_SUCCESS;
a38a72db
CF
1291}
1292
1293DEFUN (metric_style,
1294 metric_style_cmd,
6147e2c6 1295 "metric-style <narrow|transition|wide>",
a38a72db
CF
1296 "Use old-style (ISO 10589) or new-style packet formats\n"
1297 "Use old style of TLVs with narrow metric\n"
1298 "Send and accept both styles of TLVs during transition\n"
1299 "Use new style of TLVs to carry wider metric\n")
1300{
d62a17ae 1301 int idx_metric_style = 1;
1302 VTY_DECLVAR_CONTEXT(isis_area, area);
1303 int ret;
a38a72db 1304
d62a17ae 1305 if (strncmp(argv[idx_metric_style]->arg, "w", 1) == 0) {
1306 isis_area_metricstyle_set(area, false, true);
1307 return CMD_SUCCESS;
1308 }
a38a72db 1309
d62a17ae 1310 if (area_is_mt(area)) {
1311 vty_out(vty,
1312 "Narrow metrics cannot be used while multi topology IS-IS is active\n");
a5fdb4c5 1313 return CMD_WARNING_CONFIG_FAILED;
d62a17ae 1314 }
c3ea3906 1315
d62a17ae 1316 ret = validate_metric_style_narrow(vty, area);
1317 if (ret != CMD_SUCCESS)
1318 return ret;
a38a72db 1319
d62a17ae 1320 if (strncmp(argv[idx_metric_style]->arg, "t", 1) == 0)
1321 isis_area_metricstyle_set(area, true, true);
1322 else if (strncmp(argv[idx_metric_style]->arg, "n", 1) == 0)
1323 isis_area_metricstyle_set(area, true, false);
1324 return CMD_SUCCESS;
a38a72db 1325
d62a17ae 1326 return CMD_SUCCESS;
a38a72db
CF
1327}
1328
1329DEFUN (no_metric_style,
1330 no_metric_style_cmd,
1331 "no metric-style",
1332 NO_STR
1333 "Use old-style (ISO 10589) or new-style packet formats\n")
1334{
d62a17ae 1335 VTY_DECLVAR_CONTEXT(isis_area, area);
1336 int ret;
a38a72db 1337
d62a17ae 1338 if (area_is_mt(area)) {
1339 vty_out(vty,
1340 "Narrow metrics cannot be used while multi topology IS-IS is active\n");
a5fdb4c5 1341 return CMD_WARNING_CONFIG_FAILED;
d62a17ae 1342 }
c3ea3906 1343
d62a17ae 1344 ret = validate_metric_style_narrow(vty, area);
1345 if (ret != CMD_SUCCESS)
1346 return ret;
a38a72db 1347
d62a17ae 1348 isis_area_metricstyle_set(area, true, false);
1349 return CMD_SUCCESS;
a38a72db
CF
1350}
1351
1352DEFUN (set_overload_bit,
1353 set_overload_bit_cmd,
1354 "set-overload-bit",
7111c1a0 1355 "Set overload bit to avoid any transit traffic\n")
a38a72db 1356{
d62a17ae 1357 VTY_DECLVAR_CONTEXT(isis_area, area);
a38a72db 1358
d62a17ae 1359 isis_area_overload_bit_set(area, true);
1360 return CMD_SUCCESS;
a38a72db
CF
1361}
1362
1363DEFUN (no_set_overload_bit,
1364 no_set_overload_bit_cmd,
1365 "no set-overload-bit",
1366 "Reset overload bit to accept transit traffic\n"
1367 "Reset overload bit\n")
1368{
d62a17ae 1369 VTY_DECLVAR_CONTEXT(isis_area, area);
a38a72db 1370
d62a17ae 1371 isis_area_overload_bit_set(area, false);
1372 return CMD_SUCCESS;
a38a72db
CF
1373}
1374
1375DEFUN (set_attached_bit,
1376 set_attached_bit_cmd,
1377 "set-attached-bit",
7111c1a0 1378 "Set attached bit to identify as L1/L2 router for inter-area traffic\n")
a38a72db 1379{
d62a17ae 1380 VTY_DECLVAR_CONTEXT(isis_area, area);
a38a72db 1381
d62a17ae 1382 isis_area_attached_bit_set(area, true);
1383 return CMD_SUCCESS;
a38a72db
CF
1384}
1385
1386DEFUN (no_set_attached_bit,
1387 no_set_attached_bit_cmd,
1388 "no set-attached-bit",
16cedbb0 1389 NO_STR
a38a72db
CF
1390 "Reset attached bit\n")
1391{
d62a17ae 1392 VTY_DECLVAR_CONTEXT(isis_area, area);
a38a72db 1393
d62a17ae 1394 isis_area_attached_bit_set(area, false);
1395 return CMD_SUCCESS;
a38a72db
CF
1396}
1397
1398DEFUN (dynamic_hostname,
1399 dynamic_hostname_cmd,
1400 "hostname dynamic",
1401 "Dynamic hostname for IS-IS\n"
1402 "Dynamic hostname\n")
1403{
d62a17ae 1404 VTY_DECLVAR_CONTEXT(isis_area, area);
a38a72db 1405
d62a17ae 1406 isis_area_dynhostname_set(area, true);
1407 return CMD_SUCCESS;
a38a72db
CF
1408}
1409
1410DEFUN (no_dynamic_hostname,
1411 no_dynamic_hostname_cmd,
1412 "no hostname dynamic",
1413 NO_STR
1414 "Dynamic hostname for IS-IS\n"
1415 "Dynamic hostname\n")
1416{
d62a17ae 1417 VTY_DECLVAR_CONTEXT(isis_area, area);
a38a72db 1418
d62a17ae 1419 isis_area_dynhostname_set(area, false);
1420 return CMD_SUCCESS;
a38a72db
CF
1421}
1422
6754fc66
CF
1423static int area_lsp_mtu_set(struct vty *vty, unsigned int lsp_mtu)
1424{
d62a17ae 1425 VTY_DECLVAR_CONTEXT(isis_area, area);
1426 struct listnode *node;
1427 struct isis_circuit *circuit;
6754fc66 1428
d62a17ae 1429 for (ALL_LIST_ELEMENTS_RO(area->circuit_list, node, circuit)) {
1430 if (circuit->state != C_STATE_INIT
1431 && circuit->state != C_STATE_UP)
1432 continue;
1433 if (lsp_mtu > isis_circuit_pdu_size(circuit)) {
1434 vty_out(vty,
1435 "ISIS area contains circuit %s, which has a maximum PDU size of %zu.\n",
1436 circuit->interface->name,
1437 isis_circuit_pdu_size(circuit));
a5fdb4c5 1438 return CMD_WARNING_CONFIG_FAILED;
d62a17ae 1439 }
1440 }
6754fc66 1441
d62a17ae 1442 isis_area_lsp_mtu_set(area, lsp_mtu);
1443 return CMD_SUCCESS;
6754fc66
CF
1444}
1445
1446DEFUN (area_lsp_mtu,
1447 area_lsp_mtu_cmd,
6147e2c6 1448 "lsp-mtu (128-4352)",
6754fc66
CF
1449 "Configure the maximum size of generated LSPs\n"
1450 "Maximum size of generated LSPs\n")
1451{
d62a17ae 1452 int idx_number = 1;
1453 unsigned int lsp_mtu;
6754fc66 1454
d62a17ae 1455 lsp_mtu = strtoul(argv[idx_number]->arg, NULL, 10);
6754fc66 1456
d62a17ae 1457 return area_lsp_mtu_set(vty, lsp_mtu);
6754fc66
CF
1458}
1459
b44c509a 1460
49d41a26
DS
1461DEFUN (no_area_lsp_mtu,
1462 no_area_lsp_mtu_cmd,
b44c509a 1463 "no lsp-mtu [(128-4352)]",
49d41a26 1464 NO_STR
b44c509a
DW
1465 "Configure the maximum size of generated LSPs\n"
1466 "Maximum size of generated LSPs\n")
6754fc66 1467{
d62a17ae 1468 return area_lsp_mtu_set(vty, DEFAULT_LSP_MTU);
6754fc66
CF
1469}
1470
6754fc66
CF
1471
1472DEFUN (is_type,
1473 is_type_cmd,
6147e2c6 1474 "is-type <level-1|level-1-2|level-2-only>",
6754fc66
CF
1475 "IS Level for this routing process (OSI only)\n"
1476 "Act as a station router only\n"
1477 "Act as both a station router and an area router\n"
1478 "Act as an area router only\n")
1479{
d62a17ae 1480 int idx_level = 1;
1481 VTY_DECLVAR_CONTEXT(isis_area, area);
1482 int type;
6754fc66 1483
d62a17ae 1484 type = string2circuit_t(argv[idx_level]->arg);
1485 if (!type) {
1486 vty_out(vty, "Unknown IS level \n");
1487 return CMD_SUCCESS;
1488 }
6754fc66 1489
d62a17ae 1490 isis_area_is_type_set(area, type);
6754fc66 1491
d62a17ae 1492 return CMD_SUCCESS;
6754fc66
CF
1493}
1494
1495DEFUN (no_is_type,
1496 no_is_type_cmd,
6147e2c6 1497 "no is-type <level-1|level-1-2|level-2-only>",
6754fc66
CF
1498 NO_STR
1499 "IS Level for this routing process (OSI only)\n"
1500 "Act as a station router only\n"
1501 "Act as both a station router and an area router\n"
1502 "Act as an area router only\n")
1503{
d62a17ae 1504 VTY_DECLVAR_CONTEXT(isis_area, area);
1505 int type;
6754fc66 1506
d62a17ae 1507 /*
1508 * Put the is-type back to defaults:
1509 * - level-1-2 on first area
1510 * - level-1 for the rest
1511 */
1512 if (listgetdata(listhead(isis->area_list)) == area)
1513 type = IS_LEVEL_1_AND_2;
1514 else
1515 type = IS_LEVEL_1;
6754fc66 1516
d62a17ae 1517 isis_area_is_type_set(area, type);
6754fc66 1518
d62a17ae 1519 return CMD_SUCCESS;
6754fc66
CF
1520}
1521
d62a17ae 1522static int set_lsp_gen_interval(struct vty *vty, struct isis_area *area,
1523 uint16_t interval, int level)
466ed406 1524{
d62a17ae 1525 int lvl;
466ed406 1526
d62a17ae 1527 for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; ++lvl) {
1528 if (!(lvl & level))
1529 continue;
466ed406 1530
d62a17ae 1531 if (interval >= area->lsp_refresh[lvl - 1]) {
1532 vty_out(vty,
1533 "LSP gen interval %us must be less than "
1534 "the LSP refresh interval %us\n",
1535 interval, area->lsp_refresh[lvl - 1]);
a5fdb4c5 1536 return CMD_WARNING_CONFIG_FAILED;
d62a17ae 1537 }
1538 }
466ed406 1539
d62a17ae 1540 for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; ++lvl) {
1541 if (!(lvl & level))
1542 continue;
1543 area->lsp_gen_interval[lvl - 1] = interval;
1544 }
466ed406 1545
d62a17ae 1546 return CMD_SUCCESS;
466ed406
CF
1547}
1548
1549DEFUN (lsp_gen_interval,
1550 lsp_gen_interval_cmd,
3a2d747c 1551 "lsp-gen-interval [<level-1|level-2>] (1-120)",
466ed406 1552 "Minimum interval between regenerating same LSP\n"
3a2d747c
QY
1553 "Set interval for level 1 only\n"
1554 "Set interval for level 2 only\n"
466ed406
CF
1555 "Minimum interval in seconds\n")
1556{
d62a17ae 1557 int idx = 0;
1558 VTY_DECLVAR_CONTEXT(isis_area, area);
1559 uint16_t interval;
1560 int level;
466ed406 1561
d62a17ae 1562 level = 0;
1563 level |= argv_find(argv, argc, "level-1", &idx) ? IS_LEVEL_1 : 0;
1564 level |= argv_find(argv, argc, "level-2", &idx) ? IS_LEVEL_2 : 0;
1565 if (!level)
1566 level = IS_LEVEL_1 | IS_LEVEL_2;
3a2d747c 1567
d62a17ae 1568 argv_find(argv, argc, "(1-120)", &idx);
3a2d747c 1569
d62a17ae 1570 interval = atoi(argv[idx]->arg);
1571 return set_lsp_gen_interval(vty, area, interval, level);
466ed406
CF
1572}
1573
1574DEFUN (no_lsp_gen_interval,
1575 no_lsp_gen_interval_cmd,
3a2d747c 1576 "no lsp-gen-interval [<level-1|level-2>] [(1-120)]",
466ed406 1577 NO_STR
b44c509a 1578 "Minimum interval between regenerating same LSP\n"
466ed406 1579 "Set interval for level 1 only\n"
466ed406
CF
1580 "Set interval for level 2 only\n"
1581 "Minimum interval in seconds\n")
1582{
d62a17ae 1583 int idx = 0;
1584 VTY_DECLVAR_CONTEXT(isis_area, area);
1585 uint16_t interval;
1586 int level;
466ed406 1587
d62a17ae 1588 level = 0;
1589 level |= argv_find(argv, argc, "level-1", &idx) ? IS_LEVEL_1 : 0;
1590 level |= argv_find(argv, argc, "level-2", &idx) ? IS_LEVEL_2 : 0;
1591 if (!level)
1592 level = IS_LEVEL_1 | IS_LEVEL_2;
466ed406 1593
d62a17ae 1594 interval = DEFAULT_MIN_LSP_GEN_INTERVAL;
1595 return set_lsp_gen_interval(vty, area, interval, level);
466ed406
CF
1596}
1597
466ed406
CF
1598DEFUN (spf_interval,
1599 spf_interval_cmd,
6147e2c6 1600 "spf-interval (1-120)",
466ed406
CF
1601 "Minimum interval between SPF calculations\n"
1602 "Minimum interval between consecutive SPFs in seconds\n")
1603{
d62a17ae 1604 int idx_number = 1;
1605 VTY_DECLVAR_CONTEXT(isis_area, area);
1606 u_int16_t interval;
466ed406 1607
d62a17ae 1608 interval = atoi(argv[idx_number]->arg);
1609 area->min_spf_interval[0] = interval;
1610 area->min_spf_interval[1] = interval;
466ed406 1611
d62a17ae 1612 return CMD_SUCCESS;
466ed406
CF
1613}
1614
b44c509a 1615
466ed406
CF
1616DEFUN (no_spf_interval,
1617 no_spf_interval_cmd,
b44c509a 1618 "no spf-interval [[<level-1|level-2>] (1-120)]",
466ed406 1619 NO_STR
b44c509a
DW
1620 "Minimum interval between SPF calculations\n"
1621 "Set interval for level 1 only\n"
1622 "Set interval for level 2 only\n"
1623 "Minimum interval between consecutive SPFs in seconds\n")
466ed406 1624{
d62a17ae 1625 VTY_DECLVAR_CONTEXT(isis_area, area);
466ed406 1626
d62a17ae 1627 area->min_spf_interval[0] = MINIMUM_SPF_INTERVAL;
1628 area->min_spf_interval[1] = MINIMUM_SPF_INTERVAL;
466ed406 1629
d62a17ae 1630 return CMD_SUCCESS;
466ed406
CF
1631}
1632
466ed406
CF
1633
1634DEFUN (spf_interval_l1,
1635 spf_interval_l1_cmd,
6147e2c6 1636 "spf-interval level-1 (1-120)",
466ed406
CF
1637 "Minimum interval between SPF calculations\n"
1638 "Set interval for level 1 only\n"
1639 "Minimum interval between consecutive SPFs in seconds\n")
1640{
d62a17ae 1641 int idx_number = 2;
1642 VTY_DECLVAR_CONTEXT(isis_area, area);
1643 u_int16_t interval;
466ed406 1644
d62a17ae 1645 interval = atoi(argv[idx_number]->arg);
1646 area->min_spf_interval[0] = interval;
466ed406 1647
d62a17ae 1648 return CMD_SUCCESS;
466ed406
CF
1649}
1650
1651DEFUN (no_spf_interval_l1,
1652 no_spf_interval_l1_cmd,
1653 "no spf-interval level-1",
1654 NO_STR
1655 "Minimum interval between SPF calculations\n"
1656 "Set interval for level 1 only\n")
1657{
d62a17ae 1658 VTY_DECLVAR_CONTEXT(isis_area, area);
466ed406 1659
d62a17ae 1660 area->min_spf_interval[0] = MINIMUM_SPF_INTERVAL;
466ed406 1661
d62a17ae 1662 return CMD_SUCCESS;
466ed406
CF
1663}
1664
466ed406
CF
1665
1666DEFUN (spf_interval_l2,
1667 spf_interval_l2_cmd,
6147e2c6 1668 "spf-interval level-2 (1-120)",
466ed406
CF
1669 "Minimum interval between SPF calculations\n"
1670 "Set interval for level 2 only\n"
1671 "Minimum interval between consecutive SPFs in seconds\n")
1672{
d62a17ae 1673 int idx_number = 2;
1674 VTY_DECLVAR_CONTEXT(isis_area, area);
1675 u_int16_t interval;
466ed406 1676
d62a17ae 1677 interval = atoi(argv[idx_number]->arg);
1678 area->min_spf_interval[1] = interval;
466ed406 1679
d62a17ae 1680 return CMD_SUCCESS;
466ed406
CF
1681}
1682
1683DEFUN (no_spf_interval_l2,
1684 no_spf_interval_l2_cmd,
1685 "no spf-interval level-2",
1686 NO_STR
1687 "Minimum interval between SPF calculations\n"
1688 "Set interval for level 2 only\n")
1689{
d62a17ae 1690 VTY_DECLVAR_CONTEXT(isis_area, area);
466ed406 1691
d62a17ae 1692 area->min_spf_interval[1] = MINIMUM_SPF_INTERVAL;
466ed406 1693
d62a17ae 1694 return CMD_SUCCESS;
466ed406
CF
1695}
1696
03f7e182
SL
1697DEFUN (no_spf_delay_ietf,
1698 no_spf_delay_ietf_cmd,
1699 "no spf-delay-ietf",
1700 NO_STR
1701 "IETF SPF delay algorithm\n")
1702{
d62a17ae 1703 VTY_DECLVAR_CONTEXT(isis_area, area);
03f7e182 1704
d62a17ae 1705 spf_backoff_free(area->spf_delay_ietf[0]);
1706 spf_backoff_free(area->spf_delay_ietf[1]);
1707 area->spf_delay_ietf[0] = NULL;
1708 area->spf_delay_ietf[1] = NULL;
03f7e182 1709
d62a17ae 1710 return CMD_SUCCESS;
03f7e182
SL
1711}
1712
1713DEFUN (spf_delay_ietf,
1714 spf_delay_ietf_cmd,
1715 "spf-delay-ietf init-delay (0-60000) short-delay (0-60000) long-delay (0-60000) holddown (0-60000) time-to-learn (0-60000)",
1716 "IETF SPF delay algorithm\n"
1717 "Delay used while in QUIET state\n"
1718 "Delay used while in QUIET state in milliseconds\n"
1719 "Delay used while in SHORT_WAIT state\n"
1720 "Delay used while in SHORT_WAIT state in milliseconds\n"
1721 "Delay used while in LONG_WAIT\n"
1722 "Delay used while in LONG_WAIT state in milliseconds\n"
1723 "Time with no received IGP events before considering IGP stable\n"
1724 "Time with no received IGP events before considering IGP stable (in milliseconds)\n"
1725 "Maximum duration needed to learn all the events related to a single failure\n"
1726 "Maximum duration needed to learn all the events related to a single failure (in milliseconds)\n")
1727{
d62a17ae 1728 VTY_DECLVAR_CONTEXT(isis_area, area);
1729
1730 long init_delay = atol(argv[2]->arg);
1731 long short_delay = atol(argv[4]->arg);
1732 long long_delay = atol(argv[6]->arg);
1733 long holddown = atol(argv[8]->arg);
1734 long timetolearn = atol(argv[10]->arg);
1735
1736 size_t bufsiz = strlen(area->area_tag) + sizeof("IS-IS Lx");
1737 char *buf = XCALLOC(MTYPE_TMP, bufsiz);
1738
1739 snprintf(buf, bufsiz, "IS-IS %s L1", area->area_tag);
1740 spf_backoff_free(area->spf_delay_ietf[0]);
1741 area->spf_delay_ietf[0] =
1742 spf_backoff_new(master, buf, init_delay, short_delay,
1743 long_delay, holddown, timetolearn);
1744
1745 snprintf(buf, bufsiz, "IS-IS %s L2", area->area_tag);
1746 spf_backoff_free(area->spf_delay_ietf[1]);
1747 area->spf_delay_ietf[1] =
1748 spf_backoff_new(master, buf, init_delay, short_delay,
1749 long_delay, holddown, timetolearn);
1750
1751 XFREE(MTYPE_TMP, buf);
1752 return CMD_SUCCESS;
1753}
1754
1755static int area_max_lsp_lifetime_set(struct vty *vty, int level,
1756 uint16_t interval)
1757{
1758 VTY_DECLVAR_CONTEXT(isis_area, area);
1759 int lvl;
1760 uint16_t refresh_interval = interval - 300;
1761 int set_refresh_interval[ISIS_LEVELS] = {0, 0};
1762
1763 for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; lvl++) {
1764 if (!(lvl & level))
1765 continue;
1766
1767 if (refresh_interval < area->lsp_refresh[lvl - 1]) {
1768 vty_out(vty,
1769 "Level %d Max LSP lifetime %us must be 300s greater than "
1770 "the configured LSP refresh interval %us\n",
1771 lvl, interval, area->lsp_refresh[lvl - 1]);
1772 vty_out(vty,
1773 "Automatically reducing level %d LSP refresh interval "
1774 "to %us\n",
1775 lvl, refresh_interval);
1776 set_refresh_interval[lvl - 1] = 1;
1777
1778 if (refresh_interval
1779 <= area->lsp_gen_interval[lvl - 1]) {
1780 vty_out(vty,
1781 "LSP refresh interval %us must be greater than "
1782 "the configured LSP gen interval %us\n",
1783 refresh_interval,
1784 area->lsp_gen_interval[lvl - 1]);
a5fdb4c5 1785 return CMD_WARNING_CONFIG_FAILED;
d62a17ae 1786 }
1787 }
1788 }
1789
1790 for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; lvl++) {
1791 if (!(lvl & level))
1792 continue;
1793 isis_area_max_lsp_lifetime_set(area, lvl, interval);
1794 if (set_refresh_interval[lvl - 1])
1795 isis_area_lsp_refresh_set(area, lvl, refresh_interval);
1796 }
1797
1798 return CMD_SUCCESS;
466ed406
CF
1799}
1800
1801DEFUN (max_lsp_lifetime,
1802 max_lsp_lifetime_cmd,
16cedbb0 1803 "max-lsp-lifetime [<level-1|level-2>] (350-65535)",
3a2d747c 1804 "Maximum LSP lifetime\n"
16cedbb0
QY
1805 "Maximum LSP lifetime for Level 1 only\n"
1806 "Maximum LSP lifetime for Level 2 only\n"
466ed406
CF
1807 "LSP lifetime in seconds\n")
1808{
d62a17ae 1809 int idx = 0;
1810 unsigned int level = IS_LEVEL_1_AND_2;
466ed406 1811
d62a17ae 1812 if (argv_find(argv, argc, "level-1", &idx))
1813 level = IS_LEVEL_1;
1814 else if (argv_find(argv, argc, "level-2", &idx))
1815 level = IS_LEVEL_2;
b44c509a 1816
d62a17ae 1817 argv_find(argv, argc, "(350-65535)", &idx);
1818 int lifetime = atoi(argv[idx]->arg);
466ed406 1819
d62a17ae 1820 return area_max_lsp_lifetime_set(vty, level, lifetime);
466ed406
CF
1821}
1822
b44c509a 1823
16cedbb0
QY
1824DEFUN (no_max_lsp_lifetime,
1825 no_max_lsp_lifetime_cmd,
1826 "no max-lsp-lifetime [<level-1|level-2>] [(350-65535)]",
466ed406 1827 NO_STR
3a2d747c 1828 "Maximum LSP lifetime\n"
16cedbb0 1829 "Maximum LSP lifetime for Level 1 only\n"
466ed406 1830 "Maximum LSP lifetime for Level 2 only\n"
16cedbb0 1831 "LSP lifetime in seconds\n")
466ed406 1832{
d62a17ae 1833 int idx = 0;
1834 unsigned int level = IS_LEVEL_1_AND_2;
1835
1836 if (argv_find(argv, argc, "level-1", &idx))
1837 level = IS_LEVEL_1;
1838 else if (argv_find(argv, argc, "level-2", &idx))
1839 level = IS_LEVEL_2;
1840
1841 return area_max_lsp_lifetime_set(vty, level, DEFAULT_LSP_LIFETIME);
1842}
1843
1844static int area_lsp_refresh_interval_set(struct vty *vty, int level,
1845 uint16_t interval)
1846{
1847 VTY_DECLVAR_CONTEXT(isis_area, area);
1848 int lvl;
1849
1850 for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; ++lvl) {
1851 if (!(lvl & level))
1852 continue;
1853 if (interval <= area->lsp_gen_interval[lvl - 1]) {
1854 vty_out(vty,
1855 "LSP refresh interval %us must be greater than "
1856 "the configured LSP gen interval %us\n",
1857 interval, area->lsp_gen_interval[lvl - 1]);
a5fdb4c5 1858 return CMD_WARNING_CONFIG_FAILED;
d62a17ae 1859 }
1860 if (interval > (area->max_lsp_lifetime[lvl - 1] - 300)) {
1861 vty_out(vty,
1862 "LSP refresh interval %us must be less than "
1863 "the configured LSP lifetime %us less 300\n",
1864 interval, area->max_lsp_lifetime[lvl - 1]);
a5fdb4c5 1865 return CMD_WARNING_CONFIG_FAILED;
d62a17ae 1866 }
1867 }
1868
1869 for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; ++lvl) {
1870 if (!(lvl & level))
1871 continue;
1872 isis_area_lsp_refresh_set(area, lvl, interval);
1873 }
1874
1875 return CMD_SUCCESS;
466ed406
CF
1876}
1877
1878DEFUN (lsp_refresh_interval,
1879 lsp_refresh_interval_cmd,
16cedbb0 1880 "lsp-refresh-interval [<level-1|level-2>] (1-65235)",
466ed406 1881 "LSP refresh interval\n"
16cedbb0
QY
1882 "LSP refresh interval for Level 1 only\n"
1883 "LSP refresh interval for Level 2 only\n"
466ed406
CF
1884 "LSP refresh interval in seconds\n")
1885{
d62a17ae 1886 int idx = 0;
1887 unsigned int level = IS_LEVEL_1_AND_2;
1888 unsigned int interval = 0;
466ed406 1889
d62a17ae 1890 if (argv_find(argv, argc, "level-1", &idx))
1891 level = IS_LEVEL_1;
1892 else if (argv_find(argv, argc, "level-2", &idx))
1893 level = IS_LEVEL_2;
16cedbb0 1894
d62a17ae 1895 interval = atoi(argv[argc - 1]->arg);
1896 return area_lsp_refresh_interval_set(vty, level, interval);
16cedbb0 1897}
b44c509a 1898
466ed406
CF
1899DEFUN (no_lsp_refresh_interval,
1900 no_lsp_refresh_interval_cmd,
16cedbb0 1901 "no lsp-refresh-interval [<level-1|level-2>] [(1-65235)]",
466ed406 1902 NO_STR
b44c509a 1903 "LSP refresh interval\n"
b44c509a 1904 "LSP refresh interval for Level 1 only\n"
466ed406 1905 "LSP refresh interval for Level 2 only\n"
16cedbb0 1906 "LSP refresh interval in seconds\n")
466ed406 1907{
d62a17ae 1908 int idx = 0;
1909 unsigned int level = IS_LEVEL_1_AND_2;
466ed406 1910
d62a17ae 1911 if (argv_find(argv, argc, "level-1", &idx))
1912 level = IS_LEVEL_1;
1913 else if (argv_find(argv, argc, "level-2", &idx))
1914 level = IS_LEVEL_2;
b44c509a 1915
d62a17ae 1916 return area_lsp_refresh_interval_set(vty, level,
1917 DEFAULT_MAX_LSP_GEN_INTERVAL);
466ed406
CF
1918}
1919
d62a17ae 1920static int area_passwd_set(struct vty *vty, int level,
1921 int (*type_set)(struct isis_area *area, int level,
1922 const char *passwd, u_char snp_auth),
1923 const char *passwd, u_char snp_auth)
9093b230 1924{
d62a17ae 1925 VTY_DECLVAR_CONTEXT(isis_area, area);
9093b230 1926
d62a17ae 1927 if (passwd && strlen(passwd) > 254) {
1928 vty_out(vty, "Too long area password (>254)\n");
a5fdb4c5 1929 return CMD_WARNING_CONFIG_FAILED;
d62a17ae 1930 }
9093b230 1931
d62a17ae 1932 type_set(area, level, passwd, snp_auth);
1933 return CMD_SUCCESS;
9093b230
CF
1934}
1935
b44c509a 1936
9093b230
CF
1937DEFUN (area_passwd_md5,
1938 area_passwd_md5_cmd,
d8bd2aff 1939 "area-password md5 WORD [authenticate snp <send-only|validate>]",
9093b230 1940 "Configure the authentication password for an area\n"
9093b230 1941 "Authentication type\n"
b44c509a
DW
1942 "Level-wide password\n"
1943 "Authentication\n"
1944 "SNP PDUs\n"
1945 "Send but do not check PDUs on receiving\n"
1946 "Send and check PDUs on receiving\n")
9093b230 1947{
d62a17ae 1948 int idx_password = 0;
1949 int idx_word = 2;
1950 int idx_type = 5;
1951 u_char snp_auth = 0;
1952 int level = strmatch(argv[idx_password]->text, "domain-password")
1953 ? IS_LEVEL_2
1954 : IS_LEVEL_1;
9093b230 1955
d62a17ae 1956 if (argc > 3) {
1957 snp_auth = SNP_AUTH_SEND;
1958 if (strmatch(argv[idx_type]->text, "validate"))
1959 snp_auth |= SNP_AUTH_RECV;
1960 }
9093b230 1961
d62a17ae 1962 return area_passwd_set(vty, level, isis_area_passwd_hmac_md5_set,
1963 argv[idx_word]->arg, snp_auth);
9093b230
CF
1964}
1965
d8bd2aff
QY
1966DEFUN (domain_passwd_md5,
1967 domain_passwd_md5_cmd,
1968 "domain-password md5 WORD [authenticate snp <send-only|validate>]",
1969 "Set the authentication password for a routing domain\n"
1970 "Authentication type\n"
1971 "Level-wide password\n"
1972 "Authentication\n"
1973 "SNP PDUs\n"
1974 "Send but do not check PDUs on receiving\n"
1975 "Send and check PDUs on receiving\n")
1976{
d62a17ae 1977 return area_passwd_md5(self, vty, argc, argv);
d8bd2aff 1978}
9093b230
CF
1979
1980DEFUN (area_passwd_clear,
1981 area_passwd_clear_cmd,
d8bd2aff 1982 "area-password clear WORD [authenticate snp <send-only|validate>]",
9093b230 1983 "Configure the authentication password for an area\n"
9093b230 1984 "Authentication type\n"
b44c509a
DW
1985 "Area password\n"
1986 "Authentication\n"
1987 "SNP PDUs\n"
1988 "Send but do not check PDUs on receiving\n"
1989 "Send and check PDUs on receiving\n")
9093b230 1990{
d62a17ae 1991 int idx_password = 0;
1992 int idx_word = 2;
1993 int idx_type = 5;
1994 u_char snp_auth = 0;
1995 int level = strmatch(argv[idx_password]->text, "domain-password")
1996 ? IS_LEVEL_2
1997 : IS_LEVEL_1;
9093b230 1998
d62a17ae 1999 if (argc > 3) {
2000 snp_auth = SNP_AUTH_SEND;
2001 if (strmatch(argv[idx_type]->text, "validate"))
2002 snp_auth |= SNP_AUTH_RECV;
2003 }
9093b230 2004
d62a17ae 2005 return area_passwd_set(vty, level, isis_area_passwd_cleartext_set,
2006 argv[idx_word]->arg, snp_auth);
9093b230
CF
2007}
2008
d8bd2aff
QY
2009DEFUN (domain_passwd_clear,
2010 domain_passwd_clear_cmd,
2011 "domain-password clear WORD [authenticate snp <send-only|validate>]",
2012 "Set the authentication password for a routing domain\n"
2013 "Authentication type\n"
2014 "Area password\n"
2015 "Authentication\n"
2016 "SNP PDUs\n"
2017 "Send but do not check PDUs on receiving\n"
2018 "Send and check PDUs on receiving\n")
2019{
d62a17ae 2020 return area_passwd_clear(self, vty, argc, argv);
d8bd2aff 2021}
9093b230
CF
2022
2023DEFUN (no_area_passwd,
2024 no_area_passwd_cmd,
6147e2c6 2025 "no <area-password|domain-password>",
9093b230
CF
2026 NO_STR
2027 "Configure the authentication password for an area\n"
2028 "Set the authentication password for a routing domain\n")
2029{
d62a17ae 2030 int idx_password = 1;
2031 int level = strmatch(argv[idx_password]->text, "domain-password")
2032 ? IS_LEVEL_2
2033 : IS_LEVEL_1;
2034 VTY_DECLVAR_CONTEXT(isis_area, area);
9093b230 2035
d62a17ae 2036 return isis_area_passwd_unset(area, level);
9093b230
CF
2037}
2038
d62a17ae 2039void isis_vty_init(void)
65f9a9a8 2040{
d62a17ae 2041 install_element(INTERFACE_NODE, &ip_router_isis_cmd);
2042 install_element(INTERFACE_NODE, &ip6_router_isis_cmd);
2043 install_element(INTERFACE_NODE, &no_ip_router_isis_cmd);
65f9a9a8 2044
d62a17ae 2045 install_element(INTERFACE_NODE, &isis_passive_cmd);
2046 install_element(INTERFACE_NODE, &no_isis_passive_cmd);
65f9a9a8 2047
d62a17ae 2048 install_element(INTERFACE_NODE, &isis_circuit_type_cmd);
2049 install_element(INTERFACE_NODE, &no_isis_circuit_type_cmd);
65f9a9a8 2050
d62a17ae 2051 install_element(INTERFACE_NODE, &isis_network_cmd);
2052 install_element(INTERFACE_NODE, &no_isis_network_cmd);
50c7d14a 2053
d62a17ae 2054 install_element(INTERFACE_NODE, &isis_passwd_cmd);
2055 install_element(INTERFACE_NODE, &no_isis_passwd_cmd);
65f9a9a8 2056
d62a17ae 2057 install_element(INTERFACE_NODE, &isis_priority_cmd);
2058 install_element(INTERFACE_NODE, &no_isis_priority_cmd);
2059 install_element(INTERFACE_NODE, &isis_priority_l1_cmd);
2060 install_element(INTERFACE_NODE, &no_isis_priority_l1_cmd);
2061 install_element(INTERFACE_NODE, &isis_priority_l2_cmd);
2062 install_element(INTERFACE_NODE, &no_isis_priority_l2_cmd);
a38a72db 2063
d62a17ae 2064 install_element(INTERFACE_NODE, &isis_metric_cmd);
2065 install_element(INTERFACE_NODE, &no_isis_metric_cmd);
2066 install_element(INTERFACE_NODE, &isis_metric_l1_cmd);
2067 install_element(INTERFACE_NODE, &no_isis_metric_l1_cmd);
2068 install_element(INTERFACE_NODE, &isis_metric_l2_cmd);
2069 install_element(INTERFACE_NODE, &no_isis_metric_l2_cmd);
01bb08b6 2070
d62a17ae 2071 install_element(INTERFACE_NODE, &isis_hello_interval_cmd);
2072 install_element(INTERFACE_NODE, &no_isis_hello_interval_cmd);
2073 install_element(INTERFACE_NODE, &isis_hello_interval_l1_cmd);
2074 install_element(INTERFACE_NODE, &no_isis_hello_interval_l1_cmd);
2075 install_element(INTERFACE_NODE, &isis_hello_interval_l2_cmd);
2076 install_element(INTERFACE_NODE, &no_isis_hello_interval_l2_cmd);
01bb08b6 2077
d62a17ae 2078 install_element(INTERFACE_NODE, &isis_hello_multiplier_cmd);
2079 install_element(INTERFACE_NODE, &no_isis_hello_multiplier_cmd);
2080 install_element(INTERFACE_NODE, &isis_hello_multiplier_l1_cmd);
2081 install_element(INTERFACE_NODE, &no_isis_hello_multiplier_l1_cmd);
2082 install_element(INTERFACE_NODE, &isis_hello_multiplier_l2_cmd);
2083 install_element(INTERFACE_NODE, &no_isis_hello_multiplier_l2_cmd);
01bb08b6 2084
d62a17ae 2085 install_element(INTERFACE_NODE, &isis_hello_padding_cmd);
2086 install_element(INTERFACE_NODE, &no_isis_hello_padding_cmd);
01bb08b6 2087
d62a17ae 2088 install_element(INTERFACE_NODE, &csnp_interval_cmd);
2089 install_element(INTERFACE_NODE, &no_csnp_interval_cmd);
2090 install_element(INTERFACE_NODE, &csnp_interval_l1_cmd);
2091 install_element(INTERFACE_NODE, &no_csnp_interval_l1_cmd);
2092 install_element(INTERFACE_NODE, &csnp_interval_l2_cmd);
2093 install_element(INTERFACE_NODE, &no_csnp_interval_l2_cmd);
01bb08b6 2094
d62a17ae 2095 install_element(INTERFACE_NODE, &psnp_interval_cmd);
2096 install_element(INTERFACE_NODE, &no_psnp_interval_cmd);
2097 install_element(INTERFACE_NODE, &psnp_interval_l1_cmd);
2098 install_element(INTERFACE_NODE, &no_psnp_interval_l1_cmd);
2099 install_element(INTERFACE_NODE, &psnp_interval_l2_cmd);
2100 install_element(INTERFACE_NODE, &no_psnp_interval_l2_cmd);
064f4896 2101
d62a17ae 2102 install_element(INTERFACE_NODE, &circuit_topology_cmd);
2103 install_element(INTERFACE_NODE, &no_circuit_topology_cmd);
a38a72db 2104
d62a17ae 2105 install_element(ISIS_NODE, &metric_style_cmd);
2106 install_element(ISIS_NODE, &no_metric_style_cmd);
a38a72db 2107
d62a17ae 2108 install_element(ISIS_NODE, &set_overload_bit_cmd);
2109 install_element(ISIS_NODE, &no_set_overload_bit_cmd);
a38a72db 2110
d62a17ae 2111 install_element(ISIS_NODE, &set_attached_bit_cmd);
2112 install_element(ISIS_NODE, &no_set_attached_bit_cmd);
6754fc66 2113
d62a17ae 2114 install_element(ISIS_NODE, &dynamic_hostname_cmd);
2115 install_element(ISIS_NODE, &no_dynamic_hostname_cmd);
6754fc66 2116
d62a17ae 2117 install_element(ISIS_NODE, &area_lsp_mtu_cmd);
2118 install_element(ISIS_NODE, &no_area_lsp_mtu_cmd);
466ed406 2119
d62a17ae 2120 install_element(ISIS_NODE, &is_type_cmd);
2121 install_element(ISIS_NODE, &no_is_type_cmd);
466ed406 2122
d62a17ae 2123 install_element(ISIS_NODE, &lsp_gen_interval_cmd);
2124 install_element(ISIS_NODE, &no_lsp_gen_interval_cmd);
466ed406 2125
d62a17ae 2126 install_element(ISIS_NODE, &spf_interval_cmd);
2127 install_element(ISIS_NODE, &no_spf_interval_cmd);
2128 install_element(ISIS_NODE, &spf_interval_l1_cmd);
2129 install_element(ISIS_NODE, &no_spf_interval_l1_cmd);
2130 install_element(ISIS_NODE, &spf_interval_l2_cmd);
2131 install_element(ISIS_NODE, &no_spf_interval_l2_cmd);
466ed406 2132
d62a17ae 2133 install_element(ISIS_NODE, &max_lsp_lifetime_cmd);
2134 install_element(ISIS_NODE, &no_max_lsp_lifetime_cmd);
03f7e182 2135
d62a17ae 2136 install_element(ISIS_NODE, &lsp_refresh_interval_cmd);
2137 install_element(ISIS_NODE, &no_lsp_refresh_interval_cmd);
2138
2139 install_element(ISIS_NODE, &area_passwd_md5_cmd);
2140 install_element(ISIS_NODE, &area_passwd_clear_cmd);
2141 install_element(ISIS_NODE, &domain_passwd_md5_cmd);
2142 install_element(ISIS_NODE, &domain_passwd_clear_cmd);
2143 install_element(ISIS_NODE, &no_area_passwd_cmd);
2144
2145 install_element(ISIS_NODE, &spf_delay_ietf_cmd);
2146 install_element(ISIS_NODE, &no_spf_delay_ietf_cmd);
65f9a9a8 2147}