2 * Copyright (C) 2001,2002 Sampo Saaristo
3 * Tampere University of Technology
4 * Institute of Communications Engineering
5 * Copyright (C) 2018 Volta Networks
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)
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
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
24 #include "northbound.h"
29 #include "isisd/isis_bfd.h"
30 #include "isisd/isis_constants.h"
31 #include "isisd/isis_common.h"
32 #include "isisd/isis_flags.h"
33 #include "isisd/isis_circuit.h"
34 #include "isisd/isisd.h"
35 #include "isisd/isis_lsp.h"
36 #include "isisd/isis_pdu.h"
37 #include "isisd/isis_dynhn.h"
38 #include "isisd/isis_misc.h"
39 #include "isisd/isis_csm.h"
40 #include "isisd/isis_adjacency.h"
41 #include "isisd/isis_spf.h"
42 #include "isisd/isis_te.h"
43 #include "isisd/isis_memory.h"
44 #include "isisd/isis_mt.h"
45 #include "isisd/isis_cli.h"
46 #include "isisd/isis_redist.h"
47 #include "lib/spf_backoff.h"
48 #include "lib/lib_errors.h"
52 * XPath: /frr-isisd:isis/instance
54 static int isis_instance_create(enum nb_event event
,
55 const struct lyd_node
*dnode
,
56 union nb_resource
*resource
)
58 struct isis_area
*area
;
61 if (event
!= NB_EV_APPLY
)
64 area_tag
= yang_dnode_get_string(dnode
, "./area-tag");
65 area
= isis_area_lookup(area_tag
);
67 return NB_ERR_INCONSISTENCY
;
69 area
= isis_area_create(area_tag
);
70 /* save area in dnode to avoid looking it up all the time */
71 nb_running_set_entry(dnode
, area
);
76 static int isis_instance_destroy(enum nb_event event
,
77 const struct lyd_node
*dnode
)
79 struct isis_area
*area
;
81 if (event
!= NB_EV_APPLY
)
84 area
= nb_running_unset_entry(dnode
);
85 isis_area_destroy(area
->area_tag
);
91 * XPath: /frr-isisd:isis/instance/is-type
93 static int isis_instance_is_type_modify(enum nb_event event
,
94 const struct lyd_node
*dnode
,
95 union nb_resource
*resource
)
97 struct isis_area
*area
;
100 if (event
!= NB_EV_APPLY
)
103 area
= nb_running_get_entry(dnode
, NULL
, true);
104 type
= yang_dnode_get_enum(dnode
, NULL
);
105 isis_area_is_type_set(area
, type
);
111 * XPath: /frr-isisd:isis/instance/area-address
113 static int isis_instance_area_address_create(enum nb_event event
,
114 const struct lyd_node
*dnode
,
115 union nb_resource
*resource
)
117 struct isis_area
*area
;
118 struct area_addr addr
, *addrr
= NULL
, *addrp
= NULL
;
119 struct listnode
*node
;
121 const char *net_title
= yang_dnode_get_string(dnode
, NULL
);
125 addr
.addr_len
= dotformat2buff(buff
, net_title
);
126 memcpy(addr
.area_addr
, buff
, addr
.addr_len
);
127 if (addr
.area_addr
[addr
.addr_len
- 1] != 0) {
129 EC_LIB_NB_CB_CONFIG_VALIDATE
,
130 "nsel byte (last byte) in area address must be 0");
131 return NB_ERR_VALIDATION
;
133 if (isis
->sysid_set
) {
134 /* Check that the SystemID portions match */
135 if (memcmp(isis
->sysid
, GETSYSID((&addr
)),
138 EC_LIB_NB_CB_CONFIG_VALIDATE
,
139 "System ID must not change when defining additional area addresses");
140 return NB_ERR_VALIDATION
;
145 addrr
= XMALLOC(MTYPE_ISIS_AREA_ADDR
, sizeof(struct area_addr
));
146 addrr
->addr_len
= dotformat2buff(buff
, net_title
);
147 memcpy(addrr
->area_addr
, buff
, addrr
->addr_len
);
148 resource
->ptr
= addrr
;
151 XFREE(MTYPE_ISIS_AREA_ADDR
, resource
->ptr
);
154 area
= nb_running_get_entry(dnode
, NULL
, true);
155 addrr
= resource
->ptr
;
157 if (isis
->sysid_set
== 0) {
159 * First area address - get the SystemID for this router
161 memcpy(isis
->sysid
, GETSYSID(addrr
), ISIS_SYS_ID_LEN
);
164 /* check that we don't already have this address */
165 for (ALL_LIST_ELEMENTS_RO(area
->area_addrs
, node
,
167 if ((addrp
->addr_len
+ ISIS_SYS_ID_LEN
169 != (addrr
->addr_len
))
171 if (!memcmp(addrp
->area_addr
, addrr
->area_addr
,
173 XFREE(MTYPE_ISIS_AREA_ADDR
, addrr
);
174 return NB_OK
; /* silent fail */
179 /*Forget the systemID part of the address */
180 addrr
->addr_len
-= (ISIS_SYS_ID_LEN
+ ISIS_NSEL_LEN
);
181 assert(area
->area_addrs
); /* to silence scan-build sillyness */
182 listnode_add(area
->area_addrs
, addrr
);
184 /* only now we can safely generate our LSPs for this area */
185 if (listcount(area
->area_addrs
) > 0) {
186 if (area
->is_type
& IS_LEVEL_1
)
187 lsp_generate(area
, IS_LEVEL_1
);
188 if (area
->is_type
& IS_LEVEL_2
)
189 lsp_generate(area
, IS_LEVEL_2
);
197 static int isis_instance_area_address_destroy(enum nb_event event
,
198 const struct lyd_node
*dnode
)
200 struct area_addr addr
, *addrp
= NULL
;
201 struct listnode
*node
;
203 struct isis_area
*area
;
204 const char *net_title
;
206 if (event
!= NB_EV_APPLY
)
209 net_title
= yang_dnode_get_string(dnode
, NULL
);
210 addr
.addr_len
= dotformat2buff(buff
, net_title
);
211 memcpy(addr
.area_addr
, buff
, (int)addr
.addr_len
);
212 area
= nb_running_get_entry(dnode
, NULL
, true);
213 for (ALL_LIST_ELEMENTS_RO(area
->area_addrs
, node
, addrp
)) {
214 if ((addrp
->addr_len
+ ISIS_SYS_ID_LEN
+ 1) == addr
.addr_len
215 && !memcmp(addrp
->area_addr
, addr
.area_addr
, addr
.addr_len
))
219 return NB_ERR_INCONSISTENCY
;
221 listnode_delete(area
->area_addrs
, addrp
);
222 XFREE(MTYPE_ISIS_AREA_ADDR
, addrp
);
224 * Last area address - reset the SystemID for this router
226 if (listcount(area
->area_addrs
) == 0) {
227 memset(isis
->sysid
, 0, ISIS_SYS_ID_LEN
);
229 if (isis
->debugs
& DEBUG_EVENTS
)
230 zlog_debug("Router has no SystemID");
237 * XPath: /frr-isisd:isis/instance/dynamic-hostname
239 static int isis_instance_dynamic_hostname_modify(enum nb_event event
,
240 const struct lyd_node
*dnode
,
241 union nb_resource
*resource
)
243 struct isis_area
*area
;
245 if (event
!= NB_EV_APPLY
)
248 area
= nb_running_get_entry(dnode
, NULL
, true);
249 isis_area_dynhostname_set(area
, yang_dnode_get_bool(dnode
, NULL
));
255 * XPath: /frr-isisd:isis/instance/attached
257 static int isis_instance_attached_modify(enum nb_event event
,
258 const struct lyd_node
*dnode
,
259 union nb_resource
*resource
)
261 struct isis_area
*area
;
264 if (event
!= NB_EV_APPLY
)
267 area
= nb_running_get_entry(dnode
, NULL
, true);
268 attached
= yang_dnode_get_bool(dnode
, NULL
);
269 isis_area_attached_bit_set(area
, attached
);
275 * XPath: /frr-isisd:isis/instance/overload
277 static int isis_instance_overload_modify(enum nb_event event
,
278 const struct lyd_node
*dnode
,
279 union nb_resource
*resource
)
281 struct isis_area
*area
;
284 if (event
!= NB_EV_APPLY
)
287 area
= nb_running_get_entry(dnode
, NULL
, true);
288 overload
= yang_dnode_get_bool(dnode
, NULL
);
289 isis_area_overload_bit_set(area
, overload
);
295 * XPath: /frr-isisd:isis/instance/metric-style
297 static int isis_instance_metric_style_modify(enum nb_event event
,
298 const struct lyd_node
*dnode
,
299 union nb_resource
*resource
)
301 struct isis_area
*area
;
302 bool old_metric
, new_metric
;
303 enum isis_metric_style metric_style
= yang_dnode_get_enum(dnode
, NULL
);
305 if (event
!= NB_EV_APPLY
)
308 area
= nb_running_get_entry(dnode
, NULL
, true);
309 old_metric
= (metric_style
== ISIS_WIDE_METRIC
) ? false : true;
310 new_metric
= (metric_style
== ISIS_NARROW_METRIC
) ? false : true;
311 isis_area_metricstyle_set(area
, old_metric
, new_metric
);
317 * XPath: /frr-isisd:isis/instance/purge-originator
319 static int isis_instance_purge_originator_modify(enum nb_event event
,
320 const struct lyd_node
*dnode
,
321 union nb_resource
*resource
)
323 struct isis_area
*area
;
325 if (event
!= NB_EV_APPLY
)
328 area
= nb_running_get_entry(dnode
, NULL
, true);
329 area
->purge_originator
= yang_dnode_get_bool(dnode
, NULL
);
335 * XPath: /frr-isisd:isis/instance/lsp/mtu
337 static int isis_instance_lsp_mtu_modify(enum nb_event event
,
338 const struct lyd_node
*dnode
,
339 union nb_resource
*resource
)
341 struct listnode
*node
;
342 struct isis_circuit
*circuit
;
343 uint16_t lsp_mtu
= yang_dnode_get_uint16(dnode
, NULL
);
344 struct isis_area
*area
;
348 area
= nb_running_get_entry(dnode
, NULL
, false);
351 for (ALL_LIST_ELEMENTS_RO(area
->circuit_list
, node
, circuit
)) {
352 if (circuit
->state
!= C_STATE_INIT
353 && circuit
->state
!= C_STATE_UP
)
355 if (lsp_mtu
> isis_circuit_pdu_size(circuit
)) {
357 EC_LIB_NB_CB_CONFIG_VALIDATE
,
358 "ISIS area contains circuit %s, which has a maximum PDU size of %zu",
359 circuit
->interface
->name
,
360 isis_circuit_pdu_size(circuit
));
361 return NB_ERR_VALIDATION
;
369 area
= nb_running_get_entry(dnode
, NULL
, true);
370 isis_area_lsp_mtu_set(area
, lsp_mtu
);
378 * XPath: /frr-isisd:isis/instance/lsp/refresh-interval/level-1
381 isis_instance_lsp_refresh_interval_level_1_modify(enum nb_event event
,
382 const struct lyd_node
*dnode
,
383 union nb_resource
*resource
)
385 struct isis_area
*area
;
388 if (event
!= NB_EV_APPLY
)
391 refr_int
= yang_dnode_get_uint16(dnode
, NULL
);
392 area
= nb_running_get_entry(dnode
, NULL
, true);
393 isis_area_lsp_refresh_set(area
, IS_LEVEL_1
, refr_int
);
399 * XPath: /frr-isisd:isis/instance/lsp/refresh-interval/level-2
402 isis_instance_lsp_refresh_interval_level_2_modify(enum nb_event event
,
403 const struct lyd_node
*dnode
,
404 union nb_resource
*resource
)
406 struct isis_area
*area
;
409 if (event
!= NB_EV_APPLY
)
412 refr_int
= yang_dnode_get_uint16(dnode
, NULL
);
413 area
= nb_running_get_entry(dnode
, NULL
, true);
414 isis_area_lsp_refresh_set(area
, IS_LEVEL_2
, refr_int
);
420 * XPath: /frr-isisd:isis/instance/lsp/maximum-lifetime/level-1
423 isis_instance_lsp_maximum_lifetime_level_1_modify(enum nb_event event
,
424 const struct lyd_node
*dnode
,
425 union nb_resource
*resource
)
427 struct isis_area
*area
;
430 if (event
!= NB_EV_APPLY
)
433 max_lt
= yang_dnode_get_uint16(dnode
, NULL
);
434 area
= nb_running_get_entry(dnode
, NULL
, true);
435 isis_area_max_lsp_lifetime_set(area
, IS_LEVEL_1
, max_lt
);
441 * XPath: /frr-isisd:isis/instance/lsp/maximum-lifetime/level-2
444 isis_instance_lsp_maximum_lifetime_level_2_modify(enum nb_event event
,
445 const struct lyd_node
*dnode
,
446 union nb_resource
*resource
)
448 struct isis_area
*area
;
451 if (event
!= NB_EV_APPLY
)
454 max_lt
= yang_dnode_get_uint16(dnode
, NULL
);
455 area
= nb_running_get_entry(dnode
, NULL
, true);
456 isis_area_max_lsp_lifetime_set(area
, IS_LEVEL_2
, max_lt
);
462 * XPath: /frr-isisd:isis/instance/lsp/generation-interval/level-1
464 static int isis_instance_lsp_generation_interval_level_1_modify(
465 enum nb_event event
, const struct lyd_node
*dnode
,
466 union nb_resource
*resource
)
468 struct isis_area
*area
;
471 if (event
!= NB_EV_APPLY
)
474 gen_int
= yang_dnode_get_uint16(dnode
, NULL
);
475 area
= nb_running_get_entry(dnode
, NULL
, true);
476 area
->lsp_gen_interval
[0] = gen_int
;
482 * XPath: /frr-isisd:isis/instance/lsp/generation-interval/level-2
484 static int isis_instance_lsp_generation_interval_level_2_modify(
485 enum nb_event event
, const struct lyd_node
*dnode
,
486 union nb_resource
*resource
)
488 struct isis_area
*area
;
491 if (event
!= NB_EV_APPLY
)
494 gen_int
= yang_dnode_get_uint16(dnode
, NULL
);
495 area
= nb_running_get_entry(dnode
, NULL
, true);
496 area
->lsp_gen_interval
[1] = gen_int
;
502 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay
504 static void ietf_backoff_delay_apply_finish(const struct lyd_node
*dnode
)
506 long init_delay
= yang_dnode_get_uint16(dnode
, "./init-delay");
507 long short_delay
= yang_dnode_get_uint16(dnode
, "./short-delay");
508 long long_delay
= yang_dnode_get_uint16(dnode
, "./long-delay");
509 long holddown
= yang_dnode_get_uint16(dnode
, "./hold-down");
510 long timetolearn
= yang_dnode_get_uint16(dnode
, "./time-to-learn");
511 struct isis_area
*area
= nb_running_get_entry(dnode
, NULL
, true);
512 size_t bufsiz
= strlen(area
->area_tag
) + sizeof("IS-IS Lx");
513 char *buf
= XCALLOC(MTYPE_TMP
, bufsiz
);
515 snprintf(buf
, bufsiz
, "IS-IS %s L1", area
->area_tag
);
516 spf_backoff_free(area
->spf_delay_ietf
[0]);
517 area
->spf_delay_ietf
[0] =
518 spf_backoff_new(master
, buf
, init_delay
, short_delay
,
519 long_delay
, holddown
, timetolearn
);
521 snprintf(buf
, bufsiz
, "IS-IS %s L2", area
->area_tag
);
522 spf_backoff_free(area
->spf_delay_ietf
[1]);
523 area
->spf_delay_ietf
[1] =
524 spf_backoff_new(master
, buf
, init_delay
, short_delay
,
525 long_delay
, holddown
, timetolearn
);
527 XFREE(MTYPE_TMP
, buf
);
531 isis_instance_spf_ietf_backoff_delay_create(enum nb_event event
,
532 const struct lyd_node
*dnode
,
533 union nb_resource
*resource
)
535 /* All the work is done in the apply_finish */
540 isis_instance_spf_ietf_backoff_delay_destroy(enum nb_event event
,
541 const struct lyd_node
*dnode
)
543 struct isis_area
*area
;
545 if (event
!= NB_EV_APPLY
)
548 area
= nb_running_get_entry(dnode
, NULL
, true);
549 spf_backoff_free(area
->spf_delay_ietf
[0]);
550 spf_backoff_free(area
->spf_delay_ietf
[1]);
551 area
->spf_delay_ietf
[0] = NULL
;
552 area
->spf_delay_ietf
[1] = NULL
;
558 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay/init-delay
560 static int isis_instance_spf_ietf_backoff_delay_init_delay_modify(
561 enum nb_event event
, const struct lyd_node
*dnode
,
562 union nb_resource
*resource
)
564 /* All the work is done in the apply_finish */
569 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay/short-delay
571 static int isis_instance_spf_ietf_backoff_delay_short_delay_modify(
572 enum nb_event event
, const struct lyd_node
*dnode
,
573 union nb_resource
*resource
)
575 /* All the work is done in the apply_finish */
580 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay/long-delay
582 static int isis_instance_spf_ietf_backoff_delay_long_delay_modify(
583 enum nb_event event
, const struct lyd_node
*dnode
,
584 union nb_resource
*resource
)
586 /* All the work is done in the apply_finish */
591 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay/hold-down
593 static int isis_instance_spf_ietf_backoff_delay_hold_down_modify(
594 enum nb_event event
, const struct lyd_node
*dnode
,
595 union nb_resource
*resource
)
597 /* All the work is done in the apply_finish */
602 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay/time-to-learn
604 static int isis_instance_spf_ietf_backoff_delay_time_to_learn_modify(
605 enum nb_event event
, const struct lyd_node
*dnode
,
606 union nb_resource
*resource
)
608 /* All the work is done in the apply_finish */
613 * XPath: /frr-isisd:isis/instance/spf/minimum-interval/level-1
616 isis_instance_spf_minimum_interval_level_1_modify(enum nb_event event
,
617 const struct lyd_node
*dnode
,
618 union nb_resource
*resource
)
620 struct isis_area
*area
;
622 if (event
!= NB_EV_APPLY
)
625 area
= nb_running_get_entry(dnode
, NULL
, true);
626 area
->min_spf_interval
[0] = yang_dnode_get_uint16(dnode
, NULL
);
632 * XPath: /frr-isisd:isis/instance/spf/minimum-interval/level-2
635 isis_instance_spf_minimum_interval_level_2_modify(enum nb_event event
,
636 const struct lyd_node
*dnode
,
637 union nb_resource
*resource
)
639 struct isis_area
*area
;
641 if (event
!= NB_EV_APPLY
)
644 area
= nb_running_get_entry(dnode
, NULL
, true);
645 area
->min_spf_interval
[1] = yang_dnode_get_uint16(dnode
, NULL
);
651 * XPath: /frr-isisd:isis/instance/area-password
653 static void area_password_apply_finish(const struct lyd_node
*dnode
)
655 const char *password
= yang_dnode_get_string(dnode
, "./password");
656 struct isis_area
*area
= nb_running_get_entry(dnode
, NULL
, true);
657 int pass_type
= yang_dnode_get_enum(dnode
, "./password-type");
658 uint8_t snp_auth
= yang_dnode_get_enum(dnode
, "./authenticate-snp");
661 case ISIS_PASSWD_TYPE_CLEARTXT
:
662 isis_area_passwd_cleartext_set(area
, IS_LEVEL_1
, password
,
665 case ISIS_PASSWD_TYPE_HMAC_MD5
:
666 isis_area_passwd_hmac_md5_set(area
, IS_LEVEL_1
, password
,
672 static int isis_instance_area_password_create(enum nb_event event
,
673 const struct lyd_node
*dnode
,
674 union nb_resource
*resource
)
676 /* actual setting is done in apply_finish */
680 static int isis_instance_area_password_destroy(enum nb_event event
,
681 const struct lyd_node
*dnode
)
683 struct isis_area
*area
;
685 if (event
!= NB_EV_APPLY
)
688 area
= nb_running_get_entry(dnode
, NULL
, true);
689 isis_area_passwd_unset(area
, IS_LEVEL_1
);
695 * XPath: /frr-isisd:isis/instance/area-password/password
698 isis_instance_area_password_password_modify(enum nb_event event
,
699 const struct lyd_node
*dnode
,
700 union nb_resource
*resource
)
702 /* actual setting is done in apply_finish */
707 * XPath: /frr-isisd:isis/instance/area-password/password-type
710 isis_instance_area_password_password_type_modify(enum nb_event event
,
711 const struct lyd_node
*dnode
,
712 union nb_resource
*resource
)
714 /* actual setting is done in apply_finish */
719 * XPath: /frr-isisd:isis/instance/area-password/authenticate-snp
721 static int isis_instance_area_password_authenticate_snp_modify(
722 enum nb_event event
, const struct lyd_node
*dnode
,
723 union nb_resource
*resource
)
725 /* actual setting is done in apply_finish */
730 * XPath: /frr-isisd:isis/instance/domain-password
732 static void domain_password_apply_finish(const struct lyd_node
*dnode
)
734 const char *password
= yang_dnode_get_string(dnode
, "./password");
735 struct isis_area
*area
= nb_running_get_entry(dnode
, NULL
, true);
736 int pass_type
= yang_dnode_get_enum(dnode
, "./password-type");
737 uint8_t snp_auth
= yang_dnode_get_enum(dnode
, "./authenticate-snp");
740 case ISIS_PASSWD_TYPE_CLEARTXT
:
741 isis_area_passwd_cleartext_set(area
, IS_LEVEL_2
, password
,
744 case ISIS_PASSWD_TYPE_HMAC_MD5
:
745 isis_area_passwd_hmac_md5_set(area
, IS_LEVEL_2
, password
,
751 static int isis_instance_domain_password_create(enum nb_event event
,
752 const struct lyd_node
*dnode
,
753 union nb_resource
*resource
)
755 /* actual setting is done in apply_finish */
759 static int isis_instance_domain_password_destroy(enum nb_event event
,
760 const struct lyd_node
*dnode
)
762 struct isis_area
*area
;
764 if (event
!= NB_EV_APPLY
)
767 area
= nb_running_get_entry(dnode
, NULL
, true);
768 isis_area_passwd_unset(area
, IS_LEVEL_2
);
774 * XPath: /frr-isisd:isis/instance/domain-password/password
777 isis_instance_domain_password_password_modify(enum nb_event event
,
778 const struct lyd_node
*dnode
,
779 union nb_resource
*resource
)
781 /* actual setting is done in apply_finish */
786 * XPath: /frr-isisd:isis/instance/domain-password/password-type
789 isis_instance_domain_password_password_type_modify(enum nb_event event
,
790 const struct lyd_node
*dnode
,
791 union nb_resource
*resource
)
793 /* actual setting is done in apply_finish */
798 * XPath: /frr-isisd:isis/instance/domain-password/authenticate-snp
800 static int isis_instance_domain_password_authenticate_snp_modify(
801 enum nb_event event
, const struct lyd_node
*dnode
,
802 union nb_resource
*resource
)
804 /* actual setting is done in apply_finish */
809 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv4
811 static void default_info_origin_apply_finish(const struct lyd_node
*dnode
,
814 int originate_type
= DEFAULT_ORIGINATE
;
815 unsigned long metric
= 0;
816 const char *routemap
= NULL
;
817 struct isis_area
*area
= nb_running_get_entry(dnode
, NULL
, true);
818 int level
= yang_dnode_get_enum(dnode
, "./level");
820 if (yang_dnode_get_bool(dnode
, "./always")) {
821 originate_type
= DEFAULT_ORIGINATE_ALWAYS
;
822 } else if (family
== AF_INET6
) {
824 "%s: Zebra doesn't implement default-originate for IPv6 yet, so use with care or use default-originate always.",
828 if (yang_dnode_exists(dnode
, "./metric"))
829 metric
= yang_dnode_get_uint32(dnode
, "./metric");
830 if (yang_dnode_exists(dnode
, "./route-map"))
831 routemap
= yang_dnode_get_string(dnode
, "./route-map");
833 isis_redist_set(area
, level
, family
, DEFAULT_ROUTE
, metric
, routemap
,
837 static void default_info_origin_ipv4_apply_finish(const struct lyd_node
*dnode
)
839 default_info_origin_apply_finish(dnode
, AF_INET
);
842 static void default_info_origin_ipv6_apply_finish(const struct lyd_node
*dnode
)
844 default_info_origin_apply_finish(dnode
, AF_INET6
);
847 static int isis_instance_default_information_originate_ipv4_create(
848 enum nb_event event
, const struct lyd_node
*dnode
,
849 union nb_resource
*resource
)
851 /* It's all done by default_info_origin_apply_finish */
855 static int isis_instance_default_information_originate_ipv4_destroy(
856 enum nb_event event
, const struct lyd_node
*dnode
)
858 struct isis_area
*area
;
861 if (event
!= NB_EV_APPLY
)
864 area
= nb_running_get_entry(dnode
, NULL
, true);
865 level
= yang_dnode_get_enum(dnode
, "./level");
866 isis_redist_unset(area
, level
, AF_INET
, DEFAULT_ROUTE
);
872 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv4/always
874 static int isis_instance_default_information_originate_ipv4_always_modify(
875 enum nb_event event
, const struct lyd_node
*dnode
,
876 union nb_resource
*resource
)
878 /* It's all done by default_info_origin_apply_finish */
883 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv4/route-map
885 static int isis_instance_default_information_originate_ipv4_route_map_modify(
886 enum nb_event event
, const struct lyd_node
*dnode
,
887 union nb_resource
*resource
)
889 /* It's all done by default_info_origin_apply_finish */
893 static int isis_instance_default_information_originate_ipv4_route_map_destroy(
894 enum nb_event event
, const struct lyd_node
*dnode
)
896 /* It's all done by default_info_origin_apply_finish */
901 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv4/metric
903 static int isis_instance_default_information_originate_ipv4_metric_modify(
904 enum nb_event event
, const struct lyd_node
*dnode
,
905 union nb_resource
*resource
)
907 /* It's all done by default_info_origin_apply_finish */
912 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv6
914 static int isis_instance_default_information_originate_ipv6_create(
915 enum nb_event event
, const struct lyd_node
*dnode
,
916 union nb_resource
*resource
)
918 /* It's all done by default_info_origin_apply_finish */
922 static int isis_instance_default_information_originate_ipv6_destroy(
923 enum nb_event event
, const struct lyd_node
*dnode
)
925 struct isis_area
*area
;
928 if (event
!= NB_EV_APPLY
)
931 area
= nb_running_get_entry(dnode
, NULL
, true);
932 level
= yang_dnode_get_enum(dnode
, "./level");
933 isis_redist_unset(area
, level
, AF_INET6
, DEFAULT_ROUTE
);
939 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv6/always
941 static int isis_instance_default_information_originate_ipv6_always_modify(
942 enum nb_event event
, const struct lyd_node
*dnode
,
943 union nb_resource
*resource
)
945 /* It's all done by default_info_origin_apply_finish */
950 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv6/route-map
952 static int isis_instance_default_information_originate_ipv6_route_map_modify(
953 enum nb_event event
, const struct lyd_node
*dnode
,
954 union nb_resource
*resource
)
956 /* It's all done by default_info_origin_apply_finish */
960 static int isis_instance_default_information_originate_ipv6_route_map_destroy(
961 enum nb_event event
, const struct lyd_node
*dnode
)
963 /* It's all done by default_info_origin_apply_finish */
968 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv6/metric
970 static int isis_instance_default_information_originate_ipv6_metric_modify(
971 enum nb_event event
, const struct lyd_node
*dnode
,
972 union nb_resource
*resource
)
974 /* It's all done by default_info_origin_apply_finish */
979 * XPath: /frr-isisd:isis/instance/redistribute/ipv4
981 static void redistribute_apply_finish(const struct lyd_node
*dnode
, int family
)
983 assert(family
== AF_INET
|| family
== AF_INET6
);
985 unsigned long metric
= 0;
986 const char *routemap
= NULL
;
987 struct isis_area
*area
;
989 type
= yang_dnode_get_enum(dnode
, "./protocol");
990 level
= yang_dnode_get_enum(dnode
, "./level");
991 area
= nb_running_get_entry(dnode
, NULL
, true);
993 if (yang_dnode_exists(dnode
, "./metric"))
994 metric
= yang_dnode_get_uint32(dnode
, "./metric");
995 if (yang_dnode_exists(dnode
, "./route-map"))
996 routemap
= yang_dnode_get_string(dnode
, "./route-map");
998 isis_redist_set(area
, level
, family
, type
, metric
, routemap
, 0);
1001 static void redistribute_ipv4_apply_finish(const struct lyd_node
*dnode
)
1003 redistribute_apply_finish(dnode
, AF_INET
);
1006 static void redistribute_ipv6_apply_finish(const struct lyd_node
*dnode
)
1008 redistribute_apply_finish(dnode
, AF_INET6
);
1011 static int isis_instance_redistribute_ipv4_create(enum nb_event event
,
1012 const struct lyd_node
*dnode
,
1013 union nb_resource
*resource
)
1015 /* It's all done by redistribute_apply_finish */
1019 static int isis_instance_redistribute_ipv4_destroy(enum nb_event event
,
1020 const struct lyd_node
*dnode
)
1022 struct isis_area
*area
;
1025 if (event
!= NB_EV_APPLY
)
1028 area
= nb_running_get_entry(dnode
, NULL
, true);
1029 level
= yang_dnode_get_enum(dnode
, "./level");
1030 type
= yang_dnode_get_enum(dnode
, "./protocol");
1031 isis_redist_unset(area
, level
, AF_INET
, type
);
1037 * XPath: /frr-isisd:isis/instance/redistribute/ipv4/route-map
1040 isis_instance_redistribute_ipv4_route_map_modify(enum nb_event event
,
1041 const struct lyd_node
*dnode
,
1042 union nb_resource
*resource
)
1044 /* It's all done by redistribute_apply_finish */
1049 isis_instance_redistribute_ipv4_route_map_destroy(enum nb_event event
,
1050 const struct lyd_node
*dnode
)
1052 /* It's all done by redistribute_apply_finish */
1057 * XPath: /frr-isisd:isis/instance/redistribute/ipv4/metric
1060 isis_instance_redistribute_ipv4_metric_modify(enum nb_event event
,
1061 const struct lyd_node
*dnode
,
1062 union nb_resource
*resource
)
1064 /* It's all done by redistribute_apply_finish */
1069 * XPath: /frr-isisd:isis/instance/redistribute/ipv6
1071 static int isis_instance_redistribute_ipv6_create(enum nb_event event
,
1072 const struct lyd_node
*dnode
,
1073 union nb_resource
*resource
)
1075 /* It's all done by redistribute_apply_finish */
1079 static int isis_instance_redistribute_ipv6_destroy(enum nb_event event
,
1080 const struct lyd_node
*dnode
)
1082 struct isis_area
*area
;
1085 if (event
!= NB_EV_APPLY
)
1088 area
= nb_running_get_entry(dnode
, NULL
, true);
1089 level
= yang_dnode_get_enum(dnode
, "./level");
1090 type
= yang_dnode_get_enum(dnode
, "./protocol");
1091 isis_redist_unset(area
, level
, AF_INET6
, type
);
1097 * XPath: /frr-isisd:isis/instance/redistribute/ipv6/route-map
1100 isis_instance_redistribute_ipv6_route_map_modify(enum nb_event event
,
1101 const struct lyd_node
*dnode
,
1102 union nb_resource
*resource
)
1104 /* It's all done by redistribute_apply_finish */
1109 isis_instance_redistribute_ipv6_route_map_destroy(enum nb_event event
,
1110 const struct lyd_node
*dnode
)
1112 /* It's all done by redistribute_apply_finish */
1117 * XPath: /frr-isisd:isis/instance/redistribute/ipv6/metric
1120 isis_instance_redistribute_ipv6_metric_modify(enum nb_event event
,
1121 const struct lyd_node
*dnode
,
1122 union nb_resource
*resource
)
1124 /* It's all done by redistribute_apply_finish */
1129 * XPath: /frr-isisd:isis/instance/multi-topology/ipv4-multicast
1131 static int isis_multi_topology_common(enum nb_event event
,
1132 const struct lyd_node
*dnode
,
1133 const char *topology
, bool create
)
1135 struct isis_area
*area
;
1136 struct isis_area_mt_setting
*setting
;
1137 uint16_t mtid
= isis_str2mtid(topology
);
1140 case NB_EV_VALIDATE
:
1141 if (mtid
== (uint16_t)-1) {
1142 flog_warn(EC_LIB_NB_CB_CONFIG_VALIDATE
,
1143 "Unknown topology %s", topology
);
1144 return NB_ERR_VALIDATION
;
1151 area
= nb_running_get_entry(dnode
, NULL
, true);
1152 setting
= area_get_mt_setting(area
, mtid
);
1153 setting
->enabled
= create
;
1154 lsp_regenerate_schedule(area
, IS_LEVEL_1
| IS_LEVEL_2
, 0);
1161 static int isis_multi_topology_overload_common(enum nb_event event
,
1162 const struct lyd_node
*dnode
,
1163 const char *topology
)
1165 struct isis_area
*area
;
1166 struct isis_area_mt_setting
*setting
;
1167 uint16_t mtid
= isis_str2mtid(topology
);
1169 /* validation is done in isis_multi_topology_common */
1170 if (event
!= NB_EV_APPLY
)
1173 area
= nb_running_get_entry(dnode
, NULL
, true);
1174 setting
= area_get_mt_setting(area
, mtid
);
1175 setting
->overload
= yang_dnode_get_bool(dnode
, NULL
);
1176 if (setting
->enabled
)
1177 lsp_regenerate_schedule(area
, IS_LEVEL_1
| IS_LEVEL_2
, 0);
1183 isis_instance_multi_topology_ipv4_multicast_create(enum nb_event event
,
1184 const struct lyd_node
*dnode
,
1185 union nb_resource
*resource
)
1187 return isis_multi_topology_common(event
, dnode
, "ipv4-multicast", true);
1191 isis_instance_multi_topology_ipv4_multicast_destroy(enum nb_event event
,
1192 const struct lyd_node
*dnode
)
1194 return isis_multi_topology_common(event
, dnode
, "ipv4-multicast",
1199 * XPath: /frr-isisd:isis/instance/multi-topology/ipv4-multicast/overload
1201 static int isis_instance_multi_topology_ipv4_multicast_overload_modify(
1202 enum nb_event event
, const struct lyd_node
*dnode
,
1203 union nb_resource
*resource
)
1205 return isis_multi_topology_overload_common(event
, dnode
,
1210 * XPath: /frr-isisd:isis/instance/multi-topology/ipv4-management
1212 static int isis_instance_multi_topology_ipv4_management_create(
1213 enum nb_event event
, const struct lyd_node
*dnode
,
1214 union nb_resource
*resource
)
1216 return isis_multi_topology_common(event
, dnode
, "ipv4-mgmt", true);
1219 static int isis_instance_multi_topology_ipv4_management_destroy(
1220 enum nb_event event
, const struct lyd_node
*dnode
)
1222 return isis_multi_topology_common(event
, dnode
, "ipv4-mgmt", false);
1226 * XPath: /frr-isisd:isis/instance/multi-topology/ipv4-management/overload
1228 static int isis_instance_multi_topology_ipv4_management_overload_modify(
1229 enum nb_event event
, const struct lyd_node
*dnode
,
1230 union nb_resource
*resource
)
1232 return isis_multi_topology_overload_common(event
, dnode
, "ipv4-mgmt");
1236 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-unicast
1239 isis_instance_multi_topology_ipv6_unicast_create(enum nb_event event
,
1240 const struct lyd_node
*dnode
,
1241 union nb_resource
*resource
)
1243 return isis_multi_topology_common(event
, dnode
, "ipv6-unicast", true);
1247 isis_instance_multi_topology_ipv6_unicast_destroy(enum nb_event event
,
1248 const struct lyd_node
*dnode
)
1250 return isis_multi_topology_common(event
, dnode
, "ipv6-unicast", false);
1254 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-unicast/overload
1256 static int isis_instance_multi_topology_ipv6_unicast_overload_modify(
1257 enum nb_event event
, const struct lyd_node
*dnode
,
1258 union nb_resource
*resource
)
1260 return isis_multi_topology_overload_common(event
, dnode
,
1265 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-multicast
1268 isis_instance_multi_topology_ipv6_multicast_create(enum nb_event event
,
1269 const struct lyd_node
*dnode
,
1270 union nb_resource
*resource
)
1272 return isis_multi_topology_common(event
, dnode
, "ipv6-multicast", true);
1276 isis_instance_multi_topology_ipv6_multicast_destroy(enum nb_event event
,
1277 const struct lyd_node
*dnode
)
1279 return isis_multi_topology_common(event
, dnode
, "ipv6-multicast",
1284 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-multicast/overload
1286 static int isis_instance_multi_topology_ipv6_multicast_overload_modify(
1287 enum nb_event event
, const struct lyd_node
*dnode
,
1288 union nb_resource
*resource
)
1290 return isis_multi_topology_overload_common(event
, dnode
,
1295 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-management
1297 static int isis_instance_multi_topology_ipv6_management_create(
1298 enum nb_event event
, const struct lyd_node
*dnode
,
1299 union nb_resource
*resource
)
1301 return isis_multi_topology_common(event
, dnode
, "ipv6-mgmt", true);
1304 static int isis_instance_multi_topology_ipv6_management_destroy(
1305 enum nb_event event
, const struct lyd_node
*dnode
)
1307 return isis_multi_topology_common(event
, dnode
, "ipv6-mgmt", false);
1311 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-management/overload
1313 static int isis_instance_multi_topology_ipv6_management_overload_modify(
1314 enum nb_event event
, const struct lyd_node
*dnode
,
1315 union nb_resource
*resource
)
1317 return isis_multi_topology_overload_common(event
, dnode
, "ipv6-mgmt");
1321 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-dstsrc
1324 isis_instance_multi_topology_ipv6_dstsrc_create(enum nb_event event
,
1325 const struct lyd_node
*dnode
,
1326 union nb_resource
*resource
)
1328 return isis_multi_topology_common(event
, dnode
, "ipv6-dstsrc", true);
1332 isis_instance_multi_topology_ipv6_dstsrc_destroy(enum nb_event event
,
1333 const struct lyd_node
*dnode
)
1335 return isis_multi_topology_common(event
, dnode
, "ipv6-dstsrc", false);
1339 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-dstsrc/overload
1341 static int isis_instance_multi_topology_ipv6_dstsrc_overload_modify(
1342 enum nb_event event
, const struct lyd_node
*dnode
,
1343 union nb_resource
*resource
)
1345 return isis_multi_topology_overload_common(event
, dnode
, "ipv6-dstsrc");
1349 * XPath: /frr-isisd:isis/instance/log-adjacency-changes
1352 isis_instance_log_adjacency_changes_modify(enum nb_event event
,
1353 const struct lyd_node
*dnode
,
1354 union nb_resource
*resource
)
1356 struct isis_area
*area
;
1357 bool log
= yang_dnode_get_bool(dnode
, NULL
);
1359 if (event
!= NB_EV_APPLY
)
1362 area
= nb_running_get_entry(dnode
, NULL
, true);
1363 area
->log_adj_changes
= log
? 1 : 0;
1369 * XPath: /frr-isisd:isis/instance/mpls-te
1371 static int isis_instance_mpls_te_create(enum nb_event event
,
1372 const struct lyd_node
*dnode
,
1373 union nb_resource
*resource
)
1375 struct listnode
*node
;
1376 struct isis_area
*area
;
1377 struct isis_circuit
*circuit
;
1379 if (event
!= NB_EV_APPLY
)
1382 area
= nb_running_get_entry(dnode
, NULL
, true);
1383 if (area
->mta
== NULL
) {
1385 struct mpls_te_area
*new;
1387 zlog_debug("ISIS MPLS-TE: Initialize area %s",
1390 new = XCALLOC(MTYPE_ISIS_MPLS_TE
, sizeof(struct mpls_te_area
));
1392 /* Initialize MPLS_TE structure */
1393 new->status
= enable
;
1395 new->inter_as
= off
;
1396 new->interas_areaid
.s_addr
= 0;
1397 new->router_id
.s_addr
= 0;
1401 area
->mta
->status
= enable
;
1405 * Following code is intended to handle two cases;
1407 * 1) MPLS-TE was disabled at startup time, but now become enabled.
1408 * In this case, we must enable MPLS-TE Circuit regarding interface
1410 * 2) MPLS-TE was once enabled then disabled, and now enabled again.
1412 for (ALL_LIST_ELEMENTS_RO(area
->circuit_list
, node
, circuit
)) {
1413 if (circuit
->mtc
== NULL
|| IS_FLOOD_AS(circuit
->mtc
->type
))
1416 if (!IS_MPLS_TE(circuit
->mtc
)
1417 && HAS_LINK_PARAMS(circuit
->interface
))
1418 circuit
->mtc
->status
= enable
;
1422 /* Reoriginate STD_TE & GMPLS circuits */
1424 lsp_regenerate_schedule(circuit
->area
, circuit
->is_type
,
1431 static int isis_instance_mpls_te_destroy(enum nb_event event
,
1432 const struct lyd_node
*dnode
)
1434 struct listnode
*node
;
1435 struct isis_area
*area
;
1436 struct isis_circuit
*circuit
;
1438 if (event
!= NB_EV_APPLY
)
1441 area
= nb_running_get_entry(dnode
, NULL
, true);
1442 if (IS_MPLS_TE(area
->mta
))
1443 area
->mta
->status
= disable
;
1447 /* Flush LSP if circuit engage */
1448 for (ALL_LIST_ELEMENTS_RO(area
->circuit_list
, node
, circuit
)) {
1449 if (circuit
->mtc
== NULL
|| (circuit
->mtc
->status
== disable
))
1452 /* disable MPLS_TE Circuit */
1453 circuit
->mtc
->status
= disable
;
1455 /* Re-originate circuit without STD_TE & GMPLS parameters */
1457 lsp_regenerate_schedule(circuit
->area
, circuit
->is_type
,
1465 * XPath: /frr-isisd:isis/instance/mpls-te/router-address
1467 static int isis_instance_mpls_te_router_address_modify(enum nb_event event
,
1468 const struct lyd_node
*dnode
,
1469 union nb_resource
*resource
)
1471 struct in_addr value
;
1472 struct isis_area
*area
;
1474 if (event
!= NB_EV_APPLY
)
1477 area
= nb_running_get_entry(dnode
, NULL
, true);
1478 /* only proceed if MPLS-TE is enabled */
1479 if (!IS_MPLS_TE(area
->mta
))
1482 /* Update Area Router ID */
1483 yang_dnode_get_ipv4(&value
, dnode
, NULL
);
1484 area
->mta
->router_id
.s_addr
= value
.s_addr
;
1486 /* And re-schedule LSP update */
1487 if (listcount(area
->area_addrs
) > 0)
1488 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1493 static int isis_instance_mpls_te_router_address_destroy(enum nb_event event
,
1494 const struct lyd_node
*dnode
)
1496 struct isis_area
*area
;
1498 if (event
!= NB_EV_APPLY
)
1501 area
= nb_running_get_entry(dnode
, NULL
, true);
1502 /* only proceed if MPLS-TE is enabled */
1503 if (!IS_MPLS_TE(area
->mta
))
1506 /* Reset Area Router ID */
1507 area
->mta
->router_id
.s_addr
= INADDR_ANY
;
1509 /* And re-schedule LSP update */
1510 if (listcount(area
->area_addrs
) > 0)
1511 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1517 * XPath: /frr-interface:lib/interface/frr-isisd:isis
1519 static int lib_interface_isis_create(enum nb_event event
,
1520 const struct lyd_node
*dnode
,
1521 union nb_resource
*resource
)
1523 struct isis_area
*area
;
1524 struct interface
*ifp
;
1525 struct isis_circuit
*circuit
;
1526 const char *area_tag
= yang_dnode_get_string(dnode
, "./area-tag");
1528 if (event
!= NB_EV_APPLY
)
1531 area
= isis_area_lookup(area_tag
);
1532 /* The area should have already be created. We are
1533 * setting the priority of the global isis area creation
1534 * slightly lower, so it should be executed first, but I
1535 * cannot rely on that so here I have to check.
1539 EC_LIB_NB_CB_CONFIG_APPLY
,
1540 "%s: attempt to create circuit for area %s before the area has been created",
1541 __func__
, area_tag
);
1545 ifp
= nb_running_get_entry(dnode
, NULL
, true);
1546 circuit
= isis_circuit_create(area
, ifp
);
1547 assert(circuit
->state
== C_STATE_CONF
|| circuit
->state
== C_STATE_UP
);
1548 nb_running_set_entry(dnode
, circuit
);
1553 static int lib_interface_isis_destroy(enum nb_event event
,
1554 const struct lyd_node
*dnode
)
1556 struct isis_circuit
*circuit
;
1558 if (event
!= NB_EV_APPLY
)
1561 circuit
= nb_running_unset_entry(dnode
);
1563 return NB_ERR_INCONSISTENCY
;
1564 /* delete circuit through csm changes */
1565 switch (circuit
->state
) {
1567 isis_csm_state_change(IF_DOWN_FROM_Z
, circuit
,
1568 circuit
->interface
);
1569 isis_csm_state_change(ISIS_DISABLE
, circuit
, circuit
->area
);
1572 isis_csm_state_change(ISIS_DISABLE
, circuit
, circuit
->area
);
1575 isis_csm_state_change(IF_DOWN_FROM_Z
, circuit
,
1576 circuit
->interface
);
1584 * XPath: /frr-interface:lib/interface/frr-isisd:isis/area-tag
1586 static int lib_interface_isis_area_tag_modify(enum nb_event event
,
1587 const struct lyd_node
*dnode
,
1588 union nb_resource
*resource
)
1590 struct isis_circuit
*circuit
;
1591 struct interface
*ifp
;
1593 const char *area_tag
, *ifname
, *vrfname
;
1595 if (event
== NB_EV_VALIDATE
) {
1596 /* libyang doesn't like relative paths across module boundaries
1598 ifname
= yang_dnode_get_string(dnode
->parent
->parent
, "./name");
1599 vrfname
= yang_dnode_get_string(dnode
->parent
->parent
, "./vrf");
1600 vrf
= vrf_lookup_by_name(vrfname
);
1602 ifp
= if_lookup_by_name(ifname
, vrf
->vrf_id
);
1605 circuit
= circuit_lookup_by_ifp(ifp
, isis
->init_circ_list
);
1606 area_tag
= yang_dnode_get_string(dnode
, NULL
);
1607 if (circuit
&& circuit
->area
&& circuit
->area
->area_tag
1608 && strcmp(circuit
->area
->area_tag
, area_tag
)) {
1609 flog_warn(EC_LIB_NB_CB_CONFIG_VALIDATE
,
1610 "ISIS circuit is already defined on %s",
1611 circuit
->area
->area_tag
);
1612 return NB_ERR_VALIDATION
;
1620 * XPath: /frr-interface:lib/interface/frr-isisd:isis/circuit-type
1622 static int lib_interface_isis_circuit_type_modify(enum nb_event event
,
1623 const struct lyd_node
*dnode
,
1624 union nb_resource
*resource
)
1626 int circ_type
= yang_dnode_get_enum(dnode
, NULL
);
1627 struct isis_circuit
*circuit
;
1628 struct interface
*ifp
;
1630 const char *ifname
, *vrfname
;
1633 case NB_EV_VALIDATE
:
1634 /* libyang doesn't like relative paths across module boundaries
1636 ifname
= yang_dnode_get_string(dnode
->parent
->parent
, "./name");
1637 vrfname
= yang_dnode_get_string(dnode
->parent
->parent
, "./vrf");
1638 vrf
= vrf_lookup_by_name(vrfname
);
1640 ifp
= if_lookup_by_name(ifname
, vrf
->vrf_id
);
1643 circuit
= circuit_lookup_by_ifp(ifp
, isis
->init_circ_list
);
1644 if (circuit
&& circuit
->state
== C_STATE_UP
1645 && circuit
->area
->is_type
!= IS_LEVEL_1_AND_2
1646 && circuit
->area
->is_type
!= circ_type
) {
1647 flog_warn(EC_LIB_NB_CB_CONFIG_VALIDATE
,
1648 "Invalid circuit level for area %s",
1649 circuit
->area
->area_tag
);
1650 return NB_ERR_VALIDATION
;
1657 circuit
= nb_running_get_entry(dnode
, NULL
, true);
1658 isis_circuit_is_type_set(circuit
, circ_type
);
1666 * XPath: /frr-interface:lib/interface/frr-isisd:isis/ipv4-routing
1668 static int lib_interface_isis_ipv4_routing_modify(enum nb_event event
,
1669 const struct lyd_node
*dnode
,
1670 union nb_resource
*resource
)
1673 struct isis_circuit
*circuit
;
1675 if (event
!= NB_EV_APPLY
)
1678 circuit
= nb_running_get_entry(dnode
, NULL
, true);
1679 ipv4
= yang_dnode_get_bool(dnode
, NULL
);
1680 ipv6
= yang_dnode_get_bool(dnode
, "../ipv6-routing");
1681 isis_circuit_af_set(circuit
, ipv4
, ipv6
);
1687 * XPath: /frr-interface:lib/interface/frr-isisd:isis/ipv6-routing
1689 static int lib_interface_isis_ipv6_routing_modify(enum nb_event event
,
1690 const struct lyd_node
*dnode
,
1691 union nb_resource
*resource
)
1694 struct isis_circuit
*circuit
;
1696 if (event
!= NB_EV_APPLY
)
1699 circuit
= nb_running_get_entry(dnode
, NULL
, true);
1700 ipv4
= yang_dnode_exists(dnode
, "../ipv4-routing");
1701 ipv6
= yang_dnode_get_bool(dnode
, NULL
);
1702 isis_circuit_af_set(circuit
, ipv4
, ipv6
);
1708 * XPath: /frr-interface:lib/interface/frr-isisd:isis/bfd-monitoring
1710 static int lib_interface_isis_bfd_monitoring_modify(enum nb_event event
,
1711 const struct lyd_node
*dnode
,
1712 union nb_resource
*resource
)
1714 struct isis_circuit
*circuit
;
1715 bool bfd_monitoring
;
1717 if (event
!= NB_EV_APPLY
)
1720 circuit
= nb_running_get_entry(dnode
, NULL
, true);
1721 bfd_monitoring
= yang_dnode_get_bool(dnode
, NULL
);
1723 if (bfd_monitoring
) {
1724 isis_bfd_circuit_param_set(circuit
, BFD_DEF_MIN_RX
,
1725 BFD_DEF_MIN_TX
, BFD_DEF_DETECT_MULT
,
1728 isis_bfd_circuit_cmd(circuit
, ZEBRA_BFD_DEST_DEREGISTER
);
1729 bfd_info_free(&circuit
->bfd_info
);
1736 * XPath: /frr-interface:lib/interface/frr-isisd:isis/csnp-interval/level-1
1739 lib_interface_isis_csnp_interval_level_1_modify(enum nb_event event
,
1740 const struct lyd_node
*dnode
,
1741 union nb_resource
*resource
)
1743 struct isis_circuit
*circuit
;
1745 if (event
!= NB_EV_APPLY
)
1748 circuit
= nb_running_get_entry(dnode
, NULL
, true);
1749 circuit
->csnp_interval
[0] = yang_dnode_get_uint16(dnode
, NULL
);
1755 * XPath: /frr-interface:lib/interface/frr-isisd:isis/csnp-interval/level-2
1758 lib_interface_isis_csnp_interval_level_2_modify(enum nb_event event
,
1759 const struct lyd_node
*dnode
,
1760 union nb_resource
*resource
)
1762 struct isis_circuit
*circuit
;
1764 if (event
!= NB_EV_APPLY
)
1767 circuit
= nb_running_get_entry(dnode
, NULL
, true);
1768 circuit
->csnp_interval
[1] = yang_dnode_get_uint16(dnode
, NULL
);
1774 * XPath: /frr-interface:lib/interface/frr-isisd:isis/psnp-interval/level-1
1777 lib_interface_isis_psnp_interval_level_1_modify(enum nb_event event
,
1778 const struct lyd_node
*dnode
,
1779 union nb_resource
*resource
)
1781 struct isis_circuit
*circuit
;
1783 if (event
!= NB_EV_APPLY
)
1786 circuit
= nb_running_get_entry(dnode
, NULL
, true);
1787 circuit
->psnp_interval
[0] = yang_dnode_get_uint16(dnode
, NULL
);
1793 * XPath: /frr-interface:lib/interface/frr-isisd:isis/psnp-interval/level-2
1796 lib_interface_isis_psnp_interval_level_2_modify(enum nb_event event
,
1797 const struct lyd_node
*dnode
,
1798 union nb_resource
*resource
)
1800 struct isis_circuit
*circuit
;
1802 if (event
!= NB_EV_APPLY
)
1805 circuit
= nb_running_get_entry(dnode
, NULL
, true);
1806 circuit
->psnp_interval
[1] = yang_dnode_get_uint16(dnode
, NULL
);
1812 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/padding
1814 static int lib_interface_isis_hello_padding_modify(enum nb_event event
,
1815 const struct lyd_node
*dnode
,
1816 union nb_resource
*resource
)
1818 struct isis_circuit
*circuit
;
1820 if (event
!= NB_EV_APPLY
)
1823 circuit
= nb_running_get_entry(dnode
, NULL
, true);
1824 circuit
->pad_hellos
= yang_dnode_get_bool(dnode
, NULL
);
1830 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/interval/level-1
1833 lib_interface_isis_hello_interval_level_1_modify(enum nb_event event
,
1834 const struct lyd_node
*dnode
,
1835 union nb_resource
*resource
)
1837 struct isis_circuit
*circuit
;
1840 if (event
!= NB_EV_APPLY
)
1843 circuit
= nb_running_get_entry(dnode
, NULL
, true);
1844 interval
= yang_dnode_get_uint32(dnode
, NULL
);
1845 circuit
->hello_interval
[0] = interval
;
1851 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/interval/level-2
1854 lib_interface_isis_hello_interval_level_2_modify(enum nb_event event
,
1855 const struct lyd_node
*dnode
,
1856 union nb_resource
*resource
)
1858 struct isis_circuit
*circuit
;
1861 if (event
!= NB_EV_APPLY
)
1864 circuit
= nb_running_get_entry(dnode
, NULL
, true);
1865 interval
= yang_dnode_get_uint32(dnode
, NULL
);
1866 circuit
->hello_interval
[1] = interval
;
1872 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/multiplier/level-1
1875 lib_interface_isis_hello_multiplier_level_1_modify(enum nb_event event
,
1876 const struct lyd_node
*dnode
,
1877 union nb_resource
*resource
)
1879 struct isis_circuit
*circuit
;
1882 if (event
!= NB_EV_APPLY
)
1885 circuit
= nb_running_get_entry(dnode
, NULL
, true);
1886 multi
= yang_dnode_get_uint16(dnode
, NULL
);
1887 circuit
->hello_multiplier
[0] = multi
;
1893 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/multiplier/level-2
1896 lib_interface_isis_hello_multiplier_level_2_modify(enum nb_event event
,
1897 const struct lyd_node
*dnode
,
1898 union nb_resource
*resource
)
1900 struct isis_circuit
*circuit
;
1903 if (event
!= NB_EV_APPLY
)
1906 circuit
= nb_running_get_entry(dnode
, NULL
, true);
1907 multi
= yang_dnode_get_uint16(dnode
, NULL
);
1908 circuit
->hello_multiplier
[1] = multi
;
1914 * XPath: /frr-interface:lib/interface/frr-isisd:isis/metric/level-1
1917 lib_interface_isis_metric_level_1_modify(enum nb_event event
,
1918 const struct lyd_node
*dnode
,
1919 union nb_resource
*resource
)
1921 struct isis_circuit
*circuit
;
1924 if (event
!= NB_EV_APPLY
)
1927 circuit
= nb_running_get_entry(dnode
, NULL
, true);
1928 met
= yang_dnode_get_uint32(dnode
, NULL
);
1929 isis_circuit_metric_set(circuit
, IS_LEVEL_1
, met
);
1935 * XPath: /frr-interface:lib/interface/frr-isisd:isis/metric/level-2
1938 lib_interface_isis_metric_level_2_modify(enum nb_event event
,
1939 const struct lyd_node
*dnode
,
1940 union nb_resource
*resource
)
1942 struct isis_circuit
*circuit
;
1945 if (event
!= NB_EV_APPLY
)
1948 circuit
= nb_running_get_entry(dnode
, NULL
, true);
1949 met
= yang_dnode_get_uint32(dnode
, NULL
);
1950 isis_circuit_metric_set(circuit
, IS_LEVEL_2
, met
);
1956 * XPath: /frr-interface:lib/interface/frr-isisd:isis/priority/level-1
1959 lib_interface_isis_priority_level_1_modify(enum nb_event event
,
1960 const struct lyd_node
*dnode
,
1961 union nb_resource
*resource
)
1963 struct isis_circuit
*circuit
;
1965 if (event
!= NB_EV_APPLY
)
1968 circuit
= nb_running_get_entry(dnode
, NULL
, true);
1969 circuit
->priority
[0] = yang_dnode_get_uint8(dnode
, NULL
);
1975 * XPath: /frr-interface:lib/interface/frr-isisd:isis/priority/level-2
1978 lib_interface_isis_priority_level_2_modify(enum nb_event event
,
1979 const struct lyd_node
*dnode
,
1980 union nb_resource
*resource
)
1982 struct isis_circuit
*circuit
;
1984 if (event
!= NB_EV_APPLY
)
1987 circuit
= nb_running_get_entry(dnode
, NULL
, true);
1988 circuit
->priority
[1] = yang_dnode_get_uint8(dnode
, NULL
);
1994 * XPath: /frr-interface:lib/interface/frr-isisd:isis/network-type
1996 static int lib_interface_isis_network_type_modify(enum nb_event event
,
1997 const struct lyd_node
*dnode
,
1998 union nb_resource
*resource
)
2000 struct isis_circuit
*circuit
;
2001 int net_type
= yang_dnode_get_enum(dnode
, NULL
);
2004 case NB_EV_VALIDATE
:
2005 circuit
= nb_running_get_entry(dnode
, NULL
, false);
2008 if (circuit
->circ_type
== CIRCUIT_T_LOOPBACK
) {
2010 EC_LIB_NB_CB_CONFIG_VALIDATE
,
2011 "Cannot change network type on loopback interface");
2012 return NB_ERR_VALIDATION
;
2014 if (net_type
== CIRCUIT_T_BROADCAST
2015 && circuit
->state
== C_STATE_UP
2016 && !if_is_broadcast(circuit
->interface
)) {
2018 EC_LIB_NB_CB_CONFIG_VALIDATE
,
2019 "Cannot configure non-broadcast interface for broadcast operation");
2020 return NB_ERR_VALIDATION
;
2027 circuit
= nb_running_get_entry(dnode
, NULL
, true);
2028 isis_circuit_circ_type_set(circuit
, net_type
);
2036 * XPath: /frr-interface:lib/interface/frr-isisd:isis/passive
2038 static int lib_interface_isis_passive_modify(enum nb_event event
,
2039 const struct lyd_node
*dnode
,
2040 union nb_resource
*resource
)
2042 struct isis_circuit
*circuit
;
2043 struct isis_area
*area
;
2044 struct interface
*ifp
;
2045 bool passive
= yang_dnode_get_bool(dnode
, NULL
);
2047 /* validation only applies if we are setting passive to false */
2048 if (!passive
&& event
== NB_EV_VALIDATE
) {
2049 circuit
= nb_running_get_entry(dnode
, NULL
, false);
2052 ifp
= circuit
->interface
;
2055 if (if_is_loopback(ifp
)) {
2056 flog_warn(EC_LIB_NB_CB_CONFIG_VALIDATE
,
2057 "Loopback is always passive");
2058 return NB_ERR_VALIDATION
;
2062 if (event
!= NB_EV_APPLY
)
2065 circuit
= nb_running_get_entry(dnode
, NULL
, true);
2066 if (circuit
->state
!= C_STATE_UP
) {
2067 circuit
->is_passive
= passive
;
2069 area
= circuit
->area
;
2070 isis_csm_state_change(ISIS_DISABLE
, circuit
, area
);
2071 circuit
->is_passive
= passive
;
2072 isis_csm_state_change(ISIS_ENABLE
, circuit
, area
);
2079 * XPath: /frr-interface:lib/interface/frr-isisd:isis/password
2081 static int lib_interface_isis_password_create(enum nb_event event
,
2082 const struct lyd_node
*dnode
,
2083 union nb_resource
*resource
)
2088 static int lib_interface_isis_password_destroy(enum nb_event event
,
2089 const struct lyd_node
*dnode
)
2091 struct isis_circuit
*circuit
;
2093 if (event
!= NB_EV_APPLY
)
2096 circuit
= nb_running_get_entry(dnode
, NULL
, true);
2097 isis_circuit_passwd_unset(circuit
);
2103 * XPath: /frr-interface:lib/interface/frr-isisd:isis/password/password
2106 lib_interface_isis_password_password_modify(enum nb_event event
,
2107 const struct lyd_node
*dnode
,
2108 union nb_resource
*resource
)
2110 struct isis_circuit
*circuit
;
2111 const char *password
;
2113 if (event
!= NB_EV_APPLY
)
2116 password
= yang_dnode_get_string(dnode
, NULL
);
2117 circuit
= nb_running_get_entry(dnode
, NULL
, true);
2119 isis_circuit_passwd_set(circuit
, circuit
->passwd
.type
, password
);
2125 * XPath: /frr-interface:lib/interface/frr-isisd:isis/password/password-type
2128 lib_interface_isis_password_password_type_modify(enum nb_event event
,
2129 const struct lyd_node
*dnode
,
2130 union nb_resource
*resource
)
2132 struct isis_circuit
*circuit
;
2135 if (event
!= NB_EV_APPLY
)
2138 pass_type
= yang_dnode_get_enum(dnode
, NULL
);
2139 circuit
= nb_running_get_entry(dnode
, NULL
, true);
2140 circuit
->passwd
.type
= pass_type
;
2147 * /frr-interface:lib/interface/frr-isisd:isis/disable-three-way-handshake
2149 static int lib_interface_isis_disable_three_way_handshake_modify(
2150 enum nb_event event
, const struct lyd_node
*dnode
,
2151 union nb_resource
*resource
)
2153 struct isis_circuit
*circuit
;
2155 if (event
!= NB_EV_APPLY
)
2158 circuit
= nb_running_get_entry(dnode
, NULL
, true);
2159 circuit
->disable_threeway_adj
= yang_dnode_get_bool(dnode
, NULL
);
2166 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-unicast
2168 static int lib_interface_isis_multi_topology_common(
2169 enum nb_event event
, const struct lyd_node
*dnode
, uint16_t mtid
)
2171 struct isis_circuit
*circuit
;
2175 case NB_EV_VALIDATE
:
2176 circuit
= nb_running_get_entry(dnode
, NULL
, false);
2177 if (circuit
&& circuit
->area
&& circuit
->area
->oldmetric
) {
2179 EC_LIB_NB_CB_CONFIG_VALIDATE
,
2180 "Multi topology IS-IS can only be used with wide metrics");
2181 return NB_ERR_VALIDATION
;
2188 circuit
= nb_running_get_entry(dnode
, NULL
, true);
2189 value
= yang_dnode_get_bool(dnode
, NULL
);
2190 isis_circuit_mt_enabled_set(circuit
, mtid
, value
);
2197 static int lib_interface_isis_multi_topology_ipv4_unicast_modify(
2198 enum nb_event event
, const struct lyd_node
*dnode
,
2199 union nb_resource
*resource
)
2201 return lib_interface_isis_multi_topology_common(event
, dnode
,
2202 ISIS_MT_IPV4_UNICAST
);
2207 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-multicast
2209 static int lib_interface_isis_multi_topology_ipv4_multicast_modify(
2210 enum nb_event event
, const struct lyd_node
*dnode
,
2211 union nb_resource
*resource
)
2213 return lib_interface_isis_multi_topology_common(event
, dnode
,
2214 ISIS_MT_IPV4_MULTICAST
);
2219 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-management
2221 static int lib_interface_isis_multi_topology_ipv4_management_modify(
2222 enum nb_event event
, const struct lyd_node
*dnode
,
2223 union nb_resource
*resource
)
2225 return lib_interface_isis_multi_topology_common(event
, dnode
,
2231 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-unicast
2233 static int lib_interface_isis_multi_topology_ipv6_unicast_modify(
2234 enum nb_event event
, const struct lyd_node
*dnode
,
2235 union nb_resource
*resource
)
2237 return lib_interface_isis_multi_topology_common(event
, dnode
,
2238 ISIS_MT_IPV6_UNICAST
);
2243 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-multicast
2245 static int lib_interface_isis_multi_topology_ipv6_multicast_modify(
2246 enum nb_event event
, const struct lyd_node
*dnode
,
2247 union nb_resource
*resource
)
2249 return lib_interface_isis_multi_topology_common(event
, dnode
,
2250 ISIS_MT_IPV6_MULTICAST
);
2255 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-management
2257 static int lib_interface_isis_multi_topology_ipv6_management_modify(
2258 enum nb_event event
, const struct lyd_node
*dnode
,
2259 union nb_resource
*resource
)
2261 return lib_interface_isis_multi_topology_common(event
, dnode
,
2266 * XPath: /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-dstsrc
2268 static int lib_interface_isis_multi_topology_ipv6_dstsrc_modify(
2269 enum nb_event event
, const struct lyd_node
*dnode
,
2270 union nb_resource
*resource
)
2272 return lib_interface_isis_multi_topology_common(event
, dnode
,
2273 ISIS_MT_IPV6_DSTSRC
);
2279 static void notif_prep_instance_hdr(const char *xpath
,
2280 const struct isis_area
*area
,
2281 const char *routing_instance
,
2284 char xpath_arg
[XPATH_MAXLEN
];
2285 struct yang_data
*data
;
2287 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/routing-instance", xpath
);
2288 data
= yang_data_new_string(xpath_arg
, routing_instance
);
2289 listnode_add(args
, data
);
2290 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/routing-protocol-name",
2292 data
= yang_data_new_string(xpath_arg
, area
->area_tag
);
2293 listnode_add(args
, data
);
2294 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/isis-level", xpath
);
2295 data
= yang_data_new_enum(xpath_arg
, area
->is_type
);
2296 listnode_add(args
, data
);
2299 static void notif_prepr_iface_hdr(const char *xpath
,
2300 const struct isis_circuit
*circuit
,
2303 char xpath_arg
[XPATH_MAXLEN
];
2304 struct yang_data
*data
;
2306 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/interface-name", xpath
);
2307 data
= yang_data_new_string(xpath_arg
, circuit
->interface
->name
);
2308 listnode_add(args
, data
);
2309 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/interface-level", xpath
);
2310 data
= yang_data_new_enum(xpath_arg
, circuit
->is_type
);
2311 listnode_add(args
, data
);
2312 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/extended-circuit-id", xpath
);
2313 /* we do not seem to have the extended version of the circuit_id */
2314 data
= yang_data_new_uint32(xpath_arg
, (uint32_t)circuit
->circuit_id
);
2315 listnode_add(args
, data
);
2320 * /frr-isisd:database-overload
2322 void isis_notif_db_overload(const struct isis_area
*area
, bool overload
)
2324 const char *xpath
= "/frr-isisd:database-overload";
2325 struct list
*arguments
= yang_data_list_new();
2326 char xpath_arg
[XPATH_MAXLEN
];
2327 struct yang_data
*data
;
2329 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2330 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/overload", xpath
);
2331 data
= yang_data_new_enum(xpath_arg
, !!overload
);
2332 listnode_add(arguments
, data
);
2334 nb_notification_send(xpath
, arguments
);
2339 * /frr-isisd:lsp-too-large
2341 void isis_notif_lsp_too_large(const struct isis_circuit
*circuit
,
2342 uint32_t pdu_size
, const char *lsp_id
)
2344 const char *xpath
= "/frr-isisd:lsp-too-large";
2345 struct list
*arguments
= yang_data_list_new();
2346 char xpath_arg
[XPATH_MAXLEN
];
2347 struct yang_data
*data
;
2348 struct isis_area
*area
= circuit
->area
;
2350 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2351 notif_prepr_iface_hdr(xpath
, circuit
, arguments
);
2352 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/pdu-size", xpath
);
2353 data
= yang_data_new_uint32(xpath_arg
, pdu_size
);
2354 listnode_add(arguments
, data
);
2355 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/lsp-id", xpath
);
2356 data
= yang_data_new_string(xpath_arg
, lsp_id
);
2357 listnode_add(arguments
, data
);
2359 nb_notification_send(xpath
, arguments
);
2364 * /frr-isisd:if-state-change
2366 void isis_notif_if_state_change(const struct isis_circuit
*circuit
, bool down
)
2368 const char *xpath
= "/frr-isisd:if-state-change";
2369 struct list
*arguments
= yang_data_list_new();
2370 char xpath_arg
[XPATH_MAXLEN
];
2371 struct yang_data
*data
;
2372 struct isis_area
*area
= circuit
->area
;
2374 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2375 notif_prepr_iface_hdr(xpath
, circuit
, arguments
);
2376 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/state", xpath
);
2377 data
= yang_data_new_enum(xpath_arg
, !!down
);
2378 listnode_add(arguments
, data
);
2380 nb_notification_send(xpath
, arguments
);
2385 * /frr-isisd:corrupted-lsp-detected
2387 void isis_notif_corrupted_lsp(const struct isis_area
*area
, const char *lsp_id
)
2389 const char *xpath
= "/frr-isisd:corrupted-lsp-detected";
2390 struct list
*arguments
= yang_data_list_new();
2391 char xpath_arg
[XPATH_MAXLEN
];
2392 struct yang_data
*data
;
2394 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2395 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/lsp-id", xpath
);
2396 data
= yang_data_new_string(xpath_arg
, lsp_id
);
2397 listnode_add(arguments
, data
);
2399 nb_notification_send(xpath
, arguments
);
2404 * /frr-isisd:attempt-to-exceed-max-sequence
2406 void isis_notif_lsp_exceed_max(const struct isis_area
*area
, const char *lsp_id
)
2408 const char *xpath
= "/frr-isisd:attempt-to-exceed-max-sequence";
2409 struct list
*arguments
= yang_data_list_new();
2410 char xpath_arg
[XPATH_MAXLEN
];
2411 struct yang_data
*data
;
2413 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2414 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/lsp-id", xpath
);
2415 data
= yang_data_new_string(xpath_arg
, lsp_id
);
2416 listnode_add(arguments
, data
);
2418 nb_notification_send(xpath
, arguments
);
2423 * /frr-isisd:max-area-addresses-mismatch
2425 void isis_notif_max_area_addr_mismatch(const struct isis_circuit
*circuit
,
2426 uint8_t max_area_addrs
,
2427 const char *raw_pdu
)
2429 const char *xpath
= "/frr-isisd:max-area-addresses-mismatch";
2430 struct list
*arguments
= yang_data_list_new();
2431 char xpath_arg
[XPATH_MAXLEN
];
2432 struct yang_data
*data
;
2433 struct isis_area
*area
= circuit
->area
;
2435 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2436 notif_prepr_iface_hdr(xpath
, circuit
, arguments
);
2437 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/max-area-addresses", xpath
);
2438 data
= yang_data_new_uint8(xpath_arg
, max_area_addrs
);
2439 listnode_add(arguments
, data
);
2440 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/raw-pdu", xpath
);
2441 data
= yang_data_new(xpath_arg
, raw_pdu
);
2442 listnode_add(arguments
, data
);
2444 nb_notification_send(xpath
, arguments
);
2449 * /frr-isisd:authentication-type-failure
2451 void isis_notif_authentication_type_failure(const struct isis_circuit
*circuit
,
2452 const char *raw_pdu
)
2454 const char *xpath
= "/frr-isisd:authentication-type-failure";
2455 struct list
*arguments
= yang_data_list_new();
2456 char xpath_arg
[XPATH_MAXLEN
];
2457 struct yang_data
*data
;
2458 struct isis_area
*area
= circuit
->area
;
2460 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2461 notif_prepr_iface_hdr(xpath
, circuit
, arguments
);
2462 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/raw-pdu", xpath
);
2463 data
= yang_data_new(xpath_arg
, raw_pdu
);
2464 listnode_add(arguments
, data
);
2466 nb_notification_send(xpath
, arguments
);
2471 * /frr-isisd:authentication-failure
2473 void isis_notif_authentication_failure(const struct isis_circuit
*circuit
,
2474 const char *raw_pdu
)
2476 const char *xpath
= "/frr-isisd:authentication-failure";
2477 struct list
*arguments
= yang_data_list_new();
2478 char xpath_arg
[XPATH_MAXLEN
];
2479 struct yang_data
*data
;
2480 struct isis_area
*area
= circuit
->area
;
2482 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2483 notif_prepr_iface_hdr(xpath
, circuit
, arguments
);
2484 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/raw-pdu", xpath
);
2485 data
= yang_data_new(xpath_arg
, raw_pdu
);
2486 listnode_add(arguments
, data
);
2488 nb_notification_send(xpath
, arguments
);
2493 * /frr-isisd:adjacency-state-change
2495 void isis_notif_adj_state_change(const struct isis_adjacency
*adj
,
2496 int new_state
, const char *reason
)
2498 const char *xpath
= "/frr-isisd:adjacency-state-change";
2499 struct list
*arguments
= yang_data_list_new();
2500 char xpath_arg
[XPATH_MAXLEN
];
2501 struct yang_data
*data
;
2502 struct isis_circuit
*circuit
= adj
->circuit
;
2503 struct isis_area
*area
= circuit
->area
;
2504 struct isis_dynhn
*dyn
= dynhn_find_by_id(adj
->sysid
);
2506 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2507 notif_prepr_iface_hdr(xpath
, circuit
, arguments
);
2509 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/neighbor", xpath
);
2510 data
= yang_data_new_string(xpath_arg
, dyn
->hostname
);
2511 listnode_add(arguments
, data
);
2513 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/neighbor-system-id", xpath
);
2514 data
= yang_data_new_string(xpath_arg
, sysid_print(adj
->sysid
));
2515 listnode_add(arguments
, data
);
2517 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/state", xpath
);
2518 switch (new_state
) {
2520 data
= yang_data_new_string(xpath_arg
, "down");
2523 data
= yang_data_new_string(xpath_arg
, "up");
2525 case ISIS_ADJ_INITIALIZING
:
2526 data
= yang_data_new_string(xpath_arg
, "init");
2529 data
= yang_data_new_string(xpath_arg
, "failed");
2531 listnode_add(arguments
, data
);
2532 if (new_state
== ISIS_ADJ_DOWN
) {
2533 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/reason", xpath
);
2534 data
= yang_data_new_string(xpath_arg
, reason
);
2535 listnode_add(arguments
, data
);
2538 nb_notification_send(xpath
, arguments
);
2543 * /frr-isisd:rejected-adjacency
2545 void isis_notif_reject_adjacency(const struct isis_circuit
*circuit
,
2546 const char *reason
, const char *raw_pdu
)
2548 const char *xpath
= "/frr-isisd:rejected-adjacency";
2549 struct list
*arguments
= yang_data_list_new();
2550 char xpath_arg
[XPATH_MAXLEN
];
2551 struct yang_data
*data
;
2552 struct isis_area
*area
= circuit
->area
;
2554 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2555 notif_prepr_iface_hdr(xpath
, circuit
, arguments
);
2556 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/reason", xpath
);
2557 data
= yang_data_new_string(xpath_arg
, reason
);
2558 listnode_add(arguments
, data
);
2559 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/raw-pdu", xpath
);
2560 data
= yang_data_new(xpath_arg
, raw_pdu
);
2561 listnode_add(arguments
, data
);
2563 nb_notification_send(xpath
, arguments
);
2568 * /frr-isisd:area-mismatch
2570 void isis_notif_area_mismatch(const struct isis_circuit
*circuit
,
2571 const char *raw_pdu
)
2573 const char *xpath
= "/frr-isisd:area-mismatch";
2574 struct list
*arguments
= yang_data_list_new();
2575 char xpath_arg
[XPATH_MAXLEN
];
2576 struct yang_data
*data
;
2577 struct isis_area
*area
= circuit
->area
;
2579 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2580 notif_prepr_iface_hdr(xpath
, circuit
, arguments
);
2581 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/raw-pdu", xpath
);
2582 data
= yang_data_new(xpath_arg
, raw_pdu
);
2583 listnode_add(arguments
, data
);
2585 nb_notification_send(xpath
, arguments
);
2590 * /frr-isisd:lsp-received
2592 void isis_notif_lsp_received(const struct isis_circuit
*circuit
,
2593 const char *lsp_id
, uint32_t seqno
,
2594 uint32_t timestamp
, const char *sys_id
)
2596 const char *xpath
= "/frr-isisd:lsp-received";
2597 struct list
*arguments
= yang_data_list_new();
2598 char xpath_arg
[XPATH_MAXLEN
];
2599 struct yang_data
*data
;
2600 struct isis_area
*area
= circuit
->area
;
2602 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2603 notif_prepr_iface_hdr(xpath
, circuit
, arguments
);
2604 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/lsp-id", xpath
);
2605 data
= yang_data_new_string(xpath_arg
, lsp_id
);
2606 listnode_add(arguments
, data
);
2607 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/sequence", xpath
);
2608 data
= yang_data_new_uint32(xpath_arg
, seqno
);
2609 listnode_add(arguments
, data
);
2610 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/received-timestamp", xpath
);
2611 data
= yang_data_new_uint32(xpath_arg
, timestamp
);
2612 listnode_add(arguments
, data
);
2613 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/neighbor-system-id", xpath
);
2614 data
= yang_data_new_string(xpath_arg
, sys_id
);
2615 listnode_add(arguments
, data
);
2617 nb_notification_send(xpath
, arguments
);
2622 * /frr-isisd:lsp-generation
2624 void isis_notif_lsp_gen(const struct isis_area
*area
, const char *lsp_id
,
2625 uint32_t seqno
, uint32_t timestamp
)
2627 const char *xpath
= "/frr-isisd:lsp-generation";
2628 struct list
*arguments
= yang_data_list_new();
2629 char xpath_arg
[XPATH_MAXLEN
];
2630 struct yang_data
*data
;
2632 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2633 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/lsp-id", xpath
);
2634 data
= yang_data_new_string(xpath_arg
, lsp_id
);
2635 listnode_add(arguments
, data
);
2636 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/sequence", xpath
);
2637 data
= yang_data_new_uint32(xpath_arg
, seqno
);
2638 listnode_add(arguments
, data
);
2639 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/send-timestamp", xpath
);
2640 data
= yang_data_new_uint32(xpath_arg
, timestamp
);
2641 listnode_add(arguments
, data
);
2643 nb_notification_send(xpath
, arguments
);
2648 * /frr-isisd:id-len-mismatch
2650 void isis_notif_id_len_mismatch(const struct isis_circuit
*circuit
,
2651 uint8_t rcv_id_len
, const char *raw_pdu
)
2653 const char *xpath
= "/frr-isisd:id-len-mismatch";
2654 struct list
*arguments
= yang_data_list_new();
2655 char xpath_arg
[XPATH_MAXLEN
];
2656 struct yang_data
*data
;
2657 struct isis_area
*area
= circuit
->area
;
2659 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2660 notif_prepr_iface_hdr(xpath
, circuit
, arguments
);
2661 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/pdu-field-len", xpath
);
2662 data
= yang_data_new_uint8(xpath_arg
, rcv_id_len
);
2663 listnode_add(arguments
, data
);
2664 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/raw-pdu", xpath
);
2665 data
= yang_data_new(xpath_arg
, raw_pdu
);
2666 listnode_add(arguments
, data
);
2668 nb_notification_send(xpath
, arguments
);
2673 * /frr-isisd:version-skew
2675 void isis_notif_version_skew(const struct isis_circuit
*circuit
,
2676 uint8_t version
, const char *raw_pdu
)
2678 const char *xpath
= "/frr-isisd:version-skew";
2679 struct list
*arguments
= yang_data_list_new();
2680 char xpath_arg
[XPATH_MAXLEN
];
2681 struct yang_data
*data
;
2682 struct isis_area
*area
= circuit
->area
;
2684 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2685 notif_prepr_iface_hdr(xpath
, circuit
, arguments
);
2686 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/protocol-version", xpath
);
2687 data
= yang_data_new_uint8(xpath_arg
, version
);
2688 listnode_add(arguments
, data
);
2689 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/raw-pdu", xpath
);
2690 data
= yang_data_new(xpath_arg
, raw_pdu
);
2691 listnode_add(arguments
, data
);
2693 nb_notification_send(xpath
, arguments
);
2698 * /frr-isisd:lsp-error-detected
2700 void isis_notif_lsp_error(const struct isis_circuit
*circuit
,
2701 const char *lsp_id
, const char *raw_pdu
,
2702 __attribute__((unused
)) uint32_t offset
,
2703 __attribute__((unused
)) uint8_t tlv_type
)
2705 const char *xpath
= "/frr-isisd:lsp-error-detected";
2706 struct list
*arguments
= yang_data_list_new();
2707 char xpath_arg
[XPATH_MAXLEN
];
2708 struct yang_data
*data
;
2709 struct isis_area
*area
= circuit
->area
;
2711 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2712 notif_prepr_iface_hdr(xpath
, circuit
, arguments
);
2713 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/lsp-id", xpath
);
2714 data
= yang_data_new_string(xpath_arg
, lsp_id
);
2715 listnode_add(arguments
, data
);
2716 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/raw-pdu", xpath
);
2717 data
= yang_data_new(xpath_arg
, raw_pdu
);
2718 listnode_add(arguments
, data
);
2719 /* ignore offset and tlv_type which cannot be set properly */
2721 nb_notification_send(xpath
, arguments
);
2726 * /frr-isisd:sequence-number-skipped
2728 void isis_notif_seqno_skipped(const struct isis_circuit
*circuit
,
2731 const char *xpath
= "/frr-isisd:sequence-number-skipped";
2732 struct list
*arguments
= yang_data_list_new();
2733 char xpath_arg
[XPATH_MAXLEN
];
2734 struct yang_data
*data
;
2735 struct isis_area
*area
= circuit
->area
;
2737 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2738 notif_prepr_iface_hdr(xpath
, circuit
, arguments
);
2739 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/lsp-id", xpath
);
2740 data
= yang_data_new_string(xpath_arg
, lsp_id
);
2741 listnode_add(arguments
, data
);
2743 nb_notification_send(xpath
, arguments
);
2748 * /frr-isisd:own-lsp-purge
2750 void isis_notif_own_lsp_purge(const struct isis_circuit
*circuit
,
2753 const char *xpath
= "/frr-isisd:own-lsp-purge";
2754 struct list
*arguments
= yang_data_list_new();
2755 char xpath_arg
[XPATH_MAXLEN
];
2756 struct yang_data
*data
;
2757 struct isis_area
*area
= circuit
->area
;
2759 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2760 notif_prepr_iface_hdr(xpath
, circuit
, arguments
);
2761 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/lsp-id", xpath
);
2762 data
= yang_data_new_string(xpath_arg
, lsp_id
);
2763 listnode_add(arguments
, data
);
2765 nb_notification_send(xpath
, arguments
);
2768 /* clang-format off */
2769 const struct frr_yang_module_info frr_isisd_info
= {
2770 .name
= "frr-isisd",
2773 .xpath
= "/frr-isisd:isis/instance",
2775 .cli_show
= cli_show_router_isis
,
2776 .create
= isis_instance_create
,
2777 .destroy
= isis_instance_destroy
,
2779 .priority
= NB_DFLT_PRIORITY
- 1,
2782 .xpath
= "/frr-isisd:isis/instance/is-type",
2784 .cli_show
= cli_show_isis_is_type
,
2785 .modify
= isis_instance_is_type_modify
,
2789 .xpath
= "/frr-isisd:isis/instance/area-address",
2791 .cli_show
= cli_show_isis_area_address
,
2792 .create
= isis_instance_area_address_create
,
2793 .destroy
= isis_instance_area_address_destroy
,
2797 .xpath
= "/frr-isisd:isis/instance/dynamic-hostname",
2799 .cli_show
= cli_show_isis_dynamic_hostname
,
2800 .modify
= isis_instance_dynamic_hostname_modify
,
2804 .xpath
= "/frr-isisd:isis/instance/attached",
2806 .cli_show
= cli_show_isis_attached
,
2807 .modify
= isis_instance_attached_modify
,
2811 .xpath
= "/frr-isisd:isis/instance/overload",
2813 .cli_show
= cli_show_isis_overload
,
2814 .modify
= isis_instance_overload_modify
,
2818 .xpath
= "/frr-isisd:isis/instance/metric-style",
2820 .cli_show
= cli_show_isis_metric_style
,
2821 .modify
= isis_instance_metric_style_modify
,
2825 .xpath
= "/frr-isisd:isis/instance/purge-originator",
2827 .cli_show
= cli_show_isis_purge_origin
,
2828 .modify
= isis_instance_purge_originator_modify
,
2832 .xpath
= "/frr-isisd:isis/instance/lsp/mtu",
2834 .cli_show
= cli_show_isis_lsp_mtu
,
2835 .modify
= isis_instance_lsp_mtu_modify
,
2839 .xpath
= "/frr-isisd:isis/instance/lsp/refresh-interval",
2841 .cli_show
= cli_show_isis_lsp_ref_interval
,
2845 .xpath
= "/frr-isisd:isis/instance/lsp/refresh-interval/level-1",
2847 .modify
= isis_instance_lsp_refresh_interval_level_1_modify
,
2851 .xpath
= "/frr-isisd:isis/instance/lsp/refresh-interval/level-2",
2853 .modify
= isis_instance_lsp_refresh_interval_level_2_modify
,
2857 .xpath
= "/frr-isisd:isis/instance/lsp/maximum-lifetime",
2859 .cli_show
= cli_show_isis_lsp_max_lifetime
,
2863 .xpath
= "/frr-isisd:isis/instance/lsp/maximum-lifetime/level-1",
2865 .modify
= isis_instance_lsp_maximum_lifetime_level_1_modify
,
2869 .xpath
= "/frr-isisd:isis/instance/lsp/maximum-lifetime/level-2",
2871 .modify
= isis_instance_lsp_maximum_lifetime_level_2_modify
,
2875 .xpath
= "/frr-isisd:isis/instance/lsp/generation-interval",
2877 .cli_show
= cli_show_isis_lsp_gen_interval
,
2881 .xpath
= "/frr-isisd:isis/instance/lsp/generation-interval/level-1",
2883 .modify
= isis_instance_lsp_generation_interval_level_1_modify
,
2887 .xpath
= "/frr-isisd:isis/instance/lsp/generation-interval/level-2",
2889 .modify
= isis_instance_lsp_generation_interval_level_2_modify
,
2893 .xpath
= "/frr-isisd:isis/instance/spf/ietf-backoff-delay",
2895 .apply_finish
= ietf_backoff_delay_apply_finish
,
2896 .cli_show
= cli_show_isis_spf_ietf_backoff
,
2897 .create
= isis_instance_spf_ietf_backoff_delay_create
,
2898 .destroy
= isis_instance_spf_ietf_backoff_delay_destroy
,
2902 .xpath
= "/frr-isisd:isis/instance/spf/ietf-backoff-delay/init-delay",
2904 .modify
= isis_instance_spf_ietf_backoff_delay_init_delay_modify
,
2908 .xpath
= "/frr-isisd:isis/instance/spf/ietf-backoff-delay/short-delay",
2910 .modify
= isis_instance_spf_ietf_backoff_delay_short_delay_modify
,
2914 .xpath
= "/frr-isisd:isis/instance/spf/ietf-backoff-delay/long-delay",
2916 .modify
= isis_instance_spf_ietf_backoff_delay_long_delay_modify
,
2920 .xpath
= "/frr-isisd:isis/instance/spf/ietf-backoff-delay/hold-down",
2922 .modify
= isis_instance_spf_ietf_backoff_delay_hold_down_modify
,
2926 .xpath
= "/frr-isisd:isis/instance/spf/ietf-backoff-delay/time-to-learn",
2928 .modify
= isis_instance_spf_ietf_backoff_delay_time_to_learn_modify
,
2932 .xpath
= "/frr-isisd:isis/instance/spf/minimum-interval",
2934 .cli_show
= cli_show_isis_spf_min_interval
,
2938 .xpath
= "/frr-isisd:isis/instance/spf/minimum-interval/level-1",
2940 .modify
= isis_instance_spf_minimum_interval_level_1_modify
,
2944 .xpath
= "/frr-isisd:isis/instance/spf/minimum-interval/level-2",
2946 .modify
= isis_instance_spf_minimum_interval_level_2_modify
,
2950 .xpath
= "/frr-isisd:isis/instance/area-password",
2952 .apply_finish
= area_password_apply_finish
,
2953 .cli_show
= cli_show_isis_area_pwd
,
2954 .create
= isis_instance_area_password_create
,
2955 .destroy
= isis_instance_area_password_destroy
,
2959 .xpath
= "/frr-isisd:isis/instance/area-password/password",
2961 .modify
= isis_instance_area_password_password_modify
,
2965 .xpath
= "/frr-isisd:isis/instance/area-password/password-type",
2967 .modify
= isis_instance_area_password_password_type_modify
,
2971 .xpath
= "/frr-isisd:isis/instance/area-password/authenticate-snp",
2973 .modify
= isis_instance_area_password_authenticate_snp_modify
,
2977 .xpath
= "/frr-isisd:isis/instance/domain-password",
2979 .apply_finish
= domain_password_apply_finish
,
2980 .cli_show
= cli_show_isis_domain_pwd
,
2981 .create
= isis_instance_domain_password_create
,
2982 .destroy
= isis_instance_domain_password_destroy
,
2986 .xpath
= "/frr-isisd:isis/instance/domain-password/password",
2988 .modify
= isis_instance_domain_password_password_modify
,
2992 .xpath
= "/frr-isisd:isis/instance/domain-password/password-type",
2994 .modify
= isis_instance_domain_password_password_type_modify
,
2998 .xpath
= "/frr-isisd:isis/instance/domain-password/authenticate-snp",
3000 .modify
= isis_instance_domain_password_authenticate_snp_modify
,
3004 .xpath
= "/frr-isisd:isis/instance/default-information-originate/ipv4",
3006 .apply_finish
= default_info_origin_ipv4_apply_finish
,
3007 .cli_show
= cli_show_isis_def_origin_ipv4
,
3008 .create
= isis_instance_default_information_originate_ipv4_create
,
3009 .destroy
= isis_instance_default_information_originate_ipv4_destroy
,
3013 .xpath
= "/frr-isisd:isis/instance/default-information-originate/ipv4/always",
3015 .modify
= isis_instance_default_information_originate_ipv4_always_modify
,
3019 .xpath
= "/frr-isisd:isis/instance/default-information-originate/ipv4/route-map",
3021 .destroy
= isis_instance_default_information_originate_ipv4_route_map_destroy
,
3022 .modify
= isis_instance_default_information_originate_ipv4_route_map_modify
,
3026 .xpath
= "/frr-isisd:isis/instance/default-information-originate/ipv4/metric",
3028 .modify
= isis_instance_default_information_originate_ipv4_metric_modify
,
3032 .xpath
= "/frr-isisd:isis/instance/default-information-originate/ipv6",
3034 .apply_finish
= default_info_origin_ipv6_apply_finish
,
3035 .cli_show
= cli_show_isis_def_origin_ipv6
,
3036 .create
= isis_instance_default_information_originate_ipv6_create
,
3037 .destroy
= isis_instance_default_information_originate_ipv6_destroy
,
3041 .xpath
= "/frr-isisd:isis/instance/default-information-originate/ipv6/always",
3043 .modify
= isis_instance_default_information_originate_ipv6_always_modify
,
3047 .xpath
= "/frr-isisd:isis/instance/default-information-originate/ipv6/route-map",
3049 .destroy
= isis_instance_default_information_originate_ipv6_route_map_destroy
,
3050 .modify
= isis_instance_default_information_originate_ipv6_route_map_modify
,
3054 .xpath
= "/frr-isisd:isis/instance/default-information-originate/ipv6/metric",
3056 .modify
= isis_instance_default_information_originate_ipv6_metric_modify
,
3060 .xpath
= "/frr-isisd:isis/instance/redistribute/ipv4",
3062 .apply_finish
= redistribute_ipv4_apply_finish
,
3063 .cli_show
= cli_show_isis_redistribute_ipv4
,
3064 .create
= isis_instance_redistribute_ipv4_create
,
3065 .destroy
= isis_instance_redistribute_ipv4_destroy
,
3069 .xpath
= "/frr-isisd:isis/instance/redistribute/ipv4/route-map",
3071 .destroy
= isis_instance_redistribute_ipv4_route_map_destroy
,
3072 .modify
= isis_instance_redistribute_ipv4_route_map_modify
,
3076 .xpath
= "/frr-isisd:isis/instance/redistribute/ipv4/metric",
3078 .modify
= isis_instance_redistribute_ipv4_metric_modify
,
3082 .xpath
= "/frr-isisd:isis/instance/redistribute/ipv6",
3084 .apply_finish
= redistribute_ipv6_apply_finish
,
3085 .cli_show
= cli_show_isis_redistribute_ipv6
,
3086 .create
= isis_instance_redistribute_ipv6_create
,
3087 .destroy
= isis_instance_redistribute_ipv6_destroy
,
3091 .xpath
= "/frr-isisd:isis/instance/redistribute/ipv6/route-map",
3093 .destroy
= isis_instance_redistribute_ipv6_route_map_destroy
,
3094 .modify
= isis_instance_redistribute_ipv6_route_map_modify
,
3098 .xpath
= "/frr-isisd:isis/instance/redistribute/ipv6/metric",
3100 .modify
= isis_instance_redistribute_ipv6_metric_modify
,
3104 .xpath
= "/frr-isisd:isis/instance/multi-topology/ipv4-multicast",
3106 .cli_show
= cli_show_isis_mt_ipv4_multicast
,
3107 .create
= isis_instance_multi_topology_ipv4_multicast_create
,
3108 .destroy
= isis_instance_multi_topology_ipv4_multicast_destroy
,
3112 .xpath
= "/frr-isisd:isis/instance/multi-topology/ipv4-multicast/overload",
3114 .modify
= isis_instance_multi_topology_ipv4_multicast_overload_modify
,
3118 .xpath
= "/frr-isisd:isis/instance/multi-topology/ipv4-management",
3120 .cli_show
= cli_show_isis_mt_ipv4_mgmt
,
3121 .create
= isis_instance_multi_topology_ipv4_management_create
,
3122 .destroy
= isis_instance_multi_topology_ipv4_management_destroy
,
3126 .xpath
= "/frr-isisd:isis/instance/multi-topology/ipv4-management/overload",
3128 .modify
= isis_instance_multi_topology_ipv4_management_overload_modify
,
3132 .xpath
= "/frr-isisd:isis/instance/multi-topology/ipv6-unicast",
3134 .cli_show
= cli_show_isis_mt_ipv6_unicast
,
3135 .create
= isis_instance_multi_topology_ipv6_unicast_create
,
3136 .destroy
= isis_instance_multi_topology_ipv6_unicast_destroy
,
3140 .xpath
= "/frr-isisd:isis/instance/multi-topology/ipv6-unicast/overload",
3142 .modify
= isis_instance_multi_topology_ipv6_unicast_overload_modify
,
3146 .xpath
= "/frr-isisd:isis/instance/multi-topology/ipv6-multicast",
3148 .cli_show
= cli_show_isis_mt_ipv6_multicast
,
3149 .create
= isis_instance_multi_topology_ipv6_multicast_create
,
3150 .destroy
= isis_instance_multi_topology_ipv6_multicast_destroy
,
3154 .xpath
= "/frr-isisd:isis/instance/multi-topology/ipv6-multicast/overload",
3156 .modify
= isis_instance_multi_topology_ipv6_multicast_overload_modify
,
3160 .xpath
= "/frr-isisd:isis/instance/multi-topology/ipv6-management",
3162 .cli_show
= cli_show_isis_mt_ipv6_mgmt
,
3163 .create
= isis_instance_multi_topology_ipv6_management_create
,
3164 .destroy
= isis_instance_multi_topology_ipv6_management_destroy
,
3168 .xpath
= "/frr-isisd:isis/instance/multi-topology/ipv6-management/overload",
3170 .modify
= isis_instance_multi_topology_ipv6_management_overload_modify
,
3174 .xpath
= "/frr-isisd:isis/instance/multi-topology/ipv6-dstsrc",
3176 .cli_show
= cli_show_isis_mt_ipv6_dstsrc
,
3177 .create
= isis_instance_multi_topology_ipv6_dstsrc_create
,
3178 .destroy
= isis_instance_multi_topology_ipv6_dstsrc_destroy
,
3182 .xpath
= "/frr-isisd:isis/instance/multi-topology/ipv6-dstsrc/overload",
3184 .modify
= isis_instance_multi_topology_ipv6_dstsrc_overload_modify
,
3188 .xpath
= "/frr-isisd:isis/instance/log-adjacency-changes",
3190 .cli_show
= cli_show_isis_log_adjacency
,
3191 .modify
= isis_instance_log_adjacency_changes_modify
,
3195 .xpath
= "/frr-isisd:isis/instance/mpls-te",
3197 .cli_show
= cli_show_isis_mpls_te
,
3198 .create
= isis_instance_mpls_te_create
,
3199 .destroy
= isis_instance_mpls_te_destroy
,
3203 .xpath
= "/frr-isisd:isis/instance/mpls-te/router-address",
3205 .cli_show
= cli_show_isis_mpls_te_router_addr
,
3206 .destroy
= isis_instance_mpls_te_router_address_destroy
,
3207 .modify
= isis_instance_mpls_te_router_address_modify
,
3211 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis",
3213 .create
= lib_interface_isis_create
,
3214 .destroy
= lib_interface_isis_destroy
,
3218 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/area-tag",
3220 .modify
= lib_interface_isis_area_tag_modify
,
3224 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/circuit-type",
3226 .cli_show
= cli_show_ip_isis_circ_type
,
3227 .modify
= lib_interface_isis_circuit_type_modify
,
3231 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/ipv4-routing",
3233 .cli_show
= cli_show_ip_isis_ipv4
,
3234 .modify
= lib_interface_isis_ipv4_routing_modify
,
3238 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/ipv6-routing",
3240 .cli_show
= cli_show_ip_isis_ipv6
,
3241 .modify
= lib_interface_isis_ipv6_routing_modify
,
3245 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/bfd-monitoring",
3247 .modify
= lib_interface_isis_bfd_monitoring_modify
,
3248 .cli_show
= cli_show_ip_isis_bfd_monitoring
,
3252 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/csnp-interval",
3254 .cli_show
= cli_show_ip_isis_csnp_interval
,
3258 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/csnp-interval/level-1",
3260 .modify
= lib_interface_isis_csnp_interval_level_1_modify
,
3264 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/csnp-interval/level-2",
3266 .modify
= lib_interface_isis_csnp_interval_level_2_modify
,
3270 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/psnp-interval",
3272 .cli_show
= cli_show_ip_isis_psnp_interval
,
3276 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/psnp-interval/level-1",
3278 .modify
= lib_interface_isis_psnp_interval_level_1_modify
,
3282 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/psnp-interval/level-2",
3284 .modify
= lib_interface_isis_psnp_interval_level_2_modify
,
3288 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/hello/padding",
3290 .cli_show
= cli_show_ip_isis_hello_padding
,
3291 .modify
= lib_interface_isis_hello_padding_modify
,
3295 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/hello/interval",
3297 .cli_show
= cli_show_ip_isis_hello_interval
,
3301 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/hello/interval/level-1",
3303 .modify
= lib_interface_isis_hello_interval_level_1_modify
,
3307 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/hello/interval/level-2",
3309 .modify
= lib_interface_isis_hello_interval_level_2_modify
,
3313 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/hello/multiplier",
3315 .cli_show
= cli_show_ip_isis_hello_multi
,
3319 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/hello/multiplier/level-1",
3321 .modify
= lib_interface_isis_hello_multiplier_level_1_modify
,
3325 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/hello/multiplier/level-2",
3327 .modify
= lib_interface_isis_hello_multiplier_level_2_modify
,
3331 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/metric",
3333 .cli_show
= cli_show_ip_isis_metric
,
3337 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/metric/level-1",
3339 .modify
= lib_interface_isis_metric_level_1_modify
,
3343 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/metric/level-2",
3345 .modify
= lib_interface_isis_metric_level_2_modify
,
3349 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/priority",
3351 .cli_show
= cli_show_ip_isis_priority
,
3355 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/priority/level-1",
3357 .modify
= lib_interface_isis_priority_level_1_modify
,
3361 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/priority/level-2",
3363 .modify
= lib_interface_isis_priority_level_2_modify
,
3367 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/network-type",
3369 .cli_show
= cli_show_ip_isis_network_type
,
3370 .modify
= lib_interface_isis_network_type_modify
,
3374 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/passive",
3376 .cli_show
= cli_show_ip_isis_passive
,
3377 .modify
= lib_interface_isis_passive_modify
,
3381 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/password",
3383 .cli_show
= cli_show_ip_isis_password
,
3384 .create
= lib_interface_isis_password_create
,
3385 .destroy
= lib_interface_isis_password_destroy
,
3389 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/password/password",
3391 .modify
= lib_interface_isis_password_password_modify
,
3395 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/password/password-type",
3397 .modify
= lib_interface_isis_password_password_type_modify
,
3401 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/disable-three-way-handshake",
3403 .cli_show
= cli_show_ip_isis_threeway_shake
,
3404 .modify
= lib_interface_isis_disable_three_way_handshake_modify
,
3408 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-unicast",
3410 .cli_show
= cli_show_ip_isis_mt_ipv4_unicast
,
3411 .modify
= lib_interface_isis_multi_topology_ipv4_unicast_modify
,
3415 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-multicast",
3417 .cli_show
= cli_show_ip_isis_mt_ipv4_multicast
,
3418 .modify
= lib_interface_isis_multi_topology_ipv4_multicast_modify
,
3422 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-management",
3424 .cli_show
= cli_show_ip_isis_mt_ipv4_mgmt
,
3425 .modify
= lib_interface_isis_multi_topology_ipv4_management_modify
,
3429 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-unicast",
3431 .cli_show
= cli_show_ip_isis_mt_ipv6_unicast
,
3432 .modify
= lib_interface_isis_multi_topology_ipv6_unicast_modify
,
3436 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-multicast",
3438 .cli_show
= cli_show_ip_isis_mt_ipv6_multicast
,
3439 .modify
= lib_interface_isis_multi_topology_ipv6_multicast_modify
,
3443 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-management",
3445 .cli_show
= cli_show_ip_isis_mt_ipv6_mgmt
,
3446 .modify
= lib_interface_isis_multi_topology_ipv6_management_modify
,
3450 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-dstsrc",
3452 .cli_show
= cli_show_ip_isis_mt_ipv6_dstsrc
,
3453 .modify
= lib_interface_isis_multi_topology_ipv6_dstsrc_modify
,