]> git.proxmox.com Git - mirror_frr.git/blob - isisd/isis_northbound.c
Merge pull request #4137 from Orange-OpenSource/TE
[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 nb_running_set_entry(dnode, area);
71
72 return NB_OK;
73 }
74
75 static int isis_instance_destroy(enum nb_event event,
76 const struct lyd_node *dnode)
77 {
78 struct isis_area *area;
79
80 if (event != NB_EV_APPLY)
81 return NB_OK;
82
83 area = nb_running_unset_entry(dnode);
84 isis_area_destroy(area->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 = nb_running_get_entry(dnode, NULL, 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 = nb_running_get_entry(dnode, NULL, 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_destroy(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 = nb_running_get_entry(dnode, NULL, 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 = nb_running_get_entry(dnode, NULL, 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_modify(enum nb_event event,
257 const struct lyd_node *dnode,
258 union nb_resource *resource)
259 {
260 struct isis_area *area;
261 bool attached;
262
263 if (event != NB_EV_APPLY)
264 return NB_OK;
265
266 area = nb_running_get_entry(dnode, NULL, true);
267 attached = yang_dnode_get_bool(dnode, NULL);
268 isis_area_attached_bit_set(area, attached);
269
270 return NB_OK;
271 }
272
273 /*
274 * XPath: /frr-isisd:isis/instance/overload
275 */
276 static int isis_instance_overload_modify(enum nb_event event,
277 const struct lyd_node *dnode,
278 union nb_resource *resource)
279 {
280 struct isis_area *area;
281 bool overload;
282
283 if (event != NB_EV_APPLY)
284 return NB_OK;
285
286 area = nb_running_get_entry(dnode, NULL, true);
287 overload = yang_dnode_get_bool(dnode, NULL);
288 isis_area_overload_bit_set(area, overload);
289
290 return NB_OK;
291 }
292
293 /*
294 * XPath: /frr-isisd:isis/instance/metric-style
295 */
296 static int isis_instance_metric_style_modify(enum nb_event event,
297 const struct lyd_node *dnode,
298 union nb_resource *resource)
299 {
300 struct isis_area *area;
301 bool old_metric, new_metric;
302 enum isis_metric_style metric_style = yang_dnode_get_enum(dnode, NULL);
303
304 if (event != NB_EV_APPLY)
305 return NB_OK;
306
307 area = nb_running_get_entry(dnode, NULL, true);
308 old_metric = (metric_style == ISIS_WIDE_METRIC) ? false : true;
309 new_metric = (metric_style == ISIS_NARROW_METRIC) ? false : true;
310 isis_area_metricstyle_set(area, old_metric, new_metric);
311
312 return NB_OK;
313 }
314
315 /*
316 * XPath: /frr-isisd:isis/instance/purge-originator
317 */
318 static int isis_instance_purge_originator_modify(enum nb_event event,
319 const struct lyd_node *dnode,
320 union nb_resource *resource)
321 {
322 struct isis_area *area;
323
324 if (event != NB_EV_APPLY)
325 return NB_OK;
326
327 area = nb_running_get_entry(dnode, NULL, true);
328 area->purge_originator = yang_dnode_get_bool(dnode, NULL);
329
330 return NB_OK;
331 }
332
333 /*
334 * XPath: /frr-isisd:isis/instance/lsp/mtu
335 */
336 static int isis_instance_lsp_mtu_modify(enum nb_event event,
337 const struct lyd_node *dnode,
338 union nb_resource *resource)
339 {
340 struct listnode *node;
341 struct isis_circuit *circuit;
342 uint16_t lsp_mtu = yang_dnode_get_uint16(dnode, NULL);
343 struct isis_area *area;
344
345 switch (event) {
346 case NB_EV_VALIDATE:
347 area = nb_running_get_entry(dnode, NULL, false);
348 if (!area)
349 break;
350 for (ALL_LIST_ELEMENTS_RO(area->circuit_list, node, circuit)) {
351 if (circuit->state != C_STATE_INIT
352 && circuit->state != C_STATE_UP)
353 continue;
354 if (lsp_mtu > isis_circuit_pdu_size(circuit)) {
355 flog_warn(
356 EC_LIB_NB_CB_CONFIG_VALIDATE,
357 "ISIS area contains circuit %s, which has a maximum PDU size of %zu",
358 circuit->interface->name,
359 isis_circuit_pdu_size(circuit));
360 return NB_ERR_VALIDATION;
361 }
362 }
363 break;
364 case NB_EV_PREPARE:
365 case NB_EV_ABORT:
366 break;
367 case NB_EV_APPLY:
368 area = nb_running_get_entry(dnode, NULL, true);
369 isis_area_lsp_mtu_set(area, lsp_mtu);
370 break;
371 }
372
373 return NB_OK;
374 }
375
376 /*
377 * XPath: /frr-isisd:isis/instance/lsp/refresh-interval/level-1
378 */
379 static int
380 isis_instance_lsp_refresh_interval_level_1_modify(enum nb_event event,
381 const struct lyd_node *dnode,
382 union nb_resource *resource)
383 {
384 struct isis_area *area;
385 uint16_t refr_int;
386
387 if (event != NB_EV_APPLY)
388 return NB_OK;
389
390 refr_int = yang_dnode_get_uint16(dnode, NULL);
391 area = nb_running_get_entry(dnode, NULL, true);
392 isis_area_lsp_refresh_set(area, IS_LEVEL_1, refr_int);
393
394 return NB_OK;
395 }
396
397 /*
398 * XPath: /frr-isisd:isis/instance/lsp/refresh-interval/level-2
399 */
400 static int
401 isis_instance_lsp_refresh_interval_level_2_modify(enum nb_event event,
402 const struct lyd_node *dnode,
403 union nb_resource *resource)
404 {
405 struct isis_area *area;
406 uint16_t refr_int;
407
408 if (event != NB_EV_APPLY)
409 return NB_OK;
410
411 refr_int = yang_dnode_get_uint16(dnode, NULL);
412 area = nb_running_get_entry(dnode, NULL, true);
413 isis_area_lsp_refresh_set(area, IS_LEVEL_2, refr_int);
414
415 return NB_OK;
416 }
417
418 /*
419 * XPath: /frr-isisd:isis/instance/lsp/maximum-lifetime/level-1
420 */
421 static int
422 isis_instance_lsp_maximum_lifetime_level_1_modify(enum nb_event event,
423 const struct lyd_node *dnode,
424 union nb_resource *resource)
425 {
426 struct isis_area *area;
427 uint16_t max_lt;
428
429 if (event != NB_EV_APPLY)
430 return NB_OK;
431
432 max_lt = yang_dnode_get_uint16(dnode, NULL);
433 area = nb_running_get_entry(dnode, NULL, true);
434 isis_area_max_lsp_lifetime_set(area, IS_LEVEL_1, max_lt);
435
436 return NB_OK;
437 }
438
439 /*
440 * XPath: /frr-isisd:isis/instance/lsp/maximum-lifetime/level-2
441 */
442 static int
443 isis_instance_lsp_maximum_lifetime_level_2_modify(enum nb_event event,
444 const struct lyd_node *dnode,
445 union nb_resource *resource)
446 {
447 struct isis_area *area;
448 uint16_t max_lt;
449
450 if (event != NB_EV_APPLY)
451 return NB_OK;
452
453 max_lt = yang_dnode_get_uint16(dnode, NULL);
454 area = nb_running_get_entry(dnode, NULL, true);
455 isis_area_max_lsp_lifetime_set(area, IS_LEVEL_2, max_lt);
456
457 return NB_OK;
458 }
459
460 /*
461 * XPath: /frr-isisd:isis/instance/lsp/generation-interval/level-1
462 */
463 static int isis_instance_lsp_generation_interval_level_1_modify(
464 enum nb_event event, const struct lyd_node *dnode,
465 union nb_resource *resource)
466 {
467 struct isis_area *area;
468 uint16_t gen_int;
469
470 if (event != NB_EV_APPLY)
471 return NB_OK;
472
473 gen_int = yang_dnode_get_uint16(dnode, NULL);
474 area = nb_running_get_entry(dnode, NULL, true);
475 area->lsp_gen_interval[0] = gen_int;
476
477 return NB_OK;
478 }
479
480 /*
481 * XPath: /frr-isisd:isis/instance/lsp/generation-interval/level-2
482 */
483 static int isis_instance_lsp_generation_interval_level_2_modify(
484 enum nb_event event, const struct lyd_node *dnode,
485 union nb_resource *resource)
486 {
487 struct isis_area *area;
488 uint16_t gen_int;
489
490 if (event != NB_EV_APPLY)
491 return NB_OK;
492
493 gen_int = yang_dnode_get_uint16(dnode, NULL);
494 area = nb_running_get_entry(dnode, NULL, true);
495 area->lsp_gen_interval[1] = gen_int;
496
497 return NB_OK;
498 }
499
500 /*
501 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay
502 */
503 static void ietf_backoff_delay_apply_finish(const struct lyd_node *dnode)
504 {
505 long init_delay = yang_dnode_get_uint16(dnode, "./init-delay");
506 long short_delay = yang_dnode_get_uint16(dnode, "./short-delay");
507 long long_delay = yang_dnode_get_uint16(dnode, "./long-delay");
508 long holddown = yang_dnode_get_uint16(dnode, "./hold-down");
509 long timetolearn = yang_dnode_get_uint16(dnode, "./time-to-learn");
510 struct isis_area *area = nb_running_get_entry(dnode, NULL, true);
511 size_t bufsiz = strlen(area->area_tag) + sizeof("IS-IS Lx");
512 char *buf = XCALLOC(MTYPE_TMP, bufsiz);
513
514 snprintf(buf, bufsiz, "IS-IS %s L1", area->area_tag);
515 spf_backoff_free(area->spf_delay_ietf[0]);
516 area->spf_delay_ietf[0] =
517 spf_backoff_new(master, buf, init_delay, short_delay,
518 long_delay, holddown, timetolearn);
519
520 snprintf(buf, bufsiz, "IS-IS %s L2", area->area_tag);
521 spf_backoff_free(area->spf_delay_ietf[1]);
522 area->spf_delay_ietf[1] =
523 spf_backoff_new(master, buf, init_delay, short_delay,
524 long_delay, holddown, timetolearn);
525
526 XFREE(MTYPE_TMP, buf);
527 }
528
529 static int
530 isis_instance_spf_ietf_backoff_delay_create(enum nb_event event,
531 const struct lyd_node *dnode,
532 union nb_resource *resource)
533 {
534 /* All the work is done in the apply_finish */
535 return NB_OK;
536 }
537
538 static int
539 isis_instance_spf_ietf_backoff_delay_destroy(enum nb_event event,
540 const struct lyd_node *dnode)
541 {
542 struct isis_area *area;
543
544 if (event != NB_EV_APPLY)
545 return NB_OK;
546
547 area = nb_running_get_entry(dnode, NULL, true);
548 spf_backoff_free(area->spf_delay_ietf[0]);
549 spf_backoff_free(area->spf_delay_ietf[1]);
550 area->spf_delay_ietf[0] = NULL;
551 area->spf_delay_ietf[1] = NULL;
552
553 return NB_OK;
554 }
555
556 /*
557 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay/init-delay
558 */
559 static int isis_instance_spf_ietf_backoff_delay_init_delay_modify(
560 enum nb_event event, const struct lyd_node *dnode,
561 union nb_resource *resource)
562 {
563 /* All the work is done in the apply_finish */
564 return NB_OK;
565 }
566
567 /*
568 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay/short-delay
569 */
570 static int isis_instance_spf_ietf_backoff_delay_short_delay_modify(
571 enum nb_event event, const struct lyd_node *dnode,
572 union nb_resource *resource)
573 {
574 /* All the work is done in the apply_finish */
575 return NB_OK;
576 }
577
578 /*
579 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay/long-delay
580 */
581 static int isis_instance_spf_ietf_backoff_delay_long_delay_modify(
582 enum nb_event event, const struct lyd_node *dnode,
583 union nb_resource *resource)
584 {
585 /* All the work is done in the apply_finish */
586 return NB_OK;
587 }
588
589 /*
590 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay/hold-down
591 */
592 static int isis_instance_spf_ietf_backoff_delay_hold_down_modify(
593 enum nb_event event, const struct lyd_node *dnode,
594 union nb_resource *resource)
595 {
596 /* All the work is done in the apply_finish */
597 return NB_OK;
598 }
599
600 /*
601 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay/time-to-learn
602 */
603 static int isis_instance_spf_ietf_backoff_delay_time_to_learn_modify(
604 enum nb_event event, const struct lyd_node *dnode,
605 union nb_resource *resource)
606 {
607 /* All the work is done in the apply_finish */
608 return NB_OK;
609 }
610
611 /*
612 * XPath: /frr-isisd:isis/instance/spf/minimum-interval/level-1
613 */
614 static int
615 isis_instance_spf_minimum_interval_level_1_modify(enum nb_event event,
616 const struct lyd_node *dnode,
617 union nb_resource *resource)
618 {
619 struct isis_area *area;
620
621 if (event != NB_EV_APPLY)
622 return NB_OK;
623
624 area = nb_running_get_entry(dnode, NULL, true);
625 area->min_spf_interval[0] = yang_dnode_get_uint16(dnode, NULL);
626
627 return NB_OK;
628 }
629
630 /*
631 * XPath: /frr-isisd:isis/instance/spf/minimum-interval/level-2
632 */
633 static int
634 isis_instance_spf_minimum_interval_level_2_modify(enum nb_event event,
635 const struct lyd_node *dnode,
636 union nb_resource *resource)
637 {
638 struct isis_area *area;
639
640 if (event != NB_EV_APPLY)
641 return NB_OK;
642
643 area = nb_running_get_entry(dnode, NULL, true);
644 area->min_spf_interval[1] = yang_dnode_get_uint16(dnode, NULL);
645
646 return NB_OK;
647 }
648
649 /*
650 * XPath: /frr-isisd:isis/instance/area-password
651 */
652 static void area_password_apply_finish(const struct lyd_node *dnode)
653 {
654 const char *password = yang_dnode_get_string(dnode, "./password");
655 struct isis_area *area = nb_running_get_entry(dnode, NULL, true);
656 int pass_type = yang_dnode_get_enum(dnode, "./password-type");
657 uint8_t snp_auth = yang_dnode_get_enum(dnode, "./authenticate-snp");
658
659 switch (pass_type) {
660 case ISIS_PASSWD_TYPE_CLEARTXT:
661 isis_area_passwd_cleartext_set(area, IS_LEVEL_1, password,
662 snp_auth);
663 break;
664 case ISIS_PASSWD_TYPE_HMAC_MD5:
665 isis_area_passwd_hmac_md5_set(area, IS_LEVEL_1, password,
666 snp_auth);
667 break;
668 }
669 }
670
671 static int isis_instance_area_password_create(enum nb_event event,
672 const struct lyd_node *dnode,
673 union nb_resource *resource)
674 {
675 /* actual setting is done in apply_finish */
676 return NB_OK;
677 }
678
679 static int isis_instance_area_password_destroy(enum nb_event event,
680 const struct lyd_node *dnode)
681 {
682 struct isis_area *area;
683
684 if (event != NB_EV_APPLY)
685 return NB_OK;
686
687 area = nb_running_get_entry(dnode, NULL, true);
688 isis_area_passwd_unset(area, IS_LEVEL_1);
689
690 return NB_OK;
691 }
692
693 /*
694 * XPath: /frr-isisd:isis/instance/area-password/password
695 */
696 static int
697 isis_instance_area_password_password_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/password-type
707 */
708 static int
709 isis_instance_area_password_password_type_modify(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 /*
718 * XPath: /frr-isisd:isis/instance/area-password/authenticate-snp
719 */
720 static int isis_instance_area_password_authenticate_snp_modify(
721 enum nb_event event, const struct lyd_node *dnode,
722 union nb_resource *resource)
723 {
724 /* actual setting is done in apply_finish */
725 return NB_OK;
726 }
727
728 /*
729 * XPath: /frr-isisd:isis/instance/domain-password
730 */
731 static void domain_password_apply_finish(const struct lyd_node *dnode)
732 {
733 const char *password = yang_dnode_get_string(dnode, "./password");
734 struct isis_area *area = nb_running_get_entry(dnode, NULL, true);
735 int pass_type = yang_dnode_get_enum(dnode, "./password-type");
736 uint8_t snp_auth = yang_dnode_get_enum(dnode, "./authenticate-snp");
737
738 switch (pass_type) {
739 case ISIS_PASSWD_TYPE_CLEARTXT:
740 isis_area_passwd_cleartext_set(area, IS_LEVEL_2, password,
741 snp_auth);
742 break;
743 case ISIS_PASSWD_TYPE_HMAC_MD5:
744 isis_area_passwd_hmac_md5_set(area, IS_LEVEL_2, password,
745 snp_auth);
746 break;
747 }
748 }
749
750 static int isis_instance_domain_password_create(enum nb_event event,
751 const struct lyd_node *dnode,
752 union nb_resource *resource)
753 {
754 /* actual setting is done in apply_finish */
755 return NB_OK;
756 }
757
758 static int isis_instance_domain_password_destroy(enum nb_event event,
759 const struct lyd_node *dnode)
760 {
761 struct isis_area *area;
762
763 if (event != NB_EV_APPLY)
764 return NB_OK;
765
766 area = nb_running_get_entry(dnode, NULL, true);
767 isis_area_passwd_unset(area, IS_LEVEL_2);
768
769 return NB_OK;
770 }
771
772 /*
773 * XPath: /frr-isisd:isis/instance/domain-password/password
774 */
775 static int
776 isis_instance_domain_password_password_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/password-type
786 */
787 static int
788 isis_instance_domain_password_password_type_modify(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 /*
797 * XPath: /frr-isisd:isis/instance/domain-password/authenticate-snp
798 */
799 static int isis_instance_domain_password_authenticate_snp_modify(
800 enum nb_event event, const struct lyd_node *dnode,
801 union nb_resource *resource)
802 {
803 /* actual setting is done in apply_finish */
804 return NB_OK;
805 }
806
807 /*
808 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv4
809 */
810 static void default_info_origin_apply_finish(const struct lyd_node *dnode,
811 int family)
812 {
813 int originate_type = DEFAULT_ORIGINATE;
814 unsigned long metric = 0;
815 const char *routemap = NULL;
816 struct isis_area *area = nb_running_get_entry(dnode, NULL, true);
817 int level = yang_dnode_get_enum(dnode, "./level");
818
819 if (yang_dnode_get_bool(dnode, "./always")) {
820 originate_type = DEFAULT_ORIGINATE_ALWAYS;
821 } else if (family == AF_INET6) {
822 zlog_warn(
823 "%s: Zebra doesn't implement default-originate for IPv6 yet, so use with care or use default-originate always.",
824 __func__);
825 }
826
827 if (yang_dnode_exists(dnode, "./metric"))
828 metric = yang_dnode_get_uint32(dnode, "./metric");
829 if (yang_dnode_exists(dnode, "./route-map"))
830 routemap = yang_dnode_get_string(dnode, "./route-map");
831
832 isis_redist_set(area, level, family, DEFAULT_ROUTE, metric, routemap,
833 originate_type);
834 }
835
836 static void default_info_origin_ipv4_apply_finish(const struct lyd_node *dnode)
837 {
838 default_info_origin_apply_finish(dnode, AF_INET);
839 }
840
841 static void default_info_origin_ipv6_apply_finish(const struct lyd_node *dnode)
842 {
843 default_info_origin_apply_finish(dnode, AF_INET6);
844 }
845
846 static int isis_instance_default_information_originate_ipv4_create(
847 enum nb_event event, const struct lyd_node *dnode,
848 union nb_resource *resource)
849 {
850 /* It's all done by default_info_origin_apply_finish */
851 return NB_OK;
852 }
853
854 static int isis_instance_default_information_originate_ipv4_destroy(
855 enum nb_event event, const struct lyd_node *dnode)
856 {
857 struct isis_area *area;
858 int level;
859
860 if (event != NB_EV_APPLY)
861 return NB_OK;
862
863 area = nb_running_get_entry(dnode, NULL, true);
864 level = yang_dnode_get_enum(dnode, "./level");
865 isis_redist_unset(area, level, AF_INET, DEFAULT_ROUTE);
866
867 return NB_OK;
868 }
869
870 /*
871 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv4/always
872 */
873 static int isis_instance_default_information_originate_ipv4_always_modify(
874 enum nb_event event, const struct lyd_node *dnode,
875 union nb_resource *resource)
876 {
877 /* It's all done by default_info_origin_apply_finish */
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 /* It's all done by default_info_origin_apply_finish */
889 return NB_OK;
890 }
891
892 static int isis_instance_default_information_originate_ipv4_route_map_destroy(
893 enum nb_event event, const struct lyd_node *dnode)
894 {
895 /* It's all done by default_info_origin_apply_finish */
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 /* It's all done by default_info_origin_apply_finish */
907 return NB_OK;
908 }
909
910 /*
911 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv6
912 */
913 static int isis_instance_default_information_originate_ipv6_create(
914 enum nb_event event, const struct lyd_node *dnode,
915 union nb_resource *resource)
916 {
917 /* It's all done by default_info_origin_apply_finish */
918 return NB_OK;
919 }
920
921 static int isis_instance_default_information_originate_ipv6_destroy(
922 enum nb_event event, const struct lyd_node *dnode)
923 {
924 struct isis_area *area;
925 int level;
926
927 if (event != NB_EV_APPLY)
928 return NB_OK;
929
930 area = nb_running_get_entry(dnode, NULL, true);
931 level = yang_dnode_get_enum(dnode, "./level");
932 isis_redist_unset(area, level, AF_INET6, DEFAULT_ROUTE);
933
934 return NB_OK;
935 }
936
937 /*
938 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv6/always
939 */
940 static int isis_instance_default_information_originate_ipv6_always_modify(
941 enum nb_event event, const struct lyd_node *dnode,
942 union nb_resource *resource)
943 {
944 /* It's all done by default_info_origin_apply_finish */
945 return NB_OK;
946 }
947
948 /*
949 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv6/route-map
950 */
951 static int isis_instance_default_information_originate_ipv6_route_map_modify(
952 enum nb_event event, const struct lyd_node *dnode,
953 union nb_resource *resource)
954 {
955 /* It's all done by default_info_origin_apply_finish */
956 return NB_OK;
957 }
958
959 static int isis_instance_default_information_originate_ipv6_route_map_destroy(
960 enum nb_event event, const struct lyd_node *dnode)
961 {
962 /* It's all done by default_info_origin_apply_finish */
963 return NB_OK;
964 }
965
966 /*
967 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv6/metric
968 */
969 static int isis_instance_default_information_originate_ipv6_metric_modify(
970 enum nb_event event, const struct lyd_node *dnode,
971 union nb_resource *resource)
972 {
973 /* It's all done by default_info_origin_apply_finish */
974 return NB_OK;
975 }
976
977 /*
978 * XPath: /frr-isisd:isis/instance/redistribute/ipv4
979 */
980 static void redistribute_apply_finish(const struct lyd_node *dnode, int family)
981 {
982 assert(family == AF_INET || family == AF_INET6);
983 int type, level;
984 unsigned long metric = 0;
985 const char *routemap = NULL;
986 struct isis_area *area;
987
988 type = yang_dnode_get_enum(dnode, "./protocol");
989 level = yang_dnode_get_enum(dnode, "./level");
990 area = nb_running_get_entry(dnode, NULL, true);
991
992 if (yang_dnode_exists(dnode, "./metric"))
993 metric = yang_dnode_get_uint32(dnode, "./metric");
994 if (yang_dnode_exists(dnode, "./route-map"))
995 routemap = yang_dnode_get_string(dnode, "./route-map");
996
997 isis_redist_set(area, level, family, type, metric, routemap, 0);
998 }
999
1000 static void redistribute_ipv4_apply_finish(const struct lyd_node *dnode)
1001 {
1002 redistribute_apply_finish(dnode, AF_INET);
1003 }
1004
1005 static void redistribute_ipv6_apply_finish(const struct lyd_node *dnode)
1006 {
1007 redistribute_apply_finish(dnode, AF_INET6);
1008 }
1009
1010 static int isis_instance_redistribute_ipv4_create(enum nb_event event,
1011 const struct lyd_node *dnode,
1012 union nb_resource *resource)
1013 {
1014 /* It's all done by redistribute_apply_finish */
1015 return NB_OK;
1016 }
1017
1018 static int isis_instance_redistribute_ipv4_destroy(enum nb_event event,
1019 const struct lyd_node *dnode)
1020 {
1021 struct isis_area *area;
1022 int level, type;
1023
1024 if (event != NB_EV_APPLY)
1025 return NB_OK;
1026
1027 area = nb_running_get_entry(dnode, NULL, true);
1028 level = yang_dnode_get_enum(dnode, "./level");
1029 type = yang_dnode_get_enum(dnode, "./protocol");
1030 isis_redist_unset(area, level, AF_INET, type);
1031
1032 return NB_OK;
1033 }
1034
1035 /*
1036 * XPath: /frr-isisd:isis/instance/redistribute/ipv4/route-map
1037 */
1038 static int
1039 isis_instance_redistribute_ipv4_route_map_modify(enum nb_event event,
1040 const struct lyd_node *dnode,
1041 union nb_resource *resource)
1042 {
1043 /* It's all done by redistribute_apply_finish */
1044 return NB_OK;
1045 }
1046
1047 static int
1048 isis_instance_redistribute_ipv4_route_map_destroy(enum nb_event event,
1049 const struct lyd_node *dnode)
1050 {
1051 /* It's all done by redistribute_apply_finish */
1052 return NB_OK;
1053 }
1054
1055 /*
1056 * XPath: /frr-isisd:isis/instance/redistribute/ipv4/metric
1057 */
1058 static int
1059 isis_instance_redistribute_ipv4_metric_modify(enum nb_event event,
1060 const struct lyd_node *dnode,
1061 union nb_resource *resource)
1062 {
1063 /* It's all done by redistribute_apply_finish */
1064 return NB_OK;
1065 }
1066
1067 /*
1068 * XPath: /frr-isisd:isis/instance/redistribute/ipv6
1069 */
1070 static int isis_instance_redistribute_ipv6_create(enum nb_event event,
1071 const struct lyd_node *dnode,
1072 union nb_resource *resource)
1073 {
1074 /* It's all done by redistribute_apply_finish */
1075 return NB_OK;
1076 }
1077
1078 static int isis_instance_redistribute_ipv6_destroy(enum nb_event event,
1079 const struct lyd_node *dnode)
1080 {
1081 struct isis_area *area;
1082 int level, type;
1083
1084 if (event != NB_EV_APPLY)
1085 return NB_OK;
1086
1087 area = nb_running_get_entry(dnode, NULL, true);
1088 level = yang_dnode_get_enum(dnode, "./level");
1089 type = yang_dnode_get_enum(dnode, "./protocol");
1090 isis_redist_unset(area, level, AF_INET6, type);
1091
1092 return NB_OK;
1093 }
1094
1095 /*
1096 * XPath: /frr-isisd:isis/instance/redistribute/ipv6/route-map
1097 */
1098 static int
1099 isis_instance_redistribute_ipv6_route_map_modify(enum nb_event event,
1100 const struct lyd_node *dnode,
1101 union nb_resource *resource)
1102 {
1103 /* It's all done by redistribute_apply_finish */
1104 return NB_OK;
1105 }
1106
1107 static int
1108 isis_instance_redistribute_ipv6_route_map_destroy(enum nb_event event,
1109 const struct lyd_node *dnode)
1110 {
1111 /* It's all done by redistribute_apply_finish */
1112 return NB_OK;
1113 }
1114
1115 /*
1116 * XPath: /frr-isisd:isis/instance/redistribute/ipv6/metric
1117 */
1118 static int
1119 isis_instance_redistribute_ipv6_metric_modify(enum nb_event event,
1120 const struct lyd_node *dnode,
1121 union nb_resource *resource)
1122 {
1123 /* It's all done by redistribute_apply_finish */
1124 return NB_OK;
1125 }
1126
1127 /*
1128 * XPath: /frr-isisd:isis/instance/multi-topology/ipv4-multicast
1129 */
1130 static int isis_multi_topology_common(enum nb_event event,
1131 const struct lyd_node *dnode,
1132 const char *topology, bool create)
1133 {
1134 struct isis_area *area;
1135 struct isis_area_mt_setting *setting;
1136 uint16_t mtid = isis_str2mtid(topology);
1137
1138 switch (event) {
1139 case NB_EV_VALIDATE:
1140 if (mtid == (uint16_t)-1) {
1141 flog_warn(EC_LIB_NB_CB_CONFIG_VALIDATE,
1142 "Unknown topology %s", topology);
1143 return NB_ERR_VALIDATION;
1144 }
1145 break;
1146 case NB_EV_PREPARE:
1147 case NB_EV_ABORT:
1148 break;
1149 case NB_EV_APPLY:
1150 area = nb_running_get_entry(dnode, NULL, true);
1151 setting = area_get_mt_setting(area, mtid);
1152 setting->enabled = create;
1153 lsp_regenerate_schedule(area, IS_LEVEL_1 | IS_LEVEL_2, 0);
1154 break;
1155 }
1156
1157 return NB_OK;
1158 }
1159
1160 static int isis_multi_topology_overload_common(enum nb_event event,
1161 const struct lyd_node *dnode,
1162 const char *topology)
1163 {
1164 struct isis_area *area;
1165 struct isis_area_mt_setting *setting;
1166 uint16_t mtid = isis_str2mtid(topology);
1167
1168 /* validation is done in isis_multi_topology_common */
1169 if (event != NB_EV_APPLY)
1170 return NB_OK;
1171
1172 area = nb_running_get_entry(dnode, NULL, true);
1173 setting = area_get_mt_setting(area, mtid);
1174 setting->overload = yang_dnode_get_bool(dnode, NULL);
1175 if (setting->enabled)
1176 lsp_regenerate_schedule(area, IS_LEVEL_1 | IS_LEVEL_2, 0);
1177
1178 return NB_OK;
1179 }
1180
1181 static int
1182 isis_instance_multi_topology_ipv4_multicast_create(enum nb_event event,
1183 const struct lyd_node *dnode,
1184 union nb_resource *resource)
1185 {
1186 return isis_multi_topology_common(event, dnode, "ipv4-multicast", true);
1187 }
1188
1189 static int
1190 isis_instance_multi_topology_ipv4_multicast_destroy(enum nb_event event,
1191 const struct lyd_node *dnode)
1192 {
1193 return isis_multi_topology_common(event, dnode, "ipv4-multicast",
1194 false);
1195 }
1196
1197 /*
1198 * XPath: /frr-isisd:isis/instance/multi-topology/ipv4-multicast/overload
1199 */
1200 static int isis_instance_multi_topology_ipv4_multicast_overload_modify(
1201 enum nb_event event, const struct lyd_node *dnode,
1202 union nb_resource *resource)
1203 {
1204 return isis_multi_topology_overload_common(event, dnode,
1205 "ipv4-multicast");
1206 }
1207
1208 /*
1209 * XPath: /frr-isisd:isis/instance/multi-topology/ipv4-management
1210 */
1211 static int isis_instance_multi_topology_ipv4_management_create(
1212 enum nb_event event, const struct lyd_node *dnode,
1213 union nb_resource *resource)
1214 {
1215 return isis_multi_topology_common(event, dnode, "ipv4-mgmt", true);
1216 }
1217
1218 static int isis_instance_multi_topology_ipv4_management_destroy(
1219 enum nb_event event, const struct lyd_node *dnode)
1220 {
1221 return isis_multi_topology_common(event, dnode, "ipv4-mgmt", false);
1222 }
1223
1224 /*
1225 * XPath: /frr-isisd:isis/instance/multi-topology/ipv4-management/overload
1226 */
1227 static int isis_instance_multi_topology_ipv4_management_overload_modify(
1228 enum nb_event event, const struct lyd_node *dnode,
1229 union nb_resource *resource)
1230 {
1231 return isis_multi_topology_overload_common(event, dnode, "ipv4-mgmt");
1232 }
1233
1234 /*
1235 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-unicast
1236 */
1237 static int
1238 isis_instance_multi_topology_ipv6_unicast_create(enum nb_event event,
1239 const struct lyd_node *dnode,
1240 union nb_resource *resource)
1241 {
1242 return isis_multi_topology_common(event, dnode, "ipv6-unicast", true);
1243 }
1244
1245 static int
1246 isis_instance_multi_topology_ipv6_unicast_destroy(enum nb_event event,
1247 const struct lyd_node *dnode)
1248 {
1249 return isis_multi_topology_common(event, dnode, "ipv6-unicast", false);
1250 }
1251
1252 /*
1253 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-unicast/overload
1254 */
1255 static int isis_instance_multi_topology_ipv6_unicast_overload_modify(
1256 enum nb_event event, const struct lyd_node *dnode,
1257 union nb_resource *resource)
1258 {
1259 return isis_multi_topology_overload_common(event, dnode,
1260 "ipv6-unicast");
1261 }
1262
1263 /*
1264 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-multicast
1265 */
1266 static int
1267 isis_instance_multi_topology_ipv6_multicast_create(enum nb_event event,
1268 const struct lyd_node *dnode,
1269 union nb_resource *resource)
1270 {
1271 return isis_multi_topology_common(event, dnode, "ipv6-multicast", true);
1272 }
1273
1274 static int
1275 isis_instance_multi_topology_ipv6_multicast_destroy(enum nb_event event,
1276 const struct lyd_node *dnode)
1277 {
1278 return isis_multi_topology_common(event, dnode, "ipv6-multicast",
1279 false);
1280 }
1281
1282 /*
1283 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-multicast/overload
1284 */
1285 static int isis_instance_multi_topology_ipv6_multicast_overload_modify(
1286 enum nb_event event, const struct lyd_node *dnode,
1287 union nb_resource *resource)
1288 {
1289 return isis_multi_topology_overload_common(event, dnode,
1290 "ipv6-multicast");
1291 }
1292
1293 /*
1294 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-management
1295 */
1296 static int isis_instance_multi_topology_ipv6_management_create(
1297 enum nb_event event, const struct lyd_node *dnode,
1298 union nb_resource *resource)
1299 {
1300 return isis_multi_topology_common(event, dnode, "ipv6-mgmt", true);
1301 }
1302
1303 static int isis_instance_multi_topology_ipv6_management_destroy(
1304 enum nb_event event, const struct lyd_node *dnode)
1305 {
1306 return isis_multi_topology_common(event, dnode, "ipv6-mgmt", false);
1307 }
1308
1309 /*
1310 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-management/overload
1311 */
1312 static int isis_instance_multi_topology_ipv6_management_overload_modify(
1313 enum nb_event event, const struct lyd_node *dnode,
1314 union nb_resource *resource)
1315 {
1316 return isis_multi_topology_overload_common(event, dnode, "ipv6-mgmt");
1317 }
1318
1319 /*
1320 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-dstsrc
1321 */
1322 static int
1323 isis_instance_multi_topology_ipv6_dstsrc_create(enum nb_event event,
1324 const struct lyd_node *dnode,
1325 union nb_resource *resource)
1326 {
1327 return isis_multi_topology_common(event, dnode, "ipv6-dstsrc", true);
1328 }
1329
1330 static int
1331 isis_instance_multi_topology_ipv6_dstsrc_destroy(enum nb_event event,
1332 const struct lyd_node *dnode)
1333 {
1334 return isis_multi_topology_common(event, dnode, "ipv6-dstsrc", false);
1335 }
1336
1337 /*
1338 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-dstsrc/overload
1339 */
1340 static int isis_instance_multi_topology_ipv6_dstsrc_overload_modify(
1341 enum nb_event event, const struct lyd_node *dnode,
1342 union nb_resource *resource)
1343 {
1344 return isis_multi_topology_overload_common(event, dnode, "ipv6-dstsrc");
1345 }
1346
1347 /*
1348 * XPath: /frr-isisd:isis/instance/log-adjacency-changes
1349 */
1350 static int
1351 isis_instance_log_adjacency_changes_modify(enum nb_event event,
1352 const struct lyd_node *dnode,
1353 union nb_resource *resource)
1354 {
1355 struct isis_area *area;
1356 bool log = yang_dnode_get_bool(dnode, NULL);
1357
1358 if (event != NB_EV_APPLY)
1359 return NB_OK;
1360
1361 area = nb_running_get_entry(dnode, NULL, true);
1362 area->log_adj_changes = log ? 1 : 0;
1363
1364 return NB_OK;
1365 }
1366
1367 /*
1368 * XPath: /frr-isisd:isis/instance/mpls-te
1369 */
1370 static int isis_instance_mpls_te_create(enum nb_event event,
1371 const struct lyd_node *dnode,
1372 union nb_resource *resource)
1373 {
1374 struct listnode *node;
1375 struct isis_area *area;
1376 struct isis_circuit *circuit;
1377
1378 if (event != NB_EV_APPLY)
1379 return NB_OK;
1380
1381 area = yang_dnode_get_entry(dnode, true);
1382 if (area->mta == NULL) {
1383
1384 struct mpls_te_area *new;
1385
1386 zlog_debug("ISIS MPLS-TE: Initialize area %s",
1387 area->area_tag);
1388
1389 new = XCALLOC(MTYPE_ISIS_MPLS_TE, sizeof(struct mpls_te_area));
1390
1391 /* Initialize MPLS_TE structure */
1392 new->status = enable;
1393 new->level = 0;
1394 new->inter_as = off;
1395 new->interas_areaid.s_addr = 0;
1396 new->router_id.s_addr = 0;
1397
1398 area->mta = new;
1399 } else {
1400 area->mta->status = enable;
1401 }
1402
1403 /*
1404 * Following code is intended to handle two cases;
1405 *
1406 * 1) MPLS-TE was disabled at startup time, but now become enabled.
1407 * In this case, we must enable MPLS-TE Circuit regarding interface
1408 * MPLS_TE flag
1409 * 2) MPLS-TE was once enabled then disabled, and now enabled again.
1410 */
1411 for (ALL_LIST_ELEMENTS_RO(area->circuit_list, node, circuit)) {
1412 if (circuit->mtc == NULL || IS_FLOOD_AS(circuit->mtc->type))
1413 continue;
1414
1415 if (!IS_MPLS_TE(circuit->mtc)
1416 && HAS_LINK_PARAMS(circuit->interface))
1417 circuit->mtc->status = enable;
1418 else
1419 continue;
1420
1421 /* Reoriginate STD_TE & GMPLS circuits */
1422 if (circuit->area)
1423 lsp_regenerate_schedule(circuit->area, circuit->is_type,
1424 0);
1425 }
1426
1427 return NB_OK;
1428 }
1429
1430 static int isis_instance_mpls_te_destroy(enum nb_event event,
1431 const struct lyd_node *dnode)
1432 {
1433 struct listnode *node;
1434 struct isis_area *area;
1435 struct isis_circuit *circuit;
1436
1437 if (event != NB_EV_APPLY)
1438 return NB_OK;
1439
1440 area = yang_dnode_get_entry(dnode, true);
1441 if (IS_MPLS_TE(area->mta))
1442 area->mta->status = disable;
1443 else
1444 return NB_OK;
1445
1446 /* Flush LSP if circuit engage */
1447 for (ALL_LIST_ELEMENTS_RO(area->circuit_list, node, circuit)) {
1448 if (circuit->mtc == NULL || (circuit->mtc->status == disable))
1449 continue;
1450
1451 /* disable MPLS_TE Circuit */
1452 circuit->mtc->status = disable;
1453
1454 /* Re-originate circuit without STD_TE & GMPLS parameters */
1455 if (circuit->area)
1456 lsp_regenerate_schedule(circuit->area, circuit->is_type,
1457 0);
1458 }
1459
1460 return NB_OK;
1461 }
1462
1463 /*
1464 * XPath: /frr-isisd:isis/instance/mpls-te/router-address
1465 */
1466 static int isis_instance_mpls_te_router_address_modify(enum nb_event event,
1467 const struct lyd_node *dnode,
1468 union nb_resource *resource)
1469 {
1470 struct in_addr value;
1471 struct isis_area *area;
1472
1473 if (event != NB_EV_APPLY)
1474 return NB_OK;
1475
1476 area = yang_dnode_get_entry(dnode, true);
1477 /* only proceed if MPLS-TE is enabled */
1478 if (!IS_MPLS_TE(area->mta))
1479 return NB_OK;
1480
1481 /* Update Area Router ID */
1482 yang_dnode_get_ipv4(&value, dnode, NULL);
1483 area->mta->router_id.s_addr = value.s_addr;
1484
1485 /* And re-schedule LSP update */
1486 if (listcount(area->area_addrs) > 0)
1487 lsp_regenerate_schedule(area, area->is_type, 0);
1488
1489 return NB_OK;
1490 }
1491
1492 static int isis_instance_mpls_te_router_address_destroy(enum nb_event event,
1493 const struct lyd_node *dnode)
1494 {
1495 struct isis_area *area;
1496
1497 if (event != NB_EV_APPLY)
1498 return NB_OK;
1499
1500 area = yang_dnode_get_entry(dnode, true);
1501 /* only proceed if MPLS-TE is enabled */
1502 if (!IS_MPLS_TE(area->mta))
1503 return NB_OK;
1504
1505 /* Reset Area Router ID */
1506 area->mta->router_id.s_addr = INADDR_ANY;
1507
1508 /* And re-schedule LSP update */
1509 if (listcount(area->area_addrs) > 0)
1510 lsp_regenerate_schedule(area, area->is_type, 0);
1511
1512 return NB_OK;
1513 }
1514
1515 /*
1516 * XPath: /frr-interface:lib/interface/frr-isisd:isis
1517 */
1518 static int lib_interface_isis_create(enum nb_event event,
1519 const struct lyd_node *dnode,
1520 union nb_resource *resource)
1521 {
1522 struct isis_area *area;
1523 struct interface *ifp;
1524 struct isis_circuit *circuit;
1525 const char *area_tag = yang_dnode_get_string(dnode, "./area-tag");
1526
1527 if (event != NB_EV_APPLY)
1528 return NB_OK;
1529
1530 area = isis_area_lookup(area_tag);
1531 /* The area should have already be created. We are
1532 * setting the priority of the global isis area creation
1533 * slightly lower, so it should be executed first, but I
1534 * cannot rely on that so here I have to check.
1535 */
1536 if (!area) {
1537 flog_err(
1538 EC_LIB_NB_CB_CONFIG_APPLY,
1539 "%s: attempt to create circuit for area %s before the area has been created",
1540 __func__, area_tag);
1541 abort();
1542 }
1543
1544 ifp = nb_running_get_entry(dnode, NULL, true);
1545 circuit = isis_circuit_create(area, ifp);
1546 assert(circuit->state == C_STATE_CONF || circuit->state == C_STATE_UP);
1547 nb_running_set_entry(dnode, circuit);
1548
1549 return NB_OK;
1550 }
1551
1552 static int lib_interface_isis_destroy(enum nb_event event,
1553 const struct lyd_node *dnode)
1554 {
1555 struct isis_circuit *circuit;
1556
1557 if (event != NB_EV_APPLY)
1558 return NB_OK;
1559
1560 circuit = nb_running_unset_entry(dnode);
1561 if (!circuit)
1562 return NB_ERR_INCONSISTENCY;
1563 /* delete circuit through csm changes */
1564 switch (circuit->state) {
1565 case C_STATE_UP:
1566 isis_csm_state_change(IF_DOWN_FROM_Z, circuit,
1567 circuit->interface);
1568 isis_csm_state_change(ISIS_DISABLE, circuit, circuit->area);
1569 break;
1570 case C_STATE_CONF:
1571 isis_csm_state_change(ISIS_DISABLE, circuit, circuit->area);
1572 break;
1573 case C_STATE_INIT:
1574 isis_csm_state_change(IF_DOWN_FROM_Z, circuit,
1575 circuit->interface);
1576 break;
1577 }
1578
1579 return NB_OK;
1580 }
1581
1582 /*
1583 * XPath: /frr-interface:lib/interface/frr-isisd:isis/area-tag
1584 */
1585 static int lib_interface_isis_area_tag_modify(enum nb_event event,
1586 const struct lyd_node *dnode,
1587 union nb_resource *resource)
1588 {
1589 struct isis_circuit *circuit;
1590 struct interface *ifp;
1591 struct vrf *vrf;
1592 const char *area_tag, *ifname, *vrfname;
1593
1594 if (event == NB_EV_VALIDATE) {
1595 /* libyang doesn't like relative paths across module boundaries
1596 */
1597 ifname = yang_dnode_get_string(dnode->parent->parent, "./name");
1598 vrfname = yang_dnode_get_string(dnode->parent->parent, "./vrf");
1599 vrf = vrf_lookup_by_name(vrfname);
1600 assert(vrf);
1601 ifp = if_lookup_by_name(ifname, vrf->vrf_id);
1602 if (!ifp)
1603 return NB_OK;
1604 circuit = circuit_lookup_by_ifp(ifp, isis->init_circ_list);
1605 area_tag = yang_dnode_get_string(dnode, NULL);
1606 if (circuit && circuit->area && circuit->area->area_tag
1607 && strcmp(circuit->area->area_tag, area_tag)) {
1608 flog_warn(EC_LIB_NB_CB_CONFIG_VALIDATE,
1609 "ISIS circuit is already defined on %s",
1610 circuit->area->area_tag);
1611 return NB_ERR_VALIDATION;
1612 }
1613 }
1614
1615 return NB_OK;
1616 }
1617
1618 /*
1619 * XPath: /frr-interface:lib/interface/frr-isisd:isis/circuit-type
1620 */
1621 static int lib_interface_isis_circuit_type_modify(enum nb_event event,
1622 const struct lyd_node *dnode,
1623 union nb_resource *resource)
1624 {
1625 int circ_type = yang_dnode_get_enum(dnode, NULL);
1626 struct isis_circuit *circuit;
1627 struct interface *ifp;
1628 struct vrf *vrf;
1629 const char *ifname, *vrfname;
1630
1631 switch (event) {
1632 case NB_EV_VALIDATE:
1633 /* libyang doesn't like relative paths across module boundaries
1634 */
1635 ifname = yang_dnode_get_string(dnode->parent->parent, "./name");
1636 vrfname = yang_dnode_get_string(dnode->parent->parent, "./vrf");
1637 vrf = vrf_lookup_by_name(vrfname);
1638 assert(vrf);
1639 ifp = if_lookup_by_name(ifname, vrf->vrf_id);
1640 if (!ifp)
1641 break;
1642 circuit = circuit_lookup_by_ifp(ifp, isis->init_circ_list);
1643 if (circuit && circuit->state == C_STATE_UP
1644 && circuit->area->is_type != IS_LEVEL_1_AND_2
1645 && circuit->area->is_type != circ_type) {
1646 flog_warn(EC_LIB_NB_CB_CONFIG_VALIDATE,
1647 "Invalid circuit level for area %s",
1648 circuit->area->area_tag);
1649 return NB_ERR_VALIDATION;
1650 }
1651 break;
1652 case NB_EV_PREPARE:
1653 case NB_EV_ABORT:
1654 break;
1655 case NB_EV_APPLY:
1656 circuit = nb_running_get_entry(dnode, NULL, true);
1657 isis_circuit_is_type_set(circuit, circ_type);
1658 break;
1659 }
1660
1661 return NB_OK;
1662 }
1663
1664 /*
1665 * XPath: /frr-interface:lib/interface/frr-isisd:isis/ipv4-routing
1666 */
1667 static int lib_interface_isis_ipv4_routing_modify(enum nb_event event,
1668 const struct lyd_node *dnode,
1669 union nb_resource *resource)
1670 {
1671 bool ipv4, ipv6;
1672 struct isis_circuit *circuit;
1673
1674 if (event != NB_EV_APPLY)
1675 return NB_OK;
1676
1677 circuit = nb_running_get_entry(dnode, NULL, true);
1678 ipv4 = yang_dnode_get_bool(dnode, NULL);
1679 ipv6 = yang_dnode_get_bool(dnode, "../ipv6-routing");
1680 isis_circuit_af_set(circuit, ipv4, ipv6);
1681
1682 return NB_OK;
1683 }
1684
1685 /*
1686 * XPath: /frr-interface:lib/interface/frr-isisd:isis/ipv6-routing
1687 */
1688 static int lib_interface_isis_ipv6_routing_modify(enum nb_event event,
1689 const struct lyd_node *dnode,
1690 union nb_resource *resource)
1691 {
1692 bool ipv4, ipv6;
1693 struct isis_circuit *circuit;
1694
1695 if (event != NB_EV_APPLY)
1696 return NB_OK;
1697
1698 circuit = nb_running_get_entry(dnode, NULL, true);
1699 ipv4 = yang_dnode_exists(dnode, "../ipv4-routing");
1700 ipv6 = yang_dnode_get_bool(dnode, NULL);
1701 isis_circuit_af_set(circuit, ipv4, ipv6);
1702
1703 return NB_OK;
1704 }
1705
1706 /*
1707 * XPath: /frr-interface:lib/interface/frr-isisd:isis/csnp-interval/level-1
1708 */
1709 static int
1710 lib_interface_isis_csnp_interval_level_1_modify(enum nb_event event,
1711 const struct lyd_node *dnode,
1712 union nb_resource *resource)
1713 {
1714 struct isis_circuit *circuit;
1715
1716 if (event != NB_EV_APPLY)
1717 return NB_OK;
1718
1719 circuit = nb_running_get_entry(dnode, NULL, true);
1720 circuit->csnp_interval[0] = yang_dnode_get_uint16(dnode, NULL);
1721
1722 return NB_OK;
1723 }
1724
1725 /*
1726 * XPath: /frr-interface:lib/interface/frr-isisd:isis/csnp-interval/level-2
1727 */
1728 static int
1729 lib_interface_isis_csnp_interval_level_2_modify(enum nb_event event,
1730 const struct lyd_node *dnode,
1731 union nb_resource *resource)
1732 {
1733 struct isis_circuit *circuit;
1734
1735 if (event != NB_EV_APPLY)
1736 return NB_OK;
1737
1738 circuit = nb_running_get_entry(dnode, NULL, true);
1739 circuit->csnp_interval[1] = yang_dnode_get_uint16(dnode, NULL);
1740
1741 return NB_OK;
1742 }
1743
1744 /*
1745 * XPath: /frr-interface:lib/interface/frr-isisd:isis/psnp-interval/level-1
1746 */
1747 static int
1748 lib_interface_isis_psnp_interval_level_1_modify(enum nb_event event,
1749 const struct lyd_node *dnode,
1750 union nb_resource *resource)
1751 {
1752 struct isis_circuit *circuit;
1753
1754 if (event != NB_EV_APPLY)
1755 return NB_OK;
1756
1757 circuit = nb_running_get_entry(dnode, NULL, true);
1758 circuit->psnp_interval[0] = yang_dnode_get_uint16(dnode, NULL);
1759
1760 return NB_OK;
1761 }
1762
1763 /*
1764 * XPath: /frr-interface:lib/interface/frr-isisd:isis/psnp-interval/level-2
1765 */
1766 static int
1767 lib_interface_isis_psnp_interval_level_2_modify(enum nb_event event,
1768 const struct lyd_node *dnode,
1769 union nb_resource *resource)
1770 {
1771 struct isis_circuit *circuit;
1772
1773 if (event != NB_EV_APPLY)
1774 return NB_OK;
1775
1776 circuit = nb_running_get_entry(dnode, NULL, true);
1777 circuit->psnp_interval[1] = yang_dnode_get_uint16(dnode, NULL);
1778
1779 return NB_OK;
1780 }
1781
1782 /*
1783 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/padding
1784 */
1785 static int lib_interface_isis_hello_padding_modify(enum nb_event event,
1786 const struct lyd_node *dnode,
1787 union nb_resource *resource)
1788 {
1789 struct isis_circuit *circuit;
1790
1791 if (event != NB_EV_APPLY)
1792 return NB_OK;
1793
1794 circuit = nb_running_get_entry(dnode, NULL, true);
1795 circuit->pad_hellos = yang_dnode_get_bool(dnode, NULL);
1796
1797 return NB_OK;
1798 }
1799
1800 /*
1801 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/interval/level-1
1802 */
1803 static int
1804 lib_interface_isis_hello_interval_level_1_modify(enum nb_event event,
1805 const struct lyd_node *dnode,
1806 union nb_resource *resource)
1807 {
1808 struct isis_circuit *circuit;
1809 uint32_t interval;
1810
1811 if (event != NB_EV_APPLY)
1812 return NB_OK;
1813
1814 circuit = nb_running_get_entry(dnode, NULL, true);
1815 interval = yang_dnode_get_uint32(dnode, NULL);
1816 circuit->hello_interval[0] = interval;
1817
1818 return NB_OK;
1819 }
1820
1821 /*
1822 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/interval/level-2
1823 */
1824 static int
1825 lib_interface_isis_hello_interval_level_2_modify(enum nb_event event,
1826 const struct lyd_node *dnode,
1827 union nb_resource *resource)
1828 {
1829 struct isis_circuit *circuit;
1830 uint32_t interval;
1831
1832 if (event != NB_EV_APPLY)
1833 return NB_OK;
1834
1835 circuit = nb_running_get_entry(dnode, NULL, true);
1836 interval = yang_dnode_get_uint32(dnode, NULL);
1837 circuit->hello_interval[1] = interval;
1838
1839 return NB_OK;
1840 }
1841
1842 /*
1843 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/multiplier/level-1
1844 */
1845 static int
1846 lib_interface_isis_hello_multiplier_level_1_modify(enum nb_event event,
1847 const struct lyd_node *dnode,
1848 union nb_resource *resource)
1849 {
1850 struct isis_circuit *circuit;
1851 uint16_t multi;
1852
1853 if (event != NB_EV_APPLY)
1854 return NB_OK;
1855
1856 circuit = nb_running_get_entry(dnode, NULL, true);
1857 multi = yang_dnode_get_uint16(dnode, NULL);
1858 circuit->hello_multiplier[0] = multi;
1859
1860 return NB_OK;
1861 }
1862
1863 /*
1864 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/multiplier/level-2
1865 */
1866 static int
1867 lib_interface_isis_hello_multiplier_level_2_modify(enum nb_event event,
1868 const struct lyd_node *dnode,
1869 union nb_resource *resource)
1870 {
1871 struct isis_circuit *circuit;
1872 uint16_t multi;
1873
1874 if (event != NB_EV_APPLY)
1875 return NB_OK;
1876
1877 circuit = nb_running_get_entry(dnode, NULL, true);
1878 multi = yang_dnode_get_uint16(dnode, NULL);
1879 circuit->hello_multiplier[1] = multi;
1880
1881 return NB_OK;
1882 }
1883
1884 /*
1885 * XPath: /frr-interface:lib/interface/frr-isisd:isis/metric/level-1
1886 */
1887 static int
1888 lib_interface_isis_metric_level_1_modify(enum nb_event event,
1889 const struct lyd_node *dnode,
1890 union nb_resource *resource)
1891 {
1892 struct isis_circuit *circuit;
1893 unsigned int met;
1894
1895 if (event != NB_EV_APPLY)
1896 return NB_OK;
1897
1898 circuit = nb_running_get_entry(dnode, NULL, true);
1899 met = yang_dnode_get_uint32(dnode, NULL);
1900 isis_circuit_metric_set(circuit, IS_LEVEL_1, met);
1901
1902 return NB_OK;
1903 }
1904
1905 /*
1906 * XPath: /frr-interface:lib/interface/frr-isisd:isis/metric/level-2
1907 */
1908 static int
1909 lib_interface_isis_metric_level_2_modify(enum nb_event event,
1910 const struct lyd_node *dnode,
1911 union nb_resource *resource)
1912 {
1913 struct isis_circuit *circuit;
1914 unsigned int met;
1915
1916 if (event != NB_EV_APPLY)
1917 return NB_OK;
1918
1919 circuit = nb_running_get_entry(dnode, NULL, true);
1920 met = yang_dnode_get_uint32(dnode, NULL);
1921 isis_circuit_metric_set(circuit, IS_LEVEL_2, met);
1922
1923 return NB_OK;
1924 }
1925
1926 /*
1927 * XPath: /frr-interface:lib/interface/frr-isisd:isis/priority/level-1
1928 */
1929 static int
1930 lib_interface_isis_priority_level_1_modify(enum nb_event event,
1931 const struct lyd_node *dnode,
1932 union nb_resource *resource)
1933 {
1934 struct isis_circuit *circuit;
1935
1936 if (event != NB_EV_APPLY)
1937 return NB_OK;
1938
1939 circuit = nb_running_get_entry(dnode, NULL, true);
1940 circuit->priority[0] = yang_dnode_get_uint8(dnode, NULL);
1941
1942 return NB_OK;
1943 }
1944
1945 /*
1946 * XPath: /frr-interface:lib/interface/frr-isisd:isis/priority/level-2
1947 */
1948 static int
1949 lib_interface_isis_priority_level_2_modify(enum nb_event event,
1950 const struct lyd_node *dnode,
1951 union nb_resource *resource)
1952 {
1953 struct isis_circuit *circuit;
1954
1955 if (event != NB_EV_APPLY)
1956 return NB_OK;
1957
1958 circuit = nb_running_get_entry(dnode, NULL, true);
1959 circuit->priority[1] = yang_dnode_get_uint8(dnode, NULL);
1960
1961 return NB_OK;
1962 }
1963
1964 /*
1965 * XPath: /frr-interface:lib/interface/frr-isisd:isis/network-type
1966 */
1967 static int lib_interface_isis_network_type_modify(enum nb_event event,
1968 const struct lyd_node *dnode,
1969 union nb_resource *resource)
1970 {
1971 struct isis_circuit *circuit;
1972 int net_type = yang_dnode_get_enum(dnode, NULL);
1973
1974 switch (event) {
1975 case NB_EV_VALIDATE:
1976 circuit = nb_running_get_entry(dnode, NULL, false);
1977 if (!circuit)
1978 break;
1979 if (circuit->circ_type == CIRCUIT_T_LOOPBACK) {
1980 flog_warn(
1981 EC_LIB_NB_CB_CONFIG_VALIDATE,
1982 "Cannot change network type on loopback interface");
1983 return NB_ERR_VALIDATION;
1984 }
1985 if (net_type == CIRCUIT_T_BROADCAST
1986 && circuit->state == C_STATE_UP
1987 && !if_is_broadcast(circuit->interface)) {
1988 flog_warn(
1989 EC_LIB_NB_CB_CONFIG_VALIDATE,
1990 "Cannot configure non-broadcast interface for broadcast operation");
1991 return NB_ERR_VALIDATION;
1992 }
1993 break;
1994 case NB_EV_PREPARE:
1995 case NB_EV_ABORT:
1996 break;
1997 case NB_EV_APPLY:
1998 circuit = nb_running_get_entry(dnode, NULL, true);
1999 isis_circuit_circ_type_set(circuit, net_type);
2000 break;
2001 }
2002
2003 return NB_OK;
2004 }
2005
2006 /*
2007 * XPath: /frr-interface:lib/interface/frr-isisd:isis/passive
2008 */
2009 static int lib_interface_isis_passive_modify(enum nb_event event,
2010 const struct lyd_node *dnode,
2011 union nb_resource *resource)
2012 {
2013 struct isis_circuit *circuit;
2014 struct isis_area *area;
2015 struct interface *ifp;
2016 bool passive = yang_dnode_get_bool(dnode, NULL);
2017
2018 /* validation only applies if we are setting passive to false */
2019 if (!passive && event == NB_EV_VALIDATE) {
2020 circuit = nb_running_get_entry(dnode, NULL, false);
2021 if (!circuit)
2022 return NB_OK;
2023 ifp = circuit->interface;
2024 if (!ifp)
2025 return NB_OK;
2026 if (if_is_loopback(ifp)) {
2027 flog_warn(EC_LIB_NB_CB_CONFIG_VALIDATE,
2028 "Loopback is always passive");
2029 return NB_ERR_VALIDATION;
2030 }
2031 }
2032
2033 if (event != NB_EV_APPLY)
2034 return NB_OK;
2035
2036 circuit = nb_running_get_entry(dnode, NULL, true);
2037 if (circuit->state != C_STATE_UP) {
2038 circuit->is_passive = passive;
2039 } else {
2040 area = circuit->area;
2041 isis_csm_state_change(ISIS_DISABLE, circuit, area);
2042 circuit->is_passive = passive;
2043 isis_csm_state_change(ISIS_ENABLE, circuit, area);
2044 }
2045
2046 return NB_OK;
2047 }
2048
2049 /*
2050 * XPath: /frr-interface:lib/interface/frr-isisd:isis/password
2051 */
2052 static int lib_interface_isis_password_create(enum nb_event event,
2053 const struct lyd_node *dnode,
2054 union nb_resource *resource)
2055 {
2056 return NB_OK;
2057 }
2058
2059 static int lib_interface_isis_password_destroy(enum nb_event event,
2060 const struct lyd_node *dnode)
2061 {
2062 struct isis_circuit *circuit;
2063
2064 if (event != NB_EV_APPLY)
2065 return NB_OK;
2066
2067 circuit = nb_running_get_entry(dnode, NULL, true);
2068 isis_circuit_passwd_unset(circuit);
2069
2070 return NB_OK;
2071 }
2072
2073 /*
2074 * XPath: /frr-interface:lib/interface/frr-isisd:isis/password/password
2075 */
2076 static int
2077 lib_interface_isis_password_password_modify(enum nb_event event,
2078 const struct lyd_node *dnode,
2079 union nb_resource *resource)
2080 {
2081 struct isis_circuit *circuit;
2082 const char *password;
2083
2084 if (event != NB_EV_APPLY)
2085 return NB_OK;
2086
2087 password = yang_dnode_get_string(dnode, NULL);
2088 circuit = nb_running_get_entry(dnode, NULL, true);
2089
2090 isis_circuit_passwd_set(circuit, circuit->passwd.type, password);
2091
2092 return NB_OK;
2093 }
2094
2095 /*
2096 * XPath: /frr-interface:lib/interface/frr-isisd:isis/password/password-type
2097 */
2098 static int
2099 lib_interface_isis_password_password_type_modify(enum nb_event event,
2100 const struct lyd_node *dnode,
2101 union nb_resource *resource)
2102 {
2103 struct isis_circuit *circuit;
2104 uint8_t pass_type;
2105
2106 if (event != NB_EV_APPLY)
2107 return NB_OK;
2108
2109 pass_type = yang_dnode_get_enum(dnode, NULL);
2110 circuit = nb_running_get_entry(dnode, NULL, true);
2111 circuit->passwd.type = pass_type;
2112
2113 return NB_OK;
2114 }
2115
2116 /*
2117 * XPath:
2118 * /frr-interface:lib/interface/frr-isisd:isis/disable-three-way-handshake
2119 */
2120 static int lib_interface_isis_disable_three_way_handshake_modify(
2121 enum nb_event event, const struct lyd_node *dnode,
2122 union nb_resource *resource)
2123 {
2124 struct isis_circuit *circuit;
2125
2126 if (event != NB_EV_APPLY)
2127 return NB_OK;
2128
2129 circuit = nb_running_get_entry(dnode, NULL, true);
2130 circuit->disable_threeway_adj = yang_dnode_get_bool(dnode, NULL);
2131
2132 return NB_OK;
2133 }
2134
2135 /*
2136 * XPath:
2137 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-unicast
2138 */
2139 static int lib_interface_isis_multi_topology_common(
2140 enum nb_event event, const struct lyd_node *dnode, uint16_t mtid)
2141 {
2142 struct isis_circuit *circuit;
2143 bool value;
2144
2145 switch (event) {
2146 case NB_EV_VALIDATE:
2147 circuit = nb_running_get_entry(dnode, NULL, false);
2148 if (circuit && circuit->area && circuit->area->oldmetric) {
2149 flog_warn(
2150 EC_LIB_NB_CB_CONFIG_VALIDATE,
2151 "Multi topology IS-IS can only be used with wide metrics");
2152 return NB_ERR_VALIDATION;
2153 }
2154 break;
2155 case NB_EV_PREPARE:
2156 case NB_EV_ABORT:
2157 break;
2158 case NB_EV_APPLY:
2159 circuit = nb_running_get_entry(dnode, NULL, true);
2160 value = yang_dnode_get_bool(dnode, NULL);
2161 isis_circuit_mt_enabled_set(circuit, mtid, value);
2162 break;
2163 }
2164
2165 return NB_OK;
2166 }
2167
2168 static int lib_interface_isis_multi_topology_ipv4_unicast_modify(
2169 enum nb_event event, const struct lyd_node *dnode,
2170 union nb_resource *resource)
2171 {
2172 return lib_interface_isis_multi_topology_common(event, dnode,
2173 ISIS_MT_IPV4_UNICAST);
2174 }
2175
2176 /*
2177 * XPath:
2178 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-multicast
2179 */
2180 static int lib_interface_isis_multi_topology_ipv4_multicast_modify(
2181 enum nb_event event, const struct lyd_node *dnode,
2182 union nb_resource *resource)
2183 {
2184 return lib_interface_isis_multi_topology_common(event, dnode,
2185 ISIS_MT_IPV4_MULTICAST);
2186 }
2187
2188 /*
2189 * XPath:
2190 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-management
2191 */
2192 static int lib_interface_isis_multi_topology_ipv4_management_modify(
2193 enum nb_event event, const struct lyd_node *dnode,
2194 union nb_resource *resource)
2195 {
2196 return lib_interface_isis_multi_topology_common(event, dnode,
2197 ISIS_MT_IPV4_MGMT);
2198 }
2199
2200 /*
2201 * XPath:
2202 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-unicast
2203 */
2204 static int lib_interface_isis_multi_topology_ipv6_unicast_modify(
2205 enum nb_event event, const struct lyd_node *dnode,
2206 union nb_resource *resource)
2207 {
2208 return lib_interface_isis_multi_topology_common(event, dnode,
2209 ISIS_MT_IPV6_UNICAST);
2210 }
2211
2212 /*
2213 * XPath:
2214 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-multicast
2215 */
2216 static int lib_interface_isis_multi_topology_ipv6_multicast_modify(
2217 enum nb_event event, const struct lyd_node *dnode,
2218 union nb_resource *resource)
2219 {
2220 return lib_interface_isis_multi_topology_common(event, dnode,
2221 ISIS_MT_IPV6_MULTICAST);
2222 }
2223
2224 /*
2225 * XPath:
2226 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-management
2227 */
2228 static int lib_interface_isis_multi_topology_ipv6_management_modify(
2229 enum nb_event event, const struct lyd_node *dnode,
2230 union nb_resource *resource)
2231 {
2232 return lib_interface_isis_multi_topology_common(event, dnode,
2233 ISIS_MT_IPV6_MGMT);
2234 }
2235
2236 /*
2237 * XPath: /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-dstsrc
2238 */
2239 static int lib_interface_isis_multi_topology_ipv6_dstsrc_modify(
2240 enum nb_event event, const struct lyd_node *dnode,
2241 union nb_resource *resource)
2242 {
2243 return lib_interface_isis_multi_topology_common(event, dnode,
2244 ISIS_MT_IPV6_DSTSRC);
2245 }
2246
2247 /*
2248 * NOTIFICATIONS
2249 */
2250 static void notif_prep_instance_hdr(const char *xpath,
2251 const struct isis_area *area,
2252 const char *routing_instance,
2253 struct list *args)
2254 {
2255 char xpath_arg[XPATH_MAXLEN];
2256 struct yang_data *data;
2257
2258 snprintf(xpath_arg, sizeof(xpath_arg), "%s/routing-instance", xpath);
2259 data = yang_data_new_string(xpath_arg, routing_instance);
2260 listnode_add(args, data);
2261 snprintf(xpath_arg, sizeof(xpath_arg), "%s/routing-protocol-name",
2262 xpath);
2263 data = yang_data_new_string(xpath_arg, area->area_tag);
2264 listnode_add(args, data);
2265 snprintf(xpath_arg, sizeof(xpath_arg), "%s/isis-level", xpath);
2266 data = yang_data_new_enum(xpath_arg, area->is_type);
2267 listnode_add(args, data);
2268 }
2269
2270 static void notif_prepr_iface_hdr(const char *xpath,
2271 const struct isis_circuit *circuit,
2272 struct list *args)
2273 {
2274 char xpath_arg[XPATH_MAXLEN];
2275 struct yang_data *data;
2276
2277 snprintf(xpath_arg, sizeof(xpath_arg), "%s/interface-name", xpath);
2278 data = yang_data_new_string(xpath_arg, circuit->interface->name);
2279 listnode_add(args, data);
2280 snprintf(xpath_arg, sizeof(xpath_arg), "%s/interface-level", xpath);
2281 data = yang_data_new_enum(xpath_arg, circuit->is_type);
2282 listnode_add(args, data);
2283 snprintf(xpath_arg, sizeof(xpath_arg), "%s/extended-circuit-id", xpath);
2284 /* we do not seem to have the extended version of the circuit_id */
2285 data = yang_data_new_uint32(xpath_arg, (uint32_t)circuit->circuit_id);
2286 listnode_add(args, data);
2287 }
2288
2289 /*
2290 * XPath:
2291 * /frr-isisd:database-overload
2292 */
2293 void isis_notif_db_overload(const struct isis_area *area, bool overload)
2294 {
2295 const char *xpath = "/frr-isisd:database-overload";
2296 struct list *arguments = yang_data_list_new();
2297 char xpath_arg[XPATH_MAXLEN];
2298 struct yang_data *data;
2299
2300 notif_prep_instance_hdr(xpath, area, "default", arguments);
2301 snprintf(xpath_arg, sizeof(xpath_arg), "%s/overload", xpath);
2302 data = yang_data_new_enum(xpath_arg, !!overload);
2303 listnode_add(arguments, data);
2304
2305 nb_notification_send(xpath, arguments);
2306 }
2307
2308 /*
2309 * XPath:
2310 * /frr-isisd:lsp-too-large
2311 */
2312 void isis_notif_lsp_too_large(const struct isis_circuit *circuit,
2313 uint32_t pdu_size, const char *lsp_id)
2314 {
2315 const char *xpath = "/frr-isisd:lsp-too-large";
2316 struct list *arguments = yang_data_list_new();
2317 char xpath_arg[XPATH_MAXLEN];
2318 struct yang_data *data;
2319 struct isis_area *area = circuit->area;
2320
2321 notif_prep_instance_hdr(xpath, area, "default", arguments);
2322 notif_prepr_iface_hdr(xpath, circuit, arguments);
2323 snprintf(xpath_arg, sizeof(xpath_arg), "%s/pdu-size", xpath);
2324 data = yang_data_new_uint32(xpath_arg, pdu_size);
2325 listnode_add(arguments, data);
2326 snprintf(xpath_arg, sizeof(xpath_arg), "%s/lsp-id", xpath);
2327 data = yang_data_new_string(xpath_arg, lsp_id);
2328 listnode_add(arguments, data);
2329
2330 nb_notification_send(xpath, arguments);
2331 }
2332
2333 /*
2334 * XPath:
2335 * /frr-isisd:if-state-change
2336 */
2337 void isis_notif_if_state_change(const struct isis_circuit *circuit, bool down)
2338 {
2339 const char *xpath = "/frr-isisd:if-state-change";
2340 struct list *arguments = yang_data_list_new();
2341 char xpath_arg[XPATH_MAXLEN];
2342 struct yang_data *data;
2343 struct isis_area *area = circuit->area;
2344
2345 notif_prep_instance_hdr(xpath, area, "default", arguments);
2346 notif_prepr_iface_hdr(xpath, circuit, arguments);
2347 snprintf(xpath_arg, sizeof(xpath_arg), "%s/state", xpath);
2348 data = yang_data_new_enum(xpath_arg, !!down);
2349 listnode_add(arguments, data);
2350
2351 nb_notification_send(xpath, arguments);
2352 }
2353
2354 /*
2355 * XPath:
2356 * /frr-isisd:corrupted-lsp-detected
2357 */
2358 void isis_notif_corrupted_lsp(const struct isis_area *area, const char *lsp_id)
2359 {
2360 const char *xpath = "/frr-isisd:corrupted-lsp-detected";
2361 struct list *arguments = yang_data_list_new();
2362 char xpath_arg[XPATH_MAXLEN];
2363 struct yang_data *data;
2364
2365 notif_prep_instance_hdr(xpath, area, "default", arguments);
2366 snprintf(xpath_arg, sizeof(xpath_arg), "%s/lsp-id", xpath);
2367 data = yang_data_new_string(xpath_arg, lsp_id);
2368 listnode_add(arguments, data);
2369
2370 nb_notification_send(xpath, arguments);
2371 }
2372
2373 /*
2374 * XPath:
2375 * /frr-isisd:attempt-to-exceed-max-sequence
2376 */
2377 void isis_notif_lsp_exceed_max(const struct isis_area *area, const char *lsp_id)
2378 {
2379 const char *xpath = "/frr-isisd:attempt-to-exceed-max-sequence";
2380 struct list *arguments = yang_data_list_new();
2381 char xpath_arg[XPATH_MAXLEN];
2382 struct yang_data *data;
2383
2384 notif_prep_instance_hdr(xpath, area, "default", arguments);
2385 snprintf(xpath_arg, sizeof(xpath_arg), "%s/lsp-id", xpath);
2386 data = yang_data_new_string(xpath_arg, lsp_id);
2387 listnode_add(arguments, data);
2388
2389 nb_notification_send(xpath, arguments);
2390 }
2391
2392 /*
2393 * XPath:
2394 * /frr-isisd:max-area-addresses-mismatch
2395 */
2396 void isis_notif_max_area_addr_mismatch(const struct isis_circuit *circuit,
2397 uint8_t max_area_addrs,
2398 const char *raw_pdu)
2399 {
2400 const char *xpath = "/frr-isisd:max-area-addresses-mismatch";
2401 struct list *arguments = yang_data_list_new();
2402 char xpath_arg[XPATH_MAXLEN];
2403 struct yang_data *data;
2404 struct isis_area *area = circuit->area;
2405
2406 notif_prep_instance_hdr(xpath, area, "default", arguments);
2407 notif_prepr_iface_hdr(xpath, circuit, arguments);
2408 snprintf(xpath_arg, sizeof(xpath_arg), "%s/max-area-addresses", xpath);
2409 data = yang_data_new_uint8(xpath_arg, max_area_addrs);
2410 listnode_add(arguments, data);
2411 snprintf(xpath_arg, sizeof(xpath_arg), "%s/raw-pdu", xpath);
2412 data = yang_data_new(xpath_arg, raw_pdu);
2413 listnode_add(arguments, data);
2414
2415 nb_notification_send(xpath, arguments);
2416 }
2417
2418 /*
2419 * XPath:
2420 * /frr-isisd:authentication-type-failure
2421 */
2422 void isis_notif_authentication_type_failure(const struct isis_circuit *circuit,
2423 const char *raw_pdu)
2424 {
2425 const char *xpath = "/frr-isisd:authentication-type-failure";
2426 struct list *arguments = yang_data_list_new();
2427 char xpath_arg[XPATH_MAXLEN];
2428 struct yang_data *data;
2429 struct isis_area *area = circuit->area;
2430
2431 notif_prep_instance_hdr(xpath, area, "default", arguments);
2432 notif_prepr_iface_hdr(xpath, circuit, arguments);
2433 snprintf(xpath_arg, sizeof(xpath_arg), "%s/raw-pdu", xpath);
2434 data = yang_data_new(xpath_arg, raw_pdu);
2435 listnode_add(arguments, data);
2436
2437 nb_notification_send(xpath, arguments);
2438 }
2439
2440 /*
2441 * XPath:
2442 * /frr-isisd:authentication-failure
2443 */
2444 void isis_notif_authentication_failure(const struct isis_circuit *circuit,
2445 const char *raw_pdu)
2446 {
2447 const char *xpath = "/frr-isisd:authentication-failure";
2448 struct list *arguments = yang_data_list_new();
2449 char xpath_arg[XPATH_MAXLEN];
2450 struct yang_data *data;
2451 struct isis_area *area = circuit->area;
2452
2453 notif_prep_instance_hdr(xpath, area, "default", arguments);
2454 notif_prepr_iface_hdr(xpath, circuit, arguments);
2455 snprintf(xpath_arg, sizeof(xpath_arg), "%s/raw-pdu", xpath);
2456 data = yang_data_new(xpath_arg, raw_pdu);
2457 listnode_add(arguments, data);
2458
2459 nb_notification_send(xpath, arguments);
2460 }
2461
2462 /*
2463 * XPath:
2464 * /frr-isisd:adjacency-state-change
2465 */
2466 void isis_notif_adj_state_change(const struct isis_adjacency *adj,
2467 int new_state, const char *reason)
2468 {
2469 const char *xpath = "/frr-isisd:adjacency-state-change";
2470 struct list *arguments = yang_data_list_new();
2471 char xpath_arg[XPATH_MAXLEN];
2472 struct yang_data *data;
2473 struct isis_circuit *circuit = adj->circuit;
2474 struct isis_area *area = circuit->area;
2475 struct isis_dynhn *dyn = dynhn_find_by_id(adj->sysid);
2476
2477 notif_prep_instance_hdr(xpath, area, "default", arguments);
2478 notif_prepr_iface_hdr(xpath, circuit, arguments);
2479 if (dyn) {
2480 snprintf(xpath_arg, sizeof(xpath_arg), "%s/neighbor", xpath);
2481 data = yang_data_new_string(xpath_arg, dyn->hostname);
2482 listnode_add(arguments, data);
2483 }
2484 snprintf(xpath_arg, sizeof(xpath_arg), "%s/neighbor-system-id", xpath);
2485 data = yang_data_new_string(xpath_arg, sysid_print(adj->sysid));
2486 listnode_add(arguments, data);
2487
2488 snprintf(xpath_arg, sizeof(xpath_arg), "%s/state", xpath);
2489 switch (new_state) {
2490 case ISIS_ADJ_DOWN:
2491 data = yang_data_new_string(xpath_arg, "down");
2492 break;
2493 case ISIS_ADJ_UP:
2494 data = yang_data_new_string(xpath_arg, "up");
2495 break;
2496 case ISIS_ADJ_INITIALIZING:
2497 data = yang_data_new_string(xpath_arg, "init");
2498 break;
2499 default:
2500 data = yang_data_new_string(xpath_arg, "failed");
2501 }
2502 listnode_add(arguments, data);
2503 if (new_state == ISIS_ADJ_DOWN) {
2504 snprintf(xpath_arg, sizeof(xpath_arg), "%s/reason", xpath);
2505 data = yang_data_new_string(xpath_arg, reason);
2506 listnode_add(arguments, data);
2507 }
2508
2509 nb_notification_send(xpath, arguments);
2510 }
2511
2512 /*
2513 * XPath:
2514 * /frr-isisd:rejected-adjacency
2515 */
2516 void isis_notif_reject_adjacency(const struct isis_circuit *circuit,
2517 const char *reason, const char *raw_pdu)
2518 {
2519 const char *xpath = "/frr-isisd:rejected-adjacency";
2520 struct list *arguments = yang_data_list_new();
2521 char xpath_arg[XPATH_MAXLEN];
2522 struct yang_data *data;
2523 struct isis_area *area = circuit->area;
2524
2525 notif_prep_instance_hdr(xpath, area, "default", arguments);
2526 notif_prepr_iface_hdr(xpath, circuit, arguments);
2527 snprintf(xpath_arg, sizeof(xpath_arg), "%s/reason", xpath);
2528 data = yang_data_new_string(xpath_arg, reason);
2529 listnode_add(arguments, data);
2530 snprintf(xpath_arg, sizeof(xpath_arg), "%s/raw-pdu", xpath);
2531 data = yang_data_new(xpath_arg, raw_pdu);
2532 listnode_add(arguments, data);
2533
2534 nb_notification_send(xpath, arguments);
2535 }
2536
2537 /*
2538 * XPath:
2539 * /frr-isisd:area-mismatch
2540 */
2541 void isis_notif_area_mismatch(const struct isis_circuit *circuit,
2542 const char *raw_pdu)
2543 {
2544 const char *xpath = "/frr-isisd:area-mismatch";
2545 struct list *arguments = yang_data_list_new();
2546 char xpath_arg[XPATH_MAXLEN];
2547 struct yang_data *data;
2548 struct isis_area *area = circuit->area;
2549
2550 notif_prep_instance_hdr(xpath, area, "default", arguments);
2551 notif_prepr_iface_hdr(xpath, circuit, arguments);
2552 snprintf(xpath_arg, sizeof(xpath_arg), "%s/raw-pdu", xpath);
2553 data = yang_data_new(xpath_arg, raw_pdu);
2554 listnode_add(arguments, data);
2555
2556 nb_notification_send(xpath, arguments);
2557 }
2558
2559 /*
2560 * XPath:
2561 * /frr-isisd:lsp-received
2562 */
2563 void isis_notif_lsp_received(const struct isis_circuit *circuit,
2564 const char *lsp_id, uint32_t seqno,
2565 uint32_t timestamp, const char *sys_id)
2566 {
2567 const char *xpath = "/frr-isisd:lsp-received";
2568 struct list *arguments = yang_data_list_new();
2569 char xpath_arg[XPATH_MAXLEN];
2570 struct yang_data *data;
2571 struct isis_area *area = circuit->area;
2572
2573 notif_prep_instance_hdr(xpath, area, "default", arguments);
2574 notif_prepr_iface_hdr(xpath, circuit, arguments);
2575 snprintf(xpath_arg, sizeof(xpath_arg), "%s/lsp-id", xpath);
2576 data = yang_data_new_string(xpath_arg, lsp_id);
2577 listnode_add(arguments, data);
2578 snprintf(xpath_arg, sizeof(xpath_arg), "%s/sequence", xpath);
2579 data = yang_data_new_uint32(xpath_arg, seqno);
2580 listnode_add(arguments, data);
2581 snprintf(xpath_arg, sizeof(xpath_arg), "%s/received-timestamp", xpath);
2582 data = yang_data_new_uint32(xpath_arg, timestamp);
2583 listnode_add(arguments, data);
2584 snprintf(xpath_arg, sizeof(xpath_arg), "%s/neighbor-system-id", xpath);
2585 data = yang_data_new_string(xpath_arg, sys_id);
2586 listnode_add(arguments, data);
2587
2588 nb_notification_send(xpath, arguments);
2589 }
2590
2591 /*
2592 * XPath:
2593 * /frr-isisd:lsp-generation
2594 */
2595 void isis_notif_lsp_gen(const struct isis_area *area, const char *lsp_id,
2596 uint32_t seqno, uint32_t timestamp)
2597 {
2598 const char *xpath = "/frr-isisd:lsp-generation";
2599 struct list *arguments = yang_data_list_new();
2600 char xpath_arg[XPATH_MAXLEN];
2601 struct yang_data *data;
2602
2603 notif_prep_instance_hdr(xpath, area, "default", arguments);
2604 snprintf(xpath_arg, sizeof(xpath_arg), "%s/lsp-id", xpath);
2605 data = yang_data_new_string(xpath_arg, lsp_id);
2606 listnode_add(arguments, data);
2607 snprintf(xpath_arg, sizeof(xpath_arg), "%s/sequence", xpath);
2608 data = yang_data_new_uint32(xpath_arg, seqno);
2609 listnode_add(arguments, data);
2610 snprintf(xpath_arg, sizeof(xpath_arg), "%s/send-timestamp", xpath);
2611 data = yang_data_new_uint32(xpath_arg, timestamp);
2612 listnode_add(arguments, data);
2613
2614 nb_notification_send(xpath, arguments);
2615 }
2616
2617 /*
2618 * XPath:
2619 * /frr-isisd:id-len-mismatch
2620 */
2621 void isis_notif_id_len_mismatch(const struct isis_circuit *circuit,
2622 uint8_t rcv_id_len, const char *raw_pdu)
2623 {
2624 const char *xpath = "/frr-isisd:id-len-mismatch";
2625 struct list *arguments = yang_data_list_new();
2626 char xpath_arg[XPATH_MAXLEN];
2627 struct yang_data *data;
2628 struct isis_area *area = circuit->area;
2629
2630 notif_prep_instance_hdr(xpath, area, "default", arguments);
2631 notif_prepr_iface_hdr(xpath, circuit, arguments);
2632 snprintf(xpath_arg, sizeof(xpath_arg), "%s/pdu-field-len", xpath);
2633 data = yang_data_new_uint8(xpath_arg, rcv_id_len);
2634 listnode_add(arguments, data);
2635 snprintf(xpath_arg, sizeof(xpath_arg), "%s/raw-pdu", xpath);
2636 data = yang_data_new(xpath_arg, raw_pdu);
2637 listnode_add(arguments, data);
2638
2639 nb_notification_send(xpath, arguments);
2640 }
2641
2642 /*
2643 * XPath:
2644 * /frr-isisd:version-skew
2645 */
2646 void isis_notif_version_skew(const struct isis_circuit *circuit,
2647 uint8_t version, const char *raw_pdu)
2648 {
2649 const char *xpath = "/frr-isisd:version-skew";
2650 struct list *arguments = yang_data_list_new();
2651 char xpath_arg[XPATH_MAXLEN];
2652 struct yang_data *data;
2653 struct isis_area *area = circuit->area;
2654
2655 notif_prep_instance_hdr(xpath, area, "default", arguments);
2656 notif_prepr_iface_hdr(xpath, circuit, arguments);
2657 snprintf(xpath_arg, sizeof(xpath_arg), "%s/protocol-version", xpath);
2658 data = yang_data_new_uint8(xpath_arg, version);
2659 listnode_add(arguments, data);
2660 snprintf(xpath_arg, sizeof(xpath_arg), "%s/raw-pdu", xpath);
2661 data = yang_data_new(xpath_arg, raw_pdu);
2662 listnode_add(arguments, data);
2663
2664 nb_notification_send(xpath, arguments);
2665 }
2666
2667 /*
2668 * XPath:
2669 * /frr-isisd:lsp-error-detected
2670 */
2671 void isis_notif_lsp_error(const struct isis_circuit *circuit,
2672 const char *lsp_id, const char *raw_pdu,
2673 __attribute__((unused)) uint32_t offset,
2674 __attribute__((unused)) uint8_t tlv_type)
2675 {
2676 const char *xpath = "/frr-isisd:lsp-error-detected";
2677 struct list *arguments = yang_data_list_new();
2678 char xpath_arg[XPATH_MAXLEN];
2679 struct yang_data *data;
2680 struct isis_area *area = circuit->area;
2681
2682 notif_prep_instance_hdr(xpath, area, "default", arguments);
2683 notif_prepr_iface_hdr(xpath, circuit, arguments);
2684 snprintf(xpath_arg, sizeof(xpath_arg), "%s/lsp-id", xpath);
2685 data = yang_data_new_string(xpath_arg, lsp_id);
2686 listnode_add(arguments, data);
2687 snprintf(xpath_arg, sizeof(xpath_arg), "%s/raw-pdu", xpath);
2688 data = yang_data_new(xpath_arg, raw_pdu);
2689 listnode_add(arguments, data);
2690 /* ignore offset and tlv_type which cannot be set properly */
2691
2692 nb_notification_send(xpath, arguments);
2693 }
2694
2695 /*
2696 * XPath:
2697 * /frr-isisd:sequence-number-skipped
2698 */
2699 void isis_notif_seqno_skipped(const struct isis_circuit *circuit,
2700 const char *lsp_id)
2701 {
2702 const char *xpath = "/frr-isisd:sequence-number-skipped";
2703 struct list *arguments = yang_data_list_new();
2704 char xpath_arg[XPATH_MAXLEN];
2705 struct yang_data *data;
2706 struct isis_area *area = circuit->area;
2707
2708 notif_prep_instance_hdr(xpath, area, "default", arguments);
2709 notif_prepr_iface_hdr(xpath, circuit, arguments);
2710 snprintf(xpath_arg, sizeof(xpath_arg), "%s/lsp-id", xpath);
2711 data = yang_data_new_string(xpath_arg, lsp_id);
2712 listnode_add(arguments, data);
2713
2714 nb_notification_send(xpath, arguments);
2715 }
2716
2717 /*
2718 * XPath:
2719 * /frr-isisd:own-lsp-purge
2720 */
2721 void isis_notif_own_lsp_purge(const struct isis_circuit *circuit,
2722 const char *lsp_id)
2723 {
2724 const char *xpath = "/frr-isisd:own-lsp-purge";
2725 struct list *arguments = yang_data_list_new();
2726 char xpath_arg[XPATH_MAXLEN];
2727 struct yang_data *data;
2728 struct isis_area *area = circuit->area;
2729
2730 notif_prep_instance_hdr(xpath, area, "default", arguments);
2731 notif_prepr_iface_hdr(xpath, circuit, arguments);
2732 snprintf(xpath_arg, sizeof(xpath_arg), "%s/lsp-id", xpath);
2733 data = yang_data_new_string(xpath_arg, lsp_id);
2734 listnode_add(arguments, data);
2735
2736 nb_notification_send(xpath, arguments);
2737 }
2738
2739 /* clang-format off */
2740 const struct frr_yang_module_info frr_isisd_info = {
2741 .name = "frr-isisd",
2742 .nodes = {
2743 {
2744 .xpath = "/frr-isisd:isis/instance",
2745 .cbs.create = isis_instance_create,
2746 .cbs.destroy = isis_instance_destroy,
2747 .cbs.cli_show = cli_show_router_isis,
2748 .priority = NB_DFLT_PRIORITY - 1,
2749 },
2750 {
2751 .xpath = "/frr-isisd:isis/instance/is-type",
2752 .cbs.modify = isis_instance_is_type_modify,
2753 .cbs.cli_show = cli_show_isis_is_type,
2754 },
2755 {
2756 .xpath = "/frr-isisd:isis/instance/area-address",
2757 .cbs.create = isis_instance_area_address_create,
2758 .cbs.destroy = isis_instance_area_address_destroy,
2759 .cbs.cli_show = cli_show_isis_area_address,
2760 },
2761 {
2762 .xpath = "/frr-isisd:isis/instance/dynamic-hostname",
2763 .cbs.modify = isis_instance_dynamic_hostname_modify,
2764 .cbs.cli_show = cli_show_isis_dynamic_hostname,
2765 },
2766 {
2767 .xpath = "/frr-isisd:isis/instance/attached",
2768 .cbs.modify = isis_instance_attached_modify,
2769 .cbs.cli_show = cli_show_isis_attached,
2770 },
2771 {
2772 .xpath = "/frr-isisd:isis/instance/overload",
2773 .cbs.modify = isis_instance_overload_modify,
2774 .cbs.cli_show = cli_show_isis_overload,
2775 },
2776 {
2777 .xpath = "/frr-isisd:isis/instance/metric-style",
2778 .cbs.modify = isis_instance_metric_style_modify,
2779 .cbs.cli_show = cli_show_isis_metric_style,
2780 },
2781 {
2782 .xpath = "/frr-isisd:isis/instance/purge-originator",
2783 .cbs.modify = isis_instance_purge_originator_modify,
2784 .cbs.cli_show = cli_show_isis_purge_origin,
2785 },
2786 {
2787 .xpath = "/frr-isisd:isis/instance/lsp/mtu",
2788 .cbs.modify = isis_instance_lsp_mtu_modify,
2789 .cbs.cli_show = cli_show_isis_lsp_mtu,
2790 },
2791 {
2792 .xpath = "/frr-isisd:isis/instance/lsp/refresh-interval",
2793 .cbs.cli_show = cli_show_isis_lsp_ref_interval,
2794 },
2795 {
2796 .xpath = "/frr-isisd:isis/instance/lsp/refresh-interval/level-1",
2797 .cbs.modify = isis_instance_lsp_refresh_interval_level_1_modify,
2798 },
2799 {
2800 .xpath = "/frr-isisd:isis/instance/lsp/refresh-interval/level-2",
2801 .cbs.modify = isis_instance_lsp_refresh_interval_level_2_modify,
2802 },
2803 {
2804 .xpath = "/frr-isisd:isis/instance/lsp/maximum-lifetime",
2805 .cbs.cli_show = cli_show_isis_lsp_max_lifetime,
2806 },
2807 {
2808 .xpath = "/frr-isisd:isis/instance/lsp/maximum-lifetime/level-1",
2809 .cbs.modify = isis_instance_lsp_maximum_lifetime_level_1_modify,
2810 },
2811 {
2812 .xpath = "/frr-isisd:isis/instance/lsp/maximum-lifetime/level-2",
2813 .cbs.modify = isis_instance_lsp_maximum_lifetime_level_2_modify,
2814 },
2815 {
2816 .xpath = "/frr-isisd:isis/instance/lsp/generation-interval",
2817 .cbs.cli_show = cli_show_isis_lsp_gen_interval,
2818 },
2819 {
2820 .xpath = "/frr-isisd:isis/instance/lsp/generation-interval/level-1",
2821 .cbs.modify = isis_instance_lsp_generation_interval_level_1_modify,
2822 },
2823 {
2824 .xpath = "/frr-isisd:isis/instance/lsp/generation-interval/level-2",
2825 .cbs.modify = isis_instance_lsp_generation_interval_level_2_modify,
2826 },
2827 {
2828 .xpath = "/frr-isisd:isis/instance/spf/ietf-backoff-delay",
2829 .cbs.create = isis_instance_spf_ietf_backoff_delay_create,
2830 .cbs.destroy = isis_instance_spf_ietf_backoff_delay_destroy,
2831 .cbs.apply_finish = ietf_backoff_delay_apply_finish,
2832 .cbs.cli_show = cli_show_isis_spf_ietf_backoff,
2833 },
2834 {
2835 .xpath = "/frr-isisd:isis/instance/spf/ietf-backoff-delay/init-delay",
2836 .cbs.modify = isis_instance_spf_ietf_backoff_delay_init_delay_modify,
2837 },
2838 {
2839 .xpath = "/frr-isisd:isis/instance/spf/ietf-backoff-delay/short-delay",
2840 .cbs.modify = isis_instance_spf_ietf_backoff_delay_short_delay_modify,
2841 },
2842 {
2843 .xpath = "/frr-isisd:isis/instance/spf/ietf-backoff-delay/long-delay",
2844 .cbs.modify = isis_instance_spf_ietf_backoff_delay_long_delay_modify,
2845 },
2846 {
2847 .xpath = "/frr-isisd:isis/instance/spf/ietf-backoff-delay/hold-down",
2848 .cbs.modify = isis_instance_spf_ietf_backoff_delay_hold_down_modify,
2849 },
2850 {
2851 .xpath = "/frr-isisd:isis/instance/spf/ietf-backoff-delay/time-to-learn",
2852 .cbs.modify = isis_instance_spf_ietf_backoff_delay_time_to_learn_modify,
2853 },
2854 {
2855 .xpath = "/frr-isisd:isis/instance/spf/minimum-interval",
2856 .cbs.cli_show = cli_show_isis_spf_min_interval,
2857 },
2858 {
2859 .xpath = "/frr-isisd:isis/instance/spf/minimum-interval/level-1",
2860 .cbs.modify = isis_instance_spf_minimum_interval_level_1_modify,
2861 },
2862 {
2863 .xpath = "/frr-isisd:isis/instance/spf/minimum-interval/level-2",
2864 .cbs.modify = isis_instance_spf_minimum_interval_level_2_modify,
2865 },
2866 {
2867 .xpath = "/frr-isisd:isis/instance/area-password",
2868 .cbs.create = isis_instance_area_password_create,
2869 .cbs.destroy = isis_instance_area_password_destroy,
2870 .cbs.apply_finish = area_password_apply_finish,
2871 .cbs.cli_show = cli_show_isis_area_pwd,
2872 },
2873 {
2874 .xpath = "/frr-isisd:isis/instance/area-password/password",
2875 .cbs.modify = isis_instance_area_password_password_modify,
2876 },
2877 {
2878 .xpath = "/frr-isisd:isis/instance/area-password/password-type",
2879 .cbs.modify = isis_instance_area_password_password_type_modify,
2880 },
2881 {
2882 .xpath = "/frr-isisd:isis/instance/area-password/authenticate-snp",
2883 .cbs.modify = isis_instance_area_password_authenticate_snp_modify,
2884 },
2885 {
2886 .xpath = "/frr-isisd:isis/instance/domain-password",
2887 .cbs.create = isis_instance_domain_password_create,
2888 .cbs.destroy = isis_instance_domain_password_destroy,
2889 .cbs.apply_finish = domain_password_apply_finish,
2890 .cbs.cli_show = cli_show_isis_domain_pwd,
2891 },
2892 {
2893 .xpath = "/frr-isisd:isis/instance/domain-password/password",
2894 .cbs.modify = isis_instance_domain_password_password_modify,
2895 },
2896 {
2897 .xpath = "/frr-isisd:isis/instance/domain-password/password-type",
2898 .cbs.modify = isis_instance_domain_password_password_type_modify,
2899 },
2900 {
2901 .xpath = "/frr-isisd:isis/instance/domain-password/authenticate-snp",
2902 .cbs.modify = isis_instance_domain_password_authenticate_snp_modify,
2903 },
2904 {
2905 .xpath = "/frr-isisd:isis/instance/default-information-originate/ipv4",
2906 .cbs.create = isis_instance_default_information_originate_ipv4_create,
2907 .cbs.destroy = isis_instance_default_information_originate_ipv4_destroy,
2908 .cbs.apply_finish = default_info_origin_ipv4_apply_finish,
2909 .cbs.cli_show = cli_show_isis_def_origin_ipv4,
2910 },
2911 {
2912 .xpath = "/frr-isisd:isis/instance/default-information-originate/ipv4/always",
2913 .cbs.modify = isis_instance_default_information_originate_ipv4_always_modify,
2914 },
2915 {
2916 .xpath = "/frr-isisd:isis/instance/default-information-originate/ipv4/route-map",
2917 .cbs.modify = isis_instance_default_information_originate_ipv4_route_map_modify,
2918 .cbs.destroy = isis_instance_default_information_originate_ipv4_route_map_destroy,
2919 },
2920 {
2921 .xpath = "/frr-isisd:isis/instance/default-information-originate/ipv4/metric",
2922 .cbs.modify = isis_instance_default_information_originate_ipv4_metric_modify,
2923 },
2924 {
2925 .xpath = "/frr-isisd:isis/instance/default-information-originate/ipv6",
2926 .cbs.create = isis_instance_default_information_originate_ipv6_create,
2927 .cbs.destroy = isis_instance_default_information_originate_ipv6_destroy,
2928 .cbs.apply_finish = default_info_origin_ipv6_apply_finish,
2929 .cbs.cli_show = cli_show_isis_def_origin_ipv6,
2930 },
2931 {
2932 .xpath = "/frr-isisd:isis/instance/default-information-originate/ipv6/always",
2933 .cbs.modify = isis_instance_default_information_originate_ipv6_always_modify,
2934 },
2935 {
2936 .xpath = "/frr-isisd:isis/instance/default-information-originate/ipv6/route-map",
2937 .cbs.modify = isis_instance_default_information_originate_ipv6_route_map_modify,
2938 .cbs.destroy = isis_instance_default_information_originate_ipv6_route_map_destroy,
2939 },
2940 {
2941 .xpath = "/frr-isisd:isis/instance/default-information-originate/ipv6/metric",
2942 .cbs.modify = isis_instance_default_information_originate_ipv6_metric_modify,
2943 },
2944 {
2945 .xpath = "/frr-isisd:isis/instance/redistribute/ipv4",
2946 .cbs.create = isis_instance_redistribute_ipv4_create,
2947 .cbs.destroy = isis_instance_redistribute_ipv4_destroy,
2948 .cbs.apply_finish = redistribute_ipv4_apply_finish,
2949 .cbs.cli_show = cli_show_isis_redistribute_ipv4,
2950 },
2951 {
2952 .xpath = "/frr-isisd:isis/instance/redistribute/ipv4/route-map",
2953 .cbs.modify = isis_instance_redistribute_ipv4_route_map_modify,
2954 .cbs.destroy = isis_instance_redistribute_ipv4_route_map_destroy,
2955 },
2956 {
2957 .xpath = "/frr-isisd:isis/instance/redistribute/ipv4/metric",
2958 .cbs.modify = isis_instance_redistribute_ipv4_metric_modify,
2959 },
2960 {
2961 .xpath = "/frr-isisd:isis/instance/redistribute/ipv6",
2962 .cbs.create = isis_instance_redistribute_ipv6_create,
2963 .cbs.destroy = isis_instance_redistribute_ipv6_destroy,
2964 .cbs.apply_finish = redistribute_ipv6_apply_finish,
2965 .cbs.cli_show = cli_show_isis_redistribute_ipv6,
2966 },
2967 {
2968 .xpath = "/frr-isisd:isis/instance/redistribute/ipv6/route-map",
2969 .cbs.modify = isis_instance_redistribute_ipv6_route_map_modify,
2970 .cbs.destroy = isis_instance_redistribute_ipv6_route_map_destroy,
2971 },
2972 {
2973 .xpath = "/frr-isisd:isis/instance/redistribute/ipv6/metric",
2974 .cbs.modify = isis_instance_redistribute_ipv6_metric_modify,
2975 },
2976 {
2977 .xpath = "/frr-isisd:isis/instance/multi-topology/ipv4-multicast",
2978 .cbs.create = isis_instance_multi_topology_ipv4_multicast_create,
2979 .cbs.destroy = isis_instance_multi_topology_ipv4_multicast_destroy,
2980 .cbs.cli_show = cli_show_isis_mt_ipv4_multicast,
2981 },
2982 {
2983 .xpath = "/frr-isisd:isis/instance/multi-topology/ipv4-multicast/overload",
2984 .cbs.modify = isis_instance_multi_topology_ipv4_multicast_overload_modify,
2985 },
2986 {
2987 .xpath = "/frr-isisd:isis/instance/multi-topology/ipv4-management",
2988 .cbs.create = isis_instance_multi_topology_ipv4_management_create,
2989 .cbs.destroy = isis_instance_multi_topology_ipv4_management_destroy,
2990 .cbs.cli_show = cli_show_isis_mt_ipv4_mgmt,
2991 },
2992 {
2993 .xpath = "/frr-isisd:isis/instance/multi-topology/ipv4-management/overload",
2994 .cbs.modify = isis_instance_multi_topology_ipv4_management_overload_modify,
2995 },
2996 {
2997 .xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-unicast",
2998 .cbs.create = isis_instance_multi_topology_ipv6_unicast_create,
2999 .cbs.destroy = isis_instance_multi_topology_ipv6_unicast_destroy,
3000 .cbs.cli_show = cli_show_isis_mt_ipv6_unicast,
3001 },
3002 {
3003 .xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-unicast/overload",
3004 .cbs.modify = isis_instance_multi_topology_ipv6_unicast_overload_modify,
3005 },
3006 {
3007 .xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-multicast",
3008 .cbs.create = isis_instance_multi_topology_ipv6_multicast_create,
3009 .cbs.destroy = isis_instance_multi_topology_ipv6_multicast_destroy,
3010 .cbs.cli_show = cli_show_isis_mt_ipv6_multicast,
3011 },
3012 {
3013 .xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-multicast/overload",
3014 .cbs.modify = isis_instance_multi_topology_ipv6_multicast_overload_modify,
3015 },
3016 {
3017 .xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-management",
3018 .cbs.create = isis_instance_multi_topology_ipv6_management_create,
3019 .cbs.destroy = isis_instance_multi_topology_ipv6_management_destroy,
3020 .cbs.cli_show = cli_show_isis_mt_ipv6_mgmt,
3021 },
3022 {
3023 .xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-management/overload",
3024 .cbs.modify = isis_instance_multi_topology_ipv6_management_overload_modify,
3025 },
3026 {
3027 .xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-dstsrc",
3028 .cbs.create = isis_instance_multi_topology_ipv6_dstsrc_create,
3029 .cbs.destroy = isis_instance_multi_topology_ipv6_dstsrc_destroy,
3030 .cbs.cli_show = cli_show_isis_mt_ipv6_dstsrc,
3031 },
3032 {
3033 .xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-dstsrc/overload",
3034 .cbs.modify = isis_instance_multi_topology_ipv6_dstsrc_overload_modify,
3035 },
3036 {
3037 .xpath = "/frr-isisd:isis/instance/log-adjacency-changes",
3038 .cbs.modify = isis_instance_log_adjacency_changes_modify,
3039 .cbs.cli_show = cli_show_isis_log_adjacency,
3040 },
3041 {
3042 .xpath = "/frr-isisd:isis/instance/mpls-te",
3043 .cbs.create = isis_instance_mpls_te_create,
3044 .cbs.destroy = isis_instance_mpls_te_destroy,
3045 .cbs.cli_show = cli_show_isis_mpls_te,
3046 },
3047 {
3048 .xpath = "/frr-isisd:isis/instance/mpls-te/router-address",
3049 .cbs.modify = isis_instance_mpls_te_router_address_modify,
3050 .cbs.destroy = isis_instance_mpls_te_router_address_destroy,
3051 .cbs.cli_show = cli_show_isis_mpls_te_router_addr,
3052 },
3053 {
3054 .xpath = "/frr-interface:lib/interface/frr-isisd:isis",
3055 .cbs.create = lib_interface_isis_create,
3056 .cbs.destroy = lib_interface_isis_destroy,
3057 },
3058 {
3059 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/area-tag",
3060 .cbs.modify = lib_interface_isis_area_tag_modify,
3061 },
3062 {
3063 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/circuit-type",
3064 .cbs.modify = lib_interface_isis_circuit_type_modify,
3065 .cbs.cli_show = cli_show_ip_isis_circ_type,
3066 },
3067 {
3068 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/ipv4-routing",
3069 .cbs.modify = lib_interface_isis_ipv4_routing_modify,
3070 .cbs.cli_show = cli_show_ip_isis_ipv4,
3071 },
3072 {
3073 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/ipv6-routing",
3074 .cbs.modify = lib_interface_isis_ipv6_routing_modify,
3075 .cbs.cli_show = cli_show_ip_isis_ipv6,
3076 },
3077 {
3078 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/csnp-interval",
3079 .cbs.cli_show = cli_show_ip_isis_csnp_interval,
3080 },
3081 {
3082 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/csnp-interval/level-1",
3083 .cbs.modify = lib_interface_isis_csnp_interval_level_1_modify,
3084 },
3085 {
3086 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/csnp-interval/level-2",
3087 .cbs.modify = lib_interface_isis_csnp_interval_level_2_modify,
3088 },
3089 {
3090 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/psnp-interval",
3091 .cbs.cli_show = cli_show_ip_isis_psnp_interval,
3092 },
3093 {
3094 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/psnp-interval/level-1",
3095 .cbs.modify = lib_interface_isis_psnp_interval_level_1_modify,
3096 },
3097 {
3098 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/psnp-interval/level-2",
3099 .cbs.modify = lib_interface_isis_psnp_interval_level_2_modify,
3100 },
3101 {
3102 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/hello/padding",
3103 .cbs.modify = lib_interface_isis_hello_padding_modify,
3104 .cbs.cli_show = cli_show_ip_isis_hello_padding,
3105 },
3106 {
3107 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/hello/interval",
3108 .cbs.cli_show = cli_show_ip_isis_hello_interval,
3109 },
3110 {
3111 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/hello/interval/level-1",
3112 .cbs.modify = lib_interface_isis_hello_interval_level_1_modify,
3113 },
3114 {
3115 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/hello/interval/level-2",
3116 .cbs.modify = lib_interface_isis_hello_interval_level_2_modify,
3117 },
3118 {
3119 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/hello/multiplier",
3120 .cbs.cli_show = cli_show_ip_isis_hello_multi,
3121 },
3122 {
3123 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/hello/multiplier/level-1",
3124 .cbs.modify = lib_interface_isis_hello_multiplier_level_1_modify,
3125 },
3126 {
3127 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/hello/multiplier/level-2",
3128 .cbs.modify = lib_interface_isis_hello_multiplier_level_2_modify,
3129 },
3130 {
3131 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/metric",
3132 .cbs.cli_show = cli_show_ip_isis_metric,
3133 },
3134 {
3135 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/metric/level-1",
3136 .cbs.modify = lib_interface_isis_metric_level_1_modify,
3137 },
3138 {
3139 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/metric/level-2",
3140 .cbs.modify = lib_interface_isis_metric_level_2_modify,
3141 },
3142 {
3143 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/priority",
3144 .cbs.cli_show = cli_show_ip_isis_priority,
3145 },
3146 {
3147 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/priority/level-1",
3148 .cbs.modify = lib_interface_isis_priority_level_1_modify,
3149 },
3150 {
3151 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/priority/level-2",
3152 .cbs.modify = lib_interface_isis_priority_level_2_modify,
3153 },
3154 {
3155 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/network-type",
3156 .cbs.modify = lib_interface_isis_network_type_modify,
3157 .cbs.cli_show = cli_show_ip_isis_network_type,
3158 },
3159 {
3160 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/passive",
3161 .cbs.modify = lib_interface_isis_passive_modify,
3162 .cbs.cli_show = cli_show_ip_isis_passive,
3163 },
3164 {
3165 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/password",
3166 .cbs.create = lib_interface_isis_password_create,
3167 .cbs.destroy = lib_interface_isis_password_destroy,
3168 .cbs.cli_show = cli_show_ip_isis_password,
3169 },
3170 {
3171 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/password/password",
3172 .cbs.modify = lib_interface_isis_password_password_modify,
3173 },
3174 {
3175 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/password/password-type",
3176 .cbs.modify = lib_interface_isis_password_password_type_modify,
3177 },
3178 {
3179 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/disable-three-way-handshake",
3180 .cbs.modify = lib_interface_isis_disable_three_way_handshake_modify,
3181 .cbs.cli_show = cli_show_ip_isis_threeway_shake,
3182 },
3183 {
3184 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-unicast",
3185 .cbs.modify = lib_interface_isis_multi_topology_ipv4_unicast_modify,
3186 .cbs.cli_show = cli_show_ip_isis_mt_ipv4_unicast,
3187 },
3188 {
3189 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-multicast",
3190 .cbs.modify = lib_interface_isis_multi_topology_ipv4_multicast_modify,
3191 .cbs.cli_show = cli_show_ip_isis_mt_ipv4_multicast,
3192 },
3193 {
3194 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-management",
3195 .cbs.modify = lib_interface_isis_multi_topology_ipv4_management_modify,
3196 .cbs.cli_show = cli_show_ip_isis_mt_ipv4_mgmt,
3197 },
3198 {
3199 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-unicast",
3200 .cbs.modify = lib_interface_isis_multi_topology_ipv6_unicast_modify,
3201 .cbs.cli_show = cli_show_ip_isis_mt_ipv6_unicast,
3202 },
3203 {
3204 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-multicast",
3205 .cbs.modify = lib_interface_isis_multi_topology_ipv6_multicast_modify,
3206 .cbs.cli_show = cli_show_ip_isis_mt_ipv6_multicast,
3207 },
3208 {
3209 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-management",
3210 .cbs.modify = lib_interface_isis_multi_topology_ipv6_management_modify,
3211 .cbs.cli_show = cli_show_ip_isis_mt_ipv6_mgmt,
3212 },
3213 {
3214 .xpath = "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-dstsrc",
3215 .cbs.modify = lib_interface_isis_multi_topology_ipv6_dstsrc_modify,
3216 .cbs.cli_show = cli_show_ip_isis_mt_ipv6_dstsrc,
3217 },
3218 {
3219 .xpath = NULL,
3220 },
3221 }
3222 };