diff --git a/bluetooth/1.0/default/h4_protocol.cc b/bluetooth/1.0/default/h4_protocol.cc index 8c24f76452..43abbe46be 100644 --- a/bluetooth/1.0/default/h4_protocol.cc +++ b/bluetooth/1.0/default/h4_protocol.cc @@ -90,6 +90,7 @@ void H4Protocol::OnDataReady(int fd) { hci_packet_type_ = static_cast(buffer[0]); if (hci_packet_type_ != HCI_PACKET_TYPE_ACL_DATA && hci_packet_type_ != HCI_PACKET_TYPE_SCO_DATA && + hci_packet_type_ != HCI_PACKET_TYPE_ISO_DATA && hci_packet_type_ != HCI_PACKET_TYPE_EVENT) { LOG_ALWAYS_FATAL("%s: Unimplemented packet type %d", __func__, static_cast(hci_packet_type_)); diff --git a/bluetooth/1.0/default/hci_internals.h b/bluetooth/1.0/default/hci_internals.h index 24e944fdec..6f7ff909f6 100644 --- a/bluetooth/1.0/default/hci_internals.h +++ b/bluetooth/1.0/default/hci_internals.h @@ -44,6 +44,10 @@ const size_t HCI_LENGTH_OFFSET_SCO = 2; const size_t HCI_EVENT_PREAMBLE_SIZE = 2; const size_t HCI_LENGTH_OFFSET_EVT = 1; +// 2 bytes for handle and flags, 2 byte for data length (Volume 4, Part E, 5.4.5) +const size_t HCI_ISO_PREAMBLE_SIZE = 4; +const size_t HCI_LENGTH_OFFSET_ISO = 2; + const size_t HCI_PREAMBLE_SIZE_MAX = HCI_ACL_PREAMBLE_SIZE; // Event codes (Volume 2, Part E, 7.7.14) diff --git a/bluetooth/1.0/default/hci_packetizer.cc b/bluetooth/1.0/default/hci_packetizer.cc index 7cb3a113f1..78ce61d78b 100644 --- a/bluetooth/1.0/default/hci_packetizer.cc +++ b/bluetooth/1.0/default/hci_packetizer.cc @@ -26,17 +26,27 @@ 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}; -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}; +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_ISO_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_ISO}; size_t HciGetPacketLengthForType(HciPacketType type, const uint8_t* preamble) { size_t offset = packet_length_offset_for_type[type]; - if (type != HCI_PACKET_TYPE_ACL_DATA) return preamble[offset]; - return (((preamble[offset + 1]) << 8) | preamble[offset]); + if (type == HCI_PACKET_TYPE_ACL_DATA) { + return (((preamble[offset + 1]) << 8) | preamble[offset]); + } else if (type == HCI_PACKET_TYPE_ISO_DATA) { + return ((((preamble[offset + 1]) & 0x3f) << 8) | preamble[offset]); + } + return preamble[offset]; } } // namespace diff --git a/bluetooth/1.0/default/test/h4_protocol_unittest.cc b/bluetooth/1.0/default/test/h4_protocol_unittest.cc index 283243dd36..174861c10b 100644 --- a/bluetooth/1.0/default/test/h4_protocol_unittest.cc +++ b/bluetooth/1.0/default/test/h4_protocol_unittest.cc @@ -190,8 +190,10 @@ class H4ProtocolTest : public ::testing::Test { void WriteAndExpectInboundIsoData(char* payload) { // h4 type[1] + handle[2] + size[1] - char preamble[4] = {HCI_PACKET_TYPE_ISO_DATA, 20, 17, 0}; - preamble[3] = strlen(payload) & 0xFF; + char preamble[5] = {HCI_PACKET_TYPE_ISO_DATA, 19, 92, 0, 0}; + int length = strlen(payload); + preamble[3] = length & 0xFF; + preamble[4] = (length >> 8) & 0x3F; ALOGD("%s writing", __func__); TEMP_FAILURE_RETRY(write(fake_uart_, preamble, sizeof(preamble)));