Merge "Bluetooth HAL: fix ISO handling for H4 protocol" am: 389e9aa728 am: a088953e11

Original change: https://android-review.googlesource.com/c/platform/hardware/interfaces/+/1506098

Change-Id: Ia0478fe7751009940814bc933cf847b246da460c
This commit is contained in:
Treehugger Robot
2020-11-23 20:17:57 +00:00
committed by Automerger Merge Worker
4 changed files with 27 additions and 10 deletions

View File

@@ -90,6 +90,7 @@ void H4Protocol::OnDataReady(int fd) {
hci_packet_type_ = static_cast<HciPacketType>(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<int>(hci_packet_type_));

View File

@@ -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)

View File

@@ -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

View File

@@ -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)));