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;
    }
}
Exemple #2
0
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;
    }
}