diff options
| author | Donald Sharp <donaldsharp72@gmail.com> | 2023-11-30 09:44:48 -0500 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-11-30 09:44:48 -0500 | 
| commit | f21692509948809bae825148357ef256ff722f30 (patch) | |
| tree | 3074f5f788f14d1684f49f6af4145c0319731a75 | |
| parent | 06aacab2b0ea8eb11e36fc8b8165816f09a5dc0f (diff) | |
| parent | df4906f6cb1bb78f9a4957de6479286b4d839c3f (diff) | |
Merge pull request #14919 from opensourcerouting/fix/ac30911160c6dd5556dd42133760a0c60b897569_9.0
bgpd: aggr summary-only suppressed export to evpn
| -rw-r--r-- | bgpd/bgp_evpn.c | 38 | ||||
| -rw-r--r-- | bgpd/bgp_evpn.h | 27 | ||||
| -rw-r--r-- | bgpd/bgp_evpn_mh.c | 14 | ||||
| -rw-r--r-- | bgpd/bgp_route.c | 2 | ||||
| -rw-r--r-- | bgpd/bgp_route.h | 1 | ||||
| -rw-r--r-- | bgpd/bgp_trace.h | 86 | ||||
| -rwxr-xr-x | tools/frr_babeltrace.py | 70 | 
7 files changed, 211 insertions, 27 deletions
diff --git a/bgpd/bgp_evpn.c b/bgpd/bgp_evpn.c index 1ad66bf9f5..64b1fb18da 100644 --- a/bgpd/bgp_evpn.c +++ b/bgpd/bgp_evpn.c @@ -309,6 +309,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 || !pi->extra->parent) +		return true; + +        parent_pi = (struct bgp_path_info *)pi->extra->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.   */ @@ -1624,6 +1657,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 && @@ -2258,6 +2294,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); diff --git a/bgpd/bgp_evpn.h b/bgpd/bgp_evpn.h index a034bfbd7e..a1be06a4e4 100644 --- a/bgpd/bgp_evpn.h +++ b/bgpd/bgp_evpn.h @@ -94,32 +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->parent) -		return true; - -	parent_pi = (struct bgp_path_info *)pi->extra->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; @@ -198,5 +172,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 */ diff --git a/bgpd/bgp_evpn_mh.c b/bgpd/bgp_evpn_mh.c index efadda17b8..37c33214e6 100644 --- a/bgpd/bgp_evpn_mh.c +++ b/bgpd/bgp_evpn_mh.c @@ -434,6 +434,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. */ @@ -484,6 +488,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)  	 */ @@ -3449,6 +3455,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 @@ -3473,6 +3483,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 diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index 0885c9f1a9..2cd61b94b0 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -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; diff --git a/bgpd/bgp_route.h b/bgpd/bgp_route.h index d5a00059ad..b429578b0d 100644 --- a/bgpd/bgp_route.h +++ b/bgpd/bgp_route.h @@ -877,6 +877,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); diff --git a/bgpd/bgp_trace.h b/bgpd/bgp_trace.h index 3213b29d99..d6ba873ba3 100644 --- a/bgpd/bgp_trace.h +++ b/bgpd/bgp_trace.h @@ -436,6 +436,64 @@ 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,  	TP_ARGS(vni_t, vni, struct in_addr, vtep, vrf_id_t, vrf,  			struct in_addr, mc_grp), @@ -496,6 +554,34 @@ 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,  	TP_ARGS(vni_t, vni, vrf_id_t, vrf,  			struct ethaddr *, svi_rmac, diff --git a/tools/frr_babeltrace.py b/tools/frr_babeltrace.py index 4d974ad356..9832568b37 100755 --- a/tools/frr_babeltrace.py +++ b/tools/frr_babeltrace.py @@ -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  | 
