]> git.proxmox.com Git - mirror_frr.git/blame - tools/frr_babeltrace.py
Merge pull request #10916 from rampxxxx/feat_frr_ubi8_docker
[mirror_frr.git] / tools / frr_babeltrace.py
CommitLineData
23aa35ad 1#!/usr/bin/env python3
32dcd36d 2"""
23aa35ad
AK
3Usage: frr_babeltrace.py trace_path
4
5FRR pushes data into lttng tracepoints in the least overhead way possible
6i.e. as binary-data/crf_arrays. These traces need to be converted into pretty
7strings for easy greping etc. This script is a babeltrace python plugin for
8that pretty printing.
9
10Copyright (C) 2021 NVIDIA Corporation
11Anuradha Karuppiah
12
13This program is free software; you can redistribute it and/or modify it
14under the terms of the GNU General Public License as published by the Free
15Software Foundation; either version 2 of the License, or (at your option)
16any later version.
17
18This program is distributed in the hope that it will be useful, but WITHOUT
19ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
20FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
21more details.
22
23You should have received a copy of the GNU General Public License along
24with this program; see the file COPYING; if not, write to the Free Software
25Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
32dcd36d 26"""
23aa35ad
AK
27
28import ipaddress
29import socket
30import sys
31
32import babeltrace
33
34########################### common parsers - start ############################
35def print_ip_addr(field_val):
32dcd36d 36 """
23aa35ad 37 pretty print "struct ipaddr"
32dcd36d 38 """
23aa35ad
AK
39 if field_val[0] == socket.AF_INET:
40 addr = [str(fv) for fv in field_val[4:8]]
32dcd36d 41 return str(ipaddress.IPv4Address(".".join(addr)))
23aa35ad
AK
42
43 if field_val[0] == socket.AF_INET6:
32dcd36d 44 tmp = "".join("%02x" % fb for fb in field_val[4:])
23aa35ad
AK
45 addr = []
46 while tmp:
47 addr.append(tmp[:4])
48 tmp = tmp[4:]
32dcd36d 49 addr = ":".join(addr)
23aa35ad
AK
50 return str(ipaddress.IPv6Address(addr))
51
52 if not field_val[0]:
32dcd36d 53 return ""
23aa35ad
AK
54
55 return field_val
56
57
58def print_mac(field_val):
32dcd36d 59 """
23aa35ad 60 pretty print "u8 mac[6]"
32dcd36d
AK
61 """
62 return ":".join("%02x" % fb for fb in field_val)
23aa35ad
AK
63
64def print_net_ipv4_addr(field_val):
32dcd36d 65 """
23aa35ad 66 pretty print ctf_integer_network ipv4
32dcd36d 67 """
23aa35ad
AK
68 return str(ipaddress.IPv4Address(field_val))
69
70def print_esi(field_val):
32dcd36d 71 """
23aa35ad 72 pretty print ethernet segment id, esi_t
32dcd36d
AK
73 """
74 return ":".join("%02x" % fb for fb in field_val)
23aa35ad
AK
75
76def get_field_list(event):
32dcd36d 77 """
23aa35ad 78 only fetch fields added via the TP, skip metadata etc.
32dcd36d 79 """
23aa35ad
AK
80 return event.field_list_with_scope(babeltrace.CTFScope.EVENT_FIELDS)
81
82def parse_event(event, field_parsers):
32dcd36d 83 """
23aa35ad 84 Wild card event parser; doesn't make things any prettier
32dcd36d 85 """
23aa35ad
AK
86 field_list = get_field_list(event)
87 field_info = {}
88 for field in field_list:
89 if field in field_parsers:
90 field_parser = field_parsers.get(field)
91 field_info[field] = field_parser(event.get(field))
92 else:
93 field_info[field] = event.get(field)
94 print(event.name, field_info)
95############################ common parsers - end #############################
96
97############################ evpn parsers - start #############################
98def parse_frr_bgp_evpn_mac_ip_zsend(event):
32dcd36d 99 """
23aa35ad
AK
100 bgp evpn mac-ip parser; raw format -
101 ctf_array(unsigned char, mac, &pfx->prefix.macip_addr.mac,
102 sizeof(struct ethaddr))
103 ctf_array(unsigned char, ip, &pfx->prefix.macip_addr.ip,
104 sizeof(struct ipaddr))
105 ctf_integer_network_hex(unsigned int, vtep, vtep.s_addr)
106 ctf_array(unsigned char, esi, esi, sizeof(esi_t))
32dcd36d
AK
107 """
108 field_parsers = {"ip": print_ip_addr,
109 "mac": print_mac,
110 "esi": print_esi,
111 "vtep": print_net_ipv4_addr}
23aa35ad
AK
112
113 parse_event(event, field_parsers)
114
115def parse_frr_bgp_evpn_bum_vtep_zsend(event):
32dcd36d 116 """
23aa35ad
AK
117 bgp evpn bum-vtep parser; raw format -
118 ctf_integer_network_hex(unsigned int, vtep,
119 pfx->prefix.imet_addr.ip.ipaddr_v4.s_addr)
120
32dcd36d
AK
121 """
122 field_parsers = {"vtep": print_net_ipv4_addr}
23aa35ad
AK
123
124 parse_event(event, field_parsers)
125
126def parse_frr_bgp_evpn_mh_nh_rmac_send(event):
32dcd36d 127 """
23aa35ad
AK
128 bgp evpn nh-rmac parser; raw format -
129 ctf_array(unsigned char, rmac, &nh->rmac, sizeof(struct ethaddr))
32dcd36d
AK
130 """
131 field_parsers = {"rmac": print_mac}
23aa35ad
AK
132
133 parse_event(event, field_parsers)
134
a383bfc7 135def parse_frr_bgp_evpn_mh_local_es_add_zrecv(event):
32dcd36d 136 """
a383bfc7
AK
137 bgp evpn local-es parser; raw format -
138 ctf_array(unsigned char, esi, esi, sizeof(esi_t))
139 ctf_integer_network_hex(unsigned int, vtep, vtep.s_addr)
32dcd36d
AK
140 """
141 field_parsers = {"esi": print_esi,
142 "vtep": print_net_ipv4_addr}
a383bfc7
AK
143
144 parse_event(event, field_parsers)
145
146def parse_frr_bgp_evpn_mh_local_es_del_zrecv(event):
32dcd36d 147 """
a383bfc7
AK
148 bgp evpn local-es parser; raw format -
149 ctf_array(unsigned char, esi, esi, sizeof(esi_t))
32dcd36d
AK
150 """
151 field_parsers = {"esi": print_esi}
a383bfc7
AK
152
153 parse_event(event, field_parsers)
154
155def parse_frr_bgp_evpn_mh_local_es_evi_add_zrecv(event):
32dcd36d 156 """
a383bfc7
AK
157 bgp evpn local-es-evi parser; raw format -
158 ctf_array(unsigned char, esi, esi, sizeof(esi_t))
32dcd36d
AK
159 """
160 field_parsers = {"esi": print_esi}
a383bfc7
AK
161
162 parse_event(event, field_parsers)
163
164def parse_frr_bgp_evpn_mh_local_es_evi_del_zrecv(event):
32dcd36d 165 """
a383bfc7
AK
166 bgp evpn local-es-evi parser; raw format -
167 ctf_array(unsigned char, esi, esi, sizeof(esi_t))
32dcd36d
AK
168 """
169 field_parsers = {"esi": print_esi}
a383bfc7
AK
170
171 parse_event(event, field_parsers)
172
173def parse_frr_bgp_evpn_local_vni_add_zrecv(event):
32dcd36d 174 """
a383bfc7
AK
175 bgp evpn local-vni parser; raw format -
176 ctf_integer_network_hex(unsigned int, vtep, vtep.s_addr)
177 ctf_integer_network_hex(unsigned int, mc_grp, mc_grp.s_addr)
32dcd36d
AK
178 """
179 field_parsers = {"vtep": print_net_ipv4_addr,
180 "mc_grp": print_net_ipv4_addr}
a383bfc7
AK
181
182 parse_event(event, field_parsers)
183
184def parse_frr_bgp_evpn_local_l3vni_add_zrecv(event):
32dcd36d 185 """
a383bfc7
AK
186 bgp evpn local-l3vni parser; raw format -
187 ctf_integer_network_hex(unsigned int, vtep, vtep.s_addr)
188 ctf_array(unsigned char, svi_rmac, svi_rmac, sizeof(struct ethaddr))
189 ctf_array(unsigned char, vrr_rmac, vrr_rmac, sizeof(struct ethaddr))
32dcd36d
AK
190 """
191 field_parsers = {"vtep": print_net_ipv4_addr,
192 "svi_rmac": print_mac,
193 "vrr_rmac": print_mac}
a383bfc7
AK
194
195 parse_event(event, field_parsers)
196
197def parse_frr_bgp_evpn_local_macip_add_zrecv(event):
32dcd36d 198 """
a383bfc7
AK
199 bgp evpn local-mac-ip parser; raw format -
200 ctf_array(unsigned char, ip, ip, sizeof(struct ipaddr))
201 ctf_array(unsigned char, mac, mac, sizeof(struct ethaddr))
202 ctf_array(unsigned char, esi, esi, sizeof(esi_t))
32dcd36d
AK
203 """
204 field_parsers = {"ip": print_ip_addr,
205 "mac": print_mac,
206 "esi": print_esi}
a383bfc7
AK
207
208 parse_event(event, field_parsers)
209
210def parse_frr_bgp_evpn_local_macip_del_zrecv(event):
32dcd36d 211 """
a383bfc7
AK
212 bgp evpn local-mac-ip del parser; raw format -
213 ctf_array(unsigned char, ip, ip, sizeof(struct ipaddr))
214 ctf_array(unsigned char, mac, mac, sizeof(struct ethaddr))
32dcd36d
AK
215 """
216 field_parsers = {"ip": print_ip_addr,
217 "mac": print_mac}
a383bfc7
AK
218
219 parse_event(event, field_parsers)
220
221############################ evpn parsers - end *#############################
23aa35ad
AK
222
223def main():
32dcd36d 224 """
23aa35ad 225 FRR lttng trace output parser; babel trace plugin
32dcd36d
AK
226 """
227 event_parsers = {"frr_bgp:evpn_mac_ip_zsend":
23aa35ad 228 parse_frr_bgp_evpn_mac_ip_zsend,
32dcd36d 229 "frr_bgp:evpn_bum_vtep_zsend":
23aa35ad 230 parse_frr_bgp_evpn_bum_vtep_zsend,
32dcd36d 231 "frr_bgp:evpn_mh_nh_rmac_zsend":
a383bfc7 232 parse_frr_bgp_evpn_mh_nh_rmac_send,
32dcd36d 233 "frr_bgp:evpn_mh_local_es_add_zrecv":
a383bfc7 234 parse_frr_bgp_evpn_mh_local_es_add_zrecv,
32dcd36d 235 "frr_bgp:evpn_mh_local_es_del_zrecv":
a383bfc7 236 parse_frr_bgp_evpn_mh_local_es_del_zrecv,
32dcd36d 237 "frr_bgp:evpn_mh_local_es_evi_add_zrecv":
a383bfc7 238 parse_frr_bgp_evpn_mh_local_es_evi_add_zrecv,
32dcd36d 239 "frr_bgp:evpn_mh_local_es_evi_del_zrecv":
a383bfc7 240 parse_frr_bgp_evpn_mh_local_es_evi_del_zrecv,
32dcd36d 241 "frr_bgp:evpn_local_vni_add_zrecv":
a383bfc7 242 parse_frr_bgp_evpn_local_vni_add_zrecv,
32dcd36d 243 "frr_bgp:evpn_local_l3vni_add_zrecv":
a383bfc7 244 parse_frr_bgp_evpn_local_l3vni_add_zrecv,
32dcd36d 245 "frr_bgp:evpn_local_macip_add_zrecv":
a383bfc7 246 parse_frr_bgp_evpn_local_macip_add_zrecv,
32dcd36d 247 "frr_bgp:evpn_local_macip_del_zrecv":
a383bfc7
AK
248 parse_frr_bgp_evpn_local_macip_del_zrecv,
249}
23aa35ad
AK
250
251 # get the trace path from the first command line argument
252 trace_path = sys.argv[1]
253
254 # grab events
255 trace_collection = babeltrace.TraceCollection()
32dcd36d 256 trace_collection.add_traces_recursive(trace_path, "ctf")
23aa35ad
AK
257
258 for event in trace_collection.events:
259 if event.name in event_parsers:
260 event_parser = event_parsers.get(event.name)
261 event_parser(event)
262 else:
263 parse_event(event, {})
264
32dcd36d 265if __name__ == "__main__":
23aa35ad 266 main()