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"
28 #include "isisd/dict.h"
29 #include "isisd/isis_constants.h"
30 #include "isisd/isis_common.h"
31 #include "isisd/isis_flags.h"
32 #include "isisd/isis_circuit.h"
33 #include "isisd/isisd.h"
34 #include "isisd/isis_lsp.h"
35 #include "isisd/isis_pdu.h"
36 #include "isisd/isis_dynhn.h"
37 #include "isisd/isis_misc.h"
38 #include "isisd/isis_csm.h"
39 #include "isisd/isis_adjacency.h"
40 #include "isisd/isis_spf.h"
41 #include "isisd/isis_te.h"
42 #include "isisd/isis_memory.h"
43 #include "isisd/isis_mt.h"
44 #include "isisd/isis_cli.h"
45 #include "isisd/isis_redist.h"
46 #include "lib/spf_backoff.h"
47 #include "lib/lib_errors.h"
51 * XPath: /frr-isisd:isis/instance
53 static int isis_instance_create(enum nb_event event
,
54 const struct lyd_node
*dnode
,
55 union nb_resource
*resource
)
57 struct isis_area
*area
;
60 if (event
!= NB_EV_APPLY
)
63 area_tag
= yang_dnode_get_string(dnode
, "./area-tag");
64 area
= isis_area_lookup(area_tag
);
66 return NB_ERR_INCONSISTENCY
;
68 area
= isis_area_create(area_tag
);
69 /* save area in dnode to avoid looking it up all the time */
70 nb_running_set_entry(dnode
, area
);
75 static int isis_instance_destroy(enum nb_event event
,
76 const struct lyd_node
*dnode
)
78 struct isis_area
*area
;
80 if (event
!= NB_EV_APPLY
)
83 area
= nb_running_unset_entry(dnode
);
84 isis_area_destroy(area
->area_tag
);
90 * XPath: /frr-isisd:isis/instance/is-type
92 static int isis_instance_is_type_modify(enum nb_event event
,
93 const struct lyd_node
*dnode
,
94 union nb_resource
*resource
)
96 struct isis_area
*area
;
99 if (event
!= NB_EV_APPLY
)
102 area
= nb_running_get_entry(dnode
, NULL
, true);
103 type
= yang_dnode_get_enum(dnode
, NULL
);
104 isis_area_is_type_set(area
, type
);
110 * XPath: /frr-isisd:isis/instance/area-address
112 static int isis_instance_area_address_create(enum nb_event event
,
113 const struct lyd_node
*dnode
,
114 union nb_resource
*resource
)
116 struct isis_area
*area
;
117 struct area_addr addr
, *addrr
= NULL
, *addrp
= NULL
;
118 struct listnode
*node
;
120 const char *net_title
= yang_dnode_get_string(dnode
, NULL
);
124 addr
.addr_len
= dotformat2buff(buff
, net_title
);
125 memcpy(addr
.area_addr
, buff
, addr
.addr_len
);
126 if (addr
.area_addr
[addr
.addr_len
- 1] != 0) {
128 EC_LIB_NB_CB_CONFIG_VALIDATE
,
129 "nsel byte (last byte) in area address must be 0");
130 return NB_ERR_VALIDATION
;
132 if (isis
->sysid_set
) {
133 /* Check that the SystemID portions match */
134 if (memcmp(isis
->sysid
, GETSYSID((&addr
)),
137 EC_LIB_NB_CB_CONFIG_VALIDATE
,
138 "System ID must not change when defining additional area addresses");
139 return NB_ERR_VALIDATION
;
144 addrr
= XMALLOC(MTYPE_ISIS_AREA_ADDR
, sizeof(struct area_addr
));
145 addrr
->addr_len
= dotformat2buff(buff
, net_title
);
146 memcpy(addrr
->area_addr
, buff
, addrr
->addr_len
);
147 resource
->ptr
= addrr
;
150 XFREE(MTYPE_ISIS_AREA_ADDR
, resource
->ptr
);
153 area
= nb_running_get_entry(dnode
, NULL
, true);
154 addrr
= resource
->ptr
;
156 if (isis
->sysid_set
== 0) {
158 * First area address - get the SystemID for this router
160 memcpy(isis
->sysid
, GETSYSID(addrr
), ISIS_SYS_ID_LEN
);
163 /* check that we don't already have this address */
164 for (ALL_LIST_ELEMENTS_RO(area
->area_addrs
, node
,
166 if ((addrp
->addr_len
+ ISIS_SYS_ID_LEN
168 != (addrr
->addr_len
))
170 if (!memcmp(addrp
->area_addr
, addrr
->area_addr
,
172 XFREE(MTYPE_ISIS_AREA_ADDR
, addrr
);
173 return NB_OK
; /* silent fail */
178 /*Forget the systemID part of the address */
179 addrr
->addr_len
-= (ISIS_SYS_ID_LEN
+ ISIS_NSEL_LEN
);
180 assert(area
->area_addrs
); /* to silence scan-build sillyness */
181 listnode_add(area
->area_addrs
, addrr
);
183 /* only now we can safely generate our LSPs for this area */
184 if (listcount(area
->area_addrs
) > 0) {
185 if (area
->is_type
& IS_LEVEL_1
)
186 lsp_generate(area
, IS_LEVEL_1
);
187 if (area
->is_type
& IS_LEVEL_2
)
188 lsp_generate(area
, IS_LEVEL_2
);
196 static int isis_instance_area_address_destroy(enum nb_event event
,
197 const struct lyd_node
*dnode
)
199 struct area_addr addr
, *addrp
= NULL
;
200 struct listnode
*node
;
202 struct isis_area
*area
;
203 const char *net_title
;
205 if (event
!= NB_EV_APPLY
)
208 net_title
= yang_dnode_get_string(dnode
, NULL
);
209 addr
.addr_len
= dotformat2buff(buff
, net_title
);
210 memcpy(addr
.area_addr
, buff
, (int)addr
.addr_len
);
211 area
= nb_running_get_entry(dnode
, NULL
, true);
212 for (ALL_LIST_ELEMENTS_RO(area
->area_addrs
, node
, addrp
)) {
213 if ((addrp
->addr_len
+ ISIS_SYS_ID_LEN
+ 1) == addr
.addr_len
214 && !memcmp(addrp
->area_addr
, addr
.area_addr
, addr
.addr_len
))
218 return NB_ERR_INCONSISTENCY
;
220 listnode_delete(area
->area_addrs
, addrp
);
221 XFREE(MTYPE_ISIS_AREA_ADDR
, addrp
);
223 * Last area address - reset the SystemID for this router
225 if (listcount(area
->area_addrs
) == 0) {
226 memset(isis
->sysid
, 0, ISIS_SYS_ID_LEN
);
228 if (isis
->debugs
& DEBUG_EVENTS
)
229 zlog_debug("Router has no SystemID");
236 * XPath: /frr-isisd:isis/instance/dynamic-hostname
238 static int isis_instance_dynamic_hostname_modify(enum nb_event event
,
239 const struct lyd_node
*dnode
,
240 union nb_resource
*resource
)
242 struct isis_area
*area
;
244 if (event
!= NB_EV_APPLY
)
247 area
= nb_running_get_entry(dnode
, NULL
, true);
248 isis_area_dynhostname_set(area
, yang_dnode_get_bool(dnode
, NULL
));
254 * XPath: /frr-isisd:isis/instance/attached
256 static int isis_instance_attached_modify(enum nb_event event
,
257 const struct lyd_node
*dnode
,
258 union nb_resource
*resource
)
260 struct isis_area
*area
;
263 if (event
!= NB_EV_APPLY
)
266 area
= nb_running_get_entry(dnode
, NULL
, true);
267 attached
= yang_dnode_get_bool(dnode
, NULL
);
268 isis_area_attached_bit_set(area
, attached
);
274 * XPath: /frr-isisd:isis/instance/overload
276 static int isis_instance_overload_modify(enum nb_event event
,
277 const struct lyd_node
*dnode
,
278 union nb_resource
*resource
)
280 struct isis_area
*area
;
283 if (event
!= NB_EV_APPLY
)
286 area
= nb_running_get_entry(dnode
, NULL
, true);
287 overload
= yang_dnode_get_bool(dnode
, NULL
);
288 isis_area_overload_bit_set(area
, overload
);
294 * XPath: /frr-isisd:isis/instance/metric-style
296 static int isis_instance_metric_style_modify(enum nb_event event
,
297 const struct lyd_node
*dnode
,
298 union nb_resource
*resource
)
300 struct isis_area
*area
;
301 bool old_metric
, new_metric
;
302 enum isis_metric_style metric_style
= yang_dnode_get_enum(dnode
, NULL
);
304 if (event
!= NB_EV_APPLY
)
307 area
= nb_running_get_entry(dnode
, NULL
, true);
308 old_metric
= (metric_style
== ISIS_WIDE_METRIC
) ? false : true;
309 new_metric
= (metric_style
== ISIS_NARROW_METRIC
) ? false : true;
310 isis_area_metricstyle_set(area
, old_metric
, new_metric
);
316 * XPath: /frr-isisd:isis/instance/purge-originator
318 static int isis_instance_purge_originator_modify(enum nb_event event
,
319 const struct lyd_node
*dnode
,
320 union nb_resource
*resource
)
322 struct isis_area
*area
;
324 if (event
!= NB_EV_APPLY
)
327 area
= nb_running_get_entry(dnode
, NULL
, true);
328 area
->purge_originator
= yang_dnode_get_bool(dnode
, NULL
);
334 * XPath: /frr-isisd:isis/instance/lsp/mtu
336 static int isis_instance_lsp_mtu_modify(enum nb_event event
,
337 const struct lyd_node
*dnode
,
338 union nb_resource
*resource
)
340 struct listnode
*node
;
341 struct isis_circuit
*circuit
;
342 uint16_t lsp_mtu
= yang_dnode_get_uint16(dnode
, NULL
);
343 struct isis_area
*area
;
347 area
= nb_running_get_entry(dnode
, NULL
, false);
350 for (ALL_LIST_ELEMENTS_RO(area
->circuit_list
, node
, circuit
)) {
351 if (circuit
->state
!= C_STATE_INIT
352 && circuit
->state
!= C_STATE_UP
)
354 if (lsp_mtu
> isis_circuit_pdu_size(circuit
)) {
356 EC_LIB_NB_CB_CONFIG_VALIDATE
,
357 "ISIS area contains circuit %s, which has a maximum PDU size of %zu",
358 circuit
->interface
->name
,
359 isis_circuit_pdu_size(circuit
));
360 return NB_ERR_VALIDATION
;
368 area
= nb_running_get_entry(dnode
, NULL
, true);
369 isis_area_lsp_mtu_set(area
, lsp_mtu
);
377 * XPath: /frr-isisd:isis/instance/lsp/refresh-interval/level-1
380 isis_instance_lsp_refresh_interval_level_1_modify(enum nb_event event
,
381 const struct lyd_node
*dnode
,
382 union nb_resource
*resource
)
384 struct isis_area
*area
;
387 if (event
!= NB_EV_APPLY
)
390 refr_int
= yang_dnode_get_uint16(dnode
, NULL
);
391 area
= nb_running_get_entry(dnode
, NULL
, true);
392 isis_area_lsp_refresh_set(area
, IS_LEVEL_1
, refr_int
);
398 * XPath: /frr-isisd:isis/instance/lsp/refresh-interval/level-2
401 isis_instance_lsp_refresh_interval_level_2_modify(enum nb_event event
,
402 const struct lyd_node
*dnode
,
403 union nb_resource
*resource
)
405 struct isis_area
*area
;
408 if (event
!= NB_EV_APPLY
)
411 refr_int
= yang_dnode_get_uint16(dnode
, NULL
);
412 area
= nb_running_get_entry(dnode
, NULL
, true);
413 isis_area_lsp_refresh_set(area
, IS_LEVEL_2
, refr_int
);
419 * XPath: /frr-isisd:isis/instance/lsp/maximum-lifetime/level-1
422 isis_instance_lsp_maximum_lifetime_level_1_modify(enum nb_event event
,
423 const struct lyd_node
*dnode
,
424 union nb_resource
*resource
)
426 struct isis_area
*area
;
429 if (event
!= NB_EV_APPLY
)
432 max_lt
= yang_dnode_get_uint16(dnode
, NULL
);
433 area
= nb_running_get_entry(dnode
, NULL
, true);
434 isis_area_max_lsp_lifetime_set(area
, IS_LEVEL_1
, max_lt
);
440 * XPath: /frr-isisd:isis/instance/lsp/maximum-lifetime/level-2
443 isis_instance_lsp_maximum_lifetime_level_2_modify(enum nb_event event
,
444 const struct lyd_node
*dnode
,
445 union nb_resource
*resource
)
447 struct isis_area
*area
;
450 if (event
!= NB_EV_APPLY
)
453 max_lt
= yang_dnode_get_uint16(dnode
, NULL
);
454 area
= nb_running_get_entry(dnode
, NULL
, true);
455 isis_area_max_lsp_lifetime_set(area
, IS_LEVEL_2
, max_lt
);
461 * XPath: /frr-isisd:isis/instance/lsp/generation-interval/level-1
463 static int isis_instance_lsp_generation_interval_level_1_modify(
464 enum nb_event event
, const struct lyd_node
*dnode
,
465 union nb_resource
*resource
)
467 struct isis_area
*area
;
470 if (event
!= NB_EV_APPLY
)
473 gen_int
= yang_dnode_get_uint16(dnode
, NULL
);
474 area
= nb_running_get_entry(dnode
, NULL
, true);
475 area
->lsp_gen_interval
[0] = gen_int
;
481 * XPath: /frr-isisd:isis/instance/lsp/generation-interval/level-2
483 static int isis_instance_lsp_generation_interval_level_2_modify(
484 enum nb_event event
, const struct lyd_node
*dnode
,
485 union nb_resource
*resource
)
487 struct isis_area
*area
;
490 if (event
!= NB_EV_APPLY
)
493 gen_int
= yang_dnode_get_uint16(dnode
, NULL
);
494 area
= nb_running_get_entry(dnode
, NULL
, true);
495 area
->lsp_gen_interval
[1] = gen_int
;
501 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay
503 static void ietf_backoff_delay_apply_finish(const struct lyd_node
*dnode
)
505 long init_delay
= yang_dnode_get_uint16(dnode
, "./init-delay");
506 long short_delay
= yang_dnode_get_uint16(dnode
, "./short-delay");
507 long long_delay
= yang_dnode_get_uint16(dnode
, "./long-delay");
508 long holddown
= yang_dnode_get_uint16(dnode
, "./hold-down");
509 long timetolearn
= yang_dnode_get_uint16(dnode
, "./time-to-learn");
510 struct isis_area
*area
= nb_running_get_entry(dnode
, NULL
, true);
511 size_t bufsiz
= strlen(area
->area_tag
) + sizeof("IS-IS Lx");
512 char *buf
= XCALLOC(MTYPE_TMP
, bufsiz
);
514 snprintf(buf
, bufsiz
, "IS-IS %s L1", area
->area_tag
);
515 spf_backoff_free(area
->spf_delay_ietf
[0]);
516 area
->spf_delay_ietf
[0] =
517 spf_backoff_new(master
, buf
, init_delay
, short_delay
,
518 long_delay
, holddown
, timetolearn
);
520 snprintf(buf
, bufsiz
, "IS-IS %s L2", area
->area_tag
);
521 spf_backoff_free(area
->spf_delay_ietf
[1]);
522 area
->spf_delay_ietf
[1] =
523 spf_backoff_new(master
, buf
, init_delay
, short_delay
,
524 long_delay
, holddown
, timetolearn
);
526 XFREE(MTYPE_TMP
, buf
);
530 isis_instance_spf_ietf_backoff_delay_create(enum nb_event event
,
531 const struct lyd_node
*dnode
,
532 union nb_resource
*resource
)
534 /* All the work is done in the apply_finish */
539 isis_instance_spf_ietf_backoff_delay_destroy(enum nb_event event
,
540 const struct lyd_node
*dnode
)
542 struct isis_area
*area
;
544 if (event
!= NB_EV_APPLY
)
547 area
= nb_running_get_entry(dnode
, NULL
, true);
548 spf_backoff_free(area
->spf_delay_ietf
[0]);
549 spf_backoff_free(area
->spf_delay_ietf
[1]);
550 area
->spf_delay_ietf
[0] = NULL
;
551 area
->spf_delay_ietf
[1] = NULL
;
557 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay/init-delay
559 static int isis_instance_spf_ietf_backoff_delay_init_delay_modify(
560 enum nb_event event
, const struct lyd_node
*dnode
,
561 union nb_resource
*resource
)
563 /* All the work is done in the apply_finish */
568 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay/short-delay
570 static int isis_instance_spf_ietf_backoff_delay_short_delay_modify(
571 enum nb_event event
, const struct lyd_node
*dnode
,
572 union nb_resource
*resource
)
574 /* All the work is done in the apply_finish */
579 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay/long-delay
581 static int isis_instance_spf_ietf_backoff_delay_long_delay_modify(
582 enum nb_event event
, const struct lyd_node
*dnode
,
583 union nb_resource
*resource
)
585 /* All the work is done in the apply_finish */
590 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay/hold-down
592 static int isis_instance_spf_ietf_backoff_delay_hold_down_modify(
593 enum nb_event event
, const struct lyd_node
*dnode
,
594 union nb_resource
*resource
)
596 /* All the work is done in the apply_finish */
601 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay/time-to-learn
603 static int isis_instance_spf_ietf_backoff_delay_time_to_learn_modify(
604 enum nb_event event
, const struct lyd_node
*dnode
,
605 union nb_resource
*resource
)
607 /* All the work is done in the apply_finish */
612 * XPath: /frr-isisd:isis/instance/spf/minimum-interval/level-1
615 isis_instance_spf_minimum_interval_level_1_modify(enum nb_event event
,
616 const struct lyd_node
*dnode
,
617 union nb_resource
*resource
)
619 struct isis_area
*area
;
621 if (event
!= NB_EV_APPLY
)
624 area
= nb_running_get_entry(dnode
, NULL
, true);
625 area
->min_spf_interval
[0] = yang_dnode_get_uint16(dnode
, NULL
);
631 * XPath: /frr-isisd:isis/instance/spf/minimum-interval/level-2
634 isis_instance_spf_minimum_interval_level_2_modify(enum nb_event event
,
635 const struct lyd_node
*dnode
,
636 union nb_resource
*resource
)
638 struct isis_area
*area
;
640 if (event
!= NB_EV_APPLY
)
643 area
= nb_running_get_entry(dnode
, NULL
, true);
644 area
->min_spf_interval
[1] = yang_dnode_get_uint16(dnode
, NULL
);
650 * XPath: /frr-isisd:isis/instance/area-password
652 static void area_password_apply_finish(const struct lyd_node
*dnode
)
654 const char *password
= yang_dnode_get_string(dnode
, "./password");
655 struct isis_area
*area
= nb_running_get_entry(dnode
, NULL
, true);
656 int pass_type
= yang_dnode_get_enum(dnode
, "./password-type");
657 uint8_t snp_auth
= yang_dnode_get_enum(dnode
, "./authenticate-snp");
660 case ISIS_PASSWD_TYPE_CLEARTXT
:
661 isis_area_passwd_cleartext_set(area
, IS_LEVEL_1
, password
,
664 case ISIS_PASSWD_TYPE_HMAC_MD5
:
665 isis_area_passwd_hmac_md5_set(area
, IS_LEVEL_1
, password
,
671 static int isis_instance_area_password_create(enum nb_event event
,
672 const struct lyd_node
*dnode
,
673 union nb_resource
*resource
)
675 /* actual setting is done in apply_finish */
679 static int isis_instance_area_password_destroy(enum nb_event event
,
680 const struct lyd_node
*dnode
)
682 struct isis_area
*area
;
684 if (event
!= NB_EV_APPLY
)
687 area
= nb_running_get_entry(dnode
, NULL
, true);
688 isis_area_passwd_unset(area
, IS_LEVEL_1
);
694 * XPath: /frr-isisd:isis/instance/area-password/password
697 isis_instance_area_password_password_modify(enum nb_event event
,
698 const struct lyd_node
*dnode
,
699 union nb_resource
*resource
)
701 /* actual setting is done in apply_finish */
706 * XPath: /frr-isisd:isis/instance/area-password/password-type
709 isis_instance_area_password_password_type_modify(enum nb_event event
,
710 const struct lyd_node
*dnode
,
711 union nb_resource
*resource
)
713 /* actual setting is done in apply_finish */
718 * XPath: /frr-isisd:isis/instance/area-password/authenticate-snp
720 static int isis_instance_area_password_authenticate_snp_modify(
721 enum nb_event event
, const struct lyd_node
*dnode
,
722 union nb_resource
*resource
)
724 /* actual setting is done in apply_finish */
729 * XPath: /frr-isisd:isis/instance/domain-password
731 static void domain_password_apply_finish(const struct lyd_node
*dnode
)
733 const char *password
= yang_dnode_get_string(dnode
, "./password");
734 struct isis_area
*area
= nb_running_get_entry(dnode
, NULL
, true);
735 int pass_type
= yang_dnode_get_enum(dnode
, "./password-type");
736 uint8_t snp_auth
= yang_dnode_get_enum(dnode
, "./authenticate-snp");
739 case ISIS_PASSWD_TYPE_CLEARTXT
:
740 isis_area_passwd_cleartext_set(area
, IS_LEVEL_2
, password
,
743 case ISIS_PASSWD_TYPE_HMAC_MD5
:
744 isis_area_passwd_hmac_md5_set(area
, IS_LEVEL_2
, password
,
750 static int isis_instance_domain_password_create(enum nb_event event
,
751 const struct lyd_node
*dnode
,
752 union nb_resource
*resource
)
754 /* actual setting is done in apply_finish */
758 static int isis_instance_domain_password_destroy(enum nb_event event
,
759 const struct lyd_node
*dnode
)
761 struct isis_area
*area
;
763 if (event
!= NB_EV_APPLY
)
766 area
= nb_running_get_entry(dnode
, NULL
, true);
767 isis_area_passwd_unset(area
, IS_LEVEL_2
);
773 * XPath: /frr-isisd:isis/instance/domain-password/password
776 isis_instance_domain_password_password_modify(enum nb_event event
,
777 const struct lyd_node
*dnode
,
778 union nb_resource
*resource
)
780 /* actual setting is done in apply_finish */
785 * XPath: /frr-isisd:isis/instance/domain-password/password-type
788 isis_instance_domain_password_password_type_modify(enum nb_event event
,
789 const struct lyd_node
*dnode
,
790 union nb_resource
*resource
)
792 /* actual setting is done in apply_finish */
797 * XPath: /frr-isisd:isis/instance/domain-password/authenticate-snp
799 static int isis_instance_domain_password_authenticate_snp_modify(
800 enum nb_event event
, const struct lyd_node
*dnode
,
801 union nb_resource
*resource
)
803 /* actual setting is done in apply_finish */
808 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv4
810 static void default_info_origin_apply_finish(const struct lyd_node
*dnode
,
813 int originate_type
= DEFAULT_ORIGINATE
;
814 unsigned long metric
= 0;
815 const char *routemap
= NULL
;
816 struct isis_area
*area
= nb_running_get_entry(dnode
, NULL
, true);
817 int level
= yang_dnode_get_enum(dnode
, "./level");
819 if (yang_dnode_get_bool(dnode
, "./always")) {
820 originate_type
= DEFAULT_ORIGINATE_ALWAYS
;
821 } else if (family
== AF_INET6
) {
823 "%s: Zebra doesn't implement default-originate for IPv6 yet, so use with care or use default-originate always.",
827 if (yang_dnode_exists(dnode
, "./metric"))
828 metric
= yang_dnode_get_uint32(dnode
, "./metric");
829 if (yang_dnode_exists(dnode
, "./route-map"))
830 routemap
= yang_dnode_get_string(dnode
, "./route-map");
832 isis_redist_set(area
, level
, family
, DEFAULT_ROUTE
, metric
, routemap
,
836 static void default_info_origin_ipv4_apply_finish(const struct lyd_node
*dnode
)
838 default_info_origin_apply_finish(dnode
, AF_INET
);
841 static void default_info_origin_ipv6_apply_finish(const struct lyd_node
*dnode
)
843 default_info_origin_apply_finish(dnode
, AF_INET6
);
846 static int isis_instance_default_information_originate_ipv4_create(
847 enum nb_event event
, const struct lyd_node
*dnode
,
848 union nb_resource
*resource
)
850 /* It's all done by default_info_origin_apply_finish */
854 static int isis_instance_default_information_originate_ipv4_destroy(
855 enum nb_event event
, const struct lyd_node
*dnode
)
857 struct isis_area
*area
;
860 if (event
!= NB_EV_APPLY
)
863 area
= nb_running_get_entry(dnode
, NULL
, true);
864 level
= yang_dnode_get_enum(dnode
, "./level");
865 isis_redist_unset(area
, level
, AF_INET
, DEFAULT_ROUTE
);
871 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv4/always
873 static int isis_instance_default_information_originate_ipv4_always_modify(
874 enum nb_event event
, const struct lyd_node
*dnode
,
875 union nb_resource
*resource
)
877 /* It's all done by default_info_origin_apply_finish */
882 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv4/route-map
884 static int isis_instance_default_information_originate_ipv4_route_map_modify(
885 enum nb_event event
, const struct lyd_node
*dnode
,
886 union nb_resource
*resource
)
888 /* It's all done by default_info_origin_apply_finish */
892 static int isis_instance_default_information_originate_ipv4_route_map_destroy(
893 enum nb_event event
, const struct lyd_node
*dnode
)
895 /* It's all done by default_info_origin_apply_finish */
900 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv4/metric
902 static int isis_instance_default_information_originate_ipv4_metric_modify(
903 enum nb_event event
, const struct lyd_node
*dnode
,
904 union nb_resource
*resource
)
906 /* It's all done by default_info_origin_apply_finish */
911 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv6
913 static int isis_instance_default_information_originate_ipv6_create(
914 enum nb_event event
, const struct lyd_node
*dnode
,
915 union nb_resource
*resource
)
917 /* It's all done by default_info_origin_apply_finish */
921 static int isis_instance_default_information_originate_ipv6_destroy(
922 enum nb_event event
, const struct lyd_node
*dnode
)
924 struct isis_area
*area
;
927 if (event
!= NB_EV_APPLY
)
930 area
= nb_running_get_entry(dnode
, NULL
, true);
931 level
= yang_dnode_get_enum(dnode
, "./level");
932 isis_redist_unset(area
, level
, AF_INET6
, DEFAULT_ROUTE
);
938 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv6/always
940 static int isis_instance_default_information_originate_ipv6_always_modify(
941 enum nb_event event
, const struct lyd_node
*dnode
,
942 union nb_resource
*resource
)
944 /* It's all done by default_info_origin_apply_finish */
949 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv6/route-map
951 static int isis_instance_default_information_originate_ipv6_route_map_modify(
952 enum nb_event event
, const struct lyd_node
*dnode
,
953 union nb_resource
*resource
)
955 /* It's all done by default_info_origin_apply_finish */
959 static int isis_instance_default_information_originate_ipv6_route_map_destroy(
960 enum nb_event event
, const struct lyd_node
*dnode
)
962 /* It's all done by default_info_origin_apply_finish */
967 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv6/metric
969 static int isis_instance_default_information_originate_ipv6_metric_modify(
970 enum nb_event event
, const struct lyd_node
*dnode
,
971 union nb_resource
*resource
)
973 /* It's all done by default_info_origin_apply_finish */
978 * XPath: /frr-isisd:isis/instance/redistribute/ipv4
980 static void redistribute_apply_finish(const struct lyd_node
*dnode
, int family
)
982 assert(family
== AF_INET
|| family
== AF_INET6
);
984 unsigned long metric
= 0;
985 const char *routemap
= NULL
;
986 struct isis_area
*area
;
988 type
= yang_dnode_get_enum(dnode
, "./protocol");
989 level
= yang_dnode_get_enum(dnode
, "./level");
990 area
= nb_running_get_entry(dnode
, NULL
, true);
992 if (yang_dnode_exists(dnode
, "./metric"))
993 metric
= yang_dnode_get_uint32(dnode
, "./metric");
994 if (yang_dnode_exists(dnode
, "./route-map"))
995 routemap
= yang_dnode_get_string(dnode
, "./route-map");
997 isis_redist_set(area
, level
, family
, type
, metric
, routemap
, 0);
1000 static void redistribute_ipv4_apply_finish(const struct lyd_node
*dnode
)
1002 redistribute_apply_finish(dnode
, AF_INET
);
1005 static void redistribute_ipv6_apply_finish(const struct lyd_node
*dnode
)
1007 redistribute_apply_finish(dnode
, AF_INET6
);
1010 static int isis_instance_redistribute_ipv4_create(enum nb_event event
,
1011 const struct lyd_node
*dnode
,
1012 union nb_resource
*resource
)
1014 /* It's all done by redistribute_apply_finish */
1018 static int isis_instance_redistribute_ipv4_destroy(enum nb_event event
,
1019 const struct lyd_node
*dnode
)
1021 struct isis_area
*area
;
1024 if (event
!= NB_EV_APPLY
)
1027 area
= nb_running_get_entry(dnode
, NULL
, true);
1028 level
= yang_dnode_get_enum(dnode
, "./level");
1029 type
= yang_dnode_get_enum(dnode
, "./protocol");
1030 isis_redist_unset(area
, level
, AF_INET
, type
);
1036 * XPath: /frr-isisd:isis/instance/redistribute/ipv4/route-map
1039 isis_instance_redistribute_ipv4_route_map_modify(enum nb_event event
,
1040 const struct lyd_node
*dnode
,
1041 union nb_resource
*resource
)
1043 /* It's all done by redistribute_apply_finish */
1048 isis_instance_redistribute_ipv4_route_map_destroy(enum nb_event event
,
1049 const struct lyd_node
*dnode
)
1051 /* It's all done by redistribute_apply_finish */
1056 * XPath: /frr-isisd:isis/instance/redistribute/ipv4/metric
1059 isis_instance_redistribute_ipv4_metric_modify(enum nb_event event
,
1060 const struct lyd_node
*dnode
,
1061 union nb_resource
*resource
)
1063 /* It's all done by redistribute_apply_finish */
1068 * XPath: /frr-isisd:isis/instance/redistribute/ipv6
1070 static int isis_instance_redistribute_ipv6_create(enum nb_event event
,
1071 const struct lyd_node
*dnode
,
1072 union nb_resource
*resource
)
1074 /* It's all done by redistribute_apply_finish */
1078 static int isis_instance_redistribute_ipv6_destroy(enum nb_event event
,
1079 const struct lyd_node
*dnode
)
1081 struct isis_area
*area
;
1084 if (event
!= NB_EV_APPLY
)
1087 area
= nb_running_get_entry(dnode
, NULL
, true);
1088 level
= yang_dnode_get_enum(dnode
, "./level");
1089 type
= yang_dnode_get_enum(dnode
, "./protocol");
1090 isis_redist_unset(area
, level
, AF_INET6
, type
);
1096 * XPath: /frr-isisd:isis/instance/redistribute/ipv6/route-map
1099 isis_instance_redistribute_ipv6_route_map_modify(enum nb_event event
,
1100 const struct lyd_node
*dnode
,
1101 union nb_resource
*resource
)
1103 /* It's all done by redistribute_apply_finish */
1108 isis_instance_redistribute_ipv6_route_map_destroy(enum nb_event event
,
1109 const struct lyd_node
*dnode
)
1111 /* It's all done by redistribute_apply_finish */
1116 * XPath: /frr-isisd:isis/instance/redistribute/ipv6/metric
1119 isis_instance_redistribute_ipv6_metric_modify(enum nb_event event
,
1120 const struct lyd_node
*dnode
,
1121 union nb_resource
*resource
)
1123 /* It's all done by redistribute_apply_finish */
1128 * XPath: /frr-isisd:isis/instance/multi-topology/ipv4-multicast
1130 static int isis_multi_topology_common(enum nb_event event
,
1131 const struct lyd_node
*dnode
,
1132 const char *topology
, bool create
)
1134 struct isis_area
*area
;
1135 struct isis_area_mt_setting
*setting
;
1136 uint16_t mtid
= isis_str2mtid(topology
);
1139 case NB_EV_VALIDATE
:
1140 if (mtid
== (uint16_t)-1) {
1141 flog_warn(EC_LIB_NB_CB_CONFIG_VALIDATE
,
1142 "Unknown topology %s", topology
);
1143 return NB_ERR_VALIDATION
;
1150 area
= nb_running_get_entry(dnode
, NULL
, true);
1151 setting
= area_get_mt_setting(area
, mtid
);
1152 setting
->enabled
= create
;
1153 lsp_regenerate_schedule(area
, IS_LEVEL_1
| IS_LEVEL_2
, 0);
1160 static int isis_multi_topology_overload_common(enum nb_event event
,
1161 const struct lyd_node
*dnode
,
1162 const char *topology
)
1164 struct isis_area
*area
;
1165 struct isis_area_mt_setting
*setting
;
1166 uint16_t mtid
= isis_str2mtid(topology
);
1168 /* validation is done in isis_multi_topology_common */
1169 if (event
!= NB_EV_APPLY
)
1172 area
= nb_running_get_entry(dnode
, NULL
, true);
1173 setting
= area_get_mt_setting(area
, mtid
);
1174 setting
->overload
= yang_dnode_get_bool(dnode
, NULL
);
1175 if (setting
->enabled
)
1176 lsp_regenerate_schedule(area
, IS_LEVEL_1
| IS_LEVEL_2
, 0);
1182 isis_instance_multi_topology_ipv4_multicast_create(enum nb_event event
,
1183 const struct lyd_node
*dnode
,
1184 union nb_resource
*resource
)
1186 return isis_multi_topology_common(event
, dnode
, "ipv4-multicast", true);
1190 isis_instance_multi_topology_ipv4_multicast_destroy(enum nb_event event
,
1191 const struct lyd_node
*dnode
)
1193 return isis_multi_topology_common(event
, dnode
, "ipv4-multicast",
1198 * XPath: /frr-isisd:isis/instance/multi-topology/ipv4-multicast/overload
1200 static int isis_instance_multi_topology_ipv4_multicast_overload_modify(
1201 enum nb_event event
, const struct lyd_node
*dnode
,
1202 union nb_resource
*resource
)
1204 return isis_multi_topology_overload_common(event
, dnode
,
1209 * XPath: /frr-isisd:isis/instance/multi-topology/ipv4-management
1211 static int isis_instance_multi_topology_ipv4_management_create(
1212 enum nb_event event
, const struct lyd_node
*dnode
,
1213 union nb_resource
*resource
)
1215 return isis_multi_topology_common(event
, dnode
, "ipv4-mgmt", true);
1218 static int isis_instance_multi_topology_ipv4_management_destroy(
1219 enum nb_event event
, const struct lyd_node
*dnode
)
1221 return isis_multi_topology_common(event
, dnode
, "ipv4-mgmt", false);
1225 * XPath: /frr-isisd:isis/instance/multi-topology/ipv4-management/overload
1227 static int isis_instance_multi_topology_ipv4_management_overload_modify(
1228 enum nb_event event
, const struct lyd_node
*dnode
,
1229 union nb_resource
*resource
)
1231 return isis_multi_topology_overload_common(event
, dnode
, "ipv4-mgmt");
1235 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-unicast
1238 isis_instance_multi_topology_ipv6_unicast_create(enum nb_event event
,
1239 const struct lyd_node
*dnode
,
1240 union nb_resource
*resource
)
1242 return isis_multi_topology_common(event
, dnode
, "ipv6-unicast", true);
1246 isis_instance_multi_topology_ipv6_unicast_destroy(enum nb_event event
,
1247 const struct lyd_node
*dnode
)
1249 return isis_multi_topology_common(event
, dnode
, "ipv6-unicast", false);
1253 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-unicast/overload
1255 static int isis_instance_multi_topology_ipv6_unicast_overload_modify(
1256 enum nb_event event
, const struct lyd_node
*dnode
,
1257 union nb_resource
*resource
)
1259 return isis_multi_topology_overload_common(event
, dnode
,
1264 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-multicast
1267 isis_instance_multi_topology_ipv6_multicast_create(enum nb_event event
,
1268 const struct lyd_node
*dnode
,
1269 union nb_resource
*resource
)
1271 return isis_multi_topology_common(event
, dnode
, "ipv6-multicast", true);
1275 isis_instance_multi_topology_ipv6_multicast_destroy(enum nb_event event
,
1276 const struct lyd_node
*dnode
)
1278 return isis_multi_topology_common(event
, dnode
, "ipv6-multicast",
1283 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-multicast/overload
1285 static int isis_instance_multi_topology_ipv6_multicast_overload_modify(
1286 enum nb_event event
, const struct lyd_node
*dnode
,
1287 union nb_resource
*resource
)
1289 return isis_multi_topology_overload_common(event
, dnode
,
1294 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-management
1296 static int isis_instance_multi_topology_ipv6_management_create(
1297 enum nb_event event
, const struct lyd_node
*dnode
,
1298 union nb_resource
*resource
)
1300 return isis_multi_topology_common(event
, dnode
, "ipv6-mgmt", true);
1303 static int isis_instance_multi_topology_ipv6_management_destroy(
1304 enum nb_event event
, const struct lyd_node
*dnode
)
1306 return isis_multi_topology_common(event
, dnode
, "ipv6-mgmt", false);
1310 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-management/overload
1312 static int isis_instance_multi_topology_ipv6_management_overload_modify(
1313 enum nb_event event
, const struct lyd_node
*dnode
,
1314 union nb_resource
*resource
)
1316 return isis_multi_topology_overload_common(event
, dnode
, "ipv6-mgmt");
1320 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-dstsrc
1323 isis_instance_multi_topology_ipv6_dstsrc_create(enum nb_event event
,
1324 const struct lyd_node
*dnode
,
1325 union nb_resource
*resource
)
1327 return isis_multi_topology_common(event
, dnode
, "ipv6-dstsrc", true);
1331 isis_instance_multi_topology_ipv6_dstsrc_destroy(enum nb_event event
,
1332 const struct lyd_node
*dnode
)
1334 return isis_multi_topology_common(event
, dnode
, "ipv6-dstsrc", false);
1338 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-dstsrc/overload
1340 static int isis_instance_multi_topology_ipv6_dstsrc_overload_modify(
1341 enum nb_event event
, const struct lyd_node
*dnode
,
1342 union nb_resource
*resource
)
1344 return isis_multi_topology_overload_common(event
, dnode
, "ipv6-dstsrc");
1348 * XPath: /frr-isisd:isis/instance/log-adjacency-changes
1351 isis_instance_log_adjacency_changes_modify(enum nb_event event
,
1352 const struct lyd_node
*dnode
,
1353 union nb_resource
*resource
)
1355 struct isis_area
*area
;
1356 bool log
= yang_dnode_get_bool(dnode
, NULL
);
1358 if (event
!= NB_EV_APPLY
)
1361 area
= nb_running_get_entry(dnode
, NULL
, true);
1362 area
->log_adj_changes
= log
? 1 : 0;
1368 * XPath: /frr-isisd:isis/instance/mpls-te
1370 static int isis_instance_mpls_te_create(enum nb_event event
,
1371 const struct lyd_node
*dnode
,
1372 union nb_resource
*resource
)
1374 struct listnode
*node
;
1375 struct isis_area
*area
;
1376 struct isis_circuit
*circuit
;
1378 if (event
!= NB_EV_APPLY
)
1381 area
= nb_running_get_entry(dnode
, NULL
, true);
1382 if (area
->mta
== NULL
) {
1384 struct mpls_te_area
*new;
1386 zlog_debug("ISIS MPLS-TE: Initialize area %s",
1389 new = XCALLOC(MTYPE_ISIS_MPLS_TE
, sizeof(struct mpls_te_area
));
1391 /* Initialize MPLS_TE structure */
1392 new->status
= enable
;
1394 new->inter_as
= off
;
1395 new->interas_areaid
.s_addr
= 0;
1396 new->router_id
.s_addr
= 0;
1400 area
->mta
->status
= enable
;
1404 * Following code is intended to handle two cases;
1406 * 1) MPLS-TE was disabled at startup time, but now become enabled.
1407 * In this case, we must enable MPLS-TE Circuit regarding interface
1409 * 2) MPLS-TE was once enabled then disabled, and now enabled again.
1411 for (ALL_LIST_ELEMENTS_RO(area
->circuit_list
, node
, circuit
)) {
1412 if (circuit
->mtc
== NULL
|| IS_FLOOD_AS(circuit
->mtc
->type
))
1415 if (!IS_MPLS_TE(circuit
->mtc
)
1416 && HAS_LINK_PARAMS(circuit
->interface
))
1417 circuit
->mtc
->status
= enable
;
1421 /* Reoriginate STD_TE & GMPLS circuits */
1423 lsp_regenerate_schedule(circuit
->area
, circuit
->is_type
,
1430 static int isis_instance_mpls_te_destroy(enum nb_event event
,
1431 const struct lyd_node
*dnode
)
1433 struct listnode
*node
;
1434 struct isis_area
*area
;
1435 struct isis_circuit
*circuit
;
1437 if (event
!= NB_EV_APPLY
)
1440 area
= nb_running_get_entry(dnode
, NULL
, true);
1441 if (IS_MPLS_TE(area
->mta
))
1442 area
->mta
->status
= disable
;
1446 /* Flush LSP if circuit engage */
1447 for (ALL_LIST_ELEMENTS_RO(area
->circuit_list
, node
, circuit
)) {
1448 if (circuit
->mtc
== NULL
|| (circuit
->mtc
->status
== disable
))
1451 /* disable MPLS_TE Circuit */
1452 circuit
->mtc
->status
= disable
;
1454 /* Re-originate circuit without STD_TE & GMPLS parameters */
1456 lsp_regenerate_schedule(circuit
->area
, circuit
->is_type
,
1464 * XPath: /frr-isisd:isis/instance/mpls-te/router-address
1466 static int isis_instance_mpls_te_router_address_modify(enum nb_event event
,
1467 const struct lyd_node
*dnode
,
1468 union nb_resource
*resource
)
1470 struct in_addr value
;
1471 struct isis_area
*area
;
1473 if (event
!= NB_EV_APPLY
)
1476 area
= nb_running_get_entry(dnode
, NULL
, true);
1477 /* only proceed if MPLS-TE is enabled */
1478 if (!IS_MPLS_TE(area
->mta
))
1481 /* Update Area Router ID */
1482 yang_dnode_get_ipv4(&value
, dnode
, NULL
);
1483 area
->mta
->router_id
.s_addr
= value
.s_addr
;
1485 /* And re-schedule LSP update */
1486 if (listcount(area
->area_addrs
) > 0)
1487 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1492 static int isis_instance_mpls_te_router_address_destroy(enum nb_event event
,
1493 const struct lyd_node
*dnode
)
1495 struct isis_area
*area
;
1497 if (event
!= NB_EV_APPLY
)
1500 area
= nb_running_get_entry(dnode
, NULL
, true);
1501 /* only proceed if MPLS-TE is enabled */
1502 if (!IS_MPLS_TE(area
->mta
))
1505 /* Reset Area Router ID */
1506 area
->mta
->router_id
.s_addr
= INADDR_ANY
;
1508 /* And re-schedule LSP update */
1509 if (listcount(area
->area_addrs
) > 0)
1510 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1516 * XPath: /frr-interface:lib/interface/frr-isisd:isis
1518 static int lib_interface_isis_create(enum nb_event event
,
1519 const struct lyd_node
*dnode
,
1520 union nb_resource
*resource
)
1522 struct isis_area
*area
;
1523 struct interface
*ifp
;
1524 struct isis_circuit
*circuit
;
1525 const char *area_tag
= yang_dnode_get_string(dnode
, "./area-tag");
1527 if (event
!= NB_EV_APPLY
)
1530 area
= isis_area_lookup(area_tag
);
1531 /* The area should have already be created. We are
1532 * setting the priority of the global isis area creation
1533 * slightly lower, so it should be executed first, but I
1534 * cannot rely on that so here I have to check.
1538 EC_LIB_NB_CB_CONFIG_APPLY
,
1539 "%s: attempt to create circuit for area %s before the area has been created",
1540 __func__
, area_tag
);
1544 ifp
= nb_running_get_entry(dnode
, NULL
, true);
1545 circuit
= isis_circuit_create(area
, ifp
);
1546 assert(circuit
->state
== C_STATE_CONF
|| circuit
->state
== C_STATE_UP
);
1547 nb_running_set_entry(dnode
, circuit
);
1552 static int lib_interface_isis_destroy(enum nb_event event
,
1553 const struct lyd_node
*dnode
)
1555 struct isis_circuit
*circuit
;
1557 if (event
!= NB_EV_APPLY
)
1560 circuit
= nb_running_unset_entry(dnode
);
1562 return NB_ERR_INCONSISTENCY
;
1563 /* delete circuit through csm changes */
1564 switch (circuit
->state
) {
1566 isis_csm_state_change(IF_DOWN_FROM_Z
, circuit
,
1567 circuit
->interface
);
1568 isis_csm_state_change(ISIS_DISABLE
, circuit
, circuit
->area
);
1571 isis_csm_state_change(ISIS_DISABLE
, circuit
, circuit
->area
);
1574 isis_csm_state_change(IF_DOWN_FROM_Z
, circuit
,
1575 circuit
->interface
);
1583 * XPath: /frr-interface:lib/interface/frr-isisd:isis/area-tag
1585 static int lib_interface_isis_area_tag_modify(enum nb_event event
,
1586 const struct lyd_node
*dnode
,
1587 union nb_resource
*resource
)
1589 struct isis_circuit
*circuit
;
1590 struct interface
*ifp
;
1592 const char *area_tag
, *ifname
, *vrfname
;
1594 if (event
== NB_EV_VALIDATE
) {
1595 /* libyang doesn't like relative paths across module boundaries
1597 ifname
= yang_dnode_get_string(dnode
->parent
->parent
, "./name");
1598 vrfname
= yang_dnode_get_string(dnode
->parent
->parent
, "./vrf");
1599 vrf
= vrf_lookup_by_name(vrfname
);
1601 ifp
= if_lookup_by_name(ifname
, vrf
->vrf_id
);
1604 circuit
= circuit_lookup_by_ifp(ifp
, isis
->init_circ_list
);
1605 area_tag
= yang_dnode_get_string(dnode
, NULL
);
1606 if (circuit
&& circuit
->area
&& circuit
->area
->area_tag
1607 && strcmp(circuit
->area
->area_tag
, area_tag
)) {
1608 flog_warn(EC_LIB_NB_CB_CONFIG_VALIDATE
,
1609 "ISIS circuit is already defined on %s",
1610 circuit
->area
->area_tag
);
1611 return NB_ERR_VALIDATION
;
1619 * XPath: /frr-interface:lib/interface/frr-isisd:isis/circuit-type
1621 static int lib_interface_isis_circuit_type_modify(enum nb_event event
,
1622 const struct lyd_node
*dnode
,
1623 union nb_resource
*resource
)
1625 int circ_type
= yang_dnode_get_enum(dnode
, NULL
);
1626 struct isis_circuit
*circuit
;
1627 struct interface
*ifp
;
1629 const char *ifname
, *vrfname
;
1632 case NB_EV_VALIDATE
:
1633 /* libyang doesn't like relative paths across module boundaries
1635 ifname
= yang_dnode_get_string(dnode
->parent
->parent
, "./name");
1636 vrfname
= yang_dnode_get_string(dnode
->parent
->parent
, "./vrf");
1637 vrf
= vrf_lookup_by_name(vrfname
);
1639 ifp
= if_lookup_by_name(ifname
, vrf
->vrf_id
);
1642 circuit
= circuit_lookup_by_ifp(ifp
, isis
->init_circ_list
);
1643 if (circuit
&& circuit
->state
== C_STATE_UP
1644 && circuit
->area
->is_type
!= IS_LEVEL_1_AND_2
1645 && circuit
->area
->is_type
!= circ_type
) {
1646 flog_warn(EC_LIB_NB_CB_CONFIG_VALIDATE
,
1647 "Invalid circuit level for area %s",
1648 circuit
->area
->area_tag
);
1649 return NB_ERR_VALIDATION
;
1656 circuit
= nb_running_get_entry(dnode
, NULL
, true);
1657 isis_circuit_is_type_set(circuit
, circ_type
);
1665 * XPath: /frr-interface:lib/interface/frr-isisd:isis/ipv4-routing
1667 static int lib_interface_isis_ipv4_routing_modify(enum nb_event event
,
1668 const struct lyd_node
*dnode
,
1669 union nb_resource
*resource
)
1672 struct isis_circuit
*circuit
;
1674 if (event
!= NB_EV_APPLY
)
1677 circuit
= nb_running_get_entry(dnode
, NULL
, true);
1678 ipv4
= yang_dnode_get_bool(dnode
, NULL
);
1679 ipv6
= yang_dnode_get_bool(dnode
, "../ipv6-routing");
1680 isis_circuit_af_set(circuit
, ipv4
, ipv6
);
1686 * XPath: /frr-interface:lib/interface/frr-isisd:isis/ipv6-routing
1688 static int lib_interface_isis_ipv6_routing_modify(enum nb_event event
,
1689 const struct lyd_node
*dnode
,
1690 union nb_resource
*resource
)
1693 struct isis_circuit
*circuit
;
1695 if (event
!= NB_EV_APPLY
)
1698 circuit
= nb_running_get_entry(dnode
, NULL
, true);
1699 ipv4
= yang_dnode_exists(dnode
, "../ipv4-routing");
1700 ipv6
= yang_dnode_get_bool(dnode
, NULL
);
1701 isis_circuit_af_set(circuit
, ipv4
, ipv6
);
1707 * XPath: /frr-interface:lib/interface/frr-isisd:isis/csnp-interval/level-1
1710 lib_interface_isis_csnp_interval_level_1_modify(enum nb_event event
,
1711 const struct lyd_node
*dnode
,
1712 union nb_resource
*resource
)
1714 struct isis_circuit
*circuit
;
1716 if (event
!= NB_EV_APPLY
)
1719 circuit
= nb_running_get_entry(dnode
, NULL
, true);
1720 circuit
->csnp_interval
[0] = yang_dnode_get_uint16(dnode
, NULL
);
1726 * XPath: /frr-interface:lib/interface/frr-isisd:isis/csnp-interval/level-2
1729 lib_interface_isis_csnp_interval_level_2_modify(enum nb_event event
,
1730 const struct lyd_node
*dnode
,
1731 union nb_resource
*resource
)
1733 struct isis_circuit
*circuit
;
1735 if (event
!= NB_EV_APPLY
)
1738 circuit
= nb_running_get_entry(dnode
, NULL
, true);
1739 circuit
->csnp_interval
[1] = yang_dnode_get_uint16(dnode
, NULL
);
1745 * XPath: /frr-interface:lib/interface/frr-isisd:isis/psnp-interval/level-1
1748 lib_interface_isis_psnp_interval_level_1_modify(enum nb_event event
,
1749 const struct lyd_node
*dnode
,
1750 union nb_resource
*resource
)
1752 struct isis_circuit
*circuit
;
1754 if (event
!= NB_EV_APPLY
)
1757 circuit
= nb_running_get_entry(dnode
, NULL
, true);
1758 circuit
->psnp_interval
[0] = yang_dnode_get_uint16(dnode
, NULL
);
1764 * XPath: /frr-interface:lib/interface/frr-isisd:isis/psnp-interval/level-2
1767 lib_interface_isis_psnp_interval_level_2_modify(enum nb_event event
,
1768 const struct lyd_node
*dnode
,
1769 union nb_resource
*resource
)
1771 struct isis_circuit
*circuit
;
1773 if (event
!= NB_EV_APPLY
)
1776 circuit
= nb_running_get_entry(dnode
, NULL
, true);
1777 circuit
->psnp_interval
[1] = yang_dnode_get_uint16(dnode
, NULL
);
1783 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/padding
1785 static int lib_interface_isis_hello_padding_modify(enum nb_event event
,
1786 const struct lyd_node
*dnode
,
1787 union nb_resource
*resource
)
1789 struct isis_circuit
*circuit
;
1791 if (event
!= NB_EV_APPLY
)
1794 circuit
= nb_running_get_entry(dnode
, NULL
, true);
1795 circuit
->pad_hellos
= yang_dnode_get_bool(dnode
, NULL
);
1801 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/interval/level-1
1804 lib_interface_isis_hello_interval_level_1_modify(enum nb_event event
,
1805 const struct lyd_node
*dnode
,
1806 union nb_resource
*resource
)
1808 struct isis_circuit
*circuit
;
1811 if (event
!= NB_EV_APPLY
)
1814 circuit
= nb_running_get_entry(dnode
, NULL
, true);
1815 interval
= yang_dnode_get_uint32(dnode
, NULL
);
1816 circuit
->hello_interval
[0] = interval
;
1822 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/interval/level-2
1825 lib_interface_isis_hello_interval_level_2_modify(enum nb_event event
,
1826 const struct lyd_node
*dnode
,
1827 union nb_resource
*resource
)
1829 struct isis_circuit
*circuit
;
1832 if (event
!= NB_EV_APPLY
)
1835 circuit
= nb_running_get_entry(dnode
, NULL
, true);
1836 interval
= yang_dnode_get_uint32(dnode
, NULL
);
1837 circuit
->hello_interval
[1] = interval
;
1843 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/multiplier/level-1
1846 lib_interface_isis_hello_multiplier_level_1_modify(enum nb_event event
,
1847 const struct lyd_node
*dnode
,
1848 union nb_resource
*resource
)
1850 struct isis_circuit
*circuit
;
1853 if (event
!= NB_EV_APPLY
)
1856 circuit
= nb_running_get_entry(dnode
, NULL
, true);
1857 multi
= yang_dnode_get_uint16(dnode
, NULL
);
1858 circuit
->hello_multiplier
[0] = multi
;
1864 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/multiplier/level-2
1867 lib_interface_isis_hello_multiplier_level_2_modify(enum nb_event event
,
1868 const struct lyd_node
*dnode
,
1869 union nb_resource
*resource
)
1871 struct isis_circuit
*circuit
;
1874 if (event
!= NB_EV_APPLY
)
1877 circuit
= nb_running_get_entry(dnode
, NULL
, true);
1878 multi
= yang_dnode_get_uint16(dnode
, NULL
);
1879 circuit
->hello_multiplier
[1] = multi
;
1885 * XPath: /frr-interface:lib/interface/frr-isisd:isis/metric/level-1
1888 lib_interface_isis_metric_level_1_modify(enum nb_event event
,
1889 const struct lyd_node
*dnode
,
1890 union nb_resource
*resource
)
1892 struct isis_circuit
*circuit
;
1895 if (event
!= NB_EV_APPLY
)
1898 circuit
= nb_running_get_entry(dnode
, NULL
, true);
1899 met
= yang_dnode_get_uint32(dnode
, NULL
);
1900 isis_circuit_metric_set(circuit
, IS_LEVEL_1
, met
);
1906 * XPath: /frr-interface:lib/interface/frr-isisd:isis/metric/level-2
1909 lib_interface_isis_metric_level_2_modify(enum nb_event event
,
1910 const struct lyd_node
*dnode
,
1911 union nb_resource
*resource
)
1913 struct isis_circuit
*circuit
;
1916 if (event
!= NB_EV_APPLY
)
1919 circuit
= nb_running_get_entry(dnode
, NULL
, true);
1920 met
= yang_dnode_get_uint32(dnode
, NULL
);
1921 isis_circuit_metric_set(circuit
, IS_LEVEL_2
, met
);
1927 * XPath: /frr-interface:lib/interface/frr-isisd:isis/priority/level-1
1930 lib_interface_isis_priority_level_1_modify(enum nb_event event
,
1931 const struct lyd_node
*dnode
,
1932 union nb_resource
*resource
)
1934 struct isis_circuit
*circuit
;
1936 if (event
!= NB_EV_APPLY
)
1939 circuit
= nb_running_get_entry(dnode
, NULL
, true);
1940 circuit
->priority
[0] = yang_dnode_get_uint8(dnode
, NULL
);
1946 * XPath: /frr-interface:lib/interface/frr-isisd:isis/priority/level-2
1949 lib_interface_isis_priority_level_2_modify(enum nb_event event
,
1950 const struct lyd_node
*dnode
,
1951 union nb_resource
*resource
)
1953 struct isis_circuit
*circuit
;
1955 if (event
!= NB_EV_APPLY
)
1958 circuit
= nb_running_get_entry(dnode
, NULL
, true);
1959 circuit
->priority
[1] = yang_dnode_get_uint8(dnode
, NULL
);
1965 * XPath: /frr-interface:lib/interface/frr-isisd:isis/network-type
1967 static int lib_interface_isis_network_type_modify(enum nb_event event
,
1968 const struct lyd_node
*dnode
,
1969 union nb_resource
*resource
)
1971 struct isis_circuit
*circuit
;
1972 int net_type
= yang_dnode_get_enum(dnode
, NULL
);
1975 case NB_EV_VALIDATE
:
1976 circuit
= nb_running_get_entry(dnode
, NULL
, false);
1979 if (circuit
->circ_type
== CIRCUIT_T_LOOPBACK
) {
1981 EC_LIB_NB_CB_CONFIG_VALIDATE
,
1982 "Cannot change network type on loopback interface");
1983 return NB_ERR_VALIDATION
;
1985 if (net_type
== CIRCUIT_T_BROADCAST
1986 && circuit
->state
== C_STATE_UP
1987 && !if_is_broadcast(circuit
->interface
)) {
1989 EC_LIB_NB_CB_CONFIG_VALIDATE
,
1990 "Cannot configure non-broadcast interface for broadcast operation");
1991 return NB_ERR_VALIDATION
;
1998 circuit
= nb_running_get_entry(dnode
, NULL
, true);
1999 isis_circuit_circ_type_set(circuit
, net_type
);
2007 * XPath: /frr-interface:lib/interface/frr-isisd:isis/passive
2009 static int lib_interface_isis_passive_modify(enum nb_event event
,
2010 const struct lyd_node
*dnode
,
2011 union nb_resource
*resource
)
2013 struct isis_circuit
*circuit
;
2014 struct isis_area
*area
;
2015 struct interface
*ifp
;
2016 bool passive
= yang_dnode_get_bool(dnode
, NULL
);
2018 /* validation only applies if we are setting passive to false */
2019 if (!passive
&& event
== NB_EV_VALIDATE
) {
2020 circuit
= nb_running_get_entry(dnode
, NULL
, false);
2023 ifp
= circuit
->interface
;
2026 if (if_is_loopback(ifp
)) {
2027 flog_warn(EC_LIB_NB_CB_CONFIG_VALIDATE
,
2028 "Loopback is always passive");
2029 return NB_ERR_VALIDATION
;
2033 if (event
!= NB_EV_APPLY
)
2036 circuit
= nb_running_get_entry(dnode
, NULL
, true);
2037 if (circuit
->state
!= C_STATE_UP
) {
2038 circuit
->is_passive
= passive
;
2040 area
= circuit
->area
;
2041 isis_csm_state_change(ISIS_DISABLE
, circuit
, area
);
2042 circuit
->is_passive
= passive
;
2043 isis_csm_state_change(ISIS_ENABLE
, circuit
, area
);
2050 * XPath: /frr-interface:lib/interface/frr-isisd:isis/password
2052 static int lib_interface_isis_password_create(enum nb_event event
,
2053 const struct lyd_node
*dnode
,
2054 union nb_resource
*resource
)
2059 static int lib_interface_isis_password_destroy(enum nb_event event
,
2060 const struct lyd_node
*dnode
)
2062 struct isis_circuit
*circuit
;
2064 if (event
!= NB_EV_APPLY
)
2067 circuit
= nb_running_get_entry(dnode
, NULL
, true);
2068 isis_circuit_passwd_unset(circuit
);
2074 * XPath: /frr-interface:lib/interface/frr-isisd:isis/password/password
2077 lib_interface_isis_password_password_modify(enum nb_event event
,
2078 const struct lyd_node
*dnode
,
2079 union nb_resource
*resource
)
2081 struct isis_circuit
*circuit
;
2082 const char *password
;
2084 if (event
!= NB_EV_APPLY
)
2087 password
= yang_dnode_get_string(dnode
, NULL
);
2088 circuit
= nb_running_get_entry(dnode
, NULL
, true);
2090 isis_circuit_passwd_set(circuit
, circuit
->passwd
.type
, password
);
2096 * XPath: /frr-interface:lib/interface/frr-isisd:isis/password/password-type
2099 lib_interface_isis_password_password_type_modify(enum nb_event event
,
2100 const struct lyd_node
*dnode
,
2101 union nb_resource
*resource
)
2103 struct isis_circuit
*circuit
;
2106 if (event
!= NB_EV_APPLY
)
2109 pass_type
= yang_dnode_get_enum(dnode
, NULL
);
2110 circuit
= nb_running_get_entry(dnode
, NULL
, true);
2111 circuit
->passwd
.type
= pass_type
;
2118 * /frr-interface:lib/interface/frr-isisd:isis/disable-three-way-handshake
2120 static int lib_interface_isis_disable_three_way_handshake_modify(
2121 enum nb_event event
, const struct lyd_node
*dnode
,
2122 union nb_resource
*resource
)
2124 struct isis_circuit
*circuit
;
2126 if (event
!= NB_EV_APPLY
)
2129 circuit
= nb_running_get_entry(dnode
, NULL
, true);
2130 circuit
->disable_threeway_adj
= yang_dnode_get_bool(dnode
, NULL
);
2137 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-unicast
2139 static int lib_interface_isis_multi_topology_common(
2140 enum nb_event event
, const struct lyd_node
*dnode
, uint16_t mtid
)
2142 struct isis_circuit
*circuit
;
2146 case NB_EV_VALIDATE
:
2147 circuit
= nb_running_get_entry(dnode
, NULL
, false);
2148 if (circuit
&& circuit
->area
&& circuit
->area
->oldmetric
) {
2150 EC_LIB_NB_CB_CONFIG_VALIDATE
,
2151 "Multi topology IS-IS can only be used with wide metrics");
2152 return NB_ERR_VALIDATION
;
2159 circuit
= nb_running_get_entry(dnode
, NULL
, true);
2160 value
= yang_dnode_get_bool(dnode
, NULL
);
2161 isis_circuit_mt_enabled_set(circuit
, mtid
, value
);
2168 static int lib_interface_isis_multi_topology_ipv4_unicast_modify(
2169 enum nb_event event
, const struct lyd_node
*dnode
,
2170 union nb_resource
*resource
)
2172 return lib_interface_isis_multi_topology_common(event
, dnode
,
2173 ISIS_MT_IPV4_UNICAST
);
2178 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-multicast
2180 static int lib_interface_isis_multi_topology_ipv4_multicast_modify(
2181 enum nb_event event
, const struct lyd_node
*dnode
,
2182 union nb_resource
*resource
)
2184 return lib_interface_isis_multi_topology_common(event
, dnode
,
2185 ISIS_MT_IPV4_MULTICAST
);
2190 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-management
2192 static int lib_interface_isis_multi_topology_ipv4_management_modify(
2193 enum nb_event event
, const struct lyd_node
*dnode
,
2194 union nb_resource
*resource
)
2196 return lib_interface_isis_multi_topology_common(event
, dnode
,
2202 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-unicast
2204 static int lib_interface_isis_multi_topology_ipv6_unicast_modify(
2205 enum nb_event event
, const struct lyd_node
*dnode
,
2206 union nb_resource
*resource
)
2208 return lib_interface_isis_multi_topology_common(event
, dnode
,
2209 ISIS_MT_IPV6_UNICAST
);
2214 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-multicast
2216 static int lib_interface_isis_multi_topology_ipv6_multicast_modify(
2217 enum nb_event event
, const struct lyd_node
*dnode
,
2218 union nb_resource
*resource
)
2220 return lib_interface_isis_multi_topology_common(event
, dnode
,
2221 ISIS_MT_IPV6_MULTICAST
);
2226 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-management
2228 static int lib_interface_isis_multi_topology_ipv6_management_modify(
2229 enum nb_event event
, const struct lyd_node
*dnode
,
2230 union nb_resource
*resource
)
2232 return lib_interface_isis_multi_topology_common(event
, dnode
,
2237 * XPath: /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-dstsrc
2239 static int lib_interface_isis_multi_topology_ipv6_dstsrc_modify(
2240 enum nb_event event
, const struct lyd_node
*dnode
,
2241 union nb_resource
*resource
)
2243 return lib_interface_isis_multi_topology_common(event
, dnode
,
2244 ISIS_MT_IPV6_DSTSRC
);
2250 static void notif_prep_instance_hdr(const char *xpath
,
2251 const struct isis_area
*area
,
2252 const char *routing_instance
,
2255 char xpath_arg
[XPATH_MAXLEN
];
2256 struct yang_data
*data
;
2258 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/routing-instance", xpath
);
2259 data
= yang_data_new_string(xpath_arg
, routing_instance
);
2260 listnode_add(args
, data
);
2261 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/routing-protocol-name",
2263 data
= yang_data_new_string(xpath_arg
, area
->area_tag
);
2264 listnode_add(args
, data
);
2265 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/isis-level", xpath
);
2266 data
= yang_data_new_enum(xpath_arg
, area
->is_type
);
2267 listnode_add(args
, data
);
2270 static void notif_prepr_iface_hdr(const char *xpath
,
2271 const struct isis_circuit
*circuit
,
2274 char xpath_arg
[XPATH_MAXLEN
];
2275 struct yang_data
*data
;
2277 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/interface-name", xpath
);
2278 data
= yang_data_new_string(xpath_arg
, circuit
->interface
->name
);
2279 listnode_add(args
, data
);
2280 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/interface-level", xpath
);
2281 data
= yang_data_new_enum(xpath_arg
, circuit
->is_type
);
2282 listnode_add(args
, data
);
2283 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/extended-circuit-id", xpath
);
2284 /* we do not seem to have the extended version of the circuit_id */
2285 data
= yang_data_new_uint32(xpath_arg
, (uint32_t)circuit
->circuit_id
);
2286 listnode_add(args
, data
);
2291 * /frr-isisd:database-overload
2293 void isis_notif_db_overload(const struct isis_area
*area
, bool overload
)
2295 const char *xpath
= "/frr-isisd:database-overload";
2296 struct list
*arguments
= yang_data_list_new();
2297 char xpath_arg
[XPATH_MAXLEN
];
2298 struct yang_data
*data
;
2300 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2301 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/overload", xpath
);
2302 data
= yang_data_new_enum(xpath_arg
, !!overload
);
2303 listnode_add(arguments
, data
);
2305 nb_notification_send(xpath
, arguments
);
2310 * /frr-isisd:lsp-too-large
2312 void isis_notif_lsp_too_large(const struct isis_circuit
*circuit
,
2313 uint32_t pdu_size
, const char *lsp_id
)
2315 const char *xpath
= "/frr-isisd:lsp-too-large";
2316 struct list
*arguments
= yang_data_list_new();
2317 char xpath_arg
[XPATH_MAXLEN
];
2318 struct yang_data
*data
;
2319 struct isis_area
*area
= circuit
->area
;
2321 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2322 notif_prepr_iface_hdr(xpath
, circuit
, arguments
);
2323 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/pdu-size", xpath
);
2324 data
= yang_data_new_uint32(xpath_arg
, pdu_size
);
2325 listnode_add(arguments
, data
);
2326 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/lsp-id", xpath
);
2327 data
= yang_data_new_string(xpath_arg
, lsp_id
);
2328 listnode_add(arguments
, data
);
2330 nb_notification_send(xpath
, arguments
);
2335 * /frr-isisd:if-state-change
2337 void isis_notif_if_state_change(const struct isis_circuit
*circuit
, bool down
)
2339 const char *xpath
= "/frr-isisd:if-state-change";
2340 struct list
*arguments
= yang_data_list_new();
2341 char xpath_arg
[XPATH_MAXLEN
];
2342 struct yang_data
*data
;
2343 struct isis_area
*area
= circuit
->area
;
2345 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2346 notif_prepr_iface_hdr(xpath
, circuit
, arguments
);
2347 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/state", xpath
);
2348 data
= yang_data_new_enum(xpath_arg
, !!down
);
2349 listnode_add(arguments
, data
);
2351 nb_notification_send(xpath
, arguments
);
2356 * /frr-isisd:corrupted-lsp-detected
2358 void isis_notif_corrupted_lsp(const struct isis_area
*area
, const char *lsp_id
)
2360 const char *xpath
= "/frr-isisd:corrupted-lsp-detected";
2361 struct list
*arguments
= yang_data_list_new();
2362 char xpath_arg
[XPATH_MAXLEN
];
2363 struct yang_data
*data
;
2365 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2366 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/lsp-id", xpath
);
2367 data
= yang_data_new_string(xpath_arg
, lsp_id
);
2368 listnode_add(arguments
, data
);
2370 nb_notification_send(xpath
, arguments
);
2375 * /frr-isisd:attempt-to-exceed-max-sequence
2377 void isis_notif_lsp_exceed_max(const struct isis_area
*area
, const char *lsp_id
)
2379 const char *xpath
= "/frr-isisd:attempt-to-exceed-max-sequence";
2380 struct list
*arguments
= yang_data_list_new();
2381 char xpath_arg
[XPATH_MAXLEN
];
2382 struct yang_data
*data
;
2384 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2385 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/lsp-id", xpath
);
2386 data
= yang_data_new_string(xpath_arg
, lsp_id
);
2387 listnode_add(arguments
, data
);
2389 nb_notification_send(xpath
, arguments
);
2394 * /frr-isisd:max-area-addresses-mismatch
2396 void isis_notif_max_area_addr_mismatch(const struct isis_circuit
*circuit
,
2397 uint8_t max_area_addrs
,
2398 const char *raw_pdu
)
2400 const char *xpath
= "/frr-isisd:max-area-addresses-mismatch";
2401 struct list
*arguments
= yang_data_list_new();
2402 char xpath_arg
[XPATH_MAXLEN
];
2403 struct yang_data
*data
;
2404 struct isis_area
*area
= circuit
->area
;
2406 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2407 notif_prepr_iface_hdr(xpath
, circuit
, arguments
);
2408 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/max-area-addresses", xpath
);
2409 data
= yang_data_new_uint8(xpath_arg
, max_area_addrs
);
2410 listnode_add(arguments
, data
);
2411 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/raw-pdu", xpath
);
2412 data
= yang_data_new(xpath_arg
, raw_pdu
);
2413 listnode_add(arguments
, data
);
2415 nb_notification_send(xpath
, arguments
);
2420 * /frr-isisd:authentication-type-failure
2422 void isis_notif_authentication_type_failure(const struct isis_circuit
*circuit
,
2423 const char *raw_pdu
)
2425 const char *xpath
= "/frr-isisd:authentication-type-failure";
2426 struct list
*arguments
= yang_data_list_new();
2427 char xpath_arg
[XPATH_MAXLEN
];
2428 struct yang_data
*data
;
2429 struct isis_area
*area
= circuit
->area
;
2431 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2432 notif_prepr_iface_hdr(xpath
, circuit
, arguments
);
2433 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/raw-pdu", xpath
);
2434 data
= yang_data_new(xpath_arg
, raw_pdu
);
2435 listnode_add(arguments
, data
);
2437 nb_notification_send(xpath
, arguments
);
2442 * /frr-isisd:authentication-failure
2444 void isis_notif_authentication_failure(const struct isis_circuit
*circuit
,
2445 const char *raw_pdu
)
2447 const char *xpath
= "/frr-isisd:authentication-failure";
2448 struct list
*arguments
= yang_data_list_new();
2449 char xpath_arg
[XPATH_MAXLEN
];
2450 struct yang_data
*data
;
2451 struct isis_area
*area
= circuit
->area
;
2453 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2454 notif_prepr_iface_hdr(xpath
, circuit
, arguments
);
2455 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/raw-pdu", xpath
);
2456 data
= yang_data_new(xpath_arg
, raw_pdu
);
2457 listnode_add(arguments
, data
);
2459 nb_notification_send(xpath
, arguments
);
2464 * /frr-isisd:adjacency-state-change
2466 void isis_notif_adj_state_change(const struct isis_adjacency
*adj
,
2467 int new_state
, const char *reason
)
2469 const char *xpath
= "/frr-isisd:adjacency-state-change";
2470 struct list
*arguments
= yang_data_list_new();
2471 char xpath_arg
[XPATH_MAXLEN
];
2472 struct yang_data
*data
;
2473 struct isis_circuit
*circuit
= adj
->circuit
;
2474 struct isis_area
*area
= circuit
->area
;
2475 struct isis_dynhn
*dyn
= dynhn_find_by_id(adj
->sysid
);
2477 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2478 notif_prepr_iface_hdr(xpath
, circuit
, arguments
);
2480 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/neighbor", xpath
);
2481 data
= yang_data_new_string(xpath_arg
, dyn
->hostname
);
2482 listnode_add(arguments
, data
);
2484 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/neighbor-system-id", xpath
);
2485 data
= yang_data_new_string(xpath_arg
, sysid_print(adj
->sysid
));
2486 listnode_add(arguments
, data
);
2488 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/state", xpath
);
2489 switch (new_state
) {
2491 data
= yang_data_new_string(xpath_arg
, "down");
2494 data
= yang_data_new_string(xpath_arg
, "up");
2496 case ISIS_ADJ_INITIALIZING
:
2497 data
= yang_data_new_string(xpath_arg
, "init");
2500 data
= yang_data_new_string(xpath_arg
, "failed");
2502 listnode_add(arguments
, data
);
2503 if (new_state
== ISIS_ADJ_DOWN
) {
2504 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/reason", xpath
);
2505 data
= yang_data_new_string(xpath_arg
, reason
);
2506 listnode_add(arguments
, data
);
2509 nb_notification_send(xpath
, arguments
);
2514 * /frr-isisd:rejected-adjacency
2516 void isis_notif_reject_adjacency(const struct isis_circuit
*circuit
,
2517 const char *reason
, const char *raw_pdu
)
2519 const char *xpath
= "/frr-isisd:rejected-adjacency";
2520 struct list
*arguments
= yang_data_list_new();
2521 char xpath_arg
[XPATH_MAXLEN
];
2522 struct yang_data
*data
;
2523 struct isis_area
*area
= circuit
->area
;
2525 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2526 notif_prepr_iface_hdr(xpath
, circuit
, arguments
);
2527 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/reason", xpath
);
2528 data
= yang_data_new_string(xpath_arg
, reason
);
2529 listnode_add(arguments
, data
);
2530 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/raw-pdu", xpath
);
2531 data
= yang_data_new(xpath_arg
, raw_pdu
);
2532 listnode_add(arguments
, data
);
2534 nb_notification_send(xpath
, arguments
);
2539 * /frr-isisd:area-mismatch
2541 void isis_notif_area_mismatch(const struct isis_circuit
*circuit
,
2542 const char *raw_pdu
)
2544 const char *xpath
= "/frr-isisd:area-mismatch";
2545 struct list
*arguments
= yang_data_list_new();
2546 char xpath_arg
[XPATH_MAXLEN
];
2547 struct yang_data
*data
;
2548 struct isis_area
*area
= circuit
->area
;
2550 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2551 notif_prepr_iface_hdr(xpath
, circuit
, arguments
);
2552 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/raw-pdu", xpath
);
2553 data
= yang_data_new(xpath_arg
, raw_pdu
);
2554 listnode_add(arguments
, data
);
2556 nb_notification_send(xpath
, arguments
);
2561 * /frr-isisd:lsp-received
2563 void isis_notif_lsp_received(const struct isis_circuit
*circuit
,
2564 const char *lsp_id
, uint32_t seqno
,
2565 uint32_t timestamp
, const char *sys_id
)
2567 const char *xpath
= "/frr-isisd:lsp-received";
2568 struct list
*arguments
= yang_data_list_new();
2569 char xpath_arg
[XPATH_MAXLEN
];
2570 struct yang_data
*data
;
2571 struct isis_area
*area
= circuit
->area
;
2573 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2574 notif_prepr_iface_hdr(xpath
, circuit
, arguments
);
2575 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/lsp-id", xpath
);
2576 data
= yang_data_new_string(xpath_arg
, lsp_id
);
2577 listnode_add(arguments
, data
);
2578 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/sequence", xpath
);
2579 data
= yang_data_new_uint32(xpath_arg
, seqno
);
2580 listnode_add(arguments
, data
);
2581 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/received-timestamp", xpath
);
2582 data
= yang_data_new_uint32(xpath_arg
, timestamp
);
2583 listnode_add(arguments
, data
);
2584 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/neighbor-system-id", xpath
);
2585 data
= yang_data_new_string(xpath_arg
, sys_id
);
2586 listnode_add(arguments
, data
);
2588 nb_notification_send(xpath
, arguments
);
2593 * /frr-isisd:lsp-generation
2595 void isis_notif_lsp_gen(const struct isis_area
*area
, const char *lsp_id
,
2596 uint32_t seqno
, uint32_t timestamp
)
2598 const char *xpath
= "/frr-isisd:lsp-generation";
2599 struct list
*arguments
= yang_data_list_new();
2600 char xpath_arg
[XPATH_MAXLEN
];
2601 struct yang_data
*data
;
2603 notif_prep_instance_hdr(xpath
, area
, "default", 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/send-timestamp", xpath
);
2611 data
= yang_data_new_uint32(xpath_arg
, timestamp
);
2612 listnode_add(arguments
, data
);
2614 nb_notification_send(xpath
, arguments
);
2619 * /frr-isisd:id-len-mismatch
2621 void isis_notif_id_len_mismatch(const struct isis_circuit
*circuit
,
2622 uint8_t rcv_id_len
, const char *raw_pdu
)
2624 const char *xpath
= "/frr-isisd:id-len-mismatch";
2625 struct list
*arguments
= yang_data_list_new();
2626 char xpath_arg
[XPATH_MAXLEN
];
2627 struct yang_data
*data
;
2628 struct isis_area
*area
= circuit
->area
;
2630 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2631 notif_prepr_iface_hdr(xpath
, circuit
, arguments
);
2632 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/pdu-field-len", xpath
);
2633 data
= yang_data_new_uint8(xpath_arg
, rcv_id_len
);
2634 listnode_add(arguments
, data
);
2635 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/raw-pdu", xpath
);
2636 data
= yang_data_new(xpath_arg
, raw_pdu
);
2637 listnode_add(arguments
, data
);
2639 nb_notification_send(xpath
, arguments
);
2644 * /frr-isisd:version-skew
2646 void isis_notif_version_skew(const struct isis_circuit
*circuit
,
2647 uint8_t version
, const char *raw_pdu
)
2649 const char *xpath
= "/frr-isisd:version-skew";
2650 struct list
*arguments
= yang_data_list_new();
2651 char xpath_arg
[XPATH_MAXLEN
];
2652 struct yang_data
*data
;
2653 struct isis_area
*area
= circuit
->area
;
2655 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2656 notif_prepr_iface_hdr(xpath
, circuit
, arguments
);
2657 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/protocol-version", xpath
);
2658 data
= yang_data_new_uint8(xpath_arg
, version
);
2659 listnode_add(arguments
, data
);
2660 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/raw-pdu", xpath
);
2661 data
= yang_data_new(xpath_arg
, raw_pdu
);
2662 listnode_add(arguments
, data
);
2664 nb_notification_send(xpath
, arguments
);
2669 * /frr-isisd:lsp-error-detected
2671 void isis_notif_lsp_error(const struct isis_circuit
*circuit
,
2672 const char *lsp_id
, const char *raw_pdu
,
2673 __attribute__((unused
)) uint32_t offset
,
2674 __attribute__((unused
)) uint8_t tlv_type
)
2676 const char *xpath
= "/frr-isisd:lsp-error-detected";
2677 struct list
*arguments
= yang_data_list_new();
2678 char xpath_arg
[XPATH_MAXLEN
];
2679 struct yang_data
*data
;
2680 struct isis_area
*area
= circuit
->area
;
2682 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2683 notif_prepr_iface_hdr(xpath
, circuit
, arguments
);
2684 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/lsp-id", xpath
);
2685 data
= yang_data_new_string(xpath_arg
, lsp_id
);
2686 listnode_add(arguments
, data
);
2687 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/raw-pdu", xpath
);
2688 data
= yang_data_new(xpath_arg
, raw_pdu
);
2689 listnode_add(arguments
, data
);
2690 /* ignore offset and tlv_type which cannot be set properly */
2692 nb_notification_send(xpath
, arguments
);
2697 * /frr-isisd:sequence-number-skipped
2699 void isis_notif_seqno_skipped(const struct isis_circuit
*circuit
,
2702 const char *xpath
= "/frr-isisd:sequence-number-skipped";
2703 struct list
*arguments
= yang_data_list_new();
2704 char xpath_arg
[XPATH_MAXLEN
];
2705 struct yang_data
*data
;
2706 struct isis_area
*area
= circuit
->area
;
2708 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2709 notif_prepr_iface_hdr(xpath
, circuit
, arguments
);
2710 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/lsp-id", xpath
);
2711 data
= yang_data_new_string(xpath_arg
, lsp_id
);
2712 listnode_add(arguments
, data
);
2714 nb_notification_send(xpath
, arguments
);
2719 * /frr-isisd:own-lsp-purge
2721 void isis_notif_own_lsp_purge(const struct isis_circuit
*circuit
,
2724 const char *xpath
= "/frr-isisd:own-lsp-purge";
2725 struct list
*arguments
= yang_data_list_new();
2726 char xpath_arg
[XPATH_MAXLEN
];
2727 struct yang_data
*data
;
2728 struct isis_area
*area
= circuit
->area
;
2730 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2731 notif_prepr_iface_hdr(xpath
, circuit
, arguments
);
2732 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/lsp-id", xpath
);
2733 data
= yang_data_new_string(xpath_arg
, lsp_id
);
2734 listnode_add(arguments
, data
);
2736 nb_notification_send(xpath
, arguments
);
2739 /* clang-format off */
2740 const struct frr_yang_module_info frr_isisd_info
= {
2741 .name
= "frr-isisd",
2744 .xpath
= "/frr-isisd:isis/instance",
2745 .cbs
.create
= isis_instance_create
,
2746 .cbs
.destroy
= isis_instance_destroy
,
2747 .cbs
.cli_show
= cli_show_router_isis
,
2748 .priority
= NB_DFLT_PRIORITY
- 1,
2751 .xpath
= "/frr-isisd:isis/instance/is-type",
2752 .cbs
.modify
= isis_instance_is_type_modify
,
2753 .cbs
.cli_show
= cli_show_isis_is_type
,
2756 .xpath
= "/frr-isisd:isis/instance/area-address",
2757 .cbs
.create
= isis_instance_area_address_create
,
2758 .cbs
.destroy
= isis_instance_area_address_destroy
,
2759 .cbs
.cli_show
= cli_show_isis_area_address
,
2762 .xpath
= "/frr-isisd:isis/instance/dynamic-hostname",
2763 .cbs
.modify
= isis_instance_dynamic_hostname_modify
,
2764 .cbs
.cli_show
= cli_show_isis_dynamic_hostname
,
2767 .xpath
= "/frr-isisd:isis/instance/attached",
2768 .cbs
.modify
= isis_instance_attached_modify
,
2769 .cbs
.cli_show
= cli_show_isis_attached
,
2772 .xpath
= "/frr-isisd:isis/instance/overload",
2773 .cbs
.modify
= isis_instance_overload_modify
,
2774 .cbs
.cli_show
= cli_show_isis_overload
,
2777 .xpath
= "/frr-isisd:isis/instance/metric-style",
2778 .cbs
.modify
= isis_instance_metric_style_modify
,
2779 .cbs
.cli_show
= cli_show_isis_metric_style
,
2782 .xpath
= "/frr-isisd:isis/instance/purge-originator",
2783 .cbs
.modify
= isis_instance_purge_originator_modify
,
2784 .cbs
.cli_show
= cli_show_isis_purge_origin
,
2787 .xpath
= "/frr-isisd:isis/instance/lsp/mtu",
2788 .cbs
.modify
= isis_instance_lsp_mtu_modify
,
2789 .cbs
.cli_show
= cli_show_isis_lsp_mtu
,
2792 .xpath
= "/frr-isisd:isis/instance/lsp/refresh-interval",
2793 .cbs
.cli_show
= cli_show_isis_lsp_ref_interval
,
2796 .xpath
= "/frr-isisd:isis/instance/lsp/refresh-interval/level-1",
2797 .cbs
.modify
= isis_instance_lsp_refresh_interval_level_1_modify
,
2800 .xpath
= "/frr-isisd:isis/instance/lsp/refresh-interval/level-2",
2801 .cbs
.modify
= isis_instance_lsp_refresh_interval_level_2_modify
,
2804 .xpath
= "/frr-isisd:isis/instance/lsp/maximum-lifetime",
2805 .cbs
.cli_show
= cli_show_isis_lsp_max_lifetime
,
2808 .xpath
= "/frr-isisd:isis/instance/lsp/maximum-lifetime/level-1",
2809 .cbs
.modify
= isis_instance_lsp_maximum_lifetime_level_1_modify
,
2812 .xpath
= "/frr-isisd:isis/instance/lsp/maximum-lifetime/level-2",
2813 .cbs
.modify
= isis_instance_lsp_maximum_lifetime_level_2_modify
,
2816 .xpath
= "/frr-isisd:isis/instance/lsp/generation-interval",
2817 .cbs
.cli_show
= cli_show_isis_lsp_gen_interval
,
2820 .xpath
= "/frr-isisd:isis/instance/lsp/generation-interval/level-1",
2821 .cbs
.modify
= isis_instance_lsp_generation_interval_level_1_modify
,
2824 .xpath
= "/frr-isisd:isis/instance/lsp/generation-interval/level-2",
2825 .cbs
.modify
= isis_instance_lsp_generation_interval_level_2_modify
,
2828 .xpath
= "/frr-isisd:isis/instance/spf/ietf-backoff-delay",
2829 .cbs
.create
= isis_instance_spf_ietf_backoff_delay_create
,
2830 .cbs
.destroy
= isis_instance_spf_ietf_backoff_delay_destroy
,
2831 .cbs
.apply_finish
= ietf_backoff_delay_apply_finish
,
2832 .cbs
.cli_show
= cli_show_isis_spf_ietf_backoff
,
2835 .xpath
= "/frr-isisd:isis/instance/spf/ietf-backoff-delay/init-delay",
2836 .cbs
.modify
= isis_instance_spf_ietf_backoff_delay_init_delay_modify
,
2839 .xpath
= "/frr-isisd:isis/instance/spf/ietf-backoff-delay/short-delay",
2840 .cbs
.modify
= isis_instance_spf_ietf_backoff_delay_short_delay_modify
,
2843 .xpath
= "/frr-isisd:isis/instance/spf/ietf-backoff-delay/long-delay",
2844 .cbs
.modify
= isis_instance_spf_ietf_backoff_delay_long_delay_modify
,
2847 .xpath
= "/frr-isisd:isis/instance/spf/ietf-backoff-delay/hold-down",
2848 .cbs
.modify
= isis_instance_spf_ietf_backoff_delay_hold_down_modify
,
2851 .xpath
= "/frr-isisd:isis/instance/spf/ietf-backoff-delay/time-to-learn",
2852 .cbs
.modify
= isis_instance_spf_ietf_backoff_delay_time_to_learn_modify
,
2855 .xpath
= "/frr-isisd:isis/instance/spf/minimum-interval",
2856 .cbs
.cli_show
= cli_show_isis_spf_min_interval
,
2859 .xpath
= "/frr-isisd:isis/instance/spf/minimum-interval/level-1",
2860 .cbs
.modify
= isis_instance_spf_minimum_interval_level_1_modify
,
2863 .xpath
= "/frr-isisd:isis/instance/spf/minimum-interval/level-2",
2864 .cbs
.modify
= isis_instance_spf_minimum_interval_level_2_modify
,
2867 .xpath
= "/frr-isisd:isis/instance/area-password",
2868 .cbs
.create
= isis_instance_area_password_create
,
2869 .cbs
.destroy
= isis_instance_area_password_destroy
,
2870 .cbs
.apply_finish
= area_password_apply_finish
,
2871 .cbs
.cli_show
= cli_show_isis_area_pwd
,
2874 .xpath
= "/frr-isisd:isis/instance/area-password/password",
2875 .cbs
.modify
= isis_instance_area_password_password_modify
,
2878 .xpath
= "/frr-isisd:isis/instance/area-password/password-type",
2879 .cbs
.modify
= isis_instance_area_password_password_type_modify
,
2882 .xpath
= "/frr-isisd:isis/instance/area-password/authenticate-snp",
2883 .cbs
.modify
= isis_instance_area_password_authenticate_snp_modify
,
2886 .xpath
= "/frr-isisd:isis/instance/domain-password",
2887 .cbs
.create
= isis_instance_domain_password_create
,
2888 .cbs
.destroy
= isis_instance_domain_password_destroy
,
2889 .cbs
.apply_finish
= domain_password_apply_finish
,
2890 .cbs
.cli_show
= cli_show_isis_domain_pwd
,
2893 .xpath
= "/frr-isisd:isis/instance/domain-password/password",
2894 .cbs
.modify
= isis_instance_domain_password_password_modify
,
2897 .xpath
= "/frr-isisd:isis/instance/domain-password/password-type",
2898 .cbs
.modify
= isis_instance_domain_password_password_type_modify
,
2901 .xpath
= "/frr-isisd:isis/instance/domain-password/authenticate-snp",
2902 .cbs
.modify
= isis_instance_domain_password_authenticate_snp_modify
,
2905 .xpath
= "/frr-isisd:isis/instance/default-information-originate/ipv4",
2906 .cbs
.create
= isis_instance_default_information_originate_ipv4_create
,
2907 .cbs
.destroy
= isis_instance_default_information_originate_ipv4_destroy
,
2908 .cbs
.apply_finish
= default_info_origin_ipv4_apply_finish
,
2909 .cbs
.cli_show
= cli_show_isis_def_origin_ipv4
,
2912 .xpath
= "/frr-isisd:isis/instance/default-information-originate/ipv4/always",
2913 .cbs
.modify
= isis_instance_default_information_originate_ipv4_always_modify
,
2916 .xpath
= "/frr-isisd:isis/instance/default-information-originate/ipv4/route-map",
2917 .cbs
.modify
= isis_instance_default_information_originate_ipv4_route_map_modify
,
2918 .cbs
.destroy
= isis_instance_default_information_originate_ipv4_route_map_destroy
,
2921 .xpath
= "/frr-isisd:isis/instance/default-information-originate/ipv4/metric",
2922 .cbs
.modify
= isis_instance_default_information_originate_ipv4_metric_modify
,
2925 .xpath
= "/frr-isisd:isis/instance/default-information-originate/ipv6",
2926 .cbs
.create
= isis_instance_default_information_originate_ipv6_create
,
2927 .cbs
.destroy
= isis_instance_default_information_originate_ipv6_destroy
,
2928 .cbs
.apply_finish
= default_info_origin_ipv6_apply_finish
,
2929 .cbs
.cli_show
= cli_show_isis_def_origin_ipv6
,
2932 .xpath
= "/frr-isisd:isis/instance/default-information-originate/ipv6/always",
2933 .cbs
.modify
= isis_instance_default_information_originate_ipv6_always_modify
,
2936 .xpath
= "/frr-isisd:isis/instance/default-information-originate/ipv6/route-map",
2937 .cbs
.modify
= isis_instance_default_information_originate_ipv6_route_map_modify
,
2938 .cbs
.destroy
= isis_instance_default_information_originate_ipv6_route_map_destroy
,
2941 .xpath
= "/frr-isisd:isis/instance/default-information-originate/ipv6/metric",
2942 .cbs
.modify
= isis_instance_default_information_originate_ipv6_metric_modify
,
2945 .xpath
= "/frr-isisd:isis/instance/redistribute/ipv4",
2946 .cbs
.create
= isis_instance_redistribute_ipv4_create
,
2947 .cbs
.destroy
= isis_instance_redistribute_ipv4_destroy
,
2948 .cbs
.apply_finish
= redistribute_ipv4_apply_finish
,
2949 .cbs
.cli_show
= cli_show_isis_redistribute_ipv4
,
2952 .xpath
= "/frr-isisd:isis/instance/redistribute/ipv4/route-map",
2953 .cbs
.modify
= isis_instance_redistribute_ipv4_route_map_modify
,
2954 .cbs
.destroy
= isis_instance_redistribute_ipv4_route_map_destroy
,
2957 .xpath
= "/frr-isisd:isis/instance/redistribute/ipv4/metric",
2958 .cbs
.modify
= isis_instance_redistribute_ipv4_metric_modify
,
2961 .xpath
= "/frr-isisd:isis/instance/redistribute/ipv6",
2962 .cbs
.create
= isis_instance_redistribute_ipv6_create
,
2963 .cbs
.destroy
= isis_instance_redistribute_ipv6_destroy
,
2964 .cbs
.apply_finish
= redistribute_ipv6_apply_finish
,
2965 .cbs
.cli_show
= cli_show_isis_redistribute_ipv6
,
2968 .xpath
= "/frr-isisd:isis/instance/redistribute/ipv6/route-map",
2969 .cbs
.modify
= isis_instance_redistribute_ipv6_route_map_modify
,
2970 .cbs
.destroy
= isis_instance_redistribute_ipv6_route_map_destroy
,
2973 .xpath
= "/frr-isisd:isis/instance/redistribute/ipv6/metric",
2974 .cbs
.modify
= isis_instance_redistribute_ipv6_metric_modify
,
2977 .xpath
= "/frr-isisd:isis/instance/multi-topology/ipv4-multicast",
2978 .cbs
.create
= isis_instance_multi_topology_ipv4_multicast_create
,
2979 .cbs
.destroy
= isis_instance_multi_topology_ipv4_multicast_destroy
,
2980 .cbs
.cli_show
= cli_show_isis_mt_ipv4_multicast
,
2983 .xpath
= "/frr-isisd:isis/instance/multi-topology/ipv4-multicast/overload",
2984 .cbs
.modify
= isis_instance_multi_topology_ipv4_multicast_overload_modify
,
2987 .xpath
= "/frr-isisd:isis/instance/multi-topology/ipv4-management",
2988 .cbs
.create
= isis_instance_multi_topology_ipv4_management_create
,
2989 .cbs
.destroy
= isis_instance_multi_topology_ipv4_management_destroy
,
2990 .cbs
.cli_show
= cli_show_isis_mt_ipv4_mgmt
,
2993 .xpath
= "/frr-isisd:isis/instance/multi-topology/ipv4-management/overload",
2994 .cbs
.modify
= isis_instance_multi_topology_ipv4_management_overload_modify
,
2997 .xpath
= "/frr-isisd:isis/instance/multi-topology/ipv6-unicast",
2998 .cbs
.create
= isis_instance_multi_topology_ipv6_unicast_create
,
2999 .cbs
.destroy
= isis_instance_multi_topology_ipv6_unicast_destroy
,
3000 .cbs
.cli_show
= cli_show_isis_mt_ipv6_unicast
,
3003 .xpath
= "/frr-isisd:isis/instance/multi-topology/ipv6-unicast/overload",
3004 .cbs
.modify
= isis_instance_multi_topology_ipv6_unicast_overload_modify
,
3007 .xpath
= "/frr-isisd:isis/instance/multi-topology/ipv6-multicast",
3008 .cbs
.create
= isis_instance_multi_topology_ipv6_multicast_create
,
3009 .cbs
.destroy
= isis_instance_multi_topology_ipv6_multicast_destroy
,
3010 .cbs
.cli_show
= cli_show_isis_mt_ipv6_multicast
,
3013 .xpath
= "/frr-isisd:isis/instance/multi-topology/ipv6-multicast/overload",
3014 .cbs
.modify
= isis_instance_multi_topology_ipv6_multicast_overload_modify
,
3017 .xpath
= "/frr-isisd:isis/instance/multi-topology/ipv6-management",
3018 .cbs
.create
= isis_instance_multi_topology_ipv6_management_create
,
3019 .cbs
.destroy
= isis_instance_multi_topology_ipv6_management_destroy
,
3020 .cbs
.cli_show
= cli_show_isis_mt_ipv6_mgmt
,
3023 .xpath
= "/frr-isisd:isis/instance/multi-topology/ipv6-management/overload",
3024 .cbs
.modify
= isis_instance_multi_topology_ipv6_management_overload_modify
,
3027 .xpath
= "/frr-isisd:isis/instance/multi-topology/ipv6-dstsrc",
3028 .cbs
.create
= isis_instance_multi_topology_ipv6_dstsrc_create
,
3029 .cbs
.destroy
= isis_instance_multi_topology_ipv6_dstsrc_destroy
,
3030 .cbs
.cli_show
= cli_show_isis_mt_ipv6_dstsrc
,
3033 .xpath
= "/frr-isisd:isis/instance/multi-topology/ipv6-dstsrc/overload",
3034 .cbs
.modify
= isis_instance_multi_topology_ipv6_dstsrc_overload_modify
,
3037 .xpath
= "/frr-isisd:isis/instance/log-adjacency-changes",
3038 .cbs
.modify
= isis_instance_log_adjacency_changes_modify
,
3039 .cbs
.cli_show
= cli_show_isis_log_adjacency
,
3042 .xpath
= "/frr-isisd:isis/instance/mpls-te",
3043 .cbs
.create
= isis_instance_mpls_te_create
,
3044 .cbs
.destroy
= isis_instance_mpls_te_destroy
,
3045 .cbs
.cli_show
= cli_show_isis_mpls_te
,
3048 .xpath
= "/frr-isisd:isis/instance/mpls-te/router-address",
3049 .cbs
.modify
= isis_instance_mpls_te_router_address_modify
,
3050 .cbs
.destroy
= isis_instance_mpls_te_router_address_destroy
,
3051 .cbs
.cli_show
= cli_show_isis_mpls_te_router_addr
,
3054 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis",
3055 .cbs
.create
= lib_interface_isis_create
,
3056 .cbs
.destroy
= lib_interface_isis_destroy
,
3059 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/area-tag",
3060 .cbs
.modify
= lib_interface_isis_area_tag_modify
,
3063 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/circuit-type",
3064 .cbs
.modify
= lib_interface_isis_circuit_type_modify
,
3065 .cbs
.cli_show
= cli_show_ip_isis_circ_type
,
3068 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/ipv4-routing",
3069 .cbs
.modify
= lib_interface_isis_ipv4_routing_modify
,
3070 .cbs
.cli_show
= cli_show_ip_isis_ipv4
,
3073 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/ipv6-routing",
3074 .cbs
.modify
= lib_interface_isis_ipv6_routing_modify
,
3075 .cbs
.cli_show
= cli_show_ip_isis_ipv6
,
3078 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/csnp-interval",
3079 .cbs
.cli_show
= cli_show_ip_isis_csnp_interval
,
3082 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/csnp-interval/level-1",
3083 .cbs
.modify
= lib_interface_isis_csnp_interval_level_1_modify
,
3086 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/csnp-interval/level-2",
3087 .cbs
.modify
= lib_interface_isis_csnp_interval_level_2_modify
,
3090 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/psnp-interval",
3091 .cbs
.cli_show
= cli_show_ip_isis_psnp_interval
,
3094 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/psnp-interval/level-1",
3095 .cbs
.modify
= lib_interface_isis_psnp_interval_level_1_modify
,
3098 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/psnp-interval/level-2",
3099 .cbs
.modify
= lib_interface_isis_psnp_interval_level_2_modify
,
3102 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/hello/padding",
3103 .cbs
.modify
= lib_interface_isis_hello_padding_modify
,
3104 .cbs
.cli_show
= cli_show_ip_isis_hello_padding
,
3107 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/hello/interval",
3108 .cbs
.cli_show
= cli_show_ip_isis_hello_interval
,
3111 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/hello/interval/level-1",
3112 .cbs
.modify
= lib_interface_isis_hello_interval_level_1_modify
,
3115 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/hello/interval/level-2",
3116 .cbs
.modify
= lib_interface_isis_hello_interval_level_2_modify
,
3119 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/hello/multiplier",
3120 .cbs
.cli_show
= cli_show_ip_isis_hello_multi
,
3123 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/hello/multiplier/level-1",
3124 .cbs
.modify
= lib_interface_isis_hello_multiplier_level_1_modify
,
3127 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/hello/multiplier/level-2",
3128 .cbs
.modify
= lib_interface_isis_hello_multiplier_level_2_modify
,
3131 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/metric",
3132 .cbs
.cli_show
= cli_show_ip_isis_metric
,
3135 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/metric/level-1",
3136 .cbs
.modify
= lib_interface_isis_metric_level_1_modify
,
3139 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/metric/level-2",
3140 .cbs
.modify
= lib_interface_isis_metric_level_2_modify
,
3143 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/priority",
3144 .cbs
.cli_show
= cli_show_ip_isis_priority
,
3147 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/priority/level-1",
3148 .cbs
.modify
= lib_interface_isis_priority_level_1_modify
,
3151 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/priority/level-2",
3152 .cbs
.modify
= lib_interface_isis_priority_level_2_modify
,
3155 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/network-type",
3156 .cbs
.modify
= lib_interface_isis_network_type_modify
,
3157 .cbs
.cli_show
= cli_show_ip_isis_network_type
,
3160 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/passive",
3161 .cbs
.modify
= lib_interface_isis_passive_modify
,
3162 .cbs
.cli_show
= cli_show_ip_isis_passive
,
3165 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/password",
3166 .cbs
.create
= lib_interface_isis_password_create
,
3167 .cbs
.destroy
= lib_interface_isis_password_destroy
,
3168 .cbs
.cli_show
= cli_show_ip_isis_password
,
3171 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/password/password",
3172 .cbs
.modify
= lib_interface_isis_password_password_modify
,
3175 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/password/password-type",
3176 .cbs
.modify
= lib_interface_isis_password_password_type_modify
,
3179 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/disable-three-way-handshake",
3180 .cbs
.modify
= lib_interface_isis_disable_three_way_handshake_modify
,
3181 .cbs
.cli_show
= cli_show_ip_isis_threeway_shake
,
3184 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-unicast",
3185 .cbs
.modify
= lib_interface_isis_multi_topology_ipv4_unicast_modify
,
3186 .cbs
.cli_show
= cli_show_ip_isis_mt_ipv4_unicast
,
3189 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-multicast",
3190 .cbs
.modify
= lib_interface_isis_multi_topology_ipv4_multicast_modify
,
3191 .cbs
.cli_show
= cli_show_ip_isis_mt_ipv4_multicast
,
3194 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-management",
3195 .cbs
.modify
= lib_interface_isis_multi_topology_ipv4_management_modify
,
3196 .cbs
.cli_show
= cli_show_ip_isis_mt_ipv4_mgmt
,
3199 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-unicast",
3200 .cbs
.modify
= lib_interface_isis_multi_topology_ipv6_unicast_modify
,
3201 .cbs
.cli_show
= cli_show_ip_isis_mt_ipv6_unicast
,
3204 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-multicast",
3205 .cbs
.modify
= lib_interface_isis_multi_topology_ipv6_multicast_modify
,
3206 .cbs
.cli_show
= cli_show_ip_isis_mt_ipv6_multicast
,
3209 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-management",
3210 .cbs
.modify
= lib_interface_isis_multi_topology_ipv6_management_modify
,
3211 .cbs
.cli_show
= cli_show_ip_isis_mt_ipv6_mgmt
,
3214 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-dstsrc",
3215 .cbs
.modify
= lib_interface_isis_multi_topology_ipv6_dstsrc_modify
,
3216 .cbs
.cli_show
= cli_show_ip_isis_mt_ipv6_dstsrc
,