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