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"
25 #include "isisd/isisd.h"
26 #include "isisd/isis_nb.h"
27 #include "isisd/isis_common.h"
28 #include "isisd/isis_bfd.h"
29 #include "isisd/isis_circuit.h"
30 #include "isisd/isis_lsp.h"
31 #include "isisd/isis_dynhn.h"
32 #include "isisd/isis_misc.h"
33 #include "isisd/isis_csm.h"
34 #include "isisd/isis_adjacency.h"
35 #include "isisd/isis_spf.h"
36 #include "isisd/isis_spf_private.h"
37 #include "isisd/isis_te.h"
38 #include "isisd/isis_mt.h"
39 #include "isisd/isis_redist.h"
40 #include "isisd/isis_ldp_sync.h"
41 #include "isisd/isis_dr.h"
42 #include "isisd/isis_zebra.h"
45 * XPath: /frr-isisd:isis/instance
47 int isis_instance_create(struct nb_cb_create_args
*args
)
49 struct isis_area
*area
;
53 if (args
->event
!= NB_EV_APPLY
)
55 vrf_name
= yang_dnode_get_string(args
->dnode
, "./vrf");
56 area_tag
= yang_dnode_get_string(args
->dnode
, "./area-tag");
58 area
= isis_area_lookup_by_vrf(area_tag
, vrf_name
);
60 return NB_ERR_INCONSISTENCY
;
62 area
= isis_area_create(area_tag
, vrf_name
);
64 /* save area in dnode to avoid looking it up all the time */
65 nb_running_set_entry(args
->dnode
, area
);
70 int isis_instance_destroy(struct nb_cb_destroy_args
*args
)
72 struct isis_area
*area
;
75 if (args
->event
!= NB_EV_APPLY
)
77 area
= nb_running_unset_entry(args
->dnode
);
79 isis_area_destroy(area
);
81 if (listcount(isis
->area_list
) == 0)
88 * XPath: /frr-isisd:isis/instance/is-type
90 int isis_instance_is_type_modify(struct nb_cb_modify_args
*args
)
92 struct isis_area
*area
;
95 if (args
->event
!= NB_EV_APPLY
)
98 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
99 type
= yang_dnode_get_enum(args
->dnode
, NULL
);
100 isis_area_is_type_set(area
, type
);
106 struct area_addr
*addr
;
110 static int sysid_iter_cb(const struct lyd_node
*dnode
, void *arg
)
112 struct sysid_iter
*iter
= arg
;
113 struct area_addr addr
;
116 net
= yang_dnode_get_string(dnode
, NULL
);
117 addr
.addr_len
= dotformat2buff(addr
.area_addr
, net
);
119 if (memcmp(GETSYSID(iter
->addr
), GETSYSID((&addr
)), ISIS_SYS_ID_LEN
)) {
121 return YANG_ITER_STOP
;
124 return YANG_ITER_CONTINUE
;
128 * XPath: /frr-isisd:isis/instance/area-address
130 int isis_instance_area_address_create(struct nb_cb_create_args
*args
)
132 struct isis_area
*area
;
133 struct area_addr addr
, *addrr
= NULL
, *addrp
= NULL
;
134 struct listnode
*node
;
135 struct sysid_iter iter
;
137 const char *net_title
= yang_dnode_get_string(args
->dnode
, NULL
);
139 switch (args
->event
) {
141 addr
.addr_len
= dotformat2buff(buff
, net_title
);
142 memcpy(addr
.area_addr
, buff
, addr
.addr_len
);
143 if (addr
.area_addr
[addr
.addr_len
- 1] != 0) {
145 args
->errmsg
, args
->errmsg_len
,
146 "nsel byte (last byte) in area address must be 0");
147 return NB_ERR_VALIDATION
;
153 yang_dnode_iterate(sysid_iter_cb
, &iter
, args
->dnode
,
158 args
->errmsg
, args
->errmsg_len
,
159 "System ID must not change when defining additional area addresses");
160 return NB_ERR_VALIDATION
;
164 addrr
= XMALLOC(MTYPE_ISIS_AREA_ADDR
, sizeof(struct area_addr
));
165 addrr
->addr_len
= dotformat2buff(buff
, net_title
);
166 memcpy(addrr
->area_addr
, buff
, addrr
->addr_len
);
167 args
->resource
->ptr
= addrr
;
170 XFREE(MTYPE_ISIS_AREA_ADDR
, args
->resource
->ptr
);
173 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
174 addrr
= args
->resource
->ptr
;
177 if (area
->isis
->sysid_set
== 0) {
179 * First area address - get the SystemID for this router
181 memcpy(area
->isis
->sysid
, GETSYSID(addrr
),
183 area
->isis
->sysid_set
= 1;
185 /* check that we don't already have this address */
186 for (ALL_LIST_ELEMENTS_RO(area
->area_addrs
, node
,
188 if ((addrp
->addr_len
+ ISIS_SYS_ID_LEN
190 != (addrr
->addr_len
))
192 if (!memcmp(addrp
->area_addr
, addrr
->area_addr
,
194 XFREE(MTYPE_ISIS_AREA_ADDR
, addrr
);
195 return NB_OK
; /* silent fail */
200 /*Forget the systemID part of the address */
201 addrr
->addr_len
-= (ISIS_SYS_ID_LEN
+ ISIS_NSEL_LEN
);
202 assert(area
->area_addrs
); /* to silence scan-build sillyness */
203 listnode_add(area
->area_addrs
, addrr
);
205 /* only now we can safely generate our LSPs for this area */
206 if (listcount(area
->area_addrs
) > 0) {
207 if (area
->is_type
& IS_LEVEL_1
)
208 lsp_generate(area
, IS_LEVEL_1
);
209 if (area
->is_type
& IS_LEVEL_2
)
210 lsp_generate(area
, IS_LEVEL_2
);
218 int isis_instance_area_address_destroy(struct nb_cb_destroy_args
*args
)
220 struct area_addr addr
, *addrp
= NULL
;
221 struct listnode
*node
;
223 struct isis_area
*area
;
224 const char *net_title
;
225 struct listnode
*cnode
;
226 struct isis_circuit
*circuit
;
229 if (args
->event
!= NB_EV_APPLY
)
232 net_title
= yang_dnode_get_string(args
->dnode
, NULL
);
233 addr
.addr_len
= dotformat2buff(buff
, net_title
);
234 memcpy(addr
.area_addr
, buff
, (int)addr
.addr_len
);
235 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
237 for (ALL_LIST_ELEMENTS_RO(area
->area_addrs
, node
, addrp
)) {
238 if ((addrp
->addr_len
+ ISIS_SYS_ID_LEN
+ 1) == addr
.addr_len
239 && !memcmp(addrp
->area_addr
, addr
.area_addr
, addr
.addr_len
))
243 return NB_ERR_INCONSISTENCY
;
245 listnode_delete(area
->area_addrs
, addrp
);
246 XFREE(MTYPE_ISIS_AREA_ADDR
, addrp
);
248 * Last area address - reset the SystemID for this router
250 if (listcount(area
->area_addrs
) == 0) {
251 for (ALL_LIST_ELEMENTS_RO(area
->circuit_list
, cnode
, circuit
))
252 for (lvl
= IS_LEVEL_1
; lvl
<= IS_LEVEL_2
; ++lvl
) {
253 if (circuit
->u
.bc
.is_dr
[lvl
- 1])
254 isis_dr_resign(circuit
, lvl
);
256 memset(area
->isis
->sysid
, 0, ISIS_SYS_ID_LEN
);
257 area
->isis
->sysid_set
= 0;
259 zlog_debug("Router has no SystemID");
266 * XPath: /frr-isisd:isis/instance/dynamic-hostname
268 int isis_instance_dynamic_hostname_modify(struct nb_cb_modify_args
*args
)
270 struct isis_area
*area
;
272 if (args
->event
!= NB_EV_APPLY
)
275 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
276 isis_area_dynhostname_set(area
, yang_dnode_get_bool(args
->dnode
, NULL
));
282 * XPath: /frr-isisd:isis/instance/attach-send
284 int isis_instance_attached_send_modify(struct nb_cb_modify_args
*args
)
286 struct isis_area
*area
;
289 if (args
->event
!= NB_EV_APPLY
)
292 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
293 attached
= yang_dnode_get_bool(args
->dnode
, NULL
);
294 isis_area_attached_bit_send_set(area
, attached
);
300 * XPath: /frr-isisd:isis/instance/attach-receive-ignore
302 int isis_instance_attached_receive_modify(struct nb_cb_modify_args
*args
)
304 struct isis_area
*area
;
307 if (args
->event
!= NB_EV_APPLY
)
310 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
311 attached
= yang_dnode_get_bool(args
->dnode
, NULL
);
312 isis_area_attached_bit_receive_set(area
, attached
);
318 * XPath: /frr-isisd:isis/instance/attached
320 int isis_instance_attached_modify(struct nb_cb_modify_args
*args
)
326 * XPath: /frr-isisd:isis/instance/overload/enabled
328 int isis_instance_overload_enabled_modify(struct nb_cb_modify_args
*args
)
330 struct isis_area
*area
;
333 if (args
->event
!= NB_EV_APPLY
)
336 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
337 overload
= yang_dnode_get_bool(args
->dnode
, NULL
);
338 area
->overload_configured
= overload
;
340 isis_area_overload_bit_set(area
, overload
);
346 * XPath: /frr-isisd:isis/instance/overload/on-startup
348 int isis_instance_overload_on_startup_modify(struct nb_cb_modify_args
*args
)
350 struct isis_area
*area
;
351 uint32_t overload_time
;
353 if (args
->event
!= NB_EV_APPLY
)
356 overload_time
= yang_dnode_get_uint32(args
->dnode
, NULL
);
357 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
358 isis_area_overload_on_startup_set(area
, overload_time
);
364 * XPath: /frr-isisd:isis/instance/metric-style
366 int isis_instance_metric_style_modify(struct nb_cb_modify_args
*args
)
368 struct isis_area
*area
;
369 bool old_metric
, new_metric
;
370 enum isis_metric_style metric_style
=
371 yang_dnode_get_enum(args
->dnode
, NULL
);
373 if (args
->event
!= NB_EV_APPLY
)
376 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
377 old_metric
= (metric_style
== ISIS_WIDE_METRIC
) ? false : true;
378 new_metric
= (metric_style
== ISIS_NARROW_METRIC
) ? false : true;
379 isis_area_metricstyle_set(area
, old_metric
, new_metric
);
385 * XPath: /frr-isisd:isis/instance/purge-originator
387 int isis_instance_purge_originator_modify(struct nb_cb_modify_args
*args
)
389 struct isis_area
*area
;
391 if (args
->event
!= NB_EV_APPLY
)
394 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
395 area
->purge_originator
= yang_dnode_get_bool(args
->dnode
, NULL
);
401 * XPath: /frr-isisd:isis/instance/lsp/mtu
403 int isis_instance_lsp_mtu_modify(struct nb_cb_modify_args
*args
)
405 uint16_t lsp_mtu
= yang_dnode_get_uint16(args
->dnode
, NULL
);
406 struct isis_area
*area
;
408 switch (args
->event
) {
414 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
415 isis_area_lsp_mtu_set(area
, lsp_mtu
);
423 * XPath: /frr-isisd:isis/instance/lsp/timers/level-1/refresh-interval
425 int isis_instance_lsp_refresh_interval_level_1_modify(
426 struct nb_cb_modify_args
*args
)
428 struct isis_area
*area
;
431 if (args
->event
!= NB_EV_APPLY
)
434 refr_int
= yang_dnode_get_uint16(args
->dnode
, NULL
);
435 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
436 isis_area_lsp_refresh_set(area
, IS_LEVEL_1
, refr_int
);
442 * XPath: /frr-isisd:isis/instance/lsp/timers/level-2/refresh-interval
444 int isis_instance_lsp_refresh_interval_level_2_modify(
445 struct nb_cb_modify_args
*args
)
447 struct isis_area
*area
;
450 if (args
->event
!= NB_EV_APPLY
)
453 refr_int
= yang_dnode_get_uint16(args
->dnode
, NULL
);
454 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
455 isis_area_lsp_refresh_set(area
, IS_LEVEL_2
, refr_int
);
461 * XPath: /frr-isisd:isis/instance/lsp/timers/level-1/maximum-lifetime
463 int isis_instance_lsp_maximum_lifetime_level_1_modify(
464 struct nb_cb_modify_args
*args
)
466 struct isis_area
*area
;
469 if (args
->event
!= NB_EV_APPLY
)
472 max_lt
= yang_dnode_get_uint16(args
->dnode
, NULL
);
473 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
474 isis_area_max_lsp_lifetime_set(area
, IS_LEVEL_1
, max_lt
);
480 * XPath: /frr-isisd:isis/instance/lsp/timers/level-2/maximum-lifetime
482 int isis_instance_lsp_maximum_lifetime_level_2_modify(
483 struct nb_cb_modify_args
*args
)
485 struct isis_area
*area
;
488 if (args
->event
!= NB_EV_APPLY
)
491 max_lt
= yang_dnode_get_uint16(args
->dnode
, NULL
);
492 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
493 isis_area_max_lsp_lifetime_set(area
, IS_LEVEL_2
, max_lt
);
499 * XPath: /frr-isisd:isis/instance/lsp/timers/level-1/generation-interval
501 int isis_instance_lsp_generation_interval_level_1_modify(
502 struct nb_cb_modify_args
*args
)
504 struct isis_area
*area
;
507 if (args
->event
!= NB_EV_APPLY
)
510 gen_int
= yang_dnode_get_uint16(args
->dnode
, NULL
);
511 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
512 area
->lsp_gen_interval
[0] = gen_int
;
518 * XPath: /frr-isisd:isis/instance/lsp/timers/level-2/generation-interval
520 int isis_instance_lsp_generation_interval_level_2_modify(
521 struct nb_cb_modify_args
*args
)
523 struct isis_area
*area
;
526 if (args
->event
!= NB_EV_APPLY
)
529 gen_int
= yang_dnode_get_uint16(args
->dnode
, NULL
);
530 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
531 area
->lsp_gen_interval
[1] = gen_int
;
537 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay
539 void ietf_backoff_delay_apply_finish(struct nb_cb_apply_finish_args
*args
)
541 long init_delay
= yang_dnode_get_uint16(args
->dnode
, "./init-delay");
542 long short_delay
= yang_dnode_get_uint16(args
->dnode
, "./short-delay");
543 long long_delay
= yang_dnode_get_uint16(args
->dnode
, "./long-delay");
544 long holddown
= yang_dnode_get_uint16(args
->dnode
, "./hold-down");
546 yang_dnode_get_uint16(args
->dnode
, "./time-to-learn");
547 struct isis_area
*area
= nb_running_get_entry(args
->dnode
, NULL
, true);
548 size_t bufsiz
= strlen(area
->area_tag
) + sizeof("IS-IS Lx");
549 char *buf
= XCALLOC(MTYPE_TMP
, bufsiz
);
551 snprintf(buf
, bufsiz
, "IS-IS %s L1", area
->area_tag
);
552 spf_backoff_free(area
->spf_delay_ietf
[0]);
553 area
->spf_delay_ietf
[0] =
554 spf_backoff_new(master
, buf
, init_delay
, short_delay
,
555 long_delay
, holddown
, timetolearn
);
557 snprintf(buf
, bufsiz
, "IS-IS %s L2", area
->area_tag
);
558 spf_backoff_free(area
->spf_delay_ietf
[1]);
559 area
->spf_delay_ietf
[1] =
560 spf_backoff_new(master
, buf
, init_delay
, short_delay
,
561 long_delay
, holddown
, timetolearn
);
563 XFREE(MTYPE_TMP
, buf
);
566 int isis_instance_spf_ietf_backoff_delay_create(struct nb_cb_create_args
*args
)
568 /* All the work is done in the apply_finish */
572 int isis_instance_spf_ietf_backoff_delay_destroy(
573 struct nb_cb_destroy_args
*args
)
575 struct isis_area
*area
;
577 if (args
->event
!= NB_EV_APPLY
)
580 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
581 spf_backoff_free(area
->spf_delay_ietf
[0]);
582 spf_backoff_free(area
->spf_delay_ietf
[1]);
583 area
->spf_delay_ietf
[0] = NULL
;
584 area
->spf_delay_ietf
[1] = NULL
;
590 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay/init-delay
592 int isis_instance_spf_ietf_backoff_delay_init_delay_modify(
593 struct nb_cb_modify_args
*args
)
595 /* All the work is done in the apply_finish */
600 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay/short-delay
602 int isis_instance_spf_ietf_backoff_delay_short_delay_modify(
603 struct nb_cb_modify_args
*args
)
605 /* All the work is done in the apply_finish */
610 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay/long-delay
612 int isis_instance_spf_ietf_backoff_delay_long_delay_modify(
613 struct nb_cb_modify_args
*args
)
615 /* All the work is done in the apply_finish */
620 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay/hold-down
622 int isis_instance_spf_ietf_backoff_delay_hold_down_modify(
623 struct nb_cb_modify_args
*args
)
625 /* All the work is done in the apply_finish */
630 * XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay/time-to-learn
632 int isis_instance_spf_ietf_backoff_delay_time_to_learn_modify(
633 struct nb_cb_modify_args
*args
)
635 /* All the work is done in the apply_finish */
640 * XPath: /frr-isisd:isis/instance/spf/minimum-interval/level-1
642 int isis_instance_spf_minimum_interval_level_1_modify(
643 struct nb_cb_modify_args
*args
)
645 struct isis_area
*area
;
647 if (args
->event
!= NB_EV_APPLY
)
650 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
651 area
->min_spf_interval
[0] = yang_dnode_get_uint16(args
->dnode
, NULL
);
657 * XPath: /frr-isisd:isis/instance/spf/minimum-interval/level-2
659 int isis_instance_spf_minimum_interval_level_2_modify(
660 struct nb_cb_modify_args
*args
)
662 struct isis_area
*area
;
664 if (args
->event
!= NB_EV_APPLY
)
667 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
668 area
->min_spf_interval
[1] = yang_dnode_get_uint16(args
->dnode
, NULL
);
675 * /frr-isisd:isis/instance/spf/prefix-priorities/critical/access-list-name
677 int isis_instance_spf_prefix_priorities_critical_access_list_name_modify(
678 struct nb_cb_modify_args
*args
)
680 struct isis_area
*area
;
681 const char *acl_name
;
682 struct spf_prefix_priority_acl
*ppa
;
684 if (args
->event
!= NB_EV_APPLY
)
687 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
688 acl_name
= yang_dnode_get_string(args
->dnode
, NULL
);
690 ppa
= &area
->spf_prefix_priorities
[SPF_PREFIX_PRIO_CRITICAL
];
691 XFREE(MTYPE_ISIS_ACL_NAME
, ppa
->name
);
692 ppa
->name
= XSTRDUP(MTYPE_ISIS_ACL_NAME
, acl_name
);
693 ppa
->list_v4
= access_list_lookup(AFI_IP
, acl_name
);
694 ppa
->list_v6
= access_list_lookup(AFI_IP6
, acl_name
);
695 lsp_regenerate_schedule(area
, area
->is_type
, 0);
700 int isis_instance_spf_prefix_priorities_critical_access_list_name_destroy(
701 struct nb_cb_destroy_args
*args
)
703 struct isis_area
*area
;
704 struct spf_prefix_priority_acl
*ppa
;
706 if (args
->event
!= NB_EV_APPLY
)
709 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
711 ppa
= &area
->spf_prefix_priorities
[SPF_PREFIX_PRIO_CRITICAL
];
712 XFREE(MTYPE_ISIS_ACL_NAME
, ppa
->name
);
715 lsp_regenerate_schedule(area
, area
->is_type
, 0);
721 * XPath: /frr-isisd:isis/instance/spf/prefix-priorities/high/access-list-name
723 int isis_instance_spf_prefix_priorities_high_access_list_name_modify(
724 struct nb_cb_modify_args
*args
)
726 struct isis_area
*area
;
727 const char *acl_name
;
728 struct spf_prefix_priority_acl
*ppa
;
730 if (args
->event
!= NB_EV_APPLY
)
733 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
734 acl_name
= yang_dnode_get_string(args
->dnode
, NULL
);
736 ppa
= &area
->spf_prefix_priorities
[SPF_PREFIX_PRIO_HIGH
];
737 XFREE(MTYPE_ISIS_ACL_NAME
, ppa
->name
);
738 ppa
->name
= XSTRDUP(MTYPE_ISIS_ACL_NAME
, acl_name
);
739 ppa
->list_v4
= access_list_lookup(AFI_IP
, acl_name
);
740 ppa
->list_v6
= access_list_lookup(AFI_IP6
, acl_name
);
741 lsp_regenerate_schedule(area
, area
->is_type
, 0);
746 int isis_instance_spf_prefix_priorities_high_access_list_name_destroy(
747 struct nb_cb_destroy_args
*args
)
749 struct isis_area
*area
;
750 struct spf_prefix_priority_acl
*ppa
;
752 if (args
->event
!= NB_EV_APPLY
)
755 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
757 ppa
= &area
->spf_prefix_priorities
[SPF_PREFIX_PRIO_HIGH
];
758 XFREE(MTYPE_ISIS_ACL_NAME
, ppa
->name
);
761 lsp_regenerate_schedule(area
, area
->is_type
, 0);
767 * XPath: /frr-isisd:isis/instance/spf/prefix-priorities/medium/access-list-name
769 int isis_instance_spf_prefix_priorities_medium_access_list_name_modify(
770 struct nb_cb_modify_args
*args
)
772 struct isis_area
*area
;
773 const char *acl_name
;
774 struct spf_prefix_priority_acl
*ppa
;
776 if (args
->event
!= NB_EV_APPLY
)
779 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
780 acl_name
= yang_dnode_get_string(args
->dnode
, NULL
);
782 ppa
= &area
->spf_prefix_priorities
[SPF_PREFIX_PRIO_MEDIUM
];
783 XFREE(MTYPE_ISIS_ACL_NAME
, ppa
->name
);
784 ppa
->name
= XSTRDUP(MTYPE_ISIS_ACL_NAME
, acl_name
);
785 ppa
->list_v4
= access_list_lookup(AFI_IP
, acl_name
);
786 ppa
->list_v6
= access_list_lookup(AFI_IP6
, acl_name
);
787 lsp_regenerate_schedule(area
, area
->is_type
, 0);
792 int isis_instance_spf_prefix_priorities_medium_access_list_name_destroy(
793 struct nb_cb_destroy_args
*args
)
795 struct isis_area
*area
;
796 struct spf_prefix_priority_acl
*ppa
;
798 if (args
->event
!= NB_EV_APPLY
)
801 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
803 ppa
= &area
->spf_prefix_priorities
[SPF_PREFIX_PRIO_MEDIUM
];
804 XFREE(MTYPE_ISIS_ACL_NAME
, ppa
->name
);
807 lsp_regenerate_schedule(area
, area
->is_type
, 0);
813 * XPath: /frr-isisd:isis/instance/area-password
815 void area_password_apply_finish(struct nb_cb_apply_finish_args
*args
)
817 const char *password
= yang_dnode_get_string(args
->dnode
, "./password");
818 struct isis_area
*area
= nb_running_get_entry(args
->dnode
, NULL
, true);
819 int pass_type
= yang_dnode_get_enum(args
->dnode
, "./password-type");
821 yang_dnode_get_enum(args
->dnode
, "./authenticate-snp");
824 case ISIS_PASSWD_TYPE_CLEARTXT
:
825 isis_area_passwd_cleartext_set(area
, IS_LEVEL_1
, password
,
828 case ISIS_PASSWD_TYPE_HMAC_MD5
:
829 isis_area_passwd_hmac_md5_set(area
, IS_LEVEL_1
, password
,
835 int isis_instance_area_password_create(struct nb_cb_create_args
*args
)
837 /* actual setting is done in apply_finish */
841 int isis_instance_area_password_destroy(struct nb_cb_destroy_args
*args
)
843 struct isis_area
*area
;
845 if (args
->event
!= NB_EV_APPLY
)
848 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
849 isis_area_passwd_unset(area
, IS_LEVEL_1
);
855 * XPath: /frr-isisd:isis/instance/area-password/password
857 int isis_instance_area_password_password_modify(struct nb_cb_modify_args
*args
)
859 /* actual setting is done in apply_finish */
864 * XPath: /frr-isisd:isis/instance/area-password/password-type
866 int isis_instance_area_password_password_type_modify(
867 struct nb_cb_modify_args
*args
)
869 /* actual setting is done in apply_finish */
874 * XPath: /frr-isisd:isis/instance/area-password/authenticate-snp
876 int isis_instance_area_password_authenticate_snp_modify(
877 struct nb_cb_modify_args
*args
)
879 /* actual setting is done in apply_finish */
884 * XPath: /frr-isisd:isis/instance/domain-password
886 void domain_password_apply_finish(struct nb_cb_apply_finish_args
*args
)
888 const char *password
= yang_dnode_get_string(args
->dnode
, "./password");
889 struct isis_area
*area
= nb_running_get_entry(args
->dnode
, NULL
, true);
890 int pass_type
= yang_dnode_get_enum(args
->dnode
, "./password-type");
892 yang_dnode_get_enum(args
->dnode
, "./authenticate-snp");
895 case ISIS_PASSWD_TYPE_CLEARTXT
:
896 isis_area_passwd_cleartext_set(area
, IS_LEVEL_2
, password
,
899 case ISIS_PASSWD_TYPE_HMAC_MD5
:
900 isis_area_passwd_hmac_md5_set(area
, IS_LEVEL_2
, password
,
906 int isis_instance_domain_password_create(struct nb_cb_create_args
*args
)
908 /* actual setting is done in apply_finish */
912 int isis_instance_domain_password_destroy(struct nb_cb_destroy_args
*args
)
914 struct isis_area
*area
;
916 if (args
->event
!= NB_EV_APPLY
)
919 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
920 isis_area_passwd_unset(area
, IS_LEVEL_2
);
926 * XPath: /frr-isisd:isis/instance/domain-password/password
928 int isis_instance_domain_password_password_modify(
929 struct nb_cb_modify_args
*args
)
931 /* actual setting is done in apply_finish */
936 * XPath: /frr-isisd:isis/instance/domain-password/password-type
938 int isis_instance_domain_password_password_type_modify(
939 struct nb_cb_modify_args
*args
)
941 /* actual setting is done in apply_finish */
946 * XPath: /frr-isisd:isis/instance/domain-password/authenticate-snp
948 int isis_instance_domain_password_authenticate_snp_modify(
949 struct nb_cb_modify_args
*args
)
951 /* actual setting is done in apply_finish */
956 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv4
958 void default_info_origin_apply_finish(const struct lyd_node
*dnode
, int family
)
960 int originate_type
= DEFAULT_ORIGINATE
;
961 unsigned long metric
= 0;
962 const char *routemap
= NULL
;
963 struct isis_area
*area
= nb_running_get_entry(dnode
, NULL
, true);
964 int level
= yang_dnode_get_enum(dnode
, "./level");
966 if (yang_dnode_get_bool(dnode
, "./always")) {
967 originate_type
= DEFAULT_ORIGINATE_ALWAYS
;
968 } else if (family
== AF_INET6
) {
970 "%s: Zebra doesn't implement default-originate for IPv6 yet, so use with care or use default-originate always.",
974 if (yang_dnode_exists(dnode
, "./metric"))
975 metric
= yang_dnode_get_uint32(dnode
, "./metric");
976 if (yang_dnode_exists(dnode
, "./route-map"))
977 routemap
= yang_dnode_get_string(dnode
, "./route-map");
979 isis_redist_set(area
, level
, family
, DEFAULT_ROUTE
, metric
, routemap
,
983 void default_info_origin_ipv4_apply_finish(struct nb_cb_apply_finish_args
*args
)
985 default_info_origin_apply_finish(args
->dnode
, AF_INET
);
988 void default_info_origin_ipv6_apply_finish(struct nb_cb_apply_finish_args
*args
)
990 default_info_origin_apply_finish(args
->dnode
, AF_INET6
);
993 int isis_instance_default_information_originate_ipv4_create(
994 struct nb_cb_create_args
*args
)
996 /* It's all done by default_info_origin_apply_finish */
1000 int isis_instance_default_information_originate_ipv4_destroy(
1001 struct nb_cb_destroy_args
*args
)
1003 struct isis_area
*area
;
1006 if (args
->event
!= NB_EV_APPLY
)
1009 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1010 level
= yang_dnode_get_enum(args
->dnode
, "./level");
1011 isis_redist_unset(area
, level
, AF_INET
, DEFAULT_ROUTE
);
1017 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv4/always
1019 int isis_instance_default_information_originate_ipv4_always_modify(
1020 struct nb_cb_modify_args
*args
)
1022 /* It's all done by default_info_origin_apply_finish */
1027 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv4/route-map
1029 int isis_instance_default_information_originate_ipv4_route_map_modify(
1030 struct nb_cb_modify_args
*args
)
1032 /* It's all done by default_info_origin_apply_finish */
1036 int isis_instance_default_information_originate_ipv4_route_map_destroy(
1037 struct nb_cb_destroy_args
*args
)
1039 /* It's all done by default_info_origin_apply_finish */
1044 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv4/metric
1046 int isis_instance_default_information_originate_ipv4_metric_modify(
1047 struct nb_cb_modify_args
*args
)
1049 /* It's all done by default_info_origin_apply_finish */
1054 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv6
1056 int isis_instance_default_information_originate_ipv6_create(
1057 struct nb_cb_create_args
*args
)
1059 /* It's all done by default_info_origin_apply_finish */
1063 int isis_instance_default_information_originate_ipv6_destroy(
1064 struct nb_cb_destroy_args
*args
)
1066 struct isis_area
*area
;
1069 if (args
->event
!= NB_EV_APPLY
)
1072 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1073 level
= yang_dnode_get_enum(args
->dnode
, "./level");
1074 isis_redist_unset(area
, level
, AF_INET6
, DEFAULT_ROUTE
);
1080 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv6/always
1082 int isis_instance_default_information_originate_ipv6_always_modify(
1083 struct nb_cb_modify_args
*args
)
1085 /* It's all done by default_info_origin_apply_finish */
1090 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv6/route-map
1092 int isis_instance_default_information_originate_ipv6_route_map_modify(
1093 struct nb_cb_modify_args
*args
)
1095 /* It's all done by default_info_origin_apply_finish */
1099 int isis_instance_default_information_originate_ipv6_route_map_destroy(
1100 struct nb_cb_destroy_args
*args
)
1102 /* It's all done by default_info_origin_apply_finish */
1107 * XPath: /frr-isisd:isis/instance/default-information-originate/ipv6/metric
1109 int isis_instance_default_information_originate_ipv6_metric_modify(
1110 struct nb_cb_modify_args
*args
)
1112 /* It's all done by default_info_origin_apply_finish */
1117 * XPath: /frr-isisd:isis/instance/redistribute/ipv4
1119 void redistribute_apply_finish(const struct lyd_node
*dnode
, int family
)
1121 assert(family
== AF_INET
|| family
== AF_INET6
);
1123 unsigned long metric
= 0;
1124 const char *routemap
= NULL
;
1125 struct isis_area
*area
;
1127 type
= yang_dnode_get_enum(dnode
, "./protocol");
1128 level
= yang_dnode_get_enum(dnode
, "./level");
1129 area
= nb_running_get_entry(dnode
, NULL
, true);
1131 if (yang_dnode_exists(dnode
, "./metric"))
1132 metric
= yang_dnode_get_uint32(dnode
, "./metric");
1133 if (yang_dnode_exists(dnode
, "./route-map"))
1134 routemap
= yang_dnode_get_string(dnode
, "./route-map");
1136 isis_redist_set(area
, level
, family
, type
, metric
, routemap
, 0);
1139 void redistribute_ipv4_apply_finish(struct nb_cb_apply_finish_args
*args
)
1141 redistribute_apply_finish(args
->dnode
, AF_INET
);
1144 void redistribute_ipv6_apply_finish(struct nb_cb_apply_finish_args
*args
)
1146 redistribute_apply_finish(args
->dnode
, AF_INET6
);
1149 int isis_instance_redistribute_ipv4_create(struct nb_cb_create_args
*args
)
1151 /* It's all done by redistribute_apply_finish */
1155 int isis_instance_redistribute_ipv4_destroy(struct nb_cb_destroy_args
*args
)
1157 struct isis_area
*area
;
1160 if (args
->event
!= NB_EV_APPLY
)
1163 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1164 level
= yang_dnode_get_enum(args
->dnode
, "./level");
1165 type
= yang_dnode_get_enum(args
->dnode
, "./protocol");
1166 isis_redist_unset(area
, level
, AF_INET
, type
);
1172 * XPath: /frr-isisd:isis/instance/redistribute/ipv4/route-map
1174 int isis_instance_redistribute_ipv4_route_map_modify(
1175 struct nb_cb_modify_args
*args
)
1177 /* It's all done by redistribute_apply_finish */
1181 int isis_instance_redistribute_ipv4_route_map_destroy(
1182 struct nb_cb_destroy_args
*args
)
1184 /* It's all done by redistribute_apply_finish */
1189 * XPath: /frr-isisd:isis/instance/redistribute/ipv4/metric
1191 int isis_instance_redistribute_ipv4_metric_modify(
1192 struct nb_cb_modify_args
*args
)
1194 /* It's all done by redistribute_apply_finish */
1199 * XPath: /frr-isisd:isis/instance/redistribute/ipv6
1201 int isis_instance_redistribute_ipv6_create(struct nb_cb_create_args
*args
)
1203 /* It's all done by redistribute_apply_finish */
1207 int isis_instance_redistribute_ipv6_destroy(struct nb_cb_destroy_args
*args
)
1209 struct isis_area
*area
;
1212 if (args
->event
!= NB_EV_APPLY
)
1215 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1216 level
= yang_dnode_get_enum(args
->dnode
, "./level");
1217 type
= yang_dnode_get_enum(args
->dnode
, "./protocol");
1218 isis_redist_unset(area
, level
, AF_INET6
, type
);
1224 * XPath: /frr-isisd:isis/instance/redistribute/ipv6/route-map
1226 int isis_instance_redistribute_ipv6_route_map_modify(
1227 struct nb_cb_modify_args
*args
)
1229 /* It's all done by redistribute_apply_finish */
1233 int isis_instance_redistribute_ipv6_route_map_destroy(
1234 struct nb_cb_destroy_args
*args
)
1236 /* It's all done by redistribute_apply_finish */
1241 * XPath: /frr-isisd:isis/instance/redistribute/ipv6/metric
1243 int isis_instance_redistribute_ipv6_metric_modify(
1244 struct nb_cb_modify_args
*args
)
1246 /* It's all done by redistribute_apply_finish */
1251 * XPath: /frr-isisd:isis/instance/multi-topology/ipv4-multicast
1253 static int isis_multi_topology_common(enum nb_event event
,
1254 const struct lyd_node
*dnode
,
1255 char *errmsg
, size_t errmsg_len
,
1256 const char *topology
, bool create
)
1258 struct isis_area
*area
;
1259 struct isis_area_mt_setting
*setting
;
1260 uint16_t mtid
= isis_str2mtid(topology
);
1263 case NB_EV_VALIDATE
:
1264 if (mtid
== (uint16_t)-1) {
1265 snprintf(errmsg
, errmsg_len
, "Unknown topology %s",
1267 return NB_ERR_VALIDATION
;
1274 area
= nb_running_get_entry(dnode
, NULL
, true);
1275 setting
= area_get_mt_setting(area
, mtid
);
1276 setting
->enabled
= create
;
1277 lsp_regenerate_schedule(area
, IS_LEVEL_1
| IS_LEVEL_2
, 0);
1284 static int isis_multi_topology_overload_common(enum nb_event event
,
1285 const struct lyd_node
*dnode
,
1286 const char *topology
)
1288 struct isis_area
*area
;
1289 struct isis_area_mt_setting
*setting
;
1290 uint16_t mtid
= isis_str2mtid(topology
);
1292 /* validation is done in isis_multi_topology_common */
1293 if (event
!= NB_EV_APPLY
)
1296 area
= nb_running_get_entry(dnode
, NULL
, true);
1297 setting
= area_get_mt_setting(area
, mtid
);
1298 setting
->overload
= yang_dnode_get_bool(dnode
, NULL
);
1299 if (setting
->enabled
)
1300 lsp_regenerate_schedule(area
, IS_LEVEL_1
| IS_LEVEL_2
, 0);
1305 int isis_instance_multi_topology_ipv4_multicast_create(
1306 struct nb_cb_create_args
*args
)
1308 return isis_multi_topology_common(args
->event
, args
->dnode
,
1309 args
->errmsg
, args
->errmsg_len
,
1310 "ipv4-multicast", true);
1313 int isis_instance_multi_topology_ipv4_multicast_destroy(
1314 struct nb_cb_destroy_args
*args
)
1316 return isis_multi_topology_common(args
->event
, args
->dnode
,
1317 args
->errmsg
, args
->errmsg_len
,
1318 "ipv4-multicast", false);
1322 * XPath: /frr-isisd:isis/instance/multi-topology/ipv4-multicast/overload
1324 int isis_instance_multi_topology_ipv4_multicast_overload_modify(
1325 struct nb_cb_modify_args
*args
)
1327 return isis_multi_topology_overload_common(args
->event
, args
->dnode
,
1332 * XPath: /frr-isisd:isis/instance/multi-topology/ipv4-management
1334 int isis_instance_multi_topology_ipv4_management_create(
1335 struct nb_cb_create_args
*args
)
1337 return isis_multi_topology_common(args
->event
, args
->dnode
,
1338 args
->errmsg
, args
->errmsg_len
,
1342 int isis_instance_multi_topology_ipv4_management_destroy(
1343 struct nb_cb_destroy_args
*args
)
1345 return isis_multi_topology_common(args
->event
, args
->dnode
,
1346 args
->errmsg
, args
->errmsg_len
,
1347 "ipv4-mgmt", false);
1351 * XPath: /frr-isisd:isis/instance/multi-topology/ipv4-management/overload
1353 int isis_instance_multi_topology_ipv4_management_overload_modify(
1354 struct nb_cb_modify_args
*args
)
1356 return isis_multi_topology_overload_common(args
->event
, args
->dnode
,
1361 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-unicast
1363 int isis_instance_multi_topology_ipv6_unicast_create(
1364 struct nb_cb_create_args
*args
)
1366 return isis_multi_topology_common(args
->event
, args
->dnode
,
1367 args
->errmsg
, args
->errmsg_len
,
1368 "ipv6-unicast", true);
1371 int isis_instance_multi_topology_ipv6_unicast_destroy(
1372 struct nb_cb_destroy_args
*args
)
1374 return isis_multi_topology_common(args
->event
, args
->dnode
,
1375 args
->errmsg
, args
->errmsg_len
,
1376 "ipv6-unicast", false);
1380 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-unicast/overload
1382 int isis_instance_multi_topology_ipv6_unicast_overload_modify(
1383 struct nb_cb_modify_args
*args
)
1385 return isis_multi_topology_overload_common(args
->event
, args
->dnode
,
1390 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-multicast
1392 int isis_instance_multi_topology_ipv6_multicast_create(
1393 struct nb_cb_create_args
*args
)
1395 return isis_multi_topology_common(args
->event
, args
->dnode
,
1396 args
->errmsg
, args
->errmsg_len
,
1397 "ipv6-multicast", true);
1400 int isis_instance_multi_topology_ipv6_multicast_destroy(
1401 struct nb_cb_destroy_args
*args
)
1403 return isis_multi_topology_common(args
->event
, args
->dnode
,
1404 args
->errmsg
, args
->errmsg_len
,
1405 "ipv6-multicast", false);
1409 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-multicast/overload
1411 int isis_instance_multi_topology_ipv6_multicast_overload_modify(
1412 struct nb_cb_modify_args
*args
)
1414 return isis_multi_topology_overload_common(args
->event
, args
->dnode
,
1419 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-management
1421 int isis_instance_multi_topology_ipv6_management_create(
1422 struct nb_cb_create_args
*args
)
1424 return isis_multi_topology_common(args
->event
, args
->dnode
,
1425 args
->errmsg
, args
->errmsg_len
,
1429 int isis_instance_multi_topology_ipv6_management_destroy(
1430 struct nb_cb_destroy_args
*args
)
1432 return isis_multi_topology_common(args
->event
, args
->dnode
,
1433 args
->errmsg
, args
->errmsg_len
,
1434 "ipv6-mgmt", false);
1438 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-management/overload
1440 int isis_instance_multi_topology_ipv6_management_overload_modify(
1441 struct nb_cb_modify_args
*args
)
1443 return isis_multi_topology_overload_common(args
->event
, args
->dnode
,
1448 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-dstsrc
1450 int isis_instance_multi_topology_ipv6_dstsrc_create(
1451 struct nb_cb_create_args
*args
)
1453 return isis_multi_topology_common(args
->event
, args
->dnode
,
1454 args
->errmsg
, args
->errmsg_len
,
1455 "ipv6-dstsrc", true);
1458 int isis_instance_multi_topology_ipv6_dstsrc_destroy(
1459 struct nb_cb_destroy_args
*args
)
1461 return isis_multi_topology_common(args
->event
, args
->dnode
,
1462 args
->errmsg
, args
->errmsg_len
,
1463 "ipv6-dstsrc", false);
1467 * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-dstsrc/overload
1469 int isis_instance_multi_topology_ipv6_dstsrc_overload_modify(
1470 struct nb_cb_modify_args
*args
)
1472 return isis_multi_topology_overload_common(args
->event
, args
->dnode
,
1477 * XPath: /frr-isisd:isis/instance/fast-reroute/level-1/lfa/load-sharing
1479 int isis_instance_fast_reroute_level_1_lfa_load_sharing_modify(
1480 struct nb_cb_modify_args
*args
)
1482 struct isis_area
*area
;
1484 if (args
->event
!= NB_EV_APPLY
)
1487 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1488 area
->lfa_load_sharing
[0] = yang_dnode_get_bool(args
->dnode
, NULL
);
1489 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1495 * XPath: /frr-isisd:isis/instance/fast-reroute/level-1/lfa/priority-limit
1497 int isis_instance_fast_reroute_level_1_lfa_priority_limit_modify(
1498 struct nb_cb_modify_args
*args
)
1500 struct isis_area
*area
;
1502 if (args
->event
!= NB_EV_APPLY
)
1505 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1506 area
->lfa_priority_limit
[0] = yang_dnode_get_enum(args
->dnode
, NULL
);
1507 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1512 int isis_instance_fast_reroute_level_1_lfa_priority_limit_destroy(
1513 struct nb_cb_destroy_args
*args
)
1515 struct isis_area
*area
;
1517 if (args
->event
!= NB_EV_APPLY
)
1520 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1521 area
->lfa_priority_limit
[0] = SPF_PREFIX_PRIO_LOW
;
1522 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1528 * XPath: /frr-isisd:isis/instance/fast-reroute/level-1/lfa/tiebreaker
1530 int isis_instance_fast_reroute_level_1_lfa_tiebreaker_create(
1531 struct nb_cb_create_args
*args
)
1533 struct isis_area
*area
;
1535 enum lfa_tiebreaker_type type
;
1536 struct lfa_tiebreaker
*tie_b
;
1538 if (args
->event
!= NB_EV_APPLY
)
1541 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1542 index
= yang_dnode_get_uint8(args
->dnode
, "./index");
1543 type
= yang_dnode_get_enum(args
->dnode
, "./type");
1545 tie_b
= isis_lfa_tiebreaker_add(area
, ISIS_LEVEL1
, index
, type
);
1546 nb_running_set_entry(args
->dnode
, tie_b
);
1547 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1552 int isis_instance_fast_reroute_level_1_lfa_tiebreaker_destroy(
1553 struct nb_cb_destroy_args
*args
)
1555 struct lfa_tiebreaker
*tie_b
;
1556 struct isis_area
*area
;
1558 if (args
->event
!= NB_EV_APPLY
)
1561 tie_b
= nb_running_unset_entry(args
->dnode
);
1563 isis_lfa_tiebreaker_delete(area
, ISIS_LEVEL1
, tie_b
);
1564 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1570 * XPath: /frr-isisd:isis/instance/fast-reroute/level-1/lfa/tiebreaker/type
1572 int isis_instance_fast_reroute_level_1_lfa_tiebreaker_type_modify(
1573 struct nb_cb_modify_args
*args
)
1575 struct lfa_tiebreaker
*tie_b
;
1576 struct isis_area
*area
;
1578 if (args
->event
!= NB_EV_APPLY
)
1581 tie_b
= nb_running_get_entry(args
->dnode
, NULL
, true);
1583 tie_b
->type
= yang_dnode_get_enum(args
->dnode
, NULL
);
1584 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1590 * XPath: /frr-isisd:isis/instance/fast-reroute/level-1/remote-lfa/prefix-list
1592 int isis_instance_fast_reroute_level_1_remote_lfa_prefix_list_modify(
1593 struct nb_cb_modify_args
*args
)
1595 struct isis_area
*area
;
1596 const char *plist_name
;
1598 if (args
->event
!= NB_EV_APPLY
)
1601 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1602 plist_name
= yang_dnode_get_string(args
->dnode
, NULL
);
1604 area
->rlfa_plist_name
[0] = XSTRDUP(MTYPE_ISIS_PLIST_NAME
, plist_name
);
1605 area
->rlfa_plist
[0] = prefix_list_lookup(AFI_IP
, plist_name
);
1606 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1611 int isis_instance_fast_reroute_level_1_remote_lfa_prefix_list_destroy(
1612 struct nb_cb_destroy_args
*args
)
1614 struct isis_area
*area
;
1616 if (args
->event
!= NB_EV_APPLY
)
1619 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1621 XFREE(MTYPE_ISIS_PLIST_NAME
, area
->rlfa_plist_name
[0]);
1622 area
->rlfa_plist
[0] = NULL
;
1623 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1629 * XPath: /frr-isisd:isis/instance/fast-reroute/level-2/lfa/load-sharing
1631 int isis_instance_fast_reroute_level_2_lfa_load_sharing_modify(
1632 struct nb_cb_modify_args
*args
)
1634 struct isis_area
*area
;
1636 if (args
->event
!= NB_EV_APPLY
)
1639 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1640 area
->lfa_load_sharing
[1] = yang_dnode_get_bool(args
->dnode
, NULL
);
1646 * XPath: /frr-isisd:isis/instance/fast-reroute/level-2/lfa/priority-limit
1648 int isis_instance_fast_reroute_level_2_lfa_priority_limit_modify(
1649 struct nb_cb_modify_args
*args
)
1651 struct isis_area
*area
;
1653 if (args
->event
!= NB_EV_APPLY
)
1656 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1657 area
->lfa_priority_limit
[1] = yang_dnode_get_enum(args
->dnode
, NULL
);
1662 int isis_instance_fast_reroute_level_2_lfa_priority_limit_destroy(
1663 struct nb_cb_destroy_args
*args
)
1665 struct isis_area
*area
;
1667 if (args
->event
!= NB_EV_APPLY
)
1670 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1671 area
->lfa_priority_limit
[1] = SPF_PREFIX_PRIO_LOW
;
1677 * XPath: /frr-isisd:isis/instance/fast-reroute/level-2/lfa/tiebreaker
1679 int isis_instance_fast_reroute_level_2_lfa_tiebreaker_create(
1680 struct nb_cb_create_args
*args
)
1682 struct isis_area
*area
;
1684 enum lfa_tiebreaker_type type
;
1685 struct lfa_tiebreaker
*tie_b
;
1687 if (args
->event
!= NB_EV_APPLY
)
1690 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1691 index
= yang_dnode_get_uint8(args
->dnode
, "./index");
1692 type
= yang_dnode_get_enum(args
->dnode
, "./type");
1694 tie_b
= isis_lfa_tiebreaker_add(area
, ISIS_LEVEL2
, index
, type
);
1695 nb_running_set_entry(args
->dnode
, tie_b
);
1696 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1701 int isis_instance_fast_reroute_level_2_lfa_tiebreaker_destroy(
1702 struct nb_cb_destroy_args
*args
)
1704 struct lfa_tiebreaker
*tie_b
;
1705 struct isis_area
*area
;
1707 if (args
->event
!= NB_EV_APPLY
)
1710 tie_b
= nb_running_unset_entry(args
->dnode
);
1712 isis_lfa_tiebreaker_delete(area
, ISIS_LEVEL2
, tie_b
);
1713 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1719 * XPath: /frr-isisd:isis/instance/fast-reroute/level-2/lfa/tiebreaker/type
1721 int isis_instance_fast_reroute_level_2_lfa_tiebreaker_type_modify(
1722 struct nb_cb_modify_args
*args
)
1724 struct lfa_tiebreaker
*tie_b
;
1725 struct isis_area
*area
;
1727 if (args
->event
!= NB_EV_APPLY
)
1730 tie_b
= nb_running_get_entry(args
->dnode
, NULL
, true);
1732 tie_b
->type
= yang_dnode_get_enum(args
->dnode
, NULL
);
1733 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1739 * XPath: /frr-isisd:isis/instance/fast-reroute/level-2/remote-lfa/prefix-list
1741 int isis_instance_fast_reroute_level_2_remote_lfa_prefix_list_modify(
1742 struct nb_cb_modify_args
*args
)
1744 struct isis_area
*area
;
1745 const char *plist_name
;
1747 if (args
->event
!= NB_EV_APPLY
)
1750 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1751 plist_name
= yang_dnode_get_string(args
->dnode
, NULL
);
1753 area
->rlfa_plist_name
[1] = XSTRDUP(MTYPE_ISIS_PLIST_NAME
, plist_name
);
1754 area
->rlfa_plist
[1] = prefix_list_lookup(AFI_IP
, plist_name
);
1755 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1760 int isis_instance_fast_reroute_level_2_remote_lfa_prefix_list_destroy(
1761 struct nb_cb_destroy_args
*args
)
1763 struct isis_area
*area
;
1765 if (args
->event
!= NB_EV_APPLY
)
1768 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1770 XFREE(MTYPE_ISIS_PLIST_NAME
, area
->rlfa_plist_name
[1]);
1771 area
->rlfa_plist
[1] = NULL
;
1772 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1778 * XPath: /frr-isisd:isis/instance/log-adjacency-changes
1780 int isis_instance_log_adjacency_changes_modify(struct nb_cb_modify_args
*args
)
1782 struct isis_area
*area
;
1783 bool log
= yang_dnode_get_bool(args
->dnode
, NULL
);
1785 if (args
->event
!= NB_EV_APPLY
)
1788 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1789 area
->log_adj_changes
= log
? 1 : 0;
1795 * XPath: /frr-isisd:isis/instance/mpls-te
1797 int isis_instance_mpls_te_create(struct nb_cb_create_args
*args
)
1799 struct isis_area
*area
;
1801 if (args
->event
!= NB_EV_APPLY
)
1804 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1805 isis_mpls_te_create(area
);
1807 /* Reoriginate STD_TE & GMPLS circuits */
1808 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1813 int isis_instance_mpls_te_destroy(struct nb_cb_destroy_args
*args
)
1815 struct isis_area
*area
;
1817 if (args
->event
!= NB_EV_APPLY
)
1820 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1821 if (!IS_MPLS_TE(area
->mta
))
1824 isis_mpls_te_disable(area
);
1826 /* Reoriginate STD_TE & GMPLS circuits */
1827 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1829 zlog_debug("ISIS-TE(%s): Disabled MPLS Traffic Engineering",
1836 * XPath: /frr-isisd:isis/instance/mpls-te/router-address
1838 int isis_instance_mpls_te_router_address_modify(struct nb_cb_modify_args
*args
)
1840 struct in_addr value
;
1841 struct isis_area
*area
;
1843 if (args
->event
!= NB_EV_APPLY
)
1846 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1847 /* only proceed if MPLS-TE is enabled */
1848 if (!IS_MPLS_TE(area
->mta
))
1851 /* Update Area Router ID */
1852 yang_dnode_get_ipv4(&value
, args
->dnode
, NULL
);
1853 area
->mta
->router_id
.s_addr
= value
.s_addr
;
1855 /* And re-schedule LSP update */
1856 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1861 int isis_instance_mpls_te_router_address_destroy(
1862 struct nb_cb_destroy_args
*args
)
1864 struct isis_area
*area
;
1866 if (args
->event
!= NB_EV_APPLY
)
1869 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1870 /* only proceed if MPLS-TE is enabled */
1871 if (!IS_MPLS_TE(area
->mta
))
1874 /* Reset Area Router ID */
1875 area
->mta
->router_id
.s_addr
= INADDR_ANY
;
1877 /* And re-schedule LSP update */
1878 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1884 * XPath: /frr-isisd:isis/instance/mpls-te/router-address-v6
1886 int isis_instance_mpls_te_router_address_ipv6_modify(
1887 struct nb_cb_modify_args
*args
)
1889 struct in6_addr value
;
1890 struct isis_area
*area
;
1892 if (args
->event
!= NB_EV_APPLY
)
1895 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1896 /* only proceed if MPLS-TE is enabled */
1897 if (!IS_MPLS_TE(area
->mta
))
1900 yang_dnode_get_ipv6(&value
, args
->dnode
, NULL
);
1901 /* Update Area IPv6 Router ID if different */
1902 if (!IPV6_ADDR_SAME(&area
->mta
->router_id_ipv6
, &value
)) {
1903 IPV6_ADDR_COPY(&area
->mta
->router_id_ipv6
, &value
);
1905 /* And re-schedule LSP update */
1906 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1912 int isis_instance_mpls_te_router_address_ipv6_destroy(
1913 struct nb_cb_destroy_args
*args
)
1915 struct isis_area
*area
;
1917 if (args
->event
!= NB_EV_APPLY
)
1920 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1921 /* only proceed if MPLS-TE is enabled */
1922 if (!IS_MPLS_TE(area
->mta
))
1925 /* Reset Area Router ID */
1926 IPV6_ADDR_COPY(&area
->mta
->router_id_ipv6
, &in6addr_any
);
1928 /* And re-schedule LSP update */
1929 lsp_regenerate_schedule(area
, area
->is_type
, 0);
1935 * XPath: /frr-isisd:isis/instance/mpls-te/export
1937 int isis_instance_mpls_te_export_modify(struct nb_cb_modify_args
*args
)
1939 struct isis_area
*area
;
1941 if (args
->event
!= NB_EV_APPLY
)
1944 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1945 /* only proceed if MPLS-TE is enabled */
1946 if (!IS_MPLS_TE(area
->mta
))
1949 area
->mta
->export
= yang_dnode_get_bool(args
->dnode
, NULL
);
1950 if (area
->mta
->export
) {
1951 if (IS_DEBUG_EVENTS
)
1952 zlog_debug("MPLS-TE: Enabled Link State export");
1953 if (isis_zebra_ls_register(true) != 0)
1954 zlog_warn("Unable to register Link State");
1956 if (IS_DEBUG_EVENTS
)
1957 zlog_debug("MPLS-TE: Disable Link State export");
1958 if (isis_zebra_ls_register(false) != 0)
1959 zlog_warn("Unable to register Link State");
1966 * XPath: /frr-isisd:isis/instance/segment-routing/enabled
1968 int isis_instance_segment_routing_enabled_modify(
1969 struct nb_cb_modify_args
*args
)
1971 struct isis_area
*area
;
1973 if (args
->event
!= NB_EV_APPLY
)
1976 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
1977 area
->srdb
.config
.enabled
= yang_dnode_get_bool(args
->dnode
, NULL
);
1979 if (area
->srdb
.config
.enabled
) {
1980 if (IS_DEBUG_EVENTS
)
1981 zlog_debug("SR: Segment Routing: OFF -> ON");
1983 isis_sr_start(area
);
1985 if (IS_DEBUG_EVENTS
)
1986 zlog_debug("SR: Segment Routing: ON -> OFF");
1995 * XPath: /frr-isisd:isis/instance/segment-routing/label-blocks
1997 int isis_instance_segment_routing_label_blocks_pre_validate(
1998 struct nb_cb_pre_validate_args
*args
)
2000 uint32_t srgb_lbound
;
2001 uint32_t srgb_ubound
;
2002 uint32_t srlb_lbound
;
2003 uint32_t srlb_ubound
;
2005 srgb_lbound
= yang_dnode_get_uint32(args
->dnode
, "./srgb/lower-bound");
2006 srgb_ubound
= yang_dnode_get_uint32(args
->dnode
, "./srgb/upper-bound");
2007 srlb_lbound
= yang_dnode_get_uint32(args
->dnode
, "./srlb/lower-bound");
2008 srlb_ubound
= yang_dnode_get_uint32(args
->dnode
, "./srlb/upper-bound");
2010 /* Check that the block size does not exceed 65535 */
2011 if ((srgb_ubound
- srgb_lbound
+ 1) > 65535) {
2013 args
->errmsg
, args
->errmsg_len
,
2014 "New SR Global Block (%u/%u) exceed the limit of 65535",
2015 srgb_lbound
, srgb_ubound
);
2016 return NB_ERR_VALIDATION
;
2018 if ((srlb_ubound
- srlb_lbound
+ 1) > 65535) {
2019 snprintf(args
->errmsg
, args
->errmsg_len
,
2020 "New SR Local Block (%u/%u) exceed the limit of 65535",
2021 srlb_lbound
, srlb_ubound
);
2022 return NB_ERR_VALIDATION
;
2025 /* Validate SRGB against SRLB */
2026 if (!((srgb_ubound
< srlb_lbound
) || (srgb_lbound
> srlb_ubound
))) {
2028 args
->errmsg
, args
->errmsg_len
,
2029 "SR Global Block (%u/%u) conflicts with Local Block (%u/%u)",
2030 srgb_lbound
, srgb_ubound
, srlb_lbound
, srlb_ubound
);
2031 return NB_ERR_VALIDATION
;
2038 * XPath: /frr-isisd:isis/instance/segment-routing/label-blocks/srgb
2041 void isis_instance_segment_routing_srgb_apply_finish(
2042 struct nb_cb_apply_finish_args
*args
)
2044 struct isis_area
*area
;
2045 uint32_t lower_bound
, upper_bound
;
2047 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
2048 lower_bound
= yang_dnode_get_uint32(args
->dnode
, "./lower-bound");
2049 upper_bound
= yang_dnode_get_uint32(args
->dnode
, "./upper-bound");
2051 isis_sr_cfg_srgb_update(area
, lower_bound
, upper_bound
);
2055 * XPath: /frr-isisd:isis/instance/segment-routing/label-blocks/srgb/lower-bound
2057 int isis_instance_segment_routing_srgb_lower_bound_modify(
2058 struct nb_cb_modify_args
*args
)
2060 uint32_t lower_bound
= yang_dnode_get_uint32(args
->dnode
, NULL
);
2062 switch (args
->event
) {
2063 case NB_EV_VALIDATE
:
2064 if (!IS_MPLS_UNRESERVED_LABEL(lower_bound
)) {
2065 snprintf(args
->errmsg
, args
->errmsg_len
,
2066 "Invalid SRGB lower bound: %u", lower_bound
);
2067 return NB_ERR_VALIDATION
;
2080 * XPath: /frr-isisd:isis/instance/segment-routing/label-blocks/srgb/upper-bound
2082 int isis_instance_segment_routing_srgb_upper_bound_modify(
2083 struct nb_cb_modify_args
*args
)
2085 uint32_t upper_bound
= yang_dnode_get_uint32(args
->dnode
, NULL
);
2087 switch (args
->event
) {
2088 case NB_EV_VALIDATE
:
2089 if (!IS_MPLS_UNRESERVED_LABEL(upper_bound
)) {
2090 snprintf(args
->errmsg
, args
->errmsg_len
,
2091 "Invalid SRGB upper bound: %u", upper_bound
);
2092 return NB_ERR_VALIDATION
;
2105 * XPath: /frr-isisd:isis/instance/segment-routing/label-blocks/srlb
2107 void isis_instance_segment_routing_srlb_apply_finish(
2108 struct nb_cb_apply_finish_args
*args
)
2110 struct isis_area
*area
;
2111 uint32_t lower_bound
, upper_bound
;
2113 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
2114 lower_bound
= yang_dnode_get_uint32(args
->dnode
, "./lower-bound");
2115 upper_bound
= yang_dnode_get_uint32(args
->dnode
, "./upper-bound");
2117 isis_sr_cfg_srlb_update(area
, lower_bound
, upper_bound
);
2121 * XPath: /frr-isisd:isis/instance/segment-routing/label-blocks/srlb/lower-bound
2123 int isis_instance_segment_routing_srlb_lower_bound_modify(
2124 struct nb_cb_modify_args
*args
)
2126 uint32_t lower_bound
= yang_dnode_get_uint32(args
->dnode
, NULL
);
2128 switch (args
->event
) {
2129 case NB_EV_VALIDATE
:
2130 if (!IS_MPLS_UNRESERVED_LABEL(lower_bound
)) {
2131 snprintf(args
->errmsg
, args
->errmsg_len
,
2132 "Invalid SRLB lower bound: %u", lower_bound
);
2133 return NB_ERR_VALIDATION
;
2146 * XPath: /frr-isisd:isis/instance/segment-routing/label-blocks/srlb/upper-bound
2148 int isis_instance_segment_routing_srlb_upper_bound_modify(
2149 struct nb_cb_modify_args
*args
)
2151 uint32_t upper_bound
= yang_dnode_get_uint32(args
->dnode
, NULL
);
2153 switch (args
->event
) {
2154 case NB_EV_VALIDATE
:
2155 if (!IS_MPLS_UNRESERVED_LABEL(upper_bound
)) {
2156 snprintf(args
->errmsg
, args
->errmsg_len
,
2157 "Invalid SRLB upper bound: %u", upper_bound
);
2158 return NB_ERR_VALIDATION
;
2171 * XPath: /frr-isisd:isis/instance/segment-routing/msd/node-msd
2173 int isis_instance_segment_routing_msd_node_msd_modify(
2174 struct nb_cb_modify_args
*args
)
2176 struct isis_area
*area
;
2178 if (args
->event
!= NB_EV_APPLY
)
2181 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
2182 area
->srdb
.config
.msd
= yang_dnode_get_uint8(args
->dnode
, NULL
);
2184 /* Update and regenerate LSP */
2185 lsp_regenerate_schedule(area
, area
->is_type
, 0);
2190 int isis_instance_segment_routing_msd_node_msd_destroy(
2191 struct nb_cb_destroy_args
*args
)
2193 struct isis_area
*area
;
2195 if (args
->event
!= NB_EV_APPLY
)
2198 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
2199 area
->srdb
.config
.msd
= 0;
2201 /* Update and regenerate LSP */
2202 lsp_regenerate_schedule(area
, area
->is_type
, 0);
2208 * XPath: /frr-isisd:isis/instance/segment-routing/prefix-sid-map/prefix-sid
2210 int isis_instance_segment_routing_prefix_sid_map_prefix_sid_create(
2211 struct nb_cb_create_args
*args
)
2213 struct isis_area
*area
;
2214 struct prefix prefix
;
2215 struct sr_prefix_cfg
*pcfg
;
2217 if (args
->event
!= NB_EV_APPLY
)
2220 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
2221 yang_dnode_get_prefix(&prefix
, args
->dnode
, "./prefix");
2223 pcfg
= isis_sr_cfg_prefix_add(area
, &prefix
);
2224 nb_running_set_entry(args
->dnode
, pcfg
);
2229 int isis_instance_segment_routing_prefix_sid_map_prefix_sid_destroy(
2230 struct nb_cb_destroy_args
*args
)
2232 struct sr_prefix_cfg
*pcfg
;
2233 struct isis_area
*area
;
2235 if (args
->event
!= NB_EV_APPLY
)
2238 pcfg
= nb_running_unset_entry(args
->dnode
);
2240 isis_sr_cfg_prefix_del(pcfg
);
2241 lsp_regenerate_schedule(area
, area
->is_type
, 0);
2246 int isis_instance_segment_routing_prefix_sid_map_prefix_sid_pre_validate(
2247 struct nb_cb_pre_validate_args
*args
)
2249 const struct lyd_node
*area_dnode
;
2250 struct isis_area
*area
;
2251 struct prefix prefix
;
2252 uint32_t srgb_lbound
;
2253 uint32_t srgb_ubound
;
2254 uint32_t srgb_range
;
2256 enum sr_sid_value_type sid_type
;
2257 struct isis_prefix_sid psid
= {};
2259 yang_dnode_get_prefix(&prefix
, args
->dnode
, "./prefix");
2260 srgb_lbound
= yang_dnode_get_uint32(
2261 args
->dnode
, "../../label-blocks/srgb/lower-bound");
2262 srgb_ubound
= yang_dnode_get_uint32(
2263 args
->dnode
, "../../label-blocks/srgb/upper-bound");
2264 sid
= yang_dnode_get_uint32(args
->dnode
, "./sid-value");
2265 sid_type
= yang_dnode_get_enum(args
->dnode
, "./sid-value-type");
2267 /* Check for invalid indexes/labels. */
2268 srgb_range
= srgb_ubound
- srgb_lbound
+ 1;
2271 case SR_SID_VALUE_TYPE_INDEX
:
2272 if (sid
>= srgb_range
) {
2273 snprintf(args
->errmsg
, args
->errmsg_len
,
2274 "SID index %u falls outside local SRGB range",
2276 return NB_ERR_VALIDATION
;
2279 case SR_SID_VALUE_TYPE_ABSOLUTE
:
2280 if (!IS_MPLS_UNRESERVED_LABEL(sid
)) {
2281 snprintf(args
->errmsg
, args
->errmsg_len
,
2282 "Invalid absolute SID %u", sid
);
2283 return NB_ERR_VALIDATION
;
2285 SET_FLAG(psid
.flags
, ISIS_PREFIX_SID_VALUE
);
2286 SET_FLAG(psid
.flags
, ISIS_PREFIX_SID_LOCAL
);
2290 /* Check for Prefix-SID collisions. */
2291 area_dnode
= yang_dnode_get_parent(args
->dnode
, "instance");
2292 area
= nb_running_get_entry(area_dnode
, NULL
, false);
2294 for (int tree
= SPFTREE_IPV4
; tree
< SPFTREE_COUNT
; tree
++) {
2295 for (int level
= ISIS_LEVEL1
; level
<= ISIS_LEVEL2
;
2297 struct isis_spftree
*spftree
;
2298 struct isis_vertex
*vertex_psid
;
2300 if (!(area
->is_type
& level
))
2302 spftree
= area
->spftree
[tree
][level
- 1];
2306 vertex_psid
= isis_spf_prefix_sid_lookup(
2309 && !prefix_same(&vertex_psid
->N
.ip
.p
.dest
,
2312 args
->errmsg
, args
->errmsg_len
,
2313 "Prefix-SID collision detected, SID %s %u is already in use by prefix %pFX (L%u)",
2316 ISIS_PREFIX_SID_VALUE
)
2320 &vertex_psid
->N
.ip
.p
.dest
,
2322 return NB_ERR_VALIDATION
;
2331 void isis_instance_segment_routing_prefix_sid_map_prefix_sid_apply_finish(
2332 struct nb_cb_apply_finish_args
*args
)
2334 struct sr_prefix_cfg
*pcfg
;
2335 struct isis_area
*area
;
2337 pcfg
= nb_running_get_entry(args
->dnode
, NULL
, true);
2339 lsp_regenerate_schedule(area
, area
->is_type
, 0);
2344 * /frr-isisd:isis/instance/segment-routing/prefix-sid-map/prefix-sid/sid-value-type
2346 int isis_instance_segment_routing_prefix_sid_map_prefix_sid_sid_value_type_modify(
2347 struct nb_cb_modify_args
*args
)
2349 struct sr_prefix_cfg
*pcfg
;
2351 if (args
->event
!= NB_EV_APPLY
)
2354 pcfg
= nb_running_get_entry(args
->dnode
, NULL
, true);
2355 pcfg
->sid_type
= yang_dnode_get_enum(args
->dnode
, NULL
);
2362 * /frr-isisd:isis/instance/segment-routing/prefix-sid-map/prefix-sid/sid-value
2364 int isis_instance_segment_routing_prefix_sid_map_prefix_sid_sid_value_modify(
2365 struct nb_cb_modify_args
*args
)
2367 struct sr_prefix_cfg
*pcfg
;
2369 if (args
->event
!= NB_EV_APPLY
)
2372 pcfg
= nb_running_get_entry(args
->dnode
, NULL
, true);
2373 pcfg
->sid
= yang_dnode_get_uint32(args
->dnode
, NULL
);
2380 * /frr-isisd:isis/instance/segment-routing/prefix-sid-map/prefix-sid/last-hop-behavior
2382 int isis_instance_segment_routing_prefix_sid_map_prefix_sid_last_hop_behavior_modify(
2383 struct nb_cb_modify_args
*args
)
2385 struct sr_prefix_cfg
*pcfg
;
2387 if (args
->event
!= NB_EV_APPLY
)
2390 pcfg
= nb_running_get_entry(args
->dnode
, NULL
, true);
2391 pcfg
->last_hop_behavior
= yang_dnode_get_enum(args
->dnode
, NULL
);
2397 * XPath: /frr-isisd:isis/instance/segment-routing/prefix-sid-map/prefix-sid/n-flag-clear
2399 int isis_instance_segment_routing_prefix_sid_map_prefix_sid_n_flag_clear_modify(
2400 struct nb_cb_modify_args
*args
)
2402 struct sr_prefix_cfg
*pcfg
;
2404 if (args
->event
!= NB_EV_APPLY
)
2407 pcfg
= nb_running_get_entry(args
->dnode
, NULL
, true);
2408 pcfg
->n_flag_clear
= yang_dnode_get_bool(args
->dnode
, NULL
);
2414 * XPath: /frr-isisd:isis/instance/mpls/ldp-sync
2416 int isis_instance_mpls_ldp_sync_create(struct nb_cb_create_args
*args
)
2418 struct isis_area
*area
;
2419 const char *vrfname
;
2421 switch (args
->event
) {
2422 case NB_EV_VALIDATE
:
2423 vrfname
= yang_dnode_get_string(
2424 lyd_parent(lyd_parent(args
->dnode
)), "./vrf");
2426 if (strcmp(vrfname
, VRF_DEFAULT_NAME
)) {
2427 snprintf(args
->errmsg
, args
->errmsg_len
,
2428 "LDP-Sync only runs on Default VRF");
2429 return NB_ERR_VALIDATION
;
2436 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
2437 isis_area_ldp_sync_enable(area
);
2443 int isis_instance_mpls_ldp_sync_destroy(struct nb_cb_destroy_args
*args
)
2445 struct isis_area
*area
;
2447 if (args
->event
!= NB_EV_APPLY
)
2450 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
2451 isis_area_ldp_sync_disable(area
);
2457 * XPath: /frr-isisd:isis/instance/mpls/ldp-sync/holddown
2459 int isis_instance_mpls_ldp_sync_holddown_modify(struct nb_cb_modify_args
*args
)
2461 struct isis_area
*area
;
2463 const char *vrfname
;
2465 switch (args
->event
) {
2466 case NB_EV_VALIDATE
:
2467 vrfname
= yang_dnode_get_string(
2468 lyd_parent(lyd_parent(lyd_parent(args
->dnode
))),
2471 if (strcmp(vrfname
, VRF_DEFAULT_NAME
)) {
2472 snprintf(args
->errmsg
, args
->errmsg_len
,
2473 "LDP-Sync only runs on Default VRF");
2474 return NB_ERR_VALIDATION
;
2481 area
= nb_running_get_entry(args
->dnode
, NULL
, true);
2482 holddown
= yang_dnode_get_uint16(args
->dnode
, NULL
);
2483 isis_area_ldp_sync_set_holddown(area
, holddown
);
2490 * XPath: /frr-interface:lib/interface/frr-isisd:isis
2492 int lib_interface_isis_create(struct nb_cb_create_args
*args
)
2494 struct interface
*ifp
;
2495 struct isis_circuit
*circuit
= NULL
;
2496 const char *area_tag
= yang_dnode_get_string(args
->dnode
, "./area-tag");
2498 switch (args
->event
) {
2501 case NB_EV_VALIDATE
:
2504 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
2505 circuit
= isis_circuit_new(ifp
, area_tag
);
2506 nb_running_set_entry(args
->dnode
, circuit
);
2513 int lib_interface_isis_destroy(struct nb_cb_destroy_args
*args
)
2515 struct isis_circuit
*circuit
;
2517 if (args
->event
!= NB_EV_APPLY
)
2520 circuit
= nb_running_unset_entry(args
->dnode
);
2522 isis_circuit_del(circuit
);
2528 * XPath: /frr-interface:lib/interface/frr-isisd:isis/area-tag
2530 int lib_interface_isis_area_tag_modify(struct nb_cb_modify_args
*args
)
2532 struct isis_circuit
*circuit
;
2534 if (args
->event
== NB_EV_VALIDATE
) {
2535 circuit
= nb_running_get_entry_non_rec(lyd_parent(args
->dnode
), NULL
, false);
2537 snprintf(args
->errmsg
, args
->errmsg_len
,
2538 "Changing area tag is not allowed");
2539 return NB_ERR_VALIDATION
;
2547 * XPath: /frr-interface:lib/interface/frr-isisd:isis/circuit-type
2549 int lib_interface_isis_circuit_type_modify(struct nb_cb_modify_args
*args
)
2551 int circ_type
= yang_dnode_get_enum(args
->dnode
, NULL
);
2552 struct isis_circuit
*circuit
;
2554 switch (args
->event
) {
2555 case NB_EV_VALIDATE
:
2560 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
2561 circuit
->is_type_config
= circ_type
;
2562 isis_circuit_is_type_set(circuit
, circ_type
);
2570 * XPath: /frr-interface:lib/interface/frr-isisd:isis/ipv4-routing
2572 int lib_interface_isis_ipv4_routing_modify(struct nb_cb_modify_args
*args
)
2575 struct isis_circuit
*circuit
;
2577 if (args
->event
!= NB_EV_APPLY
)
2580 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
2581 ipv4
= yang_dnode_get_bool(args
->dnode
, NULL
);
2582 ipv6
= yang_dnode_get_bool(args
->dnode
, "../ipv6-routing");
2583 isis_circuit_af_set(circuit
, ipv4
, ipv6
);
2589 * XPath: /frr-interface:lib/interface/frr-isisd:isis/ipv6-routing
2591 int lib_interface_isis_ipv6_routing_modify(struct nb_cb_modify_args
*args
)
2594 struct isis_circuit
*circuit
;
2596 if (args
->event
!= NB_EV_APPLY
)
2599 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
2600 ipv4
= yang_dnode_get_bool(args
->dnode
, "../ipv4-routing");
2601 ipv6
= yang_dnode_get_bool(args
->dnode
, NULL
);
2602 isis_circuit_af_set(circuit
, ipv4
, ipv6
);
2608 * XPath: /frr-interface:lib/interface/frr-isisd:isis/bfd-monitoring
2610 void lib_interface_isis_bfd_monitoring_apply_finish(
2611 struct nb_cb_apply_finish_args
*args
)
2613 struct isis_circuit
*circuit
;
2615 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
2616 isis_bfd_circuit_cmd(circuit
);
2620 * XPath: /frr-interface:lib/interface/frr-isisd:isis/bfd-monitoring/enabled
2622 int lib_interface_isis_bfd_monitoring_enabled_modify(
2623 struct nb_cb_modify_args
*args
)
2625 struct isis_circuit
*circuit
;
2627 if (args
->event
!= NB_EV_APPLY
)
2630 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
2631 circuit
->bfd_config
.enabled
= yang_dnode_get_bool(args
->dnode
, NULL
);
2637 * XPath: /frr-interface:lib/interface/frr-isisd:isis/bfd-monitoring/profile
2639 int lib_interface_isis_bfd_monitoring_profile_modify(
2640 struct nb_cb_modify_args
*args
)
2642 struct isis_circuit
*circuit
;
2644 if (args
->event
!= NB_EV_APPLY
)
2647 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
2648 XFREE(MTYPE_TMP
, circuit
->bfd_config
.profile
);
2649 circuit
->bfd_config
.profile
=
2650 XSTRDUP(MTYPE_TMP
, yang_dnode_get_string(args
->dnode
, NULL
));
2655 int lib_interface_isis_bfd_monitoring_profile_destroy(
2656 struct nb_cb_destroy_args
*args
)
2658 struct isis_circuit
*circuit
;
2660 if (args
->event
!= NB_EV_APPLY
)
2663 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
2664 XFREE(MTYPE_TMP
, circuit
->bfd_config
.profile
);
2670 * XPath: /frr-interface:lib/interface/frr-isisd:isis/csnp-interval/level-1
2672 int lib_interface_isis_csnp_interval_level_1_modify(
2673 struct nb_cb_modify_args
*args
)
2675 struct isis_circuit
*circuit
;
2677 if (args
->event
!= NB_EV_APPLY
)
2680 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
2681 circuit
->csnp_interval
[0] = yang_dnode_get_uint16(args
->dnode
, NULL
);
2687 * XPath: /frr-interface:lib/interface/frr-isisd:isis/csnp-interval/level-2
2689 int lib_interface_isis_csnp_interval_level_2_modify(
2690 struct nb_cb_modify_args
*args
)
2692 struct isis_circuit
*circuit
;
2694 if (args
->event
!= NB_EV_APPLY
)
2697 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
2698 circuit
->csnp_interval
[1] = yang_dnode_get_uint16(args
->dnode
, NULL
);
2704 * XPath: /frr-interface:lib/interface/frr-isisd:isis/psnp-interval/level-1
2706 int lib_interface_isis_psnp_interval_level_1_modify(
2707 struct nb_cb_modify_args
*args
)
2709 struct isis_circuit
*circuit
;
2711 if (args
->event
!= NB_EV_APPLY
)
2714 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
2715 circuit
->psnp_interval
[0] = yang_dnode_get_uint16(args
->dnode
, NULL
);
2721 * XPath: /frr-interface:lib/interface/frr-isisd:isis/psnp-interval/level-2
2723 int lib_interface_isis_psnp_interval_level_2_modify(
2724 struct nb_cb_modify_args
*args
)
2726 struct isis_circuit
*circuit
;
2728 if (args
->event
!= NB_EV_APPLY
)
2731 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
2732 circuit
->psnp_interval
[1] = yang_dnode_get_uint16(args
->dnode
, NULL
);
2738 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/padding
2740 int lib_interface_isis_hello_padding_modify(struct nb_cb_modify_args
*args
)
2742 struct isis_circuit
*circuit
;
2744 if (args
->event
!= NB_EV_APPLY
)
2747 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
2748 circuit
->pad_hellos
= yang_dnode_get_bool(args
->dnode
, NULL
);
2754 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/interval/level-1
2756 int lib_interface_isis_hello_interval_level_1_modify(
2757 struct nb_cb_modify_args
*args
)
2759 struct isis_circuit
*circuit
;
2762 if (args
->event
!= NB_EV_APPLY
)
2765 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
2766 interval
= yang_dnode_get_uint32(args
->dnode
, NULL
);
2767 circuit
->hello_interval
[0] = interval
;
2773 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/interval/level-2
2775 int lib_interface_isis_hello_interval_level_2_modify(
2776 struct nb_cb_modify_args
*args
)
2778 struct isis_circuit
*circuit
;
2781 if (args
->event
!= NB_EV_APPLY
)
2784 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
2785 interval
= yang_dnode_get_uint32(args
->dnode
, NULL
);
2786 circuit
->hello_interval
[1] = interval
;
2792 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/multiplier/level-1
2794 int lib_interface_isis_hello_multiplier_level_1_modify(
2795 struct nb_cb_modify_args
*args
)
2797 struct isis_circuit
*circuit
;
2800 if (args
->event
!= NB_EV_APPLY
)
2803 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
2804 multi
= yang_dnode_get_uint16(args
->dnode
, NULL
);
2805 circuit
->hello_multiplier
[0] = multi
;
2811 * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/multiplier/level-2
2813 int lib_interface_isis_hello_multiplier_level_2_modify(
2814 struct nb_cb_modify_args
*args
)
2816 struct isis_circuit
*circuit
;
2819 if (args
->event
!= NB_EV_APPLY
)
2822 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
2823 multi
= yang_dnode_get_uint16(args
->dnode
, NULL
);
2824 circuit
->hello_multiplier
[1] = multi
;
2830 * XPath: /frr-interface:lib/interface/frr-isisd:isis/metric/level-1
2832 int lib_interface_isis_metric_level_1_modify(struct nb_cb_modify_args
*args
)
2834 struct isis_circuit
*circuit
;
2837 if (args
->event
!= NB_EV_APPLY
)
2840 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
2841 met
= yang_dnode_get_uint32(args
->dnode
, NULL
);
2842 isis_circuit_metric_set(circuit
, IS_LEVEL_1
, met
);
2848 * XPath: /frr-interface:lib/interface/frr-isisd:isis/metric/level-2
2850 int lib_interface_isis_metric_level_2_modify(struct nb_cb_modify_args
*args
)
2852 struct isis_circuit
*circuit
;
2855 if (args
->event
!= NB_EV_APPLY
)
2858 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
2859 met
= yang_dnode_get_uint32(args
->dnode
, NULL
);
2860 isis_circuit_metric_set(circuit
, IS_LEVEL_2
, met
);
2866 * XPath: /frr-interface:lib/interface/frr-isisd:isis/priority/level-1
2868 int lib_interface_isis_priority_level_1_modify(struct nb_cb_modify_args
*args
)
2870 struct isis_circuit
*circuit
;
2872 if (args
->event
!= NB_EV_APPLY
)
2875 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
2876 circuit
->priority
[0] = yang_dnode_get_uint8(args
->dnode
, NULL
);
2882 * XPath: /frr-interface:lib/interface/frr-isisd:isis/priority/level-2
2884 int lib_interface_isis_priority_level_2_modify(struct nb_cb_modify_args
*args
)
2886 struct isis_circuit
*circuit
;
2888 if (args
->event
!= NB_EV_APPLY
)
2891 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
2892 circuit
->priority
[1] = yang_dnode_get_uint8(args
->dnode
, NULL
);
2898 * XPath: /frr-interface:lib/interface/frr-isisd:isis/network-type
2900 int lib_interface_isis_network_type_modify(struct nb_cb_modify_args
*args
)
2902 struct isis_circuit
*circuit
;
2903 int net_type
= yang_dnode_get_enum(args
->dnode
, NULL
);
2905 switch (args
->event
) {
2906 case NB_EV_VALIDATE
:
2907 circuit
= nb_running_get_entry(args
->dnode
, NULL
, false);
2910 if (circuit
->circ_type
== CIRCUIT_T_LOOPBACK
) {
2912 args
->errmsg
, args
->errmsg_len
,
2913 "Cannot change network type on loopback interface");
2914 return NB_ERR_VALIDATION
;
2916 if (net_type
== CIRCUIT_T_BROADCAST
2917 && circuit
->state
== C_STATE_UP
2918 && !if_is_broadcast(circuit
->interface
)) {
2920 args
->errmsg
, args
->errmsg_len
,
2921 "Cannot configure non-broadcast interface for broadcast operation");
2922 return NB_ERR_VALIDATION
;
2929 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
2930 isis_circuit_circ_type_set(circuit
, net_type
);
2938 * XPath: /frr-interface:lib/interface/frr-isisd:isis/passive
2940 int lib_interface_isis_passive_modify(struct nb_cb_modify_args
*args
)
2942 struct isis_circuit
*circuit
;
2943 bool passive
= yang_dnode_get_bool(args
->dnode
, NULL
);
2945 if (args
->event
!= NB_EV_APPLY
)
2948 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
2949 isis_circuit_passive_set(circuit
, passive
);
2955 * XPath: /frr-interface:lib/interface/frr-isisd:isis/password
2957 int lib_interface_isis_password_create(struct nb_cb_create_args
*args
)
2962 int lib_interface_isis_password_destroy(struct nb_cb_destroy_args
*args
)
2964 struct isis_circuit
*circuit
;
2966 if (args
->event
!= NB_EV_APPLY
)
2969 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
2970 isis_circuit_passwd_unset(circuit
);
2976 * XPath: /frr-interface:lib/interface/frr-isisd:isis/password/password
2978 int lib_interface_isis_password_password_modify(struct nb_cb_modify_args
*args
)
2980 struct isis_circuit
*circuit
;
2981 const char *password
;
2983 if (args
->event
!= NB_EV_APPLY
)
2986 password
= yang_dnode_get_string(args
->dnode
, NULL
);
2987 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
2989 isis_circuit_passwd_set(circuit
, circuit
->passwd
.type
, password
);
2995 * XPath: /frr-interface:lib/interface/frr-isisd:isis/password/password-type
2997 int lib_interface_isis_password_password_type_modify(
2998 struct nb_cb_modify_args
*args
)
3000 struct isis_circuit
*circuit
;
3003 if (args
->event
!= NB_EV_APPLY
)
3006 pass_type
= yang_dnode_get_enum(args
->dnode
, NULL
);
3007 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
3008 circuit
->passwd
.type
= pass_type
;
3015 * /frr-interface:lib/interface/frr-isisd:isis/disable-three-way-handshake
3017 int lib_interface_isis_disable_three_way_handshake_modify(
3018 struct nb_cb_modify_args
*args
)
3020 struct isis_circuit
*circuit
;
3022 if (args
->event
!= NB_EV_APPLY
)
3025 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
3026 circuit
->disable_threeway_adj
= yang_dnode_get_bool(args
->dnode
, NULL
);
3031 static int lib_interface_isis_multi_topology_common(
3032 enum nb_event event
, const struct lyd_node
*dnode
, char *errmsg
,
3033 size_t errmsg_len
, uint16_t mtid
)
3035 struct isis_circuit
*circuit
;
3039 case NB_EV_VALIDATE
:
3040 circuit
= nb_running_get_entry(dnode
, NULL
, false);
3041 if (circuit
&& circuit
->area
&& circuit
->area
->oldmetric
) {
3044 "Multi topology IS-IS can only be used with wide metrics");
3045 return NB_ERR_VALIDATION
;
3052 circuit
= nb_running_get_entry(dnode
, NULL
, true);
3053 value
= yang_dnode_get_bool(dnode
, NULL
);
3054 isis_circuit_mt_enabled_set(circuit
, mtid
, value
);
3063 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/standard
3065 int lib_interface_isis_multi_topology_standard_modify(
3066 struct nb_cb_modify_args
*args
)
3068 return lib_interface_isis_multi_topology_common(
3069 args
->event
, args
->dnode
, args
->errmsg
, args
->errmsg_len
,
3075 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-multicast
3077 int lib_interface_isis_multi_topology_ipv4_multicast_modify(
3078 struct nb_cb_modify_args
*args
)
3080 return lib_interface_isis_multi_topology_common(
3081 args
->event
, args
->dnode
, args
->errmsg
, args
->errmsg_len
,
3082 ISIS_MT_IPV4_MULTICAST
);
3087 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-management
3089 int lib_interface_isis_multi_topology_ipv4_management_modify(
3090 struct nb_cb_modify_args
*args
)
3092 return lib_interface_isis_multi_topology_common(
3093 args
->event
, args
->dnode
, args
->errmsg
, args
->errmsg_len
,
3099 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-unicast
3101 int lib_interface_isis_multi_topology_ipv6_unicast_modify(
3102 struct nb_cb_modify_args
*args
)
3104 return lib_interface_isis_multi_topology_common(
3105 args
->event
, args
->dnode
, args
->errmsg
, args
->errmsg_len
,
3106 ISIS_MT_IPV6_UNICAST
);
3111 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-multicast
3113 int lib_interface_isis_multi_topology_ipv6_multicast_modify(
3114 struct nb_cb_modify_args
*args
)
3116 return lib_interface_isis_multi_topology_common(
3117 args
->event
, args
->dnode
, args
->errmsg
, args
->errmsg_len
,
3118 ISIS_MT_IPV6_MULTICAST
);
3123 * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-management
3125 int lib_interface_isis_multi_topology_ipv6_management_modify(
3126 struct nb_cb_modify_args
*args
)
3128 return lib_interface_isis_multi_topology_common(
3129 args
->event
, args
->dnode
, args
->errmsg
, args
->errmsg_len
,
3134 * XPath: /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-dstsrc
3136 int lib_interface_isis_multi_topology_ipv6_dstsrc_modify(
3137 struct nb_cb_modify_args
*args
)
3139 return lib_interface_isis_multi_topology_common(
3140 args
->event
, args
->dnode
, args
->errmsg
, args
->errmsg_len
,
3141 ISIS_MT_IPV6_DSTSRC
);
3145 * XPath: /frr-interface:lib/interface/frr-isisd:isis/mpls/ldp-sync
3147 int lib_interface_isis_mpls_ldp_sync_modify(struct nb_cb_modify_args
*args
)
3149 struct isis_circuit
*circuit
;
3150 struct ldp_sync_info
*ldp_sync_info
;
3151 bool ldp_sync_enable
;
3153 switch (args
->event
) {
3154 case NB_EV_VALIDATE
:
3159 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
3160 ldp_sync_enable
= yang_dnode_get_bool(args
->dnode
, NULL
);
3162 ldp_sync_info
= circuit
->ldp_sync_info
;
3164 SET_FLAG(ldp_sync_info
->flags
, LDP_SYNC_FLAG_IF_CONFIG
);
3165 ldp_sync_info
->enabled
= ldp_sync_enable
;
3167 if (circuit
->area
) {
3168 if (ldp_sync_enable
)
3169 isis_if_ldp_sync_enable(circuit
);
3171 isis_if_ldp_sync_disable(circuit
);
3179 * XPath: /frr-interface:lib/interface/frr-isisd:isis/mpls/holddown
3181 int lib_interface_isis_mpls_holddown_modify(struct nb_cb_modify_args
*args
)
3183 struct isis_circuit
*circuit
;
3184 struct ldp_sync_info
*ldp_sync_info
;
3187 switch (args
->event
) {
3188 case NB_EV_VALIDATE
:
3193 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
3194 holddown
= yang_dnode_get_uint16(args
->dnode
, NULL
);
3196 ldp_sync_info
= circuit
->ldp_sync_info
;
3198 SET_FLAG(ldp_sync_info
->flags
, LDP_SYNC_FLAG_HOLDDOWN
);
3199 ldp_sync_info
->holddown
= holddown
;
3205 int lib_interface_isis_mpls_holddown_destroy(struct nb_cb_destroy_args
*args
)
3207 struct isis_circuit
*circuit
;
3208 struct ldp_sync_info
*ldp_sync_info
;
3210 switch (args
->event
) {
3211 case NB_EV_VALIDATE
:
3216 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
3217 ldp_sync_info
= circuit
->ldp_sync_info
;
3219 UNSET_FLAG(ldp_sync_info
->flags
, LDP_SYNC_FLAG_HOLDDOWN
);
3222 isis_if_set_ldp_sync_holddown(circuit
);
3231 * /frr-interface:lib/interface/frr-isisd:isis/fast-reroute/level-1/lfa/enable
3233 int lib_interface_isis_fast_reroute_level_1_lfa_enable_modify(
3234 struct nb_cb_modify_args
*args
)
3236 struct isis_area
*area
;
3237 struct isis_circuit
*circuit
;
3239 if (args
->event
!= NB_EV_APPLY
)
3242 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
3243 circuit
->lfa_protection
[0] = yang_dnode_get_bool(args
->dnode
, NULL
);
3245 area
= circuit
->area
;
3247 if (circuit
->lfa_protection
[0])
3248 area
->lfa_protected_links
[0]++;
3250 assert(area
->lfa_protected_links
[0] > 0);
3251 area
->lfa_protected_links
[0]--;
3254 lsp_regenerate_schedule(area
, area
->is_type
, 0);
3262 * /frr-interface:lib/interface/frr-isisd:isis/fast-reroute/level-1/lfa/exclude-interface
3264 int lib_interface_isis_fast_reroute_level_1_lfa_exclude_interface_create(
3265 struct nb_cb_create_args
*args
)
3267 struct isis_area
*area
;
3268 struct isis_circuit
*circuit
;
3269 const char *exclude_ifname
;
3271 if (args
->event
!= NB_EV_APPLY
)
3274 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
3275 exclude_ifname
= yang_dnode_get_string(args
->dnode
, NULL
);
3277 isis_lfa_excluded_iface_add(circuit
, ISIS_LEVEL1
, exclude_ifname
);
3278 area
= circuit
->area
;
3280 lsp_regenerate_schedule(area
, area
->is_type
, 0);
3285 int lib_interface_isis_fast_reroute_level_1_lfa_exclude_interface_destroy(
3286 struct nb_cb_destroy_args
*args
)
3288 struct isis_area
*area
;
3289 struct isis_circuit
*circuit
;
3290 const char *exclude_ifname
;
3292 if (args
->event
!= NB_EV_APPLY
)
3295 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
3296 exclude_ifname
= yang_dnode_get_string(args
->dnode
, NULL
);
3298 isis_lfa_excluded_iface_delete(circuit
, ISIS_LEVEL1
, exclude_ifname
);
3299 area
= circuit
->area
;
3301 lsp_regenerate_schedule(area
, area
->is_type
, 0);
3308 * /frr-interface:lib/interface/frr-isisd:isis/fast-reroute/level-1/remote-lfa/enable
3310 int lib_interface_isis_fast_reroute_level_1_remote_lfa_enable_modify(
3311 struct nb_cb_modify_args
*args
)
3313 struct isis_area
*area
;
3314 struct isis_circuit
*circuit
;
3316 if (args
->event
!= NB_EV_APPLY
)
3319 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
3320 circuit
->rlfa_protection
[0] = yang_dnode_get_bool(args
->dnode
, NULL
);
3322 area
= circuit
->area
;
3324 if (circuit
->rlfa_protection
[0])
3325 area
->rlfa_protected_links
[0]++;
3327 assert(area
->rlfa_protected_links
[0] > 0);
3328 area
->rlfa_protected_links
[0]--;
3331 lsp_regenerate_schedule(area
, area
->is_type
, 0);
3339 * /frr-interface:lib/interface/frr-isisd:isis/fast-reroute/level-1/remote-lfa/maximum-metric
3341 int lib_interface_isis_fast_reroute_level_1_remote_lfa_maximum_metric_modify(
3342 struct nb_cb_modify_args
*args
)
3344 struct isis_area
*area
;
3345 struct isis_circuit
*circuit
;
3347 if (args
->event
!= NB_EV_APPLY
)
3350 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
3351 circuit
->rlfa_max_metric
[0] = yang_dnode_get_uint32(args
->dnode
, NULL
);
3353 area
= circuit
->area
;
3355 lsp_regenerate_schedule(area
, area
->is_type
, 0);
3360 int lib_interface_isis_fast_reroute_level_1_remote_lfa_maximum_metric_destroy(
3361 struct nb_cb_destroy_args
*args
)
3363 struct isis_area
*area
;
3364 struct isis_circuit
*circuit
;
3366 if (args
->event
!= NB_EV_APPLY
)
3369 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
3370 circuit
->rlfa_max_metric
[0] = 0;
3372 area
= circuit
->area
;
3374 lsp_regenerate_schedule(area
, area
->is_type
, 0);
3381 * /frr-interface:lib/interface/frr-isisd:isis/fast-reroute/level-1/ti-lfa/enable
3383 int lib_interface_isis_fast_reroute_level_1_ti_lfa_enable_modify(
3384 struct nb_cb_modify_args
*args
)
3386 struct isis_area
*area
;
3387 struct isis_circuit
*circuit
;
3389 if (args
->event
!= NB_EV_APPLY
)
3392 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
3393 circuit
->tilfa_protection
[0] = yang_dnode_get_bool(args
->dnode
, NULL
);
3395 area
= circuit
->area
;
3397 if (circuit
->tilfa_protection
[0])
3398 area
->tilfa_protected_links
[0]++;
3400 assert(area
->tilfa_protected_links
[0] > 0);
3401 area
->tilfa_protected_links
[0]--;
3404 lsp_regenerate_schedule(area
, area
->is_type
, 0);
3412 * /frr-interface:lib/interface/frr-isisd:isis/fast-reroute/level-1/ti-lfa/node-protection
3414 int lib_interface_isis_fast_reroute_level_1_ti_lfa_node_protection_modify(
3415 struct nb_cb_modify_args
*args
)
3417 struct isis_area
*area
;
3418 struct isis_circuit
*circuit
;
3420 if (args
->event
!= NB_EV_APPLY
)
3423 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
3424 circuit
->tilfa_node_protection
[0] =
3425 yang_dnode_get_bool(args
->dnode
, NULL
);
3427 area
= circuit
->area
;
3429 lsp_regenerate_schedule(area
, area
->is_type
, 0);
3436 * /frr-interface:lib/interface/frr-isisd:isis/fast-reroute/level-1/ti-lfa/link-fallback
3438 int lib_interface_isis_fast_reroute_level_1_ti_lfa_link_fallback_modify(
3439 struct nb_cb_modify_args
*args
)
3441 struct isis_area
*area
;
3442 struct isis_circuit
*circuit
;
3444 if (args
->event
!= NB_EV_APPLY
)
3447 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
3448 circuit
->tilfa_link_fallback
[0] =
3449 yang_dnode_get_bool(args
->dnode
, NULL
);
3451 area
= circuit
->area
;
3453 lsp_regenerate_schedule(area
, area
->is_type
, 0);
3460 * /frr-interface:lib/interface/frr-isisd:isis/fast-reroute/level-2/lfa/enable
3462 int lib_interface_isis_fast_reroute_level_2_lfa_enable_modify(
3463 struct nb_cb_modify_args
*args
)
3465 struct isis_area
*area
;
3466 struct isis_circuit
*circuit
;
3468 if (args
->event
!= NB_EV_APPLY
)
3471 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
3472 circuit
->lfa_protection
[1] = yang_dnode_get_bool(args
->dnode
, NULL
);
3474 area
= circuit
->area
;
3476 if (circuit
->lfa_protection
[1])
3477 area
->lfa_protected_links
[1]++;
3479 assert(area
->lfa_protected_links
[1] > 0);
3480 area
->lfa_protected_links
[1]--;
3483 lsp_regenerate_schedule(area
, area
->is_type
, 0);
3491 * /frr-interface:lib/interface/frr-isisd:isis/fast-reroute/level-2/lfa/exclude-interface
3493 int lib_interface_isis_fast_reroute_level_2_lfa_exclude_interface_create(
3494 struct nb_cb_create_args
*args
)
3496 struct isis_area
*area
;
3497 struct isis_circuit
*circuit
;
3498 const char *exclude_ifname
;
3500 if (args
->event
!= NB_EV_APPLY
)
3503 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
3504 exclude_ifname
= yang_dnode_get_string(args
->dnode
, NULL
);
3506 isis_lfa_excluded_iface_add(circuit
, ISIS_LEVEL2
, exclude_ifname
);
3507 area
= circuit
->area
;
3509 lsp_regenerate_schedule(area
, area
->is_type
, 0);
3514 int lib_interface_isis_fast_reroute_level_2_lfa_exclude_interface_destroy(
3515 struct nb_cb_destroy_args
*args
)
3517 struct isis_area
*area
;
3518 struct isis_circuit
*circuit
;
3519 const char *exclude_ifname
;
3521 if (args
->event
!= NB_EV_APPLY
)
3524 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
3525 exclude_ifname
= yang_dnode_get_string(args
->dnode
, NULL
);
3527 isis_lfa_excluded_iface_delete(circuit
, ISIS_LEVEL2
, exclude_ifname
);
3528 area
= circuit
->area
;
3530 lsp_regenerate_schedule(area
, area
->is_type
, 0);
3537 * /frr-interface:lib/interface/frr-isisd:isis/fast-reroute/level-2/remote-lfa/enable
3539 int lib_interface_isis_fast_reroute_level_2_remote_lfa_enable_modify(
3540 struct nb_cb_modify_args
*args
)
3542 struct isis_area
*area
;
3543 struct isis_circuit
*circuit
;
3545 if (args
->event
!= NB_EV_APPLY
)
3548 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
3549 circuit
->rlfa_protection
[1] = yang_dnode_get_bool(args
->dnode
, NULL
);
3551 area
= circuit
->area
;
3553 if (circuit
->rlfa_protection
[1])
3554 area
->rlfa_protected_links
[1]++;
3556 assert(area
->rlfa_protected_links
[1] > 0);
3557 area
->rlfa_protected_links
[1]--;
3560 lsp_regenerate_schedule(area
, area
->is_type
, 0);
3568 * /frr-interface:lib/interface/frr-isisd:isis/fast-reroute/level-2/remote-lfa/maximum-metric
3570 int lib_interface_isis_fast_reroute_level_2_remote_lfa_maximum_metric_modify(
3571 struct nb_cb_modify_args
*args
)
3573 struct isis_area
*area
;
3574 struct isis_circuit
*circuit
;
3576 if (args
->event
!= NB_EV_APPLY
)
3579 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
3580 circuit
->rlfa_max_metric
[1] = yang_dnode_get_uint32(args
->dnode
, NULL
);
3582 area
= circuit
->area
;
3584 lsp_regenerate_schedule(area
, area
->is_type
, 0);
3589 int lib_interface_isis_fast_reroute_level_2_remote_lfa_maximum_metric_destroy(
3590 struct nb_cb_destroy_args
*args
)
3592 struct isis_area
*area
;
3593 struct isis_circuit
*circuit
;
3595 if (args
->event
!= NB_EV_APPLY
)
3598 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
3599 circuit
->rlfa_max_metric
[1] = 0;
3601 area
= circuit
->area
;
3603 lsp_regenerate_schedule(area
, area
->is_type
, 0);
3610 * /frr-interface:lib/interface/frr-isisd:isis/fast-reroute/level-2/ti-lfa/enable
3612 int lib_interface_isis_fast_reroute_level_2_ti_lfa_enable_modify(
3613 struct nb_cb_modify_args
*args
)
3615 struct isis_area
*area
;
3616 struct isis_circuit
*circuit
;
3618 if (args
->event
!= NB_EV_APPLY
)
3621 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
3622 circuit
->tilfa_protection
[1] = yang_dnode_get_bool(args
->dnode
, NULL
);
3624 area
= circuit
->area
;
3626 if (circuit
->tilfa_protection
[1])
3627 area
->tilfa_protected_links
[1]++;
3629 assert(area
->tilfa_protected_links
[1] > 0);
3630 area
->tilfa_protected_links
[1]--;
3633 lsp_regenerate_schedule(area
, area
->is_type
, 0);
3641 * /frr-interface:lib/interface/frr-isisd:isis/fast-reroute/level-2/ti-lfa/node-protection
3643 int lib_interface_isis_fast_reroute_level_2_ti_lfa_node_protection_modify(
3644 struct nb_cb_modify_args
*args
)
3646 struct isis_area
*area
;
3647 struct isis_circuit
*circuit
;
3649 if (args
->event
!= NB_EV_APPLY
)
3652 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
3653 circuit
->tilfa_node_protection
[1] =
3654 yang_dnode_get_bool(args
->dnode
, NULL
);
3656 area
= circuit
->area
;
3658 lsp_regenerate_schedule(area
, area
->is_type
, 0);
3665 * /frr-interface:lib/interface/frr-isisd:isis/fast-reroute/level-2/ti-lfa/link-fallback
3667 int lib_interface_isis_fast_reroute_level_2_ti_lfa_link_fallback_modify(
3668 struct nb_cb_modify_args
*args
)
3670 struct isis_area
*area
;
3671 struct isis_circuit
*circuit
;
3673 if (args
->event
!= NB_EV_APPLY
)
3676 circuit
= nb_running_get_entry(args
->dnode
, NULL
, true);
3677 circuit
->tilfa_link_fallback
[1] =
3678 yang_dnode_get_bool(args
->dnode
, NULL
);
3680 area
= circuit
->area
;
3682 lsp_regenerate_schedule(area
, area
->is_type
, 0);