]> git.proxmox.com Git - mirror_frr.git/blob - isisd/isis_northbound.c
isisd: retrofit the 'spf-interval' command
[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 /* TODO: implement me. */
347 return NB_OK;
348 }
349
350 static int isis_instance_purge_originator_delete(enum nb_event event,
351 const struct lyd_node *dnode)
352 {
353 /* TODO: implement me. */
354 return NB_OK;
355 }
356
357 /*
358 * XPath: /frr-isisd:isis/instance/lsp/mtu
359 */
360 static int isis_instance_lsp_mtu_modify(enum nb_event event,
361 const struct lyd_node *dnode,
362 union nb_resource *resource)
363 {
364 struct listnode *node;
365 struct isis_circuit *circuit;
366 uint16_t lsp_mtu = yang_dnode_get_uint16(dnode, NULL);
367 struct isis_area *area;
368
369 switch (event) {
370 case NB_EV_VALIDATE:
371 area = yang_dnode_get_entry(dnode, false);
372 if (!area)
373 break;
374 for (ALL_LIST_ELEMENTS_RO(area->circuit_list, node, circuit)) {
375 if (circuit->state != C_STATE_INIT
376 && circuit->state != C_STATE_UP)
377 continue;
378 if (lsp_mtu > isis_circuit_pdu_size(circuit)) {
379 flog_warn(
380 EC_LIB_NB_CB_CONFIG_VALIDATE,
381 "ISIS area contains circuit %s, which has a maximum PDU size of %zu",
382 circuit->interface->name,
383 isis_circuit_pdu_size(circuit));
384 return NB_ERR_VALIDATION;
385 }
386 }
387 break;
388 case NB_EV_PREPARE:
389 case NB_EV_ABORT:
390 break;
391 case NB_EV_APPLY:
392 area = yang_dnode_get_entry(dnode, true);
393 isis_area_lsp_mtu_set(area, lsp_mtu);
394 break;
395 }
396
397 return NB_OK;
398 }
399
400 /*
401 * XPath: /frr-isisd:isis/instance/lsp/refresh-interval/level-1
402 */
403 static int
404 isis_instance_lsp_refresh_interval_level_1_modify(enum nb_event event,
405 const struct lyd_node *dnode,
406 union nb_resource *resource)
407 {
408 struct isis_area *area;
409 uint16_t refr_int;
410
411 if (event != NB_EV_APPLY)
412 return NB_OK;
413
414 refr_int = yang_dnode_get_uint16(dnode, NULL);
415 area = yang_dnode_get_entry(dnode, true);
416 isis_area_lsp_refresh_set(area, IS_LEVEL_1, refr_int);
417
418 return NB_OK;
419 }
420
421 /*
422 * XPath: /frr-isisd:isis/instance/lsp/refresh-interval/level-2
423 */
424 static int
425 isis_instance_lsp_refresh_interval_level_2_modify(enum nb_event event,
426 const struct lyd_node *dnode,
427 union nb_resource *resource)
428 {
429 struct isis_area *area;
430 uint16_t refr_int;
431
432 if (event != NB_EV_APPLY)
433 return NB_OK;
434
435 refr_int = yang_dnode_get_uint16(dnode, NULL);
436 area = yang_dnode_get_entry(dnode, true);
437 isis_area_lsp_refresh_set(area, IS_LEVEL_2, refr_int);
438
439 return NB_OK;
440 }
441
442 /*
443 * XPath: /frr-isisd:isis/instance/lsp/maximum-lifetime/level-1
444 */
445 static int
446 isis_instance_lsp_maximum_lifetime_level_1_modify(enum nb_event event,
447 const struct lyd_node *dnode,
448 union nb_resource *resource)
449 {
450 struct isis_area *area;
451 uint16_t max_lt;
452
453 if (event != NB_EV_APPLY)
454 return NB_OK;
455
456 max_lt = yang_dnode_get_uint16(dnode, NULL);
457 area = yang_dnode_get_entry(dnode, true);
458 isis_area_max_lsp_lifetime_set(area, IS_LEVEL_1, max_lt);
459
460 return NB_OK;
461 }
462
463 /*
464 * XPath: /frr-isisd:isis/instance/lsp/maximum-lifetime/level-2
465 */
466 static int
467 isis_instance_lsp_maximum_lifetime_level_2_modify(enum nb_event event,
468 const struct lyd_node *dnode,
469 union nb_resource *resource)
470 {
471 struct isis_area *area;
472 uint16_t max_lt;
473
474 if (event != NB_EV_APPLY)
475 return NB_OK;
476
477 max_lt = yang_dnode_get_uint16(dnode, NULL);
478 area = yang_dnode_get_entry(dnode, true);
479 isis_area_max_lsp_lifetime_set(area, IS_LEVEL_2, max_lt);
480
481 return NB_OK;
482 }
483
484 /*
485 * XPath: /frr-isisd:isis/instance/lsp/generation-interval/level-1
486 */
487 static int isis_instance_lsp_generation_interval_level_1_modify(
488 enum nb_event event, const struct lyd_node *dnode,
489 union nb_resource *resource)
490 {
491 struct isis_area *area;
492 uint16_t gen_int;
493
494 if (event != NB_EV_APPLY)
495 return NB_OK;
496
497 gen_int = yang_dnode_get_uint16(dnode, NULL);
498 area = yang_dnode_get_entry(dnode, true);
499 area->lsp_gen_interval[0] = gen_int;
500
501 return NB_OK;
502 }
503
504 /*
505 * XPath: /frr-isisd:isis/instance/lsp/generation-interval/level-2
506 */
507 static int isis_instance_lsp_generation_interval_level_2_modify(
508 enum nb_event event, const struct lyd_node *dnode,
509 union nb_resource *resource)
510 {
511 struct isis_area *area;
512 uint16_t gen_int;
513
514 if (event != NB_EV_APPLY)
515 return NB_OK;
516
517 gen_int = yang_dnode_get_uint16(dnode, NULL);
518 area = yang_dnode_get_entry(dnode, true);
519 area->lsp_gen_interval[1] = gen_int;
520
521 return NB_OK;
522 }
523
524 /*
525 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay
526 */
527 static int
528 isis_instance_spf_ietf_backoff_delay_create(enum nb_event event,
529 const struct lyd_node *dnode,
530 union nb_resource *resource)
531 {
532 /* TODO: implement me. */
533 return NB_OK;
534 }
535
536 static int
537 isis_instance_spf_ietf_backoff_delay_delete(enum nb_event event,
538 const struct lyd_node *dnode)
539 {
540 /* TODO: implement me. */
541 return NB_OK;
542 }
543
544 /*
545 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay/init-delay
546 */
547 static int isis_instance_spf_ietf_backoff_delay_init_delay_modify(
548 enum nb_event event, const struct lyd_node *dnode,
549 union nb_resource *resource)
550 {
551 /* TODO: implement me. */
552 return NB_OK;
553 }
554
555 /*
556 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay/short-delay
557 */
558 static int isis_instance_spf_ietf_backoff_delay_short_delay_modify(
559 enum nb_event event, const struct lyd_node *dnode,
560 union nb_resource *resource)
561 {
562 /* TODO: implement me. */
563 return NB_OK;
564 }
565
566 /*
567 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay/long-delay
568 */
569 static int isis_instance_spf_ietf_backoff_delay_long_delay_modify(
570 enum nb_event event, const struct lyd_node *dnode,
571 union nb_resource *resource)
572 {
573 /* TODO: implement me. */
574 return NB_OK;
575 }
576
577 /*
578 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay/hold-down
579 */
580 static int isis_instance_spf_ietf_backoff_delay_hold_down_modify(
581 enum nb_event event, const struct lyd_node *dnode,
582 union nb_resource *resource)
583 {
584 /* TODO: implement me. */
585 return NB_OK;
586 }
587
588 /*
589 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay/time-to-learn
590 */
591 static int isis_instance_spf_ietf_backoff_delay_time_to_learn_modify(
592 enum nb_event event, const struct lyd_node *dnode,
593 union nb_resource *resource)
594 {
595 /* TODO: implement me. */
596 return NB_OK;
597 }
598
599 /*
600 * XPath: /frr-isisd:isis/instance/spf/minimum-interval/level-1
601 */
602 static int
603 isis_instance_spf_minimum_interval_level_1_modify(enum nb_event event,
604 const struct lyd_node *dnode,
605 union nb_resource *resource)
606 {
607 struct isis_area *area;
608
609 if (event != NB_EV_APPLY)
610 return NB_OK;
611
612 area = yang_dnode_get_entry(dnode, true);
613 area->min_spf_interval[0] = yang_dnode_get_uint16(dnode, NULL);
614
615 return NB_OK;
616 }
617
618 /*
619 * XPath: /frr-isisd:isis/instance/spf/minimum-interval/level-2
620 */
621 static int
622 isis_instance_spf_minimum_interval_level_2_modify(enum nb_event event,
623 const struct lyd_node *dnode,
624 union nb_resource *resource)
625 {
626 struct isis_area *area;
627
628 if (event != NB_EV_APPLY)
629 return NB_OK;
630
631 area = yang_dnode_get_entry(dnode, true);
632 area->min_spf_interval[1] = yang_dnode_get_uint16(dnode, NULL);
633
634 return NB_OK;
635 }
636
637 /*
638 * XPath: /frr-isisd:isis/instance/area-password
639 */
640 static void area_password_apply_finish(const struct lyd_node *dnode)
641 {
642 const char *password = yang_dnode_get_string(dnode, "./password");
643 struct isis_area *area = yang_dnode_get_entry(dnode, true);
644 int pass_type = yang_dnode_get_enum(dnode, "./password-type");
645 uint8_t snp_auth = yang_dnode_get_enum(dnode, "./authenticate-snp");
646
647 switch (pass_type) {
648 case ISIS_PASSWD_TYPE_CLEARTXT:
649 isis_area_passwd_cleartext_set(area, IS_LEVEL_1, password,
650 snp_auth);
651 break;
652 case ISIS_PASSWD_TYPE_HMAC_MD5:
653 isis_area_passwd_hmac_md5_set(area, IS_LEVEL_1, password,
654 snp_auth);
655 break;
656 }
657 }
658
659 static int isis_instance_area_password_create(enum nb_event event,
660 const struct lyd_node *dnode,
661 union nb_resource *resource)
662 {
663 /* actual setting is done in apply_finish */
664 return NB_OK;
665 }
666
667 static int isis_instance_area_password_delete(enum nb_event event,
668 const struct lyd_node *dnode)
669 {
670 struct isis_area *area;
671
672 if (event != NB_EV_APPLY)
673 return NB_OK;
674
675 area = yang_dnode_get_entry(dnode, true);
676 isis_area_passwd_unset(area, IS_LEVEL_1);
677
678 return NB_OK;
679 }
680
681 /*
682 * XPath: /frr-isisd:isis/instance/area-password/password
683 */
684 static int
685 isis_instance_area_password_password_modify(enum nb_event event,
686 const struct lyd_node *dnode,
687 union nb_resource *resource)
688 {
689 /* actual setting is done in apply_finish */
690 return NB_OK;
691 }
692
693 /*
694 * XPath: /frr-isisd:isis/instance/area-password/password-type
695 */
696 static int
697 isis_instance_area_password_password_type_modify(enum nb_event event,
698 const struct lyd_node *dnode,
699 union nb_resource *resource)
700 {
701 /* actual setting is done in apply_finish */
702 return NB_OK;
703 }
704
705 /*
706 * XPath: /frr-isisd:isis/instance/area-password/authenticate-snp
707 */
708 static int isis_instance_area_password_authenticate_snp_modify(
709 enum nb_event event, const struct lyd_node *dnode,
710 union nb_resource *resource)
711 {
712 /* actual setting is done in apply_finish */
713 return NB_OK;
714 }
715
716 /*
717 * XPath: /frr-isisd:isis/instance/domain-password
718 */
719 static void domain_password_apply_finish(const struct lyd_node *dnode)
720 {
721 const char *password = yang_dnode_get_string(dnode, "./password");
722 struct isis_area *area = yang_dnode_get_entry(dnode, true);
723 int pass_type = yang_dnode_get_enum(dnode, "./password-type");
724 uint8_t snp_auth = yang_dnode_get_enum(dnode, "./authenticate-snp");
725
726 switch (pass_type) {
727 case ISIS_PASSWD_TYPE_CLEARTXT:
728 isis_area_passwd_cleartext_set(area, IS_LEVEL_2, password,
729 snp_auth);
730 break;
731 case ISIS_PASSWD_TYPE_HMAC_MD5:
732 isis_area_passwd_hmac_md5_set(area, IS_LEVEL_2, password,
733 snp_auth);
734 break;
735 }
736 }
737
738 static int isis_instance_domain_password_create(enum nb_event event,
739 const struct lyd_node *dnode,
740 union nb_resource *resource)
741 {
742 /* actual setting is done in apply_finish */
743 return NB_OK;
744 }
745
746 static int isis_instance_domain_password_delete(enum nb_event event,
747 const struct lyd_node *dnode)
748 {
749 struct isis_area *area;
750
751 if (event != NB_EV_APPLY)
752 return NB_OK;
753
754 area = yang_dnode_get_entry(dnode, true);
755 isis_area_passwd_unset(area, IS_LEVEL_2);
756
757 return NB_OK;
758 }
759
760 /*
761 * XPath: /frr-isisd:isis/instance/domain-password/password
762 */
763 static int
764 isis_instance_domain_password_password_modify(enum nb_event event,
765 const struct lyd_node *dnode,
766 union nb_resource *resource)
767 {
768 /* actual setting is done in apply_finish */
769 return NB_OK;
770 }
771
772 /*
773 * XPath: /frr-isisd:isis/instance/domain-password/password-type
774 */
775 static int
776 isis_instance_domain_password_password_type_modify(enum nb_event event,
777 const struct lyd_node *dnode,
778 union nb_resource *resource)
779 {
780 /* actual setting is done in apply_finish */
781 return NB_OK;
782 }
783
784 /*
785 * XPath: /frr-isisd:isis/instance/domain-password/authenticate-snp
786 */
787 static int isis_instance_domain_password_authenticate_snp_modify(
788 enum nb_event event, const struct lyd_node *dnode,
789 union nb_resource *resource)
790 {
791 /* actual setting is done in apply_finish */
792 return NB_OK;
793 }
794
795 /*
796 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv4
797 */
798 static int isis_instance_default_information_originate_ipv4_create(
799 enum nb_event event, const struct lyd_node *dnode,
800 union nb_resource *resource)
801 {
802 /* TODO: implement me. */
803 return NB_OK;
804 }
805
806 static int isis_instance_default_information_originate_ipv4_delete(
807 enum nb_event event, const struct lyd_node *dnode)
808 {
809 /* TODO: implement me. */
810 return NB_OK;
811 }
812
813 /*
814 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv4/always
815 */
816 static int isis_instance_default_information_originate_ipv4_always_create(
817 enum nb_event event, const struct lyd_node *dnode,
818 union nb_resource *resource)
819 {
820 /* TODO: implement me. */
821 return NB_OK;
822 }
823
824 static int isis_instance_default_information_originate_ipv4_always_delete(
825 enum nb_event event, const struct lyd_node *dnode)
826 {
827 /* TODO: implement me. */
828 return NB_OK;
829 }
830
831 /*
832 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv4/route-map
833 */
834 static int isis_instance_default_information_originate_ipv4_route_map_modify(
835 enum nb_event event, const struct lyd_node *dnode,
836 union nb_resource *resource)
837 {
838 /* TODO: implement me. */
839 return NB_OK;
840 }
841
842 static int isis_instance_default_information_originate_ipv4_route_map_delete(
843 enum nb_event event, const struct lyd_node *dnode)
844 {
845 /* TODO: implement me. */
846 return NB_OK;
847 }
848
849 /*
850 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv4/metric
851 */
852 static int isis_instance_default_information_originate_ipv4_metric_modify(
853 enum nb_event event, const struct lyd_node *dnode,
854 union nb_resource *resource)
855 {
856 /* TODO: implement me. */
857 return NB_OK;
858 }
859
860 static int isis_instance_default_information_originate_ipv4_metric_delete(
861 enum nb_event event, const struct lyd_node *dnode)
862 {
863 /* TODO: implement me. */
864 return NB_OK;
865 }
866
867 /*
868 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv6
869 */
870 static int isis_instance_default_information_originate_ipv6_create(
871 enum nb_event event, const struct lyd_node *dnode,
872 union nb_resource *resource)
873 {
874 /* TODO: implement me. */
875 return NB_OK;
876 }
877
878 static int isis_instance_default_information_originate_ipv6_delete(
879 enum nb_event event, const struct lyd_node *dnode)
880 {
881 /* TODO: implement me. */
882 return NB_OK;
883 }
884
885 /*
886 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv6/always
887 */
888 static int isis_instance_default_information_originate_ipv6_always_create(
889 enum nb_event event, const struct lyd_node *dnode,
890 union nb_resource *resource)
891 {
892 /* TODO: implement me. */
893 return NB_OK;
894 }
895
896 static int isis_instance_default_information_originate_ipv6_always_delete(
897 enum nb_event event, const struct lyd_node *dnode)
898 {
899 /* TODO: implement me. */
900 return NB_OK;
901 }
902
903 /*
904 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv6/route-map
905 */
906 static int isis_instance_default_information_originate_ipv6_route_map_modify(
907 enum nb_event event, const struct lyd_node *dnode,
908 union nb_resource *resource)
909 {
910 /* TODO: implement me. */
911 return NB_OK;
912 }
913
914 static int isis_instance_default_information_originate_ipv6_route_map_delete(
915 enum nb_event event, const struct lyd_node *dnode)
916 {
917 /* TODO: implement me. */
918 return NB_OK;
919 }
920
921 /*
922 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv6/metric
923 */
924 static int isis_instance_default_information_originate_ipv6_metric_modify(
925 enum nb_event event, const struct lyd_node *dnode,
926 union nb_resource *resource)
927 {
928 /* TODO: implement me. */
929 return NB_OK;
930 }
931
932 static int isis_instance_default_information_originate_ipv6_metric_delete(
933 enum nb_event event, const struct lyd_node *dnode)
934 {
935 /* TODO: implement me. */
936 return NB_OK;
937 }
938
939 /*
940 * XPath: /frr-isisd:isis/instance/redistribute/ipv4
941 */
942 static int isis_instance_redistribute_ipv4_create(enum nb_event event,
943 const struct lyd_node *dnode,
944 union nb_resource *resource)
945 {
946 /* TODO: implement me. */
947 return NB_OK;
948 }
949
950 static int isis_instance_redistribute_ipv4_delete(enum nb_event event,
951 const struct lyd_node *dnode)
952 {
953 /* TODO: implement me. */
954 return NB_OK;
955 }
956
957 /*
958 * XPath: /frr-isisd:isis/instance/redistribute/ipv4/route-map
959 */
960 static int
961 isis_instance_redistribute_ipv4_route_map_modify(enum nb_event event,
962 const struct lyd_node *dnode,
963 union nb_resource *resource)
964 {
965 /* TODO: implement me. */
966 return NB_OK;
967 }
968
969 static int
970 isis_instance_redistribute_ipv4_route_map_delete(enum nb_event event,
971 const struct lyd_node *dnode)
972 {
973 /* TODO: implement me. */
974 return NB_OK;
975 }
976
977 /*
978 * XPath: /frr-isisd:isis/instance/redistribute/ipv4/metric
979 */
980 static int
981 isis_instance_redistribute_ipv4_metric_modify(enum nb_event event,
982 const struct lyd_node *dnode,
983 union nb_resource *resource)
984 {
985 /* TODO: implement me. */
986 return NB_OK;
987 }
988
989 static int
990 isis_instance_redistribute_ipv4_metric_delete(enum nb_event event,
991 const struct lyd_node *dnode)
992 {
993 /* TODO: implement me. */
994 return NB_OK;
995 }
996
997 /*
998 * XPath: /frr-isisd:isis/instance/redistribute/ipv6
999 */
1000 static int isis_instance_redistribute_ipv6_create(enum nb_event event,
1001 const struct lyd_node *dnode,
1002 union nb_resource *resource)
1003 {
1004 /* TODO: implement me. */
1005 return NB_OK;
1006 }
1007
1008 static int isis_instance_redistribute_ipv6_delete(enum nb_event event,
1009 const struct lyd_node *dnode)
1010 {
1011 /* TODO: implement me. */
1012 return NB_OK;
1013 }
1014
1015 /*
1016 * XPath: /frr-isisd:isis/instance/redistribute/ipv6/route-map
1017 */
1018 static int
1019 isis_instance_redistribute_ipv6_route_map_modify(enum nb_event event,
1020 const struct lyd_node *dnode,
1021 union nb_resource *resource)
1022 {
1023 /* TODO: implement me. */
1024 return NB_OK;
1025 }
1026
1027 static int
1028 isis_instance_redistribute_ipv6_route_map_delete(enum nb_event event,
1029 const struct lyd_node *dnode)
1030 {
1031 /* TODO: implement me. */
1032 return NB_OK;
1033 }
1034
1035 /*
1036 * XPath: /frr-isisd:isis/instance/redistribute/ipv6/metric
1037 */
1038 static int
1039 isis_instance_redistribute_ipv6_metric_modify(enum nb_event event,
1040 const struct lyd_node *dnode,
1041 union nb_resource *resource)
1042 {
1043 /* TODO: implement me. */
1044 return NB_OK;
1045 }
1046
1047 static int
1048 isis_instance_redistribute_ipv6_metric_delete(enum nb_event event,
1049 const struct lyd_node *dnode)
1050 {
1051 /* TODO: implement me. */
1052 return NB_OK;
1053 }
1054
1055 /*
1056 * XPath: /frr-isisd:isis/instance/multi-topology/ipv4-multicast
1057 */
1058 static int
1059 isis_instance_multi_topology_ipv4_multicast_create(enum nb_event event,
1060 const struct lyd_node *dnode,
1061 union nb_resource *resource)
1062 {
1063 /* TODO: implement me. */
1064 return NB_OK;
1065 }
1066
1067 static int
1068 isis_instance_multi_topology_ipv4_multicast_delete(enum nb_event event,
1069 const struct lyd_node *dnode)
1070 {
1071 /* TODO: implement me. */
1072 return NB_OK;
1073 }
1074
1075 /*
1076 * XPath: /frr-isisd:isis/instance/multi-topology/ipv4-multicast/overload
1077 */
1078 static int isis_instance_multi_topology_ipv4_multicast_overload_create(
1079 enum nb_event event, const struct lyd_node *dnode,
1080 union nb_resource *resource)
1081 {
1082 /* TODO: implement me. */
1083 return NB_OK;
1084 }
1085
1086 static int isis_instance_multi_topology_ipv4_multicast_overload_delete(
1087 enum nb_event event, const struct lyd_node *dnode)
1088 {
1089 /* TODO: implement me. */
1090 return NB_OK;
1091 }
1092
1093 /*
1094 * XPath: /frr-isisd:isis/instance/multi-topology/ipv4-management
1095 */
1096 static int isis_instance_multi_topology_ipv4_management_create(
1097 enum nb_event event, const struct lyd_node *dnode,
1098 union nb_resource *resource)
1099 {
1100 /* TODO: implement me. */
1101 return NB_OK;
1102 }
1103
1104 static int isis_instance_multi_topology_ipv4_management_delete(
1105 enum nb_event event, const struct lyd_node *dnode)
1106 {
1107 /* TODO: implement me. */
1108 return NB_OK;
1109 }
1110
1111 /*
1112 * XPath: /frr-isisd:isis/instance/multi-topology/ipv4-management/overload
1113 */
1114 static int isis_instance_multi_topology_ipv4_management_overload_create(
1115 enum nb_event event, const struct lyd_node *dnode,
1116 union nb_resource *resource)
1117 {
1118 /* TODO: implement me. */
1119 return NB_OK;
1120 }
1121
1122 static int isis_instance_multi_topology_ipv4_management_overload_delete(
1123 enum nb_event event, const struct lyd_node *dnode)
1124 {
1125 /* TODO: implement me. */
1126 return NB_OK;
1127 }
1128
1129 /*
1130 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-unicast
1131 */
1132 static int
1133 isis_instance_multi_topology_ipv6_unicast_create(enum nb_event event,
1134 const struct lyd_node *dnode,
1135 union nb_resource *resource)
1136 {
1137 /* TODO: implement me. */
1138 return NB_OK;
1139 }
1140
1141 static int
1142 isis_instance_multi_topology_ipv6_unicast_delete(enum nb_event event,
1143 const struct lyd_node *dnode)
1144 {
1145 /* TODO: implement me. */
1146 return NB_OK;
1147 }
1148
1149 /*
1150 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-unicast/overload
1151 */
1152 static int isis_instance_multi_topology_ipv6_unicast_overload_create(
1153 enum nb_event event, const struct lyd_node *dnode,
1154 union nb_resource *resource)
1155 {
1156 /* TODO: implement me. */
1157 return NB_OK;
1158 }
1159
1160 static int isis_instance_multi_topology_ipv6_unicast_overload_delete(
1161 enum nb_event event, const struct lyd_node *dnode)
1162 {
1163 /* TODO: implement me. */
1164 return NB_OK;
1165 }
1166
1167 /*
1168 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-multicast
1169 */
1170 static int
1171 isis_instance_multi_topology_ipv6_multicast_create(enum nb_event event,
1172 const struct lyd_node *dnode,
1173 union nb_resource *resource)
1174 {
1175 /* TODO: implement me. */
1176 return NB_OK;
1177 }
1178
1179 static int
1180 isis_instance_multi_topology_ipv6_multicast_delete(enum nb_event event,
1181 const struct lyd_node *dnode)
1182 {
1183 /* TODO: implement me. */
1184 return NB_OK;
1185 }
1186
1187 /*
1188 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-multicast/overload
1189 */
1190 static int isis_instance_multi_topology_ipv6_multicast_overload_create(
1191 enum nb_event event, const struct lyd_node *dnode,
1192 union nb_resource *resource)
1193 {
1194 /* TODO: implement me. */
1195 return NB_OK;
1196 }
1197
1198 static int isis_instance_multi_topology_ipv6_multicast_overload_delete(
1199 enum nb_event event, const struct lyd_node *dnode)
1200 {
1201 /* TODO: implement me. */
1202 return NB_OK;
1203 }
1204
1205 /*
1206 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-management
1207 */
1208 static int isis_instance_multi_topology_ipv6_management_create(
1209 enum nb_event event, const struct lyd_node *dnode,
1210 union nb_resource *resource)
1211 {
1212 /* TODO: implement me. */
1213 return NB_OK;
1214 }
1215
1216 static int isis_instance_multi_topology_ipv6_management_delete(
1217 enum nb_event event, const struct lyd_node *dnode)
1218 {
1219 /* TODO: implement me. */
1220 return NB_OK;
1221 }
1222
1223 /*
1224 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-management/overload
1225 */
1226 static int isis_instance_multi_topology_ipv6_management_overload_create(
1227 enum nb_event event, const struct lyd_node *dnode,
1228 union nb_resource *resource)
1229 {
1230 /* TODO: implement me. */
1231 return NB_OK;
1232 }
1233
1234 static int isis_instance_multi_topology_ipv6_management_overload_delete(
1235 enum nb_event event, const struct lyd_node *dnode)
1236 {
1237 /* TODO: implement me. */
1238 return NB_OK;
1239 }
1240
1241 /*
1242 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-dstsrc
1243 */
1244 static int
1245 isis_instance_multi_topology_ipv6_dstsrc_create(enum nb_event event,
1246 const struct lyd_node *dnode,
1247 union nb_resource *resource)
1248 {
1249 /* TODO: implement me. */
1250 return NB_OK;
1251 }
1252
1253 static int
1254 isis_instance_multi_topology_ipv6_dstsrc_delete(enum nb_event event,
1255 const struct lyd_node *dnode)
1256 {
1257 /* TODO: implement me. */
1258 return NB_OK;
1259 }
1260
1261 /*
1262 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-dstsrc/overload
1263 */
1264 static int isis_instance_multi_topology_ipv6_dstsrc_overload_create(
1265 enum nb_event event, const struct lyd_node *dnode,
1266 union nb_resource *resource)
1267 {
1268 /* TODO: implement me. */
1269 return NB_OK;
1270 }
1271
1272 static int isis_instance_multi_topology_ipv6_dstsrc_overload_delete(
1273 enum nb_event event, const struct lyd_node *dnode)
1274 {
1275 /* TODO: implement me. */
1276 return NB_OK;
1277 }
1278
1279 /*
1280 * XPath: /frr-isisd:isis/instance/log-adjacency-changes
1281 */
1282 static int
1283 isis_instance_log_adjacency_changes_create(enum nb_event event,
1284 const struct lyd_node *dnode,
1285 union nb_resource *resource)
1286 {
1287 /* TODO: implement me. */
1288 return NB_OK;
1289 }
1290
1291 static int
1292 isis_instance_log_adjacency_changes_delete(enum nb_event event,
1293 const struct lyd_node *dnode)
1294 {
1295 /* TODO: implement me. */
1296 return NB_OK;
1297 }
1298
1299 /*
1300 * XPath: /frr-isisd:isis/mpls-te
1301 */
1302 static int isis_mpls_te_create(enum nb_event event,
1303 const struct lyd_node *dnode,
1304 union nb_resource *resource)
1305 {
1306 /* TODO: implement me. */
1307 return NB_OK;
1308 }
1309
1310 static int isis_mpls_te_delete(enum nb_event event,
1311 const struct lyd_node *dnode)
1312 {
1313 /* TODO: implement me. */
1314 return NB_OK;
1315 }
1316
1317 /*
1318 * XPath: /frr-isisd:isis/mpls-te/router-address
1319 */
1320 static int isis_mpls_te_router_address_modify(enum nb_event event,
1321 const struct lyd_node *dnode,
1322 union nb_resource *resource)
1323 {
1324 /* TODO: implement me. */
1325 return NB_OK;
1326 }
1327
1328 static int isis_mpls_te_router_address_delete(enum nb_event event,
1329 const struct lyd_node *dnode)
1330 {
1331 /* TODO: implement me. */
1332 return NB_OK;
1333 }
1334
1335 /*
1336 * XPath: /frr-interface:lib/interface/frr-isisd:isis
1337 */
1338 static int lib_interface_isis_create(enum nb_event event,
1339 const struct lyd_node *dnode,
1340 union nb_resource *resource)
1341 {
1342 struct isis_area *area;
1343 struct interface *ifp;
1344 struct isis_circuit *circuit;
1345 const char *area_tag = yang_dnode_get_string(dnode, "./area-tag");
1346
1347 if (event != NB_EV_APPLY)
1348 return NB_OK;
1349
1350 area = isis_area_lookup(area_tag);
1351 /* The area should have already be created. We are
1352 * setting the priority of the global isis area creation
1353 * slightly lower, so it should be executed first, but I
1354 * cannot rely on that so here I have to check.
1355 */
1356 if (!area) {
1357 flog_err(
1358 EC_LIB_NB_CB_CONFIG_APPLY,
1359 "%s: attempt to create circuit for area %s before the area has been created",
1360 __func__, area_tag);
1361 abort();
1362 }
1363
1364 ifp = yang_dnode_get_entry(dnode, true);
1365 circuit = isis_circuit_create(area, ifp);
1366 assert(circuit->state == C_STATE_CONF || circuit->state == C_STATE_UP);
1367 yang_dnode_set_entry(dnode, circuit);
1368
1369 return NB_OK;
1370 }
1371
1372 static int lib_interface_isis_delete(enum nb_event event,
1373 const struct lyd_node *dnode)
1374 {
1375 struct isis_circuit *circuit;
1376
1377 if (event != NB_EV_APPLY)
1378 return NB_OK;
1379
1380 circuit = yang_dnode_get_entry(dnode, true);
1381 if (!circuit)
1382 return NB_ERR_INCONSISTENCY;
1383 /* delete circuit through csm changes */
1384 switch (circuit->state) {
1385 case C_STATE_UP:
1386 isis_csm_state_change(IF_DOWN_FROM_Z, circuit,
1387 circuit->interface);
1388 isis_csm_state_change(ISIS_DISABLE, circuit, circuit->area);
1389 break;
1390 case C_STATE_CONF:
1391 isis_csm_state_change(ISIS_DISABLE, circuit, circuit->area);
1392 break;
1393 case C_STATE_INIT:
1394 isis_csm_state_change(IF_DOWN_FROM_Z, circuit,
1395 circuit->interface);
1396 break;
1397 }
1398
1399 return NB_OK;
1400 }
1401
1402 /*
1403 * XPath: /frr-interface:lib/interface/frr-isisd:isis/area-tag
1404 */
1405 static int lib_interface_isis_area_tag_modify(enum nb_event event,
1406 const struct lyd_node *dnode,
1407 union nb_resource *resource)
1408 {
1409 struct isis_circuit *circuit;
1410 struct interface *ifp;
1411 struct vrf *vrf;
1412 const char *area_tag, *ifname, *vrfname;
1413
1414 if (event == NB_EV_VALIDATE) {
1415 /* libyang doesn't like relative paths across module boundaries
1416 */
1417 ifname = yang_dnode_get_string(dnode->parent->parent, "./name");
1418 vrfname = yang_dnode_get_string(dnode->parent->parent, "./vrf");
1419 vrf = vrf_lookup_by_name(vrfname);
1420 assert(vrf);
1421 ifp = if_lookup_by_name(ifname, vrf->vrf_id);
1422 if (!ifp)
1423 return NB_OK;
1424 circuit = circuit_lookup_by_ifp(ifp, isis->init_circ_list);
1425 area_tag = yang_dnode_get_string(dnode, NULL);
1426 if (circuit && circuit->area && circuit->area->area_tag
1427 && strcmp(circuit->area->area_tag, area_tag)) {
1428 flog_warn(EC_LIB_NB_CB_CONFIG_VALIDATE,
1429 "ISIS circuit is already defined on %s",
1430 circuit->area->area_tag);
1431 return NB_ERR_VALIDATION;
1432 }
1433 }
1434
1435 return NB_OK;
1436 }
1437
1438 /*
1439 * XPath: /frr-interface:lib/interface/frr-isisd:isis/circuit-type
1440 */
1441 static int lib_interface_isis_circuit_type_modify(enum nb_event event,
1442 const struct lyd_node *dnode,
1443 union nb_resource *resource)
1444 {
1445 int circ_type = yang_dnode_get_enum(dnode, NULL);
1446 struct isis_circuit *circuit;
1447 struct interface *ifp;
1448 struct vrf *vrf;
1449 const char *ifname, *vrfname;
1450
1451 switch (event) {
1452 case NB_EV_VALIDATE:
1453 /* libyang doesn't like relative paths across module boundaries
1454 */
1455 ifname = yang_dnode_get_string(dnode->parent->parent, "./name");
1456 vrfname = yang_dnode_get_string(dnode->parent->parent, "./vrf");
1457 vrf = vrf_lookup_by_name(vrfname);
1458 assert(vrf);
1459 ifp = if_lookup_by_name(ifname, vrf->vrf_id);
1460 if (!ifp)
1461 break;
1462 circuit = circuit_lookup_by_ifp(ifp, isis->init_circ_list);
1463 if (circuit && circuit->state == C_STATE_UP
1464 && circuit->area->is_type != IS_LEVEL_1_AND_2
1465 && circuit->area->is_type != circ_type) {
1466 flog_warn(EC_LIB_NB_CB_CONFIG_VALIDATE,
1467 "Invalid circuit level for area %s",
1468 circuit->area->area_tag);
1469 return NB_ERR_VALIDATION;
1470 }
1471 break;
1472 case NB_EV_PREPARE:
1473 case NB_EV_ABORT:
1474 break;
1475 case NB_EV_APPLY:
1476 circuit = yang_dnode_get_entry(dnode, true);
1477 isis_circuit_is_type_set(circuit, circ_type);
1478 break;
1479 }
1480
1481 return NB_OK;
1482 }
1483
1484 /*
1485 * XPath: /frr-interface:lib/interface/frr-isisd:isis/ipv4-routing
1486 */
1487 static int lib_interface_isis_ipv4_routing_create(enum nb_event event,
1488 const struct lyd_node *dnode,
1489 union nb_resource *resource)
1490 {
1491 bool ipv6;
1492 struct isis_circuit *circuit;
1493
1494 if (event != NB_EV_APPLY)
1495 return NB_OK;
1496
1497 circuit = yang_dnode_get_entry(dnode, true);
1498 ipv6 = yang_dnode_exists(dnode, "../ipv6-routing");
1499 isis_circuit_af_set(circuit, true, ipv6);
1500
1501 return NB_OK;
1502 }
1503
1504 static int lib_interface_isis_ipv4_routing_delete(enum nb_event event,
1505 const struct lyd_node *dnode)
1506 {
1507 bool ipv6;
1508 struct isis_circuit *circuit;
1509
1510 if (event != NB_EV_APPLY)
1511 return NB_OK;
1512
1513 circuit = yang_dnode_get_entry(dnode, true);
1514 if (circuit && circuit->area) {
1515 ipv6 = yang_dnode_exists(dnode, "../ipv6-routing");
1516 isis_circuit_af_set(circuit, false, ipv6);
1517 }
1518
1519 return NB_OK;
1520 }
1521
1522 /*
1523 * XPath: /frr-interface:lib/interface/frr-isisd:isis/ipv6-routing
1524 */
1525 static int lib_interface_isis_ipv6_routing_create(enum nb_event event,
1526 const struct lyd_node *dnode,
1527 union nb_resource *resource)
1528 {
1529 bool ipv4;
1530 struct isis_circuit *circuit;
1531
1532 if (event != NB_EV_APPLY)
1533 return NB_OK;
1534
1535 circuit = yang_dnode_get_entry(dnode, true);
1536 ipv4 = yang_dnode_exists(dnode, "../ipv6-routing");
1537 isis_circuit_af_set(circuit, ipv4, true);
1538
1539 return NB_OK;
1540 }
1541
1542 static int lib_interface_isis_ipv6_routing_delete(enum nb_event event,
1543 const struct lyd_node *dnode)
1544 {
1545 bool ipv4;
1546 struct isis_circuit *circuit;
1547
1548 if (event != NB_EV_APPLY)
1549 return NB_OK;
1550
1551 circuit = yang_dnode_get_entry(dnode, true);
1552 if (circuit->area) {
1553 ipv4 = yang_dnode_exists(dnode, "../ipv4-routing");
1554 isis_circuit_af_set(circuit, ipv4, false);
1555 }
1556
1557 return NB_OK;
1558 }
1559
1560 /*
1561 * XPath: /frr-interface:lib/interface/frr-isisd:isis/csnp-interval/level-1
1562 */
1563 static int
1564 lib_interface_isis_csnp_interval_level_1_modify(enum nb_event event,
1565 const struct lyd_node *dnode,
1566 union nb_resource *resource)
1567 {
1568 /* TODO: implement me. */
1569 return NB_OK;
1570 }
1571
1572 /*
1573 * XPath: /frr-interface:lib/interface/frr-isisd:isis/csnp-interval/level-2
1574 */
1575 static int
1576 lib_interface_isis_csnp_interval_level_2_modify(enum nb_event event,
1577 const struct lyd_node *dnode,
1578 union nb_resource *resource)
1579 {
1580 /* TODO: implement me. */
1581 return NB_OK;
1582 }
1583
1584 /*
1585 * XPath: /frr-interface:lib/interface/frr-isisd:isis/psnp-interval/level-1
1586 */
1587 static int
1588 lib_interface_isis_psnp_interval_level_1_modify(enum nb_event event,
1589 const struct lyd_node *dnode,
1590 union nb_resource *resource)
1591 {
1592 /* TODO: implement me. */
1593 return NB_OK;
1594 }
1595
1596 /*
1597 * XPath: /frr-interface:lib/interface/frr-isisd:isis/psnp-interval/level-2
1598 */
1599 static int
1600 lib_interface_isis_psnp_interval_level_2_modify(enum nb_event event,
1601 const struct lyd_node *dnode,
1602 union nb_resource *resource)
1603 {
1604 /* TODO: implement me. */
1605 return NB_OK;
1606 }
1607
1608 /*
1609 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/padding
1610 */
1611 static int lib_interface_isis_hello_padding_modify(enum nb_event event,
1612 const struct lyd_node *dnode,
1613 union nb_resource *resource)
1614 {
1615 /* TODO: implement me. */
1616 return NB_OK;
1617 }
1618
1619 /*
1620 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/interval/level-1
1621 */
1622 static int
1623 lib_interface_isis_hello_interval_level_1_modify(enum nb_event event,
1624 const struct lyd_node *dnode,
1625 union nb_resource *resource)
1626 {
1627 /* TODO: implement me. */
1628 return NB_OK;
1629 }
1630
1631 /*
1632 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/interval/level-2
1633 */
1634 static int
1635 lib_interface_isis_hello_interval_level_2_modify(enum nb_event event,
1636 const struct lyd_node *dnode,
1637 union nb_resource *resource)
1638 {
1639 /* TODO: implement me. */
1640 return NB_OK;
1641 }
1642
1643 /*
1644 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/multiplier/level-1
1645 */
1646 static int
1647 lib_interface_isis_hello_multiplier_level_1_modify(enum nb_event event,
1648 const struct lyd_node *dnode,
1649 union nb_resource *resource)
1650 {
1651 /* TODO: implement me. */
1652 return NB_OK;
1653 }
1654
1655 /*
1656 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/multiplier/level-2
1657 */
1658 static int
1659 lib_interface_isis_hello_multiplier_level_2_modify(enum nb_event event,
1660 const struct lyd_node *dnode,
1661 union nb_resource *resource)
1662 {
1663 /* TODO: implement me. */
1664 return NB_OK;
1665 }
1666
1667 /*
1668 * XPath: /frr-interface:lib/interface/frr-isisd:isis/metric/level-1
1669 */
1670 static int
1671 lib_interface_isis_metric_level_1_modify(enum nb_event event,
1672 const struct lyd_node *dnode,
1673 union nb_resource *resource)
1674 {
1675 /* TODO: implement me. */
1676 return NB_OK;
1677 }
1678
1679 /*
1680 * XPath: /frr-interface:lib/interface/frr-isisd:isis/metric/level-2
1681 */
1682 static int
1683 lib_interface_isis_metric_level_2_modify(enum nb_event event,
1684 const struct lyd_node *dnode,
1685 union nb_resource *resource)
1686 {
1687 /* TODO: implement me. */
1688 return NB_OK;
1689 }
1690
1691 /*
1692 * XPath: /frr-interface:lib/interface/frr-isisd:isis/priority/level-1
1693 */
1694 static int
1695 lib_interface_isis_priority_level_1_modify(enum nb_event event,
1696 const struct lyd_node *dnode,
1697 union nb_resource *resource)
1698 {
1699 /* TODO: implement me. */
1700 return NB_OK;
1701 }
1702
1703 /*
1704 * XPath: /frr-interface:lib/interface/frr-isisd:isis/priority/level-2
1705 */
1706 static int
1707 lib_interface_isis_priority_level_2_modify(enum nb_event event,
1708 const struct lyd_node *dnode,
1709 union nb_resource *resource)
1710 {
1711 /* TODO: implement me. */
1712 return NB_OK;
1713 }
1714
1715 /*
1716 * XPath: /frr-interface:lib/interface/frr-isisd:isis/network-type
1717 */
1718 static int lib_interface_isis_network_type_modify(enum nb_event event,
1719 const struct lyd_node *dnode,
1720 union nb_resource *resource)
1721 {
1722 /* TODO: implement me. */
1723 return NB_OK;
1724 }
1725
1726 static int lib_interface_isis_network_type_delete(enum nb_event event,
1727 const struct lyd_node *dnode)
1728 {
1729 /* TODO: implement me. */
1730 return NB_OK;
1731 }
1732
1733 /*
1734 * XPath: /frr-interface:lib/interface/frr-isisd:isis/passive
1735 */
1736 static int lib_interface_isis_passive_create(enum nb_event event,
1737 const struct lyd_node *dnode,
1738 union nb_resource *resource)
1739 {
1740 /* TODO: implement me. */
1741 return NB_OK;
1742 }
1743
1744 static int lib_interface_isis_passive_delete(enum nb_event event,
1745 const struct lyd_node *dnode)
1746 {
1747 /* TODO: implement me. */
1748 return NB_OK;
1749 }
1750
1751 /*
1752 * XPath: /frr-interface:lib/interface/frr-isisd:isis/password
1753 */
1754 static int lib_interface_isis_password_create(enum nb_event event,
1755 const struct lyd_node *dnode,
1756 union nb_resource *resource)
1757 {
1758 /* TODO: implement me. */
1759 return NB_OK;
1760 }
1761
1762 static int lib_interface_isis_password_delete(enum nb_event event,
1763 const struct lyd_node *dnode)
1764 {
1765 /* TODO: implement me. */
1766 return NB_OK;
1767 }
1768
1769 /*
1770 * XPath: /frr-interface:lib/interface/frr-isisd:isis/password/password
1771 */
1772 static int
1773 lib_interface_isis_password_password_modify(enum nb_event event,
1774 const struct lyd_node *dnode,
1775 union nb_resource *resource)
1776 {
1777 /* TODO: implement me. */
1778 return NB_OK;
1779 }
1780
1781 /*
1782 * XPath: /frr-interface:lib/interface/frr-isisd:isis/password/password-type
1783 */
1784 static int
1785 lib_interface_isis_password_password_type_modify(enum nb_event event,
1786 const struct lyd_node *dnode,
1787 union nb_resource *resource)
1788 {
1789 /* TODO: implement me. */
1790 return NB_OK;
1791 }
1792
1793 /*
1794 * XPath:
1795 * /frr-interface:lib/interface/frr-isisd:isis/disable-three-way-handshake
1796 */
1797 static int lib_interface_isis_disable_three_way_handshake_create(
1798 enum nb_event event, const struct lyd_node *dnode,
1799 union nb_resource *resource)
1800 {
1801 /* TODO: implement me. */
1802 return NB_OK;
1803 }
1804
1805 static int lib_interface_isis_disable_three_way_handshake_delete(
1806 enum nb_event event, const struct lyd_node *dnode)
1807 {
1808 /* TODO: implement me. */
1809 return NB_OK;
1810 }
1811
1812 /*
1813 * XPath:
1814 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-unicast
1815 */
1816 static int lib_interface_isis_multi_topology_ipv4_unicast_modify(
1817 enum nb_event event, const struct lyd_node *dnode,
1818 union nb_resource *resource)
1819 {
1820 /* TODO: implement me. */
1821 return NB_OK;
1822 }
1823
1824 /*
1825 * XPath:
1826 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-multicast
1827 */
1828 static int lib_interface_isis_multi_topology_ipv4_multicast_modify(
1829 enum nb_event event, const struct lyd_node *dnode,
1830 union nb_resource *resource)
1831 {
1832 /* TODO: implement me. */
1833 return NB_OK;
1834 }
1835
1836 /*
1837 * XPath:
1838 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-management
1839 */
1840 static int lib_interface_isis_multi_topology_ipv4_management_modify(
1841 enum nb_event event, const struct lyd_node *dnode,
1842 union nb_resource *resource)
1843 {
1844 /* TODO: implement me. */
1845 return NB_OK;
1846 }
1847
1848 /*
1849 * XPath:
1850 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-unicast
1851 */
1852 static int lib_interface_isis_multi_topology_ipv6_unicast_modify(
1853 enum nb_event event, const struct lyd_node *dnode,
1854 union nb_resource *resource)
1855 {
1856 /* TODO: implement me. */
1857 return NB_OK;
1858 }
1859
1860 /*
1861 * XPath:
1862 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-multicast
1863 */
1864 static int lib_interface_isis_multi_topology_ipv6_multicast_modify(
1865 enum nb_event event, const struct lyd_node *dnode,
1866 union nb_resource *resource)
1867 {
1868 /* TODO: implement me. */
1869 return NB_OK;
1870 }
1871
1872 /*
1873 * XPath:
1874 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-management
1875 */
1876 static int lib_interface_isis_multi_topology_ipv6_management_modify(
1877 enum nb_event event, const struct lyd_node *dnode,
1878 union nb_resource *resource)
1879 {
1880 /* TODO: implement me. */
1881 return NB_OK;
1882 }
1883
1884 /*
1885 * XPath: /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-dstsrc
1886 */
1887 static int lib_interface_isis_multi_topology_ipv6_dstsrc_modify(
1888 enum nb_event event, const struct lyd_node *dnode,
1889 union nb_resource *resource)
1890 {
1891 /* TODO: implement me. */
1892 return NB_OK;
1893 }
1894
1895 /* clang-format off */
1896 const struct frr_yang_module_info frr_isisd_info = {
1897 .name = "frr-isisd",
1898 .nodes = {
1899 {
1900 .xpath = "/frr-isisd:isis/instance",
1901 .cbs.create = isis_instance_create,
1902 .cbs.delete = isis_instance_delete,
1903 .cbs.cli_show = cli_show_router_isis,
1904 .priority = NB_DFLT_PRIORITY - 1,
1905 },
1906 {
1907 .xpath = "/frr-isisd:isis/instance/is-type",
1908 .cbs.modify = isis_instance_is_type_modify,
1909 .cbs.cli_show = cli_show_isis_is_type,
1910 },
1911 {
1912 .xpath = "/frr-isisd:isis/instance/area-address",
1913 .cbs.create = isis_instance_area_address_create,
1914 .cbs.delete = isis_instance_area_address_delete,
1915 .cbs.cli_show = cli_show_isis_area_address,
1916 },
1917 {
1918 .xpath = "/frr-isisd:isis/instance/dynamic-hostname",
1919 .cbs.modify = isis_instance_dynamic_hostname_modify,
1920 .cbs.cli_show = cli_show_isis_dynamic_hostname,
1921 },
1922 {
1923 .xpath = "/frr-isisd:isis/instance/attached",
1924 .cbs.create = isis_instance_attached_create,
1925 .cbs.delete = isis_instance_attached_delete,
1926 .cbs.cli_show = cli_show_isis_attached,
1927 },
1928 {
1929 .xpath = "/frr-isisd:isis/instance/overload",
1930 .cbs.create = isis_instance_overload_create,
1931 .cbs.delete = isis_instance_overload_delete,
1932 .cbs.cli_show = cli_show_isis_overload,
1933 },
1934 {
1935 .xpath = "/frr-isisd:isis/instance/metric-style",
1936 .cbs.modify = isis_instance_metric_style_modify,
1937 .cbs.cli_show = cli_show_isis_metric_style,
1938 },
1939 {
1940 .xpath = "/frr-isisd:isis/instance/purge-originator",
1941 .cbs.create = isis_instance_purge_originator_create,
1942 .cbs.delete = isis_instance_purge_originator_delete,
1943 },
1944 {
1945 .xpath = "/frr-isisd:isis/instance/lsp/mtu",
1946 .cbs.modify = isis_instance_lsp_mtu_modify,
1947 .cbs.cli_show = cli_show_isis_lsp_mtu,
1948 },
1949 {
1950 .xpath = "/frr-isisd:isis/instance/lsp/refresh-interval",
1951 .cbs.cli_show = cli_show_isis_lsp_ref_interval,
1952 },
1953 {
1954 .xpath = "/frr-isisd:isis/instance/lsp/refresh-interval/level-1",
1955 .cbs.modify = isis_instance_lsp_refresh_interval_level_1_modify,
1956 },
1957 {
1958 .xpath = "/frr-isisd:isis/instance/lsp/refresh-interval/level-2",
1959 .cbs.modify = isis_instance_lsp_refresh_interval_level_2_modify,
1960 },
1961 {
1962 .xpath = "/frr-isisd:isis/instance/lsp/maximum-lifetime",
1963 .cbs.cli_show = cli_show_isis_lsp_max_lifetime,
1964 },
1965 {
1966 .xpath = "/frr-isisd:isis/instance/lsp/maximum-lifetime/level-1",
1967 .cbs.modify = isis_instance_lsp_maximum_lifetime_level_1_modify,
1968 },
1969 {
1970 .xpath = "/frr-isisd:isis/instance/lsp/maximum-lifetime/level-2",
1971 .cbs.modify = isis_instance_lsp_maximum_lifetime_level_2_modify,
1972 },
1973 {
1974 .xpath = "/frr-isisd:isis/instance/lsp/generation-interval",
1975 .cbs.cli_show = cli_show_isis_lsp_gen_interval,
1976 },
1977 {
1978 .xpath = "/frr-isisd:isis/instance/lsp/generation-interval/level-1",
1979 .cbs.modify = isis_instance_lsp_generation_interval_level_1_modify,
1980 },
1981 {
1982 .xpath = "/frr-isisd:isis/instance/lsp/generation-interval/level-2",
1983 .cbs.modify = isis_instance_lsp_generation_interval_level_2_modify,
1984 },
1985 {
1986 .xpath = "/frr-isisd:isis/instance/spf/ietf-backoff-delay",
1987 .cbs.create = isis_instance_spf_ietf_backoff_delay_create,
1988 .cbs.delete = isis_instance_spf_ietf_backoff_delay_delete,
1989 },
1990 {
1991 .xpath = "/frr-isisd:isis/instance/spf/ietf-backoff-delay/init-delay",
1992 .cbs.modify = isis_instance_spf_ietf_backoff_delay_init_delay_modify,
1993 },
1994 {
1995 .xpath = "/frr-isisd:isis/instance/spf/ietf-backoff-delay/short-delay",
1996 .cbs.modify = isis_instance_spf_ietf_backoff_delay_short_delay_modify,
1997 },
1998 {
1999 .xpath = "/frr-isisd:isis/instance/spf/ietf-backoff-delay/long-delay",
2000 .cbs.modify = isis_instance_spf_ietf_backoff_delay_long_delay_modify,
2001 },
2002 {
2003 .xpath = "/frr-isisd:isis/instance/spf/ietf-backoff-delay/hold-down",
2004 .cbs.modify = isis_instance_spf_ietf_backoff_delay_hold_down_modify,
2005 },
2006 {
2007 .xpath = "/frr-isisd:isis/instance/spf/ietf-backoff-delay/time-to-learn",
2008 .cbs.modify = isis_instance_spf_ietf_backoff_delay_time_to_learn_modify,
2009 },
2010 {
2011 .xpath = "/frr-isisd:isis/instance/spf/minimum-interval",
2012 .cbs.cli_show = cli_show_isis_spf_min_interval,
2013 },
2014 {
2015 .xpath = "/frr-isisd:isis/instance/spf/minimum-interval/level-1",
2016 .cbs.modify = isis_instance_spf_minimum_interval_level_1_modify,
2017 },
2018 {
2019 .xpath = "/frr-isisd:isis/instance/spf/minimum-interval/level-2",
2020 .cbs.modify = isis_instance_spf_minimum_interval_level_2_modify,
2021 },
2022 {
2023 .xpath = "/frr-isisd:isis/instance/area-password",
2024 .cbs.create = isis_instance_area_password_create,
2025 .cbs.delete = isis_instance_area_password_delete,
2026 .cbs.apply_finish = area_password_apply_finish,
2027 .cbs.cli_show = cli_show_isis_area_pwd,
2028 },
2029 {
2030 .xpath = "/frr-isisd:isis/instance/area-password/password",
2031 .cbs.modify = isis_instance_area_password_password_modify,
2032 },
2033 {
2034 .xpath = "/frr-isisd:isis/instance/area-password/password-type",
2035 .cbs.modify = isis_instance_area_password_password_type_modify,
2036 },
2037 {
2038 .xpath = "/frr-isisd:isis/instance/area-password/authenticate-snp",
2039 .cbs.modify = isis_instance_area_password_authenticate_snp_modify,
2040 },
2041 {
2042 .xpath = "/frr-isisd:isis/instance/domain-password",
2043 .cbs.create = isis_instance_domain_password_create,
2044 .cbs.delete = isis_instance_domain_password_delete,
2045 .cbs.apply_finish = domain_password_apply_finish,
2046 .cbs.cli_show = cli_show_isis_domain_pwd,
2047 },
2048 {
2049 .xpath = "/frr-isisd:isis/instance/domain-password/password",
2050 .cbs.modify = isis_instance_domain_password_password_modify,
2051 },
2052 {
2053 .xpath = "/frr-isisd:isis/instance/domain-password/password-type",
2054 .cbs.modify = isis_instance_domain_password_password_type_modify,
2055 },
2056 {
2057 .xpath = "/frr-isisd:isis/instance/domain-password/authenticate-snp",
2058 .cbs.modify = isis_instance_domain_password_authenticate_snp_modify,
2059 },
2060 {
2061 .xpath = "/frr-isisd:isis/instance/default-information-originate/ipv4",
2062 .cbs.create = isis_instance_default_information_originate_ipv4_create,
2063 .cbs.delete = isis_instance_default_information_originate_ipv4_delete,
2064 },
2065 {
2066 .xpath = "/frr-isisd:isis/instance/default-information-originate/ipv4/always",
2067 .cbs.create = isis_instance_default_information_originate_ipv4_always_create,
2068 .cbs.delete = isis_instance_default_information_originate_ipv4_always_delete,
2069 },
2070 {
2071 .xpath = "/frr-isisd:isis/instance/default-information-originate/ipv4/route-map",
2072 .cbs.modify = isis_instance_default_information_originate_ipv4_route_map_modify,
2073 .cbs.delete = isis_instance_default_information_originate_ipv4_route_map_delete,
2074 },
2075 {
2076 .xpath = "/frr-isisd:isis/instance/default-information-originate/ipv4/metric",
2077 .cbs.modify = isis_instance_default_information_originate_ipv4_metric_modify,
2078 .cbs.delete = isis_instance_default_information_originate_ipv4_metric_delete,
2079 },
2080 {
2081 .xpath = "/frr-isisd:isis/instance/default-information-originate/ipv6",
2082 .cbs.create = isis_instance_default_information_originate_ipv6_create,
2083 .cbs.delete = isis_instance_default_information_originate_ipv6_delete,
2084 },
2085 {
2086 .xpath = "/frr-isisd:isis/instance/default-information-originate/ipv6/always",
2087 .cbs.create = isis_instance_default_information_originate_ipv6_always_create,
2088 .cbs.delete = isis_instance_default_information_originate_ipv6_always_delete,
2089 },
2090 {
2091 .xpath = "/frr-isisd:isis/instance/default-information-originate/ipv6/route-map",
2092 .cbs.modify = isis_instance_default_information_originate_ipv6_route_map_modify,
2093 .cbs.delete = isis_instance_default_information_originate_ipv6_route_map_delete,
2094 },
2095 {
2096 .xpath = "/frr-isisd:isis/instance/default-information-originate/ipv6/metric",
2097 .cbs.modify = isis_instance_default_information_originate_ipv6_metric_modify,
2098 .cbs.delete = isis_instance_default_information_originate_ipv6_metric_delete,
2099 },
2100 {
2101 .xpath = "/frr-isisd:isis/instance/redistribute/ipv4",
2102 .cbs.create = isis_instance_redistribute_ipv4_create,
2103 .cbs.delete = isis_instance_redistribute_ipv4_delete,
2104 },
2105 {
2106 .xpath = "/frr-isisd:isis/instance/redistribute/ipv4/route-map",
2107 .cbs.modify = isis_instance_redistribute_ipv4_route_map_modify,
2108 .cbs.delete = isis_instance_redistribute_ipv4_route_map_delete,
2109 },
2110 {
2111 .xpath = "/frr-isisd:isis/instance/redistribute/ipv4/metric",
2112 .cbs.modify = isis_instance_redistribute_ipv4_metric_modify,
2113 .cbs.delete = isis_instance_redistribute_ipv4_metric_delete,
2114 },
2115 {
2116 .xpath = "/frr-isisd:isis/instance/redistribute/ipv6",
2117 .cbs.create = isis_instance_redistribute_ipv6_create,
2118 .cbs.delete = isis_instance_redistribute_ipv6_delete,
2119 },
2120 {
2121 .xpath = "/frr-isisd:isis/instance/redistribute/ipv6/route-map",
2122 .cbs.modify = isis_instance_redistribute_ipv6_route_map_modify,
2123 .cbs.delete = isis_instance_redistribute_ipv6_route_map_delete,
2124 },
2125 {
2126 .xpath = "/frr-isisd:isis/instance/redistribute/ipv6/metric",
2127 .cbs.modify = isis_instance_redistribute_ipv6_metric_modify,
2128 .cbs.delete = isis_instance_redistribute_ipv6_metric_delete,
2129 },
2130 {
2131 .xpath = "/frr-isisd:isis/instance/multi-topology/ipv4-multicast",
2132 .cbs.create = isis_instance_multi_topology_ipv4_multicast_create,
2133 .cbs.delete = isis_instance_multi_topology_ipv4_multicast_delete,
2134 },
2135 {
2136 .xpath = "/frr-isisd:isis/instance/multi-topology/ipv4-multicast/overload",
2137 .cbs.create = isis_instance_multi_topology_ipv4_multicast_overload_create,
2138 .cbs.delete = isis_instance_multi_topology_ipv4_multicast_overload_delete,
2139 },
2140 {
2141 .xpath = "/frr-isisd:isis/instance/multi-topology/ipv4-management",
2142 .cbs.create = isis_instance_multi_topology_ipv4_management_create,
2143 .cbs.delete = isis_instance_multi_topology_ipv4_management_delete,
2144 },
2145 {
2146 .xpath = "/frr-isisd:isis/instance/multi-topology/ipv4-management/overload",
2147 .cbs.create = isis_instance_multi_topology_ipv4_management_overload_create,
2148 .cbs.delete = isis_instance_multi_topology_ipv4_management_overload_delete,
2149 },
2150 {
2151 .xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-unicast",
2152 .cbs.create = isis_instance_multi_topology_ipv6_unicast_create,
2153 .cbs.delete = isis_instance_multi_topology_ipv6_unicast_delete,
2154 },
2155 {
2156 .xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-unicast/overload",
2157 .cbs.create = isis_instance_multi_topology_ipv6_unicast_overload_create,
2158 .cbs.delete = isis_instance_multi_topology_ipv6_unicast_overload_delete,
2159 },
2160 {
2161 .xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-multicast",
2162 .cbs.create = isis_instance_multi_topology_ipv6_multicast_create,
2163 .cbs.delete = isis_instance_multi_topology_ipv6_multicast_delete,
2164 },
2165 {
2166 .xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-multicast/overload",
2167 .cbs.create = isis_instance_multi_topology_ipv6_multicast_overload_create,
2168 .cbs.delete = isis_instance_multi_topology_ipv6_multicast_overload_delete,
2169 },
2170 {
2171 .xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-management",
2172 .cbs.create = isis_instance_multi_topology_ipv6_management_create,
2173 .cbs.delete = isis_instance_multi_topology_ipv6_management_delete,
2174 },
2175 {
2176 .xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-management/overload",
2177 .cbs.create = isis_instance_multi_topology_ipv6_management_overload_create,
2178 .cbs.delete = isis_instance_multi_topology_ipv6_management_overload_delete,
2179 },
2180 {
2181 .xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-dstsrc",
2182 .cbs.create = isis_instance_multi_topology_ipv6_dstsrc_create,
2183 .cbs.delete = isis_instance_multi_topology_ipv6_dstsrc_delete,
2184 },
2185 {
2186 .xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-dstsrc/overload",
2187 .cbs.create = isis_instance_multi_topology_ipv6_dstsrc_overload_create,
2188 .cbs.delete = isis_instance_multi_topology_ipv6_dstsrc_overload_delete,
2189 },
2190 {
2191 .xpath = "/frr-isisd:isis/instance/log-adjacency-changes",
2192 .cbs.create = isis_instance_log_adjacency_changes_create,
2193 .cbs.delete = isis_instance_log_adjacency_changes_delete,
2194 },
2195 {
2196 .xpath = "/frr-isisd:isis/mpls-te",
2197 .cbs.create = isis_mpls_te_create,
2198 .cbs.delete = isis_mpls_te_delete,
2199 },
2200 {
2201 .xpath = "/frr-isisd:isis/mpls-te/router-address",
2202 .cbs.modify = isis_mpls_te_router_address_modify,
2203 .cbs.delete = isis_mpls_te_router_address_delete,
2204 },
2205 {
2206 .xpath = "/frr-interface:lib/interface/frr-isisd:isis",
2207 .cbs.create = lib_interface_isis_create,
2208 .cbs.delete = lib_interface_isis_delete,
2209 },
2210 {
2211 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/area-tag",
2212 .cbs.modify = lib_interface_isis_area_tag_modify,
2213 },
2214 {
2215 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/circuit-type",
2216 .cbs.modify = lib_interface_isis_circuit_type_modify,
2217 },
2218 {
2219 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/ipv4-routing",
2220 .cbs.create = lib_interface_isis_ipv4_routing_create,
2221 .cbs.delete = lib_interface_isis_ipv4_routing_delete,
2222 .cbs.cli_show = cli_show_ip_isis_ipv4,
2223 },
2224 {
2225 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/ipv6-routing",
2226 .cbs.create = lib_interface_isis_ipv6_routing_create,
2227 .cbs.delete = lib_interface_isis_ipv6_routing_delete,
2228 .cbs.cli_show = cli_show_ip_isis_ipv6,
2229 },
2230 {
2231 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/csnp-interval/level-1",
2232 .cbs.modify = lib_interface_isis_csnp_interval_level_1_modify,
2233 },
2234 {
2235 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/csnp-interval/level-2",
2236 .cbs.modify = lib_interface_isis_csnp_interval_level_2_modify,
2237 },
2238 {
2239 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/psnp-interval/level-1",
2240 .cbs.modify = lib_interface_isis_psnp_interval_level_1_modify,
2241 },
2242 {
2243 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/psnp-interval/level-2",
2244 .cbs.modify = lib_interface_isis_psnp_interval_level_2_modify,
2245 },
2246 {
2247 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/hello/padding",
2248 .cbs.modify = lib_interface_isis_hello_padding_modify,
2249 },
2250 {
2251 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/hello/interval/level-1",
2252 .cbs.modify = lib_interface_isis_hello_interval_level_1_modify,
2253 },
2254 {
2255 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/hello/interval/level-2",
2256 .cbs.modify = lib_interface_isis_hello_interval_level_2_modify,
2257 },
2258 {
2259 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/hello/multiplier/level-1",
2260 .cbs.modify = lib_interface_isis_hello_multiplier_level_1_modify,
2261 },
2262 {
2263 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/hello/multiplier/level-2",
2264 .cbs.modify = lib_interface_isis_hello_multiplier_level_2_modify,
2265 },
2266 {
2267 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/metric/level-1",
2268 .cbs.modify = lib_interface_isis_metric_level_1_modify,
2269 },
2270 {
2271 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/metric/level-2",
2272 .cbs.modify = lib_interface_isis_metric_level_2_modify,
2273 },
2274 {
2275 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/priority/level-1",
2276 .cbs.modify = lib_interface_isis_priority_level_1_modify,
2277 },
2278 {
2279 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/priority/level-2",
2280 .cbs.modify = lib_interface_isis_priority_level_2_modify,
2281 },
2282 {
2283 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/network-type",
2284 .cbs.modify = lib_interface_isis_network_type_modify,
2285 .cbs.delete = lib_interface_isis_network_type_delete,
2286 },
2287 {
2288 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/passive",
2289 .cbs.create = lib_interface_isis_passive_create,
2290 .cbs.delete = lib_interface_isis_passive_delete,
2291 },
2292 {
2293 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/password",
2294 .cbs.create = lib_interface_isis_password_create,
2295 .cbs.delete = lib_interface_isis_password_delete,
2296 },
2297 {
2298 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/password/password",
2299 .cbs.modify = lib_interface_isis_password_password_modify,
2300 },
2301 {
2302 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/password/password-type",
2303 .cbs.modify = lib_interface_isis_password_password_type_modify,
2304 },
2305 {
2306 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/disable-three-way-handshake",
2307 .cbs.create = lib_interface_isis_disable_three_way_handshake_create,
2308 .cbs.delete = lib_interface_isis_disable_three_way_handshake_delete,
2309 },
2310 {
2311 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-unicast",
2312 .cbs.modify = lib_interface_isis_multi_topology_ipv4_unicast_modify,
2313 },
2314 {
2315 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-multicast",
2316 .cbs.modify = lib_interface_isis_multi_topology_ipv4_multicast_modify,
2317 },
2318 {
2319 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-management",
2320 .cbs.modify = lib_interface_isis_multi_topology_ipv4_management_modify,
2321 },
2322 {
2323 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-unicast",
2324 .cbs.modify = lib_interface_isis_multi_topology_ipv6_unicast_modify,
2325 },
2326 {
2327 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-multicast",
2328 .cbs.modify = lib_interface_isis_multi_topology_ipv6_multicast_modify,
2329 },
2330 {
2331 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-management",
2332 .cbs.modify = lib_interface_isis_multi_topology_ipv6_management_modify,
2333 },
2334 {
2335 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-dstsrc",
2336 .cbs.modify = lib_interface_isis_multi_topology_ipv6_dstsrc_modify,
2337 },
2338 {
2339 .xpath = NULL,
2340 },
2341 }
2342 };