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