]> git.proxmox.com Git - mirror_frr.git/blob - isisd/isis_vty_fabricd.c
isisd: retrofit the 'purge-originator' command
[mirror_frr.git] / isisd / isis_vty_fabricd.c
1 /*
2 * IS-IS Rout(e)ing protocol - isis_vty_fabricd.c
3 *
4 * This file contains the CLI that is specific to OpenFabric
5 *
6 * Copyright (C) 2018 Christian Franke, for NetDEF, Inc.
7 *
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public Licenseas published by the Free
10 * Software Foundation; either version 2 of the License, or (at your option)
11 * any later version.
12 *
13 * This program is distributed in the hope that it will be useful,but WITHOUT
14 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
16 * more details.
17 *
18 * You should have received a copy of the GNU General Public License along
19 * with this program; see the file COPYING; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21 */
22 #include <zebra.h>
23
24 #include "command.h"
25
26 #include "isisd/isisd.h"
27 #include "isisd/isis_vty_common.h"
28 #include "isisd/fabricd.h"
29 #include "isisd/isis_tlvs.h"
30 #include "isisd/isis_misc.h"
31 #include "isisd/isis_lsp.h"
32 #include "isisd/isis_csm.h"
33 #include "isisd/isis_circuit.h"
34 #include "lib/spf_backoff.h"
35
36 DEFUN (fabric_tier,
37 fabric_tier_cmd,
38 "fabric-tier (0-14)",
39 "Statically configure the tier to advertise\n"
40 "Tier to advertise\n")
41 {
42 VTY_DECLVAR_CONTEXT(isis_area, area);
43
44 uint8_t tier = atoi(argv[1]->arg);
45
46 fabricd_configure_tier(area, tier);
47 return CMD_SUCCESS;
48 }
49
50 DEFUN (no_fabric_tier,
51 no_fabric_tier_cmd,
52 "no fabric-tier [(0-14)]",
53 NO_STR
54 "Statically configure the tier to advertise\n"
55 "Tier to advertise\n")
56 {
57 VTY_DECLVAR_CONTEXT(isis_area, area);
58
59 fabricd_configure_tier(area, ISIS_TIER_UNDEFINED);
60 return CMD_SUCCESS;
61 }
62
63 DEFUN (triggered_csnp,
64 triggered_csnp_cmd,
65 "triggered-csnp-delay (100-10000) [always]",
66 "Configure the delay for triggered CSNPs\n"
67 "Delay in milliseconds\n"
68 "Trigger CSNP for all LSPs, not only circuit-scoped\n")
69 {
70 VTY_DECLVAR_CONTEXT(isis_area, area);
71
72 int csnp_delay = atoi(argv[1]->arg);
73 bool always_send_csnp = (argc == 3);
74
75 fabricd_configure_triggered_csnp(area, csnp_delay, always_send_csnp);
76 return CMD_SUCCESS;
77 }
78
79 DEFUN (no_triggered_csnp,
80 no_triggered_csnp_cmd,
81 "no triggered-csnp-delay [(100-10000) [always]]",
82 NO_STR
83 "Configure the delay for triggered CSNPs\n"
84 "Delay in milliseconds\n"
85 "Trigger CSNP for all LSPs, not only circuit-scoped\n")
86 {
87 VTY_DECLVAR_CONTEXT(isis_area, area);
88
89 fabricd_configure_triggered_csnp(area, FABRICD_DEFAULT_CSNP_DELAY,
90 false);
91 return CMD_SUCCESS;
92 }
93
94 static void lsp_print_flooding(struct vty *vty, struct isis_lsp *lsp)
95 {
96 char lspid[255];
97
98 lspid_print(lsp->hdr.lsp_id, lspid, true, true);
99 vty_out(vty, "Flooding information for %s\n", lspid);
100
101 if (!lsp->flooding_neighbors[TX_LSP_NORMAL]) {
102 vty_out(vty, " Never received.\n");
103 return;
104 }
105
106 vty_out(vty, " Last received on: %s (",
107 lsp->flooding_interface ?
108 lsp->flooding_interface : "(null)");
109
110 time_t uptime = time(NULL) - lsp->flooding_time;
111 struct tm *tm = gmtime(&uptime);
112
113 if (uptime < ONE_DAY_SECOND)
114 vty_out(vty, "%02d:%02d:%02d", tm->tm_hour, tm->tm_min,
115 tm->tm_sec);
116 else if (uptime < ONE_WEEK_SECOND)
117 vty_out(vty, "%dd%02dh%02dm", tm->tm_yday, tm->tm_hour,
118 tm->tm_min);
119 else
120 vty_out(vty, "%02dw%dd%02dh", tm->tm_yday / 7,
121 tm->tm_yday - ((tm->tm_yday / 7) * 7),
122 tm->tm_hour);
123 vty_out(vty, " ago)\n");
124
125 if (lsp->flooding_circuit_scoped) {
126 vty_out(vty, " Received as circuit-scoped LSP, so not "
127 "flooded.\n");
128 return;
129 }
130
131 for (enum isis_tx_type type = TX_LSP_NORMAL;
132 type <= TX_LSP_CIRCUIT_SCOPED; type++) {
133 struct listnode *node;
134 uint8_t *neighbor_id;
135
136 vty_out(vty, " %s:\n",
137 (type == TX_LSP_NORMAL) ? "RF" : "DNR");
138 for (ALL_LIST_ELEMENTS_RO(lsp->flooding_neighbors[type],
139 node, neighbor_id)) {
140 vty_out(vty, " %s\n",
141 print_sys_hostname(neighbor_id));
142 }
143 }
144 }
145
146 DEFUN (show_lsp_flooding,
147 show_lsp_flooding_cmd,
148 "show openfabric flooding [WORD]",
149 SHOW_STR
150 PROTO_HELP
151 "Flooding information\n"
152 "LSP ID\n")
153 {
154 const char *lspid = NULL;
155
156 if (argc == 4)
157 lspid = argv[3]->arg;
158
159 struct listnode *node;
160 struct isis_area *area;
161
162 for (ALL_LIST_ELEMENTS_RO(isis->area_list, node, area)) {
163 dict_t *lspdb = area->lspdb[ISIS_LEVEL2 - 1];
164
165 vty_out(vty, "Area %s:\n", area->area_tag ?
166 area->area_tag : "null");
167
168 if (lspid) {
169 struct isis_lsp *lsp = lsp_for_arg(lspid, lspdb);
170
171 if (lsp)
172 lsp_print_flooding(vty, lsp);
173
174 continue;
175 }
176
177 for (dnode_t *dnode = dict_first(lspdb); dnode;
178 dnode = dict_next(lspdb, dnode)) {
179 lsp_print_flooding(vty, dnode_get(dnode));
180 vty_out(vty, "\n");
181 }
182 }
183
184 return CMD_SUCCESS;
185 }
186
187 DEFUN (ip_router_isis,
188 ip_router_isis_cmd,
189 "ip router " PROTO_NAME " WORD",
190 "Interface Internet Protocol config commands\n"
191 "IP router interface commands\n"
192 PROTO_HELP
193 "Routing process tag\n")
194 {
195 int idx_afi = 0;
196 int idx_word = 3;
197 VTY_DECLVAR_CONTEXT(interface, ifp);
198 struct isis_circuit *circuit;
199 struct isis_area *area;
200 const char *af = argv[idx_afi]->arg;
201 const char *area_tag = argv[idx_word]->arg;
202
203 /* Prevent more than one area per circuit */
204 circuit = circuit_scan_by_ifp(ifp);
205 if (circuit && circuit->area) {
206 if (strcmp(circuit->area->area_tag, area_tag)) {
207 vty_out(vty, "ISIS circuit is already defined on %s\n",
208 circuit->area->area_tag);
209 return CMD_ERR_NOTHING_TODO;
210 }
211 }
212
213 area = isis_area_lookup(area_tag);
214 if (!area)
215 area = isis_area_create(area_tag);
216
217 if (!circuit || !circuit->area) {
218 circuit = isis_circuit_create(area, ifp);
219
220 if (circuit->state != C_STATE_CONF
221 && circuit->state != C_STATE_UP) {
222 vty_out(vty,
223 "Couldn't bring up interface, please check log.\n");
224 return CMD_WARNING_CONFIG_FAILED;
225 }
226 }
227
228 bool ip = circuit->ip_router, ipv6 = circuit->ipv6_router;
229 if (af[2] != '\0')
230 ipv6 = true;
231 else
232 ip = true;
233
234 isis_circuit_af_set(circuit, ip, ipv6);
235 return CMD_SUCCESS;
236 }
237
238 DEFUN (ip6_router_isis,
239 ip6_router_isis_cmd,
240 "ipv6 router " PROTO_NAME " WORD",
241 "Interface Internet Protocol config commands\n"
242 "IP router interface commands\n"
243 PROTO_HELP
244 "Routing process tag\n")
245 {
246 return ip_router_isis(self, vty, argc, argv);
247 }
248
249 DEFUN (no_ip_router_isis,
250 no_ip_router_isis_cmd,
251 "no <ip|ipv6> router " PROTO_NAME " WORD",
252 NO_STR
253 "Interface Internet Protocol config commands\n"
254 "IP router interface commands\n"
255 "IP router interface commands\n"
256 PROTO_HELP
257 "Routing process tag\n")
258 {
259 int idx_afi = 1;
260 int idx_word = 4;
261 VTY_DECLVAR_CONTEXT(interface, ifp);
262 struct isis_area *area;
263 struct isis_circuit *circuit;
264 const char *af = argv[idx_afi]->arg;
265 const char *area_tag = argv[idx_word]->arg;
266
267 area = isis_area_lookup(area_tag);
268 if (!area) {
269 vty_out(vty, "Can't find ISIS instance %s\n",
270 area_tag);
271 return CMD_ERR_NO_MATCH;
272 }
273
274 circuit = circuit_lookup_by_ifp(ifp, area->circuit_list);
275 if (!circuit) {
276 vty_out(vty, "ISIS is not enabled on circuit %s\n", ifp->name);
277 return CMD_ERR_NO_MATCH;
278 }
279
280 bool ip = circuit->ip_router, ipv6 = circuit->ipv6_router;
281 if (af[2] != '\0')
282 ipv6 = false;
283 else
284 ip = false;
285
286 isis_circuit_af_set(circuit, ip, ipv6);
287 return CMD_SUCCESS;
288 }
289
290 DEFUN (set_overload_bit,
291 set_overload_bit_cmd,
292 "set-overload-bit",
293 "Set overload bit to avoid any transit traffic\n")
294 {
295 VTY_DECLVAR_CONTEXT(isis_area, area);
296
297 isis_area_overload_bit_set(area, true);
298 return CMD_SUCCESS;
299 }
300
301 DEFUN (no_set_overload_bit,
302 no_set_overload_bit_cmd,
303 "no set-overload-bit",
304 "Reset overload bit to accept transit traffic\n"
305 "Reset overload bit\n")
306 {
307 VTY_DECLVAR_CONTEXT(isis_area, area);
308
309 isis_area_overload_bit_set(area, false);
310 return CMD_SUCCESS;
311 }
312
313 static int isis_vty_password_set(struct vty *vty, int argc,
314 struct cmd_token *argv[], int level)
315 {
316 VTY_DECLVAR_CONTEXT(isis_area, area);
317
318 int idx_algo = 1;
319 int idx_password = 2;
320 int idx_snp_auth = 5;
321 uint8_t snp_auth = 0;
322
323 const char *passwd = argv[idx_password]->arg;
324 if (strlen(passwd) > 254) {
325 vty_out(vty, "Too long area password (>254)\n");
326 return CMD_WARNING_CONFIG_FAILED;
327 }
328
329 if (argc > idx_snp_auth) {
330 snp_auth = SNP_AUTH_SEND;
331 if (strmatch(argv[idx_snp_auth]->text, "validate"))
332 snp_auth |= SNP_AUTH_RECV;
333 }
334
335 if (strmatch(argv[idx_algo]->text, "clear")) {
336 return isis_area_passwd_cleartext_set(area, level,
337 passwd, snp_auth);
338 } else if (strmatch(argv[idx_algo]->text, "md5")) {
339 return isis_area_passwd_hmac_md5_set(area, level,
340 passwd, snp_auth);
341 }
342
343 return CMD_WARNING_CONFIG_FAILED;
344 }
345
346 DEFUN (domain_passwd,
347 domain_passwd_cmd,
348 "domain-password <clear|md5> WORD [authenticate snp <send-only|validate>]",
349 "Set the authentication password for a routing domain\n"
350 "Authentication type\n"
351 "Authentication type\n"
352 "Level-wide password\n"
353 "Authentication\n"
354 "SNP PDUs\n"
355 "Send but do not check PDUs on receiving\n"
356 "Send and check PDUs on receiving\n")
357 {
358 return isis_vty_password_set(vty, argc, argv, IS_LEVEL_2);
359 }
360
361 DEFUN (no_domain_passwd,
362 no_domain_passwd_cmd,
363 "no domain-password",
364 NO_STR
365 "Set the authentication password for a routing domain\n")
366 {
367 VTY_DECLVAR_CONTEXT(isis_area, area);
368
369 return isis_area_passwd_unset(area, IS_LEVEL_2);
370 }
371
372 static int
373 isis_vty_lsp_gen_interval_set(struct vty *vty, int level, uint16_t interval)
374 {
375 VTY_DECLVAR_CONTEXT(isis_area, area);
376 int lvl;
377
378 for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; ++lvl) {
379 if (!(lvl & level))
380 continue;
381
382 if (interval >= area->lsp_refresh[lvl - 1]) {
383 vty_out(vty,
384 "LSP gen interval %us must be less than "
385 "the LSP refresh interval %us\n",
386 interval, area->lsp_refresh[lvl - 1]);
387 return CMD_WARNING_CONFIG_FAILED;
388 }
389 }
390
391 for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; ++lvl) {
392 if (!(lvl & level))
393 continue;
394 area->lsp_gen_interval[lvl - 1] = interval;
395 }
396
397 return CMD_SUCCESS;
398 }
399
400 DEFUN (lsp_gen_interval,
401 lsp_gen_interval_cmd,
402 "lsp-gen-interval (1-120)",
403 "Minimum interval between regenerating same LSP\n"
404 "Minimum interval in seconds\n")
405 {
406 uint16_t interval = atoi(argv[1]->arg);
407
408 return isis_vty_lsp_gen_interval_set(vty, IS_LEVEL_1_AND_2, interval);
409 }
410
411 DEFUN (no_lsp_gen_interval,
412 no_lsp_gen_interval_cmd,
413 "no lsp-gen-interval [(1-120)]",
414 NO_STR
415 "Minimum interval between regenerating same LSP\n"
416 "Minimum interval in seconds\n")
417 {
418 VTY_DECLVAR_CONTEXT(isis_area, area);
419
420 return isis_vty_lsp_gen_interval_set(vty, IS_LEVEL_1_AND_2,
421 DEFAULT_MIN_LSP_GEN_INTERVAL);
422 }
423
424 static int
425 isis_vty_lsp_refresh_set(struct vty *vty, int level, uint16_t interval)
426 {
427 VTY_DECLVAR_CONTEXT(isis_area, area);
428 int lvl;
429
430 for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; ++lvl) {
431 if (!(lvl & level))
432 continue;
433 if (interval <= area->lsp_gen_interval[lvl - 1]) {
434 vty_out(vty,
435 "LSP refresh interval %us must be greater than "
436 "the configured LSP gen interval %us\n",
437 interval, area->lsp_gen_interval[lvl - 1]);
438 return CMD_WARNING_CONFIG_FAILED;
439 }
440 if (interval > (area->max_lsp_lifetime[lvl - 1] - 300)) {
441 vty_out(vty,
442 "LSP refresh interval %us must be less than "
443 "the configured LSP lifetime %us less 300\n",
444 interval, area->max_lsp_lifetime[lvl - 1]);
445 return CMD_WARNING_CONFIG_FAILED;
446 }
447 }
448
449 for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; ++lvl) {
450 if (!(lvl & level))
451 continue;
452 isis_area_lsp_refresh_set(area, lvl, interval);
453 }
454
455 return CMD_SUCCESS;
456 }
457
458 DEFUN (lsp_refresh_interval,
459 lsp_refresh_interval_cmd,
460 "lsp-refresh-interval (1-65235)",
461 "LSP refresh interval\n"
462 "LSP refresh interval in seconds\n")
463 {
464 unsigned int interval = atoi(argv[1]->arg);
465 return isis_vty_lsp_refresh_set(vty, IS_LEVEL_1_AND_2, interval);
466 }
467
468 DEFUN (no_lsp_refresh_interval,
469 no_lsp_refresh_interval_cmd,
470 "no lsp-refresh-interval [(1-65235)]",
471 NO_STR
472 "LSP refresh interval\n"
473 "LSP refresh interval in seconds\n")
474 {
475 return isis_vty_lsp_refresh_set(vty, IS_LEVEL_1_AND_2,
476 DEFAULT_MAX_LSP_GEN_INTERVAL);
477 }
478
479 static int
480 isis_vty_max_lsp_lifetime_set(struct vty *vty, int level, uint16_t interval)
481 {
482 VTY_DECLVAR_CONTEXT(isis_area, area);
483 int lvl;
484 uint16_t refresh_interval = interval - 300;
485 int set_refresh_interval[ISIS_LEVELS] = {0, 0};
486
487 for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; lvl++) {
488 if (!(lvl & level))
489 continue;
490
491 if (refresh_interval < area->lsp_refresh[lvl - 1]) {
492 vty_out(vty,
493 "Level %d Max LSP lifetime %us must be 300s greater than "
494 "the configured LSP refresh interval %us\n",
495 lvl, interval, area->lsp_refresh[lvl - 1]);
496 vty_out(vty,
497 "Automatically reducing level %d LSP refresh interval "
498 "to %us\n",
499 lvl, refresh_interval);
500 set_refresh_interval[lvl - 1] = 1;
501
502 if (refresh_interval
503 <= area->lsp_gen_interval[lvl - 1]) {
504 vty_out(vty,
505 "LSP refresh interval %us must be greater than "
506 "the configured LSP gen interval %us\n",
507 refresh_interval,
508 area->lsp_gen_interval[lvl - 1]);
509 return CMD_WARNING_CONFIG_FAILED;
510 }
511 }
512 }
513
514 for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; lvl++) {
515 if (!(lvl & level))
516 continue;
517 isis_area_max_lsp_lifetime_set(area, lvl, interval);
518 if (set_refresh_interval[lvl - 1])
519 isis_area_lsp_refresh_set(area, lvl, refresh_interval);
520 }
521
522 return CMD_SUCCESS;
523 }
524
525 DEFUN (max_lsp_lifetime,
526 max_lsp_lifetime_cmd,
527 "max-lsp-lifetime (350-65535)",
528 "Maximum LSP lifetime\n"
529 "LSP lifetime in seconds\n")
530 {
531 int lifetime = atoi(argv[1]->arg);
532
533 return isis_vty_max_lsp_lifetime_set(vty, IS_LEVEL_1_AND_2, lifetime);
534 }
535
536
537 DEFUN (no_max_lsp_lifetime,
538 no_max_lsp_lifetime_cmd,
539 "no max-lsp-lifetime [(350-65535)]",
540 NO_STR
541 "Maximum LSP lifetime\n"
542 "LSP lifetime in seconds\n")
543 {
544 return isis_vty_max_lsp_lifetime_set(vty, IS_LEVEL_1_AND_2,
545 DEFAULT_LSP_LIFETIME);
546 }
547
548 DEFUN (spf_interval,
549 spf_interval_cmd,
550 "spf-interval (1-120)",
551 "Minimum interval between SPF calculations\n"
552 "Minimum interval between consecutive SPFs in seconds\n")
553 {
554 VTY_DECLVAR_CONTEXT(isis_area, area);
555 uint16_t interval = atoi(argv[1]->arg);
556
557 area->min_spf_interval[0] = interval;
558 area->min_spf_interval[1] = interval;
559
560 return CMD_SUCCESS;
561 }
562
563 DEFUN (no_spf_interval,
564 no_spf_interval_cmd,
565 "no spf-interval [(1-120)]",
566 NO_STR
567 "Minimum interval between SPF calculations\n"
568 "Minimum interval between consecutive SPFs in seconds\n")
569 {
570 VTY_DECLVAR_CONTEXT(isis_area, area);
571
572 area->min_spf_interval[0] = MINIMUM_SPF_INTERVAL;
573 area->min_spf_interval[1] = MINIMUM_SPF_INTERVAL;
574
575 return CMD_SUCCESS;
576 }
577
578 static int isis_vty_lsp_mtu_set(struct vty *vty, unsigned int lsp_mtu)
579 {
580 VTY_DECLVAR_CONTEXT(isis_area, area);
581 struct listnode *node;
582 struct isis_circuit *circuit;
583
584 for (ALL_LIST_ELEMENTS_RO(area->circuit_list, node, circuit)) {
585 if (circuit->state != C_STATE_INIT
586 && circuit->state != C_STATE_UP)
587 continue;
588 if (lsp_mtu > isis_circuit_pdu_size(circuit)) {
589 vty_out(vty,
590 "ISIS area contains circuit %s, which has a maximum PDU size of %zu.\n",
591 circuit->interface->name,
592 isis_circuit_pdu_size(circuit));
593 return CMD_WARNING_CONFIG_FAILED;
594 }
595 }
596
597 isis_area_lsp_mtu_set(area, lsp_mtu);
598 return CMD_SUCCESS;
599 }
600
601 DEFUN (area_lsp_mtu,
602 area_lsp_mtu_cmd,
603 "lsp-mtu (128-4352)",
604 "Configure the maximum size of generated LSPs\n"
605 "Maximum size of generated LSPs\n")
606 {
607 int idx_number = 1;
608 unsigned int lsp_mtu;
609
610 lsp_mtu = strtoul(argv[idx_number]->arg, NULL, 10);
611
612 return isis_vty_lsp_mtu_set(vty, lsp_mtu);
613 }
614
615 DEFUN (no_area_lsp_mtu,
616 no_area_lsp_mtu_cmd,
617 "no lsp-mtu [(128-4352)]",
618 NO_STR
619 "Configure the maximum size of generated LSPs\n"
620 "Maximum size of generated LSPs\n")
621 {
622 return isis_vty_lsp_mtu_set(vty, DEFAULT_LSP_MTU);
623 }
624
625 DEFUN (no_spf_delay_ietf,
626 no_spf_delay_ietf_cmd,
627 "no spf-delay-ietf",
628 NO_STR
629 "IETF SPF delay algorithm\n")
630 {
631 VTY_DECLVAR_CONTEXT(isis_area, area);
632
633 spf_backoff_free(area->spf_delay_ietf[0]);
634 spf_backoff_free(area->spf_delay_ietf[1]);
635 area->spf_delay_ietf[0] = NULL;
636 area->spf_delay_ietf[1] = NULL;
637
638 return CMD_SUCCESS;
639 }
640
641 DEFUN (spf_delay_ietf,
642 spf_delay_ietf_cmd,
643 "spf-delay-ietf init-delay (0-60000) short-delay (0-60000) long-delay (0-60000) holddown (0-60000) time-to-learn (0-60000)",
644 "IETF SPF delay algorithm\n"
645 "Delay used while in QUIET state\n"
646 "Delay used while in QUIET state in milliseconds\n"
647 "Delay used while in SHORT_WAIT state\n"
648 "Delay used while in SHORT_WAIT state in milliseconds\n"
649 "Delay used while in LONG_WAIT\n"
650 "Delay used while in LONG_WAIT state in milliseconds\n"
651 "Time with no received IGP events before considering IGP stable\n"
652 "Time with no received IGP events before considering IGP stable (in milliseconds)\n"
653 "Maximum duration needed to learn all the events related to a single failure\n"
654 "Maximum duration needed to learn all the events related to a single failure (in milliseconds)\n")
655 {
656 VTY_DECLVAR_CONTEXT(isis_area, area);
657
658 long init_delay = atol(argv[2]->arg);
659 long short_delay = atol(argv[4]->arg);
660 long long_delay = atol(argv[6]->arg);
661 long holddown = atol(argv[8]->arg);
662 long timetolearn = atol(argv[10]->arg);
663
664 size_t bufsiz = strlen(area->area_tag) + sizeof("IS-IS Lx");
665 char *buf = XCALLOC(MTYPE_TMP, bufsiz);
666
667 snprintf(buf, bufsiz, "IS-IS %s L1", area->area_tag);
668 spf_backoff_free(area->spf_delay_ietf[0]);
669 area->spf_delay_ietf[0] =
670 spf_backoff_new(master, buf, init_delay, short_delay,
671 long_delay, holddown, timetolearn);
672
673 snprintf(buf, bufsiz, "IS-IS %s L2", area->area_tag);
674 spf_backoff_free(area->spf_delay_ietf[1]);
675 area->spf_delay_ietf[1] =
676 spf_backoff_new(master, buf, init_delay, short_delay,
677 long_delay, holddown, timetolearn);
678
679 XFREE(MTYPE_TMP, buf);
680 return CMD_SUCCESS;
681 }
682
683 DEFUN (area_purge_originator,
684 area_purge_originator_cmd,
685 "[no] purge-originator",
686 NO_STR
687 "Use the RFC 6232 purge-originator\n")
688 {
689 VTY_DECLVAR_CONTEXT(isis_area, area);
690
691 area->purge_originator = !!strcmp(argv[0]->text, "no");
692 return CMD_SUCCESS;
693 }
694
695 void isis_vty_daemon_init(void)
696 {
697 install_element(ROUTER_NODE, &fabric_tier_cmd);
698 install_element(ROUTER_NODE, &no_fabric_tier_cmd);
699 install_element(ROUTER_NODE, &triggered_csnp_cmd);
700 install_element(ROUTER_NODE, &no_triggered_csnp_cmd);
701
702 install_element(ENABLE_NODE, &show_lsp_flooding_cmd);
703
704 install_element(INTERFACE_NODE, &ip_router_isis_cmd);
705 install_element(INTERFACE_NODE, &ip6_router_isis_cmd);
706 install_element(INTERFACE_NODE, &no_ip_router_isis_cmd);
707
708 install_element(ROUTER_NODE, &set_overload_bit_cmd);
709 install_element(ROUTER_NODE, &no_set_overload_bit_cmd);
710
711 install_element(ROUTER_NODE, &domain_passwd_cmd);
712 install_element(ROUTER_NODE, &no_domain_passwd_cmd);
713
714 install_element(ROUTER_NODE, &lsp_gen_interval_cmd);
715 install_element(ROUTER_NODE, &no_lsp_gen_interval_cmd);
716
717 install_element(ROUTER_NODE, &lsp_refresh_interval_cmd);
718 install_element(ROUTER_NODE, &no_lsp_refresh_interval_cmd);
719
720 install_element(ROUTER_NODE, &max_lsp_lifetime_cmd);
721 install_element(ROUTER_NODE, &no_max_lsp_lifetime_cmd);
722
723 install_element(ROUTER_NODE, &area_lsp_mtu_cmd);
724 install_element(ROUTER_NODE, &no_area_lsp_mtu_cmd);
725
726 install_element(ROUTER_NODE, &spf_interval_cmd);
727 install_element(ROUTER_NODE, &no_spf_interval_cmd);
728
729 install_element(ROUTER_NODE, &spf_delay_ietf_cmd);
730 install_element(ROUTER_NODE, &no_spf_delay_ietf_cmd);
731
732 install_element(ROUTER_NODE, &area_purge_originator_cmd);
733 }