]> git.proxmox.com Git - mirror_frr.git/blob - isisd/isis_northbound.c
isisd: retrofit the mpls-te 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 int isis_instance_default_information_originate_ipv4_create(
849 enum nb_event event, const struct lyd_node *dnode,
850 union nb_resource *resource)
851 {
852 /* TODO: implement me. */
853 return NB_OK;
854 }
855
856 static int isis_instance_default_information_originate_ipv4_delete(
857 enum nb_event event, const struct lyd_node *dnode)
858 {
859 /* TODO: implement me. */
860 return NB_OK;
861 }
862
863 /*
864 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv4/always
865 */
866 static int isis_instance_default_information_originate_ipv4_always_create(
867 enum nb_event event, const struct lyd_node *dnode,
868 union nb_resource *resource)
869 {
870 /* TODO: implement me. */
871 return NB_OK;
872 }
873
874 static int isis_instance_default_information_originate_ipv4_always_delete(
875 enum nb_event event, const struct lyd_node *dnode)
876 {
877 /* TODO: implement me. */
878 return NB_OK;
879 }
880
881 /*
882 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv4/route-map
883 */
884 static int isis_instance_default_information_originate_ipv4_route_map_modify(
885 enum nb_event event, const struct lyd_node *dnode,
886 union nb_resource *resource)
887 {
888 /* TODO: implement me. */
889 return NB_OK;
890 }
891
892 static int isis_instance_default_information_originate_ipv4_route_map_delete(
893 enum nb_event event, const struct lyd_node *dnode)
894 {
895 /* TODO: implement me. */
896 return NB_OK;
897 }
898
899 /*
900 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv4/metric
901 */
902 static int isis_instance_default_information_originate_ipv4_metric_modify(
903 enum nb_event event, const struct lyd_node *dnode,
904 union nb_resource *resource)
905 {
906 /* TODO: implement me. */
907 return NB_OK;
908 }
909
910 static int isis_instance_default_information_originate_ipv4_metric_delete(
911 enum nb_event event, const struct lyd_node *dnode)
912 {
913 /* TODO: implement me. */
914 return NB_OK;
915 }
916
917 /*
918 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv6
919 */
920 static int isis_instance_default_information_originate_ipv6_create(
921 enum nb_event event, const struct lyd_node *dnode,
922 union nb_resource *resource)
923 {
924 /* TODO: implement me. */
925 return NB_OK;
926 }
927
928 static int isis_instance_default_information_originate_ipv6_delete(
929 enum nb_event event, const struct lyd_node *dnode)
930 {
931 /* TODO: implement me. */
932 return NB_OK;
933 }
934
935 /*
936 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv6/always
937 */
938 static int isis_instance_default_information_originate_ipv6_always_create(
939 enum nb_event event, const struct lyd_node *dnode,
940 union nb_resource *resource)
941 {
942 /* TODO: implement me. */
943 return NB_OK;
944 }
945
946 static int isis_instance_default_information_originate_ipv6_always_delete(
947 enum nb_event event, const struct lyd_node *dnode)
948 {
949 /* TODO: implement me. */
950 return NB_OK;
951 }
952
953 /*
954 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv6/route-map
955 */
956 static int isis_instance_default_information_originate_ipv6_route_map_modify(
957 enum nb_event event, const struct lyd_node *dnode,
958 union nb_resource *resource)
959 {
960 /* TODO: implement me. */
961 return NB_OK;
962 }
963
964 static int isis_instance_default_information_originate_ipv6_route_map_delete(
965 enum nb_event event, const struct lyd_node *dnode)
966 {
967 /* TODO: implement me. */
968 return NB_OK;
969 }
970
971 /*
972 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv6/metric
973 */
974 static int isis_instance_default_information_originate_ipv6_metric_modify(
975 enum nb_event event, const struct lyd_node *dnode,
976 union nb_resource *resource)
977 {
978 /* TODO: implement me. */
979 return NB_OK;
980 }
981
982 static int isis_instance_default_information_originate_ipv6_metric_delete(
983 enum nb_event event, const struct lyd_node *dnode)
984 {
985 /* TODO: implement me. */
986 return NB_OK;
987 }
988
989 /*
990 * XPath: /frr-isisd:isis/instance/redistribute/ipv4
991 */
992 static int isis_instance_redistribute_ipv4_create(enum nb_event event,
993 const struct lyd_node *dnode,
994 union nb_resource *resource)
995 {
996 /* TODO: implement me. */
997 return NB_OK;
998 }
999
1000 static int isis_instance_redistribute_ipv4_delete(enum nb_event event,
1001 const struct lyd_node *dnode)
1002 {
1003 /* TODO: implement me. */
1004 return NB_OK;
1005 }
1006
1007 /*
1008 * XPath: /frr-isisd:isis/instance/redistribute/ipv4/route-map
1009 */
1010 static int
1011 isis_instance_redistribute_ipv4_route_map_modify(enum nb_event event,
1012 const struct lyd_node *dnode,
1013 union nb_resource *resource)
1014 {
1015 /* TODO: implement me. */
1016 return NB_OK;
1017 }
1018
1019 static int
1020 isis_instance_redistribute_ipv4_route_map_delete(enum nb_event event,
1021 const struct lyd_node *dnode)
1022 {
1023 /* TODO: implement me. */
1024 return NB_OK;
1025 }
1026
1027 /*
1028 * XPath: /frr-isisd:isis/instance/redistribute/ipv4/metric
1029 */
1030 static int
1031 isis_instance_redistribute_ipv4_metric_modify(enum nb_event event,
1032 const struct lyd_node *dnode,
1033 union nb_resource *resource)
1034 {
1035 /* TODO: implement me. */
1036 return NB_OK;
1037 }
1038
1039 static int
1040 isis_instance_redistribute_ipv4_metric_delete(enum nb_event event,
1041 const struct lyd_node *dnode)
1042 {
1043 /* TODO: implement me. */
1044 return NB_OK;
1045 }
1046
1047 /*
1048 * XPath: /frr-isisd:isis/instance/redistribute/ipv6
1049 */
1050 static int isis_instance_redistribute_ipv6_create(enum nb_event event,
1051 const struct lyd_node *dnode,
1052 union nb_resource *resource)
1053 {
1054 /* TODO: implement me. */
1055 return NB_OK;
1056 }
1057
1058 static int isis_instance_redistribute_ipv6_delete(enum nb_event event,
1059 const struct lyd_node *dnode)
1060 {
1061 /* TODO: implement me. */
1062 return NB_OK;
1063 }
1064
1065 /*
1066 * XPath: /frr-isisd:isis/instance/redistribute/ipv6/route-map
1067 */
1068 static int
1069 isis_instance_redistribute_ipv6_route_map_modify(enum nb_event event,
1070 const struct lyd_node *dnode,
1071 union nb_resource *resource)
1072 {
1073 /* TODO: implement me. */
1074 return NB_OK;
1075 }
1076
1077 static int
1078 isis_instance_redistribute_ipv6_route_map_delete(enum nb_event event,
1079 const struct lyd_node *dnode)
1080 {
1081 /* TODO: implement me. */
1082 return NB_OK;
1083 }
1084
1085 /*
1086 * XPath: /frr-isisd:isis/instance/redistribute/ipv6/metric
1087 */
1088 static int
1089 isis_instance_redistribute_ipv6_metric_modify(enum nb_event event,
1090 const struct lyd_node *dnode,
1091 union nb_resource *resource)
1092 {
1093 /* TODO: implement me. */
1094 return NB_OK;
1095 }
1096
1097 static int
1098 isis_instance_redistribute_ipv6_metric_delete(enum nb_event event,
1099 const struct lyd_node *dnode)
1100 {
1101 /* TODO: implement me. */
1102 return NB_OK;
1103 }
1104
1105 /*
1106 * XPath: /frr-isisd:isis/instance/multi-topology/ipv4-multicast
1107 */
1108 static int
1109 isis_instance_multi_topology_ipv4_multicast_create(enum nb_event event,
1110 const struct lyd_node *dnode,
1111 union nb_resource *resource)
1112 {
1113 /* TODO: implement me. */
1114 return NB_OK;
1115 }
1116
1117 static int
1118 isis_instance_multi_topology_ipv4_multicast_delete(enum nb_event event,
1119 const struct lyd_node *dnode)
1120 {
1121 /* TODO: implement me. */
1122 return NB_OK;
1123 }
1124
1125 /*
1126 * XPath: /frr-isisd:isis/instance/multi-topology/ipv4-multicast/overload
1127 */
1128 static int isis_instance_multi_topology_ipv4_multicast_overload_create(
1129 enum nb_event event, const struct lyd_node *dnode,
1130 union nb_resource *resource)
1131 {
1132 /* TODO: implement me. */
1133 return NB_OK;
1134 }
1135
1136 static int isis_instance_multi_topology_ipv4_multicast_overload_delete(
1137 enum nb_event event, const struct lyd_node *dnode)
1138 {
1139 /* TODO: implement me. */
1140 return NB_OK;
1141 }
1142
1143 /*
1144 * XPath: /frr-isisd:isis/instance/multi-topology/ipv4-management
1145 */
1146 static int isis_instance_multi_topology_ipv4_management_create(
1147 enum nb_event event, const struct lyd_node *dnode,
1148 union nb_resource *resource)
1149 {
1150 /* TODO: implement me. */
1151 return NB_OK;
1152 }
1153
1154 static int isis_instance_multi_topology_ipv4_management_delete(
1155 enum nb_event event, const struct lyd_node *dnode)
1156 {
1157 /* TODO: implement me. */
1158 return NB_OK;
1159 }
1160
1161 /*
1162 * XPath: /frr-isisd:isis/instance/multi-topology/ipv4-management/overload
1163 */
1164 static int isis_instance_multi_topology_ipv4_management_overload_create(
1165 enum nb_event event, const struct lyd_node *dnode,
1166 union nb_resource *resource)
1167 {
1168 /* TODO: implement me. */
1169 return NB_OK;
1170 }
1171
1172 static int isis_instance_multi_topology_ipv4_management_overload_delete(
1173 enum nb_event event, const struct lyd_node *dnode)
1174 {
1175 /* TODO: implement me. */
1176 return NB_OK;
1177 }
1178
1179 /*
1180 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-unicast
1181 */
1182 static int
1183 isis_instance_multi_topology_ipv6_unicast_create(enum nb_event event,
1184 const struct lyd_node *dnode,
1185 union nb_resource *resource)
1186 {
1187 /* TODO: implement me. */
1188 return NB_OK;
1189 }
1190
1191 static int
1192 isis_instance_multi_topology_ipv6_unicast_delete(enum nb_event event,
1193 const struct lyd_node *dnode)
1194 {
1195 /* TODO: implement me. */
1196 return NB_OK;
1197 }
1198
1199 /*
1200 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-unicast/overload
1201 */
1202 static int isis_instance_multi_topology_ipv6_unicast_overload_create(
1203 enum nb_event event, const struct lyd_node *dnode,
1204 union nb_resource *resource)
1205 {
1206 /* TODO: implement me. */
1207 return NB_OK;
1208 }
1209
1210 static int isis_instance_multi_topology_ipv6_unicast_overload_delete(
1211 enum nb_event event, const struct lyd_node *dnode)
1212 {
1213 /* TODO: implement me. */
1214 return NB_OK;
1215 }
1216
1217 /*
1218 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-multicast
1219 */
1220 static int
1221 isis_instance_multi_topology_ipv6_multicast_create(enum nb_event event,
1222 const struct lyd_node *dnode,
1223 union nb_resource *resource)
1224 {
1225 /* TODO: implement me. */
1226 return NB_OK;
1227 }
1228
1229 static int
1230 isis_instance_multi_topology_ipv6_multicast_delete(enum nb_event event,
1231 const struct lyd_node *dnode)
1232 {
1233 /* TODO: implement me. */
1234 return NB_OK;
1235 }
1236
1237 /*
1238 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-multicast/overload
1239 */
1240 static int isis_instance_multi_topology_ipv6_multicast_overload_create(
1241 enum nb_event event, const struct lyd_node *dnode,
1242 union nb_resource *resource)
1243 {
1244 /* TODO: implement me. */
1245 return NB_OK;
1246 }
1247
1248 static int isis_instance_multi_topology_ipv6_multicast_overload_delete(
1249 enum nb_event event, const struct lyd_node *dnode)
1250 {
1251 /* TODO: implement me. */
1252 return NB_OK;
1253 }
1254
1255 /*
1256 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-management
1257 */
1258 static int isis_instance_multi_topology_ipv6_management_create(
1259 enum nb_event event, const struct lyd_node *dnode,
1260 union nb_resource *resource)
1261 {
1262 /* TODO: implement me. */
1263 return NB_OK;
1264 }
1265
1266 static int isis_instance_multi_topology_ipv6_management_delete(
1267 enum nb_event event, const struct lyd_node *dnode)
1268 {
1269 /* TODO: implement me. */
1270 return NB_OK;
1271 }
1272
1273 /*
1274 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-management/overload
1275 */
1276 static int isis_instance_multi_topology_ipv6_management_overload_create(
1277 enum nb_event event, const struct lyd_node *dnode,
1278 union nb_resource *resource)
1279 {
1280 /* TODO: implement me. */
1281 return NB_OK;
1282 }
1283
1284 static int isis_instance_multi_topology_ipv6_management_overload_delete(
1285 enum nb_event event, const struct lyd_node *dnode)
1286 {
1287 /* TODO: implement me. */
1288 return NB_OK;
1289 }
1290
1291 /*
1292 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-dstsrc
1293 */
1294 static int
1295 isis_instance_multi_topology_ipv6_dstsrc_create(enum nb_event event,
1296 const struct lyd_node *dnode,
1297 union nb_resource *resource)
1298 {
1299 /* TODO: implement me. */
1300 return NB_OK;
1301 }
1302
1303 static int
1304 isis_instance_multi_topology_ipv6_dstsrc_delete(enum nb_event event,
1305 const struct lyd_node *dnode)
1306 {
1307 /* TODO: implement me. */
1308 return NB_OK;
1309 }
1310
1311 /*
1312 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-dstsrc/overload
1313 */
1314 static int isis_instance_multi_topology_ipv6_dstsrc_overload_create(
1315 enum nb_event event, const struct lyd_node *dnode,
1316 union nb_resource *resource)
1317 {
1318 /* TODO: implement me. */
1319 return NB_OK;
1320 }
1321
1322 static int isis_instance_multi_topology_ipv6_dstsrc_overload_delete(
1323 enum nb_event event, const struct lyd_node *dnode)
1324 {
1325 /* TODO: implement me. */
1326 return NB_OK;
1327 }
1328
1329 /*
1330 * XPath: /frr-isisd:isis/instance/log-adjacency-changes
1331 */
1332 static int
1333 isis_instance_log_adjacency_changes_create(enum nb_event event,
1334 const struct lyd_node *dnode,
1335 union nb_resource *resource)
1336 {
1337 /* TODO: implement me. */
1338 return NB_OK;
1339 }
1340
1341 static int
1342 isis_instance_log_adjacency_changes_delete(enum nb_event event,
1343 const struct lyd_node *dnode)
1344 {
1345 /* TODO: implement me. */
1346 return NB_OK;
1347 }
1348
1349 /*
1350 * XPath: /frr-isisd:isis/mpls-te
1351 */
1352 static int isis_mpls_te_create(enum nb_event event,
1353 const struct lyd_node *dnode,
1354 union nb_resource *resource)
1355 {
1356 struct listnode *node;
1357 struct isis_circuit *circuit;
1358
1359 if (event != NB_EV_APPLY)
1360 return NB_OK;
1361
1362 isisMplsTE.status = enable;
1363
1364 /*
1365 * Following code is intended to handle two cases;
1366 *
1367 * 1) MPLS-TE was disabled at startup time, but now become enabled.
1368 * In this case, we must enable MPLS-TE Circuit regarding interface
1369 * MPLS_TE flag
1370 * 2) MPLS-TE was once enabled then disabled, and now enabled again.
1371 */
1372 for (ALL_LIST_ELEMENTS_RO(isisMplsTE.cir_list, node, circuit)) {
1373 if (circuit->mtc == NULL || IS_FLOOD_AS(circuit->mtc->type))
1374 continue;
1375
1376 if ((circuit->mtc->status == disable)
1377 && HAS_LINK_PARAMS(circuit->interface))
1378 circuit->mtc->status = enable;
1379 else
1380 continue;
1381
1382 /* Reoriginate STD_TE & GMPLS circuits */
1383 if (circuit->area)
1384 lsp_regenerate_schedule(circuit->area, circuit->is_type,
1385 0);
1386 }
1387
1388 return NB_OK;
1389 }
1390
1391 static int isis_mpls_te_delete(enum nb_event event,
1392 const struct lyd_node *dnode)
1393 {
1394 struct listnode *node;
1395 struct isis_circuit *circuit;
1396
1397 if (event != NB_EV_APPLY)
1398 return NB_OK;
1399
1400 isisMplsTE.status = disable;
1401
1402 /* Flush LSP if circuit engage */
1403 for (ALL_LIST_ELEMENTS_RO(isisMplsTE.cir_list, node, circuit)) {
1404 if (circuit->mtc == NULL || (circuit->mtc->status == disable))
1405 continue;
1406
1407 /* disable MPLS_TE Circuit */
1408 circuit->mtc->status = disable;
1409
1410 /* Re-originate circuit without STD_TE & GMPLS parameters */
1411 if (circuit->area)
1412 lsp_regenerate_schedule(circuit->area, circuit->is_type,
1413 0);
1414 }
1415
1416 return NB_OK;
1417 }
1418
1419 /*
1420 * XPath: /frr-isisd:isis/mpls-te/router-address
1421 */
1422 static int isis_mpls_te_router_address_modify(enum nb_event event,
1423 const struct lyd_node *dnode,
1424 union nb_resource *resource)
1425 {
1426 struct in_addr value;
1427 struct listnode *node;
1428 struct isis_area *area;
1429
1430 if (event != NB_EV_APPLY)
1431 return NB_OK;
1432
1433 yang_dnode_get_ipv4(&value, dnode, NULL);
1434 isisMplsTE.router_id.s_addr = value.s_addr;
1435 /* only proceed if MPLS-TE is enabled */
1436 if (isisMplsTE.status == disable)
1437 return NB_OK;
1438
1439 /* Update main Router ID in isis global structure */
1440 isis->router_id = value.s_addr;
1441 /* And re-schedule LSP update */
1442 for (ALL_LIST_ELEMENTS_RO(isis->area_list, node, area))
1443 if (listcount(area->area_addrs) > 0)
1444 lsp_regenerate_schedule(area, area->is_type, 0);
1445
1446 return NB_OK;
1447 }
1448
1449 static int isis_mpls_te_router_address_delete(enum nb_event event,
1450 const struct lyd_node *dnode)
1451 {
1452 struct listnode *node;
1453 struct isis_area *area;
1454
1455 if (event != NB_EV_APPLY)
1456 return NB_OK;
1457
1458 isisMplsTE.router_id.s_addr = INADDR_ANY;
1459 /* only proceed if MPLS-TE is enabled */
1460 if (isisMplsTE.status == disable)
1461 return NB_OK;
1462
1463 /* Update main Router ID in isis global structure */
1464 isis->router_id = 0;
1465 /* And re-schedule LSP update */
1466 for (ALL_LIST_ELEMENTS_RO(isis->area_list, node, area))
1467 if (listcount(area->area_addrs) > 0)
1468 lsp_regenerate_schedule(area, area->is_type, 0);
1469
1470 return NB_OK;
1471 }
1472
1473 /*
1474 * XPath: /frr-interface:lib/interface/frr-isisd:isis
1475 */
1476 static int lib_interface_isis_create(enum nb_event event,
1477 const struct lyd_node *dnode,
1478 union nb_resource *resource)
1479 {
1480 struct isis_area *area;
1481 struct interface *ifp;
1482 struct isis_circuit *circuit;
1483 const char *area_tag = yang_dnode_get_string(dnode, "./area-tag");
1484
1485 if (event != NB_EV_APPLY)
1486 return NB_OK;
1487
1488 area = isis_area_lookup(area_tag);
1489 /* The area should have already be created. We are
1490 * setting the priority of the global isis area creation
1491 * slightly lower, so it should be executed first, but I
1492 * cannot rely on that so here I have to check.
1493 */
1494 if (!area) {
1495 flog_err(
1496 EC_LIB_NB_CB_CONFIG_APPLY,
1497 "%s: attempt to create circuit for area %s before the area has been created",
1498 __func__, area_tag);
1499 abort();
1500 }
1501
1502 ifp = yang_dnode_get_entry(dnode, true);
1503 circuit = isis_circuit_create(area, ifp);
1504 assert(circuit->state == C_STATE_CONF || circuit->state == C_STATE_UP);
1505 yang_dnode_set_entry(dnode, circuit);
1506
1507 return NB_OK;
1508 }
1509
1510 static int lib_interface_isis_delete(enum nb_event event,
1511 const struct lyd_node *dnode)
1512 {
1513 struct isis_circuit *circuit;
1514
1515 if (event != NB_EV_APPLY)
1516 return NB_OK;
1517
1518 circuit = yang_dnode_get_entry(dnode, true);
1519 if (!circuit)
1520 return NB_ERR_INCONSISTENCY;
1521 /* delete circuit through csm changes */
1522 switch (circuit->state) {
1523 case C_STATE_UP:
1524 isis_csm_state_change(IF_DOWN_FROM_Z, circuit,
1525 circuit->interface);
1526 isis_csm_state_change(ISIS_DISABLE, circuit, circuit->area);
1527 break;
1528 case C_STATE_CONF:
1529 isis_csm_state_change(ISIS_DISABLE, circuit, circuit->area);
1530 break;
1531 case C_STATE_INIT:
1532 isis_csm_state_change(IF_DOWN_FROM_Z, circuit,
1533 circuit->interface);
1534 break;
1535 }
1536
1537 return NB_OK;
1538 }
1539
1540 /*
1541 * XPath: /frr-interface:lib/interface/frr-isisd:isis/area-tag
1542 */
1543 static int lib_interface_isis_area_tag_modify(enum nb_event event,
1544 const struct lyd_node *dnode,
1545 union nb_resource *resource)
1546 {
1547 struct isis_circuit *circuit;
1548 struct interface *ifp;
1549 struct vrf *vrf;
1550 const char *area_tag, *ifname, *vrfname;
1551
1552 if (event == NB_EV_VALIDATE) {
1553 /* libyang doesn't like relative paths across module boundaries
1554 */
1555 ifname = yang_dnode_get_string(dnode->parent->parent, "./name");
1556 vrfname = yang_dnode_get_string(dnode->parent->parent, "./vrf");
1557 vrf = vrf_lookup_by_name(vrfname);
1558 assert(vrf);
1559 ifp = if_lookup_by_name(ifname, vrf->vrf_id);
1560 if (!ifp)
1561 return NB_OK;
1562 circuit = circuit_lookup_by_ifp(ifp, isis->init_circ_list);
1563 area_tag = yang_dnode_get_string(dnode, NULL);
1564 if (circuit && circuit->area && circuit->area->area_tag
1565 && strcmp(circuit->area->area_tag, area_tag)) {
1566 flog_warn(EC_LIB_NB_CB_CONFIG_VALIDATE,
1567 "ISIS circuit is already defined on %s",
1568 circuit->area->area_tag);
1569 return NB_ERR_VALIDATION;
1570 }
1571 }
1572
1573 return NB_OK;
1574 }
1575
1576 /*
1577 * XPath: /frr-interface:lib/interface/frr-isisd:isis/circuit-type
1578 */
1579 static int lib_interface_isis_circuit_type_modify(enum nb_event event,
1580 const struct lyd_node *dnode,
1581 union nb_resource *resource)
1582 {
1583 int circ_type = yang_dnode_get_enum(dnode, NULL);
1584 struct isis_circuit *circuit;
1585 struct interface *ifp;
1586 struct vrf *vrf;
1587 const char *ifname, *vrfname;
1588
1589 switch (event) {
1590 case NB_EV_VALIDATE:
1591 /* libyang doesn't like relative paths across module boundaries
1592 */
1593 ifname = yang_dnode_get_string(dnode->parent->parent, "./name");
1594 vrfname = yang_dnode_get_string(dnode->parent->parent, "./vrf");
1595 vrf = vrf_lookup_by_name(vrfname);
1596 assert(vrf);
1597 ifp = if_lookup_by_name(ifname, vrf->vrf_id);
1598 if (!ifp)
1599 break;
1600 circuit = circuit_lookup_by_ifp(ifp, isis->init_circ_list);
1601 if (circuit && circuit->state == C_STATE_UP
1602 && circuit->area->is_type != IS_LEVEL_1_AND_2
1603 && circuit->area->is_type != circ_type) {
1604 flog_warn(EC_LIB_NB_CB_CONFIG_VALIDATE,
1605 "Invalid circuit level for area %s",
1606 circuit->area->area_tag);
1607 return NB_ERR_VALIDATION;
1608 }
1609 break;
1610 case NB_EV_PREPARE:
1611 case NB_EV_ABORT:
1612 break;
1613 case NB_EV_APPLY:
1614 circuit = yang_dnode_get_entry(dnode, true);
1615 isis_circuit_is_type_set(circuit, circ_type);
1616 break;
1617 }
1618
1619 return NB_OK;
1620 }
1621
1622 /*
1623 * XPath: /frr-interface:lib/interface/frr-isisd:isis/ipv4-routing
1624 */
1625 static int lib_interface_isis_ipv4_routing_create(enum nb_event event,
1626 const struct lyd_node *dnode,
1627 union nb_resource *resource)
1628 {
1629 bool ipv6;
1630 struct isis_circuit *circuit;
1631
1632 if (event != NB_EV_APPLY)
1633 return NB_OK;
1634
1635 circuit = yang_dnode_get_entry(dnode, true);
1636 ipv6 = yang_dnode_exists(dnode, "../ipv6-routing");
1637 isis_circuit_af_set(circuit, true, ipv6);
1638
1639 return NB_OK;
1640 }
1641
1642 static int lib_interface_isis_ipv4_routing_delete(enum nb_event event,
1643 const struct lyd_node *dnode)
1644 {
1645 bool ipv6;
1646 struct isis_circuit *circuit;
1647
1648 if (event != NB_EV_APPLY)
1649 return NB_OK;
1650
1651 circuit = yang_dnode_get_entry(dnode, true);
1652 if (circuit && circuit->area) {
1653 ipv6 = yang_dnode_exists(dnode, "../ipv6-routing");
1654 isis_circuit_af_set(circuit, false, ipv6);
1655 }
1656
1657 return NB_OK;
1658 }
1659
1660 /*
1661 * XPath: /frr-interface:lib/interface/frr-isisd:isis/ipv6-routing
1662 */
1663 static int lib_interface_isis_ipv6_routing_create(enum nb_event event,
1664 const struct lyd_node *dnode,
1665 union nb_resource *resource)
1666 {
1667 bool ipv4;
1668 struct isis_circuit *circuit;
1669
1670 if (event != NB_EV_APPLY)
1671 return NB_OK;
1672
1673 circuit = yang_dnode_get_entry(dnode, true);
1674 ipv4 = yang_dnode_exists(dnode, "../ipv6-routing");
1675 isis_circuit_af_set(circuit, ipv4, true);
1676
1677 return NB_OK;
1678 }
1679
1680 static int lib_interface_isis_ipv6_routing_delete(enum nb_event event,
1681 const struct lyd_node *dnode)
1682 {
1683 bool ipv4;
1684 struct isis_circuit *circuit;
1685
1686 if (event != NB_EV_APPLY)
1687 return NB_OK;
1688
1689 circuit = yang_dnode_get_entry(dnode, true);
1690 if (circuit->area) {
1691 ipv4 = yang_dnode_exists(dnode, "../ipv4-routing");
1692 isis_circuit_af_set(circuit, ipv4, false);
1693 }
1694
1695 return NB_OK;
1696 }
1697
1698 /*
1699 * XPath: /frr-interface:lib/interface/frr-isisd:isis/csnp-interval/level-1
1700 */
1701 static int
1702 lib_interface_isis_csnp_interval_level_1_modify(enum nb_event event,
1703 const struct lyd_node *dnode,
1704 union nb_resource *resource)
1705 {
1706 /* TODO: implement me. */
1707 return NB_OK;
1708 }
1709
1710 /*
1711 * XPath: /frr-interface:lib/interface/frr-isisd:isis/csnp-interval/level-2
1712 */
1713 static int
1714 lib_interface_isis_csnp_interval_level_2_modify(enum nb_event event,
1715 const struct lyd_node *dnode,
1716 union nb_resource *resource)
1717 {
1718 /* TODO: implement me. */
1719 return NB_OK;
1720 }
1721
1722 /*
1723 * XPath: /frr-interface:lib/interface/frr-isisd:isis/psnp-interval/level-1
1724 */
1725 static int
1726 lib_interface_isis_psnp_interval_level_1_modify(enum nb_event event,
1727 const struct lyd_node *dnode,
1728 union nb_resource *resource)
1729 {
1730 /* TODO: implement me. */
1731 return NB_OK;
1732 }
1733
1734 /*
1735 * XPath: /frr-interface:lib/interface/frr-isisd:isis/psnp-interval/level-2
1736 */
1737 static int
1738 lib_interface_isis_psnp_interval_level_2_modify(enum nb_event event,
1739 const struct lyd_node *dnode,
1740 union nb_resource *resource)
1741 {
1742 /* TODO: implement me. */
1743 return NB_OK;
1744 }
1745
1746 /*
1747 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/padding
1748 */
1749 static int lib_interface_isis_hello_padding_modify(enum nb_event event,
1750 const struct lyd_node *dnode,
1751 union nb_resource *resource)
1752 {
1753 /* TODO: implement me. */
1754 return NB_OK;
1755 }
1756
1757 /*
1758 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/interval/level-1
1759 */
1760 static int
1761 lib_interface_isis_hello_interval_level_1_modify(enum nb_event event,
1762 const struct lyd_node *dnode,
1763 union nb_resource *resource)
1764 {
1765 /* TODO: implement me. */
1766 return NB_OK;
1767 }
1768
1769 /*
1770 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/interval/level-2
1771 */
1772 static int
1773 lib_interface_isis_hello_interval_level_2_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/hello/multiplier/level-1
1783 */
1784 static int
1785 lib_interface_isis_hello_multiplier_level_1_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: /frr-interface:lib/interface/frr-isisd:isis/hello/multiplier/level-2
1795 */
1796 static int
1797 lib_interface_isis_hello_multiplier_level_2_modify(enum nb_event event,
1798 const struct lyd_node *dnode,
1799 union nb_resource *resource)
1800 {
1801 /* TODO: implement me. */
1802 return NB_OK;
1803 }
1804
1805 /*
1806 * XPath: /frr-interface:lib/interface/frr-isisd:isis/metric/level-1
1807 */
1808 static int
1809 lib_interface_isis_metric_level_1_modify(enum nb_event event,
1810 const struct lyd_node *dnode,
1811 union nb_resource *resource)
1812 {
1813 /* TODO: implement me. */
1814 return NB_OK;
1815 }
1816
1817 /*
1818 * XPath: /frr-interface:lib/interface/frr-isisd:isis/metric/level-2
1819 */
1820 static int
1821 lib_interface_isis_metric_level_2_modify(enum nb_event event,
1822 const struct lyd_node *dnode,
1823 union nb_resource *resource)
1824 {
1825 /* TODO: implement me. */
1826 return NB_OK;
1827 }
1828
1829 /*
1830 * XPath: /frr-interface:lib/interface/frr-isisd:isis/priority/level-1
1831 */
1832 static int
1833 lib_interface_isis_priority_level_1_modify(enum nb_event event,
1834 const struct lyd_node *dnode,
1835 union nb_resource *resource)
1836 {
1837 /* TODO: implement me. */
1838 return NB_OK;
1839 }
1840
1841 /*
1842 * XPath: /frr-interface:lib/interface/frr-isisd:isis/priority/level-2
1843 */
1844 static int
1845 lib_interface_isis_priority_level_2_modify(enum nb_event event,
1846 const struct lyd_node *dnode,
1847 union nb_resource *resource)
1848 {
1849 /* TODO: implement me. */
1850 return NB_OK;
1851 }
1852
1853 /*
1854 * XPath: /frr-interface:lib/interface/frr-isisd:isis/network-type
1855 */
1856 static int lib_interface_isis_network_type_modify(enum nb_event event,
1857 const struct lyd_node *dnode,
1858 union nb_resource *resource)
1859 {
1860 /* TODO: implement me. */
1861 return NB_OK;
1862 }
1863
1864 static int lib_interface_isis_network_type_delete(enum nb_event event,
1865 const struct lyd_node *dnode)
1866 {
1867 /* TODO: implement me. */
1868 return NB_OK;
1869 }
1870
1871 /*
1872 * XPath: /frr-interface:lib/interface/frr-isisd:isis/passive
1873 */
1874 static int lib_interface_isis_passive_create(enum nb_event event,
1875 const struct lyd_node *dnode,
1876 union nb_resource *resource)
1877 {
1878 /* TODO: implement me. */
1879 return NB_OK;
1880 }
1881
1882 static int lib_interface_isis_passive_delete(enum nb_event event,
1883 const struct lyd_node *dnode)
1884 {
1885 /* TODO: implement me. */
1886 return NB_OK;
1887 }
1888
1889 /*
1890 * XPath: /frr-interface:lib/interface/frr-isisd:isis/password
1891 */
1892 static int lib_interface_isis_password_create(enum nb_event event,
1893 const struct lyd_node *dnode,
1894 union nb_resource *resource)
1895 {
1896 /* TODO: implement me. */
1897 return NB_OK;
1898 }
1899
1900 static int lib_interface_isis_password_delete(enum nb_event event,
1901 const struct lyd_node *dnode)
1902 {
1903 /* TODO: implement me. */
1904 return NB_OK;
1905 }
1906
1907 /*
1908 * XPath: /frr-interface:lib/interface/frr-isisd:isis/password/password
1909 */
1910 static int
1911 lib_interface_isis_password_password_modify(enum nb_event event,
1912 const struct lyd_node *dnode,
1913 union nb_resource *resource)
1914 {
1915 /* TODO: implement me. */
1916 return NB_OK;
1917 }
1918
1919 /*
1920 * XPath: /frr-interface:lib/interface/frr-isisd:isis/password/password-type
1921 */
1922 static int
1923 lib_interface_isis_password_password_type_modify(enum nb_event event,
1924 const struct lyd_node *dnode,
1925 union nb_resource *resource)
1926 {
1927 /* TODO: implement me. */
1928 return NB_OK;
1929 }
1930
1931 /*
1932 * XPath:
1933 * /frr-interface:lib/interface/frr-isisd:isis/disable-three-way-handshake
1934 */
1935 static int lib_interface_isis_disable_three_way_handshake_create(
1936 enum nb_event event, const struct lyd_node *dnode,
1937 union nb_resource *resource)
1938 {
1939 /* TODO: implement me. */
1940 return NB_OK;
1941 }
1942
1943 static int lib_interface_isis_disable_three_way_handshake_delete(
1944 enum nb_event event, const struct lyd_node *dnode)
1945 {
1946 /* TODO: implement me. */
1947 return NB_OK;
1948 }
1949
1950 /*
1951 * XPath:
1952 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-unicast
1953 */
1954 static int lib_interface_isis_multi_topology_ipv4_unicast_modify(
1955 enum nb_event event, const struct lyd_node *dnode,
1956 union nb_resource *resource)
1957 {
1958 /* TODO: implement me. */
1959 return NB_OK;
1960 }
1961
1962 /*
1963 * XPath:
1964 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-multicast
1965 */
1966 static int lib_interface_isis_multi_topology_ipv4_multicast_modify(
1967 enum nb_event event, const struct lyd_node *dnode,
1968 union nb_resource *resource)
1969 {
1970 /* TODO: implement me. */
1971 return NB_OK;
1972 }
1973
1974 /*
1975 * XPath:
1976 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-management
1977 */
1978 static int lib_interface_isis_multi_topology_ipv4_management_modify(
1979 enum nb_event event, const struct lyd_node *dnode,
1980 union nb_resource *resource)
1981 {
1982 /* TODO: implement me. */
1983 return NB_OK;
1984 }
1985
1986 /*
1987 * XPath:
1988 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-unicast
1989 */
1990 static int lib_interface_isis_multi_topology_ipv6_unicast_modify(
1991 enum nb_event event, const struct lyd_node *dnode,
1992 union nb_resource *resource)
1993 {
1994 /* TODO: implement me. */
1995 return NB_OK;
1996 }
1997
1998 /*
1999 * XPath:
2000 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-multicast
2001 */
2002 static int lib_interface_isis_multi_topology_ipv6_multicast_modify(
2003 enum nb_event event, const struct lyd_node *dnode,
2004 union nb_resource *resource)
2005 {
2006 /* TODO: implement me. */
2007 return NB_OK;
2008 }
2009
2010 /*
2011 * XPath:
2012 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-management
2013 */
2014 static int lib_interface_isis_multi_topology_ipv6_management_modify(
2015 enum nb_event event, const struct lyd_node *dnode,
2016 union nb_resource *resource)
2017 {
2018 /* TODO: implement me. */
2019 return NB_OK;
2020 }
2021
2022 /*
2023 * XPath: /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-dstsrc
2024 */
2025 static int lib_interface_isis_multi_topology_ipv6_dstsrc_modify(
2026 enum nb_event event, const struct lyd_node *dnode,
2027 union nb_resource *resource)
2028 {
2029 /* TODO: implement me. */
2030 return NB_OK;
2031 }
2032
2033 /* clang-format off */
2034 const struct frr_yang_module_info frr_isisd_info = {
2035 .name = "frr-isisd",
2036 .nodes = {
2037 {
2038 .xpath = "/frr-isisd:isis/instance",
2039 .cbs.create = isis_instance_create,
2040 .cbs.delete = isis_instance_delete,
2041 .cbs.cli_show = cli_show_router_isis,
2042 .priority = NB_DFLT_PRIORITY - 1,
2043 },
2044 {
2045 .xpath = "/frr-isisd:isis/instance/is-type",
2046 .cbs.modify = isis_instance_is_type_modify,
2047 .cbs.cli_show = cli_show_isis_is_type,
2048 },
2049 {
2050 .xpath = "/frr-isisd:isis/instance/area-address",
2051 .cbs.create = isis_instance_area_address_create,
2052 .cbs.delete = isis_instance_area_address_delete,
2053 .cbs.cli_show = cli_show_isis_area_address,
2054 },
2055 {
2056 .xpath = "/frr-isisd:isis/instance/dynamic-hostname",
2057 .cbs.modify = isis_instance_dynamic_hostname_modify,
2058 .cbs.cli_show = cli_show_isis_dynamic_hostname,
2059 },
2060 {
2061 .xpath = "/frr-isisd:isis/instance/attached",
2062 .cbs.create = isis_instance_attached_create,
2063 .cbs.delete = isis_instance_attached_delete,
2064 .cbs.cli_show = cli_show_isis_attached,
2065 },
2066 {
2067 .xpath = "/frr-isisd:isis/instance/overload",
2068 .cbs.create = isis_instance_overload_create,
2069 .cbs.delete = isis_instance_overload_delete,
2070 .cbs.cli_show = cli_show_isis_overload,
2071 },
2072 {
2073 .xpath = "/frr-isisd:isis/instance/metric-style",
2074 .cbs.modify = isis_instance_metric_style_modify,
2075 .cbs.cli_show = cli_show_isis_metric_style,
2076 },
2077 {
2078 .xpath = "/frr-isisd:isis/instance/purge-originator",
2079 .cbs.create = isis_instance_purge_originator_create,
2080 .cbs.delete = isis_instance_purge_originator_delete,
2081 .cbs.cli_show = cli_show_isis_purge_origin,
2082 },
2083 {
2084 .xpath = "/frr-isisd:isis/instance/lsp/mtu",
2085 .cbs.modify = isis_instance_lsp_mtu_modify,
2086 .cbs.cli_show = cli_show_isis_lsp_mtu,
2087 },
2088 {
2089 .xpath = "/frr-isisd:isis/instance/lsp/refresh-interval",
2090 .cbs.cli_show = cli_show_isis_lsp_ref_interval,
2091 },
2092 {
2093 .xpath = "/frr-isisd:isis/instance/lsp/refresh-interval/level-1",
2094 .cbs.modify = isis_instance_lsp_refresh_interval_level_1_modify,
2095 },
2096 {
2097 .xpath = "/frr-isisd:isis/instance/lsp/refresh-interval/level-2",
2098 .cbs.modify = isis_instance_lsp_refresh_interval_level_2_modify,
2099 },
2100 {
2101 .xpath = "/frr-isisd:isis/instance/lsp/maximum-lifetime",
2102 .cbs.cli_show = cli_show_isis_lsp_max_lifetime,
2103 },
2104 {
2105 .xpath = "/frr-isisd:isis/instance/lsp/maximum-lifetime/level-1",
2106 .cbs.modify = isis_instance_lsp_maximum_lifetime_level_1_modify,
2107 },
2108 {
2109 .xpath = "/frr-isisd:isis/instance/lsp/maximum-lifetime/level-2",
2110 .cbs.modify = isis_instance_lsp_maximum_lifetime_level_2_modify,
2111 },
2112 {
2113 .xpath = "/frr-isisd:isis/instance/lsp/generation-interval",
2114 .cbs.cli_show = cli_show_isis_lsp_gen_interval,
2115 },
2116 {
2117 .xpath = "/frr-isisd:isis/instance/lsp/generation-interval/level-1",
2118 .cbs.modify = isis_instance_lsp_generation_interval_level_1_modify,
2119 },
2120 {
2121 .xpath = "/frr-isisd:isis/instance/lsp/generation-interval/level-2",
2122 .cbs.modify = isis_instance_lsp_generation_interval_level_2_modify,
2123 },
2124 {
2125 .xpath = "/frr-isisd:isis/instance/spf/ietf-backoff-delay",
2126 .cbs.create = isis_instance_spf_ietf_backoff_delay_create,
2127 .cbs.delete = isis_instance_spf_ietf_backoff_delay_delete,
2128 .cbs.apply_finish = ietf_backoff_delay_apply_finish,
2129 .cbs.cli_show = cli_show_isis_spf_ietf_backoff,
2130 },
2131 {
2132 .xpath = "/frr-isisd:isis/instance/spf/ietf-backoff-delay/init-delay",
2133 .cbs.modify = isis_instance_spf_ietf_backoff_delay_init_delay_modify,
2134 },
2135 {
2136 .xpath = "/frr-isisd:isis/instance/spf/ietf-backoff-delay/short-delay",
2137 .cbs.modify = isis_instance_spf_ietf_backoff_delay_short_delay_modify,
2138 },
2139 {
2140 .xpath = "/frr-isisd:isis/instance/spf/ietf-backoff-delay/long-delay",
2141 .cbs.modify = isis_instance_spf_ietf_backoff_delay_long_delay_modify,
2142 },
2143 {
2144 .xpath = "/frr-isisd:isis/instance/spf/ietf-backoff-delay/hold-down",
2145 .cbs.modify = isis_instance_spf_ietf_backoff_delay_hold_down_modify,
2146 },
2147 {
2148 .xpath = "/frr-isisd:isis/instance/spf/ietf-backoff-delay/time-to-learn",
2149 .cbs.modify = isis_instance_spf_ietf_backoff_delay_time_to_learn_modify,
2150 },
2151 {
2152 .xpath = "/frr-isisd:isis/instance/spf/minimum-interval",
2153 .cbs.cli_show = cli_show_isis_spf_min_interval,
2154 },
2155 {
2156 .xpath = "/frr-isisd:isis/instance/spf/minimum-interval/level-1",
2157 .cbs.modify = isis_instance_spf_minimum_interval_level_1_modify,
2158 },
2159 {
2160 .xpath = "/frr-isisd:isis/instance/spf/minimum-interval/level-2",
2161 .cbs.modify = isis_instance_spf_minimum_interval_level_2_modify,
2162 },
2163 {
2164 .xpath = "/frr-isisd:isis/instance/area-password",
2165 .cbs.create = isis_instance_area_password_create,
2166 .cbs.delete = isis_instance_area_password_delete,
2167 .cbs.apply_finish = area_password_apply_finish,
2168 .cbs.cli_show = cli_show_isis_area_pwd,
2169 },
2170 {
2171 .xpath = "/frr-isisd:isis/instance/area-password/password",
2172 .cbs.modify = isis_instance_area_password_password_modify,
2173 },
2174 {
2175 .xpath = "/frr-isisd:isis/instance/area-password/password-type",
2176 .cbs.modify = isis_instance_area_password_password_type_modify,
2177 },
2178 {
2179 .xpath = "/frr-isisd:isis/instance/area-password/authenticate-snp",
2180 .cbs.modify = isis_instance_area_password_authenticate_snp_modify,
2181 },
2182 {
2183 .xpath = "/frr-isisd:isis/instance/domain-password",
2184 .cbs.create = isis_instance_domain_password_create,
2185 .cbs.delete = isis_instance_domain_password_delete,
2186 .cbs.apply_finish = domain_password_apply_finish,
2187 .cbs.cli_show = cli_show_isis_domain_pwd,
2188 },
2189 {
2190 .xpath = "/frr-isisd:isis/instance/domain-password/password",
2191 .cbs.modify = isis_instance_domain_password_password_modify,
2192 },
2193 {
2194 .xpath = "/frr-isisd:isis/instance/domain-password/password-type",
2195 .cbs.modify = isis_instance_domain_password_password_type_modify,
2196 },
2197 {
2198 .xpath = "/frr-isisd:isis/instance/domain-password/authenticate-snp",
2199 .cbs.modify = isis_instance_domain_password_authenticate_snp_modify,
2200 },
2201 {
2202 .xpath = "/frr-isisd:isis/instance/default-information-originate/ipv4",
2203 .cbs.create = isis_instance_default_information_originate_ipv4_create,
2204 .cbs.delete = isis_instance_default_information_originate_ipv4_delete,
2205 },
2206 {
2207 .xpath = "/frr-isisd:isis/instance/default-information-originate/ipv4/always",
2208 .cbs.create = isis_instance_default_information_originate_ipv4_always_create,
2209 .cbs.delete = isis_instance_default_information_originate_ipv4_always_delete,
2210 },
2211 {
2212 .xpath = "/frr-isisd:isis/instance/default-information-originate/ipv4/route-map",
2213 .cbs.modify = isis_instance_default_information_originate_ipv4_route_map_modify,
2214 .cbs.delete = isis_instance_default_information_originate_ipv4_route_map_delete,
2215 },
2216 {
2217 .xpath = "/frr-isisd:isis/instance/default-information-originate/ipv4/metric",
2218 .cbs.modify = isis_instance_default_information_originate_ipv4_metric_modify,
2219 .cbs.delete = isis_instance_default_information_originate_ipv4_metric_delete,
2220 },
2221 {
2222 .xpath = "/frr-isisd:isis/instance/default-information-originate/ipv6",
2223 .cbs.create = isis_instance_default_information_originate_ipv6_create,
2224 .cbs.delete = isis_instance_default_information_originate_ipv6_delete,
2225 },
2226 {
2227 .xpath = "/frr-isisd:isis/instance/default-information-originate/ipv6/always",
2228 .cbs.create = isis_instance_default_information_originate_ipv6_always_create,
2229 .cbs.delete = isis_instance_default_information_originate_ipv6_always_delete,
2230 },
2231 {
2232 .xpath = "/frr-isisd:isis/instance/default-information-originate/ipv6/route-map",
2233 .cbs.modify = isis_instance_default_information_originate_ipv6_route_map_modify,
2234 .cbs.delete = isis_instance_default_information_originate_ipv6_route_map_delete,
2235 },
2236 {
2237 .xpath = "/frr-isisd:isis/instance/default-information-originate/ipv6/metric",
2238 .cbs.modify = isis_instance_default_information_originate_ipv6_metric_modify,
2239 .cbs.delete = isis_instance_default_information_originate_ipv6_metric_delete,
2240 },
2241 {
2242 .xpath = "/frr-isisd:isis/instance/redistribute/ipv4",
2243 .cbs.create = isis_instance_redistribute_ipv4_create,
2244 .cbs.delete = isis_instance_redistribute_ipv4_delete,
2245 },
2246 {
2247 .xpath = "/frr-isisd:isis/instance/redistribute/ipv4/route-map",
2248 .cbs.modify = isis_instance_redistribute_ipv4_route_map_modify,
2249 .cbs.delete = isis_instance_redistribute_ipv4_route_map_delete,
2250 },
2251 {
2252 .xpath = "/frr-isisd:isis/instance/redistribute/ipv4/metric",
2253 .cbs.modify = isis_instance_redistribute_ipv4_metric_modify,
2254 .cbs.delete = isis_instance_redistribute_ipv4_metric_delete,
2255 },
2256 {
2257 .xpath = "/frr-isisd:isis/instance/redistribute/ipv6",
2258 .cbs.create = isis_instance_redistribute_ipv6_create,
2259 .cbs.delete = isis_instance_redistribute_ipv6_delete,
2260 },
2261 {
2262 .xpath = "/frr-isisd:isis/instance/redistribute/ipv6/route-map",
2263 .cbs.modify = isis_instance_redistribute_ipv6_route_map_modify,
2264 .cbs.delete = isis_instance_redistribute_ipv6_route_map_delete,
2265 },
2266 {
2267 .xpath = "/frr-isisd:isis/instance/redistribute/ipv6/metric",
2268 .cbs.modify = isis_instance_redistribute_ipv6_metric_modify,
2269 .cbs.delete = isis_instance_redistribute_ipv6_metric_delete,
2270 },
2271 {
2272 .xpath = "/frr-isisd:isis/instance/multi-topology/ipv4-multicast",
2273 .cbs.create = isis_instance_multi_topology_ipv4_multicast_create,
2274 .cbs.delete = isis_instance_multi_topology_ipv4_multicast_delete,
2275 },
2276 {
2277 .xpath = "/frr-isisd:isis/instance/multi-topology/ipv4-multicast/overload",
2278 .cbs.create = isis_instance_multi_topology_ipv4_multicast_overload_create,
2279 .cbs.delete = isis_instance_multi_topology_ipv4_multicast_overload_delete,
2280 },
2281 {
2282 .xpath = "/frr-isisd:isis/instance/multi-topology/ipv4-management",
2283 .cbs.create = isis_instance_multi_topology_ipv4_management_create,
2284 .cbs.delete = isis_instance_multi_topology_ipv4_management_delete,
2285 },
2286 {
2287 .xpath = "/frr-isisd:isis/instance/multi-topology/ipv4-management/overload",
2288 .cbs.create = isis_instance_multi_topology_ipv4_management_overload_create,
2289 .cbs.delete = isis_instance_multi_topology_ipv4_management_overload_delete,
2290 },
2291 {
2292 .xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-unicast",
2293 .cbs.create = isis_instance_multi_topology_ipv6_unicast_create,
2294 .cbs.delete = isis_instance_multi_topology_ipv6_unicast_delete,
2295 },
2296 {
2297 .xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-unicast/overload",
2298 .cbs.create = isis_instance_multi_topology_ipv6_unicast_overload_create,
2299 .cbs.delete = isis_instance_multi_topology_ipv6_unicast_overload_delete,
2300 },
2301 {
2302 .xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-multicast",
2303 .cbs.create = isis_instance_multi_topology_ipv6_multicast_create,
2304 .cbs.delete = isis_instance_multi_topology_ipv6_multicast_delete,
2305 },
2306 {
2307 .xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-multicast/overload",
2308 .cbs.create = isis_instance_multi_topology_ipv6_multicast_overload_create,
2309 .cbs.delete = isis_instance_multi_topology_ipv6_multicast_overload_delete,
2310 },
2311 {
2312 .xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-management",
2313 .cbs.create = isis_instance_multi_topology_ipv6_management_create,
2314 .cbs.delete = isis_instance_multi_topology_ipv6_management_delete,
2315 },
2316 {
2317 .xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-management/overload",
2318 .cbs.create = isis_instance_multi_topology_ipv6_management_overload_create,
2319 .cbs.delete = isis_instance_multi_topology_ipv6_management_overload_delete,
2320 },
2321 {
2322 .xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-dstsrc",
2323 .cbs.create = isis_instance_multi_topology_ipv6_dstsrc_create,
2324 .cbs.delete = isis_instance_multi_topology_ipv6_dstsrc_delete,
2325 },
2326 {
2327 .xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-dstsrc/overload",
2328 .cbs.create = isis_instance_multi_topology_ipv6_dstsrc_overload_create,
2329 .cbs.delete = isis_instance_multi_topology_ipv6_dstsrc_overload_delete,
2330 },
2331 {
2332 .xpath = "/frr-isisd:isis/instance/log-adjacency-changes",
2333 .cbs.create = isis_instance_log_adjacency_changes_create,
2334 .cbs.delete = isis_instance_log_adjacency_changes_delete,
2335 },
2336 {
2337 .xpath = "/frr-isisd:isis/mpls-te",
2338 .cbs.create = isis_mpls_te_create,
2339 .cbs.delete = isis_mpls_te_delete,
2340 .cbs.cli_show = cli_show_isis_mpls_te,
2341 },
2342 {
2343 .xpath = "/frr-isisd:isis/mpls-te/router-address",
2344 .cbs.modify = isis_mpls_te_router_address_modify,
2345 .cbs.delete = isis_mpls_te_router_address_delete,
2346 .cbs.cli_show = cli_show_isis_mpls_te_router_addr,
2347 },
2348 {
2349 .xpath = "/frr-interface:lib/interface/frr-isisd:isis",
2350 .cbs.create = lib_interface_isis_create,
2351 .cbs.delete = lib_interface_isis_delete,
2352 },
2353 {
2354 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/area-tag",
2355 .cbs.modify = lib_interface_isis_area_tag_modify,
2356 },
2357 {
2358 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/circuit-type",
2359 .cbs.modify = lib_interface_isis_circuit_type_modify,
2360 },
2361 {
2362 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/ipv4-routing",
2363 .cbs.create = lib_interface_isis_ipv4_routing_create,
2364 .cbs.delete = lib_interface_isis_ipv4_routing_delete,
2365 .cbs.cli_show = cli_show_ip_isis_ipv4,
2366 },
2367 {
2368 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/ipv6-routing",
2369 .cbs.create = lib_interface_isis_ipv6_routing_create,
2370 .cbs.delete = lib_interface_isis_ipv6_routing_delete,
2371 .cbs.cli_show = cli_show_ip_isis_ipv6,
2372 },
2373 {
2374 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/csnp-interval/level-1",
2375 .cbs.modify = lib_interface_isis_csnp_interval_level_1_modify,
2376 },
2377 {
2378 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/csnp-interval/level-2",
2379 .cbs.modify = lib_interface_isis_csnp_interval_level_2_modify,
2380 },
2381 {
2382 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/psnp-interval/level-1",
2383 .cbs.modify = lib_interface_isis_psnp_interval_level_1_modify,
2384 },
2385 {
2386 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/psnp-interval/level-2",
2387 .cbs.modify = lib_interface_isis_psnp_interval_level_2_modify,
2388 },
2389 {
2390 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/hello/padding",
2391 .cbs.modify = lib_interface_isis_hello_padding_modify,
2392 },
2393 {
2394 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/hello/interval/level-1",
2395 .cbs.modify = lib_interface_isis_hello_interval_level_1_modify,
2396 },
2397 {
2398 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/hello/interval/level-2",
2399 .cbs.modify = lib_interface_isis_hello_interval_level_2_modify,
2400 },
2401 {
2402 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/hello/multiplier/level-1",
2403 .cbs.modify = lib_interface_isis_hello_multiplier_level_1_modify,
2404 },
2405 {
2406 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/hello/multiplier/level-2",
2407 .cbs.modify = lib_interface_isis_hello_multiplier_level_2_modify,
2408 },
2409 {
2410 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/metric/level-1",
2411 .cbs.modify = lib_interface_isis_metric_level_1_modify,
2412 },
2413 {
2414 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/metric/level-2",
2415 .cbs.modify = lib_interface_isis_metric_level_2_modify,
2416 },
2417 {
2418 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/priority/level-1",
2419 .cbs.modify = lib_interface_isis_priority_level_1_modify,
2420 },
2421 {
2422 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/priority/level-2",
2423 .cbs.modify = lib_interface_isis_priority_level_2_modify,
2424 },
2425 {
2426 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/network-type",
2427 .cbs.modify = lib_interface_isis_network_type_modify,
2428 .cbs.delete = lib_interface_isis_network_type_delete,
2429 },
2430 {
2431 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/passive",
2432 .cbs.create = lib_interface_isis_passive_create,
2433 .cbs.delete = lib_interface_isis_passive_delete,
2434 },
2435 {
2436 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/password",
2437 .cbs.create = lib_interface_isis_password_create,
2438 .cbs.delete = lib_interface_isis_password_delete,
2439 },
2440 {
2441 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/password/password",
2442 .cbs.modify = lib_interface_isis_password_password_modify,
2443 },
2444 {
2445 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/password/password-type",
2446 .cbs.modify = lib_interface_isis_password_password_type_modify,
2447 },
2448 {
2449 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/disable-three-way-handshake",
2450 .cbs.create = lib_interface_isis_disable_three_way_handshake_create,
2451 .cbs.delete = lib_interface_isis_disable_three_way_handshake_delete,
2452 },
2453 {
2454 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-unicast",
2455 .cbs.modify = lib_interface_isis_multi_topology_ipv4_unicast_modify,
2456 },
2457 {
2458 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-multicast",
2459 .cbs.modify = lib_interface_isis_multi_topology_ipv4_multicast_modify,
2460 },
2461 {
2462 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-management",
2463 .cbs.modify = lib_interface_isis_multi_topology_ipv4_management_modify,
2464 },
2465 {
2466 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-unicast",
2467 .cbs.modify = lib_interface_isis_multi_topology_ipv6_unicast_modify,
2468 },
2469 {
2470 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-multicast",
2471 .cbs.modify = lib_interface_isis_multi_topology_ipv6_multicast_modify,
2472 },
2473 {
2474 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-management",
2475 .cbs.modify = lib_interface_isis_multi_topology_ipv6_management_modify,
2476 },
2477 {
2478 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-dstsrc",
2479 .cbs.modify = lib_interface_isis_multi_topology_ipv6_dstsrc_modify,
2480 },
2481 {
2482 .xpath = NULL,
2483 },
2484 }
2485 };