diff --git a/isisd/isis_lsp.c b/isisd/isis_lsp.c index fb69448d04..dc43822847 100644 --- a/isisd/isis_lsp.c +++ b/isisd/isis_lsp.c @@ -907,7 +907,8 @@ static void lsp_build_ext_reach_ipv4(struct isis_lsp *lsp, struct sr_prefix_cfg *pcfg = NULL; if (area->srdb.enabled) - pcfg = isis_sr_cfg_prefix_find(area, ipv4); + pcfg = isis_sr_cfg_prefix_find( + area, ipv4, SR_ALGORITHM_SPF); isis_tlvs_add_extended_ip_reach(lsp->tlvs, ipv4, metric, true, pcfg); @@ -941,7 +942,8 @@ static void lsp_build_ext_reach_ipv6(struct isis_lsp *lsp, struct sr_prefix_cfg *pcfg = NULL; if (area->srdb.enabled) - pcfg = isis_sr_cfg_prefix_find(area, p); + pcfg = isis_sr_cfg_prefix_find( + area, p, SR_ALGORITHM_SPF); isis_tlvs_add_ipv6_reach(lsp->tlvs, isis_area_ipv6_topology(area), @@ -1205,7 +1207,8 @@ static void lsp_build(struct isis_lsp *lsp, struct isis_area *area) if (area->srdb.enabled) pcfg = isis_sr_cfg_prefix_find( - area, ipv4); + area, ipv4, + SR_ALGORITHM_SPF); isis_tlvs_add_extended_ip_reach( lsp->tlvs, ipv4, metric, false, @@ -1228,7 +1231,7 @@ static void lsp_build(struct isis_lsp *lsp, struct isis_area *area) if (area->srdb.enabled) pcfg = isis_sr_cfg_prefix_find(area, - ipv6); + ipv6, 0); isis_tlvs_add_ipv6_reach( lsp->tlvs, diff --git a/isisd/isis_nb_config.c b/isisd/isis_nb_config.c index 022bfbed6e..17706279bd 100644 --- a/isisd/isis_nb_config.c +++ b/isisd/isis_nb_config.c @@ -2276,7 +2276,7 @@ int isis_instance_segment_routing_prefix_sid_map_prefix_sid_create( area = nb_running_get_entry(args->dnode, NULL, true); yang_dnode_get_prefix(&prefix, args->dnode, "./prefix"); - pcfg = isis_sr_cfg_prefix_add(area, &prefix); + pcfg = isis_sr_cfg_prefix_add(area, &prefix, SR_ALGORITHM_SPF); nb_running_set_entry(args->dnode, pcfg); return NB_OK; diff --git a/isisd/isis_sr.c b/isisd/isis_sr.c index e43b84ab2e..b809c1c3a5 100644 --- a/isisd/isis_sr.c +++ b/isisd/isis_sr.c @@ -57,7 +57,17 @@ static void sr_adj_sid_del(struct sr_adjacency *sra); static inline int sr_prefix_sid_cfg_compare(const struct sr_prefix_cfg *a, const struct sr_prefix_cfg *b) { - return prefix_cmp(&a->prefix, &b->prefix); + int ret; + + ret = prefix_cmp(&a->prefix, &b->prefix); + if (ret != 0) + return ret; + + ret = a->algorithm - b->algorithm; + if (ret != 0) + return ret; + + return 0; } DECLARE_RBTREE_UNIQ(srdb_prefix_cfg, struct sr_prefix_cfg, entry, sr_prefix_sid_cfg_compare); @@ -331,7 +341,8 @@ int isis_sr_cfg_srlb_update(struct isis_area *area, uint32_t lower_bound, * @return Newly added Prefix-SID configuration structure */ struct sr_prefix_cfg *isis_sr_cfg_prefix_add(struct isis_area *area, - const struct prefix *prefix) + const struct prefix *prefix, + uint8_t algorithm) { struct sr_prefix_cfg *pcfg; struct interface *ifp; @@ -341,6 +352,7 @@ struct sr_prefix_cfg *isis_sr_cfg_prefix_add(struct isis_area *area, pcfg = XCALLOC(MTYPE_ISIS_SR_INFO, sizeof(*pcfg)); pcfg->prefix = *prefix; pcfg->area = area; + pcfg->algorithm = algorithm; /* Pull defaults from the YANG module. */ pcfg->sid_type = yang_get_default_enum( @@ -386,11 +398,13 @@ void isis_sr_cfg_prefix_del(struct sr_prefix_cfg *pcfg) * @return Configured Prefix-SID structure if found, NULL otherwise */ struct sr_prefix_cfg *isis_sr_cfg_prefix_find(struct isis_area *area, - union prefixconstptr prefix) + union prefixconstptr prefix, + uint8_t algorithm) { struct sr_prefix_cfg pcfg = {}; prefix_copy(&pcfg.prefix, prefix.p); + pcfg.algorithm = algorithm; return srdb_prefix_cfg_find(&area->srdb.config.prefix_sids, &pcfg); } @@ -405,7 +419,7 @@ void isis_sr_prefix_cfg2subtlv(const struct sr_prefix_cfg *pcfg, bool external, struct isis_prefix_sid *psid) { /* Set SID algorithm. */ - psid->algorithm = SR_ALGORITHM_SPF; + psid->algorithm = pcfg->algorithm; /* Set SID flags. */ psid->flags = 0; @@ -939,7 +953,8 @@ static int sr_if_new_hook(struct interface *ifp) FOR_ALL_INTERFACES_ADDRESSES (ifp, connected, node) { struct sr_prefix_cfg *pcfg; - pcfg = isis_sr_cfg_prefix_find(area, connected->address); + pcfg = isis_sr_cfg_prefix_find(area, connected->address, + SR_ALGORITHM_SPF); if (!pcfg) continue; diff --git a/isisd/isis_sr.h b/isisd/isis_sr.h index 4ced5f4e83..ae15025c21 100644 --- a/isisd/isis_sr.h +++ b/isisd/isis_sr.h @@ -147,6 +147,9 @@ struct sr_prefix_cfg { /* Backpointer to IS-IS area. */ struct isis_area *area; + + /* SR Algorithm number */ + uint8_t algorithm; }; /* Per-area IS-IS Segment Routing Data Base (SRDB). */ @@ -198,11 +201,13 @@ extern int isis_sr_cfg_srgb_update(struct isis_area *area, uint32_t lower_bound, uint32_t upper_bound); extern int isis_sr_cfg_srlb_update(struct isis_area *area, uint32_t lower_bound, uint32_t upper_bound); -extern struct sr_prefix_cfg * -isis_sr_cfg_prefix_add(struct isis_area *area, const struct prefix *prefix); +extern struct sr_prefix_cfg *isis_sr_cfg_prefix_add(struct isis_area *area, + const struct prefix *prefix, + uint8_t algorithm); extern void isis_sr_cfg_prefix_del(struct sr_prefix_cfg *pcfg); extern struct sr_prefix_cfg * -isis_sr_cfg_prefix_find(struct isis_area *area, union prefixconstptr prefix); +isis_sr_cfg_prefix_find(struct isis_area *area, union prefixconstptr prefix, + uint8_t algorithm); extern void isis_sr_prefix_cfg2subtlv(const struct sr_prefix_cfg *pcfg, bool external, struct isis_prefix_sid *psid);