Merge pull request #11705 from Jafaral/pim-static

pimd: fix static mroute to also take into account the input interface
This commit is contained in:
Donald Sharp 2022-08-04 22:04:02 -04:00 committed by GitHub
commit 41e5409857
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -97,10 +97,11 @@ int pim_static_add(struct pim_instance *pim, struct interface *iif,
} }
for (ALL_LIST_ELEMENTS_RO(pim->static_routes, node, s_route)) { for (ALL_LIST_ELEMENTS_RO(pim->static_routes, node, s_route)) {
if (!pim_addr_cmp(s_route->group, group) if (!pim_addr_cmp(s_route->group, group) &&
&& !pim_addr_cmp(s_route->source, source)) { !pim_addr_cmp(s_route->source, source) &&
if (s_route->iif == iif_index (s_route->iif == iif_index)) {
&& s_route->oif_ttls[oif_index]) {
if (s_route->oif_ttls[oif_index]) {
zlog_warn( zlog_warn(
"%s %s: Unable to add static route: Route already exists (iif=%d,oif=%d,group=%pPAs,source=%pPAs)", "%s %s: Unable to add static route: Route already exists (iif=%d,oif=%d,group=%pPAs,source=%pPAs)",
__FILE__, __func__, iif_index, __FILE__, __func__, iif_index,
@ -122,42 +123,11 @@ int pim_static_add(struct pim_instance *pim, struct interface *iif,
/* Route exists and has the same input interface, but /* Route exists and has the same input interface, but
* adding a new output interface */ * adding a new output interface */
if (s_route->iif == iif_index) { s_route->oif_ttls[oif_index] = 1;
s_route->oif_ttls[oif_index] = 1; oil_if_set(&s_route->c_oil, oif_index, 1);
oil_if_set(&s_route->c_oil, oif_index, 1); s_route->c_oil.oif_creation[oif_index] =
s_route->c_oil.oif_creation[oif_index] = pim_time_monotonic_sec();
pim_time_monotonic_sec(); ++s_route->c_oil.oil_ref_count;
++s_route->c_oil.oil_ref_count;
} else {
/* input interface changed */
s_route->iif = iif_index;
pim_static_mroute_iif_update(
&s_route->c_oil, iif_index, __func__);
#ifdef PIM_ENFORCE_LOOPFREE_MFC
/* check to make sure the new input was not an
* old output */
if (s_route->oif_ttls[iif_index]) {
s_route->oif_ttls[iif_index] = 0;
s_route->c_oil.oif_creation[iif_index] =
0;
oil_if_set(&s_route->c_oil, iif_index,
0);
--s_route->c_oil.oil_ref_count;
}
#endif
/* now add the new output, if it is new */
if (!s_route->oif_ttls[oif_index]) {
s_route->oif_ttls[oif_index] = 1;
s_route->c_oil.oif_creation[oif_index] =
pim_time_monotonic_sec();
oil_if_set(&s_route->c_oil, oif_index,
1);
++s_route->c_oil.oil_ref_count;
}
}
break; break;
} }
} }