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 yang_dnode_set_entry(dnode
, area
);
75 static int isis_instance_delete(enum nb_event event
,
76 const struct lyd_node
*dnode
)
80 if (event
!= NB_EV_APPLY
)
83 area_tag
= yang_dnode_get_string(dnode
, "./area-tag");
84 isis_area_destroy(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
= yang_dnode_get_entry(dnode
, 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
= yang_dnode_get_entry(dnode
, 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_delete(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
= yang_dnode_get_entry(dnode
, true);
212 for (ALL_LIST_ELEMENTS_RO(area
->area_addrs
, node
, addrp
)) {
213 if ((addrp
->addr_len
+ ISIS_SYS_ID_LEN
+ 1) == addr
.addr_len
214 && !memcmp(addrp
->area_addr
, addr
.area_addr
, addr
.addr_len
))
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
= yang_dnode_get_entry(dnode
, 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
= yang_dnode_get_entry(dnode
, 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
= yang_dnode_get_entry(dnode
, 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
= yang_dnode_get_entry(dnode
, true);
308 old_metric
= (metric_style
== ISIS_WIDE_METRIC
) ? false : true;
309 new_metric
= (metric_style
== ISIS_NARROW_METRIC
) ? false : true;
310 isis_area_metricstyle_set(area
, old_metric
, new_metric
);
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
= yang_dnode_get_entry(dnode
, 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
= yang_dnode_get_entry(dnode
, 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
= yang_dnode_get_entry(dnode
, 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
= yang_dnode_get_entry(dnode
, 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
= yang_dnode_get_entry(dnode
, 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
= yang_dnode_get_entry(dnode
, 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
= yang_dnode_get_entry(dnode
, 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
= yang_dnode_get_entry(dnode
, 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
= yang_dnode_get_entry(dnode
, 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
= yang_dnode_get_entry(dnode
, true);
511 size_t bufsiz
= strlen(area
->area_tag
) + sizeof("IS-IS Lx");
512 char *buf
= XCALLOC(MTYPE_TMP
, bufsiz
);
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_delete(enum nb_event event
,
540 const struct lyd_node
*dnode
)
542 struct isis_area
*area
;
544 if (event
!= NB_EV_APPLY
)
547 area
= yang_dnode_get_entry(dnode
, true);
548 spf_backoff_free(area
->spf_delay_ietf
[0]);
549 spf_backoff_free(area
->spf_delay_ietf
[1]);
550 area
->spf_delay_ietf
[0] = NULL
;
551 area
->spf_delay_ietf
[1] = NULL
;
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
= yang_dnode_get_entry(dnode
, 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
= yang_dnode_get_entry(dnode
, 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
= yang_dnode_get_entry(dnode
, true);
656 int pass_type
= yang_dnode_get_enum(dnode
, "./password-type");
657 uint8_t snp_auth
= yang_dnode_get_enum(dnode
, "./authenticate-snp");
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_delete(enum nb_event event
,
680 const struct lyd_node
*dnode
)
682 struct isis_area
*area
;
684 if (event
!= NB_EV_APPLY
)
687 area
= yang_dnode_get_entry(dnode
, 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
= yang_dnode_get_entry(dnode
, true);
735 int pass_type
= yang_dnode_get_enum(dnode
, "./password-type");
736 uint8_t snp_auth
= yang_dnode_get_enum(dnode
, "./authenticate-snp");
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_delete(enum nb_event event
,
759 const struct lyd_node
*dnode
)
761 struct isis_area
*area
;
763 if (event
!= NB_EV_APPLY
)
766 area
= yang_dnode_get_entry(dnode
, 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
= yang_dnode_get_entry(dnode
, 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 else 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_delete(
855 enum nb_event event
, const struct lyd_node
*dnode
)
857 struct isis_area
*area
;
860 if (event
!= NB_EV_APPLY
)
863 area
= yang_dnode_get_entry(dnode
, true);
864 level
= yang_dnode_get_enum(dnode
, "./level");
865 isis_redist_unset(area
, level
, AF_INET
, DEFAULT_ROUTE
);
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_delete(
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 */
910 static int isis_instance_default_information_originate_ipv4_metric_delete(
911 enum nb_event event
, const struct lyd_node
*dnode
)
913 /* It's all done by default_info_origin_apply_finish */
918 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv6
920 static int isis_instance_default_information_originate_ipv6_create(
921 enum nb_event event
, const struct lyd_node
*dnode
,
922 union nb_resource
*resource
)
924 /* It's all done by default_info_origin_apply_finish */
928 static int isis_instance_default_information_originate_ipv6_delete(
929 enum nb_event event
, const struct lyd_node
*dnode
)
931 struct isis_area
*area
;
934 if (event
!= NB_EV_APPLY
)
937 area
= yang_dnode_get_entry(dnode
, true);
938 level
= yang_dnode_get_enum(dnode
, "./level");
939 isis_redist_unset(area
, level
, AF_INET6
, DEFAULT_ROUTE
);
945 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv6/always
947 static int isis_instance_default_information_originate_ipv6_always_modify(
948 enum nb_event event
, const struct lyd_node
*dnode
,
949 union nb_resource
*resource
)
951 /* It's all done by default_info_origin_apply_finish */
956 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv6/route-map
958 static int isis_instance_default_information_originate_ipv6_route_map_modify(
959 enum nb_event event
, const struct lyd_node
*dnode
,
960 union nb_resource
*resource
)
962 /* It's all done by default_info_origin_apply_finish */
966 static int isis_instance_default_information_originate_ipv6_route_map_delete(
967 enum nb_event event
, const struct lyd_node
*dnode
)
969 /* It's all done by default_info_origin_apply_finish */
974 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv6/metric
976 static int isis_instance_default_information_originate_ipv6_metric_modify(
977 enum nb_event event
, const struct lyd_node
*dnode
,
978 union nb_resource
*resource
)
980 /* It's all done by default_info_origin_apply_finish */
984 static int isis_instance_default_information_originate_ipv6_metric_delete(
985 enum nb_event event
, const struct lyd_node
*dnode
)
987 /* It's all done by default_info_origin_apply_finish */
992 * XPath: /frr-isisd:isis/instance/redistribute/ipv4
994 static void redistribute_apply_finish(const struct lyd_node
*dnode
, int family
)
996 assert(family
== AF_INET
|| family
== AF_INET6
);
998 unsigned long metric
= 0;
999 const char *routemap
= NULL
;
1000 struct isis_area
*area
;
1002 type
= yang_dnode_get_enum(dnode
, "./protocol");
1003 level
= yang_dnode_get_enum(dnode
, "./level");
1004 area
= yang_dnode_get_entry(dnode
, true);
1006 if (yang_dnode_exists(dnode
, "./metric"))
1007 metric
= yang_dnode_get_uint32(dnode
, "./metric");
1008 else if (yang_dnode_exists(dnode
, "./route-map"))
1009 routemap
= yang_dnode_get_string(dnode
, "./route-map");
1011 isis_redist_set(area
, level
, family
, type
, metric
, routemap
, 0);
1014 static void redistribute_ipv4_apply_finish(const struct lyd_node
*dnode
)
1016 redistribute_apply_finish(dnode
, AF_INET
);
1019 static void redistribute_ipv6_apply_finish(const struct lyd_node
*dnode
)
1021 redistribute_apply_finish(dnode
, AF_INET6
);
1024 static int isis_instance_redistribute_ipv4_create(enum nb_event event
,
1025 const struct lyd_node
*dnode
,
1026 union nb_resource
*resource
)
1028 /* It's all done by redistribute_apply_finish */
1032 static int isis_instance_redistribute_ipv4_delete(enum nb_event event
,
1033 const struct lyd_node
*dnode
)
1035 struct isis_area
*area
;
1038 if (event
!= NB_EV_APPLY
)
1041 area
= yang_dnode_get_entry(dnode
, true);
1042 level
= yang_dnode_get_enum(dnode
, "./level");
1043 type
= yang_dnode_get_enum(dnode
, "./protocol");
1044 isis_redist_unset(area
, level
, AF_INET
, type
);
1050 * XPath: /frr-isisd:isis/instance/redistribute/ipv4/route-map
1053 isis_instance_redistribute_ipv4_route_map_modify(enum nb_event event
,
1054 const struct lyd_node
*dnode
,
1055 union nb_resource
*resource
)
1057 /* It's all done by redistribute_apply_finish */
1062 isis_instance_redistribute_ipv4_route_map_delete(enum nb_event event
,
1063 const struct lyd_node
*dnode
)
1065 /* It's all done by redistribute_apply_finish */
1070 * XPath: /frr-isisd:isis/instance/redistribute/ipv4/metric
1073 isis_instance_redistribute_ipv4_metric_modify(enum nb_event event
,
1074 const struct lyd_node
*dnode
,
1075 union nb_resource
*resource
)
1077 /* It's all done by redistribute_apply_finish */
1082 isis_instance_redistribute_ipv4_metric_delete(enum nb_event event
,
1083 const struct lyd_node
*dnode
)
1085 /* It's all done by redistribute_apply_finish */
1090 * XPath: /frr-isisd:isis/instance/redistribute/ipv6
1092 static int isis_instance_redistribute_ipv6_create(enum nb_event event
,
1093 const struct lyd_node
*dnode
,
1094 union nb_resource
*resource
)
1096 /* It's all done by redistribute_apply_finish */
1100 static int isis_instance_redistribute_ipv6_delete(enum nb_event event
,
1101 const struct lyd_node
*dnode
)
1103 struct isis_area
*area
;
1106 if (event
!= NB_EV_APPLY
)
1109 area
= yang_dnode_get_entry(dnode
, true);
1110 level
= yang_dnode_get_enum(dnode
, "./level");
1111 type
= yang_dnode_get_enum(dnode
, "./protocol");
1112 isis_redist_unset(area
, level
, AF_INET6
, type
);
1118 * XPath: /frr-isisd:isis/instance/redistribute/ipv6/route-map
1121 isis_instance_redistribute_ipv6_route_map_modify(enum nb_event event
,
1122 const struct lyd_node
*dnode
,
1123 union nb_resource
*resource
)
1125 /* It's all done by redistribute_apply_finish */
1130 isis_instance_redistribute_ipv6_route_map_delete(enum nb_event event
,
1131 const struct lyd_node
*dnode
)
1133 /* It's all done by redistribute_apply_finish */
1138 * XPath: /frr-isisd:isis/instance/redistribute/ipv6/metric
1141 isis_instance_redistribute_ipv6_metric_modify(enum nb_event event
,
1142 const struct lyd_node
*dnode
,
1143 union nb_resource
*resource
)
1145 /* It's all done by redistribute_apply_finish */
1150 isis_instance_redistribute_ipv6_metric_delete(enum nb_event event
,
1151 const struct lyd_node
*dnode
)
1153 /* It's all done by redistribute_apply_finish */
1158 * XPath: /frr-isisd:isis/instance/multi-topology/ipv4-multicast
1160 static int isis_multi_topology_common(enum nb_event event
,
1161 const struct lyd_node
*dnode
,
1162 const char *topology
, bool create
)
1164 struct isis_area
*area
;
1165 struct isis_area_mt_setting
*setting
;
1166 uint16_t mtid
= isis_str2mtid(topology
);
1169 case NB_EV_VALIDATE
:
1170 if (mtid
== (uint16_t)-1) {
1171 flog_warn(EC_LIB_NB_CB_CONFIG_VALIDATE
,
1172 "Unknown topology %s", topology
);
1173 return NB_ERR_VALIDATION
;
1180 area
= yang_dnode_get_entry(dnode
, true);
1181 setting
= area_get_mt_setting(area
, mtid
);
1182 setting
->enabled
= create
;
1183 lsp_regenerate_schedule(area
, IS_LEVEL_1
| IS_LEVEL_2
, 0);
1190 static int isis_multi_topology_overload_common(enum nb_event event
,
1191 const struct lyd_node
*dnode
,
1192 const char *topology
)
1194 struct isis_area
*area
;
1195 struct isis_area_mt_setting
*setting
;
1196 uint16_t mtid
= isis_str2mtid(topology
);
1198 /* validation is done in isis_multi_topology_common */
1199 if (event
!= NB_EV_APPLY
)
1202 area
= yang_dnode_get_entry(dnode
, true);
1203 setting
= area_get_mt_setting(area
, mtid
);
1204 setting
->overload
= yang_dnode_get_bool(dnode
, NULL
);
1205 if (setting
->enabled
)
1206 lsp_regenerate_schedule(area
, IS_LEVEL_1
| IS_LEVEL_2
, 0);
1212 isis_instance_multi_topology_ipv4_multicast_create(enum nb_event event
,
1213 const struct lyd_node
*dnode
,
1214 union nb_resource
*resource
)
1216 return isis_multi_topology_common(event
, dnode
, "ipv4-multicast", true);
1220 isis_instance_multi_topology_ipv4_multicast_delete(enum nb_event event
,
1221 const struct lyd_node
*dnode
)
1223 return isis_multi_topology_common(event
, dnode
, "ipv4-multicast",
1228 * XPath: /frr-isisd:isis/instance/multi-topology/ipv4-multicast/overload
1230 static int isis_instance_multi_topology_ipv4_multicast_overload_modify(
1231 enum nb_event event
, const struct lyd_node
*dnode
,
1232 union nb_resource
*resource
)
1234 return isis_multi_topology_overload_common(event
, dnode
,
1239 * XPath: /frr-isisd:isis/instance/multi-topology/ipv4-management
1241 static int isis_instance_multi_topology_ipv4_management_create(
1242 enum nb_event event
, const struct lyd_node
*dnode
,
1243 union nb_resource
*resource
)
1245 return isis_multi_topology_common(event
, dnode
, "ipv4-mgmt", true);
1248 static int isis_instance_multi_topology_ipv4_management_delete(
1249 enum nb_event event
, const struct lyd_node
*dnode
)
1251 return isis_multi_topology_common(event
, dnode
, "ipv4-mgmt", false);
1255 * XPath: /frr-isisd:isis/instance/multi-topology/ipv4-management/overload
1257 static int isis_instance_multi_topology_ipv4_management_overload_modify(
1258 enum nb_event event
, const struct lyd_node
*dnode
,
1259 union nb_resource
*resource
)
1261 return isis_multi_topology_overload_common(event
, dnode
, "ipv4-mgmt");
1265 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-unicast
1268 isis_instance_multi_topology_ipv6_unicast_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-unicast", true);
1276 isis_instance_multi_topology_ipv6_unicast_delete(enum nb_event event
,
1277 const struct lyd_node
*dnode
)
1279 return isis_multi_topology_common(event
, dnode
, "ipv6-unicast", false);
1283 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-unicast/overload
1285 static int isis_instance_multi_topology_ipv6_unicast_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-multicast
1297 isis_instance_multi_topology_ipv6_multicast_create(enum nb_event event
,
1298 const struct lyd_node
*dnode
,
1299 union nb_resource
*resource
)
1301 return isis_multi_topology_common(event
, dnode
, "ipv6-multicast", true);
1305 isis_instance_multi_topology_ipv6_multicast_delete(enum nb_event event
,
1306 const struct lyd_node
*dnode
)
1308 return isis_multi_topology_common(event
, dnode
, "ipv6-multicast",
1313 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-multicast/overload
1315 static int isis_instance_multi_topology_ipv6_multicast_overload_modify(
1316 enum nb_event event
, const struct lyd_node
*dnode
,
1317 union nb_resource
*resource
)
1319 return isis_multi_topology_overload_common(event
, dnode
,
1324 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-management
1326 static int isis_instance_multi_topology_ipv6_management_create(
1327 enum nb_event event
, const struct lyd_node
*dnode
,
1328 union nb_resource
*resource
)
1330 return isis_multi_topology_common(event
, dnode
, "ipv6-mgmt", true);
1333 static int isis_instance_multi_topology_ipv6_management_delete(
1334 enum nb_event event
, const struct lyd_node
*dnode
)
1336 return isis_multi_topology_common(event
, dnode
, "ipv6-mgmt", false);
1340 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-management/overload
1342 static int isis_instance_multi_topology_ipv6_management_overload_modify(
1343 enum nb_event event
, const struct lyd_node
*dnode
,
1344 union nb_resource
*resource
)
1346 return isis_multi_topology_overload_common(event
, dnode
, "ipv6-mgmt");
1350 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-dstsrc
1353 isis_instance_multi_topology_ipv6_dstsrc_create(enum nb_event event
,
1354 const struct lyd_node
*dnode
,
1355 union nb_resource
*resource
)
1357 return isis_multi_topology_common(event
, dnode
, "ipv6-dstsrc", true);
1361 isis_instance_multi_topology_ipv6_dstsrc_delete(enum nb_event event
,
1362 const struct lyd_node
*dnode
)
1364 return isis_multi_topology_common(event
, dnode
, "ipv6-dstsrc", false);
1368 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-dstsrc/overload
1370 static int isis_instance_multi_topology_ipv6_dstsrc_overload_modify(
1371 enum nb_event event
, const struct lyd_node
*dnode
,
1372 union nb_resource
*resource
)
1374 return isis_multi_topology_overload_common(event
, dnode
, "ipv6-dstsrc");
1378 * XPath: /frr-isisd:isis/instance/log-adjacency-changes
1381 isis_instance_log_adjacency_changes_modify(enum nb_event event
,
1382 const struct lyd_node
*dnode
,
1383 union nb_resource
*resource
)
1385 struct isis_area
*area
;
1386 bool log
= yang_dnode_get_bool(dnode
, NULL
);
1388 if (event
!= NB_EV_APPLY
)
1391 area
= yang_dnode_get_entry(dnode
, true);
1392 area
->log_adj_changes
= log
? 1 : 0;
1398 * XPath: /frr-isisd:isis/mpls-te
1400 static int isis_mpls_te_create(enum nb_event event
,
1401 const struct lyd_node
*dnode
,
1402 union nb_resource
*resource
)
1404 struct listnode
*node
;
1405 struct isis_circuit
*circuit
;
1407 if (event
!= NB_EV_APPLY
)
1410 isisMplsTE
.status
= enable
;
1413 * Following code is intended to handle two cases;
1415 * 1) MPLS-TE was disabled at startup time, but now become enabled.
1416 * In this case, we must enable MPLS-TE Circuit regarding interface
1418 * 2) MPLS-TE was once enabled then disabled, and now enabled again.
1420 for (ALL_LIST_ELEMENTS_RO(isisMplsTE
.cir_list
, node
, circuit
)) {
1421 if (circuit
->mtc
== NULL
|| IS_FLOOD_AS(circuit
->mtc
->type
))
1424 if ((circuit
->mtc
->status
== disable
)
1425 && HAS_LINK_PARAMS(circuit
->interface
))
1426 circuit
->mtc
->status
= enable
;
1430 /* Reoriginate STD_TE & GMPLS circuits */
1432 lsp_regenerate_schedule(circuit
->area
, circuit
->is_type
,
1439 static int isis_mpls_te_delete(enum nb_event event
,
1440 const struct lyd_node
*dnode
)
1442 struct listnode
*node
;
1443 struct isis_circuit
*circuit
;
1445 if (event
!= NB_EV_APPLY
)
1448 isisMplsTE
.status
= disable
;
1450 /* Flush LSP if circuit engage */
1451 for (ALL_LIST_ELEMENTS_RO(isisMplsTE
.cir_list
, node
, circuit
)) {
1452 if (circuit
->mtc
== NULL
|| (circuit
->mtc
->status
== disable
))
1455 /* disable MPLS_TE Circuit */
1456 circuit
->mtc
->status
= disable
;
1458 /* Re-originate circuit without STD_TE & GMPLS parameters */
1460 lsp_regenerate_schedule(circuit
->area
, circuit
->is_type
,
1468 * XPath: /frr-isisd:isis/mpls-te/router-address
1470 static int isis_mpls_te_router_address_modify(enum nb_event event
,
1471 const struct lyd_node
*dnode
,
1472 union nb_resource
*resource
)
1474 struct in_addr value
;
1475 struct listnode
*node
;
1476 struct isis_area
*area
;
1478 if (event
!= NB_EV_APPLY
)
1481 yang_dnode_get_ipv4(&value
, dnode
, NULL
);
1482 isisMplsTE
.router_id
.s_addr
= value
.s_addr
;
1483 /* only proceed if MPLS-TE is enabled */
1484 if (isisMplsTE
.status
== disable
)
1487 /* Update main Router ID in isis global structure */
1488 isis
->router_id
= value
.s_addr
;
1489 /* And re-schedule LSP update */
1490 for (ALL_LIST_ELEMENTS_RO(isis
->area_list
, node
, area
))
1491 if (listcount(area
->area_addrs
) > 0)
1492 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1497 static int isis_mpls_te_router_address_delete(enum nb_event event
,
1498 const struct lyd_node
*dnode
)
1500 struct listnode
*node
;
1501 struct isis_area
*area
;
1503 if (event
!= NB_EV_APPLY
)
1506 isisMplsTE
.router_id
.s_addr
= INADDR_ANY
;
1507 /* only proceed if MPLS-TE is enabled */
1508 if (isisMplsTE
.status
== disable
)
1511 /* Update main Router ID in isis global structure */
1512 isis
->router_id
= 0;
1513 /* And re-schedule LSP update */
1514 for (ALL_LIST_ELEMENTS_RO(isis
->area_list
, node
, area
))
1515 if (listcount(area
->area_addrs
) > 0)
1516 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1522 * XPath: /frr-interface:lib/interface/frr-isisd:isis
1524 static int lib_interface_isis_create(enum nb_event event
,
1525 const struct lyd_node
*dnode
,
1526 union nb_resource
*resource
)
1528 struct isis_area
*area
;
1529 struct interface
*ifp
;
1530 struct isis_circuit
*circuit
;
1531 const char *area_tag
= yang_dnode_get_string(dnode
, "./area-tag");
1533 if (event
!= NB_EV_APPLY
)
1536 area
= isis_area_lookup(area_tag
);
1537 /* The area should have already be created. We are
1538 * setting the priority of the global isis area creation
1539 * slightly lower, so it should be executed first, but I
1540 * cannot rely on that so here I have to check.
1544 EC_LIB_NB_CB_CONFIG_APPLY
,
1545 "%s: attempt to create circuit for area %s before the area has been created",
1546 __func__
, area_tag
);
1550 ifp
= yang_dnode_get_entry(dnode
, true);
1551 circuit
= isis_circuit_create(area
, ifp
);
1552 assert(circuit
->state
== C_STATE_CONF
|| circuit
->state
== C_STATE_UP
);
1553 yang_dnode_set_entry(dnode
, circuit
);
1558 static int lib_interface_isis_delete(enum nb_event event
,
1559 const struct lyd_node
*dnode
)
1561 struct isis_circuit
*circuit
;
1563 if (event
!= NB_EV_APPLY
)
1566 circuit
= yang_dnode_get_entry(dnode
, true);
1568 return NB_ERR_INCONSISTENCY
;
1569 /* delete circuit through csm changes */
1570 switch (circuit
->state
) {
1572 isis_csm_state_change(IF_DOWN_FROM_Z
, circuit
,
1573 circuit
->interface
);
1574 isis_csm_state_change(ISIS_DISABLE
, circuit
, circuit
->area
);
1577 isis_csm_state_change(ISIS_DISABLE
, circuit
, circuit
->area
);
1580 isis_csm_state_change(IF_DOWN_FROM_Z
, circuit
,
1581 circuit
->interface
);
1589 * XPath: /frr-interface:lib/interface/frr-isisd:isis/area-tag
1591 static int lib_interface_isis_area_tag_modify(enum nb_event event
,
1592 const struct lyd_node
*dnode
,
1593 union nb_resource
*resource
)
1595 struct isis_circuit
*circuit
;
1596 struct interface
*ifp
;
1598 const char *area_tag
, *ifname
, *vrfname
;
1600 if (event
== NB_EV_VALIDATE
) {
1601 /* libyang doesn't like relative paths across module boundaries
1603 ifname
= yang_dnode_get_string(dnode
->parent
->parent
, "./name");
1604 vrfname
= yang_dnode_get_string(dnode
->parent
->parent
, "./vrf");
1605 vrf
= vrf_lookup_by_name(vrfname
);
1607 ifp
= if_lookup_by_name(ifname
, vrf
->vrf_id
);
1610 circuit
= circuit_lookup_by_ifp(ifp
, isis
->init_circ_list
);
1611 area_tag
= yang_dnode_get_string(dnode
, NULL
);
1612 if (circuit
&& circuit
->area
&& circuit
->area
->area_tag
1613 && strcmp(circuit
->area
->area_tag
, area_tag
)) {
1614 flog_warn(EC_LIB_NB_CB_CONFIG_VALIDATE
,
1615 "ISIS circuit is already defined on %s",
1616 circuit
->area
->area_tag
);
1617 return NB_ERR_VALIDATION
;
1625 * XPath: /frr-interface:lib/interface/frr-isisd:isis/circuit-type
1627 static int lib_interface_isis_circuit_type_modify(enum nb_event event
,
1628 const struct lyd_node
*dnode
,
1629 union nb_resource
*resource
)
1631 int circ_type
= yang_dnode_get_enum(dnode
, NULL
);
1632 struct isis_circuit
*circuit
;
1633 struct interface
*ifp
;
1635 const char *ifname
, *vrfname
;
1638 case NB_EV_VALIDATE
:
1639 /* libyang doesn't like relative paths across module boundaries
1641 ifname
= yang_dnode_get_string(dnode
->parent
->parent
, "./name");
1642 vrfname
= yang_dnode_get_string(dnode
->parent
->parent
, "./vrf");
1643 vrf
= vrf_lookup_by_name(vrfname
);
1645 ifp
= if_lookup_by_name(ifname
, vrf
->vrf_id
);
1648 circuit
= circuit_lookup_by_ifp(ifp
, isis
->init_circ_list
);
1649 if (circuit
&& circuit
->state
== C_STATE_UP
1650 && circuit
->area
->is_type
!= IS_LEVEL_1_AND_2
1651 && circuit
->area
->is_type
!= circ_type
) {
1652 flog_warn(EC_LIB_NB_CB_CONFIG_VALIDATE
,
1653 "Invalid circuit level for area %s",
1654 circuit
->area
->area_tag
);
1655 return NB_ERR_VALIDATION
;
1662 circuit
= yang_dnode_get_entry(dnode
, true);
1663 isis_circuit_is_type_set(circuit
, circ_type
);
1671 * XPath: /frr-interface:lib/interface/frr-isisd:isis/ipv4-routing
1673 static int lib_interface_isis_ipv4_routing_modify(enum nb_event event
,
1674 const struct lyd_node
*dnode
,
1675 union nb_resource
*resource
)
1678 struct isis_circuit
*circuit
;
1680 if (event
!= NB_EV_APPLY
)
1683 circuit
= yang_dnode_get_entry(dnode
, true);
1684 ipv4
= yang_dnode_get_bool(dnode
, NULL
);
1685 ipv6
= yang_dnode_get_bool(dnode
, "../ipv6-routing");
1686 isis_circuit_af_set(circuit
, ipv4
, ipv6
);
1692 * XPath: /frr-interface:lib/interface/frr-isisd:isis/ipv6-routing
1694 static int lib_interface_isis_ipv6_routing_modify(enum nb_event event
,
1695 const struct lyd_node
*dnode
,
1696 union nb_resource
*resource
)
1699 struct isis_circuit
*circuit
;
1701 if (event
!= NB_EV_APPLY
)
1704 circuit
= yang_dnode_get_entry(dnode
, true);
1705 ipv4
= yang_dnode_exists(dnode
, "../ipv4-routing");
1706 ipv6
= yang_dnode_get_bool(dnode
, NULL
);
1707 isis_circuit_af_set(circuit
, ipv4
, ipv6
);
1713 * XPath: /frr-interface:lib/interface/frr-isisd:isis/csnp-interval/level-1
1716 lib_interface_isis_csnp_interval_level_1_modify(enum nb_event event
,
1717 const struct lyd_node
*dnode
,
1718 union nb_resource
*resource
)
1720 struct isis_circuit
*circuit
;
1722 if (event
!= NB_EV_APPLY
)
1725 circuit
= yang_dnode_get_entry(dnode
, true);
1726 circuit
->csnp_interval
[0] = yang_dnode_get_uint16(dnode
, NULL
);
1732 * XPath: /frr-interface:lib/interface/frr-isisd:isis/csnp-interval/level-2
1735 lib_interface_isis_csnp_interval_level_2_modify(enum nb_event event
,
1736 const struct lyd_node
*dnode
,
1737 union nb_resource
*resource
)
1739 struct isis_circuit
*circuit
;
1741 if (event
!= NB_EV_APPLY
)
1744 circuit
= yang_dnode_get_entry(dnode
, true);
1745 circuit
->csnp_interval
[1] = yang_dnode_get_uint16(dnode
, NULL
);
1751 * XPath: /frr-interface:lib/interface/frr-isisd:isis/psnp-interval/level-1
1754 lib_interface_isis_psnp_interval_level_1_modify(enum nb_event event
,
1755 const struct lyd_node
*dnode
,
1756 union nb_resource
*resource
)
1758 struct isis_circuit
*circuit
;
1760 if (event
!= NB_EV_APPLY
)
1763 circuit
= yang_dnode_get_entry(dnode
, true);
1764 circuit
->psnp_interval
[0] = yang_dnode_get_uint16(dnode
, NULL
);
1770 * XPath: /frr-interface:lib/interface/frr-isisd:isis/psnp-interval/level-2
1773 lib_interface_isis_psnp_interval_level_2_modify(enum nb_event event
,
1774 const struct lyd_node
*dnode
,
1775 union nb_resource
*resource
)
1777 struct isis_circuit
*circuit
;
1779 if (event
!= NB_EV_APPLY
)
1782 circuit
= yang_dnode_get_entry(dnode
, true);
1783 circuit
->psnp_interval
[1] = yang_dnode_get_uint16(dnode
, NULL
);
1789 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/padding
1791 static int lib_interface_isis_hello_padding_modify(enum nb_event event
,
1792 const struct lyd_node
*dnode
,
1793 union nb_resource
*resource
)
1795 struct isis_circuit
*circuit
;
1797 if (event
!= NB_EV_APPLY
)
1800 circuit
= yang_dnode_get_entry(dnode
, true);
1801 circuit
->pad_hellos
= yang_dnode_get_bool(dnode
, NULL
);
1807 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/interval/level-1
1810 lib_interface_isis_hello_interval_level_1_modify(enum nb_event event
,
1811 const struct lyd_node
*dnode
,
1812 union nb_resource
*resource
)
1814 struct isis_circuit
*circuit
;
1817 if (event
!= NB_EV_APPLY
)
1820 circuit
= yang_dnode_get_entry(dnode
, true);
1821 interval
= yang_dnode_get_uint32(dnode
, NULL
);
1822 circuit
->hello_interval
[0] = interval
;
1828 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/interval/level-2
1831 lib_interface_isis_hello_interval_level_2_modify(enum nb_event event
,
1832 const struct lyd_node
*dnode
,
1833 union nb_resource
*resource
)
1835 struct isis_circuit
*circuit
;
1838 if (event
!= NB_EV_APPLY
)
1841 circuit
= yang_dnode_get_entry(dnode
, true);
1842 interval
= yang_dnode_get_uint32(dnode
, NULL
);
1843 circuit
->hello_interval
[1] = interval
;
1849 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/multiplier/level-1
1852 lib_interface_isis_hello_multiplier_level_1_modify(enum nb_event event
,
1853 const struct lyd_node
*dnode
,
1854 union nb_resource
*resource
)
1856 struct isis_circuit
*circuit
;
1859 if (event
!= NB_EV_APPLY
)
1862 circuit
= yang_dnode_get_entry(dnode
, true);
1863 multi
= yang_dnode_get_uint16(dnode
, NULL
);
1864 circuit
->hello_multiplier
[0] = multi
;
1870 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/multiplier/level-2
1873 lib_interface_isis_hello_multiplier_level_2_modify(enum nb_event event
,
1874 const struct lyd_node
*dnode
,
1875 union nb_resource
*resource
)
1877 struct isis_circuit
*circuit
;
1880 if (event
!= NB_EV_APPLY
)
1883 circuit
= yang_dnode_get_entry(dnode
, true);
1884 multi
= yang_dnode_get_uint16(dnode
, NULL
);
1885 circuit
->hello_multiplier
[1] = multi
;
1891 * XPath: /frr-interface:lib/interface/frr-isisd:isis/metric/level-1
1894 lib_interface_isis_metric_level_1_modify(enum nb_event event
,
1895 const struct lyd_node
*dnode
,
1896 union nb_resource
*resource
)
1898 struct isis_circuit
*circuit
;
1901 if (event
!= NB_EV_APPLY
)
1904 circuit
= yang_dnode_get_entry(dnode
, true);
1905 met
= yang_dnode_get_uint32(dnode
, NULL
);
1906 isis_circuit_metric_set(circuit
, IS_LEVEL_1
, met
);
1912 * XPath: /frr-interface:lib/interface/frr-isisd:isis/metric/level-2
1915 lib_interface_isis_metric_level_2_modify(enum nb_event event
,
1916 const struct lyd_node
*dnode
,
1917 union nb_resource
*resource
)
1919 struct isis_circuit
*circuit
;
1922 if (event
!= NB_EV_APPLY
)
1925 circuit
= yang_dnode_get_entry(dnode
, true);
1926 met
= yang_dnode_get_uint32(dnode
, NULL
);
1927 isis_circuit_metric_set(circuit
, IS_LEVEL_2
, met
);
1933 * XPath: /frr-interface:lib/interface/frr-isisd:isis/priority/level-1
1936 lib_interface_isis_priority_level_1_modify(enum nb_event event
,
1937 const struct lyd_node
*dnode
,
1938 union nb_resource
*resource
)
1940 struct isis_circuit
*circuit
;
1942 if (event
!= NB_EV_APPLY
)
1945 circuit
= yang_dnode_get_entry(dnode
, true);
1946 circuit
->priority
[0] = yang_dnode_get_uint8(dnode
, NULL
);
1952 * XPath: /frr-interface:lib/interface/frr-isisd:isis/priority/level-2
1955 lib_interface_isis_priority_level_2_modify(enum nb_event event
,
1956 const struct lyd_node
*dnode
,
1957 union nb_resource
*resource
)
1959 struct isis_circuit
*circuit
;
1961 if (event
!= NB_EV_APPLY
)
1964 circuit
= yang_dnode_get_entry(dnode
, true);
1965 circuit
->priority
[1] = yang_dnode_get_uint8(dnode
, NULL
);
1971 * XPath: /frr-interface:lib/interface/frr-isisd:isis/network-type
1973 static int lib_interface_isis_network_type_modify(enum nb_event event
,
1974 const struct lyd_node
*dnode
,
1975 union nb_resource
*resource
)
1977 struct isis_circuit
*circuit
;
1978 int net_type
= yang_dnode_get_enum(dnode
, NULL
);
1981 case NB_EV_VALIDATE
:
1982 circuit
= yang_dnode_get_entry(dnode
, false);
1985 if (circuit
->circ_type
== CIRCUIT_T_LOOPBACK
1986 || circuit
->circ_type
== CIRCUIT_T_UNKNOWN
) {
1988 EC_LIB_NB_CB_CONFIG_VALIDATE
,
1989 "Cannot change network type on unknown or loopback interface");
1990 return NB_ERR_VALIDATION
;
1992 if (net_type
== CIRCUIT_T_BROADCAST
1993 && circuit
->state
== C_STATE_UP
1994 && !if_is_broadcast(circuit
->interface
)) {
1996 EC_LIB_NB_CB_CONFIG_VALIDATE
,
1997 "Cannot configure non-broadcast interface for broadcast operation");
1998 return NB_ERR_VALIDATION
;
2005 circuit
= yang_dnode_get_entry(dnode
, true);
2006 isis_circuit_circ_type_set(circuit
, net_type
);
2014 * XPath: /frr-interface:lib/interface/frr-isisd:isis/passive
2016 static int lib_interface_isis_passive_modify(enum nb_event event
,
2017 const struct lyd_node
*dnode
,
2018 union nb_resource
*resource
)
2020 struct isis_circuit
*circuit
;
2021 struct isis_area
*area
;
2022 struct interface
*ifp
;
2023 bool passive
= yang_dnode_get_bool(dnode
, NULL
);
2025 /* validation only applies if we are setting passive to false */
2026 if (!passive
&& event
== NB_EV_VALIDATE
) {
2027 circuit
= yang_dnode_get_entry(dnode
, false);
2030 ifp
= circuit
->interface
;
2033 if (if_is_loopback(ifp
)) {
2034 flog_warn(EC_LIB_NB_CB_CONFIG_VALIDATE
,
2035 "Loopback is always passive");
2036 return NB_ERR_VALIDATION
;
2040 if (event
!= NB_EV_APPLY
)
2043 circuit
= yang_dnode_get_entry(dnode
, true);
2044 if (circuit
->state
!= C_STATE_UP
) {
2045 circuit
->is_passive
= passive
;
2047 area
= circuit
->area
;
2048 isis_csm_state_change(ISIS_DISABLE
, circuit
, area
);
2049 circuit
->is_passive
= passive
;
2050 isis_csm_state_change(ISIS_ENABLE
, circuit
, area
);
2057 * XPath: /frr-interface:lib/interface/frr-isisd:isis/password
2059 static int lib_interface_isis_password_create(enum nb_event event
,
2060 const struct lyd_node
*dnode
,
2061 union nb_resource
*resource
)
2066 static int lib_interface_isis_password_delete(enum nb_event event
,
2067 const struct lyd_node
*dnode
)
2069 struct isis_circuit
*circuit
;
2071 if (event
!= NB_EV_APPLY
)
2074 circuit
= yang_dnode_get_entry(dnode
, true);
2075 isis_circuit_passwd_unset(circuit
);
2081 * XPath: /frr-interface:lib/interface/frr-isisd:isis/password/password
2084 lib_interface_isis_password_password_modify(enum nb_event event
,
2085 const struct lyd_node
*dnode
,
2086 union nb_resource
*resource
)
2088 struct isis_circuit
*circuit
;
2089 const char *password
;
2091 if (event
!= NB_EV_APPLY
)
2094 password
= yang_dnode_get_string(dnode
, NULL
);
2095 circuit
= yang_dnode_get_entry(dnode
, true);
2096 circuit
->passwd
.len
= strlen(password
);
2097 strncpy((char *)circuit
->passwd
.passwd
, password
, 255);
2103 * XPath: /frr-interface:lib/interface/frr-isisd:isis/password/password-type
2106 lib_interface_isis_password_password_type_modify(enum nb_event event
,
2107 const struct lyd_node
*dnode
,
2108 union nb_resource
*resource
)
2110 struct isis_circuit
*circuit
;
2113 if (event
!= NB_EV_APPLY
)
2116 pass_type
= yang_dnode_get_enum(dnode
, NULL
);
2117 circuit
= yang_dnode_get_entry(dnode
, true);
2118 circuit
->passwd
.type
= pass_type
;
2125 * /frr-interface:lib/interface/frr-isisd:isis/disable-three-way-handshake
2127 static int lib_interface_isis_disable_three_way_handshake_modify(
2128 enum nb_event event
, const struct lyd_node
*dnode
,
2129 union nb_resource
*resource
)
2131 struct isis_circuit
*circuit
;
2133 if (event
!= NB_EV_APPLY
)
2136 circuit
= yang_dnode_get_entry(dnode
, true);
2137 circuit
->disable_threeway_adj
= yang_dnode_get_bool(dnode
, NULL
);
2144 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-unicast
2146 static int lib_interface_isis_multi_topology_common(
2147 enum nb_event event
, const struct lyd_node
*dnode
, uint16_t mtid
)
2149 struct isis_circuit
*circuit
;
2153 case NB_EV_VALIDATE
:
2154 circuit
= yang_dnode_get_entry(dnode
, false);
2155 if (circuit
&& circuit
->area
&& circuit
->area
->oldmetric
) {
2157 EC_LIB_NB_CB_CONFIG_VALIDATE
,
2158 "Multi topology IS-IS can only be used with wide metrics");
2159 return NB_ERR_VALIDATION
;
2166 circuit
= yang_dnode_get_entry(dnode
, true);
2167 value
= yang_dnode_get_bool(dnode
, NULL
);
2168 isis_circuit_mt_enabled_set(circuit
, mtid
, value
);
2175 static int lib_interface_isis_multi_topology_ipv4_unicast_modify(
2176 enum nb_event event
, const struct lyd_node
*dnode
,
2177 union nb_resource
*resource
)
2179 return lib_interface_isis_multi_topology_common(event
, dnode
,
2180 ISIS_MT_IPV4_UNICAST
);
2185 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-multicast
2187 static int lib_interface_isis_multi_topology_ipv4_multicast_modify(
2188 enum nb_event event
, const struct lyd_node
*dnode
,
2189 union nb_resource
*resource
)
2191 return lib_interface_isis_multi_topology_common(event
, dnode
,
2192 ISIS_MT_IPV4_MULTICAST
);
2197 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-management
2199 static int lib_interface_isis_multi_topology_ipv4_management_modify(
2200 enum nb_event event
, const struct lyd_node
*dnode
,
2201 union nb_resource
*resource
)
2203 return lib_interface_isis_multi_topology_common(event
, dnode
,
2209 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-unicast
2211 static int lib_interface_isis_multi_topology_ipv6_unicast_modify(
2212 enum nb_event event
, const struct lyd_node
*dnode
,
2213 union nb_resource
*resource
)
2215 return lib_interface_isis_multi_topology_common(event
, dnode
,
2216 ISIS_MT_IPV6_UNICAST
);
2221 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-multicast
2223 static int lib_interface_isis_multi_topology_ipv6_multicast_modify(
2224 enum nb_event event
, const struct lyd_node
*dnode
,
2225 union nb_resource
*resource
)
2227 return lib_interface_isis_multi_topology_common(event
, dnode
,
2228 ISIS_MT_IPV6_MULTICAST
);
2233 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-management
2235 static int lib_interface_isis_multi_topology_ipv6_management_modify(
2236 enum nb_event event
, const struct lyd_node
*dnode
,
2237 union nb_resource
*resource
)
2239 return lib_interface_isis_multi_topology_common(event
, dnode
,
2244 * XPath: /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-dstsrc
2246 static int lib_interface_isis_multi_topology_ipv6_dstsrc_modify(
2247 enum nb_event event
, const struct lyd_node
*dnode
,
2248 union nb_resource
*resource
)
2250 return lib_interface_isis_multi_topology_common(event
, dnode
,
2251 ISIS_MT_IPV6_DSTSRC
);
2257 static void notif_prep_instance_hdr(const char *xpath
,
2258 const struct isis_area
*area
,
2259 const char *routing_instance
,
2262 char xpath_arg
[XPATH_MAXLEN
];
2263 struct yang_data
*data
;
2265 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/routing-instance", xpath
);
2266 data
= yang_data_new_string(xpath_arg
, routing_instance
);
2267 listnode_add(args
, data
);
2268 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/routing-protocol-name",
2270 data
= yang_data_new_string(xpath_arg
, area
->area_tag
);
2271 listnode_add(args
, data
);
2272 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/isis-level", xpath
);
2273 data
= yang_data_new_enum(xpath_arg
, area
->is_type
);
2274 listnode_add(args
, data
);
2277 static void notif_prepr_iface_hdr(const char *xpath
,
2278 const struct isis_circuit
*circuit
,
2281 char xpath_arg
[XPATH_MAXLEN
];
2282 struct yang_data
*data
;
2284 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/interface-name", xpath
);
2285 data
= yang_data_new_string(xpath_arg
, circuit
->interface
->name
);
2286 listnode_add(args
, data
);
2287 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/interface-level", xpath
);
2288 data
= yang_data_new_enum(xpath_arg
, circuit
->is_type
);
2289 listnode_add(args
, data
);
2290 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/extended-circuit-id", xpath
);
2291 /* we do not seem to have the extended version of the circuit_id */
2292 data
= yang_data_new_uint32(xpath_arg
, (uint32_t)circuit
->circuit_id
);
2293 listnode_add(args
, data
);
2298 * /frr-isisd:database-overload
2300 void isis_notif_db_overload(const struct isis_area
*area
, bool overload
)
2302 const char *xpath
= "/frr-isisd:database-overload";
2303 struct list
*arguments
= yang_data_list_new();
2304 char xpath_arg
[XPATH_MAXLEN
];
2305 struct yang_data
*data
;
2307 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2308 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/overload", xpath
);
2309 data
= yang_data_new_enum(xpath_arg
, !!overload
);
2310 listnode_add(arguments
, data
);
2312 nb_notification_send(xpath
, arguments
);
2317 * /frr-isisd:lsp-too-large
2319 void isis_notif_lsp_too_large(const struct isis_circuit
*circuit
,
2320 uint32_t pdu_size
, const char *lsp_id
)
2322 const char *xpath
= "/frr-isisd:lsp-too-large";
2323 struct list
*arguments
= yang_data_list_new();
2324 char xpath_arg
[XPATH_MAXLEN
];
2325 struct yang_data
*data
;
2326 struct isis_area
*area
= circuit
->area
;
2328 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2329 notif_prepr_iface_hdr(xpath
, circuit
, arguments
);
2330 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/pdu-size", xpath
);
2331 data
= yang_data_new_uint32(xpath_arg
, pdu_size
);
2332 listnode_add(arguments
, data
);
2333 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/lsp-id", xpath
);
2334 data
= yang_data_new_string(xpath_arg
, lsp_id
);
2335 listnode_add(arguments
, data
);
2337 nb_notification_send(xpath
, arguments
);
2342 * /frr-isisd:if-state-change
2344 void isis_notif_if_state_change(const struct isis_circuit
*circuit
, bool down
)
2346 const char *xpath
= "/frr-isisd:if-state-change";
2347 struct list
*arguments
= yang_data_list_new();
2348 char xpath_arg
[XPATH_MAXLEN
];
2349 struct yang_data
*data
;
2350 struct isis_area
*area
= circuit
->area
;
2352 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2353 notif_prepr_iface_hdr(xpath
, circuit
, arguments
);
2354 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/state", xpath
);
2355 data
= yang_data_new_enum(xpath_arg
, !!down
);
2356 listnode_add(arguments
, data
);
2358 nb_notification_send(xpath
, arguments
);
2363 * /frr-isisd:corrupted-lsp-detected
2365 void isis_notif_corrupted_lsp(const struct isis_area
*area
, const char *lsp_id
)
2367 const char *xpath
= "/frr-isisd:corrupted-lsp-detected";
2368 struct list
*arguments
= yang_data_list_new();
2369 char xpath_arg
[XPATH_MAXLEN
];
2370 struct yang_data
*data
;
2372 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2373 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/lsp-id", xpath
);
2374 data
= yang_data_new_string(xpath_arg
, lsp_id
);
2375 listnode_add(arguments
, data
);
2377 nb_notification_send(xpath
, arguments
);
2382 * /frr-isisd:attempt-to-exceed-max-sequence
2384 void isis_notif_lsp_exceed_max(const struct isis_area
*area
, const char *lsp_id
)
2386 const char *xpath
= "/frr-isisd:attempt-to-exceed-max-sequence";
2387 struct list
*arguments
= yang_data_list_new();
2388 char xpath_arg
[XPATH_MAXLEN
];
2389 struct yang_data
*data
;
2391 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2392 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/lsp-id", xpath
);
2393 data
= yang_data_new_string(xpath_arg
, lsp_id
);
2394 listnode_add(arguments
, data
);
2396 nb_notification_send(xpath
, arguments
);
2401 * /frr-isisd:max-area-addresses-mismatch
2403 void isis_notif_max_area_addr_mismatch(const struct isis_circuit
*circuit
,
2404 uint8_t max_area_addrs
,
2405 const char *raw_pdu
)
2407 const char *xpath
= "/frr-isisd:max-area-addresses-mismatch";
2408 struct list
*arguments
= yang_data_list_new();
2409 char xpath_arg
[XPATH_MAXLEN
];
2410 struct yang_data
*data
;
2411 struct isis_area
*area
= circuit
->area
;
2413 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2414 notif_prepr_iface_hdr(xpath
, circuit
, arguments
);
2415 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/max-area-addresses", xpath
);
2416 data
= yang_data_new_uint8(xpath_arg
, max_area_addrs
);
2417 listnode_add(arguments
, data
);
2418 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/raw-pdu", xpath
);
2419 data
= yang_data_new(xpath_arg
, raw_pdu
);
2420 listnode_add(arguments
, data
);
2422 nb_notification_send(xpath
, arguments
);
2427 * /frr-isisd:authentication-type-failure
2429 void isis_notif_authentication_type_failure(const struct isis_circuit
*circuit
,
2430 const char *raw_pdu
)
2432 const char *xpath
= "/frr-isisd:authentication-type-failure";
2433 struct list
*arguments
= yang_data_list_new();
2434 char xpath_arg
[XPATH_MAXLEN
];
2435 struct yang_data
*data
;
2436 struct isis_area
*area
= circuit
->area
;
2438 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2439 notif_prepr_iface_hdr(xpath
, circuit
, arguments
);
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-failure
2451 void isis_notif_authentication_failure(const struct isis_circuit
*circuit
,
2452 const char *raw_pdu
)
2454 const char *xpath
= "/frr-isisd:authentication-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:adjacency-state-change
2473 void isis_notif_adj_state_change(const struct isis_adjacency
*adj
,
2474 int new_state
, const char *reason
)
2476 const char *xpath
= "/frr-isisd:adjacency-state-change";
2477 struct list
*arguments
= yang_data_list_new();
2478 char xpath_arg
[XPATH_MAXLEN
];
2479 struct yang_data
*data
;
2480 struct isis_circuit
*circuit
= adj
->circuit
;
2481 struct isis_area
*area
= circuit
->area
;
2482 struct isis_dynhn
*dyn
= dynhn_find_by_id(adj
->sysid
);
2484 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2485 notif_prepr_iface_hdr(xpath
, circuit
, arguments
);
2487 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/neighbor", xpath
);
2488 data
= yang_data_new_string(xpath_arg
, dyn
->hostname
);
2489 listnode_add(arguments
, data
);
2491 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/neighbor-system-id", xpath
);
2492 data
= yang_data_new_string(xpath_arg
, sysid_print(adj
->sysid
));
2493 listnode_add(arguments
, data
);
2495 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/state", xpath
);
2496 switch (new_state
) {
2498 data
= yang_data_new_string(xpath_arg
, "down");
2501 data
= yang_data_new_string(xpath_arg
, "up");
2503 case ISIS_ADJ_INITIALIZING
:
2504 data
= yang_data_new_string(xpath_arg
, "init");
2507 data
= yang_data_new_string(xpath_arg
, "failed");
2509 listnode_add(arguments
, data
);
2510 if (new_state
== ISIS_ADJ_DOWN
) {
2511 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/reason", xpath
);
2512 data
= yang_data_new_string(xpath_arg
, reason
);
2513 listnode_add(arguments
, data
);
2516 nb_notification_send(xpath
, arguments
);
2521 * /frr-isisd:rejected-adjacency
2523 void isis_notif_reject_adjacency(const struct isis_circuit
*circuit
,
2524 const char *reason
, const char *raw_pdu
)
2526 const char *xpath
= "/frr-isisd:rejected-adjacency";
2527 struct list
*arguments
= yang_data_list_new();
2528 char xpath_arg
[XPATH_MAXLEN
];
2529 struct yang_data
*data
;
2530 struct isis_area
*area
= circuit
->area
;
2532 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2533 notif_prepr_iface_hdr(xpath
, circuit
, arguments
);
2534 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/reason", xpath
);
2535 data
= yang_data_new_string(xpath_arg
, reason
);
2536 listnode_add(arguments
, data
);
2537 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/raw-pdu", xpath
);
2538 data
= yang_data_new(xpath_arg
, raw_pdu
);
2539 listnode_add(arguments
, data
);
2541 nb_notification_send(xpath
, arguments
);
2546 * /frr-isisd:area-mismatch
2548 void isis_notif_area_mismatch(const struct isis_circuit
*circuit
,
2549 const char *raw_pdu
)
2551 const char *xpath
= "/frr-isisd:area-mismatch";
2552 struct list
*arguments
= yang_data_list_new();
2553 char xpath_arg
[XPATH_MAXLEN
];
2554 struct yang_data
*data
;
2555 struct isis_area
*area
= circuit
->area
;
2557 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2558 notif_prepr_iface_hdr(xpath
, circuit
, arguments
);
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:lsp-received
2570 void isis_notif_lsp_received(const struct isis_circuit
*circuit
,
2571 const char *lsp_id
, uint32_t seqno
,
2572 uint32_t timestamp
, const char *sys_id
)
2574 const char *xpath
= "/frr-isisd:lsp-received";
2575 struct list
*arguments
= yang_data_list_new();
2576 char xpath_arg
[XPATH_MAXLEN
];
2577 struct yang_data
*data
;
2578 struct isis_area
*area
= circuit
->area
;
2580 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2581 notif_prepr_iface_hdr(xpath
, circuit
, arguments
);
2582 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/lsp-id", xpath
);
2583 data
= yang_data_new_string(xpath_arg
, lsp_id
);
2584 listnode_add(arguments
, data
);
2585 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/sequence", xpath
);
2586 data
= yang_data_new_uint32(xpath_arg
, seqno
);
2587 listnode_add(arguments
, data
);
2588 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/received-timestamp", xpath
);
2589 data
= yang_data_new_uint32(xpath_arg
, timestamp
);
2590 listnode_add(arguments
, data
);
2591 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/neighbor-system-id", xpath
);
2592 data
= yang_data_new_string(xpath_arg
, sys_id
);
2593 listnode_add(arguments
, data
);
2595 nb_notification_send(xpath
, arguments
);
2600 * /frr-isisd:lsp-generation
2602 void isis_notif_lsp_gen(const struct isis_area
*area
, const char *lsp_id
,
2603 uint32_t seqno
, uint32_t timestamp
)
2605 const char *xpath
= "/frr-isisd:lsp-generation";
2606 struct list
*arguments
= yang_data_list_new();
2607 char xpath_arg
[XPATH_MAXLEN
];
2608 struct yang_data
*data
;
2610 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2611 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/lsp-id", xpath
);
2612 data
= yang_data_new_string(xpath_arg
, lsp_id
);
2613 listnode_add(arguments
, data
);
2614 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/sequence", xpath
);
2615 data
= yang_data_new_uint32(xpath_arg
, seqno
);
2616 listnode_add(arguments
, data
);
2617 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/send-timestamp", xpath
);
2618 data
= yang_data_new_uint32(xpath_arg
, timestamp
);
2619 listnode_add(arguments
, data
);
2621 nb_notification_send(xpath
, arguments
);
2626 * /frr-isisd:id-len-mismatch
2628 void isis_notif_id_len_mismatch(const struct isis_circuit
*circuit
,
2629 uint8_t rcv_id_len
, const char *raw_pdu
)
2631 const char *xpath
= "/frr-isisd:id-len-mismatch";
2632 struct list
*arguments
= yang_data_list_new();
2633 char xpath_arg
[XPATH_MAXLEN
];
2634 struct yang_data
*data
;
2635 struct isis_area
*area
= circuit
->area
;
2637 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2638 notif_prepr_iface_hdr(xpath
, circuit
, arguments
);
2639 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/pdu-field-len", xpath
);
2640 data
= yang_data_new_uint8(xpath_arg
, rcv_id_len
);
2641 listnode_add(arguments
, data
);
2642 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/raw-pdu", xpath
);
2643 data
= yang_data_new(xpath_arg
, raw_pdu
);
2644 listnode_add(arguments
, data
);
2646 nb_notification_send(xpath
, arguments
);
2651 * /frr-isisd:version-skew
2653 void isis_notif_version_skew(const struct isis_circuit
*circuit
,
2654 uint8_t version
, const char *raw_pdu
)
2656 const char *xpath
= "/frr-isisd:version-skew";
2657 struct list
*arguments
= yang_data_list_new();
2658 char xpath_arg
[XPATH_MAXLEN
];
2659 struct yang_data
*data
;
2660 struct isis_area
*area
= circuit
->area
;
2662 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2663 notif_prepr_iface_hdr(xpath
, circuit
, arguments
);
2664 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/protocol-version", xpath
);
2665 data
= yang_data_new_uint8(xpath_arg
, version
);
2666 listnode_add(arguments
, data
);
2667 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/raw-pdu", xpath
);
2668 data
= yang_data_new(xpath_arg
, raw_pdu
);
2669 listnode_add(arguments
, data
);
2671 nb_notification_send(xpath
, arguments
);
2676 * /frr-isisd:lsp-error-detected
2678 void isis_notif_lsp_error(const struct isis_circuit
*circuit
,
2679 const char *lsp_id
, const char *raw_pdu
,
2680 __attribute__((unused
)) uint32_t offset
,
2681 __attribute__((unused
)) uint8_t tlv_type
)
2683 const char *xpath
= "/frr-isisd:lsp-error-detected";
2684 struct list
*arguments
= yang_data_list_new();
2685 char xpath_arg
[XPATH_MAXLEN
];
2686 struct yang_data
*data
;
2687 struct isis_area
*area
= circuit
->area
;
2689 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2690 notif_prepr_iface_hdr(xpath
, circuit
, arguments
);
2691 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/lsp-id", xpath
);
2692 data
= yang_data_new_string(xpath_arg
, lsp_id
);
2693 listnode_add(arguments
, data
);
2694 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/raw-pdu", xpath
);
2695 data
= yang_data_new(xpath_arg
, raw_pdu
);
2696 listnode_add(arguments
, data
);
2697 /* ignore offset and tlv_type which cannot be set properly */
2699 nb_notification_send(xpath
, arguments
);
2704 * /frr-isisd:sequence-number-skipped
2706 void isis_notif_seqno_skipped(const struct isis_circuit
*circuit
,
2709 const char *xpath
= "/frr-isisd:sequence-number-skipped";
2710 struct list
*arguments
= yang_data_list_new();
2711 char xpath_arg
[XPATH_MAXLEN
];
2712 struct yang_data
*data
;
2713 struct isis_area
*area
= circuit
->area
;
2715 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2716 notif_prepr_iface_hdr(xpath
, circuit
, arguments
);
2717 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/lsp-id", xpath
);
2718 data
= yang_data_new_string(xpath_arg
, lsp_id
);
2719 listnode_add(arguments
, data
);
2721 nb_notification_send(xpath
, arguments
);
2726 * /frr-isisd:own-lsp-purge
2728 void isis_notif_own_lsp_purge(const struct isis_circuit
*circuit
,
2731 const char *xpath
= "/frr-isisd:own-lsp-purge";
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
);
2746 /* clang-format off */
2747 const struct frr_yang_module_info frr_isisd_info
= {
2748 .name
= "frr-isisd",
2751 .xpath
= "/frr-isisd:isis/instance",
2752 .cbs
.create
= isis_instance_create
,
2753 .cbs
.delete = isis_instance_delete
,
2754 .cbs
.cli_show
= cli_show_router_isis
,
2755 .priority
= NB_DFLT_PRIORITY
- 1,
2758 .xpath
= "/frr-isisd:isis/instance/is-type",
2759 .cbs
.modify
= isis_instance_is_type_modify
,
2760 .cbs
.cli_show
= cli_show_isis_is_type
,
2763 .xpath
= "/frr-isisd:isis/instance/area-address",
2764 .cbs
.create
= isis_instance_area_address_create
,
2765 .cbs
.delete = isis_instance_area_address_delete
,
2766 .cbs
.cli_show
= cli_show_isis_area_address
,
2769 .xpath
= "/frr-isisd:isis/instance/dynamic-hostname",
2770 .cbs
.modify
= isis_instance_dynamic_hostname_modify
,
2771 .cbs
.cli_show
= cli_show_isis_dynamic_hostname
,
2774 .xpath
= "/frr-isisd:isis/instance/attached",
2775 .cbs
.modify
= isis_instance_attached_modify
,
2776 .cbs
.cli_show
= cli_show_isis_attached
,
2779 .xpath
= "/frr-isisd:isis/instance/overload",
2780 .cbs
.modify
= isis_instance_overload_modify
,
2781 .cbs
.cli_show
= cli_show_isis_overload
,
2784 .xpath
= "/frr-isisd:isis/instance/metric-style",
2785 .cbs
.modify
= isis_instance_metric_style_modify
,
2786 .cbs
.cli_show
= cli_show_isis_metric_style
,
2789 .xpath
= "/frr-isisd:isis/instance/purge-originator",
2790 .cbs
.modify
= isis_instance_purge_originator_modify
,
2791 .cbs
.cli_show
= cli_show_isis_purge_origin
,
2794 .xpath
= "/frr-isisd:isis/instance/lsp/mtu",
2795 .cbs
.modify
= isis_instance_lsp_mtu_modify
,
2796 .cbs
.cli_show
= cli_show_isis_lsp_mtu
,
2799 .xpath
= "/frr-isisd:isis/instance/lsp/refresh-interval",
2800 .cbs
.cli_show
= cli_show_isis_lsp_ref_interval
,
2803 .xpath
= "/frr-isisd:isis/instance/lsp/refresh-interval/level-1",
2804 .cbs
.modify
= isis_instance_lsp_refresh_interval_level_1_modify
,
2807 .xpath
= "/frr-isisd:isis/instance/lsp/refresh-interval/level-2",
2808 .cbs
.modify
= isis_instance_lsp_refresh_interval_level_2_modify
,
2811 .xpath
= "/frr-isisd:isis/instance/lsp/maximum-lifetime",
2812 .cbs
.cli_show
= cli_show_isis_lsp_max_lifetime
,
2815 .xpath
= "/frr-isisd:isis/instance/lsp/maximum-lifetime/level-1",
2816 .cbs
.modify
= isis_instance_lsp_maximum_lifetime_level_1_modify
,
2819 .xpath
= "/frr-isisd:isis/instance/lsp/maximum-lifetime/level-2",
2820 .cbs
.modify
= isis_instance_lsp_maximum_lifetime_level_2_modify
,
2823 .xpath
= "/frr-isisd:isis/instance/lsp/generation-interval",
2824 .cbs
.cli_show
= cli_show_isis_lsp_gen_interval
,
2827 .xpath
= "/frr-isisd:isis/instance/lsp/generation-interval/level-1",
2828 .cbs
.modify
= isis_instance_lsp_generation_interval_level_1_modify
,
2831 .xpath
= "/frr-isisd:isis/instance/lsp/generation-interval/level-2",
2832 .cbs
.modify
= isis_instance_lsp_generation_interval_level_2_modify
,
2835 .xpath
= "/frr-isisd:isis/instance/spf/ietf-backoff-delay",
2836 .cbs
.create
= isis_instance_spf_ietf_backoff_delay_create
,
2837 .cbs
.delete = isis_instance_spf_ietf_backoff_delay_delete
,
2838 .cbs
.apply_finish
= ietf_backoff_delay_apply_finish
,
2839 .cbs
.cli_show
= cli_show_isis_spf_ietf_backoff
,
2842 .xpath
= "/frr-isisd:isis/instance/spf/ietf-backoff-delay/init-delay",
2843 .cbs
.modify
= isis_instance_spf_ietf_backoff_delay_init_delay_modify
,
2846 .xpath
= "/frr-isisd:isis/instance/spf/ietf-backoff-delay/short-delay",
2847 .cbs
.modify
= isis_instance_spf_ietf_backoff_delay_short_delay_modify
,
2850 .xpath
= "/frr-isisd:isis/instance/spf/ietf-backoff-delay/long-delay",
2851 .cbs
.modify
= isis_instance_spf_ietf_backoff_delay_long_delay_modify
,
2854 .xpath
= "/frr-isisd:isis/instance/spf/ietf-backoff-delay/hold-down",
2855 .cbs
.modify
= isis_instance_spf_ietf_backoff_delay_hold_down_modify
,
2858 .xpath
= "/frr-isisd:isis/instance/spf/ietf-backoff-delay/time-to-learn",
2859 .cbs
.modify
= isis_instance_spf_ietf_backoff_delay_time_to_learn_modify
,
2862 .xpath
= "/frr-isisd:isis/instance/spf/minimum-interval",
2863 .cbs
.cli_show
= cli_show_isis_spf_min_interval
,
2866 .xpath
= "/frr-isisd:isis/instance/spf/minimum-interval/level-1",
2867 .cbs
.modify
= isis_instance_spf_minimum_interval_level_1_modify
,
2870 .xpath
= "/frr-isisd:isis/instance/spf/minimum-interval/level-2",
2871 .cbs
.modify
= isis_instance_spf_minimum_interval_level_2_modify
,
2874 .xpath
= "/frr-isisd:isis/instance/area-password",
2875 .cbs
.create
= isis_instance_area_password_create
,
2876 .cbs
.delete = isis_instance_area_password_delete
,
2877 .cbs
.apply_finish
= area_password_apply_finish
,
2878 .cbs
.cli_show
= cli_show_isis_area_pwd
,
2881 .xpath
= "/frr-isisd:isis/instance/area-password/password",
2882 .cbs
.modify
= isis_instance_area_password_password_modify
,
2885 .xpath
= "/frr-isisd:isis/instance/area-password/password-type",
2886 .cbs
.modify
= isis_instance_area_password_password_type_modify
,
2889 .xpath
= "/frr-isisd:isis/instance/area-password/authenticate-snp",
2890 .cbs
.modify
= isis_instance_area_password_authenticate_snp_modify
,
2893 .xpath
= "/frr-isisd:isis/instance/domain-password",
2894 .cbs
.create
= isis_instance_domain_password_create
,
2895 .cbs
.delete = isis_instance_domain_password_delete
,
2896 .cbs
.apply_finish
= domain_password_apply_finish
,
2897 .cbs
.cli_show
= cli_show_isis_domain_pwd
,
2900 .xpath
= "/frr-isisd:isis/instance/domain-password/password",
2901 .cbs
.modify
= isis_instance_domain_password_password_modify
,
2904 .xpath
= "/frr-isisd:isis/instance/domain-password/password-type",
2905 .cbs
.modify
= isis_instance_domain_password_password_type_modify
,
2908 .xpath
= "/frr-isisd:isis/instance/domain-password/authenticate-snp",
2909 .cbs
.modify
= isis_instance_domain_password_authenticate_snp_modify
,
2912 .xpath
= "/frr-isisd:isis/instance/default-information-originate/ipv4",
2913 .cbs
.create
= isis_instance_default_information_originate_ipv4_create
,
2914 .cbs
.delete = isis_instance_default_information_originate_ipv4_delete
,
2915 .cbs
.apply_finish
= default_info_origin_ipv4_apply_finish
,
2916 .cbs
.cli_show
= cli_show_isis_def_origin_ipv4
,
2919 .xpath
= "/frr-isisd:isis/instance/default-information-originate/ipv4/always",
2920 .cbs
.modify
= isis_instance_default_information_originate_ipv4_always_modify
,
2923 .xpath
= "/frr-isisd:isis/instance/default-information-originate/ipv4/route-map",
2924 .cbs
.modify
= isis_instance_default_information_originate_ipv4_route_map_modify
,
2925 .cbs
.delete = isis_instance_default_information_originate_ipv4_route_map_delete
,
2928 .xpath
= "/frr-isisd:isis/instance/default-information-originate/ipv4/metric",
2929 .cbs
.modify
= isis_instance_default_information_originate_ipv4_metric_modify
,
2930 .cbs
.delete = isis_instance_default_information_originate_ipv4_metric_delete
,
2933 .xpath
= "/frr-isisd:isis/instance/default-information-originate/ipv6",
2934 .cbs
.create
= isis_instance_default_information_originate_ipv6_create
,
2935 .cbs
.delete = isis_instance_default_information_originate_ipv6_delete
,
2936 .cbs
.apply_finish
= default_info_origin_ipv6_apply_finish
,
2937 .cbs
.cli_show
= cli_show_isis_def_origin_ipv6
,
2940 .xpath
= "/frr-isisd:isis/instance/default-information-originate/ipv6/always",
2941 .cbs
.modify
= isis_instance_default_information_originate_ipv6_always_modify
,
2944 .xpath
= "/frr-isisd:isis/instance/default-information-originate/ipv6/route-map",
2945 .cbs
.modify
= isis_instance_default_information_originate_ipv6_route_map_modify
,
2946 .cbs
.delete = isis_instance_default_information_originate_ipv6_route_map_delete
,
2949 .xpath
= "/frr-isisd:isis/instance/default-information-originate/ipv6/metric",
2950 .cbs
.modify
= isis_instance_default_information_originate_ipv6_metric_modify
,
2951 .cbs
.delete = isis_instance_default_information_originate_ipv6_metric_delete
,
2954 .xpath
= "/frr-isisd:isis/instance/redistribute/ipv4",
2955 .cbs
.create
= isis_instance_redistribute_ipv4_create
,
2956 .cbs
.delete = isis_instance_redistribute_ipv4_delete
,
2957 .cbs
.apply_finish
= redistribute_ipv4_apply_finish
,
2958 .cbs
.cli_show
= cli_show_isis_redistribute_ipv4
,
2961 .xpath
= "/frr-isisd:isis/instance/redistribute/ipv4/route-map",
2962 .cbs
.modify
= isis_instance_redistribute_ipv4_route_map_modify
,
2963 .cbs
.delete = isis_instance_redistribute_ipv4_route_map_delete
,
2966 .xpath
= "/frr-isisd:isis/instance/redistribute/ipv4/metric",
2967 .cbs
.modify
= isis_instance_redistribute_ipv4_metric_modify
,
2968 .cbs
.delete = isis_instance_redistribute_ipv4_metric_delete
,
2971 .xpath
= "/frr-isisd:isis/instance/redistribute/ipv6",
2972 .cbs
.create
= isis_instance_redistribute_ipv6_create
,
2973 .cbs
.delete = isis_instance_redistribute_ipv6_delete
,
2974 .cbs
.apply_finish
= redistribute_ipv6_apply_finish
,
2975 .cbs
.cli_show
= cli_show_isis_redistribute_ipv6
,
2978 .xpath
= "/frr-isisd:isis/instance/redistribute/ipv6/route-map",
2979 .cbs
.modify
= isis_instance_redistribute_ipv6_route_map_modify
,
2980 .cbs
.delete = isis_instance_redistribute_ipv6_route_map_delete
,
2983 .xpath
= "/frr-isisd:isis/instance/redistribute/ipv6/metric",
2984 .cbs
.modify
= isis_instance_redistribute_ipv6_metric_modify
,
2985 .cbs
.delete = isis_instance_redistribute_ipv6_metric_delete
,
2988 .xpath
= "/frr-isisd:isis/instance/multi-topology/ipv4-multicast",
2989 .cbs
.create
= isis_instance_multi_topology_ipv4_multicast_create
,
2990 .cbs
.delete = isis_instance_multi_topology_ipv4_multicast_delete
,
2991 .cbs
.cli_show
= cli_show_isis_mt_ipv4_multicast
,
2994 .xpath
= "/frr-isisd:isis/instance/multi-topology/ipv4-multicast/overload",
2995 .cbs
.modify
= isis_instance_multi_topology_ipv4_multicast_overload_modify
,
2998 .xpath
= "/frr-isisd:isis/instance/multi-topology/ipv4-management",
2999 .cbs
.create
= isis_instance_multi_topology_ipv4_management_create
,
3000 .cbs
.delete = isis_instance_multi_topology_ipv4_management_delete
,
3001 .cbs
.cli_show
= cli_show_isis_mt_ipv4_mgmt
,
3004 .xpath
= "/frr-isisd:isis/instance/multi-topology/ipv4-management/overload",
3005 .cbs
.modify
= isis_instance_multi_topology_ipv4_management_overload_modify
,
3008 .xpath
= "/frr-isisd:isis/instance/multi-topology/ipv6-unicast",
3009 .cbs
.create
= isis_instance_multi_topology_ipv6_unicast_create
,
3010 .cbs
.delete = isis_instance_multi_topology_ipv6_unicast_delete
,
3011 .cbs
.cli_show
= cli_show_isis_mt_ipv6_unicast
,
3014 .xpath
= "/frr-isisd:isis/instance/multi-topology/ipv6-unicast/overload",
3015 .cbs
.modify
= isis_instance_multi_topology_ipv6_unicast_overload_modify
,
3018 .xpath
= "/frr-isisd:isis/instance/multi-topology/ipv6-multicast",
3019 .cbs
.create
= isis_instance_multi_topology_ipv6_multicast_create
,
3020 .cbs
.delete = isis_instance_multi_topology_ipv6_multicast_delete
,
3021 .cbs
.cli_show
= cli_show_isis_mt_ipv6_multicast
,
3024 .xpath
= "/frr-isisd:isis/instance/multi-topology/ipv6-multicast/overload",
3025 .cbs
.modify
= isis_instance_multi_topology_ipv6_multicast_overload_modify
,
3028 .xpath
= "/frr-isisd:isis/instance/multi-topology/ipv6-management",
3029 .cbs
.create
= isis_instance_multi_topology_ipv6_management_create
,
3030 .cbs
.delete = isis_instance_multi_topology_ipv6_management_delete
,
3031 .cbs
.cli_show
= cli_show_isis_mt_ipv6_mgmt
,
3034 .xpath
= "/frr-isisd:isis/instance/multi-topology/ipv6-management/overload",
3035 .cbs
.modify
= isis_instance_multi_topology_ipv6_management_overload_modify
,
3038 .xpath
= "/frr-isisd:isis/instance/multi-topology/ipv6-dstsrc",
3039 .cbs
.create
= isis_instance_multi_topology_ipv6_dstsrc_create
,
3040 .cbs
.delete = isis_instance_multi_topology_ipv6_dstsrc_delete
,
3041 .cbs
.cli_show
= cli_show_isis_mt_ipv6_dstsrc
,
3044 .xpath
= "/frr-isisd:isis/instance/multi-topology/ipv6-dstsrc/overload",
3045 .cbs
.modify
= isis_instance_multi_topology_ipv6_dstsrc_overload_modify
,
3048 .xpath
= "/frr-isisd:isis/instance/log-adjacency-changes",
3049 .cbs
.modify
= isis_instance_log_adjacency_changes_modify
,
3050 .cbs
.cli_show
= cli_show_isis_log_adjacency
,
3053 .xpath
= "/frr-isisd:isis/mpls-te",
3054 .cbs
.create
= isis_mpls_te_create
,
3055 .cbs
.delete = isis_mpls_te_delete
,
3056 .cbs
.cli_show
= cli_show_isis_mpls_te
,
3059 .xpath
= "/frr-isisd:isis/mpls-te/router-address",
3060 .cbs
.modify
= isis_mpls_te_router_address_modify
,
3061 .cbs
.delete = isis_mpls_te_router_address_delete
,
3062 .cbs
.cli_show
= cli_show_isis_mpls_te_router_addr
,
3065 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis",
3066 .cbs
.create
= lib_interface_isis_create
,
3067 .cbs
.delete = lib_interface_isis_delete
,
3070 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/area-tag",
3071 .cbs
.modify
= lib_interface_isis_area_tag_modify
,
3074 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/circuit-type",
3075 .cbs
.modify
= lib_interface_isis_circuit_type_modify
,
3076 .cbs
.cli_show
= cli_show_ip_isis_circ_type
,
3079 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/ipv4-routing",
3080 .cbs
.modify
= lib_interface_isis_ipv4_routing_modify
,
3081 .cbs
.cli_show
= cli_show_ip_isis_ipv4
,
3084 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/ipv6-routing",
3085 .cbs
.modify
= lib_interface_isis_ipv6_routing_modify
,
3086 .cbs
.cli_show
= cli_show_ip_isis_ipv6
,
3089 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/csnp-interval",
3090 .cbs
.cli_show
= cli_show_ip_isis_csnp_interval
,
3093 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/csnp-interval/level-1",
3094 .cbs
.modify
= lib_interface_isis_csnp_interval_level_1_modify
,
3097 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/csnp-interval/level-2",
3098 .cbs
.modify
= lib_interface_isis_csnp_interval_level_2_modify
,
3101 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/psnp-interval",
3102 .cbs
.cli_show
= cli_show_ip_isis_psnp_interval
,
3105 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/psnp-interval/level-1",
3106 .cbs
.modify
= lib_interface_isis_psnp_interval_level_1_modify
,
3109 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/psnp-interval/level-2",
3110 .cbs
.modify
= lib_interface_isis_psnp_interval_level_2_modify
,
3113 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/hello/padding",
3114 .cbs
.modify
= lib_interface_isis_hello_padding_modify
,
3115 .cbs
.cli_show
= cli_show_ip_isis_hello_padding
,
3118 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/hello/interval",
3119 .cbs
.cli_show
= cli_show_ip_isis_hello_interval
,
3122 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/hello/interval/level-1",
3123 .cbs
.modify
= lib_interface_isis_hello_interval_level_1_modify
,
3126 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/hello/interval/level-2",
3127 .cbs
.modify
= lib_interface_isis_hello_interval_level_2_modify
,
3130 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/hello/multiplier",
3131 .cbs
.cli_show
= cli_show_ip_isis_hello_multi
,
3134 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/hello/multiplier/level-1",
3135 .cbs
.modify
= lib_interface_isis_hello_multiplier_level_1_modify
,
3138 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/hello/multiplier/level-2",
3139 .cbs
.modify
= lib_interface_isis_hello_multiplier_level_2_modify
,
3142 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/metric",
3143 .cbs
.cli_show
= cli_show_ip_isis_metric
,
3146 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/metric/level-1",
3147 .cbs
.modify
= lib_interface_isis_metric_level_1_modify
,
3150 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/metric/level-2",
3151 .cbs
.modify
= lib_interface_isis_metric_level_2_modify
,
3154 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/priority",
3155 .cbs
.cli_show
= cli_show_ip_isis_priority
,
3158 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/priority/level-1",
3159 .cbs
.modify
= lib_interface_isis_priority_level_1_modify
,
3162 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/priority/level-2",
3163 .cbs
.modify
= lib_interface_isis_priority_level_2_modify
,
3166 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/network-type",
3167 .cbs
.modify
= lib_interface_isis_network_type_modify
,
3168 .cbs
.cli_show
= cli_show_ip_isis_network_type
,
3171 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/passive",
3172 .cbs
.modify
= lib_interface_isis_passive_modify
,
3173 .cbs
.cli_show
= cli_show_ip_isis_passive
,
3176 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/password",
3177 .cbs
.create
= lib_interface_isis_password_create
,
3178 .cbs
.delete = lib_interface_isis_password_delete
,
3179 .cbs
.cli_show
= cli_show_ip_isis_password
,
3182 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/password/password",
3183 .cbs
.modify
= lib_interface_isis_password_password_modify
,
3186 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/password/password-type",
3187 .cbs
.modify
= lib_interface_isis_password_password_type_modify
,
3190 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/disable-three-way-handshake",
3191 .cbs
.modify
= lib_interface_isis_disable_three_way_handshake_modify
,
3192 .cbs
.cli_show
= cli_show_ip_isis_threeway_shake
,
3195 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-unicast",
3196 .cbs
.modify
= lib_interface_isis_multi_topology_ipv4_unicast_modify
,
3197 .cbs
.cli_show
= cli_show_ip_isis_mt_ipv4_unicast
,
3200 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-multicast",
3201 .cbs
.modify
= lib_interface_isis_multi_topology_ipv4_multicast_modify
,
3202 .cbs
.cli_show
= cli_show_ip_isis_mt_ipv4_multicast
,
3205 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-management",
3206 .cbs
.modify
= lib_interface_isis_multi_topology_ipv4_management_modify
,
3207 .cbs
.cli_show
= cli_show_ip_isis_mt_ipv4_mgmt
,
3210 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-unicast",
3211 .cbs
.modify
= lib_interface_isis_multi_topology_ipv6_unicast_modify
,
3212 .cbs
.cli_show
= cli_show_ip_isis_mt_ipv6_unicast
,
3215 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-multicast",
3216 .cbs
.modify
= lib_interface_isis_multi_topology_ipv6_multicast_modify
,
3217 .cbs
.cli_show
= cli_show_ip_isis_mt_ipv6_multicast
,
3220 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-management",
3221 .cbs
.modify
= lib_interface_isis_multi_topology_ipv6_management_modify
,
3222 .cbs
.cli_show
= cli_show_ip_isis_mt_ipv6_mgmt
,
3225 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-dstsrc",
3226 .cbs
.modify
= lib_interface_isis_multi_topology_ipv6_dstsrc_modify
,
3227 .cbs
.cli_show
= cli_show_ip_isis_mt_ipv6_dstsrc
,