diff options
Diffstat (limited to 'pimd')
| -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 b1b6958fe1..623c14bb03 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 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);  		}  	}  | 
