split remote_device_db into btstack_link_key_db and btstack_device_name_db

This commit is contained in:
Matthias Ringwald 2016-02-02 21:57:10 +01:00
parent c4786d381e
commit a98592bc68
38 changed files with 926 additions and 619 deletions

View File

@ -18,7 +18,7 @@ apis = [
["src/classic/bnep.h", "BNEP", "bnep"],
["src/classic/pan.h", "PAN", "pan"],
["src/classic/remote_device_db.h","Remote Device DB","rdevDb"],
["src/classic/btstack_link_key_db.h","Remote Device DB","rdevDb"],
["src/classic/rfcomm.h", "RFCOMM", "rfcomm"],
["src/classic/sdp.h", "SDP", "sdp"],
["src/classic/sdp_client.h", "SDP Client", "sdpClient"],

View File

@ -21,7 +21,7 @@ COMMON += \
hci_dump.c \
l2cap.c \
l2cap_signaling.c \
remote_device_db_memory.c \
btstack_link_key_db_memory.c \
sdp_util.c \
rfcomm.c \
bnep.c \

View File

@ -0,0 +1,58 @@
/*
* Copyright (C) 2014 BlueKitchen GmbH
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
* 4. Any redistribution, use, or modification is done solely for
* personal benefit and not for any commercial purpose or for
* monetary gain.
*
* THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS
* RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
* THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* Please inquire about commercial licensing options at
* contact@bluekitchen-gmbh.com
*
*/
#ifndef __BTSTACK_LINK_KEY_DB_FS_H
#define __BTSTACK_LINK_KEY_DB_FS_H
#include "classic/btstack_link_key_db.h"
#if defined __cplusplus
extern "C" {
#endif
/*
* @brief Get basic link key db implementation that stores link keys in /tmp
*/
const btstack_link_key_db_t * btstack_link_key_db_fs_instance(void);
/* API_END */
#if defined __cplusplus
}
#endif
#endif // __BTSTACK_LINK_KEY_DB_FS_H

View File

@ -0,0 +1,203 @@
/*
* Copyright (C) 2009-2012 by Matthias Ringwald
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
* 4. Any redistribution, use, or modification is done solely for
* personal benefit and not for any commercial purpose or for
* monetary gain.
*
* THIS SOFTWARE IS PROVIDED BY MATTHIAS RINGWALD AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS
* RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
* THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* Please inquire about commercial licensing options at btstack@ringwald.ch
*
*/
#include "classic/btstack_link_key_db.h"
#include "btstack_debug.h"
#import <Foundation/Foundation.h>
#define BTdaemonID "ch.ringwald.btdaemon"
#define BTDaemonPrefsPath "Library/Preferences/ch.ringwald.btdaemon.plist"
#define DEVICES_KEY "devices"
#define PREFS_REMOTE_NAME @"RemoteName"
#define PREFS_LINK_KEY @"LinkKey"
static void put_name(bd_addr_t bd_addr, device_name_t *device_name);
static NSMutableDictionary *remote_devices = nil;
// Device info
static void db_open(void){
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
// NSUserDefaults didn't work
//
// NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
// NSDictionary * dict = [defaults persistentDomainForName:BTdaemonID];
// NSDictionary * dict = (NSDictionary*) CFPreferencesCopyAppValue(CFSTR(DEVICES_KEY), CFSTR(BTdaemonID));
NSDictionary * dict;
dict = (NSDictionary*) CFPreferencesCopyAppValue(CFSTR(DEVICES_KEY), CFSTR(BTdaemonID));
remote_devices = [[NSMutableDictionary alloc] initWithCapacity:([dict count]+5)];
// copy entries
for (id key in dict) {
NSDictionary *value = [dict objectForKey:key];
NSMutableDictionary *deviceEntry = [NSMutableDictionary dictionaryWithCapacity:[value count]];
[deviceEntry addEntriesFromDictionary:value];
[remote_devices setObject:deviceEntry forKey:key];
}
log_info("read prefs for %u devices\n", (unsigned int) [dict count]);
[pool release];
}
static void db_synchronize(void){
log_info("stored prefs for %u devices\n", (unsigned int) [remote_devices count]);
// 3 different ways
// Core Foundation
CFPreferencesSetValue(CFSTR(DEVICES_KEY), (CFPropertyListRef) remote_devices, CFSTR(BTdaemonID), kCFPreferencesCurrentUser, kCFPreferencesCurrentHost);
CFPreferencesSynchronize(CFSTR(BTdaemonID), kCFPreferencesCurrentUser, kCFPreferencesCurrentHost);
// NSUserDefaults didn't work
//
// NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
// [defaults setPersistentDomain:remote_devices forName:BTdaemonID];
// [defaults synchronize];
}
static void db_close(void){
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
// don't call db_synchronize();
// a) we're calling db_synchronize() after each change already
// b) db_close is called during the SIGINT handler which causes a corrupt prefs file
[remote_devices release];
remote_devices = nil;
[pool release];
}
static NSString * stringForAddress(bd_addr_t addr) {
return [NSString stringWithFormat:@"%02x:%02x:%02x:%02x:%02x:%02x", addr[0], addr[1], addr[2],
addr[3], addr[4], addr[5]];
}
static void set_value(bd_addr_t bd_addr, NSString *key, id value){
NSString *devAddress = stringForAddress(bd_addr);
NSMutableDictionary * deviceDict = [remote_devices objectForKey:devAddress];
if (!deviceDict){
deviceDict = [NSMutableDictionary dictionaryWithCapacity:3];
[remote_devices setObject:deviceDict forKey:devAddress];
}
[deviceDict setObject:value forKey:key];
db_synchronize();
}
static void delete_value(bd_addr_t bd_addr, NSString *key){
NSString *devAddress = stringForAddress(bd_addr);
NSMutableDictionary * deviceDict = [remote_devices objectForKey:devAddress];
[deviceDict removeObjectForKey:key];
db_synchronize();
}
static id get_value(bd_addr_t bd_addr, NSString *key){
NSString *devAddress = stringForAddress(bd_addr);
NSMutableDictionary * deviceDict = [remote_devices objectForKey:devAddress];
if (!deviceDict) return nil;
return [deviceDict objectForKey:key];
}
static int get_link_key(bd_addr_t bd_addr, link_key_t link_key, link_key_type_t * link_key_type) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSData *linkKey = get_value(bd_addr, PREFS_LINK_KEY);
if ([linkKey length] == LINK_KEY_LEN){
memcpy(link_key, [linkKey bytes], LINK_KEY_LEN);
if (link_key_type){
*link_key_type = COMBINATION_KEY;
}
}
[pool release];
return (linkKey != nil);
}
static void put_link_key(bd_addr_t bd_addr, link_key_t link_key, link_key_type_t link_key_type){
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSData *linkKey = [NSData dataWithBytes:link_key length:16];
set_value(bd_addr, PREFS_LINK_KEY, linkKey);
[pool release];
}
static void delete_link_key(bd_addr_t bd_addr){
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
delete_value(bd_addr, PREFS_LINK_KEY);
[pool release];
}
static void put_name(bd_addr_t bd_addr, device_name_t *device_name){
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSString *remoteName = [NSString stringWithUTF8String:(char*)device_name];
if (!remoteName){
remoteName = [NSString stringWithCString:(char*)device_name encoding:NSISOLatin1StringEncoding];
}
if (remoteName) {
set_value(bd_addr, PREFS_REMOTE_NAME, remoteName);
}
[pool release];
}
static void delete_name(bd_addr_t bd_addr){
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
delete_value(bd_addr, PREFS_REMOTE_NAME);
[pool release];
}
static int get_name(bd_addr_t bd_addr, device_name_t *device_name) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSString *remoteName = get_value(bd_addr, PREFS_REMOTE_NAME);
if (remoteName){
memset(device_name, 0, sizeof(device_name_t));
strncpy((char*) device_name, [remoteName UTF8String], sizeof(device_name_t)-1);
}
[pool release];
return (remoteName != nil);
}
remote_device_db_t remote_device_db_iphone = {
db_open,
db_close,
get_link_key,
put_link_key,
delete_link_key,
get_name,
put_name,
delete_name,
};

View File

@ -0,0 +1,58 @@
/*
* Copyright (C) 2014 BlueKitchen GmbH
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
* 4. Any redistribution, use, or modification is done solely for
* personal benefit and not for any commercial purpose or for
* monetary gain.
*
* THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS
* RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
* THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* Please inquire about commercial licensing options at
* contact@bluekitchen-gmbh.com
*
*/
#ifndef __BTSTACK_LINK_KEY_DB_FS_H
#define __BTSTACK_LINK_KEY_DB_FS_H
#include "classic/btstack_link_key_db.h"
#if defined __cplusplus
extern "C" {
#endif
/*
* @brief Get basic link key db implementation that stores link keys preferences
*/
const btstack_link_key_db_t * btstack_link_key_db_cocoa_instance(void);
/* API_END */
#if defined __cplusplus
}
#endif
#endif // __BTSTACK_LINK_KEY_DB_FS_H

View File

@ -0,0 +1,171 @@
/*
* Copyright (C) 2009-2012 by Matthias Ringwald
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
* 4. Any redistribution, use, or modification is done solely for
* personal benefit and not for any commercial purpose or for
* monetary gain.
*
* THIS SOFTWARE IS PROVIDED BY MATTHIAS RINGWALD AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS
* RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
* THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* Please inquire about commercial licensing options at btstack@ringwald.ch
*
*/
#include "btstack_link_key_db_cocoa.h"
#include "btstack_debug.h"
#import <Foundation/Foundation.h>
#define BTdaemonID "ch.ringwald.btdaemon"
#define BTDaemonPrefsPath "Library/Preferences/ch.ringwald.btdaemon.plist"
#define DEVICES_KEY "devices"
#define PREFS_LINK_KEY @"LinkKey"
static NSMutableDictionary *remote_devices = nil;
// Device info
static void db_open(void){
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
// NSUserDefaults didn't work
//
// NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
// NSDictionary * dict = [defaults persistentDomainForName:BTdaemonID];
// NSDictionary * dict = (NSDictionary*) CFPreferencesCopyAppValue(CFSTR(DEVICES_KEY), CFSTR(BTdaemonID));
NSDictionary * dict;
dict = (NSDictionary*) CFPreferencesCopyAppValue(CFSTR(DEVICES_KEY), CFSTR(BTdaemonID));
remote_devices = [[NSMutableDictionary alloc] initWithCapacity:([dict count]+5)];
// copy entries
for (id key in dict) {
NSDictionary *value = [dict objectForKey:key];
NSMutableDictionary *deviceEntry = [NSMutableDictionary dictionaryWithCapacity:[value count]];
[deviceEntry addEntriesFromDictionary:value];
[remote_devices setObject:deviceEntry forKey:key];
}
log_info("read prefs for %u devices\n", (unsigned int) [dict count]);
[pool release];
}
static void db_synchronize(void){
log_info("stored prefs for %u devices\n", (unsigned int) [remote_devices count]);
// 3 different ways
// Core Foundation
CFPreferencesSetValue(CFSTR(DEVICES_KEY), (CFPropertyListRef) remote_devices, CFSTR(BTdaemonID), kCFPreferencesCurrentUser, kCFPreferencesCurrentHost);
CFPreferencesSynchronize(CFSTR(BTdaemonID), kCFPreferencesCurrentUser, kCFPreferencesCurrentHost);
// NSUserDefaults didn't work
//
// NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
// [defaults setPersistentDomain:remote_devices forName:BTdaemonID];
// [defaults synchronize];
}
static void db_close(void){
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
// don't call db_synchronize();
// a) we're calling db_synchronize() after each change already
// b) db_close is called during the SIGINT handler which causes a corrupt prefs file
[remote_devices release];
remote_devices = nil;
[pool release];
}
static NSString * stringForAddress(bd_addr_t addr) {
return [NSString stringWithFormat:@"%02x:%02x:%02x:%02x:%02x:%02x", addr[0], addr[1], addr[2],
addr[3], addr[4], addr[5]];
}
static void set_value(bd_addr_t bd_addr, NSString *key, id value){
NSString *devAddress = stringForAddress(bd_addr);
NSMutableDictionary * deviceDict = [remote_devices objectForKey:devAddress];
if (!deviceDict){
deviceDict = [NSMutableDictionary dictionaryWithCapacity:3];
[remote_devices setObject:deviceDict forKey:devAddress];
}
[deviceDict setObject:value forKey:key];
db_synchronize();
}
static void delete_value(bd_addr_t bd_addr, NSString *key){
NSString *devAddress = stringForAddress(bd_addr);
NSMutableDictionary * deviceDict = [remote_devices objectForKey:devAddress];
[deviceDict removeObjectForKey:key];
db_synchronize();
}
static id get_value(bd_addr_t bd_addr, NSString *key){
NSString *devAddress = stringForAddress(bd_addr);
NSMutableDictionary * deviceDict = [remote_devices objectForKey:devAddress];
if (!deviceDict) return nil;
return [deviceDict objectForKey:key];
}
static int get_link_key(bd_addr_t bd_addr, link_key_t link_key, link_key_type_t * link_key_type) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSData *linkKey = get_value(bd_addr, PREFS_LINK_KEY);
if ([linkKey length] == LINK_KEY_LEN){
memcpy(link_key, [linkKey bytes], LINK_KEY_LEN);
if (link_key_type){
*link_key_type = COMBINATION_KEY;
}
}
[pool release];
return (linkKey != nil);
}
static void put_link_key(bd_addr_t bd_addr, link_key_t link_key, link_key_type_t link_key_type){
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSData *linkKey = [NSData dataWithBytes:link_key length:16];
set_value(bd_addr, PREFS_LINK_KEY, linkKey);
[pool release];
}
static void delete_link_key(bd_addr_t bd_addr){
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
delete_value(bd_addr, PREFS_LINK_KEY);
[pool release];
}
const btstack_link_key_db_t btstack_link_key_db_cocoa = {
db_open,
db_close,
get_link_key,
put_link_key,
delete_link_key,
};
const btstack_link_key_db_t * btstack_link_key_db_cocoa_instance(void){
return &btstack_link_key_db_cocoa;
}

View File

@ -33,7 +33,7 @@
* Please inquire about commercial licensing options at btstack@ringwald.ch
*
*/
#include "classic/remote_device_db.h"
#include "classic/btstack_link_key_db.h"
#include "btstack_debug.h"
#import <Foundation/Foundation.h>

View File

@ -39,8 +39,8 @@
* interface to provide link key and remote name storage
*/
#ifndef __REMOTE_DEVICE_DB_H
#define __REMOTE_DEVICE_DB_H
#ifndef __BTSTACK_DEVICE_NAME_DB_H
#define __BTSTACK_DEVICE_NAME_DB_H
#include "btstack_util.h"
#include "gap.h"
@ -56,69 +56,18 @@ typedef struct {
// management
void (*open)(void);
void (*close)(void);
// link key
int (*get_link_key)(bd_addr_t bd_addr, link_key_t link_key, link_key_type_t * type);
void (*put_link_key)(bd_addr_t bd_addr, link_key_t link_key, link_key_type_t type);
void (*delete_link_key)(bd_addr_t bd_addr);
// remote name
int (*get_name)(bd_addr_t bd_addr, device_name_t *device_name);
void (*put_name)(bd_addr_t bd_addr, device_name_t *device_name);
void (*delete_name)(bd_addr_t bd_addr);
} remote_device_db_t;
/*
* @brief
*/
extern remote_device_db_t remote_device_db_iphone;
/*
* @brief
*/
extern const remote_device_db_t remote_device_db_memory;
/*
* @brief
*/
extern const remote_device_db_t remote_device_db_fs;
const remote_device_db_t * remote_device_db_fs_instance(void);
} btstack_device_name_db_t;
/* API_END */
// MARK: non-persistent implementation
#include "btstack_linked_list.h"
#define MAX_NAME_LEN 32
typedef struct {
// linked list - assert: first field
btstack_linked_item_t item;
bd_addr_t bd_addr;
} db_mem_device_t;
typedef struct {
db_mem_device_t device;
link_key_t link_key;
link_key_type_t link_key_type;
} db_mem_device_link_key_t;
typedef struct {
db_mem_device_t device;
char device_name[MAX_NAME_LEN];
} db_mem_device_name_t;
typedef struct {
// linked list - assert: first field
btstack_linked_item_t item;
char service_name[MAX_NAME_LEN];
uint8_t channel;
} db_mem_service_t;
#if defined __cplusplus
}
#endif
#endif // __REMOTE_DEVICE_DB_H
#endif // __BTSTACK_DEVICE_NAME_DB_H

View File

@ -58,12 +58,13 @@
#include "btstack.h"
#include "btstack_client.h"
#include "btstack_debug.h"
#include "btstack_device_name_db.h"
#include "btstack_event.h"
#include "btstack_linked_list.h"
#include "btstack_run_loop.h"
#include "btstack_run_loop_posix.h"
#include "btstack_version.h"
#include "classic/remote_device_db.h"
#include "classic/btstack_link_key_db.h"
#include "classic/rfcomm.h"
#include "classic/sdp.h"
#include "classic/sdp_client.h"
@ -187,7 +188,8 @@ static void (*bluetooth_status_handler)(BLUETOOTH_STATE state) = dummy_bluetooth
static int global_enable = 0;
static remote_device_db_t const * remote_device_db = NULL;
static btstack_link_key_db_t const * btstack_link_key_db = NULL;
static btstack_device_name_db_t const * btstack_device_name_db = NULL;
// static int rfcomm_channel_generator = 1;
static uint8_t attribute_value[1000];
@ -1513,7 +1515,7 @@ static void daemon_packet_handler(void * connection, uint8_t packet_type, uint16
return;
case HCI_EVENT_REMOTE_NAME_REQUEST_COMPLETE:
if (!remote_device_db) break;
if (!btstack_device_name_db) break;
if (packet[2]) break; // status not ok
bt_flip_addr(addr, &packet[3]);
@ -1525,12 +1527,12 @@ static void daemon_packet_handler(void * connection, uint8_t packet_type, uint16
}
}
packet[9+248] = 0;
remote_device_db->put_name(addr, (device_name_t *)&packet[9]);
btstack_device_name_db->put_name(addr, (device_name_t *)&packet[9]);
break;
case HCI_EVENT_INQUIRY_RESULT:
case HCI_EVENT_INQUIRY_RESULT_WITH_RSSI:{
if (!remote_device_db) break;
if (!btstack_device_name_db) break;
// first send inq result packet
daemon_emit_packet(connection, packet_type, channel, packet, size);
@ -1539,7 +1541,7 @@ static void daemon_packet_handler(void * connection, uint8_t packet_type, uint16
int offset = 3;
for (i=0; i<packet[2];i++){
bt_flip_addr(addr, &packet[offset]);
if (remote_device_db->get_name(addr, (device_name_t *) &remote_name_event[9])){
if (btstack_device_name_db->get_name(addr, (device_name_t *) &remote_name_event[9])){
remote_name_event[0] = BTSTACK_EVENT_REMOTE_NAME_CACHED;
remote_name_event[1] = sizeof(remote_name_event) - 2 - 1;
remote_name_event[2] = 0; // just to be compatible with HCI_EVENT_REMOTE_NAME_REQUEST_COMPLETE
@ -2015,8 +2017,8 @@ int main (int argc, char * const * argv){
platform_iphone_register_preferences_changed(preferences_changed_callback);
#endif
#ifdef REMOTE_DEVICE_DB
remote_device_db = &REMOTE_DEVICE_DB;
#ifdef btstack_link_key_db
btstack_link_key_db = &btstack_link_key_db;
#endif
btstack_run_loop_init(btstack_run_loop_posix_get_instance());
@ -2040,7 +2042,7 @@ int main (int argc, char * const * argv){
log_info("version %s, build %s", BTSTACK_VERSION, BTSTACK_DATE);
// init HCI
hci_init(transport, config, remote_device_db);
hci_init(transport, config, btstack_link_key_db);
if (control){
hci_set_control(control);
}

View File

@ -1,154 +0,0 @@
/*
* Copyright (C) 2014 BlueKitchen GmbH
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
* 4. Any redistribution, use, or modification is done solely for
* personal benefit and not for any commercial purpose or for
* monetary gain.
*
* THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS
* RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
* THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* Please inquire about commercial licensing options at
* contact@bluekitchen-gmbh.com
*
*/
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include "classic/remote_device_db.h"
#include "btstack_debug.h"
#include "btstack_util.h"
#define LINK_KEY_PATH "/tmp/"
#define LINK_KEY_PREFIX "btstack_link_key_"
#define LINK_KEY_SUFIX ".txt"
static char keypath[sizeof(LINK_KEY_PATH) + sizeof(LINK_KEY_PREFIX) + 17 + sizeof(LINK_KEY_SUFIX) + 1];
static char bd_addr_to_dash_str_buffer[6*3]; // 12-45-78-01-34-67\0
static char * bd_addr_to_dash_str(bd_addr_t addr){
char * p = bd_addr_to_dash_str_buffer;
int i;
for (i = 0; i < 6 ; i++) {
*p++ = char_for_nibble((addr[i] >> 4) & 0x0F);
*p++ = char_for_nibble((addr[i] >> 0) & 0x0F);
*p++ = '-';
}
*--p = 0;
return (char *) bd_addr_to_dash_str_buffer;
}
static void set_path(bd_addr_t bd_addr){
strcpy(keypath, LINK_KEY_PATH);
strcat(keypath, LINK_KEY_PREFIX);
strcat(keypath, bd_addr_to_dash_str(bd_addr));
strcat(keypath, LINK_KEY_SUFIX);
}
// Device info
static void db_open(void){
}
static void db_close(void){
}
static void put_link_key(bd_addr_t bd_addr, link_key_t link_key, link_key_type_t link_key_type){
set_path(bd_addr);
char * link_key_str = link_key_to_str(link_key);
char * link_key_type_str = link_key_type_to_str(link_key_type);
FILE * wFile = fopen(keypath,"w+");
fwrite(link_key_str, strlen(link_key_str), 1, wFile);
fwrite(link_key_type_str, strlen(link_key_type_str), 1, wFile);
fclose(wFile);
}
static int get_link_key(bd_addr_t bd_addr, link_key_t link_key, link_key_type_t * link_key_type) {
set_path(bd_addr);
if (access(keypath, R_OK)) return 0;
char link_key_str[LINK_KEY_STR_LEN + 1];
char link_key_type_str[2];
FILE * rFile = fopen(keypath,"r+");
size_t objects_read = fread(link_key_str, LINK_KEY_STR_LEN, 1, rFile );
if (objects_read == 1){
link_key_str[LINK_KEY_STR_LEN] = 0;
log_info("Found link key %s\n", link_key_str);
objects_read = fread(link_key_type_str, 1, 1, rFile );
}
fclose(rFile);
if (objects_read != 1) return 0;
link_key_type_str[1] = 0;
log_info("Found link key type %s\n", link_key_type_str);
int scan_result = sscan_link_key(link_key_str, link_key);
if (scan_result == 0 ) return 0;
int link_key_type_buffer;
scan_result = sscanf( (char *) link_key_type_str, "%d", &link_key_type_buffer);
if (scan_result == 0 ) return 0;
*link_key_type = (link_key_type_t) link_key_type_buffer;
return 1;
}
static void delete_link_key(bd_addr_t bd_addr){
set_path(bd_addr);
if (access(keypath, R_OK)) return;
if(remove(keypath) != 0){
log_error("File %s could not be deleted.\n", keypath);
}
}
static int get_name(bd_addr_t bd_addr, device_name_t *device_name) {
return 0;
}
static void delete_name(bd_addr_t bd_addr){
}
static void put_name(bd_addr_t bd_addr, device_name_t *device_name){
}
const remote_device_db_t remote_device_db_fs = {
db_open,
db_close,
get_link_key,
put_link_key,
delete_link_key,
get_name,
put_name,
delete_name
};
const remote_device_db_t * remote_device_db_fs_instance(void){
return &remote_device_db_fs;
}

View File

@ -65,8 +65,8 @@ case "$host_os" in
LDFLAGS="$LDFLAGS -framework CoreFoundation -framework Foundation"
BTSTACK_LIB_LDFLAGS="-dynamiclib -install_name \$(prefix)/lib/libBTstack.dylib"
BTSTACK_LIB_EXTENSION="dylib"
REMOTE_DEVICE_DB_SOURCES="remote_device_db_cocoa.m rfcomm_service_db_cocoa.m"
REMOTE_DEVICE_DB="remote_device_db_iphone"
REMOTE_DEVICE_DB_SOURCES="btstack_link_key_db_cocoa.m rfcomm_service_db_cocoa.m"
REMOTE_DEVICE_DB="remote_device_db_cocoa"
HAVE_SO_NOSIGPIPE="yes";
;;
mingw*)
@ -74,14 +74,14 @@ case "$host_os" in
LDFLAGS="$LDFLAGS -lws2_32"
BTSTACK_LIB_LDFLAGS="-shared"
BTSTACK_LIB_EXTENSION="dll"
REMOTE_DEVICE_DB_SOURCES="remote_device_db_memory.c rfcomm_service_db_memory.c"
REMOTE_DEVICE_DB="remote_device_db_memory"
REMOTE_DEVICE_DB_SOURCES="btstack_link_key_db_memory.c rfcomm_service_db_memory.c"
REMOTE_DEVICE_DB="btstack_link_key_db_memory"
;;
*)
BTSTACK_LIB_LDFLAGS="-shared -Wl,-rpath,\$(prefix)/lib"
BTSTACK_LIB_EXTENSION="so"
REMOTE_DEVICE_DB_SOURCES="remote_device_db_memory.c rfcomm_service_db_memory.c"
REMOTE_DEVICE_DB="remote_device_db_memory"
REMOTE_DEVICE_DB_SOURCES="btstack_link_key_db_memory.c rfcomm_service_db_memory.c"
REMOTE_DEVICE_DB="btstack_link_key_db_memory"
;;
esac

View File

@ -65,7 +65,7 @@
#include "hci.h"
#include "l2cap.h"
#include "btstack_memory.h"
#include "classic/remote_device_db.h"
#include "classic/btstack_link_key_db.h"
#include "classic/rfcomm.h"
#include "classic/sdp.h"
#include "btstack_config.h"

View File

@ -61,7 +61,7 @@
#include "hci.h"
#include "l2cap.h"
#include "btstack_memory.h"
#include "classic/remote_device_db.h"
#include "classic/btstack_link_key_db.h"
#include "classic/rfcomm.h"
#include "classic/sdp.h"
#include "btstack_config.h"

View File

@ -60,7 +60,7 @@
#include "hci.h"
#include "btstack_memory.h"
#include "classic/remote_device_db.h"
#include "classic/btstack_link_key_db.h"
#include "btstack_config.h"
int btstack_main(int argc, const char * argv[]);

View File

@ -3,7 +3,7 @@ BTSTACK_ROOT = ../..
CORE += main.c stdin_support.c
COMMON += hci_transport_h2_libusb.c btstack_run_loop_posix.c remote_device_db_fs.c
COMMON += hci_transport_h2_libusb.c btstack_run_loop_posix.c btstack_link_key_db_fs.c
include ${BTSTACK_ROOT}/example/embedded/Makefile.inc

View File

@ -49,12 +49,12 @@
#include "btstack_config.h"
#include "btstack_debug.h"
#include "btstack_link_key_db_fs.h"
#include "btstack_memory.h"
#include "btstack_run_loop.h"
#include "btstack_run_loop_posix.h"
#include "hal_led.h"
#include "btstack_debug.h"
#include "btstack_memory.h"
#include "hci.h"
#include "hci_dump.h"
#include "stdin_support.h"
@ -92,8 +92,7 @@ int main(int argc, const char * argv[]){
// init HCI
const hci_transport_t * transport = hci_transport_usb_instance();
remote_device_db_t * remote_db = (remote_device_db_t *) &remote_device_db_fs;
hci_init(transport, NULL, remote_db);
hci_init(transport, NULL, btstack_link_key_db_fs_instance());
// handle CTRL-c
signal(SIGINT, sigint_handler);

View File

@ -65,7 +65,7 @@
#include "hci.h"
#include "l2cap.h"
#include "btstack_memory.h"
#include "classic/remote_device_db.h"
#include "classic/btstack_link_key_db.h"
#include "classic/rfcomm.h"
#include "classic/sdp.h"
#include "btstack_config.h"

View File

@ -61,7 +61,7 @@
#include "hci.h"
#include "l2cap.h"
#include "btstack_memory.h"
#include "classic/remote_device_db.h"
#include "classic/btstack_link_key_db.h"
#include "classic/rfcomm.h"
#include "classic/sdp.h"
#include "btstack_config.h"

View File

@ -59,7 +59,7 @@
#include "hci.h"
#include "btstack_memory.h"
#include "classic/remote_device_db.h"
#include "classic/btstack_link_key_db.h"
#include "btstack_config.h"
static void hw_setup(void){

View File

@ -60,7 +60,7 @@
#include "hci.h"
#include "hci_dump.h"
#include "btstack_memory.h"
#include "classic/remote_device_db.h"
#include "classic/btstack_link_key_db.h"
#include "btstack_config.h"
static void hw_setup(void){

View File

@ -53,7 +53,7 @@
#include "hci.h"
#include "btstack_chipset_cc256x.h"
#include "btstack_memory.h"
#include "classic/remote_device_db.h"
#include "classic/btstack_link_key_db.h"
// STDOUT_FILENO and STDERR_FILENO are defined by <unistd.h> with GCC
// (this is a hack for IAR)

View File

@ -84,7 +84,7 @@
#include "classic/hsp_ag.h"
#include "classic/hsp_hs.h"
#include "classic/pan.h"
#include "classic/remote_device_db.h"
#include "classic/btstack_link_key_db.h"
#include "classic/rfcomm.h"
#include "classic/sdp.h"
#include "classic/sdp_client.h"

View File

@ -37,11 +37,11 @@
/*
* btstsack_memory.h
* btstack_memory.h
*
* @brief BTstack memory management via configurable memory pools
*
* @note code semi-atuomatically generated by tools/btstack_memory_generator.py
* @note code generated by tool/btstack_memory_generator.py
*
*/
@ -247,99 +247,35 @@ void btstack_memory_rfcomm_channel_free(rfcomm_channel_t *rfcomm_channel){
// MARK: db_mem_device_name_t
#ifdef MAX_NO_DB_MEM_DEVICE_NAMES
#if MAX_NO_DB_MEM_DEVICE_NAMES > 0
static db_mem_device_name_t db_mem_device_name_storage[MAX_NO_DB_MEM_DEVICE_NAMES];
static btstack_memory_pool_t db_mem_device_name_pool;
db_mem_device_name_t * btstack_memory_db_mem_device_name_get(void){
return (db_mem_device_name_t *) btstack_memory_pool_get(&db_mem_device_name_pool);
// MARK: btstack_link_key_db_memory_t
#ifdef MAX_NO_BTSTACK_LINK_KEY_DB_MEMORYS
#if MAX_NO_BTSTACK_LINK_KEY_DB_MEMORYS > 0
static btstack_link_key_db_memory_t btstack_link_key_db_memory_storage[MAX_NO_BTSTACK_LINK_KEY_DB_MEMORYS];
static btstack_memory_pool_t btstack_link_key_db_memory_pool;
btstack_link_key_db_memory_t * btstack_memory_btstack_link_key_db_memory_get(void){
return (btstack_link_key_db_memory_t *) btstack_memory_pool_get(&btstack_link_key_db_memory_pool);
}
void btstack_memory_db_mem_device_name_free(db_mem_device_name_t *db_mem_device_name){
btstack_memory_pool_free(&db_mem_device_name_pool, db_mem_device_name);
void btstack_memory_btstack_link_key_db_memory_free(btstack_link_key_db_memory_t *btstack_link_key_db_memory){
btstack_memory_pool_free(&btstack_link_key_db_memory_pool, btstack_link_key_db_memory);
}
#else
db_mem_device_name_t * btstack_memory_db_mem_device_name_get(void){
btstack_link_key_db_memory_t * btstack_memory_btstack_link_key_db_memory_get(void){
return NULL;
}
void btstack_memory_db_mem_device_name_free(db_mem_device_name_t *db_mem_device_name){
void btstack_memory_btstack_link_key_db_memory_free(btstack_link_key_db_memory_t *btstack_link_key_db_memory){
// silence compiler warning about unused parameter in a portable way
(void) db_mem_device_name;
(void) btstack_link_key_db_memory;
};
#endif
#elif defined(HAVE_MALLOC)
db_mem_device_name_t * btstack_memory_db_mem_device_name_get(void){
return (db_mem_device_name_t*) malloc(sizeof(db_mem_device_name_t));
btstack_link_key_db_memory_t * btstack_memory_btstack_link_key_db_memory_get(void){
return (btstack_link_key_db_memory_t*) malloc(sizeof(btstack_link_key_db_memory_t));
}
void btstack_memory_db_mem_device_name_free(db_mem_device_name_t *db_mem_device_name){
free(db_mem_device_name);
void btstack_memory_btstack_link_key_db_memory_free(btstack_link_key_db_memory_t *btstack_link_key_db_memory){
free(btstack_link_key_db_memory);
}
#else
#error "Neither HAVE_MALLOC nor MAX_NO_DB_MEM_DEVICE_NAMES for struct db_mem_device_name is defined. Please, edit the config file."
#endif
// MARK: db_mem_device_link_key_t
#ifdef MAX_NO_DB_MEM_DEVICE_LINK_KEYS
#if MAX_NO_DB_MEM_DEVICE_LINK_KEYS > 0
static db_mem_device_link_key_t db_mem_device_link_key_storage[MAX_NO_DB_MEM_DEVICE_LINK_KEYS];
static btstack_memory_pool_t db_mem_device_link_key_pool;
db_mem_device_link_key_t * btstack_memory_db_mem_device_link_key_get(void){
return (db_mem_device_link_key_t *) btstack_memory_pool_get(&db_mem_device_link_key_pool);
}
void btstack_memory_db_mem_device_link_key_free(db_mem_device_link_key_t *db_mem_device_link_key){
btstack_memory_pool_free(&db_mem_device_link_key_pool, db_mem_device_link_key);
}
#else
db_mem_device_link_key_t * btstack_memory_db_mem_device_link_key_get(void){
return NULL;
}
void btstack_memory_db_mem_device_link_key_free(db_mem_device_link_key_t *db_mem_device_link_key){
// silence compiler warning about unused parameter in a portable way
(void) db_mem_device_link_key;
};
#endif
#elif defined(HAVE_MALLOC)
db_mem_device_link_key_t * btstack_memory_db_mem_device_link_key_get(void){
return (db_mem_device_link_key_t*) malloc(sizeof(db_mem_device_link_key_t));
}
void btstack_memory_db_mem_device_link_key_free(db_mem_device_link_key_t *db_mem_device_link_key){
free(db_mem_device_link_key);
}
#else
#error "Neither HAVE_MALLOC nor MAX_NO_DB_MEM_DEVICE_LINK_KEYS for struct db_mem_device_link_key is defined. Please, edit the config file."
#endif
// MARK: db_mem_service_t
#ifdef MAX_NO_DB_MEM_SERVICES
#if MAX_NO_DB_MEM_SERVICES > 0
static db_mem_service_t db_mem_service_storage[MAX_NO_DB_MEM_SERVICES];
static btstack_memory_pool_t db_mem_service_pool;
db_mem_service_t * btstack_memory_db_mem_service_get(void){
return (db_mem_service_t *) btstack_memory_pool_get(&db_mem_service_pool);
}
void btstack_memory_db_mem_service_free(db_mem_service_t *db_mem_service){
btstack_memory_pool_free(&db_mem_service_pool, db_mem_service);
}
#else
db_mem_service_t * btstack_memory_db_mem_service_get(void){
return NULL;
}
void btstack_memory_db_mem_service_free(db_mem_service_t *db_mem_service){
// silence compiler warning about unused parameter in a portable way
(void) db_mem_service;
};
#endif
#elif defined(HAVE_MALLOC)
db_mem_service_t * btstack_memory_db_mem_service_get(void){
return (db_mem_service_t*) malloc(sizeof(db_mem_service_t));
}
void btstack_memory_db_mem_service_free(db_mem_service_t *db_mem_service){
free(db_mem_service);
}
#else
#error "Neither HAVE_MALLOC nor MAX_NO_DB_MEM_SERVICES for struct db_mem_service is defined. Please, edit the config file."
#error "Neither HAVE_MALLOC nor MAX_NO_BTSTACK_LINK_KEY_DB_MEMORYS for struct btstack_link_key_db_memory is defined. Please, edit the config file."
#endif
@ -625,14 +561,8 @@ void btstack_memory_init(void){
#if MAX_NO_RFCOMM_CHANNELS > 0
btstack_memory_pool_create(&rfcomm_channel_pool, rfcomm_channel_storage, MAX_NO_RFCOMM_CHANNELS, sizeof(rfcomm_channel_t));
#endif
#if MAX_NO_DB_MEM_DEVICE_NAMES > 0
btstack_memory_pool_create(&db_mem_device_name_pool, db_mem_device_name_storage, MAX_NO_DB_MEM_DEVICE_NAMES, sizeof(db_mem_device_name_t));
#endif
#if MAX_NO_DB_MEM_DEVICE_LINK_KEYS > 0
btstack_memory_pool_create(&db_mem_device_link_key_pool, db_mem_device_link_key_storage, MAX_NO_DB_MEM_DEVICE_LINK_KEYS, sizeof(db_mem_device_link_key_t));
#endif
#if MAX_NO_DB_MEM_SERVICES > 0
btstack_memory_pool_create(&db_mem_service_pool, db_mem_service_storage, MAX_NO_DB_MEM_SERVICES, sizeof(db_mem_service_t));
#if MAX_NO_BTSTACK_LINK_KEY_DB_MEMORYS > 0
btstack_memory_pool_create(&btstack_link_key_db_memory_pool, btstack_link_key_db_memory_storage, MAX_NO_BTSTACK_LINK_KEY_DB_MEMORYS, sizeof(btstack_link_key_db_memory_t));
#endif
#if MAX_NO_BNEP_SERVICES > 0
btstack_memory_pool_create(&bnep_service_pool, bnep_service_storage, MAX_NO_BNEP_SERVICES, sizeof(bnep_service_t));

View File

@ -60,7 +60,8 @@ extern "C" {
// Classic
#include "classic/bnep.h"
#include "classic/hfp.h"
#include "classic/remote_device_db.h"
#include "classic/btstack_link_key_db.h"
#include "classic/btstack_link_key_db_memory.h"
#include "classic/rfcomm.h"
#include "classic/sdp.h"
@ -97,13 +98,9 @@ void btstack_memory_rfcomm_service_free(rfcomm_service_t *rfcomm_service);
rfcomm_channel_t * btstack_memory_rfcomm_channel_get(void);
void btstack_memory_rfcomm_channel_free(rfcomm_channel_t *rfcomm_channel);
// db_mem_device_name, db_mem_device_link_key, db_mem_service
db_mem_device_name_t * btstack_memory_db_mem_device_name_get(void);
void btstack_memory_db_mem_device_name_free(db_mem_device_name_t *db_mem_device_name);
db_mem_device_link_key_t * btstack_memory_db_mem_device_link_key_get(void);
void btstack_memory_db_mem_device_link_key_free(db_mem_device_link_key_t *db_mem_device_link_key);
db_mem_service_t * btstack_memory_db_mem_service_get(void);
void btstack_memory_db_mem_service_free(db_mem_service_t *db_mem_service);
// btstack_link_key_db_memory
btstack_link_key_db_memory_t * btstack_memory_btstack_link_key_db_memory_get(void);
void btstack_memory_btstack_link_key_db_memory_free(btstack_link_key_db_memory_t *btstack_link_key_db_memory);
// bnep_service, bnep_channel
bnep_service_t * btstack_memory_bnep_service_get(void);

View File

@ -0,0 +1,73 @@
/*
* Copyright (C) 2014 BlueKitchen GmbH
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
* 4. Any redistribution, use, or modification is done solely for
* personal benefit and not for any commercial purpose or for
* monetary gain.
*
* THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS
* RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
* THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* Please inquire about commercial licensing options at
* contact@bluekitchen-gmbh.com
*
*/
/**
* interface to provide link key storage
*/
#ifndef __BTSTACK_LINK_KEY_DB_H
#define __BTSTACK_LINK_KEY_DB_H
#include "btstack_util.h"
#include "gap.h"
#if defined __cplusplus
extern "C" {
#endif
/* API_START */
typedef struct {
// management
void (*open)(void);
void (*close)(void);
// link key
int (*get_link_key)(bd_addr_t bd_addr, link_key_t link_key, link_key_type_t * type);
void (*put_link_key)(bd_addr_t bd_addr, link_key_t link_key, link_key_type_t type);
void (*delete_link_key)(bd_addr_t bd_addr);
} btstack_link_key_db_t;
/* API_END */
#if defined __cplusplus
}
#endif
#endif // __BTSTACK_LINK_KEY_DB_H

View File

@ -38,16 +38,15 @@
#include <string.h>
#include <stdlib.h>
#include "classic/remote_device_db.h"
#include "btstack_memory.h"
#include "classic/btstack_link_key_db_memory.h"
#include "btstack_debug.h"
#include "btstack_util.h"
#include "btstack_linked_list.h"
#include "btstack_memory.h"
#include "btstack_util.h"
// This lists should be only accessed by tests.
// This list should be directly accessed only by tests
btstack_linked_list_t db_mem_link_keys = NULL;
btstack_linked_list_t db_mem_names = NULL;
// Device info
static void db_open(void){
@ -56,10 +55,10 @@ static void db_open(void){
static void db_close(void){
}
static db_mem_device_t * get_item(btstack_linked_list_t list, bd_addr_t bd_addr) {
static btstack_link_key_db_memory_t * get_item(btstack_linked_list_t list, bd_addr_t bd_addr) {
btstack_linked_item_t *it;
for (it = (btstack_linked_item_t *) list; it ; it = it->next){
db_mem_device_t * item = (db_mem_device_t *) it;
btstack_link_key_db_memory_t * item = (btstack_link_key_db_memory_t *) it;
if (BD_ADDR_CMP(item->bd_addr, bd_addr) == 0) {
return item;
}
@ -67,21 +66,8 @@ static db_mem_device_t * get_item(btstack_linked_list_t list, bd_addr_t bd_addr)
return NULL;
}
static int get_name(bd_addr_t bd_addr, device_name_t *device_name) {
db_mem_device_name_t * item = (db_mem_device_name_t *) get_item(db_mem_names, bd_addr);
if (!item) return 0;
strncpy((char*)device_name, item->device_name, MAX_NAME_LEN);
btstack_linked_list_remove(&db_mem_names, (btstack_linked_item_t *) item);
btstack_linked_list_add(&db_mem_names, (btstack_linked_item_t *) item);
return 1;
}
static int get_link_key(bd_addr_t bd_addr, link_key_t link_key, link_key_type_t * link_key_type) {
db_mem_device_link_key_t * item = (db_mem_device_link_key_t *) get_item(db_mem_link_keys, bd_addr);
btstack_link_key_db_memory_t * item = get_item(db_mem_link_keys, bd_addr);
if (!item) return 0;
@ -96,31 +82,31 @@ static int get_link_key(bd_addr_t bd_addr, link_key_t link_key, link_key_type_t
}
static void delete_link_key(bd_addr_t bd_addr){
db_mem_device_t * item = get_item(db_mem_link_keys, bd_addr);
btstack_link_key_db_memory_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_db_mem_device_link_key_free((db_mem_device_link_key_t*)item);
btstack_memory_btstack_link_key_db_memory_free((btstack_link_key_db_memory_t*)item);
}
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
db_mem_device_link_key_t * record = (db_mem_device_link_key_t *) get_item(db_mem_link_keys, bd_addr);
btstack_link_key_db_memory_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_db_mem_device_link_key_get();
record = btstack_memory_btstack_link_key_db_memory_get();
}
// if none left, re-use last item and remove from list
if (!record){
record = (db_mem_device_link_key_t*)btstack_linked_list_get_last_item(&db_mem_link_keys);
record = (btstack_link_key_db_memory_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);
}
@ -128,56 +114,22 @@ static void put_link_key(bd_addr_t bd_addr, link_key_t link_key, link_key_type_t
if (!record) return;
memcpy(record->device.bd_addr, bd_addr, sizeof(bd_addr_t));
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);
}
static void delete_name(bd_addr_t bd_addr){
db_mem_device_t * item = get_item(db_mem_names, bd_addr);
if (!item) return;
btstack_linked_list_remove(&db_mem_names, (btstack_linked_item_t *) item);
btstack_memory_db_mem_device_name_free((db_mem_device_name_t*)item);
}
static void put_name(bd_addr_t bd_addr, device_name_t *device_name){
// check for existing record and remove if found
db_mem_device_name_t * record = (db_mem_device_name_t *) get_item(db_mem_names, bd_addr);
if (record){
btstack_linked_list_remove(&db_mem_names, (btstack_linked_item_t*) record);
}
// record not found, get new one from memory pool
if (!record) {
record = btstack_memory_db_mem_device_name_get();
}
// if none left, re-use last item and remove from list
if (!record){
record = (db_mem_device_name_t*)btstack_linked_list_get_last_item(&db_mem_names);
if (record) {
btstack_linked_list_remove(&db_mem_names, (btstack_linked_item_t*) record);
}
}
if (!record) return;
memcpy(record->device.bd_addr, bd_addr, sizeof(bd_addr_t));
strncpy(record->device_name, (const char*) device_name, MAX_NAME_LEN);
btstack_linked_list_add(&db_mem_names, (btstack_linked_item_t *) record);
}
const remote_device_db_t remote_device_db_memory = {
const btstack_link_key_db_t btstack_link_key_db_memory = {
db_open,
db_close,
get_link_key,
put_link_key,
delete_link_key,
get_name,
put_name,
delete_name,
};
const btstack_link_key_db_t * btstack_link_key_db_memory_instance(void){
return &btstack_link_key_db_memory;
}

View File

@ -0,0 +1,70 @@
/*
* Copyright (C) 2014 BlueKitchen GmbH
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
* 4. Any redistribution, use, or modification is done solely for
* personal benefit and not for any commercial purpose or for
* monetary gain.
*
* THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS
* RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
* THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* Please inquire about commercial licensing options at
* contact@bluekitchen-gmbh.com
*
*/
/**
* interface to provide link key storage
*/
#ifndef __BTSTACK_LINK_KEY_DB_MEMORY_H
#define __BTSTACK_LINK_KEY_DB_MEMORY_H
#include "btstack_link_key_db.h"
#include "btstack_linked_list.h"
#if defined __cplusplus
extern "C" {
#endif
/*
* @brief
*/
const btstack_link_key_db_t * btstack_link_key_db_memory_instance(void);
typedef struct {
btstack_linked_item_t item;
bd_addr_t bd_addr;
link_key_t link_key;
link_key_type_t link_key_type;
} btstack_link_key_db_memory_t;
/* API_END */
#if defined __cplusplus
}
#endif
#endif // __BTSTACK_LINK_KEY_DB_MEMORY_H

View File

@ -259,8 +259,8 @@ int hci_authentication_active_for_handle(hci_con_handle_t handle){
}
void hci_drop_link_key_for_bd_addr(bd_addr_t addr){
if (hci_stack->remote_device_db) {
hci_stack->remote_device_db->delete_link_key(addr);
if (hci_stack->link_key_db) {
hci_stack->link_key_db->delete_link_key(addr);
}
}
@ -1542,7 +1542,7 @@ static void event_handler(uint8_t *packet, int size){
log_info("HCI_EVENT_LINK_KEY_REQUEST");
hci_add_connection_flags_for_flipped_bd_addr(&packet[2], RECV_LINK_KEY_REQUEST);
// non-bondable mode: link key negative reply will be sent by HANDLE_LINK_KEY_REQUEST
if (hci_stack->bondable && !hci_stack->remote_device_db) break;
if (hci_stack->bondable && !hci_stack->link_key_db) break;
hci_add_connection_flags_for_flipped_bd_addr(&packet[2], HANDLE_LINK_KEY_REQUEST);
hci_run();
// request handled by hci_run() as HANDLE_LINK_KEY_REQUEST gets set
@ -1558,8 +1558,8 @@ static void event_handler(uint8_t *packet, int size){
if (link_key_type != CHANGED_COMBINATION_KEY){
conn->link_key_type = link_key_type;
}
if (!hci_stack->remote_device_db) break;
hci_stack->remote_device_db->put_link_key(addr, &packet[8], conn->link_key_type);
if (!hci_stack->link_key_db) break;
hci_stack->link_key_db->put_link_key(addr, &packet[8], conn->link_key_type);
// still forward event to allow dismiss of pairing dialog
break;
}
@ -1573,9 +1573,9 @@ static void event_handler(uint8_t *packet, int size){
return;
}
// PIN CODE REQUEST means the link key request didn't succee -> delete stored link key
if (!hci_stack->remote_device_db) break;
if (!hci_stack->link_key_db) break;
bt_flip_addr(addr, &packet[2]);
hci_stack->remote_device_db->delete_link_key(addr);
hci_stack->link_key_db->delete_link_key(addr);
break;
case HCI_EVENT_IO_CAPABILITY_REQUEST:
@ -1849,7 +1849,7 @@ static void hci_state_reset(void){
hci_stack->le_connection_parameter_range.le_supervision_timeout_max = 3200;
}
void hci_init(const hci_transport_t *transport, void *config, remote_device_db_t const* remote_device_db){
void hci_init(const hci_transport_t *transport, void *config, btstack_link_key_db_t const * link_key_db){
#ifdef HAVE_MALLOC
if (!hci_stack) {
@ -1873,9 +1873,9 @@ void hci_init(const hci_transport_t *transport, void *config, remote_device_db_t
hci_stack->packet_handler = dummy_handler;
// store and open remote device db
hci_stack->remote_device_db = remote_device_db;
if (hci_stack->remote_device_db) {
hci_stack->remote_device_db->open();
hci_stack->link_key_db = link_key_db;
if (hci_stack->link_key_db) {
hci_stack->link_key_db->open();
}
// max acl payload size defined in config.h
@ -1928,8 +1928,8 @@ void hci_set_control(const btstack_control_t *hardware_control){
void hci_close(void){
// close remote device db
if (hci_stack->remote_device_db) {
hci_stack->remote_device_db->close();
if (hci_stack->link_key_db) {
hci_stack->link_key_db->close();
}
while (hci_stack->connections) {
// cancel all l2cap connections
@ -2487,8 +2487,8 @@ void hci_run(void){
connectionClearAuthenticationFlags(connection, HANDLE_LINK_KEY_REQUEST);
link_key_t link_key;
link_key_type_t link_key_type;
if ( hci_stack->remote_device_db
&& hci_stack->remote_device_db->get_link_key(connection->address, link_key, &link_key_type)
if ( hci_stack->link_key_db
&& hci_stack->link_key_db->get_link_key(connection->address, link_key, &link_key_type)
&& gap_security_level_for_link_key_type(link_key_type) >= connection->requested_security_level){
connection->link_key_type = link_key_type;
hci_send_cmd(&hci_link_key_request_reply, connection->address, &link_key);
@ -2736,9 +2736,9 @@ int hci_send_cmd_packet(uint8_t *packet, int size){
}
if (IS_COMMAND(packet, hci_delete_stored_link_key)){
if (hci_stack->remote_device_db){
if (hci_stack->link_key_db){
bt_flip_addr(addr, &packet[3]);
hci_stack->remote_device_db->delete_link_key(addr);
hci_stack->link_key_db->delete_link_key(addr);
}
}
@ -3107,10 +3107,10 @@ void gap_request_security_level(hci_con_handle_t con_handle, gap_security_level_
// TODO: figure out how to use it properly
// would enabling ecnryption suffice (>= LEVEL_2)?
if (hci_stack->remote_device_db){
if (hci_stack->link_key_db){
link_key_type_t link_key_type;
link_key_t link_key;
if (hci_stack->remote_device_db->get_link_key( &connection->address, &link_key, &link_key_type)){
if (hci_stack->link_key_db->get_link_key( &connection->address, &link_key, &link_key_type)){
if (gap_security_level_for_link_key_type(link_key_type) >= requested_level){
connection->bonding_flags |= BONDING_SEND_ENCRYPTION_REQUEST;
return;

View File

@ -51,7 +51,7 @@
#include "btstack_control.h"
#include "btstack_linked_list.h"
#include "btstack_util.h"
#include "classic/remote_device_db.h"
#include "classic/btstack_link_key_db.h"
#include "hci_cmd.h"
#include "hci_transport.h"
@ -577,8 +577,8 @@ typedef struct {
/* callback for SCO data */
void (*sco_packet_handler)(uint8_t packet_type, uint8_t *packet, uint16_t size);
/* remote device db */
remote_device_db_t const*remote_device_db;
/* link key db */
btstack_link_key_db_t const * link_key_db;
/* hci state machine */
HCI_STATE state;
@ -762,7 +762,7 @@ void hci_local_bd_addr(bd_addr_t address_buffer);
/**
* @brief Set up HCI. Needs to be called before any other function.
*/
void hci_init(const hci_transport_t *transport, void *config, remote_device_db_t const* remote_device_db);
void hci_init(const hci_transport_t *transport, void *config, btstack_link_key_db_t const * btstack_link_key_db);
/**
* @brief Configure Bluetooth chipset driver. Has to be called before power on, or right after receiving the local version information.

View File

@ -8,7 +8,7 @@ SUBDIRS = \
gatt_client \
hfp \
linked_list \
remote_device_db \
btstack_link_key_db \
sdp_client \
security_manager \

View File

@ -0,0 +1,52 @@
CC=g++
# Requirements: cpputest.github.io
BTSTACK_ROOT = ../..
CPPUTEST_HOME = ${BTSTACK_ROOT}/test/cpputest
CFLAGS = -g -Wall \
-I. \
-I.. \
-I${BTSTACK_ROOT}/src \
-I${BTSTACK_ROOT}/platform/posix
LDFLAGS += -lCppUTest -lCppUTestExt
VPATH += ${BTSTACK_ROOT}/src/classic
VPATH += ${BTSTACK_ROOT}/src
VPATH += ${BTSTACK_ROOT}/platform/posix
FS = \
btstack_util.c \
hci_dump.c \
btstack_link_key_db_fs.c
MEMORY = \
btstack_util.c \
btstack_memory_pool.c \
btstack_memory.c \
hci_dump.c \
btstack_link_key_db_memory.c \
btstack_linked_list.c
FS_OBJ = $(FS:.c=.o)
MEMORY_OBJ = $(MEMORY:.c=.o)
all: btstack_link_key_db_memory_test btstack_link_key_db_fs_test
btstack_link_key_db_memory_test: ${MEMORY_OBJ} btstack_link_key_db_memory_test.c
${CC} $^ ${CFLAGS} ${LDFLAGS} -o $@
btstack_link_key_db_fs_test: ${FS_OBJ} btstack_link_key_db_fs_test.c
${CC} $^ ${CFLAGS} ${LDFLAGS} -o $@
test: all
./btstack_link_key_db_memory_test
./btstack_link_key_db_fs_test
clean:
rm -f btstack_link_key_db_memory_test btstack_link_key_db_fs_test *.o ../src/*.o
rm -rf *.dSYM

View File

@ -33,8 +33,7 @@
#define MAX_NO_RFCOMM_CHANNELS 0
#define MAX_NO_BNEP_SERVICES 0
#define MAX_NO_BNEP_CHANNELS 0
#define MAX_NO_DB_MEM_DEVICE_LINK_KEYS 2
#define MAX_NO_DB_MEM_DEVICE_NAMES 2
#define MAX_NO_BTSTACK_LINK_KEY_DB_MEMORYS 2
#define MAX_NO_DB_MEM_SERVICES 0
#define MAX_NO_HFP_CONNECTIONS 0
#define MAX_NO_WHITELIST_ENTRIES 0

View File

@ -4,12 +4,11 @@
#include "CppUTest/TestHarness.h"
#include "CppUTest/CommandLineTestRunner.h"
#include "classic/remote_device_db.h"
#include "classic/btstack_link_key_db.h"
#include "btstack_link_key_db_fs.h"
#include "btstack_config.h"
const remote_device_db_t * remote_device_db_fs_instance();
TEST_GROUP(RemoteDeviceDB){
bd_addr_t bd_addr;
link_key_t link_key;
@ -31,16 +30,16 @@ TEST(RemoteDeviceDB, SinglePutGetDeleteKey){
link_key_t test_link_key;
link_key_type_t test_link_key_type;
remote_device_db_fs_instance()->delete_link_key(bd_addr);
CHECK(remote_device_db_fs_instance()->get_link_key(bd_addr, test_link_key, &test_link_key_type) == 0);
btstack_link_key_db_fs_instance()->delete_link_key(bd_addr);
CHECK(btstack_link_key_db_fs_instance()->get_link_key(bd_addr, test_link_key, &test_link_key_type) == 0);
remote_device_db_fs_instance()->put_link_key(bd_addr, link_key, link_key_type);
CHECK(remote_device_db_fs_instance()->get_link_key(bd_addr, test_link_key, &test_link_key_type) == 1);
btstack_link_key_db_fs_instance()->put_link_key(bd_addr, link_key, link_key_type);
CHECK(btstack_link_key_db_fs_instance()->get_link_key(bd_addr, test_link_key, &test_link_key_type) == 1);
CHECK(strcmp(link_key_to_str(link_key), link_key_to_str(test_link_key)) == 0);
remote_device_db_fs_instance()->delete_link_key(bd_addr);
CHECK(remote_device_db_fs_instance()->get_link_key(bd_addr, test_link_key, &test_link_key_type) == 0);
btstack_link_key_db_fs_instance()->delete_link_key(bd_addr);
CHECK(btstack_link_key_db_fs_instance()->get_link_key(bd_addr, test_link_key, &test_link_key_type) == 0);
}

View File

@ -0,0 +1,117 @@
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "CppUTest/TestHarness.h"
#include "CppUTest/CommandLineTestRunner.h"
#include "classic/btstack_link_key_db.h"
#include "btstack_memory.h"
#include "btstack_config.h"
extern btstack_linked_list_t db_mem_link_keys ;
extern btstack_linked_list_t db_mem_names ;
// const extern "C" db_mem_device_name_t * btstack_memory_db_mem_device_name_get(void);
// const extern "C" void btstack_memory_init(void);
void dump(btstack_linked_list_t list){
printf("dump:\n");
int i;
btstack_linked_item_t *it;
for (it = (btstack_linked_item_t *) list, i = 1; it ; it = it->next, i++){
// btstack_link_key_db_memory_t * item = (btstack_link_key_db_memory_t *) it;
// printf("%u. %s + %u\n", i, item->link_key, item->bd_addr[5]);
// TODO printf broken
}
}
TEST_GROUP(RemoteDeviceDB){
bd_addr_t addr1, addr2, addr3;
device_name_t device_name;
link_key_t link_key;
link_key_type_t link_key_type;
void setup(void){
btstack_memory_init();
bd_addr_t addr_1 = {0x00, 0x01, 0x02, 0x03, 0x04, 0x01 };
bd_addr_t addr_2 = {0x00, 0x01, 0x02, 0x03, 0x04, 0x02 };
bd_addr_t addr_3 = {0x00, 0x01, 0x02, 0x03, 0x04, 0x03 };
BD_ADDR_COPY(addr1, addr_1);
BD_ADDR_COPY(addr2, addr_2);
BD_ADDR_COPY(addr3, addr_3);
link_key_type = (link_key_type_t)4;
sprintf((char*)link_key, "%d", 100);
}
void teardown(void){}
};
TEST(RemoteDeviceDB, MemoryPool){
CHECK(MAX_NO_BTSTACK_LINK_KEY_DB_MEMORYS == 2);
// void * item = btstack_memory_db_mem_device_name_get();
// CHECK(item);
}
// TEST(RemoteDeviceDB, SinglePutGetDeleteName){
// sprintf((char*)device_name, "%d", 100);
// btstack_link_key_db_memory_instance()->put_name(addr1, &device_name);
// CHECK(btstack_link_key_db_memory_instance()->get_name(addr1, &device_name));
// btstack_link_key_db_memory_instance()->delete_name(addr1);
// CHECK(!btstack_link_key_db_memory_instance()->get_name(addr1, &device_name));
// }
// TEST(RemoteDeviceDB, SortByLastUsedName){
// btstack_link_key_db_memory_instance()->put_name(addr1, (device_name_t*) "10");
// // dump(db_mem_names);
// btstack_link_key_db_memory_instance()->put_name(addr2, (device_name_t*) "20");
// // dump(db_mem_names);
// btstack_link_key_db_memory_instance()->put_name(addr3, (device_name_t*) "30");
// // dump(db_mem_names);
// CHECK(!btstack_link_key_db_memory_instance()->get_name(addr1, &device_name));
// CHECK(btstack_link_key_db_memory_instance()->get_name(addr2, &device_name));
// //get first element of the list
// db_mem_device_name_t * item = (db_mem_device_name_t *) db_mem_names;
// STRCMP_EQUAL((char*)item->device_name, "20");
// }
TEST(RemoteDeviceDB, SinglePutGetDeleteKey){
sprintf((char*)link_key, "%d", 100);
btstack_link_key_db_memory_instance()->put_link_key(addr1, link_key, link_key_type);
// dump(db_mem_link_keys);
CHECK(btstack_link_key_db_memory_instance()->get_link_key(addr1, link_key, &link_key_type));
btstack_link_key_db_memory_instance()->delete_link_key(addr1);
CHECK(!btstack_link_key_db_memory_instance()->get_link_key(addr1, link_key, &link_key_type));
}
TEST(RemoteDeviceDB, SortByLastUsedKey){
sprintf((char*)link_key, "%d", 10);
btstack_link_key_db_memory_instance()->put_link_key(addr1, link_key, link_key_type);
// dump(db_mem_link_keys);
sprintf((char*)link_key, "%d", 20);
btstack_link_key_db_memory_instance()->put_link_key(addr2, link_key, link_key_type);
// dump(db_mem_link_keys);
sprintf((char*)link_key, "%d", 30);
btstack_link_key_db_memory_instance()->put_link_key(addr3, link_key, link_key_type);
// dump(db_mem_link_keys);
CHECK(!btstack_link_key_db_memory_instance()->get_link_key(addr1, link_key, &link_key_type));
CHECK(btstack_link_key_db_memory_instance()->get_link_key(addr2, link_key, &link_key_type));
// dump(db_mem_link_keys);
//get first element of the list
btstack_link_key_db_memory_t * item = (btstack_link_key_db_memory_t *) db_mem_link_keys;
STRCMP_EQUAL((char*)item->link_key, "20");
}
int main (int argc, const char * argv[]){
return CommandLineTestRunner::RunAllTests(argc, argv);
}

View File

@ -1,51 +0,0 @@
CC=g++
# Requirements: cpputest.github.io
BTSTACK_ROOT = ../..
CPPUTEST_HOME = ${BTSTACK_ROOT}/test/cpputest
CFLAGS = -g -Wall \
-I. \
-I.. \
-I${BTSTACK_ROOT}/src
LDFLAGS += -lCppUTest -lCppUTestExt
VPATH += ${BTSTACK_ROOT}/src/classic
VPATH += ${BTSTACK_ROOT}/src
VPATH += ${BTSTACK_ROOT}/platform/posix
FS = \
btstack_util.c \
hci_dump.c \
remote_device_db_fs.c
MEMORY = \
btstack_util.c \
btstack_memory_pool.c \
btstack_memory.c \
hci_dump.c \
remote_device_db_memory.c \
btstack_linked_list.c
FS_OBJ = $(FS:.c=.o)
MEMORY_OBJ = $(MEMORY:.c=.o)
all: remote_device_db_memory_test remote_device_db_fs_test
remote_device_db_memory_test: ${MEMORY_OBJ} remote_device_db_memory_test.c
${CC} $^ ${CFLAGS} ${LDFLAGS} -o $@
remote_device_db_fs_test: ${FS_OBJ} remote_device_db_fs_test.c
${CC} $^ ${CFLAGS} ${LDFLAGS} -o $@
test: all
./remote_device_db_memory_test
./remote_device_db_fs_test
clean:
rm -f remote_device_db_memory_test remote_device_db_fs_test *.o ../src/*.o
rm -rf *.dSYM

View File

@ -1,118 +0,0 @@
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "CppUTest/TestHarness.h"
#include "CppUTest/CommandLineTestRunner.h"
#include "classic/remote_device_db.h"
#include "btstack_memory.h"
#include "btstack_config.h"
extern btstack_linked_list_t db_mem_link_keys ;
extern btstack_linked_list_t db_mem_names ;
// const extern "C" db_mem_device_name_t * btstack_memory_db_mem_device_name_get(void);
// const extern "C" void btstack_memory_init(void);
void dump(btstack_linked_list_t list){
printf("dump:\n");
int i;
btstack_linked_item_t *it;
for (it = (btstack_linked_item_t *) list, i = 1; it ; it = it->next, i++){
db_mem_device_t * item = (db_mem_device_t *) it;
db_mem_device_name_t * item1 = (db_mem_device_name_t *) it;
db_mem_device_link_key_t * item2 = (db_mem_device_link_key_t *) it;
printf("%u. %s + %s + %u\n", i, item1->device_name, item2->link_key, item->bd_addr[5]);
}
}
TEST_GROUP(RemoteDeviceDB){
bd_addr_t addr1, addr2, addr3;
device_name_t device_name;
link_key_t link_key;
link_key_type_t link_key_type;
void setup(void){
btstack_memory_init();
bd_addr_t addr_1 = {0x00, 0x01, 0x02, 0x03, 0x04, 0x01 };
bd_addr_t addr_2 = {0x00, 0x01, 0x02, 0x03, 0x04, 0x02 };
bd_addr_t addr_3 = {0x00, 0x01, 0x02, 0x03, 0x04, 0x03 };
BD_ADDR_COPY(addr1, addr_1);
BD_ADDR_COPY(addr2, addr_2);
BD_ADDR_COPY(addr3, addr_3);
link_key_type = (link_key_type_t)4;
sprintf((char*)link_key, "%d", 100);
}
void teardown(void){}
};
TEST(RemoteDeviceDB, MemoryPool){
CHECK(MAX_NO_DB_MEM_DEVICE_NAMES > 0);
void * item = btstack_memory_db_mem_device_name_get();
CHECK(item);
}
TEST(RemoteDeviceDB, SinglePutGetDeleteName){
sprintf((char*)device_name, "%d", 100);
remote_device_db_memory.put_name(addr1, &device_name);
CHECK(remote_device_db_memory.get_name(addr1, &device_name));
remote_device_db_memory.delete_name(addr1);
CHECK(!remote_device_db_memory.get_name(addr1, &device_name));
}
TEST(RemoteDeviceDB, SortByLastUsedName){
remote_device_db_memory.put_name(addr1, (device_name_t*) "10");
// dump(db_mem_names);
remote_device_db_memory.put_name(addr2, (device_name_t*) "20");
// dump(db_mem_names);
remote_device_db_memory.put_name(addr3, (device_name_t*) "30");
// dump(db_mem_names);
CHECK(!remote_device_db_memory.get_name(addr1, &device_name));
CHECK(remote_device_db_memory.get_name(addr2, &device_name));
//get first element of the list
db_mem_device_name_t * item = (db_mem_device_name_t *) db_mem_names;
STRCMP_EQUAL((char*)item->device_name, "20");
}
TEST(RemoteDeviceDB, SinglePutGetDeleteKey){
sprintf((char*)link_key, "%d", 100);
remote_device_db_memory.put_link_key(addr1, link_key, link_key_type);
// dump(db_mem_link_keys);
CHECK(remote_device_db_memory.get_link_key(addr1, link_key, &link_key_type));
remote_device_db_memory.delete_link_key(addr1);
CHECK(!remote_device_db_memory.get_link_key(addr1, link_key, &link_key_type));
}
TEST(RemoteDeviceDB, SortByLastUsedKey){
sprintf((char*)link_key, "%d", 10);
remote_device_db_memory.put_link_key(addr1, link_key, link_key_type);
// dump(db_mem_link_keys);
sprintf((char*)link_key, "%d", 20);
remote_device_db_memory.put_link_key(addr2, link_key, link_key_type);
// dump(db_mem_link_keys);
sprintf((char*)link_key, "%d", 30);
remote_device_db_memory.put_link_key(addr3, link_key, link_key_type);
// dump(db_mem_link_keys);
CHECK(!remote_device_db_memory.get_link_key(addr1, link_key, &link_key_type));
CHECK(remote_device_db_memory.get_link_key(addr2, link_key, &link_key_type));
// dump(db_mem_link_keys);
//get first element of the list
db_mem_device_link_key_t * item = (db_mem_device_link_key_t *) db_mem_link_keys;
STRCMP_EQUAL((char*)item->link_key, "20");
}
int main (int argc, const char * argv[]){
return CommandLineTestRunner::RunAllTests(argc, argv);
}

View File

@ -63,7 +63,8 @@ extern "C" {
// Classic
#include "classic/bnep.h"
#include "classic/hfp.h"
#include "classic/remote_device_db.h"
#include "classic/btstack_link_key_db.h"
#include "classic/btstack_link_key_db_memory.h"
#include "classic/rfcomm.h"
#include "classic/sdp.h"
@ -93,11 +94,11 @@ hfile_header_end = """
cfile_header_begin = """
/*
* btstsack_memory.h
* btstack_memory.h
*
* @brief BTstack memory management via configurable memory pools
*
* @note code semi-atuomatically generated by tools/btstack_memory_generator.py
* @note code generated by tool/btstack_memory_generator.py
*
*/
@ -165,7 +166,7 @@ list_of_structs = [
["hci_connection"],
["l2cap_service", "l2cap_channel"],
["rfcomm_multiplexer", "rfcomm_service", "rfcomm_channel"],
["db_mem_device_name", "db_mem_device_link_key", "db_mem_service"],
["btstack_link_key_db_memory"],
["bnep_service", "bnep_channel"],
["hfp_connection"],
["service_record_item"]