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_create(enum nb_event event
,
257 const struct lyd_node
*dnode
,
258 union nb_resource
*resource
)
260 struct isis_area
*area
;
262 if (event
!= NB_EV_APPLY
)
265 area
= yang_dnode_get_entry(dnode
, true);
266 isis_area_attached_bit_set(area
, true);
271 static int isis_instance_attached_delete(enum nb_event event
,
272 const struct lyd_node
*dnode
)
274 struct isis_area
*area
;
276 if (event
!= NB_EV_APPLY
)
279 area
= yang_dnode_get_entry(dnode
, true);
280 isis_area_attached_bit_set(area
, false);
286 * XPath: /frr-isisd:isis/instance/overload
288 static int isis_instance_overload_create(enum nb_event event
,
289 const struct lyd_node
*dnode
,
290 union nb_resource
*resource
)
292 struct isis_area
*area
;
294 if (event
!= NB_EV_APPLY
)
297 area
= yang_dnode_get_entry(dnode
, true);
298 isis_area_overload_bit_set(area
, true);
303 static int isis_instance_overload_delete(enum nb_event event
,
304 const struct lyd_node
*dnode
)
306 struct isis_area
*area
;
308 if (event
!= NB_EV_APPLY
)
311 area
= yang_dnode_get_entry(dnode
, true);
312 isis_area_overload_bit_set(area
, false);
318 * XPath: /frr-isisd:isis/instance/metric-style
320 static int isis_instance_metric_style_modify(enum nb_event event
,
321 const struct lyd_node
*dnode
,
322 union nb_resource
*resource
)
324 struct isis_area
*area
;
325 bool old_metric
, new_metric
;
326 enum isis_metric_style metric_style
= yang_dnode_get_enum(dnode
, NULL
);
328 if (event
!= NB_EV_APPLY
)
331 area
= yang_dnode_get_entry(dnode
, true);
332 old_metric
= (metric_style
== ISIS_WIDE_METRIC
) ? false : true;
333 new_metric
= (metric_style
== ISIS_NARROW_METRIC
) ? false : true;
334 isis_area_metricstyle_set(area
, old_metric
, new_metric
);
340 * XPath: /frr-isisd:isis/instance/purge-originator
342 static int isis_instance_purge_originator_create(enum nb_event event
,
343 const struct lyd_node
*dnode
,
344 union nb_resource
*resource
)
346 struct isis_area
*area
;
348 if (event
!= NB_EV_APPLY
)
351 area
= yang_dnode_get_entry(dnode
, true);
352 area
->purge_originator
= true;
357 static int isis_instance_purge_originator_delete(enum nb_event event
,
358 const struct lyd_node
*dnode
)
360 struct isis_area
*area
;
362 if (event
!= NB_EV_APPLY
)
365 area
= yang_dnode_get_entry(dnode
, true);
366 area
->purge_originator
= false;
372 * XPath: /frr-isisd:isis/instance/lsp/mtu
374 static int isis_instance_lsp_mtu_modify(enum nb_event event
,
375 const struct lyd_node
*dnode
,
376 union nb_resource
*resource
)
378 struct listnode
*node
;
379 struct isis_circuit
*circuit
;
380 uint16_t lsp_mtu
= yang_dnode_get_uint16(dnode
, NULL
);
381 struct isis_area
*area
;
385 area
= yang_dnode_get_entry(dnode
, false);
388 for (ALL_LIST_ELEMENTS_RO(area
->circuit_list
, node
, circuit
)) {
389 if (circuit
->state
!= C_STATE_INIT
390 && circuit
->state
!= C_STATE_UP
)
392 if (lsp_mtu
> isis_circuit_pdu_size(circuit
)) {
394 EC_LIB_NB_CB_CONFIG_VALIDATE
,
395 "ISIS area contains circuit %s, which has a maximum PDU size of %zu",
396 circuit
->interface
->name
,
397 isis_circuit_pdu_size(circuit
));
398 return NB_ERR_VALIDATION
;
406 area
= yang_dnode_get_entry(dnode
, true);
407 isis_area_lsp_mtu_set(area
, lsp_mtu
);
415 * XPath: /frr-isisd:isis/instance/lsp/refresh-interval/level-1
418 isis_instance_lsp_refresh_interval_level_1_modify(enum nb_event event
,
419 const struct lyd_node
*dnode
,
420 union nb_resource
*resource
)
422 struct isis_area
*area
;
425 if (event
!= NB_EV_APPLY
)
428 refr_int
= yang_dnode_get_uint16(dnode
, NULL
);
429 area
= yang_dnode_get_entry(dnode
, true);
430 isis_area_lsp_refresh_set(area
, IS_LEVEL_1
, refr_int
);
436 * XPath: /frr-isisd:isis/instance/lsp/refresh-interval/level-2
439 isis_instance_lsp_refresh_interval_level_2_modify(enum nb_event event
,
440 const struct lyd_node
*dnode
,
441 union nb_resource
*resource
)
443 struct isis_area
*area
;
446 if (event
!= NB_EV_APPLY
)
449 refr_int
= yang_dnode_get_uint16(dnode
, NULL
);
450 area
= yang_dnode_get_entry(dnode
, true);
451 isis_area_lsp_refresh_set(area
, IS_LEVEL_2
, refr_int
);
457 * XPath: /frr-isisd:isis/instance/lsp/maximum-lifetime/level-1
460 isis_instance_lsp_maximum_lifetime_level_1_modify(enum nb_event event
,
461 const struct lyd_node
*dnode
,
462 union nb_resource
*resource
)
464 struct isis_area
*area
;
467 if (event
!= NB_EV_APPLY
)
470 max_lt
= yang_dnode_get_uint16(dnode
, NULL
);
471 area
= yang_dnode_get_entry(dnode
, true);
472 isis_area_max_lsp_lifetime_set(area
, IS_LEVEL_1
, max_lt
);
478 * XPath: /frr-isisd:isis/instance/lsp/maximum-lifetime/level-2
481 isis_instance_lsp_maximum_lifetime_level_2_modify(enum nb_event event
,
482 const struct lyd_node
*dnode
,
483 union nb_resource
*resource
)
485 struct isis_area
*area
;
488 if (event
!= NB_EV_APPLY
)
491 max_lt
= yang_dnode_get_uint16(dnode
, NULL
);
492 area
= yang_dnode_get_entry(dnode
, true);
493 isis_area_max_lsp_lifetime_set(area
, IS_LEVEL_2
, max_lt
);
499 * XPath: /frr-isisd:isis/instance/lsp/generation-interval/level-1
501 static int isis_instance_lsp_generation_interval_level_1_modify(
502 enum nb_event event
, const struct lyd_node
*dnode
,
503 union nb_resource
*resource
)
505 struct isis_area
*area
;
508 if (event
!= NB_EV_APPLY
)
511 gen_int
= yang_dnode_get_uint16(dnode
, NULL
);
512 area
= yang_dnode_get_entry(dnode
, true);
513 area
->lsp_gen_interval
[0] = gen_int
;
519 * XPath: /frr-isisd:isis/instance/lsp/generation-interval/level-2
521 static int isis_instance_lsp_generation_interval_level_2_modify(
522 enum nb_event event
, const struct lyd_node
*dnode
,
523 union nb_resource
*resource
)
525 struct isis_area
*area
;
528 if (event
!= NB_EV_APPLY
)
531 gen_int
= yang_dnode_get_uint16(dnode
, NULL
);
532 area
= yang_dnode_get_entry(dnode
, true);
533 area
->lsp_gen_interval
[1] = gen_int
;
539 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay
541 static void ietf_backoff_delay_apply_finish(const struct lyd_node
*dnode
)
543 long init_delay
= yang_dnode_get_uint16(dnode
, "./init-delay");
544 long short_delay
= yang_dnode_get_uint16(dnode
, "./short-delay");
545 long long_delay
= yang_dnode_get_uint16(dnode
, "./long-delay");
546 long holddown
= yang_dnode_get_uint16(dnode
, "./hold-down");
547 long timetolearn
= yang_dnode_get_uint16(dnode
, "./time-to-learn");
548 struct isis_area
*area
= yang_dnode_get_entry(dnode
, true);
549 size_t bufsiz
= strlen(area
->area_tag
) + sizeof("IS-IS Lx");
550 char *buf
= XCALLOC(MTYPE_TMP
, bufsiz
);
552 snprintf(buf
, bufsiz
, "IS-IS %s L1", area
->area_tag
);
553 spf_backoff_free(area
->spf_delay_ietf
[0]);
554 area
->spf_delay_ietf
[0] =
555 spf_backoff_new(master
, buf
, init_delay
, short_delay
,
556 long_delay
, holddown
, timetolearn
);
558 snprintf(buf
, bufsiz
, "IS-IS %s L2", area
->area_tag
);
559 spf_backoff_free(area
->spf_delay_ietf
[1]);
560 area
->spf_delay_ietf
[1] =
561 spf_backoff_new(master
, buf
, init_delay
, short_delay
,
562 long_delay
, holddown
, timetolearn
);
564 XFREE(MTYPE_TMP
, buf
);
568 isis_instance_spf_ietf_backoff_delay_create(enum nb_event event
,
569 const struct lyd_node
*dnode
,
570 union nb_resource
*resource
)
572 /* All the work is done in the apply_finish */
577 isis_instance_spf_ietf_backoff_delay_delete(enum nb_event event
,
578 const struct lyd_node
*dnode
)
580 struct isis_area
*area
;
582 if (event
!= NB_EV_APPLY
)
585 area
= yang_dnode_get_entry(dnode
, true);
586 spf_backoff_free(area
->spf_delay_ietf
[0]);
587 spf_backoff_free(area
->spf_delay_ietf
[1]);
588 area
->spf_delay_ietf
[0] = NULL
;
589 area
->spf_delay_ietf
[1] = NULL
;
595 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay/init-delay
597 static int isis_instance_spf_ietf_backoff_delay_init_delay_modify(
598 enum nb_event event
, const struct lyd_node
*dnode
,
599 union nb_resource
*resource
)
601 /* All the work is done in the apply_finish */
606 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay/short-delay
608 static int isis_instance_spf_ietf_backoff_delay_short_delay_modify(
609 enum nb_event event
, const struct lyd_node
*dnode
,
610 union nb_resource
*resource
)
612 /* All the work is done in the apply_finish */
617 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay/long-delay
619 static int isis_instance_spf_ietf_backoff_delay_long_delay_modify(
620 enum nb_event event
, const struct lyd_node
*dnode
,
621 union nb_resource
*resource
)
623 /* All the work is done in the apply_finish */
628 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay/hold-down
630 static int isis_instance_spf_ietf_backoff_delay_hold_down_modify(
631 enum nb_event event
, const struct lyd_node
*dnode
,
632 union nb_resource
*resource
)
634 /* All the work is done in the apply_finish */
639 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay/time-to-learn
641 static int isis_instance_spf_ietf_backoff_delay_time_to_learn_modify(
642 enum nb_event event
, const struct lyd_node
*dnode
,
643 union nb_resource
*resource
)
645 /* All the work is done in the apply_finish */
650 * XPath: /frr-isisd:isis/instance/spf/minimum-interval/level-1
653 isis_instance_spf_minimum_interval_level_1_modify(enum nb_event event
,
654 const struct lyd_node
*dnode
,
655 union nb_resource
*resource
)
657 struct isis_area
*area
;
659 if (event
!= NB_EV_APPLY
)
662 area
= yang_dnode_get_entry(dnode
, true);
663 area
->min_spf_interval
[0] = yang_dnode_get_uint16(dnode
, NULL
);
669 * XPath: /frr-isisd:isis/instance/spf/minimum-interval/level-2
672 isis_instance_spf_minimum_interval_level_2_modify(enum nb_event event
,
673 const struct lyd_node
*dnode
,
674 union nb_resource
*resource
)
676 struct isis_area
*area
;
678 if (event
!= NB_EV_APPLY
)
681 area
= yang_dnode_get_entry(dnode
, true);
682 area
->min_spf_interval
[1] = yang_dnode_get_uint16(dnode
, NULL
);
688 * XPath: /frr-isisd:isis/instance/area-password
690 static void area_password_apply_finish(const struct lyd_node
*dnode
)
692 const char *password
= yang_dnode_get_string(dnode
, "./password");
693 struct isis_area
*area
= yang_dnode_get_entry(dnode
, true);
694 int pass_type
= yang_dnode_get_enum(dnode
, "./password-type");
695 uint8_t snp_auth
= yang_dnode_get_enum(dnode
, "./authenticate-snp");
698 case ISIS_PASSWD_TYPE_CLEARTXT
:
699 isis_area_passwd_cleartext_set(area
, IS_LEVEL_1
, password
,
702 case ISIS_PASSWD_TYPE_HMAC_MD5
:
703 isis_area_passwd_hmac_md5_set(area
, IS_LEVEL_1
, password
,
709 static int isis_instance_area_password_create(enum nb_event event
,
710 const struct lyd_node
*dnode
,
711 union nb_resource
*resource
)
713 /* actual setting is done in apply_finish */
717 static int isis_instance_area_password_delete(enum nb_event event
,
718 const struct lyd_node
*dnode
)
720 struct isis_area
*area
;
722 if (event
!= NB_EV_APPLY
)
725 area
= yang_dnode_get_entry(dnode
, true);
726 isis_area_passwd_unset(area
, IS_LEVEL_1
);
732 * XPath: /frr-isisd:isis/instance/area-password/password
735 isis_instance_area_password_password_modify(enum nb_event event
,
736 const struct lyd_node
*dnode
,
737 union nb_resource
*resource
)
739 /* actual setting is done in apply_finish */
744 * XPath: /frr-isisd:isis/instance/area-password/password-type
747 isis_instance_area_password_password_type_modify(enum nb_event event
,
748 const struct lyd_node
*dnode
,
749 union nb_resource
*resource
)
751 /* actual setting is done in apply_finish */
756 * XPath: /frr-isisd:isis/instance/area-password/authenticate-snp
758 static int isis_instance_area_password_authenticate_snp_modify(
759 enum nb_event event
, const struct lyd_node
*dnode
,
760 union nb_resource
*resource
)
762 /* actual setting is done in apply_finish */
767 * XPath: /frr-isisd:isis/instance/domain-password
769 static void domain_password_apply_finish(const struct lyd_node
*dnode
)
771 const char *password
= yang_dnode_get_string(dnode
, "./password");
772 struct isis_area
*area
= yang_dnode_get_entry(dnode
, true);
773 int pass_type
= yang_dnode_get_enum(dnode
, "./password-type");
774 uint8_t snp_auth
= yang_dnode_get_enum(dnode
, "./authenticate-snp");
777 case ISIS_PASSWD_TYPE_CLEARTXT
:
778 isis_area_passwd_cleartext_set(area
, IS_LEVEL_2
, password
,
781 case ISIS_PASSWD_TYPE_HMAC_MD5
:
782 isis_area_passwd_hmac_md5_set(area
, IS_LEVEL_2
, password
,
788 static int isis_instance_domain_password_create(enum nb_event event
,
789 const struct lyd_node
*dnode
,
790 union nb_resource
*resource
)
792 /* actual setting is done in apply_finish */
796 static int isis_instance_domain_password_delete(enum nb_event event
,
797 const struct lyd_node
*dnode
)
799 struct isis_area
*area
;
801 if (event
!= NB_EV_APPLY
)
804 area
= yang_dnode_get_entry(dnode
, true);
805 isis_area_passwd_unset(area
, IS_LEVEL_2
);
811 * XPath: /frr-isisd:isis/instance/domain-password/password
814 isis_instance_domain_password_password_modify(enum nb_event event
,
815 const struct lyd_node
*dnode
,
816 union nb_resource
*resource
)
818 /* actual setting is done in apply_finish */
823 * XPath: /frr-isisd:isis/instance/domain-password/password-type
826 isis_instance_domain_password_password_type_modify(enum nb_event event
,
827 const struct lyd_node
*dnode
,
828 union nb_resource
*resource
)
830 /* actual setting is done in apply_finish */
835 * XPath: /frr-isisd:isis/instance/domain-password/authenticate-snp
837 static int isis_instance_domain_password_authenticate_snp_modify(
838 enum nb_event event
, const struct lyd_node
*dnode
,
839 union nb_resource
*resource
)
841 /* actual setting is done in apply_finish */
846 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv4
848 static void default_info_origin_apply_finish(const struct lyd_node
*dnode
,
851 int originate_type
= DEFAULT_ORIGINATE
;
852 unsigned long metric
= 0;
853 const char *routemap
= NULL
;
854 struct isis_area
*area
= yang_dnode_get_entry(dnode
, true);
855 int level
= yang_dnode_get_enum(dnode
, "./level");
857 if (yang_dnode_exists(dnode
, "./always")) {
858 originate_type
= DEFAULT_ORIGINATE_ALWAYS
;
859 } else if (family
== AF_INET6
) {
861 "%s: Zebra doesn't implement default-originate for IPv6 yet, so use with care or use default-originate always.",
865 if (yang_dnode_exists(dnode
, "./metric"))
866 metric
= yang_dnode_get_uint32(dnode
, "./metric");
867 else if (yang_dnode_exists(dnode
, "./route-map"))
868 routemap
= yang_dnode_get_string(dnode
, "./route-map");
870 isis_redist_set(area
, level
, family
, DEFAULT_ROUTE
, metric
, routemap
,
874 static void default_info_origin_ipv4_apply_finish(const struct lyd_node
*dnode
)
876 default_info_origin_apply_finish(dnode
, AF_INET
);
879 static void default_info_origin_ipv6_apply_finish(const struct lyd_node
*dnode
)
881 default_info_origin_apply_finish(dnode
, AF_INET6
);
884 static int isis_instance_default_information_originate_ipv4_create(
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_delete(
893 enum nb_event event
, const struct lyd_node
*dnode
)
895 struct isis_area
*area
;
898 if (event
!= NB_EV_APPLY
)
901 area
= yang_dnode_get_entry(dnode
, true);
902 level
= yang_dnode_get_enum(dnode
, "./level");
903 isis_redist_unset(area
, level
, AF_INET
, DEFAULT_ROUTE
);
909 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv4/always
911 static int isis_instance_default_information_originate_ipv4_always_create(
912 enum nb_event event
, const struct lyd_node
*dnode
,
913 union nb_resource
*resource
)
915 /* It's all done by default_info_origin_apply_finish */
919 static int isis_instance_default_information_originate_ipv4_always_delete(
920 enum nb_event event
, const struct lyd_node
*dnode
)
922 /* It's all done by default_info_origin_apply_finish */
927 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv4/route-map
929 static int isis_instance_default_information_originate_ipv4_route_map_modify(
930 enum nb_event event
, const struct lyd_node
*dnode
,
931 union nb_resource
*resource
)
933 /* It's all done by default_info_origin_apply_finish */
937 static int isis_instance_default_information_originate_ipv4_route_map_delete(
938 enum nb_event event
, const struct lyd_node
*dnode
)
940 /* It's all done by default_info_origin_apply_finish */
945 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv4/metric
947 static int isis_instance_default_information_originate_ipv4_metric_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 */
955 static int isis_instance_default_information_originate_ipv4_metric_delete(
956 enum nb_event event
, const struct lyd_node
*dnode
)
958 /* It's all done by default_info_origin_apply_finish */
963 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv6
965 static int isis_instance_default_information_originate_ipv6_create(
966 enum nb_event event
, const struct lyd_node
*dnode
,
967 union nb_resource
*resource
)
969 /* It's all done by default_info_origin_apply_finish */
973 static int isis_instance_default_information_originate_ipv6_delete(
974 enum nb_event event
, const struct lyd_node
*dnode
)
976 struct isis_area
*area
;
979 if (event
!= NB_EV_APPLY
)
982 area
= yang_dnode_get_entry(dnode
, true);
983 level
= yang_dnode_get_enum(dnode
, "./level");
984 isis_redist_unset(area
, level
, AF_INET6
, DEFAULT_ROUTE
);
990 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv6/always
992 static int isis_instance_default_information_originate_ipv6_always_create(
993 enum nb_event event
, const struct lyd_node
*dnode
,
994 union nb_resource
*resource
)
996 /* It's all done by default_info_origin_apply_finish */
1000 static int isis_instance_default_information_originate_ipv6_always_delete(
1001 enum nb_event event
, const struct lyd_node
*dnode
)
1003 /* It's all done by default_info_origin_apply_finish */
1008 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv6/route-map
1010 static int isis_instance_default_information_originate_ipv6_route_map_modify(
1011 enum nb_event event
, const struct lyd_node
*dnode
,
1012 union nb_resource
*resource
)
1014 /* It's all done by default_info_origin_apply_finish */
1018 static int isis_instance_default_information_originate_ipv6_route_map_delete(
1019 enum nb_event event
, const struct lyd_node
*dnode
)
1021 /* It's all done by default_info_origin_apply_finish */
1026 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv6/metric
1028 static int isis_instance_default_information_originate_ipv6_metric_modify(
1029 enum nb_event event
, const struct lyd_node
*dnode
,
1030 union nb_resource
*resource
)
1032 /* It's all done by default_info_origin_apply_finish */
1036 static int isis_instance_default_information_originate_ipv6_metric_delete(
1037 enum nb_event event
, const struct lyd_node
*dnode
)
1039 /* It's all done by default_info_origin_apply_finish */
1044 * XPath: /frr-isisd:isis/instance/redistribute/ipv4
1046 static void redistribute_apply_finish(const struct lyd_node
*dnode
, int family
)
1048 assert(family
== AF_INET
|| family
== AF_INET6
);
1050 unsigned long metric
= 0;
1051 const char *routemap
= NULL
;
1052 struct isis_area
*area
;
1054 type
= yang_dnode_get_enum(dnode
, "./protocol");
1055 level
= yang_dnode_get_enum(dnode
, "./level");
1056 area
= yang_dnode_get_entry(dnode
, true);
1058 if (yang_dnode_exists(dnode
, "./metric"))
1059 metric
= yang_dnode_get_uint32(dnode
, "./metric");
1060 else if (yang_dnode_exists(dnode
, "./route-map"))
1061 routemap
= yang_dnode_get_string(dnode
, "./route-map");
1063 isis_redist_set(area
, level
, family
, type
, metric
, routemap
, 0);
1066 static void redistribute_ipv4_apply_finish(const struct lyd_node
*dnode
)
1068 redistribute_apply_finish(dnode
, AF_INET
);
1071 static void redistribute_ipv6_apply_finish(const struct lyd_node
*dnode
)
1073 redistribute_apply_finish(dnode
, AF_INET6
);
1076 static int isis_instance_redistribute_ipv4_create(enum nb_event event
,
1077 const struct lyd_node
*dnode
,
1078 union nb_resource
*resource
)
1080 /* It's all done by redistribute_apply_finish */
1084 static int isis_instance_redistribute_ipv4_delete(enum nb_event event
,
1085 const struct lyd_node
*dnode
)
1087 struct isis_area
*area
;
1090 if (event
!= NB_EV_APPLY
)
1093 area
= yang_dnode_get_entry(dnode
, true);
1094 level
= yang_dnode_get_enum(dnode
, "./level");
1095 type
= yang_dnode_get_enum(dnode
, "./protocol");
1096 isis_redist_unset(area
, level
, AF_INET
, type
);
1102 * XPath: /frr-isisd:isis/instance/redistribute/ipv4/route-map
1105 isis_instance_redistribute_ipv4_route_map_modify(enum nb_event event
,
1106 const struct lyd_node
*dnode
,
1107 union nb_resource
*resource
)
1109 /* It's all done by redistribute_apply_finish */
1114 isis_instance_redistribute_ipv4_route_map_delete(enum nb_event event
,
1115 const struct lyd_node
*dnode
)
1117 /* It's all done by redistribute_apply_finish */
1122 * XPath: /frr-isisd:isis/instance/redistribute/ipv4/metric
1125 isis_instance_redistribute_ipv4_metric_modify(enum nb_event event
,
1126 const struct lyd_node
*dnode
,
1127 union nb_resource
*resource
)
1129 /* It's all done by redistribute_apply_finish */
1134 isis_instance_redistribute_ipv4_metric_delete(enum nb_event event
,
1135 const struct lyd_node
*dnode
)
1137 /* It's all done by redistribute_apply_finish */
1142 * XPath: /frr-isisd:isis/instance/redistribute/ipv6
1144 static int isis_instance_redistribute_ipv6_create(enum nb_event event
,
1145 const struct lyd_node
*dnode
,
1146 union nb_resource
*resource
)
1148 /* It's all done by redistribute_apply_finish */
1152 static int isis_instance_redistribute_ipv6_delete(enum nb_event event
,
1153 const struct lyd_node
*dnode
)
1155 struct isis_area
*area
;
1158 if (event
!= NB_EV_APPLY
)
1161 area
= yang_dnode_get_entry(dnode
, true);
1162 level
= yang_dnode_get_enum(dnode
, "./level");
1163 type
= yang_dnode_get_enum(dnode
, "./protocol");
1164 isis_redist_unset(area
, level
, AF_INET6
, type
);
1170 * XPath: /frr-isisd:isis/instance/redistribute/ipv6/route-map
1173 isis_instance_redistribute_ipv6_route_map_modify(enum nb_event event
,
1174 const struct lyd_node
*dnode
,
1175 union nb_resource
*resource
)
1177 /* It's all done by redistribute_apply_finish */
1182 isis_instance_redistribute_ipv6_route_map_delete(enum nb_event event
,
1183 const struct lyd_node
*dnode
)
1185 /* It's all done by redistribute_apply_finish */
1190 * XPath: /frr-isisd:isis/instance/redistribute/ipv6/metric
1193 isis_instance_redistribute_ipv6_metric_modify(enum nb_event event
,
1194 const struct lyd_node
*dnode
,
1195 union nb_resource
*resource
)
1197 /* It's all done by redistribute_apply_finish */
1202 isis_instance_redistribute_ipv6_metric_delete(enum nb_event event
,
1203 const struct lyd_node
*dnode
)
1205 /* It's all done by redistribute_apply_finish */
1210 * XPath: /frr-isisd:isis/instance/multi-topology/ipv4-multicast
1212 static int isis_multi_topology_common(enum nb_event event
,
1213 const struct lyd_node
*dnode
,
1214 const char *topology
, bool create
)
1216 struct isis_area
*area
;
1217 struct isis_area_mt_setting
*setting
;
1218 uint16_t mtid
= isis_str2mtid(topology
);
1221 case NB_EV_VALIDATE
:
1222 if (mtid
== (uint16_t)-1) {
1223 flog_warn(EC_LIB_NB_CB_CONFIG_VALIDATE
,
1224 "Unknown topology %s", topology
);
1225 return NB_ERR_VALIDATION
;
1232 area
= yang_dnode_get_entry(dnode
, true);
1233 setting
= area_get_mt_setting(area
, mtid
);
1234 setting
->enabled
= create
;
1235 lsp_regenerate_schedule(area
, IS_LEVEL_1
| IS_LEVEL_2
, 0);
1242 static int isis_multi_topology_overload_common(enum nb_event event
,
1243 const struct lyd_node
*dnode
,
1244 const char *topology
,
1247 struct isis_area
*area
;
1248 struct isis_area_mt_setting
*setting
;
1249 uint16_t mtid
= isis_str2mtid(topology
);
1251 /* validation is done in isis_multi_topology_common */
1252 if (event
!= NB_EV_APPLY
)
1255 area
= yang_dnode_get_entry(dnode
, true);
1256 setting
= area_get_mt_setting(area
, mtid
);
1257 setting
->overload
= create
;
1258 if (setting
->enabled
)
1259 lsp_regenerate_schedule(area
, IS_LEVEL_1
| IS_LEVEL_2
, 0);
1265 isis_instance_multi_topology_ipv4_multicast_create(enum nb_event event
,
1266 const struct lyd_node
*dnode
,
1267 union nb_resource
*resource
)
1269 return isis_multi_topology_common(event
, dnode
, "ipv4-multicast", true);
1273 isis_instance_multi_topology_ipv4_multicast_delete(enum nb_event event
,
1274 const struct lyd_node
*dnode
)
1276 return isis_multi_topology_common(event
, dnode
, "ipv4-multicast",
1281 * XPath: /frr-isisd:isis/instance/multi-topology/ipv4-multicast/overload
1283 static int isis_instance_multi_topology_ipv4_multicast_overload_create(
1284 enum nb_event event
, const struct lyd_node
*dnode
,
1285 union nb_resource
*resource
)
1287 return isis_multi_topology_overload_common(event
, dnode
,
1288 "ipv4-multicast", true);
1291 static int isis_instance_multi_topology_ipv4_multicast_overload_delete(
1292 enum nb_event event
, const struct lyd_node
*dnode
)
1294 return isis_multi_topology_overload_common(event
, dnode
,
1295 "ipv4-multicast", false);
1299 * XPath: /frr-isisd:isis/instance/multi-topology/ipv4-management
1301 static int isis_instance_multi_topology_ipv4_management_create(
1302 enum nb_event event
, const struct lyd_node
*dnode
,
1303 union nb_resource
*resource
)
1305 return isis_multi_topology_common(event
, dnode
, "ipv4-mgmt", true);
1308 static int isis_instance_multi_topology_ipv4_management_delete(
1309 enum nb_event event
, const struct lyd_node
*dnode
)
1311 return isis_multi_topology_common(event
, dnode
, "ipv4-mgmt", false);
1315 * XPath: /frr-isisd:isis/instance/multi-topology/ipv4-management/overload
1317 static int isis_instance_multi_topology_ipv4_management_overload_create(
1318 enum nb_event event
, const struct lyd_node
*dnode
,
1319 union nb_resource
*resource
)
1321 return isis_multi_topology_overload_common(event
, dnode
, "ipv4-mgmt",
1325 static int isis_instance_multi_topology_ipv4_management_overload_delete(
1326 enum nb_event event
, const struct lyd_node
*dnode
)
1328 return isis_multi_topology_overload_common(event
, dnode
, "ipv4-mgmt",
1333 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-unicast
1336 isis_instance_multi_topology_ipv6_unicast_create(enum nb_event event
,
1337 const struct lyd_node
*dnode
,
1338 union nb_resource
*resource
)
1340 return isis_multi_topology_common(event
, dnode
, "ipv6-unicast", true);
1344 isis_instance_multi_topology_ipv6_unicast_delete(enum nb_event event
,
1345 const struct lyd_node
*dnode
)
1347 return isis_multi_topology_common(event
, dnode
, "ipv6-unicast", false);
1351 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-unicast/overload
1353 static int isis_instance_multi_topology_ipv6_unicast_overload_create(
1354 enum nb_event event
, const struct lyd_node
*dnode
,
1355 union nb_resource
*resource
)
1357 return isis_multi_topology_overload_common(event
, dnode
, "ipv6-unicast",
1361 static int isis_instance_multi_topology_ipv6_unicast_overload_delete(
1362 enum nb_event event
, const struct lyd_node
*dnode
)
1364 return isis_multi_topology_overload_common(event
, dnode
, "ipv6-unicast",
1369 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-multicast
1372 isis_instance_multi_topology_ipv6_multicast_create(enum nb_event event
,
1373 const struct lyd_node
*dnode
,
1374 union nb_resource
*resource
)
1376 return isis_multi_topology_common(event
, dnode
, "ipv6-multicast", true);
1380 isis_instance_multi_topology_ipv6_multicast_delete(enum nb_event event
,
1381 const struct lyd_node
*dnode
)
1383 return isis_multi_topology_common(event
, dnode
, "ipv6-multicast",
1388 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-multicast/overload
1390 static int isis_instance_multi_topology_ipv6_multicast_overload_create(
1391 enum nb_event event
, const struct lyd_node
*dnode
,
1392 union nb_resource
*resource
)
1394 return isis_multi_topology_overload_common(event
, dnode
,
1395 "ipv6-multicast", true);
1398 static int isis_instance_multi_topology_ipv6_multicast_overload_delete(
1399 enum nb_event event
, const struct lyd_node
*dnode
)
1401 return isis_multi_topology_overload_common(event
, dnode
,
1402 "ipv6-multicast", false);
1406 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-management
1408 static int isis_instance_multi_topology_ipv6_management_create(
1409 enum nb_event event
, const struct lyd_node
*dnode
,
1410 union nb_resource
*resource
)
1412 return isis_multi_topology_common(event
, dnode
, "ipv6-mgmt", true);
1415 static int isis_instance_multi_topology_ipv6_management_delete(
1416 enum nb_event event
, const struct lyd_node
*dnode
)
1418 return isis_multi_topology_common(event
, dnode
, "ipv6-mgmt", false);
1422 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-management/overload
1424 static int isis_instance_multi_topology_ipv6_management_overload_create(
1425 enum nb_event event
, const struct lyd_node
*dnode
,
1426 union nb_resource
*resource
)
1428 return isis_multi_topology_overload_common(event
, dnode
, "ipv6-mgmt",
1432 static int isis_instance_multi_topology_ipv6_management_overload_delete(
1433 enum nb_event event
, const struct lyd_node
*dnode
)
1435 return isis_multi_topology_overload_common(event
, dnode
, "ipv6-mgmt",
1440 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-dstsrc
1443 isis_instance_multi_topology_ipv6_dstsrc_create(enum nb_event event
,
1444 const struct lyd_node
*dnode
,
1445 union nb_resource
*resource
)
1447 return isis_multi_topology_common(event
, dnode
, "ipv6-dstsrc", true);
1451 isis_instance_multi_topology_ipv6_dstsrc_delete(enum nb_event event
,
1452 const struct lyd_node
*dnode
)
1454 return isis_multi_topology_common(event
, dnode
, "ipv6-dstsrc", false);
1458 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-dstsrc/overload
1460 static int isis_instance_multi_topology_ipv6_dstsrc_overload_create(
1461 enum nb_event event
, const struct lyd_node
*dnode
,
1462 union nb_resource
*resource
)
1464 return isis_multi_topology_overload_common(event
, dnode
, "ipv6-dstsrc",
1468 static int isis_instance_multi_topology_ipv6_dstsrc_overload_delete(
1469 enum nb_event event
, const struct lyd_node
*dnode
)
1471 return isis_multi_topology_overload_common(event
, dnode
, "ipv6-dstsrc",
1476 * XPath: /frr-isisd:isis/instance/log-adjacency-changes
1479 isis_instance_log_adjacency_changes_create(enum nb_event event
,
1480 const struct lyd_node
*dnode
,
1481 union nb_resource
*resource
)
1483 struct isis_area
*area
;
1485 if (event
!= NB_EV_APPLY
)
1488 area
= yang_dnode_get_entry(dnode
, true);
1489 area
->log_adj_changes
= 1;
1495 isis_instance_log_adjacency_changes_delete(enum nb_event event
,
1496 const struct lyd_node
*dnode
)
1498 struct isis_area
*area
;
1500 if (event
!= NB_EV_APPLY
)
1503 area
= yang_dnode_get_entry(dnode
, true);
1504 area
->log_adj_changes
= 0;
1510 * XPath: /frr-isisd:isis/mpls-te
1512 static int isis_mpls_te_create(enum nb_event event
,
1513 const struct lyd_node
*dnode
,
1514 union nb_resource
*resource
)
1516 struct listnode
*node
;
1517 struct isis_circuit
*circuit
;
1519 if (event
!= NB_EV_APPLY
)
1522 isisMplsTE
.status
= enable
;
1525 * Following code is intended to handle two cases;
1527 * 1) MPLS-TE was disabled at startup time, but now become enabled.
1528 * In this case, we must enable MPLS-TE Circuit regarding interface
1530 * 2) MPLS-TE was once enabled then disabled, and now enabled again.
1532 for (ALL_LIST_ELEMENTS_RO(isisMplsTE
.cir_list
, node
, circuit
)) {
1533 if (circuit
->mtc
== NULL
|| IS_FLOOD_AS(circuit
->mtc
->type
))
1536 if ((circuit
->mtc
->status
== disable
)
1537 && HAS_LINK_PARAMS(circuit
->interface
))
1538 circuit
->mtc
->status
= enable
;
1542 /* Reoriginate STD_TE & GMPLS circuits */
1544 lsp_regenerate_schedule(circuit
->area
, circuit
->is_type
,
1551 static int isis_mpls_te_delete(enum nb_event event
,
1552 const struct lyd_node
*dnode
)
1554 struct listnode
*node
;
1555 struct isis_circuit
*circuit
;
1557 if (event
!= NB_EV_APPLY
)
1560 isisMplsTE
.status
= disable
;
1562 /* Flush LSP if circuit engage */
1563 for (ALL_LIST_ELEMENTS_RO(isisMplsTE
.cir_list
, node
, circuit
)) {
1564 if (circuit
->mtc
== NULL
|| (circuit
->mtc
->status
== disable
))
1567 /* disable MPLS_TE Circuit */
1568 circuit
->mtc
->status
= disable
;
1570 /* Re-originate circuit without STD_TE & GMPLS parameters */
1572 lsp_regenerate_schedule(circuit
->area
, circuit
->is_type
,
1580 * XPath: /frr-isisd:isis/mpls-te/router-address
1582 static int isis_mpls_te_router_address_modify(enum nb_event event
,
1583 const struct lyd_node
*dnode
,
1584 union nb_resource
*resource
)
1586 struct in_addr value
;
1587 struct listnode
*node
;
1588 struct isis_area
*area
;
1590 if (event
!= NB_EV_APPLY
)
1593 yang_dnode_get_ipv4(&value
, dnode
, NULL
);
1594 isisMplsTE
.router_id
.s_addr
= value
.s_addr
;
1595 /* only proceed if MPLS-TE is enabled */
1596 if (isisMplsTE
.status
== disable
)
1599 /* Update main Router ID in isis global structure */
1600 isis
->router_id
= value
.s_addr
;
1601 /* And re-schedule LSP update */
1602 for (ALL_LIST_ELEMENTS_RO(isis
->area_list
, node
, area
))
1603 if (listcount(area
->area_addrs
) > 0)
1604 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1609 static int isis_mpls_te_router_address_delete(enum nb_event event
,
1610 const struct lyd_node
*dnode
)
1612 struct listnode
*node
;
1613 struct isis_area
*area
;
1615 if (event
!= NB_EV_APPLY
)
1618 isisMplsTE
.router_id
.s_addr
= INADDR_ANY
;
1619 /* only proceed if MPLS-TE is enabled */
1620 if (isisMplsTE
.status
== disable
)
1623 /* Update main Router ID in isis global structure */
1624 isis
->router_id
= 0;
1625 /* And re-schedule LSP update */
1626 for (ALL_LIST_ELEMENTS_RO(isis
->area_list
, node
, area
))
1627 if (listcount(area
->area_addrs
) > 0)
1628 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1634 * XPath: /frr-interface:lib/interface/frr-isisd:isis
1636 static int lib_interface_isis_create(enum nb_event event
,
1637 const struct lyd_node
*dnode
,
1638 union nb_resource
*resource
)
1640 struct isis_area
*area
;
1641 struct interface
*ifp
;
1642 struct isis_circuit
*circuit
;
1643 const char *area_tag
= yang_dnode_get_string(dnode
, "./area-tag");
1645 if (event
!= NB_EV_APPLY
)
1648 area
= isis_area_lookup(area_tag
);
1649 /* The area should have already be created. We are
1650 * setting the priority of the global isis area creation
1651 * slightly lower, so it should be executed first, but I
1652 * cannot rely on that so here I have to check.
1656 EC_LIB_NB_CB_CONFIG_APPLY
,
1657 "%s: attempt to create circuit for area %s before the area has been created",
1658 __func__
, area_tag
);
1662 ifp
= yang_dnode_get_entry(dnode
, true);
1663 circuit
= isis_circuit_create(area
, ifp
);
1664 assert(circuit
->state
== C_STATE_CONF
|| circuit
->state
== C_STATE_UP
);
1665 yang_dnode_set_entry(dnode
, circuit
);
1670 static int lib_interface_isis_delete(enum nb_event event
,
1671 const struct lyd_node
*dnode
)
1673 struct isis_circuit
*circuit
;
1675 if (event
!= NB_EV_APPLY
)
1678 circuit
= yang_dnode_get_entry(dnode
, true);
1680 return NB_ERR_INCONSISTENCY
;
1681 /* delete circuit through csm changes */
1682 switch (circuit
->state
) {
1684 isis_csm_state_change(IF_DOWN_FROM_Z
, circuit
,
1685 circuit
->interface
);
1686 isis_csm_state_change(ISIS_DISABLE
, circuit
, circuit
->area
);
1689 isis_csm_state_change(ISIS_DISABLE
, circuit
, circuit
->area
);
1692 isis_csm_state_change(IF_DOWN_FROM_Z
, circuit
,
1693 circuit
->interface
);
1701 * XPath: /frr-interface:lib/interface/frr-isisd:isis/area-tag
1703 static int lib_interface_isis_area_tag_modify(enum nb_event event
,
1704 const struct lyd_node
*dnode
,
1705 union nb_resource
*resource
)
1707 struct isis_circuit
*circuit
;
1708 struct interface
*ifp
;
1710 const char *area_tag
, *ifname
, *vrfname
;
1712 if (event
== NB_EV_VALIDATE
) {
1713 /* libyang doesn't like relative paths across module boundaries
1715 ifname
= yang_dnode_get_string(dnode
->parent
->parent
, "./name");
1716 vrfname
= yang_dnode_get_string(dnode
->parent
->parent
, "./vrf");
1717 vrf
= vrf_lookup_by_name(vrfname
);
1719 ifp
= if_lookup_by_name(ifname
, vrf
->vrf_id
);
1722 circuit
= circuit_lookup_by_ifp(ifp
, isis
->init_circ_list
);
1723 area_tag
= yang_dnode_get_string(dnode
, NULL
);
1724 if (circuit
&& circuit
->area
&& circuit
->area
->area_tag
1725 && strcmp(circuit
->area
->area_tag
, area_tag
)) {
1726 flog_warn(EC_LIB_NB_CB_CONFIG_VALIDATE
,
1727 "ISIS circuit is already defined on %s",
1728 circuit
->area
->area_tag
);
1729 return NB_ERR_VALIDATION
;
1737 * XPath: /frr-interface:lib/interface/frr-isisd:isis/circuit-type
1739 static int lib_interface_isis_circuit_type_modify(enum nb_event event
,
1740 const struct lyd_node
*dnode
,
1741 union nb_resource
*resource
)
1743 int circ_type
= yang_dnode_get_enum(dnode
, NULL
);
1744 struct isis_circuit
*circuit
;
1745 struct interface
*ifp
;
1747 const char *ifname
, *vrfname
;
1750 case NB_EV_VALIDATE
:
1751 /* libyang doesn't like relative paths across module boundaries
1753 ifname
= yang_dnode_get_string(dnode
->parent
->parent
, "./name");
1754 vrfname
= yang_dnode_get_string(dnode
->parent
->parent
, "./vrf");
1755 vrf
= vrf_lookup_by_name(vrfname
);
1757 ifp
= if_lookup_by_name(ifname
, vrf
->vrf_id
);
1760 circuit
= circuit_lookup_by_ifp(ifp
, isis
->init_circ_list
);
1761 if (circuit
&& circuit
->state
== C_STATE_UP
1762 && circuit
->area
->is_type
!= IS_LEVEL_1_AND_2
1763 && circuit
->area
->is_type
!= circ_type
) {
1764 flog_warn(EC_LIB_NB_CB_CONFIG_VALIDATE
,
1765 "Invalid circuit level for area %s",
1766 circuit
->area
->area_tag
);
1767 return NB_ERR_VALIDATION
;
1774 circuit
= yang_dnode_get_entry(dnode
, true);
1775 isis_circuit_is_type_set(circuit
, circ_type
);
1783 * XPath: /frr-interface:lib/interface/frr-isisd:isis/ipv4-routing
1785 static int lib_interface_isis_ipv4_routing_create(enum nb_event event
,
1786 const struct lyd_node
*dnode
,
1787 union nb_resource
*resource
)
1790 struct isis_circuit
*circuit
;
1792 if (event
!= NB_EV_APPLY
)
1795 circuit
= yang_dnode_get_entry(dnode
, true);
1796 ipv6
= yang_dnode_exists(dnode
, "../ipv6-routing");
1797 isis_circuit_af_set(circuit
, true, ipv6
);
1802 static int lib_interface_isis_ipv4_routing_delete(enum nb_event event
,
1803 const struct lyd_node
*dnode
)
1806 struct isis_circuit
*circuit
;
1808 if (event
!= NB_EV_APPLY
)
1811 circuit
= yang_dnode_get_entry(dnode
, true);
1812 if (circuit
&& circuit
->area
) {
1813 ipv6
= yang_dnode_exists(dnode
, "../ipv6-routing");
1814 isis_circuit_af_set(circuit
, false, ipv6
);
1821 * XPath: /frr-interface:lib/interface/frr-isisd:isis/ipv6-routing
1823 static int lib_interface_isis_ipv6_routing_create(enum nb_event event
,
1824 const struct lyd_node
*dnode
,
1825 union nb_resource
*resource
)
1828 struct isis_circuit
*circuit
;
1830 if (event
!= NB_EV_APPLY
)
1833 circuit
= yang_dnode_get_entry(dnode
, true);
1834 ipv4
= yang_dnode_exists(dnode
, "../ipv6-routing");
1835 isis_circuit_af_set(circuit
, ipv4
, true);
1840 static int lib_interface_isis_ipv6_routing_delete(enum nb_event event
,
1841 const struct lyd_node
*dnode
)
1844 struct isis_circuit
*circuit
;
1846 if (event
!= NB_EV_APPLY
)
1849 circuit
= yang_dnode_get_entry(dnode
, true);
1850 if (circuit
->area
) {
1851 ipv4
= yang_dnode_exists(dnode
, "../ipv4-routing");
1852 isis_circuit_af_set(circuit
, ipv4
, false);
1859 * XPath: /frr-interface:lib/interface/frr-isisd:isis/csnp-interval/level-1
1862 lib_interface_isis_csnp_interval_level_1_modify(enum nb_event event
,
1863 const struct lyd_node
*dnode
,
1864 union nb_resource
*resource
)
1866 struct isis_circuit
*circuit
;
1868 if (event
!= NB_EV_APPLY
)
1871 circuit
= yang_dnode_get_entry(dnode
, true);
1872 circuit
->csnp_interval
[0] = yang_dnode_get_uint16(dnode
, NULL
);
1878 * XPath: /frr-interface:lib/interface/frr-isisd:isis/csnp-interval/level-2
1881 lib_interface_isis_csnp_interval_level_2_modify(enum nb_event event
,
1882 const struct lyd_node
*dnode
,
1883 union nb_resource
*resource
)
1885 struct isis_circuit
*circuit
;
1887 if (event
!= NB_EV_APPLY
)
1890 circuit
= yang_dnode_get_entry(dnode
, true);
1891 circuit
->csnp_interval
[1] = yang_dnode_get_uint16(dnode
, NULL
);
1897 * XPath: /frr-interface:lib/interface/frr-isisd:isis/psnp-interval/level-1
1900 lib_interface_isis_psnp_interval_level_1_modify(enum nb_event event
,
1901 const struct lyd_node
*dnode
,
1902 union nb_resource
*resource
)
1904 struct isis_circuit
*circuit
;
1906 if (event
!= NB_EV_APPLY
)
1909 circuit
= yang_dnode_get_entry(dnode
, true);
1910 circuit
->psnp_interval
[0] = yang_dnode_get_uint16(dnode
, NULL
);
1916 * XPath: /frr-interface:lib/interface/frr-isisd:isis/psnp-interval/level-2
1919 lib_interface_isis_psnp_interval_level_2_modify(enum nb_event event
,
1920 const struct lyd_node
*dnode
,
1921 union nb_resource
*resource
)
1923 struct isis_circuit
*circuit
;
1925 if (event
!= NB_EV_APPLY
)
1928 circuit
= yang_dnode_get_entry(dnode
, true);
1929 circuit
->psnp_interval
[1] = yang_dnode_get_uint16(dnode
, NULL
);
1935 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/padding
1937 static int lib_interface_isis_hello_padding_modify(enum nb_event event
,
1938 const struct lyd_node
*dnode
,
1939 union nb_resource
*resource
)
1941 struct isis_circuit
*circuit
;
1943 if (event
!= NB_EV_APPLY
)
1946 circuit
= yang_dnode_get_entry(dnode
, true);
1947 circuit
->pad_hellos
= yang_dnode_get_bool(dnode
, NULL
);
1953 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/interval/level-1
1956 lib_interface_isis_hello_interval_level_1_modify(enum nb_event event
,
1957 const struct lyd_node
*dnode
,
1958 union nb_resource
*resource
)
1960 struct isis_circuit
*circuit
;
1963 if (event
!= NB_EV_APPLY
)
1966 circuit
= yang_dnode_get_entry(dnode
, true);
1967 interval
= yang_dnode_get_uint32(dnode
, NULL
);
1968 circuit
->hello_interval
[0] = interval
;
1974 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/interval/level-2
1977 lib_interface_isis_hello_interval_level_2_modify(enum nb_event event
,
1978 const struct lyd_node
*dnode
,
1979 union nb_resource
*resource
)
1981 struct isis_circuit
*circuit
;
1984 if (event
!= NB_EV_APPLY
)
1987 circuit
= yang_dnode_get_entry(dnode
, true);
1988 interval
= yang_dnode_get_uint32(dnode
, NULL
);
1989 circuit
->hello_interval
[1] = interval
;
1995 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/multiplier/level-1
1998 lib_interface_isis_hello_multiplier_level_1_modify(enum nb_event event
,
1999 const struct lyd_node
*dnode
,
2000 union nb_resource
*resource
)
2002 struct isis_circuit
*circuit
;
2005 if (event
!= NB_EV_APPLY
)
2008 circuit
= yang_dnode_get_entry(dnode
, true);
2009 multi
= yang_dnode_get_uint16(dnode
, NULL
);
2010 circuit
->hello_multiplier
[0] = multi
;
2016 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/multiplier/level-2
2019 lib_interface_isis_hello_multiplier_level_2_modify(enum nb_event event
,
2020 const struct lyd_node
*dnode
,
2021 union nb_resource
*resource
)
2023 struct isis_circuit
*circuit
;
2026 if (event
!= NB_EV_APPLY
)
2029 circuit
= yang_dnode_get_entry(dnode
, true);
2030 multi
= yang_dnode_get_uint16(dnode
, NULL
);
2031 circuit
->hello_multiplier
[1] = multi
;
2037 * XPath: /frr-interface:lib/interface/frr-isisd:isis/metric/level-1
2040 lib_interface_isis_metric_level_1_modify(enum nb_event event
,
2041 const struct lyd_node
*dnode
,
2042 union nb_resource
*resource
)
2044 struct isis_circuit
*circuit
;
2047 if (event
!= NB_EV_APPLY
)
2050 circuit
= yang_dnode_get_entry(dnode
, true);
2051 met
= yang_dnode_get_uint32(dnode
, NULL
);
2052 isis_circuit_metric_set(circuit
, IS_LEVEL_1
, met
);
2058 * XPath: /frr-interface:lib/interface/frr-isisd:isis/metric/level-2
2061 lib_interface_isis_metric_level_2_modify(enum nb_event event
,
2062 const struct lyd_node
*dnode
,
2063 union nb_resource
*resource
)
2065 struct isis_circuit
*circuit
;
2068 if (event
!= NB_EV_APPLY
)
2071 circuit
= yang_dnode_get_entry(dnode
, true);
2072 met
= yang_dnode_get_uint32(dnode
, NULL
);
2073 isis_circuit_metric_set(circuit
, IS_LEVEL_2
, met
);
2079 * XPath: /frr-interface:lib/interface/frr-isisd:isis/priority/level-1
2082 lib_interface_isis_priority_level_1_modify(enum nb_event event
,
2083 const struct lyd_node
*dnode
,
2084 union nb_resource
*resource
)
2086 struct isis_circuit
*circuit
;
2088 if (event
!= NB_EV_APPLY
)
2091 circuit
= yang_dnode_get_entry(dnode
, true);
2092 circuit
->priority
[0] = yang_dnode_get_uint8(dnode
, NULL
);
2098 * XPath: /frr-interface:lib/interface/frr-isisd:isis/priority/level-2
2101 lib_interface_isis_priority_level_2_modify(enum nb_event event
,
2102 const struct lyd_node
*dnode
,
2103 union nb_resource
*resource
)
2105 struct isis_circuit
*circuit
;
2107 if (event
!= NB_EV_APPLY
)
2110 circuit
= yang_dnode_get_entry(dnode
, true);
2111 circuit
->priority
[1] = yang_dnode_get_uint8(dnode
, NULL
);
2117 * XPath: /frr-interface:lib/interface/frr-isisd:isis/network-type
2119 static int lib_interface_isis_network_type_modify(enum nb_event event
,
2120 const struct lyd_node
*dnode
,
2121 union nb_resource
*resource
)
2123 struct isis_circuit
*circuit
;
2124 int net_type
= yang_dnode_get_enum(dnode
, NULL
);
2127 case NB_EV_VALIDATE
:
2128 circuit
= yang_dnode_get_entry(dnode
, false);
2131 if (circuit
->circ_type
== CIRCUIT_T_LOOPBACK
2132 || circuit
->circ_type
== CIRCUIT_T_UNKNOWN
) {
2134 EC_LIB_NB_CB_CONFIG_VALIDATE
,
2135 "Cannot change network type on unknown or loopback interface");
2136 return NB_ERR_VALIDATION
;
2138 if (net_type
== CIRCUIT_T_BROADCAST
2139 && circuit
->state
== C_STATE_UP
2140 && !if_is_broadcast(circuit
->interface
)) {
2142 EC_LIB_NB_CB_CONFIG_VALIDATE
,
2143 "Cannot configure non-broadcast interface for broadcast operation");
2144 return NB_ERR_VALIDATION
;
2151 circuit
= yang_dnode_get_entry(dnode
, true);
2152 isis_circuit_circ_type_set(circuit
, net_type
);
2159 static int lib_interface_isis_network_type_delete(enum nb_event event
,
2160 const struct lyd_node
*dnode
)
2162 /* FIXME: This cannot be done in FRR. Not sure what the intended
2169 * XPath: /frr-interface:lib/interface/frr-isisd:isis/passive
2171 static int lib_interface_isis_passive_create(enum nb_event event
,
2172 const struct lyd_node
*dnode
,
2173 union nb_resource
*resource
)
2175 struct isis_circuit
*circuit
;
2176 struct isis_area
*area
;
2178 if (event
!= NB_EV_APPLY
)
2181 circuit
= yang_dnode_get_entry(dnode
, true);
2182 if (circuit
->state
!= C_STATE_UP
) {
2183 circuit
->is_passive
= true;
2185 area
= circuit
->area
;
2186 isis_csm_state_change(ISIS_DISABLE
, circuit
, area
);
2187 circuit
->is_passive
= true;
2188 isis_csm_state_change(ISIS_ENABLE
, circuit
, area
);
2194 static int lib_interface_isis_passive_delete(enum nb_event event
,
2195 const struct lyd_node
*dnode
)
2197 struct isis_circuit
*circuit
;
2198 struct isis_area
*area
;
2199 struct interface
*ifp
;
2202 case NB_EV_VALIDATE
:
2203 circuit
= yang_dnode_get_entry(dnode
, false);
2206 ifp
= circuit
->interface
;
2209 if (if_is_loopback(ifp
)) {
2210 flog_warn(EC_LIB_NB_CB_CONFIG_VALIDATE
,
2211 "Loopback is always passive");
2212 return NB_ERR_VALIDATION
;
2219 circuit
= yang_dnode_get_entry(dnode
, true);
2220 if (circuit
->state
!= C_STATE_UP
) {
2221 circuit
->is_passive
= false;
2223 area
= circuit
->area
;
2224 isis_csm_state_change(ISIS_DISABLE
, circuit
, area
);
2225 circuit
->is_passive
= false;
2226 isis_csm_state_change(ISIS_ENABLE
, circuit
, area
);
2235 * XPath: /frr-interface:lib/interface/frr-isisd:isis/password
2237 static int lib_interface_isis_password_create(enum nb_event event
,
2238 const struct lyd_node
*dnode
,
2239 union nb_resource
*resource
)
2244 static int lib_interface_isis_password_delete(enum nb_event event
,
2245 const struct lyd_node
*dnode
)
2247 struct isis_circuit
*circuit
;
2249 if (event
!= NB_EV_APPLY
)
2252 circuit
= yang_dnode_get_entry(dnode
, true);
2253 isis_circuit_passwd_unset(circuit
);
2259 * XPath: /frr-interface:lib/interface/frr-isisd:isis/password/password
2262 lib_interface_isis_password_password_modify(enum nb_event event
,
2263 const struct lyd_node
*dnode
,
2264 union nb_resource
*resource
)
2266 struct isis_circuit
*circuit
;
2267 const char *password
;
2269 if (event
!= NB_EV_APPLY
)
2272 password
= yang_dnode_get_string(dnode
, NULL
);
2273 circuit
= yang_dnode_get_entry(dnode
, true);
2274 circuit
->passwd
.len
= strlen(password
);
2275 strncpy((char *)circuit
->passwd
.passwd
, password
, 255);
2281 * XPath: /frr-interface:lib/interface/frr-isisd:isis/password/password-type
2284 lib_interface_isis_password_password_type_modify(enum nb_event event
,
2285 const struct lyd_node
*dnode
,
2286 union nb_resource
*resource
)
2288 struct isis_circuit
*circuit
;
2291 if (event
!= NB_EV_APPLY
)
2294 pass_type
= yang_dnode_get_enum(dnode
, NULL
);
2295 circuit
= yang_dnode_get_entry(dnode
, true);
2296 circuit
->passwd
.type
= pass_type
;
2303 * /frr-interface:lib/interface/frr-isisd:isis/disable-three-way-handshake
2305 static int lib_interface_isis_disable_three_way_handshake_create(
2306 enum nb_event event
, const struct lyd_node
*dnode
,
2307 union nb_resource
*resource
)
2309 struct isis_circuit
*circuit
;
2311 if (event
!= NB_EV_APPLY
)
2314 circuit
= yang_dnode_get_entry(dnode
, true);
2315 circuit
->disable_threeway_adj
= true;
2320 static int lib_interface_isis_disable_three_way_handshake_delete(
2321 enum nb_event event
, const struct lyd_node
*dnode
)
2323 struct isis_circuit
*circuit
;
2325 if (event
!= NB_EV_APPLY
)
2328 circuit
= yang_dnode_get_entry(dnode
, true);
2329 circuit
->disable_threeway_adj
= false;
2336 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-unicast
2338 static int lib_interface_isis_multi_topology_common(
2339 enum nb_event event
, const struct lyd_node
*dnode
, uint16_t mtid
)
2341 struct isis_circuit
*circuit
;
2345 case NB_EV_VALIDATE
:
2346 circuit
= yang_dnode_get_entry(dnode
, false);
2347 if (circuit
&& circuit
->area
&& circuit
->area
->oldmetric
) {
2349 EC_LIB_NB_CB_CONFIG_VALIDATE
,
2350 "Multi topology IS-IS can only be used with wide metrics");
2351 return NB_ERR_VALIDATION
;
2358 circuit
= yang_dnode_get_entry(dnode
, true);
2359 value
= yang_dnode_get_bool(dnode
, NULL
);
2360 isis_circuit_mt_enabled_set(circuit
, mtid
, value
);
2367 static int lib_interface_isis_multi_topology_ipv4_unicast_modify(
2368 enum nb_event event
, const struct lyd_node
*dnode
,
2369 union nb_resource
*resource
)
2371 return lib_interface_isis_multi_topology_common(event
, dnode
,
2372 ISIS_MT_IPV4_UNICAST
);
2377 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-multicast
2379 static int lib_interface_isis_multi_topology_ipv4_multicast_modify(
2380 enum nb_event event
, const struct lyd_node
*dnode
,
2381 union nb_resource
*resource
)
2383 return lib_interface_isis_multi_topology_common(event
, dnode
,
2384 ISIS_MT_IPV4_MULTICAST
);
2389 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-management
2391 static int lib_interface_isis_multi_topology_ipv4_management_modify(
2392 enum nb_event event
, const struct lyd_node
*dnode
,
2393 union nb_resource
*resource
)
2395 return lib_interface_isis_multi_topology_common(event
, dnode
,
2401 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-unicast
2403 static int lib_interface_isis_multi_topology_ipv6_unicast_modify(
2404 enum nb_event event
, const struct lyd_node
*dnode
,
2405 union nb_resource
*resource
)
2407 return lib_interface_isis_multi_topology_common(event
, dnode
,
2408 ISIS_MT_IPV6_UNICAST
);
2413 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-multicast
2415 static int lib_interface_isis_multi_topology_ipv6_multicast_modify(
2416 enum nb_event event
, const struct lyd_node
*dnode
,
2417 union nb_resource
*resource
)
2419 return lib_interface_isis_multi_topology_common(event
, dnode
,
2420 ISIS_MT_IPV6_MULTICAST
);
2425 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-management
2427 static int lib_interface_isis_multi_topology_ipv6_management_modify(
2428 enum nb_event event
, const struct lyd_node
*dnode
,
2429 union nb_resource
*resource
)
2431 return lib_interface_isis_multi_topology_common(event
, dnode
,
2436 * XPath: /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-dstsrc
2438 static int lib_interface_isis_multi_topology_ipv6_dstsrc_modify(
2439 enum nb_event event
, const struct lyd_node
*dnode
,
2440 union nb_resource
*resource
)
2442 return lib_interface_isis_multi_topology_common(event
, dnode
,
2443 ISIS_MT_IPV6_DSTSRC
);
2449 static void notif_prep_instance_hdr(const char *xpath
,
2450 const struct isis_area
*area
,
2451 const char *routing_instance
,
2454 char xpath_arg
[XPATH_MAXLEN
];
2455 struct yang_data
*data
;
2457 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/routing-instance", xpath
);
2458 data
= yang_data_new_string(xpath_arg
, routing_instance
);
2459 listnode_add(args
, data
);
2460 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/routing-protocol-name",
2462 data
= yang_data_new_string(xpath_arg
, area
->area_tag
);
2463 listnode_add(args
, data
);
2464 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/isis-level", xpath
);
2465 data
= yang_data_new_enum(xpath_arg
, area
->is_type
);
2466 listnode_add(args
, data
);
2469 static void notif_prepr_iface_hdr(const char *xpath
,
2470 const struct isis_circuit
*circuit
,
2473 char xpath_arg
[XPATH_MAXLEN
];
2474 struct yang_data
*data
;
2476 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/interface-name", xpath
);
2477 data
= yang_data_new_string(xpath_arg
, circuit
->interface
->name
);
2478 listnode_add(args
, data
);
2479 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/interface-level", xpath
);
2480 data
= yang_data_new_enum(xpath_arg
, circuit
->is_type
);
2481 listnode_add(args
, data
);
2482 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/extended-circuit-id", xpath
);
2483 /* we do not seem to have the extended version of the circuit_id */
2484 data
= yang_data_new_uint32(xpath_arg
, (uint32_t)circuit
->circuit_id
);
2485 listnode_add(args
, data
);
2490 * /frr-isisd:database-overload
2492 void isis_notif_db_overload(const struct isis_area
*area
, bool overload
)
2494 const char *xpath
= "/frr-isisd:database-overload";
2495 struct list
*arguments
= yang_data_list_new();
2496 char xpath_arg
[XPATH_MAXLEN
];
2497 struct yang_data
*data
;
2499 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2500 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/overload", xpath
);
2501 data
= yang_data_new_enum(xpath_arg
, !!overload
);
2502 listnode_add(arguments
, data
);
2504 nb_notification_send(xpath
, arguments
);
2509 * /frr-isisd:lsp-too-large
2511 void isis_notif_lsp_too_large(const struct isis_circuit
*circuit
,
2512 uint32_t pdu_size
, const char *lsp_id
)
2514 const char *xpath
= "/frr-isisd:lsp-too-large";
2515 struct list
*arguments
= yang_data_list_new();
2516 char xpath_arg
[XPATH_MAXLEN
];
2517 struct yang_data
*data
;
2518 struct isis_area
*area
= circuit
->area
;
2520 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2521 notif_prepr_iface_hdr(xpath
, circuit
, arguments
);
2522 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/pdu-size", xpath
);
2523 data
= yang_data_new_uint32(xpath_arg
, pdu_size
);
2524 listnode_add(arguments
, data
);
2525 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/lsp-id", xpath
);
2526 data
= yang_data_new_string(xpath_arg
, lsp_id
);
2527 listnode_add(arguments
, data
);
2529 nb_notification_send(xpath
, arguments
);
2534 * /frr-isisd:if-state-change
2536 void isis_notif_if_state_change(const struct isis_circuit
*circuit
, bool down
)
2538 const char *xpath
= "/frr-isisd:if-state-change";
2539 struct list
*arguments
= yang_data_list_new();
2540 char xpath_arg
[XPATH_MAXLEN
];
2541 struct yang_data
*data
;
2542 struct isis_area
*area
= circuit
->area
;
2544 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2545 notif_prepr_iface_hdr(xpath
, circuit
, arguments
);
2546 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/state", xpath
);
2547 data
= yang_data_new_enum(xpath_arg
, !!down
);
2548 listnode_add(arguments
, data
);
2550 nb_notification_send(xpath
, arguments
);
2555 * /frr-isisd:corrupted-lsp-detected
2557 void isis_notif_corrupted_lsp(const struct isis_area
*area
, const char *lsp_id
)
2559 const char *xpath
= "/frr-isisd:corrupted-lsp-detected";
2560 struct list
*arguments
= yang_data_list_new();
2561 char xpath_arg
[XPATH_MAXLEN
];
2562 struct yang_data
*data
;
2564 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2565 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/lsp-id", xpath
);
2566 data
= yang_data_new_string(xpath_arg
, lsp_id
);
2567 listnode_add(arguments
, data
);
2569 nb_notification_send(xpath
, arguments
);
2574 * /frr-isisd:attempt-to-exceed-max-sequence
2576 void isis_notif_lsp_exceed_max(const struct isis_area
*area
, const char *lsp_id
)
2578 const char *xpath
= "/frr-isisd:attempt-to-exceed-max-sequence";
2579 struct list
*arguments
= yang_data_list_new();
2580 char xpath_arg
[XPATH_MAXLEN
];
2581 struct yang_data
*data
;
2583 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2584 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/lsp-id", xpath
);
2585 data
= yang_data_new_string(xpath_arg
, lsp_id
);
2586 listnode_add(arguments
, data
);
2588 nb_notification_send(xpath
, arguments
);
2593 * /frr-isisd:max-area-addresses-mismatch
2595 void isis_notif_max_area_addr_mismatch(const struct isis_circuit
*circuit
,
2596 uint8_t max_area_addrs
,
2597 const char *raw_pdu
)
2599 const char *xpath
= "/frr-isisd:max-area-addresses-mismatch";
2600 struct list
*arguments
= yang_data_list_new();
2601 char xpath_arg
[XPATH_MAXLEN
];
2602 struct yang_data
*data
;
2603 struct isis_area
*area
= circuit
->area
;
2605 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
2606 notif_prepr_iface_hdr(xpath
, circuit
, arguments
);
2607 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/max-area-addresses", xpath
);
2608 data
= yang_data_new_uint8(xpath_arg
, max_area_addrs
);
2609 listnode_add(arguments
, data
);
2610 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/raw-pdu", xpath
);
2611 data
= yang_data_new(xpath_arg
, raw_pdu
);
2612 listnode_add(arguments
, data
);
2614 nb_notification_send(xpath
, arguments
);
2617 /* clang-format off */
2618 const struct frr_yang_module_info frr_isisd_info
= {
2619 .name
= "frr-isisd",
2622 .xpath
= "/frr-isisd:isis/instance",
2623 .cbs
.create
= isis_instance_create
,
2624 .cbs
.delete = isis_instance_delete
,
2625 .cbs
.cli_show
= cli_show_router_isis
,
2626 .priority
= NB_DFLT_PRIORITY
- 1,
2629 .xpath
= "/frr-isisd:isis/instance/is-type",
2630 .cbs
.modify
= isis_instance_is_type_modify
,
2631 .cbs
.cli_show
= cli_show_isis_is_type
,
2634 .xpath
= "/frr-isisd:isis/instance/area-address",
2635 .cbs
.create
= isis_instance_area_address_create
,
2636 .cbs
.delete = isis_instance_area_address_delete
,
2637 .cbs
.cli_show
= cli_show_isis_area_address
,
2640 .xpath
= "/frr-isisd:isis/instance/dynamic-hostname",
2641 .cbs
.modify
= isis_instance_dynamic_hostname_modify
,
2642 .cbs
.cli_show
= cli_show_isis_dynamic_hostname
,
2645 .xpath
= "/frr-isisd:isis/instance/attached",
2646 .cbs
.create
= isis_instance_attached_create
,
2647 .cbs
.delete = isis_instance_attached_delete
,
2648 .cbs
.cli_show
= cli_show_isis_attached
,
2651 .xpath
= "/frr-isisd:isis/instance/overload",
2652 .cbs
.create
= isis_instance_overload_create
,
2653 .cbs
.delete = isis_instance_overload_delete
,
2654 .cbs
.cli_show
= cli_show_isis_overload
,
2657 .xpath
= "/frr-isisd:isis/instance/metric-style",
2658 .cbs
.modify
= isis_instance_metric_style_modify
,
2659 .cbs
.cli_show
= cli_show_isis_metric_style
,
2662 .xpath
= "/frr-isisd:isis/instance/purge-originator",
2663 .cbs
.create
= isis_instance_purge_originator_create
,
2664 .cbs
.delete = isis_instance_purge_originator_delete
,
2665 .cbs
.cli_show
= cli_show_isis_purge_origin
,
2668 .xpath
= "/frr-isisd:isis/instance/lsp/mtu",
2669 .cbs
.modify
= isis_instance_lsp_mtu_modify
,
2670 .cbs
.cli_show
= cli_show_isis_lsp_mtu
,
2673 .xpath
= "/frr-isisd:isis/instance/lsp/refresh-interval",
2674 .cbs
.cli_show
= cli_show_isis_lsp_ref_interval
,
2677 .xpath
= "/frr-isisd:isis/instance/lsp/refresh-interval/level-1",
2678 .cbs
.modify
= isis_instance_lsp_refresh_interval_level_1_modify
,
2681 .xpath
= "/frr-isisd:isis/instance/lsp/refresh-interval/level-2",
2682 .cbs
.modify
= isis_instance_lsp_refresh_interval_level_2_modify
,
2685 .xpath
= "/frr-isisd:isis/instance/lsp/maximum-lifetime",
2686 .cbs
.cli_show
= cli_show_isis_lsp_max_lifetime
,
2689 .xpath
= "/frr-isisd:isis/instance/lsp/maximum-lifetime/level-1",
2690 .cbs
.modify
= isis_instance_lsp_maximum_lifetime_level_1_modify
,
2693 .xpath
= "/frr-isisd:isis/instance/lsp/maximum-lifetime/level-2",
2694 .cbs
.modify
= isis_instance_lsp_maximum_lifetime_level_2_modify
,
2697 .xpath
= "/frr-isisd:isis/instance/lsp/generation-interval",
2698 .cbs
.cli_show
= cli_show_isis_lsp_gen_interval
,
2701 .xpath
= "/frr-isisd:isis/instance/lsp/generation-interval/level-1",
2702 .cbs
.modify
= isis_instance_lsp_generation_interval_level_1_modify
,
2705 .xpath
= "/frr-isisd:isis/instance/lsp/generation-interval/level-2",
2706 .cbs
.modify
= isis_instance_lsp_generation_interval_level_2_modify
,
2709 .xpath
= "/frr-isisd:isis/instance/spf/ietf-backoff-delay",
2710 .cbs
.create
= isis_instance_spf_ietf_backoff_delay_create
,
2711 .cbs
.delete = isis_instance_spf_ietf_backoff_delay_delete
,
2712 .cbs
.apply_finish
= ietf_backoff_delay_apply_finish
,
2713 .cbs
.cli_show
= cli_show_isis_spf_ietf_backoff
,
2716 .xpath
= "/frr-isisd:isis/instance/spf/ietf-backoff-delay/init-delay",
2717 .cbs
.modify
= isis_instance_spf_ietf_backoff_delay_init_delay_modify
,
2720 .xpath
= "/frr-isisd:isis/instance/spf/ietf-backoff-delay/short-delay",
2721 .cbs
.modify
= isis_instance_spf_ietf_backoff_delay_short_delay_modify
,
2724 .xpath
= "/frr-isisd:isis/instance/spf/ietf-backoff-delay/long-delay",
2725 .cbs
.modify
= isis_instance_spf_ietf_backoff_delay_long_delay_modify
,
2728 .xpath
= "/frr-isisd:isis/instance/spf/ietf-backoff-delay/hold-down",
2729 .cbs
.modify
= isis_instance_spf_ietf_backoff_delay_hold_down_modify
,
2732 .xpath
= "/frr-isisd:isis/instance/spf/ietf-backoff-delay/time-to-learn",
2733 .cbs
.modify
= isis_instance_spf_ietf_backoff_delay_time_to_learn_modify
,
2736 .xpath
= "/frr-isisd:isis/instance/spf/minimum-interval",
2737 .cbs
.cli_show
= cli_show_isis_spf_min_interval
,
2740 .xpath
= "/frr-isisd:isis/instance/spf/minimum-interval/level-1",
2741 .cbs
.modify
= isis_instance_spf_minimum_interval_level_1_modify
,
2744 .xpath
= "/frr-isisd:isis/instance/spf/minimum-interval/level-2",
2745 .cbs
.modify
= isis_instance_spf_minimum_interval_level_2_modify
,
2748 .xpath
= "/frr-isisd:isis/instance/area-password",
2749 .cbs
.create
= isis_instance_area_password_create
,
2750 .cbs
.delete = isis_instance_area_password_delete
,
2751 .cbs
.apply_finish
= area_password_apply_finish
,
2752 .cbs
.cli_show
= cli_show_isis_area_pwd
,
2755 .xpath
= "/frr-isisd:isis/instance/area-password/password",
2756 .cbs
.modify
= isis_instance_area_password_password_modify
,
2759 .xpath
= "/frr-isisd:isis/instance/area-password/password-type",
2760 .cbs
.modify
= isis_instance_area_password_password_type_modify
,
2763 .xpath
= "/frr-isisd:isis/instance/area-password/authenticate-snp",
2764 .cbs
.modify
= isis_instance_area_password_authenticate_snp_modify
,
2767 .xpath
= "/frr-isisd:isis/instance/domain-password",
2768 .cbs
.create
= isis_instance_domain_password_create
,
2769 .cbs
.delete = isis_instance_domain_password_delete
,
2770 .cbs
.apply_finish
= domain_password_apply_finish
,
2771 .cbs
.cli_show
= cli_show_isis_domain_pwd
,
2774 .xpath
= "/frr-isisd:isis/instance/domain-password/password",
2775 .cbs
.modify
= isis_instance_domain_password_password_modify
,
2778 .xpath
= "/frr-isisd:isis/instance/domain-password/password-type",
2779 .cbs
.modify
= isis_instance_domain_password_password_type_modify
,
2782 .xpath
= "/frr-isisd:isis/instance/domain-password/authenticate-snp",
2783 .cbs
.modify
= isis_instance_domain_password_authenticate_snp_modify
,
2786 .xpath
= "/frr-isisd:isis/instance/default-information-originate/ipv4",
2787 .cbs
.create
= isis_instance_default_information_originate_ipv4_create
,
2788 .cbs
.delete = isis_instance_default_information_originate_ipv4_delete
,
2789 .cbs
.apply_finish
= default_info_origin_ipv4_apply_finish
,
2790 .cbs
.cli_show
= cli_show_isis_def_origin_ipv4
,
2793 .xpath
= "/frr-isisd:isis/instance/default-information-originate/ipv4/always",
2794 .cbs
.create
= isis_instance_default_information_originate_ipv4_always_create
,
2795 .cbs
.delete = isis_instance_default_information_originate_ipv4_always_delete
,
2798 .xpath
= "/frr-isisd:isis/instance/default-information-originate/ipv4/route-map",
2799 .cbs
.modify
= isis_instance_default_information_originate_ipv4_route_map_modify
,
2800 .cbs
.delete = isis_instance_default_information_originate_ipv4_route_map_delete
,
2803 .xpath
= "/frr-isisd:isis/instance/default-information-originate/ipv4/metric",
2804 .cbs
.modify
= isis_instance_default_information_originate_ipv4_metric_modify
,
2805 .cbs
.delete = isis_instance_default_information_originate_ipv4_metric_delete
,
2808 .xpath
= "/frr-isisd:isis/instance/default-information-originate/ipv6",
2809 .cbs
.create
= isis_instance_default_information_originate_ipv6_create
,
2810 .cbs
.delete = isis_instance_default_information_originate_ipv6_delete
,
2811 .cbs
.apply_finish
= default_info_origin_ipv6_apply_finish
,
2812 .cbs
.cli_show
= cli_show_isis_def_origin_ipv6
,
2815 .xpath
= "/frr-isisd:isis/instance/default-information-originate/ipv6/always",
2816 .cbs
.create
= isis_instance_default_information_originate_ipv6_always_create
,
2817 .cbs
.delete = isis_instance_default_information_originate_ipv6_always_delete
,
2820 .xpath
= "/frr-isisd:isis/instance/default-information-originate/ipv6/route-map",
2821 .cbs
.modify
= isis_instance_default_information_originate_ipv6_route_map_modify
,
2822 .cbs
.delete = isis_instance_default_information_originate_ipv6_route_map_delete
,
2825 .xpath
= "/frr-isisd:isis/instance/default-information-originate/ipv6/metric",
2826 .cbs
.modify
= isis_instance_default_information_originate_ipv6_metric_modify
,
2827 .cbs
.delete = isis_instance_default_information_originate_ipv6_metric_delete
,
2830 .xpath
= "/frr-isisd:isis/instance/redistribute/ipv4",
2831 .cbs
.create
= isis_instance_redistribute_ipv4_create
,
2832 .cbs
.delete = isis_instance_redistribute_ipv4_delete
,
2833 .cbs
.apply_finish
= redistribute_ipv4_apply_finish
,
2834 .cbs
.cli_show
= cli_show_isis_redistribute_ipv4
,
2837 .xpath
= "/frr-isisd:isis/instance/redistribute/ipv4/route-map",
2838 .cbs
.modify
= isis_instance_redistribute_ipv4_route_map_modify
,
2839 .cbs
.delete = isis_instance_redistribute_ipv4_route_map_delete
,
2842 .xpath
= "/frr-isisd:isis/instance/redistribute/ipv4/metric",
2843 .cbs
.modify
= isis_instance_redistribute_ipv4_metric_modify
,
2844 .cbs
.delete = isis_instance_redistribute_ipv4_metric_delete
,
2847 .xpath
= "/frr-isisd:isis/instance/redistribute/ipv6",
2848 .cbs
.create
= isis_instance_redistribute_ipv6_create
,
2849 .cbs
.delete = isis_instance_redistribute_ipv6_delete
,
2850 .cbs
.apply_finish
= redistribute_ipv6_apply_finish
,
2851 .cbs
.cli_show
= cli_show_isis_redistribute_ipv6
,
2854 .xpath
= "/frr-isisd:isis/instance/redistribute/ipv6/route-map",
2855 .cbs
.modify
= isis_instance_redistribute_ipv6_route_map_modify
,
2856 .cbs
.delete = isis_instance_redistribute_ipv6_route_map_delete
,
2859 .xpath
= "/frr-isisd:isis/instance/redistribute/ipv6/metric",
2860 .cbs
.modify
= isis_instance_redistribute_ipv6_metric_modify
,
2861 .cbs
.delete = isis_instance_redistribute_ipv6_metric_delete
,
2864 .xpath
= "/frr-isisd:isis/instance/multi-topology/ipv4-multicast",
2865 .cbs
.create
= isis_instance_multi_topology_ipv4_multicast_create
,
2866 .cbs
.delete = isis_instance_multi_topology_ipv4_multicast_delete
,
2867 .cbs
.cli_show
= cli_show_isis_mt_ipv4_multicast
,
2870 .xpath
= "/frr-isisd:isis/instance/multi-topology/ipv4-multicast/overload",
2871 .cbs
.create
= isis_instance_multi_topology_ipv4_multicast_overload_create
,
2872 .cbs
.delete = isis_instance_multi_topology_ipv4_multicast_overload_delete
,
2875 .xpath
= "/frr-isisd:isis/instance/multi-topology/ipv4-management",
2876 .cbs
.create
= isis_instance_multi_topology_ipv4_management_create
,
2877 .cbs
.delete = isis_instance_multi_topology_ipv4_management_delete
,
2878 .cbs
.cli_show
= cli_show_isis_mt_ipv4_mgmt
,
2881 .xpath
= "/frr-isisd:isis/instance/multi-topology/ipv4-management/overload",
2882 .cbs
.create
= isis_instance_multi_topology_ipv4_management_overload_create
,
2883 .cbs
.delete = isis_instance_multi_topology_ipv4_management_overload_delete
,
2886 .xpath
= "/frr-isisd:isis/instance/multi-topology/ipv6-unicast",
2887 .cbs
.create
= isis_instance_multi_topology_ipv6_unicast_create
,
2888 .cbs
.delete = isis_instance_multi_topology_ipv6_unicast_delete
,
2889 .cbs
.cli_show
= cli_show_isis_mt_ipv6_unicast
,
2892 .xpath
= "/frr-isisd:isis/instance/multi-topology/ipv6-unicast/overload",
2893 .cbs
.create
= isis_instance_multi_topology_ipv6_unicast_overload_create
,
2894 .cbs
.delete = isis_instance_multi_topology_ipv6_unicast_overload_delete
,
2897 .xpath
= "/frr-isisd:isis/instance/multi-topology/ipv6-multicast",
2898 .cbs
.create
= isis_instance_multi_topology_ipv6_multicast_create
,
2899 .cbs
.delete = isis_instance_multi_topology_ipv6_multicast_delete
,
2900 .cbs
.cli_show
= cli_show_isis_mt_ipv6_multicast
,
2903 .xpath
= "/frr-isisd:isis/instance/multi-topology/ipv6-multicast/overload",
2904 .cbs
.create
= isis_instance_multi_topology_ipv6_multicast_overload_create
,
2905 .cbs
.delete = isis_instance_multi_topology_ipv6_multicast_overload_delete
,
2908 .xpath
= "/frr-isisd:isis/instance/multi-topology/ipv6-management",
2909 .cbs
.create
= isis_instance_multi_topology_ipv6_management_create
,
2910 .cbs
.delete = isis_instance_multi_topology_ipv6_management_delete
,
2911 .cbs
.cli_show
= cli_show_isis_mt_ipv6_mgmt
,
2914 .xpath
= "/frr-isisd:isis/instance/multi-topology/ipv6-management/overload",
2915 .cbs
.create
= isis_instance_multi_topology_ipv6_management_overload_create
,
2916 .cbs
.delete = isis_instance_multi_topology_ipv6_management_overload_delete
,
2919 .xpath
= "/frr-isisd:isis/instance/multi-topology/ipv6-dstsrc",
2920 .cbs
.create
= isis_instance_multi_topology_ipv6_dstsrc_create
,
2921 .cbs
.delete = isis_instance_multi_topology_ipv6_dstsrc_delete
,
2922 .cbs
.cli_show
= cli_show_isis_mt_ipv6_dstsrc
,
2925 .xpath
= "/frr-isisd:isis/instance/multi-topology/ipv6-dstsrc/overload",
2926 .cbs
.create
= isis_instance_multi_topology_ipv6_dstsrc_overload_create
,
2927 .cbs
.delete = isis_instance_multi_topology_ipv6_dstsrc_overload_delete
,
2930 .xpath
= "/frr-isisd:isis/instance/log-adjacency-changes",
2931 .cbs
.create
= isis_instance_log_adjacency_changes_create
,
2932 .cbs
.delete = isis_instance_log_adjacency_changes_delete
,
2933 .cbs
.cli_show
= cli_show_isis_log_adjacency
,
2936 .xpath
= "/frr-isisd:isis/mpls-te",
2937 .cbs
.create
= isis_mpls_te_create
,
2938 .cbs
.delete = isis_mpls_te_delete
,
2939 .cbs
.cli_show
= cli_show_isis_mpls_te
,
2942 .xpath
= "/frr-isisd:isis/mpls-te/router-address",
2943 .cbs
.modify
= isis_mpls_te_router_address_modify
,
2944 .cbs
.delete = isis_mpls_te_router_address_delete
,
2945 .cbs
.cli_show
= cli_show_isis_mpls_te_router_addr
,
2948 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis",
2949 .cbs
.create
= lib_interface_isis_create
,
2950 .cbs
.delete = lib_interface_isis_delete
,
2953 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/area-tag",
2954 .cbs
.modify
= lib_interface_isis_area_tag_modify
,
2957 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/circuit-type",
2958 .cbs
.modify
= lib_interface_isis_circuit_type_modify
,
2959 .cbs
.cli_show
= cli_show_ip_isis_circ_type
,
2962 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/ipv4-routing",
2963 .cbs
.create
= lib_interface_isis_ipv4_routing_create
,
2964 .cbs
.delete = lib_interface_isis_ipv4_routing_delete
,
2965 .cbs
.cli_show
= cli_show_ip_isis_ipv4
,
2968 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/ipv6-routing",
2969 .cbs
.create
= lib_interface_isis_ipv6_routing_create
,
2970 .cbs
.delete = lib_interface_isis_ipv6_routing_delete
,
2971 .cbs
.cli_show
= cli_show_ip_isis_ipv6
,
2974 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/csnp-interval",
2975 .cbs
.cli_show
= cli_show_ip_isis_csnp_interval
,
2978 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/csnp-interval/level-1",
2979 .cbs
.modify
= lib_interface_isis_csnp_interval_level_1_modify
,
2982 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/csnp-interval/level-2",
2983 .cbs
.modify
= lib_interface_isis_csnp_interval_level_2_modify
,
2986 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/psnp-interval",
2987 .cbs
.cli_show
= cli_show_ip_isis_psnp_interval
,
2990 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/psnp-interval/level-1",
2991 .cbs
.modify
= lib_interface_isis_psnp_interval_level_1_modify
,
2994 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/psnp-interval/level-2",
2995 .cbs
.modify
= lib_interface_isis_psnp_interval_level_2_modify
,
2998 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/hello/padding",
2999 .cbs
.modify
= lib_interface_isis_hello_padding_modify
,
3000 .cbs
.cli_show
= cli_show_ip_isis_hello_padding
,
3003 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/hello/interval",
3004 .cbs
.cli_show
= cli_show_ip_isis_hello_interval
,
3007 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/hello/interval/level-1",
3008 .cbs
.modify
= lib_interface_isis_hello_interval_level_1_modify
,
3011 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/hello/interval/level-2",
3012 .cbs
.modify
= lib_interface_isis_hello_interval_level_2_modify
,
3015 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/hello/multiplier",
3016 .cbs
.cli_show
= cli_show_ip_isis_hello_multi
,
3019 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/hello/multiplier/level-1",
3020 .cbs
.modify
= lib_interface_isis_hello_multiplier_level_1_modify
,
3023 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/hello/multiplier/level-2",
3024 .cbs
.modify
= lib_interface_isis_hello_multiplier_level_2_modify
,
3027 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/metric",
3028 .cbs
.cli_show
= cli_show_ip_isis_metric
,
3031 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/metric/level-1",
3032 .cbs
.modify
= lib_interface_isis_metric_level_1_modify
,
3035 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/metric/level-2",
3036 .cbs
.modify
= lib_interface_isis_metric_level_2_modify
,
3039 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/priority",
3040 .cbs
.cli_show
= cli_show_ip_isis_priority
,
3043 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/priority/level-1",
3044 .cbs
.modify
= lib_interface_isis_priority_level_1_modify
,
3047 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/priority/level-2",
3048 .cbs
.modify
= lib_interface_isis_priority_level_2_modify
,
3051 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/network-type",
3052 .cbs
.modify
= lib_interface_isis_network_type_modify
,
3053 .cbs
.delete = lib_interface_isis_network_type_delete
,
3054 .cbs
.cli_show
= cli_show_ip_isis_network_type
,
3057 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/passive",
3058 .cbs
.create
= lib_interface_isis_passive_create
,
3059 .cbs
.delete = lib_interface_isis_passive_delete
,
3060 .cbs
.cli_show
= cli_show_ip_isis_passive
,
3063 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/password",
3064 .cbs
.create
= lib_interface_isis_password_create
,
3065 .cbs
.delete = lib_interface_isis_password_delete
,
3066 .cbs
.cli_show
= cli_show_ip_isis_password
,
3069 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/password/password",
3070 .cbs
.modify
= lib_interface_isis_password_password_modify
,
3073 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/password/password-type",
3074 .cbs
.modify
= lib_interface_isis_password_password_type_modify
,
3077 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/disable-three-way-handshake",
3078 .cbs
.create
= lib_interface_isis_disable_three_way_handshake_create
,
3079 .cbs
.delete = lib_interface_isis_disable_three_way_handshake_delete
,
3080 .cbs
.cli_show
= cli_show_ip_isis_threeway_shake
,
3083 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-unicast",
3084 .cbs
.modify
= lib_interface_isis_multi_topology_ipv4_unicast_modify
,
3085 .cbs
.cli_show
= cli_show_ip_isis_mt_ipv4_unicast
,
3088 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-multicast",
3089 .cbs
.modify
= lib_interface_isis_multi_topology_ipv4_multicast_modify
,
3090 .cbs
.cli_show
= cli_show_ip_isis_mt_ipv4_multicast
,
3093 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-management",
3094 .cbs
.modify
= lib_interface_isis_multi_topology_ipv4_management_modify
,
3095 .cbs
.cli_show
= cli_show_ip_isis_mt_ipv4_mgmt
,
3098 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-unicast",
3099 .cbs
.modify
= lib_interface_isis_multi_topology_ipv6_unicast_modify
,
3100 .cbs
.cli_show
= cli_show_ip_isis_mt_ipv6_unicast
,
3103 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-multicast",
3104 .cbs
.modify
= lib_interface_isis_multi_topology_ipv6_multicast_modify
,
3105 .cbs
.cli_show
= cli_show_ip_isis_mt_ipv6_multicast
,
3108 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-management",
3109 .cbs
.modify
= lib_interface_isis_multi_topology_ipv6_management_modify
,
3110 .cbs
.cli_show
= cli_show_ip_isis_mt_ipv6_mgmt
,
3113 .xpath
= "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-dstsrc",
3114 .cbs
.modify
= lib_interface_isis_multi_topology_ipv6_dstsrc_modify
,
3115 .cbs
.cli_show
= cli_show_ip_isis_mt_ipv6_dstsrc
,