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