2017-02-22 16:28:36 +01:00
|
|
|
/*
|
|
|
|
* PIM for Quagga
|
|
|
|
* Copyright (C) 2017 Cumulus Networks, Inc.
|
|
|
|
* Chirag Shah
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful, but
|
|
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* General Public License for more details.
|
|
|
|
*
|
2017-05-13 10:25:29 +02:00
|
|
|
* You should have received a copy of the GNU General Public License along
|
|
|
|
* with this program; see the file COPYING; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
2017-02-22 16:28:36 +01:00
|
|
|
*/
|
|
|
|
#include <zebra.h>
|
|
|
|
#include "network.h"
|
|
|
|
#include "zclient.h"
|
|
|
|
#include "stream.h"
|
|
|
|
#include "nexthop.h"
|
|
|
|
#include "if.h"
|
|
|
|
#include "hash.h"
|
|
|
|
#include "jhash.h"
|
|
|
|
|
2020-10-18 13:33:54 +02:00
|
|
|
#include "lib/printfrr.h"
|
|
|
|
|
2017-02-22 16:28:36 +01:00
|
|
|
#include "pimd.h"
|
|
|
|
#include "pimd/pim_nht.h"
|
2022-05-06 12:36:51 +02:00
|
|
|
#include "pim_instance.h"
|
2017-02-22 16:28:36 +01:00
|
|
|
#include "log.h"
|
|
|
|
#include "pim_time.h"
|
|
|
|
#include "pim_oil.h"
|
|
|
|
#include "pim_ifchannel.h"
|
|
|
|
#include "pim_mroute.h"
|
|
|
|
#include "pim_zebra.h"
|
|
|
|
#include "pim_upstream.h"
|
|
|
|
#include "pim_join.h"
|
|
|
|
#include "pim_jp_agg.h"
|
|
|
|
#include "pim_zebra.h"
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
#include "pim_zlookup.h"
|
2019-02-22 15:37:06 +01:00
|
|
|
#include "pim_rp.h"
|
2022-02-16 13:51:42 +01:00
|
|
|
#include "pim_addr.h"
|
2017-02-22 16:28:36 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* pim_sendmsg_zebra_rnh -- Format and send a nexthop register/Unregister
|
|
|
|
* command to Zebra.
|
|
|
|
*/
|
2017-06-29 16:45:38 +02:00
|
|
|
void pim_sendmsg_zebra_rnh(struct pim_instance *pim, struct zclient *zclient,
|
2017-02-22 16:28:36 +01:00
|
|
|
struct pim_nexthop_cache *pnc, int command)
|
|
|
|
{
|
2022-04-27 10:31:06 +02:00
|
|
|
struct prefix p;
|
2017-02-22 16:28:36 +01:00
|
|
|
int ret;
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2022-04-27 10:31:06 +02:00
|
|
|
pim_addr_to_prefix(&p, pnc->rpf.rpf_addr);
|
|
|
|
ret = zclient_send_rnh(zclient, command, &p, SAFI_UNICAST, false, false,
|
2021-09-24 21:51:18 +02:00
|
|
|
pim->vrf->vrf_id);
|
2020-11-11 20:14:37 +01:00
|
|
|
if (ret == ZCLIENT_SEND_FAILURE)
|
2017-02-22 16:28:36 +01:00
|
|
|
zlog_warn("sendmsg_nexthop: zclient_send_message() failed");
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2020-10-18 13:33:54 +02:00
|
|
|
if (PIM_DEBUG_PIM_NHT)
|
2017-07-06 15:57:35 +02:00
|
|
|
zlog_debug(
|
2020-10-18 13:33:54 +02:00
|
|
|
"%s: NHT %sregistered addr %pFX(%s) with Zebra ret:%d ",
|
2020-03-05 19:17:54 +01:00
|
|
|
__func__,
|
2022-04-27 10:31:06 +02:00
|
|
|
(command == ZEBRA_NEXTHOP_REGISTER) ? " " : "de", &p,
|
2017-07-06 15:57:35 +02:00
|
|
|
pim->vrf->name, ret);
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2017-02-22 16:28:36 +01:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2017-05-19 21:34:40 +02:00
|
|
|
struct pim_nexthop_cache *pim_nexthop_cache_find(struct pim_instance *pim,
|
|
|
|
struct pim_rpf *rpf)
|
2017-02-22 16:28:36 +01:00
|
|
|
{
|
|
|
|
struct pim_nexthop_cache *pnc = NULL;
|
|
|
|
struct pim_nexthop_cache lookup;
|
|
|
|
|
2022-02-16 13:51:42 +01:00
|
|
|
lookup.rpf.rpf_addr = rpf->rpf_addr;
|
2017-05-19 21:34:40 +02:00
|
|
|
pnc = hash_lookup(pim->rpf_hash, &lookup);
|
2017-02-22 16:28:36 +01:00
|
|
|
|
|
|
|
return pnc;
|
|
|
|
}
|
|
|
|
|
2017-07-06 15:57:35 +02:00
|
|
|
static struct pim_nexthop_cache *pim_nexthop_cache_add(struct pim_instance *pim,
|
|
|
|
struct pim_rpf *rpf_addr)
|
2017-02-22 16:28:36 +01:00
|
|
|
{
|
|
|
|
struct pim_nexthop_cache *pnc;
|
2017-07-25 15:45:03 +02:00
|
|
|
char hash_name[64];
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2017-02-22 16:28:36 +01:00
|
|
|
pnc = XCALLOC(MTYPE_PIM_NEXTHOP_CACHE,
|
|
|
|
sizeof(struct pim_nexthop_cache));
|
2022-02-16 13:51:42 +01:00
|
|
|
pnc->rpf.rpf_addr = rpf_addr->rpf_addr;
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2017-05-19 21:34:40 +02:00
|
|
|
pnc = hash_get(pim->rpf_hash, pnc, hash_alloc_intern);
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2017-02-22 16:28:36 +01:00
|
|
|
pnc->rp_list = list_new();
|
|
|
|
pnc->rp_list->cmp = pim_rp_list_cmp;
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2022-04-27 10:31:06 +02:00
|
|
|
snprintfrr(hash_name, sizeof(hash_name), "PNC %pPA(%s) Upstream Hash",
|
2020-10-18 13:33:54 +02:00
|
|
|
&pnc->rpf.rpf_addr, pim->vrf->name);
|
2017-07-13 00:17:31 +02:00
|
|
|
pnc->upstream_hash = hash_create_size(8192, pim_upstream_hash_key,
|
|
|
|
pim_upstream_equal, hash_name);
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2017-02-22 16:28:36 +01:00
|
|
|
return pnc;
|
|
|
|
}
|
|
|
|
|
2021-06-25 10:53:26 +02:00
|
|
|
static struct pim_nexthop_cache *pim_nht_get(struct pim_instance *pim,
|
2022-04-27 10:31:06 +02:00
|
|
|
pim_addr *addr)
|
2017-02-22 16:28:36 +01:00
|
|
|
{
|
|
|
|
struct pim_nexthop_cache *pnc = NULL;
|
|
|
|
struct pim_rpf rpf;
|
|
|
|
struct zclient *zclient = NULL;
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2017-02-22 16:28:36 +01:00
|
|
|
zclient = pim_zebra_zclient_get();
|
2022-05-11 12:16:44 +02:00
|
|
|
memset(&rpf, 0, sizeof(rpf));
|
2022-02-16 13:51:42 +01:00
|
|
|
rpf.rpf_addr = *addr;
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2017-05-19 21:40:34 +02:00
|
|
|
pnc = pim_nexthop_cache_find(pim, &rpf);
|
2017-02-22 16:28:36 +01:00
|
|
|
if (!pnc) {
|
2017-05-19 21:40:34 +02:00
|
|
|
pnc = pim_nexthop_cache_add(pim, &rpf);
|
2017-07-06 15:57:35 +02:00
|
|
|
pim_sendmsg_zebra_rnh(pim, zclient, pnc,
|
|
|
|
ZEBRA_NEXTHOP_REGISTER);
|
2021-12-02 06:07:02 +01:00
|
|
|
if (PIM_DEBUG_PIM_NHT_DETAIL)
|
2017-07-06 15:57:35 +02:00
|
|
|
zlog_debug(
|
2022-04-27 10:31:06 +02:00
|
|
|
"%s: NHT cache and zebra notification added for %pPA(%s)",
|
2020-10-18 13:33:54 +02:00
|
|
|
__func__, addr, pim->vrf->name);
|
2017-07-17 14:03:14 +02:00
|
|
|
}
|
|
|
|
|
2021-06-25 10:53:26 +02:00
|
|
|
return pnc;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* TBD: this does several distinct things and should probably be split up.
|
|
|
|
* (checking state vs. returning pnc vs. adding upstream vs. adding rp)
|
|
|
|
*/
|
2022-04-27 10:31:06 +02:00
|
|
|
int pim_find_or_track_nexthop(struct pim_instance *pim, pim_addr *addr,
|
2021-06-25 10:53:26 +02:00
|
|
|
struct pim_upstream *up, struct rp_info *rp,
|
|
|
|
struct pim_nexthop_cache *out_pnc)
|
|
|
|
{
|
|
|
|
struct pim_nexthop_cache *pnc;
|
|
|
|
struct listnode *ch_node = NULL;
|
|
|
|
|
|
|
|
pnc = pim_nht_get(pim, addr);
|
|
|
|
|
2022-04-27 10:31:06 +02:00
|
|
|
assertf(up || rp, "addr=%pPA", addr);
|
2021-06-25 10:53:26 +02:00
|
|
|
|
2017-02-22 16:28:36 +01:00
|
|
|
if (rp != NULL) {
|
|
|
|
ch_node = listnode_lookup(pnc->rp_list, rp);
|
2017-07-06 15:57:35 +02:00
|
|
|
if (ch_node == NULL)
|
2017-02-22 16:28:36 +01:00
|
|
|
listnode_add_sort(pnc->rp_list, rp);
|
2017-07-17 14:03:14 +02:00
|
|
|
}
|
|
|
|
|
2017-07-13 00:17:31 +02:00
|
|
|
if (up != NULL)
|
*: remove the checking returned value for hash_get()
Firstly, *keep no change* for `hash_get()` with NULL
`alloc_func`.
Only focus on cases with non-NULL `alloc_func` of
`hash_get()`.
Since `hash_get()` with non-NULL `alloc_func` parameter
shall not fail, just ignore the returned value of it.
The returned value must not be NULL.
So in this case, remove the unnecessary checking NULL
or not for the returned value and add `void` in front
of it.
Importantly, also *keep no change* for the two cases with
non-NULL `alloc_func` -
1) Use `assert(<returned_data> == <searching_data>)` to
ensure it is a created node, not a found node.
Refer to `isis_vertex_queue_insert()` of isisd, there
are many examples of this case in isid.
2) Use `<returned_data> != <searching_data>` to judge it
is a found node, then free <searching_data>.
Refer to `aspath_intern()` of bgpd, there are many
examples of this case in bgpd.
Here, <returned_data> is the returned value from `hash_get()`,
and <searching_data> is the data, which is to be put into
hash table.
Signed-off-by: anlan_cs <vic.lan@pica8.com>
2022-04-21 08:37:12 +02:00
|
|
|
(void)hash_get(pnc->upstream_hash, up, hash_alloc_intern);
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2018-07-08 18:09:21 +02:00
|
|
|
if (CHECK_FLAG(pnc->flags, PIM_NEXTHOP_VALID)) {
|
2019-04-02 15:40:41 +02:00
|
|
|
if (out_pnc)
|
|
|
|
memcpy(out_pnc, pnc, sizeof(struct pim_nexthop_cache));
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
return 1;
|
|
|
|
}
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2017-02-22 16:28:36 +01:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2022-03-01 10:57:42 +01:00
|
|
|
#if PIM_IPV == 4
|
2021-06-25 10:53:26 +02:00
|
|
|
void pim_nht_bsr_add(struct pim_instance *pim, struct in_addr addr)
|
|
|
|
{
|
|
|
|
struct pim_nexthop_cache *pnc;
|
2022-04-27 10:31:06 +02:00
|
|
|
pim_addr rpf_addr;
|
2021-06-25 10:53:26 +02:00
|
|
|
|
2022-04-27 10:31:06 +02:00
|
|
|
rpf_addr = addr;
|
2021-06-25 10:53:26 +02:00
|
|
|
|
2022-04-27 10:31:06 +02:00
|
|
|
pnc = pim_nht_get(pim, &rpf_addr);
|
2021-06-25 10:53:26 +02:00
|
|
|
|
|
|
|
pnc->bsr_count++;
|
|
|
|
}
|
2022-03-01 10:57:42 +01:00
|
|
|
#endif /* PIM_IPV == 4 */
|
2021-06-25 10:53:26 +02:00
|
|
|
|
|
|
|
static void pim_nht_drop_maybe(struct pim_instance *pim,
|
|
|
|
struct pim_nexthop_cache *pnc)
|
|
|
|
{
|
|
|
|
if (PIM_DEBUG_PIM_NHT)
|
|
|
|
zlog_debug(
|
2022-04-27 10:31:06 +02:00
|
|
|
"%s: NHT %pPA(%s) rp_list count:%d upstream count:%ld BSR count:%u",
|
2021-06-25 10:53:26 +02:00
|
|
|
__func__, &pnc->rpf.rpf_addr, pim->vrf->name,
|
|
|
|
pnc->rp_list->count, pnc->upstream_hash->count,
|
|
|
|
pnc->bsr_count);
|
|
|
|
|
|
|
|
if (pnc->rp_list->count == 0 && pnc->upstream_hash->count == 0
|
|
|
|
&& pnc->bsr_count == 0) {
|
|
|
|
struct zclient *zclient = pim_zebra_zclient_get();
|
|
|
|
|
|
|
|
pim_sendmsg_zebra_rnh(pim, zclient, pnc,
|
|
|
|
ZEBRA_NEXTHOP_UNREGISTER);
|
|
|
|
|
|
|
|
list_delete(&pnc->rp_list);
|
|
|
|
hash_free(pnc->upstream_hash);
|
|
|
|
|
|
|
|
hash_release(pim->rpf_hash, pnc);
|
|
|
|
if (pnc->nexthop)
|
|
|
|
nexthops_free(pnc->nexthop);
|
|
|
|
XFREE(MTYPE_PIM_NEXTHOP_CACHE, pnc);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-04-27 10:31:06 +02:00
|
|
|
void pim_delete_tracked_nexthop(struct pim_instance *pim, pim_addr *addr,
|
2021-06-25 10:53:26 +02:00
|
|
|
struct pim_upstream *up, struct rp_info *rp)
|
2017-02-22 16:28:36 +01:00
|
|
|
{
|
|
|
|
struct pim_nexthop_cache *pnc = NULL;
|
|
|
|
struct pim_nexthop_cache lookup;
|
2019-02-23 13:40:19 +01:00
|
|
|
struct pim_upstream *upstream = NULL;
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2017-02-22 16:28:36 +01:00
|
|
|
/* Remove from RPF hash if it is the last entry */
|
|
|
|
lookup.rpf.rpf_addr = *addr;
|
2017-05-19 21:34:40 +02:00
|
|
|
pnc = hash_lookup(pim->rpf_hash, &lookup);
|
2021-06-25 10:53:26 +02:00
|
|
|
if (!pnc) {
|
2022-04-27 10:31:06 +02:00
|
|
|
zlog_warn("attempting to delete nonexistent NHT entry %pPA",
|
2021-06-25 10:53:26 +02:00
|
|
|
addr);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (rp) {
|
|
|
|
/* Release the (*, G)upstream from pnc->upstream_hash,
|
|
|
|
* whose Group belongs to the RP getting deleted
|
|
|
|
*/
|
|
|
|
frr_each (rb_pim_upstream, &pim->upstream_head, upstream) {
|
|
|
|
struct prefix grp;
|
|
|
|
struct rp_info *trp_info;
|
|
|
|
|
2022-01-04 21:48:13 +01:00
|
|
|
if (!pim_addr_is_any(upstream->sg.src))
|
2021-06-25 10:53:26 +02:00
|
|
|
continue;
|
|
|
|
|
2022-01-14 16:55:12 +01:00
|
|
|
pim_addr_to_prefix(&grp, upstream->sg.grp);
|
2021-06-25 10:53:26 +02:00
|
|
|
trp_info = pim_rp_find_match_group(pim, &grp);
|
|
|
|
if (trp_info == rp)
|
|
|
|
hash_release(pnc->upstream_hash, upstream);
|
2019-02-23 13:40:19 +01:00
|
|
|
}
|
2021-06-25 10:53:26 +02:00
|
|
|
listnode_delete(pnc->rp_list, rp);
|
|
|
|
}
|
2019-02-23 13:40:19 +01:00
|
|
|
|
2021-06-25 10:53:26 +02:00
|
|
|
if (up)
|
|
|
|
hash_release(pnc->upstream_hash, up);
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2021-06-25 10:53:26 +02:00
|
|
|
pim_nht_drop_maybe(pim, pnc);
|
|
|
|
}
|
2019-05-02 07:28:53 +02:00
|
|
|
|
2022-03-01 10:57:42 +01:00
|
|
|
#if PIM_IPV == 4
|
2021-06-25 10:53:26 +02:00
|
|
|
void pim_nht_bsr_del(struct pim_instance *pim, struct in_addr addr)
|
|
|
|
{
|
|
|
|
struct pim_nexthop_cache *pnc = NULL;
|
|
|
|
struct pim_nexthop_cache lookup;
|
|
|
|
|
2022-02-04 14:49:39 +01:00
|
|
|
/*
|
|
|
|
* Nothing to do here if the address to unregister
|
|
|
|
* is 0.0.0.0 as that the BSR has not been registered
|
|
|
|
* for tracking yet.
|
|
|
|
*/
|
|
|
|
if (addr.s_addr == INADDR_ANY)
|
|
|
|
return;
|
|
|
|
|
2022-04-27 10:31:06 +02:00
|
|
|
lookup.rpf.rpf_addr = addr;
|
2021-06-25 10:53:26 +02:00
|
|
|
|
|
|
|
pnc = hash_lookup(pim->rpf_hash, &lookup);
|
|
|
|
|
|
|
|
if (!pnc) {
|
|
|
|
zlog_warn("attempting to delete nonexistent NHT BSR entry %pI4",
|
|
|
|
&addr);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
assertf(pnc->bsr_count > 0, "addr=%pI4", &addr);
|
|
|
|
pnc->bsr_count--;
|
|
|
|
|
|
|
|
pim_nht_drop_maybe(pim, pnc);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool pim_nht_bsr_rpf_check(struct pim_instance *pim, struct in_addr bsr_addr,
|
2022-02-28 08:06:18 +01:00
|
|
|
struct interface *src_ifp, pim_addr src_ip)
|
2021-06-25 10:53:26 +02:00
|
|
|
{
|
|
|
|
struct pim_nexthop_cache *pnc = NULL;
|
|
|
|
struct pim_nexthop_cache lookup;
|
2021-07-26 10:47:21 +02:00
|
|
|
struct pim_neighbor *nbr = NULL;
|
2021-06-25 10:53:26 +02:00
|
|
|
struct nexthop *nh;
|
2021-07-26 10:47:21 +02:00
|
|
|
struct interface *ifp;
|
2021-06-25 10:53:26 +02:00
|
|
|
|
2022-04-27 10:31:06 +02:00
|
|
|
lookup.rpf.rpf_addr = bsr_addr;
|
2021-06-25 10:53:26 +02:00
|
|
|
|
|
|
|
pnc = hash_lookup(pim->rpf_hash, &lookup);
|
2021-07-26 10:47:21 +02:00
|
|
|
if (!pnc || !CHECK_FLAG(pnc->flags, PIM_NEXTHOP_ANSWER_RECEIVED)) {
|
|
|
|
/* BSM from a new freshly registered BSR - do a synchronous
|
|
|
|
* zebra query since otherwise we'd drop the first packet,
|
|
|
|
* leading to additional delay in picking up BSM data
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* FIXME: this should really be moved into a generic NHT
|
|
|
|
* function that does "add and get immediate result" or maybe
|
|
|
|
* "check cache or get immediate result." But until that can
|
|
|
|
* be worked in, here's a copy of the code below :(
|
|
|
|
*/
|
2022-06-22 14:12:04 +02:00
|
|
|
struct pim_zlookup_nexthop nexthop_tab[router->multipath];
|
2021-07-26 10:47:21 +02:00
|
|
|
ifindex_t i;
|
|
|
|
struct interface *ifp = NULL;
|
|
|
|
int num_ifindex;
|
|
|
|
|
|
|
|
memset(nexthop_tab, 0, sizeof(nexthop_tab));
|
2022-06-22 14:12:04 +02:00
|
|
|
num_ifindex = zclient_lookup_nexthop(
|
|
|
|
pim, nexthop_tab, router->multipath, bsr_addr,
|
|
|
|
PIM_NEXTHOP_LOOKUP_MAX);
|
2021-07-26 10:47:21 +02:00
|
|
|
|
|
|
|
if (num_ifindex <= 0)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
for (i = 0; i < num_ifindex; i++) {
|
|
|
|
struct pim_zlookup_nexthop *znh = &nexthop_tab[i];
|
|
|
|
|
|
|
|
/* pim_zlookup_nexthop has no ->type */
|
|
|
|
|
|
|
|
/* 1:1 match code below with znh instead of nh */
|
|
|
|
ifp = if_lookup_by_index(znh->ifindex,
|
|
|
|
pim->vrf->vrf_id);
|
|
|
|
|
|
|
|
if (!ifp || !ifp->info)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if (if_is_loopback(ifp) && if_is_loopback(src_ifp))
|
|
|
|
return true;
|
|
|
|
|
2022-04-06 16:35:11 +02:00
|
|
|
nbr = pim_neighbor_find(ifp, znh->nexthop_addr);
|
2021-07-26 10:47:21 +02:00
|
|
|
if (!nbr)
|
|
|
|
continue;
|
|
|
|
|
2022-04-06 16:35:11 +02:00
|
|
|
return znh->ifindex == src_ifp->ifindex &&
|
|
|
|
(!pim_addr_cmp(znh->nexthop_addr, src_ip));
|
2021-07-26 10:47:21 +02:00
|
|
|
}
|
2021-06-25 10:53:26 +02:00
|
|
|
return false;
|
2021-07-26 10:47:21 +02:00
|
|
|
}
|
|
|
|
|
2021-06-25 10:53:26 +02:00
|
|
|
if (!CHECK_FLAG(pnc->flags, PIM_NEXTHOP_VALID))
|
|
|
|
return false;
|
|
|
|
|
|
|
|
/* if we accept BSMs from more than one ECMP nexthop, this will cause
|
|
|
|
* BSM message "multiplication" for each ECMP hop. i.e. if you have
|
|
|
|
* 4-way ECMP and 4 hops you end up with 256 copies of each BSM
|
|
|
|
* message.
|
|
|
|
*
|
2021-07-26 10:47:21 +02:00
|
|
|
* so... only accept the first (IPv4) valid nexthop as source.
|
2021-06-25 10:53:26 +02:00
|
|
|
*/
|
|
|
|
|
|
|
|
for (nh = pnc->nexthop; nh; nh = nh->next) {
|
2022-01-14 17:47:14 +01:00
|
|
|
pim_addr nhaddr;
|
2017-02-22 16:28:36 +01:00
|
|
|
|
2021-07-26 10:47:21 +02:00
|
|
|
switch (nh->type) {
|
2022-01-21 16:47:18 +01:00
|
|
|
#if PIM_IPV == 4
|
2021-07-26 10:47:21 +02:00
|
|
|
case NEXTHOP_TYPE_IPV4:
|
|
|
|
if (nh->ifindex == IFINDEX_INTERNAL)
|
|
|
|
continue;
|
2019-05-02 09:48:27 +02:00
|
|
|
|
2021-07-26 10:47:21 +02:00
|
|
|
/* fallthru */
|
|
|
|
case NEXTHOP_TYPE_IPV4_IFINDEX:
|
|
|
|
nhaddr = nh->gate.ipv4;
|
|
|
|
break;
|
2022-01-14 17:47:14 +01:00
|
|
|
#else
|
|
|
|
case NEXTHOP_TYPE_IPV6:
|
|
|
|
if (nh->ifindex == IFINDEX_INTERNAL)
|
|
|
|
continue;
|
2019-05-02 09:48:27 +02:00
|
|
|
|
2022-01-14 17:47:14 +01:00
|
|
|
/* fallthru */
|
|
|
|
case NEXTHOP_TYPE_IPV6_IFINDEX:
|
|
|
|
nhaddr = nh->gate.ipv6;
|
|
|
|
break;
|
|
|
|
#endif
|
2021-07-26 10:47:21 +02:00
|
|
|
case NEXTHOP_TYPE_IFINDEX:
|
|
|
|
nhaddr = bsr_addr;
|
|
|
|
break;
|
2019-05-02 09:48:27 +02:00
|
|
|
|
2021-07-26 10:47:21 +02:00
|
|
|
default:
|
2019-05-02 09:48:27 +02:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
2021-07-26 10:47:21 +02:00
|
|
|
ifp = if_lookup_by_index(nh->ifindex, pim->vrf->vrf_id);
|
|
|
|
if (!ifp || !ifp->info)
|
2019-05-02 09:48:27 +02:00
|
|
|
continue;
|
|
|
|
|
2021-07-26 10:47:21 +02:00
|
|
|
if (if_is_loopback(ifp) && if_is_loopback(src_ifp))
|
2020-03-04 14:05:22 +01:00
|
|
|
return true;
|
2019-05-02 09:48:27 +02:00
|
|
|
|
2021-07-26 10:47:21 +02:00
|
|
|
/* MRIB (IGP) may be pointing at a router where PIM is down */
|
|
|
|
nbr = pim_neighbor_find(ifp, nhaddr);
|
|
|
|
if (!nbr)
|
2019-05-02 09:48:27 +02:00
|
|
|
continue;
|
|
|
|
|
2021-07-26 10:47:21 +02:00
|
|
|
return nh->ifindex == src_ifp->ifindex
|
|
|
|
&& nhaddr.s_addr == src_ip.s_addr;
|
2019-05-02 09:48:27 +02:00
|
|
|
}
|
2020-03-04 14:05:22 +01:00
|
|
|
return false;
|
2019-05-02 09:48:27 +02:00
|
|
|
}
|
2022-03-01 10:57:42 +01:00
|
|
|
#endif /* PIM_IPV == 4 */
|
2019-05-02 09:48:27 +02:00
|
|
|
|
2019-02-22 15:37:06 +01:00
|
|
|
void pim_rp_nexthop_del(struct rp_info *rp_info)
|
|
|
|
{
|
|
|
|
rp_info->rp.source_nexthop.interface = NULL;
|
2022-04-06 16:35:11 +02:00
|
|
|
rp_info->rp.source_nexthop.mrib_nexthop_addr = PIMADDR_ANY;
|
2019-02-22 15:37:06 +01:00
|
|
|
rp_info->rp.source_nexthop.mrib_metric_preference =
|
|
|
|
router->infinite_assert_metric.metric_preference;
|
|
|
|
rp_info->rp.source_nexthop.mrib_route_metric =
|
|
|
|
router->infinite_assert_metric.route_metric;
|
|
|
|
}
|
|
|
|
|
2017-02-22 16:28:36 +01:00
|
|
|
/* Update RP nexthop info based on Nexthop update received from Zebra.*/
|
2017-08-10 22:13:45 +02:00
|
|
|
static void pim_update_rp_nh(struct pim_instance *pim,
|
|
|
|
struct pim_nexthop_cache *pnc)
|
2017-02-22 16:28:36 +01:00
|
|
|
{
|
|
|
|
struct listnode *node = NULL;
|
|
|
|
struct rp_info *rp_info = NULL;
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2017-02-22 16:28:36 +01:00
|
|
|
/*Traverse RP list and update each RP Nexthop info */
|
|
|
|
for (ALL_LIST_ELEMENTS_RO(pnc->rp_list, node, rp_info)) {
|
2022-02-25 14:17:08 +01:00
|
|
|
if (pim_rpf_addr_is_inaddr_any(&rp_info->rp))
|
2017-02-22 16:28:36 +01:00
|
|
|
continue;
|
2017-07-17 14:03:14 +02:00
|
|
|
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
// Compute PIM RPF using cached nexthop
|
2019-04-02 15:40:41 +02:00
|
|
|
if (!pim_ecmp_nexthop_lookup(pim, &rp_info->rp.source_nexthop,
|
|
|
|
&rp_info->rp.rpf_addr,
|
|
|
|
&rp_info->group, 1))
|
2019-02-22 15:37:06 +01:00
|
|
|
pim_rp_nexthop_del(rp_info);
|
2017-02-22 16:28:36 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Update Upstream nexthop info based on Nexthop update received from Zebra.*/
|
2019-02-19 16:46:52 +01:00
|
|
|
static int pim_update_upstream_nh_helper(struct hash_bucket *bucket, void *arg)
|
2017-02-22 16:28:36 +01:00
|
|
|
{
|
2017-07-13 00:17:31 +02:00
|
|
|
struct pim_instance *pim = (struct pim_instance *)arg;
|
2019-02-19 16:46:52 +01:00
|
|
|
struct pim_upstream *up = (struct pim_upstream *)bucket->data;
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2017-07-13 00:17:31 +02:00
|
|
|
enum pim_rpf_result rpf_result;
|
|
|
|
struct pim_rpf old;
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2017-07-13 00:17:31 +02:00
|
|
|
old.source_nexthop.interface = up->rpf.source_nexthop.interface;
|
2019-11-15 20:37:31 +01:00
|
|
|
rpf_result = pim_rpf_update(pim, up, &old, __func__);
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2019-11-15 20:49:59 +01:00
|
|
|
/* update kernel multicast forwarding cache (MFC); if the
|
|
|
|
* RPF nbr is now unreachable the MFC has already been updated
|
|
|
|
* by pim_rpf_clear
|
|
|
|
*/
|
|
|
|
if (rpf_result != PIM_RPF_FAILURE)
|
|
|
|
pim_upstream_mroute_iif_update(up->channel_oil, __func__);
|
2017-07-13 00:17:31 +02:00
|
|
|
|
2019-11-15 20:49:59 +01:00
|
|
|
if (rpf_result == PIM_RPF_CHANGED ||
|
|
|
|
(rpf_result == PIM_RPF_FAILURE && old.source_nexthop.interface))
|
2018-08-01 00:27:54 +02:00
|
|
|
pim_zebra_upstream_rpf_changed(pim, up, &old);
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2017-07-13 00:17:31 +02:00
|
|
|
|
|
|
|
if (PIM_DEBUG_PIM_NHT) {
|
2020-03-05 19:17:54 +01:00
|
|
|
zlog_debug(
|
|
|
|
"%s: NHT upstream %s(%s) old ifp %s new ifp %s",
|
|
|
|
__func__, up->sg_str, pim->vrf->name,
|
|
|
|
old.source_nexthop.interface ? old.source_nexthop
|
|
|
|
.interface->name
|
|
|
|
: "Unknown",
|
|
|
|
up->rpf.source_nexthop.interface ? up->rpf.source_nexthop
|
|
|
|
.interface->name
|
|
|
|
: "Unknown");
|
2017-07-13 00:17:31 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return HASHWALK_CONTINUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int pim_update_upstream_nh(struct pim_instance *pim,
|
|
|
|
struct pim_nexthop_cache *pnc)
|
|
|
|
{
|
|
|
|
hash_walk(pnc->upstream_hash, pim_update_upstream_nh_helper, pim);
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2018-07-31 23:40:37 +02:00
|
|
|
pim_zebra_update_all_interfaces(pim);
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2017-02-22 16:28:36 +01:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
uint32_t pim_compute_ecmp_hash(struct prefix *src, struct prefix *grp)
|
|
|
|
{
|
|
|
|
uint32_t hash_val;
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2022-03-01 10:57:58 +01:00
|
|
|
if (!src)
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
return 0;
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2022-03-01 10:57:58 +01:00
|
|
|
hash_val = prefix_hash_key(src);
|
|
|
|
if (grp)
|
|
|
|
hash_val ^= prefix_hash_key(grp);
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
return hash_val;
|
|
|
|
}
|
|
|
|
|
2019-04-02 15:40:41 +02:00
|
|
|
static int pim_ecmp_nexthop_search(struct pim_instance *pim,
|
|
|
|
struct pim_nexthop_cache *pnc,
|
2022-04-27 10:31:06 +02:00
|
|
|
struct pim_nexthop *nexthop, pim_addr *src,
|
|
|
|
struct prefix *grp, int neighbor_needed)
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
{
|
2022-06-22 14:12:04 +02:00
|
|
|
struct pim_neighbor *nbrs[router->multipath], *nbr = NULL;
|
|
|
|
struct interface *ifps[router->multipath];
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
struct nexthop *nh_node = NULL;
|
|
|
|
ifindex_t first_ifindex;
|
|
|
|
struct interface *ifp = NULL;
|
|
|
|
uint32_t hash_val = 0, mod_val = 0;
|
|
|
|
uint8_t nh_iter = 0, found = 0;
|
2018-07-06 15:03:23 +02:00
|
|
|
uint32_t i, num_nbrs = 0;
|
2022-04-06 16:35:11 +02:00
|
|
|
pim_addr nh_addr = nexthop->mrib_nexthop_addr;
|
2022-02-16 13:51:42 +01:00
|
|
|
pim_addr grp_addr = pim_addr_from_prefix(grp);
|
2017-07-17 14:03:14 +02:00
|
|
|
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
if (!pnc || !pnc->nexthop_num || !nexthop)
|
2017-05-19 04:53:50 +02:00
|
|
|
return 0;
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2018-07-24 18:46:38 +02:00
|
|
|
memset(&nbrs, 0, sizeof(nbrs));
|
|
|
|
memset(&ifps, 0, sizeof(ifps));
|
|
|
|
|
2022-02-16 13:51:42 +01:00
|
|
|
|
2017-04-27 20:01:32 +02:00
|
|
|
// Current Nexthop is VALID, check to stay on the current path.
|
2022-02-16 13:51:42 +01:00
|
|
|
if (nexthop->interface && nexthop->interface->info &&
|
|
|
|
(!pim_addr_is_any(nh_addr))) {
|
2017-04-27 20:01:32 +02:00
|
|
|
/* User configured knob to explicitly switch
|
|
|
|
to new path is disabled or current path
|
|
|
|
metric is less than nexthop update.
|
|
|
|
*/
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2018-06-07 16:23:32 +02:00
|
|
|
if (pim->ecmp_rebalance_enable == 0) {
|
2017-04-27 20:01:32 +02:00
|
|
|
uint8_t curr_route_valid = 0;
|
|
|
|
// Check if current nexthop is present in new updated
|
|
|
|
// Nexthop list.
|
|
|
|
// If the current nexthop is not valid, candidate to
|
|
|
|
// choose new Nexthop.
|
|
|
|
for (nh_node = pnc->nexthop; nh_node;
|
2017-07-11 19:39:08 +02:00
|
|
|
nh_node = nh_node->next) {
|
2017-04-27 20:01:32 +02:00
|
|
|
curr_route_valid = (nexthop->interface->ifindex
|
|
|
|
== nh_node->ifindex);
|
2017-07-11 19:39:08 +02:00
|
|
|
if (curr_route_valid)
|
|
|
|
break;
|
|
|
|
}
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2022-03-01 10:57:58 +01:00
|
|
|
if (curr_route_valid &&
|
|
|
|
!pim_if_connected_to_source(nexthop->interface,
|
2022-04-27 10:31:06 +02:00
|
|
|
*src)) {
|
2022-04-06 16:35:11 +02:00
|
|
|
nbr = pim_neighbor_find(
|
2017-04-27 20:01:32 +02:00
|
|
|
nexthop->interface,
|
2022-04-06 16:35:11 +02:00
|
|
|
nexthop->mrib_nexthop_addr);
|
2017-04-27 20:01:32 +02:00
|
|
|
if (!nbr
|
|
|
|
&& !if_is_loopback(nexthop->interface)) {
|
2017-07-06 15:57:35 +02:00
|
|
|
if (PIM_DEBUG_PIM_NHT)
|
2017-04-27 20:01:32 +02:00
|
|
|
zlog_debug(
|
|
|
|
"%s: current nexthop does not have nbr ",
|
2020-03-05 19:17:54 +01:00
|
|
|
__func__);
|
2017-04-27 20:01:32 +02:00
|
|
|
} else {
|
2020-02-06 18:30:58 +01:00
|
|
|
/* update metric even if the upstream
|
|
|
|
* neighbor stays unchanged
|
|
|
|
*/
|
|
|
|
nexthop->mrib_metric_preference =
|
|
|
|
pnc->distance;
|
|
|
|
nexthop->mrib_route_metric =
|
|
|
|
pnc->metric;
|
2022-02-16 13:51:42 +01:00
|
|
|
if (PIM_DEBUG_PIM_NHT)
|
2017-04-27 20:01:32 +02:00
|
|
|
zlog_debug(
|
2022-02-16 13:51:42 +01:00
|
|
|
"%s: (%pPA,%pPA)(%s) current nexthop %s is valid, skipping new path selection",
|
2022-04-27 10:31:06 +02:00
|
|
|
__func__, src,
|
2022-02-16 13:51:42 +01:00
|
|
|
&grp_addr,
|
|
|
|
pim->vrf->name,
|
2017-04-27 20:01:32 +02:00
|
|
|
nexthop->interface->name);
|
2017-08-10 22:13:45 +02:00
|
|
|
return 1;
|
2017-04-27 20:01:32 +02:00
|
|
|
}
|
2017-07-17 14:03:14 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2018-07-06 15:03:23 +02:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Look up all interfaces and neighbors,
|
|
|
|
* store for later usage
|
|
|
|
*/
|
|
|
|
for (nh_node = pnc->nexthop, i = 0; nh_node;
|
|
|
|
nh_node = nh_node->next, i++) {
|
2021-05-12 20:31:45 +02:00
|
|
|
ifps[i] =
|
|
|
|
if_lookup_by_index(nh_node->ifindex, pim->vrf->vrf_id);
|
2018-07-06 15:03:23 +02:00
|
|
|
if (ifps[i]) {
|
2022-01-21 16:47:18 +01:00
|
|
|
#if PIM_IPV == 4
|
2022-01-14 17:47:14 +01:00
|
|
|
pim_addr nhaddr = nh_node->gate.ipv4;
|
|
|
|
#else
|
|
|
|
pim_addr nhaddr = nh_node->gate.ipv6;
|
|
|
|
#endif
|
|
|
|
nbrs[i] = pim_neighbor_find(ifps[i], nhaddr);
|
2022-01-30 08:13:39 +01:00
|
|
|
if (nbrs[i] ||
|
2022-04-27 10:31:06 +02:00
|
|
|
pim_if_connected_to_source(ifps[i], *src))
|
2018-07-06 15:03:23 +02:00
|
|
|
num_nbrs++;
|
|
|
|
}
|
|
|
|
}
|
2018-06-07 16:23:32 +02:00
|
|
|
if (pim->ecmp_enable) {
|
2022-04-27 10:31:06 +02:00
|
|
|
struct prefix src_pfx;
|
2018-07-06 15:03:23 +02:00
|
|
|
uint32_t consider = pnc->nexthop_num;
|
|
|
|
|
|
|
|
if (neighbor_needed && num_nbrs < consider)
|
|
|
|
consider = num_nbrs;
|
|
|
|
|
|
|
|
if (consider == 0)
|
|
|
|
return 0;
|
|
|
|
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
// PIM ECMP flag is enable then choose ECMP path.
|
2022-04-27 10:31:06 +02:00
|
|
|
pim_addr_to_prefix(&src_pfx, *src);
|
|
|
|
hash_val = pim_compute_ecmp_hash(&src_pfx, grp);
|
2018-07-06 15:03:23 +02:00
|
|
|
mod_val = hash_val % consider;
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
}
|
2017-07-17 14:03:14 +02:00
|
|
|
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
for (nh_node = pnc->nexthop; nh_node && (found == 0);
|
|
|
|
nh_node = nh_node->next) {
|
|
|
|
first_ifindex = nh_node->ifindex;
|
2018-07-06 15:03:23 +02:00
|
|
|
ifp = ifps[nh_iter];
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
if (!ifp) {
|
2022-02-16 13:51:42 +01:00
|
|
|
if (PIM_DEBUG_PIM_NHT)
|
2017-04-27 20:01:32 +02:00
|
|
|
zlog_debug(
|
2022-02-16 13:51:42 +01:00
|
|
|
"%s %s: could not find interface for ifindex %d (address %pPA(%s))",
|
2022-04-27 10:31:06 +02:00
|
|
|
__FILE__, __func__, first_ifindex, src,
|
|
|
|
pim->vrf->name);
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
if (nh_iter == mod_val)
|
|
|
|
mod_val++; // Select nexthpath
|
|
|
|
nh_iter++;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
if (!ifp->info) {
|
2022-02-16 13:51:42 +01:00
|
|
|
if (PIM_DEBUG_PIM_NHT)
|
2017-04-27 20:01:32 +02:00
|
|
|
zlog_debug(
|
2022-02-16 13:51:42 +01:00
|
|
|
"%s: multicast not enabled on input interface %s(%s) (ifindex=%d, RPF for source %pPA)",
|
2020-03-05 19:17:54 +01:00
|
|
|
__func__, ifp->name, pim->vrf->name,
|
2022-04-27 10:31:06 +02:00
|
|
|
first_ifindex, src);
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
if (nh_iter == mod_val)
|
|
|
|
mod_val++; // Select nexthpath
|
|
|
|
nh_iter++;
|
|
|
|
continue;
|
|
|
|
}
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2022-04-27 10:31:06 +02:00
|
|
|
if (neighbor_needed && !pim_if_connected_to_source(ifp, *src)) {
|
2018-07-06 15:03:23 +02:00
|
|
|
nbr = nbrs[nh_iter];
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
if (!nbr && !if_is_loopback(ifp)) {
|
2017-07-06 15:57:35 +02:00
|
|
|
if (PIM_DEBUG_PIM_NHT)
|
2017-04-27 20:01:32 +02:00
|
|
|
zlog_debug(
|
2017-07-06 15:57:35 +02:00
|
|
|
"%s: pim nbr not found on input interface %s(%s)",
|
2020-03-05 19:17:54 +01:00
|
|
|
__func__, ifp->name,
|
2017-07-06 15:57:35 +02:00
|
|
|
pim->vrf->name);
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
if (nh_iter == mod_val)
|
|
|
|
mod_val++; // Select nexthpath
|
|
|
|
nh_iter++;
|
|
|
|
continue;
|
2017-07-17 14:03:14 +02:00
|
|
|
}
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
}
|
2017-07-17 14:03:14 +02:00
|
|
|
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
if (nh_iter == mod_val) {
|
|
|
|
nexthop->interface = ifp;
|
2022-02-16 13:51:42 +01:00
|
|
|
#if PIM_IPV == 4
|
2022-04-06 16:35:11 +02:00
|
|
|
nexthop->mrib_nexthop_addr = nh_node->gate.ipv4;
|
2022-02-16 13:51:42 +01:00
|
|
|
#else
|
2022-04-06 16:35:11 +02:00
|
|
|
nexthop->mrib_nexthop_addr = nh_node->gate.ipv6;
|
2022-02-16 13:51:42 +01:00
|
|
|
#endif
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
nexthop->mrib_metric_preference = pnc->distance;
|
|
|
|
nexthop->mrib_route_metric = pnc->metric;
|
2022-04-27 10:31:06 +02:00
|
|
|
nexthop->last_lookup = *src;
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
nexthop->last_lookup_time = pim_time_monotonic_usec();
|
|
|
|
nexthop->nbr = nbr;
|
|
|
|
found = 1;
|
2022-02-16 13:51:42 +01:00
|
|
|
if (PIM_DEBUG_PIM_NHT)
|
2017-04-27 20:01:32 +02:00
|
|
|
zlog_debug(
|
2022-02-16 13:51:42 +01:00
|
|
|
"%s: (%pPA,%pPA)(%s) selected nhop interface %s addr %pPAs mod_val %u iter %d ecmp %d",
|
2022-04-27 10:31:06 +02:00
|
|
|
__func__, src, &grp_addr,
|
2022-02-16 13:51:42 +01:00
|
|
|
pim->vrf->name, ifp->name, &nh_addr,
|
|
|
|
mod_val, nh_iter, pim->ecmp_enable);
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
}
|
|
|
|
nh_iter++;
|
|
|
|
}
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2017-04-25 07:32:23 +02:00
|
|
|
if (found)
|
2017-05-19 04:53:50 +02:00
|
|
|
return 1;
|
2017-04-25 07:32:23 +02:00
|
|
|
else
|
2017-05-19 04:53:50 +02:00
|
|
|
return 0;
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/* This API is used to parse Registered address nexthop update coming from Zebra
|
|
|
|
*/
|
2019-05-03 21:42:59 +02:00
|
|
|
int pim_parse_nexthop_update(ZAPI_CALLBACK_ARGS)
|
2017-02-22 16:28:36 +01:00
|
|
|
{
|
|
|
|
struct nexthop *nexthop;
|
|
|
|
struct nexthop *nhlist_head = NULL;
|
|
|
|
struct nexthop *nhlist_tail = NULL;
|
|
|
|
int i;
|
|
|
|
struct pim_rpf rpf;
|
|
|
|
struct pim_nexthop_cache *pnc = NULL;
|
|
|
|
struct interface *ifp = NULL;
|
2017-05-19 21:45:51 +02:00
|
|
|
struct vrf *vrf = vrf_lookup_by_id(vrf_id);
|
2017-10-25 19:30:45 +02:00
|
|
|
struct pim_instance *pim;
|
2018-02-05 09:44:29 +01:00
|
|
|
struct zapi_route nhr;
|
2022-03-12 16:47:16 +01:00
|
|
|
struct prefix match;
|
2017-10-25 19:30:45 +02:00
|
|
|
|
|
|
|
if (!vrf)
|
|
|
|
return 0;
|
|
|
|
pim = vrf->info;
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2022-03-12 16:47:16 +01:00
|
|
|
if (!zapi_nexthop_update_decode(zclient->ibuf, &match, &nhr)) {
|
2020-10-01 00:37:15 +02:00
|
|
|
zlog_err("%s: Decode of nexthop update from zebra failed",
|
|
|
|
__func__);
|
2018-02-05 14:34:47 +01:00
|
|
|
return 0;
|
|
|
|
}
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2019-05-03 21:42:59 +02:00
|
|
|
if (cmd == ZEBRA_NEXTHOP_UPDATE) {
|
2022-04-27 10:31:06 +02:00
|
|
|
rpf.rpf_addr = pim_addr_from_prefix(&match);
|
2017-05-19 22:00:00 +02:00
|
|
|
pnc = pim_nexthop_cache_find(pim, &rpf);
|
2017-02-22 16:28:36 +01:00
|
|
|
if (!pnc) {
|
2020-10-18 13:33:54 +02:00
|
|
|
if (PIM_DEBUG_PIM_NHT)
|
2017-04-27 20:01:32 +02:00
|
|
|
zlog_debug(
|
2022-04-27 10:31:06 +02:00
|
|
|
"%s: Skipping NHT update, addr %pPA is not in local cached DB.",
|
2020-10-18 13:33:54 +02:00
|
|
|
__func__, &rpf.rpf_addr);
|
2017-03-31 22:38:29 +02:00
|
|
|
return 0;
|
2017-02-22 16:28:36 +01:00
|
|
|
}
|
2017-03-31 22:38:29 +02:00
|
|
|
} else {
|
|
|
|
/*
|
|
|
|
* We do not currently handle ZEBRA_IMPORT_CHECK_UPDATE
|
|
|
|
*/
|
|
|
|
return 0;
|
|
|
|
}
|
2017-07-17 14:03:14 +02:00
|
|
|
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
pnc->last_update = pim_time_monotonic_usec();
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2018-02-05 09:44:29 +01:00
|
|
|
if (nhr.nexthop_num) {
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
pnc->nexthop_num = 0; // Only increment for pim enabled rpf.
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2018-02-05 09:44:29 +01:00
|
|
|
for (i = 0; i < nhr.nexthop_num; i++) {
|
|
|
|
nexthop = nexthop_from_zapi_nexthop(&nhr.nexthops[i]);
|
2017-02-22 16:28:36 +01:00
|
|
|
switch (nexthop->type) {
|
2018-06-04 15:52:14 +02:00
|
|
|
case NEXTHOP_TYPE_IFINDEX:
|
|
|
|
/*
|
|
|
|
* Connected route (i.e. no nexthop), use
|
|
|
|
* RPF address from nexthop cache (i.e.
|
|
|
|
* destination) as PIM nexthop.
|
|
|
|
*/
|
2022-02-16 13:51:42 +01:00
|
|
|
#if PIM_IPV == 4
|
2018-06-08 18:26:39 +02:00
|
|
|
nexthop->type = NEXTHOP_TYPE_IPV4_IFINDEX;
|
2022-04-27 10:31:06 +02:00
|
|
|
nexthop->gate.ipv4 = pnc->rpf.rpf_addr;
|
2022-02-16 13:51:42 +01:00
|
|
|
#else
|
|
|
|
nexthop->type = NEXTHOP_TYPE_IPV6_IFINDEX;
|
2022-04-27 10:31:06 +02:00
|
|
|
nexthop->gate.ipv6 = pnc->rpf.rpf_addr;
|
2022-02-16 13:51:42 +01:00
|
|
|
#endif
|
2018-06-04 15:52:14 +02:00
|
|
|
break;
|
2022-03-10 15:45:31 +01:00
|
|
|
#if PIM_IPV == 4
|
|
|
|
/* RFC5549 IPv4-over-IPv6 nexthop handling:
|
|
|
|
* if we get an IPv6 nexthop in IPv4 PIM, hunt down a
|
|
|
|
* PIM neighbor and use that instead.
|
|
|
|
*/
|
|
|
|
case NEXTHOP_TYPE_IPV6_IFINDEX: {
|
|
|
|
struct interface *ifp1 = NULL;
|
|
|
|
struct pim_neighbor *nbr = NULL;
|
|
|
|
|
2017-06-15 21:20:59 +02:00
|
|
|
ifp1 = if_lookup_by_index(nexthop->ifindex,
|
2021-05-12 20:31:45 +02:00
|
|
|
pim->vrf->vrf_id);
|
2020-04-17 02:26:00 +02:00
|
|
|
|
|
|
|
if (!ifp1)
|
|
|
|
nbr = NULL;
|
|
|
|
else
|
2022-03-10 15:45:31 +01:00
|
|
|
/* FIXME: should really use nbr's
|
|
|
|
* secondary address list here
|
|
|
|
*/
|
2020-04-17 02:26:00 +02:00
|
|
|
nbr = pim_neighbor_find_if(ifp1);
|
2022-03-10 15:45:31 +01:00
|
|
|
|
2017-02-22 16:28:36 +01:00
|
|
|
/* Overwrite with Nbr address as NH addr */
|
2017-07-06 15:57:35 +02:00
|
|
|
if (nbr)
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
nexthop->gate.ipv4 = nbr->source_addr;
|
2022-03-10 15:45:31 +01:00
|
|
|
else
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
// Mark nexthop address to 0 until PIM
|
|
|
|
// Nbr is resolved.
|
2022-02-16 13:51:42 +01:00
|
|
|
nexthop->gate.ipv4 = PIMADDR_ANY;
|
2022-03-10 15:45:31 +01:00
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
2022-02-16 13:51:42 +01:00
|
|
|
#else
|
2022-03-10 15:45:31 +01:00
|
|
|
case NEXTHOP_TYPE_IPV6_IFINDEX:
|
2022-02-16 13:51:42 +01:00
|
|
|
#endif
|
2022-03-10 15:45:31 +01:00
|
|
|
case NEXTHOP_TYPE_IPV6:
|
|
|
|
case NEXTHOP_TYPE_IPV4:
|
|
|
|
case NEXTHOP_TYPE_IPV4_IFINDEX:
|
|
|
|
case NEXTHOP_TYPE_BLACKHOLE:
|
|
|
|
/* nothing to do for the other nexthop types */
|
2017-02-22 16:28:36 +01:00
|
|
|
break;
|
|
|
|
}
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2021-05-12 20:31:45 +02:00
|
|
|
ifp = if_lookup_by_index(nexthop->ifindex,
|
|
|
|
pim->vrf->vrf_id);
|
2017-02-22 16:28:36 +01:00
|
|
|
if (!ifp) {
|
2017-07-06 15:57:35 +02:00
|
|
|
if (PIM_DEBUG_PIM_NHT) {
|
2017-02-22 16:28:36 +01:00
|
|
|
char buf[NEXTHOP_STRLEN];
|
2017-04-27 20:01:32 +02:00
|
|
|
zlog_debug(
|
2017-07-06 15:57:35 +02:00
|
|
|
"%s: could not find interface for ifindex %d(%s) (addr %s)",
|
2020-03-05 19:17:54 +01:00
|
|
|
__func__, nexthop->ifindex,
|
2017-07-06 15:57:35 +02:00
|
|
|
pim->vrf->name,
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
nexthop2str(nexthop, buf,
|
|
|
|
sizeof(buf)));
|
2017-02-22 16:28:36 +01:00
|
|
|
}
|
|
|
|
nexthop_free(nexthop);
|
|
|
|
continue;
|
|
|
|
}
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2022-03-31 13:09:29 +02:00
|
|
|
if (PIM_DEBUG_PIM_NHT) {
|
|
|
|
#if PIM_IPV == 4
|
|
|
|
pim_addr nhaddr = nexthop->gate.ipv4;
|
|
|
|
#else
|
|
|
|
pim_addr nhaddr = nexthop->gate.ipv6;
|
|
|
|
#endif
|
2017-07-11 19:39:08 +02:00
|
|
|
zlog_debug(
|
2022-03-31 13:09:29 +02:00
|
|
|
"%s: NHT addr %pFX(%s) %d-nhop via %pPA(%s) type %d distance:%u metric:%u ",
|
2022-03-12 16:47:16 +01:00
|
|
|
__func__, &match, pim->vrf->name, i + 1,
|
2022-03-31 13:09:29 +02:00
|
|
|
&nhaddr, ifp->name, nexthop->type,
|
|
|
|
nhr.distance, nhr.metric);
|
|
|
|
}
|
2017-07-11 19:39:08 +02:00
|
|
|
|
2017-02-22 16:28:36 +01:00
|
|
|
if (!ifp->info) {
|
2019-07-24 07:00:08 +02:00
|
|
|
/*
|
|
|
|
* Though Multicast is not enabled on this
|
|
|
|
* Interface store it in database otheriwse we
|
|
|
|
* may miss this update and this will not cause
|
|
|
|
* any issue, because while choosing the path we
|
|
|
|
* are ommitting the Interfaces which are not
|
|
|
|
* multicast enabled
|
|
|
|
*/
|
2017-07-06 15:57:35 +02:00
|
|
|
if (PIM_DEBUG_PIM_NHT) {
|
2017-02-22 16:28:36 +01:00
|
|
|
char buf[NEXTHOP_STRLEN];
|
2018-02-05 09:44:29 +01:00
|
|
|
|
2017-04-27 20:01:32 +02:00
|
|
|
zlog_debug(
|
2017-07-06 15:57:35 +02:00
|
|
|
"%s: multicast not enabled on input interface %s(%s) (ifindex=%d, addr %s)",
|
2020-03-05 19:17:54 +01:00
|
|
|
__func__, ifp->name,
|
2017-07-06 15:57:35 +02:00
|
|
|
pim->vrf->name,
|
2017-02-22 16:28:36 +01:00
|
|
|
nexthop->ifindex,
|
|
|
|
nexthop2str(nexthop, buf,
|
|
|
|
sizeof(buf)));
|
|
|
|
}
|
|
|
|
}
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2017-02-22 16:28:36 +01:00
|
|
|
if (nhlist_tail) {
|
|
|
|
nhlist_tail->next = nexthop;
|
|
|
|
nhlist_tail = nexthop;
|
|
|
|
} else {
|
|
|
|
nhlist_tail = nexthop;
|
|
|
|
nhlist_head = nexthop;
|
|
|
|
}
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
// Only keep track of nexthops which are PIM enabled.
|
|
|
|
pnc->nexthop_num++;
|
2017-02-22 16:28:36 +01:00
|
|
|
}
|
|
|
|
/* Reset existing pnc->nexthop before assigning new list */
|
|
|
|
nexthops_free(pnc->nexthop);
|
|
|
|
pnc->nexthop = nhlist_head;
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
if (pnc->nexthop_num) {
|
|
|
|
pnc->flags |= PIM_NEXTHOP_VALID;
|
2018-02-05 09:44:29 +01:00
|
|
|
pnc->distance = nhr.distance;
|
|
|
|
pnc->metric = nhr.metric;
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
}
|
2017-02-22 16:28:36 +01:00
|
|
|
} else {
|
|
|
|
pnc->flags &= ~PIM_NEXTHOP_VALID;
|
2018-02-05 09:44:29 +01:00
|
|
|
pnc->nexthop_num = nhr.nexthop_num;
|
2017-02-22 16:28:36 +01:00
|
|
|
nexthops_free(pnc->nexthop);
|
|
|
|
pnc->nexthop = NULL;
|
|
|
|
}
|
2019-04-03 17:21:37 +02:00
|
|
|
SET_FLAG(pnc->flags, PIM_NEXTHOP_ANSWER_RECEIVED);
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2020-10-18 13:33:54 +02:00
|
|
|
if (PIM_DEBUG_PIM_NHT)
|
2017-04-27 20:01:32 +02:00
|
|
|
zlog_debug(
|
2020-10-18 13:33:54 +02:00
|
|
|
"%s: NHT Update for %pFX(%s) num_nh %d num_pim_nh %d vrf:%u up %ld rp %d",
|
2022-03-12 16:47:16 +01:00
|
|
|
__func__, &match, pim->vrf->name, nhr.nexthop_num,
|
2020-03-05 19:17:54 +01:00
|
|
|
pnc->nexthop_num, vrf_id, pnc->upstream_hash->count,
|
|
|
|
listcount(pnc->rp_list));
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2018-03-18 02:34:55 +01:00
|
|
|
pim_rpf_set_refresh_time(pim);
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2017-02-22 16:28:36 +01:00
|
|
|
if (listcount(pnc->rp_list))
|
2017-05-19 22:00:00 +02:00
|
|
|
pim_update_rp_nh(pim, pnc);
|
2017-07-13 00:17:31 +02:00
|
|
|
if (pnc->upstream_hash->count)
|
2017-05-19 21:45:51 +02:00
|
|
|
pim_update_upstream_nh(pim, pnc);
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2017-03-31 22:38:29 +02:00
|
|
|
return 0;
|
2017-02-22 16:28:36 +01:00
|
|
|
}
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
|
2017-05-19 22:00:00 +02:00
|
|
|
int pim_ecmp_nexthop_lookup(struct pim_instance *pim,
|
2022-04-27 10:31:06 +02:00
|
|
|
struct pim_nexthop *nexthop, pim_addr *src,
|
2018-07-07 15:52:28 +02:00
|
|
|
struct prefix *grp, int neighbor_needed)
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
{
|
2019-04-02 15:40:41 +02:00
|
|
|
struct pim_nexthop_cache *pnc;
|
2022-06-22 14:12:04 +02:00
|
|
|
struct pim_zlookup_nexthop nexthop_tab[router->multipath];
|
|
|
|
struct pim_neighbor *nbrs[router->multipath], *nbr = NULL;
|
2019-04-02 15:40:41 +02:00
|
|
|
struct pim_rpf rpf;
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
int num_ifindex;
|
2022-06-22 14:12:04 +02:00
|
|
|
struct interface *ifps[router->multipath], *ifp;
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
int first_ifindex;
|
|
|
|
int found = 0;
|
|
|
|
uint8_t i = 0;
|
|
|
|
uint32_t hash_val = 0, mod_val = 0;
|
2018-07-06 15:03:23 +02:00
|
|
|
uint32_t num_nbrs = 0;
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2021-12-02 06:07:02 +01:00
|
|
|
if (PIM_DEBUG_PIM_NHT_DETAIL)
|
2022-02-16 13:51:42 +01:00
|
|
|
zlog_debug("%s: Looking up: %pPA(%s), last lookup time: %lld",
|
2022-04-27 10:31:06 +02:00
|
|
|
__func__, src, pim->vrf->name,
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
nexthop->last_lookup_time);
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2022-02-16 13:51:42 +01:00
|
|
|
rpf.rpf_addr = *src;
|
2019-04-02 15:40:41 +02:00
|
|
|
|
|
|
|
pnc = pim_nexthop_cache_find(pim, &rpf);
|
2019-04-03 17:21:37 +02:00
|
|
|
if (pnc) {
|
|
|
|
if (CHECK_FLAG(pnc->flags, PIM_NEXTHOP_ANSWER_RECEIVED))
|
|
|
|
return pim_ecmp_nexthop_search(pim, pnc, nexthop, src, grp,
|
|
|
|
neighbor_needed);
|
|
|
|
}
|
2019-04-02 15:40:41 +02:00
|
|
|
|
2017-04-27 20:01:32 +02:00
|
|
|
memset(nexthop_tab, 0,
|
2022-06-22 14:12:04 +02:00
|
|
|
sizeof(struct pim_zlookup_nexthop) * router->multipath);
|
|
|
|
num_ifindex =
|
2022-04-27 10:31:06 +02:00
|
|
|
zclient_lookup_nexthop(pim, nexthop_tab, router->multipath, src,
|
|
|
|
PIM_NEXTHOP_LOOKUP_MAX);
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
if (num_ifindex < 1) {
|
2018-07-07 15:52:28 +02:00
|
|
|
if (PIM_DEBUG_PIM_NHT)
|
2017-07-31 23:29:13 +02:00
|
|
|
zlog_warn(
|
2022-02-16 13:51:42 +01:00
|
|
|
"%s: could not find nexthop ifindex for address %pPA(%s)",
|
2022-04-27 10:31:06 +02:00
|
|
|
__func__, src, pim->vrf->name);
|
2017-05-19 04:53:50 +02:00
|
|
|
return 0;
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
}
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2018-07-24 18:46:38 +02:00
|
|
|
memset(&nbrs, 0, sizeof(nbrs));
|
|
|
|
memset(&ifps, 0, sizeof(ifps));
|
|
|
|
|
2018-07-06 15:03:23 +02:00
|
|
|
/*
|
|
|
|
* Look up all interfaces and neighbors,
|
|
|
|
* store for later usage
|
|
|
|
*/
|
|
|
|
for (i = 0; i < num_ifindex; i++) {
|
|
|
|
ifps[i] = if_lookup_by_index(nexthop_tab[i].ifindex,
|
2021-05-12 20:31:45 +02:00
|
|
|
pim->vrf->vrf_id);
|
2018-07-06 15:03:23 +02:00
|
|
|
if (ifps[i]) {
|
2022-04-06 16:35:11 +02:00
|
|
|
nbrs[i] = pim_neighbor_find(
|
|
|
|
ifps[i], nexthop_tab[i].nexthop_addr);
|
2022-02-16 13:51:42 +01:00
|
|
|
if (nbrs[i] ||
|
2022-04-27 10:31:06 +02:00
|
|
|
pim_if_connected_to_source(ifps[i], *src))
|
2018-07-06 15:03:23 +02:00
|
|
|
num_nbrs++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-04-27 20:01:32 +02:00
|
|
|
// If PIM ECMP enable then choose ECMP path.
|
2018-06-07 16:23:32 +02:00
|
|
|
if (pim->ecmp_enable) {
|
2022-04-27 10:31:06 +02:00
|
|
|
struct prefix src_pfx;
|
2018-07-06 15:03:23 +02:00
|
|
|
uint32_t consider = num_ifindex;
|
|
|
|
|
|
|
|
if (neighbor_needed && num_nbrs < consider)
|
|
|
|
consider = num_nbrs;
|
|
|
|
|
|
|
|
if (consider == 0)
|
|
|
|
return 0;
|
|
|
|
|
2022-04-27 10:31:06 +02:00
|
|
|
pim_addr_to_prefix(&src_pfx, *src);
|
|
|
|
hash_val = pim_compute_ecmp_hash(&src_pfx, grp);
|
2018-07-06 15:03:23 +02:00
|
|
|
mod_val = hash_val % consider;
|
2017-07-06 15:57:35 +02:00
|
|
|
if (PIM_DEBUG_PIM_NHT_DETAIL)
|
2020-03-05 19:17:54 +01:00
|
|
|
zlog_debug("%s: hash_val %u mod_val %u", __func__,
|
|
|
|
hash_val, mod_val);
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
}
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2018-07-06 15:03:23 +02:00
|
|
|
i = 0;
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
while (!found && (i < num_ifindex)) {
|
|
|
|
first_ifindex = nexthop_tab[i].ifindex;
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2018-07-06 15:03:23 +02:00
|
|
|
ifp = ifps[i];
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
if (!ifp) {
|
2018-07-07 15:52:28 +02:00
|
|
|
if (PIM_DEBUG_PIM_NHT)
|
2017-04-27 20:01:32 +02:00
|
|
|
zlog_debug(
|
2022-02-16 13:51:42 +01:00
|
|
|
"%s %s: could not find interface for ifindex %d (address %pPA(%s))",
|
2022-04-27 10:31:06 +02:00
|
|
|
__FILE__, __func__, first_ifindex, src,
|
|
|
|
pim->vrf->name);
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
if (i == mod_val)
|
|
|
|
mod_val++;
|
|
|
|
i++;
|
|
|
|
continue;
|
|
|
|
}
|
2017-07-17 14:03:14 +02:00
|
|
|
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
if (!ifp->info) {
|
2018-07-07 15:52:28 +02:00
|
|
|
if (PIM_DEBUG_PIM_NHT)
|
2017-04-27 20:01:32 +02:00
|
|
|
zlog_debug(
|
2022-02-16 13:51:42 +01:00
|
|
|
"%s: multicast not enabled on input interface %s(%s) (ifindex=%d, RPF for source %pPA)",
|
2020-03-05 19:17:54 +01:00
|
|
|
__func__, ifp->name, pim->vrf->name,
|
2022-04-27 10:31:06 +02:00
|
|
|
first_ifindex, src);
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
if (i == mod_val)
|
|
|
|
mod_val++;
|
|
|
|
i++;
|
|
|
|
continue;
|
|
|
|
}
|
2022-04-27 10:31:06 +02:00
|
|
|
if (neighbor_needed && !pim_if_connected_to_source(ifp, *src)) {
|
2018-07-06 15:03:23 +02:00
|
|
|
nbr = nbrs[i];
|
2017-07-06 15:57:35 +02:00
|
|
|
if (PIM_DEBUG_PIM_NHT_DETAIL)
|
|
|
|
zlog_debug("ifp name: %s(%s), pim nbr: %p",
|
|
|
|
ifp->name, pim->vrf->name, nbr);
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
if (!nbr && !if_is_loopback(ifp)) {
|
|
|
|
if (i == mod_val)
|
|
|
|
mod_val++;
|
2018-07-07 15:52:28 +02:00
|
|
|
if (PIM_DEBUG_PIM_NHT)
|
2017-04-27 20:01:32 +02:00
|
|
|
zlog_debug(
|
2022-04-06 16:35:11 +02:00
|
|
|
"%s: NBR (%pPA) not found on input interface %s(%s) (RPF for source %pPA)",
|
2022-03-12 22:09:36 +01:00
|
|
|
__func__,
|
|
|
|
&nexthop_tab[i].nexthop_addr,
|
2022-04-27 10:31:06 +02:00
|
|
|
ifp->name, pim->vrf->name, src);
|
2022-03-12 22:09:36 +01:00
|
|
|
i++;
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
continue;
|
2017-07-17 14:03:14 +02:00
|
|
|
}
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
}
|
2017-07-17 14:03:14 +02:00
|
|
|
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
if (i == mod_val) {
|
2022-04-06 16:35:11 +02:00
|
|
|
if (PIM_DEBUG_PIM_NHT)
|
2017-04-27 20:01:32 +02:00
|
|
|
zlog_debug(
|
2022-04-06 16:35:11 +02:00
|
|
|
"%s: found nhop %pPA for addr %pPA interface %s(%s) metric %d dist %d",
|
|
|
|
__func__, &nexthop_tab[i].nexthop_addr,
|
2022-04-27 10:31:06 +02:00
|
|
|
src, ifp->name, pim->vrf->name,
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
nexthop_tab[i].route_metric,
|
|
|
|
nexthop_tab[i].protocol_distance);
|
2018-06-05 10:36:30 +02:00
|
|
|
/* update nexthop data */
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
nexthop->interface = ifp;
|
|
|
|
nexthop->mrib_nexthop_addr =
|
|
|
|
nexthop_tab[i].nexthop_addr;
|
|
|
|
nexthop->mrib_metric_preference =
|
|
|
|
nexthop_tab[i].protocol_distance;
|
|
|
|
nexthop->mrib_route_metric =
|
|
|
|
nexthop_tab[i].route_metric;
|
2022-04-27 10:31:06 +02:00
|
|
|
nexthop->last_lookup = *src;
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
nexthop->last_lookup_time = pim_time_monotonic_usec();
|
|
|
|
nexthop->nbr = nbr;
|
|
|
|
found = 1;
|
|
|
|
}
|
|
|
|
i++;
|
|
|
|
}
|
2017-05-19 04:53:50 +02:00
|
|
|
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
if (found)
|
2017-05-19 04:53:50 +02:00
|
|
|
return 1;
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
else
|
2017-05-19 04:53:50 +02:00
|
|
|
return 0;
|
pimd: Pim Nexthop Tracking support with ECMP
In this patch, PIM nexthop tracking uses locally populated nexthop cached list
to determine ECMP based nexthop (w/ ECMP knob enabled), otherwise picks
the first nexthop as RPF.
Introduced '[no] ip pim ecmp' command to enable/disable PIM ECMP knob.
By default, PIM ECMP is disabled.
Intorudced '[no] ip pim ecmp rebalance' command to provide existing mcache
entry to switch new path based on hash chosen path.
Introduced, show command to display pim registered addresses and respective nexthops.
Introuduce, show command to find nexthop and out interface for (S,G) or (RP,G).
Re-Register an address with nexthop when Interface UP event received,
to ensure the PIM nexthop cache is updated (being PIM enabled).
During PIM neighbor UP, traverse all RPs and Upstreams nexthop and determine, if
any of nexthop's IPv4 address changes/resolves due to neigbor UP event.
Testing Done: Run various LHR, RP and FHR related cases to resolve RPF using
nexthop cache with ECMP knob disabled, performed interface/PIM neighbor flap events.
Executed pim-smoke with knob disabled.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
(cherry picked from commit cba444817883b8b3b22a7ed9958dc9ed77f76230)
2017-04-05 22:14:12 +02:00
|
|
|
}
|
2017-04-27 20:01:32 +02:00
|
|
|
|
2022-04-27 10:31:06 +02:00
|
|
|
int pim_ecmp_fib_lookup_if_vif_index(struct pim_instance *pim, pim_addr *src,
|
|
|
|
struct prefix *grp)
|
2017-04-27 20:01:32 +02:00
|
|
|
{
|
2018-07-07 14:43:27 +02:00
|
|
|
struct pim_nexthop nhop;
|
2017-04-27 20:01:32 +02:00
|
|
|
int vif_index;
|
2018-07-07 14:43:27 +02:00
|
|
|
ifindex_t ifindex;
|
2019-04-02 20:15:49 +02:00
|
|
|
|
|
|
|
memset(&nhop, 0, sizeof(nhop));
|
pimd: neighbor needed true in pim nexthop lookup
Issue:
Client---LHR---RP
1. Add kernel route for RP on LHR. Client send join
2. (*,G) will be get created in LHR and RP.
3. Kill the FRR on all the nodes
4. Start FRR only on LHR node
5. In LHR, (*, G) will be created with iif as unknown.
Root cause:
In the step 4, When LHR will receive igmp join, it will call
the function pim_ecmp_fib_lookup_if_vif_index which will look
for nexthop to RP with neighbor needed as false. So RPF lookup will
be true as the route is present in the kernel. It will create a
(*, G) channel_oil with incoming interface as the RPF interface
towards RP and install the (*,G) mroute in kernel.
Along with this (*,G) upstream gets craeted, which call the function
pim_rpf_update, which will look for the nexthop to RP with neighbor
needed as true. As the frr is not running in RP, no neighbor is present
on the nexthop interface. Due to which this will fail and will update
the channel_oil incoming interface as MAXVIFS(32).
Fix:
pim_ecmp_fib_lookup_if_vif_index() call the function pim_ecmp_nexthop_lookup
with neighbor_needed as true.
Signed-off-by: Sarita Patra <saritap@vmware.com>
2020-03-03 12:31:22 +01:00
|
|
|
if (!pim_ecmp_nexthop_lookup(pim, &nhop, src, grp, 1)) {
|
2018-07-07 15:52:28 +02:00
|
|
|
if (PIM_DEBUG_PIM_NHT)
|
2017-04-27 20:01:32 +02:00
|
|
|
zlog_debug(
|
2022-02-16 13:51:42 +01:00
|
|
|
"%s: could not find nexthop ifindex for address %pPA(%s)",
|
2022-04-27 10:31:06 +02:00
|
|
|
__func__, src, pim->vrf->name);
|
2017-04-27 20:01:32 +02:00
|
|
|
return -1;
|
|
|
|
}
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2018-07-07 14:43:27 +02:00
|
|
|
ifindex = nhop.interface->ifindex;
|
2018-07-07 15:52:28 +02:00
|
|
|
if (PIM_DEBUG_PIM_NHT)
|
2017-04-27 20:01:32 +02:00
|
|
|
zlog_debug(
|
2022-02-16 13:51:42 +01:00
|
|
|
"%s: found nexthop ifindex=%d (interface %s(%s)) for address %pPA",
|
2021-05-12 20:31:45 +02:00
|
|
|
__func__, ifindex,
|
|
|
|
ifindex2ifname(ifindex, pim->vrf->vrf_id),
|
2022-04-27 10:31:06 +02:00
|
|
|
pim->vrf->name, src);
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2018-07-07 14:43:27 +02:00
|
|
|
vif_index = pim_if_find_vifindex_by_ifindex(pim, ifindex);
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2017-04-27 20:01:32 +02:00
|
|
|
if (vif_index < 0) {
|
2017-07-06 15:57:35 +02:00
|
|
|
if (PIM_DEBUG_PIM_NHT) {
|
2017-04-27 20:01:32 +02:00
|
|
|
zlog_debug(
|
2022-02-16 13:51:42 +01:00
|
|
|
"%s: low vif_index=%d(%s) < 1 nexthop for address %pPA",
|
2022-04-27 10:31:06 +02:00
|
|
|
__func__, vif_index, pim->vrf->name, src);
|
2017-04-27 20:01:32 +02:00
|
|
|
}
|
|
|
|
return -2;
|
|
|
|
}
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2017-04-27 20:01:32 +02:00
|
|
|
return vif_index;
|
|
|
|
}
|