summaryrefslogtreecommitdiff
path: root/isisd/isis_redist.c
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@cumulusnetworks.com>2021-05-20 09:00:46 -0400
committerGitHub <noreply@github.com>2021-05-20 09:00:46 -0400
commit21967e4e820b51a9a3f35efd0794b9601d182569 (patch)
tree0e92be2873c40f5444817942cbf064ed2362ca7b /isisd/isis_redist.c
parent91895b15a9a11f2b5d156f2ccf904f82c385b9cd (diff)
parent5cfffcdd8dc6dfac0f0ffa444dcbcebaa8d7d58f (diff)
Merge pull request #8628 from idryzhov/isis-vrf-redist
isisd: fix redistribution in vrf
Diffstat (limited to 'isisd/isis_redist.c')
-rw-r--r--isisd/isis_redist.c32
1 files changed, 27 insertions, 5 deletions
diff --git a/isisd/isis_redist.c b/isisd/isis_redist.c
index c33d56e625..2f5e490da1 100644
--- a/isisd/isis_redist.c
+++ b/isisd/isis_redist.c
@@ -56,7 +56,7 @@ static int redist_protocol(int family)
return 0;
}
-static afi_t afi_for_redist_protocol(int protocol)
+afi_t afi_for_redist_protocol(int protocol)
{
if (protocol == 0)
return AFI_IP;
@@ -350,6 +350,9 @@ static void isis_redist_update_zebra_subscriptions(struct isis *isis)
int level;
int protocol;
+ if (isis->vrf_id == VRF_UNKNOWN)
+ return;
+
char do_subscribe[REDIST_PROTOCOL_COUNT][ZEBRA_ROUTE_MAX + 1];
memset(do_subscribe, 0, sizeof(do_subscribe));
@@ -359,8 +362,9 @@ static void isis_redist_update_zebra_subscriptions(struct isis *isis)
for (type = 0; type < ZEBRA_ROUTE_MAX + 1; type++)
for (level = 0; level < ISIS_LEVELS; level++)
if (area->redist_settings[protocol]
- [type]
- [level].redist)
+ [type][level]
+ .redist
+ == 1)
do_subscribe[protocol][type] =
1;
@@ -377,20 +381,29 @@ static void isis_redist_update_zebra_subscriptions(struct isis *isis)
afi_t afi = afi_for_redist_protocol(protocol);
if (do_subscribe[protocol][type])
- isis_zebra_redistribute_set(afi, type);
+ isis_zebra_redistribute_set(afi, type,
+ isis->vrf_id);
else
- isis_zebra_redistribute_unset(afi, type);
+ isis_zebra_redistribute_unset(afi, type,
+ isis->vrf_id);
}
}
void isis_redist_free(struct isis *isis)
{
+ struct route_node *rn;
int i;
for (i = 0; i < REDIST_PROTOCOL_COUNT; i++) {
if (!isis->ext_info[i])
continue;
+ for (rn = route_top(isis->ext_info[i]); rn;
+ rn = srcdest_route_next(rn)) {
+ if (rn->info)
+ XFREE(MTYPE_ISIS_EXT_INFO, rn->info);
+ }
+
route_table_finish(isis->ext_info[i]);
isis->ext_info[i] = NULL;
}
@@ -498,6 +511,7 @@ void isis_redist_unset(struct isis_area *area, int level, int family, int type)
void isis_redist_area_finish(struct isis_area *area)
{
+ struct route_node *rn;
int protocol;
int level;
int type;
@@ -512,7 +526,15 @@ void isis_redist_area_finish(struct isis_area *area)
redist->redist = 0;
XFREE(MTYPE_ISIS_RMAP_NAME, redist->map_name);
}
+ if (!area->ext_reach[protocol][level])
+ continue;
+ for (rn = route_top(area->ext_reach[protocol][level]);
+ rn; rn = srcdest_route_next(rn)) {
+ if (rn->info)
+ XFREE(MTYPE_ISIS_EXT_INFO, rn->info);
+ }
route_table_finish(area->ext_reach[protocol][level]);
+ area->ext_reach[protocol][level] = NULL;
}
isis_redist_update_zebra_subscriptions(area->isis);