isis_tlvs_add_oldstyle_ip_reach(lsp->tlvs, ipv4,
metric);
if (area->newmetric) {
- struct sr_prefix_cfg *pcfg = NULL;
+ struct sr_prefix_cfg *pcfgs[SR_ALGORITHM_COUNT] = {
+ NULL};
if (area->srdb.enabled)
- pcfg = isis_sr_cfg_prefix_find(
- area, ipv4, SR_ALGORITHM_SPF);
+ for (int i = 0; i < SR_ALGORITHM_COUNT; i++)
+ pcfgs[i] = isis_sr_cfg_prefix_find(
+ area, ipv4, i);
isis_tlvs_add_extended_ip_reach(lsp->tlvs, ipv4, metric,
- true, pcfg);
+ true, pcfgs);
}
}
}
metric = MAX_WIDE_PATH_METRIC;
if (!src_p || !src_p->prefixlen) {
- struct sr_prefix_cfg *pcfg = NULL;
+ struct sr_prefix_cfg *pcfgs[SR_ALGORITHM_COUNT] = {
+ NULL};
if (area->srdb.enabled)
- pcfg = isis_sr_cfg_prefix_find(
- area, p, SR_ALGORITHM_SPF);
+ for (int i = 0; i < SR_ALGORITHM_COUNT; i++)
+ pcfgs[i] = isis_sr_cfg_prefix_find(
+ area, p, i);
isis_tlvs_add_ipv6_reach(lsp->tlvs,
isis_area_ipv6_topology(area),
- p, metric, true, pcfg);
+ p, metric, true, pcfgs);
} else if (isis_area_ipv6_dstsrc_enabled(area)) {
isis_tlvs_add_ipv6_dstsrc_reach(lsp->tlvs,
ISIS_MT_IPV6_DSTSRC,
}
if (area->newmetric) {
- struct sr_prefix_cfg *pcfg = NULL;
+ struct sr_prefix_cfg
+ *pcfgs[SR_ALGORITHM_COUNT] = {
+ NULL};
lsp_debug(
"ISIS (%s): Adding te-style IP reachability for %pFX",
area->area_tag, ipv4);
if (area->srdb.enabled)
- pcfg = isis_sr_cfg_prefix_find(
- area, ipv4,
- SR_ALGORITHM_SPF);
+ for (int i = 0;
+ i < SR_ALGORITHM_COUNT;
+ i++)
+ pcfgs[i] =
+ isis_sr_cfg_prefix_find(
+ area,
+ ipv4,
+ i);
isis_tlvs_add_extended_ip_reach(
lsp->tlvs, ipv4, metric, false,
- pcfg);
+ pcfgs);
}
}
}
for (ALL_LIST_ELEMENTS_RO(circuit->ipv6_non_link,
ipnode, ipv6)) {
- struct sr_prefix_cfg *pcfg = NULL;
+ struct sr_prefix_cfg
+ *pcfgs[SR_ALGORITHM_COUNT] = {NULL};
lsp_debug(
"ISIS (%s): Adding IPv6 reachability for %pFX",
area->area_tag, ipv6);
if (area->srdb.enabled)
- pcfg = isis_sr_cfg_prefix_find(area,
- ipv6, 0);
+ for (int i = 0; i < SR_ALGORITHM_COUNT;
+ i++)
+ pcfgs[i] =
+ isis_sr_cfg_prefix_find(
+ area, ipv6, i);
isis_tlvs_add_ipv6_reach(
lsp->tlvs,
isis_area_ipv6_topology(area), ipv6,
- metric, false, pcfg);
+ metric, false, pcfgs);
}
}
void isis_tlvs_add_extended_ip_reach(struct isis_tlvs *tlvs,
struct prefix_ipv4 *dest, uint32_t metric,
- bool external, struct sr_prefix_cfg *pcfg)
+ bool external,
+ struct sr_prefix_cfg **pcfgs)
{
struct isis_extended_ip_reach *r = XCALLOC(MTYPE_ISIS_TLV, sizeof(*r));
r->metric = metric;
memcpy(&r->prefix, dest, sizeof(*dest));
apply_mask_ipv4(&r->prefix);
- if (pcfg) {
- struct isis_prefix_sid *psid =
- XCALLOC(MTYPE_ISIS_SUBTLV, sizeof(*psid));
- isis_sr_prefix_cfg2subtlv(pcfg, external, psid);
+ if (pcfgs) {
r->subtlvs = isis_alloc_subtlvs(ISIS_CONTEXT_SUBTLV_IP_REACH);
- append_item(&r->subtlvs->prefix_sids, (struct isis_item *)psid);
+ for (int i = 0; i < SR_ALGORITHM_COUNT; i++) {
+ struct isis_prefix_sid *psid;
+ struct sr_prefix_cfg *pcfg = pcfgs[i];
+
+ if (!pcfg)
+ continue;
+
+ psid = XCALLOC(MTYPE_ISIS_SUBTLV, sizeof(*psid));
+ isis_sr_prefix_cfg2subtlv(pcfg, external, psid);
+ append_item(&r->subtlvs->prefix_sids,
+ (struct isis_item *)psid);
+ }
}
+
append_item(&tlvs->extended_ip_reach, (struct isis_item *)r);
}
void isis_tlvs_add_ipv6_reach(struct isis_tlvs *tlvs, uint16_t mtid,
struct prefix_ipv6 *dest, uint32_t metric,
- bool external, struct sr_prefix_cfg *pcfg)
+ bool external, struct sr_prefix_cfg **pcfgs)
{
struct isis_ipv6_reach *r = XCALLOC(MTYPE_ISIS_TLV, sizeof(*r));
r->metric = metric;
memcpy(&r->prefix, dest, sizeof(*dest));
apply_mask_ipv6(&r->prefix);
- if (pcfg) {
- struct isis_prefix_sid *psid =
- XCALLOC(MTYPE_ISIS_SUBTLV, sizeof(*psid));
-
- isis_sr_prefix_cfg2subtlv(pcfg, external, psid);
+ if (pcfgs) {
r->subtlvs = isis_alloc_subtlvs(ISIS_CONTEXT_SUBTLV_IP_REACH);
- append_item(&r->subtlvs->prefix_sids, (struct isis_item *)psid);
+ for (int i = 0; i < SR_ALGORITHM_COUNT; i++) {
+ struct isis_prefix_sid *psid;
+ struct sr_prefix_cfg *pcfg = pcfgs[i];
+
+ if (!pcfg)
+ continue;
+
+ psid = XCALLOC(MTYPE_ISIS_SUBTLV, sizeof(*psid));
+ isis_sr_prefix_cfg2subtlv(pcfg, external, psid);
+ append_item(&r->subtlvs->prefix_sids,
+ (struct isis_item *)psid);
+ }
}
struct isis_item_list *l;
struct prefix_ipv4 *dest, uint8_t metric);
void isis_tlvs_add_extended_ip_reach(struct isis_tlvs *tlvs,
struct prefix_ipv4 *dest, uint32_t metric,
- bool external, struct sr_prefix_cfg *pcfg);
+ bool external,
+ struct sr_prefix_cfg **pcfgs);
void isis_tlvs_add_ipv6_reach(struct isis_tlvs *tlvs, uint16_t mtid,
struct prefix_ipv6 *dest, uint32_t metric,
- bool external, struct sr_prefix_cfg *pcfg);
+ bool external, struct sr_prefix_cfg **pcfgs);
void isis_tlvs_add_ipv6_dstsrc_reach(struct isis_tlvs *tlvs, uint16_t mtid,
struct prefix_ipv6 *dest,
struct prefix_ipv6 *src,
{
struct prefix prefix;
struct sr_prefix_cfg pcfg = {};
- struct sr_prefix_cfg *pcfg_p = NULL;
+ struct sr_prefix_cfg *pcfg_p[SR_ALGORITHM_COUNT] = {NULL};
if (str2prefix(prefix_str, &prefix) != 1) {
zlog_debug("%s: invalid network: %s", __func__, prefix_str);
}
if (CHECK_FLAG(tnode->flags, F_ISIS_TEST_NODE_SR)) {
- pcfg_p = &pcfg;
+ pcfg_p[SR_ALGORITHM_SPF] = &pcfg;
pcfg.sid = *next_sid_index;
*next_sid_index = *next_sid_index + 1;