xref: /btstack/tool/dump_pklg.py (revision 5c54401929043df982e040eba652f5fd7763ce15)
1*5c544019SMatthias Ringwald#!/usr/bin/env python3
21ca3442bSMatthias Ringwald# BlueKitchen GmbH (c) 2014
31ca3442bSMatthias Ringwald
41ca3442bSMatthias Ringwald# primitive dump for PacketLogger format
51ca3442bSMatthias Ringwald
61ca3442bSMatthias Ringwald# APPLE PacketLogger
71ca3442bSMatthias Ringwald# typedef struct {
81ca3442bSMatthias Ringwald# 	uint32_t	len;
91ca3442bSMatthias Ringwald# 	uint32_t	ts_sec;
101ca3442bSMatthias Ringwald# 	uint32_t	ts_usec;
111ca3442bSMatthias Ringwald# 	uint8_t		type;   // 0xfc for note
121ca3442bSMatthias Ringwald# }
131ca3442bSMatthias Ringwald
141ca3442bSMatthias Ringwaldimport sys
151ca3442bSMatthias Ringwaldimport datetime
161ca3442bSMatthias Ringwald
171ca3442bSMatthias Ringwaldpacket_types = [ "CMD =>", "EVT <=", "ACL =>", "ACL <="]
181ca3442bSMatthias Ringwald
191ca3442bSMatthias Ringwalddef read_net_32(f):
201ca3442bSMatthias Ringwald    a = f.read(1)
21a0ecb5f3SMatthias Ringwald    if a == '':
22a0ecb5f3SMatthias Ringwald    	return -1
231ca3442bSMatthias Ringwald    b = f.read(1)
24a0ecb5f3SMatthias Ringwald    if b == '':
25a0ecb5f3SMatthias Ringwald    	return -1
261ca3442bSMatthias Ringwald    c = f.read(1)
27a0ecb5f3SMatthias Ringwald    if c == '':
28a0ecb5f3SMatthias Ringwald    	return -1
291ca3442bSMatthias Ringwald    d = f.read(1)
30a0ecb5f3SMatthias Ringwald    if d == '':
31a0ecb5f3SMatthias Ringwald    	return -1
321ca3442bSMatthias Ringwald    return ord(a) << 24 | ord(b) << 16 | ord(c) << 8 | ord(d)
331ca3442bSMatthias Ringwald
341ca3442bSMatthias Ringwalddef as_hex(data):
351ca3442bSMatthias Ringwald	str_list = []
361ca3442bSMatthias Ringwald	for byte in data:
37*5c544019SMatthias Ringwald	    str_list.append("{0:02x} ".format(byte))
381ca3442bSMatthias Ringwald	return ''.join(str_list)
391ca3442bSMatthias Ringwald
401ca3442bSMatthias Ringwaldif len(sys.argv) == 1:
41*5c544019SMatthias Ringwald	print ('Dump PacketLogger file')
42*5c544019SMatthias Ringwald	print ('Copyright 2014, BlueKitchen GmbH')
43*5c544019SMatthias Ringwald	print ('')
44*5c544019SMatthias Ringwald	print ('Usage: ', sys.argv[0], 'hci_dump.pklg')
451ca3442bSMatthias Ringwald	exit(0)
461ca3442bSMatthias Ringwald
471ca3442bSMatthias Ringwaldinfile = sys.argv[1]
481ca3442bSMatthias Ringwald
491ca3442bSMatthias Ringwaldwith open (infile, 'rb') as fin:
5046b37c0bSMatthias Ringwald	pos = 0
511ca3442bSMatthias Ringwald	try:
521ca3442bSMatthias Ringwald		while True:
531ca3442bSMatthias Ringwald			len     = read_net_32(fin)
54a0ecb5f3SMatthias Ringwald			if len < 0:
55a0ecb5f3SMatthias Ringwald				break
561ca3442bSMatthias Ringwald			ts_sec  = read_net_32(fin)
571ca3442bSMatthias Ringwald			ts_usec = read_net_32(fin)
581ca3442bSMatthias Ringwald			type    = ord(fin.read(1))
591ca3442bSMatthias Ringwald			packet_len = len - 9;
6046b37c0bSMatthias Ringwald			if (packet_len > 66000):
6146b37c0bSMatthias Ringwald				print ("Error parsing pklg at offset %u (%x)." % (pos, pos))
6246b37c0bSMatthias Ringwald				break
631ca3442bSMatthias Ringwald			packet  = fin.read(packet_len)
6446b37c0bSMatthias Ringwald			pos     = pos + 4 + len
651ca3442bSMatthias Ringwald			time    = "[%s.%03u]" % (datetime.datetime.fromtimestamp(ts_sec).strftime("%Y-%m-%d %H:%M:%S"), ts_usec / 1000)
661ca3442bSMatthias Ringwald			if type == 0xfc:
67*5c544019SMatthias Ringwald				print (time, "LOG", packet.decode('ascii'))
681ca3442bSMatthias Ringwald				continue
691ca3442bSMatthias Ringwald			if type <= 0x03:
70*5c544019SMatthias Ringwald				print (time, packet_types[type], as_hex(packet))
711ca3442bSMatthias Ringwald	except TypeError:
7246b37c0bSMatthias Ringwald		print ("Error parsing pklg at offset %u (%x)." % (pos, pos))
73