]> git.proxmox.com Git - mirror_frr.git/blame - tools/frr_babeltrace.py
Merge pull request #12798 from donaldsharp/rib_match_multicast
[mirror_frr.git] / tools / frr_babeltrace.py
CommitLineData
23aa35ad 1#!/usr/bin/env python3
47a3a827 2# SPDX-License-Identifier: GPL-2.0-or-later
32dcd36d 3"""
23aa35ad
AK
4Usage: frr_babeltrace.py trace_path
5
6FRR pushes data into lttng tracepoints in the least overhead way possible
7i.e. as binary-data/crf_arrays. These traces need to be converted into pretty
8strings for easy greping etc. This script is a babeltrace python plugin for
9that pretty printing.
10
11Copyright (C) 2021 NVIDIA Corporation
12Anuradha Karuppiah
32dcd36d 13"""
23aa35ad
AK
14
15import ipaddress
16import socket
17import sys
18
19import babeltrace
20
21########################### common parsers - start ############################
22def print_ip_addr(field_val):
32dcd36d 23 """
23aa35ad 24 pretty print "struct ipaddr"
32dcd36d 25 """
23aa35ad
AK
26 if field_val[0] == socket.AF_INET:
27 addr = [str(fv) for fv in field_val[4:8]]
32dcd36d 28 return str(ipaddress.IPv4Address(".".join(addr)))
23aa35ad
AK
29
30 if field_val[0] == socket.AF_INET6:
32dcd36d 31 tmp = "".join("%02x" % fb for fb in field_val[4:])
23aa35ad
AK
32 addr = []
33 while tmp:
34 addr.append(tmp[:4])
35 tmp = tmp[4:]
32dcd36d 36 addr = ":".join(addr)
23aa35ad
AK
37 return str(ipaddress.IPv6Address(addr))
38
39 if not field_val[0]:
32dcd36d 40 return ""
23aa35ad
AK
41
42 return field_val
43
44
45def print_mac(field_val):
32dcd36d 46 """
23aa35ad 47 pretty print "u8 mac[6]"
32dcd36d
AK
48 """
49 return ":".join("%02x" % fb for fb in field_val)
23aa35ad
AK
50
51def print_net_ipv4_addr(field_val):
32dcd36d 52 """
23aa35ad 53 pretty print ctf_integer_network ipv4
32dcd36d 54 """
23aa35ad
AK
55 return str(ipaddress.IPv4Address(field_val))
56
57def print_esi(field_val):
32dcd36d 58 """
23aa35ad 59 pretty print ethernet segment id, esi_t
32dcd36d
AK
60 """
61 return ":".join("%02x" % fb for fb in field_val)
23aa35ad
AK
62
63def get_field_list(event):
32dcd36d 64 """
23aa35ad 65 only fetch fields added via the TP, skip metadata etc.
32dcd36d 66 """
23aa35ad
AK
67 return event.field_list_with_scope(babeltrace.CTFScope.EVENT_FIELDS)
68
69def parse_event(event, field_parsers):
32dcd36d 70 """
23aa35ad 71 Wild card event parser; doesn't make things any prettier
32dcd36d 72 """
23aa35ad
AK
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 #############################
85def parse_frr_bgp_evpn_mac_ip_zsend(event):
32dcd36d 86 """
23aa35ad
AK
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))
32dcd36d
AK
94 """
95 field_parsers = {"ip": print_ip_addr,
96 "mac": print_mac,
97 "esi": print_esi,
98 "vtep": print_net_ipv4_addr}
23aa35ad
AK
99
100 parse_event(event, field_parsers)
101
102def parse_frr_bgp_evpn_bum_vtep_zsend(event):
32dcd36d 103 """
23aa35ad
AK
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
32dcd36d
AK
108 """
109 field_parsers = {"vtep": print_net_ipv4_addr}
23aa35ad
AK
110
111 parse_event(event, field_parsers)
112
113def parse_frr_bgp_evpn_mh_nh_rmac_send(event):
32dcd36d 114 """
23aa35ad
AK
115 bgp evpn nh-rmac parser; raw format -
116 ctf_array(unsigned char, rmac, &nh->rmac, sizeof(struct ethaddr))
32dcd36d
AK
117 """
118 field_parsers = {"rmac": print_mac}
23aa35ad
AK
119
120 parse_event(event, field_parsers)
121
a383bfc7 122def parse_frr_bgp_evpn_mh_local_es_add_zrecv(event):
32dcd36d 123 """
a383bfc7
AK
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)
32dcd36d
AK
127 """
128 field_parsers = {"esi": print_esi,
129 "vtep": print_net_ipv4_addr}
a383bfc7
AK
130
131 parse_event(event, field_parsers)
132
133def parse_frr_bgp_evpn_mh_local_es_del_zrecv(event):
32dcd36d 134 """
a383bfc7
AK
135 bgp evpn local-es parser; raw format -
136 ctf_array(unsigned char, esi, esi, sizeof(esi_t))
32dcd36d
AK
137 """
138 field_parsers = {"esi": print_esi}
a383bfc7
AK
139
140 parse_event(event, field_parsers)
141
142def parse_frr_bgp_evpn_mh_local_es_evi_add_zrecv(event):
32dcd36d 143 """
a383bfc7
AK
144 bgp evpn local-es-evi parser; raw format -
145 ctf_array(unsigned char, esi, esi, sizeof(esi_t))
32dcd36d
AK
146 """
147 field_parsers = {"esi": print_esi}
a383bfc7
AK
148
149 parse_event(event, field_parsers)
150
151def parse_frr_bgp_evpn_mh_local_es_evi_del_zrecv(event):
32dcd36d 152 """
a383bfc7
AK
153 bgp evpn local-es-evi parser; raw format -
154 ctf_array(unsigned char, esi, esi, sizeof(esi_t))
32dcd36d
AK
155 """
156 field_parsers = {"esi": print_esi}
a383bfc7
AK
157
158 parse_event(event, field_parsers)
159
160def parse_frr_bgp_evpn_local_vni_add_zrecv(event):
32dcd36d 161 """
a383bfc7
AK
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)
32dcd36d
AK
165 """
166 field_parsers = {"vtep": print_net_ipv4_addr,
167 "mc_grp": print_net_ipv4_addr}
a383bfc7
AK
168
169 parse_event(event, field_parsers)
170
171def parse_frr_bgp_evpn_local_l3vni_add_zrecv(event):
32dcd36d 172 """
a383bfc7
AK
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))
32dcd36d
AK
177 """
178 field_parsers = {"vtep": print_net_ipv4_addr,
179 "svi_rmac": print_mac,
180 "vrr_rmac": print_mac}
a383bfc7
AK
181
182 parse_event(event, field_parsers)
183
184def parse_frr_bgp_evpn_local_macip_add_zrecv(event):
32dcd36d 185 """
a383bfc7
AK
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))
32dcd36d
AK
190 """
191 field_parsers = {"ip": print_ip_addr,
192 "mac": print_mac,
193 "esi": print_esi}
a383bfc7
AK
194
195 parse_event(event, field_parsers)
196
197def parse_frr_bgp_evpn_local_macip_del_zrecv(event):
32dcd36d 198 """
a383bfc7
AK
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))
32dcd36d
AK
202 """
203 field_parsers = {"ip": print_ip_addr,
204 "mac": print_mac}
a383bfc7
AK
205
206 parse_event(event, field_parsers)
207
208############################ evpn parsers - end *#############################
23aa35ad
AK
209
210def main():
32dcd36d 211 """
23aa35ad 212 FRR lttng trace output parser; babel trace plugin
32dcd36d
AK
213 """
214 event_parsers = {"frr_bgp:evpn_mac_ip_zsend":
23aa35ad 215 parse_frr_bgp_evpn_mac_ip_zsend,
32dcd36d 216 "frr_bgp:evpn_bum_vtep_zsend":
23aa35ad 217 parse_frr_bgp_evpn_bum_vtep_zsend,
32dcd36d 218 "frr_bgp:evpn_mh_nh_rmac_zsend":
a383bfc7 219 parse_frr_bgp_evpn_mh_nh_rmac_send,
32dcd36d 220 "frr_bgp:evpn_mh_local_es_add_zrecv":
a383bfc7 221 parse_frr_bgp_evpn_mh_local_es_add_zrecv,
32dcd36d 222 "frr_bgp:evpn_mh_local_es_del_zrecv":
a383bfc7 223 parse_frr_bgp_evpn_mh_local_es_del_zrecv,
32dcd36d 224 "frr_bgp:evpn_mh_local_es_evi_add_zrecv":
a383bfc7 225 parse_frr_bgp_evpn_mh_local_es_evi_add_zrecv,
32dcd36d 226 "frr_bgp:evpn_mh_local_es_evi_del_zrecv":
a383bfc7 227 parse_frr_bgp_evpn_mh_local_es_evi_del_zrecv,
32dcd36d 228 "frr_bgp:evpn_local_vni_add_zrecv":
a383bfc7 229 parse_frr_bgp_evpn_local_vni_add_zrecv,
32dcd36d 230 "frr_bgp:evpn_local_l3vni_add_zrecv":
a383bfc7 231 parse_frr_bgp_evpn_local_l3vni_add_zrecv,
32dcd36d 232 "frr_bgp:evpn_local_macip_add_zrecv":
a383bfc7 233 parse_frr_bgp_evpn_local_macip_add_zrecv,
32dcd36d 234 "frr_bgp:evpn_local_macip_del_zrecv":
a383bfc7
AK
235 parse_frr_bgp_evpn_local_macip_del_zrecv,
236}
23aa35ad
AK
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()
32dcd36d 243 trace_collection.add_traces_recursive(trace_path, "ctf")
23aa35ad
AK
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
32dcd36d 252if __name__ == "__main__":
23aa35ad 253 main()