mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-04-29 18:10:23 +00:00
isisd: update struct sr_prefix_cfg with algorithm id
The information in prefix-sid has a new property called algorithm id. This is used to identify the algorithm that separates it in the same IGP network. This is used in Flex-Algo.In all other cases, the algorithm id is basically 0. Signed-off-by: Hiroki Shirokura <hiroki.shirokura@linecorp.com> Signed-off-by: Louis Scalbert <louis.scalbert@6wind.com>
This commit is contained in:
parent
329f87b310
commit
1f0d13e922
@ -907,7 +907,8 @@ static void lsp_build_ext_reach_ipv4(struct isis_lsp *lsp,
|
|||||||
struct sr_prefix_cfg *pcfg = NULL;
|
struct sr_prefix_cfg *pcfg = NULL;
|
||||||
|
|
||||||
if (area->srdb.enabled)
|
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,
|
isis_tlvs_add_extended_ip_reach(lsp->tlvs, ipv4, metric,
|
||||||
true, pcfg);
|
true, pcfg);
|
||||||
@ -941,7 +942,8 @@ static void lsp_build_ext_reach_ipv6(struct isis_lsp *lsp,
|
|||||||
struct sr_prefix_cfg *pcfg = NULL;
|
struct sr_prefix_cfg *pcfg = NULL;
|
||||||
|
|
||||||
if (area->srdb.enabled)
|
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_tlvs_add_ipv6_reach(lsp->tlvs,
|
||||||
isis_area_ipv6_topology(area),
|
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)
|
if (area->srdb.enabled)
|
||||||
pcfg = isis_sr_cfg_prefix_find(
|
pcfg = isis_sr_cfg_prefix_find(
|
||||||
area, ipv4);
|
area, ipv4,
|
||||||
|
SR_ALGORITHM_SPF);
|
||||||
|
|
||||||
isis_tlvs_add_extended_ip_reach(
|
isis_tlvs_add_extended_ip_reach(
|
||||||
lsp->tlvs, ipv4, metric, false,
|
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)
|
if (area->srdb.enabled)
|
||||||
pcfg = isis_sr_cfg_prefix_find(area,
|
pcfg = isis_sr_cfg_prefix_find(area,
|
||||||
ipv6);
|
ipv6, 0);
|
||||||
|
|
||||||
isis_tlvs_add_ipv6_reach(
|
isis_tlvs_add_ipv6_reach(
|
||||||
lsp->tlvs,
|
lsp->tlvs,
|
||||||
|
@ -2276,7 +2276,7 @@ int isis_instance_segment_routing_prefix_sid_map_prefix_sid_create(
|
|||||||
area = nb_running_get_entry(args->dnode, NULL, true);
|
area = nb_running_get_entry(args->dnode, NULL, true);
|
||||||
yang_dnode_get_prefix(&prefix, args->dnode, "./prefix");
|
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);
|
nb_running_set_entry(args->dnode, pcfg);
|
||||||
|
|
||||||
return NB_OK;
|
return NB_OK;
|
||||||
|
@ -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,
|
static inline int sr_prefix_sid_cfg_compare(const struct sr_prefix_cfg *a,
|
||||||
const struct sr_prefix_cfg *b)
|
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,
|
DECLARE_RBTREE_UNIQ(srdb_prefix_cfg, struct sr_prefix_cfg, entry,
|
||||||
sr_prefix_sid_cfg_compare);
|
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
|
* @return Newly added Prefix-SID configuration structure
|
||||||
*/
|
*/
|
||||||
struct sr_prefix_cfg *isis_sr_cfg_prefix_add(struct isis_area *area,
|
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 sr_prefix_cfg *pcfg;
|
||||||
struct interface *ifp;
|
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 = XCALLOC(MTYPE_ISIS_SR_INFO, sizeof(*pcfg));
|
||||||
pcfg->prefix = *prefix;
|
pcfg->prefix = *prefix;
|
||||||
pcfg->area = area;
|
pcfg->area = area;
|
||||||
|
pcfg->algorithm = algorithm;
|
||||||
|
|
||||||
/* Pull defaults from the YANG module. */
|
/* Pull defaults from the YANG module. */
|
||||||
pcfg->sid_type = yang_get_default_enum(
|
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
|
* @return Configured Prefix-SID structure if found, NULL otherwise
|
||||||
*/
|
*/
|
||||||
struct sr_prefix_cfg *isis_sr_cfg_prefix_find(struct isis_area *area,
|
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 = {};
|
struct sr_prefix_cfg pcfg = {};
|
||||||
|
|
||||||
prefix_copy(&pcfg.prefix, prefix.p);
|
prefix_copy(&pcfg.prefix, prefix.p);
|
||||||
|
pcfg.algorithm = algorithm;
|
||||||
return srdb_prefix_cfg_find(&area->srdb.config.prefix_sids, &pcfg);
|
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)
|
struct isis_prefix_sid *psid)
|
||||||
{
|
{
|
||||||
/* Set SID algorithm. */
|
/* Set SID algorithm. */
|
||||||
psid->algorithm = SR_ALGORITHM_SPF;
|
psid->algorithm = pcfg->algorithm;
|
||||||
|
|
||||||
/* Set SID flags. */
|
/* Set SID flags. */
|
||||||
psid->flags = 0;
|
psid->flags = 0;
|
||||||
@ -939,7 +953,8 @@ static int sr_if_new_hook(struct interface *ifp)
|
|||||||
FOR_ALL_INTERFACES_ADDRESSES (ifp, connected, node) {
|
FOR_ALL_INTERFACES_ADDRESSES (ifp, connected, node) {
|
||||||
struct sr_prefix_cfg *pcfg;
|
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)
|
if (!pcfg)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -147,6 +147,9 @@ struct sr_prefix_cfg {
|
|||||||
|
|
||||||
/* Backpointer to IS-IS area. */
|
/* Backpointer to IS-IS area. */
|
||||||
struct isis_area *area;
|
struct isis_area *area;
|
||||||
|
|
||||||
|
/* SR Algorithm number */
|
||||||
|
uint8_t algorithm;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Per-area IS-IS Segment Routing Data Base (SRDB). */
|
/* 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);
|
uint32_t upper_bound);
|
||||||
extern int isis_sr_cfg_srlb_update(struct isis_area *area, uint32_t lower_bound,
|
extern int isis_sr_cfg_srlb_update(struct isis_area *area, uint32_t lower_bound,
|
||||||
uint32_t upper_bound);
|
uint32_t upper_bound);
|
||||||
extern struct sr_prefix_cfg *
|
extern struct sr_prefix_cfg *isis_sr_cfg_prefix_add(struct isis_area *area,
|
||||||
isis_sr_cfg_prefix_add(struct isis_area *area, const struct prefix *prefix);
|
const struct prefix *prefix,
|
||||||
|
uint8_t algorithm);
|
||||||
extern void isis_sr_cfg_prefix_del(struct sr_prefix_cfg *pcfg);
|
extern void isis_sr_cfg_prefix_del(struct sr_prefix_cfg *pcfg);
|
||||||
extern struct sr_prefix_cfg *
|
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,
|
extern void isis_sr_prefix_cfg2subtlv(const struct sr_prefix_cfg *pcfg,
|
||||||
bool external,
|
bool external,
|
||||||
struct isis_prefix_sid *psid);
|
struct isis_prefix_sid *psid);
|
||||||
|
Loading…
Reference in New Issue
Block a user