]> git.proxmox.com Git - mirror_frr.git/blob - isisd/isis_northbound.c
isisd: retrofit the 'isis [c|p]snp-interval' commands
[mirror_frr.git] / isisd / isis_northbound.c
1 /*
2 * Copyright (C) 2001,2002 Sampo Saaristo
3 * Tampere University of Technology
4 * Institute of Communications Engineering
5 * Copyright (C) 2018 Volta Networks
6 * Emanuele Di Pascale
7 *
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License as published by the Free
10 * Software Foundation; either version 2 of the License, or (at your option)
11 * any later version.
12 *
13 * This program is distributed in the hope that it will be useful, but WITHOUT
14 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
16 * more details.
17 *
18 * You should have received a copy of the GNU General Public License along
19 * with this program; see the file COPYING; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21 */
22
23 #include <zebra.h>
24 #include "northbound.h"
25 #include "libfrr.h"
26 #include "linklist.h"
27 #include "log.h"
28 #include "isisd/dict.h"
29 #include "isisd/isis_constants.h"
30 #include "isisd/isis_common.h"
31 #include "isisd/isis_flags.h"
32 #include "isisd/isis_circuit.h"
33 #include "isisd/isisd.h"
34 #include "isisd/isis_lsp.h"
35 #include "isisd/isis_pdu.h"
36 #include "isisd/isis_dynhn.h"
37 #include "isisd/isis_misc.h"
38 #include "isisd/isis_csm.h"
39 #include "isisd/isis_adjacency.h"
40 #include "isisd/isis_spf.h"
41 #include "isisd/isis_te.h"
42 #include "isisd/isis_memory.h"
43 #include "isisd/isis_mt.h"
44 #include "isisd/isis_cli.h"
45 #include "isisd/isis_redist.h"
46 #include "lib/spf_backoff.h"
47 #include "lib/lib_errors.h"
48 #include "lib/vrf.h"
49
50 /*
51 * XPath: /frr-isisd:isis/instance
52 */
53 static int isis_instance_create(enum nb_event event,
54 const struct lyd_node *dnode,
55 union nb_resource *resource)
56 {
57 struct isis_area *area;
58 const char *area_tag;
59
60 if (event != NB_EV_APPLY)
61 return NB_OK;
62
63 area_tag = yang_dnode_get_string(dnode, "./area-tag");
64 area = isis_area_lookup(area_tag);
65 if (area)
66 return NB_ERR_INCONSISTENCY;
67
68 area = isis_area_create(area_tag);
69 /* save area in dnode to avoid looking it up all the time */
70 yang_dnode_set_entry(dnode, area);
71
72 return NB_OK;
73 }
74
75 static int isis_instance_delete(enum nb_event event,
76 const struct lyd_node *dnode)
77 {
78 const char *area_tag;
79
80 if (event != NB_EV_APPLY)
81 return NB_OK;
82
83 area_tag = yang_dnode_get_string(dnode, "./area-tag");
84 isis_area_destroy(area_tag);
85
86 return NB_OK;
87 }
88
89 /*
90 * XPath: /frr-isisd:isis/instance/is-type
91 */
92 static int isis_instance_is_type_modify(enum nb_event event,
93 const struct lyd_node *dnode,
94 union nb_resource *resource)
95 {
96 struct isis_area *area;
97 int type;
98
99 if (event != NB_EV_APPLY)
100 return NB_OK;
101
102 area = yang_dnode_get_entry(dnode, true);
103 type = yang_dnode_get_enum(dnode, NULL);
104 isis_area_is_type_set(area, type);
105
106 return NB_OK;
107 }
108
109 /*
110 * XPath: /frr-isisd:isis/instance/area-address
111 */
112 static int isis_instance_area_address_create(enum nb_event event,
113 const struct lyd_node *dnode,
114 union nb_resource *resource)
115 {
116 struct isis_area *area;
117 struct area_addr addr, *addrr = NULL, *addrp = NULL;
118 struct listnode *node;
119 uint8_t buff[255];
120 const char *net_title = yang_dnode_get_string(dnode, NULL);
121
122 switch (event) {
123 case NB_EV_VALIDATE:
124 addr.addr_len = dotformat2buff(buff, net_title);
125 memcpy(addr.area_addr, buff, addr.addr_len);
126 if (addr.area_addr[addr.addr_len - 1] != 0) {
127 flog_warn(
128 EC_LIB_NB_CB_CONFIG_VALIDATE,
129 "nsel byte (last byte) in area address must be 0");
130 return NB_ERR_VALIDATION;
131 }
132 if (isis->sysid_set) {
133 /* Check that the SystemID portions match */
134 if (memcmp(isis->sysid, GETSYSID((&addr)),
135 ISIS_SYS_ID_LEN)) {
136 flog_warn(
137 EC_LIB_NB_CB_CONFIG_VALIDATE,
138 "System ID must not change when defining additional area addresses");
139 return NB_ERR_VALIDATION;
140 }
141 }
142 break;
143 case NB_EV_PREPARE:
144 addrr = XMALLOC(MTYPE_ISIS_AREA_ADDR, sizeof(struct area_addr));
145 addrr->addr_len = dotformat2buff(buff, net_title);
146 memcpy(addrr->area_addr, buff, addrr->addr_len);
147 resource->ptr = addrr;
148 break;
149 case NB_EV_ABORT:
150 XFREE(MTYPE_ISIS_AREA_ADDR, resource->ptr);
151 break;
152 case NB_EV_APPLY:
153 area = yang_dnode_get_entry(dnode, true);
154 addrr = resource->ptr;
155
156 if (isis->sysid_set == 0) {
157 /*
158 * First area address - get the SystemID for this router
159 */
160 memcpy(isis->sysid, GETSYSID(addrr), ISIS_SYS_ID_LEN);
161 isis->sysid_set = 1;
162 } else {
163 /* check that we don't already have this address */
164 for (ALL_LIST_ELEMENTS_RO(area->area_addrs, node,
165 addrp)) {
166 if ((addrp->addr_len + ISIS_SYS_ID_LEN
167 + ISIS_NSEL_LEN)
168 != (addrr->addr_len))
169 continue;
170 if (!memcmp(addrp->area_addr, addrr->area_addr,
171 addrr->addr_len)) {
172 XFREE(MTYPE_ISIS_AREA_ADDR, addrr);
173 return NB_OK; /* silent fail */
174 }
175 }
176 }
177
178 /*Forget the systemID part of the address */
179 addrr->addr_len -= (ISIS_SYS_ID_LEN + ISIS_NSEL_LEN);
180 assert(area->area_addrs); /* to silence scan-build sillyness */
181 listnode_add(area->area_addrs, addrr);
182
183 /* only now we can safely generate our LSPs for this area */
184 if (listcount(area->area_addrs) > 0) {
185 if (area->is_type & IS_LEVEL_1)
186 lsp_generate(area, IS_LEVEL_1);
187 if (area->is_type & IS_LEVEL_2)
188 lsp_generate(area, IS_LEVEL_2);
189 }
190 break;
191 }
192
193 return NB_OK;
194 }
195
196 static int isis_instance_area_address_delete(enum nb_event event,
197 const struct lyd_node *dnode)
198 {
199 struct area_addr addr, *addrp = NULL;
200 struct listnode *node;
201 uint8_t buff[255];
202 struct isis_area *area;
203 const char *net_title;
204
205 if (event != NB_EV_APPLY)
206 return NB_OK;
207
208 net_title = yang_dnode_get_string(dnode, NULL);
209 addr.addr_len = dotformat2buff(buff, net_title);
210 memcpy(addr.area_addr, buff, (int)addr.addr_len);
211 area = yang_dnode_get_entry(dnode, true);
212 for (ALL_LIST_ELEMENTS_RO(area->area_addrs, node, addrp)) {
213 if ((addrp->addr_len + ISIS_SYS_ID_LEN + 1) == addr.addr_len
214 && !memcmp(addrp->area_addr, addr.area_addr, addr.addr_len))
215 break;
216 }
217 if (!addrp)
218 return NB_ERR_INCONSISTENCY;
219
220 listnode_delete(area->area_addrs, addrp);
221 XFREE(MTYPE_ISIS_AREA_ADDR, addrp);
222 /*
223 * Last area address - reset the SystemID for this router
224 */
225 if (listcount(area->area_addrs) == 0) {
226 memset(isis->sysid, 0, ISIS_SYS_ID_LEN);
227 isis->sysid_set = 0;
228 if (isis->debugs & DEBUG_EVENTS)
229 zlog_debug("Router has no SystemID");
230 }
231
232 return NB_OK;
233 }
234
235 /*
236 * XPath: /frr-isisd:isis/instance/dynamic-hostname
237 */
238 static int isis_instance_dynamic_hostname_modify(enum nb_event event,
239 const struct lyd_node *dnode,
240 union nb_resource *resource)
241 {
242 struct isis_area *area;
243
244 if (event != NB_EV_APPLY)
245 return NB_OK;
246
247 area = yang_dnode_get_entry(dnode, true);
248 isis_area_dynhostname_set(area, yang_dnode_get_bool(dnode, NULL));
249
250 return NB_OK;
251 }
252
253 /*
254 * XPath: /frr-isisd:isis/instance/attached
255 */
256 static int isis_instance_attached_create(enum nb_event event,
257 const struct lyd_node *dnode,
258 union nb_resource *resource)
259 {
260 struct isis_area *area;
261
262 if (event != NB_EV_APPLY)
263 return NB_OK;
264
265 area = yang_dnode_get_entry(dnode, true);
266 isis_area_attached_bit_set(area, true);
267
268 return NB_OK;
269 }
270
271 static int isis_instance_attached_delete(enum nb_event event,
272 const struct lyd_node *dnode)
273 {
274 struct isis_area *area;
275
276 if (event != NB_EV_APPLY)
277 return NB_OK;
278
279 area = yang_dnode_get_entry(dnode, true);
280 isis_area_attached_bit_set(area, false);
281
282 return NB_OK;
283 }
284
285 /*
286 * XPath: /frr-isisd:isis/instance/overload
287 */
288 static int isis_instance_overload_create(enum nb_event event,
289 const struct lyd_node *dnode,
290 union nb_resource *resource)
291 {
292 struct isis_area *area;
293
294 if (event != NB_EV_APPLY)
295 return NB_OK;
296
297 area = yang_dnode_get_entry(dnode, true);
298 isis_area_overload_bit_set(area, true);
299
300 return NB_OK;
301 }
302
303 static int isis_instance_overload_delete(enum nb_event event,
304 const struct lyd_node *dnode)
305 {
306 struct isis_area *area;
307
308 if (event != NB_EV_APPLY)
309 return NB_OK;
310
311 area = yang_dnode_get_entry(dnode, true);
312 isis_area_overload_bit_set(area, false);
313
314 return NB_OK;
315 }
316
317 /*
318 * XPath: /frr-isisd:isis/instance/metric-style
319 */
320 static int isis_instance_metric_style_modify(enum nb_event event,
321 const struct lyd_node *dnode,
322 union nb_resource *resource)
323 {
324 struct isis_area *area;
325 bool old_metric, new_metric;
326 enum isis_metric_style metric_style = yang_dnode_get_enum(dnode, NULL);
327
328 if (event != NB_EV_APPLY)
329 return NB_OK;
330
331 area = yang_dnode_get_entry(dnode, true);
332 old_metric = (metric_style == ISIS_WIDE_METRIC) ? false : true;
333 new_metric = (metric_style == ISIS_NARROW_METRIC) ? false : true;
334 isis_area_metricstyle_set(area, old_metric, new_metric);
335
336 return NB_OK;
337 }
338
339 /*
340 * XPath: /frr-isisd:isis/instance/purge-originator
341 */
342 static int isis_instance_purge_originator_create(enum nb_event event,
343 const struct lyd_node *dnode,
344 union nb_resource *resource)
345 {
346 struct isis_area *area;
347
348 if (event != NB_EV_APPLY)
349 return NB_OK;
350
351 area = yang_dnode_get_entry(dnode, true);
352 area->purge_originator = true;
353
354 return NB_OK;
355 }
356
357 static int isis_instance_purge_originator_delete(enum nb_event event,
358 const struct lyd_node *dnode)
359 {
360 struct isis_area *area;
361
362 if (event != NB_EV_APPLY)
363 return NB_OK;
364
365 area = yang_dnode_get_entry(dnode, true);
366 area->purge_originator = false;
367
368 return NB_OK;
369 }
370
371 /*
372 * XPath: /frr-isisd:isis/instance/lsp/mtu
373 */
374 static int isis_instance_lsp_mtu_modify(enum nb_event event,
375 const struct lyd_node *dnode,
376 union nb_resource *resource)
377 {
378 struct listnode *node;
379 struct isis_circuit *circuit;
380 uint16_t lsp_mtu = yang_dnode_get_uint16(dnode, NULL);
381 struct isis_area *area;
382
383 switch (event) {
384 case NB_EV_VALIDATE:
385 area = yang_dnode_get_entry(dnode, false);
386 if (!area)
387 break;
388 for (ALL_LIST_ELEMENTS_RO(area->circuit_list, node, circuit)) {
389 if (circuit->state != C_STATE_INIT
390 && circuit->state != C_STATE_UP)
391 continue;
392 if (lsp_mtu > isis_circuit_pdu_size(circuit)) {
393 flog_warn(
394 EC_LIB_NB_CB_CONFIG_VALIDATE,
395 "ISIS area contains circuit %s, which has a maximum PDU size of %zu",
396 circuit->interface->name,
397 isis_circuit_pdu_size(circuit));
398 return NB_ERR_VALIDATION;
399 }
400 }
401 break;
402 case NB_EV_PREPARE:
403 case NB_EV_ABORT:
404 break;
405 case NB_EV_APPLY:
406 area = yang_dnode_get_entry(dnode, true);
407 isis_area_lsp_mtu_set(area, lsp_mtu);
408 break;
409 }
410
411 return NB_OK;
412 }
413
414 /*
415 * XPath: /frr-isisd:isis/instance/lsp/refresh-interval/level-1
416 */
417 static int
418 isis_instance_lsp_refresh_interval_level_1_modify(enum nb_event event,
419 const struct lyd_node *dnode,
420 union nb_resource *resource)
421 {
422 struct isis_area *area;
423 uint16_t refr_int;
424
425 if (event != NB_EV_APPLY)
426 return NB_OK;
427
428 refr_int = yang_dnode_get_uint16(dnode, NULL);
429 area = yang_dnode_get_entry(dnode, true);
430 isis_area_lsp_refresh_set(area, IS_LEVEL_1, refr_int);
431
432 return NB_OK;
433 }
434
435 /*
436 * XPath: /frr-isisd:isis/instance/lsp/refresh-interval/level-2
437 */
438 static int
439 isis_instance_lsp_refresh_interval_level_2_modify(enum nb_event event,
440 const struct lyd_node *dnode,
441 union nb_resource *resource)
442 {
443 struct isis_area *area;
444 uint16_t refr_int;
445
446 if (event != NB_EV_APPLY)
447 return NB_OK;
448
449 refr_int = yang_dnode_get_uint16(dnode, NULL);
450 area = yang_dnode_get_entry(dnode, true);
451 isis_area_lsp_refresh_set(area, IS_LEVEL_2, refr_int);
452
453 return NB_OK;
454 }
455
456 /*
457 * XPath: /frr-isisd:isis/instance/lsp/maximum-lifetime/level-1
458 */
459 static int
460 isis_instance_lsp_maximum_lifetime_level_1_modify(enum nb_event event,
461 const struct lyd_node *dnode,
462 union nb_resource *resource)
463 {
464 struct isis_area *area;
465 uint16_t max_lt;
466
467 if (event != NB_EV_APPLY)
468 return NB_OK;
469
470 max_lt = yang_dnode_get_uint16(dnode, NULL);
471 area = yang_dnode_get_entry(dnode, true);
472 isis_area_max_lsp_lifetime_set(area, IS_LEVEL_1, max_lt);
473
474 return NB_OK;
475 }
476
477 /*
478 * XPath: /frr-isisd:isis/instance/lsp/maximum-lifetime/level-2
479 */
480 static int
481 isis_instance_lsp_maximum_lifetime_level_2_modify(enum nb_event event,
482 const struct lyd_node *dnode,
483 union nb_resource *resource)
484 {
485 struct isis_area *area;
486 uint16_t max_lt;
487
488 if (event != NB_EV_APPLY)
489 return NB_OK;
490
491 max_lt = yang_dnode_get_uint16(dnode, NULL);
492 area = yang_dnode_get_entry(dnode, true);
493 isis_area_max_lsp_lifetime_set(area, IS_LEVEL_2, max_lt);
494
495 return NB_OK;
496 }
497
498 /*
499 * XPath: /frr-isisd:isis/instance/lsp/generation-interval/level-1
500 */
501 static int isis_instance_lsp_generation_interval_level_1_modify(
502 enum nb_event event, const struct lyd_node *dnode,
503 union nb_resource *resource)
504 {
505 struct isis_area *area;
506 uint16_t gen_int;
507
508 if (event != NB_EV_APPLY)
509 return NB_OK;
510
511 gen_int = yang_dnode_get_uint16(dnode, NULL);
512 area = yang_dnode_get_entry(dnode, true);
513 area->lsp_gen_interval[0] = gen_int;
514
515 return NB_OK;
516 }
517
518 /*
519 * XPath: /frr-isisd:isis/instance/lsp/generation-interval/level-2
520 */
521 static int isis_instance_lsp_generation_interval_level_2_modify(
522 enum nb_event event, const struct lyd_node *dnode,
523 union nb_resource *resource)
524 {
525 struct isis_area *area;
526 uint16_t gen_int;
527
528 if (event != NB_EV_APPLY)
529 return NB_OK;
530
531 gen_int = yang_dnode_get_uint16(dnode, NULL);
532 area = yang_dnode_get_entry(dnode, true);
533 area->lsp_gen_interval[1] = gen_int;
534
535 return NB_OK;
536 }
537
538 /*
539 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay
540 */
541 static void ietf_backoff_delay_apply_finish(const struct lyd_node *dnode)
542 {
543 long init_delay = yang_dnode_get_uint16(dnode, "./init-delay");
544 long short_delay = yang_dnode_get_uint16(dnode, "./short-delay");
545 long long_delay = yang_dnode_get_uint16(dnode, "./long-delay");
546 long holddown = yang_dnode_get_uint16(dnode, "./hold-down");
547 long timetolearn = yang_dnode_get_uint16(dnode, "./time-to-learn");
548 struct isis_area *area = yang_dnode_get_entry(dnode, true);
549 size_t bufsiz = strlen(area->area_tag) + sizeof("IS-IS Lx");
550 char *buf = XCALLOC(MTYPE_TMP, bufsiz);
551
552 snprintf(buf, bufsiz, "IS-IS %s L1", area->area_tag);
553 spf_backoff_free(area->spf_delay_ietf[0]);
554 area->spf_delay_ietf[0] =
555 spf_backoff_new(master, buf, init_delay, short_delay,
556 long_delay, holddown, timetolearn);
557
558 snprintf(buf, bufsiz, "IS-IS %s L2", area->area_tag);
559 spf_backoff_free(area->spf_delay_ietf[1]);
560 area->spf_delay_ietf[1] =
561 spf_backoff_new(master, buf, init_delay, short_delay,
562 long_delay, holddown, timetolearn);
563
564 XFREE(MTYPE_TMP, buf);
565 }
566
567 static int
568 isis_instance_spf_ietf_backoff_delay_create(enum nb_event event,
569 const struct lyd_node *dnode,
570 union nb_resource *resource)
571 {
572 /* All the work is done in the apply_finish */
573 return NB_OK;
574 }
575
576 static int
577 isis_instance_spf_ietf_backoff_delay_delete(enum nb_event event,
578 const struct lyd_node *dnode)
579 {
580 struct isis_area *area;
581
582 if (event != NB_EV_APPLY)
583 return NB_OK;
584
585 area = yang_dnode_get_entry(dnode, true);
586 spf_backoff_free(area->spf_delay_ietf[0]);
587 spf_backoff_free(area->spf_delay_ietf[1]);
588 area->spf_delay_ietf[0] = NULL;
589 area->spf_delay_ietf[1] = NULL;
590
591 return NB_OK;
592 }
593
594 /*
595 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay/init-delay
596 */
597 static int isis_instance_spf_ietf_backoff_delay_init_delay_modify(
598 enum nb_event event, const struct lyd_node *dnode,
599 union nb_resource *resource)
600 {
601 /* All the work is done in the apply_finish */
602 return NB_OK;
603 }
604
605 /*
606 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay/short-delay
607 */
608 static int isis_instance_spf_ietf_backoff_delay_short_delay_modify(
609 enum nb_event event, const struct lyd_node *dnode,
610 union nb_resource *resource)
611 {
612 /* All the work is done in the apply_finish */
613 return NB_OK;
614 }
615
616 /*
617 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay/long-delay
618 */
619 static int isis_instance_spf_ietf_backoff_delay_long_delay_modify(
620 enum nb_event event, const struct lyd_node *dnode,
621 union nb_resource *resource)
622 {
623 /* All the work is done in the apply_finish */
624 return NB_OK;
625 }
626
627 /*
628 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay/hold-down
629 */
630 static int isis_instance_spf_ietf_backoff_delay_hold_down_modify(
631 enum nb_event event, const struct lyd_node *dnode,
632 union nb_resource *resource)
633 {
634 /* All the work is done in the apply_finish */
635 return NB_OK;
636 }
637
638 /*
639 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay/time-to-learn
640 */
641 static int isis_instance_spf_ietf_backoff_delay_time_to_learn_modify(
642 enum nb_event event, const struct lyd_node *dnode,
643 union nb_resource *resource)
644 {
645 /* All the work is done in the apply_finish */
646 return NB_OK;
647 }
648
649 /*
650 * XPath: /frr-isisd:isis/instance/spf/minimum-interval/level-1
651 */
652 static int
653 isis_instance_spf_minimum_interval_level_1_modify(enum nb_event event,
654 const struct lyd_node *dnode,
655 union nb_resource *resource)
656 {
657 struct isis_area *area;
658
659 if (event != NB_EV_APPLY)
660 return NB_OK;
661
662 area = yang_dnode_get_entry(dnode, true);
663 area->min_spf_interval[0] = yang_dnode_get_uint16(dnode, NULL);
664
665 return NB_OK;
666 }
667
668 /*
669 * XPath: /frr-isisd:isis/instance/spf/minimum-interval/level-2
670 */
671 static int
672 isis_instance_spf_minimum_interval_level_2_modify(enum nb_event event,
673 const struct lyd_node *dnode,
674 union nb_resource *resource)
675 {
676 struct isis_area *area;
677
678 if (event != NB_EV_APPLY)
679 return NB_OK;
680
681 area = yang_dnode_get_entry(dnode, true);
682 area->min_spf_interval[1] = yang_dnode_get_uint16(dnode, NULL);
683
684 return NB_OK;
685 }
686
687 /*
688 * XPath: /frr-isisd:isis/instance/area-password
689 */
690 static void area_password_apply_finish(const struct lyd_node *dnode)
691 {
692 const char *password = yang_dnode_get_string(dnode, "./password");
693 struct isis_area *area = yang_dnode_get_entry(dnode, true);
694 int pass_type = yang_dnode_get_enum(dnode, "./password-type");
695 uint8_t snp_auth = yang_dnode_get_enum(dnode, "./authenticate-snp");
696
697 switch (pass_type) {
698 case ISIS_PASSWD_TYPE_CLEARTXT:
699 isis_area_passwd_cleartext_set(area, IS_LEVEL_1, password,
700 snp_auth);
701 break;
702 case ISIS_PASSWD_TYPE_HMAC_MD5:
703 isis_area_passwd_hmac_md5_set(area, IS_LEVEL_1, password,
704 snp_auth);
705 break;
706 }
707 }
708
709 static int isis_instance_area_password_create(enum nb_event event,
710 const struct lyd_node *dnode,
711 union nb_resource *resource)
712 {
713 /* actual setting is done in apply_finish */
714 return NB_OK;
715 }
716
717 static int isis_instance_area_password_delete(enum nb_event event,
718 const struct lyd_node *dnode)
719 {
720 struct isis_area *area;
721
722 if (event != NB_EV_APPLY)
723 return NB_OK;
724
725 area = yang_dnode_get_entry(dnode, true);
726 isis_area_passwd_unset(area, IS_LEVEL_1);
727
728 return NB_OK;
729 }
730
731 /*
732 * XPath: /frr-isisd:isis/instance/area-password/password
733 */
734 static int
735 isis_instance_area_password_password_modify(enum nb_event event,
736 const struct lyd_node *dnode,
737 union nb_resource *resource)
738 {
739 /* actual setting is done in apply_finish */
740 return NB_OK;
741 }
742
743 /*
744 * XPath: /frr-isisd:isis/instance/area-password/password-type
745 */
746 static int
747 isis_instance_area_password_password_type_modify(enum nb_event event,
748 const struct lyd_node *dnode,
749 union nb_resource *resource)
750 {
751 /* actual setting is done in apply_finish */
752 return NB_OK;
753 }
754
755 /*
756 * XPath: /frr-isisd:isis/instance/area-password/authenticate-snp
757 */
758 static int isis_instance_area_password_authenticate_snp_modify(
759 enum nb_event event, const struct lyd_node *dnode,
760 union nb_resource *resource)
761 {
762 /* actual setting is done in apply_finish */
763 return NB_OK;
764 }
765
766 /*
767 * XPath: /frr-isisd:isis/instance/domain-password
768 */
769 static void domain_password_apply_finish(const struct lyd_node *dnode)
770 {
771 const char *password = yang_dnode_get_string(dnode, "./password");
772 struct isis_area *area = yang_dnode_get_entry(dnode, true);
773 int pass_type = yang_dnode_get_enum(dnode, "./password-type");
774 uint8_t snp_auth = yang_dnode_get_enum(dnode, "./authenticate-snp");
775
776 switch (pass_type) {
777 case ISIS_PASSWD_TYPE_CLEARTXT:
778 isis_area_passwd_cleartext_set(area, IS_LEVEL_2, password,
779 snp_auth);
780 break;
781 case ISIS_PASSWD_TYPE_HMAC_MD5:
782 isis_area_passwd_hmac_md5_set(area, IS_LEVEL_2, password,
783 snp_auth);
784 break;
785 }
786 }
787
788 static int isis_instance_domain_password_create(enum nb_event event,
789 const struct lyd_node *dnode,
790 union nb_resource *resource)
791 {
792 /* actual setting is done in apply_finish */
793 return NB_OK;
794 }
795
796 static int isis_instance_domain_password_delete(enum nb_event event,
797 const struct lyd_node *dnode)
798 {
799 struct isis_area *area;
800
801 if (event != NB_EV_APPLY)
802 return NB_OK;
803
804 area = yang_dnode_get_entry(dnode, true);
805 isis_area_passwd_unset(area, IS_LEVEL_2);
806
807 return NB_OK;
808 }
809
810 /*
811 * XPath: /frr-isisd:isis/instance/domain-password/password
812 */
813 static int
814 isis_instance_domain_password_password_modify(enum nb_event event,
815 const struct lyd_node *dnode,
816 union nb_resource *resource)
817 {
818 /* actual setting is done in apply_finish */
819 return NB_OK;
820 }
821
822 /*
823 * XPath: /frr-isisd:isis/instance/domain-password/password-type
824 */
825 static int
826 isis_instance_domain_password_password_type_modify(enum nb_event event,
827 const struct lyd_node *dnode,
828 union nb_resource *resource)
829 {
830 /* actual setting is done in apply_finish */
831 return NB_OK;
832 }
833
834 /*
835 * XPath: /frr-isisd:isis/instance/domain-password/authenticate-snp
836 */
837 static int isis_instance_domain_password_authenticate_snp_modify(
838 enum nb_event event, const struct lyd_node *dnode,
839 union nb_resource *resource)
840 {
841 /* actual setting is done in apply_finish */
842 return NB_OK;
843 }
844
845 /*
846 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv4
847 */
848 static void default_info_origin_apply_finish(const struct lyd_node *dnode,
849 int family)
850 {
851 int originate_type = DEFAULT_ORIGINATE;
852 unsigned long metric = 0;
853 const char *routemap = NULL;
854 struct isis_area *area = yang_dnode_get_entry(dnode, true);
855 int level = yang_dnode_get_enum(dnode, "./level");
856
857 if (yang_dnode_exists(dnode, "./always")) {
858 originate_type = DEFAULT_ORIGINATE_ALWAYS;
859 } else if (family == AF_INET6) {
860 zlog_warn(
861 "%s: Zebra doesn't implement default-originate for IPv6 yet, so use with care or use default-originate always.",
862 __func__);
863 }
864
865 if (yang_dnode_exists(dnode, "./metric"))
866 metric = yang_dnode_get_uint32(dnode, "./metric");
867 else if (yang_dnode_exists(dnode, "./route-map"))
868 routemap = yang_dnode_get_string(dnode, "./route-map");
869
870 isis_redist_set(area, level, family, DEFAULT_ROUTE, metric, routemap,
871 originate_type);
872 }
873
874 static void default_info_origin_ipv4_apply_finish(const struct lyd_node *dnode)
875 {
876 default_info_origin_apply_finish(dnode, AF_INET);
877 }
878
879 static void default_info_origin_ipv6_apply_finish(const struct lyd_node *dnode)
880 {
881 default_info_origin_apply_finish(dnode, AF_INET6);
882 }
883
884 static int isis_instance_default_information_originate_ipv4_create(
885 enum nb_event event, const struct lyd_node *dnode,
886 union nb_resource *resource)
887 {
888 /* It's all done by default_info_origin_apply_finish */
889 return NB_OK;
890 }
891
892 static int isis_instance_default_information_originate_ipv4_delete(
893 enum nb_event event, const struct lyd_node *dnode)
894 {
895 struct isis_area *area;
896 int level;
897
898 if (event != NB_EV_APPLY)
899 return NB_OK;
900
901 area = yang_dnode_get_entry(dnode, true);
902 level = yang_dnode_get_enum(dnode, "./level");
903 isis_redist_unset(area, level, AF_INET, DEFAULT_ROUTE);
904
905 return NB_OK;
906 }
907
908 /*
909 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv4/always
910 */
911 static int isis_instance_default_information_originate_ipv4_always_create(
912 enum nb_event event, const struct lyd_node *dnode,
913 union nb_resource *resource)
914 {
915 /* It's all done by default_info_origin_apply_finish */
916 return NB_OK;
917 }
918
919 static int isis_instance_default_information_originate_ipv4_always_delete(
920 enum nb_event event, const struct lyd_node *dnode)
921 {
922 /* It's all done by default_info_origin_apply_finish */
923 return NB_OK;
924 }
925
926 /*
927 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv4/route-map
928 */
929 static int isis_instance_default_information_originate_ipv4_route_map_modify(
930 enum nb_event event, const struct lyd_node *dnode,
931 union nb_resource *resource)
932 {
933 /* It's all done by default_info_origin_apply_finish */
934 return NB_OK;
935 }
936
937 static int isis_instance_default_information_originate_ipv4_route_map_delete(
938 enum nb_event event, const struct lyd_node *dnode)
939 {
940 /* It's all done by default_info_origin_apply_finish */
941 return NB_OK;
942 }
943
944 /*
945 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv4/metric
946 */
947 static int isis_instance_default_information_originate_ipv4_metric_modify(
948 enum nb_event event, const struct lyd_node *dnode,
949 union nb_resource *resource)
950 {
951 /* It's all done by default_info_origin_apply_finish */
952 return NB_OK;
953 }
954
955 static int isis_instance_default_information_originate_ipv4_metric_delete(
956 enum nb_event event, const struct lyd_node *dnode)
957 {
958 /* It's all done by default_info_origin_apply_finish */
959 return NB_OK;
960 }
961
962 /*
963 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv6
964 */
965 static int isis_instance_default_information_originate_ipv6_create(
966 enum nb_event event, const struct lyd_node *dnode,
967 union nb_resource *resource)
968 {
969 /* It's all done by default_info_origin_apply_finish */
970 return NB_OK;
971 }
972
973 static int isis_instance_default_information_originate_ipv6_delete(
974 enum nb_event event, const struct lyd_node *dnode)
975 {
976 struct isis_area *area;
977 int level;
978
979 if (event != NB_EV_APPLY)
980 return NB_OK;
981
982 area = yang_dnode_get_entry(dnode, true);
983 level = yang_dnode_get_enum(dnode, "./level");
984 isis_redist_unset(area, level, AF_INET6, DEFAULT_ROUTE);
985
986 return NB_OK;
987 }
988
989 /*
990 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv6/always
991 */
992 static int isis_instance_default_information_originate_ipv6_always_create(
993 enum nb_event event, const struct lyd_node *dnode,
994 union nb_resource *resource)
995 {
996 /* It's all done by default_info_origin_apply_finish */
997 return NB_OK;
998 }
999
1000 static int isis_instance_default_information_originate_ipv6_always_delete(
1001 enum nb_event event, const struct lyd_node *dnode)
1002 {
1003 /* It's all done by default_info_origin_apply_finish */
1004 return NB_OK;
1005 }
1006
1007 /*
1008 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv6/route-map
1009 */
1010 static int isis_instance_default_information_originate_ipv6_route_map_modify(
1011 enum nb_event event, const struct lyd_node *dnode,
1012 union nb_resource *resource)
1013 {
1014 /* It's all done by default_info_origin_apply_finish */
1015 return NB_OK;
1016 }
1017
1018 static int isis_instance_default_information_originate_ipv6_route_map_delete(
1019 enum nb_event event, const struct lyd_node *dnode)
1020 {
1021 /* It's all done by default_info_origin_apply_finish */
1022 return NB_OK;
1023 }
1024
1025 /*
1026 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv6/metric
1027 */
1028 static int isis_instance_default_information_originate_ipv6_metric_modify(
1029 enum nb_event event, const struct lyd_node *dnode,
1030 union nb_resource *resource)
1031 {
1032 /* It's all done by default_info_origin_apply_finish */
1033 return NB_OK;
1034 }
1035
1036 static int isis_instance_default_information_originate_ipv6_metric_delete(
1037 enum nb_event event, const struct lyd_node *dnode)
1038 {
1039 /* It's all done by default_info_origin_apply_finish */
1040 return NB_OK;
1041 }
1042
1043 /*
1044 * XPath: /frr-isisd:isis/instance/redistribute/ipv4
1045 */
1046 static void redistribute_apply_finish(const struct lyd_node *dnode, int family)
1047 {
1048 assert(family == AF_INET || family == AF_INET6);
1049 int type, level;
1050 unsigned long metric = 0;
1051 const char *routemap = NULL;
1052 struct isis_area *area;
1053
1054 type = yang_dnode_get_enum(dnode, "./protocol");
1055 level = yang_dnode_get_enum(dnode, "./level");
1056 area = yang_dnode_get_entry(dnode, true);
1057
1058 if (yang_dnode_exists(dnode, "./metric"))
1059 metric = yang_dnode_get_uint32(dnode, "./metric");
1060 else if (yang_dnode_exists(dnode, "./route-map"))
1061 routemap = yang_dnode_get_string(dnode, "./route-map");
1062
1063 isis_redist_set(area, level, family, type, metric, routemap, 0);
1064 }
1065
1066 static void redistribute_ipv4_apply_finish(const struct lyd_node *dnode)
1067 {
1068 redistribute_apply_finish(dnode, AF_INET);
1069 }
1070
1071 static void redistribute_ipv6_apply_finish(const struct lyd_node *dnode)
1072 {
1073 redistribute_apply_finish(dnode, AF_INET6);
1074 }
1075
1076 static int isis_instance_redistribute_ipv4_create(enum nb_event event,
1077 const struct lyd_node *dnode,
1078 union nb_resource *resource)
1079 {
1080 /* It's all done by redistribute_apply_finish */
1081 return NB_OK;
1082 }
1083
1084 static int isis_instance_redistribute_ipv4_delete(enum nb_event event,
1085 const struct lyd_node *dnode)
1086 {
1087 struct isis_area *area;
1088 int level, type;
1089
1090 if (event != NB_EV_APPLY)
1091 return NB_OK;
1092
1093 area = yang_dnode_get_entry(dnode, true);
1094 level = yang_dnode_get_enum(dnode, "./level");
1095 type = yang_dnode_get_enum(dnode, "./protocol");
1096 isis_redist_unset(area, level, AF_INET, type);
1097
1098 return NB_OK;
1099 }
1100
1101 /*
1102 * XPath: /frr-isisd:isis/instance/redistribute/ipv4/route-map
1103 */
1104 static int
1105 isis_instance_redistribute_ipv4_route_map_modify(enum nb_event event,
1106 const struct lyd_node *dnode,
1107 union nb_resource *resource)
1108 {
1109 /* It's all done by redistribute_apply_finish */
1110 return NB_OK;
1111 }
1112
1113 static int
1114 isis_instance_redistribute_ipv4_route_map_delete(enum nb_event event,
1115 const struct lyd_node *dnode)
1116 {
1117 /* It's all done by redistribute_apply_finish */
1118 return NB_OK;
1119 }
1120
1121 /*
1122 * XPath: /frr-isisd:isis/instance/redistribute/ipv4/metric
1123 */
1124 static int
1125 isis_instance_redistribute_ipv4_metric_modify(enum nb_event event,
1126 const struct lyd_node *dnode,
1127 union nb_resource *resource)
1128 {
1129 /* It's all done by redistribute_apply_finish */
1130 return NB_OK;
1131 }
1132
1133 static int
1134 isis_instance_redistribute_ipv4_metric_delete(enum nb_event event,
1135 const struct lyd_node *dnode)
1136 {
1137 /* It's all done by redistribute_apply_finish */
1138 return NB_OK;
1139 }
1140
1141 /*
1142 * XPath: /frr-isisd:isis/instance/redistribute/ipv6
1143 */
1144 static int isis_instance_redistribute_ipv6_create(enum nb_event event,
1145 const struct lyd_node *dnode,
1146 union nb_resource *resource)
1147 {
1148 /* It's all done by redistribute_apply_finish */
1149 return NB_OK;
1150 }
1151
1152 static int isis_instance_redistribute_ipv6_delete(enum nb_event event,
1153 const struct lyd_node *dnode)
1154 {
1155 struct isis_area *area;
1156 int level, type;
1157
1158 if (event != NB_EV_APPLY)
1159 return NB_OK;
1160
1161 area = yang_dnode_get_entry(dnode, true);
1162 level = yang_dnode_get_enum(dnode, "./level");
1163 type = yang_dnode_get_enum(dnode, "./protocol");
1164 isis_redist_unset(area, level, AF_INET6, type);
1165
1166 return NB_OK;
1167 }
1168
1169 /*
1170 * XPath: /frr-isisd:isis/instance/redistribute/ipv6/route-map
1171 */
1172 static int
1173 isis_instance_redistribute_ipv6_route_map_modify(enum nb_event event,
1174 const struct lyd_node *dnode,
1175 union nb_resource *resource)
1176 {
1177 /* It's all done by redistribute_apply_finish */
1178 return NB_OK;
1179 }
1180
1181 static int
1182 isis_instance_redistribute_ipv6_route_map_delete(enum nb_event event,
1183 const struct lyd_node *dnode)
1184 {
1185 /* It's all done by redistribute_apply_finish */
1186 return NB_OK;
1187 }
1188
1189 /*
1190 * XPath: /frr-isisd:isis/instance/redistribute/ipv6/metric
1191 */
1192 static int
1193 isis_instance_redistribute_ipv6_metric_modify(enum nb_event event,
1194 const struct lyd_node *dnode,
1195 union nb_resource *resource)
1196 {
1197 /* It's all done by redistribute_apply_finish */
1198 return NB_OK;
1199 }
1200
1201 static int
1202 isis_instance_redistribute_ipv6_metric_delete(enum nb_event event,
1203 const struct lyd_node *dnode)
1204 {
1205 /* It's all done by redistribute_apply_finish */
1206 return NB_OK;
1207 }
1208
1209 /*
1210 * XPath: /frr-isisd:isis/instance/multi-topology/ipv4-multicast
1211 */
1212 static int isis_multi_topology_common(enum nb_event event,
1213 const struct lyd_node *dnode,
1214 const char *topology, bool create)
1215 {
1216 struct isis_area *area;
1217 struct isis_area_mt_setting *setting;
1218 uint16_t mtid = isis_str2mtid(topology);
1219
1220 switch (event) {
1221 case NB_EV_VALIDATE:
1222 if (mtid == (uint16_t)-1) {
1223 flog_warn(EC_LIB_NB_CB_CONFIG_VALIDATE,
1224 "Unknown topology %s", topology);
1225 return NB_ERR_VALIDATION;
1226 }
1227 break;
1228 case NB_EV_PREPARE:
1229 case NB_EV_ABORT:
1230 break;
1231 case NB_EV_APPLY:
1232 area = yang_dnode_get_entry(dnode, true);
1233 setting = area_get_mt_setting(area, mtid);
1234 setting->enabled = create;
1235 lsp_regenerate_schedule(area, IS_LEVEL_1 | IS_LEVEL_2, 0);
1236 break;
1237 }
1238
1239 return NB_OK;
1240 }
1241
1242 static int isis_multi_topology_overload_common(enum nb_event event,
1243 const struct lyd_node *dnode,
1244 const char *topology,
1245 bool create)
1246 {
1247 struct isis_area *area;
1248 struct isis_area_mt_setting *setting;
1249 uint16_t mtid = isis_str2mtid(topology);
1250
1251 /* validation is done in isis_multi_topology_common */
1252 if (event != NB_EV_APPLY)
1253 return NB_OK;
1254
1255 area = yang_dnode_get_entry(dnode, true);
1256 setting = area_get_mt_setting(area, mtid);
1257 setting->overload = create;
1258 if (setting->enabled)
1259 lsp_regenerate_schedule(area, IS_LEVEL_1 | IS_LEVEL_2, 0);
1260
1261 return NB_OK;
1262 }
1263
1264 static int
1265 isis_instance_multi_topology_ipv4_multicast_create(enum nb_event event,
1266 const struct lyd_node *dnode,
1267 union nb_resource *resource)
1268 {
1269 return isis_multi_topology_common(event, dnode, "ipv4-multicast", true);
1270 }
1271
1272 static int
1273 isis_instance_multi_topology_ipv4_multicast_delete(enum nb_event event,
1274 const struct lyd_node *dnode)
1275 {
1276 return isis_multi_topology_common(event, dnode, "ipv4-multicast",
1277 false);
1278 }
1279
1280 /*
1281 * XPath: /frr-isisd:isis/instance/multi-topology/ipv4-multicast/overload
1282 */
1283 static int isis_instance_multi_topology_ipv4_multicast_overload_create(
1284 enum nb_event event, const struct lyd_node *dnode,
1285 union nb_resource *resource)
1286 {
1287 return isis_multi_topology_overload_common(event, dnode,
1288 "ipv4-multicast", true);
1289 }
1290
1291 static int isis_instance_multi_topology_ipv4_multicast_overload_delete(
1292 enum nb_event event, const struct lyd_node *dnode)
1293 {
1294 return isis_multi_topology_overload_common(event, dnode,
1295 "ipv4-multicast", false);
1296 }
1297
1298 /*
1299 * XPath: /frr-isisd:isis/instance/multi-topology/ipv4-management
1300 */
1301 static int isis_instance_multi_topology_ipv4_management_create(
1302 enum nb_event event, const struct lyd_node *dnode,
1303 union nb_resource *resource)
1304 {
1305 return isis_multi_topology_common(event, dnode, "ipv4-mgmt", true);
1306 }
1307
1308 static int isis_instance_multi_topology_ipv4_management_delete(
1309 enum nb_event event, const struct lyd_node *dnode)
1310 {
1311 return isis_multi_topology_common(event, dnode, "ipv4-mgmt", false);
1312 }
1313
1314 /*
1315 * XPath: /frr-isisd:isis/instance/multi-topology/ipv4-management/overload
1316 */
1317 static int isis_instance_multi_topology_ipv4_management_overload_create(
1318 enum nb_event event, const struct lyd_node *dnode,
1319 union nb_resource *resource)
1320 {
1321 return isis_multi_topology_overload_common(event, dnode, "ipv4-mgmt",
1322 true);
1323 }
1324
1325 static int isis_instance_multi_topology_ipv4_management_overload_delete(
1326 enum nb_event event, const struct lyd_node *dnode)
1327 {
1328 return isis_multi_topology_overload_common(event, dnode, "ipv4-mgmt",
1329 false);
1330 }
1331
1332 /*
1333 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-unicast
1334 */
1335 static int
1336 isis_instance_multi_topology_ipv6_unicast_create(enum nb_event event,
1337 const struct lyd_node *dnode,
1338 union nb_resource *resource)
1339 {
1340 return isis_multi_topology_common(event, dnode, "ipv6-unicast", true);
1341 }
1342
1343 static int
1344 isis_instance_multi_topology_ipv6_unicast_delete(enum nb_event event,
1345 const struct lyd_node *dnode)
1346 {
1347 return isis_multi_topology_common(event, dnode, "ipv6-unicast", false);
1348 }
1349
1350 /*
1351 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-unicast/overload
1352 */
1353 static int isis_instance_multi_topology_ipv6_unicast_overload_create(
1354 enum nb_event event, const struct lyd_node *dnode,
1355 union nb_resource *resource)
1356 {
1357 return isis_multi_topology_overload_common(event, dnode, "ipv6-unicast",
1358 true);
1359 }
1360
1361 static int isis_instance_multi_topology_ipv6_unicast_overload_delete(
1362 enum nb_event event, const struct lyd_node *dnode)
1363 {
1364 return isis_multi_topology_overload_common(event, dnode, "ipv6-unicast",
1365 false);
1366 }
1367
1368 /*
1369 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-multicast
1370 */
1371 static int
1372 isis_instance_multi_topology_ipv6_multicast_create(enum nb_event event,
1373 const struct lyd_node *dnode,
1374 union nb_resource *resource)
1375 {
1376 return isis_multi_topology_common(event, dnode, "ipv6-multicast", true);
1377 }
1378
1379 static int
1380 isis_instance_multi_topology_ipv6_multicast_delete(enum nb_event event,
1381 const struct lyd_node *dnode)
1382 {
1383 return isis_multi_topology_common(event, dnode, "ipv6-multicast",
1384 false);
1385 }
1386
1387 /*
1388 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-multicast/overload
1389 */
1390 static int isis_instance_multi_topology_ipv6_multicast_overload_create(
1391 enum nb_event event, const struct lyd_node *dnode,
1392 union nb_resource *resource)
1393 {
1394 return isis_multi_topology_overload_common(event, dnode,
1395 "ipv6-multicast", true);
1396 }
1397
1398 static int isis_instance_multi_topology_ipv6_multicast_overload_delete(
1399 enum nb_event event, const struct lyd_node *dnode)
1400 {
1401 return isis_multi_topology_overload_common(event, dnode,
1402 "ipv6-multicast", false);
1403 }
1404
1405 /*
1406 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-management
1407 */
1408 static int isis_instance_multi_topology_ipv6_management_create(
1409 enum nb_event event, const struct lyd_node *dnode,
1410 union nb_resource *resource)
1411 {
1412 return isis_multi_topology_common(event, dnode, "ipv6-mgmt", true);
1413 }
1414
1415 static int isis_instance_multi_topology_ipv6_management_delete(
1416 enum nb_event event, const struct lyd_node *dnode)
1417 {
1418 return isis_multi_topology_common(event, dnode, "ipv6-mgmt", false);
1419 }
1420
1421 /*
1422 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-management/overload
1423 */
1424 static int isis_instance_multi_topology_ipv6_management_overload_create(
1425 enum nb_event event, const struct lyd_node *dnode,
1426 union nb_resource *resource)
1427 {
1428 return isis_multi_topology_overload_common(event, dnode, "ipv6-mgmt",
1429 true);
1430 }
1431
1432 static int isis_instance_multi_topology_ipv6_management_overload_delete(
1433 enum nb_event event, const struct lyd_node *dnode)
1434 {
1435 return isis_multi_topology_overload_common(event, dnode, "ipv6-mgmt",
1436 false);
1437 }
1438
1439 /*
1440 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-dstsrc
1441 */
1442 static int
1443 isis_instance_multi_topology_ipv6_dstsrc_create(enum nb_event event,
1444 const struct lyd_node *dnode,
1445 union nb_resource *resource)
1446 {
1447 return isis_multi_topology_common(event, dnode, "ipv6-dstsrc", true);
1448 }
1449
1450 static int
1451 isis_instance_multi_topology_ipv6_dstsrc_delete(enum nb_event event,
1452 const struct lyd_node *dnode)
1453 {
1454 return isis_multi_topology_common(event, dnode, "ipv6-dstsrc", false);
1455 }
1456
1457 /*
1458 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-dstsrc/overload
1459 */
1460 static int isis_instance_multi_topology_ipv6_dstsrc_overload_create(
1461 enum nb_event event, const struct lyd_node *dnode,
1462 union nb_resource *resource)
1463 {
1464 return isis_multi_topology_overload_common(event, dnode, "ipv6-dstsrc",
1465 true);
1466 }
1467
1468 static int isis_instance_multi_topology_ipv6_dstsrc_overload_delete(
1469 enum nb_event event, const struct lyd_node *dnode)
1470 {
1471 return isis_multi_topology_overload_common(event, dnode, "ipv6-dstsrc",
1472 false);
1473 }
1474
1475 /*
1476 * XPath: /frr-isisd:isis/instance/log-adjacency-changes
1477 */
1478 static int
1479 isis_instance_log_adjacency_changes_create(enum nb_event event,
1480 const struct lyd_node *dnode,
1481 union nb_resource *resource)
1482 {
1483 /* TODO: implement me. */
1484 return NB_OK;
1485 }
1486
1487 static int
1488 isis_instance_log_adjacency_changes_delete(enum nb_event event,
1489 const struct lyd_node *dnode)
1490 {
1491 /* TODO: implement me. */
1492 return NB_OK;
1493 }
1494
1495 /*
1496 * XPath: /frr-isisd:isis/mpls-te
1497 */
1498 static int isis_mpls_te_create(enum nb_event event,
1499 const struct lyd_node *dnode,
1500 union nb_resource *resource)
1501 {
1502 struct listnode *node;
1503 struct isis_circuit *circuit;
1504
1505 if (event != NB_EV_APPLY)
1506 return NB_OK;
1507
1508 isisMplsTE.status = enable;
1509
1510 /*
1511 * Following code is intended to handle two cases;
1512 *
1513 * 1) MPLS-TE was disabled at startup time, but now become enabled.
1514 * In this case, we must enable MPLS-TE Circuit regarding interface
1515 * MPLS_TE flag
1516 * 2) MPLS-TE was once enabled then disabled, and now enabled again.
1517 */
1518 for (ALL_LIST_ELEMENTS_RO(isisMplsTE.cir_list, node, circuit)) {
1519 if (circuit->mtc == NULL || IS_FLOOD_AS(circuit->mtc->type))
1520 continue;
1521
1522 if ((circuit->mtc->status == disable)
1523 && HAS_LINK_PARAMS(circuit->interface))
1524 circuit->mtc->status = enable;
1525 else
1526 continue;
1527
1528 /* Reoriginate STD_TE & GMPLS circuits */
1529 if (circuit->area)
1530 lsp_regenerate_schedule(circuit->area, circuit->is_type,
1531 0);
1532 }
1533
1534 return NB_OK;
1535 }
1536
1537 static int isis_mpls_te_delete(enum nb_event event,
1538 const struct lyd_node *dnode)
1539 {
1540 struct listnode *node;
1541 struct isis_circuit *circuit;
1542
1543 if (event != NB_EV_APPLY)
1544 return NB_OK;
1545
1546 isisMplsTE.status = disable;
1547
1548 /* Flush LSP if circuit engage */
1549 for (ALL_LIST_ELEMENTS_RO(isisMplsTE.cir_list, node, circuit)) {
1550 if (circuit->mtc == NULL || (circuit->mtc->status == disable))
1551 continue;
1552
1553 /* disable MPLS_TE Circuit */
1554 circuit->mtc->status = disable;
1555
1556 /* Re-originate circuit without STD_TE & GMPLS parameters */
1557 if (circuit->area)
1558 lsp_regenerate_schedule(circuit->area, circuit->is_type,
1559 0);
1560 }
1561
1562 return NB_OK;
1563 }
1564
1565 /*
1566 * XPath: /frr-isisd:isis/mpls-te/router-address
1567 */
1568 static int isis_mpls_te_router_address_modify(enum nb_event event,
1569 const struct lyd_node *dnode,
1570 union nb_resource *resource)
1571 {
1572 struct in_addr value;
1573 struct listnode *node;
1574 struct isis_area *area;
1575
1576 if (event != NB_EV_APPLY)
1577 return NB_OK;
1578
1579 yang_dnode_get_ipv4(&value, dnode, NULL);
1580 isisMplsTE.router_id.s_addr = value.s_addr;
1581 /* only proceed if MPLS-TE is enabled */
1582 if (isisMplsTE.status == disable)
1583 return NB_OK;
1584
1585 /* Update main Router ID in isis global structure */
1586 isis->router_id = value.s_addr;
1587 /* And re-schedule LSP update */
1588 for (ALL_LIST_ELEMENTS_RO(isis->area_list, node, area))
1589 if (listcount(area->area_addrs) > 0)
1590 lsp_regenerate_schedule(area, area->is_type, 0);
1591
1592 return NB_OK;
1593 }
1594
1595 static int isis_mpls_te_router_address_delete(enum nb_event event,
1596 const struct lyd_node *dnode)
1597 {
1598 struct listnode *node;
1599 struct isis_area *area;
1600
1601 if (event != NB_EV_APPLY)
1602 return NB_OK;
1603
1604 isisMplsTE.router_id.s_addr = INADDR_ANY;
1605 /* only proceed if MPLS-TE is enabled */
1606 if (isisMplsTE.status == disable)
1607 return NB_OK;
1608
1609 /* Update main Router ID in isis global structure */
1610 isis->router_id = 0;
1611 /* And re-schedule LSP update */
1612 for (ALL_LIST_ELEMENTS_RO(isis->area_list, node, area))
1613 if (listcount(area->area_addrs) > 0)
1614 lsp_regenerate_schedule(area, area->is_type, 0);
1615
1616 return NB_OK;
1617 }
1618
1619 /*
1620 * XPath: /frr-interface:lib/interface/frr-isisd:isis
1621 */
1622 static int lib_interface_isis_create(enum nb_event event,
1623 const struct lyd_node *dnode,
1624 union nb_resource *resource)
1625 {
1626 struct isis_area *area;
1627 struct interface *ifp;
1628 struct isis_circuit *circuit;
1629 const char *area_tag = yang_dnode_get_string(dnode, "./area-tag");
1630
1631 if (event != NB_EV_APPLY)
1632 return NB_OK;
1633
1634 area = isis_area_lookup(area_tag);
1635 /* The area should have already be created. We are
1636 * setting the priority of the global isis area creation
1637 * slightly lower, so it should be executed first, but I
1638 * cannot rely on that so here I have to check.
1639 */
1640 if (!area) {
1641 flog_err(
1642 EC_LIB_NB_CB_CONFIG_APPLY,
1643 "%s: attempt to create circuit for area %s before the area has been created",
1644 __func__, area_tag);
1645 abort();
1646 }
1647
1648 ifp = yang_dnode_get_entry(dnode, true);
1649 circuit = isis_circuit_create(area, ifp);
1650 assert(circuit->state == C_STATE_CONF || circuit->state == C_STATE_UP);
1651 yang_dnode_set_entry(dnode, circuit);
1652
1653 return NB_OK;
1654 }
1655
1656 static int lib_interface_isis_delete(enum nb_event event,
1657 const struct lyd_node *dnode)
1658 {
1659 struct isis_circuit *circuit;
1660
1661 if (event != NB_EV_APPLY)
1662 return NB_OK;
1663
1664 circuit = yang_dnode_get_entry(dnode, true);
1665 if (!circuit)
1666 return NB_ERR_INCONSISTENCY;
1667 /* delete circuit through csm changes */
1668 switch (circuit->state) {
1669 case C_STATE_UP:
1670 isis_csm_state_change(IF_DOWN_FROM_Z, circuit,
1671 circuit->interface);
1672 isis_csm_state_change(ISIS_DISABLE, circuit, circuit->area);
1673 break;
1674 case C_STATE_CONF:
1675 isis_csm_state_change(ISIS_DISABLE, circuit, circuit->area);
1676 break;
1677 case C_STATE_INIT:
1678 isis_csm_state_change(IF_DOWN_FROM_Z, circuit,
1679 circuit->interface);
1680 break;
1681 }
1682
1683 return NB_OK;
1684 }
1685
1686 /*
1687 * XPath: /frr-interface:lib/interface/frr-isisd:isis/area-tag
1688 */
1689 static int lib_interface_isis_area_tag_modify(enum nb_event event,
1690 const struct lyd_node *dnode,
1691 union nb_resource *resource)
1692 {
1693 struct isis_circuit *circuit;
1694 struct interface *ifp;
1695 struct vrf *vrf;
1696 const char *area_tag, *ifname, *vrfname;
1697
1698 if (event == NB_EV_VALIDATE) {
1699 /* libyang doesn't like relative paths across module boundaries
1700 */
1701 ifname = yang_dnode_get_string(dnode->parent->parent, "./name");
1702 vrfname = yang_dnode_get_string(dnode->parent->parent, "./vrf");
1703 vrf = vrf_lookup_by_name(vrfname);
1704 assert(vrf);
1705 ifp = if_lookup_by_name(ifname, vrf->vrf_id);
1706 if (!ifp)
1707 return NB_OK;
1708 circuit = circuit_lookup_by_ifp(ifp, isis->init_circ_list);
1709 area_tag = yang_dnode_get_string(dnode, NULL);
1710 if (circuit && circuit->area && circuit->area->area_tag
1711 && strcmp(circuit->area->area_tag, area_tag)) {
1712 flog_warn(EC_LIB_NB_CB_CONFIG_VALIDATE,
1713 "ISIS circuit is already defined on %s",
1714 circuit->area->area_tag);
1715 return NB_ERR_VALIDATION;
1716 }
1717 }
1718
1719 return NB_OK;
1720 }
1721
1722 /*
1723 * XPath: /frr-interface:lib/interface/frr-isisd:isis/circuit-type
1724 */
1725 static int lib_interface_isis_circuit_type_modify(enum nb_event event,
1726 const struct lyd_node *dnode,
1727 union nb_resource *resource)
1728 {
1729 int circ_type = yang_dnode_get_enum(dnode, NULL);
1730 struct isis_circuit *circuit;
1731 struct interface *ifp;
1732 struct vrf *vrf;
1733 const char *ifname, *vrfname;
1734
1735 switch (event) {
1736 case NB_EV_VALIDATE:
1737 /* libyang doesn't like relative paths across module boundaries
1738 */
1739 ifname = yang_dnode_get_string(dnode->parent->parent, "./name");
1740 vrfname = yang_dnode_get_string(dnode->parent->parent, "./vrf");
1741 vrf = vrf_lookup_by_name(vrfname);
1742 assert(vrf);
1743 ifp = if_lookup_by_name(ifname, vrf->vrf_id);
1744 if (!ifp)
1745 break;
1746 circuit = circuit_lookup_by_ifp(ifp, isis->init_circ_list);
1747 if (circuit && circuit->state == C_STATE_UP
1748 && circuit->area->is_type != IS_LEVEL_1_AND_2
1749 && circuit->area->is_type != circ_type) {
1750 flog_warn(EC_LIB_NB_CB_CONFIG_VALIDATE,
1751 "Invalid circuit level for area %s",
1752 circuit->area->area_tag);
1753 return NB_ERR_VALIDATION;
1754 }
1755 break;
1756 case NB_EV_PREPARE:
1757 case NB_EV_ABORT:
1758 break;
1759 case NB_EV_APPLY:
1760 circuit = yang_dnode_get_entry(dnode, true);
1761 isis_circuit_is_type_set(circuit, circ_type);
1762 break;
1763 }
1764
1765 return NB_OK;
1766 }
1767
1768 /*
1769 * XPath: /frr-interface:lib/interface/frr-isisd:isis/ipv4-routing
1770 */
1771 static int lib_interface_isis_ipv4_routing_create(enum nb_event event,
1772 const struct lyd_node *dnode,
1773 union nb_resource *resource)
1774 {
1775 bool ipv6;
1776 struct isis_circuit *circuit;
1777
1778 if (event != NB_EV_APPLY)
1779 return NB_OK;
1780
1781 circuit = yang_dnode_get_entry(dnode, true);
1782 ipv6 = yang_dnode_exists(dnode, "../ipv6-routing");
1783 isis_circuit_af_set(circuit, true, ipv6);
1784
1785 return NB_OK;
1786 }
1787
1788 static int lib_interface_isis_ipv4_routing_delete(enum nb_event event,
1789 const struct lyd_node *dnode)
1790 {
1791 bool ipv6;
1792 struct isis_circuit *circuit;
1793
1794 if (event != NB_EV_APPLY)
1795 return NB_OK;
1796
1797 circuit = yang_dnode_get_entry(dnode, true);
1798 if (circuit && circuit->area) {
1799 ipv6 = yang_dnode_exists(dnode, "../ipv6-routing");
1800 isis_circuit_af_set(circuit, false, ipv6);
1801 }
1802
1803 return NB_OK;
1804 }
1805
1806 /*
1807 * XPath: /frr-interface:lib/interface/frr-isisd:isis/ipv6-routing
1808 */
1809 static int lib_interface_isis_ipv6_routing_create(enum nb_event event,
1810 const struct lyd_node *dnode,
1811 union nb_resource *resource)
1812 {
1813 bool ipv4;
1814 struct isis_circuit *circuit;
1815
1816 if (event != NB_EV_APPLY)
1817 return NB_OK;
1818
1819 circuit = yang_dnode_get_entry(dnode, true);
1820 ipv4 = yang_dnode_exists(dnode, "../ipv6-routing");
1821 isis_circuit_af_set(circuit, ipv4, true);
1822
1823 return NB_OK;
1824 }
1825
1826 static int lib_interface_isis_ipv6_routing_delete(enum nb_event event,
1827 const struct lyd_node *dnode)
1828 {
1829 bool ipv4;
1830 struct isis_circuit *circuit;
1831
1832 if (event != NB_EV_APPLY)
1833 return NB_OK;
1834
1835 circuit = yang_dnode_get_entry(dnode, true);
1836 if (circuit->area) {
1837 ipv4 = yang_dnode_exists(dnode, "../ipv4-routing");
1838 isis_circuit_af_set(circuit, ipv4, false);
1839 }
1840
1841 return NB_OK;
1842 }
1843
1844 /*
1845 * XPath: /frr-interface:lib/interface/frr-isisd:isis/csnp-interval/level-1
1846 */
1847 static int
1848 lib_interface_isis_csnp_interval_level_1_modify(enum nb_event event,
1849 const struct lyd_node *dnode,
1850 union nb_resource *resource)
1851 {
1852 struct isis_circuit *circuit;
1853
1854 if (event != NB_EV_APPLY)
1855 return NB_OK;
1856
1857 circuit = yang_dnode_get_entry(dnode, true);
1858 circuit->csnp_interval[0] = yang_dnode_get_uint16(dnode, NULL);
1859
1860 return NB_OK;
1861 }
1862
1863 /*
1864 * XPath: /frr-interface:lib/interface/frr-isisd:isis/csnp-interval/level-2
1865 */
1866 static int
1867 lib_interface_isis_csnp_interval_level_2_modify(enum nb_event event,
1868 const struct lyd_node *dnode,
1869 union nb_resource *resource)
1870 {
1871 struct isis_circuit *circuit;
1872
1873 if (event != NB_EV_APPLY)
1874 return NB_OK;
1875
1876 circuit = yang_dnode_get_entry(dnode, true);
1877 circuit->csnp_interval[1] = yang_dnode_get_uint16(dnode, NULL);
1878
1879 return NB_OK;
1880 }
1881
1882 /*
1883 * XPath: /frr-interface:lib/interface/frr-isisd:isis/psnp-interval/level-1
1884 */
1885 static int
1886 lib_interface_isis_psnp_interval_level_1_modify(enum nb_event event,
1887 const struct lyd_node *dnode,
1888 union nb_resource *resource)
1889 {
1890 struct isis_circuit *circuit;
1891
1892 if (event != NB_EV_APPLY)
1893 return NB_OK;
1894
1895 circuit = yang_dnode_get_entry(dnode, true);
1896 circuit->psnp_interval[0] = yang_dnode_get_uint16(dnode, NULL);
1897
1898 return NB_OK;
1899 }
1900
1901 /*
1902 * XPath: /frr-interface:lib/interface/frr-isisd:isis/psnp-interval/level-2
1903 */
1904 static int
1905 lib_interface_isis_psnp_interval_level_2_modify(enum nb_event event,
1906 const struct lyd_node *dnode,
1907 union nb_resource *resource)
1908 {
1909 struct isis_circuit *circuit;
1910
1911 if (event != NB_EV_APPLY)
1912 return NB_OK;
1913
1914 circuit = yang_dnode_get_entry(dnode, true);
1915 circuit->psnp_interval[1] = yang_dnode_get_uint16(dnode, NULL);
1916
1917 return NB_OK;
1918 }
1919
1920 /*
1921 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/padding
1922 */
1923 static int lib_interface_isis_hello_padding_modify(enum nb_event event,
1924 const struct lyd_node *dnode,
1925 union nb_resource *resource)
1926 {
1927 struct isis_circuit *circuit;
1928
1929 if (event != NB_EV_APPLY)
1930 return NB_OK;
1931
1932 circuit = yang_dnode_get_entry(dnode, true);
1933 circuit->pad_hellos = yang_dnode_get_bool(dnode, NULL);
1934
1935 return NB_OK;
1936 }
1937
1938 /*
1939 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/interval/level-1
1940 */
1941 static int
1942 lib_interface_isis_hello_interval_level_1_modify(enum nb_event event,
1943 const struct lyd_node *dnode,
1944 union nb_resource *resource)
1945 {
1946 struct isis_circuit *circuit;
1947 uint32_t interval;
1948
1949 if (event != NB_EV_APPLY)
1950 return NB_OK;
1951
1952 circuit = yang_dnode_get_entry(dnode, true);
1953 interval = yang_dnode_get_uint32(dnode, NULL);
1954 circuit->hello_interval[0] = interval;
1955
1956 return NB_OK;
1957 }
1958
1959 /*
1960 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/interval/level-2
1961 */
1962 static int
1963 lib_interface_isis_hello_interval_level_2_modify(enum nb_event event,
1964 const struct lyd_node *dnode,
1965 union nb_resource *resource)
1966 {
1967 struct isis_circuit *circuit;
1968 uint32_t interval;
1969
1970 if (event != NB_EV_APPLY)
1971 return NB_OK;
1972
1973 circuit = yang_dnode_get_entry(dnode, true);
1974 interval = yang_dnode_get_uint32(dnode, NULL);
1975 circuit->hello_interval[1] = interval;
1976
1977 return NB_OK;
1978 }
1979
1980 /*
1981 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/multiplier/level-1
1982 */
1983 static int
1984 lib_interface_isis_hello_multiplier_level_1_modify(enum nb_event event,
1985 const struct lyd_node *dnode,
1986 union nb_resource *resource)
1987 {
1988 struct isis_circuit *circuit;
1989 uint16_t multi;
1990
1991 if (event != NB_EV_APPLY)
1992 return NB_OK;
1993
1994 circuit = yang_dnode_get_entry(dnode, true);
1995 multi = yang_dnode_get_uint16(dnode, NULL);
1996 circuit->hello_multiplier[0] = multi;
1997
1998 return NB_OK;
1999 }
2000
2001 /*
2002 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/multiplier/level-2
2003 */
2004 static int
2005 lib_interface_isis_hello_multiplier_level_2_modify(enum nb_event event,
2006 const struct lyd_node *dnode,
2007 union nb_resource *resource)
2008 {
2009 struct isis_circuit *circuit;
2010 uint16_t multi;
2011
2012 if (event != NB_EV_APPLY)
2013 return NB_OK;
2014
2015 circuit = yang_dnode_get_entry(dnode, true);
2016 multi = yang_dnode_get_uint16(dnode, NULL);
2017 circuit->hello_multiplier[1] = multi;
2018
2019 return NB_OK;
2020 }
2021
2022 /*
2023 * XPath: /frr-interface:lib/interface/frr-isisd:isis/metric/level-1
2024 */
2025 static int
2026 lib_interface_isis_metric_level_1_modify(enum nb_event event,
2027 const struct lyd_node *dnode,
2028 union nb_resource *resource)
2029 {
2030 struct isis_circuit *circuit;
2031 unsigned int met;
2032
2033 if (event != NB_EV_APPLY)
2034 return NB_OK;
2035
2036 circuit = yang_dnode_get_entry(dnode, true);
2037 met = yang_dnode_get_uint32(dnode, NULL);
2038 isis_circuit_metric_set(circuit, IS_LEVEL_1, met);
2039
2040 return NB_OK;
2041 }
2042
2043 /*
2044 * XPath: /frr-interface:lib/interface/frr-isisd:isis/metric/level-2
2045 */
2046 static int
2047 lib_interface_isis_metric_level_2_modify(enum nb_event event,
2048 const struct lyd_node *dnode,
2049 union nb_resource *resource)
2050 {
2051 struct isis_circuit *circuit;
2052 unsigned int met;
2053
2054 if (event != NB_EV_APPLY)
2055 return NB_OK;
2056
2057 circuit = yang_dnode_get_entry(dnode, true);
2058 met = yang_dnode_get_uint32(dnode, NULL);
2059 isis_circuit_metric_set(circuit, IS_LEVEL_2, met);
2060
2061 return NB_OK;
2062 }
2063
2064 /*
2065 * XPath: /frr-interface:lib/interface/frr-isisd:isis/priority/level-1
2066 */
2067 static int
2068 lib_interface_isis_priority_level_1_modify(enum nb_event event,
2069 const struct lyd_node *dnode,
2070 union nb_resource *resource)
2071 {
2072 /* TODO: implement me. */
2073 return NB_OK;
2074 }
2075
2076 /*
2077 * XPath: /frr-interface:lib/interface/frr-isisd:isis/priority/level-2
2078 */
2079 static int
2080 lib_interface_isis_priority_level_2_modify(enum nb_event event,
2081 const struct lyd_node *dnode,
2082 union nb_resource *resource)
2083 {
2084 /* TODO: implement me. */
2085 return NB_OK;
2086 }
2087
2088 /*
2089 * XPath: /frr-interface:lib/interface/frr-isisd:isis/network-type
2090 */
2091 static int lib_interface_isis_network_type_modify(enum nb_event event,
2092 const struct lyd_node *dnode,
2093 union nb_resource *resource)
2094 {
2095 /* TODO: implement me. */
2096 return NB_OK;
2097 }
2098
2099 static int lib_interface_isis_network_type_delete(enum nb_event event,
2100 const struct lyd_node *dnode)
2101 {
2102 /* TODO: implement me. */
2103 return NB_OK;
2104 }
2105
2106 /*
2107 * XPath: /frr-interface:lib/interface/frr-isisd:isis/passive
2108 */
2109 static int lib_interface_isis_passive_create(enum nb_event event,
2110 const struct lyd_node *dnode,
2111 union nb_resource *resource)
2112 {
2113 struct isis_circuit *circuit;
2114 struct isis_area *area;
2115
2116 if (event != NB_EV_APPLY)
2117 return NB_OK;
2118
2119 circuit = yang_dnode_get_entry(dnode, true);
2120 if (circuit->state != C_STATE_UP) {
2121 circuit->is_passive = true;
2122 } else {
2123 area = circuit->area;
2124 isis_csm_state_change(ISIS_DISABLE, circuit, area);
2125 circuit->is_passive = true;
2126 isis_csm_state_change(ISIS_ENABLE, circuit, area);
2127 }
2128
2129 return NB_OK;
2130 }
2131
2132 static int lib_interface_isis_passive_delete(enum nb_event event,
2133 const struct lyd_node *dnode)
2134 {
2135 struct isis_circuit *circuit;
2136 struct isis_area *area;
2137 struct interface *ifp;
2138
2139 switch (event) {
2140 case NB_EV_VALIDATE:
2141 circuit = yang_dnode_get_entry(dnode, false);
2142 if (!circuit)
2143 break;
2144 ifp = circuit->interface;
2145 if (!ifp)
2146 break;
2147 if (if_is_loopback(ifp)) {
2148 flog_warn(EC_LIB_NB_CB_CONFIG_VALIDATE,
2149 "Loopback is always passive");
2150 return NB_ERR_VALIDATION;
2151 }
2152 break;
2153 case NB_EV_PREPARE:
2154 case NB_EV_ABORT:
2155 break;
2156 case NB_EV_APPLY:
2157 circuit = yang_dnode_get_entry(dnode, true);
2158 if (circuit->state != C_STATE_UP) {
2159 circuit->is_passive = false;
2160 } else {
2161 area = circuit->area;
2162 isis_csm_state_change(ISIS_DISABLE, circuit, area);
2163 circuit->is_passive = false;
2164 isis_csm_state_change(ISIS_ENABLE, circuit, area);
2165 }
2166 break;
2167 }
2168
2169 return NB_OK;
2170 }
2171
2172 /*
2173 * XPath: /frr-interface:lib/interface/frr-isisd:isis/password
2174 */
2175 static int lib_interface_isis_password_create(enum nb_event event,
2176 const struct lyd_node *dnode,
2177 union nb_resource *resource)
2178 {
2179 return NB_OK;
2180 }
2181
2182 static int lib_interface_isis_password_delete(enum nb_event event,
2183 const struct lyd_node *dnode)
2184 {
2185 struct isis_circuit *circuit;
2186
2187 if (event != NB_EV_APPLY)
2188 return NB_OK;
2189
2190 circuit = yang_dnode_get_entry(dnode, true);
2191 isis_circuit_passwd_unset(circuit);
2192
2193 return NB_OK;
2194 }
2195
2196 /*
2197 * XPath: /frr-interface:lib/interface/frr-isisd:isis/password/password
2198 */
2199 static int
2200 lib_interface_isis_password_password_modify(enum nb_event event,
2201 const struct lyd_node *dnode,
2202 union nb_resource *resource)
2203 {
2204 struct isis_circuit *circuit;
2205 const char *password;
2206
2207 if (event != NB_EV_APPLY)
2208 return NB_OK;
2209
2210 password = yang_dnode_get_string(dnode, NULL);
2211 circuit = yang_dnode_get_entry(dnode, true);
2212 circuit->passwd.len = strlen(password);
2213 strncpy((char *)circuit->passwd.passwd, password, 255);
2214
2215 return NB_OK;
2216 }
2217
2218 /*
2219 * XPath: /frr-interface:lib/interface/frr-isisd:isis/password/password-type
2220 */
2221 static int
2222 lib_interface_isis_password_password_type_modify(enum nb_event event,
2223 const struct lyd_node *dnode,
2224 union nb_resource *resource)
2225 {
2226 struct isis_circuit *circuit;
2227 uint8_t pass_type;
2228
2229 if (event != NB_EV_APPLY)
2230 return NB_OK;
2231
2232 pass_type = yang_dnode_get_enum(dnode, NULL);
2233 circuit = yang_dnode_get_entry(dnode, true);
2234 circuit->passwd.type = pass_type;
2235
2236 return NB_OK;
2237 }
2238
2239 /*
2240 * XPath:
2241 * /frr-interface:lib/interface/frr-isisd:isis/disable-three-way-handshake
2242 */
2243 static int lib_interface_isis_disable_three_way_handshake_create(
2244 enum nb_event event, const struct lyd_node *dnode,
2245 union nb_resource *resource)
2246 {
2247 struct isis_circuit *circuit;
2248
2249 if (event != NB_EV_APPLY)
2250 return NB_OK;
2251
2252 circuit = yang_dnode_get_entry(dnode, true);
2253 circuit->disable_threeway_adj = true;
2254
2255 return NB_OK;
2256 }
2257
2258 static int lib_interface_isis_disable_three_way_handshake_delete(
2259 enum nb_event event, const struct lyd_node *dnode)
2260 {
2261 struct isis_circuit *circuit;
2262
2263 if (event != NB_EV_APPLY)
2264 return NB_OK;
2265
2266 circuit = yang_dnode_get_entry(dnode, true);
2267 circuit->disable_threeway_adj = false;
2268
2269 return NB_OK;
2270 }
2271
2272 /*
2273 * XPath:
2274 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-unicast
2275 */
2276 static int lib_interface_isis_multi_topology_ipv4_unicast_modify(
2277 enum nb_event event, const struct lyd_node *dnode,
2278 union nb_resource *resource)
2279 {
2280 /* TODO: implement me. */
2281 return NB_OK;
2282 }
2283
2284 /*
2285 * XPath:
2286 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-multicast
2287 */
2288 static int lib_interface_isis_multi_topology_ipv4_multicast_modify(
2289 enum nb_event event, const struct lyd_node *dnode,
2290 union nb_resource *resource)
2291 {
2292 /* TODO: implement me. */
2293 return NB_OK;
2294 }
2295
2296 /*
2297 * XPath:
2298 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-management
2299 */
2300 static int lib_interface_isis_multi_topology_ipv4_management_modify(
2301 enum nb_event event, const struct lyd_node *dnode,
2302 union nb_resource *resource)
2303 {
2304 /* TODO: implement me. */
2305 return NB_OK;
2306 }
2307
2308 /*
2309 * XPath:
2310 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-unicast
2311 */
2312 static int lib_interface_isis_multi_topology_ipv6_unicast_modify(
2313 enum nb_event event, const struct lyd_node *dnode,
2314 union nb_resource *resource)
2315 {
2316 /* TODO: implement me. */
2317 return NB_OK;
2318 }
2319
2320 /*
2321 * XPath:
2322 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-multicast
2323 */
2324 static int lib_interface_isis_multi_topology_ipv6_multicast_modify(
2325 enum nb_event event, const struct lyd_node *dnode,
2326 union nb_resource *resource)
2327 {
2328 /* TODO: implement me. */
2329 return NB_OK;
2330 }
2331
2332 /*
2333 * XPath:
2334 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-management
2335 */
2336 static int lib_interface_isis_multi_topology_ipv6_management_modify(
2337 enum nb_event event, const struct lyd_node *dnode,
2338 union nb_resource *resource)
2339 {
2340 /* TODO: implement me. */
2341 return NB_OK;
2342 }
2343
2344 /*
2345 * XPath: /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-dstsrc
2346 */
2347 static int lib_interface_isis_multi_topology_ipv6_dstsrc_modify(
2348 enum nb_event event, const struct lyd_node *dnode,
2349 union nb_resource *resource)
2350 {
2351 /* TODO: implement me. */
2352 return NB_OK;
2353 }
2354
2355 /* clang-format off */
2356 const struct frr_yang_module_info frr_isisd_info = {
2357 .name = "frr-isisd",
2358 .nodes = {
2359 {
2360 .xpath = "/frr-isisd:isis/instance",
2361 .cbs.create = isis_instance_create,
2362 .cbs.delete = isis_instance_delete,
2363 .cbs.cli_show = cli_show_router_isis,
2364 .priority = NB_DFLT_PRIORITY - 1,
2365 },
2366 {
2367 .xpath = "/frr-isisd:isis/instance/is-type",
2368 .cbs.modify = isis_instance_is_type_modify,
2369 .cbs.cli_show = cli_show_isis_is_type,
2370 },
2371 {
2372 .xpath = "/frr-isisd:isis/instance/area-address",
2373 .cbs.create = isis_instance_area_address_create,
2374 .cbs.delete = isis_instance_area_address_delete,
2375 .cbs.cli_show = cli_show_isis_area_address,
2376 },
2377 {
2378 .xpath = "/frr-isisd:isis/instance/dynamic-hostname",
2379 .cbs.modify = isis_instance_dynamic_hostname_modify,
2380 .cbs.cli_show = cli_show_isis_dynamic_hostname,
2381 },
2382 {
2383 .xpath = "/frr-isisd:isis/instance/attached",
2384 .cbs.create = isis_instance_attached_create,
2385 .cbs.delete = isis_instance_attached_delete,
2386 .cbs.cli_show = cli_show_isis_attached,
2387 },
2388 {
2389 .xpath = "/frr-isisd:isis/instance/overload",
2390 .cbs.create = isis_instance_overload_create,
2391 .cbs.delete = isis_instance_overload_delete,
2392 .cbs.cli_show = cli_show_isis_overload,
2393 },
2394 {
2395 .xpath = "/frr-isisd:isis/instance/metric-style",
2396 .cbs.modify = isis_instance_metric_style_modify,
2397 .cbs.cli_show = cli_show_isis_metric_style,
2398 },
2399 {
2400 .xpath = "/frr-isisd:isis/instance/purge-originator",
2401 .cbs.create = isis_instance_purge_originator_create,
2402 .cbs.delete = isis_instance_purge_originator_delete,
2403 .cbs.cli_show = cli_show_isis_purge_origin,
2404 },
2405 {
2406 .xpath = "/frr-isisd:isis/instance/lsp/mtu",
2407 .cbs.modify = isis_instance_lsp_mtu_modify,
2408 .cbs.cli_show = cli_show_isis_lsp_mtu,
2409 },
2410 {
2411 .xpath = "/frr-isisd:isis/instance/lsp/refresh-interval",
2412 .cbs.cli_show = cli_show_isis_lsp_ref_interval,
2413 },
2414 {
2415 .xpath = "/frr-isisd:isis/instance/lsp/refresh-interval/level-1",
2416 .cbs.modify = isis_instance_lsp_refresh_interval_level_1_modify,
2417 },
2418 {
2419 .xpath = "/frr-isisd:isis/instance/lsp/refresh-interval/level-2",
2420 .cbs.modify = isis_instance_lsp_refresh_interval_level_2_modify,
2421 },
2422 {
2423 .xpath = "/frr-isisd:isis/instance/lsp/maximum-lifetime",
2424 .cbs.cli_show = cli_show_isis_lsp_max_lifetime,
2425 },
2426 {
2427 .xpath = "/frr-isisd:isis/instance/lsp/maximum-lifetime/level-1",
2428 .cbs.modify = isis_instance_lsp_maximum_lifetime_level_1_modify,
2429 },
2430 {
2431 .xpath = "/frr-isisd:isis/instance/lsp/maximum-lifetime/level-2",
2432 .cbs.modify = isis_instance_lsp_maximum_lifetime_level_2_modify,
2433 },
2434 {
2435 .xpath = "/frr-isisd:isis/instance/lsp/generation-interval",
2436 .cbs.cli_show = cli_show_isis_lsp_gen_interval,
2437 },
2438 {
2439 .xpath = "/frr-isisd:isis/instance/lsp/generation-interval/level-1",
2440 .cbs.modify = isis_instance_lsp_generation_interval_level_1_modify,
2441 },
2442 {
2443 .xpath = "/frr-isisd:isis/instance/lsp/generation-interval/level-2",
2444 .cbs.modify = isis_instance_lsp_generation_interval_level_2_modify,
2445 },
2446 {
2447 .xpath = "/frr-isisd:isis/instance/spf/ietf-backoff-delay",
2448 .cbs.create = isis_instance_spf_ietf_backoff_delay_create,
2449 .cbs.delete = isis_instance_spf_ietf_backoff_delay_delete,
2450 .cbs.apply_finish = ietf_backoff_delay_apply_finish,
2451 .cbs.cli_show = cli_show_isis_spf_ietf_backoff,
2452 },
2453 {
2454 .xpath = "/frr-isisd:isis/instance/spf/ietf-backoff-delay/init-delay",
2455 .cbs.modify = isis_instance_spf_ietf_backoff_delay_init_delay_modify,
2456 },
2457 {
2458 .xpath = "/frr-isisd:isis/instance/spf/ietf-backoff-delay/short-delay",
2459 .cbs.modify = isis_instance_spf_ietf_backoff_delay_short_delay_modify,
2460 },
2461 {
2462 .xpath = "/frr-isisd:isis/instance/spf/ietf-backoff-delay/long-delay",
2463 .cbs.modify = isis_instance_spf_ietf_backoff_delay_long_delay_modify,
2464 },
2465 {
2466 .xpath = "/frr-isisd:isis/instance/spf/ietf-backoff-delay/hold-down",
2467 .cbs.modify = isis_instance_spf_ietf_backoff_delay_hold_down_modify,
2468 },
2469 {
2470 .xpath = "/frr-isisd:isis/instance/spf/ietf-backoff-delay/time-to-learn",
2471 .cbs.modify = isis_instance_spf_ietf_backoff_delay_time_to_learn_modify,
2472 },
2473 {
2474 .xpath = "/frr-isisd:isis/instance/spf/minimum-interval",
2475 .cbs.cli_show = cli_show_isis_spf_min_interval,
2476 },
2477 {
2478 .xpath = "/frr-isisd:isis/instance/spf/minimum-interval/level-1",
2479 .cbs.modify = isis_instance_spf_minimum_interval_level_1_modify,
2480 },
2481 {
2482 .xpath = "/frr-isisd:isis/instance/spf/minimum-interval/level-2",
2483 .cbs.modify = isis_instance_spf_minimum_interval_level_2_modify,
2484 },
2485 {
2486 .xpath = "/frr-isisd:isis/instance/area-password",
2487 .cbs.create = isis_instance_area_password_create,
2488 .cbs.delete = isis_instance_area_password_delete,
2489 .cbs.apply_finish = area_password_apply_finish,
2490 .cbs.cli_show = cli_show_isis_area_pwd,
2491 },
2492 {
2493 .xpath = "/frr-isisd:isis/instance/area-password/password",
2494 .cbs.modify = isis_instance_area_password_password_modify,
2495 },
2496 {
2497 .xpath = "/frr-isisd:isis/instance/area-password/password-type",
2498 .cbs.modify = isis_instance_area_password_password_type_modify,
2499 },
2500 {
2501 .xpath = "/frr-isisd:isis/instance/area-password/authenticate-snp",
2502 .cbs.modify = isis_instance_area_password_authenticate_snp_modify,
2503 },
2504 {
2505 .xpath = "/frr-isisd:isis/instance/domain-password",
2506 .cbs.create = isis_instance_domain_password_create,
2507 .cbs.delete = isis_instance_domain_password_delete,
2508 .cbs.apply_finish = domain_password_apply_finish,
2509 .cbs.cli_show = cli_show_isis_domain_pwd,
2510 },
2511 {
2512 .xpath = "/frr-isisd:isis/instance/domain-password/password",
2513 .cbs.modify = isis_instance_domain_password_password_modify,
2514 },
2515 {
2516 .xpath = "/frr-isisd:isis/instance/domain-password/password-type",
2517 .cbs.modify = isis_instance_domain_password_password_type_modify,
2518 },
2519 {
2520 .xpath = "/frr-isisd:isis/instance/domain-password/authenticate-snp",
2521 .cbs.modify = isis_instance_domain_password_authenticate_snp_modify,
2522 },
2523 {
2524 .xpath = "/frr-isisd:isis/instance/default-information-originate/ipv4",
2525 .cbs.create = isis_instance_default_information_originate_ipv4_create,
2526 .cbs.delete = isis_instance_default_information_originate_ipv4_delete,
2527 .cbs.apply_finish = default_info_origin_ipv4_apply_finish,
2528 .cbs.cli_show = cli_show_isis_def_origin_ipv4,
2529 },
2530 {
2531 .xpath = "/frr-isisd:isis/instance/default-information-originate/ipv4/always",
2532 .cbs.create = isis_instance_default_information_originate_ipv4_always_create,
2533 .cbs.delete = isis_instance_default_information_originate_ipv4_always_delete,
2534 },
2535 {
2536 .xpath = "/frr-isisd:isis/instance/default-information-originate/ipv4/route-map",
2537 .cbs.modify = isis_instance_default_information_originate_ipv4_route_map_modify,
2538 .cbs.delete = isis_instance_default_information_originate_ipv4_route_map_delete,
2539 },
2540 {
2541 .xpath = "/frr-isisd:isis/instance/default-information-originate/ipv4/metric",
2542 .cbs.modify = isis_instance_default_information_originate_ipv4_metric_modify,
2543 .cbs.delete = isis_instance_default_information_originate_ipv4_metric_delete,
2544 },
2545 {
2546 .xpath = "/frr-isisd:isis/instance/default-information-originate/ipv6",
2547 .cbs.create = isis_instance_default_information_originate_ipv6_create,
2548 .cbs.delete = isis_instance_default_information_originate_ipv6_delete,
2549 .cbs.apply_finish = default_info_origin_ipv6_apply_finish,
2550 .cbs.cli_show = cli_show_isis_def_origin_ipv6,
2551 },
2552 {
2553 .xpath = "/frr-isisd:isis/instance/default-information-originate/ipv6/always",
2554 .cbs.create = isis_instance_default_information_originate_ipv6_always_create,
2555 .cbs.delete = isis_instance_default_information_originate_ipv6_always_delete,
2556 },
2557 {
2558 .xpath = "/frr-isisd:isis/instance/default-information-originate/ipv6/route-map",
2559 .cbs.modify = isis_instance_default_information_originate_ipv6_route_map_modify,
2560 .cbs.delete = isis_instance_default_information_originate_ipv6_route_map_delete,
2561 },
2562 {
2563 .xpath = "/frr-isisd:isis/instance/default-information-originate/ipv6/metric",
2564 .cbs.modify = isis_instance_default_information_originate_ipv6_metric_modify,
2565 .cbs.delete = isis_instance_default_information_originate_ipv6_metric_delete,
2566 },
2567 {
2568 .xpath = "/frr-isisd:isis/instance/redistribute/ipv4",
2569 .cbs.create = isis_instance_redistribute_ipv4_create,
2570 .cbs.delete = isis_instance_redistribute_ipv4_delete,
2571 .cbs.apply_finish = redistribute_ipv4_apply_finish,
2572 .cbs.cli_show = cli_show_isis_redistribute_ipv4,
2573 },
2574 {
2575 .xpath = "/frr-isisd:isis/instance/redistribute/ipv4/route-map",
2576 .cbs.modify = isis_instance_redistribute_ipv4_route_map_modify,
2577 .cbs.delete = isis_instance_redistribute_ipv4_route_map_delete,
2578 },
2579 {
2580 .xpath = "/frr-isisd:isis/instance/redistribute/ipv4/metric",
2581 .cbs.modify = isis_instance_redistribute_ipv4_metric_modify,
2582 .cbs.delete = isis_instance_redistribute_ipv4_metric_delete,
2583 },
2584 {
2585 .xpath = "/frr-isisd:isis/instance/redistribute/ipv6",
2586 .cbs.create = isis_instance_redistribute_ipv6_create,
2587 .cbs.delete = isis_instance_redistribute_ipv6_delete,
2588 .cbs.apply_finish = redistribute_ipv6_apply_finish,
2589 .cbs.cli_show = cli_show_isis_redistribute_ipv6,
2590 },
2591 {
2592 .xpath = "/frr-isisd:isis/instance/redistribute/ipv6/route-map",
2593 .cbs.modify = isis_instance_redistribute_ipv6_route_map_modify,
2594 .cbs.delete = isis_instance_redistribute_ipv6_route_map_delete,
2595 },
2596 {
2597 .xpath = "/frr-isisd:isis/instance/redistribute/ipv6/metric",
2598 .cbs.modify = isis_instance_redistribute_ipv6_metric_modify,
2599 .cbs.delete = isis_instance_redistribute_ipv6_metric_delete,
2600 },
2601 {
2602 .xpath = "/frr-isisd:isis/instance/multi-topology/ipv4-multicast",
2603 .cbs.create = isis_instance_multi_topology_ipv4_multicast_create,
2604 .cbs.delete = isis_instance_multi_topology_ipv4_multicast_delete,
2605 .cbs.cli_show = cli_show_isis_mt_ipv4_multicast,
2606 },
2607 {
2608 .xpath = "/frr-isisd:isis/instance/multi-topology/ipv4-multicast/overload",
2609 .cbs.create = isis_instance_multi_topology_ipv4_multicast_overload_create,
2610 .cbs.delete = isis_instance_multi_topology_ipv4_multicast_overload_delete,
2611 },
2612 {
2613 .xpath = "/frr-isisd:isis/instance/multi-topology/ipv4-management",
2614 .cbs.create = isis_instance_multi_topology_ipv4_management_create,
2615 .cbs.delete = isis_instance_multi_topology_ipv4_management_delete,
2616 .cbs.cli_show = cli_show_isis_mt_ipv4_mgmt,
2617 },
2618 {
2619 .xpath = "/frr-isisd:isis/instance/multi-topology/ipv4-management/overload",
2620 .cbs.create = isis_instance_multi_topology_ipv4_management_overload_create,
2621 .cbs.delete = isis_instance_multi_topology_ipv4_management_overload_delete,
2622 },
2623 {
2624 .xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-unicast",
2625 .cbs.create = isis_instance_multi_topology_ipv6_unicast_create,
2626 .cbs.delete = isis_instance_multi_topology_ipv6_unicast_delete,
2627 .cbs.cli_show = cli_show_isis_mt_ipv6_unicast,
2628 },
2629 {
2630 .xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-unicast/overload",
2631 .cbs.create = isis_instance_multi_topology_ipv6_unicast_overload_create,
2632 .cbs.delete = isis_instance_multi_topology_ipv6_unicast_overload_delete,
2633 },
2634 {
2635 .xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-multicast",
2636 .cbs.create = isis_instance_multi_topology_ipv6_multicast_create,
2637 .cbs.delete = isis_instance_multi_topology_ipv6_multicast_delete,
2638 .cbs.cli_show = cli_show_isis_mt_ipv6_multicast,
2639 },
2640 {
2641 .xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-multicast/overload",
2642 .cbs.create = isis_instance_multi_topology_ipv6_multicast_overload_create,
2643 .cbs.delete = isis_instance_multi_topology_ipv6_multicast_overload_delete,
2644 },
2645 {
2646 .xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-management",
2647 .cbs.create = isis_instance_multi_topology_ipv6_management_create,
2648 .cbs.delete = isis_instance_multi_topology_ipv6_management_delete,
2649 .cbs.cli_show = cli_show_isis_mt_ipv6_mgmt,
2650 },
2651 {
2652 .xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-management/overload",
2653 .cbs.create = isis_instance_multi_topology_ipv6_management_overload_create,
2654 .cbs.delete = isis_instance_multi_topology_ipv6_management_overload_delete,
2655 },
2656 {
2657 .xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-dstsrc",
2658 .cbs.create = isis_instance_multi_topology_ipv6_dstsrc_create,
2659 .cbs.delete = isis_instance_multi_topology_ipv6_dstsrc_delete,
2660 .cbs.cli_show = cli_show_isis_mt_ipv6_dstsrc,
2661 },
2662 {
2663 .xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-dstsrc/overload",
2664 .cbs.create = isis_instance_multi_topology_ipv6_dstsrc_overload_create,
2665 .cbs.delete = isis_instance_multi_topology_ipv6_dstsrc_overload_delete,
2666 },
2667 {
2668 .xpath = "/frr-isisd:isis/instance/log-adjacency-changes",
2669 .cbs.create = isis_instance_log_adjacency_changes_create,
2670 .cbs.delete = isis_instance_log_adjacency_changes_delete,
2671 },
2672 {
2673 .xpath = "/frr-isisd:isis/mpls-te",
2674 .cbs.create = isis_mpls_te_create,
2675 .cbs.delete = isis_mpls_te_delete,
2676 .cbs.cli_show = cli_show_isis_mpls_te,
2677 },
2678 {
2679 .xpath = "/frr-isisd:isis/mpls-te/router-address",
2680 .cbs.modify = isis_mpls_te_router_address_modify,
2681 .cbs.delete = isis_mpls_te_router_address_delete,
2682 .cbs.cli_show = cli_show_isis_mpls_te_router_addr,
2683 },
2684 {
2685 .xpath = "/frr-interface:lib/interface/frr-isisd:isis",
2686 .cbs.create = lib_interface_isis_create,
2687 .cbs.delete = lib_interface_isis_delete,
2688 },
2689 {
2690 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/area-tag",
2691 .cbs.modify = lib_interface_isis_area_tag_modify,
2692 },
2693 {
2694 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/circuit-type",
2695 .cbs.modify = lib_interface_isis_circuit_type_modify,
2696 },
2697 {
2698 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/ipv4-routing",
2699 .cbs.create = lib_interface_isis_ipv4_routing_create,
2700 .cbs.delete = lib_interface_isis_ipv4_routing_delete,
2701 .cbs.cli_show = cli_show_ip_isis_ipv4,
2702 },
2703 {
2704 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/ipv6-routing",
2705 .cbs.create = lib_interface_isis_ipv6_routing_create,
2706 .cbs.delete = lib_interface_isis_ipv6_routing_delete,
2707 .cbs.cli_show = cli_show_ip_isis_ipv6,
2708 },
2709 {
2710 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/csnp-interval",
2711 .cbs.cli_show = cli_show_ip_isis_csnp_interval,
2712 },
2713 {
2714 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/csnp-interval/level-1",
2715 .cbs.modify = lib_interface_isis_csnp_interval_level_1_modify,
2716 },
2717 {
2718 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/csnp-interval/level-2",
2719 .cbs.modify = lib_interface_isis_csnp_interval_level_2_modify,
2720 },
2721 {
2722 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/psnp-interval",
2723 .cbs.cli_show = cli_show_ip_isis_psnp_interval,
2724 },
2725 {
2726 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/psnp-interval/level-1",
2727 .cbs.modify = lib_interface_isis_psnp_interval_level_1_modify,
2728 },
2729 {
2730 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/psnp-interval/level-2",
2731 .cbs.modify = lib_interface_isis_psnp_interval_level_2_modify,
2732 },
2733 {
2734 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/hello/padding",
2735 .cbs.modify = lib_interface_isis_hello_padding_modify,
2736 .cbs.cli_show = cli_show_ip_isis_hello_padding,
2737 },
2738 {
2739 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/hello/interval",
2740 .cbs.cli_show = cli_show_ip_isis_hello_interval,
2741 },
2742 {
2743 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/hello/interval/level-1",
2744 .cbs.modify = lib_interface_isis_hello_interval_level_1_modify,
2745 },
2746 {
2747 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/hello/interval/level-2",
2748 .cbs.modify = lib_interface_isis_hello_interval_level_2_modify,
2749 },
2750 {
2751 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/hello/multiplier",
2752 .cbs.cli_show = cli_show_ip_isis_hello_multi,
2753 },
2754 {
2755 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/hello/multiplier/level-1",
2756 .cbs.modify = lib_interface_isis_hello_multiplier_level_1_modify,
2757 },
2758 {
2759 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/hello/multiplier/level-2",
2760 .cbs.modify = lib_interface_isis_hello_multiplier_level_2_modify,
2761 },
2762 {
2763 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/metric",
2764 .cbs.cli_show = cli_show_ip_isis_metric,
2765 },
2766 {
2767 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/metric/level-1",
2768 .cbs.modify = lib_interface_isis_metric_level_1_modify,
2769 },
2770 {
2771 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/metric/level-2",
2772 .cbs.modify = lib_interface_isis_metric_level_2_modify,
2773 },
2774 {
2775 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/priority/level-1",
2776 .cbs.modify = lib_interface_isis_priority_level_1_modify,
2777 },
2778 {
2779 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/priority/level-2",
2780 .cbs.modify = lib_interface_isis_priority_level_2_modify,
2781 },
2782 {
2783 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/network-type",
2784 .cbs.modify = lib_interface_isis_network_type_modify,
2785 .cbs.delete = lib_interface_isis_network_type_delete,
2786 },
2787 {
2788 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/passive",
2789 .cbs.create = lib_interface_isis_passive_create,
2790 .cbs.delete = lib_interface_isis_passive_delete,
2791 .cbs.cli_show = cli_show_ip_isis_passive,
2792 },
2793 {
2794 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/password",
2795 .cbs.create = lib_interface_isis_password_create,
2796 .cbs.delete = lib_interface_isis_password_delete,
2797 .cbs.cli_show = cli_show_ip_isis_password,
2798 },
2799 {
2800 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/password/password",
2801 .cbs.modify = lib_interface_isis_password_password_modify,
2802 },
2803 {
2804 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/password/password-type",
2805 .cbs.modify = lib_interface_isis_password_password_type_modify,
2806 },
2807 {
2808 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/disable-three-way-handshake",
2809 .cbs.create = lib_interface_isis_disable_three_way_handshake_create,
2810 .cbs.delete = lib_interface_isis_disable_three_way_handshake_delete,
2811 .cbs.cli_show = cli_show_ip_isis_threeway_shake,
2812 },
2813 {
2814 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-unicast",
2815 .cbs.modify = lib_interface_isis_multi_topology_ipv4_unicast_modify,
2816 },
2817 {
2818 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-multicast",
2819 .cbs.modify = lib_interface_isis_multi_topology_ipv4_multicast_modify,
2820 },
2821 {
2822 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-management",
2823 .cbs.modify = lib_interface_isis_multi_topology_ipv4_management_modify,
2824 },
2825 {
2826 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-unicast",
2827 .cbs.modify = lib_interface_isis_multi_topology_ipv6_unicast_modify,
2828 },
2829 {
2830 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-multicast",
2831 .cbs.modify = lib_interface_isis_multi_topology_ipv6_multicast_modify,
2832 },
2833 {
2834 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-management",
2835 .cbs.modify = lib_interface_isis_multi_topology_ipv6_management_modify,
2836 },
2837 {
2838 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-dstsrc",
2839 .cbs.modify = lib_interface_isis_multi_topology_ipv6_dstsrc_modify,
2840 },
2841 {
2842 .xpath = NULL,
2843 },
2844 }
2845 };