blob: 4148eb55b9bc3d352ff396f7c41218ed325c4442 [file] [log] [blame]
David Lamparter3732cba2016-07-29 16:19:40 +02001/*
2 * IS-IS Rout(e)ing protocol - isis_circuit.h
3 *
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.
8 *
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)
12 * any later version.
13 *
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
17 * more details.
18
19 * You should have received a copy of the GNU General Public License along
20 * with this program; if not, write to the Free Software Foundation, Inc.,
21 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22 */
23
24#include <zebra.h>
25#include <command.h>
26
27#include "isis_circuit.h"
28#include "isis_csm.h"
29#include "isis_misc.h"
30#include "isisd.h"
31
32static struct isis_circuit *
33isis_circuit_lookup (struct vty *vty)
34{
35 struct interface *ifp;
36 struct isis_circuit *circuit;
37
38 ifp = (struct interface *) vty->index;
39 if (!ifp)
40 {
41 vty_out (vty, "Invalid interface %s", VTY_NEWLINE);
42 return NULL;
43 }
44
45 circuit = circuit_scan_by_ifp (ifp);
46 if (!circuit)
47 {
48 vty_out (vty, "ISIS is not enabled on circuit %s%s",
49 ifp->name, VTY_NEWLINE);
50 return NULL;
51 }
52
53 return circuit;
54}
55
56DEFUN (ip_router_isis,
57 ip_router_isis_cmd,
58 "(ip|ipv6) router isis WORD",
59 "Interface Internet Protocol config commands\n"
60 "IP router interface commands\n"
61 "IS-IS Routing for IP\n"
62 "Routing process tag\n")
63{
64 struct interface *ifp;
65 struct isis_circuit *circuit;
66 struct isis_area *area;
67 const char *af = argv[0];
68 const char *area_tag = argv[1];
69
70 ifp = (struct interface *) vty->index;
71 assert (ifp);
72
73 /* Prevent more than one area per circuit */
74 circuit = circuit_scan_by_ifp (ifp);
David Lamparter515812d2016-08-11 16:59:08 +020075 if (circuit && circuit->area)
David Lamparter3732cba2016-07-29 16:19:40 +020076 {
David Lamparter515812d2016-08-11 16:59:08 +020077 if (strcmp (circuit->area->area_tag, area_tag))
David Lamparter3732cba2016-07-29 16:19:40 +020078 {
David Lamparter515812d2016-08-11 16:59:08 +020079 vty_out (vty, "ISIS circuit is already defined on %s%s",
80 circuit->area->area_tag, VTY_NEWLINE);
81 return CMD_ERR_NOTHING_TODO;
David Lamparter3732cba2016-07-29 16:19:40 +020082 }
83 }
84
85 area = isis_area_lookup (area_tag);
86 if (!area)
87 area = isis_area_create (area_tag);
88
Christian Frankeaf177b22016-08-15 13:36:59 +020089 if (!circuit || !circuit->area) {
David Lamparter3732cba2016-07-29 16:19:40 +020090 circuit = isis_circuit_create (area, ifp);
91
Christian Frankeaf177b22016-08-15 13:36:59 +020092 if (circuit->state != C_STATE_CONF && circuit->state != C_STATE_UP)
93 {
94 vty_out(vty, "Couldn't bring up interface, please check log.%s", VTY_NEWLINE);
95 return CMD_WARNING;
96 }
97 }
98
David Lamparter3732cba2016-07-29 16:19:40 +020099 bool ip = circuit->ip_router, ipv6 = circuit->ipv6_router;
100 if (af[2] != '\0')
101 ipv6 = true;
102 else
103 ip = true;
104
105 isis_circuit_af_set (circuit, ip, ipv6);
106 return CMD_SUCCESS;
107}
108
109DEFUN (no_ip_router_isis,
110 no_ip_router_isis_cmd,
111 "no (ip|ipv6) router isis WORD",
112 NO_STR
113 "Interface Internet Protocol config commands\n"
114 "IP router interface commands\n"
115 "IS-IS Routing for IP\n"
116 "Routing process tag\n")
117{
118 struct interface *ifp;
119 struct isis_area *area;
120 struct isis_circuit *circuit;
121 const char *af = argv[0];
122 const char *area_tag = argv[1];
123
124 ifp = (struct interface *) vty->index;
125 if (!ifp)
126 {
127 vty_out (vty, "Invalid interface %s", VTY_NEWLINE);
128 return CMD_ERR_NO_MATCH;
129 }
130
131 area = isis_area_lookup (area_tag);
132 if (!area)
133 {
134 vty_out (vty, "Can't find ISIS instance %s%s",
135 argv[0], VTY_NEWLINE);
136 return CMD_ERR_NO_MATCH;
137 }
138
139 circuit = circuit_lookup_by_ifp (ifp, area->circuit_list);
140 if (!circuit)
141 {
142 vty_out (vty, "ISIS is not enabled on circuit %s%s",
143 ifp->name, VTY_NEWLINE);
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;
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{
163 struct isis_circuit *circuit = isis_circuit_lookup (vty);
164 if (!circuit)
165 return CMD_ERR_NO_MATCH;
166
167 isis_circuit_passive_set (circuit, 1);
168 return CMD_SUCCESS;
169}
170
171DEFUN (no_isis_passive,
172 no_isis_passive_cmd,
173 "no isis passive",
174 NO_STR
175 "IS-IS commands\n"
176 "Configure the passive mode for interface\n")
177{
178 struct isis_circuit *circuit = isis_circuit_lookup (vty);
179 if (!circuit)
180 return CMD_ERR_NO_MATCH;
181
182 if (if_is_loopback (circuit->interface))
183 {
184 vty_out (vty, "Can't set no passive for loopback interface%s",
185 VTY_NEWLINE);
186 return CMD_ERR_AMBIGUOUS;
187 }
188
189 isis_circuit_passive_set (circuit, 0);
190 return CMD_SUCCESS;
191}
192
193DEFUN (isis_circuit_type,
194 isis_circuit_type_cmd,
195 "isis circuit-type (level-1|level-1-2|level-2-only)",
196 "IS-IS commands\n"
197 "Configure circuit type for interface\n"
198 "Level-1 only adjacencies are formed\n"
199 "Level-1-2 adjacencies are formed\n"
200 "Level-2 only adjacencies are formed\n")
201{
202 int is_type;
203 struct isis_circuit *circuit = isis_circuit_lookup (vty);
204 if (!circuit)
205 return CMD_ERR_NO_MATCH;
206
207 is_type = string2circuit_t (argv[0]);
208 if (!is_type)
209 {
210 vty_out (vty, "Unknown circuit-type %s", VTY_NEWLINE);
211 return CMD_ERR_AMBIGUOUS;
212 }
213
214 if (circuit->state == C_STATE_UP &&
215 circuit->area->is_type != IS_LEVEL_1_AND_2 &&
216 circuit->area->is_type != is_type)
217 {
218 vty_out (vty, "Invalid circuit level for area %s.%s",
219 circuit->area->area_tag, VTY_NEWLINE);
220 return CMD_ERR_AMBIGUOUS;
221 }
222 isis_circuit_is_type_set (circuit, is_type);
223
224 return CMD_SUCCESS;
225}
226
227DEFUN (no_isis_circuit_type,
228 no_isis_circuit_type_cmd,
229 "no isis circuit-type (level-1|level-1-2|level-2-only)",
230 NO_STR
231 "IS-IS commands\n"
232 "Configure circuit type for interface\n"
233 "Level-1 only adjacencies are formed\n"
234 "Level-1-2 adjacencies are formed\n"
235 "Level-2 only adjacencies are formed\n")
236{
237 int is_type;
238 struct isis_circuit *circuit = isis_circuit_lookup (vty);
239 if (!circuit)
240 return CMD_ERR_NO_MATCH;
241
242 /*
243 * Set the circuits level to its default value
244 */
245 if (circuit->state == C_STATE_UP)
246 is_type = circuit->area->is_type;
247 else
248 is_type = IS_LEVEL_1_AND_2;
249 isis_circuit_is_type_set (circuit, is_type);
250
251 return CMD_SUCCESS;
252}
253
254DEFUN (isis_network,
255 isis_network_cmd,
256 "isis network point-to-point",
257 "IS-IS commands\n"
258 "Set network type\n"
259 "point-to-point network type\n")
260{
261 struct isis_circuit *circuit = isis_circuit_lookup (vty);
262 if (!circuit)
263 return CMD_ERR_NO_MATCH;
264
Christian Frankea798abb2016-08-11 16:08:05 +0200265 if (isis_circuit_circ_type_set(circuit, CIRCUIT_T_P2P))
David Lamparter3732cba2016-07-29 16:19:40 +0200266 {
267 vty_out (vty, "isis network point-to-point "
268 "is valid only on broadcast interfaces%s",
269 VTY_NEWLINE);
270 return CMD_ERR_AMBIGUOUS;
271 }
272
273 return CMD_SUCCESS;
274}
275
276DEFUN (no_isis_network,
277 no_isis_network_cmd,
278 "no isis network point-to-point",
279 NO_STR
280 "IS-IS commands\n"
281 "Set network type for circuit\n"
282 "point-to-point network type\n")
283{
284 struct isis_circuit *circuit = isis_circuit_lookup (vty);
285 if (!circuit)
286 return CMD_ERR_NO_MATCH;
287
Christian Frankea798abb2016-08-11 16:08:05 +0200288 if (isis_circuit_circ_type_set(circuit, CIRCUIT_T_BROADCAST))
David Lamparter3732cba2016-07-29 16:19:40 +0200289 {
290 vty_out (vty, "isis network point-to-point "
291 "is valid only on broadcast interfaces%s",
292 VTY_NEWLINE);
293 return CMD_ERR_AMBIGUOUS;
294 }
295
296 return CMD_SUCCESS;
297}
298
Christian Frankef5fbfb22016-07-28 17:23:27 +0200299DEFUN (isis_passwd,
300 isis_passwd_cmd,
301 "isis password (md5|clear) WORD",
302 "IS-IS commands\n"
303 "Configure the authentication password for a circuit\n"
304 "HMAC-MD5 authentication\n"
305 "Cleartext password\n"
306 "Circuit password\n")
307{
308 struct isis_circuit *circuit = isis_circuit_lookup (vty);
309 int rv;
310 if (!circuit)
311 return CMD_ERR_NO_MATCH;
312
313 if (argv[0][0] == 'm')
314 rv = isis_circuit_passwd_hmac_md5_set(circuit, argv[1]);
315 else
316 rv = isis_circuit_passwd_cleartext_set(circuit, argv[1]);
317 if (rv)
318 {
319 vty_out (vty, "Too long circuit password (>254)%s", VTY_NEWLINE);
320 return CMD_ERR_AMBIGUOUS;
321 }
322
323 return CMD_SUCCESS;
324}
325
326DEFUN (no_isis_passwd,
327 no_isis_passwd_cmd,
328 "no isis password",
329 NO_STR
330 "IS-IS commands\n"
331 "Configure the authentication password for a circuit\n")
332{
333 struct isis_circuit *circuit = isis_circuit_lookup (vty);
334 if (!circuit)
335 return CMD_ERR_NO_MATCH;
336
337 isis_circuit_passwd_unset(circuit);
338
339 return CMD_SUCCESS;
340}
341
342ALIAS (no_isis_passwd,
343 no_isis_passwd_arg_cmd,
344 "no isis password (md5|clear) WORD",
345 NO_STR
346 "IS-IS commands\n"
347 "Configure the authentication password for a circuit\n"
348 "HMAC-MD5 authentication\n"
349 "Cleartext password\n"
350 "Circuit password\n")
351
David Lamparter3732cba2016-07-29 16:19:40 +0200352DEFUN (isis_priority,
353 isis_priority_cmd,
354 "isis priority <0-127>",
355 "IS-IS commands\n"
356 "Set priority for Designated Router election\n"
357 "Priority value\n")
358{
359 int prio;
360 struct isis_circuit *circuit = isis_circuit_lookup (vty);
361 if (!circuit)
362 return CMD_ERR_NO_MATCH;
363
364 prio = atoi (argv[0]);
365 if (prio < MIN_PRIORITY || prio > MAX_PRIORITY)
366 {
367 vty_out (vty, "Invalid priority %d - should be <0-127>%s",
368 prio, VTY_NEWLINE);
369 return CMD_ERR_AMBIGUOUS;
370 }
371
372 circuit->priority[0] = prio;
373 circuit->priority[1] = prio;
374
375 return CMD_SUCCESS;
376}
377
378DEFUN (no_isis_priority,
379 no_isis_priority_cmd,
380 "no isis priority",
381 NO_STR
382 "IS-IS commands\n"
383 "Set priority for Designated Router election\n")
384{
385 struct isis_circuit *circuit = isis_circuit_lookup (vty);
386 if (!circuit)
387 return CMD_ERR_NO_MATCH;
388
389 circuit->priority[0] = DEFAULT_PRIORITY;
390 circuit->priority[1] = DEFAULT_PRIORITY;
391
392 return CMD_SUCCESS;
393}
394
395ALIAS (no_isis_priority,
396 no_isis_priority_arg_cmd,
397 "no isis priority <0-127>",
398 NO_STR
399 "IS-IS commands\n"
400 "Set priority for Designated Router election\n"
401 "Priority value\n")
402
403DEFUN (isis_priority_l1,
404 isis_priority_l1_cmd,
405 "isis priority <0-127> level-1",
406 "IS-IS commands\n"
407 "Set priority for Designated Router election\n"
408 "Priority value\n"
409 "Specify priority for level-1 routing\n")
410{
411 int prio;
412 struct isis_circuit *circuit = isis_circuit_lookup (vty);
413 if (!circuit)
414 return CMD_ERR_NO_MATCH;
415
416 prio = atoi (argv[0]);
417 if (prio < MIN_PRIORITY || prio > MAX_PRIORITY)
418 {
419 vty_out (vty, "Invalid priority %d - should be <0-127>%s",
420 prio, VTY_NEWLINE);
421 return CMD_ERR_AMBIGUOUS;
422 }
423
424 circuit->priority[0] = prio;
425
426 return CMD_SUCCESS;
427}
428
429DEFUN (no_isis_priority_l1,
430 no_isis_priority_l1_cmd,
431 "no isis priority level-1",
432 NO_STR
433 "IS-IS commands\n"
434 "Set priority for Designated Router election\n"
435 "Specify priority for level-1 routing\n")
436{
437 struct isis_circuit *circuit = isis_circuit_lookup (vty);
438 if (!circuit)
439 return CMD_ERR_NO_MATCH;
440
441 circuit->priority[0] = DEFAULT_PRIORITY;
442
443 return CMD_SUCCESS;
444}
445
446ALIAS (no_isis_priority_l1,
447 no_isis_priority_l1_arg_cmd,
448 "no isis priority <0-127> level-1",
449 NO_STR
450 "IS-IS commands\n"
451 "Set priority for Designated Router election\n"
452 "Priority value\n"
453 "Specify priority for level-1 routing\n")
454
455DEFUN (isis_priority_l2,
456 isis_priority_l2_cmd,
457 "isis priority <0-127> level-2",
458 "IS-IS commands\n"
459 "Set priority for Designated Router election\n"
460 "Priority value\n"
461 "Specify priority for level-2 routing\n")
462{
463 int prio;
464 struct isis_circuit *circuit = isis_circuit_lookup (vty);
465 if (!circuit)
466 return CMD_ERR_NO_MATCH;
467
468 prio = atoi (argv[0]);
469 if (prio < MIN_PRIORITY || prio > MAX_PRIORITY)
470 {
471 vty_out (vty, "Invalid priority %d - should be <0-127>%s",
472 prio, VTY_NEWLINE);
473 return CMD_ERR_AMBIGUOUS;
474 }
475
476 circuit->priority[1] = prio;
477
478 return CMD_SUCCESS;
479}
480
481DEFUN (no_isis_priority_l2,
482 no_isis_priority_l2_cmd,
483 "no isis priority level-2",
484 NO_STR
485 "IS-IS commands\n"
486 "Set priority for Designated Router election\n"
487 "Specify priority for level-2 routing\n")
488{
489 struct isis_circuit *circuit = isis_circuit_lookup (vty);
490 if (!circuit)
491 return CMD_ERR_NO_MATCH;
492
493 circuit->priority[1] = DEFAULT_PRIORITY;
494
495 return CMD_SUCCESS;
496}
497
498ALIAS (no_isis_priority_l2,
499 no_isis_priority_l2_arg_cmd,
500 "no isis priority <0-127> level-2",
501 NO_STR
502 "IS-IS commands\n"
503 "Set priority for Designated Router election\n"
504 "Priority value\n"
505 "Specify priority for level-2 routing\n")
506
507/* Metric command */
508DEFUN (isis_metric,
509 isis_metric_cmd,
510 "isis metric <0-16777215>",
511 "IS-IS commands\n"
512 "Set default metric for circuit\n"
513 "Default metric value\n")
514{
515 int met;
516 struct isis_circuit *circuit = isis_circuit_lookup (vty);
517 if (!circuit)
518 return CMD_ERR_NO_MATCH;
519
520 met = atoi (argv[0]);
521
522 /* RFC3787 section 5.1 */
523 if (circuit->area && circuit->area->oldmetric == 1 &&
524 met > MAX_NARROW_LINK_METRIC)
525 {
526 vty_out (vty, "Invalid metric %d - should be <0-63> "
527 "when narrow metric type enabled%s",
528 met, VTY_NEWLINE);
529 return CMD_ERR_AMBIGUOUS;
530 }
531
532 /* RFC4444 */
533 if (circuit->area && circuit->area->newmetric == 1 &&
534 met > MAX_WIDE_LINK_METRIC)
535 {
536 vty_out (vty, "Invalid metric %d - should be <0-16777215> "
537 "when wide metric type enabled%s",
538 met, VTY_NEWLINE);
539 return CMD_ERR_AMBIGUOUS;
540 }
541
542 isis_circuit_metric_set (circuit, IS_LEVEL_1, met);
543 isis_circuit_metric_set (circuit, IS_LEVEL_2, met);
544 return CMD_SUCCESS;
545}
546
547DEFUN (no_isis_metric,
548 no_isis_metric_cmd,
549 "no isis metric",
550 NO_STR
551 "IS-IS commands\n"
552 "Set default metric for circuit\n")
553{
554 struct isis_circuit *circuit = isis_circuit_lookup (vty);
555 if (!circuit)
556 return CMD_ERR_NO_MATCH;
557
558 isis_circuit_metric_set (circuit, IS_LEVEL_1, DEFAULT_CIRCUIT_METRIC);
559 isis_circuit_metric_set (circuit, IS_LEVEL_2, DEFAULT_CIRCUIT_METRIC);
560 return CMD_SUCCESS;
561}
562
563ALIAS (no_isis_metric,
564 no_isis_metric_arg_cmd,
565 "no isis metric <0-16777215>",
566 NO_STR
567 "IS-IS commands\n"
568 "Set default metric for circuit\n"
569 "Default metric value\n")
570
571DEFUN (isis_metric_l1,
572 isis_metric_l1_cmd,
573 "isis metric <0-16777215> level-1",
574 "IS-IS commands\n"
575 "Set default metric for circuit\n"
576 "Default metric value\n"
577 "Specify metric for level-1 routing\n")
578{
579 int met;
580 struct isis_circuit *circuit = isis_circuit_lookup (vty);
581 if (!circuit)
582 return CMD_ERR_NO_MATCH;
583
584 met = atoi (argv[0]);
585
586 /* RFC3787 section 5.1 */
587 if (circuit->area && circuit->area->oldmetric == 1 &&
588 met > MAX_NARROW_LINK_METRIC)
589 {
590 vty_out (vty, "Invalid metric %d - should be <0-63> "
591 "when narrow metric type enabled%s",
592 met, VTY_NEWLINE);
593 return CMD_ERR_AMBIGUOUS;
594 }
595
596 /* RFC4444 */
597 if (circuit->area && circuit->area->newmetric == 1 &&
598 met > MAX_WIDE_LINK_METRIC)
599 {
600 vty_out (vty, "Invalid metric %d - should be <0-16777215> "
601 "when wide metric type enabled%s",
602 met, VTY_NEWLINE);
603 return CMD_ERR_AMBIGUOUS;
604 }
605
606 isis_circuit_metric_set (circuit, IS_LEVEL_1, met);
607 return CMD_SUCCESS;
608}
609
610DEFUN (no_isis_metric_l1,
611 no_isis_metric_l1_cmd,
612 "no isis metric level-1",
613 NO_STR
614 "IS-IS commands\n"
615 "Set default metric for circuit\n"
616 "Specify metric for level-1 routing\n")
617{
618 struct isis_circuit *circuit = isis_circuit_lookup (vty);
619 if (!circuit)
620 return CMD_ERR_NO_MATCH;
621
622 isis_circuit_metric_set (circuit, IS_LEVEL_1, DEFAULT_CIRCUIT_METRIC);
623 return CMD_SUCCESS;
624}
625
626ALIAS (no_isis_metric_l1,
627 no_isis_metric_l1_arg_cmd,
628 "no isis metric <0-16777215> level-1",
629 NO_STR
630 "IS-IS commands\n"
631 "Set default metric for circuit\n"
632 "Default metric value\n"
633 "Specify metric for level-1 routing\n")
634
635DEFUN (isis_metric_l2,
636 isis_metric_l2_cmd,
637 "isis metric <0-16777215> level-2",
638 "IS-IS commands\n"
639 "Set default metric for circuit\n"
640 "Default metric value\n"
641 "Specify metric for level-2 routing\n")
642{
643 int met;
644 struct isis_circuit *circuit = isis_circuit_lookup (vty);
645 if (!circuit)
646 return CMD_ERR_NO_MATCH;
647
648 met = atoi (argv[0]);
649
650 /* RFC3787 section 5.1 */
651 if (circuit->area && circuit->area->oldmetric == 1 &&
652 met > MAX_NARROW_LINK_METRIC)
653 {
654 vty_out (vty, "Invalid metric %d - should be <0-63> "
655 "when narrow metric type enabled%s",
656 met, VTY_NEWLINE);
657 return CMD_ERR_AMBIGUOUS;
658 }
659
660 /* RFC4444 */
661 if (circuit->area && circuit->area->newmetric == 1 &&
662 met > MAX_WIDE_LINK_METRIC)
663 {
664 vty_out (vty, "Invalid metric %d - should be <0-16777215> "
665 "when wide metric type enabled%s",
666 met, VTY_NEWLINE);
667 return CMD_ERR_AMBIGUOUS;
668 }
669
670 isis_circuit_metric_set (circuit, IS_LEVEL_2, met);
671 return CMD_SUCCESS;
672}
673
674DEFUN (no_isis_metric_l2,
675 no_isis_metric_l2_cmd,
676 "no isis metric level-2",
677 NO_STR
678 "IS-IS commands\n"
679 "Set default metric for circuit\n"
680 "Specify metric for level-2 routing\n")
681{
682 struct isis_circuit *circuit = isis_circuit_lookup (vty);
683 if (!circuit)
684 return CMD_ERR_NO_MATCH;
685
686 isis_circuit_metric_set (circuit, IS_LEVEL_2, DEFAULT_CIRCUIT_METRIC);
687 return CMD_SUCCESS;
688}
689
690ALIAS (no_isis_metric_l2,
691 no_isis_metric_l2_arg_cmd,
692 "no isis metric <0-16777215> level-2",
693 NO_STR
694 "IS-IS commands\n"
695 "Set default metric for circuit\n"
696 "Default metric value\n"
697 "Specify metric for level-2 routing\n")
698/* end of metrics */
699
David Lamparterb5d2f5f2016-07-28 17:23:28 +0200700DEFUN (isis_hello_interval,
701 isis_hello_interval_cmd,
702 "isis hello-interval <1-600>",
703 "IS-IS commands\n"
704 "Set Hello interval\n"
705 "Hello interval value\n"
706 "Holdtime 1 seconds, interval depends on multiplier\n")
707{
708 int interval;
709 struct isis_circuit *circuit = isis_circuit_lookup (vty);
710 if (!circuit)
711 return CMD_ERR_NO_MATCH;
712
713 interval = atoi (argv[0]);
714 if (interval < MIN_HELLO_INTERVAL || interval > MAX_HELLO_INTERVAL)
715 {
716 vty_out (vty, "Invalid hello-interval %d - should be <1-600>%s",
717 interval, VTY_NEWLINE);
718 return CMD_ERR_AMBIGUOUS;
719 }
720
721 circuit->hello_interval[0] = (u_int16_t) interval;
722 circuit->hello_interval[1] = (u_int16_t) interval;
723
724 return CMD_SUCCESS;
725}
726
727DEFUN (no_isis_hello_interval,
728 no_isis_hello_interval_cmd,
729 "no isis hello-interval",
730 NO_STR
731 "IS-IS commands\n"
732 "Set Hello interval\n")
733{
734 struct isis_circuit *circuit = isis_circuit_lookup (vty);
735 if (!circuit)
736 return CMD_ERR_NO_MATCH;
737
738 circuit->hello_interval[0] = DEFAULT_HELLO_INTERVAL;
739 circuit->hello_interval[1] = DEFAULT_HELLO_INTERVAL;
740
741 return CMD_SUCCESS;
742}
743
744ALIAS (no_isis_hello_interval,
745 no_isis_hello_interval_arg_cmd,
746 "no isis hello-interval <1-600>",
747 NO_STR
748 "IS-IS commands\n"
749 "Set Hello interval\n"
750 "Hello interval value\n"
751 "Holdtime 1 second, interval depends on multiplier\n")
752
753DEFUN (isis_hello_interval_l1,
754 isis_hello_interval_l1_cmd,
755 "isis hello-interval <1-600> level-1",
756 "IS-IS commands\n"
757 "Set Hello interval\n"
758 "Hello interval value\n"
759 "Holdtime 1 second, interval depends on multiplier\n"
760 "Specify hello-interval for level-1 IIHs\n")
761{
762 long interval;
763 struct isis_circuit *circuit = isis_circuit_lookup (vty);
764 if (!circuit)
765 return CMD_ERR_NO_MATCH;
766
767 interval = atoi (argv[0]);
768 if (interval < MIN_HELLO_INTERVAL || interval > MAX_HELLO_INTERVAL)
769 {
770 vty_out (vty, "Invalid hello-interval %ld - should be <1-600>%s",
771 interval, VTY_NEWLINE);
772 return CMD_ERR_AMBIGUOUS;
773 }
774
775 circuit->hello_interval[0] = (u_int16_t) interval;
776
777 return CMD_SUCCESS;
778}
779
780DEFUN (no_isis_hello_interval_l1,
781 no_isis_hello_interval_l1_cmd,
782 "no isis hello-interval level-1",
783 NO_STR
784 "IS-IS commands\n"
785 "Set Hello interval\n"
786 "Specify hello-interval for level-1 IIHs\n")
787{
788 struct isis_circuit *circuit = isis_circuit_lookup (vty);
789 if (!circuit)
790 return CMD_ERR_NO_MATCH;
791
792 circuit->hello_interval[0] = DEFAULT_HELLO_INTERVAL;
793
794 return CMD_SUCCESS;
795}
796
797ALIAS (no_isis_hello_interval_l1,
798 no_isis_hello_interval_l1_arg_cmd,
799 "no isis hello-interval <1-600> level-1",
800 NO_STR
801 "IS-IS commands\n"
802 "Set Hello interval\n"
803 "Hello interval value\n"
804 "Holdtime 1 second, interval depends on multiplier\n"
805 "Specify hello-interval for level-1 IIHs\n")
806
807DEFUN (isis_hello_interval_l2,
808 isis_hello_interval_l2_cmd,
809 "isis hello-interval <1-600> level-2",
810 "IS-IS commands\n"
811 "Set Hello interval\n"
812 "Hello interval value\n"
813 "Holdtime 1 second, interval depends on multiplier\n"
814 "Specify hello-interval for level-2 IIHs\n")
815{
816 long interval;
817 struct isis_circuit *circuit = isis_circuit_lookup (vty);
818 if (!circuit)
819 return CMD_ERR_NO_MATCH;
820
821 interval = atoi (argv[0]);
822 if (interval < MIN_HELLO_INTERVAL || interval > MAX_HELLO_INTERVAL)
823 {
824 vty_out (vty, "Invalid hello-interval %ld - should be <1-600>%s",
825 interval, VTY_NEWLINE);
826 return CMD_ERR_AMBIGUOUS;
827 }
828
829 circuit->hello_interval[1] = (u_int16_t) interval;
830
831 return CMD_SUCCESS;
832}
833
834DEFUN (no_isis_hello_interval_l2,
835 no_isis_hello_interval_l2_cmd,
836 "no isis hello-interval level-2",
837 NO_STR
838 "IS-IS commands\n"
839 "Set Hello interval\n"
840 "Specify hello-interval for level-2 IIHs\n")
841{
842 struct isis_circuit *circuit = isis_circuit_lookup (vty);
843 if (!circuit)
844 return CMD_ERR_NO_MATCH;
845
846 circuit->hello_interval[1] = DEFAULT_HELLO_INTERVAL;
847
848 return CMD_SUCCESS;
849}
850
851ALIAS (no_isis_hello_interval_l2,
852 no_isis_hello_interval_l2_arg_cmd,
853 "no isis hello-interval <1-600> level-2",
854 NO_STR
855 "IS-IS commands\n"
856 "Set Hello interval\n"
857 "Hello interval value\n"
858 "Holdtime 1 second, interval depends on multiplier\n"
859 "Specify hello-interval for level-2 IIHs\n")
860
861DEFUN (isis_hello_multiplier,
862 isis_hello_multiplier_cmd,
863 "isis hello-multiplier <2-100>",
864 "IS-IS commands\n"
865 "Set multiplier for Hello holding time\n"
866 "Hello multiplier value\n")
867{
868 int mult;
869 struct isis_circuit *circuit = isis_circuit_lookup (vty);
870 if (!circuit)
871 return CMD_ERR_NO_MATCH;
872
873 mult = atoi (argv[0]);
874 if (mult < MIN_HELLO_MULTIPLIER || mult > MAX_HELLO_MULTIPLIER)
875 {
876 vty_out (vty, "Invalid hello-multiplier %d - should be <2-100>%s",
877 mult, VTY_NEWLINE);
878 return CMD_ERR_AMBIGUOUS;
879 }
880
881 circuit->hello_multiplier[0] = (u_int16_t) mult;
882 circuit->hello_multiplier[1] = (u_int16_t) mult;
883
884 return CMD_SUCCESS;
885}
886
887DEFUN (no_isis_hello_multiplier,
888 no_isis_hello_multiplier_cmd,
889 "no isis hello-multiplier",
890 NO_STR
891 "IS-IS commands\n"
892 "Set multiplier for Hello holding time\n")
893{
894 struct isis_circuit *circuit = isis_circuit_lookup (vty);
895 if (!circuit)
896 return CMD_ERR_NO_MATCH;
897
898 circuit->hello_multiplier[0] = DEFAULT_HELLO_MULTIPLIER;
899 circuit->hello_multiplier[1] = DEFAULT_HELLO_MULTIPLIER;
900
901 return CMD_SUCCESS;
902}
903
904ALIAS (no_isis_hello_multiplier,
905 no_isis_hello_multiplier_arg_cmd,
906 "no isis hello-multiplier <2-100>",
907 NO_STR
908 "IS-IS commands\n"
909 "Set multiplier for Hello holding time\n"
910 "Hello multiplier value\n")
911
912DEFUN (isis_hello_multiplier_l1,
913 isis_hello_multiplier_l1_cmd,
914 "isis hello-multiplier <2-100> level-1",
915 "IS-IS commands\n"
916 "Set multiplier for Hello holding time\n"
917 "Hello multiplier value\n"
918 "Specify hello multiplier for level-1 IIHs\n")
919{
920 int mult;
921 struct isis_circuit *circuit = isis_circuit_lookup (vty);
922 if (!circuit)
923 return CMD_ERR_NO_MATCH;
924
925 mult = atoi (argv[0]);
926 if (mult < MIN_HELLO_MULTIPLIER || mult > MAX_HELLO_MULTIPLIER)
927 {
928 vty_out (vty, "Invalid hello-multiplier %d - should be <2-100>%s",
929 mult, VTY_NEWLINE);
930 return CMD_ERR_AMBIGUOUS;
931 }
932
933 circuit->hello_multiplier[0] = (u_int16_t) mult;
934
935 return CMD_SUCCESS;
936}
937
938DEFUN (no_isis_hello_multiplier_l1,
939 no_isis_hello_multiplier_l1_cmd,
940 "no isis hello-multiplier level-1",
941 NO_STR
942 "IS-IS commands\n"
943 "Set multiplier for Hello holding time\n"
944 "Specify hello multiplier for level-1 IIHs\n")
945{
946 struct isis_circuit *circuit = isis_circuit_lookup (vty);
947 if (!circuit)
948 return CMD_ERR_NO_MATCH;
949
950 circuit->hello_multiplier[0] = DEFAULT_HELLO_MULTIPLIER;
951
952 return CMD_SUCCESS;
953}
954
955ALIAS (no_isis_hello_multiplier_l1,
956 no_isis_hello_multiplier_l1_arg_cmd,
957 "no isis hello-multiplier <2-100> level-1",
958 NO_STR
959 "IS-IS commands\n"
960 "Set multiplier for Hello holding time\n"
961 "Hello multiplier value\n"
962 "Specify hello multiplier for level-1 IIHs\n")
963
964DEFUN (isis_hello_multiplier_l2,
965 isis_hello_multiplier_l2_cmd,
966 "isis hello-multiplier <2-100> level-2",
967 "IS-IS commands\n"
968 "Set multiplier for Hello holding time\n"
969 "Hello multiplier value\n"
970 "Specify hello multiplier for level-2 IIHs\n")
971{
972 int mult;
973 struct isis_circuit *circuit = isis_circuit_lookup (vty);
974 if (!circuit)
975 return CMD_ERR_NO_MATCH;
976
977 mult = atoi (argv[0]);
978 if (mult < MIN_HELLO_MULTIPLIER || mult > MAX_HELLO_MULTIPLIER)
979 {
980 vty_out (vty, "Invalid hello-multiplier %d - should be <2-100>%s",
981 mult, VTY_NEWLINE);
982 return CMD_ERR_AMBIGUOUS;
983 }
984
985 circuit->hello_multiplier[1] = (u_int16_t) mult;
986
987 return CMD_SUCCESS;
988}
989
990DEFUN (no_isis_hello_multiplier_l2,
991 no_isis_hello_multiplier_l2_cmd,
992 "no isis hello-multiplier level-2",
993 NO_STR
994 "IS-IS commands\n"
995 "Set multiplier for Hello holding time\n"
996 "Specify hello multiplier for level-2 IIHs\n")
997{
998 struct isis_circuit *circuit = isis_circuit_lookup (vty);
999 if (!circuit)
1000 return CMD_ERR_NO_MATCH;
1001
1002 circuit->hello_multiplier[1] = DEFAULT_HELLO_MULTIPLIER;
1003
1004 return CMD_SUCCESS;
1005}
1006
1007ALIAS (no_isis_hello_multiplier_l2,
1008 no_isis_hello_multiplier_l2_arg_cmd,
1009 "no isis hello-multiplier <2-100> level-2",
1010 NO_STR
1011 "IS-IS commands\n"
1012 "Set multiplier for Hello holding time\n"
1013 "Hello multiplier value\n"
1014 "Specify hello multiplier for level-2 IIHs\n")
1015
1016DEFUN (isis_hello_padding,
1017 isis_hello_padding_cmd,
1018 "isis hello padding",
1019 "IS-IS commands\n"
1020 "Add padding to IS-IS hello packets\n"
1021 "Pad hello packets\n"
1022 "<cr>\n")
1023{
1024 struct isis_circuit *circuit = isis_circuit_lookup (vty);
1025 if (!circuit)
1026 return CMD_ERR_NO_MATCH;
1027
1028 circuit->pad_hellos = 1;
1029
1030 return CMD_SUCCESS;
1031}
1032
1033DEFUN (no_isis_hello_padding,
1034 no_isis_hello_padding_cmd,
1035 "no isis hello padding",
1036 NO_STR
1037 "IS-IS commands\n"
1038 "Add padding to IS-IS hello packets\n"
1039 "Pad hello packets\n"
1040 "<cr>\n")
1041{
1042 struct isis_circuit *circuit = isis_circuit_lookup (vty);
1043 if (!circuit)
1044 return CMD_ERR_NO_MATCH;
1045
1046 circuit->pad_hellos = 0;
1047
1048 return CMD_SUCCESS;
1049}
1050
1051DEFUN (csnp_interval,
1052 csnp_interval_cmd,
1053 "isis csnp-interval <1-600>",
1054 "IS-IS commands\n"
1055 "Set CSNP interval in seconds\n"
1056 "CSNP interval value\n")
1057{
1058 unsigned long interval;
1059 struct isis_circuit *circuit = isis_circuit_lookup (vty);
1060 if (!circuit)
1061 return CMD_ERR_NO_MATCH;
1062
1063 interval = atol (argv[0]);
1064 if (interval < MIN_CSNP_INTERVAL || interval > MAX_CSNP_INTERVAL)
1065 {
1066 vty_out (vty, "Invalid csnp-interval %lu - should be <1-600>%s",
1067 interval, VTY_NEWLINE);
1068 return CMD_ERR_AMBIGUOUS;
1069 }
1070
1071 circuit->csnp_interval[0] = (u_int16_t) interval;
1072 circuit->csnp_interval[1] = (u_int16_t) interval;
1073
1074 return CMD_SUCCESS;
1075}
1076
1077DEFUN (no_csnp_interval,
1078 no_csnp_interval_cmd,
1079 "no isis csnp-interval",
1080 NO_STR
1081 "IS-IS commands\n"
1082 "Set CSNP interval in seconds\n")
1083{
1084 struct isis_circuit *circuit = isis_circuit_lookup (vty);
1085 if (!circuit)
1086 return CMD_ERR_NO_MATCH;
1087
1088 circuit->csnp_interval[0] = DEFAULT_CSNP_INTERVAL;
1089 circuit->csnp_interval[1] = DEFAULT_CSNP_INTERVAL;
1090
1091 return CMD_SUCCESS;
1092}
1093
1094ALIAS (no_csnp_interval,
1095 no_csnp_interval_arg_cmd,
1096 "no isis csnp-interval <1-600>",
1097 NO_STR
1098 "IS-IS commands\n"
1099 "Set CSNP interval in seconds\n"
1100 "CSNP interval value\n")
1101
1102DEFUN (csnp_interval_l1,
1103 csnp_interval_l1_cmd,
1104 "isis csnp-interval <1-600> level-1",
1105 "IS-IS commands\n"
1106 "Set CSNP interval in seconds\n"
1107 "CSNP interval value\n"
1108 "Specify interval for level-1 CSNPs\n")
1109{
1110 unsigned long interval;
1111 struct isis_circuit *circuit = isis_circuit_lookup (vty);
1112 if (!circuit)
1113 return CMD_ERR_NO_MATCH;
1114
1115 interval = atol (argv[0]);
1116 if (interval < MIN_CSNP_INTERVAL || interval > MAX_CSNP_INTERVAL)
1117 {
1118 vty_out (vty, "Invalid csnp-interval %lu - should be <1-600>%s",
1119 interval, VTY_NEWLINE);
1120 return CMD_ERR_AMBIGUOUS;
1121 }
1122
1123 circuit->csnp_interval[0] = (u_int16_t) interval;
1124
1125 return CMD_SUCCESS;
1126}
1127
1128DEFUN (no_csnp_interval_l1,
1129 no_csnp_interval_l1_cmd,
1130 "no isis csnp-interval level-1",
1131 NO_STR
1132 "IS-IS commands\n"
1133 "Set CSNP interval in seconds\n"
1134 "Specify interval for level-1 CSNPs\n")
1135{
1136 struct isis_circuit *circuit = isis_circuit_lookup (vty);
1137 if (!circuit)
1138 return CMD_ERR_NO_MATCH;
1139
1140 circuit->csnp_interval[0] = DEFAULT_CSNP_INTERVAL;
1141
1142 return CMD_SUCCESS;
1143}
1144
1145ALIAS (no_csnp_interval_l1,
1146 no_csnp_interval_l1_arg_cmd,
1147 "no isis csnp-interval <1-600> level-1",
1148 NO_STR
1149 "IS-IS commands\n"
1150 "Set CSNP interval in seconds\n"
1151 "CSNP interval value\n"
1152 "Specify interval for level-1 CSNPs\n")
1153
1154DEFUN (csnp_interval_l2,
1155 csnp_interval_l2_cmd,
1156 "isis csnp-interval <1-600> level-2",
1157 "IS-IS commands\n"
1158 "Set CSNP interval in seconds\n"
1159 "CSNP interval value\n"
1160 "Specify interval for level-2 CSNPs\n")
1161{
1162 unsigned long interval;
1163 struct isis_circuit *circuit = isis_circuit_lookup (vty);
1164 if (!circuit)
1165 return CMD_ERR_NO_MATCH;
1166
1167 interval = atol (argv[0]);
1168 if (interval < MIN_CSNP_INTERVAL || interval > MAX_CSNP_INTERVAL)
1169 {
1170 vty_out (vty, "Invalid csnp-interval %lu - should be <1-600>%s",
1171 interval, VTY_NEWLINE);
1172 return CMD_ERR_AMBIGUOUS;
1173 }
1174
1175 circuit->csnp_interval[1] = (u_int16_t) interval;
1176
1177 return CMD_SUCCESS;
1178}
1179
1180DEFUN (no_csnp_interval_l2,
1181 no_csnp_interval_l2_cmd,
1182 "no isis csnp-interval level-2",
1183 NO_STR
1184 "IS-IS commands\n"
1185 "Set CSNP interval in seconds\n"
1186 "Specify interval for level-2 CSNPs\n")
1187{
1188 struct isis_circuit *circuit = isis_circuit_lookup (vty);
1189 if (!circuit)
1190 return CMD_ERR_NO_MATCH;
1191
1192 circuit->csnp_interval[1] = DEFAULT_CSNP_INTERVAL;
1193
1194 return CMD_SUCCESS;
1195}
1196
1197ALIAS (no_csnp_interval_l2,
1198 no_csnp_interval_l2_arg_cmd,
1199 "no isis csnp-interval <1-600> level-2",
1200 NO_STR
1201 "IS-IS commands\n"
1202 "Set CSNP interval in seconds\n"
1203 "CSNP interval value\n"
1204 "Specify interval for level-2 CSNPs\n")
1205
1206DEFUN (psnp_interval,
1207 psnp_interval_cmd,
1208 "isis psnp-interval <1-120>",
1209 "IS-IS commands\n"
1210 "Set PSNP interval in seconds\n"
1211 "PSNP interval value\n")
1212{
1213 unsigned long interval;
1214 struct isis_circuit *circuit = isis_circuit_lookup (vty);
1215 if (!circuit)
1216 return CMD_ERR_NO_MATCH;
1217
1218 interval = atol (argv[0]);
1219 if (interval < MIN_PSNP_INTERVAL || interval > MAX_PSNP_INTERVAL)
1220 {
1221 vty_out (vty, "Invalid psnp-interval %lu - should be <1-120>%s",
1222 interval, VTY_NEWLINE);
1223 return CMD_ERR_AMBIGUOUS;
1224 }
1225
1226 circuit->psnp_interval[0] = (u_int16_t) interval;
1227 circuit->psnp_interval[1] = (u_int16_t) interval;
1228
1229 return CMD_SUCCESS;
1230}
1231
1232DEFUN (no_psnp_interval,
1233 no_psnp_interval_cmd,
1234 "no isis psnp-interval",
1235 NO_STR
1236 "IS-IS commands\n"
1237 "Set PSNP interval in seconds\n")
1238{
1239 struct isis_circuit *circuit = isis_circuit_lookup (vty);
1240 if (!circuit)
1241 return CMD_ERR_NO_MATCH;
1242
1243 circuit->psnp_interval[0] = DEFAULT_PSNP_INTERVAL;
1244 circuit->psnp_interval[1] = DEFAULT_PSNP_INTERVAL;
1245
1246 return CMD_SUCCESS;
1247}
1248
1249ALIAS (no_psnp_interval,
1250 no_psnp_interval_arg_cmd,
1251 "no isis psnp-interval <1-120>",
1252 NO_STR
1253 "IS-IS commands\n"
1254 "Set PSNP interval in seconds\n"
1255 "PSNP interval value\n")
1256
1257DEFUN (psnp_interval_l1,
1258 psnp_interval_l1_cmd,
1259 "isis psnp-interval <1-120> level-1",
1260 "IS-IS commands\n"
1261 "Set PSNP interval in seconds\n"
1262 "PSNP interval value\n"
1263 "Specify interval for level-1 PSNPs\n")
1264{
1265 unsigned long interval;
1266 struct isis_circuit *circuit = isis_circuit_lookup (vty);
1267 if (!circuit)
1268 return CMD_ERR_NO_MATCH;
1269
1270 interval = atol (argv[0]);
1271 if (interval < MIN_PSNP_INTERVAL || interval > MAX_PSNP_INTERVAL)
1272 {
1273 vty_out (vty, "Invalid psnp-interval %lu - should be <1-120>%s",
1274 interval, VTY_NEWLINE);
1275 return CMD_ERR_AMBIGUOUS;
1276 }
1277
1278 circuit->psnp_interval[0] = (u_int16_t) interval;
1279
1280 return CMD_SUCCESS;
1281}
1282
1283DEFUN (no_psnp_interval_l1,
1284 no_psnp_interval_l1_cmd,
1285 "no isis psnp-interval level-1",
1286 NO_STR
1287 "IS-IS commands\n"
1288 "Set PSNP interval in seconds\n"
1289 "Specify interval for level-1 PSNPs\n")
1290{
1291 struct isis_circuit *circuit = isis_circuit_lookup (vty);
1292 if (!circuit)
1293 return CMD_ERR_NO_MATCH;
1294
1295 circuit->psnp_interval[0] = DEFAULT_PSNP_INTERVAL;
1296
1297 return CMD_SUCCESS;
1298}
1299
1300ALIAS (no_psnp_interval_l1,
1301 no_psnp_interval_l1_arg_cmd,
1302 "no isis psnp-interval <1-120> level-1",
1303 NO_STR
1304 "IS-IS commands\n"
1305 "Set PSNP interval in seconds\n"
1306 "PSNP interval value\n"
1307 "Specify interval for level-1 PSNPs\n")
1308
1309DEFUN (psnp_interval_l2,
1310 psnp_interval_l2_cmd,
1311 "isis psnp-interval <1-120> level-2",
1312 "IS-IS commands\n"
1313 "Set PSNP interval in seconds\n"
1314 "PSNP interval value\n"
1315 "Specify interval for level-2 PSNPs\n")
1316{
1317 unsigned long interval;
1318 struct isis_circuit *circuit = isis_circuit_lookup (vty);
1319 if (!circuit)
1320 return CMD_ERR_NO_MATCH;
1321
1322 interval = atol (argv[0]);
1323 if (interval < MIN_PSNP_INTERVAL || interval > MAX_PSNP_INTERVAL)
1324 {
1325 vty_out (vty, "Invalid psnp-interval %lu - should be <1-120>%s",
1326 interval, VTY_NEWLINE);
1327 return CMD_ERR_AMBIGUOUS;
1328 }
1329
1330 circuit->psnp_interval[1] = (u_int16_t) interval;
1331
1332 return CMD_SUCCESS;
1333}
1334
1335DEFUN (no_psnp_interval_l2,
1336 no_psnp_interval_l2_cmd,
1337 "no isis psnp-interval level-2",
1338 NO_STR
1339 "IS-IS commands\n"
1340 "Set PSNP interval in seconds\n"
1341 "Specify interval for level-2 PSNPs\n")
1342{
1343 struct isis_circuit *circuit = isis_circuit_lookup (vty);
1344 if (!circuit)
1345 return CMD_ERR_NO_MATCH;
1346
1347 circuit->psnp_interval[1] = DEFAULT_PSNP_INTERVAL;
1348
1349 return CMD_SUCCESS;
1350}
1351
1352ALIAS (no_psnp_interval_l2,
1353 no_psnp_interval_l2_arg_cmd,
1354 "no isis psnp-interval <1-120> level-2",
1355 NO_STR
1356 "IS-IS commands\n"
1357 "Set PSNP interval in seconds\n"
1358 "PSNP interval value\n"
1359 "Specify interval for level-2 PSNPs\n")
1360
Christian Frankeccd485d2016-07-28 17:23:26 +02001361static int
1362validate_metric_style_narrow (struct vty *vty, struct isis_area *area)
1363{
1364 struct isis_circuit *circuit;
1365 struct listnode *node;
1366
1367 if (! vty)
1368 return CMD_ERR_AMBIGUOUS;
1369
1370 if (! area)
1371 {
1372 vty_out (vty, "ISIS area is invalid%s", VTY_NEWLINE);
1373 return CMD_ERR_AMBIGUOUS;
1374 }
1375
1376 for (ALL_LIST_ELEMENTS_RO (area->circuit_list, node, circuit))
1377 {
1378 if ((area->is_type & IS_LEVEL_1) &&
1379 (circuit->is_type & IS_LEVEL_1) &&
1380 (circuit->te_metric[0] > MAX_NARROW_LINK_METRIC))
1381 {
1382 vty_out (vty, "ISIS circuit %s metric is invalid%s",
1383 circuit->interface->name, VTY_NEWLINE);
1384 return CMD_ERR_AMBIGUOUS;
1385 }
1386 if ((area->is_type & IS_LEVEL_2) &&
1387 (circuit->is_type & IS_LEVEL_2) &&
1388 (circuit->te_metric[1] > MAX_NARROW_LINK_METRIC))
1389 {
1390 vty_out (vty, "ISIS circuit %s metric is invalid%s",
1391 circuit->interface->name, VTY_NEWLINE);
1392 return CMD_ERR_AMBIGUOUS;
1393 }
1394 }
1395
1396 return CMD_SUCCESS;
1397}
1398
1399DEFUN (metric_style,
1400 metric_style_cmd,
1401 "metric-style (narrow|transition|wide)",
1402 "Use old-style (ISO 10589) or new-style packet formats\n"
1403 "Use old style of TLVs with narrow metric\n"
1404 "Send and accept both styles of TLVs during transition\n"
1405 "Use new style of TLVs to carry wider metric\n")
1406{
1407 struct isis_area *area = vty->index;
1408 int ret;
1409
1410 assert(area);
1411
1412 if (strncmp (argv[0], "w", 1) == 0)
1413 {
1414 isis_area_metricstyle_set(area, false, true);
1415 return CMD_SUCCESS;
1416 }
1417
1418 ret = validate_metric_style_narrow (vty, area);
1419 if (ret != CMD_SUCCESS)
1420 return ret;
1421
1422 if (strncmp (argv[0], "t", 1) == 0)
1423 isis_area_metricstyle_set(area, true, true);
1424 else if (strncmp (argv[0], "n", 1) == 0)
1425 isis_area_metricstyle_set(area, true, false);
1426 return CMD_SUCCESS;
1427
1428 return CMD_SUCCESS;
1429}
1430
1431DEFUN (no_metric_style,
1432 no_metric_style_cmd,
1433 "no metric-style",
1434 NO_STR
1435 "Use old-style (ISO 10589) or new-style packet formats\n")
1436{
1437 struct isis_area *area = vty->index;
1438 int ret;
1439
1440 assert (area);
1441 ret = validate_metric_style_narrow (vty, area);
1442 if (ret != CMD_SUCCESS)
1443 return ret;
1444
1445 isis_area_metricstyle_set(area, true, false);
1446 return CMD_SUCCESS;
1447}
1448
1449DEFUN (set_overload_bit,
1450 set_overload_bit_cmd,
1451 "set-overload-bit",
1452 "Set overload bit to avoid any transit traffic\n"
1453 "Set overload bit\n")
1454{
1455 struct isis_area *area = vty->index;
1456 assert (area);
1457
1458 isis_area_overload_bit_set(area, true);
1459 return CMD_SUCCESS;
1460}
1461
1462DEFUN (no_set_overload_bit,
1463 no_set_overload_bit_cmd,
1464 "no set-overload-bit",
1465 "Reset overload bit to accept transit traffic\n"
1466 "Reset overload bit\n")
1467{
1468 struct isis_area *area = vty->index;
1469 assert (area);
1470
1471 isis_area_overload_bit_set(area, false);
1472 return CMD_SUCCESS;
1473}
1474
1475DEFUN (set_attached_bit,
1476 set_attached_bit_cmd,
1477 "set-attached-bit",
1478 "Set attached bit to identify as L1/L2 router for inter-area traffic\n"
1479 "Set attached bit\n")
1480{
1481 struct isis_area *area = vty->index;
1482 assert (area);
1483
1484 isis_area_attached_bit_set(area, true);
1485 return CMD_SUCCESS;
1486}
1487
1488DEFUN (no_set_attached_bit,
1489 no_set_attached_bit_cmd,
1490 "no set-attached-bit",
1491 "Reset attached bit\n")
1492{
1493 struct isis_area *area = vty->index;
1494 assert (area);
1495
1496 isis_area_attached_bit_set(area, false);
1497 return CMD_SUCCESS;
1498}
1499
1500DEFUN (dynamic_hostname,
1501 dynamic_hostname_cmd,
1502 "hostname dynamic",
1503 "Dynamic hostname for IS-IS\n"
1504 "Dynamic hostname\n")
1505{
1506 struct isis_area *area = vty->index;
1507 assert(area);
1508
1509 isis_area_dynhostname_set(area, true);
1510 return CMD_SUCCESS;
1511}
1512
1513DEFUN (no_dynamic_hostname,
1514 no_dynamic_hostname_cmd,
1515 "no hostname dynamic",
1516 NO_STR
1517 "Dynamic hostname for IS-IS\n"
1518 "Dynamic hostname\n")
1519{
1520 struct isis_area *area = vty->index;
1521 assert(area);
1522
1523 isis_area_dynhostname_set(area, false);
1524 return CMD_SUCCESS;
1525}
1526
Christian Franke304c7da2016-07-28 17:23:29 +02001527static int area_lsp_mtu_set(struct vty *vty, unsigned int lsp_mtu)
1528{
1529 struct isis_area *area = vty->index;
1530 struct listnode *node;
1531 struct isis_circuit *circuit;
1532
1533 if (!area)
1534 {
1535 vty_out (vty, "Can't find ISIS instance %s", VTY_NEWLINE);
1536 return CMD_ERR_NO_MATCH;
1537 }
1538
1539 for (ALL_LIST_ELEMENTS_RO(area->circuit_list, node, circuit))
1540 {
1541 if(circuit->state != C_STATE_INIT && circuit->state != C_STATE_UP)
1542 continue;
1543 if(lsp_mtu > isis_circuit_pdu_size(circuit))
1544 {
1545 vty_out(vty, "ISIS area contains circuit %s, which has a maximum PDU size of %zu.%s",
1546 circuit->interface->name, isis_circuit_pdu_size(circuit),
1547 VTY_NEWLINE);
1548 return CMD_ERR_AMBIGUOUS;
1549 }
1550 }
1551
1552 isis_area_lsp_mtu_set(area, lsp_mtu);
1553 return CMD_SUCCESS;
1554}
1555
1556DEFUN (area_lsp_mtu,
1557 area_lsp_mtu_cmd,
1558 "lsp-mtu <128-4352>",
1559 "Configure the maximum size of generated LSPs\n"
1560 "Maximum size of generated LSPs\n")
1561{
1562 unsigned int lsp_mtu;
1563
1564 VTY_GET_INTEGER_RANGE("lsp-mtu", lsp_mtu, argv[0], 128, 4352);
1565
1566 return area_lsp_mtu_set(vty, lsp_mtu);
1567}
1568
1569DEFUN(no_area_lsp_mtu,
1570 no_area_lsp_mtu_cmd,
1571 "no lsp-mtu",
1572 NO_STR
1573 "Configure the maximum size of generated LSPs\n")
1574{
1575 return area_lsp_mtu_set(vty, DEFAULT_LSP_MTU);
1576}
1577
1578ALIAS(no_area_lsp_mtu,
1579 no_area_lsp_mtu_arg_cmd,
1580 "no lsp-mtu <128-4352>",
1581 NO_STR
1582 "Configure the maximum size of generated LSPs\n"
1583 "Maximum size of generated LSPs\n");
1584
1585DEFUN (is_type,
1586 is_type_cmd,
1587 "is-type (level-1|level-1-2|level-2-only)",
1588 "IS Level for this routing process (OSI only)\n"
1589 "Act as a station router only\n"
1590 "Act as both a station router and an area router\n"
1591 "Act as an area router only\n")
1592{
1593 struct isis_area *area;
1594 int type;
1595
1596 area = vty->index;
1597
1598 if (!area)
1599 {
1600 vty_out (vty, "Can't find IS-IS instance%s", VTY_NEWLINE);
1601 return CMD_ERR_NO_MATCH;
1602 }
1603
1604 type = string2circuit_t (argv[0]);
1605 if (!type)
1606 {
1607 vty_out (vty, "Unknown IS level %s", VTY_NEWLINE);
1608 return CMD_SUCCESS;
1609 }
1610
1611 isis_area_is_type_set(area, type);
1612
1613 return CMD_SUCCESS;
1614}
1615
1616DEFUN (no_is_type,
1617 no_is_type_cmd,
1618 "no is-type (level-1|level-1-2|level-2-only)",
1619 NO_STR
1620 "IS Level for this routing process (OSI only)\n"
1621 "Act as a station router only\n"
1622 "Act as both a station router and an area router\n"
1623 "Act as an area router only\n")
1624{
1625 struct isis_area *area;
1626 int type;
1627
1628 area = vty->index;
1629 assert (area);
1630
1631 /*
1632 * Put the is-type back to defaults:
1633 * - level-1-2 on first area
1634 * - level-1 for the rest
1635 */
1636 if (listgetdata (listhead (isis->area_list)) == area)
1637 type = IS_LEVEL_1_AND_2;
1638 else
1639 type = IS_LEVEL_1;
1640
1641 isis_area_is_type_set(area, type);
1642
1643 return CMD_SUCCESS;
1644}
1645
Christian Franke4570ca42016-07-28 17:23:30 +02001646static int
1647set_lsp_gen_interval (struct vty *vty, struct isis_area *area,
1648 uint16_t interval, int level)
1649{
1650 int lvl;
1651
1652 for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; ++lvl)
1653 {
1654 if (!(lvl & level))
1655 continue;
1656
1657 if (interval >= area->lsp_refresh[lvl-1])
1658 {
1659 vty_out (vty, "LSP gen interval %us must be less than "
1660 "the LSP refresh interval %us%s",
1661 interval, area->lsp_refresh[lvl-1], VTY_NEWLINE);
1662 return CMD_ERR_AMBIGUOUS;
1663 }
1664 }
1665
1666 for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; ++lvl)
1667 {
1668 if (!(lvl & level))
1669 continue;
1670 area->lsp_gen_interval[lvl-1] = interval;
1671 }
1672
1673 return CMD_SUCCESS;
1674}
1675
1676DEFUN (lsp_gen_interval,
1677 lsp_gen_interval_cmd,
1678 "lsp-gen-interval <1-120>",
1679 "Minimum interval between regenerating same LSP\n"
1680 "Minimum interval in seconds\n")
1681{
1682 struct isis_area *area;
1683 uint16_t interval;
1684 int level;
1685
1686 area = vty->index;
1687 interval = atoi (argv[0]);
1688 level = IS_LEVEL_1 | IS_LEVEL_2;
1689 return set_lsp_gen_interval (vty, area, interval, level);
1690}
1691
1692DEFUN (no_lsp_gen_interval,
1693 no_lsp_gen_interval_cmd,
1694 "no lsp-gen-interval",
1695 NO_STR
1696 "Minimum interval between regenerating same LSP\n")
1697{
1698 struct isis_area *area;
1699 uint16_t interval;
1700 int level;
1701
1702 area = vty->index;
1703 interval = DEFAULT_MIN_LSP_GEN_INTERVAL;
1704 level = IS_LEVEL_1 | IS_LEVEL_2;
1705 return set_lsp_gen_interval (vty, area, interval, level);
1706}
1707
1708ALIAS (no_lsp_gen_interval,
1709 no_lsp_gen_interval_arg_cmd,
1710 "no lsp-gen-interval <1-120>",
1711 NO_STR
1712 "Minimum interval between regenerating same LSP\n"
1713 "Minimum interval in seconds\n")
1714
1715DEFUN (lsp_gen_interval_l1,
1716 lsp_gen_interval_l1_cmd,
1717 "lsp-gen-interval level-1 <1-120>",
1718 "Minimum interval between regenerating same LSP\n"
1719 "Set interval for level 1 only\n"
1720 "Minimum interval in seconds\n")
1721{
1722 struct isis_area *area;
1723 uint16_t interval;
1724 int level;
1725
1726 area = vty->index;
1727 interval = atoi (argv[0]);
1728 level = IS_LEVEL_1;
1729 return set_lsp_gen_interval (vty, area, interval, level);
1730}
1731
1732DEFUN (no_lsp_gen_interval_l1,
1733 no_lsp_gen_interval_l1_cmd,
1734 "no lsp-gen-interval level-1",
1735 NO_STR
1736 "Minimum interval between regenerating same LSP\n"
1737 "Set interval for level 1 only\n")
1738{
1739 struct isis_area *area;
1740 uint16_t interval;
1741 int level;
1742
1743 area = vty->index;
1744 interval = DEFAULT_MIN_LSP_GEN_INTERVAL;
1745 level = IS_LEVEL_1;
1746 return set_lsp_gen_interval (vty, area, interval, level);
1747}
1748
1749ALIAS (no_lsp_gen_interval_l1,
1750 no_lsp_gen_interval_l1_arg_cmd,
1751 "no lsp-gen-interval level-1 <1-120>",
1752 NO_STR
1753 "Minimum interval between regenerating same LSP\n"
1754 "Set interval for level 1 only\n"
1755 "Minimum interval in seconds\n")
1756
1757DEFUN (lsp_gen_interval_l2,
1758 lsp_gen_interval_l2_cmd,
1759 "lsp-gen-interval level-2 <1-120>",
1760 "Minimum interval between regenerating same LSP\n"
1761 "Set interval for level 2 only\n"
1762 "Minimum interval in seconds\n")
1763{
1764 struct isis_area *area;
1765 uint16_t interval;
1766 int level;
1767
1768 area = vty->index;
1769 interval = atoi (argv[0]);
1770 level = IS_LEVEL_2;
1771 return set_lsp_gen_interval (vty, area, interval, level);
1772}
1773
1774DEFUN (no_lsp_gen_interval_l2,
1775 no_lsp_gen_interval_l2_cmd,
1776 "no lsp-gen-interval level-2",
1777 NO_STR
1778 "Minimum interval between regenerating same LSP\n"
1779 "Set interval for level 2 only\n")
1780{
1781 struct isis_area *area;
1782 uint16_t interval;
1783 int level;
1784
1785 area = vty->index;
1786 interval = DEFAULT_MIN_LSP_GEN_INTERVAL;
1787 level = IS_LEVEL_2;
1788 return set_lsp_gen_interval (vty, area, interval, level);
1789}
1790
1791ALIAS (no_lsp_gen_interval_l2,
1792 no_lsp_gen_interval_l2_arg_cmd,
1793 "no lsp-gen-interval level-2 <1-120>",
1794 NO_STR
1795 "Minimum interval between regenerating same LSP\n"
1796 "Set interval for level 2 only\n"
1797 "Minimum interval in seconds\n")
1798
1799DEFUN (spf_interval,
1800 spf_interval_cmd,
1801 "spf-interval <1-120>",
1802 "Minimum interval between SPF calculations\n"
1803 "Minimum interval between consecutive SPFs in seconds\n")
1804{
1805 struct isis_area *area;
1806 u_int16_t interval;
1807
1808 area = vty->index;
1809 interval = atoi (argv[0]);
1810 area->min_spf_interval[0] = interval;
1811 area->min_spf_interval[1] = interval;
1812
1813 return CMD_SUCCESS;
1814}
1815
1816DEFUN (no_spf_interval,
1817 no_spf_interval_cmd,
1818 "no spf-interval",
1819 NO_STR
1820 "Minimum interval between SPF calculations\n")
1821{
1822 struct isis_area *area;
1823
1824 area = vty->index;
1825
1826 area->min_spf_interval[0] = MINIMUM_SPF_INTERVAL;
1827 area->min_spf_interval[1] = MINIMUM_SPF_INTERVAL;
1828
1829 return CMD_SUCCESS;
1830}
1831
1832ALIAS (no_spf_interval,
1833 no_spf_interval_arg_cmd,
1834 "no spf-interval <1-120>",
1835 NO_STR
1836 "Minimum interval between SPF calculations\n"
1837 "Minimum interval between consecutive SPFs in seconds\n")
1838
1839DEFUN (spf_interval_l1,
1840 spf_interval_l1_cmd,
1841 "spf-interval level-1 <1-120>",
1842 "Minimum interval between SPF calculations\n"
1843 "Set interval for level 1 only\n"
1844 "Minimum interval between consecutive SPFs in seconds\n")
1845{
1846 struct isis_area *area;
1847 u_int16_t interval;
1848
1849 area = vty->index;
1850 interval = atoi (argv[0]);
1851 area->min_spf_interval[0] = interval;
1852
1853 return CMD_SUCCESS;
1854}
1855
1856DEFUN (no_spf_interval_l1,
1857 no_spf_interval_l1_cmd,
1858 "no spf-interval level-1",
1859 NO_STR
1860 "Minimum interval between SPF calculations\n"
1861 "Set interval for level 1 only\n")
1862{
1863 struct isis_area *area;
1864
1865 area = vty->index;
1866
1867 area->min_spf_interval[0] = MINIMUM_SPF_INTERVAL;
1868
1869 return CMD_SUCCESS;
1870}
1871
1872ALIAS (no_spf_interval,
1873 no_spf_interval_l1_arg_cmd,
1874 "no spf-interval level-1 <1-120>",
1875 NO_STR
1876 "Minimum interval between SPF calculations\n"
1877 "Set interval for level 1 only\n"
1878 "Minimum interval between consecutive SPFs in seconds\n")
1879
1880DEFUN (spf_interval_l2,
1881 spf_interval_l2_cmd,
1882 "spf-interval level-2 <1-120>",
1883 "Minimum interval between SPF calculations\n"
1884 "Set interval for level 2 only\n"
1885 "Minimum interval between consecutive SPFs in seconds\n")
1886{
1887 struct isis_area *area;
1888 u_int16_t interval;
1889
1890 area = vty->index;
1891 interval = atoi (argv[0]);
1892 area->min_spf_interval[1] = interval;
1893
1894 return CMD_SUCCESS;
1895}
1896
1897DEFUN (no_spf_interval_l2,
1898 no_spf_interval_l2_cmd,
1899 "no spf-interval level-2",
1900 NO_STR
1901 "Minimum interval between SPF calculations\n"
1902 "Set interval for level 2 only\n")
1903{
1904 struct isis_area *area;
1905
1906 area = vty->index;
1907
1908 area->min_spf_interval[1] = MINIMUM_SPF_INTERVAL;
1909
1910 return CMD_SUCCESS;
1911}
1912
1913ALIAS (no_spf_interval,
1914 no_spf_interval_l2_arg_cmd,
1915 "no spf-interval level-2 <1-120>",
1916 NO_STR
1917 "Minimum interval between SPF calculations\n"
1918 "Set interval for level 2 only\n"
1919 "Minimum interval between consecutive SPFs in seconds\n")
1920
1921static int
1922area_max_lsp_lifetime_set(struct vty *vty, int level,
1923 uint16_t interval)
1924{
1925 struct isis_area *area = vty->index;
1926 int lvl;
1927 uint16_t refresh_interval = interval - 300;
1928 int set_refresh_interval[ISIS_LEVELS] = {0, 0};
1929
1930 if (!area)
1931 {
1932 vty_out (vty, "Can't find ISIS instance %s", VTY_NEWLINE);
1933 return CMD_ERR_NO_MATCH;
1934 }
1935
1936 for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; lvl++)
1937 {
1938 if (!(lvl & level))
1939 continue;
1940
1941 if (refresh_interval < area->lsp_refresh[lvl-1])
1942 {
1943 vty_out (vty, "Level %d Max LSP lifetime %us must be 300s greater than "
1944 "the configured LSP refresh interval %us%s",
1945 lvl, interval, area->lsp_refresh[lvl-1], VTY_NEWLINE);
1946 vty_out (vty, "Automatically reducing level %d LSP refresh interval "
1947 "to %us%s", lvl, refresh_interval, VTY_NEWLINE);
1948 set_refresh_interval[lvl-1] = 1;
1949
1950 if (refresh_interval <= area->lsp_gen_interval[lvl-1])
1951 {
1952 vty_out (vty, "LSP refresh interval %us must be greater than "
1953 "the configured LSP gen interval %us%s",
1954 refresh_interval, area->lsp_gen_interval[lvl-1],
1955 VTY_NEWLINE);
1956 return CMD_ERR_AMBIGUOUS;
1957 }
1958 }
1959 }
1960
1961 for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; lvl++)
1962 {
1963 if (!(lvl & level))
1964 continue;
1965 isis_area_max_lsp_lifetime_set(area, lvl, interval);
1966 if (set_refresh_interval[lvl-1])
1967 isis_area_lsp_refresh_set(area, lvl, refresh_interval);
1968 }
1969
1970 return CMD_SUCCESS;
1971}
1972
1973DEFUN (max_lsp_lifetime,
1974 max_lsp_lifetime_cmd,
1975 "max-lsp-lifetime <350-65535>",
1976 "Maximum LSP lifetime\n"
1977 "LSP lifetime in seconds\n")
1978{
1979 return area_max_lsp_lifetime_set(vty, IS_LEVEL_1_AND_2, atoi(argv[0]));
1980}
1981
1982DEFUN (no_max_lsp_lifetime,
1983 no_max_lsp_lifetime_cmd,
1984 "no max-lsp-lifetime",
1985 NO_STR
1986 "LSP lifetime in seconds\n")
1987{
1988 return area_max_lsp_lifetime_set(vty, IS_LEVEL_1_AND_2,
1989 DEFAULT_LSP_LIFETIME);
1990}
1991
1992ALIAS (no_max_lsp_lifetime,
1993 no_max_lsp_lifetime_arg_cmd,
1994 "no max-lsp-lifetime <350-65535>",
1995 NO_STR
1996 "Maximum LSP lifetime\n"
1997 "LSP lifetime in seconds\n")
1998
1999DEFUN (max_lsp_lifetime_l1,
2000 max_lsp_lifetime_l1_cmd,
2001 "max-lsp-lifetime level-1 <350-65535>",
2002 "Maximum LSP lifetime for Level 1 only\n"
2003 "LSP lifetime for Level 1 only in seconds\n")
2004{
2005 return area_max_lsp_lifetime_set(vty, IS_LEVEL_1, atoi(argv[0]));
2006}
2007
2008DEFUN (no_max_lsp_lifetime_l1,
2009 no_max_lsp_lifetime_l1_cmd,
2010 "no max-lsp-lifetime level-1",
2011 NO_STR
2012 "LSP lifetime for Level 1 only in seconds\n")
2013{
2014 return area_max_lsp_lifetime_set(vty, IS_LEVEL_1, DEFAULT_LSP_LIFETIME);
2015}
2016
2017ALIAS (no_max_lsp_lifetime_l1,
2018 no_max_lsp_lifetime_l1_arg_cmd,
2019 "no max-lsp-lifetime level-1 <350-65535>",
2020 NO_STR
2021 "Maximum LSP lifetime for Level 1 only\n"
2022 "LSP lifetime for Level 1 only in seconds\n")
2023
2024DEFUN (max_lsp_lifetime_l2,
2025 max_lsp_lifetime_l2_cmd,
2026 "max-lsp-lifetime level-2 <350-65535>",
2027 "Maximum LSP lifetime for Level 2 only\n"
2028 "LSP lifetime for Level 2 only in seconds\n")
2029{
2030 return area_max_lsp_lifetime_set(vty, IS_LEVEL_2, atoi(argv[0]));
2031}
2032
2033DEFUN (no_max_lsp_lifetime_l2,
2034 no_max_lsp_lifetime_l2_cmd,
2035 "no max-lsp-lifetime level-2",
2036 NO_STR
2037 "LSP lifetime for Level 2 only in seconds\n")
2038{
2039 return area_max_lsp_lifetime_set(vty, IS_LEVEL_2, DEFAULT_LSP_LIFETIME);
2040}
2041
2042ALIAS (no_max_lsp_lifetime_l2,
2043 no_max_lsp_lifetime_l2_arg_cmd,
2044 "no max-lsp-lifetime level-2 <350-65535>",
2045 NO_STR
2046 "Maximum LSP lifetime for Level 2 only\n"
2047 "LSP lifetime for Level 2 only in seconds\n")
2048
2049static int
2050area_lsp_refresh_interval_set(struct vty *vty, int level, uint16_t interval)
2051{
2052 struct isis_area *area = vty->index;
2053 int lvl;
2054
2055 if (!area)
2056 {
2057 vty_out (vty, "Can't find ISIS instance %s", VTY_NEWLINE);
2058 return CMD_ERR_NO_MATCH;
2059 }
2060
2061 for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; ++lvl)
2062 {
2063 if (!(lvl & level))
2064 continue;
2065 if (interval <= area->lsp_gen_interval[lvl-1])
2066 {
2067 vty_out (vty, "LSP refresh interval %us must be greater than "
2068 "the configured LSP gen interval %us%s",
2069 interval, area->lsp_gen_interval[lvl-1],
2070 VTY_NEWLINE);
2071 return CMD_ERR_AMBIGUOUS;
2072 }
2073 if (interval > (area->max_lsp_lifetime[lvl-1] - 300))
2074 {
2075 vty_out (vty, "LSP refresh interval %us must be less than "
2076 "the configured LSP lifetime %us less 300%s",
2077 interval, area->max_lsp_lifetime[lvl-1],
2078 VTY_NEWLINE);
2079 return CMD_ERR_AMBIGUOUS;
2080 }
2081 }
2082
2083 for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; ++lvl)
2084 {
2085 if (!(lvl & level))
2086 continue;
2087 isis_area_lsp_refresh_set(area, lvl, interval);
2088 }
2089
2090 return CMD_SUCCESS;
2091}
2092
2093DEFUN (lsp_refresh_interval,
2094 lsp_refresh_interval_cmd,
2095 "lsp-refresh-interval <1-65235>",
2096 "LSP refresh interval\n"
2097 "LSP refresh interval in seconds\n")
2098{
2099 return area_lsp_refresh_interval_set(vty, IS_LEVEL_1_AND_2, atoi(argv[0]));
2100}
2101
2102DEFUN (no_lsp_refresh_interval,
2103 no_lsp_refresh_interval_cmd,
2104 "no lsp-refresh-interval",
2105 NO_STR
2106 "LSP refresh interval in seconds\n")
2107{
2108 return area_lsp_refresh_interval_set(vty, IS_LEVEL_1_AND_2,
2109 DEFAULT_MAX_LSP_GEN_INTERVAL);
2110}
2111
2112ALIAS (no_lsp_refresh_interval,
2113 no_lsp_refresh_interval_arg_cmd,
2114 "no lsp-refresh-interval <1-65235>",
2115 NO_STR
2116 "LSP refresh interval\n"
2117 "LSP refresh interval in seconds\n")
2118
2119DEFUN (lsp_refresh_interval_l1,
2120 lsp_refresh_interval_l1_cmd,
2121 "lsp-refresh-interval level-1 <1-65235>",
2122 "LSP refresh interval for Level 1 only\n"
2123 "LSP refresh interval for Level 1 only in seconds\n")
2124{
2125 return area_lsp_refresh_interval_set(vty, IS_LEVEL_1, atoi(argv[0]));
2126}
2127
2128DEFUN (no_lsp_refresh_interval_l1,
2129 no_lsp_refresh_interval_l1_cmd,
2130 "no lsp-refresh-interval level-1",
2131 NO_STR
2132 "LSP refresh interval for Level 1 only in seconds\n")
2133{
2134 return area_lsp_refresh_interval_set(vty, IS_LEVEL_1,
2135 DEFAULT_MAX_LSP_GEN_INTERVAL);
2136}
2137
2138ALIAS (no_lsp_refresh_interval_l1,
2139 no_lsp_refresh_interval_l1_arg_cmd,
2140 "no lsp-refresh-interval level-1 <1-65235>",
2141 NO_STR
2142 "LSP refresh interval for Level 1 only\n"
2143 "LSP refresh interval for Level 1 only in seconds\n")
2144
2145DEFUN (lsp_refresh_interval_l2,
2146 lsp_refresh_interval_l2_cmd,
2147 "lsp-refresh-interval level-2 <1-65235>",
2148 "LSP refresh interval for Level 2 only\n"
2149 "LSP refresh interval for Level 2 only in seconds\n")
2150{
2151 return area_lsp_refresh_interval_set(vty, IS_LEVEL_2, atoi(argv[0]));
2152}
2153
2154DEFUN (no_lsp_refresh_interval_l2,
2155 no_lsp_refresh_interval_l2_cmd,
2156 "no lsp-refresh-interval level-2",
2157 NO_STR
2158 "LSP refresh interval for Level 2 only in seconds\n")
2159{
2160 return area_lsp_refresh_interval_set(vty, IS_LEVEL_2,
2161 DEFAULT_MAX_LSP_GEN_INTERVAL);
2162}
2163
2164ALIAS (no_lsp_refresh_interval_l2,
2165 no_lsp_refresh_interval_l2_arg_cmd,
2166 "no lsp-refresh-interval level-2 <1-65235>",
2167 NO_STR
2168 "LSP refresh interval for Level 2 only\n"
2169 "LSP refresh interval for Level 2 only in seconds\n")
2170
Christian Franke68845c12016-07-28 17:23:31 +02002171static int
2172area_passwd_set(struct vty *vty, int level,
2173 int (*type_set)(struct isis_area *area, int level,
2174 const char *passwd, u_char snp_auth),
2175 const char *passwd, u_char snp_auth)
2176{
2177 struct isis_area *area = vty->index;
2178
2179 if (!area)
2180 {
2181 vty_out (vty, "Can't find IS-IS instance%s", VTY_NEWLINE);
2182 return CMD_ERR_NO_MATCH;
2183 }
2184
2185 if (passwd && strlen(passwd) > 254)
2186 {
2187 vty_out (vty, "Too long area password (>254)%s", VTY_NEWLINE);
2188 return CMD_ERR_AMBIGUOUS;
2189 }
2190
2191 type_set(area, level, passwd, snp_auth);
2192 return CMD_SUCCESS;
2193}
2194
2195DEFUN (area_passwd_md5,
2196 area_passwd_md5_cmd,
2197 "(area-password|domain-password) md5 WORD",
2198 "Configure the authentication password for an area\n"
2199 "Set the authentication password for a routing domain\n"
2200 "Authentication type\n"
2201 "Level-wide password\n")
2202{
2203 u_char snp_auth = 0;
2204 int level = (argv[0][0] == 'd') ? IS_LEVEL_2 : IS_LEVEL_1;
2205
2206 if (argc > 2)
2207 {
2208 snp_auth = SNP_AUTH_SEND;
2209 if (strncmp(argv[2], "v", 1) == 0)
2210 snp_auth |= SNP_AUTH_RECV;
2211 }
2212
2213 return area_passwd_set(vty, level, isis_area_passwd_hmac_md5_set,
2214 argv[1], snp_auth);
2215}
2216
2217ALIAS (area_passwd_md5,
2218 area_passwd_md5_snpauth_cmd,
2219 "(area-password|domain-password) md5 WORD authenticate snp (send-only|validate)",
2220 "Configure the authentication password for an area\n"
2221 "Set the authentication password for a routing domain\n"
2222 "Authentication type\n"
2223 "Level-wide password\n"
2224 "Authentication\n"
2225 "SNP PDUs\n"
2226 "Send but do not check PDUs on receiving\n"
2227 "Send and check PDUs on receiving\n")
2228
2229DEFUN (area_passwd_clear,
2230 area_passwd_clear_cmd,
2231 "(area-password|domain-password) clear WORD",
2232 "Configure the authentication password for an area\n"
2233 "Set the authentication password for a routing domain\n"
2234 "Authentication type\n"
2235 "Area password\n")
2236{
2237 u_char snp_auth = 0;
2238 int level = (argv[0][0] == 'd') ? IS_LEVEL_2 : IS_LEVEL_1;
2239
2240 if (argc > 2)
2241 {
2242 snp_auth = SNP_AUTH_SEND;
2243 if (strncmp(argv[2], "v", 1) == 0)
2244 snp_auth |= SNP_AUTH_RECV;
2245 }
2246
2247 return area_passwd_set(vty, level, isis_area_passwd_cleartext_set,
2248 argv[1], snp_auth);
2249}
2250
2251ALIAS (area_passwd_clear,
2252 area_passwd_clear_snpauth_cmd,
2253 "(area-password|domain-password) clear WORD authenticate snp (send-only|validate)",
2254 "Configure the authentication password for an area\n"
2255 "Set the authentication password for a routing domain\n"
2256 "Authentication type\n"
2257 "Area password\n"
2258 "Authentication\n"
2259 "SNP PDUs\n"
2260 "Send but do not check PDUs on receiving\n"
2261 "Send and check PDUs on receiving\n")
2262
2263DEFUN (no_area_passwd,
2264 no_area_passwd_cmd,
2265 "no (area-password|domain-password)",
2266 NO_STR
2267 "Configure the authentication password for an area\n"
2268 "Set the authentication password for a routing domain\n")
2269{
2270 int level = (argv[0][0] == 'd') ? IS_LEVEL_2 : IS_LEVEL_1;
2271 struct isis_area *area = vty->index;
2272
2273 if (!area)
2274 {
2275 vty_out (vty, "Can't find IS-IS instance%s", VTY_NEWLINE);
2276 return CMD_ERR_NO_MATCH;
2277 }
2278
2279 return isis_area_passwd_unset (area, level);
2280}
2281
David Lamparter3732cba2016-07-29 16:19:40 +02002282void
2283isis_vty_init (void)
2284{
2285 install_element (INTERFACE_NODE, &ip_router_isis_cmd);
2286 install_element (INTERFACE_NODE, &no_ip_router_isis_cmd);
2287
2288 install_element (INTERFACE_NODE, &isis_passive_cmd);
2289 install_element (INTERFACE_NODE, &no_isis_passive_cmd);
2290
2291 install_element (INTERFACE_NODE, &isis_circuit_type_cmd);
2292 install_element (INTERFACE_NODE, &no_isis_circuit_type_cmd);
2293
2294 install_element (INTERFACE_NODE, &isis_network_cmd);
2295 install_element (INTERFACE_NODE, &no_isis_network_cmd);
2296
Christian Frankef5fbfb22016-07-28 17:23:27 +02002297 install_element (INTERFACE_NODE, &isis_passwd_cmd);
2298 install_element (INTERFACE_NODE, &no_isis_passwd_cmd);
2299 install_element (INTERFACE_NODE, &no_isis_passwd_arg_cmd);
2300
David Lamparter3732cba2016-07-29 16:19:40 +02002301 install_element (INTERFACE_NODE, &isis_priority_cmd);
2302 install_element (INTERFACE_NODE, &no_isis_priority_cmd);
2303 install_element (INTERFACE_NODE, &no_isis_priority_arg_cmd);
2304 install_element (INTERFACE_NODE, &isis_priority_l1_cmd);
2305 install_element (INTERFACE_NODE, &no_isis_priority_l1_cmd);
2306 install_element (INTERFACE_NODE, &no_isis_priority_l1_arg_cmd);
2307 install_element (INTERFACE_NODE, &isis_priority_l2_cmd);
2308 install_element (INTERFACE_NODE, &no_isis_priority_l2_cmd);
2309 install_element (INTERFACE_NODE, &no_isis_priority_l2_arg_cmd);
2310
2311 install_element (INTERFACE_NODE, &isis_metric_cmd);
2312 install_element (INTERFACE_NODE, &no_isis_metric_cmd);
2313 install_element (INTERFACE_NODE, &no_isis_metric_arg_cmd);
2314 install_element (INTERFACE_NODE, &isis_metric_l1_cmd);
2315 install_element (INTERFACE_NODE, &no_isis_metric_l1_cmd);
2316 install_element (INTERFACE_NODE, &no_isis_metric_l1_arg_cmd);
2317 install_element (INTERFACE_NODE, &isis_metric_l2_cmd);
2318 install_element (INTERFACE_NODE, &no_isis_metric_l2_cmd);
2319 install_element (INTERFACE_NODE, &no_isis_metric_l2_arg_cmd);
Christian Frankeccd485d2016-07-28 17:23:26 +02002320
David Lamparterb5d2f5f2016-07-28 17:23:28 +02002321 install_element (INTERFACE_NODE, &isis_hello_interval_cmd);
2322 install_element (INTERFACE_NODE, &no_isis_hello_interval_cmd);
2323 install_element (INTERFACE_NODE, &no_isis_hello_interval_arg_cmd);
2324 install_element (INTERFACE_NODE, &isis_hello_interval_l1_cmd);
2325 install_element (INTERFACE_NODE, &no_isis_hello_interval_l1_cmd);
2326 install_element (INTERFACE_NODE, &no_isis_hello_interval_l1_arg_cmd);
2327 install_element (INTERFACE_NODE, &isis_hello_interval_l2_cmd);
2328 install_element (INTERFACE_NODE, &no_isis_hello_interval_l2_cmd);
2329 install_element (INTERFACE_NODE, &no_isis_hello_interval_l2_arg_cmd);
2330
2331 install_element (INTERFACE_NODE, &isis_hello_multiplier_cmd);
2332 install_element (INTERFACE_NODE, &no_isis_hello_multiplier_cmd);
2333 install_element (INTERFACE_NODE, &no_isis_hello_multiplier_arg_cmd);
2334 install_element (INTERFACE_NODE, &isis_hello_multiplier_l1_cmd);
2335 install_element (INTERFACE_NODE, &no_isis_hello_multiplier_l1_cmd);
2336 install_element (INTERFACE_NODE, &no_isis_hello_multiplier_l1_arg_cmd);
2337 install_element (INTERFACE_NODE, &isis_hello_multiplier_l2_cmd);
2338 install_element (INTERFACE_NODE, &no_isis_hello_multiplier_l2_cmd);
2339 install_element (INTERFACE_NODE, &no_isis_hello_multiplier_l2_arg_cmd);
2340
2341 install_element (INTERFACE_NODE, &isis_hello_padding_cmd);
2342 install_element (INTERFACE_NODE, &no_isis_hello_padding_cmd);
2343
2344 install_element (INTERFACE_NODE, &csnp_interval_cmd);
2345 install_element (INTERFACE_NODE, &no_csnp_interval_cmd);
2346 install_element (INTERFACE_NODE, &no_csnp_interval_arg_cmd);
2347 install_element (INTERFACE_NODE, &csnp_interval_l1_cmd);
2348 install_element (INTERFACE_NODE, &no_csnp_interval_l1_cmd);
2349 install_element (INTERFACE_NODE, &no_csnp_interval_l1_arg_cmd);
2350 install_element (INTERFACE_NODE, &csnp_interval_l2_cmd);
2351 install_element (INTERFACE_NODE, &no_csnp_interval_l2_cmd);
2352 install_element (INTERFACE_NODE, &no_csnp_interval_l2_arg_cmd);
2353
2354 install_element (INTERFACE_NODE, &psnp_interval_cmd);
2355 install_element (INTERFACE_NODE, &no_psnp_interval_cmd);
2356 install_element (INTERFACE_NODE, &no_psnp_interval_arg_cmd);
2357 install_element (INTERFACE_NODE, &psnp_interval_l1_cmd);
2358 install_element (INTERFACE_NODE, &no_psnp_interval_l1_cmd);
2359 install_element (INTERFACE_NODE, &no_psnp_interval_l1_arg_cmd);
2360 install_element (INTERFACE_NODE, &psnp_interval_l2_cmd);
2361 install_element (INTERFACE_NODE, &no_psnp_interval_l2_cmd);
2362 install_element (INTERFACE_NODE, &no_psnp_interval_l2_arg_cmd);
2363
Christian Frankeccd485d2016-07-28 17:23:26 +02002364 install_element (ISIS_NODE, &metric_style_cmd);
2365 install_element (ISIS_NODE, &no_metric_style_cmd);
2366
2367 install_element (ISIS_NODE, &set_overload_bit_cmd);
2368 install_element (ISIS_NODE, &no_set_overload_bit_cmd);
2369
2370 install_element (ISIS_NODE, &set_attached_bit_cmd);
2371 install_element (ISIS_NODE, &no_set_attached_bit_cmd);
2372
2373 install_element (ISIS_NODE, &dynamic_hostname_cmd);
2374 install_element (ISIS_NODE, &no_dynamic_hostname_cmd);
Christian Franke304c7da2016-07-28 17:23:29 +02002375
2376 install_element (ISIS_NODE, &area_lsp_mtu_cmd);
2377 install_element (ISIS_NODE, &no_area_lsp_mtu_cmd);
2378 install_element (ISIS_NODE, &no_area_lsp_mtu_arg_cmd);
2379
2380 install_element (ISIS_NODE, &is_type_cmd);
2381 install_element (ISIS_NODE, &no_is_type_cmd);
Christian Franke4570ca42016-07-28 17:23:30 +02002382
2383 install_element (ISIS_NODE, &lsp_gen_interval_cmd);
2384 install_element (ISIS_NODE, &no_lsp_gen_interval_cmd);
2385 install_element (ISIS_NODE, &no_lsp_gen_interval_arg_cmd);
2386 install_element (ISIS_NODE, &lsp_gen_interval_l1_cmd);
2387 install_element (ISIS_NODE, &no_lsp_gen_interval_l1_cmd);
2388 install_element (ISIS_NODE, &no_lsp_gen_interval_l1_arg_cmd);
2389 install_element (ISIS_NODE, &lsp_gen_interval_l2_cmd);
2390 install_element (ISIS_NODE, &no_lsp_gen_interval_l2_cmd);
2391 install_element (ISIS_NODE, &no_lsp_gen_interval_l2_arg_cmd);
2392
2393 install_element (ISIS_NODE, &spf_interval_cmd);
2394 install_element (ISIS_NODE, &no_spf_interval_cmd);
2395 install_element (ISIS_NODE, &no_spf_interval_arg_cmd);
2396 install_element (ISIS_NODE, &spf_interval_l1_cmd);
2397 install_element (ISIS_NODE, &no_spf_interval_l1_cmd);
2398 install_element (ISIS_NODE, &no_spf_interval_l1_arg_cmd);
2399 install_element (ISIS_NODE, &spf_interval_l2_cmd);
2400 install_element (ISIS_NODE, &no_spf_interval_l2_cmd);
2401 install_element (ISIS_NODE, &no_spf_interval_l2_arg_cmd);
2402
2403 install_element (ISIS_NODE, &max_lsp_lifetime_cmd);
2404 install_element (ISIS_NODE, &no_max_lsp_lifetime_cmd);
2405 install_element (ISIS_NODE, &no_max_lsp_lifetime_arg_cmd);
2406 install_element (ISIS_NODE, &max_lsp_lifetime_l1_cmd);
2407 install_element (ISIS_NODE, &no_max_lsp_lifetime_l1_cmd);
2408 install_element (ISIS_NODE, &no_max_lsp_lifetime_l1_arg_cmd);
2409 install_element (ISIS_NODE, &max_lsp_lifetime_l2_cmd);
2410 install_element (ISIS_NODE, &no_max_lsp_lifetime_l2_cmd);
2411 install_element (ISIS_NODE, &no_max_lsp_lifetime_l2_arg_cmd);
2412
2413 install_element (ISIS_NODE, &lsp_refresh_interval_cmd);
2414 install_element (ISIS_NODE, &no_lsp_refresh_interval_cmd);
2415 install_element (ISIS_NODE, &no_lsp_refresh_interval_arg_cmd);
2416 install_element (ISIS_NODE, &lsp_refresh_interval_l1_cmd);
2417 install_element (ISIS_NODE, &no_lsp_refresh_interval_l1_cmd);
2418 install_element (ISIS_NODE, &no_lsp_refresh_interval_l1_arg_cmd);
2419 install_element (ISIS_NODE, &lsp_refresh_interval_l2_cmd);
2420 install_element (ISIS_NODE, &no_lsp_refresh_interval_l2_cmd);
2421 install_element (ISIS_NODE, &no_lsp_refresh_interval_l2_arg_cmd);
Christian Franke68845c12016-07-28 17:23:31 +02002422
2423 install_element (ISIS_NODE, &area_passwd_md5_cmd);
2424 install_element (ISIS_NODE, &area_passwd_md5_snpauth_cmd);
2425 install_element (ISIS_NODE, &area_passwd_clear_cmd);
2426 install_element (ISIS_NODE, &area_passwd_clear_snpauth_cmd);
2427 install_element (ISIS_NODE, &no_area_passwd_cmd);
David Lamparter3732cba2016-07-29 16:19:40 +02002428}