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