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