summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bgpd/bgp_evpn.c38
-rw-r--r--bgpd/bgp_evpn.h26
-rw-r--r--bgpd/bgp_evpn_mh.c14
-rw-r--r--bgpd/bgp_mplsvpn.c7
-rw-r--r--bgpd/bgp_route.c2
-rw-r--r--bgpd/bgp_route.h1
-rw-r--r--bgpd/bgp_trace.h86
-rw-r--r--bgpd/bgp_vty.c2
-rw-r--r--bgpd/bgp_zebra.c2
-rw-r--r--bgpd/bgpd.c2
-rw-r--r--bgpd/bgpd.h3
-rw-r--r--lib/srv6.c2
-rw-r--r--lib/srv6.h1
-rwxr-xr-xtools/frr_babeltrace.py70
14 files changed, 226 insertions, 30 deletions
diff --git a/bgpd/bgp_evpn.c b/bgpd/bgp_evpn.c
index faafab8505..49f24ee7be 100644
--- a/bgpd/bgp_evpn.c
+++ b/bgpd/bgp_evpn.c
@@ -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);
diff --git a/bgpd/bgp_evpn.h b/bgpd/bgp_evpn.h
index 55474464e5..8403897587 100644
--- a/bgpd/bgp_evpn.h
+++ b/bgpd/bgp_evpn.h
@@ -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 */
diff --git a/bgpd/bgp_evpn_mh.c b/bgpd/bgp_evpn_mh.c
index ffb1b17ec7..a712310905 100644
--- a/bgpd/bgp_evpn_mh.c
+++ b/bgpd/bgp_evpn_mh.c
@@ -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
diff --git a/bgpd/bgp_mplsvpn.c b/bgpd/bgp_mplsvpn.c
index 1e25e1b6a7..cf57d95eb0 100644
--- a/bgpd/bgp_mplsvpn.c
+++ b/bgpd/bgp_mplsvpn.c
@@ -596,6 +596,11 @@ static void sid_register(struct bgp *bgp, const struct in6_addr *sid,
listnode_add(bgp->srv6_functions, func);
}
+void srv6_function_free(struct bgp_srv6_function *func)
+{
+ XFREE(MTYPE_BGP_SRV6_FUNCTION, func);
+}
+
void sid_unregister(struct bgp *bgp, const struct in6_addr *sid)
{
struct listnode *node, *nnode;
@@ -604,7 +609,7 @@ void sid_unregister(struct bgp *bgp, const struct in6_addr *sid)
for (ALL_LIST_ELEMENTS(bgp->srv6_functions, node, nnode, func))
if (sid_same(&func->sid, sid)) {
listnode_delete(bgp->srv6_functions, func);
- XFREE(MTYPE_BGP_SRV6_FUNCTION, func);
+ srv6_function_free(func);
}
}
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c
index 193d9fe4f9..9283055d9d 100644
--- a/bgpd/bgp_route.c
+++ b/bgpd/bgp_route.c
@@ -120,7 +120,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 3057a4259a..ad0cc9eabc 100644
--- a/bgpd/bgp_route.h
+++ b/bgpd/bgp_route.h
@@ -914,6 +914,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 8274802a73..5a80a53f61 100644
--- a/bgpd/bgp_trace.h
+++ b/bgpd/bgp_trace.h
@@ -437,6 +437,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),
@@ -497,6 +555,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/bgpd/bgp_vty.c b/bgpd/bgp_vty.c
index e45a5fccb4..4f9e4b4ce9 100644
--- a/bgpd/bgp_vty.c
+++ b/bgpd/bgp_vty.c
@@ -319,7 +319,7 @@ static int bgp_srv6_locator_unset(struct bgp *bgp)
/* refresh functions */
for (ALL_LIST_ELEMENTS(bgp->srv6_functions, node, nnode, func)) {
listnode_delete(bgp->srv6_functions, func);
- XFREE(MTYPE_BGP_SRV6_FUNCTION, func);
+ srv6_function_free(func);
}
/* refresh tovpn_sid */
diff --git a/bgpd/bgp_zebra.c b/bgpd/bgp_zebra.c
index 98e21bae09..dfb8d01f2d 100644
--- a/bgpd/bgp_zebra.c
+++ b/bgpd/bgp_zebra.c
@@ -3213,7 +3213,7 @@ static int bgp_zebra_process_srv6_locator_delete(ZAPI_CALLBACK_ARGS)
if (prefix_match((struct prefix *)&loc.prefix,
(struct prefix *)&tmp_prefi)) {
listnode_delete(bgp->srv6_functions, func);
- XFREE(MTYPE_BGP_SRV6_FUNCTION, func);
+ srv6_function_free(func);
}
}
diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c
index 8e6de3b4fb..4fa021ab93 100644
--- a/bgpd/bgpd.c
+++ b/bgpd/bgpd.c
@@ -1427,7 +1427,9 @@ static void bgp_srv6_init(struct bgp *bgp)
bgp->srv6_enabled = false;
memset(bgp->srv6_locator_name, 0, sizeof(bgp->srv6_locator_name));
bgp->srv6_locator_chunks = list_new();
+ bgp->srv6_locator_chunks->del = srv6_locator_chunk_list_free;
bgp->srv6_functions = list_new();
+ bgp->srv6_functions->del = (void (*)(void *))srv6_function_free;
}
static void bgp_srv6_cleanup(struct bgp *bgp)
diff --git a/bgpd/bgpd.h b/bgpd/bgpd.h
index 30877cad06..9e9d1c1e1e 100644
--- a/bgpd/bgpd.h
+++ b/bgpd/bgpd.h
@@ -2739,6 +2739,9 @@ extern bool bgp_path_attribute_discard(struct peer *peer, char *buf,
size_t size);
extern bool bgp_path_attribute_treat_as_withdraw(struct peer *peer, char *buf,
size_t size);
+
+extern void srv6_function_free(struct bgp_srv6_function *func);
+
#ifdef _FRR_ATTRIBUTE_PRINTFRR
/* clang-format off */
#pragma FRR printfrr_ext "%pBP" (struct peer *)
diff --git a/lib/srv6.c b/lib/srv6.c
index 09835f3ea8..dceb6ab48b 100644
--- a/lib/srv6.c
+++ b/lib/srv6.c
@@ -108,7 +108,7 @@ const char *seg6local_context2str(char *str, size_t size,
}
}
-static void srv6_locator_chunk_list_free(void *data)
+void srv6_locator_chunk_list_free(void *data)
{
struct srv6_locator_chunk *chunk = data;
diff --git a/lib/srv6.h b/lib/srv6.h
index fb34f861c8..433c5c14fd 100644
--- a/lib/srv6.h
+++ b/lib/srv6.h
@@ -252,6 +252,7 @@ int snprintf_seg6_segs(char *str,
extern struct srv6_locator *srv6_locator_alloc(const char *name);
extern struct srv6_locator_chunk *srv6_locator_chunk_alloc(void);
extern void srv6_locator_free(struct srv6_locator *locator);
+extern void srv6_locator_chunk_list_free(void *data);
extern void srv6_locator_chunk_free(struct srv6_locator_chunk **chunk);
json_object *srv6_locator_chunk_json(const struct srv6_locator_chunk *chunk);
json_object *srv6_locator_json(const struct srv6_locator *loc);
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