Merge pull request #9730 from AnuradhaKaruppiah/evpn-recv-lttng

bgp-evpn: lttng TPs for events received from zebra
This commit is contained in:
Donatas Abraitis 2021-10-18 10:17:19 +03:00 committed by GitHub
commit e9f7b2b597
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 327 additions and 47 deletions

View File

@ -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 <lttng/tracepoint-event.h>

View File

@ -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)

View File

@ -1,2 +1,3 @@
usr/lib/frr/frr-reload.py
usr/lib/frr/generate_support_bundle.py
usr/lib/frr/frr_babeltrace.py

View File

@ -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

View File

@ -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()

View File

@ -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 \