blob: 618132cbc4f1743f99bd5a09591a0dcba4b79023 [file] [log] [blame]
Alexey Ivanovcc01a9c2019-01-16 09:50:46 -08001#!/usr/bin/python
Adrian Lopezd496d5c2016-08-16 17:49:49 +02002#
jeromemarchand8b17dc32018-08-04 07:09:36 +02003# sslsniff Captures data on read/recv or write/send functions of OpenSSL,
4# GnuTLS and NSS
Adrian Lopezd496d5c2016-08-16 17:49:49 +02005# For Linux, uses BCC, eBPF.
6#
Slava Bacherikov91a79832021-11-21 15:31:49 +02007# USAGE: sslsniff.py [-h] [-p PID] [-u UID] [-x] [-c COMM] [-o] [-g] [-n] [-d]
Tao Xuba860862022-01-28 03:28:41 +08008# [--hexdump] [--max-buffer-size SIZE] [-l] [--handshake]
Adrian Lopezd9cc3de2016-08-17 14:08:08 +02009#
Adrian Lopezd496d5c2016-08-16 17:49:49 +020010# Licensed under the Apache License, Version 2.0 (the "License")
11#
12# 12-Aug-2016 Adrian Lopez Created this.
13# 13-Aug-2016 Mark Drayton Fix SSL_Read
Adrian Lopezd9cc3de2016-08-17 14:08:08 +020014# 17-Aug-2016 Adrian Lopez Capture GnuTLS and add options
15#
Adrian Lopezd496d5c2016-08-16 17:49:49 +020016
17from __future__ import print_function
Adrian Lopezd496d5c2016-08-16 17:49:49 +020018from bcc import BPF
Adrian Lopezd9cc3de2016-08-17 14:08:08 +020019import argparse
Matthias Hörmann1b7aab12020-07-03 13:54:24 +020020import binascii
21import textwrap
Adrian Lopezd9cc3de2016-08-17 14:08:08 +020022
23# arguments
24examples = """examples:
25 ./sslsniff # sniff OpenSSL and GnuTLS functions
26 ./sslsniff -p 181 # sniff PID 181 only
Slava Bacherikov91a79832021-11-21 15:31:49 +020027 ./sslsniff -u 1000 # sniff only UID 1000
Adrian Lopezd9cc3de2016-08-17 14:08:08 +020028 ./sslsniff -c curl # sniff curl command only
29 ./sslsniff --no-openssl # don't show OpenSSL calls
30 ./sslsniff --no-gnutls # don't show GnuTLS calls
jeromemarchand8b17dc32018-08-04 07:09:36 +020031 ./sslsniff --no-nss # don't show NSS calls
Matthias Hörmannd40c3a72020-07-03 14:31:32 +020032 ./sslsniff --hexdump # show data as hex instead of trying to decode it as UTF-8
Slava Bacherikov91a79832021-11-21 15:31:49 +020033 ./sslsniff -x # show process UID and TID
Tao Xuba860862022-01-28 03:28:41 +080034 ./sslsniff -l # show function latency
35 ./sslsniff -l --handshake # show SSL handshake latency
Adrian Lopezd9cc3de2016-08-17 14:08:08 +020036"""
37parser = argparse.ArgumentParser(
38 description="Sniff SSL data",
39 formatter_class=argparse.RawDescriptionHelpFormatter,
40 epilog=examples)
htbegin5ac5d6e2017-05-24 22:53:17 +080041parser.add_argument("-p", "--pid", type=int, help="sniff this PID only.")
Slava Bacherikov91a79832021-11-21 15:31:49 +020042parser.add_argument("-u", "--uid", type=int, default=None,
43 help="sniff this UID only.")
44parser.add_argument("-x", "--extra", action="store_true",
45 help="show extra fields (UID, TID)")
Adrian Lopezd9cc3de2016-08-17 14:08:08 +020046parser.add_argument("-c", "--comm",
47 help="sniff only commands matching string.")
48parser.add_argument("-o", "--no-openssl", action="store_false", dest="openssl",
49 help="do not show OpenSSL calls.")
50parser.add_argument("-g", "--no-gnutls", action="store_false", dest="gnutls",
51 help="do not show GnuTLS calls.")
jeromemarchand8b17dc32018-08-04 07:09:36 +020052parser.add_argument("-n", "--no-nss", action="store_false", dest="nss",
53 help="do not show NSS calls.")
Adrian Lopezd9cc3de2016-08-17 14:08:08 +020054parser.add_argument('-d', '--debug', dest='debug', action='count', default=0,
55 help='debug mode.')
Nathan Scottcf0792f2018-02-02 16:56:50 +110056parser.add_argument("--ebpf", action="store_true",
57 help=argparse.SUPPRESS)
Matthias Hörmannd91b31a2020-07-06 09:38:39 +020058parser.add_argument("--hexdump", action="store_true", dest="hexdump",
59 help="show data as hexdump instead of trying to decode it as UTF-8")
Slava Bacherikov91a79832021-11-21 15:31:49 +020060parser.add_argument('--max-buffer-size', type=int, default=8192,
61 help='Size of captured buffer')
Tao Xuba860862022-01-28 03:28:41 +080062parser.add_argument("-l", "--latency", action="store_true",
63 help="show function latency")
64parser.add_argument("--handshake", action="store_true",
65 help="show SSL handshake latency, enabled only if latency option is on.")
Adrian Lopezd9cc3de2016-08-17 14:08:08 +020066args = parser.parse_args()
67
Adrian Lopezd496d5c2016-08-16 17:49:49 +020068
69prog = """
70#include <linux/ptrace.h>
71#include <linux/sched.h> /* For TASK_COMM_LEN */
72
Slava Bacherikov91a79832021-11-21 15:31:49 +020073#define MAX_BUF_SIZE __MAX_BUF_SIZE__
74
Adrian Lopezd496d5c2016-08-16 17:49:49 +020075struct probe_SSL_data_t {
76 u64 timestamp_ns;
Tao Xuba860862022-01-28 03:28:41 +080077 u64 delta_ns;
Adrian Lopezd496d5c2016-08-16 17:49:49 +020078 u32 pid;
Slava Bacherikov91a79832021-11-21 15:31:49 +020079 u32 tid;
80 u32 uid;
Adrian Lopezd496d5c2016-08-16 17:49:49 +020081 u32 len;
Slava Bacherikov91a79832021-11-21 15:31:49 +020082 int buf_filled;
Tao Xuba860862022-01-28 03:28:41 +080083 int rw;
Slava Bacherikov91a79832021-11-21 15:31:49 +020084 char comm[TASK_COMM_LEN];
85 u8 buf[MAX_BUF_SIZE];
Adrian Lopezd496d5c2016-08-16 17:49:49 +020086};
87
Slava Bacherikov91a79832021-11-21 15:31:49 +020088#define BASE_EVENT_SIZE ((size_t)(&((struct probe_SSL_data_t*)0)->buf))
89#define EVENT_SIZE(X) (BASE_EVENT_SIZE + ((size_t)(X)))
90
Slava Bacherikov91a79832021-11-21 15:31:49 +020091BPF_PERCPU_ARRAY(ssl_data, struct probe_SSL_data_t, 1);
Tao Xuba860862022-01-28 03:28:41 +080092BPF_PERF_OUTPUT(perf_SSL_rw);
Adrian Lopezd496d5c2016-08-16 17:49:49 +020093
Tao Xuba860862022-01-28 03:28:41 +080094BPF_HASH(start_ns, u32);
95BPF_HASH(bufs, u32, u64);
96
97int probe_SSL_rw_enter(struct pt_regs *ctx, void *ssl, void *buf, int num) {
Slava Bacherikov91a79832021-11-21 15:31:49 +020098 int ret;
99 u32 zero = 0;
Hengqi Chen151fe192021-05-16 17:18:27 +0800100 u64 pid_tgid = bpf_get_current_pid_tgid();
101 u32 pid = pid_tgid >> 32;
Slava Bacherikov91a79832021-11-21 15:31:49 +0200102 u32 tid = pid_tgid;
103 u32 uid = bpf_get_current_uid_gid();
Tao Xuba860862022-01-28 03:28:41 +0800104 u64 ts = bpf_ktime_get_ns();
Hengqi Chen151fe192021-05-16 17:18:27 +0800105
Slava Bacherikov91a79832021-11-21 15:31:49 +0200106 PID_FILTER
107 UID_FILTER
Adrian Lopezd9cc3de2016-08-17 14:08:08 +0200108
Hengqi Chen151fe192021-05-16 17:18:27 +0800109 bufs.update(&tid, (u64*)&buf);
Tao Xuba860862022-01-28 03:28:41 +0800110 start_ns.update(&tid, &ts);
Adrian Lopezd496d5c2016-08-16 17:49:49 +0200111 return 0;
112}
113
Tao Xuba860862022-01-28 03:28:41 +0800114static int SSL_exit(struct pt_regs *ctx, int rw) {
115 int ret;
Slava Bacherikov91a79832021-11-21 15:31:49 +0200116 u32 zero = 0;
Hengqi Chen151fe192021-05-16 17:18:27 +0800117 u64 pid_tgid = bpf_get_current_pid_tgid();
118 u32 pid = pid_tgid >> 32;
119 u32 tid = (u32)pid_tgid;
Slava Bacherikov91a79832021-11-21 15:31:49 +0200120 u32 uid = bpf_get_current_uid_gid();
Tao Xuba860862022-01-28 03:28:41 +0800121 u64 ts = bpf_ktime_get_ns();
Hengqi Chen151fe192021-05-16 17:18:27 +0800122
Slava Bacherikov91a79832021-11-21 15:31:49 +0200123 PID_FILTER
124 UID_FILTER
Adrian Lopezd9cc3de2016-08-17 14:08:08 +0200125
Hengqi Chen151fe192021-05-16 17:18:27 +0800126 u64 *bufp = bufs.lookup(&tid);
Slava Bacherikov91a79832021-11-21 15:31:49 +0200127 if (bufp == 0)
Adrian Lopezd496d5c2016-08-16 17:49:49 +0200128 return 0;
Adrian Lopezd496d5c2016-08-16 17:49:49 +0200129
Tao Xuba860862022-01-28 03:28:41 +0800130 u64 *tsp = start_ns.lookup(&tid);
131 if (tsp == 0)
132 return 0;
133
Slava Bacherikov91a79832021-11-21 15:31:49 +0200134 int len = PT_REGS_RC(ctx);
Tao Xuba860862022-01-28 03:28:41 +0800135 if (len <= 0) // no data
Slava Bacherikov91a79832021-11-21 15:31:49 +0200136 return 0;
Adrian Lopezd496d5c2016-08-16 17:49:49 +0200137
Slava Bacherikov91a79832021-11-21 15:31:49 +0200138 struct probe_SSL_data_t *data = ssl_data.lookup(&zero);
139 if (!data)
140 return 0;
Adrian Lopezd496d5c2016-08-16 17:49:49 +0200141
Tao Xuba860862022-01-28 03:28:41 +0800142 data->timestamp_ns = ts;
143 data->delta_ns = ts - *tsp;
Slava Bacherikov91a79832021-11-21 15:31:49 +0200144 data->pid = pid;
145 data->tid = tid;
146 data->uid = uid;
147 data->len = (u32)len;
148 data->buf_filled = 0;
Tao Xuba860862022-01-28 03:28:41 +0800149 data->rw = rw;
Slava Bacherikov91a79832021-11-21 15:31:49 +0200150 u32 buf_copy_size = min((size_t)MAX_BUF_SIZE, (size_t)len);
151
152 bpf_get_current_comm(&data->comm, sizeof(data->comm));
153
154 if (bufp != 0)
155 ret = bpf_probe_read_user(&data->buf, buf_copy_size, (char *)*bufp);
Adrian Lopezd496d5c2016-08-16 17:49:49 +0200156
Hengqi Chen151fe192021-05-16 17:18:27 +0800157 bufs.delete(&tid);
Tao Xuba860862022-01-28 03:28:41 +0800158 start_ns.delete(&tid);
Adrian Lopezd496d5c2016-08-16 17:49:49 +0200159
Slava Bacherikov91a79832021-11-21 15:31:49 +0200160 if (!ret)
161 data->buf_filled = 1;
162 else
163 buf_copy_size = 0;
164
Tao Xuba860862022-01-28 03:28:41 +0800165 perf_SSL_rw.perf_submit(ctx, data, EVENT_SIZE(buf_copy_size));
166 return 0;
167}
168
169int probe_SSL_read_exit(struct pt_regs *ctx) {
170 return (SSL_exit(ctx, 0));
171}
172
173int probe_SSL_write_exit(struct pt_regs *ctx) {
174 return (SSL_exit(ctx, 1));
175}
176
177BPF_PERF_OUTPUT(perf_SSL_do_handshake);
178
179int probe_SSL_do_handshake_enter(struct pt_regs *ctx, void *ssl) {
180 u64 pid_tgid = bpf_get_current_pid_tgid();
181 u32 pid = pid_tgid >> 32;
182 u32 tid = (u32)pid_tgid;
183 u64 ts = bpf_ktime_get_ns();
184
185 PID_FILTER
186 UID_FILTER
187
188 start_ns.update(&tid, &ts);
189 return 0;
190}
191
192int probe_SSL_do_handshake_exit(struct pt_regs *ctx) {
193 u32 zero = 0;
194 u64 pid_tgid = bpf_get_current_pid_tgid();
195 u32 pid = pid_tgid >> 32;
196 u32 tid = (u32)pid_tgid;
197 u32 uid = bpf_get_current_uid_gid();
198 u64 ts = bpf_ktime_get_ns();
199 int ret;
200
201 PID_FILTER
202 UID_FILTER
203
204 u64 *tsp = start_ns.lookup(&tid);
205 if (tsp == 0)
206 return 0;
207
208 ret = PT_REGS_RC(ctx);
209 if (ret <= 0) // handshake failed
210 return 0;
211
212 struct probe_SSL_data_t *data = ssl_data.lookup(&zero);
213 if (!data)
214 return 0;
215
216 data->timestamp_ns = ts;
217 data->delta_ns = ts - *tsp;
218 data->pid = pid;
219 data->tid = tid;
220 data->uid = uid;
221 data->len = ret;
222 data->buf_filled = 0;
223 data->rw = 2;
224 bpf_get_current_comm(&data->comm, sizeof(data->comm));
225 start_ns.delete(&tid);
226
227 perf_SSL_do_handshake.perf_submit(ctx, data, EVENT_SIZE(0));
Adrian Lopezd496d5c2016-08-16 17:49:49 +0200228 return 0;
229}
230"""
231
Adrian Lopezd9cc3de2016-08-17 14:08:08 +0200232if args.pid:
Slava Bacherikov91a79832021-11-21 15:31:49 +0200233 prog = prog.replace('PID_FILTER', 'if (pid != %d) { return 0; }' % args.pid)
Adrian Lopezd9cc3de2016-08-17 14:08:08 +0200234else:
Slava Bacherikov91a79832021-11-21 15:31:49 +0200235 prog = prog.replace('PID_FILTER', '')
236
237if args.uid is not None:
238 prog = prog.replace('UID_FILTER', 'if (uid != %d) { return 0; }' % args.uid)
239else:
240 prog = prog.replace('UID_FILTER', '')
241
242prog = prog.replace('__MAX_BUF_SIZE__', str(args.max_buffer_size))
Adrian Lopezd9cc3de2016-08-17 14:08:08 +0200243
Nathan Scottcf0792f2018-02-02 16:56:50 +1100244if args.debug or args.ebpf:
Adrian Lopezd9cc3de2016-08-17 14:08:08 +0200245 print(prog)
Nathan Scottcf0792f2018-02-02 16:56:50 +1100246 if args.ebpf:
247 exit()
Adrian Lopezd9cc3de2016-08-17 14:08:08 +0200248
249
Adrian Lopezd496d5c2016-08-16 17:49:49 +0200250b = BPF(text=prog)
251
Adrian Lopezd496d5c2016-08-16 17:49:49 +0200252# It looks like SSL_read's arguments aren't available in a return probe so you
253# need to stash the buffer address in a map on the function entry and read it
254# on its exit (Mark Drayton)
Adrian Lopezd9cc3de2016-08-17 14:08:08 +0200255#
256if args.openssl:
Tao Xuba860862022-01-28 03:28:41 +0800257 b.attach_uprobe(name="ssl", sym="SSL_write",
258 fn_name="probe_SSL_rw_enter", pid=args.pid or -1)
259 b.attach_uretprobe(name="ssl", sym="SSL_write",
260 fn_name="probe_SSL_write_exit", pid=args.pid or -1)
261 b.attach_uprobe(name="ssl", sym="SSL_read",
262 fn_name="probe_SSL_rw_enter", pid=args.pid or -1)
Adrian Lopezd9cc3de2016-08-17 14:08:08 +0200263 b.attach_uretprobe(name="ssl", sym="SSL_read",
Paul Chaignond73c58f2017-01-21 14:25:41 +0100264 fn_name="probe_SSL_read_exit", pid=args.pid or -1)
Tao Xuba860862022-01-28 03:28:41 +0800265 if args.latency and args.handshake:
266 b.attach_uprobe(name="ssl", sym="SSL_do_handshake",
267 fn_name="probe_SSL_do_handshake_enter", pid=args.pid or -1)
268 b.attach_uretprobe(name="ssl", sym="SSL_do_handshake",
269 fn_name="probe_SSL_do_handshake_exit", pid=args.pid or -1)
Adrian Lopezd9cc3de2016-08-17 14:08:08 +0200270
271if args.gnutls:
272 b.attach_uprobe(name="gnutls", sym="gnutls_record_send",
Tao Xuba860862022-01-28 03:28:41 +0800273 fn_name="probe_SSL_rw_enter", pid=args.pid or -1)
274 b.attach_uretprobe(name="gnutls", sym="gnutls_record_send",
275 fn_name="probe_SSL_write_exit", pid=args.pid or -1)
Adrian Lopezd9cc3de2016-08-17 14:08:08 +0200276 b.attach_uprobe(name="gnutls", sym="gnutls_record_recv",
Tao Xuba860862022-01-28 03:28:41 +0800277 fn_name="probe_SSL_rw_enter", pid=args.pid or -1)
Adrian Lopezd9cc3de2016-08-17 14:08:08 +0200278 b.attach_uretprobe(name="gnutls", sym="gnutls_record_recv",
Paul Chaignond73c58f2017-01-21 14:25:41 +0100279 fn_name="probe_SSL_read_exit", pid=args.pid or -1)
Adrian Lopezd496d5c2016-08-16 17:49:49 +0200280
jeromemarchand8b17dc32018-08-04 07:09:36 +0200281if args.nss:
Tao Xuba860862022-01-28 03:28:41 +0800282 b.attach_uprobe(name="nspr4", sym="PR_Write",
283 fn_name="probe_SSL_rw_enter", pid=args.pid or -1)
284 b.attach_uretprobe(name="nspr4", sym="PR_Write",
285 fn_name="probe_SSL_write_exit", pid=args.pid or -1)
286 b.attach_uprobe(name="nspr4", sym="PR_Send",
287 fn_name="probe_SSL_rw_enter", pid=args.pid or -1)
288 b.attach_uretprobe(name="nspr4", sym="PR_Send",
289 fn_name="probe_SSL_write_exit", pid=args.pid or -1)
290 b.attach_uprobe(name="nspr4", sym="PR_Read",
291 fn_name="probe_SSL_rw_enter", pid=args.pid or -1)
jeromemarchand8b17dc32018-08-04 07:09:36 +0200292 b.attach_uretprobe(name="nspr4", sym="PR_Read",
293 fn_name="probe_SSL_read_exit", pid=args.pid or -1)
Tao Xuba860862022-01-28 03:28:41 +0800294 b.attach_uprobe(name="nspr4", sym="PR_Recv",
295 fn_name="probe_SSL_rw_enter", pid=args.pid or -1)
jeromemarchand8b17dc32018-08-04 07:09:36 +0200296 b.attach_uretprobe(name="nspr4", sym="PR_Recv",
297 fn_name="probe_SSL_read_exit", pid=args.pid or -1)
298
Adrian Lopezd496d5c2016-08-16 17:49:49 +0200299# define output data structure in Python
Adrian Lopezd496d5c2016-08-16 17:49:49 +0200300
301
Adrian Lopezd496d5c2016-08-16 17:49:49 +0200302# header
Slava Bacherikov91a79832021-11-21 15:31:49 +0200303header = "%-12s %-18s %-16s %-7s %-6s" % ("FUNC", "TIME(s)", "COMM", "PID", "LEN")
Adrian Lopezd496d5c2016-08-16 17:49:49 +0200304
Slava Bacherikov91a79832021-11-21 15:31:49 +0200305if args.extra:
306 header += " %-7s %-7s" % ("UID", "TID")
307
Tao Xuba860862022-01-28 03:28:41 +0800308if args.latency:
309 header += " %-7s" % ("LAT(ms)")
310
Slava Bacherikov91a79832021-11-21 15:31:49 +0200311print(header)
Adrian Lopezd496d5c2016-08-16 17:49:49 +0200312# process event
313start = 0
314
Tao Xuba860862022-01-28 03:28:41 +0800315def print_event_rw(cpu, data, size):
316 print_event(cpu, data, size, "perf_SSL_rw")
Adrian Lopezd496d5c2016-08-16 17:49:49 +0200317
Tao Xuba860862022-01-28 03:28:41 +0800318def print_event_handshake(cpu, data, size):
319 print_event(cpu, data, size, "perf_SSL_do_handshake")
Adrian Lopezd496d5c2016-08-16 17:49:49 +0200320
Tao Xuba860862022-01-28 03:28:41 +0800321def print_event(cpu, data, size, evt):
Adrian Lopezd496d5c2016-08-16 17:49:49 +0200322 global start
Xiaozhou Liu51d62d32019-02-15 13:03:05 +0800323 event = b[evt].event(data)
Slava Bacherikov91a79832021-11-21 15:31:49 +0200324 if event.len <= args.max_buffer_size:
325 buf_size = event.len
326 else:
327 buf_size = args.max_buffer_size
328
329 if event.buf_filled == 1:
330 buf = bytearray(event.buf[:buf_size])
331 else:
332 buf_size = 0
333 buf = b""
Adrian Lopezd9cc3de2016-08-17 14:08:08 +0200334
335 # Filter events by command
336 if args.comm:
keyolk49fdec62020-10-08 05:45:00 +0000337 if not args.comm == event.comm.decode('utf-8', 'replace'):
Adrian Lopezd9cc3de2016-08-17 14:08:08 +0200338 return
339
Adrian Lopezd496d5c2016-08-16 17:49:49 +0200340 if start == 0:
341 start = event.timestamp_ns
342 time_s = (float(event.timestamp_ns - start)) / 1000000000
343
Tao Xuba860862022-01-28 03:28:41 +0800344 lat_str = "%.3f" % (event.delta_ns / 1000000) if event.delta_ns else "N/A"
345
Adrian Lopezd496d5c2016-08-16 17:49:49 +0200346 s_mark = "-" * 5 + " DATA " + "-" * 5
347
348 e_mark = "-" * 5 + " END DATA " + "-" * 5
349
Slava Bacherikov91a79832021-11-21 15:31:49 +0200350 truncated_bytes = event.len - buf_size
Adrian Lopezd9cc3de2016-08-17 14:08:08 +0200351 if truncated_bytes > 0:
Adrian Lopezd496d5c2016-08-16 17:49:49 +0200352 e_mark = "-" * 5 + " END DATA (TRUNCATED, " + str(truncated_bytes) + \
353 " bytes lost) " + "-" * 5
354
Slava Bacherikov91a79832021-11-21 15:31:49 +0200355 base_fmt = "%(func)-12s %(time)-18.9f %(comm)-16s %(pid)-7d %(len)-6d"
356
357 if args.extra:
358 base_fmt += " %(uid)-7d %(tid)-7d"
359
Tao Xuba860862022-01-28 03:28:41 +0800360 if args.latency:
361 base_fmt += " %(lat)-7s"
362
Slava Bacherikov91a79832021-11-21 15:31:49 +0200363 fmt = ''.join([base_fmt, "\n%(begin)s\n%(data)s\n%(end)s\n\n"])
Matthias Hörmannd91b31a2020-07-06 09:38:39 +0200364 if args.hexdump:
Slava Bacherikov91a79832021-11-21 15:31:49 +0200365 unwrapped_data = binascii.hexlify(buf)
366 data = textwrap.fill(unwrapped_data.decode('utf-8', 'replace'), width=32)
Matthias Hörmannd91b31a2020-07-06 09:38:39 +0200367 else:
Slava Bacherikov91a79832021-11-21 15:31:49 +0200368 data = buf.decode('utf-8', 'replace')
369
Tao Xuba860862022-01-28 03:28:41 +0800370 rw_event = {
371 0: "READ/RECV",
372 1: "WRITE/SEND",
373 2: "HANDSHAKE"
374 }
375
Slava Bacherikov91a79832021-11-21 15:31:49 +0200376 fmt_data = {
Tao Xuba860862022-01-28 03:28:41 +0800377 'func': rw_event[event.rw],
Slava Bacherikov91a79832021-11-21 15:31:49 +0200378 'time': time_s,
Tao Xuba860862022-01-28 03:28:41 +0800379 'lat': lat_str,
Slava Bacherikov91a79832021-11-21 15:31:49 +0200380 'comm': event.comm.decode('utf-8', 'replace'),
381 'pid': event.pid,
382 'tid': event.tid,
383 'uid': event.uid,
384 'len': event.len,
385 'begin': s_mark,
386 'end': e_mark,
387 'data': data
388 }
389
Tao Xuba860862022-01-28 03:28:41 +0800390 # use base_fmt if no buf filled
391 if buf_size == 0:
392 print(base_fmt % fmt_data)
393 else:
394 print(fmt % fmt_data)
Slava Bacherikov91a79832021-11-21 15:31:49 +0200395
Tao Xuba860862022-01-28 03:28:41 +0800396b["perf_SSL_rw"].open_perf_buffer(print_event_rw)
397b["perf_SSL_do_handshake"].open_perf_buffer(print_event_handshake)
Adrian Lopezd496d5c2016-08-16 17:49:49 +0200398while 1:
Jerome Marchand51671272018-12-19 01:57:24 +0100399 try:
400 b.perf_buffer_poll()
401 except KeyboardInterrupt:
402 exit()