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