diff options
author | Jafar Al-Gharaibeh <jafar@atcorp.com> | 2022-07-28 22:38:50 +0200 |
---|---|---|
committer | Jafar Al-Gharaibeh <jafar@atcorp.com> | 2022-07-28 23:27:19 +0200 |
commit | 90937e420c9a02f61dfb43ce426b573186b2e591 (patch) | |
tree | 5d9d7745b0264a43ba4b1f65991faa64842f783e /pimd/pim_static.c | |
parent | Merge pull request #11685 from sri-mohan1/sri-ospf (diff) | |
download | frr-90937e420c9a02f61dfb43ce426b573186b2e591.tar.xz frr-90937e420c9a02f61dfb43ce426b573186b2e591.zip |
pimd: fix static mroute to also take into account the input interface
Allow the same group/source route to be configured on more than one interface.
Currently FRR doesn't allow adding the same mroute on different input interfaces.
Current behavior, if we have the following config:
```
interface eth1
ip mroute eth0 239.0.0.1
interface eth2
ip mroute eth0 239.0.0.1
```
Only one multicast route will be installed with an input interface of the last
interface configured.
Signed-off-by: Nathan Bahr <nbahr@atcorp.com>
Signed-off-by: Jafar Al-Gharaibeh <jafar@atcorp.com>
Diffstat (limited to '')
-rw-r--r-- | pimd/pim_static.c | 50 |
1 files changed, 10 insertions, 40 deletions
diff --git a/pimd/pim_static.c b/pimd/pim_static.c index 581b855f9..f5449d282 100644 --- a/pimd/pim_static.c +++ b/pimd/pim_static.c @@ -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)) { - if (!pim_addr_cmp(s_route->group, group) - && !pim_addr_cmp(s_route->source, source)) { - if (s_route->iif == iif_index - && s_route->oif_ttls[oif_index]) { + if (!pim_addr_cmp(s_route->group, group) && + !pim_addr_cmp(s_route->source, source) && + (s_route->iif == iif_index)) { + + if (s_route->oif_ttls[oif_index]) { zlog_warn( "%s %s: Unable to add static route: Route already exists (iif=%d,oif=%d,group=%pPAs,source=%pPAs)", __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 * adding a new output interface */ - if (s_route->iif == iif_index) { - s_route->oif_ttls[oif_index] = 1; - oil_if_set(&s_route->c_oil, oif_index, 1); - s_route->c_oil.oif_creation[oif_index] = - pim_time_monotonic_sec(); - ++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; - } - } - + s_route->oif_ttls[oif_index] = 1; + oil_if_set(&s_route->c_oil, oif_index, 1); + s_route->c_oil.oif_creation[oif_index] = + pim_time_monotonic_sec(); + ++s_route->c_oil.oil_ref_count; break; } } |