diff options
author | Donald Sharp <donaldsharp72@gmail.com> | 2023-10-05 16:27:06 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-10-05 16:27:06 +0200 |
commit | 580bc71aca393bed7d96a4047f666ac8b46dda21 (patch) | |
tree | c21fbac2c23c03b2bcef7b1cd3ac6607e5c0f5fe | |
parent | Merge pull request #14474 from donaldsharp/strsep_fixup (diff) | |
parent | pimd: Indicating the rp in the msdp sa message (diff) | |
download | frr-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.c | 10 | ||||
-rw-r--r-- | pimd/pim_msdp_packet.c | 18 |
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); } } |