1a98592bcSMatthias Ringwald /*
2a98592bcSMatthias Ringwald * Copyright (C) 2014 BlueKitchen GmbH
3a98592bcSMatthias Ringwald *
4a98592bcSMatthias Ringwald * Redistribution and use in source and binary forms, with or without
5a98592bcSMatthias Ringwald * modification, are permitted provided that the following conditions
6a98592bcSMatthias Ringwald * are met:
7a98592bcSMatthias Ringwald *
8a98592bcSMatthias Ringwald * 1. Redistributions of source code must retain the above copyright
9a98592bcSMatthias Ringwald * notice, this list of conditions and the following disclaimer.
10a98592bcSMatthias Ringwald * 2. Redistributions in binary form must reproduce the above copyright
11a98592bcSMatthias Ringwald * notice, this list of conditions and the following disclaimer in the
12a98592bcSMatthias Ringwald * documentation and/or other materials provided with the distribution.
13a98592bcSMatthias Ringwald * 3. Neither the name of the copyright holders nor the names of
14a98592bcSMatthias Ringwald * contributors may be used to endorse or promote products derived
15a98592bcSMatthias Ringwald * from this software without specific prior written permission.
16a98592bcSMatthias Ringwald * 4. Any redistribution, use, or modification is done solely for
17a98592bcSMatthias Ringwald * personal benefit and not for any commercial purpose or for
18a98592bcSMatthias Ringwald * monetary gain.
19a98592bcSMatthias Ringwald *
20a98592bcSMatthias Ringwald * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS
21a98592bcSMatthias Ringwald * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22a98592bcSMatthias Ringwald * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23*2fca4dadSMilanka Ringwald * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BLUEKITCHEN
24*2fca4dadSMilanka Ringwald * GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
25a98592bcSMatthias Ringwald * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
26a98592bcSMatthias Ringwald * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
27a98592bcSMatthias Ringwald * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
28a98592bcSMatthias Ringwald * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29a98592bcSMatthias Ringwald * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
30a98592bcSMatthias Ringwald * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31a98592bcSMatthias Ringwald * SUCH DAMAGE.
32a98592bcSMatthias Ringwald *
33a98592bcSMatthias Ringwald * Please inquire about commercial licensing options at
34a98592bcSMatthias Ringwald * [email protected]
35a98592bcSMatthias Ringwald *
36a98592bcSMatthias Ringwald */
37a98592bcSMatthias Ringwald
38e501bae0SMatthias Ringwald #define BTSTACK_FILE__ "btstack_link_key_db_memory.c"
39ab2c6ae4SMatthias Ringwald
40a98592bcSMatthias Ringwald #include <string.h>
41a98592bcSMatthias Ringwald #include <stdlib.h>
42a98592bcSMatthias Ringwald
43a98592bcSMatthias Ringwald #include "classic/btstack_link_key_db_memory.h"
44a98592bcSMatthias Ringwald
45a98592bcSMatthias Ringwald #include "btstack_debug.h"
46a98592bcSMatthias Ringwald #include "btstack_linked_list.h"
47a98592bcSMatthias Ringwald #include "btstack_memory.h"
48a98592bcSMatthias Ringwald #include "btstack_util.h"
4959c6af15SMatthias Ringwald #include "classic/core.h"
50a98592bcSMatthias Ringwald
51a98592bcSMatthias Ringwald // This list should be directly accessed only by tests
52a98592bcSMatthias Ringwald btstack_linked_list_t db_mem_link_keys = NULL;
53a98592bcSMatthias Ringwald
54a98592bcSMatthias Ringwald // Device info
db_open(void)55a98592bcSMatthias Ringwald static void db_open(void){
56a98592bcSMatthias Ringwald }
57a98592bcSMatthias Ringwald
db_set_local_bd_addr(bd_addr_t bd_addr)581624665aSMatthias Ringwald static void db_set_local_bd_addr(bd_addr_t bd_addr){
599ec2630cSMatthias Ringwald (void)bd_addr;
601624665aSMatthias Ringwald }
611624665aSMatthias Ringwald
db_close(void)62a98592bcSMatthias Ringwald static void db_close(void){
63a98592bcSMatthias Ringwald }
64a98592bcSMatthias Ringwald
get_item(btstack_linked_list_t list,bd_addr_t bd_addr)65d56ad4f6SMatthias Ringwald static btstack_link_key_db_memory_entry_t * get_item(btstack_linked_list_t list, bd_addr_t bd_addr) {
66a98592bcSMatthias Ringwald btstack_linked_item_t *it;
67a98592bcSMatthias Ringwald for (it = (btstack_linked_item_t *) list; it ; it = it->next){
68d56ad4f6SMatthias Ringwald btstack_link_key_db_memory_entry_t * item = (btstack_link_key_db_memory_entry_t *) it;
69058e3d6bSMatthias Ringwald if (bd_addr_cmp(item->bd_addr, bd_addr) == 0) {
70a98592bcSMatthias Ringwald return item;
71a98592bcSMatthias Ringwald }
72a98592bcSMatthias Ringwald }
73a98592bcSMatthias Ringwald return NULL;
74a98592bcSMatthias Ringwald }
75a98592bcSMatthias Ringwald
get_link_key(bd_addr_t bd_addr,link_key_t link_key,link_key_type_t * link_key_type)76a98592bcSMatthias Ringwald static int get_link_key(bd_addr_t bd_addr, link_key_t link_key, link_key_type_t * link_key_type) {
77d56ad4f6SMatthias Ringwald btstack_link_key_db_memory_entry_t * item = get_item(db_mem_link_keys, bd_addr);
78a98592bcSMatthias Ringwald
79a98592bcSMatthias Ringwald if (!item) return 0;
80a98592bcSMatthias Ringwald
816535961aSMatthias Ringwald (void)memcpy(link_key, item->link_key, LINK_KEY_LEN);
82a98592bcSMatthias Ringwald if (link_key_type) {
83a98592bcSMatthias Ringwald *link_key_type = item->link_key_type;
84a98592bcSMatthias Ringwald }
85a98592bcSMatthias Ringwald btstack_linked_list_remove(&db_mem_link_keys, (btstack_linked_item_t *) item);
86a98592bcSMatthias Ringwald btstack_linked_list_add(&db_mem_link_keys, (btstack_linked_item_t *) item);
87a98592bcSMatthias Ringwald
88a98592bcSMatthias Ringwald return 1;
89a98592bcSMatthias Ringwald }
90a98592bcSMatthias Ringwald
delete_link_key(bd_addr_t bd_addr)91a98592bcSMatthias Ringwald static void delete_link_key(bd_addr_t bd_addr){
92d56ad4f6SMatthias Ringwald btstack_link_key_db_memory_entry_t * item = get_item(db_mem_link_keys, bd_addr);
93a98592bcSMatthias Ringwald
94a98592bcSMatthias Ringwald if (!item) return;
95a98592bcSMatthias Ringwald
96a98592bcSMatthias Ringwald btstack_linked_list_remove(&db_mem_link_keys, (btstack_linked_item_t *) item);
97d56ad4f6SMatthias Ringwald btstack_memory_btstack_link_key_db_memory_entry_free((btstack_link_key_db_memory_entry_t*)item);
98a98592bcSMatthias Ringwald }
99a98592bcSMatthias Ringwald
100a98592bcSMatthias Ringwald
put_link_key(bd_addr_t bd_addr,link_key_t link_key,link_key_type_t link_key_type)101a98592bcSMatthias Ringwald static void put_link_key(bd_addr_t bd_addr, link_key_t link_key, link_key_type_t link_key_type){
102a98592bcSMatthias Ringwald
103a98592bcSMatthias Ringwald // check for existing record and remove if found
104d56ad4f6SMatthias Ringwald btstack_link_key_db_memory_entry_t * record = get_item(db_mem_link_keys, bd_addr);
105a98592bcSMatthias Ringwald if (record){
106a98592bcSMatthias Ringwald btstack_linked_list_remove(&db_mem_link_keys, (btstack_linked_item_t*) record);
107a98592bcSMatthias Ringwald }
108a98592bcSMatthias Ringwald
109a98592bcSMatthias Ringwald // record not found, get new one from memory pool
110a98592bcSMatthias Ringwald if (!record) {
111d56ad4f6SMatthias Ringwald record = btstack_memory_btstack_link_key_db_memory_entry_get();
112a98592bcSMatthias Ringwald }
113a98592bcSMatthias Ringwald
114a98592bcSMatthias Ringwald // if none left, re-use last item and remove from list
115a98592bcSMatthias Ringwald if (!record){
116d56ad4f6SMatthias Ringwald record = (btstack_link_key_db_memory_entry_t*) btstack_linked_list_get_last_item(&db_mem_link_keys);
117a98592bcSMatthias Ringwald if (record) {
118a98592bcSMatthias Ringwald btstack_linked_list_remove(&db_mem_link_keys, (btstack_linked_item_t*) record);
119a98592bcSMatthias Ringwald }
120a98592bcSMatthias Ringwald }
121a98592bcSMatthias Ringwald
122a98592bcSMatthias Ringwald if (!record) return;
123a98592bcSMatthias Ringwald
1246535961aSMatthias Ringwald (void)memcpy(record->bd_addr, bd_addr, sizeof(bd_addr_t));
1256535961aSMatthias Ringwald (void)memcpy(record->link_key, link_key, LINK_KEY_LEN);
126a98592bcSMatthias Ringwald record->link_key_type = link_key_type;
127a98592bcSMatthias Ringwald btstack_linked_list_add(&db_mem_link_keys, (btstack_linked_item_t *) record);
128a98592bcSMatthias Ringwald }
129a98592bcSMatthias Ringwald
iterator_init(btstack_link_key_iterator_t * it)130404999feSMatthias Ringwald static int iterator_init(btstack_link_key_iterator_t * it){
131404999feSMatthias Ringwald it->context = (void*) db_mem_link_keys;
132404999feSMatthias Ringwald return 1;
133404999feSMatthias Ringwald }
134404999feSMatthias Ringwald
iterator_get_next(btstack_link_key_iterator_t * it,bd_addr_t bd_addr,link_key_t link_key,link_key_type_t * link_key_type)135404999feSMatthias Ringwald static int iterator_get_next(btstack_link_key_iterator_t * it, bd_addr_t bd_addr, link_key_t link_key, link_key_type_t * link_key_type){
136404999feSMatthias Ringwald btstack_link_key_db_memory_entry_t *item = (btstack_link_key_db_memory_entry_t *) it->context;
137404999feSMatthias Ringwald if (item == NULL) return 0;
138404999feSMatthias Ringwald
139404999feSMatthias Ringwald // fetch values
1406535961aSMatthias Ringwald (void)memcpy(bd_addr, item->bd_addr, 6);
1416535961aSMatthias Ringwald (void)memcpy(link_key, item->link_key, 16);
142404999feSMatthias Ringwald *link_key_type = item->link_key_type;
143404999feSMatthias Ringwald
144404999feSMatthias Ringwald // next
145404999feSMatthias Ringwald it->context = (void *) item->item.next;
146404999feSMatthias Ringwald
147404999feSMatthias Ringwald return 1;
148404999feSMatthias Ringwald }
149404999feSMatthias Ringwald
iterator_done(btstack_link_key_iterator_t * it)150404999feSMatthias Ringwald static void iterator_done(btstack_link_key_iterator_t * it){
151404999feSMatthias Ringwald UNUSED(it);
152404999feSMatthias Ringwald }
153404999feSMatthias Ringwald
154a98592bcSMatthias Ringwald const btstack_link_key_db_t btstack_link_key_db_memory = {
155a98592bcSMatthias Ringwald db_open,
1561624665aSMatthias Ringwald db_set_local_bd_addr,
157a98592bcSMatthias Ringwald db_close,
158a98592bcSMatthias Ringwald get_link_key,
159a98592bcSMatthias Ringwald put_link_key,
160a98592bcSMatthias Ringwald delete_link_key,
161404999feSMatthias Ringwald iterator_init,
162404999feSMatthias Ringwald iterator_get_next,
163404999feSMatthias Ringwald iterator_done,
164a98592bcSMatthias Ringwald };
165a98592bcSMatthias Ringwald
btstack_link_key_db_memory_instance(void)166a98592bcSMatthias Ringwald const btstack_link_key_db_t * btstack_link_key_db_memory_instance(void){
167a98592bcSMatthias Ringwald return &btstack_link_key_db_memory;
168a98592bcSMatthias Ringwald }
169a98592bcSMatthias Ringwald
170a98592bcSMatthias Ringwald
171