]> git.proxmox.com Git - mirror_frr.git/blob - tools/frr_babeltrace.py
Merge pull request #12845 from sri-mohan1/sri-mohan-ldp
[mirror_frr.git] / tools / frr_babeltrace.py
1 #!/usr/bin/env python3
2 # SPDX-License-Identifier: GPL-2.0-or-later
3 """
4 Usage: frr_babeltrace.py trace_path
5
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
9 that pretty printing.
10
11 Copyright (C) 2021 NVIDIA Corporation
12 Anuradha Karuppiah
13 """
14
15 import ipaddress
16 import socket
17 import sys
18
19 import babeltrace
20
21 ########################### common parsers - start ############################
22 def print_ip_addr(field_val):
23 """
24 pretty print "struct ipaddr"
25 """
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)))
29
30 if field_val[0] == socket.AF_INET6:
31 tmp = "".join("%02x" % fb for fb in field_val[4:])
32 addr = []
33 while tmp:
34 addr.append(tmp[:4])
35 tmp = tmp[4:]
36 addr = ":".join(addr)
37 return str(ipaddress.IPv6Address(addr))
38
39 if not field_val[0]:
40 return ""
41
42 return field_val
43
44
45 def print_mac(field_val):
46 """
47 pretty print "u8 mac[6]"
48 """
49 return ":".join("%02x" % fb for fb in field_val)
50
51 def print_net_ipv4_addr(field_val):
52 """
53 pretty print ctf_integer_network ipv4
54 """
55 return str(ipaddress.IPv4Address(field_val))
56
57 def print_esi(field_val):
58 """
59 pretty print ethernet segment id, esi_t
60 """
61 return ":".join("%02x" % fb for fb in field_val)
62
63 def get_field_list(event):
64 """
65 only fetch fields added via the TP, skip metadata etc.
66 """
67 return event.field_list_with_scope(babeltrace.CTFScope.EVENT_FIELDS)
68
69 def parse_event(event, field_parsers):
70 """
71 Wild card event parser; doesn't make things any prettier
72 """
73 field_list = get_field_list(event)
74 field_info = {}
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))
79 else:
80 field_info[field] = event.get(field)
81 print(event.name, field_info)
82 ############################ common parsers - end #############################
83
84 ############################ evpn parsers - start #############################
85 def parse_frr_bgp_evpn_mac_ip_zsend(event):
86 """
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))
94 """
95 field_parsers = {"ip": print_ip_addr,
96 "mac": print_mac,
97 "esi": print_esi,
98 "vtep": print_net_ipv4_addr}
99
100 parse_event(event, field_parsers)
101
102 def parse_frr_bgp_evpn_bum_vtep_zsend(event):
103 """
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)
107
108 """
109 field_parsers = {"vtep": print_net_ipv4_addr}
110
111 parse_event(event, field_parsers)
112
113 def parse_frr_bgp_evpn_mh_nh_rmac_send(event):
114 """
115 bgp evpn nh-rmac parser; raw format -
116 ctf_array(unsigned char, rmac, &nh->rmac, sizeof(struct ethaddr))
117 """
118 field_parsers = {"rmac": print_mac}
119
120 parse_event(event, field_parsers)
121
122 def parse_frr_bgp_evpn_mh_local_es_add_zrecv(event):
123 """
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)
127 """
128 field_parsers = {"esi": print_esi,
129 "vtep": print_net_ipv4_addr}
130
131 parse_event(event, field_parsers)
132
133 def parse_frr_bgp_evpn_mh_local_es_del_zrecv(event):
134 """
135 bgp evpn local-es parser; raw format -
136 ctf_array(unsigned char, esi, esi, sizeof(esi_t))
137 """
138 field_parsers = {"esi": print_esi}
139
140 parse_event(event, field_parsers)
141
142 def parse_frr_bgp_evpn_mh_local_es_evi_add_zrecv(event):
143 """
144 bgp evpn local-es-evi parser; raw format -
145 ctf_array(unsigned char, esi, esi, sizeof(esi_t))
146 """
147 field_parsers = {"esi": print_esi}
148
149 parse_event(event, field_parsers)
150
151 def parse_frr_bgp_evpn_mh_local_es_evi_del_zrecv(event):
152 """
153 bgp evpn local-es-evi parser; raw format -
154 ctf_array(unsigned char, esi, esi, sizeof(esi_t))
155 """
156 field_parsers = {"esi": print_esi}
157
158 parse_event(event, field_parsers)
159
160 def parse_frr_bgp_evpn_local_vni_add_zrecv(event):
161 """
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)
165 """
166 field_parsers = {"vtep": print_net_ipv4_addr,
167 "mc_grp": print_net_ipv4_addr}
168
169 parse_event(event, field_parsers)
170
171 def parse_frr_bgp_evpn_local_l3vni_add_zrecv(event):
172 """
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))
177 """
178 field_parsers = {"vtep": print_net_ipv4_addr,
179 "svi_rmac": print_mac,
180 "vrr_rmac": print_mac}
181
182 parse_event(event, field_parsers)
183
184 def parse_frr_bgp_evpn_local_macip_add_zrecv(event):
185 """
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))
190 """
191 field_parsers = {"ip": print_ip_addr,
192 "mac": print_mac,
193 "esi": print_esi}
194
195 parse_event(event, field_parsers)
196
197 def parse_frr_bgp_evpn_local_macip_del_zrecv(event):
198 """
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))
202 """
203 field_parsers = {"ip": print_ip_addr,
204 "mac": print_mac}
205
206 parse_event(event, field_parsers)
207
208 ############################ evpn parsers - end *#############################
209
210 def main():
211 """
212 FRR lttng trace output parser; babel trace plugin
213 """
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,
236 }
237
238 # get the trace path from the first command line argument
239 trace_path = sys.argv[1]
240
241 # grab events
242 trace_collection = babeltrace.TraceCollection()
243 trace_collection.add_traces_recursive(trace_path, "ctf")
244
245 for event in trace_collection.events:
246 if event.name in event_parsers:
247 event_parser = event_parsers.get(event.name)
248 event_parser(event)
249 else:
250 parse_event(event, {})
251
252 if __name__ == "__main__":
253 main()