static void h4_statemachine(void) { switch (h4_state) { case H4_W4_PACKET_TYPE: if (hci_packet[0] == HCI_EVENT_PACKET) { bytes_to_read = HCI_EVENT_HEADER_SIZE; h4_state = H4_W4_EVENT_HEADER; } else if (hci_packet[0] == HCI_ACL_DATA_PACKET) { bytes_to_read = HCI_ACL_HEADER_SIZE; h4_state = H4_W4_ACL_HEADER; } else { log_error("h4_process: invalid packet type 0x%02x", hci_packet[0]); read_pos = 0; bytes_to_read = 1; } break; case H4_W4_EVENT_HEADER: bytes_to_read = hci_packet[2]; h4_state = H4_W4_PAYLOAD; break; case H4_W4_ACL_HEADER: bytes_to_read = READ_BT_16( hci_packet, 3); h4_state = H4_W4_PAYLOAD; break; case H4_W4_PAYLOAD: h4_deliver_packet(); break; default: break; } }
static void h4_statemachine(void){ switch (h4_state) { case H4_W4_PACKET_TYPE: switch (hci_packet[0]){ case HCI_EVENT_PACKET: bytes_to_read = HCI_EVENT_HEADER_SIZE; h4_state = H4_W4_EVENT_HEADER; break; case HCI_ACL_DATA_PACKET: bytes_to_read = HCI_ACL_HEADER_SIZE; h4_state = H4_W4_ACL_HEADER; break; case HCI_SCO_DATA_PACKET: bytes_to_read = HCI_SCO_HEADER_SIZE; h4_state = H4_W4_SCO_HEADER; break; default: log_error("h4_process: invalid packet type 0x%02x", hci_packet[0]); h4_reset_statemachine(); break; } break; case H4_W4_EVENT_HEADER: bytes_to_read = hci_packet[2]; h4_state = H4_W4_PAYLOAD; break; case H4_W4_ACL_HEADER: bytes_to_read = READ_BT_16( hci_packet, 3); // check ACL length if (HCI_ACL_HEADER_SIZE + bytes_to_read > HCI_PACKET_BUFFER_SIZE){ log_error("h4_process: invalid ACL payload len %u - only space for %u", bytes_to_read, HCI_PACKET_BUFFER_SIZE - HCI_ACL_HEADER_SIZE); h4_reset_statemachine(); break; } h4_state = H4_W4_PAYLOAD; break; case H4_W4_SCO_HEADER: bytes_to_read = hci_packet[3]; h4_state = H4_W4_PAYLOAD; break; case H4_W4_PAYLOAD: h4_deliver_packet(); break; default: break; } }