rinfo->cost = cost;
rinfo->depth = depth;
rinfo->sr = *sr;
+ rinfo->sr.nexthops = rinfo->nexthops;
+ rinfo->sr.nexthops_backup =
+ rinfo->backup ? rinfo->backup->nexthops : NULL;
return rinfo;
}
route_info);
/* Install/reinstall Prefix-SID label. */
if (route_info->sr.present)
- isis_zebra_prefix_sid_install(area, prefix, route_info,
+ isis_zebra_prefix_sid_install(area, prefix,
&route_info->sr);
+
hook_call(isis_route_update_hook, area, prefix, route_info);
SET_FLAG(route_info->flag, ISIS_ROUTE_FLAG_ZEBRA_SYNCED);
src_p);
if (rnode_bck) {
rinfo->backup = rnode_bck->info;
+ rinfo->sr.nexthops_backup =
+ rinfo->backup->nexthops;
UNSET_FLAG(rinfo->flag,
ISIS_ROUTE_FLAG_ZEBRA_SYNCED);
} else if (rinfo->backup) {
rinfo->backup = NULL;
+ rinfo->sr.nexthops_backup = NULL;
UNSET_FLAG(rinfo->flag,
ISIS_ROUTE_FLAG_ZEBRA_SYNCED);
}
tables_backup[level - 1], prefix, src_p);
if (rnode_bck) {
rinfo->backup = rnode_bck->info;
+ rinfo->sr.nexthops_backup =
+ rinfo->backup->nexthops;
UNSET_FLAG(rinfo->flag,
ISIS_ROUTE_FLAG_ZEBRA_SYNCED);
} else if (rinfo->backup) {
rinfo->backup = NULL;
+ rinfo->sr.nexthops_backup = NULL;
UNSET_FLAG(rinfo->flag,
ISIS_ROUTE_FLAG_ZEBRA_SYNCED);
}
if (rinfo->backup) {
rinfo->backup = NULL;
+ rinfo->sr.nexthops_backup = NULL;
/*
* For now, always force routes that have backup
* nexthops to be reinstalled.
bool present;
uint8_t algorithm;
+
+ struct list *nexthops;
+ struct list *nexthops_backup;
};
/* Segment Routing Local Block allocation */
*/
void isis_zebra_prefix_sid_install(struct isis_area *area,
struct prefix *prefix,
- struct isis_route_info *rinfo,
struct isis_sr_psid_info *psid)
{
struct zapi_labels zl;
zl.local_label = psid->label;
/* Local routes don't have any nexthop and require special handling. */
- if (list_isempty(rinfo->nexthops)) {
+ if (list_isempty(psid->nexthops)) {
struct zapi_nexthop *znh;
struct interface *ifp;
znh->labels[0] = MPLS_LABEL_IMPLICIT_NULL;
} else {
/* Add backup nexthops first. */
- if (rinfo->backup) {
+ if (psid->nexthops_backup) {
count = isis_zebra_add_nexthops(
- area->isis, rinfo->backup->nexthops,
+ area->isis, psid->nexthops_backup,
zl.backup_nexthops, ISIS_NEXTHOP_BACKUP, true,
0);
if (count > 0) {
}
/* Add primary nexthops. */
- count = isis_zebra_add_nexthops(area->isis, rinfo->nexthops,
+ count = isis_zebra_add_nexthops(area->isis, psid->nexthops,
zl.nexthops, ISIS_NEXTHOP_MAIN,
true, count);
if (!count)
struct isis_route_info *route_info);
void isis_zebra_prefix_sid_install(struct isis_area *area,
struct prefix *prefix,
- struct isis_route_info *rinfo,
struct isis_sr_psid_info *psid);
void isis_zebra_prefix_sid_uninstall(struct isis_area *area,
struct prefix *prefix,