]> git.proxmox.com Git - mirror_frr.git/blame_incremental - isisd/isis_cli.c
isisd: update struct isis_spftree with algorithm id
[mirror_frr.git] / isisd / isis_cli.c
... / ...
CommitLineData
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * Copyright (C) 2001,2002 Sampo Saaristo
4 * Tampere University of Technology
5 * Institute of Communications Engineering
6 * Copyright (C) 2018 Volta Networks
7 * Emanuele Di Pascale
8 */
9
10#include <zebra.h>
11
12#include "if.h"
13#include "vrf.h"
14#include "log.h"
15#include "prefix.h"
16#include "command.h"
17#include "northbound_cli.h"
18#include "libfrr.h"
19#include "yang.h"
20#include "lib/linklist.h"
21#include "isisd/isisd.h"
22#include "isisd/isis_nb.h"
23#include "isisd/isis_misc.h"
24#include "isisd/isis_circuit.h"
25#include "isisd/isis_csm.h"
26
27#include "isisd/isis_cli_clippy.c"
28
29#ifndef FABRICD
30
31/*
32 * XPath: /frr-isisd:isis/instance
33 */
34DEFPY_YANG_NOSH(router_isis, router_isis_cmd,
35 "router isis WORD$tag [vrf NAME$vrf_name]",
36 ROUTER_STR
37 "ISO IS-IS\n"
38 "ISO Routing area tag\n" VRF_CMD_HELP_STR)
39{
40 int ret;
41 char base_xpath[XPATH_MAXLEN];
42
43 if (!vrf_name)
44 vrf_name = VRF_DEFAULT_NAME;
45
46 snprintf(base_xpath, XPATH_MAXLEN,
47 "/frr-isisd:isis/instance[area-tag='%s'][vrf='%s']", tag,
48 vrf_name);
49 nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL);
50
51 ret = nb_cli_apply_changes(vty, "%s", base_xpath);
52 if (ret == CMD_SUCCESS)
53 VTY_PUSH_XPATH(ISIS_NODE, base_xpath);
54
55 return ret;
56}
57
58DEFPY_YANG(no_router_isis, no_router_isis_cmd,
59 "no router isis WORD$tag [vrf NAME$vrf_name]",
60 NO_STR ROUTER_STR
61 "ISO IS-IS\n"
62 "ISO Routing area tag\n" VRF_CMD_HELP_STR)
63{
64 if (!vrf_name)
65 vrf_name = VRF_DEFAULT_NAME;
66
67 if (!yang_dnode_existsf(
68 vty->candidate_config->dnode,
69 "/frr-isisd:isis/instance[area-tag='%s'][vrf='%s']", tag,
70 vrf_name)) {
71 vty_out(vty, "ISIS area %s not found.\n", tag);
72 return CMD_ERR_NOTHING_TODO;
73 }
74
75 nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL);
76
77 return nb_cli_apply_changes_clear_pending(
78 vty, "/frr-isisd:isis/instance[area-tag='%s'][vrf='%s']", tag,
79 vrf_name);
80}
81
82void cli_show_router_isis(struct vty *vty, const struct lyd_node *dnode,
83 bool show_defaults)
84{
85 const char *vrf = NULL;
86
87 vrf = yang_dnode_get_string(dnode, "./vrf");
88
89 vty_out(vty, "!\n");
90 vty_out(vty, "router isis %s",
91 yang_dnode_get_string(dnode, "./area-tag"));
92 if (!strmatch(vrf, VRF_DEFAULT_NAME))
93 vty_out(vty, " vrf %s", yang_dnode_get_string(dnode, "./vrf"));
94 vty_out(vty, "\n");
95}
96
97void cli_show_router_isis_end(struct vty *vty, const struct lyd_node *dnode)
98{
99 vty_out(vty, "exit\n");
100}
101
102/*
103 * XPath: /frr-interface:lib/interface/frr-isisd:isis/
104 * XPath: /frr-interface:lib/interface/frr-isisd:isis/ipv4-routing
105 * XPath: /frr-interface:lib/interface/frr-isisd:isis/ipv6-routing
106 * XPath: /frr-isisd:isis/instance
107 */
108DEFPY_YANG(ip_router_isis, ip_router_isis_cmd,
109 "ip router isis WORD$tag",
110 "Interface Internet Protocol config commands\n"
111 "IP router interface commands\n"
112 "IS-IS routing protocol\n"
113 "Routing process tag\n")
114{
115 nb_cli_enqueue_change(vty, "./frr-isisd:isis", NB_OP_CREATE, NULL);
116 nb_cli_enqueue_change(vty, "./frr-isisd:isis/area-tag", NB_OP_MODIFY,
117 tag);
118 nb_cli_enqueue_change(vty, "./frr-isisd:isis/ipv4-routing",
119 NB_OP_MODIFY, "true");
120
121 return nb_cli_apply_changes(vty, NULL);
122}
123
124ALIAS_HIDDEN(ip_router_isis, ip_router_isis_vrf_cmd,
125 "ip router isis WORD$tag vrf NAME$vrf_name",
126 "Interface Internet Protocol config commands\n"
127 "IP router interface commands\n"
128 "IS-IS routing protocol\n"
129 "Routing process tag\n" VRF_CMD_HELP_STR)
130
131DEFPY_YANG(ip6_router_isis, ip6_router_isis_cmd,
132 "ipv6 router isis WORD$tag",
133 "Interface Internet Protocol config commands\n"
134 "IP router interface commands\n"
135 "IS-IS routing protocol\n"
136 "Routing process tag\n")
137{
138 nb_cli_enqueue_change(vty, "./frr-isisd:isis", NB_OP_CREATE, NULL);
139 nb_cli_enqueue_change(vty, "./frr-isisd:isis/area-tag", NB_OP_MODIFY,
140 tag);
141 nb_cli_enqueue_change(vty, "./frr-isisd:isis/ipv6-routing",
142 NB_OP_MODIFY, "true");
143
144 return nb_cli_apply_changes(vty, NULL);
145}
146
147ALIAS_HIDDEN(ip6_router_isis, ip6_router_isis_vrf_cmd,
148 "ipv6 router isis WORD$tag vrf NAME$vrf_name",
149 "Interface Internet Protocol config commands\n"
150 "IP router interface commands\n"
151 "IS-IS routing protocol\n"
152 "Routing process tag\n" VRF_CMD_HELP_STR)
153
154DEFPY_YANG(no_ip_router_isis, no_ip_router_isis_cmd,
155 "no <ip|ipv6>$ip router isis [WORD]$tag",
156 NO_STR
157 "Interface Internet Protocol config commands\n"
158 "IP router interface commands\n"
159 "IP router interface commands\n"
160 "IS-IS routing protocol\n"
161 "Routing process tag\n")
162{
163 const struct lyd_node *dnode;
164
165 dnode = yang_dnode_getf(vty->candidate_config->dnode,
166 "%s/frr-isisd:isis", VTY_CURR_XPATH);
167 if (!dnode)
168 return CMD_SUCCESS;
169
170 /*
171 * If both ipv4 and ipv6 are off delete the interface isis container.
172 */
173 if (strmatch(ip, "ipv6")) {
174 if (!yang_dnode_get_bool(dnode, "./ipv4-routing"))
175 nb_cli_enqueue_change(vty, "./frr-isisd:isis",
176 NB_OP_DESTROY, NULL);
177 else
178 nb_cli_enqueue_change(vty,
179 "./frr-isisd:isis/ipv6-routing",
180 NB_OP_MODIFY, "false");
181 } else {
182 if (!yang_dnode_get_bool(dnode, "./ipv6-routing"))
183 nb_cli_enqueue_change(vty, "./frr-isisd:isis",
184 NB_OP_DESTROY, NULL);
185 else
186 nb_cli_enqueue_change(vty,
187 "./frr-isisd:isis/ipv4-routing",
188 NB_OP_MODIFY, "false");
189 }
190
191 return nb_cli_apply_changes(vty, NULL);
192}
193
194ALIAS_HIDDEN(no_ip_router_isis, no_ip_router_isis_vrf_cmd,
195 "no <ip|ipv6>$ip router isis WORD$tag vrf NAME$vrf_name",
196 NO_STR
197 "Interface Internet Protocol config commands\n"
198 "IP router interface commands\n"
199 "IP router interface commands\n"
200 "IS-IS routing protocol\n"
201 "Routing process tag\n"
202 VRF_CMD_HELP_STR)
203
204void cli_show_ip_isis_ipv4(struct vty *vty, const struct lyd_node *dnode,
205 bool show_defaults)
206{
207 if (!yang_dnode_get_bool(dnode, NULL))
208 vty_out(vty, " no");
209 vty_out(vty, " ip router isis %s\n",
210 yang_dnode_get_string(dnode, "../area-tag"));
211}
212
213void cli_show_ip_isis_ipv6(struct vty *vty, const struct lyd_node *dnode,
214 bool show_defaults)
215{
216 if (!yang_dnode_get_bool(dnode, NULL))
217 vty_out(vty, " no");
218 vty_out(vty, " ipv6 router isis %s\n",
219 yang_dnode_get_string(dnode, "../area-tag"));
220}
221
222/*
223 * XPath: /frr-interface:lib/interface/frr-isisd:isis/bfd-monitoring
224 */
225DEFPY_YANG(isis_bfd,
226 isis_bfd_cmd,
227 "[no] isis bfd",
228 NO_STR PROTO_HELP
229 "Enable BFD support\n")
230{
231 const struct lyd_node *dnode;
232
233 dnode = yang_dnode_getf(vty->candidate_config->dnode,
234 "%s/frr-isisd:isis", VTY_CURR_XPATH);
235 if (dnode == NULL) {
236 vty_out(vty, "ISIS is not enabled on this circuit\n");
237 return CMD_SUCCESS;
238 }
239
240 nb_cli_enqueue_change(vty, "./frr-isisd:isis/bfd-monitoring/enabled",
241 NB_OP_MODIFY, no ? "false" : "true");
242
243 return nb_cli_apply_changes(vty, NULL);
244}
245
246/*
247 * XPath: /frr-interface:lib/interface/frr-isisd:isis/bfd-monitoring/profile
248 */
249DEFPY_YANG(isis_bfd_profile,
250 isis_bfd_profile_cmd,
251 "[no] isis bfd profile BFDPROF$profile",
252 NO_STR PROTO_HELP
253 "Enable BFD support\n"
254 "Use a pre-configured profile\n"
255 "Profile name\n")
256{
257 const struct lyd_node *dnode;
258
259 dnode = yang_dnode_getf(vty->candidate_config->dnode,
260 "%s/frr-isisd:isis", VTY_CURR_XPATH);
261 if (dnode == NULL) {
262 vty_out(vty, "ISIS is not enabled on this circuit\n");
263 return CMD_SUCCESS;
264 }
265
266 if (no)
267 nb_cli_enqueue_change(vty,
268 "./frr-isisd:isis/bfd-monitoring/profile",
269 NB_OP_DESTROY, NULL);
270 else
271 nb_cli_enqueue_change(vty,
272 "./frr-isisd:isis/bfd-monitoring/profile",
273 NB_OP_MODIFY, profile);
274
275 return nb_cli_apply_changes(vty, NULL);
276}
277
278void cli_show_ip_isis_bfd_monitoring(struct vty *vty,
279 const struct lyd_node *dnode,
280 bool show_defaults)
281{
282 if (!yang_dnode_get_bool(dnode, "./enabled")) {
283 if (show_defaults)
284 vty_out(vty, " no isis bfd\n");
285 } else {
286 vty_out(vty, " isis bfd\n");
287 }
288
289 if (yang_dnode_exists(dnode, "./profile"))
290 vty_out(vty, " isis bfd profile %s\n",
291 yang_dnode_get_string(dnode, "./profile"));
292}
293
294/*
295 * XPath: /frr-isisd:isis/instance/area-address
296 */
297DEFPY_YANG(net, net_cmd, "[no] net WORD",
298 "Remove an existing Network Entity Title for this process\n"
299 "A Network Entity Title for this process (OSI only)\n"
300 "XX.XXXX. ... .XXX.XX Network entity title (NET)\n")
301{
302 nb_cli_enqueue_change(vty, "./area-address",
303 no ? NB_OP_DESTROY : NB_OP_CREATE, net);
304
305 return nb_cli_apply_changes(vty, NULL);
306}
307
308void cli_show_isis_area_address(struct vty *vty, const struct lyd_node *dnode,
309 bool show_defaults)
310{
311 vty_out(vty, " net %s\n", yang_dnode_get_string(dnode, NULL));
312}
313
314/*
315 * XPath: /frr-isisd:isis/instance/is-type
316 */
317DEFPY_YANG(is_type, is_type_cmd, "is-type <level-1|level-1-2|level-2-only>$level",
318 "IS Level for this routing process (OSI only)\n"
319 "Act as a station router only\n"
320 "Act as both a station router and an area router\n"
321 "Act as an area router only\n")
322{
323 nb_cli_enqueue_change(vty, "./is-type", NB_OP_MODIFY,
324 strmatch(level, "level-2-only") ? "level-2"
325 : level);
326
327 return nb_cli_apply_changes(vty, NULL);
328}
329
330DEFPY_YANG(no_is_type, no_is_type_cmd,
331 "no is-type [<level-1|level-1-2|level-2-only>]",
332 NO_STR
333 "IS Level for this routing process (OSI only)\n"
334 "Act as a station router only\n"
335 "Act as both a station router and an area router\n"
336 "Act as an area router only\n")
337{
338 nb_cli_enqueue_change(vty, "./is-type", NB_OP_MODIFY, NULL);
339
340 return nb_cli_apply_changes(vty, NULL);
341}
342
343void cli_show_isis_is_type(struct vty *vty, const struct lyd_node *dnode,
344 bool show_defaults)
345{
346 int is_type = yang_dnode_get_enum(dnode, NULL);
347
348 switch (is_type) {
349 case IS_LEVEL_1:
350 vty_out(vty, " is-type level-1\n");
351 break;
352 case IS_LEVEL_2:
353 vty_out(vty, " is-type level-2-only\n");
354 break;
355 case IS_LEVEL_1_AND_2:
356 vty_out(vty, " is-type level-1-2\n");
357 break;
358 }
359}
360
361/*
362 * XPath: /frr-isisd:isis/instance/dynamic-hostname
363 */
364DEFPY_YANG(dynamic_hostname, dynamic_hostname_cmd, "[no] hostname dynamic",
365 NO_STR
366 "Dynamic hostname for IS-IS\n"
367 "Dynamic hostname\n")
368{
369 nb_cli_enqueue_change(vty, "./dynamic-hostname", NB_OP_MODIFY,
370 no ? "false" : "true");
371
372 return nb_cli_apply_changes(vty, NULL);
373}
374
375void cli_show_isis_dynamic_hostname(struct vty *vty,
376 const struct lyd_node *dnode,
377 bool show_defaults)
378{
379 if (!yang_dnode_get_bool(dnode, NULL))
380 vty_out(vty, " no");
381
382 vty_out(vty, " hostname dynamic\n");
383}
384
385/*
386 * XPath: /frr-isisd:isis/instance/overload
387 */
388DEFPY_YANG(set_overload_bit, set_overload_bit_cmd, "[no] set-overload-bit",
389 "Reset overload bit to accept transit traffic\n"
390 "Set overload bit to avoid any transit traffic\n")
391{
392 nb_cli_enqueue_change(vty, "./overload/enabled", NB_OP_MODIFY,
393 no ? "false" : "true");
394
395 return nb_cli_apply_changes(vty, NULL);
396}
397
398void cli_show_isis_overload(struct vty *vty, const struct lyd_node *dnode,
399 bool show_defaults)
400{
401 if (!yang_dnode_get_bool(dnode, NULL))
402 vty_out(vty, " no");
403 vty_out(vty, " set-overload-bit\n");
404}
405
406/*
407 * XPath: /frr-isisd:isis/instance/overload/on-startup
408 */
409DEFPY_YANG(set_overload_bit_on_startup, set_overload_bit_on_startup_cmd,
410 "set-overload-bit on-startup (0-86400)$val",
411 "Set overload bit to avoid any transit traffic\n"
412 "Set overload bit on startup\n"
413 "Set overload time in seconds\n")
414{
415 nb_cli_enqueue_change(vty, "./overload/on-startup", NB_OP_MODIFY,
416 val_str);
417
418 return nb_cli_apply_changes(vty, NULL);
419}
420
421DEFPY_YANG(no_set_overload_bit_on_startup, no_set_overload_bit_on_startup_cmd,
422 "no set-overload-bit on-startup [(0-86400)$val]",
423 NO_STR
424 "Reset overload bit to accept transit traffic\n"
425 "Set overload bit on startup\n"
426 "Set overload time in seconds\n")
427{
428 nb_cli_enqueue_change(vty, "./overload/on-startup", NB_OP_DESTROY,
429 NULL);
430
431 return nb_cli_apply_changes(vty, NULL);
432}
433
434void cli_show_isis_overload_on_startup(struct vty *vty,
435 const struct lyd_node *dnode,
436 bool show_defaults)
437{
438 vty_out(vty, " set-overload-bit on-startup %s\n",
439 yang_dnode_get_string(dnode, NULL));
440}
441
442/*
443 * XPath: /frr-isisd:isis/instance/advertise-high-metrics
444 */
445DEFPY_YANG(advertise_high_metrics, advertise_high_metrics_cmd,
446 "[no] advertise-high-metrics",
447 NO_STR "Advertise high metric value on all interfaces\n")
448{
449 nb_cli_enqueue_change(vty, "./advertise-high-metrics", NB_OP_MODIFY,
450 no ? "false" : "true");
451
452 return nb_cli_apply_changes(vty, NULL);
453}
454
455void cli_show_advertise_high_metrics(struct vty *vty,
456 const struct lyd_node *dnode,
457 bool show_defaults)
458{
459 if (yang_dnode_get_bool(dnode, NULL))
460 vty_out(vty, " advertise-high-metrics\n");
461 else if (show_defaults)
462 vty_out(vty, " no advertise-high-metrics\n");
463}
464
465/*
466 * XPath: /frr-isisd:isis/instance/attach-send
467 */
468DEFPY_YANG(attached_bit_send, attached_bit_send_cmd, "[no] attached-bit send",
469 "Reset attached bit\n"
470 "Set attached bit for inter-area traffic\n"
471 "Set attached bit in LSP sent to L1 router\n")
472{
473 nb_cli_enqueue_change(vty, "./attach-send", NB_OP_MODIFY,
474 no ? "false" : "true");
475
476 return nb_cli_apply_changes(vty, NULL);
477}
478
479void cli_show_isis_attached_send(struct vty *vty, const struct lyd_node *dnode,
480 bool show_defaults)
481{
482 if (!yang_dnode_get_bool(dnode, NULL))
483 vty_out(vty, " no");
484 vty_out(vty, " attached-bit send\n");
485}
486
487/*
488 * XPath: /frr-isisd:isis/instance/attach-receive-ignore
489 */
490DEFPY_YANG(
491 attached_bit_receive_ignore, attached_bit_receive_ignore_cmd,
492 "[no] attached-bit receive ignore",
493 "Reset attached bit\n"
494 "Set attach bit for inter-area traffic\n"
495 "If LSP received with attached bit set, create default route to neighbor\n"
496 "Do not process attached bit\n")
497{
498 nb_cli_enqueue_change(vty, "./attach-receive-ignore", NB_OP_MODIFY,
499 no ? "false" : "true");
500
501 return nb_cli_apply_changes(vty, NULL);
502}
503
504void cli_show_isis_attached_receive(struct vty *vty,
505 const struct lyd_node *dnode,
506 bool show_defaults)
507{
508 if (!yang_dnode_get_bool(dnode, NULL))
509 vty_out(vty, " no");
510 vty_out(vty, " attached-bit receive ignore\n");
511}
512
513/*
514 * XPath: /frr-isisd:isis/instance/metric-style
515 */
516DEFPY_YANG(metric_style, metric_style_cmd,
517 "metric-style <narrow|transition|wide>$style",
518 "Use old-style (ISO 10589) or new-style packet formats\n"
519 "Use old style of TLVs with narrow metric\n"
520 "Send and accept both styles of TLVs during transition\n"
521 "Use new style of TLVs to carry wider metric\n")
522{
523 nb_cli_enqueue_change(vty, "./metric-style", NB_OP_MODIFY, style);
524
525 return nb_cli_apply_changes(vty, NULL);
526}
527
528DEFPY_YANG(no_metric_style, no_metric_style_cmd,
529 "no metric-style [narrow|transition|wide]",
530 NO_STR
531 "Use old-style (ISO 10589) or new-style packet formats\n"
532 "Use old style of TLVs with narrow metric\n"
533 "Send and accept both styles of TLVs during transition\n"
534 "Use new style of TLVs to carry wider metric\n")
535{
536 nb_cli_enqueue_change(vty, "./metric-style", NB_OP_MODIFY, NULL);
537
538 return nb_cli_apply_changes(vty, NULL);
539}
540
541void cli_show_isis_metric_style(struct vty *vty, const struct lyd_node *dnode,
542 bool show_defaults)
543{
544 int metric = yang_dnode_get_enum(dnode, NULL);
545
546 switch (metric) {
547 case ISIS_NARROW_METRIC:
548 vty_out(vty, " metric-style narrow\n");
549 break;
550 case ISIS_WIDE_METRIC:
551 vty_out(vty, " metric-style wide\n");
552 break;
553 case ISIS_TRANSITION_METRIC:
554 vty_out(vty, " metric-style transition\n");
555 break;
556 }
557}
558
559/*
560 * XPath: /frr-isisd:isis/instance/area-password
561 */
562DEFPY_YANG(area_passwd, area_passwd_cmd,
563 "area-password <clear|md5>$pwd_type WORD$pwd [authenticate snp <send-only|validate>$snp]",
564 "Configure the authentication password for an area\n"
565 "Clear-text authentication type\n"
566 "MD5 authentication type\n"
567 "Level-wide password\n"
568 "Authentication\n"
569 "SNP PDUs\n"
570 "Send but do not check PDUs on receiving\n"
571 "Send and check PDUs on receiving\n")
572{
573 nb_cli_enqueue_change(vty, "./area-password", NB_OP_CREATE, NULL);
574 nb_cli_enqueue_change(vty, "./area-password/password", NB_OP_MODIFY,
575 pwd);
576 nb_cli_enqueue_change(vty, "./area-password/password-type",
577 NB_OP_MODIFY, pwd_type);
578 nb_cli_enqueue_change(vty, "./area-password/authenticate-snp",
579 NB_OP_MODIFY, snp ? snp : "none");
580
581 return nb_cli_apply_changes(vty, NULL);
582}
583
584void cli_show_isis_area_pwd(struct vty *vty, const struct lyd_node *dnode,
585 bool show_defaults)
586{
587 const char *snp;
588
589 vty_out(vty, " area-password %s %s",
590 yang_dnode_get_string(dnode, "./password-type"),
591 yang_dnode_get_string(dnode, "./password"));
592 snp = yang_dnode_get_string(dnode, "./authenticate-snp");
593 if (!strmatch("none", snp))
594 vty_out(vty, " authenticate snp %s", snp);
595 vty_out(vty, "\n");
596}
597
598/*
599 * XPath: /frr-isisd:isis/instance/domain-password
600 */
601DEFPY_YANG(domain_passwd, domain_passwd_cmd,
602 "domain-password <clear|md5>$pwd_type WORD$pwd [authenticate snp <send-only|validate>$snp]",
603 "Set the authentication password for a routing domain\n"
604 "Clear-text authentication type\n"
605 "MD5 authentication type\n"
606 "Level-wide password\n"
607 "Authentication\n"
608 "SNP PDUs\n"
609 "Send but do not check PDUs on receiving\n"
610 "Send and check PDUs on receiving\n")
611{
612 nb_cli_enqueue_change(vty, "./domain-password", NB_OP_CREATE, NULL);
613 nb_cli_enqueue_change(vty, "./domain-password/password", NB_OP_MODIFY,
614 pwd);
615 nb_cli_enqueue_change(vty, "./domain-password/password-type",
616 NB_OP_MODIFY, pwd_type);
617 nb_cli_enqueue_change(vty, "./domain-password/authenticate-snp",
618 NB_OP_MODIFY, snp ? snp : "none");
619
620 return nb_cli_apply_changes(vty, NULL);
621}
622
623DEFPY_YANG(no_area_passwd, no_area_passwd_cmd,
624 "no <area-password|domain-password>$cmd",
625 NO_STR
626 "Configure the authentication password for an area\n"
627 "Set the authentication password for a routing domain\n")
628{
629 nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL);
630
631 return nb_cli_apply_changes(vty, "./%s", cmd);
632}
633
634void cli_show_isis_domain_pwd(struct vty *vty, const struct lyd_node *dnode,
635 bool show_defaults)
636{
637 const char *snp;
638
639 vty_out(vty, " domain-password %s %s",
640 yang_dnode_get_string(dnode, "./password-type"),
641 yang_dnode_get_string(dnode, "./password"));
642 snp = yang_dnode_get_string(dnode, "./authenticate-snp");
643 if (!strmatch("none", snp))
644 vty_out(vty, " authenticate snp %s", snp);
645 vty_out(vty, "\n");
646}
647
648/*
649 * XPath: /frr-isisd:isis/instance/lsp/timers/level-1/generation-interval
650 * XPath: /frr-isisd:isis/instance/lsp/timers/level-2/generation-interval
651 */
652DEFPY_YANG(lsp_gen_interval, lsp_gen_interval_cmd,
653 "lsp-gen-interval [level-1|level-2]$level (1-120)$val",
654 "Minimum interval between regenerating same LSP\n"
655 "Set interval for level 1 only\n"
656 "Set interval for level 2 only\n"
657 "Minimum interval in seconds\n")
658{
659 if (!level || strmatch(level, "level-1"))
660 nb_cli_enqueue_change(
661 vty, "./lsp/timers/level-1/generation-interval",
662 NB_OP_MODIFY, val_str);
663 if (!level || strmatch(level, "level-2"))
664 nb_cli_enqueue_change(
665 vty, "./lsp/timers/level-2/generation-interval",
666 NB_OP_MODIFY, val_str);
667
668 return nb_cli_apply_changes(vty, NULL);
669}
670
671DEFPY_YANG(no_lsp_gen_interval, no_lsp_gen_interval_cmd,
672 "no lsp-gen-interval [level-1|level-2]$level [(1-120)]",
673 NO_STR
674 "Minimum interval between regenerating same LSP\n"
675 "Set interval for level 1 only\n"
676 "Set interval for level 2 only\n"
677 "Minimum interval in seconds\n")
678{
679 if (!level || strmatch(level, "level-1"))
680 nb_cli_enqueue_change(
681 vty, "./lsp/timers/level-1/generation-interval",
682 NB_OP_MODIFY, NULL);
683 if (!level || strmatch(level, "level-2"))
684 nb_cli_enqueue_change(
685 vty, "./lsp/timers/level-2/generation-interval",
686 NB_OP_MODIFY, NULL);
687
688 return nb_cli_apply_changes(vty, NULL);
689}
690
691/*
692 * XPath: /frr-isisd:isis/instance/lsp/timers/level-1/refresh-interval
693 * XPath: /frr-isisd:isis/instance/lsp/timers/level-2/refresh-interval
694 */
695DEFPY_YANG(lsp_refresh_interval, lsp_refresh_interval_cmd,
696 "lsp-refresh-interval [level-1|level-2]$level (1-65235)$val",
697 "LSP refresh interval\n"
698 "LSP refresh interval for Level 1 only\n"
699 "LSP refresh interval for Level 2 only\n"
700 "LSP refresh interval in seconds\n")
701{
702 if (!level || strmatch(level, "level-1"))
703 nb_cli_enqueue_change(vty,
704 "./lsp/timers/level-1/refresh-interval",
705 NB_OP_MODIFY, val_str);
706 if (!level || strmatch(level, "level-2"))
707 nb_cli_enqueue_change(vty,
708 "./lsp/timers/level-2/refresh-interval",
709 NB_OP_MODIFY, val_str);
710
711 return nb_cli_apply_changes(vty, NULL);
712}
713
714DEFPY_YANG(no_lsp_refresh_interval, no_lsp_refresh_interval_cmd,
715 "no lsp-refresh-interval [level-1|level-2]$level [(1-65235)]",
716 NO_STR
717 "LSP refresh interval\n"
718 "LSP refresh interval for Level 1 only\n"
719 "LSP refresh interval for Level 2 only\n"
720 "LSP refresh interval in seconds\n")
721{
722 if (!level || strmatch(level, "level-1"))
723 nb_cli_enqueue_change(vty,
724 "./lsp/timers/level-1/refresh-interval",
725 NB_OP_MODIFY, NULL);
726 if (!level || strmatch(level, "level-2"))
727 nb_cli_enqueue_change(vty,
728 "./lsp/timers/level-2/refresh-interval",
729 NB_OP_MODIFY, NULL);
730
731 return nb_cli_apply_changes(vty, NULL);
732}
733
734/*
735 * XPath: /frr-isisd:isis/instance/lsp/timers/level-1/maximum-lifetime
736 * XPath: /frr-isisd:isis/instance/lsp/timers/level-1/maximum-lifetime
737 */
738
739DEFPY_YANG(max_lsp_lifetime, max_lsp_lifetime_cmd,
740 "max-lsp-lifetime [level-1|level-2]$level (350-65535)$val",
741 "Maximum LSP lifetime\n"
742 "Maximum LSP lifetime for Level 1 only\n"
743 "Maximum LSP lifetime for Level 2 only\n"
744 "LSP lifetime in seconds\n")
745{
746 if (!level || strmatch(level, "level-1"))
747 nb_cli_enqueue_change(vty,
748 "./lsp/timers/level-1/maximum-lifetime",
749 NB_OP_MODIFY, val_str);
750 if (!level || strmatch(level, "level-2"))
751 nb_cli_enqueue_change(vty,
752 "./lsp/timers/level-2/maximum-lifetime",
753 NB_OP_MODIFY, val_str);
754
755 return nb_cli_apply_changes(vty, NULL);
756}
757
758DEFPY_YANG(no_max_lsp_lifetime, no_max_lsp_lifetime_cmd,
759 "no max-lsp-lifetime [level-1|level-2]$level [(350-65535)]",
760 NO_STR
761 "Maximum LSP lifetime\n"
762 "Maximum LSP lifetime for Level 1 only\n"
763 "Maximum LSP lifetime for Level 2 only\n"
764 "LSP lifetime in seconds\n")
765{
766 if (!level || strmatch(level, "level-1"))
767 nb_cli_enqueue_change(vty,
768 "./lsp/timers/level-1/maximum-lifetime",
769 NB_OP_MODIFY, NULL);
770 if (!level || strmatch(level, "level-2"))
771 nb_cli_enqueue_change(vty,
772 "./lsp/timers/level-2/maximum-lifetime",
773 NB_OP_MODIFY, NULL);
774
775 return nb_cli_apply_changes(vty, NULL);
776}
777
778/* unified LSP timers command
779 * XPath: /frr-isisd:isis/instance/lsp/timers
780 */
781
782DEFPY_YANG(lsp_timers, lsp_timers_cmd,
783 "lsp-timers [level-1|level-2]$level gen-interval (1-120)$gen refresh-interval (1-65235)$refresh max-lifetime (350-65535)$lifetime",
784 "LSP-related timers\n"
785 "LSP-related timers for Level 1 only\n"
786 "LSP-related timers for Level 2 only\n"
787 "Minimum interval between regenerating same LSP\n"
788 "Generation interval in seconds\n"
789 "LSP refresh interval\n"
790 "LSP refresh interval in seconds\n"
791 "Maximum LSP lifetime\n"
792 "Maximum LSP lifetime in seconds\n")
793{
794 if (!level || strmatch(level, "level-1")) {
795 nb_cli_enqueue_change(
796 vty, "./lsp/timers/level-1/generation-interval",
797 NB_OP_MODIFY, gen_str);
798 nb_cli_enqueue_change(vty,
799 "./lsp/timers/level-1/refresh-interval",
800 NB_OP_MODIFY, refresh_str);
801 nb_cli_enqueue_change(vty,
802 "./lsp/timers/level-1/maximum-lifetime",
803 NB_OP_MODIFY, lifetime_str);
804 }
805 if (!level || strmatch(level, "level-2")) {
806 nb_cli_enqueue_change(
807 vty, "./lsp/timers/level-2/generation-interval",
808 NB_OP_MODIFY, gen_str);
809 nb_cli_enqueue_change(vty,
810 "./lsp/timers/level-2/refresh-interval",
811 NB_OP_MODIFY, refresh_str);
812 nb_cli_enqueue_change(vty,
813 "./lsp/timers/level-2/maximum-lifetime",
814 NB_OP_MODIFY, lifetime_str);
815 }
816
817 return nb_cli_apply_changes(vty, NULL);
818}
819
820DEFPY_YANG(no_lsp_timers, no_lsp_timers_cmd,
821 "no lsp-timers [level-1|level-2]$level [gen-interval (1-120) refresh-interval (1-65235) max-lifetime (350-65535)]",
822 NO_STR
823 "LSP-related timers\n"
824 "LSP-related timers for Level 1 only\n"
825 "LSP-related timers for Level 2 only\n"
826 "Minimum interval between regenerating same LSP\n"
827 "Generation interval in seconds\n"
828 "LSP refresh interval\n"
829 "LSP refresh interval in seconds\n"
830 "Maximum LSP lifetime\n"
831 "Maximum LSP lifetime in seconds\n")
832{
833 if (!level || strmatch(level, "level-1")) {
834 nb_cli_enqueue_change(
835 vty, "./lsp/timers/level-1/generation-interval",
836 NB_OP_MODIFY, NULL);
837 nb_cli_enqueue_change(vty,
838 "./lsp/timers/level-1/refresh-interval",
839 NB_OP_MODIFY, NULL);
840 nb_cli_enqueue_change(vty,
841 "./lsp/timers/level-1/maximum-lifetime",
842 NB_OP_MODIFY, NULL);
843 }
844 if (!level || strmatch(level, "level-2")) {
845 nb_cli_enqueue_change(
846 vty, "./lsp/timers/level-2/generation-interval",
847 NB_OP_MODIFY, NULL);
848 nb_cli_enqueue_change(vty,
849 "./lsp/timers/level-2/refresh-interval",
850 NB_OP_MODIFY, NULL);
851 nb_cli_enqueue_change(vty,
852 "./lsp/timers/level-2/maximum-lifetime",
853 NB_OP_MODIFY, NULL);
854 }
855
856 return nb_cli_apply_changes(vty, NULL);
857}
858
859void cli_show_isis_lsp_timers(struct vty *vty, const struct lyd_node *dnode,
860 bool show_defaults)
861{
862 const char *l1_refresh =
863 yang_dnode_get_string(dnode, "./level-1/refresh-interval");
864 const char *l2_refresh =
865 yang_dnode_get_string(dnode, "./level-2/refresh-interval");
866 const char *l1_lifetime =
867 yang_dnode_get_string(dnode, "./level-1/maximum-lifetime");
868 const char *l2_lifetime =
869 yang_dnode_get_string(dnode, "./level-2/maximum-lifetime");
870 const char *l1_gen =
871 yang_dnode_get_string(dnode, "./level-1/generation-interval");
872 const char *l2_gen =
873 yang_dnode_get_string(dnode, "./level-2/generation-interval");
874 if (strmatch(l1_refresh, l2_refresh)
875 && strmatch(l1_lifetime, l2_lifetime) && strmatch(l1_gen, l2_gen))
876 vty_out(vty,
877 " lsp-timers gen-interval %s refresh-interval %s max-lifetime %s\n",
878 l1_gen, l1_refresh, l1_lifetime);
879 else {
880 vty_out(vty,
881 " lsp-timers level-1 gen-interval %s refresh-interval %s max-lifetime %s\n",
882 l1_gen, l1_refresh, l1_lifetime);
883 vty_out(vty,
884 " lsp-timers level-2 gen-interval %s refresh-interval %s max-lifetime %s\n",
885 l2_gen, l2_refresh, l2_lifetime);
886 }
887}
888
889/*
890 * XPath: /frr-isisd:isis/instance/lsp/mtu
891 */
892DEFPY_YANG(area_lsp_mtu, area_lsp_mtu_cmd, "lsp-mtu (128-4352)$val",
893 "Configure the maximum size of generated LSPs\n"
894 "Maximum size of generated LSPs\n")
895{
896 nb_cli_enqueue_change(vty, "./lsp/mtu", NB_OP_MODIFY, val_str);
897
898 return nb_cli_apply_changes(vty, NULL);
899}
900
901DEFPY_YANG(no_area_lsp_mtu, no_area_lsp_mtu_cmd, "no lsp-mtu [(128-4352)]",
902 NO_STR
903 "Configure the maximum size of generated LSPs\n"
904 "Maximum size of generated LSPs\n")
905{
906 nb_cli_enqueue_change(vty, "./lsp/mtu", NB_OP_MODIFY, NULL);
907
908 return nb_cli_apply_changes(vty, NULL);
909}
910
911void cli_show_isis_lsp_mtu(struct vty *vty, const struct lyd_node *dnode,
912 bool show_defaults)
913{
914 vty_out(vty, " lsp-mtu %s\n", yang_dnode_get_string(dnode, NULL));
915}
916
917/*
918 * XPath: /frr-isisd:isis/instance/advertise-passive-only
919 */
920DEFPY_YANG(advertise_passive_only, advertise_passive_only_cmd,
921 "[no] advertise-passive-only",
922 NO_STR "Advertise prefixes of passive interfaces only\n")
923{
924 nb_cli_enqueue_change(vty, "./advertise-passive-only", NB_OP_MODIFY,
925 no ? "false" : "true");
926
927 return nb_cli_apply_changes(vty, NULL);
928}
929
930void cli_show_advertise_passive_only(struct vty *vty,
931 const struct lyd_node *dnode,
932 bool show_defaults)
933{
934 if (!yang_dnode_get_bool(dnode, NULL))
935 vty_out(vty, " no");
936
937 vty_out(vty, " advertise-passive-only\n");
938}
939
940/*
941 * XPath: /frr-isisd:isis/instance/spf/minimum-interval
942 */
943DEFPY_YANG(spf_interval, spf_interval_cmd,
944 "spf-interval [level-1|level-2]$level (1-120)$val",
945 "Minimum interval between SPF calculations\n"
946 "Set interval for level 1 only\n"
947 "Set interval for level 2 only\n"
948 "Minimum interval between consecutive SPFs in seconds\n")
949{
950 if (!level || strmatch(level, "level-1"))
951 nb_cli_enqueue_change(vty, "./spf/minimum-interval/level-1",
952 NB_OP_MODIFY, val_str);
953 if (!level || strmatch(level, "level-2"))
954 nb_cli_enqueue_change(vty, "./spf/minimum-interval/level-2",
955 NB_OP_MODIFY, val_str);
956
957 return nb_cli_apply_changes(vty, NULL);
958}
959
960DEFPY_YANG(no_spf_interval, no_spf_interval_cmd,
961 "no spf-interval [level-1|level-2]$level [(1-120)]",
962 NO_STR
963 "Minimum interval between SPF calculations\n"
964 "Set interval for level 1 only\n"
965 "Set interval for level 2 only\n"
966 "Minimum interval between consecutive SPFs in seconds\n")
967{
968 if (!level || strmatch(level, "level-1"))
969 nb_cli_enqueue_change(vty, "./spf/minimum-interval/level-1",
970 NB_OP_MODIFY, NULL);
971 if (!level || strmatch(level, "level-2"))
972 nb_cli_enqueue_change(vty, "./spf/minimum-interval/level-2",
973 NB_OP_MODIFY, NULL);
974
975 return nb_cli_apply_changes(vty, NULL);
976}
977
978void cli_show_isis_spf_min_interval(struct vty *vty,
979 const struct lyd_node *dnode,
980 bool show_defaults)
981{
982 const char *l1 = yang_dnode_get_string(dnode, "./level-1");
983 const char *l2 = yang_dnode_get_string(dnode, "./level-2");
984
985 if (strmatch(l1, l2))
986 vty_out(vty, " spf-interval %s\n", l1);
987 else {
988 vty_out(vty, " spf-interval level-1 %s\n", l1);
989 vty_out(vty, " spf-interval level-2 %s\n", l2);
990 }
991}
992
993/*
994 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay
995 */
996DEFPY_YANG(spf_delay_ietf, spf_delay_ietf_cmd,
997 "spf-delay-ietf init-delay (0-60000) short-delay (0-60000) long-delay (0-60000) holddown (0-60000) time-to-learn (0-60000)",
998 "IETF SPF delay algorithm\n"
999 "Delay used while in QUIET state\n"
1000 "Delay used while in QUIET state in milliseconds\n"
1001 "Delay used while in SHORT_WAIT state\n"
1002 "Delay used while in SHORT_WAIT state in milliseconds\n"
1003 "Delay used while in LONG_WAIT\n"
1004 "Delay used while in LONG_WAIT state in milliseconds\n"
1005 "Time with no received IGP events before considering IGP stable\n"
1006 "Time with no received IGP events before considering IGP stable (in milliseconds)\n"
1007 "Maximum duration needed to learn all the events related to a single failure\n"
1008 "Maximum duration needed to learn all the events related to a single failure (in milliseconds)\n")
1009{
1010 nb_cli_enqueue_change(vty, "./spf/ietf-backoff-delay", NB_OP_CREATE,
1011 NULL);
1012 nb_cli_enqueue_change(vty, "./spf/ietf-backoff-delay/init-delay",
1013 NB_OP_MODIFY, init_delay_str);
1014 nb_cli_enqueue_change(vty, "./spf/ietf-backoff-delay/short-delay",
1015 NB_OP_MODIFY, short_delay_str);
1016 nb_cli_enqueue_change(vty, "./spf/ietf-backoff-delay/long-delay",
1017 NB_OP_MODIFY, long_delay_str);
1018 nb_cli_enqueue_change(vty, "./spf/ietf-backoff-delay/hold-down",
1019 NB_OP_MODIFY, holddown_str);
1020 nb_cli_enqueue_change(vty, "./spf/ietf-backoff-delay/time-to-learn",
1021 NB_OP_MODIFY, time_to_learn_str);
1022
1023 return nb_cli_apply_changes(vty, NULL);
1024}
1025
1026DEFPY_YANG(no_spf_delay_ietf, no_spf_delay_ietf_cmd,
1027 "no spf-delay-ietf [init-delay (0-60000) short-delay (0-60000) long-delay (0-60000) holddown (0-60000) time-to-learn (0-60000)]",
1028 NO_STR
1029 "IETF SPF delay algorithm\n"
1030 "Delay used while in QUIET state\n"
1031 "Delay used while in QUIET state in milliseconds\n"
1032 "Delay used while in SHORT_WAIT state\n"
1033 "Delay used while in SHORT_WAIT state in milliseconds\n"
1034 "Delay used while in LONG_WAIT\n"
1035 "Delay used while in LONG_WAIT state in milliseconds\n"
1036 "Time with no received IGP events before considering IGP stable\n"
1037 "Time with no received IGP events before considering IGP stable (in milliseconds)\n"
1038 "Maximum duration needed to learn all the events related to a single failure\n"
1039 "Maximum duration needed to learn all the events related to a single failure (in milliseconds)\n")
1040{
1041 nb_cli_enqueue_change(vty, "./spf/ietf-backoff-delay", NB_OP_DESTROY,
1042 NULL);
1043
1044 return nb_cli_apply_changes(vty, NULL);
1045}
1046
1047void cli_show_isis_spf_ietf_backoff(struct vty *vty,
1048 const struct lyd_node *dnode,
1049 bool show_defaults)
1050{
1051 vty_out(vty,
1052 " spf-delay-ietf init-delay %s short-delay %s long-delay %s holddown %s time-to-learn %s\n",
1053 yang_dnode_get_string(dnode, "./init-delay"),
1054 yang_dnode_get_string(dnode, "./short-delay"),
1055 yang_dnode_get_string(dnode, "./long-delay"),
1056 yang_dnode_get_string(dnode, "./hold-down"),
1057 yang_dnode_get_string(dnode, "./time-to-learn"));
1058}
1059
1060/*
1061 * XPath: /frr-isisd:isis/instance/spf/prefix-priorities/medium/access-list-name
1062 */
1063DEFPY_YANG(spf_prefix_priority, spf_prefix_priority_cmd,
1064 "spf prefix-priority <critical|high|medium>$priority ACCESSLIST_NAME$acl_name",
1065 "SPF configuration\n"
1066 "Configure a prefix priority list\n"
1067 "Specify critical priority prefixes\n"
1068 "Specify high priority prefixes\n"
1069 "Specify medium priority prefixes\n"
1070 "Access-list name\n")
1071{
1072 char xpath[XPATH_MAXLEN];
1073
1074 snprintf(xpath, XPATH_MAXLEN,
1075 "./spf/prefix-priorities/%s/access-list-name", priority);
1076 nb_cli_enqueue_change(vty, xpath, NB_OP_CREATE, acl_name);
1077
1078 return nb_cli_apply_changes(vty, NULL);
1079}
1080
1081DEFPY_YANG(no_spf_prefix_priority, no_spf_prefix_priority_cmd,
1082 "no spf prefix-priority <critical|high|medium>$priority [ACCESSLIST_NAME]",
1083 NO_STR
1084 "SPF configuration\n"
1085 "Configure a prefix priority list\n"
1086 "Specify critical priority prefixes\n"
1087 "Specify high priority prefixes\n"
1088 "Specify medium priority prefixes\n"
1089 "Access-list name\n")
1090{
1091 char xpath[XPATH_MAXLEN];
1092
1093 snprintf(xpath, XPATH_MAXLEN,
1094 "./spf/prefix-priorities/%s/access-list-name", priority);
1095 nb_cli_enqueue_change(vty, xpath, NB_OP_DESTROY, NULL);
1096
1097 return nb_cli_apply_changes(vty, NULL);
1098}
1099
1100void cli_show_isis_spf_prefix_priority(struct vty *vty,
1101 const struct lyd_node *dnode,
1102 bool show_defaults)
1103{
1104 vty_out(vty, " spf prefix-priority %s %s\n",
1105 dnode->parent->schema->name,
1106 yang_dnode_get_string(dnode, NULL));
1107}
1108
1109/*
1110 * XPath: /frr-isisd:isis/instance/purge-originator
1111 */
1112DEFPY_YANG(area_purge_originator, area_purge_originator_cmd, "[no] purge-originator",
1113 NO_STR "Use the RFC 6232 purge-originator\n")
1114{
1115 nb_cli_enqueue_change(vty, "./purge-originator", NB_OP_MODIFY,
1116 no ? "false" : "true");
1117
1118 return nb_cli_apply_changes(vty, NULL);
1119}
1120
1121void cli_show_isis_purge_origin(struct vty *vty, const struct lyd_node *dnode,
1122 bool show_defaults)
1123{
1124 if (!yang_dnode_get_bool(dnode, NULL))
1125 vty_out(vty, " no");
1126 vty_out(vty, " purge-originator\n");
1127}
1128
1129/*
1130 * XPath: /frr-isisd:isis/instance/mpls-te
1131 */
1132DEFPY_YANG(isis_mpls_te_on, isis_mpls_te_on_cmd, "mpls-te on",
1133 MPLS_TE_STR "Enable the MPLS-TE functionality\n")
1134{
1135 nb_cli_enqueue_change(vty, "./mpls-te", NB_OP_CREATE,
1136 NULL);
1137
1138 return nb_cli_apply_changes(vty, NULL);
1139}
1140
1141DEFPY_YANG(no_isis_mpls_te_on, no_isis_mpls_te_on_cmd, "no mpls-te [on]",
1142 NO_STR
1143 "Disable the MPLS-TE functionality\n"
1144 "Disable the MPLS-TE functionality\n")
1145{
1146 nb_cli_enqueue_change(vty, "./mpls-te", NB_OP_DESTROY,
1147 NULL);
1148
1149 return nb_cli_apply_changes(vty, NULL);
1150}
1151
1152void cli_show_isis_mpls_te(struct vty *vty, const struct lyd_node *dnode,
1153 bool show_defaults)
1154{
1155 vty_out(vty, " mpls-te on\n");
1156}
1157
1158/*
1159 * XPath: /frr-isisd:isis/instance/mpls-te/router-address
1160 */
1161DEFPY_YANG(isis_mpls_te_router_addr, isis_mpls_te_router_addr_cmd,
1162 "mpls-te router-address A.B.C.D",
1163 MPLS_TE_STR
1164 "Stable IP address of the advertising router\n"
1165 "MPLS-TE router address in IPv4 address format\n")
1166{
1167 nb_cli_enqueue_change(vty, "./mpls-te/router-address",
1168 NB_OP_MODIFY, router_address_str);
1169
1170 return nb_cli_apply_changes(vty, NULL);
1171}
1172
1173DEFPY_YANG(no_isis_mpls_te_router_addr, no_isis_mpls_te_router_addr_cmd,
1174 "no mpls-te router-address [A.B.C.D]",
1175 NO_STR MPLS_TE_STR
1176 "Delete IP address of the advertising router\n"
1177 "MPLS-TE router address in IPv4 address format\n")
1178{
1179 nb_cli_enqueue_change(vty, "./mpls-te/router-address",
1180 NB_OP_DESTROY, NULL);
1181
1182 return nb_cli_apply_changes(vty, NULL);
1183}
1184
1185void cli_show_isis_mpls_te_router_addr(struct vty *vty,
1186 const struct lyd_node *dnode,
1187 bool show_defaults)
1188{
1189 vty_out(vty, " mpls-te router-address %s\n",
1190 yang_dnode_get_string(dnode, NULL));
1191}
1192
1193/*
1194 * XPath: /frr-isisd:isis/instance/mpls-te/router-address-v6
1195 */
1196DEFPY_YANG(isis_mpls_te_router_addr_v6, isis_mpls_te_router_addr_v6_cmd,
1197 "mpls-te router-address ipv6 X:X::X:X",
1198 MPLS_TE_STR
1199 "Stable IP address of the advertising router\n"
1200 "IPv6 address\n"
1201 "MPLS-TE router address in IPv6 address format\n")
1202{
1203 nb_cli_enqueue_change(vty, "./mpls-te/router-address-v6", NB_OP_MODIFY,
1204 ipv6_str);
1205
1206 return nb_cli_apply_changes(vty, NULL);
1207}
1208
1209DEFPY_YANG(no_isis_mpls_te_router_addr_v6, no_isis_mpls_te_router_addr_v6_cmd,
1210 "no mpls-te router-address ipv6 [X:X::X:X]",
1211 NO_STR MPLS_TE_STR
1212 "Delete IP address of the advertising router\n"
1213 "IPv6 address\n"
1214 "MPLS-TE router address in IPv6 address format\n")
1215{
1216 nb_cli_enqueue_change(vty, "./mpls-te/router-address-v6", NB_OP_DESTROY,
1217 NULL);
1218
1219 return nb_cli_apply_changes(vty, NULL);
1220}
1221
1222void cli_show_isis_mpls_te_router_addr_ipv6(struct vty *vty,
1223 const struct lyd_node *dnode,
1224 bool show_defaults)
1225{
1226 vty_out(vty, " mpls-te router-address ipv6 %s\n",
1227 yang_dnode_get_string(dnode, NULL));
1228}
1229
1230DEFPY_YANG(isis_mpls_te_inter_as, isis_mpls_te_inter_as_cmd,
1231 "[no] mpls-te inter-as [level-1|level-1-2|level-2-only]",
1232 NO_STR MPLS_TE_STR
1233 "Configure MPLS-TE Inter-AS support\n"
1234 "AREA native mode self originate INTER-AS LSP with L1 only flooding scope\n"
1235 "AREA native mode self originate INTER-AS LSP with L1 and L2 flooding scope\n"
1236 "AS native mode self originate INTER-AS LSP with L2 only flooding scope\n")
1237{
1238 vty_out(vty, "MPLS-TE Inter-AS is not yet supported\n");
1239 return CMD_SUCCESS;
1240}
1241
1242/*
1243 * XPath: /frr-isisd:isis/instance/mpls-te/export
1244 */
1245DEFPY_YANG(isis_mpls_te_export, isis_mpls_te_export_cmd, "mpls-te export",
1246 MPLS_TE_STR "Enable export of MPLS-TE Link State information\n")
1247{
1248 nb_cli_enqueue_change(vty, "./mpls-te/export", NB_OP_MODIFY, "true");
1249
1250 return nb_cli_apply_changes(vty, NULL);
1251}
1252
1253DEFPY_YANG(no_isis_mpls_te_export, no_isis_mpls_te_export_cmd,
1254 "no mpls-te export",
1255 NO_STR MPLS_TE_STR
1256 "Disable export of MPLS-TE Link State information\n")
1257{
1258 nb_cli_enqueue_change(vty, "./mpls-te/export", NB_OP_MODIFY, "false");
1259
1260 return nb_cli_apply_changes(vty, NULL);
1261}
1262
1263void cli_show_isis_mpls_te_export(struct vty *vty, const struct lyd_node *dnode,
1264 bool show_defaults)
1265{
1266 if (!yang_dnode_get_bool(dnode, NULL))
1267 vty_out(vty, " no");
1268
1269 vty_out(vty, " mpls-te export\n");
1270}
1271
1272/*
1273 * XPath: /frr-isisd:isis/instance/default-information-originate
1274 */
1275DEFPY_YANG(isis_default_originate, isis_default_originate_cmd,
1276 "[no] default-information originate <ipv4|ipv6>$ip <level-1|level-2>$level [always]$always [{metric (0-16777215)$metric|route-map RMAP_NAME$rmap}]",
1277 NO_STR
1278 "Control distribution of default information\n"
1279 "Distribute a default route\n"
1280 "Distribute default route for IPv4\n"
1281 "Distribute default route for IPv6\n"
1282 "Distribute default route into level-1\n"
1283 "Distribute default route into level-2\n"
1284 "Always advertise default route\n"
1285 "Metric for default route\n"
1286 "IS-IS default metric\n"
1287 "Route map reference\n"
1288 "Pointer to route-map entries\n")
1289{
1290 if (no)
1291 nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL);
1292 else {
1293 nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL);
1294 nb_cli_enqueue_change(vty, "./always", NB_OP_MODIFY,
1295 always ? "true" : "false");
1296 nb_cli_enqueue_change(vty, "./route-map",
1297 rmap ? NB_OP_MODIFY : NB_OP_DESTROY,
1298 rmap ? rmap : NULL);
1299 nb_cli_enqueue_change(vty, "./metric", NB_OP_MODIFY,
1300 metric_str ? metric_str : NULL);
1301 if (strmatch(ip, "ipv6") && !always) {
1302 vty_out(vty,
1303 "Zebra doesn't implement default-originate for IPv6 yet\n");
1304 vty_out(vty,
1305 "so use with care or use default-originate always.\n");
1306 }
1307 }
1308
1309 return nb_cli_apply_changes(
1310 vty, "./default-information-originate/%s[level='%s']", ip,
1311 level);
1312}
1313
1314static void vty_print_def_origin(struct vty *vty, const struct lyd_node *dnode,
1315 const char *family, const char *level,
1316 bool show_defaults)
1317{
1318 vty_out(vty, " default-information originate %s %s", family, level);
1319 if (yang_dnode_get_bool(dnode, "./always"))
1320 vty_out(vty, " always");
1321
1322 if (yang_dnode_exists(dnode, "./route-map"))
1323 vty_out(vty, " route-map %s",
1324 yang_dnode_get_string(dnode, "./route-map"));
1325 if (show_defaults || !yang_dnode_is_default(dnode, "./metric"))
1326 vty_out(vty, " metric %s",
1327 yang_dnode_get_string(dnode, "./metric"));
1328
1329 vty_out(vty, "\n");
1330}
1331
1332void cli_show_isis_def_origin_ipv4(struct vty *vty,
1333 const struct lyd_node *dnode,
1334 bool show_defaults)
1335{
1336 const char *level = yang_dnode_get_string(dnode, "./level");
1337
1338 vty_print_def_origin(vty, dnode, "ipv4", level, show_defaults);
1339}
1340
1341void cli_show_isis_def_origin_ipv6(struct vty *vty,
1342 const struct lyd_node *dnode,
1343 bool show_defaults)
1344{
1345 const char *level = yang_dnode_get_string(dnode, "./level");
1346
1347 vty_print_def_origin(vty, dnode, "ipv6", level, show_defaults);
1348}
1349
1350/*
1351 * XPath: /frr-isisd:isis/instance/redistribute
1352 */
1353DEFPY_YANG(isis_redistribute, isis_redistribute_cmd,
1354 "[no] redistribute <ipv4$ip " PROTO_IP_REDIST_STR "$proto|ipv6$ip "
1355 PROTO_IP6_REDIST_STR "$proto> <level-1|level-2>$level"
1356 "[{metric (0-16777215)|route-map RMAP_NAME$route_map}]",
1357 NO_STR REDIST_STR
1358 "Redistribute IPv4 routes\n"
1359 PROTO_IP_REDIST_HELP
1360 "Redistribute IPv6 routes\n"
1361 PROTO_IP6_REDIST_HELP
1362 "Redistribute into level-1\n"
1363 "Redistribute into level-2\n"
1364 "Metric for redistributed routes\n"
1365 "IS-IS default metric\n"
1366 "Route map reference\n"
1367 "Pointer to route-map entries\n")
1368{
1369 if (no)
1370 nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL);
1371 else {
1372 nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL);
1373 nb_cli_enqueue_change(vty, "./route-map",
1374 route_map ? NB_OP_MODIFY : NB_OP_DESTROY,
1375 route_map ? route_map : NULL);
1376 nb_cli_enqueue_change(vty, "./metric", NB_OP_MODIFY,
1377 metric_str ? metric_str : NULL);
1378 }
1379
1380 return nb_cli_apply_changes(
1381 vty, "./redistribute/%s[protocol='%s'][level='%s']", ip, proto,
1382 level);
1383}
1384
1385static void vty_print_redistribute(struct vty *vty,
1386 const struct lyd_node *dnode,
1387 bool show_defaults, const char *family)
1388{
1389 const char *level = yang_dnode_get_string(dnode, "./level");
1390 const char *protocol = yang_dnode_get_string(dnode, "./protocol");
1391
1392 vty_out(vty, " redistribute %s %s %s", family, protocol, level);
1393 if (show_defaults || !yang_dnode_is_default(dnode, "./metric"))
1394 vty_out(vty, " metric %s",
1395 yang_dnode_get_string(dnode, "./metric"));
1396 if (yang_dnode_exists(dnode, "./route-map"))
1397 vty_out(vty, " route-map %s",
1398 yang_dnode_get_string(dnode, "./route-map"));
1399 vty_out(vty, "\n");
1400}
1401
1402void cli_show_isis_redistribute_ipv4(struct vty *vty,
1403 const struct lyd_node *dnode,
1404 bool show_defaults)
1405{
1406 vty_print_redistribute(vty, dnode, show_defaults, "ipv4");
1407}
1408void cli_show_isis_redistribute_ipv6(struct vty *vty,
1409 const struct lyd_node *dnode,
1410 bool show_defaults)
1411{
1412 vty_print_redistribute(vty, dnode, show_defaults, "ipv6");
1413}
1414
1415/*
1416 * XPath: /frr-isisd:isis/instance/multi-topology
1417 */
1418DEFPY_YANG(
1419 isis_topology, isis_topology_cmd,
1420 "[no] topology <standard|ipv4-unicast|ipv4-mgmt|ipv6-unicast|ipv4-multicast|ipv6-multicast|ipv6-mgmt|ipv6-dstsrc>$topology [overload]$overload",
1421 NO_STR
1422 "Configure IS-IS topologies\n"
1423 "standard topology\n"
1424 "IPv4 unicast topology\n"
1425 "IPv4 management topology\n"
1426 "IPv6 unicast topology\n"
1427 "IPv4 multicast topology\n"
1428 "IPv6 multicast topology\n"
1429 "IPv6 management topology\n"
1430 "IPv6 dst-src topology\n"
1431 "Set overload bit for topology\n")
1432{
1433 char base_xpath[XPATH_MAXLEN];
1434
1435 /* Since standard is not configurable it is not present in the
1436 * YANG model, so we need to validate it here
1437 */
1438 if (strmatch(topology, "standard") ||
1439 strmatch(topology, "ipv4-unicast")) {
1440 vty_out(vty,
1441 "Cannot configure IPv4 unicast (Standard) topology\n");
1442 return CMD_WARNING_CONFIG_FAILED;
1443 }
1444
1445 if (strmatch(topology, "ipv4-mgmt"))
1446 snprintf(base_xpath, XPATH_MAXLEN,
1447 "./multi-topology/ipv4-management");
1448 else if (strmatch(topology, "ipv6-mgmt"))
1449 snprintf(base_xpath, XPATH_MAXLEN,
1450 "./multi-topology/ipv6-management");
1451 else
1452 snprintf(base_xpath, XPATH_MAXLEN, "./multi-topology/%s",
1453 topology);
1454
1455 if (no)
1456 nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL);
1457 else {
1458 nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL);
1459 nb_cli_enqueue_change(vty, "./overload", NB_OP_MODIFY,
1460 overload ? "true" : "false");
1461 }
1462
1463 return nb_cli_apply_changes(vty, "%s", base_xpath);
1464}
1465
1466void cli_show_isis_mt_ipv4_multicast(struct vty *vty,
1467 const struct lyd_node *dnode,
1468 bool show_defaults)
1469{
1470 vty_out(vty, " topology ipv4-multicast");
1471 if (yang_dnode_get_bool(dnode, "./overload"))
1472 vty_out(vty, " overload");
1473 vty_out(vty, "\n");
1474}
1475
1476void cli_show_isis_mt_ipv4_mgmt(struct vty *vty, const struct lyd_node *dnode,
1477 bool show_defaults)
1478{
1479 vty_out(vty, " topology ipv4-mgmt");
1480 if (yang_dnode_get_bool(dnode, "./overload"))
1481 vty_out(vty, " overload");
1482 vty_out(vty, "\n");
1483}
1484
1485void cli_show_isis_mt_ipv6_unicast(struct vty *vty,
1486 const struct lyd_node *dnode,
1487 bool show_defaults)
1488{
1489 vty_out(vty, " topology ipv6-unicast");
1490 if (yang_dnode_get_bool(dnode, "./overload"))
1491 vty_out(vty, " overload");
1492 vty_out(vty, "\n");
1493}
1494
1495void cli_show_isis_mt_ipv6_multicast(struct vty *vty,
1496 const struct lyd_node *dnode,
1497 bool show_defaults)
1498{
1499 vty_out(vty, " topology ipv6-multicast");
1500 if (yang_dnode_get_bool(dnode, "./overload"))
1501 vty_out(vty, " overload");
1502 vty_out(vty, "\n");
1503}
1504
1505void cli_show_isis_mt_ipv6_mgmt(struct vty *vty, const struct lyd_node *dnode,
1506 bool show_defaults)
1507{
1508 vty_out(vty, " topology ipv6-mgmt");
1509 if (yang_dnode_get_bool(dnode, "./overload"))
1510 vty_out(vty, " overload");
1511 vty_out(vty, "\n");
1512}
1513
1514void cli_show_isis_mt_ipv6_dstsrc(struct vty *vty, const struct lyd_node *dnode,
1515 bool show_defaults)
1516{
1517 vty_out(vty, " topology ipv6-dstsrc");
1518 if (yang_dnode_get_bool(dnode, "./overload"))
1519 vty_out(vty, " overload");
1520 vty_out(vty, "\n");
1521}
1522
1523/*
1524 * XPath: /frr-isisd:isis/instance/segment-routing/enabled
1525 */
1526DEFPY_YANG (isis_sr_enable,
1527 isis_sr_enable_cmd,
1528 "segment-routing on",
1529 SR_STR
1530 "Enable Segment Routing\n")
1531{
1532 nb_cli_enqueue_change(vty, "./segment-routing/enabled", NB_OP_MODIFY,
1533 "true");
1534
1535 return nb_cli_apply_changes(vty, NULL);
1536}
1537
1538DEFPY_YANG (no_isis_sr_enable,
1539 no_isis_sr_enable_cmd,
1540 "no segment-routing [on]",
1541 NO_STR
1542 SR_STR
1543 "Disable Segment Routing\n")
1544{
1545 nb_cli_enqueue_change(vty, "./segment-routing/enabled", NB_OP_MODIFY,
1546 "false");
1547
1548 return nb_cli_apply_changes(vty, NULL);
1549}
1550
1551void cli_show_isis_sr_enabled(struct vty *vty, const struct lyd_node *dnode,
1552 bool show_defaults)
1553{
1554 if (!yang_dnode_get_bool(dnode, NULL))
1555 vty_out(vty, " no");
1556
1557 vty_out(vty, " segment-routing on\n");
1558}
1559
1560/*
1561 * XPath: /frr-isisd:isis/instance/segment-routing/label-block
1562 */
1563
1564DEFPY_YANG(
1565 isis_sr_global_block_label_range, isis_sr_global_block_label_range_cmd,
1566 "segment-routing global-block (16-1048575)$gb_lower_bound (16-1048575)$gb_upper_bound [local-block (16-1048575)$lb_lower_bound (16-1048575)$lb_upper_bound]",
1567 SR_STR
1568 "Segment Routing Global Block label range\n"
1569 "The lower bound of the global block\n"
1570 "The upper bound of the global block (block size may not exceed 65535)\n"
1571 "Segment Routing Local Block label range\n"
1572 "The lower bound of the local block\n"
1573 "The upper bound of the local block (block size may not exceed 65535)\n")
1574{
1575 nb_cli_enqueue_change(vty,
1576 "./segment-routing/label-blocks/srgb/lower-bound",
1577 NB_OP_MODIFY, gb_lower_bound_str);
1578 nb_cli_enqueue_change(vty,
1579 "./segment-routing/label-blocks/srgb/upper-bound",
1580 NB_OP_MODIFY, gb_upper_bound_str);
1581
1582 nb_cli_enqueue_change(
1583 vty, "./segment-routing/label-blocks/srlb/lower-bound",
1584 NB_OP_MODIFY, lb_lower_bound ? lb_lower_bound_str : NULL);
1585 nb_cli_enqueue_change(
1586 vty, "./segment-routing/label-blocks/srlb/upper-bound",
1587 NB_OP_MODIFY, lb_upper_bound ? lb_upper_bound_str : NULL);
1588
1589 return nb_cli_apply_changes(vty, NULL);
1590}
1591
1592DEFPY_YANG(no_isis_sr_global_block_label_range,
1593 no_isis_sr_global_block_label_range_cmd,
1594 "no segment-routing global-block [(16-1048575) (16-1048575) local-block (16-1048575) (16-1048575)]",
1595 NO_STR SR_STR
1596 "Segment Routing Global Block label range\n"
1597 "The lower bound of the global block\n"
1598 "The upper bound of the global block (block size may not exceed 65535)\n"
1599 "Segment Routing Local Block label range\n"
1600 "The lower bound of the local block\n"
1601 "The upper bound of the local block (block size may not exceed 65535)\n")
1602{
1603 nb_cli_enqueue_change(vty,
1604 "./segment-routing/label-blocks/srgb/lower-bound",
1605 NB_OP_MODIFY, NULL);
1606 nb_cli_enqueue_change(vty,
1607 "./segment-routing/label-blocks/srgb/upper-bound",
1608 NB_OP_MODIFY, NULL);
1609 nb_cli_enqueue_change(vty,
1610 "./segment-routing/label-blocks/srlb/lower-bound",
1611 NB_OP_MODIFY, NULL);
1612 nb_cli_enqueue_change(vty,
1613 "./segment-routing/label-blocks/srlb/upper-bound",
1614 NB_OP_MODIFY, NULL);
1615
1616 return nb_cli_apply_changes(vty, NULL);
1617}
1618
1619void cli_show_isis_label_blocks(struct vty *vty, const struct lyd_node *dnode,
1620 bool show_defaults)
1621{
1622 vty_out(vty, " segment-routing global-block %s %s",
1623 yang_dnode_get_string(dnode, "./srgb/lower-bound"),
1624 yang_dnode_get_string(dnode, "./srgb/upper-bound"));
1625 if (!yang_dnode_is_default(dnode, "./srlb/lower-bound")
1626 || !yang_dnode_is_default(dnode, "./srlb/upper-bound"))
1627 vty_out(vty, " local-block %s %s",
1628 yang_dnode_get_string(dnode, "./srlb/lower-bound"),
1629 yang_dnode_get_string(dnode, "./srlb/upper-bound"));
1630 vty_out(vty, "\n");
1631}
1632
1633/*
1634 * XPath: /frr-isisd:isis/instance/segment-routing/msd/node-msd
1635 */
1636DEFPY_YANG (isis_sr_node_msd,
1637 isis_sr_node_msd_cmd,
1638 "segment-routing node-msd (1-16)$msd",
1639 SR_STR
1640 "Maximum Stack Depth for this router\n"
1641 "Maximum number of label that can be stack (1-16)\n")
1642{
1643 nb_cli_enqueue_change(vty, "./segment-routing/msd/node-msd",
1644 NB_OP_MODIFY, msd_str);
1645
1646 return nb_cli_apply_changes(vty, NULL);
1647}
1648
1649DEFPY_YANG (no_isis_sr_node_msd,
1650 no_isis_sr_node_msd_cmd,
1651 "no segment-routing node-msd [(1-16)]",
1652 NO_STR
1653 SR_STR
1654 "Maximum Stack Depth for this router\n"
1655 "Maximum number of label that can be stack (1-16)\n")
1656{
1657 nb_cli_enqueue_change(vty, "./segment-routing/msd/node-msd",
1658 NB_OP_DESTROY, NULL);
1659
1660 return nb_cli_apply_changes(vty, NULL);
1661}
1662
1663void cli_show_isis_node_msd(struct vty *vty, const struct lyd_node *dnode,
1664 bool show_defaults)
1665{
1666 vty_out(vty, " segment-routing node-msd %s\n",
1667 yang_dnode_get_string(dnode, NULL));
1668}
1669
1670/*
1671 * XPath: /frr-isisd:isis/instance/segment-routing/prefix-sid-map/prefix-sid
1672 */
1673DEFPY_YANG (isis_sr_prefix_sid,
1674 isis_sr_prefix_sid_cmd,
1675 "segment-routing prefix\
1676 <A.B.C.D/M|X:X::X:X/M>$prefix\
1677 <absolute$sid_type (16-1048575)$sid_value|index$sid_type (0-65535)$sid_value>\
1678 [<no-php-flag|explicit-null>$lh_behavior] [n-flag-clear$n_flag_clear]",
1679 SR_STR
1680 "Prefix SID\n"
1681 "IPv4 Prefix\n"
1682 "IPv6 Prefix\n"
1683 "Specify the absolute value of Prefix Segment ID\n"
1684 "The Prefix Segment ID value\n"
1685 "Specify the index of Prefix Segment ID\n"
1686 "The Prefix Segment ID index\n"
1687 "Don't request Penultimate Hop Popping (PHP)\n"
1688 "Upstream neighbor must replace prefix-sid with explicit null label\n"
1689 "Not a node SID\n")
1690{
1691 nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL);
1692 nb_cli_enqueue_change(vty, "./sid-value-type", NB_OP_MODIFY, sid_type);
1693 nb_cli_enqueue_change(vty, "./sid-value", NB_OP_MODIFY, sid_value_str);
1694 if (lh_behavior) {
1695 const char *value;
1696
1697 if (strmatch(lh_behavior, "no-php-flag"))
1698 value = "no-php";
1699 else if (strmatch(lh_behavior, "explicit-null"))
1700 value = "explicit-null";
1701 else
1702 value = "php";
1703
1704 nb_cli_enqueue_change(vty, "./last-hop-behavior", NB_OP_MODIFY,
1705 value);
1706 } else
1707 nb_cli_enqueue_change(vty, "./last-hop-behavior", NB_OP_MODIFY,
1708 NULL);
1709 nb_cli_enqueue_change(vty, "./n-flag-clear", NB_OP_MODIFY,
1710 n_flag_clear ? "true" : "false");
1711
1712 return nb_cli_apply_changes(
1713 vty, "./segment-routing/prefix-sid-map/prefix-sid[prefix='%s']",
1714 prefix_str);
1715}
1716
1717DEFPY_YANG (no_isis_sr_prefix_sid,
1718 no_isis_sr_prefix_sid_cmd,
1719 "no segment-routing prefix <A.B.C.D/M|X:X::X:X/M>$prefix\
1720 [<absolute$sid_type (16-1048575)|index (0-65535)> [<no-php-flag|explicit-null>]]\
1721 [n-flag-clear]",
1722 NO_STR
1723 SR_STR
1724 "Prefix SID\n"
1725 "IPv4 Prefix\n"
1726 "IPv6 Prefix\n"
1727 "Specify the absolute value of Prefix Segment ID\n"
1728 "The Prefix Segment ID value\n"
1729 "Specify the index of Prefix Segment ID\n"
1730 "The Prefix Segment ID index\n"
1731 "Don't request Penultimate Hop Popping (PHP)\n"
1732 "Upstream neighbor must replace prefix-sid with explicit null label\n"
1733 "Not a node SID\n")
1734{
1735 nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL);
1736
1737 return nb_cli_apply_changes(
1738 vty, "./segment-routing/prefix-sid-map/prefix-sid[prefix='%s']",
1739 prefix_str);
1740}
1741
1742void cli_show_isis_prefix_sid(struct vty *vty, const struct lyd_node *dnode,
1743 bool show_defaults)
1744{
1745 const char *prefix;
1746 const char *lh_behavior;
1747 const char *sid_value_type;
1748 const char *sid_value;
1749 bool n_flag_clear;
1750
1751 prefix = yang_dnode_get_string(dnode, "./prefix");
1752 lh_behavior = yang_dnode_get_string(dnode, "./last-hop-behavior");
1753 sid_value_type = yang_dnode_get_string(dnode, "./sid-value-type");
1754 sid_value = yang_dnode_get_string(dnode, "./sid-value");
1755 n_flag_clear = yang_dnode_get_bool(dnode, "./n-flag-clear");
1756
1757 vty_out(vty, " segment-routing prefix %s", prefix);
1758 if (strmatch(sid_value_type, "absolute"))
1759 vty_out(vty, " absolute");
1760 else
1761 vty_out(vty, " index");
1762 vty_out(vty, " %s", sid_value);
1763 if (strmatch(lh_behavior, "no-php"))
1764 vty_out(vty, " no-php-flag");
1765 else if (strmatch(lh_behavior, "explicit-null"))
1766 vty_out(vty, " explicit-null");
1767 if (n_flag_clear)
1768 vty_out(vty, " n-flag-clear");
1769 vty_out(vty, "\n");
1770}
1771
1772
1773/*
1774 * XPath: /frr-isisd:isis/instance/fast-reroute/level-{1,2}/lfa/priority-limit
1775 */
1776DEFPY_YANG (isis_frr_lfa_priority_limit,
1777 isis_frr_lfa_priority_limit_cmd,
1778 "[no] fast-reroute priority-limit <critical|high|medium>$priority [<level-1|level-2>$level]",
1779 NO_STR
1780 "Configure Fast ReRoute\n"
1781 "Limit backup computation up to the prefix priority\n"
1782 "Compute for critical priority prefixes only\n"
1783 "Compute for critical & high priority prefixes\n"
1784 "Compute for critical, high & medium priority prefixes\n"
1785 "Set priority-limit for level-1 only\n"
1786 "Set priority-limit for level-2 only\n")
1787{
1788 if (!level || strmatch(level, "level-1")) {
1789 if (no) {
1790 nb_cli_enqueue_change(
1791 vty,
1792 "./fast-reroute/level-1/lfa/priority-limit",
1793 NB_OP_DESTROY, NULL);
1794 } else {
1795 nb_cli_enqueue_change(
1796 vty,
1797 "./fast-reroute/level-1/lfa/priority-limit",
1798 NB_OP_CREATE, priority);
1799 }
1800 }
1801 if (!level || strmatch(level, "level-2")) {
1802 if (no) {
1803 nb_cli_enqueue_change(
1804 vty,
1805 "./fast-reroute/level-2/lfa/priority-limit",
1806 NB_OP_DESTROY, NULL);
1807 } else {
1808 nb_cli_enqueue_change(
1809 vty,
1810 "./fast-reroute/level-2/lfa/priority-limit",
1811 NB_OP_CREATE, priority);
1812 }
1813 }
1814
1815 return nb_cli_apply_changes(vty, NULL);
1816}
1817
1818void cli_show_isis_frr_lfa_priority_limit(struct vty *vty,
1819 const struct lyd_node *dnode,
1820 bool show_defaults)
1821{
1822 vty_out(vty, " fast-reroute priority-limit %s %s\n",
1823 yang_dnode_get_string(dnode, NULL),
1824 dnode->parent->parent->schema->name);
1825}
1826
1827/*
1828 * XPath: /frr-isisd:isis/instance/fast-reroute/level-{1,2}/lfa/tiebreaker
1829 */
1830DEFPY_YANG (isis_frr_lfa_tiebreaker,
1831 isis_frr_lfa_tiebreaker_cmd,
1832 "[no] fast-reroute lfa\
1833 tiebreaker <downstream|lowest-backup-metric|node-protecting>$type\
1834 index (1-255)$index\
1835 [<level-1|level-2>$level]",
1836 NO_STR
1837 "Configure Fast ReRoute\n"
1838 "LFA configuration\n"
1839 "Configure tiebreaker for multiple backups\n"
1840 "Prefer backup path via downstream node\n"
1841 "Prefer backup path with lowest total metric\n"
1842 "Prefer node protecting backup path\n"
1843 "Set preference order among tiebreakers\n"
1844 "Index\n"
1845 "Configure tiebreaker for level-1 only\n"
1846 "Configure tiebreaker for level-2 only\n")
1847{
1848 char xpath[XPATH_MAXLEN];
1849
1850 if (!level || strmatch(level, "level-1")) {
1851 if (no) {
1852 snprintf(
1853 xpath, XPATH_MAXLEN,
1854 "./fast-reroute/level-1/lfa/tiebreaker[index='%s']",
1855 index_str);
1856 nb_cli_enqueue_change(vty, xpath, NB_OP_DESTROY, NULL);
1857 } else {
1858 snprintf(
1859 xpath, XPATH_MAXLEN,
1860 "./fast-reroute/level-1/lfa/tiebreaker[index='%s']/type",
1861 index_str);
1862 nb_cli_enqueue_change(vty, xpath, NB_OP_CREATE, type);
1863 }
1864 }
1865 if (!level || strmatch(level, "level-2")) {
1866 if (no) {
1867 snprintf(
1868 xpath, XPATH_MAXLEN,
1869 "./fast-reroute/level-2/lfa/tiebreaker[index='%s']",
1870 index_str);
1871 nb_cli_enqueue_change(vty, xpath, NB_OP_DESTROY, NULL);
1872 } else {
1873 snprintf(
1874 xpath, XPATH_MAXLEN,
1875 "./fast-reroute/level-2/lfa/tiebreaker[index='%s']/type",
1876 index_str);
1877 nb_cli_enqueue_change(vty, xpath, NB_OP_CREATE, type);
1878 }
1879 }
1880
1881 return nb_cli_apply_changes(vty, NULL);
1882}
1883
1884void cli_show_isis_frr_lfa_tiebreaker(struct vty *vty,
1885 const struct lyd_node *dnode,
1886 bool show_defaults)
1887{
1888 vty_out(vty, " fast-reroute lfa tiebreaker %s index %s %s\n",
1889 yang_dnode_get_string(dnode, "./type"),
1890 yang_dnode_get_string(dnode, "./index"),
1891 dnode->parent->parent->schema->name);
1892}
1893
1894/*
1895 * XPath: /frr-isisd:isis/instance/fast-reroute/level-{1,2}/lfa/load-sharing
1896 */
1897DEFPY_YANG (isis_frr_lfa_load_sharing,
1898 isis_frr_lfa_load_sharing_cmd,
1899 "[no] fast-reroute load-sharing disable [<level-1|level-2>$level]",
1900 NO_STR
1901 "Configure Fast ReRoute\n"
1902 "Load share prefixes across multiple backups\n"
1903 "Disable load sharing\n"
1904 "Disable load sharing for level-1 only\n"
1905 "Disable load sharing for level-2 only\n")
1906{
1907 if (!level || strmatch(level, "level-1")) {
1908 if (no) {
1909 nb_cli_enqueue_change(
1910 vty, "./fast-reroute/level-1/lfa/load-sharing",
1911 NB_OP_MODIFY, "true");
1912 } else {
1913 nb_cli_enqueue_change(
1914 vty, "./fast-reroute/level-1/lfa/load-sharing",
1915 NB_OP_MODIFY, "false");
1916 }
1917 }
1918 if (!level || strmatch(level, "level-2")) {
1919 if (no) {
1920 nb_cli_enqueue_change(
1921 vty, "./fast-reroute/level-2/lfa/load-sharing",
1922 NB_OP_MODIFY, "true");
1923 } else {
1924 nb_cli_enqueue_change(
1925 vty, "./fast-reroute/level-2/lfa/load-sharing",
1926 NB_OP_MODIFY, "false");
1927 }
1928 }
1929
1930 return nb_cli_apply_changes(vty, NULL);
1931}
1932
1933void cli_show_isis_frr_lfa_load_sharing(struct vty *vty,
1934 const struct lyd_node *dnode,
1935 bool show_defaults)
1936{
1937 if (yang_dnode_get_bool(dnode, NULL))
1938 vty_out(vty, " no");
1939
1940 vty_out(vty, " fast-reroute load-sharing disable %s\n",
1941 dnode->parent->parent->schema->name);
1942}
1943
1944/*
1945 * XPath: /frr-isisd:isis/instance/fast-reroute/level-{1,2}/remote-lfa/prefix-list
1946 */
1947DEFPY_YANG (isis_frr_remote_lfa_plist,
1948 isis_frr_remote_lfa_plist_cmd,
1949 "fast-reroute remote-lfa prefix-list WORD$plist [<level-1|level-2>$level]",
1950 "Configure Fast ReRoute\n"
1951 "Enable remote LFA related configuration\n"
1952 "Filter PQ node router ID based on prefix list\n"
1953 "Prefix-list name\n"
1954 "Enable router ID filtering for level-1 only\n"
1955 "Enable router ID filtering for level-2 only\n")
1956{
1957 if (!level || strmatch(level, "level-1"))
1958 nb_cli_enqueue_change(
1959 vty, "./fast-reroute/level-1/remote-lfa/prefix-list",
1960 NB_OP_MODIFY, plist);
1961 if (!level || strmatch(level, "level-2"))
1962 nb_cli_enqueue_change(
1963 vty, "./fast-reroute/level-2/remote-lfa/prefix-list",
1964 NB_OP_MODIFY, plist);
1965
1966 return nb_cli_apply_changes(vty, NULL);
1967}
1968
1969DEFPY_YANG (no_isis_frr_remote_lfa_plist,
1970 no_isis_frr_remote_lfa_plist_cmd,
1971 "no fast-reroute remote-lfa prefix-list [WORD] [<level-1|level-2>$level]",
1972 NO_STR
1973 "Configure Fast ReRoute\n"
1974 "Enable remote LFA related configuration\n"
1975 "Filter PQ node router ID based on prefix list\n"
1976 "Prefix-list name\n"
1977 "Enable router ID filtering for level-1 only\n"
1978 "Enable router ID filtering for level-2 only\n")
1979{
1980 if (!level || strmatch(level, "level-1"))
1981 nb_cli_enqueue_change(
1982 vty, "./fast-reroute/level-1/remote-lfa/prefix-list",
1983 NB_OP_DESTROY, NULL);
1984 if (!level || strmatch(level, "level-2"))
1985 nb_cli_enqueue_change(
1986 vty, "./fast-reroute/level-2/remote-lfa/prefix-list",
1987 NB_OP_DESTROY, NULL);
1988
1989 return nb_cli_apply_changes(vty, NULL);
1990}
1991
1992void cli_show_isis_frr_remote_lfa_plist(struct vty *vty,
1993 const struct lyd_node *dnode,
1994 bool show_defaults)
1995{
1996 vty_out(vty, " fast-reroute remote-lfa prefix-list %s %s\n",
1997 yang_dnode_get_string(dnode, NULL),
1998 dnode->parent->parent->schema->name);
1999}
2000
2001/*
2002 * XPath: /frr-interface:lib/interface/frr-isisd:isis/passive
2003 */
2004DEFPY_YANG(isis_passive, isis_passive_cmd, "[no] isis passive",
2005 NO_STR
2006 "IS-IS routing protocol\n"
2007 "Configure the passive mode for interface\n")
2008{
2009 nb_cli_enqueue_change(vty, "./frr-isisd:isis/passive", NB_OP_MODIFY,
2010 no ? "false" : "true");
2011
2012 return nb_cli_apply_changes(vty, NULL);
2013}
2014
2015void cli_show_ip_isis_passive(struct vty *vty, const struct lyd_node *dnode,
2016 bool show_defaults)
2017{
2018 if (!yang_dnode_get_bool(dnode, NULL))
2019 vty_out(vty, " no");
2020 vty_out(vty, " isis passive\n");
2021}
2022
2023/*
2024 * XPath: /frr-interface:lib/interface/frr-isisd:isis/password
2025 */
2026
2027DEFPY_YANG(isis_passwd, isis_passwd_cmd, "isis password <md5|clear>$type WORD$pwd",
2028 "IS-IS routing protocol\n"
2029 "Configure the authentication password for a circuit\n"
2030 "HMAC-MD5 authentication\n"
2031 "Cleartext password\n"
2032 "Circuit password\n")
2033{
2034 nb_cli_enqueue_change(vty, "./frr-isisd:isis/password", NB_OP_CREATE,
2035 NULL);
2036 nb_cli_enqueue_change(vty, "./frr-isisd:isis/password/password",
2037 NB_OP_MODIFY, pwd);
2038 nb_cli_enqueue_change(vty, "./frr-isisd:isis/password/password-type",
2039 NB_OP_MODIFY, type);
2040
2041 return nb_cli_apply_changes(vty, NULL);
2042}
2043
2044DEFPY_YANG(no_isis_passwd, no_isis_passwd_cmd, "no isis password [<md5|clear> WORD]",
2045 NO_STR
2046 "IS-IS routing protocol\n"
2047 "Configure the authentication password for a circuit\n"
2048 "HMAC-MD5 authentication\n"
2049 "Cleartext password\n"
2050 "Circuit password\n")
2051{
2052 nb_cli_enqueue_change(vty, "./frr-isisd:isis/password", NB_OP_DESTROY,
2053 NULL);
2054
2055 return nb_cli_apply_changes(vty, NULL);
2056}
2057
2058void cli_show_ip_isis_password(struct vty *vty, const struct lyd_node *dnode,
2059 bool show_defaults)
2060{
2061 vty_out(vty, " isis password %s %s\n",
2062 yang_dnode_get_string(dnode, "./password-type"),
2063 yang_dnode_get_string(dnode, "./password"));
2064}
2065
2066/*
2067 * XPath: /frr-interface:lib/interface/frr-isisd:isis/metric
2068 */
2069DEFPY_YANG(isis_metric, isis_metric_cmd,
2070 "isis metric [level-1|level-2]$level (0-16777215)$met",
2071 "IS-IS routing protocol\n"
2072 "Set default metric for circuit\n"
2073 "Specify metric for level-1 routing\n"
2074 "Specify metric for level-2 routing\n"
2075 "Default metric value\n")
2076{
2077 if (!level || strmatch(level, "level-1"))
2078 nb_cli_enqueue_change(vty, "./frr-isisd:isis/metric/level-1",
2079 NB_OP_MODIFY, met_str);
2080 if (!level || strmatch(level, "level-2"))
2081 nb_cli_enqueue_change(vty, "./frr-isisd:isis/metric/level-2",
2082 NB_OP_MODIFY, met_str);
2083
2084 return nb_cli_apply_changes(vty, NULL);
2085}
2086
2087DEFPY_YANG(no_isis_metric, no_isis_metric_cmd,
2088 "no isis metric [level-1|level-2]$level [(0-16777215)]",
2089 NO_STR
2090 "IS-IS routing protocol\n"
2091 "Set default metric for circuit\n"
2092 "Specify metric for level-1 routing\n"
2093 "Specify metric for level-2 routing\n"
2094 "Default metric value\n")
2095{
2096 if (!level || strmatch(level, "level-1"))
2097 nb_cli_enqueue_change(vty, "./frr-isisd:isis/metric/level-1",
2098 NB_OP_MODIFY, NULL);
2099 if (!level || strmatch(level, "level-2"))
2100 nb_cli_enqueue_change(vty, "./frr-isisd:isis/metric/level-2",
2101 NB_OP_MODIFY, NULL);
2102
2103 return nb_cli_apply_changes(vty, NULL);
2104}
2105
2106void cli_show_ip_isis_metric(struct vty *vty, const struct lyd_node *dnode,
2107 bool show_defaults)
2108{
2109 const char *l1 = yang_dnode_get_string(dnode, "./level-1");
2110 const char *l2 = yang_dnode_get_string(dnode, "./level-2");
2111
2112 if (strmatch(l1, l2))
2113 vty_out(vty, " isis metric %s\n", l1);
2114 else {
2115 vty_out(vty, " isis metric level-1 %s\n", l1);
2116 vty_out(vty, " isis metric level-2 %s\n", l2);
2117 }
2118}
2119
2120/*
2121 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/interval
2122 */
2123DEFPY_YANG(isis_hello_interval, isis_hello_interval_cmd,
2124 "isis hello-interval [level-1|level-2]$level (1-600)$intv",
2125 "IS-IS routing protocol\n"
2126 "Set Hello interval\n"
2127 "Specify hello-interval for level-1 IIHs\n"
2128 "Specify hello-interval for level-2 IIHs\n"
2129 "Holdtime 1 seconds, interval depends on multiplier\n")
2130{
2131 if (!level || strmatch(level, "level-1"))
2132 nb_cli_enqueue_change(vty,
2133 "./frr-isisd:isis/hello/interval/level-1",
2134 NB_OP_MODIFY, intv_str);
2135 if (!level || strmatch(level, "level-2"))
2136 nb_cli_enqueue_change(vty,
2137 "./frr-isisd:isis/hello/interval/level-2",
2138 NB_OP_MODIFY, intv_str);
2139
2140 return nb_cli_apply_changes(vty, NULL);
2141}
2142
2143DEFPY_YANG(no_isis_hello_interval, no_isis_hello_interval_cmd,
2144 "no isis hello-interval [level-1|level-2]$level [(1-600)]",
2145 NO_STR
2146 "IS-IS routing protocol\n"
2147 "Set Hello interval\n"
2148 "Specify hello-interval for level-1 IIHs\n"
2149 "Specify hello-interval for level-2 IIHs\n"
2150 "Holdtime 1 second, interval depends on multiplier\n")
2151{
2152 if (!level || strmatch(level, "level-1"))
2153 nb_cli_enqueue_change(vty,
2154 "./frr-isisd:isis/hello/interval/level-1",
2155 NB_OP_MODIFY, NULL);
2156 if (!level || strmatch(level, "level-2"))
2157 nb_cli_enqueue_change(vty,
2158 "./frr-isisd:isis/hello/interval/level-2",
2159 NB_OP_MODIFY, NULL);
2160
2161 return nb_cli_apply_changes(vty, NULL);
2162}
2163
2164void cli_show_ip_isis_hello_interval(struct vty *vty,
2165 const struct lyd_node *dnode,
2166 bool show_defaults)
2167{
2168 const char *l1 = yang_dnode_get_string(dnode, "./level-1");
2169 const char *l2 = yang_dnode_get_string(dnode, "./level-2");
2170
2171 if (strmatch(l1, l2))
2172 vty_out(vty, " isis hello-interval %s\n", l1);
2173 else {
2174 vty_out(vty, " isis hello-interval level-1 %s\n", l1);
2175 vty_out(vty, " isis hello-interval level-2 %s\n", l2);
2176 }
2177}
2178
2179/*
2180 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/multiplier
2181 */
2182DEFPY_YANG(isis_hello_multiplier, isis_hello_multiplier_cmd,
2183 "isis hello-multiplier [level-1|level-2]$level (2-100)$mult",
2184 "IS-IS routing protocol\n"
2185 "Set multiplier for Hello holding time\n"
2186 "Specify hello multiplier for level-1 IIHs\n"
2187 "Specify hello multiplier for level-2 IIHs\n"
2188 "Hello multiplier value\n")
2189{
2190 if (!level || strmatch(level, "level-1"))
2191 nb_cli_enqueue_change(
2192 vty, "./frr-isisd:isis/hello/multiplier/level-1",
2193 NB_OP_MODIFY, mult_str);
2194 if (!level || strmatch(level, "level-2"))
2195 nb_cli_enqueue_change(
2196 vty, "./frr-isisd:isis/hello/multiplier/level-2",
2197 NB_OP_MODIFY, mult_str);
2198
2199 return nb_cli_apply_changes(vty, NULL);
2200}
2201
2202DEFPY_YANG(no_isis_hello_multiplier, no_isis_hello_multiplier_cmd,
2203 "no isis hello-multiplier [level-1|level-2]$level [(2-100)]",
2204 NO_STR
2205 "IS-IS routing protocol\n"
2206 "Set multiplier for Hello holding time\n"
2207 "Specify hello multiplier for level-1 IIHs\n"
2208 "Specify hello multiplier for level-2 IIHs\n"
2209 "Hello multiplier value\n")
2210{
2211 if (!level || strmatch(level, "level-1"))
2212 nb_cli_enqueue_change(
2213 vty, "./frr-isisd:isis/hello/multiplier/level-1",
2214 NB_OP_MODIFY, NULL);
2215 if (!level || strmatch(level, "level-2"))
2216 nb_cli_enqueue_change(
2217 vty, "./frr-isisd:isis/hello/multiplier/level-2",
2218 NB_OP_MODIFY, NULL);
2219
2220 return nb_cli_apply_changes(vty, NULL);
2221}
2222
2223void cli_show_ip_isis_hello_multi(struct vty *vty, const struct lyd_node *dnode,
2224 bool show_defaults)
2225{
2226 const char *l1 = yang_dnode_get_string(dnode, "./level-1");
2227 const char *l2 = yang_dnode_get_string(dnode, "./level-2");
2228
2229 if (strmatch(l1, l2))
2230 vty_out(vty, " isis hello-multiplier %s\n", l1);
2231 else {
2232 vty_out(vty, " isis hello-multiplier level-1 %s\n", l1);
2233 vty_out(vty, " isis hello-multiplier level-2 %s\n", l2);
2234 }
2235}
2236
2237/*
2238 * XPath:
2239 * /frr-interface:lib/interface/frr-isisd:isis/disable-three-way-handshake
2240 */
2241DEFPY_YANG(isis_threeway_adj, isis_threeway_adj_cmd, "[no] isis three-way-handshake",
2242 NO_STR
2243 "IS-IS commands\n"
2244 "Enable/Disable three-way handshake\n")
2245{
2246 nb_cli_enqueue_change(vty,
2247 "./frr-isisd:isis/disable-three-way-handshake",
2248 NB_OP_MODIFY, no ? "true" : "false");
2249
2250 return nb_cli_apply_changes(vty, NULL);
2251}
2252
2253void cli_show_ip_isis_threeway_shake(struct vty *vty,
2254 const struct lyd_node *dnode,
2255 bool show_defaults)
2256{
2257 if (yang_dnode_get_bool(dnode, NULL))
2258 vty_out(vty, " no");
2259 vty_out(vty, " isis three-way-handshake\n");
2260}
2261
2262/*
2263 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/padding
2264 */
2265DEFPY_YANG(isis_hello_padding, isis_hello_padding_cmd,
2266 "[no] isis hello padding [during-adjacency-formation]$padding_type",
2267 NO_STR
2268 "IS-IS routing protocol\n"
2269 "Type of padding for IS-IS hello packets\n"
2270 "Pad hello packets\n"
2271 "Add padding to hello packets during adjacency formation only.\n")
2272{
2273 if (no) {
2274 nb_cli_enqueue_change(vty, "./frr-isisd:isis/hello/padding",
2275 NB_OP_MODIFY, "disabled");
2276 } else {
2277 nb_cli_enqueue_change(vty, "./frr-isisd:isis/hello/padding",
2278 NB_OP_MODIFY,
2279 padding_type ? padding_type : "always");
2280 }
2281 return nb_cli_apply_changes(vty, NULL);
2282}
2283
2284void cli_show_ip_isis_hello_padding(struct vty *vty,
2285 const struct lyd_node *dnode,
2286 bool show_defaults)
2287{
2288 int hello_padding_type = yang_dnode_get_enum(dnode, NULL);
2289 if (hello_padding_type == ISIS_HELLO_PADDING_DISABLED)
2290 vty_out(vty, " no");
2291 vty_out(vty, " isis hello padding");
2292 if (hello_padding_type == ISIS_HELLO_PADDING_DURING_ADJACENCY_FORMATION)
2293 vty_out(vty, " during-adjacency-formation");
2294 vty_out(vty, "\n");
2295}
2296
2297/*
2298 * XPath: /frr-interface:lib/interface/frr-isisd:isis/csnp-interval
2299 */
2300DEFPY_YANG(csnp_interval, csnp_interval_cmd,
2301 "isis csnp-interval (1-600)$intv [level-1|level-2]$level",
2302 "IS-IS routing protocol\n"
2303 "Set CSNP interval in seconds\n"
2304 "CSNP interval value\n"
2305 "Specify interval for level-1 CSNPs\n"
2306 "Specify interval for level-2 CSNPs\n")
2307{
2308 if (!level || strmatch(level, "level-1"))
2309 nb_cli_enqueue_change(vty,
2310 "./frr-isisd:isis/csnp-interval/level-1",
2311 NB_OP_MODIFY, intv_str);
2312 if (!level || strmatch(level, "level-2"))
2313 nb_cli_enqueue_change(vty,
2314 "./frr-isisd:isis/csnp-interval/level-2",
2315 NB_OP_MODIFY, intv_str);
2316
2317 return nb_cli_apply_changes(vty, NULL);
2318}
2319
2320DEFPY_YANG(no_csnp_interval, no_csnp_interval_cmd,
2321 "no isis csnp-interval [(1-600)] [level-1|level-2]$level",
2322 NO_STR
2323 "IS-IS routing protocol\n"
2324 "Set CSNP interval in seconds\n"
2325 "CSNP interval value\n"
2326 "Specify interval for level-1 CSNPs\n"
2327 "Specify interval for level-2 CSNPs\n")
2328{
2329 if (!level || strmatch(level, "level-1"))
2330 nb_cli_enqueue_change(vty,
2331 "./frr-isisd:isis/csnp-interval/level-1",
2332 NB_OP_MODIFY, NULL);
2333 if (!level || strmatch(level, "level-2"))
2334 nb_cli_enqueue_change(vty,
2335 "./frr-isisd:isis/csnp-interval/level-2",
2336 NB_OP_MODIFY, NULL);
2337
2338 return nb_cli_apply_changes(vty, NULL);
2339}
2340
2341void cli_show_ip_isis_csnp_interval(struct vty *vty,
2342 const struct lyd_node *dnode,
2343 bool show_defaults)
2344{
2345 const char *l1 = yang_dnode_get_string(dnode, "./level-1");
2346 const char *l2 = yang_dnode_get_string(dnode, "./level-2");
2347
2348 if (strmatch(l1, l2))
2349 vty_out(vty, " isis csnp-interval %s\n", l1);
2350 else {
2351 vty_out(vty, " isis csnp-interval %s level-1\n", l1);
2352 vty_out(vty, " isis csnp-interval %s level-2\n", l2);
2353 }
2354}
2355
2356/*
2357 * XPath: /frr-interface:lib/interface/frr-isisd:isis/psnp-interval
2358 */
2359DEFPY_YANG(psnp_interval, psnp_interval_cmd,
2360 "isis psnp-interval (1-120)$intv [level-1|level-2]$level",
2361 "IS-IS routing protocol\n"
2362 "Set PSNP interval in seconds\n"
2363 "PSNP interval value\n"
2364 "Specify interval for level-1 PSNPs\n"
2365 "Specify interval for level-2 PSNPs\n")
2366{
2367 if (!level || strmatch(level, "level-1"))
2368 nb_cli_enqueue_change(vty,
2369 "./frr-isisd:isis/psnp-interval/level-1",
2370 NB_OP_MODIFY, intv_str);
2371 if (!level || strmatch(level, "level-2"))
2372 nb_cli_enqueue_change(vty,
2373 "./frr-isisd:isis/psnp-interval/level-2",
2374 NB_OP_MODIFY, intv_str);
2375
2376 return nb_cli_apply_changes(vty, NULL);
2377}
2378
2379DEFPY_YANG(no_psnp_interval, no_psnp_interval_cmd,
2380 "no isis psnp-interval [(1-120)] [level-1|level-2]$level",
2381 NO_STR
2382 "IS-IS routing protocol\n"
2383 "Set PSNP interval in seconds\n"
2384 "PSNP interval value\n"
2385 "Specify interval for level-1 PSNPs\n"
2386 "Specify interval for level-2 PSNPs\n")
2387{
2388 if (!level || strmatch(level, "level-1"))
2389 nb_cli_enqueue_change(vty,
2390 "./frr-isisd:isis/psnp-interval/level-1",
2391 NB_OP_MODIFY, NULL);
2392 if (!level || strmatch(level, "level-2"))
2393 nb_cli_enqueue_change(vty,
2394 "./frr-isisd:isis/psnp-interval/level-2",
2395 NB_OP_MODIFY, NULL);
2396
2397 return nb_cli_apply_changes(vty, NULL);
2398}
2399
2400void cli_show_ip_isis_psnp_interval(struct vty *vty,
2401 const struct lyd_node *dnode,
2402 bool show_defaults)
2403{
2404 const char *l1 = yang_dnode_get_string(dnode, "./level-1");
2405 const char *l2 = yang_dnode_get_string(dnode, "./level-2");
2406
2407 if (strmatch(l1, l2))
2408 vty_out(vty, " isis psnp-interval %s\n", l1);
2409 else {
2410 vty_out(vty, " isis psnp-interval %s level-1\n", l1);
2411 vty_out(vty, " isis psnp-interval %s level-2\n", l2);
2412 }
2413}
2414
2415/*
2416 * XPath: /frr-interface:lib/interface/frr-isisd:isis/multi-topology
2417 */
2418DEFPY_YANG(circuit_topology, circuit_topology_cmd,
2419 "[no] isis topology<standard|ipv4-unicast|ipv4-mgmt|ipv6-unicast|ipv4-multicast|ipv6-multicast|ipv6-mgmt|ipv6-dstsrc>$topology",
2420 NO_STR
2421 "IS-IS routing protocol\n"
2422 "Configure interface IS-IS topologies\n"
2423 "Standard topology\n"
2424 "IPv4 unicast topology\n"
2425 "IPv4 management topology\n"
2426 "IPv6 unicast topology\n"
2427 "IPv4 multicast topology\n"
2428 "IPv6 multicast topology\n"
2429 "IPv6 management topology\n"
2430 "IPv6 dst-src topology\n")
2431{
2432 nb_cli_enqueue_change(vty, ".", NB_OP_MODIFY, no ? "false" : "true");
2433
2434 if (strmatch(topology, "ipv4-mgmt"))
2435 return nb_cli_apply_changes(
2436 vty, "./frr-isisd:isis/multi-topology/ipv4-management");
2437 else if (strmatch(topology, "ipv6-mgmt"))
2438 return nb_cli_apply_changes(
2439 vty, "./frr-isisd:isis/multi-topology/ipv6-management");
2440 if (strmatch(topology, "ipv4-unicast"))
2441 return nb_cli_apply_changes(
2442 vty, "./frr-isisd:isis/multi-topology/standard");
2443 else
2444 return nb_cli_apply_changes(
2445 vty, "./frr-isisd:isis/multi-topology/%s", topology);
2446}
2447
2448void cli_show_ip_isis_mt_standard(struct vty *vty, const struct lyd_node *dnode,
2449 bool show_defaults)
2450{
2451 if (!yang_dnode_get_bool(dnode, NULL))
2452 vty_out(vty, " no");
2453 vty_out(vty, " isis topology standard\n");
2454}
2455
2456void cli_show_ip_isis_mt_ipv4_multicast(struct vty *vty,
2457 const struct lyd_node *dnode,
2458 bool show_defaults)
2459{
2460 if (!yang_dnode_get_bool(dnode, NULL))
2461 vty_out(vty, " no");
2462 vty_out(vty, " isis topology ipv4-multicast\n");
2463}
2464
2465void cli_show_ip_isis_mt_ipv4_mgmt(struct vty *vty,
2466 const struct lyd_node *dnode,
2467 bool show_defaults)
2468{
2469 if (!yang_dnode_get_bool(dnode, NULL))
2470 vty_out(vty, " no");
2471 vty_out(vty, " isis topology ipv4-mgmt\n");
2472}
2473
2474void cli_show_ip_isis_mt_ipv6_unicast(struct vty *vty,
2475 const struct lyd_node *dnode,
2476 bool show_defaults)
2477{
2478 if (!yang_dnode_get_bool(dnode, NULL))
2479 vty_out(vty, " no");
2480 vty_out(vty, " isis topology ipv6-unicast\n");
2481}
2482
2483void cli_show_ip_isis_mt_ipv6_multicast(struct vty *vty,
2484 const struct lyd_node *dnode,
2485 bool show_defaults)
2486{
2487 if (!yang_dnode_get_bool(dnode, NULL))
2488 vty_out(vty, " no");
2489 vty_out(vty, " isis topology ipv6-multicast\n");
2490}
2491
2492void cli_show_ip_isis_mt_ipv6_mgmt(struct vty *vty,
2493 const struct lyd_node *dnode,
2494 bool show_defaults)
2495{
2496 if (!yang_dnode_get_bool(dnode, NULL))
2497 vty_out(vty, " no");
2498 vty_out(vty, " isis topology ipv6-mgmt\n");
2499}
2500
2501void cli_show_ip_isis_mt_ipv6_dstsrc(struct vty *vty,
2502 const struct lyd_node *dnode,
2503 bool show_defaults)
2504{
2505 if (!yang_dnode_get_bool(dnode, NULL))
2506 vty_out(vty, " no");
2507 vty_out(vty, " isis topology ipv6-dstsrc\n");
2508}
2509
2510/*
2511 * XPath: /frr-interface:lib/interface/frr-isisd:isis/circuit-type
2512 */
2513DEFPY_YANG(isis_circuit_type, isis_circuit_type_cmd,
2514 "isis circuit-type <level-1|level-1-2|level-2-only>$type",
2515 "IS-IS routing protocol\n"
2516 "Configure circuit type for interface\n"
2517 "Level-1 only adjacencies are formed\n"
2518 "Level-1-2 adjacencies are formed\n"
2519 "Level-2 only adjacencies are formed\n")
2520{
2521 nb_cli_enqueue_change(
2522 vty, "./frr-isisd:isis/circuit-type", NB_OP_MODIFY,
2523 strmatch(type, "level-2-only") ? "level-2" : type);
2524
2525 return nb_cli_apply_changes(vty, NULL);
2526}
2527
2528DEFPY_YANG(no_isis_circuit_type, no_isis_circuit_type_cmd,
2529 "no isis circuit-type [level-1|level-1-2|level-2-only]",
2530 NO_STR
2531 "IS-IS routing protocol\n"
2532 "Configure circuit type for interface\n"
2533 "Level-1 only adjacencies are formed\n"
2534 "Level-1-2 adjacencies are formed\n"
2535 "Level-2 only adjacencies are formed\n")
2536{
2537 nb_cli_enqueue_change(vty, "./frr-isisd:isis/circuit-type",
2538 NB_OP_MODIFY, NULL);
2539
2540 return nb_cli_apply_changes(vty, NULL);
2541}
2542
2543void cli_show_ip_isis_circ_type(struct vty *vty, const struct lyd_node *dnode,
2544 bool show_defaults)
2545{
2546 int level = yang_dnode_get_enum(dnode, NULL);
2547
2548 switch (level) {
2549 case IS_LEVEL_1:
2550 vty_out(vty, " isis circuit-type level-1\n");
2551 break;
2552 case IS_LEVEL_2:
2553 vty_out(vty, " isis circuit-type level-2-only\n");
2554 break;
2555 case IS_LEVEL_1_AND_2:
2556 vty_out(vty, " isis circuit-type level-1-2\n");
2557 break;
2558 }
2559}
2560
2561/*
2562 * XPath: /frr-interface:lib/interface/frr-isisd:isis/network-type
2563 */
2564DEFPY_YANG(isis_network, isis_network_cmd, "[no] isis network point-to-point",
2565 NO_STR
2566 "IS-IS routing protocol\n"
2567 "Set network type\n"
2568 "point-to-point network type\n")
2569{
2570 nb_cli_enqueue_change(vty, "./frr-isisd:isis/network-type",
2571 NB_OP_MODIFY,
2572 no ? "broadcast" : "point-to-point");
2573
2574 return nb_cli_apply_changes(vty, NULL);
2575}
2576
2577void cli_show_ip_isis_network_type(struct vty *vty,
2578 const struct lyd_node *dnode,
2579 bool show_defaults)
2580{
2581 if (yang_dnode_get_enum(dnode, NULL) != CIRCUIT_T_P2P)
2582 vty_out(vty, " no");
2583
2584 vty_out(vty, " isis network point-to-point\n");
2585}
2586
2587/*
2588 * XPath: /frr-interface:lib/interface/frr-isisd:isis/priority
2589 */
2590DEFPY_YANG(isis_priority, isis_priority_cmd,
2591 "isis priority (0-127)$prio [level-1|level-2]$level",
2592 "IS-IS routing protocol\n"
2593 "Set priority for Designated Router election\n"
2594 "Priority value\n"
2595 "Specify priority for level-1 routing\n"
2596 "Specify priority for level-2 routing\n")
2597{
2598 if (!level || strmatch(level, "level-1"))
2599 nb_cli_enqueue_change(vty, "./frr-isisd:isis/priority/level-1",
2600 NB_OP_MODIFY, prio_str);
2601 if (!level || strmatch(level, "level-2"))
2602 nb_cli_enqueue_change(vty, "./frr-isisd:isis/priority/level-2",
2603 NB_OP_MODIFY, prio_str);
2604
2605 return nb_cli_apply_changes(vty, NULL);
2606}
2607
2608DEFPY_YANG(no_isis_priority, no_isis_priority_cmd,
2609 "no isis priority [(0-127)] [level-1|level-2]$level",
2610 NO_STR
2611 "IS-IS routing protocol\n"
2612 "Set priority for Designated Router election\n"
2613 "Priority value\n"
2614 "Specify priority for level-1 routing\n"
2615 "Specify priority for level-2 routing\n")
2616{
2617 if (!level || strmatch(level, "level-1"))
2618 nb_cli_enqueue_change(vty, "./frr-isisd:isis/priority/level-1",
2619 NB_OP_MODIFY, NULL);
2620 if (!level || strmatch(level, "level-2"))
2621 nb_cli_enqueue_change(vty, "./frr-isisd:isis/priority/level-2",
2622 NB_OP_MODIFY, NULL);
2623
2624 return nb_cli_apply_changes(vty, NULL);
2625}
2626
2627void cli_show_ip_isis_priority(struct vty *vty, const struct lyd_node *dnode,
2628 bool show_defaults)
2629{
2630 const char *l1 = yang_dnode_get_string(dnode, "./level-1");
2631 const char *l2 = yang_dnode_get_string(dnode, "./level-2");
2632
2633 if (strmatch(l1, l2))
2634 vty_out(vty, " isis priority %s\n", l1);
2635 else {
2636 vty_out(vty, " isis priority %s level-1\n", l1);
2637 vty_out(vty, " isis priority %s level-2\n", l2);
2638 }
2639}
2640
2641/*
2642 * XPath: /frr-interface:lib/interface/frr-isisd:isis/fast-reroute
2643 */
2644void cli_show_ip_isis_frr(struct vty *vty, const struct lyd_node *dnode,
2645 bool show_defaults)
2646{
2647 bool l1_enabled, l2_enabled;
2648 bool l1_node_protection, l2_node_protection;
2649 bool l1_link_fallback, l2_link_fallback;
2650
2651 /* Classic LFA */
2652 l1_enabled = yang_dnode_get_bool(dnode, "./level-1/lfa/enable");
2653 l2_enabled = yang_dnode_get_bool(dnode, "./level-2/lfa/enable");
2654
2655 if (l1_enabled || l2_enabled) {
2656 if (l1_enabled == l2_enabled) {
2657 vty_out(vty, " isis fast-reroute lfa\n");
2658 vty_out(vty, "\n");
2659 } else {
2660 if (l1_enabled)
2661 vty_out(vty,
2662 " isis fast-reroute lfa level-1\n");
2663 if (l2_enabled)
2664 vty_out(vty,
2665 " isis fast-reroute lfa level-2\n");
2666 }
2667 }
2668
2669 /* Remote LFA */
2670 l1_enabled = yang_dnode_get_bool(dnode, "./level-1/remote-lfa/enable");
2671 l2_enabled = yang_dnode_get_bool(dnode, "./level-2/remote-lfa/enable");
2672
2673 if (l1_enabled || l2_enabled) {
2674 if (l1_enabled == l2_enabled) {
2675 vty_out(vty,
2676 " isis fast-reroute remote-lfa tunnel mpls-ldp\n");
2677 vty_out(vty, "\n");
2678 } else {
2679 if (l1_enabled)
2680 vty_out(vty,
2681 " isis fast-reroute remote-lfa tunnel mpls-ldp level-1\n");
2682 if (l2_enabled)
2683 vty_out(vty,
2684 " isis fast-reroute remote-lfa tunnel mpls-ldp level-2\n");
2685 }
2686 }
2687
2688 /* TI-LFA */
2689 l1_enabled = yang_dnode_get_bool(dnode, "./level-1/ti-lfa/enable");
2690 l2_enabled = yang_dnode_get_bool(dnode, "./level-2/ti-lfa/enable");
2691 l1_node_protection =
2692 yang_dnode_get_bool(dnode, "./level-1/ti-lfa/node-protection");
2693 l2_node_protection =
2694 yang_dnode_get_bool(dnode, "./level-2/ti-lfa/node-protection");
2695 l1_link_fallback =
2696 yang_dnode_get_bool(dnode, "./level-1/ti-lfa/link-fallback");
2697 l2_link_fallback =
2698 yang_dnode_get_bool(dnode, "./level-2/ti-lfa/link-fallback");
2699
2700
2701 if (l1_enabled || l2_enabled) {
2702 if (l1_enabled == l2_enabled
2703 && l1_node_protection == l2_node_protection
2704 && l1_link_fallback == l2_link_fallback) {
2705 vty_out(vty, " isis fast-reroute ti-lfa");
2706 if (l1_node_protection)
2707 vty_out(vty, " node-protection");
2708 if (l1_link_fallback)
2709 vty_out(vty, " link-fallback");
2710 vty_out(vty, "\n");
2711 } else {
2712 if (l1_enabled) {
2713 vty_out(vty,
2714 " isis fast-reroute ti-lfa level-1");
2715 if (l1_node_protection)
2716 vty_out(vty, " node-protection");
2717 if (l1_link_fallback)
2718 vty_out(vty, " link-fallback");
2719 vty_out(vty, "\n");
2720 }
2721 if (l2_enabled) {
2722 vty_out(vty,
2723 " isis fast-reroute ti-lfa level-2");
2724 if (l2_node_protection)
2725 vty_out(vty, " node-protection");
2726 if (l2_link_fallback)
2727 vty_out(vty, " link-fallback");
2728 vty_out(vty, "\n");
2729 }
2730 }
2731 }
2732}
2733
2734/*
2735 * XPath: /frr-interface:lib/interface/frr-isisd:isis/fast-reroute/level-{1,2}/lfa/enable
2736 */
2737DEFPY(isis_lfa, isis_lfa_cmd,
2738 "[no] isis fast-reroute lfa [level-1|level-2]$level",
2739 NO_STR
2740 "IS-IS routing protocol\n"
2741 "Interface IP Fast-reroute configuration\n"
2742 "Enable LFA computation\n"
2743 "Enable LFA computation for Level 1 only\n"
2744 "Enable LFA computation for Level 2 only\n")
2745{
2746 if (!level || strmatch(level, "level-1")) {
2747 if (no) {
2748 nb_cli_enqueue_change(
2749 vty,
2750 "./frr-isisd:isis/fast-reroute/level-1/lfa/enable",
2751 NB_OP_MODIFY, "false");
2752 } else {
2753 nb_cli_enqueue_change(
2754 vty,
2755 "./frr-isisd:isis/fast-reroute/level-1/lfa/enable",
2756 NB_OP_MODIFY, "true");
2757 }
2758 }
2759 if (!level || strmatch(level, "level-2")) {
2760 if (no) {
2761 nb_cli_enqueue_change(
2762 vty,
2763 "./frr-isisd:isis/fast-reroute/level-2/lfa/enable",
2764 NB_OP_MODIFY, "false");
2765 } else {
2766 nb_cli_enqueue_change(
2767 vty,
2768 "./frr-isisd:isis/fast-reroute/level-2/lfa/enable",
2769 NB_OP_MODIFY, "true");
2770 }
2771 }
2772
2773 return nb_cli_apply_changes(vty, NULL);
2774}
2775
2776/*
2777 * XPath:
2778 * /frr-interface:lib/interface/frr-isisd:isis/fast-reroute/level-{1,2}/lfa/exclude-interface
2779 */
2780DEFPY(isis_lfa_exclude_interface, isis_lfa_exclude_interface_cmd,
2781 "[no] isis fast-reroute lfa [level-1|level-2]$level exclude interface IFNAME$ifname",
2782 NO_STR
2783 "IS-IS routing protocol\n"
2784 "Interface IP Fast-reroute configuration\n"
2785 "Enable LFA computation\n"
2786 "Enable LFA computation for Level 1 only\n"
2787 "Enable LFA computation for Level 2 only\n"
2788 "FRR exclusion information\n"
2789 "Exclude an interface from computation\n"
2790 "Interface name\n")
2791{
2792 if (!level || strmatch(level, "level-1")) {
2793 if (no) {
2794 nb_cli_enqueue_change(
2795 vty,
2796 "./frr-isisd:isis/fast-reroute/level-1/lfa/exclude-interface",
2797 NB_OP_DESTROY, ifname);
2798 } else {
2799 nb_cli_enqueue_change(
2800 vty,
2801 "./frr-isisd:isis/fast-reroute/level-1/lfa/exclude-interface",
2802 NB_OP_CREATE, ifname);
2803 }
2804 }
2805 if (!level || strmatch(level, "level-2")) {
2806 if (no) {
2807 nb_cli_enqueue_change(
2808 vty,
2809 "./frr-isisd:isis/fast-reroute/level-2/lfa/exclude-interface",
2810 NB_OP_DESTROY, ifname);
2811 } else {
2812 nb_cli_enqueue_change(
2813 vty,
2814 "./frr-isisd:isis/fast-reroute/level-2/lfa/exclude-interface",
2815 NB_OP_CREATE, ifname);
2816 }
2817 }
2818
2819 return nb_cli_apply_changes(vty, NULL);
2820}
2821
2822void cli_show_frr_lfa_exclude_interface(struct vty *vty,
2823 const struct lyd_node *dnode,
2824 bool show_defaults)
2825{
2826 vty_out(vty, " isis fast-reroute lfa %s exclude interface %s\n",
2827 dnode->parent->parent->schema->name,
2828 yang_dnode_get_string(dnode, NULL));
2829}
2830
2831/*
2832 * XPath:
2833 * /frr-interface:lib/interface/frr-isisd:isis/fast-reroute/level-{1,2}/remote-lfa/enable
2834 */
2835DEFPY(isis_remote_lfa, isis_remote_lfa_cmd,
2836 "[no] isis fast-reroute remote-lfa tunnel mpls-ldp [level-1|level-2]$level",
2837 NO_STR
2838 "IS-IS routing protocol\n"
2839 "Interface IP Fast-reroute configuration\n"
2840 "Enable remote LFA computation\n"
2841 "Enable remote LFA computation using tunnels\n"
2842 "Use MPLS LDP tunnel to reach the remote LFA node\n"
2843 "Enable LFA computation for Level 1 only\n"
2844 "Enable LFA computation for Level 2 only\n")
2845{
2846 if (!level || strmatch(level, "level-1")) {
2847 if (no) {
2848 nb_cli_enqueue_change(
2849 vty,
2850 "./frr-isisd:isis/fast-reroute/level-1/remote-lfa/enable",
2851 NB_OP_MODIFY, "false");
2852 } else {
2853 nb_cli_enqueue_change(
2854 vty,
2855 "./frr-isisd:isis/fast-reroute/level-1/remote-lfa/enable",
2856 NB_OP_MODIFY, "true");
2857 }
2858 }
2859 if (!level || strmatch(level, "level-2")) {
2860 if (no) {
2861 nb_cli_enqueue_change(
2862 vty,
2863 "./frr-isisd:isis/fast-reroute/level-2/remote-lfa/enable",
2864 NB_OP_MODIFY, "false");
2865 } else {
2866 nb_cli_enqueue_change(
2867 vty,
2868 "./frr-isisd:isis/fast-reroute/level-2/remote-lfa/enable",
2869 NB_OP_MODIFY, "true");
2870 }
2871 }
2872
2873 return nb_cli_apply_changes(vty, NULL);
2874}
2875
2876/*
2877 * XPath:
2878 * /frr-interface:lib/interface/frr-isisd:isis/fast-reroute/level-{1,2}/remote-lfa/maximum-metric
2879 */
2880DEFPY(isis_remote_lfa_max_metric, isis_remote_lfa_max_metric_cmd,
2881 "[no] isis fast-reroute remote-lfa maximum-metric (1-16777215)$metric [level-1|level-2]$level",
2882 NO_STR
2883 "IS-IS routing protocol\n"
2884 "Interface IP Fast-reroute configuration\n"
2885 "Enable remote LFA computation\n"
2886 "Limit remote LFA node selection within the metric\n"
2887 "Value of the metric\n"
2888 "Enable LFA computation for Level 1 only\n"
2889 "Enable LFA computation for Level 2 only\n")
2890{
2891 if (!level || strmatch(level, "level-1")) {
2892 if (no) {
2893 nb_cli_enqueue_change(
2894 vty,
2895 "./frr-isisd:isis/fast-reroute/level-1/remote-lfa/maximum-metric",
2896 NB_OP_DESTROY, NULL);
2897 } else {
2898 nb_cli_enqueue_change(
2899 vty,
2900 "./frr-isisd:isis/fast-reroute/level-1/remote-lfa/maximum-metric",
2901 NB_OP_MODIFY, metric_str);
2902 }
2903 }
2904 if (!level || strmatch(level, "level-2")) {
2905 if (no) {
2906 nb_cli_enqueue_change(
2907 vty,
2908 "./frr-isisd:isis/fast-reroute/level-2/remote-lfa/maximum-metric",
2909 NB_OP_DESTROY, NULL);
2910 } else {
2911 nb_cli_enqueue_change(
2912 vty,
2913 "./frr-isisd:isis/fast-reroute/level-2/remote-lfa/maximum-metric",
2914 NB_OP_MODIFY, metric_str);
2915 }
2916 }
2917
2918 return nb_cli_apply_changes(vty, NULL);
2919}
2920
2921void cli_show_frr_remote_lfa_max_metric(struct vty *vty,
2922 const struct lyd_node *dnode,
2923 bool show_defaults)
2924{
2925 vty_out(vty, " isis fast-reroute remote-lfa maximum-metric %s %s\n",
2926 yang_dnode_get_string(dnode, NULL),
2927 dnode->parent->parent->schema->name);
2928}
2929
2930/*
2931 * XPath: /frr-interface:lib/interface/frr-isisd:isis/fast-reroute/level-{1,2}/ti-lfa/enable
2932 */
2933DEFPY(isis_ti_lfa, isis_ti_lfa_cmd,
2934 "[no] isis fast-reroute ti-lfa [level-1|level-2]$level [node-protection$node_protection [link-fallback$link_fallback]]",
2935 NO_STR
2936 "IS-IS routing protocol\n"
2937 "Interface IP Fast-reroute configuration\n"
2938 "Enable TI-LFA computation\n"
2939 "Enable TI-LFA computation for Level 1 only\n"
2940 "Enable TI-LFA computation for Level 2 only\n"
2941 "Protect against node failures\n"
2942 "Enable link-protection fallback\n")
2943{
2944 if (!level || strmatch(level, "level-1")) {
2945 if (no) {
2946 nb_cli_enqueue_change(
2947 vty,
2948 "./frr-isisd:isis/fast-reroute/level-1/ti-lfa/enable",
2949 NB_OP_MODIFY, "false");
2950 nb_cli_enqueue_change(
2951 vty,
2952 "./frr-isisd:isis/fast-reroute/level-1/ti-lfa/node-protection",
2953 NB_OP_MODIFY, "false");
2954 nb_cli_enqueue_change(
2955 vty,
2956 "./frr-isisd:isis/fast-reroute/level-1/ti-lfa/link-fallback",
2957 NB_OP_MODIFY, "false");
2958 } else {
2959 nb_cli_enqueue_change(
2960 vty,
2961 "./frr-isisd:isis/fast-reroute/level-1/ti-lfa/enable",
2962 NB_OP_MODIFY, "true");
2963 nb_cli_enqueue_change(
2964 vty,
2965 "./frr-isisd:isis/fast-reroute/level-1/ti-lfa/node-protection",
2966 NB_OP_MODIFY,
2967 node_protection ? "true" : "false");
2968 nb_cli_enqueue_change(
2969 vty,
2970 "./frr-isisd:isis/fast-reroute/level-1/ti-lfa/link-fallback",
2971 NB_OP_MODIFY, link_fallback ? "true" : "false");
2972 }
2973 }
2974 if (!level || strmatch(level, "level-2")) {
2975 if (no) {
2976 nb_cli_enqueue_change(
2977 vty,
2978 "./frr-isisd:isis/fast-reroute/level-2/ti-lfa/enable",
2979 NB_OP_MODIFY, "false");
2980 nb_cli_enqueue_change(
2981 vty,
2982 "./frr-isisd:isis/fast-reroute/level-2/ti-lfa/node-protection",
2983 NB_OP_MODIFY, "false");
2984 nb_cli_enqueue_change(
2985 vty,
2986 "./frr-isisd:isis/fast-reroute/level-2/ti-lfa/link-fallback",
2987 NB_OP_MODIFY, "false");
2988 } else {
2989 nb_cli_enqueue_change(
2990 vty,
2991 "./frr-isisd:isis/fast-reroute/level-2/ti-lfa/enable",
2992 NB_OP_MODIFY, "true");
2993 nb_cli_enqueue_change(
2994 vty,
2995 "./frr-isisd:isis/fast-reroute/level-2/ti-lfa/node-protection",
2996 NB_OP_MODIFY,
2997 node_protection ? "true" : "false");
2998 nb_cli_enqueue_change(
2999 vty,
3000 "./frr-isisd:isis/fast-reroute/level-2/ti-lfa/link-fallback",
3001 NB_OP_MODIFY, link_fallback ? "true" : "false");
3002 }
3003 }
3004
3005 return nb_cli_apply_changes(vty, NULL);
3006}
3007
3008/*
3009 * XPath: /frr-isisd:isis/instance/log-adjacency-changes
3010 */
3011DEFPY_YANG(log_adj_changes, log_adj_changes_cmd, "[no] log-adjacency-changes",
3012 NO_STR "Log changes in adjacency state\n")
3013{
3014 nb_cli_enqueue_change(vty, "./log-adjacency-changes", NB_OP_MODIFY,
3015 no ? "false" : "true");
3016
3017 return nb_cli_apply_changes(vty, NULL);
3018}
3019
3020void cli_show_isis_log_adjacency(struct vty *vty, const struct lyd_node *dnode,
3021 bool show_defaults)
3022{
3023 if (!yang_dnode_get_bool(dnode, NULL))
3024 vty_out(vty, " no");
3025 vty_out(vty, " log-adjacency-changes\n");
3026}
3027
3028/*
3029 * XPath: /frr-isisd:isis/instance/log-pdu-drops
3030 */
3031DEFPY_YANG(log_pdu_drops, log_pdu_drops_cmd, "[no] log-pdu-drops",
3032 NO_STR "Log any dropped PDUs\n")
3033{
3034 nb_cli_enqueue_change(vty, "./log-pdu-drops", NB_OP_MODIFY,
3035 no ? "false" : "true");
3036
3037 return nb_cli_apply_changes(vty, NULL);
3038}
3039
3040void cli_show_isis_log_pdu_drops(struct vty *vty, const struct lyd_node *dnode,
3041 bool show_defaults)
3042{
3043 if (!yang_dnode_get_bool(dnode, NULL))
3044 vty_out(vty, " no");
3045 vty_out(vty, " log-pdu-drops\n");
3046}
3047
3048/*
3049 * XPath: /frr-isisd:isis/instance/mpls/ldp-sync
3050 */
3051DEFPY(isis_mpls_ldp_sync, isis_mpls_ldp_sync_cmd, "mpls ldp-sync",
3052 MPLS_STR MPLS_LDP_SYNC_STR)
3053{
3054 nb_cli_enqueue_change(vty, "./mpls/ldp-sync", NB_OP_CREATE, NULL);
3055
3056 return nb_cli_apply_changes(vty, NULL);
3057}
3058
3059DEFPY(no_isis_mpls_ldp_sync, no_isis_mpls_ldp_sync_cmd, "no mpls ldp-sync",
3060 NO_STR MPLS_STR NO_MPLS_LDP_SYNC_STR)
3061{
3062 nb_cli_enqueue_change(vty, "./mpls/ldp-sync", NB_OP_DESTROY, NULL);
3063
3064 return nb_cli_apply_changes(vty, NULL);
3065}
3066
3067void cli_show_isis_mpls_ldp_sync(struct vty *vty, const struct lyd_node *dnode,
3068 bool show_defaults)
3069{
3070 vty_out(vty, " mpls ldp-sync\n");
3071}
3072
3073DEFPY(isis_mpls_ldp_sync_holddown, isis_mpls_ldp_sync_holddown_cmd,
3074 "mpls ldp-sync holddown (0-10000)",
3075 MPLS_STR MPLS_LDP_SYNC_STR
3076 "Time to wait for LDP-SYNC to occur before restoring interface metric\n"
3077 "Time in seconds\n")
3078{
3079 nb_cli_enqueue_change(vty, "./mpls/ldp-sync/holddown", NB_OP_MODIFY,
3080 holddown_str);
3081
3082 return nb_cli_apply_changes(vty, NULL);
3083}
3084
3085DEFPY(no_isis_mpls_ldp_sync_holddown, no_isis_mpls_ldp_sync_holddown_cmd,
3086 "no mpls ldp-sync holddown [<(1-10000)>]",
3087 NO_STR MPLS_STR MPLS_LDP_SYNC_STR NO_MPLS_LDP_SYNC_HOLDDOWN_STR "Time in seconds\n")
3088{
3089 nb_cli_enqueue_change(vty, "./mpls/ldp-sync/holddown", NB_OP_DESTROY,
3090 NULL);
3091
3092 return nb_cli_apply_changes(vty, NULL);
3093}
3094
3095void cli_show_isis_mpls_ldp_sync_holddown(struct vty *vty,
3096 const struct lyd_node *dnode,
3097 bool show_defaults)
3098{
3099 vty_out(vty, " mpls ldp-sync holddown %s\n",
3100 yang_dnode_get_string(dnode, NULL));
3101}
3102
3103/*
3104 * XPath: /frr-interface:lib/interface/frr-isisd:isis/mpls/ldp-sync
3105 */
3106DEFPY(isis_mpls_if_ldp_sync, isis_mpls_if_ldp_sync_cmd,
3107 "[no] isis mpls ldp-sync",
3108 NO_STR "IS-IS routing protocol\n" MPLS_STR MPLS_LDP_SYNC_STR)
3109{
3110 const struct lyd_node *dnode;
3111
3112 dnode = yang_dnode_getf(vty->candidate_config->dnode,
3113 "%s/frr-isisd:isis", VTY_CURR_XPATH);
3114 if (dnode == NULL) {
3115 vty_out(vty, "ISIS is not enabled on this circuit\n");
3116 return CMD_SUCCESS;
3117 }
3118
3119 nb_cli_enqueue_change(vty, "./frr-isisd:isis/mpls/ldp-sync",
3120 NB_OP_MODIFY, no ? "false" : "true");
3121
3122 return nb_cli_apply_changes(vty, NULL);
3123}
3124
3125
3126void cli_show_isis_mpls_if_ldp_sync(struct vty *vty,
3127 const struct lyd_node *dnode,
3128 bool show_defaults)
3129{
3130 if (!yang_dnode_get_bool(dnode, NULL))
3131 vty_out(vty, " no");
3132
3133 vty_out(vty, " isis mpls ldp-sync\n");
3134}
3135
3136DEFPY(isis_mpls_if_ldp_sync_holddown, isis_mpls_if_ldp_sync_holddown_cmd,
3137 "isis mpls ldp-sync holddown (0-10000)",
3138 "IS-IS routing protocol\n" MPLS_STR MPLS_LDP_SYNC_STR
3139 "Time to wait for LDP-SYNC to occur before restoring interface metric\n"
3140 "Time in seconds\n")
3141{
3142 const struct lyd_node *dnode;
3143
3144 dnode = yang_dnode_getf(vty->candidate_config->dnode,
3145 "%s/frr-isisd:isis", VTY_CURR_XPATH);
3146 if (dnode == NULL) {
3147 vty_out(vty, "ISIS is not enabled on this circuit\n");
3148 return CMD_SUCCESS;
3149 }
3150
3151 nb_cli_enqueue_change(vty, "./frr-isisd:isis/mpls/holddown",
3152 NB_OP_MODIFY, holddown_str);
3153
3154 return nb_cli_apply_changes(vty, NULL);
3155}
3156
3157DEFPY(no_isis_mpls_if_ldp_sync_holddown, no_isis_mpls_if_ldp_sync_holddown_cmd,
3158 "no isis mpls ldp-sync holddown [<(1-10000)>]",
3159 NO_STR "IS-IS routing protocol\n" MPLS_STR NO_MPLS_LDP_SYNC_STR
3160 NO_MPLS_LDP_SYNC_HOLDDOWN_STR "Time in seconds\n")
3161{
3162 const struct lyd_node *dnode;
3163
3164 dnode = yang_dnode_getf(vty->candidate_config->dnode,
3165 "%s/frr-isisd:isis", VTY_CURR_XPATH);
3166 if (dnode == NULL) {
3167 vty_out(vty, "ISIS is not enabled on this circuit\n");
3168 return CMD_SUCCESS;
3169 }
3170
3171 nb_cli_enqueue_change(vty, "./frr-isisd:isis/mpls/holddown",
3172 NB_OP_DESTROY, NULL);
3173
3174 return nb_cli_apply_changes(vty, NULL);
3175}
3176
3177void cli_show_isis_mpls_if_ldp_sync_holddown(struct vty *vty,
3178 const struct lyd_node *dnode,
3179 bool show_defaults)
3180{
3181 vty_out(vty, " isis mpls ldp-sync holddown %s\n",
3182 yang_dnode_get_string(dnode, NULL));
3183}
3184
3185void isis_cli_init(void)
3186{
3187 install_element(CONFIG_NODE, &router_isis_cmd);
3188 install_element(CONFIG_NODE, &no_router_isis_cmd);
3189
3190 install_element(INTERFACE_NODE, &ip_router_isis_cmd);
3191 install_element(INTERFACE_NODE, &ip_router_isis_vrf_cmd);
3192 install_element(INTERFACE_NODE, &ip6_router_isis_cmd);
3193 install_element(INTERFACE_NODE, &ip6_router_isis_vrf_cmd);
3194 install_element(INTERFACE_NODE, &no_ip_router_isis_cmd);
3195 install_element(INTERFACE_NODE, &no_ip_router_isis_vrf_cmd);
3196 install_element(INTERFACE_NODE, &isis_bfd_cmd);
3197 install_element(INTERFACE_NODE, &isis_bfd_profile_cmd);
3198
3199 install_element(ISIS_NODE, &net_cmd);
3200
3201 install_element(ISIS_NODE, &is_type_cmd);
3202 install_element(ISIS_NODE, &no_is_type_cmd);
3203
3204 install_element(ISIS_NODE, &dynamic_hostname_cmd);
3205
3206 install_element(ISIS_NODE, &set_overload_bit_cmd);
3207 install_element(ISIS_NODE, &set_overload_bit_on_startup_cmd);
3208 install_element(ISIS_NODE, &no_set_overload_bit_on_startup_cmd);
3209
3210 install_element(ISIS_NODE, &attached_bit_send_cmd);
3211 install_element(ISIS_NODE, &attached_bit_receive_ignore_cmd);
3212
3213 install_element(ISIS_NODE, &metric_style_cmd);
3214 install_element(ISIS_NODE, &no_metric_style_cmd);
3215
3216 install_element(ISIS_NODE, &advertise_high_metrics_cmd);
3217
3218 install_element(ISIS_NODE, &area_passwd_cmd);
3219 install_element(ISIS_NODE, &domain_passwd_cmd);
3220 install_element(ISIS_NODE, &no_area_passwd_cmd);
3221
3222 install_element(ISIS_NODE, &lsp_gen_interval_cmd);
3223 install_element(ISIS_NODE, &no_lsp_gen_interval_cmd);
3224 install_element(ISIS_NODE, &lsp_refresh_interval_cmd);
3225 install_element(ISIS_NODE, &no_lsp_refresh_interval_cmd);
3226 install_element(ISIS_NODE, &max_lsp_lifetime_cmd);
3227 install_element(ISIS_NODE, &no_max_lsp_lifetime_cmd);
3228 install_element(ISIS_NODE, &lsp_timers_cmd);
3229 install_element(ISIS_NODE, &no_lsp_timers_cmd);
3230 install_element(ISIS_NODE, &area_lsp_mtu_cmd);
3231 install_element(ISIS_NODE, &no_area_lsp_mtu_cmd);
3232 install_element(ISIS_NODE, &advertise_passive_only_cmd);
3233
3234 install_element(ISIS_NODE, &spf_interval_cmd);
3235 install_element(ISIS_NODE, &no_spf_interval_cmd);
3236 install_element(ISIS_NODE, &spf_prefix_priority_cmd);
3237 install_element(ISIS_NODE, &no_spf_prefix_priority_cmd);
3238 install_element(ISIS_NODE, &spf_delay_ietf_cmd);
3239 install_element(ISIS_NODE, &no_spf_delay_ietf_cmd);
3240
3241 install_element(ISIS_NODE, &area_purge_originator_cmd);
3242
3243 install_element(ISIS_NODE, &isis_mpls_te_on_cmd);
3244 install_element(ISIS_NODE, &no_isis_mpls_te_on_cmd);
3245 install_element(ISIS_NODE, &isis_mpls_te_router_addr_cmd);
3246 install_element(ISIS_NODE, &no_isis_mpls_te_router_addr_cmd);
3247 install_element(ISIS_NODE, &isis_mpls_te_router_addr_v6_cmd);
3248 install_element(ISIS_NODE, &no_isis_mpls_te_router_addr_v6_cmd);
3249 install_element(ISIS_NODE, &isis_mpls_te_inter_as_cmd);
3250 install_element(ISIS_NODE, &isis_mpls_te_export_cmd);
3251 install_element(ISIS_NODE, &no_isis_mpls_te_export_cmd);
3252
3253 install_element(ISIS_NODE, &isis_default_originate_cmd);
3254 install_element(ISIS_NODE, &isis_redistribute_cmd);
3255
3256 install_element(ISIS_NODE, &isis_topology_cmd);
3257
3258 install_element(ISIS_NODE, &isis_sr_enable_cmd);
3259 install_element(ISIS_NODE, &no_isis_sr_enable_cmd);
3260 install_element(ISIS_NODE, &isis_sr_global_block_label_range_cmd);
3261 install_element(ISIS_NODE, &no_isis_sr_global_block_label_range_cmd);
3262 install_element(ISIS_NODE, &isis_sr_node_msd_cmd);
3263 install_element(ISIS_NODE, &no_isis_sr_node_msd_cmd);
3264 install_element(ISIS_NODE, &isis_sr_prefix_sid_cmd);
3265 install_element(ISIS_NODE, &no_isis_sr_prefix_sid_cmd);
3266 install_element(ISIS_NODE, &isis_frr_lfa_priority_limit_cmd);
3267 install_element(ISIS_NODE, &isis_frr_lfa_tiebreaker_cmd);
3268 install_element(ISIS_NODE, &isis_frr_lfa_load_sharing_cmd);
3269 install_element(ISIS_NODE, &isis_frr_remote_lfa_plist_cmd);
3270 install_element(ISIS_NODE, &no_isis_frr_remote_lfa_plist_cmd);
3271
3272 install_element(INTERFACE_NODE, &isis_passive_cmd);
3273
3274 install_element(INTERFACE_NODE, &isis_passwd_cmd);
3275 install_element(INTERFACE_NODE, &no_isis_passwd_cmd);
3276
3277 install_element(INTERFACE_NODE, &isis_metric_cmd);
3278 install_element(INTERFACE_NODE, &no_isis_metric_cmd);
3279
3280 install_element(INTERFACE_NODE, &isis_hello_interval_cmd);
3281 install_element(INTERFACE_NODE, &no_isis_hello_interval_cmd);
3282
3283 install_element(INTERFACE_NODE, &isis_hello_multiplier_cmd);
3284 install_element(INTERFACE_NODE, &no_isis_hello_multiplier_cmd);
3285
3286 install_element(INTERFACE_NODE, &isis_threeway_adj_cmd);
3287
3288 install_element(INTERFACE_NODE, &isis_hello_padding_cmd);
3289
3290 install_element(INTERFACE_NODE, &csnp_interval_cmd);
3291 install_element(INTERFACE_NODE, &no_csnp_interval_cmd);
3292
3293 install_element(INTERFACE_NODE, &psnp_interval_cmd);
3294 install_element(INTERFACE_NODE, &no_psnp_interval_cmd);
3295
3296 install_element(INTERFACE_NODE, &circuit_topology_cmd);
3297
3298 install_element(INTERFACE_NODE, &isis_circuit_type_cmd);
3299 install_element(INTERFACE_NODE, &no_isis_circuit_type_cmd);
3300
3301 install_element(INTERFACE_NODE, &isis_network_cmd);
3302
3303 install_element(INTERFACE_NODE, &isis_priority_cmd);
3304 install_element(INTERFACE_NODE, &no_isis_priority_cmd);
3305
3306 install_element(INTERFACE_NODE, &isis_lfa_cmd);
3307 install_element(INTERFACE_NODE, &isis_lfa_exclude_interface_cmd);
3308 install_element(INTERFACE_NODE, &isis_remote_lfa_cmd);
3309 install_element(INTERFACE_NODE, &isis_remote_lfa_max_metric_cmd);
3310 install_element(INTERFACE_NODE, &isis_ti_lfa_cmd);
3311
3312 install_element(ISIS_NODE, &log_adj_changes_cmd);
3313 install_element(ISIS_NODE, &log_pdu_drops_cmd);
3314
3315 install_element(ISIS_NODE, &isis_mpls_ldp_sync_cmd);
3316 install_element(ISIS_NODE, &no_isis_mpls_ldp_sync_cmd);
3317 install_element(ISIS_NODE, &isis_mpls_ldp_sync_holddown_cmd);
3318 install_element(ISIS_NODE, &no_isis_mpls_ldp_sync_holddown_cmd);
3319 install_element(INTERFACE_NODE, &isis_mpls_if_ldp_sync_cmd);
3320 install_element(INTERFACE_NODE, &isis_mpls_if_ldp_sync_holddown_cmd);
3321 install_element(INTERFACE_NODE, &no_isis_mpls_if_ldp_sync_holddown_cmd);
3322}
3323
3324#endif /* ifndef FABRICD */