static void put_link_key(bd_addr_t bd_addr, link_key_t link_key, link_key_type_t link_key_type){

    // check for existing record and remove if found
    btstack_link_key_db_memory_entry_t * record = get_item(db_mem_link_keys, bd_addr);
    if (record){
        btstack_linked_list_remove(&db_mem_link_keys, (btstack_linked_item_t*) record);
    }

    // record not found, get new one from memory pool
    if (!record) {
        record = btstack_memory_btstack_link_key_db_memory_entry_get();
    }

    // if none left, re-use last item and remove from list
    if (!record){
        record = (btstack_link_key_db_memory_entry_t*) btstack_linked_list_get_last_item(&db_mem_link_keys);
        if (record) {
            btstack_linked_list_remove(&db_mem_link_keys, (btstack_linked_item_t*) record);
        }
    }
        
    if (!record) return;
    
    memcpy(record->bd_addr, bd_addr, sizeof(bd_addr_t));
    memcpy(record->link_key, link_key, LINK_KEY_LEN);
    record->link_key_type = link_key_type;
    btstack_linked_list_add(&db_mem_link_keys, (btstack_linked_item_t *) record);
}
/**
 * Remove timer from run loop
 */
static int btstack_run_loop_embedded_remove_timer(btstack_timer_source_t *ts){
#ifdef TIMER_SUPPORT
    return btstack_linked_list_remove(&timers, (btstack_linked_item_t *) ts);
#else
    return 0;
#endif
}
static void delete_link_key(bd_addr_t bd_addr){
    btstack_link_key_db_memory_entry_t * item = get_item(db_mem_link_keys, bd_addr);
    
    if (!item) return;
    
    btstack_linked_list_remove(&db_mem_link_keys, (btstack_linked_item_t *) item);
    btstack_memory_btstack_link_key_db_memory_entry_free((btstack_link_key_db_memory_entry_t*)item);
}
static int get_link_key(bd_addr_t bd_addr, link_key_t link_key, link_key_type_t * link_key_type) {
    btstack_link_key_db_memory_entry_t * item = get_item(db_mem_link_keys, bd_addr);
    
    if (!item) return 0;
    
    memcpy(link_key, item->link_key, LINK_KEY_LEN);
    if (link_key_type) {
        *link_key_type = item->link_key_type;
    }
	btstack_linked_list_remove(&db_mem_link_keys, (btstack_linked_item_t *) item);
    btstack_linked_list_add(&db_mem_link_keys, (btstack_linked_item_t *) item);

	return 1;
}
示例#5
0
static void att_server_handle_can_send_now(void){

    // NOTE: we get l2cap fixed channel instead of con_handle 

    btstack_linked_list_iterator_t it;
    hci_connections_get_iterator(&it);
    while(btstack_linked_list_iterator_has_next(&it)){
        hci_connection_t * connection = (hci_connection_t *) btstack_linked_list_iterator_next(&it);
        att_server_t * att_server = &connection->att_server;
        if (att_server->state == ATT_SERVER_REQUEST_RECEIVED_AND_VALIDATED){
            int sent = att_server_process_validated_request(att_server);
            if (sent && (att_client_waiting_for_can_send || !btstack_linked_list_empty(&can_send_now_clients))){
                att_dispatch_server_request_can_send_now_event(att_server->connection.con_handle);
                return;
            }
        }
    }

    while (!btstack_linked_list_empty(&can_send_now_clients)){
        // handle first client
        btstack_context_callback_registration_t * client = (btstack_context_callback_registration_t*) can_send_now_clients;
        hci_con_handle_t con_handle = (uintptr_t) client->context;
        btstack_linked_list_remove(&can_send_now_clients, (btstack_linked_item_t *) client);
        client->callback(client->context);

        // request again if needed
        if (!att_dispatch_server_can_send_now(con_handle)){
            if (!btstack_linked_list_empty(&can_send_now_clients) || att_client_waiting_for_can_send){
                att_dispatch_server_request_can_send_now_event(con_handle);
            }
            return;
        }
    }

    if (att_client_waiting_for_can_send){
        att_client_waiting_for_can_send = 0;
        att_emit_can_send_now_event();
    }
}
/**
 * Remove data_source from run loop
 */
static int btstack_run_loop_embedded_remove_data_source(btstack_data_source_t *ds){
    return btstack_linked_list_remove(&data_sources, (btstack_linked_item_t *) ds);
}
/**
 * Remove data_source from run loop
 */
static int btstack_run_loop_posix_remove_data_source(btstack_data_source_t *ds){
    data_sources_modified = 1;
    // log_info("btstack_run_loop_posix_remove_data_source %x\n", (int) ds);
    return btstack_linked_list_remove(&data_sources, (btstack_linked_item_t *) ds);
}
/**
 * Remove timer from run loop
 */
static int btstack_run_loop_posix_remove_timer(btstack_timer_source_t *ts){
    // log_info("Removed timer %x at %u\n", (int) ts, (unsigned int) ts->timeout.tv_sec);
    // btstack_run_loop_posix_dump_timer();
    return btstack_linked_list_remove(&timers, (btstack_linked_item_t *) ts);
}