diff --git a/bgpd/bgp_trace.h b/bgpd/bgp_trace.h index 91a190722b..14149b5139 100644 --- a/bgpd/bgp_trace.h +++ b/bgpd/bgp_trace.h @@ -334,6 +334,147 @@ TRACEPOINT_EVENT( ) ) TRACEPOINT_LOGLEVEL(frr_bgp, evpn_nh_rmac_zsend, TRACE_INFO) + +TRACEPOINT_EVENT( + frr_bgp, + evpn_mh_local_es_add_zrecv, + TP_ARGS(esi_t *, esi, struct in_addr, vtep, + uint8_t, active, uint8_t, bypass, uint16_t, df_pref), + TP_FIELDS( + ctf_array(unsigned char, esi, esi, sizeof(esi_t)) + ctf_integer_network_hex(unsigned int, vtep, vtep.s_addr) + ctf_integer(uint8_t, active, active) + ctf_integer(uint8_t, bypass, bypass) + ctf_integer(uint16_t, df_pref, df_pref) + ) +) +TRACEPOINT_LOGLEVEL(frr_bgp, evpn_mh_local_es_add_zrecv, TRACE_INFO) + +TRACEPOINT_EVENT( + frr_bgp, + evpn_mh_local_es_del_zrecv, + TP_ARGS(esi_t *, esi), + TP_FIELDS( + ctf_array(unsigned char, esi, esi, sizeof(esi_t)) + ) +) +TRACEPOINT_LOGLEVEL(frr_bgp, evpn_mh_local_es_del_zrecv, TRACE_INFO) + +TRACEPOINT_EVENT( + frr_bgp, + evpn_mh_local_es_evi_add_zrecv, + TP_ARGS(esi_t *, esi, vni_t, vni), + TP_FIELDS( + ctf_array(unsigned char, esi, esi, sizeof(esi_t)) + ctf_integer(vni_t, vni, vni) + ) +) +TRACEPOINT_LOGLEVEL(frr_bgp, evpn_mh_local_es_evi_add_zrecv, TRACE_INFO) + +TRACEPOINT_EVENT( + frr_bgp, + evpn_mh_local_es_evi_del_zrecv, + TP_ARGS(esi_t *, esi, vni_t, vni), + TP_FIELDS( + ctf_array(unsigned char, esi, esi, sizeof(esi_t)) + ctf_integer(vni_t, vni, vni) + ) +) +TRACEPOINT_LOGLEVEL(frr_bgp, evpn_mh_local_es_evi_del_zrecv, 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), + TP_FIELDS( + ctf_integer(vni_t, vni, vni) + ctf_integer_network_hex(unsigned int, vtep, vtep.s_addr) + ctf_integer_network_hex(unsigned int, mc_grp, + mc_grp.s_addr) + ctf_integer(int, vrf, vrf) + ) +) +TRACEPOINT_LOGLEVEL(frr_bgp, evpn_local_vni_add_zrecv, TRACE_INFO) + +TRACEPOINT_EVENT( + frr_bgp, + evpn_local_vni_del_zrecv, + TP_ARGS(vni_t, vni), + TP_FIELDS( + ctf_integer(vni_t, vni, vni) + ) +) +TRACEPOINT_LOGLEVEL(frr_bgp, evpn_local_vni_del_zrecv, TRACE_INFO) + +TRACEPOINT_EVENT( + frr_bgp, + evpn_local_macip_add_zrecv, + TP_ARGS(vni_t, vni, struct ethaddr *, mac, + struct ipaddr *, ip, uint32_t, flags, + uint32_t, seqnum, esi_t *, esi), + TP_FIELDS( + ctf_integer(vni_t, vni, vni) + ctf_array(unsigned char, mac, mac, + sizeof(struct ethaddr)) + ctf_array(unsigned char, ip, ip, + sizeof(struct ipaddr)) + ctf_integer(uint32_t, flags, flags) + ctf_integer(uint32_t, seq, seqnum) + ctf_array(unsigned char, esi, esi, sizeof(esi_t)) + ) +) +TRACEPOINT_LOGLEVEL(frr_bgp, evpn_local_macip_add_zrecv, TRACE_INFO) + +TRACEPOINT_EVENT( + frr_bgp, + evpn_local_macip_del_zrecv, + TP_ARGS(vni_t, vni, struct ethaddr *, mac, struct ipaddr *, ip, + int, state), + TP_FIELDS( + ctf_integer(vni_t, vni, vni) + ctf_array(unsigned char, mac, mac, + sizeof(struct ethaddr)) + ctf_array(unsigned char, ip, ip, + sizeof(struct ipaddr)) + ctf_integer(int, state, state) + ) +) +TRACEPOINT_LOGLEVEL(frr_bgp, evpn_local_macip_del_zrecv, TRACE_INFO) + +TRACEPOINT_EVENT( + frr_bgp, + evpn_local_l3vni_add_zrecv, + TP_ARGS(vni_t, vni, vrf_id_t, vrf, + struct ethaddr *, svi_rmac, + struct ethaddr *, vrr_rmac, int, filter, + struct in_addr, vtep, int, svi_ifindex, + bool, anycast_mac), + TP_FIELDS( + ctf_integer(vni_t, vni, vni) + ctf_integer(int, vrf, vrf) + ctf_array(unsigned char, svi_rmac, svi_rmac, + sizeof(struct ethaddr)) + ctf_array(unsigned char, vrr_rmac, vrr_rmac, + sizeof(struct ethaddr)) + ctf_integer_network_hex(unsigned int, vtep, vtep.s_addr) + ctf_integer(int, filter, filter) + ctf_integer(int, svi_ifindex, svi_ifindex) + ctf_string(anycast_mac, anycast_mac ? "y" : "n") + ) +) +TRACEPOINT_LOGLEVEL(frr_bgp, evpn_local_l3vni_add_zrecv, TRACE_INFO) + +TRACEPOINT_EVENT( + frr_bgp, + evpn_local_l3vni_del_zrecv, + TP_ARGS(vni_t, vni, vrf_id_t, vrf), + TP_FIELDS( + ctf_integer(vni_t, vni, vni) + ctf_integer(int, vrf, vrf) + ) +) +TRACEPOINT_LOGLEVEL(frr_bgp, evpn_local_l3vni_del_zrecv, TRACE_INFO) /* clang-format on */ #include diff --git a/bgpd/bgp_zebra.c b/bgpd/bgp_zebra.c index 0249d53f02..6161f56fe6 100644 --- a/bgpd/bgp_zebra.c +++ b/bgpd/bgp_zebra.c @@ -64,6 +64,7 @@ #include "bgpd/bgp_evpn_private.h" #include "bgpd/bgp_evpn_mh.h" #include "bgpd/bgp_mac.h" +#include "bgpd/bgp_trace.h" /* All information about zebra. */ struct zclient *zclient = NULL; @@ -2773,6 +2774,9 @@ static int bgp_zebra_process_local_es_add(ZAPI_CALLBACK_ARGS) esi_to_str(&esi, buf, sizeof(buf)), &originator_ip, active, df_pref, bypass ? "bypass" : ""); + frrtrace(5, frr_bgp, evpn_mh_local_es_add_zrecv, &esi, originator_ip, + active, bypass, df_pref); + bgp_evpn_local_es_add(bgp, &esi, originator_ip, active, df_pref, !!bypass); @@ -2798,6 +2802,8 @@ static int bgp_zebra_process_local_es_del(ZAPI_CALLBACK_ARGS) zlog_debug("Rx del ESI %s", esi_to_str(&esi, buf, sizeof(buf))); + frrtrace(1, frr_bgp, evpn_mh_local_es_del_zrecv, &esi); + bgp_evpn_local_es_del(bgp, &esi); return 0; @@ -2824,10 +2830,15 @@ static int bgp_zebra_process_local_es_evi(ZAPI_CALLBACK_ARGS) ZEBRA_VNI_ADD ? "add" : "del", esi_to_str(&esi, buf, sizeof(buf)), vni); - if (cmd == ZEBRA_LOCAL_ES_EVI_ADD) + if (cmd == ZEBRA_LOCAL_ES_EVI_ADD) { + frrtrace(2, frr_bgp, evpn_mh_local_es_evi_add_zrecv, &esi, vni); + bgp_evpn_local_es_evi_add(bgp, &esi, vni); - else + } else { + frrtrace(2, frr_bgp, evpn_mh_local_es_evi_del_zrecv, &esi, vni); + bgp_evpn_local_es_evi_del(bgp, &esi, vni); + } return 0; } @@ -2862,6 +2873,10 @@ static int bgp_zebra_process_local_l3vni(ZAPI_CALLBACK_ARGS) filter ? "prefix-routes-only" : "none", svi_ifindex); + frrtrace(8, frr_bgp, evpn_local_l3vni_add_zrecv, l3vni, vrf_id, + &svi_rmac, &vrr_rmac, filter, originator_ip, + svi_ifindex, is_anycast_mac); + bgp_evpn_local_l3vni_add(l3vni, vrf_id, &svi_rmac, &vrr_rmac, originator_ip, filter, svi_ifindex, is_anycast_mac); @@ -2870,6 +2885,8 @@ static int bgp_zebra_process_local_l3vni(ZAPI_CALLBACK_ARGS) zlog_debug("Rx L3-VNI DEL VRF %s VNI %u", vrf_id_to_name(vrf_id), l3vni); + frrtrace(2, frr_bgp, evpn_local_l3vni_del_zrecv, l3vni, vrf_id); + bgp_evpn_local_l3vni_del(l3vni, vrf_id); } @@ -2906,13 +2923,19 @@ static int bgp_zebra_process_local_vni(ZAPI_CALLBACK_ARGS) vrf_id_to_name(vrf_id), vni, vrf_id_to_name(tenant_vrf_id), svi_ifindex); - if (cmd == ZEBRA_VNI_ADD) + if (cmd == ZEBRA_VNI_ADD) { + frrtrace(4, frr_bgp, evpn_local_vni_add_zrecv, vni, vtep_ip, + tenant_vrf_id, mcast_grp); + return bgp_evpn_local_vni_add( bgp, vni, vtep_ip.s_addr != INADDR_ANY ? vtep_ip : bgp->router_id, tenant_vrf_id, mcast_grp, svi_ifindex); - else + } else { + frrtrace(1, frr_bgp, evpn_local_vni_del_zrecv, vni); + return bgp_evpn_local_vni_del(bgp, vni); + } } static int bgp_zebra_process_local_macip(ZAPI_CALLBACK_ARGS) @@ -2968,11 +2991,18 @@ static int bgp_zebra_process_local_macip(ZAPI_CALLBACK_ARGS) &mac, &ip, vni, seqnum, state, esi_to_str(&esi, buf2, sizeof(buf2))); - if (cmd == ZEBRA_MACIP_ADD) + if (cmd == ZEBRA_MACIP_ADD) { + frrtrace(6, frr_bgp, evpn_local_macip_add_zrecv, vni, &mac, &ip, + flags, seqnum, &esi); + return bgp_evpn_local_macip_add(bgp, vni, &mac, &ip, flags, seqnum, &esi); - else + } else { + frrtrace(4, frr_bgp, evpn_local_macip_del_zrecv, vni, &mac, &ip, + state); + return bgp_evpn_local_macip_del(bgp, vni, &mac, &ip, state); + } } static void bgp_zebra_process_local_ip_prefix(ZAPI_CALLBACK_ARGS) diff --git a/debian/frr-pythontools.install b/debian/frr-pythontools.install index 5f7eaebed5..820895ce68 100644 --- a/debian/frr-pythontools.install +++ b/debian/frr-pythontools.install @@ -1,2 +1,3 @@ usr/lib/frr/frr-reload.py usr/lib/frr/generate_support_bundle.py +usr/lib/frr/frr_babeltrace.py diff --git a/redhat/frr.spec.in b/redhat/frr.spec.in index 066c45f55c..a7286d1878 100644 --- a/redhat/frr.spec.in +++ b/redhat/frr.spec.in @@ -717,6 +717,7 @@ fi %files pythontools %{_sbindir}/generate_support_bundle.py %{_sbindir}/frr-reload.py +%{_sbindir}/frr_babeltrace.py %if 0%{?rhel} > 7 || 0%{?fedora} > 29 %{_sbindir}/__pycache__/* %else @@ -724,6 +725,8 @@ fi %{_sbindir}/generate_support_bundle.pyo %{_sbindir}/frr-reload.pyc %{_sbindir}/frr-reload.pyo +%{_sbindir}/frr_babeltrace.pyc +%{_sbindir}/frr_babeltrace.pyo %endif diff --git a/tools/frr_babeltrace.py b/tools/frr_babeltrace.py index 3058395758..27d830a119 100755 --- a/tools/frr_babeltrace.py +++ b/tools/frr_babeltrace.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -''' +""" Usage: frr_babeltrace.py trace_path FRR pushes data into lttng tracepoints in the least overhead way possible @@ -23,7 +23,7 @@ more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -''' +""" import ipaddress import socket @@ -33,56 +33,56 @@ import babeltrace ########################### common parsers - start ############################ def print_ip_addr(field_val): - ''' + """ pretty print "struct ipaddr" - ''' + """ if field_val[0] == socket.AF_INET: addr = [str(fv) for fv in field_val[4:8]] - return str(ipaddress.IPv4Address('.'.join(addr))) + return str(ipaddress.IPv4Address(".".join(addr))) if field_val[0] == socket.AF_INET6: - tmp = ''.join('%02x' % fb for fb in field_val[4:]) + tmp = "".join("%02x" % fb for fb in field_val[4:]) addr = [] while tmp: addr.append(tmp[:4]) tmp = tmp[4:] - addr = ':'.join(addr) + addr = ":".join(addr) return str(ipaddress.IPv6Address(addr)) if not field_val[0]: - return '' + return "" return field_val def print_mac(field_val): - ''' + """ pretty print "u8 mac[6]" - ''' - return ':'.join('%02x' % fb for fb in field_val) + """ + return ":".join("%02x" % fb for fb in field_val) def print_net_ipv4_addr(field_val): - ''' + """ pretty print ctf_integer_network ipv4 - ''' + """ return str(ipaddress.IPv4Address(field_val)) def print_esi(field_val): - ''' + """ pretty print ethernet segment id, esi_t - ''' - return ':'.join('%02x' % fb for fb in field_val) + """ + return ":".join("%02x" % fb for fb in field_val) def get_field_list(event): - ''' + """ only fetch fields added via the TP, skip metadata etc. - ''' + """ return event.field_list_with_scope(babeltrace.CTFScope.EVENT_FIELDS) def parse_event(event, field_parsers): - ''' + """ Wild card event parser; doesn't make things any prettier - ''' + """ field_list = get_field_list(event) field_info = {} for field in field_list: @@ -96,7 +96,7 @@ def parse_event(event, field_parsers): ############################ evpn parsers - start ############################# def parse_frr_bgp_evpn_mac_ip_zsend(event): - ''' + """ bgp evpn mac-ip parser; raw format - ctf_array(unsigned char, mac, &pfx->prefix.macip_addr.mac, sizeof(struct ethaddr)) @@ -104,53 +104,156 @@ def parse_frr_bgp_evpn_mac_ip_zsend(event): sizeof(struct ipaddr)) ctf_integer_network_hex(unsigned int, vtep, vtep.s_addr) ctf_array(unsigned char, esi, esi, sizeof(esi_t)) - ''' - field_parsers = {'ip': print_ip_addr, - 'mac': print_mac, - 'esi': print_esi, - 'vtep': print_net_ipv4_addr} + """ + field_parsers = {"ip": print_ip_addr, + "mac": print_mac, + "esi": print_esi, + "vtep": print_net_ipv4_addr} parse_event(event, field_parsers) def parse_frr_bgp_evpn_bum_vtep_zsend(event): - ''' + """ bgp evpn bum-vtep parser; raw format - ctf_integer_network_hex(unsigned int, vtep, pfx->prefix.imet_addr.ip.ipaddr_v4.s_addr) - ''' - field_parsers = {'vtep': print_net_ipv4_addr} + """ + field_parsers = {"vtep": print_net_ipv4_addr} parse_event(event, field_parsers) def parse_frr_bgp_evpn_mh_nh_rmac_send(event): - ''' + """ bgp evpn nh-rmac parser; raw format - ctf_array(unsigned char, rmac, &nh->rmac, sizeof(struct ethaddr)) - ''' - field_parsers = {'rmac': print_mac} + """ + field_parsers = {"rmac": print_mac} parse_event(event, field_parsers) -############################ evpn parsers - end ############################# +def parse_frr_bgp_evpn_mh_local_es_add_zrecv(event): + """ + bgp evpn local-es parser; raw format - + ctf_array(unsigned char, esi, esi, sizeof(esi_t)) + ctf_integer_network_hex(unsigned int, vtep, vtep.s_addr) + """ + field_parsers = {"esi": print_esi, + "vtep": print_net_ipv4_addr} + + parse_event(event, field_parsers) + +def parse_frr_bgp_evpn_mh_local_es_del_zrecv(event): + """ + bgp evpn local-es parser; raw format - + ctf_array(unsigned char, esi, esi, sizeof(esi_t)) + """ + field_parsers = {"esi": print_esi} + + parse_event(event, field_parsers) + +def parse_frr_bgp_evpn_mh_local_es_evi_add_zrecv(event): + """ + bgp evpn local-es-evi parser; raw format - + ctf_array(unsigned char, esi, esi, sizeof(esi_t)) + """ + field_parsers = {"esi": print_esi} + + parse_event(event, field_parsers) + +def parse_frr_bgp_evpn_mh_local_es_evi_del_zrecv(event): + """ + bgp evpn local-es-evi parser; raw format - + ctf_array(unsigned char, esi, esi, sizeof(esi_t)) + """ + field_parsers = {"esi": print_esi} + + parse_event(event, field_parsers) + +def parse_frr_bgp_evpn_local_vni_add_zrecv(event): + """ + bgp evpn local-vni parser; raw format - + ctf_integer_network_hex(unsigned int, vtep, vtep.s_addr) + ctf_integer_network_hex(unsigned int, mc_grp, mc_grp.s_addr) + """ + field_parsers = {"vtep": print_net_ipv4_addr, + "mc_grp": print_net_ipv4_addr} + + parse_event(event, field_parsers) + +def parse_frr_bgp_evpn_local_l3vni_add_zrecv(event): + """ + bgp evpn local-l3vni parser; raw format - + ctf_integer_network_hex(unsigned int, vtep, vtep.s_addr) + ctf_array(unsigned char, svi_rmac, svi_rmac, sizeof(struct ethaddr)) + ctf_array(unsigned char, vrr_rmac, vrr_rmac, sizeof(struct ethaddr)) + """ + field_parsers = {"vtep": print_net_ipv4_addr, + "svi_rmac": print_mac, + "vrr_rmac": print_mac} + + parse_event(event, field_parsers) + +def parse_frr_bgp_evpn_local_macip_add_zrecv(event): + """ + bgp evpn local-mac-ip parser; raw format - + ctf_array(unsigned char, ip, ip, sizeof(struct ipaddr)) + ctf_array(unsigned char, mac, mac, sizeof(struct ethaddr)) + ctf_array(unsigned char, esi, esi, sizeof(esi_t)) + """ + field_parsers = {"ip": print_ip_addr, + "mac": print_mac, + "esi": print_esi} + + parse_event(event, field_parsers) + +def parse_frr_bgp_evpn_local_macip_del_zrecv(event): + """ + bgp evpn local-mac-ip del parser; raw format - + ctf_array(unsigned char, ip, ip, sizeof(struct ipaddr)) + ctf_array(unsigned char, mac, mac, sizeof(struct ethaddr)) + """ + field_parsers = {"ip": print_ip_addr, + "mac": print_mac} + + parse_event(event, field_parsers) + +############################ evpn parsers - end *############################# def main(): - ''' + """ FRR lttng trace output parser; babel trace plugin - ''' - event_parsers = {'frr_bgp:evpn_mac_ip_zsend': + """ + event_parsers = {"frr_bgp:evpn_mac_ip_zsend": parse_frr_bgp_evpn_mac_ip_zsend, - 'frr_bgp:evpn_bum_vtep_zsend': + "frr_bgp:evpn_bum_vtep_zsend": parse_frr_bgp_evpn_bum_vtep_zsend, - 'frr_bgp:evpn_mh_nh_rmac_zsend': - parse_frr_bgp_evpn_mh_nh_rmac_send} + "frr_bgp:evpn_mh_nh_rmac_zsend": + parse_frr_bgp_evpn_mh_nh_rmac_send, + "frr_bgp:evpn_mh_local_es_add_zrecv": + parse_frr_bgp_evpn_mh_local_es_add_zrecv, + "frr_bgp:evpn_mh_local_es_del_zrecv": + parse_frr_bgp_evpn_mh_local_es_del_zrecv, + "frr_bgp:evpn_mh_local_es_evi_add_zrecv": + 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_local_vni_add_zrecv": + parse_frr_bgp_evpn_local_vni_add_zrecv, + "frr_bgp:evpn_local_l3vni_add_zrecv": + parse_frr_bgp_evpn_local_l3vni_add_zrecv, + "frr_bgp:evpn_local_macip_add_zrecv": + parse_frr_bgp_evpn_local_macip_add_zrecv, + "frr_bgp:evpn_local_macip_del_zrecv": + parse_frr_bgp_evpn_local_macip_del_zrecv, +} # get the trace path from the first command line argument trace_path = sys.argv[1] # grab events trace_collection = babeltrace.TraceCollection() - trace_collection.add_traces_recursive(trace_path, 'ctf') + trace_collection.add_traces_recursive(trace_path, "ctf") for event in trace_collection.events: if event.name in event_parsers: @@ -159,5 +262,5 @@ def main(): else: parse_event(event, {}) -if __name__ == '__main__': +if __name__ == "__main__": main() diff --git a/tools/subdir.am b/tools/subdir.am index e4b9ecd84f..64ca0bd514 100644 --- a/tools/subdir.am +++ b/tools/subdir.am @@ -21,6 +21,7 @@ sbin_SCRIPTS += \ tools/frrcommon.sh \ tools/frrinit.sh \ tools/generate_support_bundle.py \ + tools/frr_babeltrace.py \ tools/watchfrr.sh \ # end @@ -58,6 +59,7 @@ EXTRA_DIST += \ tools/frr.service \ tools/frr@.service \ tools/generate_support_bundle.py \ + tools/frr_babeltrace.py \ tools/multiple-bgpd.sh \ tools/rrcheck.pl \ tools/rrlookup.pl \