1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright (C) 2001,2002 Sampo Saaristo
4 * Tampere University of Technology
5 * Institute of Communications Engineering
6 * Copyright (C) 2018 Volta Networks
13 #include "northbound.h"
19 #include "spf_backoff.h"
20 #include "lib_errors.h"
23 #include "link_state.h"
24 #include "affinitymap.h"
26 #include "isisd/isisd.h"
27 #include "isisd/isis_nb.h"
28 #include "isisd/isis_common.h"
29 #include "isisd/isis_bfd.h"
30 #include "isisd/isis_circuit.h"
31 #include "isisd/isis_lsp.h"
32 #include "isisd/isis_dynhn.h"
33 #include "isisd/isis_misc.h"
34 #include "isisd/isis_csm.h"
35 #include "isisd/isis_adjacency.h"
36 #include "isisd/isis_spf.h"
37 #include "isisd/isis_spf_private.h"
38 #include "isisd/isis_te.h"
39 #include "isisd/isis_mt.h"
40 #include "isisd/isis_redist.h"
41 #include "isisd/isis_ldp_sync.h"
42 #include "isisd/isis_dr.h"
43 #include "isisd/isis_sr.h"
44 #include "isisd/isis_flex_algo.h"
45 #include "isisd/isis_zebra.h"
47 #define AFFINITY_INCLUDE_ANY 0
48 #define AFFINITY_INCLUDE_ALL 1
49 #define AFFINITY_EXCLUDE_ANY 2
52 * XPath: /frr-isisd:isis/instance
54 int isis_instance_create(struct nb_cb_create_args
*args
)
56 struct isis_area
*area
;
60 if (args
->event
!= NB_EV_APPLY
)
62 vrf_name
= yang_dnode_get_string(args
->dnode
, "./vrf");
63 area_tag
= yang_dnode_get_string(args
->dnode
, "./area-tag");
65 area
= isis_area_lookup_by_vrf(area_tag
, vrf_name
);
67 return NB_ERR_INCONSISTENCY
;
69 area
= isis_area_create(area_tag
, vrf_name
);
71 /* save area in dnode to avoid looking it up all the time */
72 nb_running_set_entry(args
->dnode
, area
);
77 int isis_instance_destroy(struct nb_cb_destroy_args
*args
)
79 struct isis_area
*area
;
82 if (args
->event
!= NB_EV_APPLY
)
84 area
= nb_running_unset_entry(args
->dnode
);
86 isis_area_destroy(area
);
88 if (listcount(isis
->area_list
) == 0)
95 * XPath: /frr-isisd:isis/instance/is-type
97 int isis_instance_is_type_modify(struct nb_cb_modify_args
*args
)
99 struct isis_area
*area
;
102 if (args
->event
!= NB_EV_APPLY
)
105 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
106 type
= yang_dnode_get_enum(args
->dnode
, NULL
);
107 isis_area_is_type_set(area
, type
);
113 struct iso_address
*addr
;
117 static int sysid_iter_cb(const struct lyd_node
*dnode
, void *arg
)
119 struct sysid_iter
*iter
= arg
;
120 struct iso_address addr
;
123 net
= yang_dnode_get_string(dnode
, NULL
);
124 addr
.addr_len
= dotformat2buff(addr
.area_addr
, net
);
126 if (memcmp(GETSYSID(iter
->addr
), GETSYSID((&addr
)), ISIS_SYS_ID_LEN
)) {
128 return YANG_ITER_STOP
;
131 return YANG_ITER_CONTINUE
;
135 * XPath: /frr-isisd:isis/instance/area-address
137 int isis_instance_area_address_create(struct nb_cb_create_args
*args
)
139 struct isis_area
*area
;
140 struct iso_address addr
, *addrr
= NULL
, *addrp
= NULL
;
141 struct listnode
*node
;
142 struct sysid_iter iter
;
144 const char *net_title
= yang_dnode_get_string(args
->dnode
, NULL
);
146 switch (args
->event
) {
148 addr
.addr_len
= dotformat2buff(buff
, net_title
);
149 memcpy(addr
.area_addr
, buff
, addr
.addr_len
);
150 if (addr
.area_addr
[addr
.addr_len
- 1] != 0) {
152 args
->errmsg
, args
->errmsg_len
,
153 "nsel byte (last byte) in area address must be 0");
154 return NB_ERR_VALIDATION
;
160 yang_dnode_iterate(sysid_iter_cb
, &iter
, args
->dnode
,
165 args
->errmsg
, args
->errmsg_len
,
166 "System ID must not change when defining additional area addresses");
167 return NB_ERR_VALIDATION
;
171 addrr
= XMALLOC(MTYPE_ISIS_AREA_ADDR
,
172 sizeof(struct iso_address
));
173 addrr
->addr_len
= dotformat2buff(buff
, net_title
);
174 memcpy(addrr
->area_addr
, buff
, addrr
->addr_len
);
175 args
->resource
->ptr
= addrr
;
178 XFREE(MTYPE_ISIS_AREA_ADDR
, args
->resource
->ptr
);
181 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
182 addrr
= args
->resource
->ptr
;
185 if (area
->isis
->sysid_set
== 0) {
187 * First area address - get the SystemID for this router
189 memcpy(area
->isis
->sysid
, GETSYSID(addrr
),
191 area
->isis
->sysid_set
= 1;
193 /* check that we don't already have this address */
194 for (ALL_LIST_ELEMENTS_RO(area
->area_addrs
, node
,
196 if ((addrp
->addr_len
+ ISIS_SYS_ID_LEN
198 != (addrr
->addr_len
))
200 if (!memcmp(addrp
->area_addr
, addrr
->area_addr
,
202 XFREE(MTYPE_ISIS_AREA_ADDR
, addrr
);
203 return NB_OK
; /* silent fail */
208 /*Forget the systemID part of the address */
209 addrr
->addr_len
-= (ISIS_SYS_ID_LEN
+ ISIS_NSEL_LEN
);
210 assert(area
->area_addrs
); /* to silence scan-build sillyness */
211 listnode_add(area
->area_addrs
, addrr
);
213 /* only now we can safely generate our LSPs for this area */
214 if (listcount(area
->area_addrs
) > 0) {
215 if (area
->is_type
& IS_LEVEL_1
)
216 lsp_generate(area
, IS_LEVEL_1
);
217 if (area
->is_type
& IS_LEVEL_2
)
218 lsp_generate(area
, IS_LEVEL_2
);
226 int isis_instance_area_address_destroy(struct nb_cb_destroy_args
*args
)
228 struct iso_address addr
, *addrp
= NULL
;
229 struct listnode
*node
;
231 struct isis_area
*area
;
232 const char *net_title
;
233 struct listnode
*cnode
;
234 struct isis_circuit
*circuit
;
237 if (args
->event
!= NB_EV_APPLY
)
240 net_title
= yang_dnode_get_string(args
->dnode
, NULL
);
241 addr
.addr_len
= dotformat2buff(buff
, net_title
);
242 memcpy(addr
.area_addr
, buff
, (int)addr
.addr_len
);
243 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
245 for (ALL_LIST_ELEMENTS_RO(area
->area_addrs
, node
, addrp
)) {
246 if ((addrp
->addr_len
+ ISIS_SYS_ID_LEN
+ 1) == addr
.addr_len
247 && !memcmp(addrp
->area_addr
, addr
.area_addr
, addr
.addr_len
))
251 return NB_ERR_INCONSISTENCY
;
253 listnode_delete(area
->area_addrs
, addrp
);
254 XFREE(MTYPE_ISIS_AREA_ADDR
, addrp
);
256 * Last area address - reset the SystemID for this router
258 if (listcount(area
->area_addrs
) == 0) {
259 for (ALL_LIST_ELEMENTS_RO(area
->circuit_list
, cnode
, circuit
))
260 for (lvl
= IS_LEVEL_1
; lvl
<= IS_LEVEL_2
; ++lvl
) {
261 if (circuit
->u
.bc
.is_dr
[lvl
- 1])
262 isis_dr_resign(circuit
, lvl
);
264 memset(area
->isis
->sysid
, 0, ISIS_SYS_ID_LEN
);
265 area
->isis
->sysid_set
= 0;
267 zlog_debug("Router has no SystemID");
274 * XPath: /frr-isisd:isis/instance/dynamic-hostname
276 int isis_instance_dynamic_hostname_modify(struct nb_cb_modify_args
*args
)
278 struct isis_area
*area
;
280 if (args
->event
!= NB_EV_APPLY
)
283 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
284 isis_area_dynhostname_set(area
, yang_dnode_get_bool(args
->dnode
, NULL
));
290 * XPath: /frr-isisd:isis/instance/attach-send
292 int isis_instance_attached_send_modify(struct nb_cb_modify_args
*args
)
294 struct isis_area
*area
;
297 if (args
->event
!= NB_EV_APPLY
)
300 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
301 attached
= yang_dnode_get_bool(args
->dnode
, NULL
);
302 isis_area_attached_bit_send_set(area
, attached
);
308 * XPath: /frr-isisd:isis/instance/attach-receive-ignore
310 int isis_instance_attached_receive_modify(struct nb_cb_modify_args
*args
)
312 struct isis_area
*area
;
315 if (args
->event
!= NB_EV_APPLY
)
318 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
319 attached
= yang_dnode_get_bool(args
->dnode
, NULL
);
320 isis_area_attached_bit_receive_set(area
, attached
);
326 * XPath: /frr-isisd:isis/instance/attached
328 int isis_instance_attached_modify(struct nb_cb_modify_args
*args
)
334 * XPath: /frr-isisd:isis/instance/overload/enabled
336 int isis_instance_overload_enabled_modify(struct nb_cb_modify_args
*args
)
338 struct isis_area
*area
;
341 if (args
->event
!= NB_EV_APPLY
)
344 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
345 overload
= yang_dnode_get_bool(args
->dnode
, NULL
);
346 area
->overload_configured
= overload
;
348 isis_area_overload_bit_set(area
, overload
);
354 * XPath: /frr-isisd:isis/instance/overload/on-startup
356 int isis_instance_overload_on_startup_modify(struct nb_cb_modify_args
*args
)
358 struct isis_area
*area
;
359 uint32_t overload_time
;
361 if (args
->event
!= NB_EV_APPLY
)
364 overload_time
= yang_dnode_get_uint32(args
->dnode
, NULL
);
365 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
366 isis_area_overload_on_startup_set(area
, overload_time
);
372 * XPath: /frr-isisd:isis/instance/advertise-high-metrics
374 int isis_instance_advertise_high_metrics_modify(struct nb_cb_modify_args
*args
)
376 struct isis_area
*area
;
377 bool advertise_high_metrics
;
379 if (args
->event
!= NB_EV_APPLY
)
382 advertise_high_metrics
= yang_dnode_get_bool(args
->dnode
, NULL
);
383 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
384 isis_area_advertise_high_metrics_set(area
, advertise_high_metrics
);
390 * XPath: /frr-isisd:isis/instance/metric-style
392 int isis_instance_metric_style_modify(struct nb_cb_modify_args
*args
)
394 struct isis_area
*area
;
395 bool old_metric
, new_metric
;
396 enum isis_metric_style metric_style
=
397 yang_dnode_get_enum(args
->dnode
, NULL
);
399 if (args
->event
!= NB_EV_APPLY
)
402 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
403 old_metric
= (metric_style
== ISIS_WIDE_METRIC
) ? false : true;
404 new_metric
= (metric_style
== ISIS_NARROW_METRIC
) ? false : true;
405 isis_area_metricstyle_set(area
, old_metric
, new_metric
);
411 * XPath: /frr-isisd:isis/instance/purge-originator
413 int isis_instance_purge_originator_modify(struct nb_cb_modify_args
*args
)
415 struct isis_area
*area
;
417 if (args
->event
!= NB_EV_APPLY
)
420 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
421 area
->purge_originator
= yang_dnode_get_bool(args
->dnode
, NULL
);
428 * XPath: /frr-isisd:isis/instance/admin-group-send-zero
430 int isis_instance_admin_group_send_zero_modify(struct nb_cb_modify_args
*args
)
432 struct isis_circuit
*circuit
;
433 struct isis_area
*area
;
434 struct listnode
*node
;
435 struct flex_algo
*fa
;
437 if (args
->event
!= NB_EV_APPLY
)
440 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
441 area
->admin_group_send_zero
= yang_dnode_get_bool(args
->dnode
, NULL
);
443 if (area
->admin_group_send_zero
) {
444 for (ALL_LIST_ELEMENTS_RO(area
->flex_algos
->flex_algos
, node
,
446 admin_group_allow_explicit_zero(
447 &fa
->admin_group_exclude_any
);
448 admin_group_allow_explicit_zero(
449 &fa
->admin_group_include_any
);
450 admin_group_allow_explicit_zero(
451 &fa
->admin_group_include_all
);
454 for (ALL_LIST_ELEMENTS_RO(area
->flex_algos
->flex_algos
, node
,
456 admin_group_disallow_explicit_zero(
457 &fa
->admin_group_exclude_any
);
458 admin_group_disallow_explicit_zero(
459 &fa
->admin_group_include_any
);
460 admin_group_disallow_explicit_zero(
461 &fa
->admin_group_include_all
);
465 for (ALL_LIST_ELEMENTS_RO(area
->circuit_list
, node
, circuit
))
466 isis_link_params_update(circuit
, circuit
->interface
);
468 lsp_regenerate_schedule(area
, IS_LEVEL_1
| IS_LEVEL_2
, 0);
475 * XPath: /frr-isisd:isis/instance/asla-legacy-flag
477 int isis_instance_asla_legacy_flag_modify(struct nb_cb_modify_args
*args
)
479 struct isis_area
*area
;
481 if (args
->event
!= NB_EV_APPLY
)
484 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
485 area
->asla_legacy_flag
= yang_dnode_get_bool(args
->dnode
, NULL
);
486 lsp_regenerate_schedule(area
, IS_LEVEL_1
| IS_LEVEL_2
, 0);
492 * XPath: /frr-isisd:isis/instance/lsp/mtu
494 int isis_instance_lsp_mtu_modify(struct nb_cb_modify_args
*args
)
496 uint16_t lsp_mtu
= yang_dnode_get_uint16(args
->dnode
, NULL
);
497 struct isis_area
*area
;
499 switch (args
->event
) {
505 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
506 isis_area_lsp_mtu_set(area
, lsp_mtu
);
514 * XPath: /frr-isisd:isis/instance/advertise-passive-only
516 int isis_instance_advertise_passive_only_modify(struct nb_cb_modify_args
*args
)
518 struct isis_area
*area
;
519 bool advertise_passive_only
;
521 if (args
->event
!= NB_EV_APPLY
)
524 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
525 advertise_passive_only
= yang_dnode_get_bool(args
->dnode
, NULL
);
526 area
->advertise_passive_only
= advertise_passive_only
;
528 lsp_regenerate_schedule(area
, IS_LEVEL_1
| IS_LEVEL_2
, 1);
534 * XPath: /frr-isisd:isis/instance/lsp/timers/level-1/refresh-interval
536 int isis_instance_lsp_refresh_interval_level_1_modify(
537 struct nb_cb_modify_args
*args
)
539 struct isis_area
*area
;
542 if (args
->event
!= NB_EV_APPLY
)
545 refr_int
= yang_dnode_get_uint16(args
->dnode
, NULL
);
546 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
547 isis_area_lsp_refresh_set(area
, IS_LEVEL_1
, refr_int
);
553 * XPath: /frr-isisd:isis/instance/lsp/timers/level-2/refresh-interval
555 int isis_instance_lsp_refresh_interval_level_2_modify(
556 struct nb_cb_modify_args
*args
)
558 struct isis_area
*area
;
561 if (args
->event
!= NB_EV_APPLY
)
564 refr_int
= yang_dnode_get_uint16(args
->dnode
, NULL
);
565 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
566 isis_area_lsp_refresh_set(area
, IS_LEVEL_2
, refr_int
);
572 * XPath: /frr-isisd:isis/instance/lsp/timers/level-1/maximum-lifetime
574 int isis_instance_lsp_maximum_lifetime_level_1_modify(
575 struct nb_cb_modify_args
*args
)
577 struct isis_area
*area
;
580 if (args
->event
!= NB_EV_APPLY
)
583 max_lt
= yang_dnode_get_uint16(args
->dnode
, NULL
);
584 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
585 isis_area_max_lsp_lifetime_set(area
, IS_LEVEL_1
, max_lt
);
591 * XPath: /frr-isisd:isis/instance/lsp/timers/level-2/maximum-lifetime
593 int isis_instance_lsp_maximum_lifetime_level_2_modify(
594 struct nb_cb_modify_args
*args
)
596 struct isis_area
*area
;
599 if (args
->event
!= NB_EV_APPLY
)
602 max_lt
= yang_dnode_get_uint16(args
->dnode
, NULL
);
603 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
604 isis_area_max_lsp_lifetime_set(area
, IS_LEVEL_2
, max_lt
);
610 * XPath: /frr-isisd:isis/instance/lsp/timers/level-1/generation-interval
612 int isis_instance_lsp_generation_interval_level_1_modify(
613 struct nb_cb_modify_args
*args
)
615 struct isis_area
*area
;
618 if (args
->event
!= NB_EV_APPLY
)
621 gen_int
= yang_dnode_get_uint16(args
->dnode
, NULL
);
622 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
623 area
->lsp_gen_interval
[0] = gen_int
;
629 * XPath: /frr-isisd:isis/instance/lsp/timers/level-2/generation-interval
631 int isis_instance_lsp_generation_interval_level_2_modify(
632 struct nb_cb_modify_args
*args
)
634 struct isis_area
*area
;
637 if (args
->event
!= NB_EV_APPLY
)
640 gen_int
= yang_dnode_get_uint16(args
->dnode
, NULL
);
641 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
642 area
->lsp_gen_interval
[1] = gen_int
;
648 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay
650 void ietf_backoff_delay_apply_finish(struct nb_cb_apply_finish_args
*args
)
652 long init_delay
= yang_dnode_get_uint16(args
->dnode
, "./init-delay");
653 long short_delay
= yang_dnode_get_uint16(args
->dnode
, "./short-delay");
654 long long_delay
= yang_dnode_get_uint16(args
->dnode
, "./long-delay");
655 long holddown
= yang_dnode_get_uint16(args
->dnode
, "./hold-down");
657 yang_dnode_get_uint16(args
->dnode
, "./time-to-learn");
658 struct isis_area
*area
= nb_running_get_entry(args
->dnode
, NULL
, true);
659 size_t bufsiz
= strlen(area
->area_tag
) + sizeof("IS-IS Lx");
660 char *buf
= XCALLOC(MTYPE_TMP
, bufsiz
);
662 snprintf(buf
, bufsiz
, "IS-IS %s L1", area
->area_tag
);
663 spf_backoff_free(area
->spf_delay_ietf
[0]);
664 area
->spf_delay_ietf
[0] =
665 spf_backoff_new(master
, buf
, init_delay
, short_delay
,
666 long_delay
, holddown
, timetolearn
);
668 snprintf(buf
, bufsiz
, "IS-IS %s L2", area
->area_tag
);
669 spf_backoff_free(area
->spf_delay_ietf
[1]);
670 area
->spf_delay_ietf
[1] =
671 spf_backoff_new(master
, buf
, init_delay
, short_delay
,
672 long_delay
, holddown
, timetolearn
);
674 XFREE(MTYPE_TMP
, buf
);
677 int isis_instance_spf_ietf_backoff_delay_create(struct nb_cb_create_args
*args
)
679 /* All the work is done in the apply_finish */
683 int isis_instance_spf_ietf_backoff_delay_destroy(
684 struct nb_cb_destroy_args
*args
)
686 struct isis_area
*area
;
688 if (args
->event
!= NB_EV_APPLY
)
691 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
692 spf_backoff_free(area
->spf_delay_ietf
[0]);
693 spf_backoff_free(area
->spf_delay_ietf
[1]);
694 area
->spf_delay_ietf
[0] = NULL
;
695 area
->spf_delay_ietf
[1] = NULL
;
701 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay/init-delay
703 int isis_instance_spf_ietf_backoff_delay_init_delay_modify(
704 struct nb_cb_modify_args
*args
)
706 /* All the work is done in the apply_finish */
711 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay/short-delay
713 int isis_instance_spf_ietf_backoff_delay_short_delay_modify(
714 struct nb_cb_modify_args
*args
)
716 /* All the work is done in the apply_finish */
721 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay/long-delay
723 int isis_instance_spf_ietf_backoff_delay_long_delay_modify(
724 struct nb_cb_modify_args
*args
)
726 /* All the work is done in the apply_finish */
731 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay/hold-down
733 int isis_instance_spf_ietf_backoff_delay_hold_down_modify(
734 struct nb_cb_modify_args
*args
)
736 /* All the work is done in the apply_finish */
741 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay/time-to-learn
743 int isis_instance_spf_ietf_backoff_delay_time_to_learn_modify(
744 struct nb_cb_modify_args
*args
)
746 /* All the work is done in the apply_finish */
751 * XPath: /frr-isisd:isis/instance/spf/minimum-interval/level-1
753 int isis_instance_spf_minimum_interval_level_1_modify(
754 struct nb_cb_modify_args
*args
)
756 struct isis_area
*area
;
758 if (args
->event
!= NB_EV_APPLY
)
761 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
762 area
->min_spf_interval
[0] = yang_dnode_get_uint16(args
->dnode
, NULL
);
768 * XPath: /frr-isisd:isis/instance/spf/minimum-interval/level-2
770 int isis_instance_spf_minimum_interval_level_2_modify(
771 struct nb_cb_modify_args
*args
)
773 struct isis_area
*area
;
775 if (args
->event
!= NB_EV_APPLY
)
778 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
779 area
->min_spf_interval
[1] = yang_dnode_get_uint16(args
->dnode
, NULL
);
786 * /frr-isisd:isis/instance/spf/prefix-priorities/critical/access-list-name
788 int isis_instance_spf_prefix_priorities_critical_access_list_name_modify(
789 struct nb_cb_modify_args
*args
)
791 struct isis_area
*area
;
792 const char *acl_name
;
793 struct spf_prefix_priority_acl
*ppa
;
795 if (args
->event
!= NB_EV_APPLY
)
798 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
799 acl_name
= yang_dnode_get_string(args
->dnode
, NULL
);
801 ppa
= &area
->spf_prefix_priorities
[SPF_PREFIX_PRIO_CRITICAL
];
802 XFREE(MTYPE_ISIS_ACL_NAME
, ppa
->name
);
803 ppa
->name
= XSTRDUP(MTYPE_ISIS_ACL_NAME
, acl_name
);
804 ppa
->list_v4
= access_list_lookup(AFI_IP
, acl_name
);
805 ppa
->list_v6
= access_list_lookup(AFI_IP6
, acl_name
);
806 lsp_regenerate_schedule(area
, area
->is_type
, 0);
811 int isis_instance_spf_prefix_priorities_critical_access_list_name_destroy(
812 struct nb_cb_destroy_args
*args
)
814 struct isis_area
*area
;
815 struct spf_prefix_priority_acl
*ppa
;
817 if (args
->event
!= NB_EV_APPLY
)
820 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
822 ppa
= &area
->spf_prefix_priorities
[SPF_PREFIX_PRIO_CRITICAL
];
823 XFREE(MTYPE_ISIS_ACL_NAME
, ppa
->name
);
826 lsp_regenerate_schedule(area
, area
->is_type
, 0);
832 * XPath: /frr-isisd:isis/instance/spf/prefix-priorities/high/access-list-name
834 int isis_instance_spf_prefix_priorities_high_access_list_name_modify(
835 struct nb_cb_modify_args
*args
)
837 struct isis_area
*area
;
838 const char *acl_name
;
839 struct spf_prefix_priority_acl
*ppa
;
841 if (args
->event
!= NB_EV_APPLY
)
844 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
845 acl_name
= yang_dnode_get_string(args
->dnode
, NULL
);
847 ppa
= &area
->spf_prefix_priorities
[SPF_PREFIX_PRIO_HIGH
];
848 XFREE(MTYPE_ISIS_ACL_NAME
, ppa
->name
);
849 ppa
->name
= XSTRDUP(MTYPE_ISIS_ACL_NAME
, acl_name
);
850 ppa
->list_v4
= access_list_lookup(AFI_IP
, acl_name
);
851 ppa
->list_v6
= access_list_lookup(AFI_IP6
, acl_name
);
852 lsp_regenerate_schedule(area
, area
->is_type
, 0);
857 int isis_instance_spf_prefix_priorities_high_access_list_name_destroy(
858 struct nb_cb_destroy_args
*args
)
860 struct isis_area
*area
;
861 struct spf_prefix_priority_acl
*ppa
;
863 if (args
->event
!= NB_EV_APPLY
)
866 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
868 ppa
= &area
->spf_prefix_priorities
[SPF_PREFIX_PRIO_HIGH
];
869 XFREE(MTYPE_ISIS_ACL_NAME
, ppa
->name
);
872 lsp_regenerate_schedule(area
, area
->is_type
, 0);
878 * XPath: /frr-isisd:isis/instance/spf/prefix-priorities/medium/access-list-name
880 int isis_instance_spf_prefix_priorities_medium_access_list_name_modify(
881 struct nb_cb_modify_args
*args
)
883 struct isis_area
*area
;
884 const char *acl_name
;
885 struct spf_prefix_priority_acl
*ppa
;
887 if (args
->event
!= NB_EV_APPLY
)
890 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
891 acl_name
= yang_dnode_get_string(args
->dnode
, NULL
);
893 ppa
= &area
->spf_prefix_priorities
[SPF_PREFIX_PRIO_MEDIUM
];
894 XFREE(MTYPE_ISIS_ACL_NAME
, ppa
->name
);
895 ppa
->name
= XSTRDUP(MTYPE_ISIS_ACL_NAME
, acl_name
);
896 ppa
->list_v4
= access_list_lookup(AFI_IP
, acl_name
);
897 ppa
->list_v6
= access_list_lookup(AFI_IP6
, acl_name
);
898 lsp_regenerate_schedule(area
, area
->is_type
, 0);
903 int isis_instance_spf_prefix_priorities_medium_access_list_name_destroy(
904 struct nb_cb_destroy_args
*args
)
906 struct isis_area
*area
;
907 struct spf_prefix_priority_acl
*ppa
;
909 if (args
->event
!= NB_EV_APPLY
)
912 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
914 ppa
= &area
->spf_prefix_priorities
[SPF_PREFIX_PRIO_MEDIUM
];
915 XFREE(MTYPE_ISIS_ACL_NAME
, ppa
->name
);
918 lsp_regenerate_schedule(area
, area
->is_type
, 0);
924 * XPath: /frr-isisd:isis/instance/area-password
926 void area_password_apply_finish(struct nb_cb_apply_finish_args
*args
)
928 const char *password
= yang_dnode_get_string(args
->dnode
, "./password");
929 struct isis_area
*area
= nb_running_get_entry(args
->dnode
, NULL
, true);
930 int pass_type
= yang_dnode_get_enum(args
->dnode
, "./password-type");
932 yang_dnode_get_enum(args
->dnode
, "./authenticate-snp");
935 case ISIS_PASSWD_TYPE_CLEARTXT
:
936 isis_area_passwd_cleartext_set(area
, IS_LEVEL_1
, password
,
939 case ISIS_PASSWD_TYPE_HMAC_MD5
:
940 isis_area_passwd_hmac_md5_set(area
, IS_LEVEL_1
, password
,
946 int isis_instance_area_password_create(struct nb_cb_create_args
*args
)
948 /* actual setting is done in apply_finish */
952 int isis_instance_area_password_destroy(struct nb_cb_destroy_args
*args
)
954 struct isis_area
*area
;
956 if (args
->event
!= NB_EV_APPLY
)
959 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
960 isis_area_passwd_unset(area
, IS_LEVEL_1
);
966 * XPath: /frr-isisd:isis/instance/area-password/password
968 int isis_instance_area_password_password_modify(struct nb_cb_modify_args
*args
)
970 /* actual setting is done in apply_finish */
975 * XPath: /frr-isisd:isis/instance/area-password/password-type
977 int isis_instance_area_password_password_type_modify(
978 struct nb_cb_modify_args
*args
)
980 /* actual setting is done in apply_finish */
985 * XPath: /frr-isisd:isis/instance/area-password/authenticate-snp
987 int isis_instance_area_password_authenticate_snp_modify(
988 struct nb_cb_modify_args
*args
)
990 /* actual setting is done in apply_finish */
995 * XPath: /frr-isisd:isis/instance/domain-password
997 void domain_password_apply_finish(struct nb_cb_apply_finish_args
*args
)
999 const char *password
= yang_dnode_get_string(args
->dnode
, "./password");
1000 struct isis_area
*area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1001 int pass_type
= yang_dnode_get_enum(args
->dnode
, "./password-type");
1003 yang_dnode_get_enum(args
->dnode
, "./authenticate-snp");
1005 switch (pass_type
) {
1006 case ISIS_PASSWD_TYPE_CLEARTXT
:
1007 isis_area_passwd_cleartext_set(area
, IS_LEVEL_2
, password
,
1010 case ISIS_PASSWD_TYPE_HMAC_MD5
:
1011 isis_area_passwd_hmac_md5_set(area
, IS_LEVEL_2
, password
,
1017 int isis_instance_domain_password_create(struct nb_cb_create_args
*args
)
1019 /* actual setting is done in apply_finish */
1023 int isis_instance_domain_password_destroy(struct nb_cb_destroy_args
*args
)
1025 struct isis_area
*area
;
1027 if (args
->event
!= NB_EV_APPLY
)
1030 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1031 isis_area_passwd_unset(area
, IS_LEVEL_2
);
1037 * XPath: /frr-isisd:isis/instance/domain-password/password
1039 int isis_instance_domain_password_password_modify(
1040 struct nb_cb_modify_args
*args
)
1042 /* actual setting is done in apply_finish */
1047 * XPath: /frr-isisd:isis/instance/domain-password/password-type
1049 int isis_instance_domain_password_password_type_modify(
1050 struct nb_cb_modify_args
*args
)
1052 /* actual setting is done in apply_finish */
1057 * XPath: /frr-isisd:isis/instance/domain-password/authenticate-snp
1059 int isis_instance_domain_password_authenticate_snp_modify(
1060 struct nb_cb_modify_args
*args
)
1062 /* actual setting is done in apply_finish */
1067 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv4
1069 void default_info_origin_apply_finish(const struct lyd_node
*dnode
, int family
)
1071 int originate_type
= DEFAULT_ORIGINATE
;
1072 unsigned long metric
= 0;
1073 const char *routemap
= NULL
;
1074 struct isis_area
*area
= nb_running_get_entry(dnode
, NULL
, true);
1075 int level
= yang_dnode_get_enum(dnode
, "./level");
1077 if (yang_dnode_get_bool(dnode
, "./always")) {
1078 originate_type
= DEFAULT_ORIGINATE_ALWAYS
;
1079 } else if (family
== AF_INET6
) {
1081 "%s: Zebra doesn't implement default-originate for IPv6 yet, so use with care or use default-originate always.",
1085 if (yang_dnode_exists(dnode
, "./metric"))
1086 metric
= yang_dnode_get_uint32(dnode
, "./metric");
1087 if (yang_dnode_exists(dnode
, "./route-map"))
1088 routemap
= yang_dnode_get_string(dnode
, "./route-map");
1090 isis_redist_set(area
, level
, family
, DEFAULT_ROUTE
, metric
, routemap
,
1094 void default_info_origin_ipv4_apply_finish(struct nb_cb_apply_finish_args
*args
)
1096 default_info_origin_apply_finish(args
->dnode
, AF_INET
);
1099 void default_info_origin_ipv6_apply_finish(struct nb_cb_apply_finish_args
*args
)
1101 default_info_origin_apply_finish(args
->dnode
, AF_INET6
);
1104 int isis_instance_default_information_originate_ipv4_create(
1105 struct nb_cb_create_args
*args
)
1107 /* It's all done by default_info_origin_apply_finish */
1111 int isis_instance_default_information_originate_ipv4_destroy(
1112 struct nb_cb_destroy_args
*args
)
1114 struct isis_area
*area
;
1117 if (args
->event
!= NB_EV_APPLY
)
1120 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1121 level
= yang_dnode_get_enum(args
->dnode
, "./level");
1122 isis_redist_unset(area
, level
, AF_INET
, DEFAULT_ROUTE
);
1128 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv4/always
1130 int isis_instance_default_information_originate_ipv4_always_modify(
1131 struct nb_cb_modify_args
*args
)
1133 /* It's all done by default_info_origin_apply_finish */
1138 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv4/route-map
1140 int isis_instance_default_information_originate_ipv4_route_map_modify(
1141 struct nb_cb_modify_args
*args
)
1143 /* It's all done by default_info_origin_apply_finish */
1147 int isis_instance_default_information_originate_ipv4_route_map_destroy(
1148 struct nb_cb_destroy_args
*args
)
1150 /* It's all done by default_info_origin_apply_finish */
1155 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv4/metric
1157 int isis_instance_default_information_originate_ipv4_metric_modify(
1158 struct nb_cb_modify_args
*args
)
1160 /* It's all done by default_info_origin_apply_finish */
1165 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv6
1167 int isis_instance_default_information_originate_ipv6_create(
1168 struct nb_cb_create_args
*args
)
1170 /* It's all done by default_info_origin_apply_finish */
1174 int isis_instance_default_information_originate_ipv6_destroy(
1175 struct nb_cb_destroy_args
*args
)
1177 struct isis_area
*area
;
1180 if (args
->event
!= NB_EV_APPLY
)
1183 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1184 level
= yang_dnode_get_enum(args
->dnode
, "./level");
1185 isis_redist_unset(area
, level
, AF_INET6
, DEFAULT_ROUTE
);
1191 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv6/always
1193 int isis_instance_default_information_originate_ipv6_always_modify(
1194 struct nb_cb_modify_args
*args
)
1196 /* It's all done by default_info_origin_apply_finish */
1201 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv6/route-map
1203 int isis_instance_default_information_originate_ipv6_route_map_modify(
1204 struct nb_cb_modify_args
*args
)
1206 /* It's all done by default_info_origin_apply_finish */
1210 int isis_instance_default_information_originate_ipv6_route_map_destroy(
1211 struct nb_cb_destroy_args
*args
)
1213 /* It's all done by default_info_origin_apply_finish */
1218 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv6/metric
1220 int isis_instance_default_information_originate_ipv6_metric_modify(
1221 struct nb_cb_modify_args
*args
)
1223 /* It's all done by default_info_origin_apply_finish */
1228 * XPath: /frr-isisd:isis/instance/redistribute/ipv4
1230 void redistribute_apply_finish(const struct lyd_node
*dnode
, int family
)
1232 assert(family
== AF_INET
|| family
== AF_INET6
);
1234 unsigned long metric
= 0;
1235 const char *routemap
= NULL
;
1236 struct isis_area
*area
;
1238 type
= yang_dnode_get_enum(dnode
, "./protocol");
1239 level
= yang_dnode_get_enum(dnode
, "./level");
1240 area
= nb_running_get_entry(dnode
, NULL
, true);
1242 if (yang_dnode_exists(dnode
, "./metric"))
1243 metric
= yang_dnode_get_uint32(dnode
, "./metric");
1244 if (yang_dnode_exists(dnode
, "./route-map"))
1245 routemap
= yang_dnode_get_string(dnode
, "./route-map");
1247 isis_redist_set(area
, level
, family
, type
, metric
, routemap
, 0);
1250 void redistribute_ipv4_apply_finish(struct nb_cb_apply_finish_args
*args
)
1252 redistribute_apply_finish(args
->dnode
, AF_INET
);
1255 void redistribute_ipv6_apply_finish(struct nb_cb_apply_finish_args
*args
)
1257 redistribute_apply_finish(args
->dnode
, AF_INET6
);
1260 int isis_instance_redistribute_ipv4_create(struct nb_cb_create_args
*args
)
1262 /* It's all done by redistribute_apply_finish */
1266 int isis_instance_redistribute_ipv4_destroy(struct nb_cb_destroy_args
*args
)
1268 struct isis_area
*area
;
1271 if (args
->event
!= NB_EV_APPLY
)
1274 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1275 level
= yang_dnode_get_enum(args
->dnode
, "./level");
1276 type
= yang_dnode_get_enum(args
->dnode
, "./protocol");
1277 isis_redist_unset(area
, level
, AF_INET
, type
);
1283 * XPath: /frr-isisd:isis/instance/redistribute/ipv4/route-map
1285 int isis_instance_redistribute_ipv4_route_map_modify(
1286 struct nb_cb_modify_args
*args
)
1288 /* It's all done by redistribute_apply_finish */
1292 int isis_instance_redistribute_ipv4_route_map_destroy(
1293 struct nb_cb_destroy_args
*args
)
1295 /* It's all done by redistribute_apply_finish */
1300 * XPath: /frr-isisd:isis/instance/redistribute/ipv4/metric
1302 int isis_instance_redistribute_ipv4_metric_modify(
1303 struct nb_cb_modify_args
*args
)
1305 /* It's all done by redistribute_apply_finish */
1310 * XPath: /frr-isisd:isis/instance/redistribute/ipv6
1312 int isis_instance_redistribute_ipv6_create(struct nb_cb_create_args
*args
)
1314 /* It's all done by redistribute_apply_finish */
1318 int isis_instance_redistribute_ipv6_destroy(struct nb_cb_destroy_args
*args
)
1320 struct isis_area
*area
;
1323 if (args
->event
!= NB_EV_APPLY
)
1326 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1327 level
= yang_dnode_get_enum(args
->dnode
, "./level");
1328 type
= yang_dnode_get_enum(args
->dnode
, "./protocol");
1329 isis_redist_unset(area
, level
, AF_INET6
, type
);
1335 * XPath: /frr-isisd:isis/instance/redistribute/ipv6/route-map
1337 int isis_instance_redistribute_ipv6_route_map_modify(
1338 struct nb_cb_modify_args
*args
)
1340 /* It's all done by redistribute_apply_finish */
1344 int isis_instance_redistribute_ipv6_route_map_destroy(
1345 struct nb_cb_destroy_args
*args
)
1347 /* It's all done by redistribute_apply_finish */
1352 * XPath: /frr-isisd:isis/instance/redistribute/ipv6/metric
1354 int isis_instance_redistribute_ipv6_metric_modify(
1355 struct nb_cb_modify_args
*args
)
1357 /* It's all done by redistribute_apply_finish */
1362 * XPath: /frr-isisd:isis/instance/multi-topology/ipv4-multicast
1364 static int isis_multi_topology_common(enum nb_event event
,
1365 const struct lyd_node
*dnode
,
1366 char *errmsg
, size_t errmsg_len
,
1367 const char *topology
, bool create
)
1369 struct isis_area
*area
;
1370 struct isis_area_mt_setting
*setting
;
1371 uint16_t mtid
= isis_str2mtid(topology
);
1374 case NB_EV_VALIDATE
:
1375 if (mtid
== (uint16_t)-1) {
1376 snprintf(errmsg
, errmsg_len
, "Unknown topology %s",
1378 return NB_ERR_VALIDATION
;
1385 area
= nb_running_get_entry(dnode
, NULL
, true);
1386 setting
= area_get_mt_setting(area
, mtid
);
1387 setting
->enabled
= create
;
1388 lsp_regenerate_schedule(area
, IS_LEVEL_1
| IS_LEVEL_2
, 0);
1395 static int isis_multi_topology_overload_common(enum nb_event event
,
1396 const struct lyd_node
*dnode
,
1397 const char *topology
)
1399 struct isis_area
*area
;
1400 struct isis_area_mt_setting
*setting
;
1401 uint16_t mtid
= isis_str2mtid(topology
);
1403 /* validation is done in isis_multi_topology_common */
1404 if (event
!= NB_EV_APPLY
)
1407 area
= nb_running_get_entry(dnode
, NULL
, true);
1408 setting
= area_get_mt_setting(area
, mtid
);
1409 setting
->overload
= yang_dnode_get_bool(dnode
, NULL
);
1410 if (setting
->enabled
)
1411 lsp_regenerate_schedule(area
, IS_LEVEL_1
| IS_LEVEL_2
, 0);
1416 int isis_instance_multi_topology_ipv4_multicast_create(
1417 struct nb_cb_create_args
*args
)
1419 return isis_multi_topology_common(args
->event
, args
->dnode
,
1420 args
->errmsg
, args
->errmsg_len
,
1421 "ipv4-multicast", true);
1424 int isis_instance_multi_topology_ipv4_multicast_destroy(
1425 struct nb_cb_destroy_args
*args
)
1427 return isis_multi_topology_common(args
->event
, args
->dnode
,
1428 args
->errmsg
, args
->errmsg_len
,
1429 "ipv4-multicast", false);
1433 * XPath: /frr-isisd:isis/instance/multi-topology/ipv4-multicast/overload
1435 int isis_instance_multi_topology_ipv4_multicast_overload_modify(
1436 struct nb_cb_modify_args
*args
)
1438 return isis_multi_topology_overload_common(args
->event
, args
->dnode
,
1443 * XPath: /frr-isisd:isis/instance/multi-topology/ipv4-management
1445 int isis_instance_multi_topology_ipv4_management_create(
1446 struct nb_cb_create_args
*args
)
1448 return isis_multi_topology_common(args
->event
, args
->dnode
,
1449 args
->errmsg
, args
->errmsg_len
,
1453 int isis_instance_multi_topology_ipv4_management_destroy(
1454 struct nb_cb_destroy_args
*args
)
1456 return isis_multi_topology_common(args
->event
, args
->dnode
,
1457 args
->errmsg
, args
->errmsg_len
,
1458 "ipv4-mgmt", false);
1462 * XPath: /frr-isisd:isis/instance/multi-topology/ipv4-management/overload
1464 int isis_instance_multi_topology_ipv4_management_overload_modify(
1465 struct nb_cb_modify_args
*args
)
1467 return isis_multi_topology_overload_common(args
->event
, args
->dnode
,
1472 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-unicast
1474 int isis_instance_multi_topology_ipv6_unicast_create(
1475 struct nb_cb_create_args
*args
)
1477 return isis_multi_topology_common(args
->event
, args
->dnode
,
1478 args
->errmsg
, args
->errmsg_len
,
1479 "ipv6-unicast", true);
1482 int isis_instance_multi_topology_ipv6_unicast_destroy(
1483 struct nb_cb_destroy_args
*args
)
1485 return isis_multi_topology_common(args
->event
, args
->dnode
,
1486 args
->errmsg
, args
->errmsg_len
,
1487 "ipv6-unicast", false);
1491 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-unicast/overload
1493 int isis_instance_multi_topology_ipv6_unicast_overload_modify(
1494 struct nb_cb_modify_args
*args
)
1496 return isis_multi_topology_overload_common(args
->event
, args
->dnode
,
1501 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-multicast
1503 int isis_instance_multi_topology_ipv6_multicast_create(
1504 struct nb_cb_create_args
*args
)
1506 return isis_multi_topology_common(args
->event
, args
->dnode
,
1507 args
->errmsg
, args
->errmsg_len
,
1508 "ipv6-multicast", true);
1511 int isis_instance_multi_topology_ipv6_multicast_destroy(
1512 struct nb_cb_destroy_args
*args
)
1514 return isis_multi_topology_common(args
->event
, args
->dnode
,
1515 args
->errmsg
, args
->errmsg_len
,
1516 "ipv6-multicast", false);
1520 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-multicast/overload
1522 int isis_instance_multi_topology_ipv6_multicast_overload_modify(
1523 struct nb_cb_modify_args
*args
)
1525 return isis_multi_topology_overload_common(args
->event
, args
->dnode
,
1530 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-management
1532 int isis_instance_multi_topology_ipv6_management_create(
1533 struct nb_cb_create_args
*args
)
1535 return isis_multi_topology_common(args
->event
, args
->dnode
,
1536 args
->errmsg
, args
->errmsg_len
,
1540 int isis_instance_multi_topology_ipv6_management_destroy(
1541 struct nb_cb_destroy_args
*args
)
1543 return isis_multi_topology_common(args
->event
, args
->dnode
,
1544 args
->errmsg
, args
->errmsg_len
,
1545 "ipv6-mgmt", false);
1549 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-management/overload
1551 int isis_instance_multi_topology_ipv6_management_overload_modify(
1552 struct nb_cb_modify_args
*args
)
1554 return isis_multi_topology_overload_common(args
->event
, args
->dnode
,
1559 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-dstsrc
1561 int isis_instance_multi_topology_ipv6_dstsrc_create(
1562 struct nb_cb_create_args
*args
)
1564 return isis_multi_topology_common(args
->event
, args
->dnode
,
1565 args
->errmsg
, args
->errmsg_len
,
1566 "ipv6-dstsrc", true);
1569 int isis_instance_multi_topology_ipv6_dstsrc_destroy(
1570 struct nb_cb_destroy_args
*args
)
1572 return isis_multi_topology_common(args
->event
, args
->dnode
,
1573 args
->errmsg
, args
->errmsg_len
,
1574 "ipv6-dstsrc", false);
1578 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-dstsrc/overload
1580 int isis_instance_multi_topology_ipv6_dstsrc_overload_modify(
1581 struct nb_cb_modify_args
*args
)
1583 return isis_multi_topology_overload_common(args
->event
, args
->dnode
,
1588 * XPath: /frr-isisd:isis/instance/fast-reroute/level-1/lfa/load-sharing
1590 int isis_instance_fast_reroute_level_1_lfa_load_sharing_modify(
1591 struct nb_cb_modify_args
*args
)
1593 struct isis_area
*area
;
1595 if (args
->event
!= NB_EV_APPLY
)
1598 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1599 area
->lfa_load_sharing
[0] = yang_dnode_get_bool(args
->dnode
, NULL
);
1600 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1606 * XPath: /frr-isisd:isis/instance/fast-reroute/level-1/lfa/priority-limit
1608 int isis_instance_fast_reroute_level_1_lfa_priority_limit_modify(
1609 struct nb_cb_modify_args
*args
)
1611 struct isis_area
*area
;
1613 if (args
->event
!= NB_EV_APPLY
)
1616 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1617 area
->lfa_priority_limit
[0] = yang_dnode_get_enum(args
->dnode
, NULL
);
1618 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1623 int isis_instance_fast_reroute_level_1_lfa_priority_limit_destroy(
1624 struct nb_cb_destroy_args
*args
)
1626 struct isis_area
*area
;
1628 if (args
->event
!= NB_EV_APPLY
)
1631 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1632 area
->lfa_priority_limit
[0] = SPF_PREFIX_PRIO_LOW
;
1633 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1639 * XPath: /frr-isisd:isis/instance/fast-reroute/level-1/lfa/tiebreaker
1641 int isis_instance_fast_reroute_level_1_lfa_tiebreaker_create(
1642 struct nb_cb_create_args
*args
)
1644 struct isis_area
*area
;
1646 enum lfa_tiebreaker_type type
;
1647 struct lfa_tiebreaker
*tie_b
;
1649 if (args
->event
!= NB_EV_APPLY
)
1652 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1653 index
= yang_dnode_get_uint8(args
->dnode
, "./index");
1654 type
= yang_dnode_get_enum(args
->dnode
, "./type");
1656 tie_b
= isis_lfa_tiebreaker_add(area
, ISIS_LEVEL1
, index
, type
);
1657 nb_running_set_entry(args
->dnode
, tie_b
);
1658 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1663 int isis_instance_fast_reroute_level_1_lfa_tiebreaker_destroy(
1664 struct nb_cb_destroy_args
*args
)
1666 struct lfa_tiebreaker
*tie_b
;
1667 struct isis_area
*area
;
1669 if (args
->event
!= NB_EV_APPLY
)
1672 tie_b
= nb_running_unset_entry(args
->dnode
);
1674 isis_lfa_tiebreaker_delete(area
, ISIS_LEVEL1
, tie_b
);
1675 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1681 * XPath: /frr-isisd:isis/instance/fast-reroute/level-1/lfa/tiebreaker/type
1683 int isis_instance_fast_reroute_level_1_lfa_tiebreaker_type_modify(
1684 struct nb_cb_modify_args
*args
)
1686 struct lfa_tiebreaker
*tie_b
;
1687 struct isis_area
*area
;
1689 if (args
->event
!= NB_EV_APPLY
)
1692 tie_b
= nb_running_get_entry(args
->dnode
, NULL
, true);
1694 tie_b
->type
= yang_dnode_get_enum(args
->dnode
, NULL
);
1695 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1701 * XPath: /frr-isisd:isis/instance/fast-reroute/level-1/remote-lfa/prefix-list
1703 int isis_instance_fast_reroute_level_1_remote_lfa_prefix_list_modify(
1704 struct nb_cb_modify_args
*args
)
1706 struct isis_area
*area
;
1707 const char *plist_name
;
1709 if (args
->event
!= NB_EV_APPLY
)
1712 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1713 plist_name
= yang_dnode_get_string(args
->dnode
, NULL
);
1715 area
->rlfa_plist_name
[0] = XSTRDUP(MTYPE_ISIS_PLIST_NAME
, plist_name
);
1716 area
->rlfa_plist
[0] = prefix_list_lookup(AFI_IP
, plist_name
);
1717 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1722 int isis_instance_fast_reroute_level_1_remote_lfa_prefix_list_destroy(
1723 struct nb_cb_destroy_args
*args
)
1725 struct isis_area
*area
;
1727 if (args
->event
!= NB_EV_APPLY
)
1730 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1732 XFREE(MTYPE_ISIS_PLIST_NAME
, area
->rlfa_plist_name
[0]);
1733 area
->rlfa_plist
[0] = NULL
;
1734 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1740 * XPath: /frr-isisd:isis/instance/fast-reroute/level-2/lfa/load-sharing
1742 int isis_instance_fast_reroute_level_2_lfa_load_sharing_modify(
1743 struct nb_cb_modify_args
*args
)
1745 struct isis_area
*area
;
1747 if (args
->event
!= NB_EV_APPLY
)
1750 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1751 area
->lfa_load_sharing
[1] = yang_dnode_get_bool(args
->dnode
, NULL
);
1757 * XPath: /frr-isisd:isis/instance/fast-reroute/level-2/lfa/priority-limit
1759 int isis_instance_fast_reroute_level_2_lfa_priority_limit_modify(
1760 struct nb_cb_modify_args
*args
)
1762 struct isis_area
*area
;
1764 if (args
->event
!= NB_EV_APPLY
)
1767 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1768 area
->lfa_priority_limit
[1] = yang_dnode_get_enum(args
->dnode
, NULL
);
1773 int isis_instance_fast_reroute_level_2_lfa_priority_limit_destroy(
1774 struct nb_cb_destroy_args
*args
)
1776 struct isis_area
*area
;
1778 if (args
->event
!= NB_EV_APPLY
)
1781 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1782 area
->lfa_priority_limit
[1] = SPF_PREFIX_PRIO_LOW
;
1788 * XPath: /frr-isisd:isis/instance/fast-reroute/level-2/lfa/tiebreaker
1790 int isis_instance_fast_reroute_level_2_lfa_tiebreaker_create(
1791 struct nb_cb_create_args
*args
)
1793 struct isis_area
*area
;
1795 enum lfa_tiebreaker_type type
;
1796 struct lfa_tiebreaker
*tie_b
;
1798 if (args
->event
!= NB_EV_APPLY
)
1801 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1802 index
= yang_dnode_get_uint8(args
->dnode
, "./index");
1803 type
= yang_dnode_get_enum(args
->dnode
, "./type");
1805 tie_b
= isis_lfa_tiebreaker_add(area
, ISIS_LEVEL2
, index
, type
);
1806 nb_running_set_entry(args
->dnode
, tie_b
);
1807 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1812 int isis_instance_fast_reroute_level_2_lfa_tiebreaker_destroy(
1813 struct nb_cb_destroy_args
*args
)
1815 struct lfa_tiebreaker
*tie_b
;
1816 struct isis_area
*area
;
1818 if (args
->event
!= NB_EV_APPLY
)
1821 tie_b
= nb_running_unset_entry(args
->dnode
);
1823 isis_lfa_tiebreaker_delete(area
, ISIS_LEVEL2
, tie_b
);
1824 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1830 * XPath: /frr-isisd:isis/instance/fast-reroute/level-2/lfa/tiebreaker/type
1832 int isis_instance_fast_reroute_level_2_lfa_tiebreaker_type_modify(
1833 struct nb_cb_modify_args
*args
)
1835 struct lfa_tiebreaker
*tie_b
;
1836 struct isis_area
*area
;
1838 if (args
->event
!= NB_EV_APPLY
)
1841 tie_b
= nb_running_get_entry(args
->dnode
, NULL
, true);
1843 tie_b
->type
= yang_dnode_get_enum(args
->dnode
, NULL
);
1844 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1850 * XPath: /frr-isisd:isis/instance/fast-reroute/level-2/remote-lfa/prefix-list
1852 int isis_instance_fast_reroute_level_2_remote_lfa_prefix_list_modify(
1853 struct nb_cb_modify_args
*args
)
1855 struct isis_area
*area
;
1856 const char *plist_name
;
1858 if (args
->event
!= NB_EV_APPLY
)
1861 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1862 plist_name
= yang_dnode_get_string(args
->dnode
, NULL
);
1864 area
->rlfa_plist_name
[1] = XSTRDUP(MTYPE_ISIS_PLIST_NAME
, plist_name
);
1865 area
->rlfa_plist
[1] = prefix_list_lookup(AFI_IP
, plist_name
);
1866 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1871 int isis_instance_fast_reroute_level_2_remote_lfa_prefix_list_destroy(
1872 struct nb_cb_destroy_args
*args
)
1874 struct isis_area
*area
;
1876 if (args
->event
!= NB_EV_APPLY
)
1879 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1881 XFREE(MTYPE_ISIS_PLIST_NAME
, area
->rlfa_plist_name
[1]);
1882 area
->rlfa_plist
[1] = NULL
;
1883 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1889 * XPath: /frr-isisd:isis/instance/log-adjacency-changes
1891 int isis_instance_log_adjacency_changes_modify(struct nb_cb_modify_args
*args
)
1893 struct isis_area
*area
;
1894 bool log
= yang_dnode_get_bool(args
->dnode
, NULL
);
1896 if (args
->event
!= NB_EV_APPLY
)
1899 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1900 area
->log_adj_changes
= log
? 1 : 0;
1906 * XPath: /frr-isisd:isis/instance/log-pdu-drops
1908 int isis_instance_log_pdu_drops_modify(struct nb_cb_modify_args
*args
)
1910 struct isis_area
*area
;
1911 bool log
= yang_dnode_get_bool(args
->dnode
, NULL
);
1913 if (args
->event
!= NB_EV_APPLY
)
1916 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1917 area
->log_pdu_drops
= log
? 1 : 0;
1923 * XPath: /frr-isisd:isis/instance/mpls-te
1925 int isis_instance_mpls_te_create(struct nb_cb_create_args
*args
)
1927 struct isis_area
*area
;
1929 if (args
->event
!= NB_EV_APPLY
)
1932 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1933 isis_mpls_te_create(area
);
1935 /* Reoriginate STD_TE & GMPLS circuits */
1936 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1941 int isis_instance_mpls_te_destroy(struct nb_cb_destroy_args
*args
)
1943 struct isis_area
*area
;
1945 if (args
->event
!= NB_EV_APPLY
)
1948 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1949 if (!IS_MPLS_TE(area
->mta
))
1952 isis_mpls_te_disable(area
);
1954 /* Reoriginate STD_TE & GMPLS circuits */
1955 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1957 zlog_debug("ISIS-TE(%s): Disabled MPLS Traffic Engineering",
1964 * XPath: /frr-isisd:isis/instance/mpls-te/router-address
1966 int isis_instance_mpls_te_router_address_modify(struct nb_cb_modify_args
*args
)
1968 struct in_addr value
;
1969 struct isis_area
*area
;
1971 if (args
->event
!= NB_EV_APPLY
)
1974 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1975 /* only proceed if MPLS-TE is enabled */
1976 if (!IS_MPLS_TE(area
->mta
))
1979 /* Update Area Router ID */
1980 yang_dnode_get_ipv4(&value
, args
->dnode
, NULL
);
1981 area
->mta
->router_id
.s_addr
= value
.s_addr
;
1983 /* And re-schedule LSP update */
1984 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1989 int isis_instance_mpls_te_router_address_destroy(
1990 struct nb_cb_destroy_args
*args
)
1992 struct isis_area
*area
;
1994 if (args
->event
!= NB_EV_APPLY
)
1997 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1998 /* only proceed if MPLS-TE is enabled */
1999 if (!IS_MPLS_TE(area
->mta
))
2002 /* Reset Area Router ID */
2003 area
->mta
->router_id
.s_addr
= INADDR_ANY
;
2005 /* And re-schedule LSP update */
2006 lsp_regenerate_schedule(area
, area
->is_type
, 0);
2012 * XPath: /frr-isisd:isis/instance/mpls-te/router-address-v6
2014 int isis_instance_mpls_te_router_address_ipv6_modify(
2015 struct nb_cb_modify_args
*args
)
2017 struct in6_addr value
;
2018 struct isis_area
*area
;
2020 if (args
->event
!= NB_EV_APPLY
)
2023 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
2024 /* only proceed if MPLS-TE is enabled */
2025 if (!IS_MPLS_TE(area
->mta
))
2028 yang_dnode_get_ipv6(&value
, args
->dnode
, NULL
);
2029 /* Update Area IPv6 Router ID if different */
2030 if (!IPV6_ADDR_SAME(&area
->mta
->router_id_ipv6
, &value
)) {
2031 IPV6_ADDR_COPY(&area
->mta
->router_id_ipv6
, &value
);
2033 /* And re-schedule LSP update */
2034 lsp_regenerate_schedule(area
, area
->is_type
, 0);
2040 int isis_instance_mpls_te_router_address_ipv6_destroy(
2041 struct nb_cb_destroy_args
*args
)
2043 struct isis_area
*area
;
2045 if (args
->event
!= NB_EV_APPLY
)
2048 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
2049 /* only proceed if MPLS-TE is enabled */
2050 if (!IS_MPLS_TE(area
->mta
))
2053 /* Reset Area Router ID */
2054 IPV6_ADDR_COPY(&area
->mta
->router_id_ipv6
, &in6addr_any
);
2056 /* And re-schedule LSP update */
2057 lsp_regenerate_schedule(area
, area
->is_type
, 0);
2063 * XPath: /frr-isisd:isis/instance/mpls-te/export
2065 int isis_instance_mpls_te_export_modify(struct nb_cb_modify_args
*args
)
2067 struct isis_area
*area
;
2069 if (args
->event
!= NB_EV_APPLY
)
2072 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
2073 /* only proceed if MPLS-TE is enabled */
2074 if (!IS_MPLS_TE(area
->mta
))
2077 area
->mta
->export
= yang_dnode_get_bool(args
->dnode
, NULL
);
2078 if (area
->mta
->export
) {
2079 if (IS_DEBUG_EVENTS
)
2080 zlog_debug("MPLS-TE: Enabled Link State export");
2081 if (isis_zebra_ls_register(true) != 0)
2082 zlog_warn("Unable to register Link State");
2084 if (IS_DEBUG_EVENTS
)
2085 zlog_debug("MPLS-TE: Disable Link State export");
2086 if (isis_zebra_ls_register(false) != 0)
2087 zlog_warn("Unable to register Link State");
2094 * XPath: /frr-isisd:isis/instance/segment-routing/enabled
2096 int isis_instance_segment_routing_enabled_modify(
2097 struct nb_cb_modify_args
*args
)
2099 struct isis_area
*area
;
2101 if (args
->event
!= NB_EV_APPLY
)
2104 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
2105 area
->srdb
.config
.enabled
= yang_dnode_get_bool(args
->dnode
, NULL
);
2107 if (area
->srdb
.config
.enabled
) {
2108 if (IS_DEBUG_EVENTS
)
2109 zlog_debug("SR: Segment Routing: OFF -> ON");
2111 isis_sr_start(area
);
2113 if (IS_DEBUG_EVENTS
)
2114 zlog_debug("SR: Segment Routing: ON -> OFF");
2123 * XPath: /frr-isisd:isis/instance/segment-routing/label-blocks
2125 int isis_instance_segment_routing_label_blocks_pre_validate(
2126 struct nb_cb_pre_validate_args
*args
)
2128 uint32_t srgb_lbound
;
2129 uint32_t srgb_ubound
;
2130 uint32_t srlb_lbound
;
2131 uint32_t srlb_ubound
;
2133 srgb_lbound
= yang_dnode_get_uint32(args
->dnode
, "./srgb/lower-bound");
2134 srgb_ubound
= yang_dnode_get_uint32(args
->dnode
, "./srgb/upper-bound");
2135 srlb_lbound
= yang_dnode_get_uint32(args
->dnode
, "./srlb/lower-bound");
2136 srlb_ubound
= yang_dnode_get_uint32(args
->dnode
, "./srlb/upper-bound");
2138 /* Check that the block size does not exceed 65535 */
2139 if ((srgb_ubound
- srgb_lbound
+ 1) > 65535) {
2141 args
->errmsg
, args
->errmsg_len
,
2142 "New SR Global Block (%u/%u) exceed the limit of 65535",
2143 srgb_lbound
, srgb_ubound
);
2144 return NB_ERR_VALIDATION
;
2146 if ((srlb_ubound
- srlb_lbound
+ 1) > 65535) {
2147 snprintf(args
->errmsg
, args
->errmsg_len
,
2148 "New SR Local Block (%u/%u) exceed the limit of 65535",
2149 srlb_lbound
, srlb_ubound
);
2150 return NB_ERR_VALIDATION
;
2153 /* Validate SRGB against SRLB */
2154 if (!((srgb_ubound
< srlb_lbound
) || (srgb_lbound
> srlb_ubound
))) {
2156 args
->errmsg
, args
->errmsg_len
,
2157 "SR Global Block (%u/%u) conflicts with Local Block (%u/%u)",
2158 srgb_lbound
, srgb_ubound
, srlb_lbound
, srlb_ubound
);
2159 return NB_ERR_VALIDATION
;
2166 * XPath: /frr-isisd:isis/instance/segment-routing/label-blocks/srgb
2169 void isis_instance_segment_routing_srgb_apply_finish(
2170 struct nb_cb_apply_finish_args
*args
)
2172 struct isis_area
*area
;
2173 uint32_t lower_bound
, upper_bound
;
2175 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
2176 lower_bound
= yang_dnode_get_uint32(args
->dnode
, "./lower-bound");
2177 upper_bound
= yang_dnode_get_uint32(args
->dnode
, "./upper-bound");
2179 isis_sr_cfg_srgb_update(area
, lower_bound
, upper_bound
);
2183 * XPath: /frr-isisd:isis/instance/segment-routing/label-blocks/srgb/lower-bound
2185 int isis_instance_segment_routing_srgb_lower_bound_modify(
2186 struct nb_cb_modify_args
*args
)
2188 uint32_t lower_bound
= yang_dnode_get_uint32(args
->dnode
, NULL
);
2190 switch (args
->event
) {
2191 case NB_EV_VALIDATE
:
2192 if (!IS_MPLS_UNRESERVED_LABEL(lower_bound
)) {
2193 snprintf(args
->errmsg
, args
->errmsg_len
,
2194 "Invalid SRGB lower bound: %u", lower_bound
);
2195 return NB_ERR_VALIDATION
;
2208 * XPath: /frr-isisd:isis/instance/segment-routing/label-blocks/srgb/upper-bound
2210 int isis_instance_segment_routing_srgb_upper_bound_modify(
2211 struct nb_cb_modify_args
*args
)
2213 uint32_t upper_bound
= yang_dnode_get_uint32(args
->dnode
, NULL
);
2215 switch (args
->event
) {
2216 case NB_EV_VALIDATE
:
2217 if (!IS_MPLS_UNRESERVED_LABEL(upper_bound
)) {
2218 snprintf(args
->errmsg
, args
->errmsg_len
,
2219 "Invalid SRGB upper bound: %u", upper_bound
);
2220 return NB_ERR_VALIDATION
;
2233 * XPath: /frr-isisd:isis/instance/segment-routing/label-blocks/srlb
2235 void isis_instance_segment_routing_srlb_apply_finish(
2236 struct nb_cb_apply_finish_args
*args
)
2238 struct isis_area
*area
;
2239 uint32_t lower_bound
, upper_bound
;
2241 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
2242 lower_bound
= yang_dnode_get_uint32(args
->dnode
, "./lower-bound");
2243 upper_bound
= yang_dnode_get_uint32(args
->dnode
, "./upper-bound");
2245 isis_sr_cfg_srlb_update(area
, lower_bound
, upper_bound
);
2249 * XPath: /frr-isisd:isis/instance/segment-routing/label-blocks/srlb/lower-bound
2251 int isis_instance_segment_routing_srlb_lower_bound_modify(
2252 struct nb_cb_modify_args
*args
)
2254 uint32_t lower_bound
= yang_dnode_get_uint32(args
->dnode
, NULL
);
2256 switch (args
->event
) {
2257 case NB_EV_VALIDATE
:
2258 if (!IS_MPLS_UNRESERVED_LABEL(lower_bound
)) {
2259 snprintf(args
->errmsg
, args
->errmsg_len
,
2260 "Invalid SRLB lower bound: %u", lower_bound
);
2261 return NB_ERR_VALIDATION
;
2274 * XPath: /frr-isisd:isis/instance/segment-routing/label-blocks/srlb/upper-bound
2276 int isis_instance_segment_routing_srlb_upper_bound_modify(
2277 struct nb_cb_modify_args
*args
)
2279 uint32_t upper_bound
= yang_dnode_get_uint32(args
->dnode
, NULL
);
2281 switch (args
->event
) {
2282 case NB_EV_VALIDATE
:
2283 if (!IS_MPLS_UNRESERVED_LABEL(upper_bound
)) {
2284 snprintf(args
->errmsg
, args
->errmsg_len
,
2285 "Invalid SRLB upper bound: %u", upper_bound
);
2286 return NB_ERR_VALIDATION
;
2299 * XPath: /frr-isisd:isis/instance/segment-routing/msd/node-msd
2301 int isis_instance_segment_routing_msd_node_msd_modify(
2302 struct nb_cb_modify_args
*args
)
2304 struct isis_area
*area
;
2306 if (args
->event
!= NB_EV_APPLY
)
2309 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
2310 area
->srdb
.config
.msd
= yang_dnode_get_uint8(args
->dnode
, NULL
);
2312 /* Update and regenerate LSP */
2313 lsp_regenerate_schedule(area
, area
->is_type
, 0);
2318 int isis_instance_segment_routing_msd_node_msd_destroy(
2319 struct nb_cb_destroy_args
*args
)
2321 struct isis_area
*area
;
2323 if (args
->event
!= NB_EV_APPLY
)
2326 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
2327 area
->srdb
.config
.msd
= 0;
2329 /* Update and regenerate LSP */
2330 lsp_regenerate_schedule(area
, area
->is_type
, 0);
2336 * XPath: /frr-isisd:isis/instance/segment-routing/prefix-sid-map/prefix-sid
2338 int isis_instance_segment_routing_prefix_sid_map_prefix_sid_create(
2339 struct nb_cb_create_args
*args
)
2341 struct isis_area
*area
;
2342 struct prefix prefix
;
2343 struct sr_prefix_cfg
*pcfg
;
2345 if (args
->event
!= NB_EV_APPLY
)
2348 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
2349 yang_dnode_get_prefix(&prefix
, args
->dnode
, "./prefix");
2351 pcfg
= isis_sr_cfg_prefix_add(area
, &prefix
, SR_ALGORITHM_SPF
);
2352 nb_running_set_entry(args
->dnode
, pcfg
);
2357 int isis_instance_segment_routing_prefix_sid_map_prefix_sid_destroy(
2358 struct nb_cb_destroy_args
*args
)
2360 struct sr_prefix_cfg
*pcfg
;
2361 struct isis_area
*area
;
2363 if (args
->event
!= NB_EV_APPLY
)
2366 pcfg
= nb_running_unset_entry(args
->dnode
);
2368 isis_sr_cfg_prefix_del(pcfg
);
2369 lsp_regenerate_schedule(area
, area
->is_type
, 0);
2374 int isis_instance_segment_routing_prefix_sid_map_prefix_sid_pre_validate(
2375 struct nb_cb_pre_validate_args
*args
)
2377 const struct lyd_node
*area_dnode
;
2378 struct isis_area
*area
;
2379 struct prefix prefix
;
2380 uint32_t srgb_lbound
;
2381 uint32_t srgb_ubound
;
2382 uint32_t srgb_range
;
2384 enum sr_sid_value_type sid_type
;
2385 struct isis_prefix_sid psid
= {};
2387 yang_dnode_get_prefix(&prefix
, args
->dnode
, "./prefix");
2388 srgb_lbound
= yang_dnode_get_uint32(
2389 args
->dnode
, "../../label-blocks/srgb/lower-bound");
2390 srgb_ubound
= yang_dnode_get_uint32(
2391 args
->dnode
, "../../label-blocks/srgb/upper-bound");
2392 sid
= yang_dnode_get_uint32(args
->dnode
, "./sid-value");
2393 sid_type
= yang_dnode_get_enum(args
->dnode
, "./sid-value-type");
2395 /* Check for invalid indexes/labels. */
2396 srgb_range
= srgb_ubound
- srgb_lbound
+ 1;
2399 case SR_SID_VALUE_TYPE_INDEX
:
2400 if (sid
>= srgb_range
) {
2401 snprintf(args
->errmsg
, args
->errmsg_len
,
2402 "SID index %u falls outside local SRGB range",
2404 return NB_ERR_VALIDATION
;
2407 case SR_SID_VALUE_TYPE_ABSOLUTE
:
2408 if (!IS_MPLS_UNRESERVED_LABEL(sid
)) {
2409 snprintf(args
->errmsg
, args
->errmsg_len
,
2410 "Invalid absolute SID %u", sid
);
2411 return NB_ERR_VALIDATION
;
2413 SET_FLAG(psid
.flags
, ISIS_PREFIX_SID_VALUE
);
2414 SET_FLAG(psid
.flags
, ISIS_PREFIX_SID_LOCAL
);
2418 /* Check for Prefix-SID collisions. */
2419 area_dnode
= yang_dnode_get_parent(args
->dnode
, "instance");
2420 area
= nb_running_get_entry(area_dnode
, NULL
, false);
2422 for (int tree
= SPFTREE_IPV4
; tree
< SPFTREE_COUNT
; tree
++) {
2423 for (int level
= ISIS_LEVEL1
; level
<= ISIS_LEVEL2
;
2425 struct isis_spftree
*spftree
;
2426 struct isis_vertex
*vertex_psid
;
2428 if (!(area
->is_type
& level
))
2430 spftree
= area
->spftree
[tree
][level
- 1];
2434 vertex_psid
= isis_spf_prefix_sid_lookup(
2437 && !prefix_same(&vertex_psid
->N
.ip
.p
.dest
,
2440 args
->errmsg
, args
->errmsg_len
,
2441 "Prefix-SID collision detected, SID %s %u is already in use by prefix %pFX (L%u)",
2444 ISIS_PREFIX_SID_VALUE
)
2448 &vertex_psid
->N
.ip
.p
.dest
,
2450 return NB_ERR_VALIDATION
;
2459 void isis_instance_segment_routing_prefix_sid_map_prefix_sid_apply_finish(
2460 struct nb_cb_apply_finish_args
*args
)
2462 struct sr_prefix_cfg
*pcfg
;
2463 struct isis_area
*area
;
2465 pcfg
= nb_running_get_entry(args
->dnode
, NULL
, true);
2467 lsp_regenerate_schedule(area
, area
->is_type
, 0);
2472 * /frr-isisd:isis/instance/segment-routing/prefix-sid-map/prefix-sid/sid-value-type
2474 int isis_instance_segment_routing_prefix_sid_map_prefix_sid_sid_value_type_modify(
2475 struct nb_cb_modify_args
*args
)
2477 struct sr_prefix_cfg
*pcfg
;
2479 if (args
->event
!= NB_EV_APPLY
)
2482 pcfg
= nb_running_get_entry(args
->dnode
, NULL
, true);
2483 pcfg
->sid_type
= yang_dnode_get_enum(args
->dnode
, NULL
);
2490 * /frr-isisd:isis/instance/segment-routing/prefix-sid-map/prefix-sid/sid-value
2492 int isis_instance_segment_routing_prefix_sid_map_prefix_sid_sid_value_modify(
2493 struct nb_cb_modify_args
*args
)
2495 struct sr_prefix_cfg
*pcfg
;
2497 if (args
->event
!= NB_EV_APPLY
)
2500 pcfg
= nb_running_get_entry(args
->dnode
, NULL
, true);
2501 pcfg
->sid
= yang_dnode_get_uint32(args
->dnode
, NULL
);
2508 * /frr-isisd:isis/instance/segment-routing/prefix-sid-map/prefix-sid/last-hop-behavior
2510 int isis_instance_segment_routing_prefix_sid_map_prefix_sid_last_hop_behavior_modify(
2511 struct nb_cb_modify_args
*args
)
2513 struct sr_prefix_cfg
*pcfg
;
2515 if (args
->event
!= NB_EV_APPLY
)
2518 pcfg
= nb_running_get_entry(args
->dnode
, NULL
, true);
2519 pcfg
->last_hop_behavior
= yang_dnode_get_enum(args
->dnode
, NULL
);
2525 * XPath: /frr-isisd:isis/instance/segment-routing/prefix-sid-map/prefix-sid/n-flag-clear
2527 int isis_instance_segment_routing_prefix_sid_map_prefix_sid_n_flag_clear_modify(
2528 struct nb_cb_modify_args
*args
)
2530 struct sr_prefix_cfg
*pcfg
;
2532 if (args
->event
!= NB_EV_APPLY
)
2535 pcfg
= nb_running_get_entry(args
->dnode
, NULL
, true);
2536 pcfg
->n_flag_clear
= yang_dnode_get_bool(args
->dnode
, NULL
);
2543 * /frr-isisd:isis/instance/segment-routing/algorithm-prefix-sids/algorithm-prefix-sid
2545 int isis_instance_segment_routing_algorithm_prefix_sid_create(
2546 struct nb_cb_create_args
*args
)
2548 struct isis_area
*area
;
2549 struct prefix prefix
;
2550 struct sr_prefix_cfg
*pcfg
;
2553 if (args
->event
!= NB_EV_APPLY
)
2556 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
2557 yang_dnode_get_prefix(&prefix
, args
->dnode
, "./prefix");
2558 algorithm
= yang_dnode_get_uint32(args
->dnode
, "./algo");
2560 pcfg
= isis_sr_cfg_prefix_add(area
, &prefix
, algorithm
);
2561 pcfg
->algorithm
= algorithm
;
2562 nb_running_set_entry(args
->dnode
, pcfg
);
2567 int isis_instance_segment_routing_algorithm_prefix_sid_destroy(
2568 struct nb_cb_destroy_args
*args
)
2570 struct sr_prefix_cfg
*pcfg
;
2571 struct isis_area
*area
;
2573 if (args
->event
!= NB_EV_APPLY
)
2576 pcfg
= nb_running_unset_entry(args
->dnode
);
2578 isis_sr_cfg_prefix_del(pcfg
);
2579 lsp_regenerate_schedule(area
, area
->is_type
, 0);
2584 int isis_instance_segment_routing_algorithm_prefix_sid_pre_validate(
2585 struct nb_cb_pre_validate_args
*args
)
2587 const struct lyd_node
*area_dnode
;
2588 struct isis_area
*area
;
2589 struct prefix prefix
;
2590 uint32_t srgb_lbound
;
2591 uint32_t srgb_ubound
;
2592 uint32_t srgb_range
;
2594 enum sr_sid_value_type sid_type
;
2595 struct isis_prefix_sid psid
= {};
2597 yang_dnode_get_prefix(&prefix
, args
->dnode
, "./prefix");
2598 srgb_lbound
= yang_dnode_get_uint32(
2599 args
->dnode
, "../../label-blocks/srgb/lower-bound");
2600 srgb_ubound
= yang_dnode_get_uint32(
2601 args
->dnode
, "../../label-blocks/srgb/upper-bound");
2602 sid
= yang_dnode_get_uint32(args
->dnode
, "./sid-value");
2603 sid_type
= yang_dnode_get_enum(args
->dnode
, "./sid-value-type");
2605 /* Check for invalid indexes/labels. */
2606 srgb_range
= srgb_ubound
- srgb_lbound
+ 1;
2609 case SR_SID_VALUE_TYPE_INDEX
:
2610 if (sid
>= srgb_range
) {
2611 snprintf(args
->errmsg
, args
->errmsg_len
,
2612 "SID index %u falls outside local SRGB range",
2614 return NB_ERR_VALIDATION
;
2617 case SR_SID_VALUE_TYPE_ABSOLUTE
:
2618 if (!IS_MPLS_UNRESERVED_LABEL(sid
)) {
2619 snprintf(args
->errmsg
, args
->errmsg_len
,
2620 "Invalid absolute SID %u", sid
);
2621 return NB_ERR_VALIDATION
;
2623 SET_FLAG(psid
.flags
, ISIS_PREFIX_SID_VALUE
);
2624 SET_FLAG(psid
.flags
, ISIS_PREFIX_SID_LOCAL
);
2628 /* Check for Prefix-SID collisions. */
2629 area_dnode
= yang_dnode_get_parent(args
->dnode
, "instance");
2630 area
= nb_running_get_entry(area_dnode
, NULL
, false);
2634 for (int tree
= SPFTREE_IPV4
; tree
< SPFTREE_COUNT
; tree
++) {
2635 for (int level
= ISIS_LEVEL1
; level
<= ISIS_LEVEL2
; level
++) {
2636 struct isis_spftree
*spftree
;
2637 struct isis_vertex
*vertex_psid
;
2639 if (!(area
->is_type
& level
))
2641 spftree
= area
->spftree
[tree
][level
- 1];
2646 isis_spf_prefix_sid_lookup(spftree
, &psid
);
2648 !prefix_same(&vertex_psid
->N
.ip
.p
.dest
, &prefix
)) {
2650 args
->errmsg
, args
->errmsg_len
,
2651 "Prefix-SID collision detected, SID %s %u is already in use by prefix %pFX (L%u)",
2652 CHECK_FLAG(psid
.flags
,
2653 ISIS_PREFIX_SID_VALUE
)
2656 psid
.value
, &vertex_psid
->N
.ip
.p
.dest
,
2658 return NB_ERR_VALIDATION
;
2666 void isis_instance_segment_routing_algorithm_prefix_sid_apply_finish(
2667 struct nb_cb_apply_finish_args
*args
)
2669 struct sr_prefix_cfg
*pcfg
;
2670 struct isis_area
*area
;
2672 pcfg
= nb_running_get_entry(args
->dnode
, NULL
, true);
2674 lsp_regenerate_schedule(area
, area
->is_type
, 0);
2679 * /frr-isisd:isis/instance/segment-routing/algorithm-prefix-sids/algorithm-prefix-sid/sid-value-type
2681 int isis_instance_segment_routing_algorithm_prefix_sid_sid_value_type_modify(
2682 struct nb_cb_modify_args
*args
)
2684 struct sr_prefix_cfg
*pcfg
;
2686 if (args
->event
!= NB_EV_APPLY
)
2689 pcfg
= nb_running_get_entry(args
->dnode
, NULL
, true);
2690 pcfg
->sid_type
= yang_dnode_get_enum(args
->dnode
, NULL
);
2697 * /frr-isisd:isis/instance/segment-routing/algorithm-prefix-sids/algorithm-prefix-sid/sid-value
2699 int isis_instance_segment_routing_algorithm_prefix_sid_sid_value_modify(
2700 struct nb_cb_modify_args
*args
)
2702 struct sr_prefix_cfg
*pcfg
;
2704 if (args
->event
!= NB_EV_APPLY
)
2707 pcfg
= nb_running_get_entry(args
->dnode
, NULL
, true);
2708 pcfg
->sid
= yang_dnode_get_uint32(args
->dnode
, NULL
);
2715 * /frr-isisd:isis/instance/segment-routing/algorithm-prefix-sid-map/algorithm-prefix-sid/last-hop-behavior
2717 int isis_instance_segment_routing_algorithm_prefix_sid_last_hop_behavior_modify(
2718 struct nb_cb_modify_args
*args
)
2720 struct sr_prefix_cfg
*pcfg
;
2722 if (args
->event
!= NB_EV_APPLY
)
2725 pcfg
= nb_running_get_entry(args
->dnode
, NULL
, true);
2726 pcfg
->last_hop_behavior
= yang_dnode_get_enum(args
->dnode
, NULL
);
2733 * /frr-isisd:isis/instance/segment-routing/algorithm-prefix-sids/algorithm-prefix-sid/n-flag-clear
2735 int isis_instance_segment_routing_algorithm_prefix_sid_n_flag_clear_modify(
2736 struct nb_cb_modify_args
*args
)
2738 struct sr_prefix_cfg
*pcfg
;
2740 if (args
->event
!= NB_EV_APPLY
)
2743 pcfg
= nb_running_get_entry(args
->dnode
, NULL
, true);
2744 pcfg
->n_flag_clear
= yang_dnode_get_bool(args
->dnode
, NULL
);
2750 * XPath: /frr-isisd:isis/instance/flex-algos/flex-algo
2752 int isis_instance_flex_algo_create(struct nb_cb_create_args
*args
)
2754 struct isis_area
*area
;
2755 struct flex_algo
*fa
;
2758 uint32_t priority
= FLEX_ALGO_PRIO_DEFAULT
;
2759 struct isis_flex_algo_alloc_arg arg
;
2761 algorithm
= yang_dnode_get_uint32(args
->dnode
, "./flex-algo");
2762 advertise
= yang_dnode_exists(args
->dnode
, "./advertise-definition");
2764 switch (args
->event
) {
2766 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
2767 arg
.algorithm
= algorithm
;
2769 fa
= flex_algo_alloc(area
->flex_algos
, algorithm
, &arg
);
2770 fa
->priority
= priority
;
2771 fa
->advertise_definition
= advertise
;
2772 if (area
->admin_group_send_zero
) {
2773 admin_group_allow_explicit_zero(
2774 &fa
->admin_group_exclude_any
);
2775 admin_group_allow_explicit_zero(
2776 &fa
->admin_group_include_any
);
2777 admin_group_allow_explicit_zero(
2778 &fa
->admin_group_include_all
);
2780 lsp_regenerate_schedule(area
, area
->is_type
, 0);
2782 case NB_EV_VALIDATE
:
2791 int isis_instance_flex_algo_destroy(struct nb_cb_destroy_args
*args
)
2793 struct isis_area
*area
;
2796 algorithm
= yang_dnode_get_uint32(args
->dnode
, "./flex-algo");
2797 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
2799 switch (args
->event
) {
2801 flex_algo_delete(area
->flex_algos
, algorithm
);
2802 lsp_regenerate_schedule(area
, area
->is_type
, 0);
2804 case NB_EV_VALIDATE
:
2814 * XPath: /frr-isisd:isis/instance/flex-algos/flex-algo/advertise-definition
2816 int isis_instance_flex_algo_advertise_definition_modify(
2817 struct nb_cb_modify_args
*args
)
2819 struct isis_area
*area
;
2820 struct flex_algo
*fa
;
2825 algorithm
= yang_dnode_get_uint32(args
->dnode
, "./../flex-algo");
2826 advertise
= yang_dnode_exists(args
->dnode
, "./../advertise-definition");
2828 switch (args
->event
) {
2830 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
2831 fa
= flex_algo_lookup(area
->flex_algos
, algorithm
);
2833 snprintf(args
->errmsg
, args
->errmsg_len
,
2834 "flex-algo object not found");
2835 return NB_ERR_RESOURCE
;
2837 fa
->advertise_definition
= advertise
;
2838 lsp_regenerate_schedule(area
, area
->is_type
, 0);
2840 case NB_EV_VALIDATE
:
2849 int isis_instance_flex_algo_advertise_definition_destroy(
2850 struct nb_cb_destroy_args
*args
)
2852 struct isis_area
*area
;
2853 struct flex_algo
*fa
;
2856 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
2858 algorithm
= yang_dnode_get_uint32(args
->dnode
, "./../flex-algo");
2860 switch (args
->event
) {
2862 fa
= flex_algo_lookup(area
->flex_algos
, algorithm
);
2864 snprintf(args
->errmsg
, args
->errmsg_len
,
2865 "flex-algo object not found");
2866 return NB_ERR_RESOURCE
;
2868 fa
->advertise_definition
= false;
2869 lsp_regenerate_schedule(area
, area
->is_type
, 0);
2871 case NB_EV_VALIDATE
:
2880 static int isis_instance_flex_algo_affinity_set(struct nb_cb_create_args
*args
,
2883 struct affinity_map
*map
;
2884 struct isis_area
*area
;
2885 struct admin_group
*ag
;
2886 struct flex_algo
*fa
;
2890 algorithm
= yang_dnode_get_uint32(args
->dnode
, "../../flex-algo");
2891 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
2892 val
= yang_dnode_get_string(args
->dnode
, ".");
2894 switch (args
->event
) {
2895 case NB_EV_VALIDATE
:
2896 fa
= flex_algo_lookup(area
->flex_algos
, algorithm
);
2898 snprintf(args
->errmsg
, args
->errmsg_len
,
2899 "flex-algo object not found");
2900 return NB_ERR_RESOURCE
;
2902 map
= affinity_map_get(val
);
2904 snprintf(args
->errmsg
, args
->errmsg_len
,
2905 "affinity map %s isn't found", val
);
2906 return NB_ERR_VALIDATION
;
2913 fa
= flex_algo_lookup(area
->flex_algos
, algorithm
);
2915 snprintf(args
->errmsg
, args
->errmsg_len
,
2916 "flex-algo object not found");
2917 return NB_ERR_RESOURCE
;
2919 map
= affinity_map_get(val
);
2921 snprintf(args
->errmsg
, args
->errmsg_len
,
2922 "affinity map %s isn't found", val
);
2923 return NB_ERR_RESOURCE
;
2925 if (type
== AFFINITY_INCLUDE_ANY
)
2926 ag
= &fa
->admin_group_include_any
;
2927 else if (type
== AFFINITY_INCLUDE_ALL
)
2928 ag
= &fa
->admin_group_include_all
;
2929 else if (type
== AFFINITY_EXCLUDE_ANY
)
2930 ag
= &fa
->admin_group_exclude_any
;
2934 admin_group_set(ag
, map
->bit_position
);
2935 lsp_regenerate_schedule(area
, area
->is_type
, 0);
2943 isis_instance_flex_algo_affinity_unset(struct nb_cb_destroy_args
*args
,
2946 struct affinity_map
*map
;
2947 struct isis_area
*area
;
2948 struct admin_group
*ag
;
2949 struct flex_algo
*fa
;
2953 algorithm
= yang_dnode_get_uint32(args
->dnode
, "../../flex-algo");
2954 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
2955 val
= yang_dnode_get_string(args
->dnode
, ".");
2957 switch (args
->event
) {
2958 case NB_EV_VALIDATE
:
2959 fa
= flex_algo_lookup(area
->flex_algos
, algorithm
);
2961 snprintf(args
->errmsg
, args
->errmsg_len
,
2962 "flex-algo object not found");
2963 return NB_ERR_RESOURCE
;
2965 map
= affinity_map_get(val
);
2967 snprintf(args
->errmsg
, args
->errmsg_len
,
2968 "affinity map %s isn't found", val
);
2969 return NB_ERR_VALIDATION
;
2976 fa
= flex_algo_lookup(area
->flex_algos
, algorithm
);
2978 snprintf(args
->errmsg
, args
->errmsg_len
,
2979 "flex-algo object not found");
2980 return NB_ERR_RESOURCE
;
2982 map
= affinity_map_get(val
);
2984 snprintf(args
->errmsg
, args
->errmsg_len
,
2985 "affinity map %s isn't found", val
);
2986 return NB_ERR_RESOURCE
;
2988 if (type
== AFFINITY_INCLUDE_ANY
)
2989 ag
= &fa
->admin_group_include_any
;
2990 else if (type
== AFFINITY_INCLUDE_ALL
)
2991 ag
= &fa
->admin_group_include_all
;
2992 else if (type
== AFFINITY_EXCLUDE_ANY
)
2993 ag
= &fa
->admin_group_exclude_any
;
2997 admin_group_unset(ag
, map
->bit_position
);
2998 if (area
->admin_group_send_zero
)
2999 admin_group_allow_explicit_zero(ag
);
3000 lsp_regenerate_schedule(area
, area
->is_type
, 0);
3009 * /frr-isisd:isis/instance/flex-algos/flex-algo/affinity-include-anies/affinity-include-any
3011 int isis_instance_flex_algo_affinity_include_any_create(
3012 struct nb_cb_create_args
*args
)
3014 return isis_instance_flex_algo_affinity_set(args
, AFFINITY_INCLUDE_ANY
);
3017 int isis_instance_flex_algo_affinity_include_any_destroy(
3018 struct nb_cb_destroy_args
*args
)
3020 return isis_instance_flex_algo_affinity_unset(args
,
3021 AFFINITY_INCLUDE_ANY
);
3026 * /frr-isisd:isis/instance/flex-algos/flex-algo/affinity-include-alls/affinity-include-all
3028 int isis_instance_flex_algo_affinity_include_all_create(
3029 struct nb_cb_create_args
*args
)
3031 return isis_instance_flex_algo_affinity_set(args
, AFFINITY_INCLUDE_ALL
);
3034 int isis_instance_flex_algo_affinity_include_all_destroy(
3035 struct nb_cb_destroy_args
*args
)
3037 return isis_instance_flex_algo_affinity_unset(args
,
3038 AFFINITY_INCLUDE_ALL
);
3043 * /frr-isisd:isis/instance/flex-algos/flex-algo/affinity-exclude-anies/affinity-exclude-any
3045 int isis_instance_flex_algo_affinity_exclude_any_create(
3046 struct nb_cb_create_args
*args
)
3048 return isis_instance_flex_algo_affinity_set(args
, AFFINITY_EXCLUDE_ANY
);
3051 int isis_instance_flex_algo_affinity_exclude_any_destroy(
3052 struct nb_cb_destroy_args
*args
)
3054 return isis_instance_flex_algo_affinity_unset(args
,
3055 AFFINITY_EXCLUDE_ANY
);
3059 * XPath: /frr-isisd:isis/instance/flex-algos/flex-algo/prefix-metric
3062 int isis_instance_flex_algo_prefix_metric_create(struct nb_cb_create_args
*args
)
3064 struct isis_area
*area
;
3065 const char *area_tag
;
3066 struct flex_algo
*fa
;
3069 area_tag
= yang_dnode_get_string(args
->dnode
, "../../../area-tag");
3070 area
= isis_area_lookup(area_tag
, VRF_DEFAULT
);
3072 return NB_ERR_RESOURCE
;
3074 algorithm
= yang_dnode_get_uint32(args
->dnode
, "./../flex-algo");
3076 switch (args
->event
) {
3078 fa
= flex_algo_lookup(area
->flex_algos
, algorithm
);
3080 snprintf(args
->errmsg
, args
->errmsg_len
,
3081 "flex-algo object not found");
3082 return NB_ERR_RESOURCE
;
3084 SET_FLAG(fa
->flags
, FAD_FLAG_M
);
3085 lsp_regenerate_schedule(area
, area
->is_type
, 0);
3087 case NB_EV_VALIDATE
:
3096 int isis_instance_flex_algo_prefix_metric_destroy(
3097 struct nb_cb_destroy_args
*args
)
3099 struct isis_area
*area
;
3100 const char *area_tag
;
3101 struct flex_algo
*fa
;
3104 area_tag
= yang_dnode_get_string(args
->dnode
, "../../../area-tag");
3105 area
= isis_area_lookup(area_tag
, VRF_DEFAULT
);
3107 return NB_ERR_RESOURCE
;
3109 algorithm
= yang_dnode_get_uint32(args
->dnode
, "./../flex-algo");
3111 switch (args
->event
) {
3113 fa
= flex_algo_lookup(area
->flex_algos
, algorithm
);
3115 snprintf(args
->errmsg
, args
->errmsg_len
,
3116 "flex-algo object not found");
3117 return NB_ERR_RESOURCE
;
3119 UNSET_FLAG(fa
->flags
, FAD_FLAG_M
);
3120 lsp_regenerate_schedule(area
, area
->is_type
, 0);
3122 case NB_EV_VALIDATE
:
3131 static int isis_instance_flex_algo_dplane_set(struct nb_cb_create_args
*args
,
3134 struct isis_area
*area
;
3135 const char *area_tag
;
3136 struct flex_algo
*fa
;
3139 area_tag
= yang_dnode_get_string(args
->dnode
, "../../../area-tag");
3140 area
= isis_area_lookup(area_tag
, VRF_DEFAULT
);
3142 return NB_ERR_RESOURCE
;
3144 algorithm
= yang_dnode_get_uint32(args
->dnode
, "./../flex-algo");
3146 switch (args
->event
) {
3148 fa
= flex_algo_lookup(area
->flex_algos
, algorithm
);
3150 snprintf(args
->errmsg
, args
->errmsg_len
,
3151 "flex-algo object not found");
3152 return NB_ERR_RESOURCE
;
3154 SET_FLAG(fa
->dataplanes
, type
);
3155 lsp_regenerate_schedule(area
, area
->is_type
, 0);
3157 case NB_EV_VALIDATE
:
3158 if (type
== FLEX_ALGO_SRV6
|| type
== FLEX_ALGO_IP
) {
3159 snprintf(args
->errmsg
, args
->errmsg_len
,
3160 "%s Flex-algo dataplane is not yet supported.",
3161 type
== FLEX_ALGO_SRV6
? "SRv6" : "IP");
3162 return NB_ERR_VALIDATION
;
3173 static int isis_instance_flex_algo_dplane_unset(struct nb_cb_destroy_args
*args
,
3176 struct isis_area
*area
;
3177 const char *area_tag
;
3178 struct flex_algo
*fa
;
3181 area_tag
= yang_dnode_get_string(args
->dnode
, "../../../area-tag");
3182 area
= isis_area_lookup(area_tag
, VRF_DEFAULT
);
3184 return NB_ERR_RESOURCE
;
3186 algorithm
= yang_dnode_get_uint32(args
->dnode
, "./../flex-algo");
3188 switch (args
->event
) {
3190 fa
= flex_algo_lookup(area
->flex_algos
, algorithm
);
3192 snprintf(args
->errmsg
, args
->errmsg_len
,
3193 "flex-algo object not found");
3194 return NB_ERR_RESOURCE
;
3196 UNSET_FLAG(fa
->dataplanes
, type
);
3197 lsp_regenerate_schedule(area
, area
->is_type
, 0);
3199 case NB_EV_VALIDATE
:
3209 * XPath: /frr-isisd:isis/instance/flex-algos/flex-algo/dplane-sr-mpls
3212 int isis_instance_flex_algo_dplane_sr_mpls_create(
3213 struct nb_cb_create_args
*args
)
3215 return isis_instance_flex_algo_dplane_set(args
, FLEX_ALGO_SR_MPLS
);
3218 int isis_instance_flex_algo_dplane_sr_mpls_destroy(
3219 struct nb_cb_destroy_args
*args
)
3221 return isis_instance_flex_algo_dplane_unset(args
, FLEX_ALGO_SR_MPLS
);
3225 * XPath: /frr-isisd:isis/instance/flex-algos/flex-algo/dplane-srv6
3228 int isis_instance_flex_algo_dplane_srv6_create(struct nb_cb_create_args
*args
)
3230 return isis_instance_flex_algo_dplane_set(args
, FLEX_ALGO_SRV6
);
3233 int isis_instance_flex_algo_dplane_srv6_destroy(struct nb_cb_destroy_args
*args
)
3235 return isis_instance_flex_algo_dplane_unset(args
, FLEX_ALGO_SRV6
);
3239 * XPath: /frr-isisd:isis/instance/flex-algos/flex-algo/dplane-ip
3242 int isis_instance_flex_algo_dplane_ip_create(struct nb_cb_create_args
*args
)
3244 return isis_instance_flex_algo_dplane_set(args
, FLEX_ALGO_IP
);
3247 int isis_instance_flex_algo_dplane_ip_destroy(struct nb_cb_destroy_args
*args
)
3249 return isis_instance_flex_algo_dplane_unset(args
, FLEX_ALGO_IP
);
3253 * XPath: /frr-isisd:isis/instance/flex-algos/flex-algo/metric-type
3256 int isis_instance_flex_algo_metric_type_modify(struct nb_cb_modify_args
*args
)
3258 struct isis_area
*area
;
3259 const char *area_tag
;
3260 struct flex_algo
*fa
;
3262 enum flex_algo_metric_type metric_type
;
3264 area_tag
= yang_dnode_get_string(args
->dnode
, "../../../area-tag");
3265 area
= isis_area_lookup(area_tag
, VRF_DEFAULT
);
3267 return NB_ERR_RESOURCE
;
3269 algorithm
= yang_dnode_get_uint32(args
->dnode
, "./../flex-algo");
3270 metric_type
= yang_dnode_get_enum(args
->dnode
, NULL
);
3272 switch (args
->event
) {
3274 fa
= flex_algo_lookup(area
->flex_algos
, algorithm
);
3276 snprintf(args
->errmsg
, args
->errmsg_len
,
3277 "flex-algo object not found");
3278 return NB_ERR_RESOURCE
;
3280 fa
->metric_type
= metric_type
;
3281 lsp_regenerate_schedule(area
, area
->is_type
, 0);
3283 case NB_EV_VALIDATE
:
3293 * XPath: /frr-isisd:isis/instance/flex-algos/flex-algo/priority
3296 int isis_instance_flex_algo_priority_modify(struct nb_cb_modify_args
*args
)
3298 struct isis_area
*area
;
3299 const char *area_tag
;
3300 struct flex_algo
*fa
;
3304 area_tag
= yang_dnode_get_string(args
->dnode
, "../../../area-tag");
3305 area
= isis_area_lookup(area_tag
, VRF_DEFAULT
);
3307 return NB_ERR_RESOURCE
;
3309 algorithm
= yang_dnode_get_uint32(args
->dnode
, "./../flex-algo");
3310 priority
= yang_dnode_get_uint32(args
->dnode
, NULL
);
3312 switch (args
->event
) {
3314 fa
= flex_algo_lookup(area
->flex_algos
, algorithm
);
3316 snprintf(args
->errmsg
, args
->errmsg_len
,
3317 "flex-algo object not found");
3318 return NB_ERR_RESOURCE
;
3320 fa
->priority
= priority
;
3321 lsp_regenerate_schedule(area
, area
->is_type
, 0);
3323 case NB_EV_VALIDATE
:
3332 int isis_instance_flex_algo_priority_destroy(struct nb_cb_destroy_args
*args
)
3334 struct isis_area
*area
;
3335 const char *area_tag
;
3336 struct flex_algo
*fa
;
3338 uint32_t priority
= FLEX_ALGO_PRIO_DEFAULT
;
3340 area_tag
= yang_dnode_get_string(args
->dnode
, "../../../area-tag");
3341 area
= isis_area_lookup(area_tag
, VRF_DEFAULT
);
3343 return NB_ERR_RESOURCE
;
3345 algorithm
= yang_dnode_get_uint32(args
->dnode
, "./../flex-algo");
3346 priority
= yang_dnode_get_uint32(args
->dnode
, NULL
);
3348 switch (args
->event
) {
3350 fa
= flex_algo_lookup(area
->flex_algos
, algorithm
);
3352 snprintf(args
->errmsg
, args
->errmsg_len
,
3353 "flex-algo object not found");
3354 return NB_ERR_RESOURCE
;
3356 fa
->priority
= priority
;
3357 lsp_regenerate_schedule(area
, area
->is_type
, 0);
3359 case NB_EV_VALIDATE
:
3369 * XPath: /frr-isisd:isis/instance/mpls/ldp-sync
3371 int isis_instance_mpls_ldp_sync_create(struct nb_cb_create_args
*args
)
3373 struct isis_area
*area
;
3374 const char *vrfname
;
3376 switch (args
->event
) {
3377 case NB_EV_VALIDATE
:
3378 vrfname
= yang_dnode_get_string(
3379 lyd_parent(lyd_parent(args
->dnode
)), "./vrf");
3381 if (strcmp(vrfname
, VRF_DEFAULT_NAME
)) {
3382 snprintf(args
->errmsg
, args
->errmsg_len
,
3383 "LDP-Sync only runs on Default VRF");
3384 return NB_ERR_VALIDATION
;
3391 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
3392 isis_area_ldp_sync_enable(area
);
3398 int isis_instance_mpls_ldp_sync_destroy(struct nb_cb_destroy_args
*args
)
3400 struct isis_area
*area
;
3402 if (args
->event
!= NB_EV_APPLY
)
3405 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
3406 isis_area_ldp_sync_disable(area
);
3412 * XPath: /frr-isisd:isis/instance/mpls/ldp-sync/holddown
3414 int isis_instance_mpls_ldp_sync_holddown_modify(struct nb_cb_modify_args
*args
)
3416 struct isis_area
*area
;
3418 const char *vrfname
;
3420 switch (args
->event
) {
3421 case NB_EV_VALIDATE
:
3422 vrfname
= yang_dnode_get_string(
3423 lyd_parent(lyd_parent(lyd_parent(args
->dnode
))),
3426 if (strcmp(vrfname
, VRF_DEFAULT_NAME
)) {
3427 snprintf(args
->errmsg
, args
->errmsg_len
,
3428 "LDP-Sync only runs on Default VRF");
3429 return NB_ERR_VALIDATION
;
3436 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
3437 holddown
= yang_dnode_get_uint16(args
->dnode
, NULL
);
3438 isis_area_ldp_sync_set_holddown(area
, holddown
);
3445 * XPath: /frr-interface:lib/interface/frr-isisd:isis
3447 int lib_interface_isis_create(struct nb_cb_create_args
*args
)
3449 struct interface
*ifp
;
3450 struct isis_circuit
*circuit
= NULL
;
3451 const char *area_tag
= yang_dnode_get_string(args
->dnode
, "./area-tag");
3453 switch (args
->event
) {
3456 case NB_EV_VALIDATE
:
3459 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
3460 circuit
= isis_circuit_new(ifp
, area_tag
);
3461 nb_running_set_entry(args
->dnode
, circuit
);
3468 int lib_interface_isis_destroy(struct nb_cb_destroy_args
*args
)
3470 struct isis_circuit
*circuit
;
3472 if (args
->event
!= NB_EV_APPLY
)
3475 circuit
= nb_running_unset_entry(args
->dnode
);
3477 isis_circuit_del(circuit
);
3483 * XPath: /frr-interface:lib/interface/frr-isisd:isis/area-tag
3485 int lib_interface_isis_area_tag_modify(struct nb_cb_modify_args
*args
)
3487 struct isis_circuit
*circuit
;
3489 if (args
->event
== NB_EV_VALIDATE
) {
3490 circuit
= nb_running_get_entry_non_rec(lyd_parent(args
->dnode
),
3493 snprintf(args
->errmsg
, args
->errmsg_len
,
3494 "Changing area tag is not allowed");
3495 return NB_ERR_VALIDATION
;
3503 * XPath: /frr-interface:lib/interface/frr-isisd:isis/circuit-type
3505 int lib_interface_isis_circuit_type_modify(struct nb_cb_modify_args
*args
)
3507 int circ_type
= yang_dnode_get_enum(args
->dnode
, NULL
);
3508 struct isis_circuit
*circuit
;
3510 switch (args
->event
) {
3511 case NB_EV_VALIDATE
:
3516 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
3517 circuit
->is_type_config
= circ_type
;
3518 isis_circuit_is_type_set(circuit
, circ_type
);
3526 * XPath: /frr-interface:lib/interface/frr-isisd:isis/ipv4-routing
3528 int lib_interface_isis_ipv4_routing_modify(struct nb_cb_modify_args
*args
)
3531 struct isis_circuit
*circuit
;
3533 if (args
->event
!= NB_EV_APPLY
)
3536 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
3537 ipv4
= yang_dnode_get_bool(args
->dnode
, NULL
);
3538 ipv6
= yang_dnode_get_bool(args
->dnode
, "../ipv6-routing");
3539 isis_circuit_af_set(circuit
, ipv4
, ipv6
);
3545 * XPath: /frr-interface:lib/interface/frr-isisd:isis/ipv6-routing
3547 int lib_interface_isis_ipv6_routing_modify(struct nb_cb_modify_args
*args
)
3550 struct isis_circuit
*circuit
;
3552 if (args
->event
!= NB_EV_APPLY
)
3555 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
3556 ipv4
= yang_dnode_get_bool(args
->dnode
, "../ipv4-routing");
3557 ipv6
= yang_dnode_get_bool(args
->dnode
, NULL
);
3558 isis_circuit_af_set(circuit
, ipv4
, ipv6
);
3564 * XPath: /frr-interface:lib/interface/frr-isisd:isis/bfd-monitoring
3566 void lib_interface_isis_bfd_monitoring_apply_finish(
3567 struct nb_cb_apply_finish_args
*args
)
3569 struct isis_circuit
*circuit
;
3571 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
3572 isis_bfd_circuit_cmd(circuit
);
3576 * XPath: /frr-interface:lib/interface/frr-isisd:isis/bfd-monitoring/enabled
3578 int lib_interface_isis_bfd_monitoring_enabled_modify(
3579 struct nb_cb_modify_args
*args
)
3581 struct isis_circuit
*circuit
;
3583 if (args
->event
!= NB_EV_APPLY
)
3586 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
3587 circuit
->bfd_config
.enabled
= yang_dnode_get_bool(args
->dnode
, NULL
);
3593 * XPath: /frr-interface:lib/interface/frr-isisd:isis/bfd-monitoring/profile
3595 int lib_interface_isis_bfd_monitoring_profile_modify(
3596 struct nb_cb_modify_args
*args
)
3598 struct isis_circuit
*circuit
;
3600 if (args
->event
!= NB_EV_APPLY
)
3603 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
3604 XFREE(MTYPE_TMP
, circuit
->bfd_config
.profile
);
3605 circuit
->bfd_config
.profile
=
3606 XSTRDUP(MTYPE_TMP
, yang_dnode_get_string(args
->dnode
, NULL
));
3611 int lib_interface_isis_bfd_monitoring_profile_destroy(
3612 struct nb_cb_destroy_args
*args
)
3614 struct isis_circuit
*circuit
;
3616 if (args
->event
!= NB_EV_APPLY
)
3619 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
3620 XFREE(MTYPE_TMP
, circuit
->bfd_config
.profile
);
3626 * XPath: /frr-interface:lib/interface/frr-isisd:isis/csnp-interval/level-1
3628 int lib_interface_isis_csnp_interval_level_1_modify(
3629 struct nb_cb_modify_args
*args
)
3631 struct isis_circuit
*circuit
;
3633 if (args
->event
!= NB_EV_APPLY
)
3636 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
3637 circuit
->csnp_interval
[0] = yang_dnode_get_uint16(args
->dnode
, NULL
);
3643 * XPath: /frr-interface:lib/interface/frr-isisd:isis/csnp-interval/level-2
3645 int lib_interface_isis_csnp_interval_level_2_modify(
3646 struct nb_cb_modify_args
*args
)
3648 struct isis_circuit
*circuit
;
3650 if (args
->event
!= NB_EV_APPLY
)
3653 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
3654 circuit
->csnp_interval
[1] = yang_dnode_get_uint16(args
->dnode
, NULL
);
3660 * XPath: /frr-interface:lib/interface/frr-isisd:isis/psnp-interval/level-1
3662 int lib_interface_isis_psnp_interval_level_1_modify(
3663 struct nb_cb_modify_args
*args
)
3665 struct isis_circuit
*circuit
;
3667 if (args
->event
!= NB_EV_APPLY
)
3670 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
3671 circuit
->psnp_interval
[0] = yang_dnode_get_uint16(args
->dnode
, NULL
);
3677 * XPath: /frr-interface:lib/interface/frr-isisd:isis/psnp-interval/level-2
3679 int lib_interface_isis_psnp_interval_level_2_modify(
3680 struct nb_cb_modify_args
*args
)
3682 struct isis_circuit
*circuit
;
3684 if (args
->event
!= NB_EV_APPLY
)
3687 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
3688 circuit
->psnp_interval
[1] = yang_dnode_get_uint16(args
->dnode
, NULL
);
3694 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/padding
3696 int lib_interface_isis_hello_padding_modify(struct nb_cb_modify_args
*args
)
3698 struct isis_circuit
*circuit
;
3700 if (args
->event
!= NB_EV_APPLY
)
3703 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
3704 circuit
->pad_hellos
= yang_dnode_get_enum(args
->dnode
, NULL
);
3710 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/interval/level-1
3712 int lib_interface_isis_hello_interval_level_1_modify(
3713 struct nb_cb_modify_args
*args
)
3715 struct isis_circuit
*circuit
;
3718 if (args
->event
!= NB_EV_APPLY
)
3721 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
3722 interval
= yang_dnode_get_uint32(args
->dnode
, NULL
);
3723 circuit
->hello_interval
[0] = interval
;
3729 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/interval/level-2
3731 int lib_interface_isis_hello_interval_level_2_modify(
3732 struct nb_cb_modify_args
*args
)
3734 struct isis_circuit
*circuit
;
3737 if (args
->event
!= NB_EV_APPLY
)
3740 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
3741 interval
= yang_dnode_get_uint32(args
->dnode
, NULL
);
3742 circuit
->hello_interval
[1] = interval
;
3748 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/multiplier/level-1
3750 int lib_interface_isis_hello_multiplier_level_1_modify(
3751 struct nb_cb_modify_args
*args
)
3753 struct isis_circuit
*circuit
;
3756 if (args
->event
!= NB_EV_APPLY
)
3759 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
3760 multi
= yang_dnode_get_uint16(args
->dnode
, NULL
);
3761 circuit
->hello_multiplier
[0] = multi
;
3767 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/multiplier/level-2
3769 int lib_interface_isis_hello_multiplier_level_2_modify(
3770 struct nb_cb_modify_args
*args
)
3772 struct isis_circuit
*circuit
;
3775 if (args
->event
!= NB_EV_APPLY
)
3778 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
3779 multi
= yang_dnode_get_uint16(args
->dnode
, NULL
);
3780 circuit
->hello_multiplier
[1] = multi
;
3786 * XPath: /frr-interface:lib/interface/frr-isisd:isis/metric/level-1
3788 int lib_interface_isis_metric_level_1_modify(struct nb_cb_modify_args
*args
)
3790 struct isis_circuit
*circuit
;
3793 if (args
->event
!= NB_EV_APPLY
)
3796 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
3797 met
= yang_dnode_get_uint32(args
->dnode
, NULL
);
3798 isis_circuit_metric_set(circuit
, IS_LEVEL_1
, met
);
3804 * XPath: /frr-interface:lib/interface/frr-isisd:isis/metric/level-2
3806 int lib_interface_isis_metric_level_2_modify(struct nb_cb_modify_args
*args
)
3808 struct isis_circuit
*circuit
;
3811 if (args
->event
!= NB_EV_APPLY
)
3814 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
3815 met
= yang_dnode_get_uint32(args
->dnode
, NULL
);
3816 isis_circuit_metric_set(circuit
, IS_LEVEL_2
, met
);
3822 * XPath: /frr-interface:lib/interface/frr-isisd:isis/priority/level-1
3824 int lib_interface_isis_priority_level_1_modify(struct nb_cb_modify_args
*args
)
3826 struct isis_circuit
*circuit
;
3828 if (args
->event
!= NB_EV_APPLY
)
3831 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
3832 circuit
->priority
[0] = yang_dnode_get_uint8(args
->dnode
, NULL
);
3838 * XPath: /frr-interface:lib/interface/frr-isisd:isis/priority/level-2
3840 int lib_interface_isis_priority_level_2_modify(struct nb_cb_modify_args
*args
)
3842 struct isis_circuit
*circuit
;
3844 if (args
->event
!= NB_EV_APPLY
)
3847 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
3848 circuit
->priority
[1] = yang_dnode_get_uint8(args
->dnode
, NULL
);
3854 * XPath: /frr-interface:lib/interface/frr-isisd:isis/network-type
3856 int lib_interface_isis_network_type_modify(struct nb_cb_modify_args
*args
)
3858 struct isis_circuit
*circuit
;
3859 int net_type
= yang_dnode_get_enum(args
->dnode
, NULL
);
3861 switch (args
->event
) {
3862 case NB_EV_VALIDATE
:
3863 circuit
= nb_running_get_entry(args
->dnode
, NULL
, false);
3866 if (circuit
->circ_type
== CIRCUIT_T_LOOPBACK
) {
3868 args
->errmsg
, args
->errmsg_len
,
3869 "Cannot change network type on loopback interface");
3870 return NB_ERR_VALIDATION
;
3872 if (net_type
== CIRCUIT_T_BROADCAST
3873 && circuit
->state
== C_STATE_UP
3874 && !if_is_broadcast(circuit
->interface
)) {
3876 args
->errmsg
, args
->errmsg_len
,
3877 "Cannot configure non-broadcast interface for broadcast operation");
3878 return NB_ERR_VALIDATION
;
3885 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
3886 isis_circuit_circ_type_set(circuit
, net_type
);
3894 * XPath: /frr-interface:lib/interface/frr-isisd:isis/passive
3896 int lib_interface_isis_passive_modify(struct nb_cb_modify_args
*args
)
3898 struct isis_circuit
*circuit
;
3899 bool passive
= yang_dnode_get_bool(args
->dnode
, NULL
);
3901 if (args
->event
!= NB_EV_APPLY
)
3904 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
3905 isis_circuit_passive_set(circuit
, passive
);
3911 * XPath: /frr-interface:lib/interface/frr-isisd:isis/password
3913 int lib_interface_isis_password_create(struct nb_cb_create_args
*args
)
3918 int lib_interface_isis_password_destroy(struct nb_cb_destroy_args
*args
)
3920 struct isis_circuit
*circuit
;
3922 if (args
->event
!= NB_EV_APPLY
)
3925 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
3926 isis_circuit_passwd_unset(circuit
);
3932 * XPath: /frr-interface:lib/interface/frr-isisd:isis/password/password
3934 int lib_interface_isis_password_password_modify(struct nb_cb_modify_args
*args
)
3936 struct isis_circuit
*circuit
;
3937 const char *password
;
3939 if (args
->event
!= NB_EV_APPLY
)
3942 password
= yang_dnode_get_string(args
->dnode
, NULL
);
3943 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
3945 isis_circuit_passwd_set(circuit
, circuit
->passwd
.type
, password
);
3951 * XPath: /frr-interface:lib/interface/frr-isisd:isis/password/password-type
3953 int lib_interface_isis_password_password_type_modify(
3954 struct nb_cb_modify_args
*args
)
3956 struct isis_circuit
*circuit
;
3959 if (args
->event
!= NB_EV_APPLY
)
3962 pass_type
= yang_dnode_get_enum(args
->dnode
, NULL
);
3963 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
3964 circuit
->passwd
.type
= pass_type
;
3971 * /frr-interface:lib/interface/frr-isisd:isis/disable-three-way-handshake
3973 int lib_interface_isis_disable_three_way_handshake_modify(
3974 struct nb_cb_modify_args
*args
)
3976 struct isis_circuit
*circuit
;
3978 if (args
->event
!= NB_EV_APPLY
)
3981 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
3982 circuit
->disable_threeway_adj
= yang_dnode_get_bool(args
->dnode
, NULL
);
3987 static int lib_interface_isis_multi_topology_common(
3988 enum nb_event event
, const struct lyd_node
*dnode
, char *errmsg
,
3989 size_t errmsg_len
, uint16_t mtid
)
3991 struct isis_circuit
*circuit
;
3995 case NB_EV_VALIDATE
:
3996 circuit
= nb_running_get_entry(dnode
, NULL
, false);
3997 if (circuit
&& circuit
->area
&& circuit
->area
->oldmetric
) {
4000 "Multi topology IS-IS can only be used with wide metrics");
4001 return NB_ERR_VALIDATION
;
4008 circuit
= nb_running_get_entry(dnode
, NULL
, true);
4009 value
= yang_dnode_get_bool(dnode
, NULL
);
4010 isis_circuit_mt_enabled_set(circuit
, mtid
, value
);
4019 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/standard
4021 int lib_interface_isis_multi_topology_standard_modify(
4022 struct nb_cb_modify_args
*args
)
4024 return lib_interface_isis_multi_topology_common(
4025 args
->event
, args
->dnode
, args
->errmsg
, args
->errmsg_len
,
4031 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-multicast
4033 int lib_interface_isis_multi_topology_ipv4_multicast_modify(
4034 struct nb_cb_modify_args
*args
)
4036 return lib_interface_isis_multi_topology_common(
4037 args
->event
, args
->dnode
, args
->errmsg
, args
->errmsg_len
,
4038 ISIS_MT_IPV4_MULTICAST
);
4043 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-management
4045 int lib_interface_isis_multi_topology_ipv4_management_modify(
4046 struct nb_cb_modify_args
*args
)
4048 return lib_interface_isis_multi_topology_common(
4049 args
->event
, args
->dnode
, args
->errmsg
, args
->errmsg_len
,
4055 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-unicast
4057 int lib_interface_isis_multi_topology_ipv6_unicast_modify(
4058 struct nb_cb_modify_args
*args
)
4060 return lib_interface_isis_multi_topology_common(
4061 args
->event
, args
->dnode
, args
->errmsg
, args
->errmsg_len
,
4062 ISIS_MT_IPV6_UNICAST
);
4067 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-multicast
4069 int lib_interface_isis_multi_topology_ipv6_multicast_modify(
4070 struct nb_cb_modify_args
*args
)
4072 return lib_interface_isis_multi_topology_common(
4073 args
->event
, args
->dnode
, args
->errmsg
, args
->errmsg_len
,
4074 ISIS_MT_IPV6_MULTICAST
);
4079 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-management
4081 int lib_interface_isis_multi_topology_ipv6_management_modify(
4082 struct nb_cb_modify_args
*args
)
4084 return lib_interface_isis_multi_topology_common(
4085 args
->event
, args
->dnode
, args
->errmsg
, args
->errmsg_len
,
4090 * XPath: /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-dstsrc
4092 int lib_interface_isis_multi_topology_ipv6_dstsrc_modify(
4093 struct nb_cb_modify_args
*args
)
4095 return lib_interface_isis_multi_topology_common(
4096 args
->event
, args
->dnode
, args
->errmsg
, args
->errmsg_len
,
4097 ISIS_MT_IPV6_DSTSRC
);
4101 * XPath: /frr-interface:lib/interface/frr-isisd:isis/mpls/ldp-sync
4103 int lib_interface_isis_mpls_ldp_sync_modify(struct nb_cb_modify_args
*args
)
4105 struct isis_circuit
*circuit
;
4106 struct ldp_sync_info
*ldp_sync_info
;
4107 bool ldp_sync_enable
;
4109 switch (args
->event
) {
4110 case NB_EV_VALIDATE
:
4115 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
4116 ldp_sync_enable
= yang_dnode_get_bool(args
->dnode
, NULL
);
4118 ldp_sync_info
= circuit
->ldp_sync_info
;
4120 SET_FLAG(ldp_sync_info
->flags
, LDP_SYNC_FLAG_IF_CONFIG
);
4121 ldp_sync_info
->enabled
= ldp_sync_enable
;
4123 if (circuit
->area
) {
4124 if (ldp_sync_enable
)
4125 isis_if_ldp_sync_enable(circuit
);
4127 isis_if_ldp_sync_disable(circuit
);
4135 * XPath: /frr-interface:lib/interface/frr-isisd:isis/mpls/holddown
4137 int lib_interface_isis_mpls_holddown_modify(struct nb_cb_modify_args
*args
)
4139 struct isis_circuit
*circuit
;
4140 struct ldp_sync_info
*ldp_sync_info
;
4143 switch (args
->event
) {
4144 case NB_EV_VALIDATE
:
4149 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
4150 holddown
= yang_dnode_get_uint16(args
->dnode
, NULL
);
4152 ldp_sync_info
= circuit
->ldp_sync_info
;
4154 SET_FLAG(ldp_sync_info
->flags
, LDP_SYNC_FLAG_HOLDDOWN
);
4155 ldp_sync_info
->holddown
= holddown
;
4161 int lib_interface_isis_mpls_holddown_destroy(struct nb_cb_destroy_args
*args
)
4163 struct isis_circuit
*circuit
;
4164 struct ldp_sync_info
*ldp_sync_info
;
4166 switch (args
->event
) {
4167 case NB_EV_VALIDATE
:
4172 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
4173 ldp_sync_info
= circuit
->ldp_sync_info
;
4175 UNSET_FLAG(ldp_sync_info
->flags
, LDP_SYNC_FLAG_HOLDDOWN
);
4178 isis_if_set_ldp_sync_holddown(circuit
);
4187 * /frr-interface:lib/interface/frr-isisd:isis/fast-reroute/level-1/lfa/enable
4189 int lib_interface_isis_fast_reroute_level_1_lfa_enable_modify(
4190 struct nb_cb_modify_args
*args
)
4192 struct isis_area
*area
;
4193 struct isis_circuit
*circuit
;
4195 if (args
->event
!= NB_EV_APPLY
)
4198 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
4199 circuit
->lfa_protection
[0] = yang_dnode_get_bool(args
->dnode
, NULL
);
4201 area
= circuit
->area
;
4203 if (circuit
->lfa_protection
[0])
4204 area
->lfa_protected_links
[0]++;
4206 assert(area
->lfa_protected_links
[0] > 0);
4207 area
->lfa_protected_links
[0]--;
4210 lsp_regenerate_schedule(area
, area
->is_type
, 0);
4218 * /frr-interface:lib/interface/frr-isisd:isis/fast-reroute/level-1/lfa/exclude-interface
4220 int lib_interface_isis_fast_reroute_level_1_lfa_exclude_interface_create(
4221 struct nb_cb_create_args
*args
)
4223 struct isis_area
*area
;
4224 struct isis_circuit
*circuit
;
4225 const char *exclude_ifname
;
4227 if (args
->event
!= NB_EV_APPLY
)
4230 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
4231 exclude_ifname
= yang_dnode_get_string(args
->dnode
, NULL
);
4233 isis_lfa_excluded_iface_add(circuit
, ISIS_LEVEL1
, exclude_ifname
);
4234 area
= circuit
->area
;
4236 lsp_regenerate_schedule(area
, area
->is_type
, 0);
4241 int lib_interface_isis_fast_reroute_level_1_lfa_exclude_interface_destroy(
4242 struct nb_cb_destroy_args
*args
)
4244 struct isis_area
*area
;
4245 struct isis_circuit
*circuit
;
4246 const char *exclude_ifname
;
4248 if (args
->event
!= NB_EV_APPLY
)
4251 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
4252 exclude_ifname
= yang_dnode_get_string(args
->dnode
, NULL
);
4254 isis_lfa_excluded_iface_delete(circuit
, ISIS_LEVEL1
, exclude_ifname
);
4255 area
= circuit
->area
;
4257 lsp_regenerate_schedule(area
, area
->is_type
, 0);
4264 * /frr-interface:lib/interface/frr-isisd:isis/fast-reroute/level-1/remote-lfa/enable
4266 int lib_interface_isis_fast_reroute_level_1_remote_lfa_enable_modify(
4267 struct nb_cb_modify_args
*args
)
4269 struct isis_area
*area
;
4270 struct isis_circuit
*circuit
;
4272 if (args
->event
!= NB_EV_APPLY
)
4275 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
4276 circuit
->rlfa_protection
[0] = yang_dnode_get_bool(args
->dnode
, NULL
);
4278 area
= circuit
->area
;
4280 if (circuit
->rlfa_protection
[0])
4281 area
->rlfa_protected_links
[0]++;
4283 assert(area
->rlfa_protected_links
[0] > 0);
4284 area
->rlfa_protected_links
[0]--;
4287 lsp_regenerate_schedule(area
, area
->is_type
, 0);
4295 * /frr-interface:lib/interface/frr-isisd:isis/fast-reroute/level-1/remote-lfa/maximum-metric
4297 int lib_interface_isis_fast_reroute_level_1_remote_lfa_maximum_metric_modify(
4298 struct nb_cb_modify_args
*args
)
4300 struct isis_area
*area
;
4301 struct isis_circuit
*circuit
;
4303 if (args
->event
!= NB_EV_APPLY
)
4306 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
4307 circuit
->rlfa_max_metric
[0] = yang_dnode_get_uint32(args
->dnode
, NULL
);
4309 area
= circuit
->area
;
4311 lsp_regenerate_schedule(area
, area
->is_type
, 0);
4316 int lib_interface_isis_fast_reroute_level_1_remote_lfa_maximum_metric_destroy(
4317 struct nb_cb_destroy_args
*args
)
4319 struct isis_area
*area
;
4320 struct isis_circuit
*circuit
;
4322 if (args
->event
!= NB_EV_APPLY
)
4325 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
4326 circuit
->rlfa_max_metric
[0] = 0;
4328 area
= circuit
->area
;
4330 lsp_regenerate_schedule(area
, area
->is_type
, 0);
4337 * /frr-interface:lib/interface/frr-isisd:isis/fast-reroute/level-1/ti-lfa/enable
4339 int lib_interface_isis_fast_reroute_level_1_ti_lfa_enable_modify(
4340 struct nb_cb_modify_args
*args
)
4342 struct isis_area
*area
;
4343 struct isis_circuit
*circuit
;
4345 if (args
->event
!= NB_EV_APPLY
)
4348 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
4349 circuit
->tilfa_protection
[0] = yang_dnode_get_bool(args
->dnode
, NULL
);
4351 area
= circuit
->area
;
4353 if (circuit
->tilfa_protection
[0])
4354 area
->tilfa_protected_links
[0]++;
4356 assert(area
->tilfa_protected_links
[0] > 0);
4357 area
->tilfa_protected_links
[0]--;
4360 lsp_regenerate_schedule(area
, area
->is_type
, 0);
4368 * /frr-interface:lib/interface/frr-isisd:isis/fast-reroute/level-1/ti-lfa/node-protection
4370 int lib_interface_isis_fast_reroute_level_1_ti_lfa_node_protection_modify(
4371 struct nb_cb_modify_args
*args
)
4373 struct isis_area
*area
;
4374 struct isis_circuit
*circuit
;
4376 if (args
->event
!= NB_EV_APPLY
)
4379 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
4380 circuit
->tilfa_node_protection
[0] =
4381 yang_dnode_get_bool(args
->dnode
, NULL
);
4383 area
= circuit
->area
;
4385 lsp_regenerate_schedule(area
, area
->is_type
, 0);
4392 * /frr-interface:lib/interface/frr-isisd:isis/fast-reroute/level-1/ti-lfa/link-fallback
4394 int lib_interface_isis_fast_reroute_level_1_ti_lfa_link_fallback_modify(
4395 struct nb_cb_modify_args
*args
)
4397 struct isis_area
*area
;
4398 struct isis_circuit
*circuit
;
4400 if (args
->event
!= NB_EV_APPLY
)
4403 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
4404 circuit
->tilfa_link_fallback
[0] =
4405 yang_dnode_get_bool(args
->dnode
, NULL
);
4407 area
= circuit
->area
;
4409 lsp_regenerate_schedule(area
, area
->is_type
, 0);
4416 * /frr-interface:lib/interface/frr-isisd:isis/fast-reroute/level-2/lfa/enable
4418 int lib_interface_isis_fast_reroute_level_2_lfa_enable_modify(
4419 struct nb_cb_modify_args
*args
)
4421 struct isis_area
*area
;
4422 struct isis_circuit
*circuit
;
4424 if (args
->event
!= NB_EV_APPLY
)
4427 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
4428 circuit
->lfa_protection
[1] = yang_dnode_get_bool(args
->dnode
, NULL
);
4430 area
= circuit
->area
;
4432 if (circuit
->lfa_protection
[1])
4433 area
->lfa_protected_links
[1]++;
4435 assert(area
->lfa_protected_links
[1] > 0);
4436 area
->lfa_protected_links
[1]--;
4439 lsp_regenerate_schedule(area
, area
->is_type
, 0);
4447 * /frr-interface:lib/interface/frr-isisd:isis/fast-reroute/level-2/lfa/exclude-interface
4449 int lib_interface_isis_fast_reroute_level_2_lfa_exclude_interface_create(
4450 struct nb_cb_create_args
*args
)
4452 struct isis_area
*area
;
4453 struct isis_circuit
*circuit
;
4454 const char *exclude_ifname
;
4456 if (args
->event
!= NB_EV_APPLY
)
4459 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
4460 exclude_ifname
= yang_dnode_get_string(args
->dnode
, NULL
);
4462 isis_lfa_excluded_iface_add(circuit
, ISIS_LEVEL2
, exclude_ifname
);
4463 area
= circuit
->area
;
4465 lsp_regenerate_schedule(area
, area
->is_type
, 0);
4470 int lib_interface_isis_fast_reroute_level_2_lfa_exclude_interface_destroy(
4471 struct nb_cb_destroy_args
*args
)
4473 struct isis_area
*area
;
4474 struct isis_circuit
*circuit
;
4475 const char *exclude_ifname
;
4477 if (args
->event
!= NB_EV_APPLY
)
4480 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
4481 exclude_ifname
= yang_dnode_get_string(args
->dnode
, NULL
);
4483 isis_lfa_excluded_iface_delete(circuit
, ISIS_LEVEL2
, exclude_ifname
);
4484 area
= circuit
->area
;
4486 lsp_regenerate_schedule(area
, area
->is_type
, 0);
4493 * /frr-interface:lib/interface/frr-isisd:isis/fast-reroute/level-2/remote-lfa/enable
4495 int lib_interface_isis_fast_reroute_level_2_remote_lfa_enable_modify(
4496 struct nb_cb_modify_args
*args
)
4498 struct isis_area
*area
;
4499 struct isis_circuit
*circuit
;
4501 if (args
->event
!= NB_EV_APPLY
)
4504 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
4505 circuit
->rlfa_protection
[1] = yang_dnode_get_bool(args
->dnode
, NULL
);
4507 area
= circuit
->area
;
4509 if (circuit
->rlfa_protection
[1])
4510 area
->rlfa_protected_links
[1]++;
4512 assert(area
->rlfa_protected_links
[1] > 0);
4513 area
->rlfa_protected_links
[1]--;
4516 lsp_regenerate_schedule(area
, area
->is_type
, 0);
4524 * /frr-interface:lib/interface/frr-isisd:isis/fast-reroute/level-2/remote-lfa/maximum-metric
4526 int lib_interface_isis_fast_reroute_level_2_remote_lfa_maximum_metric_modify(
4527 struct nb_cb_modify_args
*args
)
4529 struct isis_area
*area
;
4530 struct isis_circuit
*circuit
;
4532 if (args
->event
!= NB_EV_APPLY
)
4535 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
4536 circuit
->rlfa_max_metric
[1] = yang_dnode_get_uint32(args
->dnode
, NULL
);
4538 area
= circuit
->area
;
4540 lsp_regenerate_schedule(area
, area
->is_type
, 0);
4545 int lib_interface_isis_fast_reroute_level_2_remote_lfa_maximum_metric_destroy(
4546 struct nb_cb_destroy_args
*args
)
4548 struct isis_area
*area
;
4549 struct isis_circuit
*circuit
;
4551 if (args
->event
!= NB_EV_APPLY
)
4554 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
4555 circuit
->rlfa_max_metric
[1] = 0;
4557 area
= circuit
->area
;
4559 lsp_regenerate_schedule(area
, area
->is_type
, 0);
4566 * /frr-interface:lib/interface/frr-isisd:isis/fast-reroute/level-2/ti-lfa/enable
4568 int lib_interface_isis_fast_reroute_level_2_ti_lfa_enable_modify(
4569 struct nb_cb_modify_args
*args
)
4571 struct isis_area
*area
;
4572 struct isis_circuit
*circuit
;
4574 if (args
->event
!= NB_EV_APPLY
)
4577 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
4578 circuit
->tilfa_protection
[1] = yang_dnode_get_bool(args
->dnode
, NULL
);
4580 area
= circuit
->area
;
4582 if (circuit
->tilfa_protection
[1])
4583 area
->tilfa_protected_links
[1]++;
4585 assert(area
->tilfa_protected_links
[1] > 0);
4586 area
->tilfa_protected_links
[1]--;
4589 lsp_regenerate_schedule(area
, area
->is_type
, 0);
4597 * /frr-interface:lib/interface/frr-isisd:isis/fast-reroute/level-2/ti-lfa/node-protection
4599 int lib_interface_isis_fast_reroute_level_2_ti_lfa_node_protection_modify(
4600 struct nb_cb_modify_args
*args
)
4602 struct isis_area
*area
;
4603 struct isis_circuit
*circuit
;
4605 if (args
->event
!= NB_EV_APPLY
)
4608 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
4609 circuit
->tilfa_node_protection
[1] =
4610 yang_dnode_get_bool(args
->dnode
, NULL
);
4612 area
= circuit
->area
;
4614 lsp_regenerate_schedule(area
, area
->is_type
, 0);
4621 * /frr-interface:lib/interface/frr-isisd:isis/fast-reroute/level-2/ti-lfa/link-fallback
4623 int lib_interface_isis_fast_reroute_level_2_ti_lfa_link_fallback_modify(
4624 struct nb_cb_modify_args
*args
)
4626 struct isis_area
*area
;
4627 struct isis_circuit
*circuit
;
4629 if (args
->event
!= NB_EV_APPLY
)
4632 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
4633 circuit
->tilfa_link_fallback
[1] =
4634 yang_dnode_get_bool(args
->dnode
, NULL
);
4636 area
= circuit
->area
;
4638 lsp_regenerate_schedule(area
, area
->is_type
, 0);