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