diff options
author | 2021-03-07 15:04:33 -0800 | |
---|---|---|
committer | 2022-05-05 18:56:34 +0200 | |
commit | 34629755cebc5fb6f9b6923c9a66649acd28ba53 (patch) | |
tree | b7448c365d9ed1b620a49c01eeade565d91046d6 | |
parent | c0a3a345eae197c2e96c3bbe8740046d59e6df9e (diff) | |
download | libimobiledevice-34629755cebc5fb6f9b6923c9a66649acd28ba53.tar.gz libimobiledevice-34629755cebc5fb6f9b6923c9a66649acd28ba53.tar.bz2 |
idevicebtlogger: Switch to using DLT_BLUETOOTH_HCI_H4_WITH_PHDR (201) and capture direction for better decoding in wireshark.
-rw-r--r-- | tools/idevicebtlogger.c | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/tools/idevicebtlogger.c b/tools/idevicebtlogger.c index 48be01a..8728ef0 100644 --- a/tools/idevicebtlogger.c +++ b/tools/idevicebtlogger.c | |||
@@ -45,6 +45,10 @@ | |||
45 | #include <libimobiledevice/bt_packet_logger.h> | 45 | #include <libimobiledevice/bt_packet_logger.h> |
46 | #include <pcap.h> | 46 | #include <pcap.h> |
47 | 47 | ||
48 | #define DLT_BLUETOOTH_HCI_H4_WITH_PHDR 201 | ||
49 | #define LIBPCAP_BT_PHDR_SENT 0x00000000 | ||
50 | #define LIBPCAP_BT_PHDR_RECV htonl(0x00000001) | ||
51 | |||
48 | static int quit_flag = 0; | 52 | static int quit_flag = 0; |
49 | static int exit_on_disconnect = 0; | 53 | static int exit_on_disconnect = 0; |
50 | 54 | ||
@@ -67,9 +71,10 @@ static void bt_packet_logger_callback(uint8_t * data, uint16_t len, void *user_d | |||
67 | bt_packet_logger_header_t * header = (bt_packet_logger_header_t *)data; | 71 | bt_packet_logger_header_t * header = (bt_packet_logger_header_t *)data; |
68 | uint16_t offset = sizeof(bt_packet_logger_header_t); | 72 | uint16_t offset = sizeof(bt_packet_logger_header_t); |
69 | 73 | ||
74 | // size + sizeof(uint32_t) to account for the direction pseudo header | ||
70 | struct pcap_pkthdr pcap_header; | 75 | struct pcap_pkthdr pcap_header; |
71 | pcap_header.caplen = ntohl(header->length); | 76 | pcap_header.caplen = ntohl(header->length) + sizeof(uint32_t); |
72 | pcap_header.len = len - sizeof(bt_packet_logger_header_t); | 77 | pcap_header.len = len - sizeof(bt_packet_logger_header_t) + sizeof(uint32_t); |
73 | pcap_header.ts.tv_sec = ntohl(header->ts_secs); | 78 | pcap_header.ts.tv_sec = ntohl(header->ts_secs); |
74 | pcap_header.ts.tv_usec = ntohl(header->ts_usecs); | 79 | pcap_header.ts.tv_usec = ntohl(header->ts_usecs); |
75 | 80 | ||
@@ -81,31 +86,43 @@ static void bt_packet_logger_callback(uint8_t * data, uint16_t len, void *user_d | |||
81 | 86 | ||
82 | uint8_t packet_type = data[offset]; | 87 | uint8_t packet_type = data[offset]; |
83 | uint8_t hci_h4_type = 0xff; | 88 | uint8_t hci_h4_type = 0xff; |
89 | uint32_t direction; | ||
84 | 90 | ||
85 | switch(packet_type) { | 91 | switch(packet_type) { |
86 | case HCI_EVENT: | 92 | case HCI_EVENT: |
87 | hci_h4_type = 0x04; | 93 | hci_h4_type = 0x04; |
94 | direction = LIBPCAP_BT_PHDR_RECV; | ||
88 | break; | 95 | break; |
89 | 96 | ||
90 | case HCI_COMMAND: | 97 | case HCI_COMMAND: |
91 | hci_h4_type = 0x01; | 98 | hci_h4_type = 0x01; |
99 | direction = LIBPCAP_BT_PHDR_SENT; | ||
92 | break; | 100 | break; |
93 | 101 | ||
94 | case SENT_ACL_DATA: | 102 | case SENT_ACL_DATA: |
95 | hci_h4_type = 0x02; | 103 | hci_h4_type = 0x02; |
104 | direction = LIBPCAP_BT_PHDR_SENT; | ||
96 | break; | 105 | break; |
97 | 106 | ||
98 | case RECV_ACL_DATA: | 107 | case RECV_ACL_DATA: |
99 | hci_h4_type = 0x02; | 108 | hci_h4_type = 0x02; |
109 | direction = LIBPCAP_BT_PHDR_RECV; | ||
100 | break; | 110 | break; |
101 | 111 | ||
102 | default: | 112 | default: |
103 | // unknown packet logger type, just pass it on | 113 | // unknown packet logger type, just pass it on |
104 | hci_h4_type = packet_type; | 114 | hci_h4_type = packet_type; |
115 | direction = LIBPCAP_BT_PHDR_RECV; | ||
105 | break; | 116 | break; |
106 | } | 117 | } |
107 | if(hci_h4_type != 0xff) { | 118 | if(hci_h4_type != 0xff) { |
108 | data[offset] = hci_h4_type; | 119 | data[offset] = hci_h4_type; |
120 | // we know we are sizeof(bt_packet_logger_header_t) into the buffer passed in to | ||
121 | // this function. We need to add the uint32_t pseudo header to the front of the packet | ||
122 | // so adjust the offset back by sizeof(uint32_t) and write it to the buffer. This avoids | ||
123 | // having to memcpy things around. | ||
124 | offset -= sizeof(uint32_t); | ||
125 | *(uint32_t*)&data[offset] = direction; | ||
109 | pcap_dump((unsigned char*)dump, &pcap_header, &data[offset]); | 126 | pcap_dump((unsigned char*)dump, &pcap_header, &data[offset]); |
110 | pcap_dump_flush(dump); | 127 | pcap_dump_flush(dump); |
111 | } | 128 | } |
@@ -328,7 +345,7 @@ int main(int argc, char *argv[]) | |||
328 | } | 345 | } |
329 | } | 346 | } |
330 | 347 | ||
331 | dump = pcap_dump_open(pcap_open_dead(187, BT_MAX_PACKET_SIZE), out_filename); | 348 | dump = pcap_dump_open(pcap_open_dead(DLT_BLUETOOTH_HCI_H4_WITH_PHDR, BT_MAX_PACKET_SIZE), out_filename); |
332 | idevice_event_subscribe(device_event_cb, NULL); | 349 | idevice_event_subscribe(device_event_cb, NULL); |
333 | 350 | ||
334 | while (!quit_flag) { | 351 | while (!quit_flag) { |