BT_PINCODE_ENTRY,
} bt_gap_auth_variant_t;
-/** DBFW+ Event Code */
-typedef enum {
- BT_DBFW_PLUS_EVENT_CODE_LINK_LOSS_INFO = 0x10,
- BT_DBFW_PLUS_EVENT_CODE_LINK_LOSS_CLOCK_INFO = 0x11,
- BT_DBFW_PLUS_EVENT_CODE_LINK_LOSS_PAGE_SLOTS = 0x12,
- BT_DBFW_PLUS_EVENT_CODE_LINK_LOSS_LMP_TRACE = 0x13,
- BT_DBFW_PLUS_EVENT_CODE_A2DP_INFO = 0x20,
- BT_DBFW_PLUS_EVENT_CODE_HFP_INFO = 0x31,
- BT_DBFW_PLUS_EVENT_CODE_HFP_SCO_PACKET_TYPE_INFO = 0x32,
-} bt_dbfw_plus_event_code_t;
#endif
/** Bluetooth Interface callbacks */
EVENT(OAL_EVENT_RSSI_MONITORING_DISABLED) /* event_dev_rssi_info_t */\
EVENT(OAL_EVENT_RSSI_ALERT_RECEIVED) /* event_dev_rssi_info_t */\
EVENT(OAL_EVENT_RAW_RSSI_RECEIVED) /* */\
+ EVENT(OAL_EVENT_DEVICE_DBFW_PLUS_INFO) /* event_dev_dbfw_plus_info_t */\
EVENT(OAL_EVENT_OAL_INITIALISED_SUCCESS) /* OAL Initialisation event */ \
EVENT(OAL_EVENT_OAL_INITIALISED_FAILED) /* OAL Initialisation event */ \
EVENT(OAL_EVENT_HID_CONNECTED) /* event_hid_conn_t */\
typedef struct {
bt_address_t address;
oal_status_t status;
- int rssi;
} event_dev_conn_status_t;
typedef event_dev_conn_status_t event_dev_bond_failed_t;
int rssi;
} event_dev_rssi_info_t;
+typedef struct {
+ uint8_t event_code;
+ uint8_t data[512];
+ int length;
+} event_dev_dbfw_plus_info_t;
+
/*********Datastructures for HID callback******************/
/* HID :: connection state callback response data */
typedef struct {
#include "oal-device-mgr.h"
static const bt_interface_t * blued_api;
-#ifdef TIZEN_BT_HAL
-static int dbfw_rssi;
-#endif
void device_mgr_init(const bt_interface_t * stack_if)
{
#ifdef TIZEN_BT_HAL
conn_status->status = convert_to_oal_status(status);
- conn_status->rssi = dbfw_rssi;
#else
if (BT_STATUS_SUCCESS != status) {
/* At present only timeout will cause non-success status, later we can add more */
BT_DBG("LE conn status:%d, state: %d", status, state);
memcpy(conn_status->address.addr, bd_addr->address, 6);
conn_status->status = convert_to_oal_status(status);
- conn_status->rssi = dbfw_rssi;
switch (state) {
case BT_LE_CONN_STATE_CONNECTED:
BT_DBG("-");
}
-static gboolean __device_init_dbfw_rssi_cb(gpointer user_data)
+void cb_dbfw_plus_info_received(unsigned char *data, uint32_t length, uint8_t event_code)
{
- dbfw_rssi = 0;
- return FALSE;
-}
+ event_dev_dbfw_plus_info_t *dbfw_info;
+ int len = (length > 512)?512:length;
-static void __device_parse_dbfw_set_rssi(unsigned char *data, uint32_t length)
-{
- ret_if(length < 5);
- dbfw_rssi = 0xFFFFFF00 | data[4];
- BT_INFO("dbfw_rssi = %d", dbfw_rssi);
- g_timeout_add(1000, __device_init_dbfw_rssi_cb, NULL);
-}
+ ret_if(data == NULL || length == 0);
-void cb_dbfw_plus_info_received(unsigned char *data, uint32_t length, uint8_t event_code)
-{
- char evt_str[18];
- char *data_str = NULL;
- int i;
-
- ret_if(data == NULL);
-
- data_str = g_malloc0(length * 2 + 1);
- for (i = 0; i < length; i++)
- snprintf(&data_str[i * 2], 3, "%02X", data[i]);
- data_str[i * 2] = '\0';
-
- switch(event_code) {
- case BT_DBFW_PLUS_EVENT_CODE_LINK_LOSS_INFO:
- BT_DBG("## Event Code: Linkloss Debug Info");
- snprintf(evt_str, 18, "[DBFW]Linkloss(D)");
- __device_parse_dbfw_set_rssi(data, length);
- break;
- case BT_DBFW_PLUS_EVENT_CODE_LINK_LOSS_CLOCK_INFO:
- BT_DBG("## Event Code: Linkloss Clock Info");
- snprintf(evt_str, 18, "[DBFW]Linkloss(C)");
- break;
- case BT_DBFW_PLUS_EVENT_CODE_LINK_LOSS_PAGE_SLOTS:
- BT_DBG("## Event Code: Linkloss Page slots");
- snprintf(evt_str, 18, "[DBFW]Linkloss(P)");
- break;
- case BT_DBFW_PLUS_EVENT_CODE_LINK_LOSS_LMP_TRACE:
- BT_DBG("## Event Code: Linkloss LMP trace");
- snprintf(evt_str, 18, "[DBFW]Linkloss(L)");
- break;
- case BT_DBFW_PLUS_EVENT_CODE_A2DP_INFO:
- BT_DBG("## Event Code: A2DP Info");
- snprintf(evt_str, 18, "[DBFW]A2DP");
- break;
- case BT_DBFW_PLUS_EVENT_CODE_HFP_INFO:
- BT_DBG("## Event Code: HFP Info");
- snprintf(evt_str, 18, "[DBFW]HFP");
- break;
- case BT_DBFW_PLUS_EVENT_CODE_HFP_SCO_PACKET_TYPE_INFO:
- BT_DBG("## Event Code: HFP SCO Packet Type");
- snprintf(evt_str, 18, "[DBFW]SCO");
- break;
- default:
- BT_DBG("## Unknown event code (0x%02x)", event_code);
- snprintf(evt_str, 18, "[DBFW]0x%02X", event_code);
- break;
- }
+ dbfw_info = g_new0(event_dev_dbfw_plus_info_t, 1);
+ dbfw_info->event_code = event_code;
+ memcpy(dbfw_info->data, data, len);
+ dbfw_info->length = len;
- g_free(data_str);
+ send_event(OAL_EVENT_DEVICE_DBFW_PLUS_INFO,
+ dbfw_info, sizeof(event_dev_dbfw_plus_info_t));
}
#endif
/* Free data */
g_free(info->sender);
g_free(info);
+
+ BT_PERMANENT_LOG("Adv started %d", event->server_inst);
}
}
/* Free data */
g_free(info->sender);
g_free(info);
+
+ BT_PERMANENT_LOG("Adv stopped %d", event->server_inst);
}
}
count = list->num;
service_list = list->service_list;
__bt_adapter_handle_pending_requests(BT_IS_SERVICE_USED, service_list, count);
+
+ char uuids[512] = {0,};
+ char standard_prefix[2] = {0,};
+ int index = 0;
+ for (int i = 0; i < count; i++) {
+ if (i > 0)
+ g_snprintf(uuids + (index++), 2, ",");
+ if (memcmp(service_list[i].uuid, standard_prefix, 2) == 0) {
+ g_snprintf(uuids + index, 5, "%.2x%.2x",
+ service_list[i].uuid[2], service_list[i].uuid[3]);
+ index += 4;
+ } else {
+ g_snprintf(uuids + index, 9, "%.2x%.2x..%.2x,",
+ service_list[i].uuid[0], service_list[i].uuid[1], service_list[i].uuid[15]);
+ index += 8;
+ }
+ }
+ BT_PERMANENT_LOG("UUIDs %s", uuids);
break;
}
case OAL_EVENT_ADAPTER_BONDED_DEVICE_LIST: {
_bt_send_event(BT_ADAPTER_EVENT, BLUETOOTH_EVENT_ENABLED,
g_variant_new("(i)", result));
+ BT_PERMANENT_LOG("BT Enabled");
+
return FALSE;
}
g_variant_new("(i)", result));
BT_INFO("Adapter disabled");
+ BT_PERMANENT_LOG("BT Disabled");
}
case OAL_EVENT_A2DP_SINK_CONNECTED:
BT_INFO("A2DP Sink Profile connected..");
__bt_handle_av_source_connected_state(bd_addr);
+ BT_PERMANENT_LOG("Connected A2DP sink");
break;
case OAL_EVENT_A2DP_SINK_DISCONNECTED:
BT_INFO("A2DP Sink Profile dissconnected..");
__bt_handle_av_source_disconnected_state(bd_addr);
+ BT_PERMANENT_LOG("Disconnected A2DP sink");
break;
default:
BT_INFO("Invalid Event = %d", oal_event);
case OAL_EVENT_AUDIO_CONNECTED:
BT_INFO("A2DP Audio Profile connected..");
__bt_handle_av_connected_state(bd_addr);
+ BT_PERMANENT_LOG("Connected A2DP src");
break;
case OAL_EVENT_AUDIO_DISCONNECTED:
BT_INFO("A2DP Audio Profile dissconnected..");
__bt_handle_av_disconnected_state(bd_addr);
+ BT_PERMANENT_LOG("Disconnected A2DP src");
break;
case OAL_EVENT_AUDIO_STOPPED:
BT_INFO("A2DP Audio Stream stopped..");
BT_INFO("AVRCP Controller Profile connected..");
bd_addr = (bluetooth_device_address_t*)event_data;
__bt_handle_avrcp_target_connected_state(bd_addr);
+ BT_PERMANENT_LOG("Connected AVRCP ct");
break;
}
case OAL_EVENT_AVRCP_CT_DISCONNECTED: {
BT_INFO("AVRCP Controller Profile dissconnected..");
bd_addr = (bluetooth_device_address_t*)event_data;
__bt_handle_avrcp_target_disconnected_state(bd_addr);
+ BT_PERMANENT_LOG("Disconnected AVRCP ct");
break;
}
case OAL_EVENT_AVRCP_CT_EQUALIZER_STATUS:
__handle_avrcp_connection_event(
BLUETOOTH_EVENT_AVRCP_CONNECTED,
(bt_address_t *)event_data);
+ BT_PERMANENT_LOG("Connected AVRCP tg");
break;
case OAL_EVENT_AVRCP_DISCONNECTED:
__handle_avrcp_connection_event(
BLUETOOTH_EVENT_AVRCP_DISCONNECTED,
(bt_address_t *)event_data);
+ BT_PERMANENT_LOG("Disconnected AVRCP tg");
break;
case OAL_EVENT_AVRCP_SETTING_EQUALIZER_STATUS:
__handle_player_property_equalizer((unsigned char *)event_data);
//_bt_headset_set_local_connection(TRUE);
/* Add data to the connected list */
_bt_add_headset_to_list(type, BT_STATE_CONNECTING, addr);
+ BT_PERMANENT_LOG("Connect %d", type);
} else {
BT_ERR("Profile [%d] connect failed!!", type);
}
/* Update device status in connected list */
_bt_add_headset_to_list(type, BT_STATE_DISCONNECTING, addr);
+ BT_PERMANENT_LOG("Disconnect %d", type);
} else {
BT_ERR("Profile [%d] connect failed!!", type);
}
goto fail;
}
+ BT_PERMANENT_LOG("Connect %d", info->type);
/* If multiple profiles are supported, queue pending connection info */
if ((info->is_hfp_supported && info->is_a2dp_sink_supported) ||
(info->is_hfp_supported && info->is_a2dp_src_supported)) {
result = _bt_connect_remote_ag(device_address);
if (result != BLUETOOTH_ERROR_NONE)
BT_ERR("HF Client connect to remote AG failed");
+ else
+ BT_PERMANENT_LOG("Connect AG");
return result;
}
result = _bt_disconnect_remote_ag(device_address);
if (result != BLUETOOTH_ERROR_NONE)
BT_ERR("HF Client disconnect to remote AG failed");
+ else
+ BT_PERMANENT_LOG("Disconnect AG");
return result;
}
/* Reply to async request for HF Client connect or disconnect request, if any */
BT_INFO("HF client Profile disconnected, reply pending DBUS request and check waiting device");
__bt_reply_hf_client_disconnection_pending_request(bt_addr);
+ BT_PERMANENT_LOG("Disconnected HF");
break;
case OAL_EVENT_HF_CLIENT_CONNECTED:
BT_INFO("HF Client Profile connected, Event & DBUS context will be handled at finalizing SCO connect..");
__bt_reply_hf_client_connection_pending_request(bt_addr);
+ BT_PERMANENT_LOG("Connected HF");
break;
case OAL_EVENT_HF_CLIENT_CONNECTING:
BT_INFO("HF Client Profile connection successful, wait for Audio connect..");
/* Reply to async request for HF connect or disconnect request, if any */
BT_INFO("HF Profile disconnected, reply pending DBUS request and check waiting device");
__bt_reply_hf_disconnection_pending_request(bt_addr);
+ BT_PERMANENT_LOG("Disconnected AG");
break;
case OAL_EVENT_HFP_AUDIO_DISCONNECTED:
/* Reply to async request for HF connect or disconnect request, if any */
BT_INFO("HF SCO disconnected, reply pending request if any and send event");
__bt_hf_handle_audio_disconnection_state(bt_addr);
+ BT_PERMANENT_LOG("Disconnected SCO");
break;
case OAL_EVENT_HFP_CONNECTED:
BT_INFO("HFP Profile connected, Event & DBUS context will be handled at finalizing SCO connect..");
__bt_reply_hf_connection_pending_request(bt_addr);
+ BT_PERMANENT_LOG("Connected AG");
break;
case OAL_EVENT_HFP_AUDIO_CONNECTED:
BT_INFO("HFP SCO conencted, handle the event..");
__bt_hf_handle_audio_connection_state(bt_addr);
+ BT_PERMANENT_LOG("Connected SCO");
break;
case OAL_EVENT_HFP_CONNECTING:
BT_INFO("HFP Profile connection successful, wait for Audio connect..");
case BT_SEARCH_SERVICE:
case BT_RFCOMM_CLIENT_CONNECT:
+ if (function_name == BT_RFCOMM_CLIENT_CONNECT)
+ BT_PERMANENT_LOG("Connect socket");
case BT_RFCOMM_CLIENT_CANCEL_CONNECT:
case BT_RFCOMM_SOCKET_DISCONNECT:
+ if (function_name == BT_RFCOMM_SOCKET_DISCONNECT)
+ BT_PERMANENT_LOG("Disconnect socket");
case BT_RFCOMM_SOCKET_WRITE:
case BT_RFCOMM_CREATE_SOCKET:
case BT_RFCOMM_REMOVE_SOCKET:
BT_DBG("-");
}
+
+#define BT_PERMANENT_LOG_FILE_PATH "/opt/usr/home/owner/media/Downloads/.bt_dump/permanent_log.txt"
+#define BT_PERMANENT_LOG_OLD_FILE_PATH "/opt/usr/home/owner/media/Downloads/.bt_dump/permanent_log_old.txt"
+#define PERMANENT_LOG_MAX (128 * 1024)
+void _bt_permanent_log(const char *fmt, ...)
+{
+ FILE *fp;
+ time_t t;
+ struct tm *lt;
+ char time_buf[32];
+ long lsize = 0;
+ va_list ap;
+
+ t = time(&t);
+ lt = localtime(&t);
+ strftime(time_buf, sizeof(time_buf), "%m-%d %H:%M:%S", lt);
+
+ fp = fopen(BT_PERMANENT_LOG_FILE_PATH, "r");
+ if (fp != NULL) {
+ fseek(fp, 0, SEEK_END);
+ lsize = ftell(fp);
+ }
+
+ if (lsize > PERMANENT_LOG_MAX) {
+ FILE *fp2;
+ int character;
+ fp2 = fopen(BT_PERMANENT_LOG_OLD_FILE_PATH, "w");
+ if (fp2 == NULL)
+ goto DONE;
+ fseek(fp, 0, SEEK_SET);
+ while (!feof(fp)) {
+ character = fgetc(fp);
+ fputc(character, fp2);
+ }
+ fclose(fp);
+ fclose(fp2);
+ fp = fopen(BT_PERMANENT_LOG_FILE_PATH, "w");
+ } else {
+ if (fp != NULL)
+ fclose(fp);
+ fp = fopen(BT_PERMANENT_LOG_FILE_PATH, "a");
+ }
+
+ if (fp != NULL) {
+ char buf[100];
+ va_start(ap, fmt);
+ vsnprintf(buf, 100, fmt, ap);
+ va_end(ap);
+ fprintf(fp, "%s %s\n", time_buf, buf);
+ }
+
+DONE:
+ if (fp != NULL)
+ fclose(fp);
+}
+
case OAL_EVENT_RSSI_MONITORING_DISABLED:
case OAL_EVENT_RAW_RSSI_RECEIVED:
case OAL_EVENT_RSSI_ALERT_RECEIVED:
+ case OAL_EVENT_DEVICE_DBFW_PLUS_INFO:
if (device_cb)
device_cb(event_type, event_data);
if (adapter_gatt_cb)
static char *passkey_watcher;
static GSList *pin_info_list = NULL;
+/** DBFW+ Event Code */
+typedef enum {
+ BT_DBFW_PLUS_EVENT_CODE_LINK_LOSS_INFO = 0x10,
+ BT_DBFW_PLUS_EVENT_CODE_LINK_LOSS_CLOCK_INFO = 0x11,
+ BT_DBFW_PLUS_EVENT_CODE_LINK_LOSS_PAGE_SLOTS = 0x12,
+ BT_DBFW_PLUS_EVENT_CODE_LINK_LOSS_LMP_TRACE = 0x13,
+ BT_DBFW_PLUS_EVENT_CODE_A2DP_INFO = 0x20,
+ BT_DBFW_PLUS_EVENT_CODE_HFP_INFO = 0x31,
+ BT_DBFW_PLUS_EVENT_CODE_HFP_SCO_PACKET_TYPE_INFO = 0x32,
+} bt_dbfw_plus_event_code_t;
+
+static int dbfw_rssi;
+
#ifdef TIZEN_GATT_CLIENT
typedef struct {
char *address;
_bt_send_event(BT_ADAPTER_EVENT,
BLUETOOTH_EVENT_BONDING_FINISHED,
param);
+ BT_PERMANENT_LOG("Paired %s", remote_dev_info->address + 12);
if (incoming_bond) {
__bt_free_bond_info(BT_DEVICE_INCOMING_BOND_INFO);
} else {
_bt_send_event(BT_ADAPTER_EVENT,
BLUETOOTH_EVENT_BONDED_DEVICE_REMOVED,
param);
+ BT_PERMANENT_LOG("Unpaired %s", trigger_unbond_info->addr + 12);
__bt_free_bond_info(BT_DEVICE_UNBOND_INFO);
__bt_free_pairing_info(&trigger_pairing_info);
} else if (trigger_bond_info) {
BT_INFO("-");
}
+static gboolean __bt_device_init_dbfw_rssi_cb(gpointer user_data)
+{
+ dbfw_rssi = 0;
+ return FALSE;
+}
+
+static void __bt_device_parse_dbfw_set_rssi(unsigned char *data, uint32_t length)
+{
+ ret_if(length < 5);
+ dbfw_rssi = 0xFFFFFF00 | data[4];
+ BT_INFO("dbfw_rssi = %d", dbfw_rssi);
+ g_timeout_add(1000, __bt_device_init_dbfw_rssi_cb, NULL);
+}
+
+static void __bt_device_dbfw_plus_info_callback(event_dev_dbfw_plus_info_t *dbfw_info)
+{
+ char evt_str[18];
+ char *data_str = NULL;
+ int i;
+
+ data_str = g_malloc0(dbfw_info->length * 2 + 1);
+ for (i = 0; i < dbfw_info->length; i++)
+ snprintf(&data_str[i * 2], 3, "%02X", dbfw_info->data[i]);
+ data_str[i * 2] = '\0';
+
+ switch(dbfw_info->event_code) {
+ case BT_DBFW_PLUS_EVENT_CODE_LINK_LOSS_INFO:
+ BT_DBG("## Event Code: Linkloss Debug Info");
+ snprintf(evt_str, 18, "[DBFW]Linkloss(D)");
+ __bt_device_parse_dbfw_set_rssi(dbfw_info->data, dbfw_info->length);
+ break;
+ case BT_DBFW_PLUS_EVENT_CODE_LINK_LOSS_CLOCK_INFO:
+ BT_DBG("## Event Code: Linkloss Clock Info");
+ snprintf(evt_str, 18, "[DBFW]Linkloss(C)");
+ break;
+ case BT_DBFW_PLUS_EVENT_CODE_LINK_LOSS_PAGE_SLOTS:
+ BT_DBG("## Event Code: Linkloss Page slots");
+ snprintf(evt_str, 18, "[DBFW]Linkloss(P)");
+ break;
+ case BT_DBFW_PLUS_EVENT_CODE_LINK_LOSS_LMP_TRACE:
+ BT_DBG("## Event Code: Linkloss LMP trace");
+ snprintf(evt_str, 18, "[DBFW]Linkloss(L)");
+ break;
+ case BT_DBFW_PLUS_EVENT_CODE_A2DP_INFO:
+ BT_DBG("## Event Code: A2DP Info");
+ snprintf(evt_str, 18, "[DBFW]A2DP");
+ break;
+ case BT_DBFW_PLUS_EVENT_CODE_HFP_INFO:
+ BT_DBG("## Event Code: HFP Info");
+ snprintf(evt_str, 18, "[DBFW]HFP");
+ break;
+ case BT_DBFW_PLUS_EVENT_CODE_HFP_SCO_PACKET_TYPE_INFO:
+ BT_DBG("## Event Code: HFP SCO Packet Type");
+ snprintf(evt_str, 18, "[DBFW]SCO");
+ break;
+ default:
+ BT_DBG("## Unknown event code (0x%02x)", dbfw_info->event_code);
+ snprintf(evt_str, 18, "[DBFW]0x%02X", dbfw_info->event_code);
+ break;
+ }
+
+ BT_PERMANENT_LOG("%s 0x%s", evt_str, data_str);
+ g_free(data_str);
+}
+
static void __bt_device_event_handler(int event_type, gpointer event_data)
{
int eventcheck = OAL_EVENT_DEVICE_PROPERTIES;
_bt_send_event(BT_DEVICE_EVENT, BLUETOOTH_EVENT_RAW_RSSI, param);
break;
}
+ case OAL_EVENT_DEVICE_DBFW_PLUS_INFO: {
+ __bt_device_dbfw_plus_info_callback((event_dev_dbfw_plus_info_t*)event_data);
+ break;
+ }
default:
BT_INFO("Unhandled event..");
}
BLUETOOTH_EVENT_DEVICE_CONNECTED,
param);
} else {
- param = g_variant_new("(isyi)", result, address, type, acl_event->rssi);
+ param = g_variant_new("(isyi)", result, address, type, dbfw_rssi);
_bt_send_event(BT_DEVICE_EVENT,
BLUETOOTH_EVENT_DEVICE_DISCONNECTED,
param);
}
+ BT_PERMANENT_LOG("%sonnected %s %s",
+ connected ? "C" : "Disc", !type ? "EDR" : "LE", address + 12);
conn_info.connected = connected;
conn_info.type = type;
_bt_send_event(BT_HID_DEVICE_EVENT,
BLUETOOTH_HID_DEVICE_CONNECTED,
g_variant_new("(is)", result, address));
+ BT_PERMANENT_LOG("Connected HID Device");
break;
case OAL_EVENT_HID_DEVICE_DISCONNECTED:
_bt_send_event(BT_HID_DEVICE_EVENT,
BLUETOOTH_HID_DEVICE_DISCONNECTED,
g_variant_new("(is)", result, address));
+ BT_PERMANENT_LOG("Disconnected HID Device");
break;
default:
BT_ERR("Unhandled event: %d", event_type);
/* Send HID connected event to Application */
param = g_variant_new("(is)", result, address);
_bt_send_event(BT_HID_EVENT, BLUETOOTH_HID_CONNECTED, param);
+ BT_PERMANENT_LOG("Connected HID Host");
BT_DBG("-");
}
/* Send HID disconnected event to Application */
param = g_variant_new("(is)", result, address);
_bt_send_event(BT_HID_EVENT, BLUETOOTH_HID_DISCONNECTED, param);
+ BT_PERMANENT_LOG("Disconnected HID Host");
BT_DBG("-");
}
#define LOG_COLOR_BLUE "\033[36m"
#define LOG_COLOR_PURPLE "\033[35m"
+#define BT_PERMANENT_LOG(fmt, args...) _bt_permanent_log(fmt, ##args)
+
#define BT_DBG(fmt, args...) \
SLOGD(fmt, ##args)
#define BT_INFO(fmt, args...) \
invocation_info_t* _bt_get_request_info_data_from_function_name(int service_function);
+void _bt_permanent_log(const char *fmt, ...);
+
#ifdef __cplusplus
}
#endif /* __cplusplus */