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
25 #include "northbound.h"
29 #include "spf_backoff.h"
30 #include "lib_errors.h"
33 #include "isisd/isisd.h"
34 #include "isisd/isis_nb.h"
35 #include "isisd/isis_common.h"
36 #include "isisd/isis_bfd.h"
37 #include "isisd/isis_circuit.h"
38 #include "isisd/isis_lsp.h"
39 #include "isisd/isis_dynhn.h"
40 #include "isisd/isis_misc.h"
41 #include "isisd/isis_csm.h"
42 #include "isisd/isis_adjacency.h"
43 #include "isisd/isis_spf.h"
44 #include "isisd/isis_te.h"
45 #include "isisd/isis_memory.h"
46 #include "isisd/isis_mt.h"
47 #include "isisd/isis_redist.h"
50 * XPath: /frr-isisd:isis/instance
52 int isis_instance_create(struct nb_cb_create_args
*args
)
54 struct isis_area
*area
;
57 if (args
->event
!= NB_EV_APPLY
)
60 area_tag
= yang_dnode_get_string(args
->dnode
, "./area-tag");
61 area
= isis_area_lookup(area_tag
);
63 return NB_ERR_INCONSISTENCY
;
65 area
= isis_area_create(area_tag
);
66 /* save area in dnode to avoid looking it up all the time */
67 nb_running_set_entry(args
->dnode
, area
);
72 int isis_instance_destroy(struct nb_cb_destroy_args
*args
)
74 struct isis_area
*area
;
76 if (args
->event
!= NB_EV_APPLY
)
79 area
= nb_running_unset_entry(args
->dnode
);
80 isis_area_destroy(area
->area_tag
);
86 * XPath: /frr-isisd:isis/instance/is-type
88 int isis_instance_is_type_modify(struct nb_cb_modify_args
*args
)
90 struct isis_area
*area
;
93 if (args
->event
!= NB_EV_APPLY
)
96 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
97 type
= yang_dnode_get_enum(args
->dnode
, NULL
);
98 isis_area_is_type_set(area
, type
);
104 * XPath: /frr-isisd:isis/instance/area-address
106 int isis_instance_area_address_create(struct nb_cb_create_args
*args
)
108 struct isis_area
*area
;
109 struct area_addr addr
, *addrr
= NULL
, *addrp
= NULL
;
110 struct listnode
*node
;
112 const char *net_title
= yang_dnode_get_string(args
->dnode
, NULL
);
114 switch (args
->event
) {
116 addr
.addr_len
= dotformat2buff(buff
, net_title
);
117 memcpy(addr
.area_addr
, buff
, addr
.addr_len
);
118 if (addr
.area_addr
[addr
.addr_len
- 1] != 0) {
120 args
->errmsg
, args
->errmsg_len
,
121 "nsel byte (last byte) in area address must be 0");
122 return NB_ERR_VALIDATION
;
124 if (isis
->sysid_set
) {
125 /* Check that the SystemID portions match */
126 if (memcmp(isis
->sysid
, GETSYSID((&addr
)),
129 args
->errmsg
, args
->errmsg_len
,
130 "System ID must not change when defining additional area addresses");
131 return NB_ERR_VALIDATION
;
136 addrr
= XMALLOC(MTYPE_ISIS_AREA_ADDR
, sizeof(struct area_addr
));
137 addrr
->addr_len
= dotformat2buff(buff
, net_title
);
138 memcpy(addrr
->area_addr
, buff
, addrr
->addr_len
);
139 args
->resource
->ptr
= addrr
;
142 XFREE(MTYPE_ISIS_AREA_ADDR
, args
->resource
->ptr
);
145 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
146 addrr
= args
->resource
->ptr
;
148 if (isis
->sysid_set
== 0) {
150 * First area address - get the SystemID for this router
152 memcpy(isis
->sysid
, GETSYSID(addrr
), ISIS_SYS_ID_LEN
);
155 /* check that we don't already have this address */
156 for (ALL_LIST_ELEMENTS_RO(area
->area_addrs
, node
,
158 if ((addrp
->addr_len
+ ISIS_SYS_ID_LEN
160 != (addrr
->addr_len
))
162 if (!memcmp(addrp
->area_addr
, addrr
->area_addr
,
164 XFREE(MTYPE_ISIS_AREA_ADDR
, addrr
);
165 return NB_OK
; /* silent fail */
170 /*Forget the systemID part of the address */
171 addrr
->addr_len
-= (ISIS_SYS_ID_LEN
+ ISIS_NSEL_LEN
);
172 assert(area
->area_addrs
); /* to silence scan-build sillyness */
173 listnode_add(area
->area_addrs
, addrr
);
175 /* only now we can safely generate our LSPs for this area */
176 if (listcount(area
->area_addrs
) > 0) {
177 if (area
->is_type
& IS_LEVEL_1
)
178 lsp_generate(area
, IS_LEVEL_1
);
179 if (area
->is_type
& IS_LEVEL_2
)
180 lsp_generate(area
, IS_LEVEL_2
);
188 int isis_instance_area_address_destroy(struct nb_cb_destroy_args
*args
)
190 struct area_addr addr
, *addrp
= NULL
;
191 struct listnode
*node
;
193 struct isis_area
*area
;
194 const char *net_title
;
196 if (args
->event
!= NB_EV_APPLY
)
199 net_title
= yang_dnode_get_string(args
->dnode
, NULL
);
200 addr
.addr_len
= dotformat2buff(buff
, net_title
);
201 memcpy(addr
.area_addr
, buff
, (int)addr
.addr_len
);
202 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
203 for (ALL_LIST_ELEMENTS_RO(area
->area_addrs
, node
, addrp
)) {
204 if ((addrp
->addr_len
+ ISIS_SYS_ID_LEN
+ 1) == addr
.addr_len
205 && !memcmp(addrp
->area_addr
, addr
.area_addr
, addr
.addr_len
))
209 return NB_ERR_INCONSISTENCY
;
211 listnode_delete(area
->area_addrs
, addrp
);
212 XFREE(MTYPE_ISIS_AREA_ADDR
, addrp
);
214 * Last area address - reset the SystemID for this router
216 if (listcount(area
->area_addrs
) == 0) {
217 memset(isis
->sysid
, 0, ISIS_SYS_ID_LEN
);
219 if (isis
->debugs
& DEBUG_EVENTS
)
220 zlog_debug("Router has no SystemID");
227 * XPath: /frr-isisd:isis/instance/dynamic-hostname
229 int isis_instance_dynamic_hostname_modify(struct nb_cb_modify_args
*args
)
231 struct isis_area
*area
;
233 if (args
->event
!= NB_EV_APPLY
)
236 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
237 isis_area_dynhostname_set(area
, yang_dnode_get_bool(args
->dnode
, NULL
));
243 * XPath: /frr-isisd:isis/instance/attached
245 int isis_instance_attached_modify(struct nb_cb_modify_args
*args
)
247 struct isis_area
*area
;
250 if (args
->event
!= NB_EV_APPLY
)
253 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
254 attached
= yang_dnode_get_bool(args
->dnode
, NULL
);
255 isis_area_attached_bit_set(area
, attached
);
261 * XPath: /frr-isisd:isis/instance/overload
263 int isis_instance_overload_modify(struct nb_cb_modify_args
*args
)
265 struct isis_area
*area
;
268 if (args
->event
!= NB_EV_APPLY
)
271 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
272 overload
= yang_dnode_get_bool(args
->dnode
, NULL
);
273 isis_area_overload_bit_set(area
, overload
);
279 * XPath: /frr-isisd:isis/instance/metric-style
281 int isis_instance_metric_style_modify(struct nb_cb_modify_args
*args
)
283 struct isis_area
*area
;
284 bool old_metric
, new_metric
;
285 enum isis_metric_style metric_style
=
286 yang_dnode_get_enum(args
->dnode
, NULL
);
288 if (args
->event
!= NB_EV_APPLY
)
291 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
292 old_metric
= (metric_style
== ISIS_WIDE_METRIC
) ? false : true;
293 new_metric
= (metric_style
== ISIS_NARROW_METRIC
) ? false : true;
294 isis_area_metricstyle_set(area
, old_metric
, new_metric
);
300 * XPath: /frr-isisd:isis/instance/purge-originator
302 int isis_instance_purge_originator_modify(struct nb_cb_modify_args
*args
)
304 struct isis_area
*area
;
306 if (args
->event
!= NB_EV_APPLY
)
309 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
310 area
->purge_originator
= yang_dnode_get_bool(args
->dnode
, NULL
);
316 * XPath: /frr-isisd:isis/instance/lsp/mtu
318 int isis_instance_lsp_mtu_modify(struct nb_cb_modify_args
*args
)
320 struct listnode
*node
;
321 struct isis_circuit
*circuit
;
322 uint16_t lsp_mtu
= yang_dnode_get_uint16(args
->dnode
, NULL
);
323 struct isis_area
*area
;
325 switch (args
->event
) {
327 area
= nb_running_get_entry(args
->dnode
, NULL
, false);
330 for (ALL_LIST_ELEMENTS_RO(area
->circuit_list
, node
, circuit
)) {
331 if (circuit
->state
!= C_STATE_INIT
332 && circuit
->state
!= C_STATE_UP
)
334 if (lsp_mtu
> isis_circuit_pdu_size(circuit
)) {
336 args
->errmsg
, args
->errmsg_len
,
337 "ISIS area contains circuit %s, which has a maximum PDU size of %zu",
338 circuit
->interface
->name
,
339 isis_circuit_pdu_size(circuit
));
340 return NB_ERR_VALIDATION
;
348 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
349 isis_area_lsp_mtu_set(area
, lsp_mtu
);
357 * XPath: /frr-isisd:isis/instance/lsp/timers/level-1/refresh-interval
359 int isis_instance_lsp_refresh_interval_level_1_modify(
360 struct nb_cb_modify_args
*args
)
362 struct isis_area
*area
;
365 if (args
->event
!= NB_EV_APPLY
)
368 refr_int
= yang_dnode_get_uint16(args
->dnode
, NULL
);
369 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
370 isis_area_lsp_refresh_set(area
, IS_LEVEL_1
, refr_int
);
376 * XPath: /frr-isisd:isis/instance/lsp/timers/level-2/refresh-interval
378 int isis_instance_lsp_refresh_interval_level_2_modify(
379 struct nb_cb_modify_args
*args
)
381 struct isis_area
*area
;
384 if (args
->event
!= NB_EV_APPLY
)
387 refr_int
= yang_dnode_get_uint16(args
->dnode
, NULL
);
388 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
389 isis_area_lsp_refresh_set(area
, IS_LEVEL_2
, refr_int
);
395 * XPath: /frr-isisd:isis/instance/lsp/timers/level-1/maximum-lifetime
397 int isis_instance_lsp_maximum_lifetime_level_1_modify(
398 struct nb_cb_modify_args
*args
)
400 struct isis_area
*area
;
403 if (args
->event
!= NB_EV_APPLY
)
406 max_lt
= yang_dnode_get_uint16(args
->dnode
, NULL
);
407 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
408 isis_area_max_lsp_lifetime_set(area
, IS_LEVEL_1
, max_lt
);
414 * XPath: /frr-isisd:isis/instance/lsp/timers/level-2/maximum-lifetime
416 int isis_instance_lsp_maximum_lifetime_level_2_modify(
417 struct nb_cb_modify_args
*args
)
419 struct isis_area
*area
;
422 if (args
->event
!= NB_EV_APPLY
)
425 max_lt
= yang_dnode_get_uint16(args
->dnode
, NULL
);
426 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
427 isis_area_max_lsp_lifetime_set(area
, IS_LEVEL_2
, max_lt
);
433 * XPath: /frr-isisd:isis/instance/lsp/timers/level-1/generation-interval
435 int isis_instance_lsp_generation_interval_level_1_modify(
436 struct nb_cb_modify_args
*args
)
438 struct isis_area
*area
;
441 if (args
->event
!= NB_EV_APPLY
)
444 gen_int
= yang_dnode_get_uint16(args
->dnode
, NULL
);
445 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
446 area
->lsp_gen_interval
[0] = gen_int
;
452 * XPath: /frr-isisd:isis/instance/lsp/timers/level-2/generation-interval
454 int isis_instance_lsp_generation_interval_level_2_modify(
455 struct nb_cb_modify_args
*args
)
457 struct isis_area
*area
;
460 if (args
->event
!= NB_EV_APPLY
)
463 gen_int
= yang_dnode_get_uint16(args
->dnode
, NULL
);
464 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
465 area
->lsp_gen_interval
[1] = gen_int
;
471 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay
473 void ietf_backoff_delay_apply_finish(struct nb_cb_apply_finish_args
*args
)
475 long init_delay
= yang_dnode_get_uint16(args
->dnode
, "./init-delay");
476 long short_delay
= yang_dnode_get_uint16(args
->dnode
, "./short-delay");
477 long long_delay
= yang_dnode_get_uint16(args
->dnode
, "./long-delay");
478 long holddown
= yang_dnode_get_uint16(args
->dnode
, "./hold-down");
480 yang_dnode_get_uint16(args
->dnode
, "./time-to-learn");
481 struct isis_area
*area
= nb_running_get_entry(args
->dnode
, NULL
, true);
482 size_t bufsiz
= strlen(area
->area_tag
) + sizeof("IS-IS Lx");
483 char *buf
= XCALLOC(MTYPE_TMP
, bufsiz
);
485 snprintf(buf
, bufsiz
, "IS-IS %s L1", area
->area_tag
);
486 spf_backoff_free(area
->spf_delay_ietf
[0]);
487 area
->spf_delay_ietf
[0] =
488 spf_backoff_new(master
, buf
, init_delay
, short_delay
,
489 long_delay
, holddown
, timetolearn
);
491 snprintf(buf
, bufsiz
, "IS-IS %s L2", area
->area_tag
);
492 spf_backoff_free(area
->spf_delay_ietf
[1]);
493 area
->spf_delay_ietf
[1] =
494 spf_backoff_new(master
, buf
, init_delay
, short_delay
,
495 long_delay
, holddown
, timetolearn
);
497 XFREE(MTYPE_TMP
, buf
);
500 int isis_instance_spf_ietf_backoff_delay_create(struct nb_cb_create_args
*args
)
502 /* All the work is done in the apply_finish */
506 int isis_instance_spf_ietf_backoff_delay_destroy(
507 struct nb_cb_destroy_args
*args
)
509 struct isis_area
*area
;
511 if (args
->event
!= NB_EV_APPLY
)
514 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
515 spf_backoff_free(area
->spf_delay_ietf
[0]);
516 spf_backoff_free(area
->spf_delay_ietf
[1]);
517 area
->spf_delay_ietf
[0] = NULL
;
518 area
->spf_delay_ietf
[1] = NULL
;
524 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay/init-delay
526 int isis_instance_spf_ietf_backoff_delay_init_delay_modify(
527 struct nb_cb_modify_args
*args
)
529 /* All the work is done in the apply_finish */
534 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay/short-delay
536 int isis_instance_spf_ietf_backoff_delay_short_delay_modify(
537 struct nb_cb_modify_args
*args
)
539 /* All the work is done in the apply_finish */
544 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay/long-delay
546 int isis_instance_spf_ietf_backoff_delay_long_delay_modify(
547 struct nb_cb_modify_args
*args
)
549 /* All the work is done in the apply_finish */
554 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay/hold-down
556 int isis_instance_spf_ietf_backoff_delay_hold_down_modify(
557 struct nb_cb_modify_args
*args
)
559 /* All the work is done in the apply_finish */
564 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay/time-to-learn
566 int isis_instance_spf_ietf_backoff_delay_time_to_learn_modify(
567 struct nb_cb_modify_args
*args
)
569 /* All the work is done in the apply_finish */
574 * XPath: /frr-isisd:isis/instance/spf/minimum-interval/level-1
576 int isis_instance_spf_minimum_interval_level_1_modify(
577 struct nb_cb_modify_args
*args
)
579 struct isis_area
*area
;
581 if (args
->event
!= NB_EV_APPLY
)
584 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
585 area
->min_spf_interval
[0] = yang_dnode_get_uint16(args
->dnode
, NULL
);
591 * XPath: /frr-isisd:isis/instance/spf/minimum-interval/level-2
593 int isis_instance_spf_minimum_interval_level_2_modify(
594 struct nb_cb_modify_args
*args
)
596 struct isis_area
*area
;
598 if (args
->event
!= NB_EV_APPLY
)
601 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
602 area
->min_spf_interval
[1] = yang_dnode_get_uint16(args
->dnode
, NULL
);
608 * XPath: /frr-isisd:isis/instance/area-password
610 void area_password_apply_finish(struct nb_cb_apply_finish_args
*args
)
612 const char *password
= yang_dnode_get_string(args
->dnode
, "./password");
613 struct isis_area
*area
= nb_running_get_entry(args
->dnode
, NULL
, true);
614 int pass_type
= yang_dnode_get_enum(args
->dnode
, "./password-type");
616 yang_dnode_get_enum(args
->dnode
, "./authenticate-snp");
619 case ISIS_PASSWD_TYPE_CLEARTXT
:
620 isis_area_passwd_cleartext_set(area
, IS_LEVEL_1
, password
,
623 case ISIS_PASSWD_TYPE_HMAC_MD5
:
624 isis_area_passwd_hmac_md5_set(area
, IS_LEVEL_1
, password
,
630 int isis_instance_area_password_create(struct nb_cb_create_args
*args
)
632 /* actual setting is done in apply_finish */
636 int isis_instance_area_password_destroy(struct nb_cb_destroy_args
*args
)
638 struct isis_area
*area
;
640 if (args
->event
!= NB_EV_APPLY
)
643 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
644 isis_area_passwd_unset(area
, IS_LEVEL_1
);
650 * XPath: /frr-isisd:isis/instance/area-password/password
652 int isis_instance_area_password_password_modify(struct nb_cb_modify_args
*args
)
654 /* actual setting is done in apply_finish */
659 * XPath: /frr-isisd:isis/instance/area-password/password-type
661 int isis_instance_area_password_password_type_modify(
662 struct nb_cb_modify_args
*args
)
664 /* actual setting is done in apply_finish */
669 * XPath: /frr-isisd:isis/instance/area-password/authenticate-snp
671 int isis_instance_area_password_authenticate_snp_modify(
672 struct nb_cb_modify_args
*args
)
674 /* actual setting is done in apply_finish */
679 * XPath: /frr-isisd:isis/instance/domain-password
681 void domain_password_apply_finish(struct nb_cb_apply_finish_args
*args
)
683 const char *password
= yang_dnode_get_string(args
->dnode
, "./password");
684 struct isis_area
*area
= nb_running_get_entry(args
->dnode
, NULL
, true);
685 int pass_type
= yang_dnode_get_enum(args
->dnode
, "./password-type");
687 yang_dnode_get_enum(args
->dnode
, "./authenticate-snp");
690 case ISIS_PASSWD_TYPE_CLEARTXT
:
691 isis_area_passwd_cleartext_set(area
, IS_LEVEL_2
, password
,
694 case ISIS_PASSWD_TYPE_HMAC_MD5
:
695 isis_area_passwd_hmac_md5_set(area
, IS_LEVEL_2
, password
,
701 int isis_instance_domain_password_create(struct nb_cb_create_args
*args
)
703 /* actual setting is done in apply_finish */
707 int isis_instance_domain_password_destroy(struct nb_cb_destroy_args
*args
)
709 struct isis_area
*area
;
711 if (args
->event
!= NB_EV_APPLY
)
714 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
715 isis_area_passwd_unset(area
, IS_LEVEL_2
);
721 * XPath: /frr-isisd:isis/instance/domain-password/password
723 int isis_instance_domain_password_password_modify(
724 struct nb_cb_modify_args
*args
)
726 /* actual setting is done in apply_finish */
731 * XPath: /frr-isisd:isis/instance/domain-password/password-type
733 int isis_instance_domain_password_password_type_modify(
734 struct nb_cb_modify_args
*args
)
736 /* actual setting is done in apply_finish */
741 * XPath: /frr-isisd:isis/instance/domain-password/authenticate-snp
743 int isis_instance_domain_password_authenticate_snp_modify(
744 struct nb_cb_modify_args
*args
)
746 /* actual setting is done in apply_finish */
751 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv4
753 void default_info_origin_apply_finish(const struct lyd_node
*dnode
, int family
)
755 int originate_type
= DEFAULT_ORIGINATE
;
756 unsigned long metric
= 0;
757 const char *routemap
= NULL
;
758 struct isis_area
*area
= nb_running_get_entry(dnode
, NULL
, true);
759 int level
= yang_dnode_get_enum(dnode
, "./level");
761 if (yang_dnode_get_bool(dnode
, "./always")) {
762 originate_type
= DEFAULT_ORIGINATE_ALWAYS
;
763 } else if (family
== AF_INET6
) {
765 "%s: Zebra doesn't implement default-originate for IPv6 yet, so use with care or use default-originate always.",
769 if (yang_dnode_exists(dnode
, "./metric"))
770 metric
= yang_dnode_get_uint32(dnode
, "./metric");
771 if (yang_dnode_exists(dnode
, "./route-map"))
772 routemap
= yang_dnode_get_string(dnode
, "./route-map");
774 isis_redist_set(area
, level
, family
, DEFAULT_ROUTE
, metric
, routemap
,
778 void default_info_origin_ipv4_apply_finish(struct nb_cb_apply_finish_args
*args
)
780 default_info_origin_apply_finish(args
->dnode
, AF_INET
);
783 void default_info_origin_ipv6_apply_finish(struct nb_cb_apply_finish_args
*args
)
785 default_info_origin_apply_finish(args
->dnode
, AF_INET6
);
788 int isis_instance_default_information_originate_ipv4_create(
789 struct nb_cb_create_args
*args
)
791 /* It's all done by default_info_origin_apply_finish */
795 int isis_instance_default_information_originate_ipv4_destroy(
796 struct nb_cb_destroy_args
*args
)
798 struct isis_area
*area
;
801 if (args
->event
!= NB_EV_APPLY
)
804 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
805 level
= yang_dnode_get_enum(args
->dnode
, "./level");
806 isis_redist_unset(area
, level
, AF_INET
, DEFAULT_ROUTE
);
812 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv4/always
814 int isis_instance_default_information_originate_ipv4_always_modify(
815 struct nb_cb_modify_args
*args
)
817 /* It's all done by default_info_origin_apply_finish */
822 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv4/route-map
824 int isis_instance_default_information_originate_ipv4_route_map_modify(
825 struct nb_cb_modify_args
*args
)
827 /* It's all done by default_info_origin_apply_finish */
831 int isis_instance_default_information_originate_ipv4_route_map_destroy(
832 struct nb_cb_destroy_args
*args
)
834 /* It's all done by default_info_origin_apply_finish */
839 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv4/metric
841 int isis_instance_default_information_originate_ipv4_metric_modify(
842 struct nb_cb_modify_args
*args
)
844 /* It's all done by default_info_origin_apply_finish */
849 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv6
851 int isis_instance_default_information_originate_ipv6_create(
852 struct nb_cb_create_args
*args
)
854 /* It's all done by default_info_origin_apply_finish */
858 int isis_instance_default_information_originate_ipv6_destroy(
859 struct nb_cb_destroy_args
*args
)
861 struct isis_area
*area
;
864 if (args
->event
!= NB_EV_APPLY
)
867 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
868 level
= yang_dnode_get_enum(args
->dnode
, "./level");
869 isis_redist_unset(area
, level
, AF_INET6
, DEFAULT_ROUTE
);
875 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv6/always
877 int isis_instance_default_information_originate_ipv6_always_modify(
878 struct nb_cb_modify_args
*args
)
880 /* It's all done by default_info_origin_apply_finish */
885 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv6/route-map
887 int isis_instance_default_information_originate_ipv6_route_map_modify(
888 struct nb_cb_modify_args
*args
)
890 /* It's all done by default_info_origin_apply_finish */
894 int isis_instance_default_information_originate_ipv6_route_map_destroy(
895 struct nb_cb_destroy_args
*args
)
897 /* It's all done by default_info_origin_apply_finish */
902 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv6/metric
904 int isis_instance_default_information_originate_ipv6_metric_modify(
905 struct nb_cb_modify_args
*args
)
907 /* It's all done by default_info_origin_apply_finish */
912 * XPath: /frr-isisd:isis/instance/redistribute/ipv4
914 void redistribute_apply_finish(const struct lyd_node
*dnode
, int family
)
916 assert(family
== AF_INET
|| family
== AF_INET6
);
918 unsigned long metric
= 0;
919 const char *routemap
= NULL
;
920 struct isis_area
*area
;
922 type
= yang_dnode_get_enum(dnode
, "./protocol");
923 level
= yang_dnode_get_enum(dnode
, "./level");
924 area
= nb_running_get_entry(dnode
, NULL
, true);
926 if (yang_dnode_exists(dnode
, "./metric"))
927 metric
= yang_dnode_get_uint32(dnode
, "./metric");
928 if (yang_dnode_exists(dnode
, "./route-map"))
929 routemap
= yang_dnode_get_string(dnode
, "./route-map");
931 isis_redist_set(area
, level
, family
, type
, metric
, routemap
, 0);
934 void redistribute_ipv4_apply_finish(struct nb_cb_apply_finish_args
*args
)
936 redistribute_apply_finish(args
->dnode
, AF_INET
);
939 void redistribute_ipv6_apply_finish(struct nb_cb_apply_finish_args
*args
)
941 redistribute_apply_finish(args
->dnode
, AF_INET6
);
944 int isis_instance_redistribute_ipv4_create(struct nb_cb_create_args
*args
)
946 /* It's all done by redistribute_apply_finish */
950 int isis_instance_redistribute_ipv4_destroy(struct nb_cb_destroy_args
*args
)
952 struct isis_area
*area
;
955 if (args
->event
!= NB_EV_APPLY
)
958 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
959 level
= yang_dnode_get_enum(args
->dnode
, "./level");
960 type
= yang_dnode_get_enum(args
->dnode
, "./protocol");
961 isis_redist_unset(area
, level
, AF_INET
, type
);
967 * XPath: /frr-isisd:isis/instance/redistribute/ipv4/route-map
969 int isis_instance_redistribute_ipv4_route_map_modify(
970 struct nb_cb_modify_args
*args
)
972 /* It's all done by redistribute_apply_finish */
976 int isis_instance_redistribute_ipv4_route_map_destroy(
977 struct nb_cb_destroy_args
*args
)
979 /* It's all done by redistribute_apply_finish */
984 * XPath: /frr-isisd:isis/instance/redistribute/ipv4/metric
986 int isis_instance_redistribute_ipv4_metric_modify(
987 struct nb_cb_modify_args
*args
)
989 /* It's all done by redistribute_apply_finish */
994 * XPath: /frr-isisd:isis/instance/redistribute/ipv6
996 int isis_instance_redistribute_ipv6_create(struct nb_cb_create_args
*args
)
998 /* It's all done by redistribute_apply_finish */
1002 int isis_instance_redistribute_ipv6_destroy(struct nb_cb_destroy_args
*args
)
1004 struct isis_area
*area
;
1007 if (args
->event
!= NB_EV_APPLY
)
1010 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1011 level
= yang_dnode_get_enum(args
->dnode
, "./level");
1012 type
= yang_dnode_get_enum(args
->dnode
, "./protocol");
1013 isis_redist_unset(area
, level
, AF_INET6
, type
);
1019 * XPath: /frr-isisd:isis/instance/redistribute/ipv6/route-map
1021 int isis_instance_redistribute_ipv6_route_map_modify(
1022 struct nb_cb_modify_args
*args
)
1024 /* It's all done by redistribute_apply_finish */
1028 int isis_instance_redistribute_ipv6_route_map_destroy(
1029 struct nb_cb_destroy_args
*args
)
1031 /* It's all done by redistribute_apply_finish */
1036 * XPath: /frr-isisd:isis/instance/redistribute/ipv6/metric
1038 int isis_instance_redistribute_ipv6_metric_modify(
1039 struct nb_cb_modify_args
*args
)
1041 /* It's all done by redistribute_apply_finish */
1046 * XPath: /frr-isisd:isis/instance/multi-topology/ipv4-multicast
1048 static int isis_multi_topology_common(enum nb_event event
,
1049 const struct lyd_node
*dnode
,
1050 char *errmsg
, size_t errmsg_len
,
1051 const char *topology
, bool create
)
1053 struct isis_area
*area
;
1054 struct isis_area_mt_setting
*setting
;
1055 uint16_t mtid
= isis_str2mtid(topology
);
1058 case NB_EV_VALIDATE
:
1059 if (mtid
== (uint16_t)-1) {
1060 snprintf(errmsg
, errmsg_len
, "Unknown topology %s",
1062 return NB_ERR_VALIDATION
;
1069 area
= nb_running_get_entry(dnode
, NULL
, true);
1070 setting
= area_get_mt_setting(area
, mtid
);
1071 setting
->enabled
= create
;
1072 lsp_regenerate_schedule(area
, IS_LEVEL_1
| IS_LEVEL_2
, 0);
1079 static int isis_multi_topology_overload_common(enum nb_event event
,
1080 const struct lyd_node
*dnode
,
1081 const char *topology
)
1083 struct isis_area
*area
;
1084 struct isis_area_mt_setting
*setting
;
1085 uint16_t mtid
= isis_str2mtid(topology
);
1087 /* validation is done in isis_multi_topology_common */
1088 if (event
!= NB_EV_APPLY
)
1091 area
= nb_running_get_entry(dnode
, NULL
, true);
1092 setting
= area_get_mt_setting(area
, mtid
);
1093 setting
->overload
= yang_dnode_get_bool(dnode
, NULL
);
1094 if (setting
->enabled
)
1095 lsp_regenerate_schedule(area
, IS_LEVEL_1
| IS_LEVEL_2
, 0);
1100 int isis_instance_multi_topology_ipv4_multicast_create(
1101 struct nb_cb_create_args
*args
)
1103 return isis_multi_topology_common(args
->event
, args
->dnode
,
1104 args
->errmsg
, args
->errmsg_len
,
1105 "ipv4-multicast", true);
1108 int isis_instance_multi_topology_ipv4_multicast_destroy(
1109 struct nb_cb_destroy_args
*args
)
1111 return isis_multi_topology_common(args
->event
, args
->dnode
,
1112 args
->errmsg
, args
->errmsg_len
,
1113 "ipv4-multicast", false);
1117 * XPath: /frr-isisd:isis/instance/multi-topology/ipv4-multicast/overload
1119 int isis_instance_multi_topology_ipv4_multicast_overload_modify(
1120 struct nb_cb_modify_args
*args
)
1122 return isis_multi_topology_overload_common(args
->event
, args
->dnode
,
1127 * XPath: /frr-isisd:isis/instance/multi-topology/ipv4-management
1129 int isis_instance_multi_topology_ipv4_management_create(
1130 struct nb_cb_create_args
*args
)
1132 return isis_multi_topology_common(args
->event
, args
->dnode
,
1133 args
->errmsg
, args
->errmsg_len
,
1137 int isis_instance_multi_topology_ipv4_management_destroy(
1138 struct nb_cb_destroy_args
*args
)
1140 return isis_multi_topology_common(args
->event
, args
->dnode
,
1141 args
->errmsg
, args
->errmsg_len
,
1142 "ipv4-mgmt", false);
1146 * XPath: /frr-isisd:isis/instance/multi-topology/ipv4-management/overload
1148 int isis_instance_multi_topology_ipv4_management_overload_modify(
1149 struct nb_cb_modify_args
*args
)
1151 return isis_multi_topology_overload_common(args
->event
, args
->dnode
,
1156 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-unicast
1158 int isis_instance_multi_topology_ipv6_unicast_create(
1159 struct nb_cb_create_args
*args
)
1161 return isis_multi_topology_common(args
->event
, args
->dnode
,
1162 args
->errmsg
, args
->errmsg_len
,
1163 "ipv6-unicast", true);
1166 int isis_instance_multi_topology_ipv6_unicast_destroy(
1167 struct nb_cb_destroy_args
*args
)
1169 return isis_multi_topology_common(args
->event
, args
->dnode
,
1170 args
->errmsg
, args
->errmsg_len
,
1171 "ipv6-unicast", false);
1175 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-unicast/overload
1177 int isis_instance_multi_topology_ipv6_unicast_overload_modify(
1178 struct nb_cb_modify_args
*args
)
1180 return isis_multi_topology_overload_common(args
->event
, args
->dnode
,
1185 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-multicast
1187 int isis_instance_multi_topology_ipv6_multicast_create(
1188 struct nb_cb_create_args
*args
)
1190 return isis_multi_topology_common(args
->event
, args
->dnode
,
1191 args
->errmsg
, args
->errmsg_len
,
1192 "ipv6-multicast", true);
1195 int isis_instance_multi_topology_ipv6_multicast_destroy(
1196 struct nb_cb_destroy_args
*args
)
1198 return isis_multi_topology_common(args
->event
, args
->dnode
,
1199 args
->errmsg
, args
->errmsg_len
,
1200 "ipv6-multicast", false);
1204 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-multicast/overload
1206 int isis_instance_multi_topology_ipv6_multicast_overload_modify(
1207 struct nb_cb_modify_args
*args
)
1209 return isis_multi_topology_overload_common(args
->event
, args
->dnode
,
1214 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-management
1216 int isis_instance_multi_topology_ipv6_management_create(
1217 struct nb_cb_create_args
*args
)
1219 return isis_multi_topology_common(args
->event
, args
->dnode
,
1220 args
->errmsg
, args
->errmsg_len
,
1224 int isis_instance_multi_topology_ipv6_management_destroy(
1225 struct nb_cb_destroy_args
*args
)
1227 return isis_multi_topology_common(args
->event
, args
->dnode
,
1228 args
->errmsg
, args
->errmsg_len
,
1229 "ipv6-mgmt", false);
1233 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-management/overload
1235 int isis_instance_multi_topology_ipv6_management_overload_modify(
1236 struct nb_cb_modify_args
*args
)
1238 return isis_multi_topology_overload_common(args
->event
, args
->dnode
,
1243 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-dstsrc
1245 int isis_instance_multi_topology_ipv6_dstsrc_create(
1246 struct nb_cb_create_args
*args
)
1248 return isis_multi_topology_common(args
->event
, args
->dnode
,
1249 args
->errmsg
, args
->errmsg_len
,
1250 "ipv6-dstsrc", true);
1253 int isis_instance_multi_topology_ipv6_dstsrc_destroy(
1254 struct nb_cb_destroy_args
*args
)
1256 return isis_multi_topology_common(args
->event
, args
->dnode
,
1257 args
->errmsg
, args
->errmsg_len
,
1258 "ipv6-dstsrc", false);
1262 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-dstsrc/overload
1264 int isis_instance_multi_topology_ipv6_dstsrc_overload_modify(
1265 struct nb_cb_modify_args
*args
)
1267 return isis_multi_topology_overload_common(args
->event
, args
->dnode
,
1272 * XPath: /frr-isisd:isis/instance/log-adjacency-changes
1274 int isis_instance_log_adjacency_changes_modify(struct nb_cb_modify_args
*args
)
1276 struct isis_area
*area
;
1277 bool log
= yang_dnode_get_bool(args
->dnode
, NULL
);
1279 if (args
->event
!= NB_EV_APPLY
)
1282 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1283 area
->log_adj_changes
= log
? 1 : 0;
1289 * XPath: /frr-isisd:isis/instance/mpls-te
1291 int isis_instance_mpls_te_create(struct nb_cb_create_args
*args
)
1293 struct listnode
*node
;
1294 struct isis_area
*area
;
1295 struct isis_circuit
*circuit
;
1297 if (args
->event
!= NB_EV_APPLY
)
1300 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1301 if (area
->mta
== NULL
) {
1303 struct mpls_te_area
*new;
1305 zlog_debug("ISIS-TE(%s): Initialize MPLS Traffic Engineering",
1308 new = XCALLOC(MTYPE_ISIS_MPLS_TE
, sizeof(struct mpls_te_area
));
1310 /* Initialize MPLS_TE structure */
1311 new->status
= enable
;
1313 new->inter_as
= off
;
1314 new->interas_areaid
.s_addr
= 0;
1315 new->router_id
.s_addr
= 0;
1319 area
->mta
->status
= enable
;
1322 /* Update Extended TLVs according to Interface link parameters */
1323 for (ALL_LIST_ELEMENTS_RO(area
->circuit_list
, node
, circuit
))
1324 isis_link_params_update(circuit
, circuit
->interface
);
1326 /* Reoriginate STD_TE & GMPLS circuits */
1327 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1332 int isis_instance_mpls_te_destroy(struct nb_cb_destroy_args
*args
)
1334 struct listnode
*node
;
1335 struct isis_area
*area
;
1336 struct isis_circuit
*circuit
;
1338 if (args
->event
!= NB_EV_APPLY
)
1341 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1342 if (IS_MPLS_TE(area
->mta
))
1343 area
->mta
->status
= disable
;
1347 /* Flush LSP if circuit engage */
1348 for (ALL_LIST_ELEMENTS_RO(area
->circuit_list
, node
, circuit
)) {
1349 if (!IS_EXT_TE(circuit
->ext
))
1352 /* disable MPLS_TE Circuit keeping SR one's */
1353 if (IS_SUBTLV(circuit
->ext
, EXT_ADJ_SID
))
1354 circuit
->ext
->status
= EXT_ADJ_SID
;
1355 else if (IS_SUBTLV(circuit
->ext
, EXT_LAN_ADJ_SID
))
1356 circuit
->ext
->status
= EXT_LAN_ADJ_SID
;
1358 circuit
->ext
->status
= 0;
1361 /* Reoriginate STD_TE & GMPLS circuits */
1362 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1364 zlog_debug("ISIS-TE(%s): Disabled MPLS Traffic Engineering",
1371 * XPath: /frr-isisd:isis/instance/mpls-te/router-address
1373 int isis_instance_mpls_te_router_address_modify(struct nb_cb_modify_args
*args
)
1375 struct in_addr value
;
1376 struct isis_area
*area
;
1378 if (args
->event
!= NB_EV_APPLY
)
1381 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1382 /* only proceed if MPLS-TE is enabled */
1383 if (!IS_MPLS_TE(area
->mta
))
1386 /* Update Area Router ID */
1387 yang_dnode_get_ipv4(&value
, args
->dnode
, NULL
);
1388 area
->mta
->router_id
.s_addr
= value
.s_addr
;
1390 /* And re-schedule LSP update */
1391 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1396 int isis_instance_mpls_te_router_address_destroy(
1397 struct nb_cb_destroy_args
*args
)
1399 struct isis_area
*area
;
1401 if (args
->event
!= NB_EV_APPLY
)
1404 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1405 /* only proceed if MPLS-TE is enabled */
1406 if (!IS_MPLS_TE(area
->mta
))
1409 /* Reset Area Router ID */
1410 area
->mta
->router_id
.s_addr
= INADDR_ANY
;
1412 /* And re-schedule LSP update */
1413 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1419 * XPath: /frr-isisd:isis/instance/segment-routing/enabled
1421 int isis_instance_segment_routing_enabled_modify(
1422 struct nb_cb_modify_args
*args
)
1424 struct isis_area
*area
;
1426 if (args
->event
!= NB_EV_APPLY
)
1429 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1430 area
->srdb
.config
.enabled
= yang_dnode_get_bool(args
->dnode
, NULL
);
1432 if (area
->srdb
.config
.enabled
) {
1433 if (IS_DEBUG_ISIS(DEBUG_EVENTS
))
1434 zlog_debug("SR: Segment Routing: OFF -> ON");
1436 isis_sr_start(area
);
1438 if (IS_DEBUG_ISIS(DEBUG_EVENTS
))
1439 zlog_debug("SR: Segment Routing: ON -> OFF");
1448 * XPath: /frr-isisd:isis/instance/segment-routing/srgb
1450 int isis_instance_segment_routing_srgb_pre_validate(
1451 struct nb_cb_pre_validate_args
*args
)
1453 uint32_t srgb_lbound
;
1454 uint32_t srgb_ubound
;
1455 uint32_t srlb_lbound
;
1456 uint32_t srlb_ubound
;
1458 srgb_lbound
= yang_dnode_get_uint32(args
->dnode
, "./lower-bound");
1459 srgb_ubound
= yang_dnode_get_uint32(args
->dnode
, "./upper-bound");
1460 srlb_lbound
= yang_dnode_get_uint32(args
->dnode
, "../srlb/lower-bound");
1461 srlb_ubound
= yang_dnode_get_uint32(args
->dnode
, "../srlb/upper-bound");
1463 /* Check that the block size does not exceed 65535 */
1464 if ((srgb_ubound
- srgb_lbound
+ 1) > 65535) {
1466 "New SR Global Block (%u/%u) exceed the limit of 65535",
1467 srgb_lbound
, srgb_ubound
);
1468 return NB_ERR_VALIDATION
;
1471 /* Validate SRGB against SRLB */
1472 if (!((srgb_ubound
< srlb_lbound
) || (srgb_lbound
> srlb_ubound
))) {
1474 "New SR Global Block (%u/%u) conflict with Local Block (%u/%u)",
1475 srgb_lbound
, srgb_ubound
, srlb_lbound
, srlb_ubound
);
1476 return NB_ERR_VALIDATION
;
1482 void isis_instance_segment_routing_srgb_apply_finish(
1483 struct nb_cb_apply_finish_args
*args
)
1485 struct isis_area
*area
;
1486 uint32_t lower_bound
, upper_bound
;
1488 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1489 lower_bound
= yang_dnode_get_uint32(args
->dnode
, "./lower-bound");
1490 upper_bound
= yang_dnode_get_uint32(args
->dnode
, "./upper-bound");
1492 isis_sr_cfg_srgb_update(area
, lower_bound
, upper_bound
);
1496 * XPath: /frr-isisd:isis/instance/segment-routing/srgb/lower-bound
1498 int isis_instance_segment_routing_srgb_lower_bound_modify(
1499 struct nb_cb_modify_args
*args
)
1501 uint32_t lower_bound
= yang_dnode_get_uint32(args
->dnode
, NULL
);
1503 switch (args
->event
) {
1504 case NB_EV_VALIDATE
:
1505 if (!IS_MPLS_UNRESERVED_LABEL(lower_bound
)) {
1506 zlog_warn("Invalid SRGB lower bound: %" PRIu32
,
1508 return NB_ERR_VALIDATION
;
1521 * XPath: /frr-isisd:isis/instance/segment-routing/srgb/upper-bound
1523 int isis_instance_segment_routing_srgb_upper_bound_modify(
1524 struct nb_cb_modify_args
*args
)
1526 uint32_t upper_bound
= yang_dnode_get_uint32(args
->dnode
, NULL
);
1528 switch (args
->event
) {
1529 case NB_EV_VALIDATE
:
1530 if (!IS_MPLS_UNRESERVED_LABEL(upper_bound
)) {
1531 zlog_warn("Invalid SRGB upper bound: %" PRIu32
,
1533 return NB_ERR_VALIDATION
;
1546 * XPath: /frr-isisd:isis/instance/segment-routing/srlb
1548 int isis_instance_segment_routing_srlb_pre_validate(
1549 struct nb_cb_pre_validate_args
*args
)
1551 uint32_t srgb_lbound
;
1552 uint32_t srgb_ubound
;
1553 uint32_t srlb_lbound
;
1554 uint32_t srlb_ubound
;
1556 srgb_lbound
= yang_dnode_get_uint32(args
->dnode
, "../srgb/lower-bound");
1557 srgb_ubound
= yang_dnode_get_uint32(args
->dnode
, "../srgb/upper-bound");
1558 srlb_lbound
= yang_dnode_get_uint32(args
->dnode
, "./lower-bound");
1559 srlb_ubound
= yang_dnode_get_uint32(args
->dnode
, "./upper-bound");
1561 /* Check that the block size does not exceed 65535 */
1562 if ((srlb_ubound
- srlb_lbound
+ 1) > 65535) {
1564 "New SR Local Block (%u/%u) exceed the limit of 65535",
1565 srlb_lbound
, srlb_ubound
);
1566 return NB_ERR_VALIDATION
;
1569 /* Validate SRLB against SRGB */
1570 if (!((srlb_ubound
< srgb_lbound
) || (srlb_lbound
> srgb_ubound
))) {
1572 "New SR Local Block (%u/%u) conflict with Global Block (%u/%u)",
1573 srlb_lbound
, srlb_ubound
, srgb_lbound
, srgb_ubound
);
1574 return NB_ERR_VALIDATION
;
1580 void isis_instance_segment_routing_srlb_apply_finish(
1581 struct nb_cb_apply_finish_args
*args
)
1583 struct isis_area
*area
;
1584 uint32_t lower_bound
, upper_bound
;
1586 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1587 lower_bound
= yang_dnode_get_uint32(args
->dnode
, "./lower-bound");
1588 upper_bound
= yang_dnode_get_uint32(args
->dnode
, "./upper-bound");
1590 isis_sr_cfg_srlb_update(area
, lower_bound
, upper_bound
);
1594 * XPath: /frr-isisd:isis/instance/segment-routing/srlb/lower-bound
1596 int isis_instance_segment_routing_srlb_lower_bound_modify(
1597 struct nb_cb_modify_args
*args
)
1599 uint32_t lower_bound
= yang_dnode_get_uint32(args
->dnode
, NULL
);
1601 switch (args
->event
) {
1602 case NB_EV_VALIDATE
:
1603 if (!IS_MPLS_UNRESERVED_LABEL(lower_bound
)) {
1604 zlog_warn("Invalid SRLB lower bound: %" PRIu32
,
1606 return NB_ERR_VALIDATION
;
1619 * XPath: /frr-isisd:isis/instance/segment-routing/srlb/upper-bound
1621 int isis_instance_segment_routing_srlb_upper_bound_modify(
1622 struct nb_cb_modify_args
*args
)
1624 uint32_t upper_bound
= yang_dnode_get_uint32(args
->dnode
, NULL
);
1626 switch (args
->event
) {
1627 case NB_EV_VALIDATE
:
1628 if (!IS_MPLS_UNRESERVED_LABEL(upper_bound
)) {
1629 zlog_warn("Invalid SRLB upper bound: %" PRIu32
,
1631 return NB_ERR_VALIDATION
;
1644 * XPath: /frr-isisd:isis/instance/segment-routing/msd/node-msd
1646 int isis_instance_segment_routing_msd_node_msd_modify(
1647 struct nb_cb_modify_args
*args
)
1649 struct isis_area
*area
;
1651 if (args
->event
!= NB_EV_APPLY
)
1654 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1655 area
->srdb
.config
.msd
= yang_dnode_get_uint8(args
->dnode
, NULL
);
1657 /* Update and regenerate LSP */
1658 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1663 int isis_instance_segment_routing_msd_node_msd_destroy(
1664 struct nb_cb_destroy_args
*args
)
1666 struct isis_area
*area
;
1668 if (args
->event
!= NB_EV_APPLY
)
1671 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1672 area
->srdb
.config
.msd
= 0;
1674 /* Update and regenerate LSP */
1675 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1681 * XPath: /frr-isisd:isis/instance/segment-routing/prefix-sid-map/prefix-sid
1683 int isis_instance_segment_routing_prefix_sid_map_prefix_sid_create(
1684 struct nb_cb_create_args
*args
)
1686 struct isis_area
*area
;
1687 struct prefix prefix
;
1688 struct sr_prefix_cfg
*pcfg
;
1690 if (args
->event
!= NB_EV_APPLY
)
1693 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1694 yang_dnode_get_prefix(&prefix
, args
->dnode
, "./prefix");
1696 pcfg
= isis_sr_cfg_prefix_add(area
, &prefix
);
1697 nb_running_set_entry(args
->dnode
, pcfg
);
1702 int isis_instance_segment_routing_prefix_sid_map_prefix_sid_destroy(
1703 struct nb_cb_destroy_args
*args
)
1705 struct sr_prefix_cfg
*pcfg
;
1706 struct isis_area
*area
;
1708 if (args
->event
!= NB_EV_APPLY
)
1711 pcfg
= nb_running_unset_entry(args
->dnode
);
1713 isis_sr_cfg_prefix_del(pcfg
);
1714 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1719 int isis_instance_segment_routing_prefix_sid_map_prefix_sid_pre_validate(
1720 struct nb_cb_pre_validate_args
*args
)
1722 uint32_t srgb_lbound
;
1723 uint32_t srgb_ubound
;
1724 uint32_t srgb_range
;
1726 enum sr_sid_value_type sid_type
;
1728 srgb_lbound
= yang_dnode_get_uint32(args
->dnode
,
1729 "../../srgb/lower-bound");
1730 srgb_ubound
= yang_dnode_get_uint32(args
->dnode
,
1731 "../../srgb/upper-bound");
1732 sid
= yang_dnode_get_uint32(args
->dnode
, "./sid-value");
1733 sid_type
= yang_dnode_get_enum(args
->dnode
, "./sid-value-type");
1735 srgb_range
= srgb_ubound
- srgb_lbound
+ 1;
1737 case SR_SID_VALUE_TYPE_INDEX
:
1738 if (sid
>= srgb_range
) {
1739 zlog_warn("SID index %u falls outside local SRGB range",
1741 return NB_ERR_VALIDATION
;
1744 case SR_SID_VALUE_TYPE_ABSOLUTE
:
1745 if (!IS_MPLS_UNRESERVED_LABEL(sid
)) {
1746 zlog_warn("Invalid absolute SID %u", sid
);
1747 return NB_ERR_VALIDATION
;
1755 void isis_instance_segment_routing_prefix_sid_map_prefix_sid_apply_finish(
1756 struct nb_cb_apply_finish_args
*args
)
1758 struct sr_prefix_cfg
*pcfg
;
1759 struct isis_area
*area
;
1761 pcfg
= nb_running_get_entry(args
->dnode
, NULL
, true);
1763 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1768 * /frr-isisd:isis/instance/segment-routing/prefix-sid-map/prefix-sid/sid-value-type
1770 int isis_instance_segment_routing_prefix_sid_map_prefix_sid_sid_value_type_modify(
1771 struct nb_cb_modify_args
*args
)
1773 struct sr_prefix_cfg
*pcfg
;
1775 if (args
->event
!= NB_EV_APPLY
)
1778 pcfg
= nb_running_get_entry(args
->dnode
, NULL
, true);
1779 pcfg
->sid_type
= yang_dnode_get_enum(args
->dnode
, NULL
);
1786 * /frr-isisd:isis/instance/segment-routing/prefix-sid-map/prefix-sid/sid-value
1788 int isis_instance_segment_routing_prefix_sid_map_prefix_sid_sid_value_modify(
1789 struct nb_cb_modify_args
*args
)
1791 struct sr_prefix_cfg
*pcfg
;
1793 if (args
->event
!= NB_EV_APPLY
)
1796 pcfg
= nb_running_get_entry(args
->dnode
, NULL
, true);
1797 pcfg
->sid
= yang_dnode_get_uint32(args
->dnode
, NULL
);
1804 * /frr-isisd:isis/instance/segment-routing/prefix-sid-map/prefix-sid/last-hop-behavior
1806 int isis_instance_segment_routing_prefix_sid_map_prefix_sid_last_hop_behavior_modify(
1807 struct nb_cb_modify_args
*args
)
1809 struct sr_prefix_cfg
*pcfg
;
1811 if (args
->event
!= NB_EV_APPLY
)
1814 pcfg
= nb_running_get_entry(args
->dnode
, NULL
, true);
1815 pcfg
->last_hop_behavior
= yang_dnode_get_enum(args
->dnode
, NULL
);
1821 * XPath: /frr-interface:lib/interface/frr-isisd:isis
1823 int lib_interface_isis_create(struct nb_cb_create_args
*args
)
1825 struct isis_area
*area
;
1826 struct interface
*ifp
;
1827 struct isis_circuit
*circuit
;
1828 const char *area_tag
= yang_dnode_get_string(args
->dnode
, "./area-tag");
1829 uint32_t min_mtu
, actual_mtu
;
1831 switch (args
->event
) {
1835 case NB_EV_VALIDATE
:
1836 /* check if interface mtu is sufficient. If the area has not
1837 * been created yet, assume default MTU for the area
1839 ifp
= nb_running_get_entry(args
->dnode
, NULL
, false);
1840 /* zebra might not know yet about the MTU - nothing we can do */
1841 if (!ifp
|| ifp
->mtu
== 0)
1844 if_is_broadcast(ifp
) ? ifp
->mtu
- LLC_LEN
: ifp
->mtu
;
1845 area
= isis_area_lookup(area_tag
);
1847 min_mtu
= area
->lsp_mtu
;
1850 min_mtu
= yang_get_default_uint16(
1851 "/frr-isisd:isis/instance/lsp/mtu");
1853 min_mtu
= DEFAULT_LSP_MTU
;
1854 #endif /* ifndef FABRICD */
1855 if (actual_mtu
< min_mtu
) {
1856 snprintf(args
->errmsg
, args
->errmsg_len
,
1857 "Interface %s has MTU %" PRIu32
1858 ", minimum MTU for the area is %" PRIu32
"",
1859 ifp
->name
, actual_mtu
, min_mtu
);
1860 return NB_ERR_VALIDATION
;
1864 area
= isis_area_lookup(area_tag
);
1865 /* The area should have already be created. We are
1866 * setting the priority of the global isis area creation
1867 * slightly lower, so it should be executed first, but I
1868 * cannot rely on that so here I have to check.
1872 EC_LIB_NB_CB_CONFIG_APPLY
,
1873 "%s: attempt to create circuit for area %s before the area has been created",
1874 __func__
, area_tag
);
1878 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1879 circuit
= isis_circuit_create(area
, ifp
);
1881 && (circuit
->state
== C_STATE_CONF
1882 || circuit
->state
== C_STATE_UP
));
1883 nb_running_set_entry(args
->dnode
, circuit
);
1890 int lib_interface_isis_destroy(struct nb_cb_destroy_args
*args
)
1892 struct isis_circuit
*circuit
;
1894 if (args
->event
!= NB_EV_APPLY
)
1897 circuit
= nb_running_unset_entry(args
->dnode
);
1899 return NB_ERR_INCONSISTENCY
;
1901 /* disable both AFs for this circuit. this will also update the
1902 * CSM state by sending an ISIS_DISABLED signal. If there is no
1903 * area associated to the circuit there is nothing to do
1906 isis_circuit_af_set(circuit
, false, false);
1911 * XPath: /frr-interface:lib/interface/frr-isisd:isis/area-tag
1913 int lib_interface_isis_area_tag_modify(struct nb_cb_modify_args
*args
)
1915 struct isis_circuit
*circuit
;
1916 struct interface
*ifp
;
1918 const char *area_tag
, *ifname
, *vrfname
;
1920 if (args
->event
== NB_EV_VALIDATE
) {
1921 /* libyang doesn't like relative paths across module boundaries
1923 ifname
= yang_dnode_get_string(args
->dnode
->parent
->parent
,
1925 vrfname
= yang_dnode_get_string(args
->dnode
->parent
->parent
,
1927 vrf
= vrf_lookup_by_name(vrfname
);
1929 ifp
= if_lookup_by_name(ifname
, vrf
->vrf_id
);
1932 circuit
= circuit_lookup_by_ifp(ifp
, isis
->init_circ_list
);
1933 area_tag
= yang_dnode_get_string(args
->dnode
, NULL
);
1934 if (circuit
&& circuit
->area
&& circuit
->area
->area_tag
1935 && strcmp(circuit
->area
->area_tag
, area_tag
)) {
1936 snprintf(args
->errmsg
, args
->errmsg_len
,
1937 "ISIS circuit is already defined on %s",
1938 circuit
->area
->area_tag
);
1939 return NB_ERR_VALIDATION
;
1947 * XPath: /frr-interface:lib/interface/frr-isisd:isis/circuit-type
1949 int lib_interface_isis_circuit_type_modify(struct nb_cb_modify_args
*args
)
1951 int circ_type
= yang_dnode_get_enum(args
->dnode
, NULL
);
1952 struct isis_circuit
*circuit
;
1953 struct interface
*ifp
;
1955 const char *ifname
, *vrfname
;
1957 switch (args
->event
) {
1958 case NB_EV_VALIDATE
:
1959 /* libyang doesn't like relative paths across module boundaries
1961 ifname
= yang_dnode_get_string(args
->dnode
->parent
->parent
,
1963 vrfname
= yang_dnode_get_string(args
->dnode
->parent
->parent
,
1965 vrf
= vrf_lookup_by_name(vrfname
);
1967 ifp
= if_lookup_by_name(ifname
, vrf
->vrf_id
);
1970 circuit
= circuit_lookup_by_ifp(ifp
, isis
->init_circ_list
);
1971 if (circuit
&& circuit
->state
== C_STATE_UP
1972 && circuit
->area
->is_type
!= IS_LEVEL_1_AND_2
1973 && circuit
->area
->is_type
!= circ_type
) {
1974 snprintf(args
->errmsg
, args
->errmsg_len
,
1975 "Invalid circuit level for area %s",
1976 circuit
->area
->area_tag
);
1977 return NB_ERR_VALIDATION
;
1984 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
1985 isis_circuit_is_type_set(circuit
, circ_type
);
1993 * XPath: /frr-interface:lib/interface/frr-isisd:isis/ipv4-routing
1995 int lib_interface_isis_ipv4_routing_modify(struct nb_cb_modify_args
*args
)
1998 struct isis_circuit
*circuit
;
2000 if (args
->event
!= NB_EV_APPLY
)
2003 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
2004 ipv4
= yang_dnode_get_bool(args
->dnode
, NULL
);
2005 ipv6
= yang_dnode_get_bool(args
->dnode
, "../ipv6-routing");
2006 isis_circuit_af_set(circuit
, ipv4
, ipv6
);
2012 * XPath: /frr-interface:lib/interface/frr-isisd:isis/ipv6-routing
2014 int lib_interface_isis_ipv6_routing_modify(struct nb_cb_modify_args
*args
)
2017 struct isis_circuit
*circuit
;
2019 if (args
->event
!= NB_EV_APPLY
)
2022 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
2023 ipv4
= yang_dnode_exists(args
->dnode
, "../ipv4-routing");
2024 ipv6
= yang_dnode_get_bool(args
->dnode
, NULL
);
2025 isis_circuit_af_set(circuit
, ipv4
, ipv6
);
2031 * XPath: /frr-interface:lib/interface/frr-isisd:isis/bfd-monitoring
2033 int lib_interface_isis_bfd_monitoring_modify(struct nb_cb_modify_args
*args
)
2035 struct isis_circuit
*circuit
;
2036 bool bfd_monitoring
;
2038 if (args
->event
!= NB_EV_APPLY
)
2041 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
2042 bfd_monitoring
= yang_dnode_get_bool(args
->dnode
, NULL
);
2044 if (bfd_monitoring
) {
2045 isis_bfd_circuit_param_set(circuit
, BFD_DEF_MIN_RX
,
2046 BFD_DEF_MIN_TX
, BFD_DEF_DETECT_MULT
,
2049 isis_bfd_circuit_cmd(circuit
, ZEBRA_BFD_DEST_DEREGISTER
);
2050 bfd_info_free(&circuit
->bfd_info
);
2057 * XPath: /frr-interface:lib/interface/frr-isisd:isis/csnp-interval/level-1
2059 int lib_interface_isis_csnp_interval_level_1_modify(
2060 struct nb_cb_modify_args
*args
)
2062 struct isis_circuit
*circuit
;
2064 if (args
->event
!= NB_EV_APPLY
)
2067 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
2068 circuit
->csnp_interval
[0] = yang_dnode_get_uint16(args
->dnode
, NULL
);
2074 * XPath: /frr-interface:lib/interface/frr-isisd:isis/csnp-interval/level-2
2076 int lib_interface_isis_csnp_interval_level_2_modify(
2077 struct nb_cb_modify_args
*args
)
2079 struct isis_circuit
*circuit
;
2081 if (args
->event
!= NB_EV_APPLY
)
2084 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
2085 circuit
->csnp_interval
[1] = yang_dnode_get_uint16(args
->dnode
, NULL
);
2091 * XPath: /frr-interface:lib/interface/frr-isisd:isis/psnp-interval/level-1
2093 int lib_interface_isis_psnp_interval_level_1_modify(
2094 struct nb_cb_modify_args
*args
)
2096 struct isis_circuit
*circuit
;
2098 if (args
->event
!= NB_EV_APPLY
)
2101 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
2102 circuit
->psnp_interval
[0] = yang_dnode_get_uint16(args
->dnode
, NULL
);
2108 * XPath: /frr-interface:lib/interface/frr-isisd:isis/psnp-interval/level-2
2110 int lib_interface_isis_psnp_interval_level_2_modify(
2111 struct nb_cb_modify_args
*args
)
2113 struct isis_circuit
*circuit
;
2115 if (args
->event
!= NB_EV_APPLY
)
2118 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
2119 circuit
->psnp_interval
[1] = yang_dnode_get_uint16(args
->dnode
, NULL
);
2125 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/padding
2127 int lib_interface_isis_hello_padding_modify(struct nb_cb_modify_args
*args
)
2129 struct isis_circuit
*circuit
;
2131 if (args
->event
!= NB_EV_APPLY
)
2134 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
2135 circuit
->pad_hellos
= yang_dnode_get_bool(args
->dnode
, NULL
);
2141 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/interval/level-1
2143 int lib_interface_isis_hello_interval_level_1_modify(
2144 struct nb_cb_modify_args
*args
)
2146 struct isis_circuit
*circuit
;
2149 if (args
->event
!= NB_EV_APPLY
)
2152 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
2153 interval
= yang_dnode_get_uint32(args
->dnode
, NULL
);
2154 circuit
->hello_interval
[0] = interval
;
2160 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/interval/level-2
2162 int lib_interface_isis_hello_interval_level_2_modify(
2163 struct nb_cb_modify_args
*args
)
2165 struct isis_circuit
*circuit
;
2168 if (args
->event
!= NB_EV_APPLY
)
2171 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
2172 interval
= yang_dnode_get_uint32(args
->dnode
, NULL
);
2173 circuit
->hello_interval
[1] = interval
;
2179 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/multiplier/level-1
2181 int lib_interface_isis_hello_multiplier_level_1_modify(
2182 struct nb_cb_modify_args
*args
)
2184 struct isis_circuit
*circuit
;
2187 if (args
->event
!= NB_EV_APPLY
)
2190 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
2191 multi
= yang_dnode_get_uint16(args
->dnode
, NULL
);
2192 circuit
->hello_multiplier
[0] = multi
;
2198 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/multiplier/level-2
2200 int lib_interface_isis_hello_multiplier_level_2_modify(
2201 struct nb_cb_modify_args
*args
)
2203 struct isis_circuit
*circuit
;
2206 if (args
->event
!= NB_EV_APPLY
)
2209 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
2210 multi
= yang_dnode_get_uint16(args
->dnode
, NULL
);
2211 circuit
->hello_multiplier
[1] = multi
;
2217 * XPath: /frr-interface:lib/interface/frr-isisd:isis/metric/level-1
2219 int lib_interface_isis_metric_level_1_modify(struct nb_cb_modify_args
*args
)
2221 struct isis_circuit
*circuit
;
2224 if (args
->event
!= NB_EV_APPLY
)
2227 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
2228 met
= yang_dnode_get_uint32(args
->dnode
, NULL
);
2229 isis_circuit_metric_set(circuit
, IS_LEVEL_1
, met
);
2235 * XPath: /frr-interface:lib/interface/frr-isisd:isis/metric/level-2
2237 int lib_interface_isis_metric_level_2_modify(struct nb_cb_modify_args
*args
)
2239 struct isis_circuit
*circuit
;
2242 if (args
->event
!= NB_EV_APPLY
)
2245 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
2246 met
= yang_dnode_get_uint32(args
->dnode
, NULL
);
2247 isis_circuit_metric_set(circuit
, IS_LEVEL_2
, met
);
2253 * XPath: /frr-interface:lib/interface/frr-isisd:isis/priority/level-1
2255 int lib_interface_isis_priority_level_1_modify(struct nb_cb_modify_args
*args
)
2257 struct isis_circuit
*circuit
;
2259 if (args
->event
!= NB_EV_APPLY
)
2262 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
2263 circuit
->priority
[0] = yang_dnode_get_uint8(args
->dnode
, NULL
);
2269 * XPath: /frr-interface:lib/interface/frr-isisd:isis/priority/level-2
2271 int lib_interface_isis_priority_level_2_modify(struct nb_cb_modify_args
*args
)
2273 struct isis_circuit
*circuit
;
2275 if (args
->event
!= NB_EV_APPLY
)
2278 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
2279 circuit
->priority
[1] = yang_dnode_get_uint8(args
->dnode
, NULL
);
2285 * XPath: /frr-interface:lib/interface/frr-isisd:isis/network-type
2287 int lib_interface_isis_network_type_modify(struct nb_cb_modify_args
*args
)
2289 struct isis_circuit
*circuit
;
2290 int net_type
= yang_dnode_get_enum(args
->dnode
, NULL
);
2292 switch (args
->event
) {
2293 case NB_EV_VALIDATE
:
2294 circuit
= nb_running_get_entry(args
->dnode
, NULL
, false);
2297 if (circuit
->circ_type
== CIRCUIT_T_LOOPBACK
) {
2299 args
->errmsg
, args
->errmsg_len
,
2300 "Cannot change network type on loopback interface");
2301 return NB_ERR_VALIDATION
;
2303 if (net_type
== CIRCUIT_T_BROADCAST
2304 && circuit
->state
== C_STATE_UP
2305 && !if_is_broadcast(circuit
->interface
)) {
2307 args
->errmsg
, args
->errmsg_len
,
2308 "Cannot configure non-broadcast interface for broadcast operation");
2309 return NB_ERR_VALIDATION
;
2316 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
2317 isis_circuit_circ_type_set(circuit
, net_type
);
2325 * XPath: /frr-interface:lib/interface/frr-isisd:isis/passive
2327 int lib_interface_isis_passive_modify(struct nb_cb_modify_args
*args
)
2329 struct isis_circuit
*circuit
;
2330 struct isis_area
*area
;
2331 struct interface
*ifp
;
2332 bool passive
= yang_dnode_get_bool(args
->dnode
, NULL
);
2334 /* validation only applies if we are setting passive to false */
2335 if (!passive
&& args
->event
== NB_EV_VALIDATE
) {
2336 circuit
= nb_running_get_entry(args
->dnode
, NULL
, false);
2339 ifp
= circuit
->interface
;
2342 if (if_is_loopback(ifp
)) {
2343 snprintf(args
->errmsg
, args
->errmsg_len
,
2344 "Loopback is always passive");
2345 return NB_ERR_VALIDATION
;
2349 if (args
->event
!= NB_EV_APPLY
)
2352 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
2353 if (circuit
->state
!= C_STATE_UP
) {
2354 circuit
->is_passive
= passive
;
2356 area
= circuit
->area
;
2357 isis_csm_state_change(ISIS_DISABLE
, circuit
, area
);
2358 circuit
->is_passive
= passive
;
2359 isis_csm_state_change(ISIS_ENABLE
, circuit
, area
);
2366 * XPath: /frr-interface:lib/interface/frr-isisd:isis/password
2368 int lib_interface_isis_password_create(struct nb_cb_create_args
*args
)
2373 int lib_interface_isis_password_destroy(struct nb_cb_destroy_args
*args
)
2375 struct isis_circuit
*circuit
;
2377 if (args
->event
!= NB_EV_APPLY
)
2380 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
2381 isis_circuit_passwd_unset(circuit
);
2387 * XPath: /frr-interface:lib/interface/frr-isisd:isis/password/password
2389 int lib_interface_isis_password_password_modify(struct nb_cb_modify_args
*args
)
2391 struct isis_circuit
*circuit
;
2392 const char *password
;
2394 if (args
->event
!= NB_EV_APPLY
)
2397 password
= yang_dnode_get_string(args
->dnode
, NULL
);
2398 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
2400 isis_circuit_passwd_set(circuit
, circuit
->passwd
.type
, password
);
2406 * XPath: /frr-interface:lib/interface/frr-isisd:isis/password/password-type
2408 int lib_interface_isis_password_password_type_modify(
2409 struct nb_cb_modify_args
*args
)
2411 struct isis_circuit
*circuit
;
2414 if (args
->event
!= NB_EV_APPLY
)
2417 pass_type
= yang_dnode_get_enum(args
->dnode
, NULL
);
2418 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
2419 circuit
->passwd
.type
= pass_type
;
2426 * /frr-interface:lib/interface/frr-isisd:isis/disable-three-way-handshake
2428 int lib_interface_isis_disable_three_way_handshake_modify(
2429 struct nb_cb_modify_args
*args
)
2431 struct isis_circuit
*circuit
;
2433 if (args
->event
!= NB_EV_APPLY
)
2436 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
2437 circuit
->disable_threeway_adj
= yang_dnode_get_bool(args
->dnode
, NULL
);
2444 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-unicast
2446 static int lib_interface_isis_multi_topology_common(
2447 enum nb_event event
, const struct lyd_node
*dnode
, char *errmsg
,
2448 size_t errmsg_len
, uint16_t mtid
)
2450 struct isis_circuit
*circuit
;
2454 case NB_EV_VALIDATE
:
2455 circuit
= nb_running_get_entry(dnode
, NULL
, false);
2456 if (circuit
&& circuit
->area
&& circuit
->area
->oldmetric
) {
2459 "Multi topology IS-IS can only be used with wide metrics");
2460 return NB_ERR_VALIDATION
;
2467 circuit
= nb_running_get_entry(dnode
, NULL
, true);
2468 value
= yang_dnode_get_bool(dnode
, NULL
);
2469 isis_circuit_mt_enabled_set(circuit
, mtid
, value
);
2476 int lib_interface_isis_multi_topology_ipv4_unicast_modify(
2477 struct nb_cb_modify_args
*args
)
2479 return lib_interface_isis_multi_topology_common(
2480 args
->event
, args
->dnode
, args
->errmsg
, args
->errmsg_len
,
2481 ISIS_MT_IPV4_UNICAST
);
2486 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-multicast
2488 int lib_interface_isis_multi_topology_ipv4_multicast_modify(
2489 struct nb_cb_modify_args
*args
)
2491 return lib_interface_isis_multi_topology_common(
2492 args
->event
, args
->dnode
, args
->errmsg
, args
->errmsg_len
,
2493 ISIS_MT_IPV4_MULTICAST
);
2498 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-management
2500 int lib_interface_isis_multi_topology_ipv4_management_modify(
2501 struct nb_cb_modify_args
*args
)
2503 return lib_interface_isis_multi_topology_common(
2504 args
->event
, args
->dnode
, args
->errmsg
, args
->errmsg_len
,
2510 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-unicast
2512 int lib_interface_isis_multi_topology_ipv6_unicast_modify(
2513 struct nb_cb_modify_args
*args
)
2515 return lib_interface_isis_multi_topology_common(
2516 args
->event
, args
->dnode
, args
->errmsg
, args
->errmsg_len
,
2517 ISIS_MT_IPV6_UNICAST
);
2522 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-multicast
2524 int lib_interface_isis_multi_topology_ipv6_multicast_modify(
2525 struct nb_cb_modify_args
*args
)
2527 return lib_interface_isis_multi_topology_common(
2528 args
->event
, args
->dnode
, args
->errmsg
, args
->errmsg_len
,
2529 ISIS_MT_IPV6_MULTICAST
);
2534 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-management
2536 int lib_interface_isis_multi_topology_ipv6_management_modify(
2537 struct nb_cb_modify_args
*args
)
2539 return lib_interface_isis_multi_topology_common(
2540 args
->event
, args
->dnode
, args
->errmsg
, args
->errmsg_len
,
2545 * XPath: /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-dstsrc
2547 int lib_interface_isis_multi_topology_ipv6_dstsrc_modify(
2548 struct nb_cb_modify_args
*args
)
2550 return lib_interface_isis_multi_topology_common(
2551 args
->event
, args
->dnode
, args
->errmsg
, args
->errmsg_len
,
2552 ISIS_MT_IPV6_DSTSRC
);