summaryrefslogtreecommitdiff
path: root/pimd/pim_msdp_packet.c
diff options
context:
space:
mode:
Diffstat (limited to 'pimd/pim_msdp_packet.c')
-rw-r--r--pimd/pim_msdp_packet.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/pimd/pim_msdp_packet.c b/pimd/pim_msdp_packet.c
index a414736ccc..4324a96bef 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);
}
}