diff options
| author | Jafar Al-Gharaibeh <jafar@atcorp.com> | 2024-12-12 10:57:06 -0600 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-12-12 10:57:06 -0600 | 
| commit | f7720ab68fcfb24e7fa51f682d248086c45ef85a (patch) | |
| tree | 2e20552df88298e4c14a27ff43f3a13c3ae2b019 /pimd | |
| parent | f170e9bba933ea0f4ba7d7000480a7cae97e304d (diff) | |
| parent | e3af4b8c566f22d36b8dc0590d446039f90dbdd7 (diff) | |
Merge pull request #17622 from opensourcerouting/msdp-originator
pimd: MSDP originador ID configuration
Diffstat (limited to 'pimd')
| -rw-r--r-- | pimd/pim_cmd.c | 19 | ||||
| -rw-r--r-- | pimd/pim_msdp.c | 36 | ||||
| -rw-r--r-- | pimd/pim_msdp.h | 10 | ||||
| -rw-r--r-- | pimd/pim_msdp_packet.c | 14 | ||||
| -rw-r--r-- | pimd/pim_nb.c | 7 | ||||
| -rw-r--r-- | pimd/pim_nb.h | 2 | ||||
| -rw-r--r-- | pimd/pim_nb_config.c | 46 | 
7 files changed, 114 insertions, 20 deletions
diff --git a/pimd/pim_cmd.c b/pimd/pim_cmd.c index 3fabe1706c..205f1f95ea 100644 --- a/pimd/pim_cmd.c +++ b/pimd/pim_cmd.c @@ -7616,6 +7616,24 @@ DEFPY(msdp_peer_sa_limit, msdp_peer_sa_limit_cmd,  	return nb_cli_apply_changes(vty, "%s", xpath);  } +DEFPY(msdp_originator_id, msdp_originator_id_cmd, +      "[no] msdp originator-id ![A.B.C.D$originator_id]", +      NO_STR +      CFG_MSDP_STR +      "Configure MSDP RP originator\n" +      "MSDP RP originator identifier\n") +{ +	char xpath_value[XPATH_MAXLEN]; + +	snprintf(xpath_value, sizeof(xpath_value), "./msdp/originator-id"); +	if (no) +		nb_cli_enqueue_change(vty, xpath_value, NB_OP_DESTROY, NULL); +	else +		nb_cli_enqueue_change(vty, xpath_value, NB_OP_MODIFY, originator_id_str); + +	return nb_cli_apply_changes(vty, NULL); +} +  static void ip_msdp_show_mesh_group(struct vty *vty, struct pim_msdp_mg *mg,  				    struct json_object *json)  { @@ -9012,6 +9030,7 @@ void pim_cmd_init(void)  	install_element(PIM_NODE, &msdp_log_sa_changes_cmd);  	install_element(PIM_NODE, &msdp_shutdown_cmd);  	install_element(PIM_NODE, &msdp_peer_sa_limit_cmd); +	install_element(PIM_NODE, &msdp_originator_id_cmd);  	install_element(PIM_NODE, &pim_bsr_candidate_rp_cmd);  	install_element(PIM_NODE, &pim_bsr_candidate_rp_group_cmd); diff --git a/pimd/pim_msdp.c b/pimd/pim_msdp.c index f5260c68ca..b428520b89 100644 --- a/pimd/pim_msdp.c +++ b/pimd/pim_msdp.c @@ -44,6 +44,26 @@ static void pim_msdp_sa_deref(struct pim_msdp_sa *sa,  static int pim_msdp_mg_mbr_comp(const void *p1, const void *p2);  static void pim_msdp_mg_mbr_free(struct pim_msdp_mg_mbr *mbr); +void pim_msdp_originator_id(struct pim_instance *pim, const struct prefix *group, +			    struct in_addr *originator_id) +{ +	struct rp_info *rp_info; + +	originator_id->s_addr = INADDR_ANY; + +	/* Originator ID was configured, use it. */ +	if (pim->msdp.originator_id.s_addr != INADDR_ANY) { +		*originator_id = pim->msdp.originator_id; +		return; +	} + +	rp_info = pim_rp_find_match_group(pim, group); +	if (rp_info) { +		*originator_id = rp_info->rp.rpf_addr; +		return; +	} +} +  /************************ SA cache management ******************************/  /* RFC-3618:Sec-5.1 - global active source advertisement timer */  static void pim_msdp_sa_adv_timer_cb(struct event *t) @@ -354,7 +374,6 @@ 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;  	/* Check peer SA limit. */ @@ -395,12 +414,7 @@ void pim_msdp_sa_ref(struct pim_instance *pim, struct pim_msdp_peer *mp,  			/* 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; -			} +			pim_msdp_originator_id(pim, &grp, &sa->rp);  			pim_msdp_pkt_sa_tx_one(sa);  		}  		sa->flags &= ~PIM_MSDP_SAF_STALE; @@ -1013,8 +1027,6 @@ struct pim_msdp_peer *pim_msdp_peer_add(struct pim_instance *pim,  	mp->peer = *peer;  	pim_inet4_dump("<peer?>", mp->peer, mp->key_str, sizeof(mp->key_str));  	mp->local = *local; -	/* XXX: originator_id setting needs to move to the mesh group */ -	pim->msdp.originator_id = *local;  	if (mesh_group_name)  		mp->mesh_group_name =  			XSTRDUP(MTYPE_PIM_MSDP_MG_NAME, mesh_group_name); @@ -1340,6 +1352,12 @@ bool pim_msdp_peer_config_write(struct vty *vty, struct pim_instance *pim)  		written = true;  	} +	if (pim->msdp.originator_id.s_addr != INADDR_ANY) +		vty_out(vty, " msdp originator-id %pI4\n", &pim->msdp.originator_id); + +	if (pim->msdp.shutdown) +		vty_out(vty, " msdp shutdown\n"); +  	return written;  } diff --git a/pimd/pim_msdp.h b/pimd/pim_msdp.h index 7e0e5c1218..4edb6e6166 100644 --- a/pimd/pim_msdp.h +++ b/pimd/pim_msdp.h @@ -341,6 +341,16 @@ void pim_msdp_peer_restart(struct pim_msdp_peer *mp);   */  void pim_msdp_shutdown(struct pim_instance *pim, bool state); +/** + * Get the configured originator ID for the SA RP field or the RP for the group. + * + * \param[in] pim PIM instance that MSDP connection belongs to. + * \param[in] group Multicast group. + * \param[out] originator_id Originator output value. + */ +void pim_msdp_originator_id(struct pim_instance *pim, const struct prefix *group, +			    struct in_addr *originator_id); +  extern bool pim_msdp_log_neighbor_events(const struct pim_instance *pim);  extern bool pim_msdp_log_sa_events(const struct pim_instance *pim); diff --git a/pimd/pim_msdp_packet.c b/pimd/pim_msdp_packet.c index c858bad1ad..8c821cb5e5 100644 --- a/pimd/pim_msdp_packet.c +++ b/pimd/pim_msdp_packet.c @@ -409,7 +409,6 @@ 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; @@ -420,14 +419,8 @@ static void pim_msdp_pkt_sa_gen(struct pim_instance *pim,  		zlog_debug("  sa gen  %d", local_cnt);  	} -	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; -	    } -	} - +	pim_get_all_mcast_group(&group_all); +	pim_msdp_originator_id(pim, &group_all, &rp);  	local_cnt = pim_msdp_pkt_sa_fill_hdr(pim, local_cnt, rp);  	for (ALL_LIST_ELEMENTS_RO(pim->msdp.sa_list, sanode, sa)) { @@ -457,8 +450,7 @@ static void pim_msdp_pkt_sa_gen(struct pim_instance *pim,  				zlog_debug("  sa gen for remainder %d",  					   local_cnt);  			} -			local_cnt = pim_msdp_pkt_sa_fill_hdr( -				pim, local_cnt, rp); +			local_cnt = pim_msdp_pkt_sa_fill_hdr(pim, local_cnt, rp);  		}  	} diff --git a/pimd/pim_nb.c b/pimd/pim_nb.c index b5d20419dd..6b6c0e8779 100644 --- a/pimd/pim_nb.c +++ b/pimd/pim_nb.c @@ -142,6 +142,13 @@ const struct frr_yang_module_info frr_pim_info = {  			}  		},  		{ +			.xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/msdp/originator-id", +			.cbs = { +				.modify = pim_msdp_originator_id_modify, +				.destroy = pim_msdp_originator_id_destroy, +			} +		}, +		{  			.xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/msdp/shutdown",  			.cbs = {  				.modify = pim_msdp_shutdown_modify, diff --git a/pimd/pim_nb.h b/pimd/pim_nb.h index 7d30db04be..c50fdb2000 100644 --- a/pimd/pim_nb.h +++ b/pimd/pim_nb.h @@ -56,6 +56,8 @@ int pim_msdp_keep_alive_modify(struct nb_cb_modify_args *args);  int pim_msdp_connection_retry_modify(struct nb_cb_modify_args *args);  int pim_msdp_log_neighbor_events_modify(struct nb_cb_modify_args *args);  int pim_msdp_log_sa_events_modify(struct nb_cb_modify_args *args); +int pim_msdp_originator_id_modify(struct nb_cb_modify_args *args); +int pim_msdp_originator_id_destroy(struct nb_cb_destroy_args *args);  int pim_msdp_shutdown_modify(struct nb_cb_modify_args *args);  int pim_msdp_mesh_group_create(struct nb_cb_create_args *args);  int pim_msdp_mesh_group_destroy(struct nb_cb_destroy_args *args); diff --git a/pimd/pim_nb_config.c b/pimd/pim_nb_config.c index fb7047aa49..30895e0377 100644 --- a/pimd/pim_nb_config.c +++ b/pimd/pim_nb_config.c @@ -1037,6 +1037,8 @@ pim6_msdp_err(pim_msdp_peer_authentication_key_modify, nb_cb_modify_args);  pim6_msdp_err(pim_msdp_peer_authentication_key_destroy, nb_cb_destroy_args);  pim6_msdp_err(pim_msdp_log_neighbor_events_modify, nb_cb_modify_args);  pim6_msdp_err(pim_msdp_log_sa_events_modify, nb_cb_modify_args); +pim6_msdp_err(pim_msdp_originator_id_modify, nb_cb_modify_args); +pim6_msdp_err(pim_msdp_originator_id_destroy, nb_cb_destroy_args);  pim6_msdp_err(pim_msdp_shutdown_modify, nb_cb_modify_args);  #if PIM_IPV != 6 @@ -1173,6 +1175,50 @@ int pim_msdp_log_sa_events_modify(struct nb_cb_modify_args *args)  /*   * XPath: + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/msdp/originator-id + */ +int pim_msdp_originator_id_modify(struct nb_cb_modify_args *args) +{ +	struct pim_instance *pim; +	struct vrf *vrf; + +	switch (args->event) { +	case NB_EV_VALIDATE: +	case NB_EV_PREPARE: +	case NB_EV_ABORT: +		break; +	case NB_EV_APPLY: +		vrf = nb_running_get_entry(args->dnode, NULL, true); +		pim = vrf->info; +		yang_dnode_get_ipv4(&pim->msdp.originator_id, args->dnode, NULL); +		break; +	} + +	return NB_OK; +} + +int pim_msdp_originator_id_destroy(struct nb_cb_destroy_args *args) +{ +	struct pim_instance *pim; +	struct vrf *vrf; + +	switch (args->event) { +	case NB_EV_VALIDATE: +	case NB_EV_PREPARE: +	case NB_EV_ABORT: +		break; +	case NB_EV_APPLY: +		vrf = nb_running_get_entry(args->dnode, NULL, true); +		pim = vrf->info; +		pim->msdp.originator_id.s_addr = INADDR_ANY; +		break; +	} + +	return NB_OK; +} + +/* + * XPath:   * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/msdp/shutdown   */  int pim_msdp_shutdown_modify(struct nb_cb_modify_args *args)  | 
