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