summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDonald Sharp <donaldsharp72@gmail.com>2023-10-05 16:27:06 +0200
committerGitHub <noreply@github.com>2023-10-05 16:27:06 +0200
commit580bc71aca393bed7d96a4047f666ac8b46dda21 (patch)
treec21fbac2c23c03b2bcef7b1cd3ac6607e5c0f5fe
parentMerge pull request #14474 from donaldsharp/strsep_fixup (diff)
parentpimd: Indicating the rp in the msdp sa message (diff)
downloadfrr-580bc71aca393bed7d96a4047f666ac8b46dda21.tar.xz
frr-580bc71aca393bed7d96a4047f666ac8b46dda21.zip
Merge pull request #14517 from adrianomarto/pim-msdp-sa-rp
pimd: Indicating the configured PIM Rendezvous Point (RP) in the MSDP SA message
-rw-r--r--pimd/pim_msdp.c10
-rw-r--r--pimd/pim_msdp_packet.c18
2 files changed, 25 insertions, 3 deletions
diff --git a/pimd/pim_msdp.c b/pimd/pim_msdp.c
index b1b6958fe..623c14bb0 100644
--- a/pimd/pim_msdp.c
+++ b/pimd/pim_msdp.c
@@ -374,6 +374,8 @@ void pim_msdp_sa_ref(struct pim_instance *pim, struct pim_msdp_peer *mp,
pim_sgaddr *sg, struct in_addr rp)
{
struct pim_msdp_sa *sa;
+ struct rp_info *rp_info;
+ struct prefix grp;
sa = pim_msdp_sa_add(pim, sg, rp);
if (!sa) {
@@ -406,6 +408,14 @@ void pim_msdp_sa_ref(struct pim_instance *pim, struct pim_msdp_peer *mp,
sa->sg_str);
}
/* send an immediate SA update to peers */
+ pim_addr_to_prefix(&grp, sa->sg.grp);
+ rp_info = pim_rp_find_match_group(pim, &grp);
+ if (rp_info) {
+ sa->rp = rp_info->rp.rpf_addr;
+ } else
+ {
+ sa->rp = pim->msdp.originator_id;
+ }
sa->rp = pim->msdp.originator_id;
pim_msdp_pkt_sa_tx_one(sa);
}
diff --git a/pimd/pim_msdp_packet.c b/pimd/pim_msdp_packet.c
index a414736cc..4324a96be 100644
--- a/pimd/pim_msdp_packet.c
+++ b/pimd/pim_msdp_packet.c
@@ -14,7 +14,9 @@
#include "pimd.h"
#include "pim_instance.h"
+#include "pim_rp.h"
#include "pim_str.h"
+#include "pim_util.h"
#include "pim_errors.h"
#include "pim_msdp.h"
@@ -387,6 +389,9 @@ static void pim_msdp_pkt_sa_gen(struct pim_instance *pim,
{
struct listnode *sanode;
struct pim_msdp_sa *sa;
+ struct rp_info *rp_info;
+ struct prefix group_all;
+ struct in_addr rp;
int sa_count;
int local_cnt = pim->msdp.local_cnt;
@@ -395,8 +400,15 @@ static void pim_msdp_pkt_sa_gen(struct pim_instance *pim,
zlog_debug(" sa gen %d", local_cnt);
}
- local_cnt = pim_msdp_pkt_sa_fill_hdr(pim, local_cnt,
- pim->msdp.originator_id);
+ rp = pim->msdp.originator_id;
+ if (pim_get_all_mcast_group(&group_all)) {
+ rp_info = pim_rp_find_match_group(pim, &group_all);
+ if (rp_info) {
+ rp = rp_info->rp.rpf_addr;
+ }
+ }
+
+ local_cnt = pim_msdp_pkt_sa_fill_hdr(pim, local_cnt, rp);
for (ALL_LIST_ELEMENTS_RO(pim->msdp.sa_list, sanode, sa)) {
if (!(sa->flags & PIM_MSDP_SAF_LOCAL)) {
@@ -418,7 +430,7 @@ static void pim_msdp_pkt_sa_gen(struct pim_instance *pim,
local_cnt);
}
local_cnt = pim_msdp_pkt_sa_fill_hdr(
- pim, local_cnt, pim->msdp.originator_id);
+ pim, local_cnt, rp);
}
}