Files
2019-01-20 21:18:33 +01:00

368 lines
14 KiB
Diff

diff --git a/hci/include/bt_hci_bdroid.h b/hci/include/bt_hci_bdroid.h
index aa193d058..aceebc0b5 100644
--- a/hci/include/bt_hci_bdroid.h
+++ b/hci/include/bt_hci_bdroid.h
@@ -63,6 +63,7 @@ typedef enum {
#define MSG_STACK_TO_HC_HCI_ACL 0x2100 /* eq. BT_EVT_TO_LM_HCI_ACL */
#define MSG_STACK_TO_HC_HCI_SCO 0x2200 /* eq. BT_EVT_TO_LM_HCI_SCO */
#define MSG_STACK_TO_HC_HCI_CMD 0x2000 /* eq. BT_EVT_TO_LM_HCI_CMD */
+#define MSG_STACK_TO_LM_DIAG 0x2c00 /* Diagnostics */
/* Local Bluetooth Controller ID for BR/EDR */
#define LOCAL_BR_EDR_CONTROLLER_ID 0
diff --git a/hci/include/hci_hal.h b/hci/include/hci_hal.h
index 53595c02a..c90898e8a 100644
--- a/hci/include/hci_hal.h
+++ b/hci/include/hci_hal.h
@@ -29,7 +29,8 @@ typedef enum {
DATA_TYPE_COMMAND = 1,
DATA_TYPE_ACL = 2,
DATA_TYPE_SCO = 3,
- DATA_TYPE_EVENT = 4
+ DATA_TYPE_EVENT = 4,
+ DATA_TYPE_DIAG = 7
} serial_data_type_t;
typedef void (*data_ready_cb)(serial_data_type_t type);
diff --git a/hci/include/hci_internals.h b/hci/include/hci_internals.h
index 6b9fb014b..c453b5655 100644
--- a/hci/include/hci_internals.h
+++ b/hci/include/hci_internals.h
@@ -26,3 +26,5 @@
#define HCI_SCO_PREAMBLE_SIZE 3
// 1 byte for event code, 1 byte for parameter length (Volume 2, Part E, 5.4.4)
#define HCI_EVENT_PREAMBLE_SIZE 2
+// 1 byte for diagnostic command type
+#define HCI_DIAG_PREAMBLE_SIZE 2
diff --git a/hci/include/hci_layer.h b/hci/include/hci_layer.h
index acb86de60..069118c12 100644
--- a/hci/include/hci_layer.h
+++ b/hci/include/hci_layer.h
@@ -47,6 +47,7 @@ static const char HCI_MODULE[] = "hci_module";
#define MSG_STACK_TO_HC_HCI_ACL 0x2100 /* eq. BT_EVT_TO_LM_HCI_ACL */
#define MSG_STACK_TO_HC_HCI_SCO 0x2200 /* eq. BT_EVT_TO_LM_HCI_SCO */
#define MSG_STACK_TO_HC_HCI_CMD 0x2000 /* eq. BT_EVT_TO_LM_HCI_CMD */
+#define MSG_STACK_TO_LM_DIAG 0x2c00 /* Diagnostics */
/* Local Bluetooth Controller ID for BR/EDR */
#define LOCAL_BR_EDR_CONTROLLER_ID 0
diff --git a/hci/src/btsnoop.cc b/hci/src/btsnoop.cc
index a109ad09a..c36bd05fd 100644
--- a/hci/src/btsnoop.cc
+++ b/hci/src/btsnoop.cc
@@ -58,7 +58,8 @@ typedef enum {
kCommandPacket = 1,
kAclPacket = 2,
kScoPacket = 3,
- kEventPacket = 4
+ kEventPacket = 4,
+ kDiagPacket = 7
} packet_type_t;
// Epoch in microseconds since 01/01/0000.
@@ -81,7 +82,7 @@ static char* get_btsnoop_log_path(char* log_path);
static char* get_btsnoop_last_log_path(char* last_log_path, char* log_path);
static void open_next_snoop_file();
static void btsnoop_write_packet(packet_type_t type, uint8_t* packet,
- bool is_received, uint64_t timestamp_us);
+ bool is_received, uint64_t timestamp_us, uint32_t length_he);
// Module lifecycle functions
@@ -135,19 +136,22 @@ static void capture(const BT_HDR* buffer, bool is_received) {
switch (buffer->event & MSG_EVT_MASK) {
case MSG_HC_TO_STACK_HCI_EVT:
- btsnoop_write_packet(kEventPacket, p, false, timestamp_us);
+ btsnoop_write_packet(kEventPacket, p, false, timestamp_us, 0);
break;
case MSG_HC_TO_STACK_HCI_ACL:
case MSG_STACK_TO_HC_HCI_ACL:
- btsnoop_write_packet(kAclPacket, p, is_received, timestamp_us);
+ btsnoop_write_packet(kAclPacket, p, is_received, timestamp_us, 0);
break;
case MSG_HC_TO_STACK_HCI_SCO:
case MSG_STACK_TO_HC_HCI_SCO:
- btsnoop_write_packet(kScoPacket, p, is_received, timestamp_us);
+ btsnoop_write_packet(kScoPacket, p, is_received, timestamp_us, 0);
break;
case MSG_STACK_TO_HC_HCI_CMD:
- btsnoop_write_packet(kCommandPacket, p, true, timestamp_us);
+ btsnoop_write_packet(kCommandPacket, p, true, timestamp_us, 0);
break;
+ case MSG_STACK_TO_LM_DIAG:
+ btsnoop_write_packet(kDiagPacket, p, is_received, timestamp_us, buffer->len + 1); //1 byte header 0x07 + data
+ break;
}
}
@@ -235,8 +239,7 @@ static uint64_t htonll(uint64_t ll) {
}
static void btsnoop_write_packet(packet_type_t type, uint8_t* packet,
- bool is_received, uint64_t timestamp_us) {
- uint32_t length_he = 0;
+ bool is_received, uint64_t timestamp_us, uint32_t length_he) {
uint32_t flags = 0;
switch (type) {
@@ -256,6 +259,9 @@ static void btsnoop_write_packet(packet_type_t type, uint8_t* packet,
length_he = packet[1] + 3;
flags = 3;
break;
+ case kDiagPacket:
+ flags = 3;
+ break;
}
btsnoop_header_t header;
diff --git a/hci/src/hci_inject.cc b/hci/src/hci_inject.cc
index 70194a5e0..d7d08cb18 100644
--- a/hci/src/hci_inject.cc
+++ b/hci/src/hci_inject.cc
@@ -39,6 +39,7 @@ typedef enum {
HCI_PACKET_ACL_DATA = 2,
HCI_PACKET_SCO_DATA = 3,
HCI_PACKET_EVENT = 4,
+ HCI_PACKET_DIAG = 7
} hci_packet_t;
typedef struct {
@@ -118,6 +119,8 @@ static int hci_packet_to_event(hci_packet_t packet) {
return MSG_STACK_TO_HC_HCI_ACL;
case HCI_PACKET_SCO_DATA:
return MSG_STACK_TO_HC_HCI_SCO;
+ case HCI_PACKET_DIAG:
+ return MSG_STACK_TO_LM_DIAG;
default:
LOG_ERROR(LOG_TAG, "%s unsupported packet type: %d", __func__, packet);
return -1;
diff --git a/hci/src/hci_layer.cc b/hci/src/hci_layer.cc
index d1fa92031..549fad723 100644
--- a/hci/src/hci_layer.cc
+++ b/hci/src/hci_layer.cc
@@ -159,6 +159,11 @@ void sco_data_received(BT_HDR* packet) {
packet_fragmenter->reassemble_and_dispatch(packet);
}
+void diag_data_received(BT_HDR* packet) {
+ btsnoop->capture(packet, true);
+ packet_fragmenter->reassemble_and_dispatch(packet);
+}
+
// Module lifecycle functions
static future_t* hci_module_shut_down();
diff --git a/hci/src/hci_layer_android.cc b/hci/src/hci_layer_android.cc
index 0598ca132..26fe3785e 100644
--- a/hci/src/hci_layer_android.cc
+++ b/hci/src/hci_layer_android.cc
@@ -51,6 +51,7 @@ extern void hci_event_received(const tracked_objects::Location& from_here,
BT_HDR* packet);
extern void acl_event_received(BT_HDR* packet);
extern void sco_data_received(BT_HDR* packet);
+extern void diag_data_received(BT_HDR* packet);
android::sp<IBluetoothHci> btHci;
@@ -98,6 +99,12 @@ class BluetoothHciCallbacks : public IBluetoothHciCallbacks {
return Void();
}
+ Return<void> diagDataReceived(const hidl_vec<uint8_t>& data) {
+ BT_HDR* packet = WrapPacketAndCopy(MSG_STACK_TO_LM_DIAG, data);
+ diag_data_received(packet);
+ return Void();
+ }
+
const allocator_t* buffer_allocator;
};
@@ -137,6 +144,9 @@ void hci_transmit(BT_HDR* packet) {
case MSG_STACK_TO_HC_HCI_SCO:
btHci->sendScoData(data);
break;
+ case MSG_STACK_TO_LM_DIAG:
+ btHci->sendDiagData(data);
+ break;
default:
LOG_ERROR(LOG_TAG, "Unknown packet type (%d)", event);
break;
diff --git a/hci/src/hci_layer_linux.cc b/hci/src/hci_layer_linux.cc
index aa37f781a..c2a6eec77 100644
--- a/hci/src/hci_layer_linux.cc
+++ b/hci/src/hci_layer_linux.cc
@@ -89,7 +89,8 @@ enum HciPacketType {
HCI_PACKET_TYPE_COMMAND = 1,
HCI_PACKET_TYPE_ACL_DATA = 2,
HCI_PACKET_TYPE_SCO_DATA = 3,
- HCI_PACKET_TYPE_EVENT = 4
+ HCI_PACKET_TYPE_EVENT = 4,
+ HCI_PACKET_TYPE_DIAG = 7
};
extern void initialization_complete();
@@ -97,6 +98,7 @@ extern void hci_event_received(const tracked_objects::Location& from_here,
BT_HDR* packet);
extern void acl_event_received(BT_HDR* packet);
extern void sco_data_received(BT_HDR* packet);
+extern void diag_data_received(BT_HDR* packet);
static int bt_vendor_fd = -1;
static int hci_interface;
@@ -145,6 +147,10 @@ void monitor_socket(int ctrl_fd, int fd) {
packet->event = MSG_HC_TO_STACK_HCI_EVT;
hci_event_received(FROM_HERE, packet);
break;
+ case HCI_PACKET_TYPE_DIAG:
+ packet->event = MSG_STACK_TO_LM_DIAG;
+ diag_data_received(FROM_HERE, packet);
+ break;
default:
LOG(FATAL) << "Unexpected event type: " << +type;
break;
diff --git a/test/rootcanal/service.cc b/test/rootcanal/service.cc
index e08f73583..831b4276e 100644
--- a/test/rootcanal/service.cc
+++ b/test/rootcanal/service.cc
@@ -30,11 +30,11 @@ using ::android::hardware::joinRpcThreadpool;
using ::android::sp;
int main(int /* argc */, char** /* argv */) {
- sp<IBluetoothHci> bluetooth = new BluetoothHci;
- configureRpcThreadpool(1, true);
- android::status_t status = bluetooth->registerAsService();
- if (status == android::OK)
- joinRpcThreadpool();
- else
- ALOGE("Could not register as a service!");
+// sp<IBluetoothHci> bluetooth = new BluetoothHci;
+// configureRpcThreadpool(1, true);
+// android::status_t status = bluetooth->registerAsService();
+// if (status == android::OK)
+// joinRpcThreadpool();
+// else
+// ALOGE("Could not register as a service!");
}
diff --git a/vendor_libs/linux/interface/bluetooth_hci.cc b/vendor_libs/linux/interface/bluetooth_hci.cc
index 8507f7a10..21c93a9dd 100644
--- a/vendor_libs/linux/interface/bluetooth_hci.cc
+++ b/vendor_libs/linux/interface/bluetooth_hci.cc
@@ -284,7 +284,8 @@ Return<void> BluetoothHci::initialize(
hci_fd,
[cb](const hidl_vec<uint8_t>& packet) { cb->hciEventReceived(packet); },
[cb](const hidl_vec<uint8_t>& packet) { cb->aclDataReceived(packet); },
- [cb](const hidl_vec<uint8_t>& packet) { cb->scoDataReceived(packet); });
+ [cb](const hidl_vec<uint8_t>& packet) { cb->scoDataReceived(packet); },
+ [cb](const hidl_vec<uint8_t>& packet) { cb->diagDataReceived(packet); });
fd_watcher_.WatchFdForNonBlockingReads(
hci_fd, [h4_hci](int fd) { h4_hci->OnDataReady(fd); });
@@ -328,6 +329,11 @@ Return<void> BluetoothHci::sendScoData(const hidl_vec<uint8_t>& data) {
return Void();
}
+Return<void> BluetoothHci::sendDiagData(const hidl_vec<uint8_t>& data) {
+ sendDataToController(HCI_DATA_TYPE_DIA, data);
+ return Void();
+}
+
void BluetoothHci::sendDataToController(const uint8_t type,
const hidl_vec<uint8_t>& data) {
hci_handle_->Send(type, data.data(), data.size());
diff --git a/vendor_libs/linux/interface/bluetooth_hci.h b/vendor_libs/linux/interface/bluetooth_hci.h
index 5dc1c0a55..eadbba751 100644
--- a/vendor_libs/linux/interface/bluetooth_hci.h
+++ b/vendor_libs/linux/interface/bluetooth_hci.h
@@ -44,6 +44,7 @@ class BluetoothHci : public IBluetoothHci {
Return<void> sendHciCommand(const hidl_vec<uint8_t>& packet) override;
Return<void> sendAclData(const hidl_vec<uint8_t>& data) override;
Return<void> sendScoData(const hidl_vec<uint8_t>& data) override;
+ Return<void> sendDiagData(const hidl_vec<uint8_t>& data) override;
Return<void> close() override;
private:
@@ -55,6 +56,7 @@ class BluetoothHci : public IBluetoothHci {
const uint8_t HCI_DATA_TYPE_COMMAND = 1;
const uint8_t HCI_DATA_TYPE_ACL = 2;
const uint8_t HCI_DATA_TYPE_SCO = 3;
+ const uint8_t HCI_DATA_TYPE_DIA = 7;
int waitHciDev(int hci_interface);
int findRfKill(void);
diff --git a/vendor_libs/linux/interface/h4_protocol.cc b/vendor_libs/linux/interface/h4_protocol.cc
index e7acff46d..19d8199bf 100644
--- a/vendor_libs/linux/interface/h4_protocol.cc
+++ b/vendor_libs/linux/interface/h4_protocol.cc
@@ -67,6 +67,9 @@ void H4Protocol::OnPacketReady() {
case HCI_PACKET_TYPE_SCO_DATA:
sco_cb_(hci_packetizer_.GetPacket());
break;
+ case HCI_PACKET_TYPE_DIAG:
+ diag_cb_(hci_packetizer_.GetPacket());
+ break;
default: {
bool bad_packet_type = true;
CHECK(!bad_packet_type);
diff --git a/vendor_libs/linux/interface/h4_protocol.h b/vendor_libs/linux/interface/h4_protocol.h
index 612b0dbb6..e312ffb9b 100644
--- a/vendor_libs/linux/interface/h4_protocol.h
+++ b/vendor_libs/linux/interface/h4_protocol.h
@@ -33,11 +33,12 @@ using PacketReadCallback = std::function<void(const hidl_vec<uint8_t>&)>;
class H4Protocol {
public:
H4Protocol(int fd, PacketReadCallback event_cb, PacketReadCallback acl_cb,
- PacketReadCallback sco_cb)
+ PacketReadCallback sco_cb, PacketReadCallback diag_cb)
: uart_fd_(fd),
event_cb_(event_cb),
acl_cb_(acl_cb),
sco_cb_(sco_cb),
+ diag_cb_(diag_cb),
hci_packetizer_([this]() { OnPacketReady(); }) {}
size_t Send(uint8_t type, const uint8_t* data, size_t length);
@@ -52,6 +53,7 @@ class H4Protocol {
PacketReadCallback event_cb_;
PacketReadCallback acl_cb_;
PacketReadCallback sco_cb_;
+ PacketReadCallback diag_cb_;
HciPacketType hci_packet_type_{HCI_PACKET_TYPE_UNKNOWN};
HciPacketizer hci_packetizer_;
diff --git a/vendor_libs/linux/interface/hci_internals.h b/vendor_libs/linux/interface/hci_internals.h
index 1e1f3001c..07ab42cd8 100644
--- a/vendor_libs/linux/interface/hci_internals.h
+++ b/vendor_libs/linux/interface/hci_internals.h
@@ -24,7 +24,8 @@ enum HciPacketType {
HCI_PACKET_TYPE_COMMAND = 1,
HCI_PACKET_TYPE_ACL_DATA = 2,
HCI_PACKET_TYPE_SCO_DATA = 3,
- HCI_PACKET_TYPE_EVENT = 4
+ HCI_PACKET_TYPE_EVENT = 4,
+ HCI_PACKET_TYPE_DIAG = 7
};
// 2 bytes for opcode, 1 byte for parameter length (Volume 2, Part E, 5.4.1)
diff --git a/vendor_libs/linux/interface/hci_packetizer.cc b/vendor_libs/linux/interface/hci_packetizer.cc
index 0c0a979e7..d6eea900a 100644
--- a/vendor_libs/linux/interface/hci_packetizer.cc
+++ b/vendor_libs/linux/interface/hci_packetizer.cc
@@ -27,13 +27,14 @@ namespace {
const size_t preamble_size_for_type[] = {
0, HCI_COMMAND_PREAMBLE_SIZE, HCI_ACL_PREAMBLE_SIZE, HCI_SCO_PREAMBLE_SIZE,
- HCI_EVENT_PREAMBLE_SIZE};
+ HCI_EVENT_PREAMBLE_SIZE, 0, 0, 2}; //TODO HCI_DIAG_PREAMBLE_SIZE
const size_t packet_length_offset_for_type[] = {
0, HCI_LENGTH_OFFSET_CMD, HCI_LENGTH_OFFSET_ACL, HCI_LENGTH_OFFSET_SCO,
- HCI_LENGTH_OFFSET_EVT};
+ HCI_LENGTH_OFFSET_EVT, 0, 0, 0};
size_t HciGetPacketLengthForType(HciPacketType type, const uint8_t* preamble) {
size_t offset = packet_length_offset_for_type[type];
+ if (type == HCI_PACKET_TYPE_DIAG) return 63; //TODO
if (type != HCI_PACKET_TYPE_ACL_DATA) return preamble[offset];
return (((preamble[offset + 1]) << 8) | preamble[offset]);
}