1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
65
66
72
73
76
77
80
81
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
127
128
133
134
135
136
137
138
139
140
143
146
149
152
155
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
176
183
184
185
186
187
188
189
/* ... */
#define BTSTACK_FILE__ "hci_dump.c"
/* ... */
#include "btstack_config.h"
#include "btstack_debug.h"
#include "btstack_bool.h"
#include "btstack_util.h"
static const hci_dump_t * hci_dump_implementation;
static int max_nr_packets;
static int nr_packets;
static bool packet_log_enabled;
static bool log_level_enabled[3] = { 1, 1, 1};
static bool hci_dump_log_level_active(int log_level){
if (hci_dump_implementation == NULL) return false;
if (log_level < HCI_DUMP_LOG_LEVEL_DEBUG) return false;
if (log_level > HCI_DUMP_LOG_LEVEL_ERROR) return false;
return log_level_enabled[log_level];
}{ ... }
void hci_dump_init(const hci_dump_t * hci_dump_impl){
max_nr_packets = -1;
nr_packets = 0;
hci_dump_implementation = hci_dump_impl;
packet_log_enabled = true;
}{ ... }
void hci_dump_set_max_packets(int packets){
max_nr_packets = packets;
}{ ... }
void hci_dump_enable_packet_log(bool enabled){
packet_log_enabled = enabled;
}{ ... }
void hci_dump_packet(uint8_t packet_type, uint8_t in, uint8_t *packet, uint16_t len) {
if (hci_dump_implementation == NULL) {
return;
}if (hci_dump_implementation == NULL) { ... }
if (packet_log_enabled == false) {
return;
}if (packet_log_enabled == false) { ... }
if (max_nr_packets > 0){
if ((nr_packets >= max_nr_packets) && (hci_dump_implementation->reset != NULL)) {
nr_packets = 0;
(*hci_dump_implementation->reset)();
}if ((nr_packets >= max_nr_packets) && (hci_dump_implementation->reset != NULL)) { ... }
nr_packets++;
}if (max_nr_packets > 0) { ... }
(*hci_dump_implementation->log_packet)(packet_type, in, packet, len);
}{ ... }
void hci_dump_log(int log_level, const char * format, ...){
if (!hci_dump_log_level_active(log_level)) return;
va_list argptr;
va_start(argptr, format);
(*hci_dump_implementation->log_message)(log_level, format, argptr);
va_end(argptr);
}{ ... }
#ifdef __AVR__
void hci_dump_log_P(int log_level, PGM_P format, ...){
if (!hci_dump_log_level_active(log_level)) return;
va_list argptr;
va_start(argptr, format);
(*hci_dump_implementation->log_message_P)(log_level, format, argptr);
va_end(argptr);
}hci_dump_log_P (int log_level, PGM_P format, ...) { ... }
/* ... */#endif
void hci_dump_btstack_event(const uint8_t *packet, uint16_t len){
#ifdef ENABLE_LOG_BTSTACK_EVENTS
hci_dump_packet(HCI_EVENT_PACKET, 1, packet, size);
#else
UNUSED(packet);
UNUSED(len);/* ... */
#endif
}{ ... }
void hci_dump_enable_log_level(int log_level, int enable){
if (log_level < HCI_DUMP_LOG_LEVEL_DEBUG) return;
if (log_level > HCI_DUMP_LOG_LEVEL_ERROR) return;
log_level_enabled[log_level] = enable != 0;
}{ ... }
void hci_dump_setup_header_packetlogger(uint8_t * buffer, uint32_t tv_sec, uint32_t tv_us, uint8_t packet_type, uint8_t in, uint16_t len){
big_endian_store_32( buffer, 0, HCI_DUMP_HEADER_SIZE_PACKETLOGGER - 4 + len);
big_endian_store_32( buffer, 4, tv_sec);
big_endian_store_32( buffer, 8, tv_us);
uint8_t packet_logger_type = 0;
switch (packet_type){
case HCI_COMMAND_DATA_PACKET:
packet_logger_type = 0x00;
break;case HCI_COMMAND_DATA_PACKET:
case HCI_ACL_DATA_PACKET:
packet_logger_type = in ? 0x03 : 0x02;
break;case HCI_ACL_DATA_PACKET:
case HCI_SCO_DATA_PACKET:
packet_logger_type = in ? 0x09 : 0x08;
break;case HCI_SCO_DATA_PACKET:
case HCI_EVENT_PACKET:
packet_logger_type = 0x01;
break;case HCI_EVENT_PACKET:
case LOG_MESSAGE_PACKET:
packet_logger_type = 0xfc;
break;case LOG_MESSAGE_PACKET:
default:
return;default
}switch (packet_type) { ... }
buffer[12] = packet_logger_type;
}{ ... }
void hci_dump_setup_header_bluez(uint8_t * buffer, uint32_t tv_sec, uint32_t tv_us, uint8_t packet_type, uint8_t in, uint16_t len){
little_endian_store_16( buffer, 0u, 1u + len);
buffer[2] = in;
buffer[3] = 0;
little_endian_store_32( buffer, 4, tv_sec);
little_endian_store_32( buffer, 8, tv_us);
buffer[12] = packet_type;
}{ ... }
void hci_dump_setup_header_btsnoop(uint8_t * buffer, uint32_t ts_usec_high, uint32_t ts_usec_low, uint32_t cumulative_drops, uint8_t packet_type, uint8_t in, uint16_t len) {
uint32_t packet_flags = 0;
if (in){
packet_flags |= 1;
}if (in) { ... }
switch (packet_type){
case HCI_COMMAND_DATA_PACKET:
case HCI_EVENT_PACKET:
packet_flags |= 2;case HCI_EVENT_PACKET:
default:
break;default
}switch (packet_type) { ... }
big_endian_store_32(buffer, 0, len);
big_endian_store_32(buffer, 4, len);
big_endian_store_32(buffer, 8, packet_flags);
big_endian_store_32(buffer, 12, cumulative_drops);
big_endian_store_32(buffer, 16, ts_usec_high);
big_endian_store_32(buffer, 20, ts_usec_low);
}{ ... }