2 # SPDX-License-Identifier: GPL-2.0-or-later
4 Usage: frr_babeltrace.py trace_path
6 FRR pushes data into lttng tracepoints in the least overhead way possible
7 i.e. as binary-data/crf_arrays. These traces need to be converted into pretty
8 strings for easy greping etc. This script is a babeltrace python plugin for
11 Copyright (C) 2021 NVIDIA Corporation
21 ########################### common parsers - start ############################
22 def print_ip_addr(field_val
):
24 pretty print "struct ipaddr"
26 if field_val
[0] == socket
.AF_INET
:
27 addr
= [str(fv
) for fv
in field_val
[4:8]]
28 return str(ipaddress
.IPv4Address(".".join(addr
)))
30 if field_val
[0] == socket
.AF_INET6
:
31 tmp
= "".join("%02x" % fb
for fb
in field_val
[4:])
37 return str(ipaddress
.IPv6Address(addr
))
45 def print_mac(field_val
):
47 pretty print "u8 mac[6]"
49 return ":".join("%02x" % fb
for fb
in field_val
)
51 def print_net_ipv4_addr(field_val
):
53 pretty print ctf_integer_network ipv4
55 return str(ipaddress
.IPv4Address(field_val
))
57 def print_esi(field_val
):
59 pretty print ethernet segment id, esi_t
61 return ":".join("%02x" % fb
for fb
in field_val
)
63 def get_field_list(event
):
65 only fetch fields added via the TP, skip metadata etc.
67 return event
.field_list_with_scope(babeltrace
.CTFScope
.EVENT_FIELDS
)
69 def parse_event(event
, field_parsers
):
71 Wild card event parser; doesn't make things any prettier
73 field_list
= get_field_list(event
)
75 for field
in field_list
:
76 if field
in field_parsers
:
77 field_parser
= field_parsers
.get(field
)
78 field_info
[field
] = field_parser(event
.get(field
))
80 field_info
[field
] = event
.get(field
)
81 print(event
.name
, field_info
)
82 ############################ common parsers - end #############################
84 ############################ evpn parsers - start #############################
85 def parse_frr_bgp_evpn_mac_ip_zsend(event
):
87 bgp evpn mac-ip parser; raw format -
88 ctf_array(unsigned char, mac, &pfx->prefix.macip_addr.mac,
89 sizeof(struct ethaddr))
90 ctf_array(unsigned char, ip, &pfx->prefix.macip_addr.ip,
91 sizeof(struct ipaddr))
92 ctf_integer_network_hex(unsigned int, vtep, vtep.s_addr)
93 ctf_array(unsigned char, esi, esi, sizeof(esi_t))
95 field_parsers
= {"ip": print_ip_addr
,
98 "vtep": print_net_ipv4_addr
}
100 parse_event(event
, field_parsers
)
102 def parse_frr_bgp_evpn_bum_vtep_zsend(event
):
104 bgp evpn bum-vtep parser; raw format -
105 ctf_integer_network_hex(unsigned int, vtep,
106 pfx->prefix.imet_addr.ip.ipaddr_v4.s_addr)
109 field_parsers
= {"vtep": print_net_ipv4_addr
}
111 parse_event(event
, field_parsers
)
113 def parse_frr_bgp_evpn_mh_nh_rmac_send(event
):
115 bgp evpn nh-rmac parser; raw format -
116 ctf_array(unsigned char, rmac, &nh->rmac, sizeof(struct ethaddr))
118 field_parsers
= {"rmac": print_mac
}
120 parse_event(event
, field_parsers
)
122 def parse_frr_bgp_evpn_mh_local_es_add_zrecv(event
):
124 bgp evpn local-es parser; raw format -
125 ctf_array(unsigned char, esi, esi, sizeof(esi_t))
126 ctf_integer_network_hex(unsigned int, vtep, vtep.s_addr)
128 field_parsers
= {"esi": print_esi
,
129 "vtep": print_net_ipv4_addr
}
131 parse_event(event
, field_parsers
)
133 def parse_frr_bgp_evpn_mh_local_es_del_zrecv(event
):
135 bgp evpn local-es parser; raw format -
136 ctf_array(unsigned char, esi, esi, sizeof(esi_t))
138 field_parsers
= {"esi": print_esi
}
140 parse_event(event
, field_parsers
)
142 def parse_frr_bgp_evpn_mh_local_es_evi_add_zrecv(event
):
144 bgp evpn local-es-evi parser; raw format -
145 ctf_array(unsigned char, esi, esi, sizeof(esi_t))
147 field_parsers
= {"esi": print_esi
}
149 parse_event(event
, field_parsers
)
151 def parse_frr_bgp_evpn_mh_local_es_evi_del_zrecv(event
):
153 bgp evpn local-es-evi parser; raw format -
154 ctf_array(unsigned char, esi, esi, sizeof(esi_t))
156 field_parsers
= {"esi": print_esi
}
158 parse_event(event
, field_parsers
)
160 def parse_frr_bgp_evpn_local_vni_add_zrecv(event
):
162 bgp evpn local-vni parser; raw format -
163 ctf_integer_network_hex(unsigned int, vtep, vtep.s_addr)
164 ctf_integer_network_hex(unsigned int, mc_grp, mc_grp.s_addr)
166 field_parsers
= {"vtep": print_net_ipv4_addr
,
167 "mc_grp": print_net_ipv4_addr
}
169 parse_event(event
, field_parsers
)
171 def parse_frr_bgp_evpn_local_l3vni_add_zrecv(event
):
173 bgp evpn local-l3vni parser; raw format -
174 ctf_integer_network_hex(unsigned int, vtep, vtep.s_addr)
175 ctf_array(unsigned char, svi_rmac, svi_rmac, sizeof(struct ethaddr))
176 ctf_array(unsigned char, vrr_rmac, vrr_rmac, sizeof(struct ethaddr))
178 field_parsers
= {"vtep": print_net_ipv4_addr
,
179 "svi_rmac": print_mac
,
180 "vrr_rmac": print_mac
}
182 parse_event(event
, field_parsers
)
184 def parse_frr_bgp_evpn_local_macip_add_zrecv(event
):
186 bgp evpn local-mac-ip parser; raw format -
187 ctf_array(unsigned char, ip, ip, sizeof(struct ipaddr))
188 ctf_array(unsigned char, mac, mac, sizeof(struct ethaddr))
189 ctf_array(unsigned char, esi, esi, sizeof(esi_t))
191 field_parsers
= {"ip": print_ip_addr
,
195 parse_event(event
, field_parsers
)
197 def parse_frr_bgp_evpn_local_macip_del_zrecv(event
):
199 bgp evpn local-mac-ip del parser; raw format -
200 ctf_array(unsigned char, ip, ip, sizeof(struct ipaddr))
201 ctf_array(unsigned char, mac, mac, sizeof(struct ethaddr))
203 field_parsers
= {"ip": print_ip_addr
,
206 parse_event(event
, field_parsers
)
208 ############################ evpn parsers - end *#############################
212 FRR lttng trace output parser; babel trace plugin
214 event_parsers
= {"frr_bgp:evpn_mac_ip_zsend":
215 parse_frr_bgp_evpn_mac_ip_zsend
,
216 "frr_bgp:evpn_bum_vtep_zsend":
217 parse_frr_bgp_evpn_bum_vtep_zsend
,
218 "frr_bgp:evpn_mh_nh_rmac_zsend":
219 parse_frr_bgp_evpn_mh_nh_rmac_send
,
220 "frr_bgp:evpn_mh_local_es_add_zrecv":
221 parse_frr_bgp_evpn_mh_local_es_add_zrecv
,
222 "frr_bgp:evpn_mh_local_es_del_zrecv":
223 parse_frr_bgp_evpn_mh_local_es_del_zrecv
,
224 "frr_bgp:evpn_mh_local_es_evi_add_zrecv":
225 parse_frr_bgp_evpn_mh_local_es_evi_add_zrecv
,
226 "frr_bgp:evpn_mh_local_es_evi_del_zrecv":
227 parse_frr_bgp_evpn_mh_local_es_evi_del_zrecv
,
228 "frr_bgp:evpn_local_vni_add_zrecv":
229 parse_frr_bgp_evpn_local_vni_add_zrecv
,
230 "frr_bgp:evpn_local_l3vni_add_zrecv":
231 parse_frr_bgp_evpn_local_l3vni_add_zrecv
,
232 "frr_bgp:evpn_local_macip_add_zrecv":
233 parse_frr_bgp_evpn_local_macip_add_zrecv
,
234 "frr_bgp:evpn_local_macip_del_zrecv":
235 parse_frr_bgp_evpn_local_macip_del_zrecv
,
238 # get the trace path from the first command line argument
239 trace_path
= sys
.argv
[1]
242 trace_collection
= babeltrace
.TraceCollection()
243 trace_collection
.add_traces_recursive(trace_path
, "ctf")
245 for event
in trace_collection
.events
:
246 if event
.name
in event_parsers
:
247 event_parser
= event_parsers
.get(event
.name
)
250 parse_event(event
, {})
252 if __name__
== "__main__":