xref: /btstack/src/classic/btstack_link_key_db_memory.c (revision 2fca4dad957cd7b88f4657ed51e89c12615dda72)
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