Loading bluetooth/1.0/default/h4_protocol.cc +1 −0 Original line number Original line Diff line number Diff line Loading @@ -90,6 +90,7 @@ void H4Protocol::OnDataReady(int fd) { hci_packet_type_ = static_cast<HciPacketType>(buffer[0]); hci_packet_type_ = static_cast<HciPacketType>(buffer[0]); if (hci_packet_type_ != HCI_PACKET_TYPE_ACL_DATA && if (hci_packet_type_ != HCI_PACKET_TYPE_ACL_DATA && hci_packet_type_ != HCI_PACKET_TYPE_SCO_DATA && hci_packet_type_ != HCI_PACKET_TYPE_SCO_DATA && hci_packet_type_ != HCI_PACKET_TYPE_ISO_DATA && hci_packet_type_ != HCI_PACKET_TYPE_EVENT) { hci_packet_type_ != HCI_PACKET_TYPE_EVENT) { LOG_ALWAYS_FATAL("%s: Unimplemented packet type %d", __func__, LOG_ALWAYS_FATAL("%s: Unimplemented packet type %d", __func__, static_cast<int>(hci_packet_type_)); static_cast<int>(hci_packet_type_)); Loading bluetooth/1.0/default/hci_internals.h +4 −0 Original line number Original line Diff line number Diff line Loading @@ -44,6 +44,10 @@ const size_t HCI_LENGTH_OFFSET_SCO = 2; const size_t HCI_EVENT_PREAMBLE_SIZE = 2; const size_t HCI_EVENT_PREAMBLE_SIZE = 2; const size_t HCI_LENGTH_OFFSET_EVT = 1; 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; const size_t HCI_PREAMBLE_SIZE_MAX = HCI_ACL_PREAMBLE_SIZE; // Event codes (Volume 2, Part E, 7.7.14) // Event codes (Volume 2, Part E, 7.7.14) Loading bluetooth/1.0/default/hci_packetizer.cc +18 −8 Original line number Original line Diff line number Diff line Loading @@ -26,17 +26,27 @@ namespace { namespace { const size_t preamble_size_for_type[] = { const size_t preamble_size_for_type[] = {0, 0, HCI_COMMAND_PREAMBLE_SIZE, HCI_ACL_PREAMBLE_SIZE, HCI_SCO_PREAMBLE_SIZE, HCI_COMMAND_PREAMBLE_SIZE, HCI_EVENT_PREAMBLE_SIZE}; HCI_ACL_PREAMBLE_SIZE, const size_t packet_length_offset_for_type[] = { HCI_SCO_PREAMBLE_SIZE, 0, HCI_LENGTH_OFFSET_CMD, HCI_LENGTH_OFFSET_ACL, HCI_LENGTH_OFFSET_SCO, HCI_EVENT_PREAMBLE_SIZE, HCI_LENGTH_OFFSET_EVT}; 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 HciGetPacketLengthForType(HciPacketType type, const uint8_t* preamble) { size_t offset = packet_length_offset_for_type[type]; size_t offset = packet_length_offset_for_type[type]; if (type != HCI_PACKET_TYPE_ACL_DATA) return preamble[offset]; if (type == HCI_PACKET_TYPE_ACL_DATA) { return (((preamble[offset + 1]) << 8) | preamble[offset]); 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 } // namespace Loading bluetooth/1.0/default/test/h4_protocol_unittest.cc +4 −2 Original line number Original line Diff line number Diff line Loading @@ -190,8 +190,10 @@ class H4ProtocolTest : public ::testing::Test { void WriteAndExpectInboundIsoData(char* payload) { void WriteAndExpectInboundIsoData(char* payload) { // h4 type[1] + handle[2] + size[1] // h4 type[1] + handle[2] + size[1] char preamble[4] = {HCI_PACKET_TYPE_ISO_DATA, 20, 17, 0}; char preamble[5] = {HCI_PACKET_TYPE_ISO_DATA, 19, 92, 0, 0}; preamble[3] = strlen(payload) & 0xFF; int length = strlen(payload); preamble[3] = length & 0xFF; preamble[4] = (length >> 8) & 0x3F; ALOGD("%s writing", __func__); ALOGD("%s writing", __func__); TEMP_FAILURE_RETRY(write(fake_uart_, preamble, sizeof(preamble))); TEMP_FAILURE_RETRY(write(fake_uart_, preamble, sizeof(preamble))); Loading Loading
bluetooth/1.0/default/h4_protocol.cc +1 −0 Original line number Original line Diff line number Diff line Loading @@ -90,6 +90,7 @@ void H4Protocol::OnDataReady(int fd) { hci_packet_type_ = static_cast<HciPacketType>(buffer[0]); hci_packet_type_ = static_cast<HciPacketType>(buffer[0]); if (hci_packet_type_ != HCI_PACKET_TYPE_ACL_DATA && if (hci_packet_type_ != HCI_PACKET_TYPE_ACL_DATA && hci_packet_type_ != HCI_PACKET_TYPE_SCO_DATA && hci_packet_type_ != HCI_PACKET_TYPE_SCO_DATA && hci_packet_type_ != HCI_PACKET_TYPE_ISO_DATA && hci_packet_type_ != HCI_PACKET_TYPE_EVENT) { hci_packet_type_ != HCI_PACKET_TYPE_EVENT) { LOG_ALWAYS_FATAL("%s: Unimplemented packet type %d", __func__, LOG_ALWAYS_FATAL("%s: Unimplemented packet type %d", __func__, static_cast<int>(hci_packet_type_)); static_cast<int>(hci_packet_type_)); Loading
bluetooth/1.0/default/hci_internals.h +4 −0 Original line number Original line Diff line number Diff line Loading @@ -44,6 +44,10 @@ const size_t HCI_LENGTH_OFFSET_SCO = 2; const size_t HCI_EVENT_PREAMBLE_SIZE = 2; const size_t HCI_EVENT_PREAMBLE_SIZE = 2; const size_t HCI_LENGTH_OFFSET_EVT = 1; 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; const size_t HCI_PREAMBLE_SIZE_MAX = HCI_ACL_PREAMBLE_SIZE; // Event codes (Volume 2, Part E, 7.7.14) // Event codes (Volume 2, Part E, 7.7.14) Loading
bluetooth/1.0/default/hci_packetizer.cc +18 −8 Original line number Original line Diff line number Diff line Loading @@ -26,17 +26,27 @@ namespace { namespace { const size_t preamble_size_for_type[] = { const size_t preamble_size_for_type[] = {0, 0, HCI_COMMAND_PREAMBLE_SIZE, HCI_ACL_PREAMBLE_SIZE, HCI_SCO_PREAMBLE_SIZE, HCI_COMMAND_PREAMBLE_SIZE, HCI_EVENT_PREAMBLE_SIZE}; HCI_ACL_PREAMBLE_SIZE, const size_t packet_length_offset_for_type[] = { HCI_SCO_PREAMBLE_SIZE, 0, HCI_LENGTH_OFFSET_CMD, HCI_LENGTH_OFFSET_ACL, HCI_LENGTH_OFFSET_SCO, HCI_EVENT_PREAMBLE_SIZE, HCI_LENGTH_OFFSET_EVT}; 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 HciGetPacketLengthForType(HciPacketType type, const uint8_t* preamble) { size_t offset = packet_length_offset_for_type[type]; size_t offset = packet_length_offset_for_type[type]; if (type != HCI_PACKET_TYPE_ACL_DATA) return preamble[offset]; if (type == HCI_PACKET_TYPE_ACL_DATA) { return (((preamble[offset + 1]) << 8) | preamble[offset]); 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 } // namespace Loading
bluetooth/1.0/default/test/h4_protocol_unittest.cc +4 −2 Original line number Original line Diff line number Diff line Loading @@ -190,8 +190,10 @@ class H4ProtocolTest : public ::testing::Test { void WriteAndExpectInboundIsoData(char* payload) { void WriteAndExpectInboundIsoData(char* payload) { // h4 type[1] + handle[2] + size[1] // h4 type[1] + handle[2] + size[1] char preamble[4] = {HCI_PACKET_TYPE_ISO_DATA, 20, 17, 0}; char preamble[5] = {HCI_PACKET_TYPE_ISO_DATA, 19, 92, 0, 0}; preamble[3] = strlen(payload) & 0xFF; int length = strlen(payload); preamble[3] = length & 0xFF; preamble[4] = (length >> 8) & 0x3F; ALOGD("%s writing", __func__); ALOGD("%s writing", __func__); TEMP_FAILURE_RETRY(write(fake_uart_, preamble, sizeof(preamble))); TEMP_FAILURE_RETRY(write(fake_uart_, preamble, sizeof(preamble))); Loading