Esempio n. 1
0
File: hci.c Progetto: ajsb85/ioio
void hci_emit_hci_open_failed(){
    uint8_t event[2];
    event[0] = BTSTACK_EVENT_POWERON_FAILED;
    event[1] = sizeof(event) - 2;
    hci_dump_packet( HCI_EVENT_PACKET, 0, event, sizeof(event));
    hci_stack.packet_handler(HCI_EVENT_PACKET, event, sizeof(event));
}
static int h4_send_packet(uint8_t packet_type, uint8_t * packet, int size){
    if (hci_transport_h4->ds == NULL) return -1;
    if (hci_transport_h4->uart_fd == 0) return -1;

    // wake Bluetooth module
    h4_enforce_wake_on();

    hci_dump_packet( (uint8_t) packet_type, 0, packet, size);
    char *data = (char*) packet;
    int bytes_written = write(hci_transport_h4->uart_fd, &packet_type, 1);
    while (bytes_written < 1) {
        usleep(5000);
        bytes_written = write(hci_transport_h4->uart_fd, &packet_type, 1);
    };
    while (size > 0) {
        int bytes_written = write(hci_transport_h4->uart_fd, data, size);
        if (bytes_written < 0) {
            usleep(5000);
            continue;
        }
        data += bytes_written;
        size -= bytes_written;
    }
    return 0;
}
Esempio n. 3
0
int hci_send_cmd(const hci_cmd_t *cmd, ...) {
    va_list argptr;
    va_start(argptr, cmd);
    uint16_t len = hci_create_cmd_internal(packet_buffer, cmd, argptr);
    va_end(argptr);
    hci_dump_packet(HCI_COMMAND_DATA_PACKET, 0, packet_buffer, len);
    dump_packet(HCI_COMMAND_DATA_PACKET, packet_buffer, len);
    packet_buffer_len = len;

    // track le encrypt and le rand
    if (cmd->opcode ==  hci_le_encrypt.opcode) {
        uint8_t * key_flipped = &packet_buffer[3];
        uint8_t key[16];
        swap128(key_flipped, key);
        // printf("le_encrypt key ");
        // hexdump(key, 16);
        uint8_t * plaintext_flipped = &packet_buffer[19];
        uint8_t plaintext[16];
        swap128(plaintext_flipped, plaintext);
        // printf("le_encrypt txt ");
        // hexdump(plaintext, 16);
        aes128_calc_cyphertext(key, plaintext, aes128_cyphertext);
        // printf("le_encrypt res ");
        // hexdump(aes128_cyphertext, 16);
    }
    return 0;
}
void usb_bt_callback(uint8_t event_type, uint8_t *data, uint16_t size)
{
    switch(event_type)
    {
        case USB_BT_EVENT_INTERRUPT_READ:
            hci_dump_packet( HCI_EVENT_PACKET, 1, data, size);
            packet_handler(HCI_EVENT_PACKET,data,size);
        break;
        case USB_BT_EVENT_BULK_READ:
            hci_dump_packet( HCI_ACL_DATA_PACKET, 1, data, size);
            packet_handler(HCI_ACL_DATA_PACKET,data,size);
        break;
        default:
        break;
    }
}
Esempio n. 5
0
File: hci.c Progetto: ajsb85/ioio
void hci_emit_l2cap_check_timeout(hci_connection_t *conn){
    uint8_t event[4];
    event[0] = L2CAP_EVENT_TIMEOUT_CHECK;
    event[1] = sizeof(event) - 2;
    bt_store_16(event, 2, conn->con_handle);
    hci_dump_packet( HCI_EVENT_PACKET, 0, event, sizeof(event));
    hci_stack.packet_handler(HCI_EVENT_PACKET, event, sizeof(event));
}
Esempio n. 6
0
File: hci.c Progetto: ajsb85/ioio
void hci_emit_state(){
    uint8_t event[3];
    event[0] = BTSTACK_EVENT_STATE;
    event[1] = sizeof(event) - 2;
    event[2] = hci_stack.state;
    hci_dump_packet( HCI_EVENT_PACKET, 0, event, sizeof(event));
    hci_stack.packet_handler(HCI_EVENT_PACKET, event, sizeof(event));
}
Esempio n. 7
0
void l2cap_emit_channel_closed(l2cap_channel_t *channel) {
    uint8_t event[4];
    event[0] = L2CAP_EVENT_CHANNEL_CLOSED;
    event[1] = sizeof(event) - 2;
    bt_store_16(event, 2, channel->local_cid);
    hci_dump_packet( HCI_EVENT_PACKET, 0, event, sizeof(event));
    l2cap_dispatch(channel, HCI_EVENT_PACKET, event, sizeof(event));
}
Esempio n. 8
0
File: hci.c Progetto: ajsb85/ioio
void hci_emit_nr_connections_changed(){
    uint8_t event[3];
    event[0] = BTSTACK_EVENT_NR_CONNECTIONS_CHANGED;
    event[1] = sizeof(event) - 2;
    event[2] = nr_hci_connections();
    hci_dump_packet( HCI_EVENT_PACKET, 0, event, sizeof(event));
    hci_stack.packet_handler(HCI_EVENT_PACKET, event, sizeof(event));
}
Esempio n. 9
0
File: hci.c Progetto: ajsb85/ioio
void hci_emit_system_bluetooth_enabled(uint8_t enabled){
    uint8_t event[3];
    event[0] = BTSTACK_EVENT_SYSTEM_BLUETOOTH_ENABLED;
    event[1] = sizeof(event) - 2;
    event[2] = enabled;
    hci_dump_packet( HCI_EVENT_PACKET, 0, event, sizeof(event));
    hci_stack.packet_handler(HCI_EVENT_PACKET, event, sizeof(event));
}
Esempio n. 10
0
File: hci.c Progetto: ajsb85/ioio
void hci_emit_discoverable_enabled(uint8_t enabled){
    uint8_t event[3];
    event[0] = BTSTACK_EVENT_DISCOVERABLE_ENABLED;
    event[1] = sizeof(event) - 2;
    event[2] = enabled;
    hci_dump_packet( HCI_EVENT_PACKET, 0, event, sizeof(event));
    hci_stack.packet_handler(HCI_EVENT_PACKET, event, sizeof(event));
}
Esempio n. 11
0
static void l2cap_emit_service_registered(void *connection, uint8_t status, uint16_t psm){
    uint8_t event[5];
    event[0] = L2CAP_EVENT_SERVICE_REGISTERED;
    event[1] = sizeof(event) - 2;
    event[2] = status;
    bt_store_16(event, 3, psm);
    hci_dump_packet( HCI_EVENT_PACKET, 0, event, sizeof(event));
    (*packet_handler)(connection, HCI_EVENT_PACKET, 0, event, sizeof(event));
}
Esempio n. 12
0
/*=============================================================================
=============================================================================*/
static int h4_send_packet(uint8_t packetType, uint8_t *packet, int size)
{
    hci_dump_packet(packetType, 0, packet, size);

    BSP_BTUART_Transmit(&packetType, 1);
    BSP_BTUART_Transmit(packet, size);

    return 0;
}
static void   h4_deliver_packet(void){
    if (read_pos < 3) return; // sanity check
    hci_dump_packet( hci_packet[0], 1, &hci_packet[1], read_pos-1);
    packet_handler(hci_packet[0], &hci_packet[1], read_pos-1);
    
    h4_state = H4_W4_PACKET_TYPE;
    read_pos = 0;
    bytes_to_read = 1;
}
Esempio n. 14
0
void mock_simulate_hci_event(uint8_t * packet, uint16_t size) {
    hci_dump_packet(HCI_EVENT_PACKET, 1, packet, size);
    if (event_packet_handler) {
        event_packet_handler(NULL, HCI_EVENT_PACKET, NULL, packet, size);
    }
    if (le_data_handler) {
        le_data_handler(HCI_EVENT_PACKET, NULL, packet, size);
    }
}
Esempio n. 15
0
File: hci.c Progetto: ajsb85/ioio
void hci_emit_disconnection_complete(uint16_t handle, uint8_t reason){
    uint8_t event[6];
    event[0] = HCI_EVENT_DISCONNECTION_COMPLETE;
    event[1] = sizeof(event) - 2;
    event[2] = 0; // status = OK
    bt_store_16(event, 3, handle);
    event[5] = reason;
    hci_dump_packet( HCI_EVENT_PACKET, 0, event, sizeof(event));
    hci_stack.packet_handler(HCI_EVENT_PACKET, event, sizeof(event));
}
Esempio n. 16
0
File: hci.c Progetto: ajsb85/ioio
void hci_emit_btstack_version() {
    uint8_t event[6];
    event[0] = BTSTACK_EVENT_VERSION;
    event[1] = sizeof(event) - 2;
    event[2] = BTSTACK_MAJOR;
    event[3] = BTSTACK_MINOR;
    bt_store_16(event, 4, BTSTACK_REVISION);
    hci_dump_packet( HCI_EVENT_PACKET, 0, event, sizeof(event));
    hci_stack.packet_handler(HCI_EVENT_PACKET, event, sizeof(event));
}
Esempio n. 17
0
File: hci.c Progetto: ajsb85/ioio
void hci_emit_remote_name_cached(bd_addr_t *addr, device_name_t *name){
    uint8_t event[2+1+6+248];
    event[0] = BTSTACK_EVENT_REMOTE_NAME_CACHED;
    event[1] = sizeof(event) - 2;
    event[2] = 0;   // just to be compatible with HCI_EVENT_REMOTE_NAME_REQUEST_COMPLETE
    bt_flip_addr(&event[3], *addr);
    memcpy(&event[9], name, 248);
    hci_dump_packet(HCI_EVENT_PACKET, 0, event, sizeof(event));
    hci_stack.packet_handler(HCI_EVENT_PACKET, event, sizeof(event));
}
Esempio n. 18
0
// data: event(8), len(8), status(8), service_record_handle(32)
static void sdp_emit_service_registered(void *connection, uint32_t handle, uint8_t status) {
    if (!app_packet_handler) return;
    uint8_t event[7];
    event[0] = SDP_SERVICE_REGISTERED;
    event[1] = sizeof(event) - 2;
    event[2] = status;
    bt_store_32(event, 3, handle);
    hci_dump_packet(HCI_EVENT_PACKET, 0, event, sizeof(event));
    (*app_packet_handler)(connection, HCI_EVENT_PACKET, 0, (uint8_t *) event, sizeof(event));
}
Esempio n. 19
0
File: hci.c Progetto: ajsb85/ioio
void hci_emit_connection_complete(hci_connection_t *conn, uint8_t status){
    uint8_t event[13];
    event[0] = HCI_EVENT_CONNECTION_COMPLETE;
    event[1] = sizeof(event) - 2;
    event[2] = status;
    bt_store_16(event, 3, conn->con_handle);
    bt_flip_addr(&event[5], conn->address);
    event[11] = 1; // ACL connection
    event[12] = 0; // encryption disabled
    hci_dump_packet( HCI_EVENT_PACKET, 0, event, sizeof(event));
    hci_stack.packet_handler(HCI_EVENT_PACKET, event, sizeof(event));
}
Esempio n. 20
0
void l2cap_emit_connection_request(l2cap_channel_t *channel) {
    uint8_t event[16];
    event[0] = L2CAP_EVENT_INCOMING_CONNECTION;
    event[1] = sizeof(event) - 2;
    bt_flip_addr(&event[2], channel->address);
    bt_store_16(event,  8, channel->handle);
    bt_store_16(event, 10, channel->psm);
    bt_store_16(event, 12, channel->local_cid);
    bt_store_16(event, 14, channel->remote_cid);
    hci_dump_packet( HCI_EVENT_PACKET, 0, event, sizeof(event));
    l2cap_dispatch(channel, HCI_EVENT_PACKET, event, sizeof(event));
}
Esempio n. 21
0
void l2cap_emit_credits(l2cap_channel_t *channel, uint8_t credits) {
    // track credits
    channel->packets_granted += credits;
    // log_info("l2cap_emit_credits for cid %u, credits given: %u (+%u)\n", channel->local_cid, channel->packets_granted, credits);
    
    uint8_t event[5];
    event[0] = L2CAP_EVENT_CREDITS;
    event[1] = sizeof(event) - 2;
    bt_store_16(event, 2, channel->local_cid);
    event[4] = credits;
    hci_dump_packet( HCI_EVENT_PACKET, 0, event, sizeof(event));
    l2cap_dispatch(channel, HCI_EVENT_PACKET, event, sizeof(event));
}
Esempio n. 22
0
void hci_dump_log(int log_level, const char * format, ...){
    if (!hci_dump_log_level_active(log_level)) return;
    va_list argptr;
    va_start(argptr, format);
#ifdef HAVE_POSIX_FILE_IO
    int len = vsnprintf(log_message_buffer, sizeof(log_message_buffer), format, argptr);
    hci_dump_packet(LOG_MESSAGE_PACKET, 0, (uint8_t*) log_message_buffer, len);
#else
    printf("LOG -- ");
    vprintf(format, argptr);
    printf("\n");
#endif
    va_end(argptr);
}
static int usb_send_acl_packet(uint8_t *packet, int size)
{
    int r;

    hci_dump_packet( HCI_ACL_DATA_PACKET, 0, packet, size);

    // Use synchronous call to sent out data
    r = usb_bt_bulk_write(packet, size);
    if(r < 0){
        log_error("Error submitting data transfer");
    }

    return 0;
}
Esempio n. 24
0
// define new packet type SDP_CLIENT_PACKET
static void handle_sdp_client_query_result(sdp_query_event_t * event){
    sdp_query_attribute_value_event_t * ve;
    sdp_query_complete_event_t * complete_event;

    switch (event->type){
        case SDP_QUERY_ATTRIBUTE_VALUE:
            ve = (sdp_query_attribute_value_event_t*) event;
            
            sdp_client_assert_buffer(ve->attribute_length);

            attribute_value[ve->data_offset] = ve->data;

            if ((uint16_t)(ve->data_offset+1) == ve->attribute_length){
                hexdump(attribute_value, ve->attribute_length);

                int event_len = 1 + 3 * 2 + ve->attribute_length; 
                uint8_t event[event_len];
                event[0] = SDP_QUERY_ATTRIBUTE_VALUE;
                event[1] = ve->record_id;
                event[3] = ve->attribute_id;
                event[5] = ve->attribute_length;

                memcpy(&event[7], attribute_value, ve->attribute_length);
                hci_dump_packet(SDP_CLIENT_PACKET, 0, event, event_len);
                socket_connection_send_packet(NULL, SDP_CLIENT_PACKET, 0, event, event_len);
            }

            break;
        case SDP_QUERY_COMPLETE:
            complete_event = (sdp_query_complete_event_t*) event;
            uint8_t event[] = { SDP_QUERY_COMPLETE, 1, complete_event->status};
            hci_dump_packet(HCI_EVENT_PACKET, 0, event, sizeof(event));
            socket_connection_send_packet(NULL, HCI_EVENT_PACKET, 0, event, sizeof(event));
            break;
    }
}
Esempio n. 25
0
static void handle_sdp_rfcomm_service_result(sdp_query_event_t * rfcomm_event, void * context){
    switch (rfcomm_event->type){
        case SDP_QUERY_RFCOMM_SERVICE: {
            sdp_query_rfcomm_service_event_t * service_event = (sdp_query_rfcomm_service_event_t*) rfcomm_event;
            int name_len = strlen((const char*)service_event);
            int event_len = 3 + name_len; 
            uint8_t event[event_len];
            event[0] = rfcomm_event->type;
            event[1] = 1 + name_len;
            event[2] = service_event->channel_nr;
            memcpy(&event[3], service_event->service_name, name_len);
            hci_dump_packet(HCI_EVENT_PACKET, 0, event, event_len);
            socket_connection_send_packet(context, HCI_EVENT_PACKET, 0, event, event_len);
            break;
        }
        case SDP_QUERY_COMPLETE: {
            sdp_query_complete_event_t * complete_event = (sdp_query_complete_event_t*) rfcomm_event;
            uint8_t event[] = { rfcomm_event->type, 1, complete_event->status};
            hci_dump_packet(HCI_EVENT_PACKET, 0, event, sizeof(event));
            socket_connection_send_packet(context, HCI_EVENT_PACKET, 0, event, sizeof(event));
            break;
        }
    }
}
Esempio n. 26
0
void l2cap_emit_channel_opened(l2cap_channel_t *channel, uint8_t status) {
    uint8_t event[21];
    event[0] = L2CAP_EVENT_CHANNEL_OPENED;
    event[1] = sizeof(event) - 2;
    event[2] = status;
    bt_flip_addr(&event[3], channel->address);
    bt_store_16(event,  9, channel->handle);
    bt_store_16(event, 11, channel->psm);
    bt_store_16(event, 13, channel->local_cid);
    bt_store_16(event, 15, channel->remote_cid);
    bt_store_16(event, 17, channel->local_mtu);
    bt_store_16(event, 19, channel->remote_mtu); 
    hci_dump_packet( HCI_EVENT_PACKET, 0, event, sizeof(event));
    l2cap_dispatch(channel, HCI_EVENT_PACKET, event, sizeof(event));
}
static int usb_send_cmd_packet(uint8_t *packet, int size)
{
    int r;

    hci_dump_packet( HCI_COMMAND_DATA_PACKET, 0, packet, size);

    // Use synchronous call to sent out command
    r = usb_bt_control_write(packet, size);
    if (r < 0 || r !=size ) {
        log_error("Error submitting control transfer %d\n", r);
        return r;
    }
    
    return 0;
}
Esempio n. 28
0
static int    h5_send_packet(uint8_t packet_type, uint8_t *packet, int size){
    if (hci_transport_h5->ds == NULL) return -1;
    if (hci_transport_h5->ds->fd == 0) return -1;
    char *data = (char*) packet;

    hci_dump_packet( (uint8_t) packet_type, 0, packet, size);
    
    write(hci_transport_h5->ds->fd, &packet_type, 1);
    while (size > 0) {
        int bytes_written = write(hci_transport_h5->ds->fd, data, size);
        if (bytes_written < 0) {
            usleep(5000);
            continue;
        }
        data += bytes_written;
        size -= bytes_written;
    }
    return 0;
}
Esempio n. 29
0
void mock_simulate_sm_data_packet(uint8_t * packet, uint16_t len) {

    uint16_t handle = 0x40;
    uint16_t cid = 0x06;

    uint8_t acl_buffer[len + 8];

    // 0 - Connection handle : PB=10 : BC=00
    bt_store_16(acl_buffer, 0, handle | (0 << 12) | (0 << 14));
    // 2 - ACL length
    bt_store_16(acl_buffer, 2,  len + 4);
    // 4 - L2CAP packet length
    bt_store_16(acl_buffer, 4,  len + 0);
    // 6 - L2CAP channel DEST
    bt_store_16(acl_buffer, 6, cid);

    memcpy(&acl_buffer[8], packet, len);
    hci_dump_packet(HCI_ACL_DATA_PACKET, 1, &acl_buffer[0], len + 8);

    le_data_handler(SM_DATA_PACKET, handle, packet, len);
}
Esempio n. 30
0
int l2cap_send_connectionless(uint16_t handle, uint16_t cid, uint8_t * buffer, uint16_t len) {
    // printf("l2cap_send_connectionless\n");

    int pb = hci_non_flushable_packet_boundary_flag_supported() ? 0x00 : 0x02;

    // 0 - Connection handle : PB=pb : BC=00
    bt_store_16(packet_buffer, 0, handle | (pb << 12) | (0 << 14));
    // 2 - ACL length
    bt_store_16(packet_buffer, 2,  len + 4);
    // 4 - L2CAP packet length
    bt_store_16(packet_buffer, 4,  len + 0);
    // 6 - L2CAP channel DEST
    bt_store_16(packet_buffer, 6, cid);

    memcpy(&packet_buffer[8], buffer, len);
    hci_dump_packet(HCI_ACL_DATA_PACKET, 0, &packet_buffer[0], len + 8);

    dump_packet(HCI_ACL_DATA_PACKET, packet_buffer, len + 8);
    packet_buffer_len = len + 8;

    return 0;
}