xref: /btstack/tool/dump_pklg.py (revision a0ecb5f3e03de203431a83bfb88217ac1247ef71)
11ca3442bSMatthias Ringwald#!/usr/bin/env python
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 re
151ca3442bSMatthias Ringwaldimport sys
161ca3442bSMatthias Ringwaldimport time
171ca3442bSMatthias Ringwaldimport datetime
181ca3442bSMatthias Ringwald
191ca3442bSMatthias Ringwaldpacket_types = [ "CMD =>", "EVT <=", "ACL =>", "ACL <="]
201ca3442bSMatthias Ringwald
211ca3442bSMatthias Ringwalddef read_net_32(f):
221ca3442bSMatthias Ringwald    a = f.read(1)
23*a0ecb5f3SMatthias Ringwald    if a == '':
24*a0ecb5f3SMatthias Ringwald    	return -1
251ca3442bSMatthias Ringwald    b = f.read(1)
26*a0ecb5f3SMatthias Ringwald    if b == '':
27*a0ecb5f3SMatthias Ringwald    	return -1
281ca3442bSMatthias Ringwald    c = f.read(1)
29*a0ecb5f3SMatthias Ringwald    if c == '':
30*a0ecb5f3SMatthias Ringwald    	return -1
311ca3442bSMatthias Ringwald    d = f.read(1)
32*a0ecb5f3SMatthias Ringwald    if d == '':
33*a0ecb5f3SMatthias Ringwald    	return -1
341ca3442bSMatthias Ringwald    return ord(a) << 24 | ord(b) << 16 | ord(c) << 8 | ord(d)
351ca3442bSMatthias Ringwald
361ca3442bSMatthias Ringwalddef as_hex(data):
371ca3442bSMatthias Ringwald	str_list = []
381ca3442bSMatthias Ringwald	for byte in data:
391ca3442bSMatthias Ringwald	    str_list.append("{0:02x} ".format(ord(byte)))
401ca3442bSMatthias Ringwald	return ''.join(str_list)
411ca3442bSMatthias Ringwald
421ca3442bSMatthias Ringwaldif len(sys.argv) == 1:
431ca3442bSMatthias Ringwald	print 'Dump PacketLogger file'
441ca3442bSMatthias Ringwald	print 'Copyright 2014, BlueKitchen GmbH'
451ca3442bSMatthias Ringwald	print ''
461ca3442bSMatthias Ringwald	print 'Usage: ', sys.argv[0], 'hci_dump.pklg'
471ca3442bSMatthias Ringwald	exit(0)
481ca3442bSMatthias Ringwald
491ca3442bSMatthias Ringwaldinfile = sys.argv[1]
501ca3442bSMatthias Ringwald
511ca3442bSMatthias Ringwaldwith open (infile, 'rb') as fin:
5246b37c0bSMatthias Ringwald	pos = 0
531ca3442bSMatthias Ringwald	try:
541ca3442bSMatthias Ringwald		while True:
551ca3442bSMatthias Ringwald			len     = read_net_32(fin)
56*a0ecb5f3SMatthias Ringwald			if len < 0:
57*a0ecb5f3SMatthias Ringwald				break
581ca3442bSMatthias Ringwald			ts_sec  = read_net_32(fin)
591ca3442bSMatthias Ringwald			ts_usec = read_net_32(fin)
601ca3442bSMatthias Ringwald			type    = ord(fin.read(1))
611ca3442bSMatthias Ringwald			packet_len = len - 9;
6246b37c0bSMatthias Ringwald			if (packet_len > 66000):
6346b37c0bSMatthias Ringwald				print ("Error parsing pklg at offset %u (%x)." % (pos, pos))
6446b37c0bSMatthias Ringwald				break
651ca3442bSMatthias Ringwald			packet  = fin.read(packet_len)
6646b37c0bSMatthias Ringwald			pos     = pos + 4 + len
671ca3442bSMatthias Ringwald			time    = "[%s.%03u]" % (datetime.datetime.fromtimestamp(ts_sec).strftime("%Y-%m-%d %H:%M:%S"), ts_usec / 1000)
681ca3442bSMatthias Ringwald			if type == 0xfc:
691ca3442bSMatthias Ringwald				print time, "LOG", packet
701ca3442bSMatthias Ringwald				continue
711ca3442bSMatthias Ringwald			if type <= 0x03:
721ca3442bSMatthias Ringwald				print time, packet_types[type], as_hex(packet)
731ca3442bSMatthias Ringwald	except TypeError:
7446b37c0bSMatthias Ringwald		print ("Error parsing pklg at offset %u (%x)." % (pos, pos))
751ca3442bSMatthias Ringwald
76