mirror of
				https://git.proxmox.com/git/mirror_frr
				synced 2025-10-30 23:27:35 +00:00 
			
		
		
		
	Merge pull request #14917 from FRRouting/mergify/bp/stable/9.1/pr-14909
bgpd: aggr summary-only suppressed export to evpn (backport #14909)
This commit is contained in:
		
						commit
						0e022f37cc
					
				| @ -311,6 +311,39 @@ static int is_vni_present_in_irt_vnis(struct list *vnis, struct bgpevpn *vpn) | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| /* Flag if the route is injectable into EVPN.
 | ||||
|  * This would be following category: | ||||
|  * Non-imported route, | ||||
|  * Non-EVPN imported route, | ||||
|  * Non Aggregate suppressed route. | ||||
|  */ | ||||
| bool is_route_injectable_into_evpn(struct bgp_path_info *pi) | ||||
| { | ||||
| 	struct bgp_path_info *parent_pi; | ||||
| 	struct bgp_table *table; | ||||
| 	struct bgp_dest *dest; | ||||
| 
 | ||||
| 	/* do not import aggr suppressed routes */ | ||||
| 	if (bgp_path_suppressed(pi)) | ||||
| 		return false; | ||||
| 
 | ||||
| 	if (pi->sub_type != BGP_ROUTE_IMPORTED || !pi->extra || | ||||
| 	    !pi->extra->vrfleak || !pi->extra->vrfleak->parent) | ||||
| 		return true; | ||||
| 
 | ||||
|         parent_pi = (struct bgp_path_info *)pi->extra->vrfleak->parent; | ||||
|         dest = parent_pi->net; | ||||
|         if (!dest) | ||||
| 		return true; | ||||
|         table = bgp_dest_table(dest); | ||||
|         if (table && | ||||
|             table->afi == AFI_L2VPN && | ||||
|             table->safi == SAFI_EVPN) | ||||
|                 return false; | ||||
| 
 | ||||
|         return true; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Compare Route Targets. | ||||
|  */ | ||||
| @ -1638,6 +1671,9 @@ static int update_evpn_type5_route(struct bgp *bgp_vrf, struct prefix_evpn *evp, | ||||
| 			vrf_id_to_name(bgp_vrf->vrf_id), evp, &attr.rmac, | ||||
| 			&attr.nexthop); | ||||
| 
 | ||||
| 	frrtrace(4, frr_bgp, evpn_advertise_type5, bgp_vrf->vrf_id, evp, | ||||
| 		 &attr.rmac, attr.nexthop); | ||||
| 
 | ||||
| 	attr.mp_nexthop_len = BGP_ATTR_NHLEN_IPV4; | ||||
| 
 | ||||
| 	if (src_afi == AFI_IP6 && | ||||
| @ -2280,6 +2316,8 @@ static int delete_evpn_type5_route(struct bgp *bgp_vrf, struct prefix_evpn *evp) | ||||
| 	if (!dest) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	frrtrace(2, frr_bgp, evpn_withdraw_type5, bgp_vrf->vrf_id, evp); | ||||
| 
 | ||||
| 	delete_evpn_route_entry(bgp_evpn, afi, safi, dest, &pi); | ||||
| 	if (pi) | ||||
| 		bgp_process(bgp_evpn, dest, afi, safi); | ||||
|  | ||||
| @ -94,31 +94,6 @@ static inline bool is_pi_family_evpn(struct bgp_path_info *pi) | ||||
| 	return is_pi_family_matching(pi, AFI_L2VPN, SAFI_EVPN); | ||||
| } | ||||
| 
 | ||||
| /* Flag if the route is injectable into EVPN. This would be either a
 | ||||
|  * non-imported route or a non-EVPN imported route. | ||||
|  */ | ||||
| static inline bool is_route_injectable_into_evpn(struct bgp_path_info *pi) | ||||
| { | ||||
| 	struct bgp_path_info *parent_pi; | ||||
| 	struct bgp_table *table; | ||||
| 	struct bgp_dest *dest; | ||||
| 
 | ||||
| 	if (pi->sub_type != BGP_ROUTE_IMPORTED || !pi->extra || | ||||
| 	    !pi->extra->vrfleak || !pi->extra->vrfleak->parent) | ||||
| 		return true; | ||||
| 
 | ||||
| 	parent_pi = (struct bgp_path_info *)pi->extra->vrfleak->parent; | ||||
| 	dest = parent_pi->net; | ||||
| 	if (!dest) | ||||
| 		return true; | ||||
| 	table = bgp_dest_table(dest); | ||||
| 	if (table && | ||||
| 	    table->afi == AFI_L2VPN && | ||||
| 	    table->safi == SAFI_EVPN) | ||||
| 		return false; | ||||
| 	return true; | ||||
| } | ||||
| 
 | ||||
| static inline bool evpn_resolve_overlay_index(void) | ||||
| { | ||||
| 	struct bgp *bgp = NULL; | ||||
| @ -206,5 +181,6 @@ extern mpls_label_t *bgp_evpn_path_info_labels_get_l3vni(mpls_label_t *labels, | ||||
| extern vni_t bgp_evpn_path_info_get_l3vni(const struct bgp_path_info *pi); | ||||
| extern bool bgp_evpn_mpath_has_dvni(const struct bgp *bgp_vrf, | ||||
| 				    struct bgp_path_info *mpinfo); | ||||
| extern bool is_route_injectable_into_evpn(struct bgp_path_info *pi); | ||||
| 
 | ||||
| #endif /* _QUAGGA_BGP_EVPN_H */ | ||||
|  | ||||
| @ -441,6 +441,10 @@ int bgp_evpn_mh_route_update(struct bgp *bgp, struct bgp_evpn_es *es, | ||||
| 					? "esr" | ||||
| 					: (vpn ? "ead-evi" : "ead-es"), | ||||
| 				&attr->mp_nexthop_global_in); | ||||
| 
 | ||||
| 		frrtrace(4, frr_bgp, evpn_mh_local_ead_es_evi_route_upd, | ||||
| 			 &es->esi, (vpn ? vpn->vni : 0), evp->prefix.route_type, | ||||
| 			 attr->mp_nexthop_global_in); | ||||
| 	} | ||||
| 
 | ||||
| 	/* Return back the route entry. */ | ||||
| @ -491,6 +495,8 @@ static int bgp_evpn_mh_route_delete(struct bgp *bgp, struct bgp_evpn_es *es, | ||||
| 				: (vpn ? "ead-evi" : "ead-es"), | ||||
| 			&es->originator_ip); | ||||
| 
 | ||||
| 	frrtrace(4, frr_bgp, evpn_mh_local_ead_es_evi_route_del, &es->esi, | ||||
| 		 (vpn ? vpn->vni : 0), p->prefix.route_type, es->originator_ip); | ||||
| 	/* Next, locate route node in the global EVPN routing table.
 | ||||
| 	 * Note that this table is a 2-level tree (RD-level + Prefix-level) | ||||
| 	 */ | ||||
| @ -3460,6 +3466,10 @@ static void bgp_evpn_es_evi_vtep_add(struct bgp *bgp, | ||||
| 			   evi_vtep->es_evi->vpn->vni, &evi_vtep->vtep_ip, | ||||
| 			   ead_es ? "ead_es" : "ead_evi"); | ||||
| 
 | ||||
| 	frrtrace(4, frr_bgp, evpn_mh_es_evi_vtep_add, | ||||
| 		 &evi_vtep->es_evi->es->esi, evi_vtep->es_evi->vpn->vni, | ||||
| 		 evi_vtep->vtep_ip, ead_es); | ||||
| 
 | ||||
| 	if (ead_es) | ||||
| 		SET_FLAG(evi_vtep->flags, BGP_EVPN_EVI_VTEP_EAD_PER_ES); | ||||
| 	else | ||||
| @ -3484,6 +3494,10 @@ static void bgp_evpn_es_evi_vtep_del(struct bgp *bgp, | ||||
| 			   evi_vtep->es_evi->vpn->vni, &evi_vtep->vtep_ip, | ||||
| 			   ead_es ? "ead_es" : "ead_evi"); | ||||
| 
 | ||||
| 	frrtrace(4, frr_bgp, evpn_mh_es_evi_vtep_del, | ||||
| 		 &evi_vtep->es_evi->es->esi, evi_vtep->es_evi->vpn->vni, | ||||
| 		 evi_vtep->vtep_ip, ead_es); | ||||
| 
 | ||||
| 	if (ead_es) | ||||
| 		UNSET_FLAG(evi_vtep->flags, BGP_EVPN_EVI_VTEP_EAD_PER_ES); | ||||
| 	else | ||||
|  | ||||
| @ -113,7 +113,7 @@ DEFINE_HOOK(bgp_process, | ||||
| 	    (bgp, afi, safi, bn, peer, withdraw)); | ||||
| 
 | ||||
| /** Test if path is suppressed. */ | ||||
| static bool bgp_path_suppressed(struct bgp_path_info *pi) | ||||
| bool bgp_path_suppressed(struct bgp_path_info *pi) | ||||
| { | ||||
| 	if (pi->extra == NULL || pi->extra->aggr_suppressors == NULL) | ||||
| 		return false; | ||||
|  | ||||
| @ -905,6 +905,7 @@ extern void bgp_aggregate_toggle_suppressed(struct bgp_aggregate *aggregate, | ||||
| extern void subgroup_announce_reset_nhop(uint8_t family, struct attr *attr); | ||||
| const char * | ||||
| bgp_path_selection_reason2str(enum bgp_path_selection_reason reason); | ||||
| extern bool bgp_path_suppressed(struct bgp_path_info *pi); | ||||
| extern bool bgp_addpath_encode_rx(struct peer *peer, afi_t afi, safi_t safi); | ||||
| extern const struct prefix_rd *bgp_rd_from_dest(const struct bgp_dest *dest, | ||||
| 						safi_t safi); | ||||
|  | ||||
| @ -434,6 +434,64 @@ TRACEPOINT_EVENT( | ||||
| ) | ||||
| TRACEPOINT_LOGLEVEL(frr_bgp, evpn_mh_local_es_evi_del_zrecv, TRACE_INFO) | ||||
| 
 | ||||
| TRACEPOINT_EVENT( | ||||
| 	frr_bgp, | ||||
| 	evpn_mh_es_evi_vtep_add, | ||||
| 	TP_ARGS(esi_t *, esi, vni_t, vni, struct in_addr, vtep, | ||||
| 		uint8_t, ead_es), | ||||
| 	TP_FIELDS( | ||||
| 		ctf_array(unsigned char, esi, esi, sizeof(esi_t)) | ||||
| 		ctf_integer(vni_t, vni, vni) | ||||
| 		ctf_integer_network_hex(unsigned int, vtep, vtep.s_addr) | ||||
| 		ctf_integer(uint8_t, ead_es, ead_es) | ||||
| 	) | ||||
| ) | ||||
| TRACEPOINT_LOGLEVEL(frr_bgp, evpn_mh_es_evi_vtep_add, TRACE_INFO) | ||||
| 
 | ||||
| TRACEPOINT_EVENT( | ||||
| 	frr_bgp, | ||||
| 	evpn_mh_es_evi_vtep_del, | ||||
| 	TP_ARGS(esi_t *, esi, vni_t, vni, struct in_addr, vtep, | ||||
| 		uint8_t, ead_es), | ||||
| 	TP_FIELDS( | ||||
| 		ctf_array(unsigned char, esi, esi, sizeof(esi_t)) | ||||
| 		ctf_integer(vni_t, vni, vni) | ||||
| 		ctf_integer_network_hex(unsigned int, vtep, vtep.s_addr) | ||||
| 		ctf_integer(uint8_t, ead_es, ead_es) | ||||
| 	) | ||||
| ) | ||||
| TRACEPOINT_LOGLEVEL(frr_bgp, evpn_mh_es_evi_vtep_del, TRACE_INFO) | ||||
| 
 | ||||
| TRACEPOINT_EVENT( | ||||
| 	frr_bgp, | ||||
| 	evpn_mh_local_ead_es_evi_route_upd, | ||||
| 	TP_ARGS(esi_t *, esi, vni_t, vni, | ||||
| 		uint8_t, route_type, | ||||
| 		struct in_addr, vtep), | ||||
| 	TP_FIELDS( | ||||
| 		ctf_array(unsigned char, esi, esi, sizeof(esi_t)) | ||||
| 		ctf_integer(vni_t, vni, vni) | ||||
| 		ctf_integer(uint8_t, route_type, route_type) | ||||
| 		ctf_integer_network_hex(unsigned int, vtep, vtep.s_addr) | ||||
| 	) | ||||
| ) | ||||
| TRACEPOINT_LOGLEVEL(frr_bgp, evpn_mh_local_ead_es_evi_route_upd, TRACE_INFO) | ||||
| 
 | ||||
| TRACEPOINT_EVENT( | ||||
| 	frr_bgp, | ||||
| 	evpn_mh_local_ead_es_evi_route_del, | ||||
| 	TP_ARGS(esi_t *, esi, vni_t, vni, | ||||
| 		uint8_t, route_type, | ||||
| 		struct in_addr, vtep), | ||||
| 	TP_FIELDS( | ||||
| 		ctf_array(unsigned char, esi, esi, sizeof(esi_t)) | ||||
| 		ctf_integer(vni_t, vni, vni) | ||||
| 		ctf_integer(uint8_t, route_type, route_type) | ||||
| 		ctf_integer_network_hex(unsigned int, vtep, vtep.s_addr) | ||||
| 	) | ||||
| ) | ||||
| TRACEPOINT_LOGLEVEL(frr_bgp, evpn_mh_local_ead_es_evi_route_del, TRACE_INFO) | ||||
| 
 | ||||
| TRACEPOINT_EVENT( | ||||
| 	frr_bgp, | ||||
| 	evpn_local_vni_add_zrecv, | ||||
| @ -494,6 +552,34 @@ TRACEPOINT_EVENT( | ||||
| ) | ||||
| TRACEPOINT_LOGLEVEL(frr_bgp, evpn_local_macip_del_zrecv, TRACE_INFO) | ||||
| 
 | ||||
| TRACEPOINT_EVENT( | ||||
| 	frr_bgp, | ||||
| 	evpn_advertise_type5, | ||||
| 	TP_ARGS(vrf_id_t, vrf, const struct prefix_evpn *, pfx, | ||||
| 		struct ethaddr *, rmac, struct in_addr, vtep), | ||||
| 	TP_FIELDS( | ||||
| 		ctf_integer(int, vrf_id, vrf) | ||||
| 		ctf_array(unsigned char, ip, &pfx->prefix.prefix_addr.ip, | ||||
| 			sizeof(struct ipaddr)) | ||||
| 		ctf_array(unsigned char, rmac, rmac, | ||||
| 			sizeof(struct ethaddr)) | ||||
| 		ctf_integer_network_hex(unsigned int, vtep, vtep.s_addr) | ||||
| 	) | ||||
| ) | ||||
| TRACEPOINT_LOGLEVEL(frr_bgp, evpn_advertise_type5, TRACE_INFO) | ||||
| 
 | ||||
| TRACEPOINT_EVENT( | ||||
| 	frr_bgp, | ||||
| 	evpn_withdraw_type5, | ||||
| 	TP_ARGS(vrf_id_t, vrf, const struct prefix_evpn *, pfx), | ||||
| 	TP_FIELDS( | ||||
| 		ctf_integer(int, vrf_id, vrf) | ||||
| 		ctf_array(unsigned char, ip, &pfx->prefix.prefix_addr.ip, | ||||
| 			sizeof(struct ipaddr)) | ||||
| 	) | ||||
| ) | ||||
| TRACEPOINT_LOGLEVEL(frr_bgp, evpn_withdraw_type5, TRACE_INFO) | ||||
| 
 | ||||
| TRACEPOINT_EVENT( | ||||
| 	frr_bgp, | ||||
| 	evpn_local_l3vni_add_zrecv, | ||||
|  | ||||
| @ -157,6 +157,46 @@ def parse_frr_bgp_evpn_mh_local_es_evi_del_zrecv(event): | ||||
| 
 | ||||
|     parse_event(event, field_parsers) | ||||
| 
 | ||||
| def parse_frr_bgp_evpn_mh_es_evi_vtep_add(event): | ||||
|     """ | ||||
|     bgp evpn remote ead evi remote vtep add; raw format - | ||||
|     ctf_array(unsigned char, esi, esi, sizeof(esi_t)) | ||||
|     """ | ||||
|     field_parsers = {"esi": print_esi, | ||||
|                      "vtep": print_net_ipv4_addr} | ||||
| 
 | ||||
|     parse_event(event, field_parsers) | ||||
| 
 | ||||
| def parse_frr_bgp_evpn_mh_es_evi_vtep_del(event): | ||||
|     """ | ||||
|     bgp evpn remote ead evi remote vtep del; raw format - | ||||
|     ctf_array(unsigned char, esi, esi, sizeof(esi_t)) | ||||
|     """ | ||||
|     field_parsers = {"esi": print_esi, | ||||
|                      "vtep": print_net_ipv4_addr} | ||||
| 
 | ||||
|     parse_event(event, field_parsers) | ||||
| 
 | ||||
| def parse_frr_bgp_evpn_mh_local_ead_es_evi_route_upd(event): | ||||
|     """ | ||||
|     bgp evpn local ead evi vtep; raw format - | ||||
|     ctf_array(unsigned char, esi, esi, sizeof(esi_t)) | ||||
|     """ | ||||
|     field_parsers = {"esi": print_esi, | ||||
|                      "vtep": print_net_ipv4_addr} | ||||
| 
 | ||||
|     parse_event(event, field_parsers) | ||||
| 
 | ||||
| def parse_frr_bgp_evpn_mh_local_ead_es_evi_route_del(event): | ||||
|     """ | ||||
|     bgp evpn local ead evi vtep del; raw format - | ||||
|     ctf_array(unsigned char, esi, esi, sizeof(esi_t)) | ||||
|     """ | ||||
|     field_parsers = {"esi": print_esi, | ||||
|                      "vtep": print_net_ipv4_addr} | ||||
| 
 | ||||
|     parse_event(event, field_parsers) | ||||
| 
 | ||||
| def parse_frr_bgp_evpn_local_vni_add_zrecv(event): | ||||
|     """ | ||||
|     bgp evpn local-vni parser; raw format - | ||||
| @ -205,6 +245,24 @@ def parse_frr_bgp_evpn_local_macip_del_zrecv(event): | ||||
| 
 | ||||
|     parse_event(event, field_parsers) | ||||
| 
 | ||||
| def parse_frr_bgp_evpn_advertise_type5(event): | ||||
|     """ | ||||
|     local originated type-5 route | ||||
|     """ | ||||
|     field_parsers = {"ip": print_ip_addr, | ||||
|                      "rmac": print_mac, | ||||
|                      "vtep": print_net_ipv4_addr} | ||||
| 
 | ||||
|     parse_event(event, field_parsers) | ||||
| 
 | ||||
| def parse_frr_bgp_evpn_withdraw_type5(event): | ||||
|     """ | ||||
|     local originated type-5 route withdraw | ||||
|     """ | ||||
|     field_parsers = {"ip": print_ip_addr} | ||||
| 
 | ||||
|     parse_event(event, field_parsers) | ||||
| 
 | ||||
| ############################ evpn parsers - end *############################# | ||||
| 
 | ||||
| def main(): | ||||
| @ -225,6 +283,14 @@ def main(): | ||||
|                      parse_frr_bgp_evpn_mh_local_es_evi_add_zrecv, | ||||
|                      "frr_bgp:evpn_mh_local_es_evi_del_zrecv": | ||||
|                      parse_frr_bgp_evpn_mh_local_es_evi_del_zrecv, | ||||
|                      "frr_bgp:evpn_mh_es_evi_vtep_add": | ||||
|                      parse_frr_bgp_evpn_mh_es_evi_vtep_add, | ||||
|                      "frr_bgp:evpn_mh_es_evi_vtep_del": | ||||
|                      parse_frr_bgp_evpn_mh_es_evi_vtep_del, | ||||
|                      "frr_bgp:evpn_mh_local_ead_es_evi_route_upd": | ||||
|                      parse_frr_bgp_evpn_mh_local_ead_es_evi_route_upd, | ||||
|                      "frr_bgp:evpn_mh_local_ead_es_evi_route_del": | ||||
|                      parse_frr_bgp_evpn_mh_local_ead_es_evi_route_del, | ||||
|                      "frr_bgp:evpn_local_vni_add_zrecv": | ||||
|                      parse_frr_bgp_evpn_local_vni_add_zrecv, | ||||
|                      "frr_bgp:evpn_local_l3vni_add_zrecv": | ||||
| @ -233,6 +299,10 @@ def main(): | ||||
|                      parse_frr_bgp_evpn_local_macip_add_zrecv, | ||||
|                      "frr_bgp:evpn_local_macip_del_zrecv": | ||||
|                      parse_frr_bgp_evpn_local_macip_del_zrecv, | ||||
|                      "frr_bgp:evpn_advertise_type5": | ||||
|                      parse_frr_bgp_evpn_advertise_type5, | ||||
|                      "frr_bgp:evpn_withdraw_type5": | ||||
|                      parse_frr_bgp_evpn_withdraw_type5, | ||||
| } | ||||
| 
 | ||||
|     # get the trace path from the first command line argument | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Donatas Abraitis
						Donatas Abraitis