From 17348a8fb53ed95e14ea128a031a642ffcdad990 Mon Sep 17 00:00:00 2001 From: Matthias Ringwald Date: Sat, 15 Jan 2022 23:43:11 +0100 Subject: [PATCH] tool/dump_gatt: reconstruct GATT DB from ATT PDUs in pklg --- tool/dump_gatt.py | 265 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 265 insertions(+) create mode 100755 tool/dump_gatt.py diff --git a/tool/dump_gatt.py b/tool/dump_gatt.py new file mode 100755 index 000000000..c5e1591fe --- /dev/null +++ b/tool/dump_gatt.py @@ -0,0 +1,265 @@ +#!/usr/bin/env python3 +# BlueKitchen GmbH (c) 2022 + +# parse PacketLogger and reconstruct GATT DB + +import sys +import datetime +import struct + +def as_hex(data): + str_list = [] + for byte in data: + str_list.append("{0:02x} ".format(byte)) + return ''.join(str_list) + +def as_bd_addr(data): + str_list = [] + for byte in data: + str_list.append("{0:02x}".format(byte)) + return ':'.join(str_list) + +def read_header(f): + bytes_read = f.read(13) + if bytes_read: + return struct.unpack(">IIIB", bytes_read) + else: + return (-1, 0, 0, 0) + +def uuid16_at_offset(data, offset): + return "%04x" % struct.unpack_from("> 12) & 0x03 + con_handle = header & 0x0FFF + connection_for_handle(con_handle).handle_acl(direction_in, pb, data[4:]) + +# globals +connections = {} +local_gatt_server = gatt_server("00:00:00:00:00:00") + +if len(sys.argv) == 1: + print ('Reconstruct GATT interactions from PacketLogger trace file') + print ('Copyright 2022, BlueKitchen GmbH') + print ('') + print ('Usage: ', sys.argv[0], 'hci_dump.pklg') + exit(0) + +infile = sys.argv[1] + +with open (infile, 'rb') as fin: + pos = 0 + try: + while True: + (entry_len, ts_sec, ts_usec, type) = read_header(fin) + if entry_len < 0: + break + packet_len = entry_len - 9; + if (packet_len > 66000): + print ("Error parsing pklg at offset %u (%x)." % (pos, pos)) + break + packet = fin.read(packet_len) + pos = pos + 4 + entry_len + if type == 0x00: + handle_cmd(packet) + elif type == 0x01: + handle_evt(packet) + elif type == 0x02: + handle_acl(packet, False) + elif type == 0x03: + handle_acl(packet, True) + + except TypeError as e: + print(e) + print ("Error parsing pklg at offset %u (%x)." % (pos, pos)) + +for connection in connections: + connection.remote_gatt_server.report()