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