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