am 7f34538a: (-s ours) am 65aec3a3: am 6d429d9d: (-s ours) am 3efb9e2e: DO NOT MERGE Change pairing_cb to assume temporary pairing by default
* commit '7f34538ac0e447a88d1f54ff819c28b3574f0aa4':
DO NOT MERGE Change pairing_cb to assume temporary pairing by default
diff --git a/Android.mk b/Android.mk
index 5f2d274..1ddfb47 100644
--- a/Android.mk
+++ b/Android.mk
@@ -1,12 +1,20 @@
LOCAL_PATH := $(call my-dir)
+bdroid_CFLAGS := -Wno-unused-parameter
+
# Setup bdroid local make variables for handling configuration
ifneq ($(BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR),)
bdroid_C_INCLUDES := $(BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR)
- bdroid_CFLAGS := -DHAS_BDROID_BUILDCFG
+ bdroid_CFLAGS += -DHAS_BDROID_BUILDCFG
else
bdroid_C_INCLUDES :=
- bdroid_CFLAGS := -DHAS_NO_BDROID_BUILDCFG
+ bdroid_CFLAGS += -DHAS_NO_BDROID_BUILDCFG
+endif
+
+bdroid_CFLAGS += -Wall -Werror
+
+ifneq ($(BOARD_BLUETOOTH_BDROID_HCILP_INCLUDED),)
+ bdroid_CFLAGS += -DHCILP_INCLUDED=$(BOARD_BLUETOOTH_BDROID_HCILP_INCLUDED)
endif
include $(call all-subdir-makefiles)
diff --git a/CleanSpec.mk b/CleanSpec.mk
index b84e1b6..518119b 100644
--- a/CleanSpec.mk
+++ b/CleanSpec.mk
@@ -44,6 +44,10 @@
#$(call add-clean-step, find $(OUT_DIR) -type f -name "IGTalkSession*" -print0 | xargs -0 rm -f)
#$(call add-clean-step, rm -rf $(PRODUCT_OUT)/data/*)
+# Start of Clean Step list:
+$(call add-clean-step, find $(OUT_DIR) -type f -iname "*blue*" -print0 | xargs -0 rm -f)
+$(call add-clean-step, find $(OUT_DIR) -type f -iname "*bdroid*" -print0 | xargs -0 rm -f)
+
# ************************************************
# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
# ************************************************
diff --git a/audio_a2dp_hw/Android.mk b/audio_a2dp_hw/Android.mk
index f9fd0a1..6fb83cb 100644
--- a/audio_a2dp_hw/Android.mk
+++ b/audio_a2dp_hw/Android.mk
@@ -1,21 +1,21 @@
-LOCAL_PATH:= $(call my-dir)
+LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
-LOCAL_SRC_FILES:= \
+LOCAL_SRC_FILES := \
audio_a2dp_hw.c
-LOCAL_C_INCLUDES+= . $(LOCAL_PATH)/../utils/include
+LOCAL_C_INCLUDES += \
+ . \
+ $(LOCAL_PATH)/../utils/include
-LOCAL_SHARED_LIBRARIES := \
- libcutils liblog
-
-LOCAL_SHARED_LIBRARIES += \
- libpower
+LOCAL_CFLAGS += -std=c99
LOCAL_MODULE := audio.a2dp.default
LOCAL_MODULE_RELATIVE_PATH := hw
+LOCAL_SHARED_LIBRARIES := libcutils liblog
+
LOCAL_MODULE_TAGS := optional
include $(BUILD_SHARED_LIBRARY)
diff --git a/audio_a2dp_hw/audio_a2dp_hw.c b/audio_a2dp_hw/audio_a2dp_hw.c
index cde56c1..5310ba3 100644
--- a/audio_a2dp_hw/audio_a2dp_hw.c
+++ b/audio_a2dp_hw/audio_a2dp_hw.c
@@ -25,6 +25,7 @@
*****************************************************************************/
#include <errno.h>
+#include <inttypes.h>
#include <pthread.h>
#include <stdint.h>
#include <sys/time.h>
@@ -47,7 +48,7 @@
#define LOG_TAG "audio_a2dp_hw"
/* #define LOG_NDEBUG 0 */
-#include <cutils/log.h>
+#include <log/log.h>
/*****************************************************************************
** Constants & Macros
@@ -78,10 +79,12 @@
AUDIO_A2DP_STATE_STANDBY /* allows write to autoresume */
} a2dp_state_t;
+struct a2dp_stream_in;
struct a2dp_stream_out;
struct a2dp_audio_device {
struct audio_hw_device device;
+ struct a2dp_stream_in *input;
struct a2dp_stream_out *output;
};
@@ -93,18 +96,23 @@
/* move ctrl_fd outside output stream and keep open until HAL unloaded ? */
-struct a2dp_stream_out {
- struct audio_stream_out stream;
+struct a2dp_stream_common {
pthread_mutex_t lock;
int ctrl_fd;
int audio_fd;
size_t buffer_sz;
- a2dp_state_t state;
struct a2dp_config cfg;
+ a2dp_state_t state;
+};
+
+struct a2dp_stream_out {
+ struct audio_stream_out stream;
+ struct a2dp_stream_common common;
};
struct a2dp_stream_in {
- struct audio_stream_in stream;
+ struct audio_stream_in stream;
+ struct a2dp_stream_common common;
};
/*****************************************************************************
@@ -188,14 +196,14 @@
**
*****************************************************************************/
-static int skt_connect(struct a2dp_stream_out *out, char *path)
+static int skt_connect(char *path, size_t buffer_sz)
{
int ret;
int skt_fd;
struct sockaddr_un remote;
int len;
- INFO("connect to %s (sz %d)", path, out->buffer_sz);
+ INFO("connect to %s (sz %zu)", path, buffer_sz);
skt_fd = socket(AF_LOCAL, SOCK_STREAM, 0);
@@ -207,18 +215,43 @@
return -1;
}
- len = out->buffer_sz;
+ len = buffer_sz;
ret = setsockopt(skt_fd, SOL_SOCKET, SO_SNDBUF, (char*)&len, (int)sizeof(len));
/* only issue warning if failed */
if (ret < 0)
ERROR("setsockopt failed (%s)", strerror(errno));
+ ret = setsockopt(skt_fd, SOL_SOCKET, SO_RCVBUF, (char*)&len, (int)sizeof(len));
+
+ /* only issue warning if failed */
+ if (ret < 0)
+ ERROR("setsockopt failed (%s)", strerror(errno));
+
INFO("connected to stack fd = %d", skt_fd);
return skt_fd;
}
+static int skt_read(int fd, void *p, size_t len)
+{
+ int read;
+ struct pollfd pfd;
+ struct timespec ts;
+
+ FNLOG();
+
+ ts_log("skt_read recv", len, NULL);
+
+ if ((read = recv(fd, p, len, MSG_NOSIGNAL)) == -1)
+ {
+ ERROR("write failed with errno=%d\n", errno);
+ return -1;
+ }
+
+ return read;
+}
+
static int skt_write(int fd, const void *p, size_t len)
{
int sent;
@@ -266,29 +299,53 @@
**
*****************************************************************************/
-static int a2dp_command(struct a2dp_stream_out *out, char cmd)
+static int a2dp_ctrl_receive(struct a2dp_stream_common *common, void* buffer, int length)
+{
+ int ret = recv(common->ctrl_fd, buffer, length, MSG_NOSIGNAL);
+ if (ret < 0)
+ {
+ ERROR("ack failed (%s)", strerror(errno));
+ if (errno == EINTR)
+ {
+ /* retry again */
+ ret = recv(common->ctrl_fd, buffer, length, MSG_NOSIGNAL);
+ if (ret < 0)
+ {
+ ERROR("ack failed (%s)", strerror(errno));
+ skt_disconnect(common->ctrl_fd);
+ common->ctrl_fd = AUDIO_SKT_DISCONNECTED;
+ return -1;
+ }
+ }
+ else
+ {
+ skt_disconnect(common->ctrl_fd);
+ common->ctrl_fd = AUDIO_SKT_DISCONNECTED;
+ return -1;
+
+ }
+ }
+ return ret;
+}
+
+static int a2dp_command(struct a2dp_stream_common *common, char cmd)
{
char ack;
DEBUG("A2DP COMMAND %s", dump_a2dp_ctrl_event(cmd));
/* send command */
- if (send(out->ctrl_fd, &cmd, 1, MSG_NOSIGNAL) == -1)
+ if (send(common->ctrl_fd, &cmd, 1, MSG_NOSIGNAL) == -1)
{
ERROR("cmd failed (%s)", strerror(errno));
- skt_disconnect(out->ctrl_fd);
- out->ctrl_fd = AUDIO_SKT_DISCONNECTED;
+ skt_disconnect(common->ctrl_fd);
+ common->ctrl_fd = AUDIO_SKT_DISCONNECTED;
return -1;
}
/* wait for ack byte */
- if (recv(out->ctrl_fd, &ack, 1, MSG_NOSIGNAL) < 0)
- {
- ERROR("ack failed (%s)", strerror(errno));
- skt_disconnect(out->ctrl_fd);
- out->ctrl_fd = AUDIO_SKT_DISCONNECTED;
+ if (a2dp_ctrl_receive(common, &ack, 1) < 0)
return -1;
- }
DEBUG("A2DP COMMAND %s DONE STATUS %d", dump_a2dp_ctrl_event(cmd), ack);
@@ -298,13 +355,74 @@
return 0;
}
+static int check_a2dp_ready(struct a2dp_stream_common *common)
+{
+ if (a2dp_command(common, A2DP_CTRL_CMD_CHECK_READY) < 0)
+ {
+ ERROR("check a2dp ready failed");
+ return -1;
+ }
+ return 0;
+}
+
+static int a2dp_read_audio_config(struct a2dp_stream_common *common)
+{
+ char cmd = A2DP_CTRL_GET_AUDIO_CONFIG;
+ uint32_t sample_rate;
+ uint8_t channel_count;
+
+ if (a2dp_command(common, A2DP_CTRL_GET_AUDIO_CONFIG) < 0)
+ {
+ ERROR("check a2dp ready failed");
+ return -1;
+ }
+
+ if (a2dp_ctrl_receive(common, &sample_rate, 4) < 0)
+ return -1;
+ if (a2dp_ctrl_receive(common, &channel_count, 1) < 0)
+ return -1;
+
+ common->cfg.channel_flags = (channel_count == 1 ? AUDIO_CHANNEL_IN_MONO : AUDIO_CHANNEL_IN_STEREO);
+ common->cfg.format = AUDIO_STREAM_DEFAULT_FORMAT;
+ common->cfg.rate = sample_rate;
+
+ INFO("got config %d %d", common->cfg.format, common->cfg.rate);
+
+ return 0;
+}
+
+static void a2dp_open_ctrl_path(struct a2dp_stream_common *common)
+{
+ int i;
+
+ /* retry logic to catch any timing variations on control channel */
+ for (i = 0; i < CTRL_CHAN_RETRY_COUNT; i++)
+ {
+ /* connect control channel if not already connected */
+ if ((common->ctrl_fd = skt_connect(A2DP_CTRL_PATH, common->buffer_sz)) > 0)
+ {
+ /* success, now check if stack is ready */
+ if (check_a2dp_ready(common) == 0)
+ break;
+
+ ERROR("error : a2dp not ready, wait 250 ms and retry");
+ usleep(250000);
+ skt_disconnect(common->ctrl_fd);
+ common->ctrl_fd = AUDIO_SKT_DISCONNECTED;
+ }
+
+ /* ctrl channel not ready, wait a bit */
+ usleep(250000);
+ }
+}
+
/*****************************************************************************
**
** AUDIO DATA PATH
**
*****************************************************************************/
-static void a2dp_stream_out_init(struct a2dp_stream_out *out)
+static void a2dp_stream_common_init(struct a2dp_stream_common *common)
{
pthread_mutexattr_t lock_attr;
@@ -312,124 +430,109 @@
pthread_mutexattr_init(&lock_attr);
pthread_mutexattr_settype(&lock_attr, PTHREAD_MUTEX_RECURSIVE);
- pthread_mutex_init(&out->lock, &lock_attr);
+ pthread_mutex_init(&common->lock, &lock_attr);
- out->ctrl_fd = AUDIO_SKT_DISCONNECTED;
- out->audio_fd = AUDIO_SKT_DISCONNECTED;
- out->state = AUDIO_A2DP_STATE_STOPPED;
-
- out->cfg.channel_flags = AUDIO_STREAM_DEFAULT_CHANNEL_FLAG;
- out->cfg.format = AUDIO_STREAM_DEFAULT_FORMAT;
- out->cfg.rate = AUDIO_STREAM_DEFAULT_RATE;
+ common->ctrl_fd = AUDIO_SKT_DISCONNECTED;
+ common->audio_fd = AUDIO_SKT_DISCONNECTED;
+ common->state = AUDIO_A2DP_STATE_STOPPED;
/* manages max capacity of socket pipe */
- out->buffer_sz = AUDIO_STREAM_OUTPUT_BUFFER_SZ;
+ common->buffer_sz = AUDIO_STREAM_OUTPUT_BUFFER_SZ;
}
-static int start_audio_datapath(struct a2dp_stream_out *out)
+static int start_audio_datapath(struct a2dp_stream_common *common)
{
- int oldstate = out->state;
+ int oldstate = common->state;
- INFO("state %d", out->state);
+ INFO("state %d", common->state);
- if (out->ctrl_fd == AUDIO_SKT_DISCONNECTED)
+ if (common->ctrl_fd == AUDIO_SKT_DISCONNECTED) {
+ INFO("AUDIO_SKT_DISCONNECTED");
return -1;
+ }
- out->state = AUDIO_A2DP_STATE_STARTING;
+ common->state = AUDIO_A2DP_STATE_STARTING;
- if (a2dp_command(out, A2DP_CTRL_CMD_START) < 0)
+ if (a2dp_command(common, A2DP_CTRL_CMD_START) < 0)
{
ERROR("audiopath start failed");
- out->state = oldstate;
+ common->state = oldstate;
return -1;
}
/* connect socket if not yet connected */
- if (out->audio_fd == AUDIO_SKT_DISCONNECTED)
+ if (common->audio_fd == AUDIO_SKT_DISCONNECTED)
{
- out->audio_fd = skt_connect(out, A2DP_DATA_PATH);
-
- if (out->audio_fd < 0)
+ common->audio_fd = skt_connect(A2DP_DATA_PATH, common->buffer_sz);
+ if (common->audio_fd < 0)
{
- out->state = oldstate;
+ common->state = oldstate;
return -1;
}
- out->state = AUDIO_A2DP_STATE_STARTED;
+ common->state = AUDIO_A2DP_STATE_STARTED;
}
return 0;
}
-static int stop_audio_datapath(struct a2dp_stream_out *out)
+static int stop_audio_datapath(struct a2dp_stream_common *common)
{
- int oldstate = out->state;
+ int oldstate = common->state;
- INFO("state %d", out->state);
+ INFO("state %d", common->state);
- if (out->ctrl_fd == AUDIO_SKT_DISCONNECTED)
+ if (common->ctrl_fd == AUDIO_SKT_DISCONNECTED)
return -1;
/* prevent any stray output writes from autostarting the stream
while stopping audiopath */
- out->state = AUDIO_A2DP_STATE_STOPPING;
+ common->state = AUDIO_A2DP_STATE_STOPPING;
- if (a2dp_command(out, A2DP_CTRL_CMD_STOP) < 0)
+ if (a2dp_command(common, A2DP_CTRL_CMD_STOP) < 0)
{
ERROR("audiopath stop failed");
- out->state = oldstate;
+ common->state = oldstate;
return -1;
}
- out->state = AUDIO_A2DP_STATE_STOPPED;
+ common->state = AUDIO_A2DP_STATE_STOPPED;
/* disconnect audio path */
- skt_disconnect(out->audio_fd);
- out->audio_fd = AUDIO_SKT_DISCONNECTED;
+ skt_disconnect(common->audio_fd);
+ common->audio_fd = AUDIO_SKT_DISCONNECTED;
return 0;
}
-static int suspend_audio_datapath(struct a2dp_stream_out *out, bool standby)
+static int suspend_audio_datapath(struct a2dp_stream_common *common, bool standby)
{
- INFO("state %d", out->state);
+ INFO("state %d", common->state);
- if (out->ctrl_fd == AUDIO_SKT_DISCONNECTED)
+ if (common->ctrl_fd == AUDIO_SKT_DISCONNECTED)
return -1;
- if (out->state == AUDIO_A2DP_STATE_STOPPING)
+ if (common->state == AUDIO_A2DP_STATE_STOPPING)
return -1;
- if (a2dp_command(out, A2DP_CTRL_CMD_SUSPEND) < 0)
+ if (a2dp_command(common, A2DP_CTRL_CMD_SUSPEND) < 0)
return -1;
if (standby)
- out->state = AUDIO_A2DP_STATE_STANDBY;
+ common->state = AUDIO_A2DP_STATE_STANDBY;
else
- out->state = AUDIO_A2DP_STATE_SUSPENDED;
+ common->state = AUDIO_A2DP_STATE_SUSPENDED;
/* disconnect audio path */
- skt_disconnect(out->audio_fd);
+ skt_disconnect(common->audio_fd);
- out->audio_fd = AUDIO_SKT_DISCONNECTED;
+ common->audio_fd = AUDIO_SKT_DISCONNECTED;
return 0;
}
-static int check_a2dp_ready(struct a2dp_stream_out *out)
-{
- INFO("state %d", out->state);
-
- if (a2dp_command(out, A2DP_CTRL_CMD_CHECK_READY) < 0)
- {
- ERROR("check a2dp ready failed");
- return -1;
- }
- return 0;
-}
-
/*****************************************************************************
**
@@ -443,52 +546,52 @@
struct a2dp_stream_out *out = (struct a2dp_stream_out *)stream;
int sent;
- DEBUG("write %d bytes (fd %d)", bytes, out->audio_fd);
+ DEBUG("write %zu bytes (fd %d)", bytes, out->common.audio_fd);
- if (out->state == AUDIO_A2DP_STATE_SUSPENDED)
+ if (out->common.state == AUDIO_A2DP_STATE_SUSPENDED)
{
DEBUG("stream suspended");
return -1;
}
/* only allow autostarting if we are in stopped or standby */
- if ((out->state == AUDIO_A2DP_STATE_STOPPED) ||
- (out->state == AUDIO_A2DP_STATE_STANDBY))
+ if ((out->common.state == AUDIO_A2DP_STATE_STOPPED) ||
+ (out->common.state == AUDIO_A2DP_STATE_STANDBY))
{
- pthread_mutex_lock(&out->lock);
+ pthread_mutex_lock(&out->common.lock);
- if (start_audio_datapath(out) < 0)
+ if (start_audio_datapath(&out->common) < 0)
{
/* emulate time this write represents to avoid very fast write
failures during transition periods or remote suspend */
- int us_delay = calc_audiotime(out->cfg, bytes);
+ int us_delay = calc_audiotime(out->common.cfg, bytes);
DEBUG("emulate a2dp write delay (%d us)", us_delay);
usleep(us_delay);
- pthread_mutex_unlock(&out->lock);
+ pthread_mutex_unlock(&out->common.lock);
return -1;
}
- pthread_mutex_unlock(&out->lock);
+ pthread_mutex_unlock(&out->common.lock);
}
- else if (out->state != AUDIO_A2DP_STATE_STARTED)
+ else if (out->common.state != AUDIO_A2DP_STATE_STARTED)
{
ERROR("stream not in stopped or standby");
return -1;
}
- sent = skt_write(out->audio_fd, buffer, bytes);
+ sent = skt_write(out->common.audio_fd, buffer, bytes);
if (sent == -1)
{
- skt_disconnect(out->audio_fd);
- out->audio_fd = AUDIO_SKT_DISCONNECTED;
- out->state = AUDIO_A2DP_STATE_STOPPED;
+ skt_disconnect(out->common.audio_fd);
+ out->common.audio_fd = AUDIO_SKT_DISCONNECTED;
+ out->common.state = AUDIO_A2DP_STATE_STOPPED;
}
- DEBUG("wrote %d bytes out of %d bytes", sent, bytes);
+ DEBUG("wrote %d bytes out of %zu bytes", sent, bytes);
return sent;
}
@@ -497,16 +600,16 @@
{
struct a2dp_stream_out *out = (struct a2dp_stream_out *)stream;
- DEBUG("rate %d", out->cfg.rate);
+ DEBUG("rate %" PRIu32,out->common.cfg.rate);
- return out->cfg.rate;
+ return out->common.cfg.rate;
}
static int out_set_sample_rate(struct audio_stream *stream, uint32_t rate)
{
struct a2dp_stream_out *out = (struct a2dp_stream_out *)stream;
- DEBUG("out_set_sample_rate : %d", rate);
+ DEBUG("out_set_sample_rate : %" PRIu32, rate);
if (rate != AUDIO_STREAM_DEFAULT_RATE)
{
@@ -514,7 +617,7 @@
return -1;
}
- out->cfg.rate = rate;
+ out->common.cfg.rate = rate;
return 0;
}
@@ -523,25 +626,25 @@
{
struct a2dp_stream_out *out = (struct a2dp_stream_out *)stream;
- DEBUG("buffer_size : %d", out->buffer_sz);
+ DEBUG("buffer_size : %zu", out->common.buffer_sz);
- return out->buffer_sz;
+ return out->common.buffer_sz;
}
static uint32_t out_get_channels(const struct audio_stream *stream)
{
struct a2dp_stream_out *out = (struct a2dp_stream_out *)stream;
- DEBUG("channels 0x%x", out->cfg.channel_flags);
+ DEBUG("channels 0x%" PRIx32, out->common.cfg.channel_flags);
- return out->cfg.channel_flags;
+ return out->common.cfg.channel_flags;
}
static audio_format_t out_get_format(const struct audio_stream *stream)
{
struct a2dp_stream_out *out = (struct a2dp_stream_out *)stream;
- DEBUG("format 0x%x", out->cfg.format);
- return out->cfg.format;
+ DEBUG("format 0x%x", out->common.cfg.format);
+ return out->common.cfg.format;
}
static int out_set_format(struct audio_stream *stream, audio_format_t format)
@@ -559,13 +662,13 @@
FNLOG();
- pthread_mutex_lock(&out->lock);
+ pthread_mutex_lock(&out->common.lock);
- if (out->state == AUDIO_A2DP_STATE_STARTED)
- retVal = suspend_audio_datapath(out, true);
+ if (out->common.state == AUDIO_A2DP_STATE_STARTED)
+ retVal = suspend_audio_datapath(&out->common, true);
else
retVal = 0;
- pthread_mutex_unlock (&out->lock);
+ pthread_mutex_unlock(&out->common.lock);
return retVal;
}
@@ -583,11 +686,12 @@
struct a2dp_stream_out *out = (struct a2dp_stream_out *)stream;
struct str_parms *parms;
char keyval[16];
- int retval = 0;
+ int retval;
+ int status = 0;
- INFO("state %d", out->state);
+ INFO("state %d", out->common.state);
- pthread_mutex_lock(&out->lock);
+ pthread_mutex_lock(&out->common.lock);
parms = str_parms_create_str(kvpairs);
@@ -601,7 +705,7 @@
if (strcmp(keyval, "true") == 0)
{
DEBUG("stream closing, disallow any writes");
- out->state = AUDIO_A2DP_STATE_STOPPING;
+ out->common.state = AUDIO_A2DP_STATE_STOPPING;
}
}
@@ -611,25 +715,24 @@
{
if (strcmp(keyval, "true") == 0)
{
- if (out->state == AUDIO_A2DP_STATE_STARTED)
- retval = suspend_audio_datapath(out, false);
+ if (out->common.state == AUDIO_A2DP_STATE_STARTED)
+ status = suspend_audio_datapath(&out->common, false);
}
else
{
/* Do not start the streaming automatically. If the phone was streaming
* prior to being suspended, the next out_write shall trigger the
* AVDTP start procedure */
- if (out->state == AUDIO_A2DP_STATE_SUSPENDED)
- out->state = AUDIO_A2DP_STATE_STANDBY;
+ if (out->common.state == AUDIO_A2DP_STATE_SUSPENDED)
+ out->common.state = AUDIO_A2DP_STATE_STANDBY;
/* Irrespective of the state, return 0 */
- retval = 0;
}
}
- pthread_mutex_unlock(&out->lock);
+ pthread_mutex_unlock(&out->common.lock);
str_parms_destroy(parms);
- return retval;
+ return status;
}
static char * out_get_parameters(const struct audio_stream *stream, const char *keys)
@@ -652,9 +755,9 @@
FNLOG();
- latency_us = ((out->buffer_sz * 1000 ) /
- audio_stream_frame_size(&out->stream.common) /
- out->cfg.rate) * 1000;
+ latency_us = ((out->common.buffer_sz * 1000 ) /
+ audio_stream_out_frame_size(&out->stream) /
+ out->common.cfg.rate) * 1000;
return (latency_us / 1000) + 200;
@@ -710,19 +813,22 @@
static uint32_t in_get_sample_rate(const struct audio_stream *stream)
{
- UNUSED(stream);
+ struct a2dp_stream_in *in = (struct a2dp_stream_in *)stream;
FNLOG();
- return 8000;
+ return in->common.cfg.rate;
}
static int in_set_sample_rate(struct audio_stream *stream, uint32_t rate)
{
- UNUSED(stream);
- UNUSED(rate);
+ struct a2dp_stream_in *in = (struct a2dp_stream_in *)stream;
FNLOG();
- return 0;
+
+ if (in->common.cfg.rate > 0 && in->common.cfg.rate == rate)
+ return 0;
+ else
+ return -1;
}
static size_t in_get_buffer_size(const struct audio_stream *stream)
@@ -735,10 +841,10 @@
static uint32_t in_get_channels(const struct audio_stream *stream)
{
- UNUSED(stream);
+ struct a2dp_stream_in *in = (struct a2dp_stream_in *)stream;
FNLOG();
- return AUDIO_CHANNEL_IN_MONO;
+ return in->common.cfg.channel_flags;
}
static audio_format_t in_get_format(const struct audio_stream *stream)
@@ -755,7 +861,10 @@
UNUSED(format);
FNLOG();
- return 0;
+ if (format == AUDIO_FORMAT_PCM_16_BIT)
+ return 0;
+ else
+ return -1;
}
static int in_standby(struct audio_stream *stream)
@@ -806,12 +915,60 @@
static ssize_t in_read(struct audio_stream_in *stream, void* buffer,
size_t bytes)
{
- UNUSED(stream);
- UNUSED(buffer);
- UNUSED(bytes);
+ struct a2dp_stream_in *in = (struct a2dp_stream_in *)stream;
+ int read;
- FNLOG();
- return bytes;
+ DEBUG("read %zu bytes, state: %d", bytes, in->common.state);
+
+ if (in->common.state == AUDIO_A2DP_STATE_SUSPENDED)
+ {
+ DEBUG("stream suspended");
+ return -1;
+ }
+
+ /* only allow autostarting if we are in stopped or standby */
+ if ((in->common.state == AUDIO_A2DP_STATE_STOPPED) ||
+ (in->common.state == AUDIO_A2DP_STATE_STANDBY))
+ {
+ pthread_mutex_lock(&in->common.lock);
+
+ if (start_audio_datapath(&in->common) < 0)
+ {
+ /* emulate time this write represents to avoid very fast write
+ failures during transition periods or remote suspend */
+
+ int us_delay = calc_audiotime(in->common.cfg, bytes);
+
+ DEBUG("emulate a2dp read delay (%d us)", us_delay);
+
+ usleep(us_delay);
+ pthread_mutex_unlock(&in->common.lock);
+ return -1;
+ }
+
+ pthread_mutex_unlock(&in->common.lock);
+ }
+ else if (in->common.state != AUDIO_A2DP_STATE_STARTED)
+ {
+ ERROR("stream not in stopped or standby");
+ return -1;
+ }
+
+ read = skt_read(in->common.audio_fd, buffer, bytes);
+
+ if (read == -1)
+ {
+ skt_disconnect(in->common.audio_fd);
+ in->common.audio_fd = AUDIO_SKT_DISCONNECTED;
+ in->common.state = AUDIO_A2DP_STATE_STOPPED;
+ } else if (read == 0) {
+ DEBUG("read time out - return zeros");
+ memset(buffer, 0, bytes);
+ read = bytes;
+ }
+
+ DEBUG("read %d bytes out of %zu bytes", read, bytes);
+ return read;
}
static uint32_t in_get_input_frames_lost(struct audio_stream_in *stream)
@@ -846,7 +1003,8 @@
audio_devices_t devices,
audio_output_flags_t flags,
struct audio_config *config,
- struct audio_stream_out **stream_out)
+ struct audio_stream_out **stream_out,
+ const char *address __unused)
{
struct a2dp_audio_device *a2dp_dev = (struct a2dp_audio_device *)dev;
@@ -882,7 +1040,11 @@
out->stream.get_render_position = out_get_render_position;
/* initialize a2dp specifics */
- a2dp_stream_out_init(out);
+ a2dp_stream_common_init(&out->common);
+
+ out->common.cfg.channel_flags = AUDIO_STREAM_DEFAULT_CHANNEL_FLAG;
+ out->common.cfg.format = AUDIO_STREAM_DEFAULT_FORMAT;
+ out->common.cfg.rate = AUDIO_STREAM_DEFAULT_RATE;
/* set output config values */
if (config)
@@ -894,26 +1056,8 @@
*stream_out = &out->stream;
a2dp_dev->output = out;
- /* retry logic to catch any timing variations on control channel */
- for (i = 0; i < CTRL_CHAN_RETRY_COUNT; i++)
- {
- /* connect control channel if not already connected */
- if ((out->ctrl_fd = skt_connect(out, A2DP_CTRL_PATH)) > 0)
- {
- /* success, now check if stack is ready */
- if (check_a2dp_ready(out) == 0)
- break;
-
- ERROR("error : a2dp not ready, wait 250 ms and retry");
- usleep(250000);
- skt_disconnect(out->ctrl_fd);
- }
-
- /* ctrl channel not ready, wait a bit */
- usleep(250000);
- }
-
- if (out->ctrl_fd == AUDIO_SKT_DISCONNECTED)
+ a2dp_open_ctrl_path(&out->common);
+ if (out->common.ctrl_fd == AUDIO_SKT_DISCONNECTED)
{
ERROR("ctrl socket failed to connect (%s)", strerror(errno));
ret = -1;
@@ -926,6 +1070,7 @@
err_open:
free(out);
*stream_out = NULL;
+ a2dp_dev->output = NULL;
ERROR("failed");
return ret;
}
@@ -936,12 +1081,12 @@
struct a2dp_audio_device *a2dp_dev = (struct a2dp_audio_device *)dev;
struct a2dp_stream_out *out = (struct a2dp_stream_out *)stream;
- INFO("closing output (state %d)", out->state);
+ INFO("closing output (state %d)", out->common.state);
- if ((out->state == AUDIO_A2DP_STATE_STARTED) || (out->state == AUDIO_A2DP_STATE_STOPPING))
- stop_audio_datapath(out);
+ if ((out->common.state == AUDIO_A2DP_STATE_STARTED) || (out->common.state == AUDIO_A2DP_STATE_STOPPING))
+ stop_audio_datapath(&out->common);
- skt_disconnect(out->ctrl_fd);
+ skt_disconnect(out->common.ctrl_fd);
free(stream);
a2dp_dev->output = NULL;
@@ -955,9 +1100,11 @@
int retval = 0;
if (out == NULL)
+ {
+ ERROR("ERROR: set param called even when stream out is null");
return retval;
-
- INFO("state %d", out->state);
+ }
+ INFO("state %d", out->common.state);
retval = out->stream.common.set_parameters((struct audio_stream *)out, kvpairs);
@@ -1055,9 +1202,12 @@
audio_io_handle_t handle,
audio_devices_t devices,
struct audio_config *config,
- struct audio_stream_in **stream_in)
+ struct audio_stream_in **stream_in,
+ audio_input_flags_t flags __unused,
+ const char *address __unused,
+ audio_source_t source __unused)
{
- struct a2dp_audio_device *ladev = (struct a2dp_audio_device *)dev;
+ struct a2dp_audio_device *a2dp_dev = (struct a2dp_audio_device *)dev;
struct a2dp_stream_in *in;
int ret;
UNUSED(handle);
@@ -1087,24 +1237,54 @@
in->stream.read = in_read;
in->stream.get_input_frames_lost = in_get_input_frames_lost;
+ /* initialize a2dp specifics */
+ a2dp_stream_common_init(&in->common);
+
*stream_in = &in->stream;
+ a2dp_dev->input = in;
+
+ a2dp_open_ctrl_path(&in->common);
+ if (in->common.ctrl_fd == AUDIO_SKT_DISCONNECTED)
+ {
+ ERROR("ctrl socket failed to connect (%s)", strerror(errno));
+ ret = -1;
+ goto err_open;
+ }
+
+ if (a2dp_read_audio_config(&in->common) < 0) {
+ ERROR("a2dp_read_audio_config failed (%s)", strerror(errno));
+ ret = -1;
+ goto err_open;
+ }
+
+ DEBUG("success");
return 0;
err_open:
free(in);
*stream_in = NULL;
+ a2dp_dev->input = NULL;
+ ERROR("failed");
return ret;
}
static void adev_close_input_stream(struct audio_hw_device *dev,
- struct audio_stream_in *in)
+ struct audio_stream_in *stream)
{
- UNUSED(dev);
- UNUSED(in);
+ struct a2dp_audio_device *a2dp_dev = (struct a2dp_audio_device *)dev;
+ struct a2dp_stream_in* in = (struct a2dp_stream_in *)stream;
+ a2dp_state_t state = in->common.state;
- FNLOG();
+ INFO("closing input (state %d)", state);
- return;
+ if ((state == AUDIO_A2DP_STATE_STARTED) || (state == AUDIO_A2DP_STATE_STOPPING))
+ stop_audio_datapath(&in->common);
+
+ skt_disconnect(in->common.ctrl_fd);
+ free(stream);
+ a2dp_dev->input = NULL;
+
+ DEBUG("done");
}
static int adev_dump(const audio_hw_device_t *device, int fd)
@@ -1146,7 +1326,7 @@
return -ENOMEM;
adev->device.common.tag = HARDWARE_DEVICE_TAG;
- adev->device.common.version = AUDIO_DEVICE_API_VERSION_CURRENT;
+ adev->device.common.version = AUDIO_DEVICE_API_VERSION_2_0;
adev->device.common.module = (struct hw_module_t *) module;
adev->device.common.close = adev_close;
diff --git a/audio_a2dp_hw/audio_a2dp_hw.h b/audio_a2dp_hw/audio_a2dp_hw.h
index 2015591..b4ac85d 100644
--- a/audio_a2dp_hw/audio_a2dp_hw.h
+++ b/audio_a2dp_hw/audio_a2dp_hw.h
@@ -46,7 +46,8 @@
A2DP_CTRL_CMD_CHECK_READY,
A2DP_CTRL_CMD_START,
A2DP_CTRL_CMD_STOP,
- A2DP_CTRL_CMD_SUSPEND
+ A2DP_CTRL_CMD_SUSPEND,
+ A2DP_CTRL_GET_AUDIO_CONFIG,
} tA2DP_CTRL_CMD;
typedef enum {
diff --git a/bta/Android.mk b/bta/Android.mk
index bca6c08..c863d10 100644
--- a/bta/Android.mk
+++ b/bta/Android.mk
@@ -1,5 +1,3 @@
-ifneq ($(TARGET_SIMULATOR),true)
-
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
@@ -8,7 +6,7 @@
LOCAL_CFLAGS += \
-DBOARD_HAVE_BLUETOOTH_BCM
endif
-LOCAL_CFLAGS += -DBUILDCFG $(bdroid_CFLAGS)
+LOCAL_CFLAGS += -DBUILDCFG $(bdroid_CFLAGS) -std=c99
LOCAL_PRELINK_MODULE:=false
LOCAL_SRC_FILES:= \
@@ -39,6 +37,14 @@
./ag/bta_ag_cmd.c \
./ag/bta_ag_ci.c \
./ag/bta_ag_at.c \
+ ./hf_client/bta_hf_client_act.c \
+ ./hf_client/bta_hf_client_api.c \
+ ./hf_client/bta_hf_client_main.c \
+ ./hf_client/bta_hf_client_rfc.c \
+ ./hf_client/bta_hf_client_at.c \
+ ./hf_client/bta_hf_client_sdp.c \
+ ./hf_client/bta_hf_client_sco.c \
+ ./hf_client/bta_hf_client_cmd.c \
./hh/bta_hh_cfg.c \
./hh/bta_hh_act.c \
./hh/bta_hh_api.c \
@@ -67,6 +73,10 @@
./hl/bta_hl_utils.c \
./hl/bta_hl_sdp.c \
./hl/bta_hl_ci.c \
+ ./mce/bta_mce_api.c \
+ ./mce/bta_mce_main.c \
+ ./mce/bta_mce_act.c \
+ ./mce/bta_mce_cfg.c \
./sys/bta_sys_main.c \
./sys/bta_sys_ci.c \
./sys/bta_sys_conn.c \
@@ -77,12 +87,13 @@
./jv/bta_jv_act.c \
./jv/bta_jv_cfg.c \
./jv/bta_jv_main.c \
- ./jv/bta_jv_api.c
+ ./jv/bta_jv_api.c \
LOCAL_MODULE := libbt-brcm_bta
LOCAL_MODULE_CLASS := STATIC_LIBRARIES
LOCAL_MODULE_TAGS := optional
LOCAL_SHARED_LIBRARIES := libcutils libc
+LOCAL_MULTILIB := 32
LOCAL_C_INCLUDES+= . \
$(LOCAL_PATH)/include \
@@ -97,11 +108,9 @@
$(LOCAL_PATH)/../hcis \
$(LOCAL_PATH)/../hcis/patchram \
$(LOCAL_PATH)/../udrv/include \
- $(LOCAL_PATH)/../brcm/include \
+ $(LOCAL_PATH)/../vnd/include \
$(LOCAL_PATH)/../utils/include \
$(bdroid_C_INCLUDES) \
include $(BUILD_STATIC_LIBRARY)
-
-endif # TARGET_SIMULATOR != true
diff --git a/bta/ag/bta_ag_act.c b/bta/ag/bta_ag_act.c
index 11fc85c..ca4f8eb 100644
--- a/bta/ag/bta_ag_act.c
+++ b/bta/ag/bta_ag_act.c
@@ -244,7 +244,7 @@
{
UINT16 event = BTA_AG_DISC_FAIL_EVT;
- APPL_TRACE_DEBUG1 ("bta_ag_disc_int_res: Status: %d", p_data->disc_result.status);
+ APPL_TRACE_DEBUG ("bta_ag_disc_int_res: Status: %d", p_data->disc_result.status);
/* if found service */
if (p_data->disc_result.status == SDP_SUCCESS ||
@@ -406,7 +406,7 @@
*******************************************************************************/
void bta_ag_rfc_close(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data)
{
- tBTA_AG_HDR close;
+ tBTA_AG_CLOSE close;
tBTA_SERVICE_MASK services;
int i, num_active_conn = 0;
UNUSED(p_data);
@@ -423,6 +423,10 @@
#if (BTM_WBS_INCLUDED == TRUE )
p_scb->peer_codecs = BTA_AG_CODEC_NONE;
p_scb->sco_codec = BTA_AG_CODEC_NONE;
+ /* Clear these flags upon SLC teardown */
+ p_scb->codec_updated = FALSE;
+ p_scb->codec_fallback = FALSE;
+ p_scb->codec_msbc_settings = BTA_AG_SCO_MSBC_SETTINGS_T2;
#endif
p_scb->role = 0;
p_scb->post_sco = BTA_AG_POST_SCO_NONE;
@@ -436,13 +440,14 @@
bta_sys_stop_timer(&p_scb->cn_timer);
#endif
- close.handle = bta_ag_scb_to_idx(p_scb);
- close.app_id = p_scb->app_id;
+ close.hdr.handle = bta_ag_scb_to_idx(p_scb);
+ close.hdr.app_id = p_scb->app_id;
+ bdcpy(close.bd_addr, p_scb->peer_addr);
bta_sys_conn_close(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr);
/* call close call-out */
- bta_ag_co_data_close(close.handle);
+ bta_ag_co_data_close(close.hdr.handle);
/* call close cback */
(*bta_ag_cb.p_cback)(BTA_AG_CLOSE_EVT, (tBTA_AG *) &close);
@@ -555,13 +560,13 @@
/* set role */
p_scb->role = BTA_AG_ACP;
- APPL_TRACE_DEBUG2 ("bta_ag_rfc_acp_open: serv_handle0 = %d serv_handle1 = %d",
+ APPL_TRACE_DEBUG ("bta_ag_rfc_acp_open: serv_handle0 = %d serv_handle1 = %d",
p_scb->serv_handle[0], p_scb->serv_handle[1]);
/* get bd addr of peer */
if (PORT_SUCCESS != (status=PORT_CheckConnection(p_data->rfc.port_handle, dev_addr, &lcid)))
{
- APPL_TRACE_DEBUG1 ("bta_ag_rfc_acp_open error PORT_CheckConnection returned status %d", status);
+ APPL_TRACE_DEBUG ("bta_ag_rfc_acp_open error PORT_CheckConnection returned status %d", status);
}
/* Collision Handling */
@@ -601,7 +606,7 @@
/* determine connected service from port handle */
for (i = 0; i < BTA_AG_NUM_IDX; i++)
{
- APPL_TRACE_DEBUG3 ("bta_ag_rfc_acp_open: i = %d serv_handle = %d port_handle = %d",
+ APPL_TRACE_DEBUG ("bta_ag_rfc_acp_open: i = %d serv_handle = %d port_handle = %d",
i, p_scb->serv_handle[i], p_data->rfc.port_handle);
if (p_scb->serv_handle[i] == p_data->rfc.port_handle)
@@ -612,7 +617,7 @@
}
}
- APPL_TRACE_DEBUG2 ("bta_ag_rfc_acp_open: conn_service = %d conn_handle = %d",
+ APPL_TRACE_DEBUG ("bta_ag_rfc_acp_open: conn_service = %d conn_handle = %d",
p_scb->conn_service, p_scb->conn_handle);
/* close any unopened server */
@@ -819,6 +824,7 @@
evt.hdr.handle = bta_ag_scb_to_idx(p_scb);
evt.hdr.app_id = p_scb->app_id;
evt.peer_feat = p_scb->peer_features;
+ bdcpy(evt.bd_addr, p_scb->peer_addr);
#if (BTM_WBS_INCLUDED == TRUE )
evt.peer_codec = p_scb->peer_codecs;
#endif
@@ -865,7 +871,7 @@
{
UNUSED(p_data);
- APPL_TRACE_DEBUG1("bta_ag_rcvd_slc_ready: handle = %d", bta_ag_scb_to_idx(p_scb));
+ APPL_TRACE_DEBUG("bta_ag_rcvd_slc_ready: handle = %d", bta_ag_scb_to_idx(p_scb));
if (bta_ag_cb.parse_mode == BTA_AG_PASS_THROUGH)
{
@@ -874,3 +880,51 @@
}
}
+/*******************************************************************************
+**
+** Function bta_ag_setcodec
+**
+** Description Handle API SetCodec
+**
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_ag_setcodec(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data)
+{
+#if (BTM_WBS_INCLUDED == TRUE )
+ tBTA_AG_PEER_CODEC codec_type = p_data->api_setcodec.codec;
+ tBTA_AG_VAL val;
+
+ /* Check if the requested codec type is valid */
+ if((codec_type != BTA_AG_CODEC_NONE) &&
+ (codec_type != BTA_AG_CODEC_CVSD) &&
+ (codec_type != BTA_AG_CODEC_MSBC))
+ {
+ val.num = codec_type;
+ val.hdr.status = BTA_AG_FAIL_RESOURCES;
+ APPL_TRACE_ERROR("bta_ag_setcodec error: unsupported codec type %d", codec_type);
+ (*bta_ag_cb.p_cback)(BTA_AG_WBS_EVT, (tBTA_AG *) &val);
+ return;
+ }
+
+ if((p_scb->peer_codecs & codec_type) || (codec_type == BTA_AG_CODEC_NONE) ||
+ (codec_type == BTA_AG_CODEC_CVSD))
+ {
+ p_scb->sco_codec = codec_type;
+ p_scb->codec_updated = TRUE;
+ val.num = codec_type;
+ val.hdr.status = BTA_AG_SUCCESS;
+ APPL_TRACE_DEBUG("bta_ag_setcodec: Updated codec type %d", codec_type);
+ }
+ else
+ {
+ val.num = codec_type;
+ val.hdr.status = BTA_AG_FAIL_RESOURCES;
+ APPL_TRACE_ERROR("bta_ag_setcodec error: unsupported codec type %d", codec_type);
+ }
+
+ (*bta_ag_cb.p_cback)(BTA_AG_WBS_EVT, (tBTA_AG *) &val);
+#endif
+}
+
diff --git a/bta/ag/bta_ag_api.c b/bta/ag/bta_ag_api.c
index 07dceb9..5bfa492 100644
--- a/bta/ag/bta_ag_api.c
+++ b/bta/ag/bta_ag_api.c
@@ -65,15 +65,13 @@
{
if (bta_ag_cb.scb[idx].in_use)
{
- APPL_TRACE_ERROR0 ("BTA_AgEnable: FAILED, AG already enabled.");
+ APPL_TRACE_ERROR ("BTA_AgEnable: FAILED, AG already enabled.");
return BTA_FAILURE;
}
}
/* register with BTA system manager */
- GKI_sched_lock();
bta_sys_register(BTA_ID_AG, &bta_ag_reg);
- GKI_sched_unlock();
if ((p_buf = (tBTA_AG_API_ENABLE *) GKI_getbuf(sizeof(tBTA_AG_API_ENABLE))) != NULL)
{
diff --git a/bta/ag/bta_ag_ci.c b/bta/ag/bta_ag_ci.c
index fd39e34..c9f0a10 100644
--- a/bta/ag/bta_ag_ci.c
+++ b/bta/ag/bta_ag_ci.c
@@ -65,7 +65,7 @@
bta_sys_sendmsg(p_buf);
} else {
- APPL_TRACE_ERROR1("ERROR: Unable to allocate buffer to hold AT response code. len=%i", len);
+ APPL_TRACE_ERROR("ERROR: Unable to allocate buffer to hold AT response code. len=%i", len);
break;
}
diff --git a/bta/ag/bta_ag_cmd.c b/bta/ag/bta_ag_cmd.c
old mode 100644
new mode 100755
index 54cd4d3..fd30247
--- a/bta/ag/bta_ag_cmd.c
+++ b/bta/ag/bta_ag_cmd.c
@@ -21,7 +21,10 @@
* This file contains functions for processing AT commands and results.
*
******************************************************************************/
-
+#include "bt_target.h"
+#include "bt_types.h"
+#include "gki.h"
+#include "bd.h"
#include "bta_api.h"
#include "bta_sys.h"
#include "bta_ag_api.h"
@@ -353,7 +356,7 @@
if(*(p+COLON_IDX_4_VGSVGM) == ':')
{
#if defined(BTA_AG_RESULT_DEBUG) && (BTA_AG_RESULT_DEBUG == TRUE)
- APPL_TRACE_DEBUG0("[HSP] ':'symbol is changed as '=' for HSP compatibility");
+ APPL_TRACE_DEBUG("[HSP] ':'symbol is changed as '=' for HSP compatibility");
#endif
*(p+COLON_IDX_4_VGSVGM) = '=';
}
@@ -379,7 +382,7 @@
*p++ = '\n';
#if defined(BTA_AG_RESULT_DEBUG) && (BTA_AG_RESULT_DEBUG == TRUE)
- APPL_TRACE_DEBUG1("bta_ag_send_result: %s", buf);
+ APPL_TRACE_DEBUG("bta_ag_send_result: %s", buf);
#endif
/* send to RFCOMM */
@@ -406,7 +409,7 @@
if((!m_res_cb) || (m_res_cb->num_result == 0) || (m_res_cb->num_result > BTA_AG_AT_MULTI_LEN))
{
- APPL_TRACE_DEBUG0("m_res_cb is NULL or num_result is out of range.");
+ APPL_TRACE_DEBUG("m_res_cb is NULL or num_result is out of range.");
return;
}
@@ -443,7 +446,7 @@
}
#if defined(BTA_AG_RESULT_DEBUG) && (BTA_AG_RESULT_DEBUG == TRUE)
- APPL_TRACE_DEBUG1("send_result: %s", buf);
+ APPL_TRACE_DEBUG("send_result: %s", buf);
#endif
/* send to RFCOMM */
@@ -681,7 +684,7 @@
case UUID_CODEC_CVSD: retval |= BTA_AG_CODEC_CVSD; break;
case UUID_CODEC_MSBC: retval |= BTA_AG_CODEC_MSBC; break;
default:
- APPL_TRACE_ERROR1("Unknown Codec UUID(%d) received", uuid_codec);
+ APPL_TRACE_ERROR("Unknown Codec UUID(%d) received", uuid_codec);
return BTA_AG_CODEC_NONE;
}
@@ -823,7 +826,7 @@
{
tBTA_AG_VAL val;
- APPL_TRACE_DEBUG4("AT cmd:%d arg_type:%d arg:%d arg:%s", cmd, arg_type,
+ APPL_TRACE_DEBUG("AT cmd:%d arg_type:%d arg:%d arg:%s", cmd, arg_type,
int_arg, p_arg);
/* send OK */
@@ -861,12 +864,13 @@
tBTA_AG_PEER_CODEC codec_type, codec_sent;
#endif
- APPL_TRACE_DEBUG4("HFP AT cmd:%d arg_type:%d arg:%d arg:%s", cmd, arg_type,
+ APPL_TRACE_DEBUG("HFP AT cmd:%d arg_type:%d arg:%d arg:%s", cmd, arg_type,
int_arg, p_arg);
val.hdr.handle = bta_ag_scb_to_idx(p_scb);
val.hdr.app_id = p_scb->app_id;
val.num = int_arg;
+ bdcpy(val.bd_addr, p_scb->peer_addr);
BCM_STRNCPY_S(val.str, sizeof(val.str), p_arg, BTA_AG_AT_MAX_LEN);
val.str[BTA_AG_AT_MAX_LEN] = 0;
@@ -1192,14 +1196,17 @@
if (p_scb->peer_codecs & BTA_AG_CODEC_MSBC)
{
p_scb->sco_codec = UUID_CODEC_MSBC;
- APPL_TRACE_DEBUG0("Received AT+BAC, updating sco codec to MSBC");
+ APPL_TRACE_DEBUG("Received AT+BAC, updating sco codec to MSBC");
}
else
{
p_scb->sco_codec = UUID_CODEC_CVSD;
- APPL_TRACE_DEBUG0("Received AT+BAC, updating sco codec to CVSD");
+ APPL_TRACE_DEBUG("Received AT+BAC, updating sco codec to CVSD");
}
-
+ /* The above logic sets the stack preferred codec based on local and peer codec
+ capabilities. This can be overridden by the application depending on its preference
+ using the bta_ag_setcodec API. We send the peer_codecs to the application. */
+ val.num = p_scb->peer_codecs;
/* Received BAC while in codec negotiation. */
if ((bta_ag_cb.sco.state == BTA_AG_SCO_CODEC_ST) && (bta_ag_cb.sco.p_curr_scb == p_scb))
{
@@ -1209,11 +1216,13 @@
else
{
p_scb->peer_codecs = BTA_AG_CODEC_NONE;
- APPL_TRACE_ERROR0("Unexpected CMD:AT+BAC, Codec Negotiation is not supported");
+ APPL_TRACE_ERROR("Unexpected CMD:AT+BAC, Codec Negotiation is not supported");
}
break;
case BTA_AG_HF_CMD_BCS:
+ bta_ag_send_ok(p_scb);
+
/* stop cn timer */
bta_sys_stop_timer(&p_scb->cn_timer);
@@ -1222,7 +1231,7 @@
case UUID_CODEC_CVSD: codec_type = BTA_AG_CODEC_CVSD; break;
case UUID_CODEC_MSBC: codec_type = BTA_AG_CODEC_MSBC; break;
default:
- APPL_TRACE_ERROR1("Unknown codec_uuid %d", int_arg);
+ APPL_TRACE_ERROR("Unknown codec_uuid %d", int_arg);
codec_type = 0xFFFF;
break;
}
@@ -1237,7 +1246,8 @@
else
bta_ag_sco_codec_nego(p_scb, FALSE);
- bta_ag_send_ok(p_scb);
+ /* send final codec info to callback */
+ val.num = codec_sent;
break;
case BTA_AG_HF_CMD_BCC:
@@ -1274,7 +1284,7 @@
if(unknown && (!strlen(p_arg)))
{
- APPL_TRACE_DEBUG0("Empty AT cmd string received");
+ APPL_TRACE_DEBUG("Empty AT cmd string received");
bta_ag_send_ok(p_scb);
return;
}
@@ -1309,7 +1319,7 @@
{
UINT8 code = bta_ag_trans_result[p_result->result];
- APPL_TRACE_DEBUG1("bta_ag_hsp_result : res = %d", p_result->result);
+ APPL_TRACE_DEBUG("bta_ag_hsp_result : res = %d", p_result->result);
switch(p_result->result)
{
@@ -1382,7 +1392,7 @@
case BTA_AG_INBAND_RING_RES:
p_scb->inband_enabled = p_result->data.state;
- APPL_TRACE_DEBUG1("inband_enabled set to %d", p_scb->inband_enabled);
+ APPL_TRACE_DEBUG("inband_enabled set to %d", p_scb->inband_enabled);
break;
case BTA_AG_UNAT_RES:
@@ -1422,7 +1432,7 @@
{
UINT8 code = bta_ag_trans_result[p_result->result];
- APPL_TRACE_DEBUG1("bta_ag_hfp_result : res = %d", p_result->result);
+ APPL_TRACE_DEBUG("bta_ag_hfp_result : res = %d", p_result->result);
switch(p_result->result)
{
@@ -1445,7 +1455,7 @@
p_result->data.num = BTA_AG_CLIP_TYPE_DEFAULT;
}
- APPL_TRACE_DEBUG1("CLIP type :%d", p_result->data.num);
+ APPL_TRACE_DEBUG("CLIP type :%d", p_result->data.num);
p_scb->clip[0] = 0;
if (p_result->data.str[0] != 0)
sprintf(p_scb->clip,"%s,%d", p_result->data.str, p_result->data.num);
@@ -1593,7 +1603,7 @@
case BTA_AG_INBAND_RING_RES:
p_scb->inband_enabled = p_result->data.state;
- APPL_TRACE_DEBUG1("inband_enabled set to %d", p_scb->inband_enabled);
+ APPL_TRACE_DEBUG("inband_enabled set to %d", p_scb->inband_enabled);
bta_ag_send_result(p_scb, code, NULL, p_result->data.state);
break;
@@ -1605,7 +1615,7 @@
p_scb->signal_ind = p_result->data.str[6] - '0';
p_scb->roam_ind = p_result->data.str[8] - '0';
p_scb->battchg_ind = p_result->data.str[10] - '0';
- APPL_TRACE_DEBUG2("cind call:%d callsetup:%d", p_scb->call_ind, p_scb->callsetup_ind);
+ APPL_TRACE_DEBUG("cind call:%d callsetup:%d", p_scb->call_ind, p_scb->callsetup_ind);
bta_ag_send_result(p_scb, code, p_result->data.str, 0);
bta_ag_send_ok(p_scb);
@@ -1638,7 +1648,7 @@
if (p_result->data.str[0] != 0)
{
bta_ag_process_unat_res(p_result->data.str);
- APPL_TRACE_DEBUG1("BTA_AG_RES :%s",p_result->data.str);
+ APPL_TRACE_DEBUG("BTA_AG_RES :%s",p_result->data.str);
bta_ag_send_result(p_scb, code, p_result->data.str, 0);
}
@@ -1714,47 +1724,6 @@
}
}
-/*******************************************************************************
-**
-** Function bta_ag_setcodec
-**
-** Description Handle API SetCodec
-**
-**
-** Returns void
-**
-*******************************************************************************/
-void bta_ag_setcodec(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data)
-{
-#if (BTM_WBS_INCLUDED == TRUE )
- tBTA_AG_PEER_CODEC codec_type = p_data->api_setcodec.codec;
-
- /* Check if the requested codec type is valid */
- if((codec_type != BTA_AG_CODEC_NONE) &&
- (codec_type != BTA_AG_CODEC_CVSD) &&
- (codec_type != BTA_AG_CODEC_MSBC))
- {
- APPL_TRACE_ERROR1("bta_ag_setcodec error: unsupported codec type %d", codec_type);
- return;
- }
-
- if((p_scb->peer_codecs & codec_type) || (codec_type == BTA_AG_CODEC_NONE) || (codec_type == BTA_AG_CODEC_CVSD))
- {
- p_scb->sco_codec = codec_type;
- p_scb->codec_updated = TRUE;
- APPL_TRACE_DEBUG1("bta_ag_setcodec: Updated codec type %d", codec_type);
- }
- else
- {
- APPL_TRACE_ERROR1("bta_ag_setcodec error: unsupported codec type %d", codec_type);
- }
-#else
- UNUSED(p_scb);
- UNUSED(p_data);
-#endif
-}
-
-
#if (BTM_WBS_INCLUDED == TRUE )
/*******************************************************************************
**
@@ -1781,13 +1750,14 @@
case BTA_AG_CODEC_CVSD: codec_uuid = UUID_CODEC_CVSD; break;
case BTA_AG_CODEC_MSBC: codec_uuid = UUID_CODEC_MSBC; break;
default:
- APPL_TRACE_ERROR1("bta_ag_send_bcs: unknown codec %d, use CVSD", p_scb->sco_codec);
+ APPL_TRACE_ERROR("bta_ag_send_bcs: unknown codec %d, use CVSD", p_scb->sco_codec);
codec_uuid = UUID_CODEC_CVSD;
break;
}
}
/* send +BCS */
+ APPL_TRACE_DEBUG("send +BCS codec is %d", codec_uuid);
bta_ag_send_result(p_scb, BTA_AG_RES_BCS, NULL, codec_uuid);
}
diff --git a/bta/ag/bta_ag_int.h b/bta/ag/bta_ag_int.h
index b0d1b1d..b2d9fb0 100644
--- a/bta/ag/bta_ag_int.h
+++ b/bta/ag/bta_ag_int.h
@@ -237,6 +237,14 @@
UINT8 scn;
} tBTA_AG_PROFILE;
+#if (BTM_WBS_INCLUDED == TRUE)
+typedef enum
+{
+ BTA_AG_SCO_MSBC_SETTINGS_T2 = 0, /* preferred/default when codec is mSBC */
+ BTA_AG_SCO_MSBC_SETTINGS_T1,
+} tBTA_AG_SCO_MSBC_SETTINGS;
+#endif
+
/* type for each service control block */
typedef struct
{
@@ -261,6 +269,7 @@
tBTA_AG_PEER_CODEC inuse_codec; /* codec being used for the current SCO connection */
BOOLEAN codec_updated; /* set to TRUE whenever the app updates codec type */
BOOLEAN codec_fallback; /* If sco nego fails for mSBC, fallback to CVSD */
+ tBTA_AG_SCO_MSBC_SETTINGS codec_msbc_settings; /* settings to be used for the impending eSCO */
TIMER_LIST_ENT cn_timer; /* codec negotiation timer */
#endif
UINT16 sco_idx; /* SCO handle */
diff --git a/bta/ag/bta_ag_main.c b/bta/ag/bta_ag_main.c
index bae992b..3a32a9d 100644
--- a/bta/ag/bta_ag_main.c
+++ b/bta/ag/bta_ag_main.c
@@ -318,12 +318,17 @@
/* initialize variables */
p_scb->in_use = TRUE;
p_scb->sco_idx = BTM_INVALID_SCO_INDEX;
-
+#if (BTM_WBS_INCLUDED == TRUE )
+ p_scb->codec_updated = FALSE;
+#endif
/* set up timers */
p_scb->act_timer.param = (UINT32) p_scb;
p_scb->act_timer.p_cback = bta_ag_timer_cback;
-
- APPL_TRACE_DEBUG1("bta_ag_scb_alloc %d", bta_ag_scb_to_idx(p_scb));
+#if (BTM_WBS_INCLUDED == TRUE)
+ /* set eSCO mSBC setting to T2 as the preferred */
+ p_scb->codec_msbc_settings = BTA_AG_SCO_MSBC_SETTINGS_T2;
+#endif
+ APPL_TRACE_DEBUG("bta_ag_scb_alloc %d", bta_ag_scb_to_idx(p_scb));
break;
}
}
@@ -332,7 +337,7 @@
{
/* out of scbs */
p_scb = NULL;
- APPL_TRACE_WARNING0("Out of ag scbs");
+ APPL_TRACE_WARNING("Out of ag scbs");
}
return p_scb;
}
@@ -352,7 +357,7 @@
UINT8 idx;
BOOLEAN allocated = FALSE;
- APPL_TRACE_DEBUG1("bta_ag_scb_dealloc %d", bta_ag_scb_to_idx(p_scb));
+ APPL_TRACE_DEBUG("bta_ag_scb_dealloc %d", bta_ag_scb_to_idx(p_scb));
/* stop timers */
bta_sys_stop_timer(&p_scb->act_timer);
@@ -421,13 +426,13 @@
if (!p_scb->in_use)
{
p_scb = NULL;
- APPL_TRACE_WARNING1("ag scb idx %d not allocated", idx);
+ APPL_TRACE_WARNING("ag scb idx %d not allocated", idx);
}
}
else
{
p_scb = NULL;
- APPL_TRACE_DEBUG1("ag scb idx %d out of range", idx);
+ APPL_TRACE_DEBUG("ag scb idx %d out of range", idx);
}
return p_scb;
}
@@ -481,7 +486,7 @@
}
/* no scb found */
- APPL_TRACE_WARNING0("No ag scb for peer addr");
+ APPL_TRACE_WARNING("No ag scb for peer addr");
return 0;
}
@@ -509,7 +514,7 @@
}
/* no other scb found */
- APPL_TRACE_DEBUG0("No other ag scb open");
+ APPL_TRACE_DEBUG("No other ag scb open");
return FALSE;
}
@@ -537,7 +542,7 @@
}
/* no other scb found */
- APPL_TRACE_DEBUG0("bta_ag_get_other_idle_scb: No idle AG scb");
+ APPL_TRACE_DEBUG("bta_ag_get_other_idle_scb: No idle AG scb");
return NULL;
}
@@ -555,7 +560,7 @@
{
tBTA_AG_SCB *p_scb;
- APPL_TRACE_DEBUG0 ("bta_ag_colli_timer_cback");
+ APPL_TRACE_DEBUG ("bta_ag_colli_timer_cback");
if (p_tle)
{
@@ -598,15 +603,15 @@
{
if (id == BTA_ID_SYS) /* ACL collision */
{
- APPL_TRACE_WARNING0 ("AG found collision (ACL) ...");
+ APPL_TRACE_WARNING ("AG found collision (ACL) ...");
}
else if (id == BTA_ID_AG) /* RFCOMM collision */
{
- APPL_TRACE_WARNING0 ("AG found collision (RFCOMM) ...");
+ APPL_TRACE_WARNING ("AG found collision (RFCOMM) ...");
}
else
{
- APPL_TRACE_WARNING0 ("AG found collision (\?\?\?) ...");
+ APPL_TRACE_WARNING ("AG found collision (\?\?\?) ...");
}
p_scb->state = BTA_AG_INIT_ST;
@@ -646,7 +651,7 @@
{
if (p_scb)
{
- APPL_TRACE_DEBUG1 ("bta_ag_resume_open, Handle(%d)", bta_ag_scb_to_idx(p_scb));
+ APPL_TRACE_DEBUG ("bta_ag_resume_open, Handle(%d)", bta_ag_scb_to_idx(p_scb));
/* resume opening process. */
if (p_scb->state == BTA_AG_INIT_ST)
@@ -657,7 +662,7 @@
}
else
{
- APPL_TRACE_ERROR0 ("bta_ag_resume_open, Null p_scb");
+ APPL_TRACE_ERROR ("bta_ag_resume_open, Null p_scb");
}
}
@@ -708,14 +713,12 @@
if (!bta_sys_is_register (BTA_ID_AG))
{
- APPL_TRACE_ERROR0("BTA AG is already disabled, ignoring ...");
+ APPL_TRACE_ERROR("BTA AG is already disabled, ignoring ...");
return;
}
/* De-register with BTA system manager */
- GKI_sched_lock();
bta_sys_deregister(BTA_ID_AG);
- GKI_sched_unlock();
for (i = 0; i < BTA_AG_NUM_SCB; i++, p_scb++)
{
@@ -753,6 +756,7 @@
/* allocate an scb */
if ((p_scb = bta_ag_scb_alloc()) != NULL)
{
+ APPL_TRACE_DEBUG("bta_ag_api_register: p_scb 0x%08x ", p_scb);
bta_ag_sm_execute(p_scb, p_data->hdr.event, p_data);
}
else
@@ -781,6 +785,7 @@
{
if ((p_scb = bta_ag_scb_by_idx(p_data->hdr.layer_specific)) != NULL)
{
+ APPL_TRACE_DEBUG("bta_ag_api_result: p_scb 0x%08x ", p_scb);
bta_ag_sm_execute(p_scb, BTA_AG_API_RESULT_EVT, p_data);
}
}
@@ -788,8 +793,9 @@
{
for (i = 0, p_scb = &bta_ag_cb.scb[0]; i < BTA_AG_NUM_SCB; i++, p_scb++)
{
- if (p_scb->in_use)
+ if (p_scb->in_use && p_scb->svc_conn)
{
+ APPL_TRACE_DEBUG("bta_ag_api_result p_scb 0x%08x ", p_scb);
bta_ag_sm_execute(p_scb, BTA_AG_API_RESULT_EVT, p_data);
}
}
@@ -819,20 +825,20 @@
/* Ignore displaying of AT results when not connected (Ignored in state machine) */
if (in_event != BTA_AG_API_RESULT_EVT || p_scb->state == BTA_AG_OPEN_ST)
{
- APPL_TRACE_EVENT5("AG evt (hdl 0x%04x): State %d (%s), Event 0x%04x (%s)",
+ APPL_TRACE_EVENT("AG evt (hdl 0x%04x): State %d (%s), Event 0x%04x (%s)",
bta_ag_scb_to_idx(p_scb),
p_scb->state, bta_ag_state_str(p_scb->state),
event, bta_ag_evt_str(event, p_data->api_result.result));
}
#else
- APPL_TRACE_EVENT3("AG evt (hdl 0x%04x): State %d, Event 0x%04x",
+ APPL_TRACE_EVENT("AG evt (hdl 0x%04x): State %d, Event 0x%04x",
bta_ag_scb_to_idx(p_scb), p_scb->state, event);
#endif
event &= 0x00FF;
if (event >= (BTA_AG_MAX_EVT & 0x00FF))
{
- APPL_TRACE_ERROR0("AG evt out of range, ignoring...");
+ APPL_TRACE_ERROR("AG evt out of range, ignoring...");
return;
}
@@ -857,7 +863,7 @@
#if BTA_AG_DEBUG == TRUE
if (p_scb->state != in_state)
{
- APPL_TRACE_EVENT3("BTA AG State Change: [%s] -> [%s] after Event [%s]",
+ APPL_TRACE_EVENT("BTA AG State Change: [%s] -> [%s] after Event [%s]",
bta_ag_state_str(in_state),
bta_ag_state_str(p_scb->state),
bta_ag_evt_str(in_event, p_data->api_result.result));
@@ -879,6 +885,7 @@
{
tBTA_AG_SCB *p_scb;
+ APPL_TRACE_DEBUG("bta_ag_hdl_event: Event 0x%04x ", p_msg->event);
switch (p_msg->event)
{
/* handle enable event */
@@ -905,6 +912,7 @@
default:
if ((p_scb = bta_ag_scb_by_idx(p_msg->layer_specific)) != NULL)
{
+ APPL_TRACE_DEBUG("bta_ag_hdl_event: p_scb 0x%08x ", p_scb);
bta_ag_sm_execute(p_scb, p_msg->event, (tBTA_AG_DATA *) p_msg);
}
break;
diff --git a/bta/ag/bta_ag_rfc.c b/bta/ag/bta_ag_rfc.c
index d6b5329..c0a9d3b 100644
--- a/bta/ag/bta_ag_rfc.c
+++ b/bta/ag/bta_ag_rfc.c
@@ -97,7 +97,7 @@
/* ignore port events for port handles other than connected handle */
if (port_handle != p_scb->conn_handle)
{
- APPL_TRACE_DEBUG3("ag_port_cback ignoring handle:%d conn_handle = %d other handle = %d",
+ APPL_TRACE_DEBUG("ag_port_cback ignoring handle:%d conn_handle = %d other handle = %d",
port_handle, p_scb->conn_handle, handle);
return;
}
@@ -129,7 +129,7 @@
UINT8 i;
BOOLEAN found_handle = FALSE;
- APPL_TRACE_DEBUG3("ag_mgmt_cback : code = %d, port_handle = %d, handle = %d",
+ APPL_TRACE_DEBUG("ag_mgmt_cback : code = %d, port_handle = %d, handle = %d",
code, port_handle, handle);
if ((p_scb = bta_ag_scb_by_idx(handle)) != NULL)
@@ -137,7 +137,7 @@
/* ignore close event for port handles other than connected handle */
if ((code != PORT_SUCCESS) && (port_handle != p_scb->conn_handle))
{
- APPL_TRACE_DEBUG1("ag_mgmt_cback ignoring handle:%d", port_handle);
+ APPL_TRACE_DEBUG("ag_mgmt_cback ignoring handle:%d", port_handle);
return;
}
@@ -159,7 +159,7 @@
if (!found_handle)
{
- APPL_TRACE_ERROR1 ("bta_ag_mgmt_cback: PORT_SUCCESS, ignoring handle = %d", port_handle);
+ APPL_TRACE_ERROR ("bta_ag_mgmt_cback: PORT_SUCCESS, ignoring handle = %d", port_handle);
return;
}
@@ -306,7 +306,7 @@
else
{
/* TODO: CR#137125 to handle to error properly */
- APPL_TRACE_DEBUG1("bta_ag_start_servers: RFCOMM_CreateConnection returned error:%d", bta_ag_port_status);
+ APPL_TRACE_DEBUG("bta_ag_start_servers: RFCOMM_CreateConnection returned error:%d", bta_ag_port_status);
}
}
}
@@ -382,7 +382,7 @@
bta_ag_mgmt_cback_tbl[bta_ag_scb_to_idx(p_scb) - 1]) == PORT_SUCCESS)
{
bta_ag_setup_port(p_scb, p_scb->conn_handle);
- APPL_TRACE_DEBUG1("bta_ag_rfc_do_open : conn_handle = %d", p_scb->conn_handle);
+ APPL_TRACE_DEBUG("bta_ag_rfc_do_open : conn_handle = %d", p_scb->conn_handle);
}
/* RFCOMM create connection failed; send ourselves RFCOMM close event */
else
diff --git a/bta/ag/bta_ag_sco.c b/bta/ag/bta_ag_sco.c
index 87d9188..ec00514 100644
--- a/bta/ag/bta_ag_sco.c
+++ b/bta/ag/bta_ag_sco.c
@@ -69,7 +69,11 @@
};
#if (BTM_WBS_INCLUDED == TRUE )
-#define BTA_AG_NUM_CODECS 2
+#define BTA_AG_NUM_CODECS 3
+#define BTA_AG_ESCO_SETTING_IDX_CVSD 0 /* eSCO setting for CVSD */
+#define BTA_AG_ESCO_SETTING_IDX_T1 1 /* eSCO setting for mSBC T1 */
+#define BTA_AG_ESCO_SETTING_IDX_T2 2 /* eSCO setting for mSBC T2 */
+
static const tBTM_ESCO_PARAMS bta_ag_esco_params[BTA_AG_NUM_CODECS] =
{
/* CVSD */
@@ -88,7 +92,20 @@
BTM_SCO_PKT_TYPES_MASK_NO_3_EV5),
BTM_ESCO_RETRANS_POWER /* Retransmission effort */
},
- /* mSBC */
+ /* mSBC T1 */
+ {
+ BTM_64KBITS_RATE, /* TX Bandwidth (64 kbits/sec), 8000 */
+ BTM_64KBITS_RATE, /* RX Bandwidth (64 kbits/sec), 8000 */
+ 8, /* 8 ms */
+ BTM_VOICE_SETTING_TRANS, /* Inp Linear, Transparent, 2s Comp, 16bit */
+ (BTM_SCO_PKT_TYPES_MASK_EV3 | /* Packet Types : EV3 + NO_2_EV3 */
+ BTM_SCO_PKT_TYPES_MASK_NO_3_EV3 |
+ BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 |
+ BTM_SCO_PKT_TYPES_MASK_NO_3_EV5 |
+ BTM_SCO_PKT_TYPES_MASK_NO_2_EV3 ),
+ BTM_ESCO_RETRANS_QUALITY /* Retransmission effort */
+ },
+ /* mSBC T2*/
{
BTM_64KBITS_RATE, /* TX Bandwidth (64 kbits/sec), 8000 */
BTM_64KBITS_RATE, /* RX Bandwidth (64 kbits/sec), 8000 */
@@ -102,6 +119,7 @@
}
};
#else
+/* WBS not included, CVSD by default */
static const tBTM_ESCO_PARAMS bta_ag_esco_params =
{
BTM_64KBITS_RATE, /* TX Bandwidth (64 kbits/sec) */
@@ -184,11 +202,11 @@
BT_HDR *p_buf;
UINT16 handle = 0;
- APPL_TRACE_DEBUG3 ("bta_ag_sco_disc_cback(): sco_idx: 0x%x p_cur_scb: 0x%08x sco.state: %d", sco_idx, bta_ag_cb.sco.p_curr_scb, bta_ag_cb.sco.state);
+ APPL_TRACE_DEBUG ("bta_ag_sco_disc_cback(): sco_idx: 0x%x p_cur_scb: 0x%08x sco.state: %d", sco_idx, bta_ag_cb.sco.p_curr_scb, bta_ag_cb.sco.state);
- APPL_TRACE_DEBUG4 ("bta_ag_sco_disc_cback(): scb[0] addr: 0x%08x in_use: %u sco_idx: 0x%x sco state: %u",
+ APPL_TRACE_DEBUG ("bta_ag_sco_disc_cback(): scb[0] addr: 0x%08x in_use: %u sco_idx: 0x%x sco state: %u",
&bta_ag_cb.scb[0], bta_ag_cb.scb[0].in_use, bta_ag_cb.scb[0].sco_idx, bta_ag_cb.scb[0].state);
- APPL_TRACE_DEBUG4 ("bta_ag_sco_disc_cback(): scb[1] addr: 0x%08x in_use: %u sco_idx: 0x%x sco state: %u",
+ APPL_TRACE_DEBUG ("bta_ag_sco_disc_cback(): scb[1] addr: 0x%08x in_use: %u sco_idx: 0x%x sco state: %u",
&bta_ag_cb.scb[1], bta_ag_cb.scb[1].in_use, bta_ag_cb.scb[1].sco_idx, bta_ag_cb.scb[1].state);
/* match callback to scb */
@@ -207,8 +225,8 @@
{
#if (BTM_SCO_HCI_INCLUDED == TRUE )
tBTM_STATUS status = BTM_ConfigScoPath(BTM_SCO_ROUTE_PCM, NULL, NULL, TRUE);
- APPL_TRACE_DEBUG1("bta_ag_sco_disc_cback sco close config status = %d", status);
- /* SCO clean up here */
+ APPL_TRACE_DEBUG("bta_ag_sco_disc_cback sco close config status = %d", status);
+ /* SCO clean up here */
bta_dm_sco_co_close();
#endif
@@ -216,14 +234,23 @@
/* Restore settings */
if(bta_ag_cb.sco.p_curr_scb->inuse_codec == BTA_AG_CODEC_MSBC)
{
- BTM_SetWBSCodec (BTM_SCO_CODEC_NONE);
+ /* set_sco_codec(BTM_SCO_CODEC_NONE); we should get a close */
BTM_WriteVoiceSettings (BTM_VOICE_SETTING_CVSD);
- /* If SCO open was initiated by AG and failed for mSBC, try CVSD again. */
+ /* If SCO open was initiated by AG and failed for mSBC, then attempt
+ mSBC with T1 settings i.e. 'Safe Settings'. If this fails, then switch to CVSD */
if (bta_ag_sco_is_opening (bta_ag_cb.sco.p_curr_scb))
{
- bta_ag_cb.sco.p_curr_scb->codec_fallback = TRUE;
- APPL_TRACE_DEBUG0("Fallback to CVSD");
+ if (bta_ag_cb.sco.p_curr_scb->codec_msbc_settings == BTA_AG_SCO_MSBC_SETTINGS_T2)
+ {
+ APPL_TRACE_DEBUG("Fallback to mSBC T1 settings");
+ bta_ag_cb.sco.p_curr_scb->codec_msbc_settings = BTA_AG_SCO_MSBC_SETTINGS_T1;
+ }
+ else
+ {
+ APPL_TRACE_DEBUG("Fallback to CVSD settings");
+ bta_ag_cb.sco.p_curr_scb->codec_fallback = TRUE;
+ }
}
}
@@ -240,7 +267,7 @@
/* no match found */
else
{
- APPL_TRACE_DEBUG0("no scb for ag_sco_disc_cback");
+ APPL_TRACE_DEBUG("no scb for ag_sco_disc_cback");
/* sco could be closed after scb dealloc'ed */
if (bta_ag_cb.sco.p_curr_scb != NULL)
@@ -266,7 +293,7 @@
{
if (status != BTM_SCO_DATA_CORRECT)
{
- APPL_TRACE_DEBUG1("bta_ag_sco_read_cback: status(%d)", status);
+ APPL_TRACE_DEBUG("bta_ag_sco_read_cback: status(%d)", status);
}
/* Callout function must free the data. */
@@ -294,7 +321,7 @@
{
status = BTM_RemoveSco(p_scb->sco_idx);
- APPL_TRACE_DEBUG2("ag remove sco: inx 0x%04x, status:0x%x", p_scb->sco_idx, status);
+ APPL_TRACE_DEBUG("ag remove sco: inx 0x%04x, status:0x%x", p_scb->sco_idx, status);
if (status == BTM_CMD_STARTED)
{
@@ -341,7 +368,7 @@
/* If no other SCO active, allow this one */
if (!bta_ag_cb.sco.p_curr_scb)
{
- APPL_TRACE_EVENT1("bta_ag_esco_connreq_cback: Accept Conn Request (sco_inx 0x%04x)", sco_inx);
+ APPL_TRACE_EVENT("bta_ag_esco_connreq_cback: Accept Conn Request (sco_inx 0x%04x)", sco_inx);
bta_ag_sco_conn_rsp(p_scb, &p_data->conn_evt);
bta_ag_cb.sco.state = BTA_AG_SCO_OPENING_ST;
@@ -350,14 +377,14 @@
}
else /* Begin a transfer: Close current SCO before responding */
{
- APPL_TRACE_DEBUG0("bta_ag_esco_connreq_cback: Begin XFER");
+ APPL_TRACE_DEBUG("bta_ag_esco_connreq_cback: Begin XFER");
bta_ag_cb.sco.p_xfer_scb = p_scb;
bta_ag_cb.sco.conn_data = p_data->conn_evt;
bta_ag_cb.sco.state = BTA_AG_SCO_OPEN_XFER_ST;
if (!bta_ag_remove_sco(bta_ag_cb.sco.p_curr_scb, TRUE))
{
- APPL_TRACE_ERROR1("bta_ag_esco_connreq_cback: Nothing to remove so accept Conn Request (sco_inx 0x%04x)", sco_inx);
+ APPL_TRACE_ERROR("bta_ag_esco_connreq_cback: Nothing to remove so accept Conn Request (sco_inx 0x%04x)", sco_inx);
bta_ag_cb.sco.p_xfer_scb = NULL;
bta_ag_cb.sco.state = BTA_AG_SCO_LISTEN_ST;
@@ -368,14 +395,14 @@
/* If error occurred send reject response immediately */
else
{
- APPL_TRACE_WARNING0("no scb for bta_ag_esco_connreq_cback or no resources");
+ APPL_TRACE_WARNING("no scb for bta_ag_esco_connreq_cback or no resources");
BTM_EScoConnRsp(p_data->conn_evt.sco_inx, HCI_ERR_HOST_REJECT_RESOURCES, NULL);
}
}
/* Received a change in the esco link */
else if (event == BTM_ESCO_CHG_EVT)
{
- APPL_TRACE_EVENT5("eSCO change event (inx %d): rtrans %d, rxlen %d, txlen %d, txint %d",
+ APPL_TRACE_EVENT("eSCO change event (inx %d): rtrans %d, rxlen %d, txlen %d, txint %d",
p_data->chg_evt.sco_inx,
p_data->chg_evt.retrans_window, p_data->chg_evt.rx_pkt_len,
p_data->chg_evt.tx_pkt_len, p_data->chg_evt.tx_interval);
@@ -431,7 +458,7 @@
/* Make sure this sco handle is not already in use */
if (p_scb->sco_idx != BTM_INVALID_SCO_INDEX)
{
- APPL_TRACE_WARNING1("bta_ag_create_sco: Index 0x%04x Already In Use!",
+ APPL_TRACE_WARNING("bta_ag_create_sco: Index 0x%04x Already In Use!",
p_scb->sco_idx);
return;
}
@@ -450,11 +477,23 @@
p_scb->codec_updated = TRUE;
}
+ /* If WBS included, use CVSD by default, index is 0 for CVSD by initialization */
+ /* If eSCO codec is mSBC, index is T2 or T1 */
if (esco_codec == BTM_SCO_CODEC_MSBC)
- codec_index = esco_codec - 1;
+ {
+ if (p_scb->codec_msbc_settings == BTA_AG_SCO_MSBC_SETTINGS_T2)
+ {
+ codec_index = BTA_AG_ESCO_SETTING_IDX_T2;
+ }
+ else
+ {
+ codec_index = BTA_AG_ESCO_SETTING_IDX_T1;
+ }
+ }
params = bta_ag_esco_params[codec_index];
#else
+ /* When WBS is not included, use CVSD by default */
params = bta_ag_esco_params;
#endif
@@ -464,7 +503,7 @@
if(!bta_ag_cb.sco.param_updated)
{
#if (BTM_WBS_INCLUDED == TRUE)
- if (!codec_index) /* For non-WBS */
+ if (esco_codec == BTM_SCO_CODEC_CVSD) /* For CVSD */
#endif
{
/* Use the application packet types (5 slot EV packets not allowed) */
@@ -491,23 +530,23 @@
if (esco_codec != BTA_AG_CODEC_MSBC)
{
p_scb->retry_with_sco_only = TRUE;
- APPL_TRACE_API0("Setting retry_with_sco_only to TRUE");
+ APPL_TRACE_API("Setting retry_with_sco_only to TRUE");
}
else /* Do not use SCO when using mSBC */
{
p_scb->retry_with_sco_only = FALSE;
- APPL_TRACE_API0("Setting retry_with_sco_only to FALSE");
+ APPL_TRACE_API("Setting retry_with_sco_only to FALSE");
}
#else
p_scb->retry_with_sco_only = TRUE;
- APPL_TRACE_API0("Setting retry_with_sco_only to TRUE");
+ APPL_TRACE_API("Setting retry_with_sco_only to TRUE");
#endif
}
}
else
{
if(p_scb->retry_with_sco_only)
- APPL_TRACE_API0("retrying with SCO only");
+ APPL_TRACE_API("retrying with SCO only");
p_scb->retry_with_sco_only = FALSE;
BTM_SetEScoMode(BTM_LINK_TYPE_SCO, ¶ms);
@@ -518,8 +557,23 @@
/* tell sys to stop av if any */
bta_sys_sco_use(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr);
+#if (BTM_WBS_INCLUDED == TRUE )
+ /* Allow any platform specific pre-SCO set up to take place */
+ bta_ag_co_audio_state(bta_ag_scb_to_idx(p_scb), p_scb->app_id, BTA_AG_CO_AUD_STATE_SETUP,\
+ esco_codec);
+
+ /* This setting may not be necessary */
+ /* To be verified with stable 2049 boards */
+ if (esco_codec == BTA_AG_CODEC_MSBC)
+ BTM_WriteVoiceSettings (BTM_VOICE_SETTING_TRANS);
+ else
+ BTM_WriteVoiceSettings (BTM_VOICE_SETTING_CVSD);
+ /* save the current codec because sco_codec can be updated while SCO is open. */
+ p_scb->inuse_codec = esco_codec;
+#else
/* Allow any platform specific pre-SCO set up to take place */
bta_ag_co_audio_state(bta_ag_scb_to_idx(p_scb), p_scb->app_id, BTA_AG_CO_AUD_STATE_SETUP);
+#endif
#if (BTM_SCO_HCI_INCLUDED == TRUE )
#if (BTM_WBS_INCLUDED == TRUE)
@@ -532,26 +586,6 @@
sco_route = bta_dm_sco_co_init(pcm_sample_rate, pcm_sample_rate, &codec_info, p_scb->app_id);
#endif
-#if (BTM_WBS_INCLUDED == TRUE )
- if (esco_codec == BTA_AG_CODEC_MSBC)
- {
- /* Enable mSBC codec in fw */
- BTM_SetWBSCodec (esco_codec);
- }
-
- /* Specify PCM input for SBC codec in fw */
- BTM_ConfigI2SPCM (esco_codec, (UINT8)HCI_BRCM_I2SPCM_IS_DEFAULT_ROLE, (UINT8)HCI_BRCM_I2SPCM_SAMPLE_DEFAULT, (UINT8)HCI_BRCM_I2SPCM_CLOCK_DEFAULT);
-
- /* This setting may not be necessary */
- /* To be verified with stable 2049 boards */
- if (esco_codec == BTA_AG_CODEC_MSBC)
- BTM_WriteVoiceSettings (BTM_VOICE_SETTING_TRANS);
- else
- BTM_WriteVoiceSettings (BTM_VOICE_SETTING_CVSD);
-
- /* save the current codec because sco_codec can be updated while SCO is open. */
- p_scb->inuse_codec = esco_codec;
-#endif
#if (BTM_SCO_HCI_INCLUDED == TRUE )
/* initialize SCO setup, no voice setting for AG, data rate <==> sample rate */
@@ -579,13 +613,32 @@
}
}
- APPL_TRACE_API4("ag create sco: orig %d, inx 0x%04x, status 0x%x, pkt types 0x%04x",
+ APPL_TRACE_API("ag create sco: orig %d, inx 0x%04x, status 0x%x, pkt types 0x%04x",
is_orig, p_scb->sco_idx, status, params.packet_types);
}
#if (BTM_WBS_INCLUDED == TRUE )
/*******************************************************************************
**
+** Function bta_ag_attempt_msbc_safe_settings
+**
+** Description Checks if ESCO connection needs to be attempted using mSBC T1(safe) settings
+**
+**
+** Returns TRUE if T1 settings has to be used, FALSE otherwise
+**
+*******************************************************************************/
+BOOLEAN bta_ag_attempt_msbc_safe_settings(tBTA_AG_SCB *p_scb)
+{
+ if (p_scb->svc_conn && p_scb->sco_codec == BTM_SCO_CODEC_MSBC &&
+ p_scb->codec_msbc_settings == BTA_AG_SCO_MSBC_SETTINGS_T1)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+/*******************************************************************************
+**
** Function bta_ag_cn_timer_cback
**
** Description
@@ -627,7 +680,9 @@
{
bta_ag_cb.sco.p_curr_scb = p_scb;
- if (p_scb->codec_updated || p_scb->codec_fallback)
+ if ((p_scb->codec_updated || p_scb->codec_fallback ||
+ bta_ag_attempt_msbc_safe_settings(p_scb)) &&
+ (p_scb->peer_features & BTA_AG_PEER_FEAT_CODEC))
{
/* Change the power mode to Active until sco open is completed. */
bta_sys_busy(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr);
@@ -643,10 +698,11 @@
else
{
/* use same codec type as previous SCO connection, skip codec negotiation */
+ APPL_TRACE_DEBUG("use same codec type as previous SCO connection,skip codec negotiation");
bta_ag_sco_codec_nego(p_scb, TRUE);
}
}
-#endif
+#endif /* (BTM_WBS_INCLUDED == TRUE ) */
/*******************************************************************************
**
@@ -670,12 +726,12 @@
#if BTA_AG_SCO_DEBUG == TRUE
UINT8 in_state = p_sco->state;
- APPL_TRACE_EVENT5("BTA ag sco evt (hdl 0x%04x): State %d (%s), Event %d (%s)",
+ APPL_TRACE_EVENT("BTA ag sco evt (hdl 0x%04x): State %d (%s), Event %d (%s)",
p_scb->sco_idx,
p_sco->state, bta_ag_sco_state_str(p_sco->state),
event, bta_ag_sco_evt_str(event));
#else
- APPL_TRACE_EVENT3("BTA ag sco evt (hdl 0x%04x): State %d, Event %d",
+ APPL_TRACE_EVENT("BTA ag sco evt (hdl 0x%04x): State %d, Event %d",
p_scb->sco_idx, p_sco->state, event);
#endif
@@ -712,7 +768,7 @@
break;
default:
- APPL_TRACE_WARNING1("BTA_AG_SCO_SHUTDOWN_ST: Ignoring event %d", event);
+ APPL_TRACE_WARNING("BTA_AG_SCO_SHUTDOWN_ST: Ignoring event %d", event);
break;
}
break;
@@ -757,7 +813,7 @@
case BTA_AG_SCO_CLOSE_E:
/* remove listening connection */
/* Ignore the event. We need to keep listening SCO for the active SLC */
- APPL_TRACE_WARNING1("BTA_AG_SCO_LISTEN_ST: Ignoring event %d", event);
+ APPL_TRACE_WARNING("BTA_AG_SCO_LISTEN_ST: Ignoring event %d", event);
break;
case BTA_AG_SCO_CONN_CLOSE_E:
@@ -767,7 +823,7 @@
break;
default:
- APPL_TRACE_WARNING1("BTA_AG_SCO_LISTEN_ST: Ignoring event %d", event);
+ APPL_TRACE_WARNING("BTA_AG_SCO_LISTEN_ST: Ignoring event %d", event);
break;
}
break;
@@ -819,7 +875,7 @@
break;
default:
- APPL_TRACE_WARNING1("BTA_AG_SCO_CODEC_ST: Ignoring event %d", event);
+ APPL_TRACE_WARNING("BTA_AG_SCO_CODEC_ST: Ignoring event %d", event);
break;
}
break;
@@ -878,7 +934,7 @@
break;
default:
- APPL_TRACE_WARNING1("BTA_AG_SCO_OPENING_ST: Ignoring event %d", event);
+ APPL_TRACE_WARNING("BTA_AG_SCO_OPENING_ST: Ignoring event %d", event);
break;
}
break;
@@ -923,7 +979,7 @@
break;
default:
- APPL_TRACE_WARNING1("BTA_AG_SCO_OPEN_CL_ST: Ignoring event %d", event);
+ APPL_TRACE_WARNING("BTA_AG_SCO_OPEN_CL_ST: Ignoring event %d", event);
break;
}
break;
@@ -959,7 +1015,7 @@
break;
default:
- APPL_TRACE_WARNING1("BTA_AG_SCO_OPEN_XFER_ST: Ignoring event %d", event);
+ APPL_TRACE_WARNING("BTA_AG_SCO_OPEN_XFER_ST: Ignoring event %d", event);
break;
}
break;
@@ -1012,7 +1068,7 @@
break;
default:
- APPL_TRACE_WARNING1("BTA_AG_SCO_OPEN_ST: Ignoring event %d", event);
+ APPL_TRACE_WARNING("BTA_AG_SCO_OPEN_ST: Ignoring event %d", event);
break;
}
break;
@@ -1059,7 +1115,7 @@
break;
default:
- APPL_TRACE_WARNING1("BTA_AG_SCO_CLOSING_ST: Ignoring event %d", event);
+ APPL_TRACE_WARNING("BTA_AG_SCO_CLOSING_ST: Ignoring event %d", event);
break;
}
break;
@@ -1096,7 +1152,7 @@
break;
default:
- APPL_TRACE_WARNING1("BTA_AG_SCO_CLOSE_OP_ST: Ignoring event %d", event);
+ APPL_TRACE_WARNING("BTA_AG_SCO_CLOSE_OP_ST: Ignoring event %d", event);
break;
}
break;
@@ -1145,7 +1201,7 @@
break;
default:
- APPL_TRACE_WARNING1("BTA_AG_SCO_CLOSE_XFER_ST: Ignoring event %d", event);
+ APPL_TRACE_WARNING("BTA_AG_SCO_CLOSE_XFER_ST: Ignoring event %d", event);
break;
}
break;
@@ -1202,7 +1258,7 @@
break;
default:
- APPL_TRACE_WARNING1("BTA_AG_SCO_SHUTTING_ST: Ignoring event %d", event);
+ APPL_TRACE_WARNING("BTA_AG_SCO_SHUTTING_ST: Ignoring event %d", event);
break;
}
break;
@@ -1213,7 +1269,7 @@
#if BTA_AG_SCO_DEBUG == TRUE
if (p_sco->state != in_state)
{
- APPL_TRACE_EVENT3("BTA AG SCO State Change: [%s] -> [%s] after Event [%s]",
+ APPL_TRACE_EVENT("BTA AG SCO State Change: [%s] -> [%s] after Event [%s]",
bta_ag_sco_state_str(in_state),
bta_ag_sco_state_str(p_sco->state),
bta_ag_sco_evt_str(event));
@@ -1333,7 +1389,7 @@
if (p_scb->sco_idx != BTM_INVALID_SCO_INDEX)
#endif
{
- APPL_TRACE_DEBUG1("bta_ag_sco_close: sco_inx = %d", p_scb->sco_idx);
+ APPL_TRACE_DEBUG("bta_ag_sco_close: sco_inx = %d", p_scb->sco_idx);
bta_ag_sco_event(p_scb, BTA_AG_SCO_CLOSE_E);
}
}
@@ -1399,7 +1455,12 @@
bta_sys_sco_open(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr);
+#if (BTM_WBS_INCLUDED == TRUE)
+ bta_ag_co_audio_state(bta_ag_scb_to_idx(p_scb), p_scb->app_id, BTA_AG_CO_AUD_STATE_ON,
+ p_scb->inuse_codec);
+#else
bta_ag_co_audio_state(bta_ag_scb_to_idx(p_scb), p_scb->app_id, BTA_AG_CO_AUD_STATE_ON);
+#endif
#if (BTM_SCO_HCI_INCLUDED == TRUE )
/* open SCO codec if SCO is routed through transport */
@@ -1410,6 +1471,10 @@
bta_ag_cback_sco(p_scb, BTA_AG_AUDIO_OPEN_EVT);
p_scb->retry_with_sco_only = FALSE;
+#if (BTM_WBS_INCLUDED == TRUE)
+ /* reset to mSBC T2 settings as the preferred */
+ p_scb->codec_msbc_settings = BTA_AG_SCO_MSBC_SETTINGS_T2;
+#endif
}
/*******************************************************************************
@@ -1433,7 +1498,9 @@
#if (BTM_WBS_INCLUDED == TRUE)
/* codec_fallback is set when AG is initiator and connection failed for mSBC. */
- if (p_scb->codec_fallback && p_scb->svc_conn)
+ /* OR if codec is msbc and T2 settings failed, then retry Safe T1 settings */
+ if ((p_scb->codec_fallback && p_scb->svc_conn) ||
+ bta_ag_attempt_msbc_safe_settings(p_scb))
{
bta_ag_sco_event(p_scb, BTA_AG_SCO_REOPEN_E);
}
@@ -1452,12 +1519,15 @@
#endif
else
{
+#if (BTM_WBS_INCLUDED == TRUE)
/* Indicate if the closing of audio is because of transfer */
- if (bta_ag_cb.sco.p_xfer_scb)
- bta_ag_co_audio_state(handle, p_scb->app_id, BTA_AG_CO_AUD_STATE_OFF_XFER);
- else
- bta_ag_co_audio_state(handle, p_scb->app_id, BTA_AG_CO_AUD_STATE_OFF);
-
+ bta_ag_co_audio_state(handle, p_scb->app_id,(bta_ag_cb.sco.p_xfer_scb)?\
+ BTA_AG_CO_AUD_STATE_OFF_XFER:BTA_AG_CO_AUD_STATE_OFF,p_scb->inuse_codec);
+#else
+ /* Indicate if the closing of audio is because of transfer */
+ bta_ag_co_audio_state(handle, p_scb->app_id,(bta_ag_cb.sco.p_xfer_scb)?\
+ BTA_AG_CO_AUD_STATE_OFF_XFER:BTA_AG_CO_AUD_STATE_OFF);
+#endif
bta_ag_sco_event(p_scb, BTA_AG_SCO_CONN_CLOSE_E);
bta_sys_sco_close(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr);
@@ -1472,6 +1542,9 @@
/* call app callback */
bta_ag_cback_sco(p_scb, BTA_AG_AUDIO_CLOSE_EVT);
+#if (BTM_WBS_INCLUDED == TRUE)
+ p_scb->codec_msbc_settings = BTA_AG_SCO_MSBC_SETTINGS_T2;
+#endif
}
p_scb->retry_with_sco_only = FALSE;
}
@@ -1531,12 +1604,14 @@
/* tell sys to stop av if any */
bta_sys_sco_use(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr);
+#if (BTM_WBS_INCLUDED == FALSE )
/* Allow any platform specific pre-SCO set up to take place */
bta_ag_co_audio_state(bta_ag_scb_to_idx(p_scb), p_scb->app_id, BTA_AG_CO_AUD_STATE_SETUP);
-
-#if (BTM_WBS_INCLUDED == TRUE )
+#else
/* When HS initiated SCO, it cannot be WBS. */
- BTM_ConfigI2SPCM (BTM_SCO_CODEC_CVSD, (UINT8)HCI_BRCM_I2SPCM_IS_DEFAULT_ROLE, (UINT8)HCI_BRCM_I2SPCM_SAMPLE_DEFAULT, (UINT8)HCI_BRCM_I2SPCM_CLOCK_DEFAULT);
+ /* Allow any platform specific pre-SCO set up to take place */
+ bta_ag_co_audio_state(bta_ag_scb_to_idx(p_scb), p_scb->app_id, BTA_AG_CO_AUD_STATE_SETUP,
+ BTA_AG_CODEC_CVSD);
#endif
#if (BTM_SCO_HCI_INCLUDED == TRUE )
@@ -1593,13 +1668,13 @@
if(set_reset == FALSE) /* reset the parameters to default */
{
bta_ag_cb.sco.param_updated = FALSE;
- APPL_TRACE_DEBUG0("bta_ag_set_esco_param : Resetting ESCO parameters to default");
+ APPL_TRACE_DEBUG("bta_ag_set_esco_param : Resetting ESCO parameters to default");
}
else
{
bta_ag_cb.sco.param_updated = TRUE;
bta_ag_cb.sco.params = *param;
- APPL_TRACE_DEBUG0("bta_ag_set_esco_param : Setting ESCO parameters");
+ APPL_TRACE_DEBUG("bta_ag_set_esco_param : Setting ESCO parameters");
}
}
diff --git a/bta/ag/bta_ag_sdp.c b/bta/ag/bta_ag_sdp.c
index 333cb1b..8099d5f 100644
--- a/bta/ag/bta_ag_sdp.c
+++ b/bta/ag/bta_ag_sdp.c
@@ -74,7 +74,7 @@
UINT16 event;
tBTA_AG_SCB *p_scb;
- APPL_TRACE_DEBUG1("bta_ag_sdp_cback status:0x%x", status);
+ APPL_TRACE_DEBUG("bta_ag_sdp_cback status:0x%x", status);
if ((p_scb = bta_ag_scb_by_idx(idx)) != NULL)
{
@@ -140,7 +140,7 @@
BOOLEAN codec_supported = FALSE;
UINT8 buf[2];
- APPL_TRACE_DEBUG1("bta_ag_add_record uuid: %x", service_uuid);
+ APPL_TRACE_DEBUG("bta_ag_add_record uuid: %x", service_uuid);
memset( proto_elem_list, 0 , BTA_AG_NUM_PROTO_ELEMS*sizeof(tSDP_PROTOCOL_ELEM));
@@ -280,7 +280,7 @@
/* if service registered for this scb and not registered for any other scb */
if (((services & 1) == 1) && ((others & 1) == 0))
{
- APPL_TRACE_DEBUG1("bta_ag_del_records %d", i);
+ APPL_TRACE_DEBUG("bta_ag_del_records %d", i);
if (bta_ag_cb.profile[i].sdp_handle != 0)
{
SDP_DeleteRecord(bta_ag_cb.profile[i].sdp_handle);
diff --git a/bta/ar/bta_ar.c b/bta/ar/bta_ar.c
index 89b732a..25b27d3 100644
--- a/bta/ar/bta_ar.c
+++ b/bta/ar/bta_ar.c
@@ -115,7 +115,7 @@
#if (BTA_AR_DEBUG == TRUE)
else
{
- APPL_TRACE_ERROR1("bta_ar_reg_avdt: the registration is from wrong sys_id:%d", sys_id);
+ APPL_TRACE_ERROR("bta_ar_reg_avdt: the registration is from wrong sys_id:%d", sys_id);
}
#endif
diff --git a/bta/av/bta_av_aact.c b/bta/av/bta_av_aact.c
index fed838a..e8e5edc 100644
--- a/bta/av/bta_av_aact.c
+++ b/bta/av/bta_av_aact.c
@@ -193,6 +193,7 @@
0 /* AVDT_DELAY_REPORT_CFM_EVT */
};
+void bta_av_stream_data_cback(UINT8 handle, BT_HDR *p_pkt, UINT32 time_stamp, UINT8 m_pt);
static void bta_av_stream0_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data);
static void bta_av_stream1_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data);
#if BTA_AV_NUM_STRS > 2
@@ -225,6 +226,48 @@
,bta_av_stream5_cback
#endif
};
+/***********************************************
+**
+** Function bta_get_scb_handle
+**
+** Description gives the registered AVDT handle.by checking with sep_type.
+**
+**
+** Returns void
+***********************************************/
+UINT8 bta_av_get_scb_handle ( tBTA_AV_SCB *p_scb, UINT8 local_sep )
+{
+ UINT8 xx =0;
+ for (xx = 0; xx<BTA_AV_MAX_SEPS; xx++)
+ {
+ if ((p_scb->seps[xx].tsep == local_sep) &&
+ (p_scb->seps[xx].codec_type == p_scb->codec_type))
+ return (p_scb->seps[xx].av_handle);
+ }
+ APPL_TRACE_DEBUG(" bta_av_get_scb_handle appropiate sep_type not found")
+ return 0; /* return invalid handle */
+}
+
+/***********************************************
+**
+** Function bta_av_get_scb_sep_type
+**
+** Description gives the sep type by cross-checking with AVDT handle
+**
+**
+** Returns void
+***********************************************/
+UINT8 bta_av_get_scb_sep_type ( tBTA_AV_SCB *p_scb, UINT8 tavdt_handle)
+{
+ UINT8 xx =0;
+ for (xx = 0; xx<BTA_AV_MAX_SEPS; xx++)
+ {
+ if (p_scb->seps[xx].av_handle == tavdt_handle)
+ return (p_scb->seps[xx].tsep);
+ }
+ APPL_TRACE_DEBUG(" bta_av_get_scb_sep_type appropiate handle not found")
+ return 3; /* return invalid sep type */
+}
/*******************************************************************************
**
@@ -238,11 +281,11 @@
*******************************************************************************/
static void bta_av_save_addr(tBTA_AV_SCB *p_scb, const BD_ADDR b)
{
- APPL_TRACE_DEBUG2("bta_av_save_addr r:%d, s:%d",
+ APPL_TRACE_DEBUG("bta_av_save_addr r:%d, s:%d",
p_scb->recfg_sup, p_scb->suspend_sup);
if(bdcmp(p_scb->peer_addr, b) != 0)
{
- APPL_TRACE_ERROR0("reset flags");
+ APPL_TRACE_ERROR("reset flags");
/* a new addr, reset the supported flags */
p_scb->recfg_sup = TRUE;
p_scb->suspend_sup = TRUE;
@@ -290,7 +333,7 @@
{
UNUSED(p_data);
- APPL_TRACE_DEBUG2("bta_av_st_rc_timer rc_handle:%d, use_rc: %d",
+ APPL_TRACE_DEBUG("bta_av_st_rc_timer rc_handle:%d, use_rc: %d",
p_scb->rc_handle, p_scb->use_rc);
/* for outgoing RC connection as INT/CT */
if( (p_scb->rc_handle == BTA_AV_RC_HANDLE_NONE) &&
@@ -320,12 +363,19 @@
int i;
tAVDT_GETCAP_REQ *p_req;
BOOLEAN sent_cmd = FALSE;
+ UINT16 uuid_int = p_scb->uuid_int;
+ UINT8 sep_requested = 0;
+
+ if(uuid_int == UUID_SERVCLASS_AUDIO_SOURCE)
+ sep_requested = AVDT_TSEP_SNK;
+ else if(uuid_int == UUID_SERVCLASS_AUDIO_SINK)
+ sep_requested = AVDT_TSEP_SRC;
for (i = p_scb->sep_info_idx; i < p_scb->num_seps; i++)
{
/* steam not in use, is a sink, and is the right media type (audio/video) */
if ((p_scb->sep_info[i].in_use == FALSE) &&
- (p_scb->sep_info[i].tsep == AVDT_TSEP_SNK) &&
+ (p_scb->sep_info[i].tsep == sep_requested) &&
(p_scb->sep_info[i].media_type == p_scb->media_type))
{
p_scb->sep_info_idx = i;
@@ -405,7 +455,7 @@
if (bd_addr != NULL)
{
bdcpy(p_msg->bd_addr, bd_addr);
- APPL_TRACE_DEBUG6(" bd_addr:%02x-%02x-%02x-%02x-%02x-%02x",
+ APPL_TRACE_DEBUG(" bd_addr:%02x-%02x-%02x-%02x-%02x-%02x",
bd_addr[0], bd_addr[1],
bd_addr[2], bd_addr[3],
bd_addr[4], bd_addr[5]);
@@ -418,7 +468,7 @@
switch (event)
{
case AVDT_RECONFIG_CFM_EVT:
- APPL_TRACE_DEBUG4("reconfig cfm event codec info = 0x%06x-%06x-%06x-%02x",
+ APPL_TRACE_DEBUG("reconfig cfm event codec info = 0x%06x-%06x-%06x-%02x",
(p_msg->msg.reconfig_cfm.p_cfg->codec_info[0]<<16)+(p_msg->msg.reconfig_cfm.p_cfg->codec_info[1]<<8)+p_msg->msg.reconfig_cfm.p_cfg->codec_info[2],
(p_msg->msg.reconfig_cfm.p_cfg->codec_info[3]<<16)+(p_msg->msg.reconfig_cfm.p_cfg->codec_info[4]<<8)+p_msg->msg.reconfig_cfm.p_cfg->codec_info[5],
(p_msg->msg.reconfig_cfm.p_cfg->codec_info[6]<<16)+(p_msg->msg.reconfig_cfm.p_cfg->codec_info[7]<<8)+p_msg->msg.reconfig_cfm.p_cfg->codec_info[8],
@@ -494,7 +544,7 @@
if (event == AVDT_SUSPEND_CFM_EVT)
p_msg->initiator = TRUE;
- APPL_TRACE_VERBOSE1("hndl:x%x", p_scb->hndl);
+ APPL_TRACE_VERBOSE("hndl:x%x", p_scb->hndl);
p_msg->hdr.layer_specific = p_scb->hndl;
p_msg->handle = handle;
p_msg->avdt_event = event;
@@ -509,6 +559,39 @@
/*******************************************************************************
**
+** Function bta_av_stream_data_cback
+**
+** Description This is the AVDTP callback function for stream events.
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_av_stream_data_cback(UINT8 handle, BT_HDR *p_pkt, UINT32 time_stamp, UINT8 m_pt)
+{
+ int index = 0;
+ tBTA_AV_SCB *p_scb ;
+ APPL_TRACE_DEBUG("bta_av_stream_data_cback avdt_handle: %d pkt_len=0x%x ofst = 0x%x", handle,p_pkt->len,p_pkt->offset);
+ APPL_TRACE_DEBUG(" Number of frames 0x%x",*((UINT8*)(p_pkt + 1) + p_pkt->offset));
+ APPL_TRACE_DEBUG("Sequence Number 0x%x",p_pkt->layer_specific);
+ /* Get SCB and correct sep type*/
+ for(index = 0; index < BTA_AV_NUM_STRS;index ++ )
+ {
+ p_scb = bta_av_cb.p_scb[index];
+ if((p_scb->avdt_handle == handle)&&(p_scb->seps[p_scb->sep_idx].tsep == AVDT_TSEP_SNK))
+ break;
+ }
+ if(index == BTA_AV_NUM_STRS) /* cannot find correct handler */
+ {
+ GKI_freebuf(p_pkt);
+ return;
+ }
+ p_pkt->event = BTA_AV_MEDIA_DATA_EVT;
+ p_scb->seps[p_scb->sep_idx].p_app_data_cback(BTA_AV_MEDIA_DATA_EVT, (tBTA_AV_MEDIA*)p_pkt);
+ GKI_freebuf(p_pkt); /* a copy of packet had been delivered, we free this buffer */
+}
+
+/*******************************************************************************
+**
** Function bta_av_stream0_cback
**
** Description This is the AVDTP callback function for stream events.
@@ -518,7 +601,7 @@
*******************************************************************************/
static void bta_av_stream0_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data)
{
- APPL_TRACE_VERBOSE2("bta_av_stream0_cback avdt_handle: %d event=0x%x", handle, event);
+ APPL_TRACE_VERBOSE("bta_av_stream0_cback avdt_handle: %d event=0x%x", handle, event);
bta_av_proc_stream_evt(handle, bd_addr, event, p_data, 0);
}
@@ -533,7 +616,7 @@
*******************************************************************************/
static void bta_av_stream1_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data)
{
- APPL_TRACE_EVENT2("bta_av_stream1_cback avdt_handle: %d event=0x%x", handle, event);
+ APPL_TRACE_EVENT("bta_av_stream1_cback avdt_handle: %d event=0x%x", handle, event);
bta_av_proc_stream_evt(handle, bd_addr, event, p_data, 1);
}
@@ -549,7 +632,7 @@
*******************************************************************************/
static void bta_av_stream2_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data)
{
- APPL_TRACE_EVENT2("bta_av_stream2_cback avdt_handle: %d event=0x%x", handle, event);
+ APPL_TRACE_EVENT("bta_av_stream2_cback avdt_handle: %d event=0x%x", handle, event);
bta_av_proc_stream_evt(handle, bd_addr, event, p_data, 2);
}
#endif
@@ -566,7 +649,7 @@
*******************************************************************************/
static void bta_av_stream3_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data)
{
- APPL_TRACE_EVENT2("bta_av_stream3_cback avdt_handle: %d event=0x%x", handle, event);
+ APPL_TRACE_EVENT("bta_av_stream3_cback avdt_handle: %d event=0x%x", handle, event);
bta_av_proc_stream_evt(handle, bd_addr, event, p_data, 3);
}
#endif
@@ -583,7 +666,7 @@
#if BTA_AV_NUM_STRS > 4
static void bta_av_stream4_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data)
{
- APPL_TRACE_EVENT2("bta_av_stream4_cback avdt_handle: %d event=0x%x", handle, event);
+ APPL_TRACE_EVENT("bta_av_stream4_cback avdt_handle: %d event=0x%x", handle, event);
bta_av_proc_stream_evt(handle, bd_addr, event, p_data, 4);
}
#endif
@@ -600,7 +683,7 @@
#if BTA_AV_NUM_STRS > 5
static void bta_av_stream5_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data)
{
- APPL_TRACE_EVENT2("bta_av_stream5_cback avdt_handle: %d event=0x%x", handle, event);
+ APPL_TRACE_EVENT("bta_av_stream5_cback avdt_handle: %d event=0x%x", handle, event);
bta_av_proc_stream_evt(handle, bd_addr, event, p_data, 5);
}
#endif
@@ -636,7 +719,7 @@
}
else
{
- APPL_TRACE_ERROR1 ("bta_av_a2d_sdp_cback, no scb found for handle(0x%x)", bta_av_cb.handle);
+ APPL_TRACE_ERROR ("bta_av_a2d_sdp_cback, no scb found for handle(0x%x)", bta_av_cb.handle);
}
}
}
@@ -650,16 +733,16 @@
** Returns
**
*******************************************************************************/
-static void bta_av_adjust_seps_idx(tBTA_AV_SCB *p_scb)
+static void bta_av_adjust_seps_idx(tBTA_AV_SCB *p_scb, UINT8 avdt_handle)
{
- int xx;
-
- APPL_TRACE_DEBUG1("bta_av_adjust_seps_idx codec_type: %d", p_scb->codec_type);
+ int xx;
+ APPL_TRACE_DEBUG("bta_av_adjust_seps_idx codec_type: %d", p_scb->codec_type);
for(xx=0; xx<BTA_AV_MAX_SEPS; xx++)
{
- APPL_TRACE_DEBUG2("av_handle: %d codec_type: %d",
+ APPL_TRACE_DEBUG("av_handle: %d codec_type: %d",
p_scb->seps[xx].av_handle, p_scb->seps[xx].codec_type);
- if(p_scb->seps[xx].av_handle && p_scb->codec_type == p_scb->seps[xx].codec_type)
+ if((p_scb->seps[xx].av_handle && p_scb->codec_type == p_scb->seps[xx].codec_type)
+ && (p_scb->seps[xx].av_handle == avdt_handle))
{
p_scb->sep_idx = xx;
p_scb->avdt_handle = p_scb->seps[xx].av_handle;
@@ -684,7 +767,7 @@
tBTA_AV_API_OPEN *p_buf = &p_scb->q_info.open;
UNUSED(p_data);
- APPL_TRACE_DEBUG1("bta_av_switch_role wait:x%x", p_scb->wait);
+ APPL_TRACE_DEBUG("bta_av_switch_role wait:x%x", p_scb->wait);
if (p_scb->wait & BTA_AV_WAIT_ROLE_SW_RES_START)
p_scb->wait |= BTA_AV_WAIT_ROLE_SW_RETRY;
@@ -739,7 +822,7 @@
tBTA_AV_START start;
tBTA_AV_OPEN av_open;
- APPL_TRACE_DEBUG3("bta_av_role_res q_tag:%d, wait:x%x, role:x%x", p_scb->q_tag, p_scb->wait, p_scb->role);
+ APPL_TRACE_DEBUG("bta_av_role_res q_tag:%d, wait:x%x, role:x%x", p_scb->q_tag, p_scb->wait, p_scb->role);
if (p_scb->role & BTA_AV_ROLE_START_INT)
initiator = TRUE;
@@ -781,6 +864,10 @@
av_open.chnl = p_scb->chnl;
av_open.hndl = p_scb->hndl;
start.status = BTA_AV_FAIL_ROLE;
+ if(p_scb->seps[p_scb->sep_idx].tsep == AVDT_TSEP_SRC )
+ av_open.sep = AVDT_TSEP_SNK;
+ else if(p_scb->seps[p_scb->sep_idx].tsep == AVDT_TSEP_SNK )
+ av_open.sep = AVDT_TSEP_SRC;
(*bta_av_cb.p_cback)(BTA_AV_OPEN_EVT, (tBTA_AV *)&av_open);
}
else
@@ -792,11 +879,11 @@
}
else
{
- APPL_TRACE_WARNING2 ("Unexpected role switch event: q_tag = %d wait = %d", p_scb->q_tag, p_scb->wait);
+ APPL_TRACE_WARNING ("Unexpected role switch event: q_tag = %d wait = %d", p_scb->q_tag, p_scb->wait);
}
}
- APPL_TRACE_DEBUG2("wait:x%x, role:x%x", p_scb->wait, p_scb->role);
+ APPL_TRACE_DEBUG("wait:x%x, role:x%x", p_scb->wait, p_scb->role);
}
/*******************************************************************************
@@ -830,8 +917,9 @@
UINT16 attr_list[] = {ATTR_ID_SERVICE_CLASS_ID_LIST,
ATTR_ID_PROTOCOL_DESC_LIST,
ATTR_ID_BT_PROFILE_DESC_LIST};
+ UINT16 sdp_uuid = 0; /* UUID for which SDP has to be done */
- APPL_TRACE_DEBUG3("bta_av_do_disc_a2d use_rc: %d rs:%d, oc:%d",
+ APPL_TRACE_DEBUG("bta_av_do_disc_a2d use_rc: %d rs:%d, oc:%d",
p_data->api_open.use_rc, p_data->api_open.switch_res, bta_av_cb.audio_open_cnt);
memcpy (&(p_scb->open_api), &(p_data->api_open), sizeof(tBTA_AV_API_OPEN));
@@ -876,7 +964,7 @@
break;
}
- APPL_TRACE_DEBUG3("ok_continue: %d wait:x%x, q_tag: %d", ok_continue, p_scb->wait, p_scb->q_tag);
+ APPL_TRACE_DEBUG("ok_continue: %d wait:x%x, q_tag: %d", ok_continue, p_scb->wait, p_scb->q_tag);
if (!ok_continue)
return;
@@ -891,13 +979,13 @@
if (bta_av_cb.features & BTA_AV_FEAT_MASTER)
{
- L2CA_SetDesireRole(L2CAP_ROLE_DISALLOW_SWITCH);
+ L2CA_SetDesireRole(L2CAP_ROLE_DISALLOW_SWITCH);
- if (bta_av_cb.audio_open_cnt == 1)
- {
- /* there's already an A2DP connection. do not allow switch */
- bta_sys_clear_default_policy(BTA_ID_AV, HCI_ENABLE_MASTER_SLAVE_SWITCH);
- }
+ if (bta_av_cb.audio_open_cnt == 1)
+ {
+ /* there's already an A2DP connection. do not allow switch */
+ bta_sys_clear_default_policy(BTA_ID_AV, HCI_ENABLE_MASTER_SLAVE_SWITCH);
+ }
}
/* store peer addr other parameters */
bta_av_save_addr(p_scb, p_data->api_open.bd_addr);
@@ -922,8 +1010,14 @@
db_params.num_attr = 3;
db_params.p_db = p_scb->p_disc_db;
db_params.p_attrs = attr_list;
+ p_scb->uuid_int = p_data->api_open.uuid;
+ if (p_scb->uuid_int == UUID_SERVCLASS_AUDIO_SINK)
+ sdp_uuid = UUID_SERVCLASS_AUDIO_SOURCE;
+ else if (p_scb->uuid_int == UUID_SERVCLASS_AUDIO_SOURCE)
+ sdp_uuid = UUID_SERVCLASS_AUDIO_SINK;
- if(A2D_FindService(UUID_SERVCLASS_AUDIO_SINK, p_scb->peer_addr, &db_params,
+ APPL_TRACE_DEBUG("uuid_int 0x%x, Doing SDP For 0x%x", p_scb->uuid_int, sdp_uuid);
+ if(A2D_FindService(sdp_uuid, p_scb->peer_addr, &db_params,
bta_av_a2d_sdp_cback) == A2D_SUCCESS)
{
return;
@@ -951,7 +1045,7 @@
UINT8 role = BTA_AV_ROLE_AD_INT;
UNUSED(p_data);
- APPL_TRACE_DEBUG0("bta_av_cleanup");
+ APPL_TRACE_DEBUG("bta_av_cleanup");
/* free any buffers */
utl_freebuf((void **) &p_scb->p_cap);
@@ -1021,8 +1115,12 @@
tAVDT_SEP_INFO *p_info;
tAVDT_CFG *p_evt_cfg = &p_data->str_msg.cfg;
UINT8 psc_mask = (p_evt_cfg->psc_mask | p_scb->cfg.psc_mask);
+ UINT8 local_sep; /* sep type of local handle on which connection was received */
+ UINT8 count = 0;
+ tBTA_AV_STR_MSG *p_msg = (tBTA_AV_STR_MSG *)p_data;
UNUSED(p_data);
+ local_sep = bta_av_get_scb_sep_type(p_scb, p_msg->handle);
p_scb->avdt_label = p_data->str_msg.msg.hdr.label;
memcpy(p_scb->cfg.codec_info, p_evt_cfg->codec_info, AVDT_CODEC_SIZE);
p_scb->codec_type = p_evt_cfg->codec_info[BTA_AV_CODEC_TYPE_IDX];
@@ -1048,7 +1146,13 @@
p_info->in_use = 0;
p_info->media_type = p_scb->media_type;
p_info->seid = p_data->str_msg.msg.config_ind.int_seid;
- p_info->tsep = AVDT_TSEP_SNK;
+
+ /* Sep type of Peer will be oppsite role to our local sep */
+ if (local_sep == AVDT_TSEP_SRC)
+ p_info->tsep = AVDT_TSEP_SNK;
+ else if (local_sep == AVDT_TSEP_SNK)
+ p_info->tsep = AVDT_TSEP_SRC;
+
p_scb->role |= BTA_AV_ROLE_AD_ACP;
p_scb->cur_psc_mask = p_evt_cfg->psc_mask;
if (bta_av_cb.features & BTA_AV_FEAT_RCTG)
@@ -1058,14 +1162,30 @@
p_scb->num_seps = 1;
p_scb->sep_info_idx = 0;
- APPL_TRACE_DEBUG3("bta_av_config_ind: SEID: %d use_rc: %d cur_psc_mask:0x%x", p_info->seid, p_scb->use_rc, p_scb->cur_psc_mask);
-
- p_scb->p_cos->setcfg(p_scb->hndl, p_scb->codec_type,
+ APPL_TRACE_DEBUG("bta_av_config_ind: SEID: %d use_rc: %d cur_psc_mask:0x%x", p_info->seid, p_scb->use_rc, p_scb->cur_psc_mask);
+ /* in case of A2DP SINK this is the first time peer data is being sent to co functions */
+ if (local_sep == AVDT_TSEP_SNK)
+ {
+ p_scb->p_cos->setcfg(p_scb->hndl, p_scb->codec_type,
p_evt_cfg->codec_info,
p_info->seid,
p_scb->peer_addr,
p_evt_cfg->num_protect,
- p_evt_cfg->protect_info);
+ p_evt_cfg->protect_info,
+ AVDT_TSEP_SNK,
+ p_msg->handle);
+ }
+ else
+ {
+ p_scb->p_cos->setcfg(p_scb->hndl, p_scb->codec_type,
+ p_evt_cfg->codec_info,
+ p_info->seid,
+ p_scb->peer_addr,
+ p_evt_cfg->num_protect,
+ p_evt_cfg->protect_info,
+ AVDT_TSEP_SRC,
+ p_msg->handle);
+ }
}
}
@@ -1083,7 +1203,7 @@
tBTA_AV_RCB *p_rcb;
UNUSED(p_data);
- APPL_TRACE_DEBUG1("bta_av_disconnect_req conn_lcb: 0x%x", bta_av_cb.conn_lcb);
+ APPL_TRACE_DEBUG("bta_av_disconnect_req conn_lcb: 0x%x", bta_av_cb.conn_lcb);
bta_sys_stop_timer(&bta_av_cb.sig_tmr);
bta_sys_stop_timer(&p_scb->timer);
@@ -1153,12 +1273,22 @@
void bta_av_setconfig_rsp (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data)
{
UINT8 num = p_data->ci_setconfig.num_seid + 1;
+ UINT8 avdt_handle = p_data->ci_setconfig.avdt_handle;
UINT8 *p_seid = p_data->ci_setconfig.p_seid;
int i;
+ UINT8 local_sep;
/* we like this codec_type. find the sep_idx */
- bta_av_adjust_seps_idx(p_scb);
- APPL_TRACE_DEBUG2("bta_av_setconfig_rsp: sep_idx: %d cur_psc_mask:0x%x", p_scb->sep_idx, p_scb->cur_psc_mask);
+ local_sep = bta_av_get_scb_sep_type(p_scb,avdt_handle);
+ bta_av_adjust_seps_idx(p_scb, avdt_handle);
+ APPL_TRACE_DEBUG("bta_av_setconfig_rsp: sep_idx: %d cur_psc_mask:0x%x", p_scb->sep_idx, p_scb->cur_psc_mask);
+
+ if ((AVDT_TSEP_SNK == local_sep) && (p_data->ci_setconfig.err_code == AVDT_SUCCESS) &&
+ (p_scb->seps[p_scb->sep_idx].p_app_data_cback != NULL))
+ p_scb->seps[p_scb->sep_idx].p_app_data_cback(BTA_AV_MEDIA_SINK_CFG_EVT,
+ (tBTA_AV_MEDIA*)p_scb->cfg.codec_info);
+
+
AVDT_ConfigRsp(p_scb->avdt_handle, p_scb->avdt_label, p_data->ci_setconfig.err_code,
p_data->ci_setconfig.category);
@@ -1169,7 +1299,7 @@
p_scb->wait = BTA_AV_WAIT_ACP_CAPS_ON;
if(p_data->ci_setconfig.recfg_needed)
p_scb->role |= BTA_AV_ROLE_SUSPEND_OPT;
- APPL_TRACE_ERROR3("bta_av_setconfig_rsp recfg_needed:%d role:x%x num:%d",
+ APPL_TRACE_DEBUG("bta_av_setconfig_rsp recfg_needed:%d role:x%x num:%d",
p_data->ci_setconfig.recfg_needed, p_scb->role, num);
/* callout module tells BTA the number of "good" SEPs and their SEIDs.
* getcap on these SEID */
@@ -1182,8 +1312,11 @@
if (p_scb->codec_type == BTA_AV_CODEC_SBC || num > 1)
{
/* if SBC is used by the SNK as INT, discover req is not sent in bta_av_config_ind.
- * call disc_res now */
- p_scb->p_cos->disc_res(p_scb->hndl, num, num, p_scb->peer_addr);
+ * call disc_res now */
+ /* this is called in A2DP SRC path only, In case of SINK we don't need it */
+ if (local_sep == AVDT_TSEP_SRC)
+ p_scb->p_cos->disc_res(p_scb->hndl, num, num, 0, p_scb->peer_addr,
+ UUID_SERVCLASS_AUDIO_SOURCE);
}
else
{
@@ -1195,14 +1328,22 @@
for (i = 1; i < num; i++)
{
- APPL_TRACE_DEBUG2("sep_info[%d] SEID: %d", i, p_seid[i-1]);
+ APPL_TRACE_DEBUG("sep_info[%d] SEID: %d", i, p_seid[i-1]);
/* initialize the sep_info[] to get capabilities */
p_scb->sep_info[i].in_use = FALSE;
p_scb->sep_info[i].tsep = AVDT_TSEP_SNK;
p_scb->sep_info[i].media_type = p_scb->media_type;
p_scb->sep_info[i].seid = p_seid[i-1];
}
- bta_av_next_getcap(p_scb, p_data);
+
+ /* only in case of local sep as SRC we need to look for other SEPs, In case of SINK we don't */
+ if (local_sep == AVDT_TSEP_SRC)
+ {
+ /* Make sure UUID has been initialized... */
+ if (p_scb->uuid_int == 0)
+ p_scb->uuid_int = p_scb->open_api.uuid;
+ bta_av_next_getcap(p_scb, p_data);
+ }
}
}
@@ -1233,7 +1374,7 @@
p_scb->stream_mtu = p_data->str_msg.msg.open_ind.peer_mtu - AVDT_MEDIA_HDR_SIZE;
mtu = bta_av_chk_mtu(p_scb, p_scb->stream_mtu);
- APPL_TRACE_DEBUG3("bta_av_str_opened l2c_cid: 0x%x stream_mtu: %d mtu: %d",
+ APPL_TRACE_DEBUG("bta_av_str_opened l2c_cid: 0x%x stream_mtu: %d mtu: %d",
p_scb->l2c_cid, p_scb->stream_mtu, mtu);
if(mtu == 0 || mtu > p_scb->stream_mtu)
mtu = p_scb->stream_mtu;
@@ -1275,6 +1416,11 @@
#if( defined BTA_AR_INCLUDED ) && (BTA_AR_INCLUDED == TRUE)
bta_ar_avdt_conn(BTA_ID_AV, open.bd_addr);
#endif
+ if (p_scb->seps[p_scb->sep_idx].tsep == AVDT_TSEP_SRC )
+ open.sep = AVDT_TSEP_SNK;
+ else if (p_scb->seps[p_scb->sep_idx].tsep == AVDT_TSEP_SNK )
+ open.sep = AVDT_TSEP_SRC;
+
(*bta_av_cb.p_cback)(BTA_AV_OPEN_EVT, (tBTA_AV *) &open);
if(open.starting)
{
@@ -1303,7 +1449,7 @@
protect_req.chnl = p_scb->chnl;
protect_req.hndl = p_scb->hndl;
/*
- APPL_TRACE_EVENT1("sec ind handle: x%x", protect_req.hndl);
+ APPL_TRACE_EVENT("sec ind handle: x%x", protect_req.hndl);
*/
protect_req.p_data = p_data->str_msg.msg.security_ind.p_data;
protect_req.len = p_data->str_msg.msg.security_ind.len;
@@ -1398,7 +1544,7 @@
{
/* SNK initiated L2C connection while SRC was doing SDP. */
/* Wait until timeout to check if SNK starts signalling. */
- APPL_TRACE_EVENT1("bta_av_connect_req: coll_mask = 0x%2X", p_scb->coll_mask);
+ APPL_TRACE_EVENT("bta_av_connect_req: coll_mask = 0x%2X", p_scb->coll_mask);
return;
}
@@ -1436,8 +1582,11 @@
*******************************************************************************/
void bta_av_disc_results (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data)
{
- UINT8 num_snks = 0, i;
+ UINT8 num_snks = 0, num_srcs =0, i;
+ /* our uuid in case we initiate connection */
+ UINT16 uuid_int = p_scb->uuid_int;
+ APPL_TRACE_DEBUG(" initiator UUID 0x%x", uuid_int);
/* store number of stream endpoints returned */
p_scb->num_seps = p_data->str_msg.msg.discover_cfm.num_seps;
@@ -1445,15 +1594,23 @@
{
/* steam not in use, is a sink, and is audio */
if ((p_scb->sep_info[i].in_use == FALSE) &&
- (p_scb->sep_info[i].tsep == AVDT_TSEP_SNK) &&
(p_scb->sep_info[i].media_type == p_scb->media_type))
{
- num_snks++;
+ if((p_scb->sep_info[i].tsep == AVDT_TSEP_SNK) &&
+ (uuid_int == UUID_SERVCLASS_AUDIO_SOURCE))
+ num_snks++;
+
+ if((p_scb->sep_info[i].tsep == AVDT_TSEP_SRC) &&
+ (uuid_int == UUID_SERVCLASS_AUDIO_SINK))
+ num_srcs++;
+
}
}
- p_scb->p_cos->disc_res(p_scb->hndl, p_scb->num_seps, num_snks, p_scb->peer_addr);
+ p_scb->p_cos->disc_res(p_scb->hndl, p_scb->num_seps, num_snks, num_srcs, p_scb->peer_addr,
+ uuid_int);
p_scb->num_disc_snks = num_snks;
+ p_scb->num_disc_srcs = num_srcs;
/* if we got any */
if (p_scb->num_seps > 0)
@@ -1501,9 +1658,10 @@
num_snks++;
}
}
-
- p_scb->p_cos->disc_res(p_scb->hndl, p_scb->num_seps, num_snks, p_scb->peer_addr);
+ p_scb->p_cos->disc_res(p_scb->hndl, p_scb->num_seps, num_snks, 0, p_scb->peer_addr,
+ UUID_SERVCLASS_AUDIO_SOURCE);
p_scb->num_disc_snks = num_snks;
+ p_scb->num_disc_srcs = 0;
/* if we got any */
if (p_scb->num_seps > 0)
@@ -1537,7 +1695,7 @@
UINT8 old_wait = p_scb->wait;
BOOLEAN getcap_done = FALSE;
- APPL_TRACE_DEBUG3("bta_av_save_caps num_seps:%d sep_info_idx:%d wait:x%x",
+ APPL_TRACE_DEBUG("bta_av_save_caps num_seps:%d sep_info_idx:%d wait:x%x",
p_scb->num_seps, p_scb->sep_info_idx, p_scb->wait);
memcpy(&cfg, p_scb->p_cap, sizeof(tAVDT_CFG));
/* let application know the capability of the SNK */
@@ -1622,7 +1780,7 @@
UINT8 idx;
tBTA_AV_OPEN open;
- APPL_TRACE_DEBUG0("bta_av_open_failed");
+ APPL_TRACE_DEBUG("bta_av_open_failed");
p_scb->open_status = BTA_AV_FAIL_STREAM;
bta_av_cco_close(p_scb, p_data);
@@ -1648,6 +1806,11 @@
/* set the state back to initial state */
bta_av_set_scb_sst_init(p_scb);
+ if (p_scb->seps[p_scb->sep_idx].tsep == AVDT_TSEP_SRC )
+ open.sep = AVDT_TSEP_SNK;
+ else if (p_scb->seps[p_scb->sep_idx].tsep == AVDT_TSEP_SNK )
+ open.sep = AVDT_TSEP_SRC;
+
(*bta_av_cb.p_cback)(BTA_AV_OPEN_EVT, (tBTA_AV *) &open);
}
@@ -1674,6 +1837,7 @@
tAVDT_CFG cfg;
UINT8 media_type;
tAVDT_SEP_INFO *p_info = &p_scb->sep_info[p_scb->sep_info_idx];
+ UINT16 uuid_int; /* UUID for which connection was initiatied */
memcpy(&cfg, &p_scb->cfg, sizeof(tAVDT_CFG));
cfg.num_codec = 1;
@@ -1682,10 +1846,10 @@
memcpy(cfg.protect_info, p_scb->p_cap->protect_info, AVDT_PROTECT_SIZE);
media_type = p_scb->p_cap->codec_info[BTA_AV_MEDIA_TYPE_IDX] >> 4;
- APPL_TRACE_DEBUG1("num_codec %d", p_scb->p_cap->num_codec);
- APPL_TRACE_DEBUG2("media type x%x, x%x", media_type, p_scb->media_type);
+ APPL_TRACE_DEBUG("num_codec %d", p_scb->p_cap->num_codec);
+ APPL_TRACE_DEBUG("media type x%x, x%x", media_type, p_scb->media_type);
#if AVDT_MULTIPLEXING == TRUE
- APPL_TRACE_DEBUG2("mux x%x, x%x", cfg.mux_mask, p_scb->p_cap->mux_mask);
+ APPL_TRACE_DEBUG("mux x%x, x%x", cfg.mux_mask, p_scb->p_cap->mux_mask);
#endif
/* if codec present and we get a codec configuration */
@@ -1697,16 +1861,31 @@
{
#if AVDT_MULTIPLEXING == TRUE
cfg.mux_mask &= p_scb->p_cap->mux_mask;
- APPL_TRACE_DEBUG1("mux_mask used x%x", cfg.mux_mask);
+ APPL_TRACE_DEBUG("mux_mask used x%x", cfg.mux_mask);
#endif
/* save copy of codec type and configuration */
p_scb->codec_type = cfg.codec_info[BTA_AV_CODEC_TYPE_IDX];
memcpy(&p_scb->cfg, &cfg, sizeof(tAVDT_CFG));
- bta_av_adjust_seps_idx(p_scb);
+
+ uuid_int = p_scb->uuid_int;
+ APPL_TRACE_DEBUG(" initiator UUID = 0x%x ", uuid_int);
+ if (uuid_int == UUID_SERVCLASS_AUDIO_SOURCE)
+ bta_av_adjust_seps_idx(p_scb, bta_av_get_scb_handle(p_scb, AVDT_TSEP_SRC));
+ else if (uuid_int == UUID_SERVCLASS_AUDIO_SINK)
+ bta_av_adjust_seps_idx(p_scb, bta_av_get_scb_handle(p_scb, AVDT_TSEP_SNK));
+
/* use only the services peer supports */
cfg.psc_mask &= p_scb->p_cap->psc_mask;
p_scb->cur_psc_mask = cfg.psc_mask;
+ if ((uuid_int == UUID_SERVCLASS_AUDIO_SINK) &&
+ (p_scb->seps[p_scb->sep_idx].p_app_data_cback != NULL))
+ {
+ APPL_TRACE_DEBUG(" Configure Deoder for Sink Connection ");
+ p_scb->seps[p_scb->sep_idx].p_app_data_cback(BTA_AV_MEDIA_SINK_CFG_EVT,
+ (tBTA_AV_MEDIA*)p_scb->cfg.codec_info);
+ }
+
/* open the stream */
AVDT_OpenReq(p_scb->seps[p_scb->sep_idx].av_handle, p_scb->peer_addr,
p_scb->sep_info[p_scb->sep_info_idx].seid, &cfg);
@@ -1738,9 +1917,12 @@
void bta_av_setconfig_rej (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data)
{
tBTA_AV_REJECT reject;
+ UINT8 avdt_handle = p_data->ci_setconfig.avdt_handle;
- APPL_TRACE_DEBUG0("bta_av_setconfig_rej");
- AVDT_ConfigRsp(p_data->str_msg.handle, p_data->str_msg.msg.hdr.label, AVDT_ERR_BAD_STATE, 0);
+ bta_av_adjust_seps_idx(p_scb, avdt_handle);
+ APPL_TRACE_DEBUG("bta_av_setconfig_rej: sep_idx: %d",p_scb->sep_idx);
+ AVDT_ConfigRsp(p_scb->avdt_handle, p_scb->avdt_label, AVDT_ERR_UNSUP_CFG, 0);
+
bdcpy(reject.bd_addr, p_data->str_msg.bd_addr);
reject.hndl = p_scb->hndl;
(*bta_av_cb.p_cback)(BTA_AV_REJECT_EVT, (tBTA_AV *) &reject);
@@ -1793,7 +1975,7 @@
UINT8 policy = HCI_ENABLE_SNIFF_MODE;
UINT8 cur_role;
- APPL_TRACE_DEBUG3("bta_av_do_start sco_occupied:%d, role:x%x, started:%d", bta_av_cb.sco_occupied, p_scb->role, p_scb->started);
+ APPL_TRACE_DEBUG("bta_av_do_start sco_occupied:%d, role:x%x, started:%d", bta_av_cb.sco_occupied, p_scb->role, p_scb->started);
if (bta_av_cb.sco_occupied)
{
bta_av_start_failed(p_scb, p_data);
@@ -1829,7 +2011,7 @@
}
}
}
- APPL_TRACE_DEBUG2("started %d role:x%x", p_scb->started, p_scb->role);
+ APPL_TRACE_DEBUG("started %d role:x%x", p_scb->started, p_scb->role);
}
/*******************************************************************************
@@ -1849,7 +2031,7 @@
BT_HDR *p_buf;
UINT8 policy = HCI_ENABLE_SNIFF_MODE;
- APPL_TRACE_ERROR2("bta_av_str_stopped:audio_open_cnt=%d, p_data %x",
+ APPL_TRACE_ERROR("bta_av_str_stopped:audio_open_cnt=%d, p_data %x",
bta_av_cb.audio_open_cnt, p_data);
bta_sys_idle(BTA_ID_AV, bta_av_cb.audio_open_cnt, p_scb->peer_addr);
@@ -1882,7 +2064,7 @@
if (p_data && p_data->api_stop.suspend)
{
- APPL_TRACE_DEBUG2("suspending: %d, sup:%d", start, p_scb->suspend_sup);
+ APPL_TRACE_DEBUG("suspending: %d, sup:%d", start, p_scb->suspend_sup);
if ((start) && (p_scb->suspend_sup))
{
sus_evt = FALSE;
@@ -1902,7 +2084,7 @@
{
suspend_rsp.status = BTA_AV_SUCCESS;
suspend_rsp.initiator = TRUE;
- APPL_TRACE_EVENT1("bta_av_str_stopped status %d", suspend_rsp.status);
+ APPL_TRACE_EVENT("bta_av_str_stopped status %d", suspend_rsp.status);
/* send STOP_EVT event only if not in reconfiguring state */
if (p_scb->state != BTA_AV_RCFG_SST)
@@ -1930,7 +2112,7 @@
tBTA_AV_RECONFIG evt;
tBTA_AV_API_RCFG *p_rcfg = &p_data->api_reconfig;
- APPL_TRACE_DEBUG4("bta_av_reconfig r:%d, s:%d idx: %d (o:%d)",
+ APPL_TRACE_DEBUG("bta_av_reconfig r:%d, s:%d idx: %d (o:%d)",
p_scb->recfg_sup, p_scb->suspend_sup,
p_scb->rcfg_idx, p_scb->sep_info_idx);
@@ -1976,7 +2158,7 @@
}
else
{
- APPL_TRACE_DEBUG0("Reconfig");
+ APPL_TRACE_DEBUG("Reconfig");
AVDT_ReconfigReq(p_scb->avdt_handle, p_scb->p_cap);
p_scb->p_cap->psc_mask = p_scb->cur_psc_mask;
}
@@ -1984,7 +2166,7 @@
else
{
/* close the stream */
- APPL_TRACE_DEBUG1("close/open num_protect: %d", p_cfg->num_protect);
+ APPL_TRACE_DEBUG("close/open num_protect: %d", p_cfg->num_protect);
if(p_scb->started)
bta_av_str_stopped(p_scb, NULL);
p_scb->started = FALSE;
@@ -2019,7 +2201,7 @@
if (!p_scb->cong)
{
/*
- APPL_TRACE_ERROR1("q: %d", p_scb->l2c_bufs);
+ APPL_TRACE_ERROR("q: %d", p_scb->l2c_bufs);
*/
//Always get the current number of bufs que'd up
p_scb->l2c_bufs = (UINT8)L2CA_FlushChannel (p_scb->l2c_cid, L2CAP_FLUSH_CHANS_GET);
@@ -2055,7 +2237,7 @@
/* There's no need to increment it here, it is always read from L2CAP see above */
/* p_scb->l2c_bufs++; */
/*
- APPL_TRACE_ERROR1("qw: %d", p_scb->l2c_bufs);
+ APPL_TRACE_ERROR("qw: %d", p_scb->l2c_bufs);
*/
/* opt is a bit mask, it could have several options set */
@@ -2118,7 +2300,7 @@
UINT8 policy = HCI_ENABLE_SNIFF_MODE;
UINT8 cur_role;
- APPL_TRACE_DEBUG2("bta_av_start_ok wait:x%x, role:x%x", p_scb->wait, p_scb->role);
+ APPL_TRACE_DEBUG("bta_av_start_ok wait:x%x, role:x%x", p_scb->wait, p_scb->role);
p_scb->started = TRUE;
if (p_scb->sco_suspend)
@@ -2129,6 +2311,13 @@
if (new_role & BTA_AV_ROLE_START_INT)
initiator = TRUE;
+ /* for A2DP SINK we do not send get_caps */
+ if ((p_scb->avdt_handle == p_scb->seps[p_scb->sep_idx].av_handle)
+ &&(p_scb->seps[p_scb->sep_idx].tsep == AVDT_TSEP_SNK))
+ {
+ p_scb->wait &= ~(BTA_AV_WAIT_ACP_CAPS_ON);
+ APPL_TRACE_DEBUG(" Local SEP type is SNK new wait is 0x%x",p_scb->wait);
+ }
if (p_scb->wait & BTA_AV_WAIT_ROLE_SW_FAILED)
{
/* role switch has failed */
@@ -2136,7 +2325,7 @@
p_data = (tBTA_AV_DATA *)&hdr;
hdr.offset = BTA_AV_RS_FAIL;
}
- APPL_TRACE_DEBUG1("wait:x%x", p_scb->wait);
+ APPL_TRACE_DEBUG("wait:x%x", p_scb->wait);
if (p_data && (p_data->hdr.offset != BTA_AV_RS_NONE))
{
@@ -2170,15 +2359,15 @@
p_scb->q_tag = BTA_AV_Q_TAG_START;
}
- if (p_scb->wait & BTA_AV_WAIT_ACP_CAPS_ON)
- {
- p_scb->wait |= BTA_AV_WAIT_ACP_CAPS_STARTED;
- }
-
if (p_scb->wait)
{
- APPL_TRACE_DEBUG2("wait:x%x q_tag:%d- not started", p_scb->wait, p_scb->q_tag);
- return;
+ APPL_TRACE_ERROR("wait:x%x q_tag:%d- not started", p_scb->wait, p_scb->q_tag);
+ /* Clear first bit of p_scb->wait and not to return from this point else
+ * HAL layer gets blocked. And if there is delay in Get Capability response as
+ * first bit of p_scb->wait is cleared hence it ensures bt_av_start_ok is not called
+ * again from bta_av_save_caps.
+ */
+ p_scb->wait &= ~BTA_AV_WAIT_ACP_CAPS_ON;
}
/* tell role manager to check M/S role */
@@ -2243,7 +2432,7 @@
p_scb->p_cos->start(p_scb->hndl, p_scb->codec_type, p_scb->cfg.codec_info, &p_scb->no_rtp_hdr);
p_scb->co_started = TRUE;
- APPL_TRACE_DEBUG3("bta_av_start_ok suspending: %d, role:x%x, init %d",
+ APPL_TRACE_DEBUG("bta_av_start_ok suspending: %d, role:x%x, init %d",
suspend, p_scb->role, initiator);
start.suspending = suspend;
@@ -2322,6 +2511,12 @@
data.open.status = p_scb->open_status;
data.open.chnl = p_scb->chnl;
data.open.hndl = p_scb->hndl;
+
+ if (p_scb->seps[p_scb->sep_idx].tsep == AVDT_TSEP_SRC )
+ data.open.sep = AVDT_TSEP_SNK;
+ else if (p_scb->seps[p_scb->sep_idx].tsep == AVDT_TSEP_SNK )
+ data.open.sep = AVDT_TSEP_SRC;
+
event = BTA_AV_OPEN_EVT;
p_scb->open_status = BTA_AV_SUCCESS;
@@ -2385,7 +2580,7 @@
UINT8 err_code = p_data->str_msg.msg.hdr.err_code;
UINT8 policy = HCI_ENABLE_SNIFF_MODE;
- APPL_TRACE_DEBUG2 ("bta_av_suspend_cfm:audio_open_cnt = %d, err_code = %d",
+ APPL_TRACE_DEBUG ("bta_av_suspend_cfm:audio_open_cnt = %d, err_code = %d",
bta_av_cb.audio_open_cnt, err_code);
if (p_scb->started == FALSE)
@@ -2393,7 +2588,7 @@
/* handle the condition where there is a collision of SUSPEND req from either side
** Second SUSPEND req could be rejected. Do not treat this as a failure
*/
- APPL_TRACE_WARNING1("bta_av_suspend_cfm: already suspended, ignore, err_code %d",
+ APPL_TRACE_WARNING("bta_av_suspend_cfm: already suspended, ignore, err_code %d",
err_code);
return;
}
@@ -2408,7 +2603,7 @@
}
suspend_rsp.status = BTA_AV_FAIL;
- APPL_TRACE_ERROR0 ("bta_av_suspend_cfm: suspend failed, closing connection");
+ APPL_TRACE_ERROR ("bta_av_suspend_cfm: suspend failed, closing connection");
/* SUSPEND failed. Close connection. */
bta_av_ssm_execute(p_scb, BTA_AV_API_CLOSE_EVT, NULL);
@@ -2465,7 +2660,7 @@
UNUSED(p_data);
p_scb->l2c_cid = AVDT_GetL2CapChannel(p_scb->avdt_handle);
- APPL_TRACE_DEBUG1("bta_av_rcfg_str_ok: l2c_cid: %d", p_scb->l2c_cid);
+ APPL_TRACE_DEBUG("bta_av_rcfg_str_ok: l2c_cid: %d", p_scb->l2c_cid);
/* rc listen */
bta_av_st_rc_timer(p_scb, NULL);
@@ -2498,7 +2693,7 @@
{
tBTA_AV_RECONFIG evt;
- APPL_TRACE_DEBUG2("bta_av_rcfg_failed num_recfg: %d, conn_lcb:0x%x",
+ APPL_TRACE_DEBUG("bta_av_rcfg_failed num_recfg: %d, conn_lcb:0x%x",
p_scb->num_recfg, bta_av_cb.conn_lcb);
if(p_scb->num_recfg > BTA_AV_RECONFIG_RETRY)
{
@@ -2541,7 +2736,7 @@
p_scb->cong = FALSE;
p_scb->num_recfg++;
- APPL_TRACE_DEBUG1("bta_av_rcfg_connect num_recfg: %d", p_scb->num_recfg);
+ APPL_TRACE_DEBUG("bta_av_rcfg_connect num_recfg: %d", p_scb->num_recfg);
if(p_scb->num_recfg > BTA_AV_RECONFIG_RETRY)
{
/* let bta_av_rcfg_failed report fail */
@@ -2565,7 +2760,7 @@
tBTA_AV_RECONFIG evt;
UNUSED(p_data);
- APPL_TRACE_DEBUG1("bta_av_rcfg_discntd num_recfg: %d", p_scb->num_recfg);
+ APPL_TRACE_DEBUG("bta_av_rcfg_discntd num_recfg: %d", p_scb->num_recfg);
p_scb->num_recfg++;
if(p_scb->num_recfg > BTA_AV_RECONFIG_RETRY)
{
@@ -2609,7 +2804,7 @@
}
else
{
- APPL_TRACE_ERROR0("suspend rejected, try close");
+ APPL_TRACE_ERROR("suspend rejected, try close");
/* Disable suspend feature only with explicit rejection(not with timeout) */
if (err_code != AVDT_ERR_TIMEOUT)
{
@@ -2623,7 +2818,7 @@
}
else
{
- APPL_TRACE_DEBUG0("bta_av_suspend_cont calling AVDT_ReconfigReq");
+ APPL_TRACE_DEBUG("bta_av_suspend_cont calling AVDT_ReconfigReq");
/* reconfig the stream */
AVDT_ReconfigReq(p_scb->avdt_handle, p_scb->p_cap);
@@ -2646,11 +2841,11 @@
UINT8 err_code = p_data->str_msg.msg.hdr.err_code;
/*
- APPL_TRACE_DEBUG0("bta_av_rcfg_cfm");
+ APPL_TRACE_DEBUG("bta_av_rcfg_cfm");
*/
if (err_code)
{
- APPL_TRACE_ERROR0("reconfig rejected, try close");
+ APPL_TRACE_ERROR("reconfig rejected, try close");
/* Disable reconfiguration feature only with explicit rejection(not with timeout) */
if (err_code != AVDT_ERR_TIMEOUT)
{
@@ -2683,7 +2878,7 @@
{
UNUSED(p_data);
- APPL_TRACE_DEBUG1("bta_av_rcfg_open, num_disc_snks = %d", p_scb->num_disc_snks);
+ APPL_TRACE_DEBUG("bta_av_rcfg_open, num_disc_snks = %d", p_scb->num_disc_snks);
if (p_scb->num_disc_snks == 0)
{
@@ -2699,7 +2894,7 @@
memcpy(p_scb->cfg.codec_info, p_scb->p_cap->codec_info, AVDT_CODEC_SIZE);
/* we may choose to use a different SEP at reconfig.
* adjust the sep_idx now */
- bta_av_adjust_seps_idx(p_scb);
+ bta_av_adjust_seps_idx(p_scb, bta_av_get_scb_handle(p_scb, AVDT_TSEP_SRC));
/* open the stream with the new config */
p_scb->sep_info_idx = p_scb->rcfg_idx;
@@ -2786,13 +2981,13 @@
{
tBTA_AV_START start;
- APPL_TRACE_DEBUG3("bta_av_open_rc use_rc: %d, wait: x%x role:x%x", p_scb->use_rc, p_scb->wait, p_scb->role);
+ APPL_TRACE_DEBUG("bta_av_open_rc use_rc: %d, wait: x%x role:x%x", p_scb->use_rc, p_scb->wait, p_scb->role);
if ((p_scb->wait & BTA_AV_WAIT_ROLE_SW_BITS) && (p_scb->q_tag == BTA_AV_Q_TAG_START))
{
/* waiting for role switch for some reason & the timer expires */
if (!bta_av_link_role_ok(p_scb, A2D_SET_ONE_BIT))
{
- APPL_TRACE_ERROR0 ("failed to start streaming for role management reasons!!");
+ APPL_TRACE_ERROR ("failed to start streaming for role management reasons!!");
bta_sys_stop_timer(&p_scb->timer);
start.chnl = p_scb->chnl;
start.status = BTA_AV_FAIL_ROLE;
diff --git a/bta/av/bta_av_act.c b/bta/av/bta_av_act.c
old mode 100755
new mode 100644
index 4408874..dfd3662
--- a/bta/av/bta_av_act.c
+++ b/bta/av/bta_av_act.c
@@ -100,7 +100,7 @@
p_scb = bta_av_cb.p_scb[p_rcb->shdl - 1];
if(p_scb)
{
- APPL_TRACE_DEBUG3("bta_av_del_rc shdl:%d, srch:%d rc_handle:%d", p_rcb->shdl,
+ APPL_TRACE_DEBUG("bta_av_del_rc shdl:%d, srch:%d rc_handle:%d", p_rcb->shdl,
p_scb->rc_handle, p_rcb->handle);
if(p_scb->rc_handle == p_rcb->handle)
p_scb->rc_handle = BTA_AV_RC_HANDLE_NONE;
@@ -110,7 +110,7 @@
}
}
- APPL_TRACE_EVENT4("bta_av_del_rc handle: %d status=0x%x, rc_acp_handle:%d, idx:%d",
+ APPL_TRACE_EVENT("bta_av_del_rc handle: %d status=0x%x, rc_acp_handle:%d, idx:%d",
p_rcb->handle, p_rcb->status, bta_av_cb.rc_acp_handle, bta_av_cb.rc_acp_idx);
rc_handle = p_rcb->handle;
if(!(p_rcb->status & BTA_AV_RC_CONN_MASK) ||
@@ -125,7 +125,7 @@
AVRC_Close(rc_handle);
if (rc_handle == bta_av_cb.rc_acp_handle)
bta_av_cb.rc_acp_handle = BTA_AV_RC_HANDLE_NONE;
- APPL_TRACE_EVENT4("end del_rc handle: %d status=0x%x, rc_acp_handle:%d, lidx:%d",
+ APPL_TRACE_EVENT("end del_rc handle: %d status=0x%x, rc_acp_handle:%d, lidx:%d",
p_rcb->handle, p_rcb->status, bta_av_cb.rc_acp_handle, p_rcb->lidx);
}
}
@@ -206,9 +206,9 @@
UNUSED(result);
#if (defined(BTA_AV_MIN_DEBUG_TRACES) && BTA_AV_MIN_DEBUG_TRACES == TRUE)
- APPL_TRACE_EVENT2("rc_ctrl handle: %d event=0x%x", handle, event);
+ APPL_TRACE_EVENT("rc_ctrl handle: %d event=0x%x", handle, event);
#else
- APPL_TRACE_EVENT2("bta_av_rc_ctrl_cback handle: %d event=0x%x", handle, event);
+ APPL_TRACE_EVENT("bta_av_rc_ctrl_cback handle: %d event=0x%x", handle, event);
#endif
if (event == AVRC_OPEN_IND_EVT)
{
@@ -252,9 +252,9 @@
UINT16 data_len = 0;
#if (defined(BTA_AV_MIN_DEBUG_TRACES) && BTA_AV_MIN_DEBUG_TRACES == TRUE)
- APPL_TRACE_ERROR2("rc_msg handle: %d opcode=0x%x", handle, opcode);
+ APPL_TRACE_ERROR("rc_msg handle: %d opcode=0x%x", handle, opcode);
#else
- APPL_TRACE_EVENT2("bta_av_rc_msg_cback handle: %d opcode=0x%x", handle, opcode);
+ APPL_TRACE_EVENT("bta_av_rc_msg_cback handle: %d opcode=0x%x", handle, opcode);
#endif
/* determine size of buffer we need */
if (opcode == AVRC_OP_VENDOR && p_msg->vendor.p_vendor_data != NULL)
@@ -314,7 +314,7 @@
{
if ((p_rcb = bta_av_get_rcb_by_shdl(shdl)) != NULL )
{
- APPL_TRACE_ERROR1("bta_av_rc_create ACP handle exist for shdl:%d", shdl);
+ APPL_TRACE_ERROR("bta_av_rc_create ACP handle exist for shdl:%d", shdl);
return p_rcb->handle;
}
}
@@ -335,7 +335,7 @@
if (p_rcb->handle != BTA_AV_RC_HANDLE_NONE)
{
- APPL_TRACE_ERROR1("bta_av_rc_create found duplicated handle:%d", rc_handle);
+ APPL_TRACE_ERROR("bta_av_rc_create found duplicated handle:%d", rc_handle);
}
p_rcb->handle = rc_handle;
@@ -348,9 +348,9 @@
/* this LIDX is reserved for the AVRCP ACP connection */
p_cb->rc_acp_handle = p_rcb->handle;
p_cb->rc_acp_idx = (i + 1);
- APPL_TRACE_DEBUG2("rc_acp_handle:%d idx:%d", p_cb->rc_acp_handle, p_cb->rc_acp_idx);
+ APPL_TRACE_DEBUG("rc_acp_handle:%d idx:%d", p_cb->rc_acp_handle, p_cb->rc_acp_idx);
}
- APPL_TRACE_DEBUG6("create %d, role: %d, shdl:%d, rc_handle:%d, lidx:%d, status:0x%x",
+ APPL_TRACE_DEBUG("create %d, role: %d, shdl:%d, rc_handle:%d, lidx:%d, status:0x%x",
i, role, shdl, p_rcb->handle, lidx, p_rcb->status);
return rc_handle;
@@ -463,7 +463,7 @@
if(op == BTA_AV_LCB_FREE)
{
p_cb->conn_lcb &= ~mask; /* clear the connect mask */
- APPL_TRACE_DEBUG1("conn_lcb: 0x%x", p_cb->conn_lcb);
+ APPL_TRACE_DEBUG("conn_lcb: 0x%x", p_cb->conn_lcb);
}
break;
}
@@ -498,9 +498,9 @@
if(p_scb && bdcmp(p_scb->peer_addr, p_data->rc_conn_chg.peer_addr) == 0)
{
p_scb->rc_handle = p_data->rc_conn_chg.handle;
- APPL_TRACE_DEBUG2("bta_av_rc_opened shdl:%d, srch %d", i + 1, p_scb->rc_handle);
+ APPL_TRACE_DEBUG("bta_av_rc_opened shdl:%d, srch %d", i + 1, p_scb->rc_handle);
shdl = i+1;
- APPL_TRACE_ERROR1("use_rc:%d", p_scb->use_rc);
+ APPL_TRACE_ERROR("use_rc:%d", p_scb->use_rc);
bta_sys_stop_timer(&p_scb->timer);
disc = p_scb->hndl;
break;
@@ -510,7 +510,7 @@
i = p_data->rc_conn_chg.handle;
if (p_cb->rcb[i].handle == BTA_AV_RC_HANDLE_NONE)
{
- APPL_TRACE_ERROR1("not a valid handle:%d any more", i);
+ APPL_TRACE_ERROR("not a valid handle:%d any more", i);
return;
}
@@ -528,14 +528,14 @@
p_cb->rcb[i].lidx = tmp;
p_cb->rc_acp_handle = p_rcb->handle;
p_cb->rc_acp_idx = (p_rcb - p_cb->rcb) + 1;
- APPL_TRACE_DEBUG2("switching RCB rc_acp_handle:%d idx:%d",
+ APPL_TRACE_DEBUG("switching RCB rc_acp_handle:%d idx:%d",
p_cb->rc_acp_handle, p_cb->rc_acp_idx);
}
}
p_cb->rcb[i].shdl = shdl;
rc_open.rc_handle = i;
- APPL_TRACE_ERROR4("bta_av_rc_opened rcb[%d] shdl:%d lidx:%d/%d",
+ APPL_TRACE_ERROR("bta_av_rc_opened rcb[%d] shdl:%d lidx:%d/%d",
i, shdl, p_cb->rcb[i].lidx, p_cb->lcb[BTA_AV_NUM_LINKS].lidx);
p_cb->rcb[i].status |= BTA_AV_RC_CONN_MASK;
@@ -545,14 +545,14 @@
* update the index to the extra LCB */
p_lcb = &p_cb->lcb[BTA_AV_NUM_LINKS];
bdcpy(p_lcb->addr, p_data->rc_conn_chg.peer_addr);
- APPL_TRACE_DEBUG6("rc_only bd_addr:%02x-%02x-%02x-%02x-%02x-%02x",
+ APPL_TRACE_DEBUG("rc_only bd_addr:%02x-%02x-%02x-%02x-%02x-%02x",
p_lcb->addr[0], p_lcb->addr[1],
p_lcb->addr[2], p_lcb->addr[3],
p_lcb->addr[4], p_lcb->addr[5]);
p_lcb->lidx = BTA_AV_NUM_LINKS + 1;
p_cb->rcb[i].lidx = p_lcb->lidx;
p_lcb->conn_msk = 1;
- APPL_TRACE_ERROR3("rcb[%d].lidx=%d, lcb.conn_msk=x%x",
+ APPL_TRACE_ERROR("rcb[%d].lidx=%d, lcb.conn_msk=x%x",
i, p_cb->rcb[i].lidx, p_lcb->conn_msk);
disc = p_data->rc_conn_chg.handle|BTA_AV_CHNL_MSK;
}
@@ -560,7 +560,7 @@
bdcpy(rc_open.peer_addr, p_data->rc_conn_chg.peer_addr);
rc_open.peer_features = p_cb->rcb[i].peer_features;
rc_open.status = BTA_AV_SUCCESS;
- APPL_TRACE_DEBUG2("local features:x%x peer_features:x%x", p_cb->features,
+ APPL_TRACE_DEBUG("local features:x%x peer_features:x%x", p_cb->features,
rc_open.peer_features);
if(rc_open.peer_features == 0)
{
@@ -777,7 +777,7 @@
/* Metadata messages only use PANEL sub-unit type */
if (p_vendor->hdr.subunit_type != AVRC_SUB_PANEL)
{
- APPL_TRACE_DEBUG0("SUBUNIT must be PANEL");
+ APPL_TRACE_DEBUG("SUBUNIT must be PANEL");
/* reject it */
evt=0;
p_vendor->hdr.ctype = BTA_AV_RSP_NOT_IMPL;
@@ -785,7 +785,7 @@
}
else if (!AVRC_IsValidAvcType(pdu, p_vendor->hdr.ctype) )
{
- APPL_TRACE_DEBUG2("Invalid pdu/ctype: 0x%x, %d", pdu, p_vendor->hdr.ctype);
+ APPL_TRACE_DEBUG("Invalid pdu/ctype: 0x%x, %d", pdu, p_vendor->hdr.ctype);
/* reject invalid message without reporting to app */
evt = 0;
p_rc_rsp->rsp.status = AVRC_STS_BAD_CMD;
@@ -824,7 +824,7 @@
}
else
{
- APPL_TRACE_DEBUG1("Invalid capability ID: 0x%x", u8);
+ APPL_TRACE_DEBUG("Invalid capability ID: 0x%x", u8);
/* reject - unknown capability ID */
p_rc_rsp->get_caps.status = AVRC_STS_BAD_PARAM;
}
@@ -842,7 +842,7 @@
}
}
#else
- APPL_TRACE_DEBUG0("AVRCP 1.3 Metadata not supporteed. Reject command.");
+ APPL_TRACE_DEBUG("AVRCP 1.3 Metadata not supporteed. Reject command.");
/* reject invalid message without reporting to app */
evt = 0;
p_rc_rsp->rsp.status = AVRC_STS_BAD_CMD;
@@ -870,7 +870,7 @@
BOOLEAN is_inquiry = ((p_data->rc_msg.msg.hdr.ctype == AVRC_CMD_SPEC_INQ) || p_data->rc_msg.msg.hdr.ctype == AVRC_CMD_GEN_INQ);
#if (AVRC_METADATA_INCLUDED == TRUE)
tAVRC_STS res;
- UINT8 ctype;
+ UINT8 ctype = 0;
tAVRC_RESPONSE rc_rsp;
rc_rsp.rsp.status = BTA_AV_STS_NO_RSP;
@@ -900,7 +900,7 @@
p_data->rc_msg.msg.hdr.ctype = bta_av_op_supported(p_data->rc_msg.msg.pass.op_id, is_inquiry);
}
- APPL_TRACE_DEBUG1("ctype %d",p_data->rc_msg.msg.hdr.ctype)
+ APPL_TRACE_DEBUG("ctype %d",p_data->rc_msg.msg.hdr.ctype)
/* send response */
if (p_data->rc_msg.msg.hdr.ctype != BTA_AV_RSP_INTERIM)
@@ -1031,7 +1031,7 @@
{
p_rcb = &p_cb->rcb[handle];
- APPL_TRACE_DEBUG2("bta_av_rc_close handle: %d, status=0x%x", p_rcb->handle, p_rcb->status);
+ APPL_TRACE_DEBUG("bta_av_rc_close handle: %d, status=0x%x", p_rcb->handle, p_rcb->status);
if(p_rcb->handle != BTA_AV_RC_HANDLE_NONE)
{
if(p_rcb->shdl)
@@ -1092,7 +1092,7 @@
tBTA_AV_SCB *p_scbi;
started_msk = BTA_AV_HNDL_TO_MSK(p_scb->hdi);
- APPL_TRACE_DEBUG3 ("bta_av_stream_chg started:%d started_msk:x%x chnl:x%x", started,
+ APPL_TRACE_DEBUG ("bta_av_stream_chg started:%d started_msk:x%x chnl:x%x", started,
started_msk, p_scb->chnl);
if (BTA_AV_CHNL_AUDIO == p_scb->chnl)
p_streams = &bta_av_cb.audio_streams;
@@ -1138,7 +1138,7 @@
}
}
- APPL_TRACE_DEBUG4 ("no_streams:%d i:%d, audio_streams:x%x, video_streams:x%x", no_streams, i,
+ APPL_TRACE_DEBUG ("no_streams:%d i:%d, audio_streams:x%x, video_streams:x%x", no_streams, i,
bta_av_cb.audio_streams, bta_av_cb.video_streams);
if (no_streams)
{
@@ -1192,7 +1192,7 @@
if (bta_av_cb.rcb[i].lidx == p_lcb->lidx)
{
bta_av_cb.rcb[i].shdl = index + 1;
- APPL_TRACE_DEBUG5("conn_chg up[%d]: %d, status=0x%x, shdl:%d, lidx:%d", i,
+ APPL_TRACE_DEBUG("conn_chg up[%d]: %d, status=0x%x, shdl:%d, lidx:%d", i,
bta_av_cb.rcb[i].handle, bta_av_cb.rcb[i].status,
bta_av_cb.rcb[i].shdl, bta_av_cb.rcb[i].lidx);
break;
@@ -1217,18 +1217,18 @@
}
- APPL_TRACE_DEBUG2("rc_acp_handle:%d rc_acp_idx:%d", p_cb->rc_acp_handle, p_cb->rc_acp_idx);
+ APPL_TRACE_DEBUG("rc_acp_handle:%d rc_acp_idx:%d", p_cb->rc_acp_handle, p_cb->rc_acp_idx);
/* check if the AVRCP ACP channel is already connected */
if(p_lcb && p_cb->rc_acp_handle != BTA_AV_RC_HANDLE_NONE && p_cb->rc_acp_idx)
{
p_lcb_rc = &p_cb->lcb[BTA_AV_NUM_LINKS];
- APPL_TRACE_DEBUG1("rc_acp is connected && conn_chg on same addr p_lcb_rc->conn_msk:x%x",
+ APPL_TRACE_DEBUG("rc_acp is connected && conn_chg on same addr p_lcb_rc->conn_msk:x%x",
p_lcb_rc->conn_msk);
/* check if the RC is connected to the scb addr */
- APPL_TRACE_DEBUG6 ("p_lcb_rc->addr: %02x:%02x:%02x:%02x:%02x:%02x",
+ APPL_TRACE_DEBUG ("p_lcb_rc->addr: %02x:%02x:%02x:%02x:%02x:%02x",
p_lcb_rc->addr[0], p_lcb_rc->addr[1], p_lcb_rc->addr[2], p_lcb_rc->addr[3],
p_lcb_rc->addr[4], p_lcb_rc->addr[5]);
- APPL_TRACE_DEBUG6 ("conn_chg.peer_addr: %02x:%02x:%02x:%02x:%02x:%02x",
+ APPL_TRACE_DEBUG ("conn_chg.peer_addr: %02x:%02x:%02x:%02x:%02x:%02x",
p_data->conn_chg.peer_addr[0], p_data->conn_chg.peer_addr[1],
p_data->conn_chg.peer_addr[2],
p_data->conn_chg.peer_addr[3], p_data->conn_chg.peer_addr[4],
@@ -1242,7 +1242,7 @@
p_scb->rc_handle = p_cb->rc_acp_handle;
p_rcb = &p_cb->rcb[p_cb->rc_acp_idx - 1];
p_rcb->shdl = bta_av_get_shdl(p_scb);
- APPL_TRACE_DEBUG3("update rc_acp shdl:%d/%d srch:%d", index + 1, p_rcb->shdl,
+ APPL_TRACE_DEBUG("update rc_acp shdl:%d/%d srch:%d", index + 1, p_rcb->shdl,
p_scb->rc_handle );
p_rcb2 = bta_av_get_rcb_by_shdl(p_rcb->shdl);
@@ -1251,14 +1251,14 @@
/* found the RCB that was created to associated with this SCB */
p_cb->rc_acp_handle = p_rcb2->handle;
p_cb->rc_acp_idx = (p_rcb2 - p_cb->rcb) + 1;
- APPL_TRACE_DEBUG2("new rc_acp_handle:%d, idx:%d", p_cb->rc_acp_handle,
+ APPL_TRACE_DEBUG("new rc_acp_handle:%d, idx:%d", p_cb->rc_acp_handle,
p_cb->rc_acp_idx);
p_rcb2->lidx = (BTA_AV_NUM_LINKS + 1);
- APPL_TRACE_DEBUG3("rc2 handle:%d lidx:%d/%d",p_rcb2->handle, p_rcb2->lidx,
+ APPL_TRACE_DEBUG("rc2 handle:%d lidx:%d/%d",p_rcb2->handle, p_rcb2->lidx,
p_cb->lcb[p_rcb2->lidx-1].lidx);
}
p_rcb->lidx = p_lcb->lidx;
- APPL_TRACE_DEBUG3("rc handle:%d lidx:%d/%d",p_rcb->handle, p_rcb->lidx,
+ APPL_TRACE_DEBUG("rc handle:%d lidx:%d/%d",p_rcb->handle, p_rcb->lidx,
p_cb->lcb[p_rcb->lidx-1].lidx);
}
}
@@ -1297,10 +1297,10 @@
}
}
- APPL_TRACE_DEBUG1("bta_av_conn_chg shdl:%d", index + 1);
+ APPL_TRACE_DEBUG("bta_av_conn_chg shdl:%d", index + 1);
for (i=0; i<BTA_AV_NUM_RCB; i++)
{
- APPL_TRACE_DEBUG5("conn_chg dn[%d]: %d, status=0x%x, shdl:%d, lidx:%d", i,
+ APPL_TRACE_DEBUG("conn_chg dn[%d]: %d, status=0x%x, shdl:%d, lidx:%d", i,
bta_av_cb.rcb[i].handle, bta_av_cb.rcb[i].status,
bta_av_cb.rcb[i].shdl, bta_av_cb.rcb[i].lidx);
if(bta_av_cb.rcb[i].shdl == index + 1)
@@ -1322,7 +1322,7 @@
bta_av_rc_create(&bta_av_cb, AVCT_ACP, 0, BTA_AV_NUM_LINKS + 1);
}
- APPL_TRACE_DEBUG6("bta_av_conn_chg audio:%x video:%x up:%d conn_msk:0x%x chk_restore:%d audio_open_cnt:%d",
+ APPL_TRACE_DEBUG("bta_av_conn_chg audio:%x video:%x up:%d conn_msk:0x%x chk_restore:%d audio_open_cnt:%d",
p_cb->conn_audio, p_cb->conn_video, p_data->conn_chg.is_up, conn_msk, chk_restore, p_cb->audio_open_cnt);
if (chk_restore)
@@ -1417,7 +1417,7 @@
UINT8 mask;
tBTA_AV_LCB *p_lcb = NULL;
- APPL_TRACE_DEBUG1("bta_av_sig_chg event: %d", event);
+ APPL_TRACE_DEBUG("bta_av_sig_chg event: %d", event);
if(event == AVDT_CONNECT_IND_EVT)
{
p_lcb = bta_av_find_lcb(p_data->str_msg.bd_addr, BTA_AV_LCB_FIND);
@@ -1427,7 +1427,7 @@
for(xx=0; xx<BTA_AV_NUM_LINKS; xx++)
{
mask = 1 << xx;
- APPL_TRACE_DEBUG1("conn_lcb: 0x%x", p_cb->conn_lcb);
+ APPL_TRACE_DEBUG("conn_lcb: 0x%x", p_cb->conn_lcb);
/* look for a p_lcb with its p_scb registered */
if((!(mask & p_cb->conn_lcb)) && (p_cb->p_scb[xx] != NULL))
@@ -1443,10 +1443,10 @@
}
/* this entry is not used yet. */
p_cb->conn_lcb |= mask; /* mark it as used */
- APPL_TRACE_DEBUG1("start sig timer %d", p_data->hdr.offset);
+ APPL_TRACE_DEBUG("start sig timer %d", p_data->hdr.offset);
if (p_data->hdr.offset == AVDT_ACP)
{
- APPL_TRACE_DEBUG1("Incoming L2CAP acquired, set state as incoming", NULL);
+ APPL_TRACE_DEBUG("Incoming L2CAP acquired, set state as incoming", NULL);
bdcpy(p_cb->p_scb[xx]->peer_addr, p_data->str_msg.bd_addr);
p_cb->p_scb[xx]->use_rc = TRUE; /* allowing RC for incoming connection */
bta_av_ssm_execute(p_cb->p_scb[xx], BTA_AV_ACP_CONNECT_EVT, p_data);
@@ -1474,7 +1474,7 @@
{
/* We do not have scb for this avdt connection. */
/* Silently close the connection. */
- APPL_TRACE_ERROR0("av scb not available for avdt connection");
+ APPL_TRACE_ERROR("av scb not available for avdt connection");
AVDT_DisconnectReq (p_data->str_msg.bd_addr, NULL);
return;
}
@@ -1492,7 +1492,7 @@
p_lcb = bta_av_find_lcb(p_data->str_msg.bd_addr, BTA_AV_LCB_FREE);
if(p_lcb && p_lcb->conn_msk)
{
- APPL_TRACE_DEBUG1("conn_msk: 0x%x", p_lcb->conn_msk);
+ APPL_TRACE_DEBUG("conn_msk: 0x%x", p_lcb->conn_msk);
/* clean up ssm */
for(xx=0; xx < BTA_AV_NUM_STRS; xx++)
{
@@ -1505,7 +1505,7 @@
}
}
}
- APPL_TRACE_DEBUG1("conn_lcb: 0x%x", p_cb->conn_lcb);
+ APPL_TRACE_DEBUG("conn_lcb: 0x%x", p_cb->conn_lcb);
}
/*******************************************************************************
@@ -1528,7 +1528,7 @@
tBTA_AV_PEND pend;
UNUSED(p_data);
- APPL_TRACE_DEBUG0("bta_av_sig_timer");
+ APPL_TRACE_DEBUG("bta_av_sig_timer");
for(xx=0; xx<BTA_AV_NUM_LINKS; xx++)
{
mask = 1 << xx;
@@ -1565,7 +1565,7 @@
if (p_scb)
{
- APPL_TRACE_DEBUG1("bta_av_acp_sig_timer_cback, coll_mask = 0x%02X", p_scb->coll_mask);
+ APPL_TRACE_DEBUG("bta_av_acp_sig_timer_cback, coll_mask = 0x%02X", p_scb->coll_mask);
if (p_scb->coll_mask & BTA_AV_COLL_INC_TMR)
{
@@ -1628,7 +1628,7 @@
UINT16 peer_rc_version=0;
UINT16 categories = 0;
- APPL_TRACE_DEBUG1("bta_av_check_peer_features service_uuid:x%x", service_uuid);
+ APPL_TRACE_DEBUG("bta_av_check_peer_features service_uuid:x%x", service_uuid);
/* loop through all records we found */
while (TRUE)
{
@@ -1655,7 +1655,7 @@
{
/* get profile version (if failure, version parameter is not updated) */
SDP_FindProfileVersionInRec(p_rec, UUID_SERVCLASS_AV_REMOTE_CONTROL, &peer_rc_version);
- APPL_TRACE_DEBUG1("peer_rc_version 0x%x", peer_rc_version);
+ APPL_TRACE_DEBUG("peer_rc_version 0x%x", peer_rc_version);
if (peer_rc_version >= AVRC_REV_1_3)
peer_features |= (BTA_AV_FEAT_VENDOR | BTA_AV_FEAT_METADATA);
@@ -1674,7 +1674,7 @@
}
}
}
- APPL_TRACE_DEBUG1("peer_features:x%x", peer_features);
+ APPL_TRACE_DEBUG("peer_features:x%x", peer_features);
return peer_features;
}
@@ -1699,7 +1699,7 @@
tBTA_AV_FEAT peer_features; /* peer features mask */
UNUSED(p_data);
- APPL_TRACE_DEBUG1("bta_av_rc_disc_done disc:x%x", p_cb->disc);
+ APPL_TRACE_DEBUG("bta_av_rc_disc_done disc:x%x", p_cb->disc);
if (!p_cb->disc)
{
return;
@@ -1722,7 +1722,7 @@
}
}
- APPL_TRACE_DEBUG1("rc_handle %d", rc_handle);
+ APPL_TRACE_DEBUG("rc_handle %d", rc_handle);
/* check peer version and whether support CT and TG role */
peer_features = bta_av_check_peer_features (UUID_SERVCLASS_AV_REMOTE_CONTROL);
if ((p_cb->features & BTA_AV_FEAT_ADV_CTRL) && ((peer_features&BTA_AV_FEAT_ADV_CTRL) == 0))
@@ -1735,7 +1735,7 @@
p_cb->disc = 0;
utl_freebuf((void **) &p_cb->p_disc_db);
- APPL_TRACE_DEBUG2("peer_features 0x%x, features 0x%x", peer_features, p_cb->features);
+ APPL_TRACE_DEBUG("peer_features 0x%x, features 0x%x", peer_features, p_cb->features);
/* if we have no rc connection */
if (rc_handle == BTA_AV_RC_HANDLE_NONE)
@@ -1755,7 +1755,7 @@
#if (BT_USE_TRACES == TRUE || BT_TRACE_APPL == TRUE)
else
{
- APPL_TRACE_ERROR0("can not find LCB!!");
+ APPL_TRACE_ERROR("can not find LCB!!");
}
#endif
}
@@ -1800,17 +1800,17 @@
tBTA_AV_LCB *p_lcb;
rc_close.rc_handle = BTA_AV_RC_HANDLE_NONE;
- APPL_TRACE_DEBUG1("bta_av_rc_closed rc_handle:%d", p_msg->handle);
+ APPL_TRACE_DEBUG("bta_av_rc_closed rc_handle:%d", p_msg->handle);
for(i=0; i<BTA_AV_NUM_RCB; i++)
{
p_rcb = &p_cb->rcb[i];
- APPL_TRACE_DEBUG3("bta_av_rc_closed rcb[%d] rc_handle:%d, status=0x%x", i, p_rcb->handle, p_rcb->status);
+ APPL_TRACE_DEBUG("bta_av_rc_closed rcb[%d] rc_handle:%d, status=0x%x", i, p_rcb->handle, p_rcb->status);
if(p_rcb->handle == p_msg->handle)
{
rc_close.rc_handle = i;
p_rcb->status &= ~BTA_AV_RC_CONN_MASK;
p_rcb->peer_features = 0;
- APPL_TRACE_DEBUG2(" shdl:%d, lidx:%d", p_rcb->shdl, p_rcb->lidx);
+ APPL_TRACE_DEBUG(" shdl:%d, lidx:%d", p_rcb->shdl, p_rcb->lidx);
if(p_rcb->shdl)
{
p_scb = bta_av_cb.p_scb[p_rcb->shdl - 1];
@@ -1819,7 +1819,7 @@
bdcpy(rc_close.peer_addr, p_scb->peer_addr);
if(p_scb->rc_handle == p_rcb->handle)
p_scb->rc_handle = BTA_AV_RC_HANDLE_NONE;
- APPL_TRACE_DEBUG2("shdl:%d, srch:%d", p_rcb->shdl, p_scb->rc_handle);
+ APPL_TRACE_DEBUG("shdl:%d, srch:%d", p_rcb->shdl, p_scb->rc_handle);
}
p_rcb->shdl = 0;
}
@@ -1828,7 +1828,7 @@
/* if the RCB uses the extra LCB, use the addr for event and clean it */
p_lcb = &p_cb->lcb[BTA_AV_NUM_LINKS];
bdcpy(rc_close.peer_addr, p_msg->peer_addr);
- APPL_TRACE_DEBUG6("rc_only closed bd_addr:%02x-%02x-%02x-%02x-%02x-%02x",
+ APPL_TRACE_DEBUG("rc_only closed bd_addr:%02x-%02x-%02x-%02x-%02x-%02x",
p_msg->peer_addr[0], p_msg->peer_addr[1],
p_msg->peer_addr[2], p_msg->peer_addr[3],
p_msg->peer_addr[4], p_msg->peer_addr[5]);
@@ -1895,7 +1895,7 @@
UINT8 *p_addr = NULL;
UINT8 rc_handle;
- APPL_TRACE_DEBUG2("bta_av_rc_disc 0x%x, %d", disc, bta_av_cb.disc);
+ APPL_TRACE_DEBUG("bta_av_rc_disc 0x%x, %d", disc, bta_av_cb.disc);
if ((bta_av_cb.disc != 0) || (disc == 0))
return;
@@ -1915,7 +1915,7 @@
if (p_scb)
{
- APPL_TRACE_DEBUG1("rc_handle %d", p_scb->rc_handle);
+ APPL_TRACE_DEBUG("rc_handle %d", p_scb->rc_handle);
p_addr = p_scb->peer_addr;
}
}
@@ -1941,7 +1941,7 @@
bta_av_avrc_sdp_cback) == AVRC_SUCCESS)
{
p_cb->disc = disc;
- APPL_TRACE_DEBUG1("disc %d", p_cb->disc);
+ APPL_TRACE_DEBUG("disc %d", p_cb->disc);
}
}
}
@@ -1969,7 +1969,7 @@
if(p_scb)
{
- APPL_TRACE_DEBUG2("deregistered %d(h%d)", p_scb->chnl, p_scb->hndl);
+ APPL_TRACE_DEBUG("deregistered %d(h%d)", p_scb->chnl, p_scb->hndl);
mask = BTA_AV_HNDL_TO_MSK(p_scb->hdi);
if(p_scb->chnl == BTA_AV_CHNL_AUDIO)
{
@@ -1996,6 +1996,11 @@
#endif
bta_av_del_sdp_rec(&p_cb->sdp_a2d_handle);
bta_sys_remove_uuid(UUID_SERVCLASS_AUDIO_SOURCE);
+
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+ bta_av_del_sdp_rec(&p_cb->sdp_a2d_snk_handle);
+ bta_sys_remove_uuid(UUID_SERVCLASS_AUDIO_SINK);
+#endif
}
}
else
@@ -2013,7 +2018,7 @@
utl_freebuf((void **)&p_cb->p_scb[p_scb->hdi]);
}
- APPL_TRACE_DEBUG3("audio 0x%x, video: 0x%x, disable:%d",
+ APPL_TRACE_DEBUG("audio 0x%x, video: 0x%x, disable:%d",
p_cb->reg_audio, p_cb->reg_video, p_cb->disabling);
/* if no stream control block is active */
if((p_cb->reg_audio + p_cb->reg_video) == 0)
diff --git a/bta/av/bta_av_api.c b/bta/av/bta_av_api.c
index 98718fd..5aa401b 100644
--- a/bta/av/bta_av_api.c
+++ b/bta/av/bta_av_api.c
@@ -63,9 +63,7 @@
tBTA_AV_API_ENABLE *p_buf;
/* register with BTA system manager */
- GKI_sched_lock();
bta_sys_register(BTA_ID_AV, &bta_av_reg);
- GKI_sched_unlock();
if ((p_buf = (tBTA_AV_API_ENABLE *) GKI_getbuf(sizeof(tBTA_AV_API_ENABLE))) != NULL)
{
@@ -111,7 +109,7 @@
** Returns void
**
*******************************************************************************/
-void BTA_AvRegister(tBTA_AV_CHNL chnl, const char *p_service_name, UINT8 app_id)
+void BTA_AvRegister(tBTA_AV_CHNL chnl, const char *p_service_name, UINT8 app_id, tBTA_AV_DATA_CBACK *p_data_cback)
{
tBTA_AV_API_REG *p_buf;
@@ -130,6 +128,7 @@
p_buf->p_service_name[0] = 0;
}
p_buf->app_id = app_id;
+ p_buf->p_app_data_cback = p_data_cback;
bta_sys_sendmsg(p_buf);
}
}
@@ -166,7 +165,8 @@
** Returns void
**
*******************************************************************************/
-void BTA_AvOpen(BD_ADDR bd_addr, tBTA_AV_HNDL handle, BOOLEAN use_rc, tBTA_SEC sec_mask)
+void BTA_AvOpen(BD_ADDR bd_addr, tBTA_AV_HNDL handle, BOOLEAN use_rc, tBTA_SEC sec_mask,
+ UINT16 uuid)
{
tBTA_AV_API_OPEN *p_buf;
@@ -178,6 +178,7 @@
p_buf->use_rc = use_rc;
p_buf->sec_mask = sec_mask;
p_buf->switch_res = BTA_AV_RS_NONE;
+ p_buf->uuid = uuid;
bta_sys_sendmsg(p_buf);
}
}
@@ -246,6 +247,31 @@
/*******************************************************************************
**
+** Function BTA_AvEnable_Sink
+**
+** Description Enable/Disable A2DP Sink..
+**
+** Returns void
+**
+*******************************************************************************/
+void BTA_AvEnable_Sink(int enable)
+{
+ BT_HDR *p_buf;
+
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+ if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
+ {
+ p_buf->event = BTA_AV_API_SINK_ENABLE_EVT;
+ p_buf->layer_specific = enable;
+ bta_sys_sendmsg(p_buf);
+ }
+#else
+ return;
+#endif
+}
+
+/*******************************************************************************
+**
** Function BTA_AvStop
**
** Description Stop audio/video stream data transfer.
diff --git a/bta/av/bta_av_cfg.c b/bta/av/bta_av_cfg.c
old mode 100755
new mode 100644
diff --git a/bta/av/bta_av_ci.c b/bta/av/bta_av_ci.c
index a1c2ac0..2da1d97 100644
--- a/bta/av/bta_av_ci.c
+++ b/bta/av/bta_av_ci.c
@@ -68,7 +68,7 @@
**
*******************************************************************************/
void bta_av_ci_setconfig(tBTA_AV_HNDL hndl, UINT8 err_code, UINT8 category,
- UINT8 num_seid, UINT8 *p_seid, BOOLEAN recfg_needed)
+ UINT8 num_seid, UINT8 *p_seid, BOOLEAN recfg_needed, UINT8 avdt_handle)
{
tBTA_AV_CI_SETCONFIG *p_buf;
@@ -81,6 +81,7 @@
p_buf->category = category;
p_buf->recfg_needed = recfg_needed;
p_buf->num_seid = num_seid;
+ p_buf->avdt_handle= avdt_handle;
if(p_seid && num_seid)
{
p_buf->p_seid = (UINT8 *)(p_buf + 1);
diff --git a/bta/av/bta_av_int.h b/bta/av/bta_av_int.h
index cd22bcb..5deed76 100644
--- a/bta/av/bta_av_int.h
+++ b/bta/av/bta_av_int.h
@@ -96,6 +96,9 @@
BTA_AV_AVRC_CLOSE_EVT,
BTA_AV_CONN_CHG_EVT,
BTA_AV_DEREG_COMP_EVT,
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+ BTA_AV_API_SINK_ENABLE_EVT,
+#endif
#if (AVDT_REPORTING == TRUE)
BTA_AV_AVDT_RPT_CONN_EVT,
#endif
@@ -156,16 +159,15 @@
/* function types for call-out functions */
typedef BOOLEAN (*tBTA_AV_CO_INIT) (UINT8 *p_codec_type, UINT8 *p_codec_info,
UINT8 *p_num_protect, UINT8 *p_protect_info, UINT8 index);
-
typedef void (*tBTA_AV_CO_DISC_RES) (tBTA_AV_HNDL hndl, UINT8 num_seps,
- UINT8 num_snk, BD_ADDR addr);
-
+ UINT8 num_snk, UINT8 num_src, BD_ADDR addr, UINT16 uuid_local);
typedef UINT8 (*tBTA_AV_CO_GETCFG) (tBTA_AV_HNDL hndl, tBTA_AV_CODEC codec_type,
UINT8 *p_codec_info, UINT8 *p_sep_info_idx, UINT8 seid,
UINT8 *p_num_protect, UINT8 *p_protect_info);
typedef void (*tBTA_AV_CO_SETCFG) (tBTA_AV_HNDL hndl, tBTA_AV_CODEC codec_type,
- UINT8 *p_codec_info, UINT8 seid, BD_ADDR addr,
- UINT8 num_protect, UINT8 *p_protect_info);
+ UINT8 *p_codec_info, UINT8 seid, BD_ADDR addr,
+ UINT8 num_protect, UINT8 *p_protect_info,
+ UINT8 t_local_sep, UINT8 avdt_handle);
typedef void (*tBTA_AV_CO_OPEN) (tBTA_AV_HNDL hndl,
tBTA_AV_CODEC codec_type, UINT8 *p_codec_info,
UINT16 mtu);
@@ -206,6 +208,7 @@
BT_HDR hdr;
char p_service_name[BTA_SERVICE_NAME_LEN+1];
UINT8 app_id;
+ tBTA_AV_DATA_CBACK *p_app_data_cback;
} tBTA_AV_API_REG;
@@ -225,6 +228,7 @@
BOOLEAN use_rc;
tBTA_SEC sec_mask;
tBTA_AV_RS_RES switch_res;
+ UINT16 uuid; /* uuid of initiator */
} tBTA_AV_API_OPEN;
/* data type for BTA_AV_API_STOP_EVT */
@@ -319,6 +323,7 @@
UINT8 num_seid;
UINT8 *p_seid;
BOOLEAN recfg_needed;
+ UINT8 avdt_handle; /* local sep type for which this stream will be set up */
} tBTA_AV_CI_SETCONFIG;
/* data type for all stream events from AVDTP */
@@ -376,8 +381,10 @@
/* type for SEP control block */
typedef struct
{
- UINT8 av_handle; /* AVDTP handle */
- tBTA_AV_CODEC codec_type; /* codec type */
+ UINT8 av_handle; /* AVDTP handle */
+ tBTA_AV_CODEC codec_type; /* codec type */
+ UINT8 tsep; /* SEP type of local SEP */
+ tBTA_AV_DATA_CBACK *p_app_data_cback; /* Application callback for media packets */
} tBTA_AV_SEP;
@@ -483,6 +490,7 @@
UINT8 hdi; /* the index to SCB[] */
UINT8 num_seps; /* number of seps returned by stream discovery */
UINT8 num_disc_snks; /* number of discovered snks */
+ UINT8 num_disc_srcs; /* number of discovered srcs */
UINT8 sep_info_idx; /* current index into sep_info */
UINT8 sep_idx; /* current index into local seps[] */
UINT8 rcfg_idx; /* reconfig requested index into sep_info */
@@ -505,6 +513,7 @@
UINT8 wait; /* set 0x1, when getting Caps as ACP, set 0x2, when started */
UINT8 q_tag; /* identify the associated q_info union member */
BOOLEAN no_rtp_hdr; /* TRUE if add no RTP header*/
+ UINT16 uuid_int; /*intended UUID of Initiator to connect to */
} tBTA_AV_SCB;
#define BTA_AV_RC_ROLE_MASK 0x10
@@ -554,6 +563,9 @@
TIMER_LIST_ENT sig_tmr; /* link timer */
TIMER_LIST_ENT acp_sig_tmr; /* timer to monitor signalling when accepting */
UINT32 sdp_a2d_handle; /* SDP record handle for audio src */
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+ UINT32 sdp_a2d_snk_handle; /* SDP record handle for audio snk */
+#endif
UINT32 sdp_vdp_handle; /* SDP record handle for video src */
tBTA_AV_FEAT features; /* features mask */
tBTA_SEC sec_mask; /* security mask */
@@ -601,6 +613,7 @@
extern const tBTA_AV_CO_FUNCTS bta_av_a2d_cos;
extern const tBTA_AV_SACT bta_av_vdp_action[];
extern tAVDT_CTRL_CBACK * const bta_av_dt_cback[];
+extern void bta_av_stream_data_cback(UINT8 handle, BT_HDR *p_pkt, UINT32 time_stamp, UINT8 m_pt);
/*****************************************************************************
** Function prototypes
diff --git a/bta/av/bta_av_main.c b/bta/av/bta_av_main.c
index 25c40a5..a8544c4 100644
--- a/bta/av/bta_av_main.c
+++ b/bta/av/bta_av_main.c
@@ -41,6 +41,8 @@
*****************************************************************************/
/* AVDTP protocol timeout values */
+#define BTIF_AVK_SERVICE_NAME "Advanced Audio Sink"
+
#ifndef BTA_AV_RET_TOUT
#define BTA_AV_RET_TOUT 4
#endif
@@ -150,6 +152,9 @@
typedef void (*tBTA_AV_NSM_ACT)(tBTA_AV_DATA *p_data);
static void bta_av_api_enable(tBTA_AV_DATA *p_data);
static void bta_av_api_register(tBTA_AV_DATA *p_data);
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+static void bta_av_api_sink_enable(tBTA_AV_DATA *p_data);
+#endif
static void bta_av_ci_data(tBTA_AV_DATA *p_data);
#if (AVDT_REPORTING == TRUE)
static void bta_av_rpc_conn(tBTA_AV_DATA *p_data);
@@ -175,6 +180,9 @@
bta_av_rc_closed, /* BTA_AV_AVRC_CLOSE_EVT */
bta_av_conn_chg, /* BTA_AV_CONN_CHG_EVT */
bta_av_dereg_comp, /* BTA_AV_DEREG_COMP_EVT */
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+ bta_av_api_sink_enable, /* BTA_AV_API_SINK_ENABLE_EVT */
+#endif
#if (AVDT_REPORTING == TRUE)
bta_av_rpc_conn, /* BTA_AV_AVDT_RPT_CONN_EVT */
#endif
@@ -342,7 +350,7 @@
{
if(p_bta_av_cfg->p_act_tbl == NULL || p_bta_av_cfg->p_reg == NULL)
{
- APPL_TRACE_ERROR0("Video streaming not supported");
+ APPL_TRACE_ERROR("Video streaming not supported");
sts = BTA_AV_FAIL;
}
else
@@ -350,14 +358,14 @@
/* allow only one Video channel */
if(bta_av_cb.reg_video)
{
- APPL_TRACE_ERROR0("Already registered");
+ APPL_TRACE_ERROR("Already registered");
sts = BTA_AV_FAIL;
}
}
}
else if(chnl != BTA_AV_CHNL_AUDIO)
{
- APPL_TRACE_ERROR1("bad channel: %d", chnl);
+ APPL_TRACE_ERROR("bad channel: %d", chnl);
sts = BTA_AV_FAIL;
}
@@ -407,7 +415,7 @@
#if (defined(BTA_AV_DEBUG) && BTA_AV_DEBUG == TRUE)
else if (AVDT_CONNECT_IND_EVT == event)
{
- APPL_TRACE_DEBUG1("CONN_IND is ACP:%d", p_data->hdr.err_param);
+ APPL_TRACE_DEBUG("CONN_IND is ACP:%d", p_data->hdr.err_param);
}
#endif
@@ -425,10 +433,10 @@
#if (defined(BTA_AV_DEBUG) && BTA_AV_DEBUG == TRUE)
if(p_scb)
{
- APPL_TRACE_DEBUG2("scb hndl x%x, role x%x", p_scb->hndl, p_scb->role);
+ APPL_TRACE_DEBUG("scb hndl x%x, role x%x", p_scb->hndl, p_scb->role);
}
#endif
- APPL_TRACE_DEBUG6("conn_cback bd_addr:%02x-%02x-%02x-%02x-%02x-%02x",
+ APPL_TRACE_DEBUG("conn_cback bd_addr:%02x-%02x-%02x-%02x-%02x-%02x",
bd_addr[0], bd_addr[1],
bd_addr[2], bd_addr[3],
bd_addr[4], bd_addr[5]);
@@ -459,6 +467,49 @@
}
#endif
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+/*******************************************************************************
+**
+** Function bta_av_api_sink_enable
+**
+** Description activate, deactive A2DP Sink,
+**
+** Returns void
+**
+*******************************************************************************/
+
+static void bta_av_api_sink_enable(tBTA_AV_DATA *p_data)
+{
+ UINT16 activate_sink = 0;
+ activate_sink = p_data->hdr.layer_specific;
+ APPL_TRACE_DEBUG("bta_av_api_sink_enable %d ", activate_sink)
+ char p_service_name[BTA_SERVICE_NAME_LEN+1];
+ BCM_STRNCPY_S(p_service_name, sizeof(p_service_name),
+ BTIF_AVK_SERVICE_NAME, BTA_SERVICE_NAME_LEN);
+
+ if(activate_sink)
+ {
+ AVDT_SINK_Activate();
+ if (bta_av_cb.sdp_a2d_snk_handle == 0)
+ {
+ bta_av_cb.sdp_a2d_snk_handle = SDP_CreateRecord();
+ A2D_AddRecord(UUID_SERVCLASS_AUDIO_SINK, p_service_name, NULL,
+ A2D_SUPF_PLAYER, bta_av_cb.sdp_a2d_snk_handle);
+ bta_sys_add_uuid(UUID_SERVCLASS_AUDIO_SINK);
+ }
+ }
+ else
+ {
+ AVDT_SINK_Deactivate();
+ if (bta_av_cb.sdp_a2d_snk_handle != 0)
+ {
+ SDP_DeleteRecord(bta_av_cb.sdp_a2d_snk_handle);
+ bta_av_cb.sdp_a2d_snk_handle = 0;
+ bta_sys_remove_uuid(UUID_SERVCLASS_AUDIO_SINK);
+ }
+ }
+}
+#endif
/*******************************************************************************
**
** Function bta_av_api_register
@@ -480,6 +531,8 @@
tBTA_AV_CODEC codec_type;
tBTA_UTL_COD cod;
UINT8 index = 0;
+ char p_avk_service_name[BTA_SERVICE_NAME_LEN+1];
+ BCM_STRNCPY_S(p_avk_service_name, sizeof(p_avk_service_name), BTIF_AVK_SERVICE_NAME, BTA_SERVICE_NAME_LEN);
memset(&cs,0,sizeof(tAVDT_CS));
@@ -491,7 +544,7 @@
p_scb = bta_av_alloc_scb(registr.chnl);
if(p_scb == NULL)
{
- APPL_TRACE_ERROR0("failed to alloc SCB");
+ APPL_TRACE_ERROR("failed to alloc SCB");
break;
}
@@ -534,7 +587,11 @@
}
/* Set the Capturing service class bit */
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+ cod.service = BTM_COD_SERVICE_CAPTURING | BTM_COD_SERVICE_RENDERING;
+#else
cod.service = BTM_COD_SERVICE_CAPTURING;
+#endif
utl_set_device_class(&cod, BTA_UTL_SET_COD_SERVICE_CLASS);
} /* if 1st channel */
@@ -550,7 +607,7 @@
*/
cs.nsc_mask = AVDT_NSC_RECONFIG |
((bta_av_cb.features & BTA_AV_FEAT_PROTECT) ? 0 : AVDT_NSC_SECURITY);
- APPL_TRACE_DEBUG1("nsc_mask: 0x%x", cs.nsc_mask);
+ APPL_TRACE_DEBUG("nsc_mask: 0x%x", cs.nsc_mask);
if (p_data->api_reg.p_service_name[0] == 0)
{
@@ -594,10 +651,28 @@
(*bta_av_a2d_cos.init)(&codec_type, cs.cfg.codec_info,
&cs.cfg.num_protect, cs.cfg.protect_info, index) == TRUE)
{
+
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+ if(index == 1)
+ {
+ cs.tsep = AVDT_TSEP_SNK;
+ cs.p_data_cback = bta_av_stream_data_cback;
+ }
+ APPL_TRACE_DEBUG(" SEP Type = %d",cs.tsep);
+#endif
if(AVDT_CreateStream(&p_scb->seps[index].av_handle, &cs) == AVDT_SUCCESS)
{
p_scb->seps[index].codec_type = codec_type;
- APPL_TRACE_DEBUG3("audio[%d] av_handle: %d codec_type: %d",
+
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+ p_scb->seps[index].tsep = cs.tsep;
+ if(cs.tsep == AVDT_TSEP_SNK)
+ p_scb->seps[index].p_app_data_cback = p_data->api_reg.p_app_data_cback;
+ else
+ p_scb->seps[index].p_app_data_cback = NULL; /* In case of A2DP SOURCE we don't need a callback to handle media packets */
+#endif
+
+ APPL_TRACE_DEBUG("audio[%d] av_handle: %d codec_type: %d",
index, p_scb->seps[index].av_handle, p_scb->seps[index].codec_type);
index++;
}
@@ -613,6 +688,12 @@
A2D_SUPF_PLAYER, bta_av_cb.sdp_a2d_handle);
bta_sys_add_uuid(UUID_SERVCLASS_AUDIO_SOURCE);
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+ bta_av_cb.sdp_a2d_snk_handle = SDP_CreateRecord();
+ A2D_AddRecord(UUID_SERVCLASS_AUDIO_SINK, p_avk_service_name, NULL,
+ A2D_SUPF_PLAYER, bta_av_cb.sdp_a2d_snk_handle);
+ bta_sys_add_uuid(UUID_SERVCLASS_AUDIO_SINK);
+#endif
/* start listening when A2DP is registered */
if (bta_av_cb.features & BTA_AV_FEAT_RCTG)
bta_av_rc_create(&bta_av_cb, AVCT_ACP, 0, BTA_AV_NUM_LINKS + 1);
@@ -641,7 +722,7 @@
}
}
bta_av_cb.reg_audio |= BTA_AV_HNDL_TO_MSK(p_scb->hdi);
- APPL_TRACE_DEBUG1("reg_audio: 0x%x",bta_av_cb.reg_audio);
+ APPL_TRACE_DEBUG("reg_audio: 0x%x",bta_av_cb.reg_audio);
}
else
{
@@ -805,7 +886,7 @@
int i;
UINT8 mask;
- APPL_TRACE_DEBUG1("reg_audio: 0x%x",bta_av_cb.reg_audio);
+ APPL_TRACE_DEBUG("reg_audio: 0x%x",bta_av_cb.reg_audio);
for(i=0; i<BTA_AV_NUM_STRS; i++)
{
mask = BTA_AV_HNDL_TO_MSK(i);
@@ -838,7 +919,7 @@
UINT8 peer_idx = 0;
UNUSED(status);
- APPL_TRACE_DEBUG1("bta_av_sys_rs_cback: %d", bta_av_cb.rs_idx);
+ APPL_TRACE_DEBUG("bta_av_sys_rs_cback: %d", bta_av_cb.rs_idx);
for(i=0; i<BTA_AV_NUM_STRS; i++)
{
/* loop through all the SCBs to find matching peer addresses and report the role change event */
@@ -847,7 +928,7 @@
if (p_scb && (bdcmp (peer_addr, p_scb->peer_addr) == 0) &&
(p_buf = (tBTA_AV_ROLE_RES *) GKI_getbuf(sizeof(tBTA_AV_ROLE_RES))) != NULL)
{
- APPL_TRACE_DEBUG3("new_role:%d, hci_status:x%x hndl: x%x", id, app_id, p_scb->hndl);
+ APPL_TRACE_DEBUG("new_role:%d, hci_status:x%x hndl: x%x", id, app_id, p_scb->hndl);
/*
if ((id != BTM_ROLE_MASTER) && (app_id != HCI_SUCCESS))
{
@@ -879,7 +960,7 @@
p_scb = bta_av_cb.p_scb[bta_av_cb.rs_idx - 1];
if (p_scb && p_scb->q_tag == BTA_AV_Q_TAG_OPEN)
{
- APPL_TRACE_DEBUG3 ("bta_av_sys_rs_cback: rs_idx(%d), hndl:x%x q_tag: %d",
+ APPL_TRACE_DEBUG ("bta_av_sys_rs_cback: rs_idx(%d), hndl:x%x q_tag: %d",
bta_av_cb.rs_idx, p_scb->hndl, p_scb->q_tag);
if(HCI_SUCCESS == app_id || HCI_ERR_NO_CONNECTION == app_id)
@@ -915,7 +996,7 @@
UNUSED(app_id);
UNUSED(peer_addr);
- APPL_TRACE_DEBUG2("bta_av_sco_chg_cback:%d status:%d", id, status);
+ APPL_TRACE_DEBUG("bta_av_sco_chg_cback:%d status:%d", id, status);
if(id)
{
bta_av_cb.sco_occupied = TRUE;
@@ -927,7 +1008,7 @@
if( p_scb && p_scb->co_started && (p_scb->sco_suspend == FALSE))
{
- APPL_TRACE_DEBUG1("suspending scb:%d", i);
+ APPL_TRACE_DEBUG("suspending scb:%d", i);
/* scb is used and started, not suspended automatically */
p_scb->sco_suspend = TRUE;
stop.flush = FALSE;
@@ -946,7 +1027,7 @@
if( p_scb && p_scb->sco_suspend ) /* scb is used and suspended for SCO */
{
- APPL_TRACE_DEBUG1("starting scb:%d", i);
+ APPL_TRACE_DEBUG("starting scb:%d", i);
bta_av_ssm_execute(p_scb, BTA_AV_AP_START_EVT, NULL);
}
}
@@ -1020,7 +1101,7 @@
if (BTM_GetRole(p_scb->peer_addr, &role) == BTM_SUCCESS)
{
- APPL_TRACE_ERROR5("bta_av_link_role_ok hndl:x%x role:%d, conn_audio:x%x, bits:%d, features:x%x", p_scb->hndl, role, bta_av_cb.conn_audio, bits, bta_av_cb.features);
+ APPL_TRACE_ERROR("bta_av_link_role_ok hndl:x%x role:%d, conn_audio:x%x, bits:%d, features:x%x", p_scb->hndl, role, bta_av_cb.conn_audio, bits, bta_av_cb.features);
if (BTM_ROLE_MASTER != role && (A2D_BitsSet(bta_av_cb.conn_audio) > bits || (bta_av_cb.features & BTA_AV_FEAT_MASTER)))
{
if (bta_av_cb.features & BTA_AV_FEAT_MASTER)
@@ -1070,7 +1151,7 @@
if((p_scb != p_scbi) && p_scbi && (p_scbi->chnl == BTA_AV_CHNL_AUDIO) )
{
mask = BTA_AV_HNDL_TO_MSK(i);
- APPL_TRACE_DEBUG3("[%d] mtu: %d, mask:0x%x",
+ APPL_TRACE_DEBUG("[%d] mtu: %d, mask:0x%x",
i, p_scbi->stream_mtu, mask);
if(bta_av_cb.conn_audio & mask)
{
@@ -1080,7 +1161,7 @@
}
}
}
- APPL_TRACE_DEBUG3("bta_av_chk_mtu audio count:%d, conn_audio:0x%x, ret:%d",
+ APPL_TRACE_DEBUG("bta_av_chk_mtu audio count:%d, conn_audio:0x%x, ret:%d",
bta_av_cb.audio_open_cnt, bta_av_cb.conn_audio, ret_mtu);
}
return ret_mtu;
@@ -1153,10 +1234,10 @@
UINT8 action;
#if (defined(BTA_AV_DEBUG) && BTA_AV_DEBUG == TRUE)
- APPL_TRACE_EVENT4("AV event=0x%x(%s) state=%d(%s)",
+ APPL_TRACE_EVENT("AV event=0x%x(%s) state=%d(%s)",
event, bta_av_evt_code(event), p_cb->state, bta_av_st_code(p_cb->state));
#else
- APPL_TRACE_EVENT2("AV event=0x%x state=%d", event, p_cb->state);
+ APPL_TRACE_EVENT("AV event=0x%x state=%d", event, p_cb->state);
#endif
/* look up the state table for the current state */
@@ -1166,7 +1247,7 @@
/* set next state */
p_cb->state = state_table[event][BTA_AV_NEXT_STATE];
- APPL_TRACE_EVENT1("next state=%d", p_cb->state);
+ APPL_TRACE_EVENT("next state=%d", p_cb->state);
/* execute action functions */
if ((action = state_table[event][BTA_AV_ACTION_COL]) != BTA_AV_IGNORE)
@@ -1199,9 +1280,9 @@
if(event >= first_event)
{
#if (defined(BTA_AV_DEBUG) && BTA_AV_DEBUG == TRUE)
- APPL_TRACE_VERBOSE2("AV nsm event=0x%x(%s)", event, bta_av_evt_code(event));
+ APPL_TRACE_VERBOSE("AV nsm event=0x%x(%s)", event, bta_av_evt_code(event));
#else
- APPL_TRACE_VERBOSE1("AV nsm event=0x%x", event);
+ APPL_TRACE_VERBOSE("AV nsm event=0x%x", event);
#endif
/* non state machine events */
(*bta_av_nsm_act[event - BTA_AV_FIRST_NSM_EVT]) ((tBTA_AV_DATA *) p_msg);
@@ -1209,16 +1290,16 @@
else if (event >= BTA_AV_FIRST_SM_EVT && event <= BTA_AV_LAST_SM_EVT)
{
#if (defined(BTA_AV_DEBUG) && BTA_AV_DEBUG == TRUE)
- APPL_TRACE_VERBOSE2("AV sm event=0x%x(%s)", event, bta_av_evt_code(event));
+ APPL_TRACE_VERBOSE("AV sm event=0x%x(%s)", event, bta_av_evt_code(event));
#else
- APPL_TRACE_VERBOSE1("AV sm event=0x%x", event);
+ APPL_TRACE_VERBOSE("AV sm event=0x%x", event);
#endif
/* state machine events */
bta_av_sm_execute(&bta_av_cb, p_msg->event, (tBTA_AV_DATA *) p_msg);
}
else
{
- APPL_TRACE_VERBOSE1("handle=0x%x", p_msg->layer_specific);
+ APPL_TRACE_VERBOSE("handle=0x%x", p_msg->layer_specific);
/* stream state machine events */
bta_av_ssm_execute( bta_av_hndl_to_scb(p_msg->layer_specific),
p_msg->event, (tBTA_AV_DATA *) p_msg);
@@ -1318,6 +1399,9 @@
case BTA_AV_AVRC_CLOSE_EVT: return "AVRC_CLOSE";
case BTA_AV_CONN_CHG_EVT: return "CONN_CHG";
case BTA_AV_DEREG_COMP_EVT: return "DEREG_COMP";
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+ case BTA_AV_API_SINK_ENABLE_EVT: return "SINK_ENABLE";
+#endif
#if (AVDT_REPORTING == TRUE)
case BTA_AV_AVDT_RPT_CONN_EVT: return "RPT_CONN";
#endif
diff --git a/bta/av/bta_av_sbc.c b/bta/av/bta_av_sbc.c
index a570375..dec24df 100644
--- a/bta/av/bta_av_sbc.c
+++ b/bta/av/bta_av_sbc.c
@@ -441,7 +441,7 @@
}
else
{
- APPL_TRACE_ERROR1("bta_av_sbc_cfg_for_cap: ch_mode(0x%02X) not supported", p_pref->ch_mode);
+ APPL_TRACE_ERROR("bta_av_sbc_cfg_for_cap: ch_mode(0x%02X) not supported", p_pref->ch_mode);
return A2D_FAIL;
}
@@ -452,7 +452,7 @@
}
else
{
- APPL_TRACE_ERROR1("bta_av_sbc_cfg_for_cap: samp_freq(0x%02X) not supported", p_pref->samp_freq);
+ APPL_TRACE_ERROR("bta_av_sbc_cfg_for_cap: samp_freq(0x%02X) not supported", p_pref->samp_freq);
return A2D_FAIL;
}
@@ -463,7 +463,7 @@
}
else
{
- APPL_TRACE_ERROR1("bta_av_sbc_cfg_for_cap: block_len(0x%02X) not supported", p_pref->block_len);
+ APPL_TRACE_ERROR("bta_av_sbc_cfg_for_cap: block_len(0x%02X) not supported", p_pref->block_len);
return A2D_FAIL;
}
@@ -474,7 +474,7 @@
}
else
{
- APPL_TRACE_ERROR1("bta_av_sbc_cfg_for_cap: num_subbands(0x%02X) not supported", p_pref->num_subbands);
+ APPL_TRACE_ERROR("bta_av_sbc_cfg_for_cap: num_subbands(0x%02X) not supported", p_pref->num_subbands);
return A2D_FAIL;
}
@@ -485,7 +485,7 @@
}
else
{
- APPL_TRACE_ERROR1("bta_av_sbc_cfg_for_cap: alloc_mthd(0x%02X) not supported", p_pref->alloc_mthd);
+ APPL_TRACE_ERROR("bta_av_sbc_cfg_for_cap: alloc_mthd(0x%02X) not supported", p_pref->alloc_mthd);
return A2D_FAIL;
}
@@ -511,6 +511,78 @@
/*******************************************************************************
**
+** Function bta_av_sbc_cfg_matches_cap
+**
+** Description This function checks whether an SBC codec configuration
+** matched with capabilities. Here we check subset.
+**
+** Returns 0 if ok, nonzero if error.
+**
+*******************************************************************************/
+UINT8 bta_av_sbc_cfg_matches_cap(UINT8 *p_cfg, tA2D_SBC_CIE *p_cap)
+{
+ UINT8 status = 0;
+ tA2D_SBC_CIE cfg_cie;
+
+ /* parse configuration */
+ if ((status = A2D_ParsSbcInfo(&cfg_cie, p_cfg, TRUE)) != 0)
+ {
+ APPL_TRACE_ERROR(" bta_av_sbc_cfg_matches_cap Parsing Failed %d", status);
+ return status;
+ }
+
+ /* verify that each parameter is in range */
+
+ APPL_TRACE_DEBUG(" FREQ peer: 0%x, capability 0%x", cfg_cie.samp_freq, p_cap->samp_freq);
+ APPL_TRACE_DEBUG(" CH_MODE peer: 0%x, capability 0%x", cfg_cie.ch_mode, p_cap->ch_mode);
+ APPL_TRACE_DEBUG(" BLOCK_LEN peer: 0%x, capability 0%x", cfg_cie.block_len, p_cap->block_len);
+ APPL_TRACE_DEBUG(" SUB_BAND peer: 0%x, capability 0%x", cfg_cie.num_subbands, p_cap->num_subbands);
+ APPL_TRACE_DEBUG(" ALLOC_MTHD peer: 0%x, capability 0%x", cfg_cie.alloc_mthd, p_cap->alloc_mthd);
+ APPL_TRACE_DEBUG(" MAX_BitPool peer: 0%x, capability 0%x", cfg_cie.max_bitpool, p_cap->max_bitpool);
+ APPL_TRACE_DEBUG(" Min_bitpool peer: 0%x, capability 0%x", cfg_cie.min_bitpool, p_cap->min_bitpool);
+
+ /* sampling frequency */
+ if ((cfg_cie.samp_freq & p_cap->samp_freq) == 0)
+ {
+ status = A2D_NS_SAMP_FREQ;
+ }
+ /* channel mode */
+ else if ((cfg_cie.ch_mode & p_cap->ch_mode) == 0)
+ {
+ status = A2D_NS_CH_MODE;
+ }
+ /* block length */
+ else if ((cfg_cie.block_len & p_cap->block_len) == 0)
+ {
+ status = A2D_BAD_BLOCK_LEN;
+ }
+ /* subbands */
+ else if ((cfg_cie.num_subbands & p_cap->num_subbands) == 0)
+ {
+ status = A2D_NS_SUBBANDS;
+ }
+ /* allocation method */
+ else if ((cfg_cie.alloc_mthd & p_cap->alloc_mthd) == 0)
+ {
+ status = A2D_NS_ALLOC_MTHD;
+ }
+ /* max bitpool */
+ else if (cfg_cie.max_bitpool > p_cap->max_bitpool)
+ {
+ status = A2D_NS_MAX_BITPOOL;
+ }
+ /* min bitpool */
+ else if (cfg_cie.min_bitpool < p_cap->min_bitpool)
+ {
+ status = A2D_NS_MIN_BITPOOL;
+ }
+
+ return status;
+}
+
+
+/*******************************************************************************
+**
** Function bta_av_sbc_cfg_in_cap
**
** Description This function checks whether an SBC codec configuration
@@ -532,6 +604,7 @@
/* verify that each parameter is in range */
+
/* sampling frequency */
if ((cfg_cie.samp_freq & p_cap->samp_freq) == 0)
{
diff --git a/bta/av/bta_av_ssm.c b/bta/av/bta_av_ssm.c
index 407146e..64ee42a 100644
--- a/bta/av/bta_av_ssm.c
+++ b/bta/av/bta_av_ssm.c
@@ -162,7 +162,7 @@
/* API_RC_OPEN_EVT */ {BTA_AV_SIGNORE, BTA_AV_SIGNORE, BTA_AV_INCOMING_SST },
/* SRC_DATA_READY_EVT */ {BTA_AV_SIGNORE, BTA_AV_SIGNORE, BTA_AV_INCOMING_SST },
/* CI_SETCONFIG_OK_EVT */ {BTA_AV_SETCONFIG_RSP, BTA_AV_ST_RC_TIMER, BTA_AV_INCOMING_SST },
-/* CI_SETCONFIG_FAIL_EVT */ {BTA_AV_SETCONFIG_RSP, BTA_AV_CLEANUP, BTA_AV_INIT_SST },
+/* CI_SETCONFIG_FAIL_EVT */ {BTA_AV_SETCONFIG_REJ, BTA_AV_CLEANUP, BTA_AV_INIT_SST },
/* SDP_DISC_OK_EVT */ {BTA_AV_FREE_SDB, BTA_AV_SIGNORE, BTA_AV_INCOMING_SST },
/* SDP_DISC_FAIL_EVT */ {BTA_AV_FREE_SDB, BTA_AV_SIGNORE, BTA_AV_INCOMING_SST },
/* STR_DISC_OK_EVT */ {BTA_AV_DISC_RES_AS_ACP,BTA_AV_SIGNORE, BTA_AV_INCOMING_SST },
@@ -410,7 +410,7 @@
if(p_scb == NULL)
{
/* this stream is not registered */
- APPL_TRACE_EVENT0("AV channel not registered");
+ APPL_TRACE_EVENT("AV channel not registered");
return;
}
@@ -436,10 +436,10 @@
}
#if (defined(BTA_AV_DEBUG) && BTA_AV_DEBUG == TRUE)
- APPL_TRACE_VERBOSE5("AV Sevent(0x%x)=0x%x(%s) state=%d(%s)",
+ APPL_TRACE_VERBOSE("AV Sevent(0x%x)=0x%x(%s) state=%d(%s)",
p_scb->hndl, event, bta_av_evt_code(event), p_scb->state, bta_av_sst_code(p_scb->state));
#else
- APPL_TRACE_VERBOSE2("AV Sevent=0x%x state=%d", event, p_scb->state);
+ APPL_TRACE_VERBOSE("AV Sevent=0x%x state=%d", event, p_scb->state);
#endif
/* look up the state table for the current state */
diff --git a/bta/dm/bta_dm_act.c b/bta/dm/bta_dm_act.c
old mode 100755
new mode 100644
index ee1ba03..2ef728b
--- a/bta/dm/bta_dm_act.c
+++ b/bta/dm/bta_dm_act.c
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 2003-2012 Broadcom Corporation
+ * Copyright (C) 2003-2014 Broadcom Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -38,6 +38,7 @@
#include "l2c_api.h"
#include "wbt_api.h"
#include "utl.h"
+#include "gap_api.h" /* For GAP_BleReadPeerPrefConnParams */
#include <string.h>
#if (GAP_INCLUDED == TRUE)
@@ -89,7 +90,7 @@
static char *bta_dm_get_remname(void);
static void bta_dm_bond_cancel_complete_cback(tBTM_STATUS result);
-static BOOLEAN bta_dm_read_remote_device_name (BD_ADDR bd_addr);
+static BOOLEAN bta_dm_read_remote_device_name (BD_ADDR bd_addr,tBT_TRANSPORT transport);
static void bta_dm_discover_device(BD_ADDR remote_bd_addr);
static void bta_dm_sys_hw_cback( tBTA_SYS_HW_EVT status );
@@ -108,9 +109,11 @@
static void btm_dm_start_gatt_discovery ( BD_ADDR bd_addr);
static void bta_dm_cancel_gatt_discovery(BD_ADDR bd_addr);
static void bta_dm_gattc_callback(tBTA_GATTC_EVT event, tBTA_GATTC *p_data);
+extern tBTA_DM_CONTRL_STATE bta_dm_pm_obtain_controller_state(void);
#endif
static void bta_dm_observe_results_cb (tBTM_INQ_RESULTS *p_inq, UINT8 *p_eir);
static void bta_dm_observe_cmpl_cb (void * p_result);
+static void bta_dm_ctrl_features_rd_cmpl_cback(tBTM_STATUS result);
#ifndef BTA_DM_BLE_ADV_CHNL_MAP
#define BTA_DM_BLE_ADV_CHNL_MAP (BTM_BLE_ADV_CHNL_37|BTM_BLE_ADV_CHNL_38|BTM_BLE_ADV_CHNL_39)
@@ -240,26 +243,6 @@
/*******************************************************************************
**
-** Function bta_dm_app_ready_timer_cback
-**
-** Description allow sending EIR to controller
-**
-**
-** Returns void
-**
-*******************************************************************************/
-#if ( BTM_EIR_SERVER_INCLUDED == TRUE )&&(BTA_EIR_CANNED_UUID_LIST != TRUE)
-static void bta_dm_app_ready_timer_cback (TIMER_LIST_ENT *p_tle)
-{
- UNUSED(p_tle);
- bta_dm_set_eir (NULL);
-}
-#else
-#define bta_dm_app_ready_timer_cback (x)
-#endif
-
-/*******************************************************************************
-**
** Function bta_dm_enable
**
** Description Initialises the BT device manager
@@ -276,7 +259,7 @@
/* if already in use, return an error */
if( bta_dm_cb.is_bta_dm_active == TRUE )
{
- APPL_TRACE_WARNING0("bta_dm_enable - device already started by another application");
+ APPL_TRACE_WARNING("bta_dm_enable - device already started by another application");
memset(&sec_event.enable, 0, sizeof ( tBTA_DM_ENABLE ));
sec_event.enable.status = BTA_FAILURE;
if( p_data->enable.p_sec_cback != NULL )
@@ -330,7 +313,7 @@
tBTA_BLE_LOCAL_ID_KEYS id_key;
tBT_UUID app_uuid = {LEN_UUID_128,{0}};
#endif
- APPL_TRACE_DEBUG1(" bta_dm_sys_hw_cback with event: %i" , status );
+ APPL_TRACE_DEBUG(" bta_dm_sys_hw_cback with event: %i" , status );
/* On H/W error evt, report to the registered DM application callback */
if (status == BTA_SYS_HW_ERROR_EVT) {
@@ -401,6 +384,11 @@
#else
BTM_AclRegisterForChanges(bta_dm_acl_change_cback);
#endif
+
+#if BLE_VND_INCLUDED == TRUE
+ BTM_BleReadControllerFeatures (bta_dm_ctrl_features_rd_cmpl_cback);
+#endif
+
/* Earlier, we used to invoke BTM_ReadLocalAddr which was just copying the bd_addr
from the control block and invoking the callback which was sending the DM_ENABLE_EVT.
But then we have a few HCI commands being invoked above which were still in progress
@@ -415,28 +403,6 @@
bta_sys_policy_register((tBTA_SYS_CONN_CBACK*)bta_dm_policy_cback);
-
- // BLUEDROID REMOVE ??
-#if 0
-#if 1
- /* Create broadcom primary DI record */
- if(WBT_ExtCreateRecord())
- {
-#if ( BTM_EIR_SERVER_INCLUDED == TRUE )&&( BTA_EIR_CANNED_UUID_LIST != TRUE )
- /* while app_ready_timer is running, BTA DM doesn't send EIR to controller */
- bta_dm_cb.app_ready_timer.p_cback = (TIMER_CBACK*)&bta_dm_app_ready_timer_cback;
- bta_sys_start_timer(&bta_dm_cb.app_ready_timer, 0, 100);
-
- bta_sys_add_uuid(UUID_SERVCLASS_PNP_INFORMATION);
-#endif
- bta_dm_di_cb.di_handle[bta_dm_di_cb.di_num] = 0; /* primary DI record */
- bta_dm_di_cb.di_num ++;
- }
-#else /* Eventually implement pin code */
- if (WBT_ExtCreateRecord())
- WBT_ExtAddPinCode();
-#endif
-#endif
#if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
memset (&app_uuid.uu.uuid128, 0x87, LEN_UUID_128);
bta_dm_gattc_register();
@@ -444,7 +410,7 @@
}
else
- APPL_TRACE_DEBUG0(" --- ignored event");
+ APPL_TRACE_DEBUG(" --- ignored event");
}
@@ -476,6 +442,9 @@
bta_dm_disable_search_and_disc();
bta_dm_cb.disabling = TRUE;
+#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
+ BTM_BleClearBgConnDev();
+#endif
if(BTM_GetNumAclLinks()==0)
{
@@ -483,7 +452,7 @@
/* If BTA_DISABLE_DELAY is defined and greater than zero, then delay the shutdown by
* BTA_DISABLE_DELAY milliseconds
*/
- APPL_TRACE_WARNING2("%s BTA_DISABLE_DELAY set to %d ms",
+ APPL_TRACE_WARNING("%s BTA_DISABLE_DELAY set to %d ms",
__FUNCTION__, BTA_DISABLE_DELAY);
bta_sys_stop_timer(&bta_dm_cb.disable_timer);
bta_dm_cb.disable_timer.p_cback = (TIMER_CBACK*)&bta_dm_disable_conn_down_timer_cback;
@@ -495,6 +464,7 @@
else
{
bta_dm_cb.disable_timer.p_cback = (TIMER_CBACK*)&bta_dm_disable_timer_cback;
+ bta_dm_cb.disable_timer.param = 0;
bta_sys_start_timer(&bta_dm_cb.disable_timer, 0, 5000);
}
@@ -516,17 +486,31 @@
{
UNUSED(p_tle);
UINT8 i;
+ tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR;
+ BOOLEAN trigger_disc = FALSE;
- APPL_TRACE_EVENT0(" bta_dm_disable_timer_cback ");
- if(BTM_GetNumAclLinks())
+ APPL_TRACE_EVENT(" bta_dm_disable_timer_cback trial %d ", p_tle->param);
+
+ if(BTM_GetNumAclLinks() && p_tle->param == 0)
{
for(i=0; i<bta_dm_cb.device_list.count; i++)
{
- btm_remove_acl(bta_dm_cb.device_list.peer_device[i].peer_bdaddr);
-
+#if (BLE_INCLUDED == TRUE)
+ transport = bta_dm_cb.device_list.peer_device[i].transport;
+#endif
+ btm_remove_acl(bta_dm_cb.device_list.peer_device[i].peer_bdaddr, transport);
+ trigger_disc = TRUE;
}
+ /* Retrigger disable timer in case ACL disconnect failed, DISABLE_EVT still need
+ to be sent out to avoid jave layer disable timeout */
+ if (trigger_disc)
+ {
+ bta_dm_cb.disable_timer.p_cback = (TIMER_CBACK*)&bta_dm_disable_timer_cback;
+ bta_dm_cb.disable_timer.param = 1;
+ bta_sys_start_timer(&bta_dm_cb.disable_timer, 0, 1500);
+ }
}
else
{
@@ -665,7 +649,7 @@
{
if (BTM_WriteInquiryTxPower (p_data->tx_inq_pwr.tx_power) == BTM_ILLEGAL_VALUE)
{
- APPL_TRACE_ERROR1("Invalid Inquiry Tx Power: %d", p_data->tx_inq_pwr.tx_power);
+ APPL_TRACE_ERROR("Invalid Inquiry Tx Power: %d", p_data->tx_inq_pwr.tx_power);
}
return;
}
@@ -688,22 +672,25 @@
BTA_GATTC_CancelOpen(0, p_dev->bd_addr, FALSE);
#endif
- if (BTM_IsAclConnectionUp(p_dev->bd_addr))
+ if ( BTM_IsAclConnectionUp(p_dev->bd_addr, BT_TRANSPORT_LE) ||
+ BTM_IsAclConnectionUp(p_dev->bd_addr, BT_TRANSPORT_BR_EDR))
{
+ APPL_TRACE_DEBUG("%s: ACL Up count %d", __FUNCTION__,bta_dm_cb.device_list.count);
/* Take the link down first, and mark the device for removal when disconnected */
- btm_remove_acl( p_dev->bd_addr) ;
for(i=0; i<bta_dm_cb.device_list.count; i++)
{
if(!bdcmp( bta_dm_cb.device_list.peer_device[i].peer_bdaddr, p_dev->bd_addr))
- break;
- }
-
- if(i < bta_dm_cb.device_list.count)
- {
- bta_dm_cb.device_list.peer_device[i].conn_state = BTA_DM_UNPAIRING;
+ {
+ bta_dm_cb.device_list.peer_device[i].conn_state = BTA_DM_UNPAIRING;
+ btm_remove_acl( p_dev->bd_addr,bta_dm_cb.device_list.peer_device[i].transport);
+ APPL_TRACE_DEBUG("%s:transport = %d", __FUNCTION__,
+ bta_dm_cb.device_list.peer_device[i].transport);
+ break;
+ }
}
}
+
else /* Ok to remove the device in application layer */
{
BTM_SecDeleteDevice(p_dev->bd_addr);
@@ -770,7 +757,7 @@
if (!BTM_SecAddDevice (p_dev->bd_addr, p_dc, p_dev->bd_name, p_dev->features,
trusted_services_mask, p_lc, p_dev->key_type, p_dev->io_cap))
{
- APPL_TRACE_ERROR2 ("BTA_DM: Error adding device %08x%04x",
+ APPL_TRACE_ERROR ("BTA_DM: Error adding device %08x%04x",
(p_dev->bd_addr[0]<<24)+(p_dev->bd_addr[1]<<16)+(p_dev->bd_addr[2]<<8)+p_dev->bd_addr[3],
(p_dev->bd_addr[4]<<8)+p_dev->bd_addr[5]);
}
@@ -789,15 +776,23 @@
{
tBTA_DM_API_REMOVE_ACL *p_remove_acl = &p_data->remove_acl;
UINT8 index;
+ tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR;
- APPL_TRACE_DEBUG0("bta_dm_close_acl");
+ APPL_TRACE_DEBUG("bta_dm_close_acl");
- if (BTM_IsAclConnectionUp(p_remove_acl->bd_addr))
+ if ( BTM_IsAclConnectionUp(p_remove_acl->bd_addr, BT_TRANSPORT_LE) ||
+ BTM_IsAclConnectionUp(p_remove_acl->bd_addr, BT_TRANSPORT_BR_EDR))
+
{
for (index = 0; index < bta_dm_cb.device_list.count; index ++)
{
if (!bdcmp( bta_dm_cb.device_list.peer_device[index].peer_bdaddr, p_remove_acl->bd_addr))
+ {
+#if defined (BLE_INCLUDED) && (BLE_INCLUDED == TRUE)
+ transport = bta_dm_cb.device_list.peer_device[index].transport;
+#endif
break;
+ }
}
if (index != bta_dm_cb.device_list.count)
{
@@ -806,17 +801,17 @@
}
else
{
- APPL_TRACE_ERROR0("unknown device, remove ACL failed");
+ APPL_TRACE_ERROR("unknown device, remove ACL failed");
}
/* Disconnect the ACL link */
- btm_remove_acl(p_remove_acl->bd_addr);
+ btm_remove_acl(p_remove_acl->bd_addr, transport);
}
/* if to remove the device from security database ? do it now */
else if (p_remove_acl->remove_dev)
{
if (!BTM_SecDeleteDevice(p_remove_acl->bd_addr))
{
- APPL_TRACE_ERROR0("delete device from security database failed.");
+ APPL_TRACE_ERROR("delete device from security database failed.");
}
#if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
/* need to remove all pending background connection if any */
@@ -844,7 +839,11 @@
tBTA_DM_SEC sec_event;
char *p_name;
- status = BTM_SecBond ( p_data->bond.bd_addr, 0, NULL, 0 );
+ if (p_data->bond.transport == BTA_TRANSPORT_UNKNOWN)
+ status = BTM_SecBond ( p_data->bond.bd_addr, 0, NULL, 0 );
+ else
+ status = BTM_SecBondByTransport ( p_data->bond.bd_addr, p_data->bond.transport, 0, NULL, 0 );
+
if (bta_dm_cb.p_sec_cback && (status != BTM_CMD_STARTED))
{
@@ -892,7 +891,7 @@
tBTM_STATUS status;
tBTA_DM_SEC sec_event;
- APPL_TRACE_EVENT0(" bta_dm_bond_cancel ");
+ APPL_TRACE_EVENT(" bta_dm_bond_cancel ");
status = BTM_SecBondCancel ( p_data->bond_cancel.bd_addr );
if (bta_dm_cb.p_sec_cback && (status != BTM_CMD_STARTED && status != BTM_SUCCESS))
@@ -960,7 +959,7 @@
if(!p_dev)
return;
- APPL_TRACE_DEBUG2(" bta_dm_link_policy set:%d, policy:0x%x",
+ APPL_TRACE_DEBUG(" bta_dm_link_policy set:%d, policy:0x%x",
p_data->link_policy.set, p_data->link_policy.policy_mask);
if(p_data->link_policy.set)
{
@@ -1000,7 +999,7 @@
if(peer_addr)
p_dev = bta_dm_find_peer_device(peer_addr);
- APPL_TRACE_DEBUG2(" bta_dm_policy_cback cmd:%d, policy:0x%x",
+ APPL_TRACE_DEBUG(" bta_dm_policy_cback cmd:%d, policy:0x%x",
status, policy);
switch(status)
{
@@ -1204,7 +1203,7 @@
UINT16 len = (UINT16)(sizeof(tBT_UUID) * p_data->search.num_uuid);
#endif
- APPL_TRACE_DEBUG1("bta_dm_search_start avoid_scatter=%d", bta_dm_cfg.avoid_scatter);
+ APPL_TRACE_DEBUG("bta_dm_search_start avoid_scatter=%d", bta_dm_cfg.avoid_scatter);
if (bta_dm_cfg.avoid_scatter &&
(p_data->search.rs_res == BTA_DM_RS_NONE) && bta_dm_check_av(BTA_DM_API_SEARCH_EVT))
{
@@ -1225,7 +1224,7 @@
{
if ((bta_dm_search_cb.p_srvc_uuid = (tBT_UUID *)GKI_getbuf(len)) == NULL)
{
- APPL_TRACE_ERROR0("bta_dm_search_start no resources");
+ APPL_TRACE_ERROR("bta_dm_search_start no resources");
result.status = BTA_FAILURE;
result.num_resp = 0;
@@ -1240,7 +1239,7 @@
bta_dm_inq_results_cb,
(tBTM_CMPL_CB*) bta_dm_inq_cmpl_cb);
- APPL_TRACE_EVENT1("bta_dm_search_start status=%d", result.status);
+ APPL_TRACE_EVENT("bta_dm_search_start status=%d", result.status);
if (result.status != BTM_CMD_STARTED)
{
result.num_resp = 0;
@@ -1305,7 +1304,7 @@
#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
UINT16 len = (UINT16)(sizeof(tBT_UUID) * p_data->discover.num_uuid);
#endif
- APPL_TRACE_EVENT2("bta_dm_discover services_to_search=0x%04X, sdp_search=%d",
+ APPL_TRACE_EVENT("bta_dm_discover services_to_search=0x%04X, sdp_search=%d",
p_data->discover.services, p_data->discover.sdp_search);
/* save the search condition */
@@ -1334,6 +1333,7 @@
bta_dm_search_cb.peer_name[0] = 0;
bta_dm_search_cb.sdp_search = p_data->discover.sdp_search;
bta_dm_search_cb.p_btm_inq_info = BTM_InqDbRead (p_data->discover.bd_addr);
+ bta_dm_search_cb.transport = p_data->discover.transport;
bta_dm_search_cb.name_discover_done = FALSE;
memcpy(&bta_dm_search_cb.uuid, &p_data->discover.uuid, sizeof(tSDP_UUID));
@@ -1479,7 +1479,7 @@
}
else
{
- APPL_TRACE_ERROR0("No buffer to start DI discovery");
+ APPL_TRACE_ERROR("No buffer to start DI discovery");
}
if ( result == BTA_FAILURE &&
@@ -1501,27 +1501,28 @@
** Returns TRUE if started to get remote name
**
*******************************************************************************/
-static BOOLEAN bta_dm_read_remote_device_name (BD_ADDR bd_addr)
+static BOOLEAN bta_dm_read_remote_device_name (BD_ADDR bd_addr,tBT_TRANSPORT transport)
{
tBTM_STATUS btm_status;
- APPL_TRACE_DEBUG0("bta_dm_read_remote_device_name");
+ APPL_TRACE_DEBUG("bta_dm_read_remote_device_name");
bdcpy(bta_dm_search_cb.peer_bdaddr, bd_addr);
bta_dm_search_cb.peer_name[0] = 0;
btm_status = BTM_ReadRemoteDeviceName (bta_dm_search_cb.peer_bdaddr,
- (tBTM_CMPL_CB *) bta_dm_remname_cback);
+ (tBTM_CMPL_CB *) bta_dm_remname_cback,
+ transport);
if ( btm_status == BTM_CMD_STARTED )
{
- APPL_TRACE_DEBUG0("bta_dm_read_remote_device_name: BTM_ReadRemoteDeviceName is started");
+ APPL_TRACE_DEBUG("bta_dm_read_remote_device_name: BTM_ReadRemoteDeviceName is started");
return (TRUE);
}
else if ( btm_status == BTM_BUSY )
{
- APPL_TRACE_DEBUG0("bta_dm_read_remote_device_name: BTM_ReadRemoteDeviceName is busy");
+ APPL_TRACE_DEBUG("bta_dm_read_remote_device_name: BTM_ReadRemoteDeviceName is busy");
/* Remote name discovery is on going now so BTM cannot notify through "bta_dm_remname_cback" */
/* adding callback to get notified that current reading remore name done */
@@ -1531,7 +1532,7 @@
}
else
{
- APPL_TRACE_WARNING1("bta_dm_read_remote_device_name: BTM_ReadRemoteDeviceName returns 0x%02X", btm_status);
+ APPL_TRACE_WARNING("bta_dm_read_remote_device_name: BTM_ReadRemoteDeviceName returns 0x%02X", btm_status);
return (FALSE);
}
@@ -1551,7 +1552,7 @@
tBTA_DM_MSG * p_msg;
tBTA_DM_SEARCH data;
- APPL_TRACE_DEBUG0("bta_dm_inq_cmpl");
+ APPL_TRACE_DEBUG("bta_dm_inq_cmpl");
data.inq_cmpl.num_resps = p_data->inq_cmpl.num;
bta_dm_search_cb.p_search_cback(BTA_DM_INQ_CMPL_EVT, &data);
@@ -1588,7 +1589,7 @@
*******************************************************************************/
void bta_dm_rmt_name (tBTA_DM_MSG *p_data)
{
- APPL_TRACE_DEBUG0("bta_dm_rmt_name");
+ APPL_TRACE_DEBUG("bta_dm_rmt_name");
if( p_data->rem_name.result.disc_res.bd_name[0] && bta_dm_search_cb.p_btm_inq_info)
{
@@ -1612,7 +1613,7 @@
{
tBTM_INQ_INFO *p_btm_inq_info;
- APPL_TRACE_DEBUG0("bta_dm_disc_rmt_name");
+ APPL_TRACE_DEBUG("bta_dm_disc_rmt_name");
p_btm_inq_info = BTM_InqDbRead (p_data->rem_name.result.disc_res.bd_addr);
if( p_btm_inq_info )
@@ -1658,7 +1659,7 @@
|| (p_data->sdp_event.sdp_result == SDP_NO_RECS_MATCH)
|| (p_data->sdp_event.sdp_result == SDP_DB_FULL))
{
- APPL_TRACE_DEBUG1("sdp_result::0x%x", p_data->sdp_event.sdp_result);
+ APPL_TRACE_DEBUG("sdp_result::0x%x", p_data->sdp_event.sdp_result);
do
{
@@ -1775,7 +1776,7 @@
// GKI_freebuf(bta_dm_search_cb.p_sdp_db);
// bta_dm_search_cb.p_sdp_db = NULL;
- APPL_TRACE_DEBUG1("bta_dm_sdp_result services_found = %04x", bta_dm_search_cb.services_found);
+ APPL_TRACE_DEBUG("bta_dm_sdp_result services_found = %04x", bta_dm_search_cb.services_found);
/* Collect the 128-bit services here and put them into the list */
if(bta_dm_search_cb.services == BTA_ALL_SERVICE_MASK)
@@ -1826,12 +1827,12 @@
num_uuids*MAX_UUID_SIZE);
} else {
p_msg->disc_result.result.disc_res.num_uuids = 0;
- APPL_TRACE_ERROR1("%s: Unable to allocate memory for uuid_list", __FUNCTION__);
+ APPL_TRACE_ERROR("%s: Unable to allocate memory for uuid_list", __FUNCTION__);
}
}
//copy the raw_data to the discovery result structure
//
- APPL_TRACE_DEBUG2("bta_dm_sdp_result (raw_data used = 0x%x raw_data_ptr = 0x%x)\r\n",bta_dm_search_cb.p_sdp_db->raw_used, bta_dm_search_cb.p_sdp_db->raw_data);
+ APPL_TRACE_DEBUG("bta_dm_sdp_result (raw_data used = 0x%x raw_data_ptr = 0x%x)\r\n",bta_dm_search_cb.p_sdp_db->raw_used, bta_dm_search_cb.p_sdp_db->raw_data);
if ( bta_dm_search_cb.p_sdp_db != NULL && bta_dm_search_cb.p_sdp_db->raw_used != 0 &&
bta_dm_search_cb.p_sdp_db->raw_data != NULL) {
@@ -1846,7 +1847,7 @@
bta_dm_search_cb.p_sdp_db->raw_used;
} else {
- APPL_TRACE_DEBUG1("bta_dm_sdp_result GKI Alloc failed to allocate %d bytes !!\r\n",bta_dm_search_cb.p_sdp_db->raw_used);
+ APPL_TRACE_DEBUG("bta_dm_sdp_result GKI Alloc failed to allocate %d bytes !!\r\n",bta_dm_search_cb.p_sdp_db->raw_used);
}
bta_dm_search_cb.p_sdp_db->raw_data = NULL; //no need to free this - it is a global assigned.
@@ -1854,7 +1855,7 @@
bta_dm_search_cb.p_sdp_db->raw_size = 0;
}
else {
- APPL_TRACE_DEBUG0("bta_dm_sdp_result raw data size is 0 or raw_data is null!!\r\n");
+ APPL_TRACE_DEBUG("bta_dm_sdp_result raw data size is 0 or raw_data is null!!\r\n");
}
/* Done with p_sdp_db. Free it */
bta_dm_free_sdp_db(NULL);
@@ -1866,7 +1867,7 @@
p_msg->disc_result.result.disc_res.result = (3 + bta_dm_search_cb.peer_scn);
p_msg->disc_result.result.disc_res.services |= BTA_USER_SERVICE_MASK;
- APPL_TRACE_EVENT1(" Piggy back the SCN over result field SCN=%d", bta_dm_search_cb.peer_scn);
+ APPL_TRACE_EVENT(" Piggy back the SCN over result field SCN=%d", bta_dm_search_cb.peer_scn);
}
bdcpy (p_msg->disc_result.result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
@@ -1923,7 +1924,7 @@
*******************************************************************************/
void bta_dm_search_cmpl (tBTA_DM_MSG *p_data)
{
- APPL_TRACE_DEBUG0("bta_dm_search_cmpl");
+ APPL_TRACE_DEBUG("bta_dm_search_cmpl");
#if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
utl_freebuf((void **)&bta_dm_search_cb.p_srvc_uuid);
@@ -1948,7 +1949,7 @@
{
tBTA_DM_MSG * p_msg;
- APPL_TRACE_DEBUG0("bta_dm_disc_result");
+ APPL_TRACE_DEBUG("bta_dm_disc_result");
#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
/* if any BR/EDR service discovery has been done, report the event */
@@ -1976,7 +1977,7 @@
*******************************************************************************/
void bta_dm_search_result (tBTA_DM_MSG *p_data)
{
- APPL_TRACE_DEBUG2("bta_dm_search_result searching:0x%04x, result:0x%04x",
+ APPL_TRACE_DEBUG("bta_dm_search_result searching:0x%04x, result:0x%04x",
bta_dm_search_cb.services,
p_data->disc_result.result.disc_res.services);
@@ -2020,7 +2021,7 @@
{
UNUSED(p_tle);
- APPL_TRACE_EVENT0(" bta_dm_search_timer_cback ");
+ APPL_TRACE_EVENT(" bta_dm_search_timer_cback ");
bta_dm_search_cb.wait_disc = FALSE;
/* proceed with next device */
@@ -2210,11 +2211,11 @@
{
if((bta_dm_search_cb.p_sdp_db = (tSDP_DISCOVERY_DB *)GKI_getbuf(BTA_DM_SDP_DB_SIZE)) != NULL)
{
- APPL_TRACE_DEBUG1("bta_dm_search_cb.services = %04x***********", bta_dm_search_cb.services);
+ APPL_TRACE_DEBUG("bta_dm_search_cb.services = %04x***********", bta_dm_search_cb.services);
/* try to search all services by search based on L2CAP UUID */
if(bta_dm_search_cb.services == BTA_ALL_SERVICE_MASK )
{
- APPL_TRACE_ERROR1("services_to_search = %08x",bta_dm_search_cb.services_to_search);
+ APPL_TRACE_ERROR("services_to_search = %08x",bta_dm_search_cb.services_to_search);
if (bta_dm_search_cb.services_to_search & BTA_RES_SERVICE_MASK)
{
uuid.uu.uuid16 = bta_service_id_to_uuid_lkup_tbl[0];
@@ -2276,7 +2277,7 @@
}
- APPL_TRACE_ERROR1("****************search UUID = %04x***********", uuid.uu.uuid16);
+ APPL_TRACE_ERROR("****************search UUID = %04x***********", uuid.uu.uuid16);
//SDP_InitDiscoveryDb (bta_dm_search_cb.p_sdp_db, BTA_DM_SDP_DB_SIZE, 1, &uuid, num_attrs, attr_list);
SDP_InitDiscoveryDb (bta_dm_search_cb.p_sdp_db, BTA_DM_SDP_DB_SIZE, 1, &uuid, 0, NULL);
@@ -2308,7 +2309,7 @@
}
else
{
- APPL_TRACE_ERROR0("#### Failed to allocate SDP DB buffer! ####");
+ APPL_TRACE_ERROR("#### Failed to allocate SDP DB buffer! ####");
}
}
@@ -2348,7 +2349,7 @@
tBTA_DM_MSG * p_msg;
- APPL_TRACE_DEBUG0("bta_dm_discover_next_device");
+ APPL_TRACE_DEBUG("bta_dm_discover_next_device");
/* searching next device on inquiry result */
if((bta_dm_search_cb.p_btm_inq_info = BTM_InqDbNext(bta_dm_search_cb.p_btm_inq_info)) != NULL)
@@ -2383,21 +2384,36 @@
static void bta_dm_discover_device(BD_ADDR remote_bd_addr)
{
tBTA_DM_MSG * p_msg;
+ tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR;
+#if BLE_INCLUDED == TRUE
+ tBT_DEVICE_TYPE dev_type;
+ tBLE_ADDR_TYPE addr_type;
- APPL_TRACE_DEBUG6("bta_dm_discover_device, BDA:0x%02X%02X%02X%02X%02X%02X",
+ if (bta_dm_search_cb.transport == BTA_TRANSPORT_UNKNOWN)
+ {
+ BTM_ReadDevInfo(remote_bd_addr, &dev_type, &addr_type);
+ if (dev_type == BT_DEVICE_TYPE_BLE || addr_type == BLE_ADDR_RANDOM )
+ transport = BT_TRANSPORT_LE;
+ }
+ else
+ transport = bta_dm_search_cb.transport;
+#endif
+
+
+ APPL_TRACE_DEBUG("bta_dm_discover_device, BDA:0x%02X%02X%02X%02X%02X%02X",
remote_bd_addr[0],remote_bd_addr[1],
remote_bd_addr[2],remote_bd_addr[3],
remote_bd_addr[4],remote_bd_addr[5]);
bdcpy(bta_dm_search_cb.peer_bdaddr, remote_bd_addr);
- APPL_TRACE_DEBUG2("bta_dm_discover_device name_discover_done = %d p_btm_inq_info 0x%x ",
+ APPL_TRACE_DEBUG("bta_dm_discover_device name_discover_done = %d p_btm_inq_info 0x%x ",
bta_dm_search_cb.name_discover_done,
bta_dm_search_cb.p_btm_inq_info
);
if ( bta_dm_search_cb.p_btm_inq_info ) {
- APPL_TRACE_DEBUG1("bta_dm_discover_device appl_knows_rem_name %d",
+ APPL_TRACE_DEBUG("bta_dm_discover_device appl_knows_rem_name %d",
bta_dm_search_cb.p_btm_inq_info->appl_knows_rem_name
);
}
@@ -2407,7 +2423,7 @@
&& (( bta_dm_search_cb.p_btm_inq_info == NULL )
||(bta_dm_search_cb.p_btm_inq_info && (!bta_dm_search_cb.p_btm_inq_info->appl_knows_rem_name))))
{
- if( bta_dm_read_remote_device_name(bta_dm_search_cb.peer_bdaddr) == TRUE )
+ if(bta_dm_read_remote_device_name(bta_dm_search_cb.peer_bdaddr, transport) == TRUE)
{
return;
}
@@ -2446,7 +2462,7 @@
/* check whether connection already exists to the device
if connection exists, we don't have to wait for ACL
link to go down to start search on next device */
- if(BTM_IsAclConnectionUp(bta_dm_search_cb.peer_bdaddr))
+ if (BTM_IsAclConnectionUp(bta_dm_search_cb.peer_bdaddr, BT_TRANSPORT_BR_EDR))
bta_dm_search_cb.wait_disc = FALSE;
else
bta_dm_search_cb.wait_disc = TRUE;
@@ -2454,14 +2470,13 @@
#if (BLE_INCLUDED == TRUE && (defined BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE))
if ( bta_dm_search_cb.p_btm_inq_info )
{
- APPL_TRACE_DEBUG3("bta_dm_discover_device p_btm_inq_info 0x%x results.device_type 0x%x services_to_search 0x%x",
+ APPL_TRACE_DEBUG("bta_dm_discover_device p_btm_inq_info 0x%x results.device_type 0x%x services_to_search 0x%x",
bta_dm_search_cb.p_btm_inq_info,
bta_dm_search_cb.p_btm_inq_info->results.device_type,
bta_dm_search_cb.services_to_search
);
}
- if (BTM_UseLeLink(bta_dm_search_cb.peer_bdaddr))
- /*
+ if (transport == BT_TRANSPORT_LE) /*
if ( bta_dm_search_cb.p_btm_inq_info != NULL &&
bta_dm_search_cb.p_btm_inq_info->results.device_type == BT_DEVICE_TYPE_BLE &&
(bta_dm_search_cb.services_to_search & BTA_BLE_SERVICE_MASK))*/
@@ -2559,7 +2574,7 @@
result.inq_res.ble_addr_type = p_inq->ble_addr_type;
result.inq_res.inq_result_type = p_inq->inq_result_type;
result.inq_res.device_type = p_inq->device_type;
-
+ result.inq_res.flag = p_inq->flag;
#endif
/* application will parse EIR to find out remote device name */
@@ -2602,7 +2617,7 @@
tBTA_DM_MSG * p_msg;
- APPL_TRACE_DEBUG0("bta_dm_inq_cmpl_cb");
+ APPL_TRACE_DEBUG("bta_dm_inq_cmpl_cb");
if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
{
p_msg->inq_cmpl.hdr.event = BTA_DM_INQUIRY_CMPL_EVT;
@@ -2629,7 +2644,7 @@
tBTM_STATUS btm_status;
UNUSED(dc);
- APPL_TRACE_DEBUG1("bta_dm_service_search_remname_cback name=<%s>", bd_name);
+ APPL_TRACE_DEBUG("bta_dm_service_search_remname_cback name=<%s>", bd_name);
/* if this is what we are looking for */
if (!bdcmp( bta_dm_search_cb.peer_bdaddr, bd_addr))
@@ -2649,16 +2664,17 @@
{
/* get name of device */
btm_status = BTM_ReadRemoteDeviceName (bta_dm_search_cb.peer_bdaddr,
- (tBTM_CMPL_CB *) bta_dm_remname_cback);
+ (tBTM_CMPL_CB *) bta_dm_remname_cback,
+ BT_TRANSPORT_BR_EDR);
if ( btm_status == BTM_BUSY )
{
/* wait for next chance(notification of remote name discovery done) */
- APPL_TRACE_DEBUG0("bta_dm_service_search_remname_cback: BTM_ReadRemoteDeviceName is busy");
+ APPL_TRACE_DEBUG("bta_dm_service_search_remname_cback: BTM_ReadRemoteDeviceName is busy");
}
else if ( btm_status != BTM_CMD_STARTED )
{
/* if failed to start getting remote name then continue */
- APPL_TRACE_WARNING1("bta_dm_service_search_remname_cback: BTM_ReadRemoteDeviceName returns 0x%02X", btm_status);
+ APPL_TRACE_WARNING("bta_dm_service_search_remname_cback: BTM_ReadRemoteDeviceName returns 0x%02X", btm_status);
rem_name.length = 0;
rem_name.remote_bd_name[0] = 0;
@@ -2682,7 +2698,7 @@
{
tBTA_DM_REM_NAME * p_msg;
- APPL_TRACE_DEBUG2("bta_dm_remname_cback len = %d name=<%s>", p_remote_name->length,
+ APPL_TRACE_DEBUG("bta_dm_remname_cback len = %d name=<%s>", p_remote_name->length,
p_remote_name->remote_bd_name);
/* remote name discovery is done but it could be failed */
@@ -2691,9 +2707,12 @@
bta_dm_search_cb.peer_name[BD_NAME_LEN]=0;
BTM_SecDeleteRmtNameNotifyCallback(&bta_dm_service_search_remname_cback);
+
#if BLE_INCLUDED == TRUE
- if (BTM_UseLeLink(bta_dm_search_cb.peer_bdaddr))
- GAP_BleReadPeerPrefConnParams (bta_dm_search_cb.peer_bdaddr);
+ if (bta_dm_search_cb.transport == BT_TRANSPORT_LE )
+ {
+ GAP_BleReadPeerPrefConnParams (bta_dm_search_cb.peer_bdaddr);
+ }
#endif
if ((p_msg = (tBTA_DM_REM_NAME *) GKI_getbuf(sizeof(tBTA_DM_REM_NAME))) != NULL)
{
@@ -2856,10 +2875,10 @@
bta_dm_cb.pin_evt = BTA_DM_PIN_REQ_EVT;
bdcpy(bta_dm_cb.pin_bd_addr, bd_addr);
BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, dev_class);
- if ((BTM_ReadRemoteDeviceName(bd_addr, bta_dm_pinname_cback)) == BTM_CMD_STARTED)
+ if ((BTM_ReadRemoteDeviceName(bd_addr, bta_dm_pinname_cback, BT_TRANSPORT_BR_EDR)) == BTM_CMD_STARTED)
return BTM_CMD_STARTED;
- APPL_TRACE_WARNING0(" bta_dm_pin_cback() -> Failed to start Remote Name Request ");
+ APPL_TRACE_WARNING(" bta_dm_pin_cback() -> Failed to start Remote Name Request ");
}
bdcpy(sec_event.pin_req.bd_addr, bd_addr);
@@ -2943,7 +2962,7 @@
}
else
{
- APPL_TRACE_WARNING0(" bta_dm_new_link_key_cback() Received AMP Key?? ");
+ APPL_TRACE_WARNING(" bta_dm_new_link_key_cback() Received AMP Key?? ");
}
return BTM_CMD_STARTED;
@@ -3004,7 +3023,7 @@
tBTA_DM_SEC sec_event;
tBTA_DM_SEC_EVT pin_evt = BTA_DM_SP_KEY_NOTIF_EVT;
- APPL_TRACE_EVENT1("bta_dm_sp_cback: %d", event);
+ APPL_TRACE_EVENT("bta_dm_sp_cback: %d", event);
if (!bta_dm_cb.p_sec_cback)
return BTM_NOT_AUTHORIZED;
@@ -3021,7 +3040,7 @@
status = BTM_SUCCESS;
#endif
- APPL_TRACE_EVENT2("io mitm: %d oob_data:%d", p_data->io_req.auth_req, p_data->io_req.oob_data);
+ APPL_TRACE_EVENT("io mitm: %d oob_data:%d", p_data->io_req.auth_req, p_data->io_req.oob_data);
break;
case BTM_SP_IO_RSP_EVT:
#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
@@ -3044,22 +3063,56 @@
/*case BTM_SP_KEY_REQ_EVT: */
case BTM_SP_KEY_NOTIF_EVT:
#endif
- bta_dm_cb.num_val = sec_event.key_notif.passkey = p_data->key_notif.passkey;
- /* If the device name is not known, save bdaddr and devclass and initiate a name request */
- if (p_data->key_notif.bd_name[0] == 0)
+ if(BTM_SP_CFM_REQ_EVT == event)
{
- bta_dm_cb.pin_evt = pin_evt;
- bdcpy(bta_dm_cb.pin_bd_addr, p_data->key_notif.bd_addr);
- BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, p_data->key_notif.dev_class);
- if ((BTM_ReadRemoteDeviceName(p_data->key_notif.bd_addr, bta_dm_pinname_cback)) == BTM_CMD_STARTED)
- return BTM_CMD_STARTED;
-
- APPL_TRACE_WARNING0(" bta_dm_sp_cback() -> Failed to start Remote Name Request ");
+ /* Due to the switch case falling through below to BTM_SP_KEY_NOTIF_EVT,
+ call remote name request using values from cfm_req */
+ if(p_data->cfm_req.bd_name[0] == 0)
+ {
+ bta_dm_cb.pin_evt = pin_evt;
+ bdcpy(bta_dm_cb.pin_bd_addr, p_data->cfm_req.bd_addr);
+ BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, p_data->cfm_req.dev_class);
+ if ((BTM_ReadRemoteDeviceName(p_data->cfm_req.bd_addr, bta_dm_pinname_cback,
+ BT_TRANSPORT_BR_EDR)) == BTM_CMD_STARTED)
+ return BTM_CMD_STARTED;
+ APPL_TRACE_WARNING(" bta_dm_sp_cback() -> Failed to start Remote Name Request ");
+ }
+ else
+ {
+ /* Due to the switch case falling through below to BTM_SP_KEY_NOTIF_EVT,
+ copy these values into key_notif from cfm_req */
+ bdcpy(sec_event.key_notif.bd_addr, p_data->cfm_req.bd_addr);
+ BTA_COPY_DEVICE_CLASS(sec_event.key_notif.dev_class, p_data->cfm_req.dev_class);
+ BCM_STRNCPY_S((char*)sec_event.key_notif.bd_name, sizeof(BD_NAME),
+ (char*)p_data->cfm_req.bd_name, (BD_NAME_LEN-1));
+ sec_event.key_notif.bd_name[BD_NAME_LEN-1] = 0;
+ }
}
- bdcpy(sec_event.key_notif.bd_addr, p_data->key_notif.bd_addr);
- BTA_COPY_DEVICE_CLASS(sec_event.key_notif.dev_class, p_data->key_notif.dev_class);
- BCM_STRNCPY_S((char*)sec_event.key_notif.bd_name, sizeof(BD_NAME), (char*)p_data->key_notif.bd_name, (BD_NAME_LEN-1));
- sec_event.key_notif.bd_name[BD_NAME_LEN-1] = 0;
+
+ bta_dm_cb.num_val = sec_event.key_notif.passkey = p_data->key_notif.passkey;
+ if (BTM_SP_KEY_NOTIF_EVT == event)
+ {
+ /* If the device name is not known, save bdaddr and devclass
+ and initiate a name request with values from key_notif */
+ if(p_data->key_notif.bd_name[0] == 0)
+ {
+ bta_dm_cb.pin_evt = pin_evt;
+ bdcpy(bta_dm_cb.pin_bd_addr, p_data->key_notif.bd_addr);
+ BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, p_data->key_notif.dev_class);
+ if ((BTM_ReadRemoteDeviceName(p_data->key_notif.bd_addr, bta_dm_pinname_cback,
+ BT_TRANSPORT_BR_EDR)) == BTM_CMD_STARTED)
+ return BTM_CMD_STARTED;
+ APPL_TRACE_WARNING(" bta_dm_sp_cback() -> Failed to start Remote Name Request ");
+ }
+ else
+ {
+ bdcpy(sec_event.key_notif.bd_addr, p_data->key_notif.bd_addr);
+ BTA_COPY_DEVICE_CLASS(sec_event.key_notif.dev_class, p_data->key_notif.dev_class);
+ BCM_STRNCPY_S((char*)sec_event.key_notif.bd_name, sizeof(BD_NAME),
+ (char*)p_data->key_notif.bd_name, (BD_NAME_LEN-1));
+ sec_event.key_notif.bd_name[BD_NAME_LEN-1] = 0;
+ }
+ }
bta_dm_cb.p_sec_cback(pin_evt, &sec_event);
@@ -3075,17 +3128,18 @@
/* If the device name is not known, save bdaddr and devclass and initiate a name request */
if (p_data->rmt_oob.bd_name[0] == 0)
{
- bta_dm_cb.pin_evt = BTA_DM_SP_RMT_OOB_EVT;
- bdcpy(bta_dm_cb.pin_bd_addr, p_data->rmt_oob.bd_addr);
- BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, p_data->rmt_oob.dev_class);
- if ((BTM_ReadRemoteDeviceName(p_data->rmt_oob.bd_addr, bta_dm_pinname_cback)) == BTM_CMD_STARTED)
- return BTM_CMD_STARTED;
+ bta_dm_cb.pin_evt = BTA_DM_SP_RMT_OOB_EVT;
+ bdcpy(bta_dm_cb.pin_bd_addr, p_data->rmt_oob.bd_addr);
+ BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, p_data->rmt_oob.dev_class);
+ if ((BTM_ReadRemoteDeviceName(p_data->rmt_oob.bd_addr, bta_dm_pinname_cback,
+ BT_TRANSPORT_BR_EDR)) == BTM_CMD_STARTED)
+ return BTM_CMD_STARTED;
+ APPL_TRACE_WARNING(" bta_dm_sp_cback() -> Failed to start Remote Name Request ");
+ }
- APPL_TRACE_WARNING0(" bta_dm_sp_cback() -> Failed to start Remote Name Request ");
- }
- bdcpy(sec_event.rmt_oob.bd_addr, p_data->rmt_oob.bd_addr);
- BTA_COPY_DEVICE_CLASS(sec_event.rmt_oob.dev_class, p_data->rmt_oob.dev_class);
- BCM_STRNCPY_S((char*)sec_event.rmt_oob.bd_name, sizeof(BD_NAME), (char*)p_data->rmt_oob.bd_name, (BD_NAME_LEN-1));
+ bdcpy(sec_event.rmt_oob.bd_addr, p_data->rmt_oob.bd_addr);
+ BTA_COPY_DEVICE_CLASS(sec_event.rmt_oob.dev_class, p_data->rmt_oob.dev_class);
+ BCM_STRNCPY_S((char*)sec_event.rmt_oob.bd_name, sizeof(BD_NAME), (char*)p_data->rmt_oob.bd_name, (BD_NAME_LEN-1));
sec_event.rmt_oob.bd_name[BD_NAME_LEN-1] = 0;
bta_dm_cb.p_sec_cback(BTA_DM_SP_RMT_OOB_EVT, &sec_event);
@@ -3110,7 +3164,7 @@
status = BTM_NOT_AUTHORIZED;
break;
}
- APPL_TRACE_EVENT1("dm status: %d", status);
+ APPL_TRACE_EVENT("dm status: %d", status);
return status;
}
@@ -3134,6 +3188,7 @@
if(bta_dm_cb.p_sec_cback)
bta_dm_cb.p_sec_cback(BTA_DM_ENABLE_EVT, &sec_event);
+
}
/*******************************************************************************
@@ -3227,9 +3282,17 @@
case BTM_BL_CONN_EVT:
p_msg->is_new = TRUE;
bdcpy(p_msg->bd_addr, p_data->conn.p_bda);
+#if BLE_INCLUDED == TRUE
+ p_msg->transport = p_data->conn.transport;
+ p_msg->handle = p_data->conn.handle;
+#endif
break;
case BTM_BL_DISCN_EVT:
bdcpy(p_msg->bd_addr, p_data->discn.p_bda);
+#if BLE_INCLUDED == TRUE
+ p_msg->transport = p_data->discn.transport;
+ p_msg->handle = p_data->discn.handle;
+#endif
break;
case BTM_BL_UPDATE_EVT:
p_msg->busy_level = p_data->update.busy_level;
@@ -3240,9 +3303,9 @@
p_msg->hci_status = p_data->role_chg.hci_status;
bdcpy(p_msg->bd_addr, p_data->role_chg.p_bda);
break;
- case BTM_BL_COLLISION_EVT:
- bdcpy(p_msg->bd_addr, p_data->conn.p_bda);
- break;;
+ case BTM_BL_COLLISION_EVT:
+ bdcpy(p_msg->bd_addr, p_data->conn.p_bda);
+ break;
}
p_msg->hdr.event = BTA_DM_ACL_CHANGE_EVT;
@@ -3264,7 +3327,8 @@
**
*******************************************************************************/
static void bta_dm_acl_change_cback (BD_ADDR p_bda, DEV_CLASS p_dc, BD_NAME p_bdn,
- UINT8 *features, BOOLEAN is_new)
+ UINT8 *features, BOOLEAN is_new,UINT16 handle,
+ tBT_TRANSPORT transport)
{
tBTA_DM_ACL_CHANGE * p_msg;
@@ -3273,7 +3337,10 @@
{
bdcpy (p_msg->bd_addr, p_bda);
p_msg->is_new = is_new;
-
+#if BLE_INCLUDED == TRUE
+ p_msg->handle = handle;
+ p_msg->transport = transport;
+#endif
/* This is collision case */
if (features != NULL)
{
@@ -3300,7 +3367,7 @@
static void bta_dm_rs_cback (tBTM_ROLE_SWITCH_CMPL *p1)
{
UNUSED(p1);
- APPL_TRACE_WARNING1("bta_dm_rs_cback:%d", bta_dm_cb.rs_event);
+ APPL_TRACE_WARNING("bta_dm_rs_cback:%d", bta_dm_cb.rs_event);
if(bta_dm_cb.rs_event == BTA_DM_API_SEARCH_EVT)
{
bta_dm_cb.search_msg.rs_res = BTA_DM_RS_OK; /* do not care about the result for now */
@@ -3336,13 +3403,13 @@
}
#endif
- APPL_TRACE_WARNING1("bta_dm_check_av:%d", bta_dm_cb.cur_av_count);
+ APPL_TRACE_WARNING("bta_dm_check_av:%d", bta_dm_cb.cur_av_count);
if(bta_dm_cb.cur_av_count)
{
for(i=0; i<bta_dm_cb.device_list.count; i++)
{
p_dev = &bta_dm_cb.device_list.peer_device[i];
- APPL_TRACE_WARNING4("[%d]: state:%d, info:x%x, avoid_rs %d",
+ APPL_TRACE_WARNING("[%d]: state:%d, info:x%x, avoid_rs %d",
i, p_dev->conn_state, p_dev->info, avoid_roleswitch);
if((p_dev->conn_state == BTA_DM_CONNECTED) && (p_dev->info & BTA_DM_DI_AV_ACTIVE) &&
(avoid_roleswitch == FALSE))
@@ -3386,6 +3453,7 @@
#if (defined(BTM_BUSY_LEVEL_CHANGE_INCLUDED) && BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE)
tBTA_DM_PEER_DEVICE *p_dev;
+ memset(&conn, 0, sizeof(tBTA_DM_SEC));
switch(p_data->acl_change.event)
{
@@ -3402,7 +3470,7 @@
p_dev = bta_dm_find_peer_device(p_bda);
if(p_dev)
{
- APPL_TRACE_DEBUG3("bta_dm_acl_change role chg info:x%x new_role:%d dev count:%d",
+ APPL_TRACE_DEBUG("bta_dm_acl_change role chg info:x%x new_role:%d dev count:%d",
p_dev->info, p_data->acl_change.new_role, bta_dm_cb.device_list.count);
if(p_dev->info & BTA_DM_DI_AV_ACTIVE)
{
@@ -3437,7 +3505,7 @@
bdcpy(conn.role_chg.bd_addr, p_bda);
conn.role_chg.new_role = (UINT8) p_data->acl_change.new_role;
if( bta_dm_cb.p_sec_cback )
- bta_dm_cb.p_sec_cback(BTA_DM_ROLE_CHG_EVT, &conn);
+ bta_dm_cb.p_sec_cback(BTA_DM_ROLE_CHG_EVT, (tBTA_DM_SEC *)&conn);
}
return;
}
@@ -3454,7 +3522,11 @@
{
for(i=0; i<bta_dm_cb.device_list.count; i++)
{
- if(!bdcmp( bta_dm_cb.device_list.peer_device[i].peer_bdaddr, p_bda))
+ if (!bdcmp( bta_dm_cb.device_list.peer_device[i].peer_bdaddr, p_bda)
+#if BLE_INCLUDED == TRUE
+ && bta_dm_cb.device_list.peer_device[i].conn_handle == p_data->acl_change.handle
+#endif
+ )
break;
}
@@ -3464,19 +3536,29 @@
bdcpy(bta_dm_cb.device_list.peer_device[bta_dm_cb.device_list.count].peer_bdaddr, p_bda);
bta_dm_cb.device_list.peer_device[bta_dm_cb.device_list.count].link_policy = bta_dm_cb.cur_policy;
bta_dm_cb.device_list.count++;
+#if BLE_INCLUDED == TRUE
+ bta_dm_cb.device_list.peer_device[i].conn_handle = p_data->acl_change.handle;
+ if (p_data->acl_change.transport == BT_TRANSPORT_LE)
+ bta_dm_cb.device_list.le_count++;
+#endif
}
bta_dm_cb.device_list.peer_device[i].conn_state = BTA_DM_CONNECTED;
bta_dm_cb.device_list.peer_device[i].pref_role = BTA_ANY_ROLE;
bdcpy(conn.link_up.bd_addr, p_bda);
bta_dm_cb.device_list.peer_device[i].info = BTA_DM_DI_NONE;
- if( ((NULL != (p = BTM_ReadLocalFeatures ())) && HCI_SNIFF_SUB_RATE_SUPPORTED(p)) &&
- ((NULL != (p = BTM_ReadRemoteFeatures (p_bda))) && HCI_SNIFF_SUB_RATE_SUPPORTED(p)) )
+#if BLE_INCLUDED == TRUE
+ conn.link_up.link_type = p_data->acl_change.transport;
+ bta_dm_cb.device_list.peer_device[i].transport = p_data->acl_change.transport;
+#endif
+
+ if (((NULL != (p = BTM_ReadLocalFeatures ())) && HCI_SNIFF_SUB_RATE_SUPPORTED(p)) &&
+ ((NULL != (p = BTM_ReadRemoteFeatures (p_bda))) && HCI_SNIFF_SUB_RATE_SUPPORTED(p)))
{
/* both local and remote devices support SSR */
bta_dm_cb.device_list.peer_device[i].info = BTA_DM_DI_USE_SSR;
}
- APPL_TRACE_WARNING1("info:x%x", bta_dm_cb.device_list.peer_device[i].info);
+ APPL_TRACE_WARNING("info:x%x", bta_dm_cb.device_list.peer_device[i].info);
if( bta_dm_cb.p_sec_cback )
bta_dm_cb.p_sec_cback(BTA_DM_LINK_UP_EVT, &conn);
@@ -3485,17 +3567,23 @@
{
for(i=0; i<bta_dm_cb.device_list.count; i++)
{
- if(bdcmp( bta_dm_cb.device_list.peer_device[i].peer_bdaddr, p_bda))
+ if (bdcmp( bta_dm_cb.device_list.peer_device[i].peer_bdaddr, p_bda)
+#if BLE_INCLUDED == TRUE
+ ||bta_dm_cb.device_list.peer_device[i].transport != p_data->acl_change.transport
+#endif
+ )
continue;
if( bta_dm_cb.device_list.peer_device[i].conn_state == BTA_DM_UNPAIRING )
{
- BTM_SecDeleteDevice(bta_dm_cb.device_list.peer_device[i].peer_bdaddr);
+ if (BTM_SecDeleteDevice(bta_dm_cb.device_list.peer_device[i].peer_bdaddr))
+ {
#if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
- /* remove all cached GATT information */
- BTA_GATTC_Refresh(p_bda);
+ /* remove all cached GATT information */
+ BTA_GATTC_Refresh(p_bda);
#endif
- issue_unpair_cb = TRUE;
+ issue_unpair_cb = TRUE;
+ }
}
conn.link_down.is_removed = bta_dm_cb.device_list.peer_device[i].remove_dev_pending;
@@ -3508,6 +3596,12 @@
}
if(bta_dm_cb.device_list.count)
bta_dm_cb.device_list.count--;
+#if BLE_INCLUDED == TRUE
+ if ((p_data->acl_change.transport == BT_TRANSPORT_LE) &&
+ (bta_dm_cb.device_list.le_count))
+ bta_dm_cb.device_list.le_count--;
+ conn.link_down.link_type = p_data->acl_change.transport;
+#endif
if(bta_dm_search_cb.wait_disc && !bdcmp(bta_dm_search_cb.peer_bdaddr, p_bda))
{
@@ -3515,7 +3609,7 @@
if(bta_dm_search_cb.sdp_results)
{
- APPL_TRACE_EVENT0(" timer stopped ");
+ APPL_TRACE_EVENT(" timer stopped ");
bta_sys_stop_timer(&bta_dm_search_cb.search_timer);
bta_dm_discover_next_device();
}
@@ -3706,7 +3800,7 @@
if(BTA_ID_AV == id)
bta_dm_cb.cur_av_count = app_id;
}
- APPL_TRACE_WARNING2("bta_dm_rm_cback:%d, status:%d", bta_dm_cb.cur_av_count, status);
+ APPL_TRACE_WARNING("bta_dm_rm_cback:%d, status:%d", bta_dm_cb.cur_av_count, status);
}
else if ((status == BTA_SYS_CONN_BUSY) || (status == BTA_SYS_CONN_IDLE))
{
@@ -3746,7 +3840,7 @@
((bta_role_switch_blacklist[i].lmp_sub_version & lmp_sub_version) ==
bta_role_switch_blacklist[i].lmp_sub_version))
{
- APPL_TRACE_EVENT0("Black list F/W version matches.. Delay Role Switch...");
+ APPL_TRACE_EVENT("Black list F/W version matches.. Delay Role Switch...");
return TRUE;
}
@@ -3767,7 +3861,7 @@
static void bta_dm_delay_role_switch_cback(TIMER_LIST_ENT *p_tle)
{
UNUSED(p_tle);
- APPL_TRACE_EVENT0("bta_dm_delay_role_switch_cback: initiating Delayed RS");
+ APPL_TRACE_EVENT("bta_dm_delay_role_switch_cback: initiating Delayed RS");
bta_dm_adjust_roles (FALSE);
}
@@ -3785,9 +3879,10 @@
static void bta_dm_remove_sec_dev_entry(BD_ADDR remote_bd_addr)
{
UINT16 index = 0;
- if (BTM_IsAclConnectionUp(remote_bd_addr))
+ if ( BTM_IsAclConnectionUp(remote_bd_addr, BT_TRANSPORT_LE) ||
+ BTM_IsAclConnectionUp(remote_bd_addr, BT_TRANSPORT_BR_EDR))
{
- APPL_TRACE_DEBUG1("%s ACL is not down. Schedule for Dev Removal when ACL closes",
+ APPL_TRACE_DEBUG("%s ACL is not down. Schedule for Dev Removal when ACL closes",
__FUNCTION__);
for (index = 0; index < bta_dm_cb.device_list.count; index ++)
{
@@ -3800,7 +3895,7 @@
}
else
{
- APPL_TRACE_ERROR1(" %s Device does not exist in DB", __FUNCTION__);
+ APPL_TRACE_ERROR(" %s Device does not exist in DB", __FUNCTION__);
}
}
else
@@ -3831,14 +3926,18 @@
UINT8 i;
BOOLEAN set_master_role = FALSE;
-
- if(bta_dm_cb.device_list.count)
+#if BLE_INCLUDED == TRUE
+ UINT8 br_count = bta_dm_cb.device_list.count - bta_dm_cb.device_list.le_count;
+#else
+ UINT8 br_count = bta_dm_cb.device_list.count;
+#endif
+ if (br_count)
{
/* the configuration is no scatternet
* or AV connection exists and there are more than one ACL link */
- if( (p_bta_dm_rm_cfg[0].cfg == BTA_DM_NO_SCATTERNET) ||
- (bta_dm_cb.cur_av_count && bta_dm_cb.device_list.count > 1) )
+ if ( (p_bta_dm_rm_cfg[0].cfg == BTA_DM_NO_SCATTERNET) ||
+ (bta_dm_cb.cur_av_count && br_count > 1) )
{
L2CA_SetDesireRole (HCI_ROLE_MASTER);
@@ -3848,7 +3947,11 @@
for(i=0; i<bta_dm_cb.device_list.count; i++)
{
- if(bta_dm_cb.device_list.peer_device[i].conn_state == BTA_DM_CONNECTED)
+ if (bta_dm_cb.device_list.peer_device[i].conn_state == BTA_DM_CONNECTED
+#if BLE_INCLUDED == TRUE
+ && bta_dm_cb.device_list.peer_device[i].transport == BT_TRANSPORT_BR_EDR
+#endif
+ )
{
if(!set_master_role && (bta_dm_cb.device_list.peer_device[i].pref_role != BTA_ANY_ROLE)
&& (p_bta_dm_rm_cfg[0].cfg == BTA_DM_PARTIAL_SCATTERNET))
@@ -3858,7 +3961,7 @@
}
if((bta_dm_cb.device_list.peer_device[i].pref_role == BTA_MASTER_ROLE_ONLY)
- || (bta_dm_cb.device_list.count > 1))
+ || (br_count > 1))
{
/* Initiating immediate role switch with certain remote devices
@@ -3988,7 +4091,7 @@
{
if (empty_slot == BTA_EIR_SERVER_NUM_CUSTOM_UUID)
{
- APPL_TRACE_ERROR0("No space to add UUID for EIR");
+ APPL_TRACE_ERROR("No space to add UUID for EIR");
return;
}
else
@@ -3998,7 +4101,7 @@
}
else
{
- APPL_TRACE_ERROR0("UUID is already added for EIR");
+ APPL_TRACE_ERROR("UUID is already added for EIR");
return;
}
}
@@ -4006,7 +4109,7 @@
{
if (match_slot == BTA_EIR_SERVER_NUM_CUSTOM_UUID)
{
- APPL_TRACE_ERROR0("UUID is not found for EIR");
+ APPL_TRACE_ERROR("UUID is not found for EIR");
return;
}
else
@@ -4087,7 +4190,7 @@
{
if( BTM_ReadLocalDeviceName( &local_name ) != BTM_SUCCESS )
{
- APPL_TRACE_ERROR0("Fail to read local device name for EIR");
+ APPL_TRACE_ERROR("Fail to read local device name for EIR");
}
}
#endif
@@ -4095,14 +4198,14 @@
/* Allocate a buffer to hold HCI command */
if ((p_buf = (BT_HDR *)GKI_getpoolbuf(BTM_CMD_POOL_ID)) == NULL)
{
- APPL_TRACE_ERROR0("bta_dm_set_eir couldn't allocate buffer");
+ APPL_TRACE_ERROR("bta_dm_set_eir couldn't allocate buffer");
return;
}
p = (UINT8 *)p_buf + BTM_HCI_EIR_OFFSET;
memset(p, 0x00, HCI_EXT_INQ_RESPONSE_LEN );
- APPL_TRACE_DEBUG0("BTA is generating EIR");
+ APPL_TRACE_DEBUG("BTA is generating EIR");
if( local_name )
local_name_len = strlen( local_name );
@@ -4127,7 +4230,7 @@
/* if UUID doesn't fit remaing space, shorten local name */
if ( local_name_len > (free_eir_length - 4 - num_uuid*LEN_UUID_16))
{
- APPL_TRACE_WARNING0("BTA EIR: local name is shortened");
+ APPL_TRACE_WARNING("BTA EIR: local name is shortened");
local_name_len = p_bta_dm_eir_cfg->bta_dm_eir_min_name_len;
data_type = BTM_EIR_SHORTENED_LOCAL_NAME_TYPE;
}
@@ -4161,7 +4264,7 @@
}
else /* not enough room for all UUIDs */
{
- APPL_TRACE_WARNING0("BTA EIR: UUID 16-bit list is truncated");
+ APPL_TRACE_WARNING("BTA EIR: UUID 16-bit list is truncated");
num_uuid = free_eir_length / LEN_UUID_16;
data_type = BTM_EIR_MORE_16BITS_UUID_TYPE;
}
@@ -4185,7 +4288,7 @@
if( data_type == BTM_EIR_MORE_16BITS_UUID_TYPE )
{
- APPL_TRACE_WARNING0("BTA EIR: UUID 16-bit list is truncated");
+ APPL_TRACE_WARNING("BTA EIR: UUID 16-bit list is truncated");
}
#if (BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0)
else
@@ -4202,7 +4305,7 @@
else
{
data_type = BTM_EIR_MORE_16BITS_UUID_TYPE;
- APPL_TRACE_WARNING0("BTA EIR: UUID 16-bit list is truncated");
+ APPL_TRACE_WARNING("BTA EIR: UUID 16-bit list is truncated");
break;
}
}
@@ -4239,7 +4342,7 @@
else
{
data_type = BTM_EIR_MORE_32BITS_UUID_TYPE;
- APPL_TRACE_WARNING0("BTA EIR: UUID 32-bit list is truncated");
+ APPL_TRACE_WARNING("BTA EIR: UUID 32-bit list is truncated");
break;
}
}
@@ -4272,7 +4375,7 @@
else
{
data_type = BTM_EIR_MORE_128BITS_UUID_TYPE;
- APPL_TRACE_WARNING0("BTA EIR: UUID 128-bit list is truncated");
+ APPL_TRACE_WARNING("BTA EIR: UUID 128-bit list is truncated");
break;
}
}
@@ -4352,12 +4455,12 @@
tBTA_SERVICE_MASK service_index = 0;
tBTM_EIR_SEARCH_RESULT result;
- APPL_TRACE_DEBUG6("BTA searching services in EIR of BDA:0x%02X%02X%02X%02X%02X%02X",
+ APPL_TRACE_DEBUG("BTA searching services in EIR of BDA:0x%02X%02X%02X%02X%02X%02X",
p_result->remote_bd_addr[0],p_result->remote_bd_addr[1],
p_result->remote_bd_addr[2],p_result->remote_bd_addr[3],
p_result->remote_bd_addr[4],p_result->remote_bd_addr[5]);
- APPL_TRACE_DEBUG1(" with services_to_search=0x%08X", *p_services_to_search);
+ APPL_TRACE_DEBUG(" with services_to_search=0x%08X", *p_services_to_search);
#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
/* always do GATT based service discovery by SDP instead of from EIR */
@@ -4406,7 +4509,7 @@
service_index++;
}
- APPL_TRACE_ERROR2("BTA EIR search result, services_to_search=0x%08X, services_found=0x%08X",
+ APPL_TRACE_ERROR("BTA EIR search result, services_to_search=0x%08X, services_found=0x%08X",
*p_services_to_search, *p_services_found);
}
#endif
@@ -4429,20 +4532,20 @@
if( adding )
{
- APPL_TRACE_EVENT1("Adding UUID=0x%04X into EIR", uuid16);
+ APPL_TRACE_EVENT("Adding UUID=0x%04X into EIR", uuid16);
BTM_AddEirService( bta_dm_cb.eir_uuid, uuid16 );
}
else
{
- APPL_TRACE_EVENT1("Removing UUID=0x%04X from EIR", uuid16);
+ APPL_TRACE_EVENT("Removing UUID=0x%04X from EIR", uuid16);
BTM_RemoveEirService( bta_dm_cb.eir_uuid, uuid16 );
}
bta_dm_set_eir (NULL);
- APPL_TRACE_EVENT2("bta_dm_eir_update_uuid UUID bit mask=0x%08X %08X",
+ APPL_TRACE_EVENT("bta_dm_eir_update_uuid UUID bit mask=0x%08X %08X",
bta_dm_cb.eir_uuid[1], bta_dm_cb.eir_uuid[0] );
}
#endif
@@ -4508,13 +4611,26 @@
** Returns None
**
*******************************************************************************/
-void bta_dm_encrypt_cback(BD_ADDR bd_addr, void *p_ref_data, tBTM_STATUS result)
+void bta_dm_encrypt_cback(BD_ADDR bd_addr, tBT_TRANSPORT transport, void *p_ref_data, tBTM_STATUS result)
{
tBTA_STATUS bta_status = BTA_SUCCESS;
- tBTA_DM_ENCRYPT_CBACK *p_callback = bta_dm_cb.p_encrypt_cback;
+ tBTA_DM_ENCRYPT_CBACK *p_callback = NULL;
+ UINT8 i ;
UNUSED(p_ref_data);
- bta_dm_cb.p_encrypt_cback = NULL;
+ for (i=0; i<bta_dm_cb.device_list.count; i++)
+ {
+ if (bdcmp( bta_dm_cb.device_list.peer_device[i].peer_bdaddr, bd_addr) == 0 &&
+ bta_dm_cb.device_list.peer_device[i].conn_state == BTA_DM_CONNECTED)
+ break;
+ }
+
+ if (i < bta_dm_cb.device_list.count)
+ {
+ p_callback = bta_dm_cb.device_list.peer_device[i].p_encrypt_cback;
+ bta_dm_cb.device_list.peer_device[i].p_encrypt_cback = NULL;
+ }
+
switch (result)
{
case BTM_SUCCESS:
@@ -4533,11 +4649,11 @@
break;
}
- APPL_TRACE_DEBUG2("bta_dm_encrypt_cback status =%d p_callback=0x%x", bta_status, p_callback);
+ APPL_TRACE_DEBUG("bta_dm_encrypt_cback status =%d p_callback=0x%x", bta_status, p_callback);
if (p_callback)
{
- (*p_callback)(bd_addr, bta_status);
+ (*p_callback)(bd_addr, transport, bta_status);
}
}
/*******************************************************************************
@@ -4551,24 +4667,44 @@
*******************************************************************************/
void bta_dm_set_encryption (tBTA_DM_MSG *p_data)
{
+ UINT8 i ;
- APPL_TRACE_DEBUG0("bta_dm_set_encryption"); //todo
+ APPL_TRACE_DEBUG("bta_dm_set_encryption"); //todo
if (!p_data->set_encryption.p_callback)
{
- APPL_TRACE_ERROR0("bta_dm_set_encryption callback is not provided");
+ APPL_TRACE_ERROR("bta_dm_set_encryption callback is not provided");
return;
}
- if (bta_dm_cb.p_encrypt_cback)
+ for (i=0; i<bta_dm_cb.device_list.count; i++)
{
- (*p_data->set_encryption.p_callback)(p_data->set_encryption.bd_addr, BTA_BUSY);
- return;
+ if (bdcmp( bta_dm_cb.device_list.peer_device[i].peer_bdaddr, p_data->set_encryption.bd_addr) == 0 &&
+ bta_dm_cb.device_list.peer_device[i].conn_state == BTA_DM_CONNECTED)
+ break;
}
+ if (i < bta_dm_cb.device_list.count)
+ {
+ if (bta_dm_cb.device_list.peer_device[i].p_encrypt_cback)
+ {
+ APPL_TRACE_ERROR("earlier enc was not done for same device");
+ (*p_data->set_encryption.p_callback)(p_data->set_encryption.bd_addr,
+ p_data->set_encryption.transport, BTA_BUSY);
+ return;
+ }
-
- bta_dm_cb.p_encrypt_cback = p_data->set_encryption.p_callback;
- bta_dm_cb.sec_act = p_data->set_encryption.sec_act;
- BTM_SetEncryption(p_data->set_encryption.bd_addr, bta_dm_encrypt_cback, &bta_dm_cb.sec_act);
+ if (BTM_SetEncryption(p_data->set_encryption.bd_addr,
+ p_data->set_encryption.transport,
+ bta_dm_encrypt_cback,
+ &p_data->set_encryption.sec_act)
+ == BTM_CMD_STARTED)
+ {
+ bta_dm_cb.device_list.peer_device[i].p_encrypt_cback = p_data->set_encryption.p_callback;
+ }
+ }
+ else
+ {
+ APPL_TRACE_ERROR(" %s Device not found/not connected", __FUNCTION__);
+ }
}
/*******************************************************************************
@@ -4620,7 +4756,7 @@
tBTA_DM_SEARCH result;
tBTM_INQ_INFO *p_inq_info;
UINT16 service_class;
- APPL_TRACE_DEBUG0("bta_dm_observe_results_cb")
+ APPL_TRACE_DEBUG("bta_dm_observe_results_cb")
bdcpy(result.inq_res.bd_addr, p_inq->remote_bd_addr);
result.inq_res.rssi = p_inq->rssi;
@@ -4663,7 +4799,7 @@
{
tBTA_DM_SEARCH data;
- APPL_TRACE_DEBUG0("bta_dm_observe_cmpl_cb");
+ APPL_TRACE_DEBUG("bta_dm_observe_cmpl_cb");
data.inq_cmpl.num_resps = ((tBTM_INQUIRY_CMPL *)p_result)->num_resp;
if (bta_dm_search_cb.p_scan_cback)
@@ -4690,7 +4826,7 @@
char* p_name = NULL;
UINT8 i;
- APPL_TRACE_DEBUG0("bta_dm_ble_smp_cback");
+ APPL_TRACE_DEBUG("bta_dm_ble_smp_cback");
if (!bta_dm_cb.p_sec_cback)
return BTM_NOT_AUTHORIZED;
@@ -4712,7 +4848,7 @@
#if BTM_OOB_INCLUDED == FALSE
status = BTM_SUCCESS;
#endif
- APPL_TRACE_EVENT2("io mitm: %d oob_data:%d", p_data->io_req.auth_req, p_data->io_req.oob_data);
+ APPL_TRACE_EVENT("io mitm: %d oob_data:%d", p_data->io_req.auth_req, p_data->io_req.oob_data);
break;
@@ -4849,7 +4985,7 @@
break;
default:
- APPL_TRACE_DEBUG1("Unknown key type %d", key_type);
+ APPL_TRACE_DEBUG("Unknown key type %d", key_type);
break;
}
return;
@@ -4874,7 +5010,7 @@
(tBTM_LE_KEY_VALUE *)&p_data->add_ble_key.blekey,
p_data->add_ble_key.key_type))
{
- APPL_TRACE_ERROR2 ("BTA_DM: Error adding BLE Key for device %08x%04x",
+ APPL_TRACE_ERROR ("BTA_DM: Error adding BLE Key for device %08x%04x",
(p_data->add_ble_key.bd_addr[0]<<24)+(p_data->add_ble_key.bd_addr[1]<<16)+\
(p_data->add_ble_key.bd_addr[2]<<8)+p_data->add_ble_key.bd_addr[3],
(p_data->add_ble_key.bd_addr[4]<<8)+p_data->add_ble_key.bd_addr[5]);
@@ -4898,7 +5034,7 @@
p_data->add_ble_device.dev_type ,
p_data->add_ble_device.addr_type))
{
- APPL_TRACE_ERROR2 ("BTA_DM: Error adding BLE Device for device %08x%04x",
+ APPL_TRACE_ERROR ("BTA_DM: Error adding BLE Device for device %08x%04x",
(p_data->add_ble_device.bd_addr[0]<<24)+(p_data->add_ble_device.bd_addr[1]<<16)+ \
(p_data->add_ble_device.bd_addr[2]<<8)+p_data->add_ble_device.bd_addr[3],
(p_data->add_ble_device.bd_addr[4]<<8)+p_data->add_ble_device.bd_addr[5]);
@@ -4920,7 +5056,6 @@
{
if (p_data->pin_reply.accept)
{
-
BTM_BlePasskeyReply(p_data->ble_passkey_reply.bd_addr, BTM_SUCCESS, p_data->ble_passkey_reply.passkey);
}
else
@@ -4991,8 +5126,42 @@
BTM_BleSetConnScanParams(p_data->ble_set_scan_params.scan_int,
p_data->ble_set_scan_params.scan_window);
}
+/*******************************************************************************
+**
+** Function bta_dm_ble_update_conn_params
+**
+** Description This function update LE connection parameters.
+**
+** Parameters:
+**
+*******************************************************************************/
+void bta_dm_ble_update_conn_params (tBTA_DM_MSG *p_data)
+{
+ if (!L2CA_UpdateBleConnParams(p_data->ble_update_conn_params.bd_addr,
+ p_data->ble_update_conn_params.min_int,
+ p_data->ble_update_conn_params.max_int,
+ p_data->ble_update_conn_params.latency,
+ p_data->ble_update_conn_params.timeout))
+ {
+ APPL_TRACE_ERROR("Update connection parameters failed!");
+ }
+}
-
+#if BLE_PRIVACY_SPT == TRUE
+/*******************************************************************************
+**
+** Function bta_dm_ble_config_local_privacy
+**
+** Description This function set the local device LE privacy settings.
+**
+** Parameters:
+**
+*******************************************************************************/
+void bta_dm_ble_config_local_privacy (tBTA_DM_MSG *p_data)
+{
+ BTM_BleConfigPrivacy (p_data->ble_local_privacy.privacy_enable);
+}
+#endif
/*******************************************************************************
**
** Function bta_dm_ble_observe
@@ -5004,17 +5173,16 @@
*******************************************************************************/
void bta_dm_ble_observe (tBTA_DM_MSG *p_data)
{
-
tBTM_STATUS status;
if (p_data->ble_observe.start)
{
/*Save the callback to be called when a scan results are available */
bta_dm_search_cb.p_scan_cback = p_data->ble_observe.p_cback;
if ((status = BTM_BleObserve(TRUE, p_data->ble_observe.duration,
- bta_dm_observe_results_cb, bta_dm_observe_cmpl_cb))!= BTM_SUCCESS)
+ bta_dm_observe_results_cb, bta_dm_observe_cmpl_cb))!= BTM_CMD_STARTED)
{
tBTA_DM_SEARCH data;
- APPL_TRACE_WARNING2(" %s BTM_BleObserve failed. status %d",__FUNCTION__,status);
+ APPL_TRACE_WARNING(" %s BTM_BleObserve failed. status %d",__FUNCTION__,status);
data.inq_cmpl.num_resps = 0;
if (bta_dm_search_cb.p_scan_cback)
{
@@ -5056,8 +5224,16 @@
*******************************************************************************/
void bta_dm_ble_set_adv_config (tBTA_DM_MSG *p_data)
{
- BTM_BleWriteAdvData(p_data->ble_set_adv_data.data_mask,
- (tBTM_BLE_ADV_DATA *)p_data->ble_set_adv_data.p_adv_cfg);
+ tBTA_STATUS status = BTA_FAILURE;
+
+ if (BTM_BleWriteAdvData(p_data->ble_set_adv_data.data_mask,
+ (tBTM_BLE_ADV_DATA *)p_data->ble_set_adv_data.p_adv_cfg) == BTM_SUCCESS)
+ {
+ status = BTA_SUCCESS;
+ }
+
+ if (p_data->ble_set_adv_data.p_adv_data_cback)
+ (*p_data->ble_set_adv_data.p_adv_data_cback)(status);
}
/*******************************************************************************
@@ -5071,8 +5247,16 @@
*******************************************************************************/
void bta_dm_ble_set_scan_rsp (tBTA_DM_MSG *p_data)
{
- BTM_BleWriteScanRsp(p_data->ble_set_adv_data.data_mask,
- (tBTM_BLE_ADV_DATA *)p_data->ble_set_adv_data.p_adv_cfg);
+ tBTA_STATUS status = BTA_FAILURE;
+
+ if(BTM_BleWriteScanRsp(p_data->ble_set_adv_data.data_mask,
+ (tBTM_BLE_ADV_DATA *)p_data->ble_set_adv_data.p_adv_cfg) == BTM_SUCCESS)
+ {
+ status = BTA_SUCCESS;
+ }
+
+ if (p_data->ble_set_adv_data.p_adv_data_cback)
+ (*p_data->ble_set_adv_data.p_adv_data_cback)(status);
}
/*******************************************************************************
@@ -5089,6 +5273,509 @@
BTM_BleBroadcast(p_data->ble_observe.start);
}
+/*******************************************************************************
+**
+** Function bta_dm_ble_multi_adv_enb
+**
+** Description This function enables a single advertising instance
+**
+** Parameters:
+**
+*******************************************************************************/
+void bta_dm_ble_multi_adv_enb(tBTA_DM_MSG *p_data)
+{
+ tBTM_STATUS btm_status = 0;
+ void *p_ref = NULL;
+
+ bta_dm_cb.p_multi_adv_cback = p_data->ble_multi_adv_enb.p_cback;
+ if(BTM_BleMaxMultiAdvInstanceCount() > 0 && NULL != p_data->ble_multi_adv_enb.p_ref)
+ {
+ btm_status = BTM_BleEnableAdvInstance((tBTM_BLE_ADV_PARAMS*)
+ p_data->ble_multi_adv_enb.p_params,
+ p_data->ble_multi_adv_enb.p_cback,
+ p_data->ble_multi_adv_enb.p_ref);
+ }
+
+ if(BTM_CMD_STARTED != btm_status)
+ {
+ bta_dm_cb.p_multi_adv_cback(BTA_BLE_MULTI_ADV_ENB_EVT, 0xFF,
+ p_data->ble_multi_adv_enb.p_ref, BTA_FAILURE);
+ }
+}
+/*******************************************************************************
+**
+** Function bta_dm_ble_multi_adv_param_upd
+**
+** Description This function updates multiple advertising instance parameters
+**
+** Parameters:
+**
+*******************************************************************************/
+void bta_dm_ble_multi_adv_upd_param(tBTA_DM_MSG *p_data)
+{
+ tBTM_STATUS btm_status = 0;
+ void *p_ref = NULL;
+
+ if(BTM_BleMaxMultiAdvInstanceCount() > 0 && p_data->ble_multi_adv_param.inst_id > 0
+ && p_data->ble_multi_adv_param.inst_id < BTM_BleMaxMultiAdvInstanceCount())
+ {
+ btm_status = BTM_BleUpdateAdvInstParam(p_data->ble_multi_adv_param.inst_id,
+ (tBTM_BLE_ADV_PARAMS*)p_data->ble_multi_adv_param.p_params);
+ }
+
+ if(BTM_CMD_STARTED != btm_status)
+ {
+ p_ref = btm_ble_multi_adv_get_ref(p_data->ble_multi_adv_param.inst_id);
+ bta_dm_cb.p_multi_adv_cback(BTA_BLE_MULTI_ADV_PARAM_EVT,
+ p_data->ble_multi_adv_param.inst_id, p_ref, BTA_FAILURE);
+ }
+}
+/*******************************************************************************
+**
+** Function bta_dm_ble_multi_adv_data
+**
+** Description This function write multiple advertising instance adv data
+** or scan response data
+**
+** Parameters:
+**
+*******************************************************************************/
+void bta_dm_ble_multi_adv_data(tBTA_DM_MSG *p_data)
+{
+ tBTM_STATUS btm_status = 0;
+ void *p_ref = NULL;
+
+ if(BTM_BleMaxMultiAdvInstanceCount() > 0 && p_data->ble_multi_adv_data.inst_id > 0
+ && p_data->ble_multi_adv_data.inst_id < BTM_BleMaxMultiAdvInstanceCount())
+ {
+ btm_status = BTM_BleCfgAdvInstData(p_data->ble_multi_adv_data.inst_id,
+ p_data->ble_multi_adv_data.is_scan_rsp,
+ p_data->ble_multi_adv_data.data_mask,
+ (tBTM_BLE_ADV_DATA*)p_data->ble_multi_adv_data.p_data);
+ }
+
+ if(BTM_CMD_STARTED != btm_status)
+ {
+ p_ref = btm_ble_multi_adv_get_ref(p_data->ble_multi_adv_data.inst_id);
+ bta_dm_cb.p_multi_adv_cback(BTA_BLE_MULTI_ADV_DATA_EVT,
+ p_data->ble_multi_adv_data.inst_id, p_ref, BTA_FAILURE);
+ }
+
+}
+/*******************************************************************************
+**
+** Function btm_dm_ble_multi_adv_disable
+**
+** Description This function disable a single adv instance
+**
+** Parameters:
+**
+*******************************************************************************/
+void btm_dm_ble_multi_adv_disable(tBTA_DM_MSG *p_data)
+{
+ tBTM_STATUS btm_status = 0;
+ void *p_ref = NULL;
+
+ if(BTM_BleMaxMultiAdvInstanceCount() > 0 && p_data->ble_multi_adv_disable.inst_id > 0
+ && p_data->ble_multi_adv_disable.inst_id < BTM_BleMaxMultiAdvInstanceCount())
+ {
+ btm_status = BTM_BleDisableAdvInstance(p_data->ble_multi_adv_disable.inst_id);
+ }
+
+ if(BTM_CMD_STARTED != btm_status)
+ {
+ p_ref = btm_ble_multi_adv_get_ref(p_data->ble_multi_adv_disable.inst_id);
+ bta_dm_cb.p_multi_adv_cback(BTA_BLE_MULTI_ADV_DISABLE_EVT,
+ p_data->ble_multi_adv_disable.inst_id, p_ref, BTA_FAILURE);
+ }
+}
+
+/*******************************************************************************
+**
+** Function bta_dm_ble_setup_storage
+**
+** Description This function configures up the storage parameters for ADV batch scanning
+**
+** Parameters:
+**
+*******************************************************************************/
+void bta_dm_ble_setup_storage (tBTA_DM_MSG *p_data)
+{
+ tBTM_STATUS btm_status = 0;
+ tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
+
+ BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
+
+ if (0 != cmn_ble_vsc_cb.tot_scan_results_strg)
+ {
+ btm_status = BTM_BleSetStorageConfig(p_data->ble_set_storage.batch_scan_full_max,
+ p_data->ble_set_storage.batch_scan_trunc_max,
+ p_data->ble_set_storage.batch_scan_notify_threshold,
+ p_data->ble_set_storage.p_setup_cback,
+ p_data->ble_set_storage.p_thres_cback,
+ p_data->ble_set_storage.p_read_rep_cback,
+ p_data->ble_set_storage.ref_value);
+ }
+
+ if(BTM_CMD_STARTED != btm_status)
+ bta_ble_scan_setup_cb(BTM_BLE_BATCH_SCAN_CFG_STRG_EVT, p_data->ble_set_storage.ref_value,
+ btm_status);
+}
+
+/*******************************************************************************
+**
+** Function bta_dm_ble_enable_batch_scan
+**
+** Description This function sets up the parameters and enables batch scan
+**
+** Parameters:
+**
+*******************************************************************************/
+void bta_dm_ble_enable_batch_scan (tBTA_DM_MSG *p_data)
+{
+ tBTM_STATUS btm_status = 0;
+ tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
+
+ BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
+
+ if (0 != cmn_ble_vsc_cb.tot_scan_results_strg)
+ {
+ btm_status = BTM_BleEnableBatchScan(p_data->ble_enable_scan.scan_mode,
+ p_data->ble_enable_scan.scan_int,
+ p_data->ble_enable_scan.scan_window,
+ p_data->ble_enable_scan.discard_rule,
+ p_data->ble_enable_scan.addr_type,
+ p_data->ble_enable_scan.ref_value);
+ }
+
+ if(BTM_CMD_STARTED != btm_status)
+ bta_ble_scan_setup_cb(BTM_BLE_BATCH_SCAN_ENABLE_EVT, p_data->ble_enable_scan.ref_value,
+ btm_status);
+}
+
+/*******************************************************************************
+**
+** Function bta_dm_ble_disable_batch_scan
+**
+** Description This function disables the batch scan
+**
+** Parameters:
+**
+*******************************************************************************/
+void bta_dm_ble_disable_batch_scan (tBTA_DM_MSG *p_data)
+{
+ UNUSED(p_data);
+ tBTM_STATUS btm_status = 0;
+ tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
+
+ BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
+
+ if (0 != cmn_ble_vsc_cb.tot_scan_results_strg)
+ {
+ btm_status = BTM_BleDisableBatchScan(p_data->ble_disable_scan.ref_value);
+ }
+
+ if(BTM_CMD_STARTED != btm_status)
+ bta_ble_scan_setup_cb(BTM_BLE_BATCH_SCAN_DISABLE_EVT, p_data->ble_enable_scan.ref_value,
+ btm_status);
+}
+
+/*******************************************************************************
+**
+** Function bta_dm_ble_read_scan_reports
+**
+** Description This function reads the batch scan reports
+**
+** Parameters:
+**
+*******************************************************************************/
+void bta_dm_ble_read_scan_reports(tBTA_DM_MSG *p_data)
+{
+ tBTM_STATUS btm_status = 0;
+ tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
+
+ BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
+
+ if (0 != cmn_ble_vsc_cb.tot_scan_results_strg)
+ {
+ btm_status = BTM_BleReadScanReports(p_data->ble_read_reports.scan_type,
+ p_data->ble_read_reports.ref_value);
+ }
+
+ if(BTM_CMD_STARTED != btm_status)
+ bta_ble_scan_setup_cb(BTM_BLE_BATCH_SCAN_READ_REPTS_EVT, p_data->ble_enable_scan.ref_value,
+ btm_status);
+}
+
+/*******************************************************************************
+**
+** Function bta_dm_ble_track_advertiser
+**
+** Description This function tracks the specific advertiser
+**
+** Parameters:
+**
+*******************************************************************************/
+void bta_dm_ble_track_advertiser(tBTA_DM_MSG *p_data)
+{
+ tBTM_STATUS btm_status = 0;
+ BD_ADDR bda;
+ memset(&bda, 0 , sizeof(BD_ADDR));
+ tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
+
+ BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
+
+ if (0 != cmn_ble_vsc_cb.tot_scan_results_strg)
+ {
+ btm_status = BTM_BleTrackAdvertiser(p_data->ble_track_advert.p_track_adv_cback,
+ p_data->ble_track_advert.ref_value);
+ }
+
+ if(BTM_CMD_STARTED != btm_status)
+ p_data->ble_track_advert.p_track_adv_cback(0, 0, bda, 0, p_data->ble_track_advert.ref_value);
+}
+
+/*******************************************************************************
+**
+** Function bta_ble_scan_setup_cb
+**
+** Description Handle the setup callback from BTM layer and forward it to app layer
+**
+** Parameters:
+**
+*******************************************************************************/
+void bta_ble_scan_setup_cb(tBTM_BLE_BATCH_SCAN_EVT evt, tBTM_BLE_REF_VALUE ref_value,
+ tBTM_STATUS status)
+{
+ tBTA_BLE_BATCH_SCAN_EVT bta_evt = 0;
+
+ APPL_TRACE_DEBUG("bta_ble_scan_setup_cb : evt: %d, ref_value: %d, status:%d", evt,
+ ref_value, status);
+
+ switch(evt)
+ {
+ case BTM_BLE_BATCH_SCAN_ENABLE_EVT:
+ bta_evt = BTA_BLE_BATCH_SCAN_ENB_EVT;
+ break;
+ case BTM_BLE_BATCH_SCAN_CFG_STRG_EVT:
+ bta_evt = BTA_BLE_BATCH_SCAN_CFG_STRG_EVT;
+ break;
+ case BTM_BLE_BATCH_SCAN_DISABLE_EVT:
+ bta_evt = BTA_BLE_BATCH_SCAN_DIS_EVT;
+ break;
+ case BTM_BLE_BATCH_SCAN_PARAM_EVT:
+ bta_evt = BTA_BLE_BATCH_SCAN_PARAM_EVT;
+ break;
+ default:
+ break;
+ }
+
+ if(NULL != bta_dm_cb.p_setup_cback)
+ bta_dm_cb.p_setup_cback(bta_evt, ref_value, status);
+}
+
+
+#if BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE
+/*******************************************************************************
+**
+** Function bta_ble_scan_pf_cmpl
+**
+** Description ADV payload filtering operation complete callback
+**
+**
+** Returns TRUE if handled, otherwise FALSE.
+**
+*******************************************************************************/
+static void bta_ble_scan_cfg_cmpl(tBTM_BLE_PF_ACTION action, tBTM_BLE_SCAN_COND_OP cfg_op,
+ tBTM_BLE_PF_AVBL_SPACE avbl_space, tBTM_STATUS status,
+ tBTM_BLE_REF_VALUE ref_value)
+{
+ tBTA_STATUS st = (status == BTM_SUCCESS) ? BTA_SUCCESS: BTA_FAILURE;
+
+ APPL_TRACE_DEBUG("bta_ble_scan_cfg_cmpl: %d, %d, %d, %d", action, cfg_op, avbl_space, status);
+
+ if(bta_dm_cb.p_scan_filt_cfg_cback)
+ bta_dm_cb.p_scan_filt_cfg_cback(action, cfg_op, avbl_space, st, ref_value);
+}
+
+/*******************************************************************************
+**
+** Function bta_ble_status_cmpl
+**
+** Description ADV payload filtering enable / disable complete callback
+**
+**
+** Returns None
+**
+*******************************************************************************/
+static void bta_ble_status_cmpl(tBTM_BLE_PF_ACTION action, tBTM_BLE_REF_VALUE ref_value,
+ tBTM_STATUS status)
+{
+ tBTA_STATUS st = (status == BTM_SUCCESS) ? BTA_SUCCESS: BTA_FAILURE;
+
+ APPL_TRACE_DEBUG("bta_ble_status_cmpl: %d, %d", action, status);
+
+ if(bta_dm_cb.p_scan_filt_status_cback)
+ bta_dm_cb.p_scan_filt_status_cback(action, ref_value, st);
+}
+
+/*******************************************************************************
+**
+** Function bta_dm_cfg_filter_cond
+**
+** Description This function configure adv payload filtering condition
+**
+** Parameters:
+**
+*******************************************************************************/
+void bta_dm_cfg_filter_cond (tBTA_DM_MSG *p_data)
+{
+ tBTM_STATUS st = BTM_MODE_UNSUPPORTED;
+ tBTA_STATUS status = BTA_FAILURE;
+
+ tBTM_BLE_VSC_CB cmn_vsc_cb;
+
+ APPL_TRACE_DEBUG("bta_dm_cfg_filter_cond");
+ BTM_BleGetVendorCapabilities(&cmn_vsc_cb);
+ if(0 != cmn_vsc_cb.filter_support)
+ {
+ if ((st = BTM_BleCfgFilterCondition(p_data->ble_cfg_filter_cond.action,
+ p_data->ble_cfg_filter_cond.cond_type,
+ (tBTM_BLE_PF_FILT_INDEX)p_data->ble_cfg_filter_cond.filt_index,
+ (tBTM_BLE_PF_COND_PARAM *)p_data->ble_cfg_filter_cond.p_cond_param,
+ bta_ble_scan_cfg_cmpl, p_data->ble_cfg_filter_cond.ref_value))
+ == BTM_CMD_STARTED)
+ {
+ bta_dm_cb.p_scan_filt_cfg_cback = p_data->ble_cfg_filter_cond.p_filt_cfg_cback;
+ return;
+ }
+ }
+
+ if (p_data->ble_cfg_filter_cond.p_filt_cfg_cback)
+ p_data->ble_cfg_filter_cond.p_filt_cfg_cback(BTA_DM_BLE_PF_CONFIG_EVT,
+ p_data->ble_cfg_filter_cond.cond_type, 0, status,
+ p_data->ble_cfg_filter_cond.ref_value);
+ return;
+}
+
+/*******************************************************************************
+**
+** Function bta_dm_enable_scan_filter
+**
+** Description This function enable/disable adv payload filtering condition
+**
+** Parameters:
+**
+*******************************************************************************/
+void bta_dm_enable_scan_filter(tBTA_DM_MSG *p_data)
+{
+ tBTM_STATUS st = BTM_MODE_UNSUPPORTED;
+ tBTA_STATUS status = BTA_FAILURE;
+
+ tBTM_BLE_VSC_CB cmn_vsc_cb;
+ APPL_TRACE_DEBUG("bta_dm_enable_scan_filter");
+ BTM_BleGetVendorCapabilities(&cmn_vsc_cb);
+
+ if(0 != cmn_vsc_cb.filter_support)
+ {
+ if((st = BTM_BleEnableDisableFilterFeature(p_data->ble_enable_scan_filt.action,
+ p_data->ble_enable_scan_filt.p_filt_status_cback,
+ (tBTM_BLE_REF_VALUE)p_data->ble_enable_scan_filt.ref_value)) == BTM_CMD_STARTED)
+ bta_dm_cb.p_scan_filt_status_cback = p_data->ble_enable_scan_filt.p_filt_status_cback;
+ return;
+ }
+
+ if (p_data->ble_enable_scan_filt.p_filt_status_cback)
+ p_data->ble_enable_scan_filt.p_filt_status_cback (BTA_DM_BLE_PF_ENABLE_EVT,
+ p_data->ble_enable_scan_filt.ref_value, status);
+
+}
+
+/*******************************************************************************
+**
+** Function bta_dm_scan_filter_param_setup
+**
+** Description This function sets up scan filter params
+**
+** Parameters:
+**
+*******************************************************************************/
+void bta_dm_scan_filter_param_setup (tBTA_DM_MSG *p_data)
+{
+ tBTM_STATUS st = BTM_MODE_UNSUPPORTED;
+ tBTA_STATUS status = BTA_FAILURE;
+
+ tBTM_BLE_VSC_CB cmn_vsc_cb;
+
+ APPL_TRACE_DEBUG("bta_dm_scan_filter_param_setup");
+ BTM_BleGetVendorCapabilities(&cmn_vsc_cb);
+ if(0 != cmn_vsc_cb.filter_support)
+ {
+ if ((st = BTM_BleAdvFilterParamSetup(p_data->ble_scan_filt_param_setup.action,
+ p_data->ble_scan_filt_param_setup.filt_index,
+ (tBTM_BLE_PF_FILT_PARAMS *)p_data->ble_scan_filt_param_setup.p_filt_params,
+ p_data->ble_scan_filt_param_setup.p_target,
+ p_data->ble_scan_filt_param_setup.p_filt_param_cback,
+ p_data->ble_scan_filt_param_setup.ref_value)) == BTM_CMD_STARTED)
+ {
+ bta_dm_cb.p_scan_filt_param_cback = p_data->ble_scan_filt_param_setup.p_filt_param_cback;
+ return;
+ }
+ }
+
+ if (p_data->ble_scan_filt_param_setup.p_filt_param_cback)
+ p_data->ble_scan_filt_param_setup.p_filt_param_cback (BTA_DM_BLE_PF_ENABLE_EVT, 0,
+ p_data->ble_scan_filt_param_setup.ref_value, status);
+
+ return;
+}
+#endif
+
+/*******************************************************************************
+**
+** Function bta_ble_enable_scan_cmpl
+**
+** Description ADV payload filtering enable / disable complete callback
+**
+**
+** Returns None
+**
+*******************************************************************************/
+static void bta_ble_energy_info_cmpl(tBTM_BLE_TX_TIME_MS tx_time,
+ tBTM_BLE_RX_TIME_MS rx_time,
+ tBTM_BLE_IDLE_TIME_MS idle_time,
+ tBTM_BLE_ENERGY_USED energy_used,
+ tBTM_STATUS status)
+{
+ tBTA_STATUS st = (status == BTM_SUCCESS) ? BTA_SUCCESS: BTA_FAILURE;
+ tBTA_DM_CONTRL_STATE ctrl_state = 0;
+
+ if (BTA_SUCCESS == st)
+ ctrl_state = bta_dm_pm_obtain_controller_state();
+
+ if (bta_dm_cb.p_energy_info_cback)
+ bta_dm_cb.p_energy_info_cback(tx_time, rx_time, idle_time, energy_used, ctrl_state, st);
+}
+
+/*******************************************************************************
+**
+** Function bta_dm_ble_get_energy_info
+**
+** Description This function obtains the energy info
+**
+** Parameters:
+**
+*******************************************************************************/
+void bta_dm_ble_get_energy_info(tBTA_DM_MSG *p_data)
+{
+ tBTM_STATUS btm_status = 0;
+
+ bta_dm_cb.p_energy_info_cback = p_data->ble_energy_info.p_energy_info_cback;
+ btm_status = BTM_BleGetEnergyInfo(bta_ble_energy_info_cmpl);
+ if (BTM_CMD_STARTED != btm_status)
+ bta_ble_energy_info_cmpl(0, 0, 0, 0, btm_status);
+}
+
#if ((defined BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE))
#ifndef BTA_DM_GATT_CLOSE_DELAY_TOUT
#define BTA_DM_GATT_CLOSE_DELAY_TOUT 1000
@@ -5157,7 +5844,7 @@
if ( bta_dm_search_cb.ble_raw_used + sizeof(tBTA_GATT_ID) < bta_dm_search_cb.ble_raw_size )
{
- APPL_TRACE_DEBUG3("ADDING BLE SERVICE uuid=0x%x, ble_ptr = 0x%x, ble_raw_used = 0x%x", service_id.uuid.uu.uuid16,bta_dm_search_cb.p_ble_rawdata,bta_dm_search_cb.ble_raw_used);
+ APPL_TRACE_DEBUG("ADDING BLE SERVICE uuid=0x%x, ble_ptr = 0x%x, ble_raw_used = 0x%x", service_id.uuid.uu.uuid16,bta_dm_search_cb.p_ble_rawdata,bta_dm_search_cb.ble_raw_used);
if(bta_dm_search_cb.p_ble_rawdata)
{
@@ -5168,16 +5855,16 @@
}
else
{
- APPL_TRACE_ERROR0("p_ble_rawdata is NULL");
+ APPL_TRACE_ERROR("p_ble_rawdata is NULL");
}
}
else
{
- APPL_TRACE_ERROR3("%s out of room to accomodate more service ids ble_raw_size = %d ble_raw_used = %d", __FUNCTION__,bta_dm_search_cb.ble_raw_size, bta_dm_search_cb.ble_raw_used );
+ APPL_TRACE_ERROR("%s out of room to accomodate more service ids ble_raw_size = %d ble_raw_used = %d", __FUNCTION__,bta_dm_search_cb.ble_raw_size, bta_dm_search_cb.ble_raw_used );
}
- APPL_TRACE_ERROR1("bta_dm_gatt_disc_result serivce_id len=%d ", service_id.uuid.len);
+ APPL_TRACE_ERROR("bta_dm_gatt_disc_result serivce_id len=%d ", service_id.uuid.len);
if ( bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE)
{
@@ -5204,7 +5891,7 @@
{
tBTA_DM_MSG *p_msg;
- APPL_TRACE_DEBUG1("bta_dm_gatt_disc_complete conn_id = %d",conn_id);
+ APPL_TRACE_DEBUG("bta_dm_gatt_disc_complete conn_id = %d",conn_id);
if (bta_dm_search_cb.uuid_to_search > 0) bta_dm_search_cb.uuid_to_search --;
@@ -5310,7 +5997,7 @@
btm_dm_start_disc_gatt_services(bta_dm_search_cb.conn_id);
}
else
- BTA_GATTC_Open(bta_dm_search_cb.client_if, bd_addr, TRUE);
+ BTA_GATTC_Open(bta_dm_search_cb.client_if, bd_addr, TRUE, BTA_GATT_TRANSPORT_LE);
}
/*******************************************************************************
@@ -5349,14 +6036,14 @@
p1 = bta_dm_search_cb.peer_bdaddr;
p2 = p_data->remote_bda;
- APPL_TRACE_DEBUG5("DM Search state= %d search_cb.peer_dbaddr: [%08x%04x] connected_bda= [%08x%04x] ",
+ APPL_TRACE_DEBUG("DM Search state= %d search_cb.peer_dbaddr: [%08x%04x] connected_bda= [%08x%04x] ",
bta_dm_search_cb.state,
((p1[0])<<24)+((p1[1])<<16)+((p1[2])<<8)+(p1[3]),
((p1[4])<<8)+ p1[5],
((p2[0])<<24)+((p2[1])<<16)+((p2[2])<<8)+(p2[3]),
((p2[4])<<8)+ p2[5]);
- APPL_TRACE_DEBUG3("BTA_GATTC_OPEN_EVT conn_id = %d client_if=%d status = %d" ,
+ APPL_TRACE_DEBUG("BTA_GATTC_OPEN_EVT conn_id = %d client_if=%d status = %d" ,
p_data->conn_id,
p_data->client_if,
p_data->status);
@@ -5384,12 +6071,12 @@
*******************************************************************************/
static void bta_dm_gattc_callback(tBTA_GATTC_EVT event, tBTA_GATTC *p_data)
{
- APPL_TRACE_DEBUG1("bta_dm_gattc_callback event = %d", event);
+ APPL_TRACE_DEBUG("bta_dm_gattc_callback event = %d", event);
switch (event)
{
case BTA_GATTC_REG_EVT:
- APPL_TRACE_DEBUG1("BTA_GATTC_REG_EVT client_if = %d", p_data->reg_oper.client_if);
+ APPL_TRACE_DEBUG("BTA_GATTC_REG_EVT client_if = %d", p_data->reg_oper.client_if);
if (p_data->reg_oper.status == BTA_GATT_OK)
bta_dm_search_cb.client_if = p_data->reg_oper.client_if;
else
@@ -5410,7 +6097,7 @@
break;
case BTA_GATTC_CLOSE_EVT:
- APPL_TRACE_DEBUG1("BTA_GATTC_CLOSE_EVT reason = %d", p_data->close.reason);
+ APPL_TRACE_DEBUG("BTA_GATTC_CLOSE_EVT reason = %d", p_data->close.reason);
/* in case of disconnect before search is completed */
if ( (bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE) &&
!memcmp(p_data->close.remote_bda, bta_dm_search_cb.peer_bdaddr, BD_ADDR_LEN))
@@ -5425,4 +6112,30 @@
}
#endif /* BTA_GATT_INCLUDED */
+
+/*******************************************************************************
+**
+** Function bta_dm_ctrl_features_rd_cmpl_cback
+**
+** Description callback to handle controller feature read complete
+**
+** Parameters:
+**
+*******************************************************************************/
+static void bta_dm_ctrl_features_rd_cmpl_cback(tBTM_STATUS result)
+{
+ APPL_TRACE_DEBUG("%s status = %d ", __FUNCTION__, result);
+ if (result == BTM_SUCCESS)
+ {
+ if(bta_dm_cb.p_sec_cback)
+ bta_dm_cb.p_sec_cback(BTA_DM_LE_FEATURES_READ, NULL);
+ }
+ else
+ {
+ APPL_TRACE_ERROR("%s Ctrl BLE feature read failed: status :%d",__FUNCTION__, result);
+ }
+
+}
+
+
#endif /* BLE_INCLUDED */
diff --git a/bta/dm/bta_dm_api.c b/bta/dm/bta_dm_api.c
index 7db7f7b..9000207 100644
--- a/bta/dm/bta_dm_api.c
+++ b/bta/dm/bta_dm_api.c
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 2003-2012 Broadcom Corporation
+ * Copyright (C) 2003-2014 Broadcom Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -32,6 +32,7 @@
#include "btm_int.h"
#include <string.h>
#include "utl.h"
+#include "vendor_ble.h"
/*****************************************************************************
** Constants
@@ -71,15 +72,12 @@
memset(&bta_dm_cb, 0, sizeof(bta_dm_cb));
- GKI_sched_lock();
bta_sys_register (BTA_ID_DM, &bta_dm_reg );
bta_sys_register (BTA_ID_DM_SEARCH, &bta_dm_search_reg );
/* if UUID list is not provided as static data */
bta_sys_eir_register(bta_dm_eir_update_uuid);
- GKI_sched_unlock();
-
if ((p_msg = (tBTA_DM_API_ENABLE *) GKI_getbuf(sizeof(tBTA_DM_API_ENABLE))) != NULL)
{
p_msg->hdr.event = BTA_DM_API_ENABLE_EVT;
@@ -133,7 +131,7 @@
{
BT_HDR *p_msg;
- APPL_TRACE_API0("BTA_EnableTestMode");
+ APPL_TRACE_API("BTA_EnableTestMode");
if ((p_msg = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
{
@@ -158,7 +156,7 @@
{
BT_HDR *p_msg;
- APPL_TRACE_API0("BTA_DisableTestMode");
+ APPL_TRACE_API("BTA_DisableTestMode");
if ((p_msg = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
{
@@ -179,14 +177,7 @@
*******************************************************************************/
BOOLEAN BTA_DmIsDeviceUp(void)
{
-
- BOOLEAN status;
-
- GKI_sched_lock();
- status = BTM_IsDeviceUp();
- GKI_sched_unlock();
- return status;
-
+ return BTM_IsDeviceUp();
}
/*******************************************************************************
@@ -262,7 +253,7 @@
void BTA_DmSetScanParam (UINT16 page_scan_interval, UINT16 page_scan_window,
UINT16 inquiry_scan_interval, UINT16 inquiry_scan_window)
{
- APPL_TRACE_API4 ("BTA_DmSetScanParam: %d, %d, %d, %d",
+ APPL_TRACE_API ("BTA_DmSetScanParam: %d, %d, %d, %d",
page_scan_interval, page_scan_window,
inquiry_scan_interval, inquiry_scan_window);
@@ -505,7 +496,7 @@
UINT8 link_role;
BTM_GetRole(bd_addr, &link_role);
- APPL_TRACE_API1("BTA_DmIsMaster role:x%x", link_role);
+ APPL_TRACE_API("BTA_DmIsMaster role:x%x", link_role);
if(link_role == BTM_ROLE_MASTER)
{
is_master = TRUE;
@@ -526,12 +517,29 @@
*******************************************************************************/
void BTA_DmBond(BD_ADDR bd_addr)
{
+ BTA_DmBondByTransport (bd_addr, BTA_TRANSPORT_UNKNOWN);
+}
+
+/*******************************************************************************
+**
+** Function BTA_DmBondByTransports
+**
+** Description This function initiates a bonding procedure with a peer
+** device
+**
+**
+** Returns void
+**
+*******************************************************************************/
+void BTA_DmBondByTransport(BD_ADDR bd_addr, tBTA_TRANSPORT transport)
+{
tBTA_DM_API_BOND *p_msg;
if ((p_msg = (tBTA_DM_API_BOND *) GKI_getbuf(sizeof(tBTA_DM_API_BOND))) != NULL)
{
p_msg->hdr.event = BTA_DM_API_BOND_EVT;
bdcpy(p_msg->bd_addr, bd_addr);
+ p_msg->transport = transport;
bta_sys_sendmsg(p_msg);
}
@@ -1085,6 +1093,22 @@
}
/*******************************************************************************
+**
+** Function BTA_DmGetConnectionState
+**
+** Description Returns whether the remote device is currently connected.
+**
+** Returns 0 if the device is NOT connected.
+**
+*******************************************************************************/
+UINT16 BTA_DmGetConnectionState( BD_ADDR bd_addr )
+{
+ tBTA_DM_PEER_DEVICE * p_dev = bta_dm_find_peer_device(bd_addr);
+ return (p_dev && p_dev->conn_state == BTA_DM_CONNECTED);
+}
+
+
+/*******************************************************************************
** Device Identification (DI) Server Functions
*******************************************************************************/
/*******************************************************************************
@@ -1210,7 +1234,7 @@
{
bta_sys_cb.sys_features = sys_features;
- APPL_TRACE_API1("BTA_SysFeatures: sys_features = %d", sys_features);
+ APPL_TRACE_API("BTA_SysFeatures: sys_features = %d", sys_features);
}
/*******************************************************************************
@@ -1237,8 +1261,6 @@
}
}
-#if BLE_INCLUDED == TRUE
-
/*******************************************************************************
**
** Function BTA_DmAddBleKey
@@ -1466,7 +1488,7 @@
#if BLE_INCLUDED == TRUE
tBTA_DM_API_BLE_ADV_PARAMS *p_msg;
- APPL_TRACE_API2 ("BTA_DmSetBleAdvParam: %d, %d", adv_int_min, adv_int_max);
+ APPL_TRACE_API ("BTA_DmSetBleAdvParam: %d, %d", adv_int_min, adv_int_max);
if ((p_msg = (tBTA_DM_API_BLE_ADV_PARAMS *) GKI_getbuf(sizeof(tBTA_DM_API_BLE_ADV_PARAMS))) != NULL)
{
@@ -1487,6 +1509,9 @@
}
#endif
}
+/*******************************************************************************
+** BLE ADV data management API
+********************************************************************************/
#if BLE_INCLUDED == TRUE
/*******************************************************************************
@@ -1495,19 +1520,26 @@
**
** Description This function is called to override the BTA default ADV parameters.
**
-** Parameters Pointer to User defined ADV data structure
+** Parameters data_mask: adv data mask.
+** p_adv_cfg: Pointer to User defined ADV data structure. This
+** memory space can not be freed until p_adv_data_cback
+** is received.
+** p_adv_data_cback: set adv data complete callback.
**
** Returns None
**
*******************************************************************************/
-void BTA_DmBleSetAdvConfig (tBTA_BLE_AD_MASK data_mask, tBTA_BLE_ADV_DATA *p_adv_cfg)
+void BTA_DmBleSetAdvConfig (tBTA_BLE_AD_MASK data_mask, tBTA_BLE_ADV_DATA *p_adv_cfg,
+ tBTA_SET_ADV_DATA_CMPL_CBACK *p_adv_data_cback)
{
tBTA_DM_API_SET_ADV_CONFIG *p_msg;
- if ((p_msg = (tBTA_DM_API_SET_ADV_CONFIG *) GKI_getbuf(sizeof(tBTA_DM_API_SET_ADV_CONFIG))) != NULL)
+ if ((p_msg = (tBTA_DM_API_SET_ADV_CONFIG *)
+ GKI_getbuf(sizeof(tBTA_DM_API_SET_ADV_CONFIG))) != NULL)
{
p_msg->hdr.event = BTA_DM_API_BLE_SET_ADV_CONFIG_EVT;
- p_msg->data_mask = data_mask;
+ p_msg->data_mask = data_mask;
+ p_msg->p_adv_data_cback = p_adv_data_cback;
p_msg->p_adv_cfg = p_adv_cfg;
bta_sys_sendmsg(p_msg);
@@ -1525,14 +1557,17 @@
** Returns None
**
*******************************************************************************/
-BTA_API extern void BTA_DmBleSetScanRsp (tBTA_BLE_AD_MASK data_mask, tBTA_BLE_ADV_DATA *p_adv_cfg)
+BTA_API extern void BTA_DmBleSetScanRsp (tBTA_BLE_AD_MASK data_mask, tBTA_BLE_ADV_DATA *p_adv_cfg,
+ tBTA_SET_ADV_DATA_CMPL_CBACK *p_adv_data_cback)
{
tBTA_DM_API_SET_ADV_CONFIG *p_msg;
- if ((p_msg = (tBTA_DM_API_SET_ADV_CONFIG *) GKI_getbuf(sizeof(tBTA_DM_API_SET_ADV_CONFIG))) != NULL)
+ if ((p_msg = (tBTA_DM_API_SET_ADV_CONFIG *)
+ GKI_getbuf(sizeof(tBTA_DM_API_SET_ADV_CONFIG))) != NULL)
{
p_msg->hdr.event = BTA_DM_API_BLE_SET_SCAN_RSP_EVT;
- p_msg->data_mask = data_mask;
+ p_msg->data_mask = data_mask;
+ p_msg->p_adv_data_cback = p_adv_data_cback;
p_msg->p_adv_cfg = p_adv_cfg;
bta_sys_sendmsg(p_msg);
@@ -1541,6 +1576,163 @@
/*******************************************************************************
**
+** Function BTA_DmBleSetStorageParams
+**
+** Description This function is called to override the BTA scan response.
+**
+** Parameters batch_scan_full_max -Max storage space (in %) allocated to full scanning
+** batch_scan_trunc_max -Max storage space (in %) allocated to truncated scanning
+** batch_scan_notify_threshold -Setup notification level based on total space
+** p_setup_cback - Setup callback pointer
+** p_thres_cback - Threshold callback pointer
+** p_rep_cback - Reports callback pointer
+** ref_value - Ref value
+**
+** Returns None
+**
+*******************************************************************************/
+BTA_API extern void BTA_DmBleSetStorageParams(UINT8 batch_scan_full_max,
+ UINT8 batch_scan_trunc_max,
+ UINT8 batch_scan_notify_threshold,
+ tBTA_BLE_SCAN_SETUP_CBACK *p_setup_cback,
+ tBTA_BLE_SCAN_THRESHOLD_CBACK *p_thres_cback,
+ tBTA_BLE_SCAN_REP_CBACK* p_rep_cback,
+ tBTA_DM_BLE_REF_VALUE ref_value)
+{
+ tBTA_DM_API_SET_STORAGE_CONFIG *p_msg;
+ bta_dm_cb.p_setup_cback = p_setup_cback;
+ if ((p_msg = (tBTA_DM_API_SET_STORAGE_CONFIG *)
+ GKI_getbuf(sizeof(tBTA_DM_API_SET_STORAGE_CONFIG))) != NULL)
+ {
+ p_msg->hdr.event = BTA_DM_API_BLE_SETUP_STORAGE_EVT;
+ p_msg->p_setup_cback=bta_ble_scan_setup_cb;
+ p_msg->p_thres_cback=p_thres_cback;
+ p_msg->p_read_rep_cback=p_rep_cback;
+ p_msg->ref_value = ref_value;
+ p_msg->batch_scan_full_max = batch_scan_full_max;
+ p_msg->batch_scan_trunc_max = batch_scan_trunc_max;
+ p_msg->batch_scan_notify_threshold = batch_scan_notify_threshold;
+ bta_sys_sendmsg(p_msg);
+ }
+}
+
+/*******************************************************************************
+**
+** Function BTA_DmBleEnableBatchScan
+**
+** Description This function is called to enable the batch scan
+**
+** Parameters scan_mode -Batch scan mode
+** scan_interval - Scan interval
+** scan_window - Scan window
+** discard_rule -Discard rules
+** addr_type - Address type
+** ref_value - Reference value
+**
+** Returns None
+**
+*******************************************************************************/
+BTA_API extern void BTA_DmBleEnableBatchScan(tBTA_BLE_SCAN_MODE scan_mode,
+ UINT32 scan_interval, UINT32 scan_window,
+ tBTA_BLE_DISCARD_RULE discard_rule,
+ tBLE_ADDR_TYPE addr_type,
+ tBTA_DM_BLE_REF_VALUE ref_value)
+{
+ tBTA_DM_API_ENABLE_SCAN *p_msg;
+
+ if ((p_msg = (tBTA_DM_API_ENABLE_SCAN *) GKI_getbuf(sizeof(tBTA_DM_API_ENABLE_SCAN))) != NULL)
+ {
+ p_msg->hdr.event = BTA_DM_API_BLE_ENABLE_BATCH_SCAN_EVT;
+ p_msg->scan_mode = scan_mode;
+ p_msg->scan_int = scan_interval;
+ p_msg->scan_window = scan_window;
+ p_msg->discard_rule = discard_rule;
+ p_msg->addr_type = addr_type;
+ p_msg->ref_value = ref_value;
+ bta_sys_sendmsg(p_msg);
+ }
+}
+
+/*******************************************************************************
+**
+** Function BTA_DmBleDisableBatchScan
+**
+** Description This function is called to disable the batch scan
+**
+** Parameters ref_value - Reference value
+**
+** Returns None
+**
+*******************************************************************************/
+BTA_API extern void BTA_DmBleDisableBatchScan(tBTA_DM_BLE_REF_VALUE ref_value)
+{
+ tBTA_DM_API_DISABLE_SCAN *p_msg;
+
+ if ((p_msg = (tBTA_DM_API_DISABLE_SCAN *)
+ GKI_getbuf(sizeof(tBTA_DM_API_DISABLE_SCAN))) != NULL)
+ {
+ p_msg->hdr.event = BTA_DM_API_BLE_DISABLE_BATCH_SCAN_EVT;
+ p_msg->ref_value = ref_value;
+ bta_sys_sendmsg(p_msg);
+ }
+}
+
+/*******************************************************************************
+**
+** Function BTA_DmBleReadScanReports
+**
+** Description This function is called to read scan reports
+**
+** Parameters scan_type -Batch scan mode
+** ref_value - Reference value
+**
+** Returns None
+**
+*******************************************************************************/
+BTA_API extern void BTA_DmBleReadScanReports(tBTA_BLE_SCAN_MODE scan_type,
+ tBTA_DM_BLE_REF_VALUE ref_value)
+{
+ tBTA_DM_API_READ_SCAN_REPORTS *p_msg;
+
+ if ((p_msg = (tBTA_DM_API_READ_SCAN_REPORTS *)
+ GKI_getbuf(sizeof(tBTA_DM_API_READ_SCAN_REPORTS))) != NULL)
+ {
+ p_msg->hdr.event = BTA_DM_API_BLE_READ_SCAN_REPORTS_EVT;
+ p_msg->scan_type = scan_type;
+ p_msg->ref_value = ref_value;
+ bta_sys_sendmsg(p_msg);
+ }
+}
+
+/*******************************************************************************
+**
+** Function BTA_DmBleTrackAdvertiser
+**
+** Description This function is called to track advertiser
+**
+** Parameters ref_value - Reference value
+** p_track_adv_cback - Track ADV callback
+**
+** Returns None
+**
+*******************************************************************************/
+BTA_API extern void BTA_DmBleTrackAdvertiser(tBTA_DM_BLE_REF_VALUE ref_value,
+ tBTA_BLE_TRACK_ADV_CBACK *p_track_adv_cback)
+{
+ tBTA_DM_API_TRACK_ADVERTISER *p_msg;
+
+ if ((p_msg = (tBTA_DM_API_TRACK_ADVERTISER *)
+ GKI_getbuf(sizeof(tBTA_DM_API_TRACK_ADVERTISER))) != NULL)
+ {
+ p_msg->hdr.event = BTA_DM_API_BLE_TRACK_ADVERTISER_EVT;
+ p_msg->p_track_adv_cback = p_track_adv_cback;
+ p_msg->ref_value = ref_value;
+ bta_sys_sendmsg(p_msg);
+ }
+}
+
+/*******************************************************************************
+**
** Function BTA_DmBleBroadcast
**
** Description This function starts or stops LE broadcasting.
@@ -1554,7 +1746,7 @@
{
tBTA_DM_API_BLE_OBSERVE *p_msg;
- APPL_TRACE_API1("BTA_DmBleBroadcast: start = %d ", start);
+ APPL_TRACE_API("BTA_DmBleBroadcast: start = %d ", start);
if ((p_msg = (tBTA_DM_API_BLE_OBSERVE *) GKI_getbuf(sizeof(tBTA_DM_API_BLE_OBSERVE))) != NULL)
{
@@ -1599,6 +1791,81 @@
}
#endif
}
+
+/*******************************************************************************
+**
+** Function bta_dm_discover_send_msg
+**
+** Description This function send discover message to BTA task.
+**
+** Returns void
+**
+*******************************************************************************/
+static void bta_dm_discover_send_msg(BD_ADDR bd_addr, tBTA_SERVICE_MASK_EXT *p_services,
+ tBTA_DM_SEARCH_CBACK *p_cback, BOOLEAN sdp_search,
+ tBTA_TRANSPORT transport)
+{
+ tBTA_DM_API_DISCOVER *p_msg;
+ UINT16 len = p_services ? (sizeof(tBTA_DM_API_DISCOVER) +
+ sizeof(tBT_UUID) * p_services->num_uuid) :
+ sizeof(tBTA_DM_API_DISCOVER);
+
+ if ((p_msg = (tBTA_DM_API_DISCOVER *) GKI_getbuf(len)) != NULL)
+ {
+ memset(p_msg, 0, len);
+
+ p_msg->hdr.event = BTA_DM_API_DISCOVER_EVT;
+ bdcpy(p_msg->bd_addr, bd_addr);
+ p_msg->p_cback = p_cback;
+ p_msg->sdp_search = sdp_search;
+ p_msg->transport = transport;
+
+ if (p_services != NULL)
+ {
+#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
+ p_msg->services = p_services->srvc_mask;
+ p_msg->num_uuid = p_services->num_uuid;
+ if (p_services->num_uuid != 0)
+ {
+ p_msg->p_uuid = (tBT_UUID *)(p_msg + 1);
+ memcpy(p_msg->p_uuid, p_services->p_uuid, sizeof(tBT_UUID) * p_services->num_uuid);
+ }
+#endif
+ }
+
+ bta_sys_sendmsg(p_msg);
+ }
+}
+
+/*******************************************************************************
+**
+** Function BTA_DmDiscoverByTransport
+**
+** Description This function does service discovery on particular transport
+** for services of a
+** peer device. When services.num_uuid is 0, it indicates all
+** GATT based services are to be searched; otherwise a list of
+** UUID of interested services should be provided through
+** p_services->p_uuid.
+**
+** Parameters bd_addr: Bluetooth address of remote device
+** p_services :bit mask of the list of services to be discovered
+** p_cback : Callback on which result will be received
+** sdp_search: if TRUE SDP search will be initiated, else services present in
+** EIR structure of remote device will be returned.
+** transport : Physical transport BR/EDR or LE
+** Returns void
+**
+*******************************************************************************/
+
+void BTA_DmDiscoverByTransport(BD_ADDR bd_addr, tBTA_SERVICE_MASK_EXT *p_services,
+ tBTA_DM_SEARCH_CBACK *p_cback, BOOLEAN sdp_search,
+ tBTA_TRANSPORT transport)
+{
+ bta_dm_discover_send_msg(bd_addr, p_services, p_cback, sdp_search, transport);
+}
+
+
/*******************************************************************************
**
** Function BTA_DmDiscoverExt
@@ -1609,7 +1876,11 @@
** UUID of interested services should be provided through
** p_services->p_uuid.
**
-**
+** Parameters bd_addr: Bluetooth address of remote device
+** p_services :bit mask of the list of services to be discovered
+** p_cback : Callback on which result will be received
+** sdp_search: if TRUE SDP search will be initiated, else services present in
+** EIR structure of remote device will be returned.
**
** Returns void
**
@@ -1617,40 +1888,7 @@
void BTA_DmDiscoverExt(BD_ADDR bd_addr, tBTA_SERVICE_MASK_EXT *p_services,
tBTA_DM_SEARCH_CBACK *p_cback, BOOLEAN sdp_search)
{
-#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
- tBTA_DM_API_DISCOVER *p_msg;
- UINT16 len = p_services ? (sizeof(tBTA_DM_API_DISCOVER) + sizeof(tBT_UUID) * p_services->num_uuid) :
- sizeof(tBTA_DM_API_DISCOVER);
-
- if ((p_msg = (tBTA_DM_API_DISCOVER *) GKI_getbuf(len)) != NULL)
- {
- memset(p_msg, 0, len);
-
- p_msg->hdr.event = BTA_DM_API_DISCOVER_EVT;
- bdcpy(p_msg->bd_addr, bd_addr);
- p_msg->p_cback = p_cback;
- p_msg->sdp_search = sdp_search;
-
- if (p_services != NULL)
- {
- p_msg->services = p_services->srvc_mask;
- p_msg->num_uuid = p_services->num_uuid;
-
- if (p_services->num_uuid != 0)
- {
- p_msg->p_uuid = (tBT_UUID *)(p_msg + 1);
- memcpy(p_msg->p_uuid, p_services->p_uuid, sizeof(tBT_UUID) * p_services->num_uuid);
- }
- }
-
- bta_sys_sendmsg(p_msg);
- }
-#else
- UNUSED(bd_addr);
- UNUSED(p_services);
- UNUSED(p_cback);
- UNUSED(sdp_search);
-#endif
+ bta_dm_discover_send_msg(bd_addr, p_services, p_cback, sdp_search, BTA_TRANSPORT_UNKNOWN);
}
@@ -1745,7 +1983,454 @@
*******************************************************************************/
void BTA_DmBleConfigLocalPrivacy(BOOLEAN privacy_enable)
{
- UNUSED(privacy_enable);
+#if BLE_INCLUDED == TRUE && BLE_PRIVACY_SPT == TRUE
+ tBTA_DM_API_LOCAL_PRIVACY *p_msg;
+
+ if ((p_msg = (tBTA_DM_API_LOCAL_PRIVACY *) GKI_getbuf(sizeof(tBTA_DM_API_ENABLE_PRIVACY))) != NULL)
+ {
+ memset (p_msg, 0, sizeof(tBTA_DM_API_LOCAL_PRIVACY));
+
+ p_msg->hdr.event = BTA_DM_API_LOCAL_PRIVACY_EVT;
+ p_msg->privacy_enable = privacy_enable;
+
+ bta_sys_sendmsg(p_msg);
+ }
+#else
+ UNUSED (privacy_enable);
+#endif
+}
+
+#if BLE_INCLUDED == TRUE
+/*******************************************************************************
+**
+** Function BTA_BleEnableAdvInstance
+**
+** Description This function enable a Multi-ADV instance with the specififed
+** adv parameters
+**
+** Parameters p_params: pointer to the adv parameter structure.
+** p_cback: callback function associated to this adv instance.
+** p_ref: reference data pointer to this adv instance.
+**
+** Returns BTA_SUCCESS if command started sucessfully; otherwise failure.
+**
+*******************************************************************************/
+void BTA_BleEnableAdvInstance (tBTA_BLE_ADV_PARAMS *p_params,
+ tBTA_BLE_MULTI_ADV_CBACK *p_cback,
+ void *p_ref)
+{
+ tBTA_DM_API_BLE_MULTI_ADV_ENB *p_msg;
+ UINT16 len = sizeof(tBTA_BLE_ADV_PARAMS) + sizeof(tBTA_DM_API_BLE_MULTI_ADV_ENB);
+
+ APPL_TRACE_API ("BTA_BleEnableAdvInstance");
+
+ if ((p_msg = (tBTA_DM_API_BLE_MULTI_ADV_ENB *) GKI_getbuf(len)) != NULL)
+ {
+ memset(p_msg, 0, sizeof(tBTA_DM_API_BLE_MULTI_ADV_ENB));
+
+ p_msg->hdr.event = BTA_DM_API_BLE_MULTI_ADV_ENB_EVT;
+ p_msg->p_cback = (void *)p_cback;
+ if (p_params != NULL)
+ {
+ p_msg->p_params = (void *)(p_msg + 1);
+ memcpy(p_msg->p_params, p_params, sizeof(tBTA_BLE_ADV_PARAMS));
+ }
+ p_msg->p_ref = p_ref;
+
+ bta_sys_sendmsg(p_msg);
+ }
+}
+
+/*******************************************************************************
+**
+** Function BTA_BleUpdateAdvInstParam
+**
+** Description This function update a Multi-ADV instance with the specififed
+** adv parameters.
+**
+** Parameters inst_id: Adv instance to update the parameter.
+** p_params: pointer to the adv parameter structure.
+**
+** Returns BTA_SUCCESS if command started sucessfully; otherwise failure.
+**
+*******************************************************************************/
+void BTA_BleUpdateAdvInstParam (UINT8 inst_id, tBTA_BLE_ADV_PARAMS *p_params)
+{
+ tBTA_DM_API_BLE_MULTI_ADV_PARAM *p_msg;
+ UINT16 len = sizeof(tBTA_BLE_ADV_PARAMS) + sizeof(tBTA_DM_API_BLE_MULTI_ADV_PARAM);
+
+ APPL_TRACE_API ("BTA_BleUpdateAdvInstParam");
+ if ((p_msg = (tBTA_DM_API_BLE_MULTI_ADV_PARAM *) GKI_getbuf(len)) != NULL)
+ {
+ memset(p_msg, 0, sizeof(tBTA_DM_API_BLE_MULTI_ADV_PARAM));
+ p_msg->hdr.event = BTA_DM_API_BLE_MULTI_ADV_PARAM_UPD_EVT;
+ p_msg->inst_id = inst_id;
+ p_msg->p_params = (void *)(p_msg + 1);
+ memcpy(p_msg->p_params, p_params, sizeof(tBTA_BLE_ADV_PARAMS));
+
+ bta_sys_sendmsg(p_msg);
+ }
+}
+
+/*******************************************************************************
+**
+** Function BTA_BleCfgAdvInstData
+**
+** Description This function configure a Multi-ADV instance with the specififed
+** adv data or scan response data.
+**
+** Parameter inst_id: Adv instance to configure the adv data or scan response.
+** is_scan_rsp: is the data scan response or adv data.
+** data_mask: adv data type as bit mask.
+** p_data: pointer to the ADV data structure tBTA_BLE_ADV_DATA. This
+** memory space can not be freed until BTA_BLE_MULTI_ADV_DATA_EVT
+** is sent to application.
+**
+** Returns BTA_SUCCESS if command started sucessfully; otherwise failure.
+**
+*******************************************************************************/
+void BTA_BleCfgAdvInstData (UINT8 inst_id, BOOLEAN is_scan_rsp,
+ tBTA_BLE_AD_MASK data_mask,
+ tBTA_BLE_ADV_DATA *p_data)
+{
+ tBTA_DM_API_BLE_MULTI_ADV_DATA *p_msg;
+ UINT16 len = sizeof(tBTA_DM_API_BLE_MULTI_ADV_DATA) ;
+
+ APPL_TRACE_API ("BTA_BleCfgAdvInstData");
+
+ if ((p_msg = (tBTA_DM_API_BLE_MULTI_ADV_DATA *) GKI_getbuf(len)) != NULL)
+ {
+ memset(p_msg, 0, len);
+ p_msg->hdr.event = BTA_DM_API_BLE_MULTI_ADV_DATA_EVT;
+ p_msg->inst_id = inst_id;
+ p_msg->is_scan_rsp = is_scan_rsp;
+ p_msg->data_mask = data_mask;
+ p_msg->p_data = p_data;
+
+ bta_sys_sendmsg(p_msg);
+ }
+}
+
+/*******************************************************************************
+**
+** Function BTA_BleDisableAdvInstance
+**
+** Description This function disable a Multi-ADV instance.
+**
+** Parameter inst_id: instance ID to disable.
+**
+** Returns BTA_SUCCESS if command started sucessfully; otherwise failure.
+**
+*******************************************************************************/
+void BTA_BleDisableAdvInstance (UINT8 inst_id)
+{
+ tBTA_DM_API_BLE_MULTI_ADV_DISABLE *p_msg;
+
+ APPL_TRACE_API ("BTA_BleDisableAdvInstance: %d", inst_id);
+ if ((p_msg = (tBTA_DM_API_BLE_MULTI_ADV_DISABLE *)
+ GKI_getbuf(sizeof(tBTA_DM_API_BLE_MULTI_ADV_DISABLE))) != NULL)
+ {
+ memset(p_msg, 0, sizeof(tBTA_DM_API_BLE_MULTI_ADV_DISABLE));
+ p_msg->hdr.event = BTA_DM_API_BLE_MULTI_ADV_DISABLE_EVT;
+ p_msg->inst_id = inst_id;
+ bta_sys_sendmsg(p_msg);
+ }
+}
+
+/*******************************************************************************
+**
+** Function BTA_DmBleCfgFilterCondition
+**
+** Description This function is called to configure the adv data payload filter
+** condition.
+**
+** Parameters action: to read/write/clear
+** cond_type: filter condition type
+** filt_index - Filter index
+** p_cond: filter condition parameter
+** p_cmpl_back - Command completed callback
+** ref_value - Reference value
+**
+** Returns void
+**
+*******************************************************************************/
+void BTA_DmBleCfgFilterCondition(tBTA_DM_BLE_SCAN_COND_OP action,
+ tBTA_DM_BLE_PF_COND_TYPE cond_type,
+ tBTA_DM_BLE_PF_FILT_INDEX filt_index,
+ tBTA_DM_BLE_PF_COND_PARAM *p_cond,
+ tBTA_DM_BLE_PF_CFG_CBACK *p_cmpl_cback,
+ tBTA_DM_BLE_REF_VALUE ref_value)
+{
+#if BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE
+ tBTA_DM_API_CFG_FILTER_COND *p_msg;
+ APPL_TRACE_API ("BTA_DmBleCfgFilterCondition: %d, %d", action, cond_type);
+
+ UINT16 len = sizeof(tBTA_DM_API_CFG_FILTER_COND) +
+ sizeof(tBTA_DM_BLE_PF_COND_PARAM);
+ UINT8 *p;
+
+ if (NULL != p_cond)
+ {
+ switch(cond_type)
+ {
+ case BTA_DM_BLE_PF_SRVC_DATA_PATTERN:
+ case BTA_DM_BLE_PF_MANU_DATA:
+ /* Length of pattern and pattern mask and other elements in */
+ /* tBTA_DM_BLE_PF_MANU_COND */
+ len += ((p_cond->manu_data.data_len) * 2) +
+ sizeof(UINT16) + sizeof(UINT16) + sizeof(UINT8);
+ break;
+
+ case BTA_DM_BLE_PF_LOCAL_NAME:
+ len += ((p_cond->local_name.data_len) + sizeof(UINT8));
+ break;
+
+ case BTM_BLE_PF_SRVC_UUID:
+ case BTM_BLE_PF_SRVC_SOL_UUID:
+ len += sizeof(tBLE_BD_ADDR) + sizeof(tBTA_DM_BLE_PF_COND_MASK);
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ if ((p_msg = (tBTA_DM_API_CFG_FILTER_COND *) GKI_getbuf(len)) != NULL)
+ {
+ memset (p_msg, 0, len);
+ p_msg->hdr.event = BTA_DM_API_CFG_FILTER_COND_EVT;
+ p_msg->action = action;
+ p_msg->cond_type = cond_type;
+ p_msg->filt_index = filt_index;
+ p_msg->p_filt_cfg_cback = p_cmpl_cback;
+ p_msg->ref_value = ref_value;
+
+ if (p_cond)
+ {
+ p_msg->p_cond_param = (tBTA_DM_BLE_PF_COND_PARAM *)(p_msg + 1);
+ memcpy(p_msg->p_cond_param, p_cond, sizeof(tBTA_DM_BLE_PF_COND_PARAM));
+
+ p = (UINT8 *)(p_msg->p_cond_param + 1);
+
+ if (cond_type == BTA_DM_BLE_PF_SRVC_DATA_PATTERN ||
+ cond_type == BTA_DM_BLE_PF_MANU_DATA)
+ {
+ p_msg->p_cond_param->manu_data.p_pattern = p;
+ p_msg->p_cond_param->manu_data.data_len = p_cond->manu_data.data_len;
+ memcpy(p_msg->p_cond_param->manu_data.p_pattern, p_cond->manu_data.p_pattern,
+ p_cond->manu_data.data_len);
+ p += p_cond->manu_data.data_len;
+
+ if (cond_type == BTA_DM_BLE_PF_MANU_DATA)
+ {
+ p_msg->p_cond_param->manu_data.company_id_mask =
+ p_cond->manu_data.company_id_mask;
+ if ( p_cond->manu_data.p_pattern_mask != NULL)
+ {
+ p_msg->p_cond_param->manu_data.p_pattern_mask = p;
+ memcpy(p_msg->p_cond_param->manu_data.p_pattern_mask,
+ p_cond->manu_data.p_pattern_mask, p_cond->manu_data.data_len);
+ }
+ }
+ }
+ else if (cond_type == BTA_DM_BLE_PF_LOCAL_NAME)
+ {
+ p_msg->p_cond_param->local_name.p_data = p;
+ p_msg->p_cond_param->local_name.data_len =
+ p_cond->local_name.data_len;
+ memcpy(p_msg->p_cond_param->local_name.p_data,
+ p_cond->local_name.p_data, p_cond->local_name.data_len);
+ }
+ else if ((cond_type == BTM_BLE_PF_SRVC_UUID
+ || cond_type == BTM_BLE_PF_SRVC_SOL_UUID))
+ {
+ if (p_cond->srvc_uuid.p_target_addr != NULL)
+ {
+ p_msg->p_cond_param->srvc_uuid.p_target_addr = (tBLE_BD_ADDR *)(p);
+ p_msg->p_cond_param->srvc_uuid.p_target_addr->type =
+ p_cond->srvc_uuid.p_target_addr->type;
+ memcpy(p_msg->p_cond_param->srvc_uuid.p_target_addr->bda,
+ p_cond->srvc_uuid.p_target_addr->bda, BD_ADDR_LEN);
+ p = (UINT8*)( p_msg->p_cond_param->srvc_uuid.p_target_addr + 1);
+ }
+ if (p_cond->srvc_uuid.p_uuid_mask)
+ {
+ p_msg->p_cond_param->srvc_uuid.p_uuid_mask = (tBTA_DM_BLE_PF_COND_MASK *)p;
+ memcpy(p_msg->p_cond_param->srvc_uuid.p_uuid_mask,
+ p_cond->srvc_uuid.p_uuid_mask, sizeof(tBTA_DM_BLE_PF_COND_MASK));
+ }
+ }
+ }
+
+ bta_sys_sendmsg(p_msg);
+ }
+#else
+ UNUSED(action);
+ UNUSED(cond_type);
+ UNUSED(filt_index);
+ UNUSED(p_cond);
+ UNUSED(p_cmpl_cback);
+ UNUSED(ref_value);
+#endif
+}
+
+/*******************************************************************************
+**
+** Function BTA_DmBleScanFilterSetup
+**
+** Description This function is called to setup the adv data payload filter param
+**
+** Parameters p_target: enable the filter condition on a target device; if NULL
+** filt_index - Filter index
+** p_filt_params -Filter parameters
+** ref_value - Reference value
+** action - Add, delete or clear
+** p_cmpl_back - Command completed callback
+**
+** Returns void
+**
+*******************************************************************************/
+void BTA_DmBleScanFilterSetup(UINT8 action, tBTA_DM_BLE_PF_FILT_INDEX filt_index,
+ tBTA_DM_BLE_PF_FILT_PARAMS *p_filt_params,
+ tBLE_BD_ADDR *p_target,
+ tBTA_DM_BLE_PF_PARAM_CBACK *p_cmpl_cback,
+ tBTA_DM_BLE_REF_VALUE ref_value)
+{
+#if BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE
+ tBTA_DM_API_SCAN_FILTER_PARAM_SETUP *p_msg;
+ APPL_TRACE_API ("BTA_DmBleScanFilterSetup: %d", action);
+
+ UINT16 len = sizeof(tBTA_DM_API_SCAN_FILTER_PARAM_SETUP) + sizeof(tBLE_BD_ADDR);
+
+ if ((p_msg = (tBTA_DM_API_SCAN_FILTER_PARAM_SETUP *) GKI_getbuf(len)) != NULL)
+ {
+ memset (p_msg, 0, len);
+
+ p_msg->hdr.event = BTA_DM_API_SCAN_FILTER_SETUP_EVT;
+ p_msg->action = action;
+ p_msg->filt_index = filt_index;
+ p_msg->p_filt_params = p_filt_params;
+ p_msg->p_filt_param_cback = p_cmpl_cback;
+ p_msg->ref_value = ref_value;
+
+ if (p_target)
+ {
+ p_msg->p_target = (tBLE_BD_ADDR *)(p_msg + 1);
+ memcpy(p_msg->p_target, p_target, sizeof(tBLE_BD_ADDR));
+ }
+
+ bta_sys_sendmsg(p_msg);
+ }
+#else
+ UNUSED(action);
+ UNUSED(filt_index);
+ UNUSED(p_filt_params);
+ UNUSED(p_target);
+ UNUSED(p_cmpl_cback);
+ UNUSED(ref_value);
+#endif
+}
+
+/*******************************************************************************
+**
+** Function BTA_DmBleGetEnergyInfo
+**
+** Description This function is called to obtain the energy info
+**
+** Parameters p_cmpl_cback - Command complete callback
+**
+** Returns void
+**
+*******************************************************************************/
+void BTA_DmBleGetEnergyInfo(tBTA_BLE_ENERGY_INFO_CBACK *p_cmpl_cback)
+{
+ tBTA_DM_API_ENERGY_INFO *p_msg;
+ APPL_TRACE_API ("BTA_DmBleGetEnergyInfo");
+
+ UINT16 len = sizeof(tBTA_DM_API_ENERGY_INFO) + sizeof(tBLE_BD_ADDR);
+
+ if ((p_msg = (tBTA_DM_API_ENERGY_INFO *) GKI_getbuf(len)) != NULL)
+ {
+ memset (p_msg, 0, len);
+ p_msg->hdr.event = BTA_DM_API_BLE_ENERGY_INFO_EVT;
+ p_msg->p_energy_info_cback = p_cmpl_cback;
+ bta_sys_sendmsg(p_msg);
+ }
+}
+
+/*******************************************************************************
+**
+** Function BTA_DmEnableScanFilter
+**
+** Description This function is called to enable the adv data payload filter
+**
+** Parameters action - enable or disable the APCF feature
+** p_cmpl_cback - Command completed callback
+** ref_value - Reference value
+**
+** Returns void
+**
+*******************************************************************************/
+void BTA_DmEnableScanFilter(UINT8 action, tBTA_DM_BLE_PF_STATUS_CBACK *p_cmpl_cback,
+ tBTA_DM_BLE_REF_VALUE ref_value)
+{
+#if BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE
+ tBTA_DM_API_ENABLE_SCAN_FILTER *p_msg;
+ APPL_TRACE_API ("BTA_DmEnableScanFilter: %d", action);
+
+ UINT16 len = sizeof(tBTA_DM_API_ENABLE_SCAN_FILTER) + sizeof(tBLE_BD_ADDR);
+
+ if ((p_msg = (tBTA_DM_API_ENABLE_SCAN_FILTER *) GKI_getbuf(len)) != NULL)
+ {
+ memset (p_msg, 0, len);
+
+ p_msg->hdr.event = BTA_DM_API_SCAN_FILTER_ENABLE_EVT;
+ p_msg->action = action;
+ p_msg->ref_value = ref_value;
+ p_msg->p_filt_status_cback = p_cmpl_cback;
+
+ bta_sys_sendmsg(p_msg);
+ }
+#else
+ UNUSED(action);
+ UNUSED(p_cmpl_cback);
+ UNUSED(ref_value);
+#endif
+}
+
+/*******************************************************************************
+**
+** Function BTA_DmBleUpdateConnectionParams
+**
+** Description Update connection parameters, can only be used when connection is up.
+**
+** Parameters: bd_addr - BD address of the peer
+** min_int - minimum connection interval, [0x0004~ 0x4000]
+** max_int - maximum connection interval, [0x0004~ 0x4000]
+** latency - slave latency [0 ~ 500]
+** timeout - supervision timeout [0x000a ~ 0xc80]
+**
+** Returns void
+**
+*******************************************************************************/
+void BTA_DmBleUpdateConnectionParams(BD_ADDR bd_addr, UINT16 min_int, UINT16 max_int,
+ UINT16 latency, UINT16 timeout)
+{
+ tBTA_DM_API_UPDATE_CONN_PARAM *p_msg;
+
+ if ((p_msg = (tBTA_DM_API_UPDATE_CONN_PARAM *) GKI_getbuf(sizeof(tBTA_DM_API_UPDATE_CONN_PARAM))) != NULL)
+ {
+ memset (p_msg, 0, sizeof(tBTA_DM_API_UPDATE_CONN_PARAM));
+
+ p_msg->hdr.event = BTA_DM_API_UPDATE_CONN_PARAM_EVT;
+ bdcpy(p_msg->bd_addr, bd_addr);
+ p_msg->min_int = min_int;
+ p_msg->max_int = max_int;
+ p_msg->latency = latency;
+ p_msg->timeout = timeout;
+
+ bta_sys_sendmsg(p_msg);
+ }
}
#endif
@@ -1759,6 +2444,7 @@
** bring up unencrypted links, then later encrypt them.
**
** Parameters: bd_addr - Address of the peer device
+** transport - transport of the link to be encruypted
** p_callback - Pointer to callback function to indicat the
** link encryption status
** sec_act - This is the security action to indicate
@@ -1770,12 +2456,12 @@
** Returns void
**
*******************************************************************************/
-void BTA_DmSetEncryption(BD_ADDR bd_addr, tBTA_DM_ENCRYPT_CBACK *p_callback,
+void BTA_DmSetEncryption(BD_ADDR bd_addr, tBTA_TRANSPORT transport, tBTA_DM_ENCRYPT_CBACK *p_callback,
tBTA_DM_BLE_SEC_ACT sec_act)
{
tBTA_DM_API_SET_ENCRYPTION *p_msg;
- APPL_TRACE_API0("BTA_DmSetEncryption"); //todo
+ APPL_TRACE_API("BTA_DmSetEncryption"); //todo
if ((p_msg = (tBTA_DM_API_SET_ENCRYPTION *) GKI_getbuf(sizeof(tBTA_DM_API_SET_ENCRYPTION))) != NULL)
{
memset(p_msg, 0, sizeof(tBTA_DM_API_SET_ENCRYPTION));
@@ -1783,6 +2469,7 @@
p_msg->hdr.event = BTA_DM_API_SET_ENCRYPTION_EVT;
memcpy(p_msg->bd_addr, bd_addr, BD_ADDR_LEN);
+ p_msg->transport = transport;
p_msg->p_callback = p_callback;
p_msg->sec_act = sec_act;
@@ -1803,11 +2490,11 @@
** Returns void
**
*******************************************************************************/
-void BTA_DmCloseACL(BD_ADDR bd_addr, BOOLEAN remove_dev)
+void BTA_DmCloseACL(BD_ADDR bd_addr, BOOLEAN remove_dev, tBTA_TRANSPORT transport)
{
tBTA_DM_API_REMOVE_ACL *p_msg;
- APPL_TRACE_API0("BTA_DmCloseACL");
+ APPL_TRACE_API("BTA_DmCloseACL");
if ((p_msg = (tBTA_DM_API_REMOVE_ACL *) GKI_getbuf(sizeof(tBTA_DM_API_REMOVE_ACL))) != NULL)
{
@@ -1817,6 +2504,7 @@
memcpy(p_msg->bd_addr, bd_addr, BD_ADDR_LEN);
p_msg->remove_dev = remove_dev;
+ p_msg->transport = transport;
bta_sys_sendmsg(p_msg);
}
@@ -1841,11 +2529,9 @@
BTA_API extern void BTA_DmBleObserve(BOOLEAN start, UINT8 duration,
tBTA_DM_SEARCH_CBACK *p_results_cb)
{
-#if BLE_INCLUDED == TRUE
-
tBTA_DM_API_BLE_OBSERVE *p_msg;
- APPL_TRACE_API1("BTA_DmBleObserve:start = %d ", start);
+ APPL_TRACE_API("BTA_DmBleObserve:start = %d ", start);
if ((p_msg = (tBTA_DM_API_BLE_OBSERVE *) GKI_getbuf(sizeof(tBTA_DM_API_BLE_OBSERVE))) != NULL)
{
@@ -1858,6 +2544,49 @@
bta_sys_sendmsg(p_msg);
}
-#endif
}
+
+/*******************************************************************************
+**
+** Function BTA_VendorInit
+**
+** Description This function initializes vendor specific
+**
+** Returns void
+**
+*******************************************************************************/
+void BTA_VendorInit (void)
+{
+ APPL_TRACE_API("BTA_VendorInit");
+}
+
+/*******************************************************************************
+**
+** Function BTA_VendorCleanup
+**
+** Description This function frees up Broadcom specific VS specific dynamic memory
+**
+** Returns void
+**
+*******************************************************************************/
+void BTA_VendorCleanup (void)
+{
+ tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
+ BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
+
+#if (BLE_INCLUDED == TRUE && BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE)
+ if (cmn_ble_vsc_cb.max_filter > 0)
+ {
+ btm_ble_adv_filter_cleanup();
+ btm_ble_vendor_cleanup();
+ }
+
+ if (cmn_ble_vsc_cb.tot_scan_results_strg > 0)
+ btm_ble_batchscan_cleanup();
+#endif
+
+ if(cmn_ble_vsc_cb.adv_inst_max > 0)
+ btm_ble_multi_adv_cleanup();
+}
+
#endif
diff --git a/bta/dm/bta_dm_cfg.c b/bta/dm/bta_dm_cfg.c
index e4a1681..62ce9c6 100644
--- a/bta/dm/bta_dm_cfg.c
+++ b/bta/dm/bta_dm_cfg.c
@@ -111,14 +111,16 @@
tBTA_DM_RM *p_bta_dm_rm_cfg = (tBTA_DM_RM *)&bta_dm_rm_cfg;
#if BLE_INCLUDED == TRUE
-#define BTA_DM_NUM_PM_ENTRY (17+BTA_DM_NUM_JV_ID) /* number of entries in bta_dm_pm_cfg except the first */
+# define BTA_DM_NUM_PM_ENTRY 22 /* number of entries in bta_dm_pm_cfg except the first */
+# define BTA_DM_NUM_PM_SPEC 14 /* number of entries in bta_dm_pm_spec */
#else
-#define BTA_DM_NUM_PM_ENTRY (15+BTA_DM_NUM_JV_ID) /* number of entries in bta_dm_pm_cfg except the first */
+# define BTA_DM_NUM_PM_ENTRY 20 /* number of entries in bta_dm_pm_cfg except the first */
+# define BTA_DM_NUM_PM_SPEC 12 /* number of entries in bta_dm_pm_spec */
#endif
-tBTA_DM_PM_TYPE_QUALIFIER tBTA_DM_PM_CFG bta_dm_pm_cfg[] =
+tBTA_DM_PM_TYPE_QUALIFIER tBTA_DM_PM_CFG bta_dm_pm_cfg[BTA_DM_NUM_PM_ENTRY + 1] =
{
- {BTA_ID_SYS, BTA_DM_NUM_PM_ENTRY, 0},
+ {BTA_ID_SYS, BTA_DM_NUM_PM_ENTRY, 0}, /* reserved: specifies length of this table. */
{BTA_ID_AG, BTA_ALL_APP_ID, 0}, /* ag uses first spec table for app id 0 */
{BTA_ID_CT, 1, 1}, /* ct (BTA_ID_CT,APP ID=1) spec table */
{BTA_ID_CG, BTA_ALL_APP_ID, 1}, /* cg resue ct spec table */
@@ -135,28 +137,16 @@
{BTA_ID_MSE, BTA_ALL_APP_ID, 7}, /* reuse fts spec table */
{BTA_ID_JV, BTA_JV_PM_ID_1, 6}, /* app BTA_JV_PM_ID_1, reuse ftc spec table */
{BTA_ID_JV, BTA_ALL_APP_ID, 7}, /* reuse fts spec table */
- {BTA_ID_HL, BTA_ALL_APP_ID, 8} /* reuse fts spec table */
+ {BTA_ID_HL, BTA_ALL_APP_ID, 8}, /* reuse fts spec table */
+ {BTA_ID_HS, BTA_ALL_APP_ID, 9}, /* HS spec table */
+ {BTA_ID_PAN, BTUI_PAN_ID_PANU, 10}, /* PANU spec table */
+ {BTA_ID_PAN, BTUI_PAN_ID_NAP, 11} /* NAP spec table */
#if BLE_INCLUDED == TRUE
- ,{BTA_ID_GATTC, BTA_ALL_APP_ID, 9} /* gattc spec table */
- ,{BTA_ID_GATTS, BTA_ALL_APP_ID, 10} /* gatts spec table */
+ ,{BTA_ID_GATTC, BTA_ALL_APP_ID, 12} /* gattc spec table */
+ ,{BTA_ID_GATTS, BTA_ALL_APP_ID, 13} /* gatts spec table */
#endif
};
-#if BLE_INCLUDED == TRUE /* add GATT PM entry for GATT over BR/EDR */
-#ifdef BTE_SIM_APP /* For Insight builds only, see the detail below */
-#define BTA_DM_NUM_PM_SPEC (11 + 2) /* additional two */
-#else
-#define BTA_DM_NUM_PM_SPEC 11 /* additional JV*/
-#endif
-#else
-#ifdef BTE_SIM_APP /* For Insight builds only, see the detail below */
-#define BTA_DM_NUM_PM_SPEC (9 + 2) /* additional two */
-#else
-#define BTA_DM_NUM_PM_SPEC 9 /* additional JV*/
-#endif
-#endif
-
-
tBTA_DM_PM_TYPE_QUALIFIER tBTA_DM_PM_SPEC bta_dm_pm_spec[BTA_DM_NUM_PM_SPEC] =
{
/* AG */
@@ -166,12 +156,12 @@
(BTA_DM_PM_SSR2), /* the SSR entry */
#endif
{
- {{BTA_DM_PM_SNIFF, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open sniff */
+ {{BTA_DM_PM_SNIFF_A2DP_IDX, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open sniff */
{{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn close */
{{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app open */
{{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app close */
- {{BTA_DM_PM_SNIFF3, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open, active */
- {{BTA_DM_PM_SNIFF, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close sniff */
+ {{BTA_DM_PM_SNIFF_SCO_OPEN_IDX, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open, active */
+ {{BTA_DM_PM_SNIFF_A2DP_IDX, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close sniff */
{{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */
{{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */
{{BTA_DM_PM_RETRY, 5000}, {BTA_DM_PM_NO_ACTION, 0}} /* mode change retry */
@@ -189,7 +179,7 @@
{{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn close */
{{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app open */
{{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app close */
- {{BTA_DM_PM_SNIFF, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open sniff */
+ {{BTA_DM_PM_SNIFF_A2DP_IDX, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open sniff */
{{BTA_DM_PM_PARK, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close park */
{{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */
{{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */
@@ -223,14 +213,14 @@
(BTA_DM_PM_SSR3), /* the SSR entry */
#endif
{
- {{BTA_DM_PM_SNIFF4, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open sniff */
+ {{BTA_DM_PM_SNIFF_HD_ACTIVE_IDX, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open sniff */
{{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn close */
{{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app open */
{{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app close */
{{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open */
{{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close */
- {{BTA_DM_PM_SNIFF2, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */
- {{BTA_DM_PM_SNIFF4, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */
+ {{BTA_DM_PM_SNIFF_HD_IDLE_IDX, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */
+ {{BTA_DM_PM_SNIFF_HD_ACTIVE_IDX, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */
{{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}} /* mode change retry */
}
},
@@ -242,13 +232,13 @@
(BTA_DM_PM_SSR2), /* the SSR entry */
#endif
{
- {{BTA_DM_PM_SNIFF, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open sniff */
+ {{BTA_DM_PM_SNIFF_A2DP_IDX, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open sniff */
{{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn close */
{{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app open */
{{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app close */
{{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open */
{{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close */
- {{BTA_DM_PM_SNIFF, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */
+ {{BTA_DM_PM_SNIFF_A2DP_IDX, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */
{{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */
{{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}} /* mode change retry */
}
@@ -261,14 +251,14 @@
(BTA_DM_PM_SSR1), /* the SSR entry */
#endif
{
- {{BTA_DM_PM_SNIFF2, 30000}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open sniff */
+ {{BTA_DM_PM_SNIFF_HH_OPEN_IDX, BTA_DM_PM_HH_OPEN_DELAY},{BTA_DM_PM_NO_ACTION, 0}}, /* conn open sniff */
{{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn close */
{{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app open */
{{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app close */
{{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open */
{{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close, used for HH suspend */
- {{BTA_DM_PM_SNIFF2, 30000}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */
- {{BTA_DM_PM_SNIFF2, 30000}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */
+ {{BTA_DM_PM_SNIFF_HH_IDLE_IDX, BTA_DM_PM_HH_IDLE_DELAY}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */
+ {{BTA_DM_PM_SNIFF_HH_ACTIVE_IDX, BTA_DM_PM_HH_ACTIVE_DELAY}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */
{{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}} /* mode change retry */
}
},
@@ -286,7 +276,7 @@
{{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app close */
{{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open */
{{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close */
- {{BTA_DM_PM_SNIFF, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */
+ {{BTA_DM_PM_SNIFF_A2DP_IDX, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */
{{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */
{{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}} /* mode change retry */
}
@@ -305,7 +295,7 @@
{{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app close */
{{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open */
{{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close */
- {{BTA_DM_PM_SNIFF, 7000}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */
+ {{BTA_DM_PM_SNIFF_A2DP_IDX, BTA_FTS_OPS_IDLE_TO_SNIFF_DELAY_MS}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */
{{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */
{{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}} /* mode change retry */
}
@@ -318,7 +308,7 @@
(BTA_DM_PM_SSR2), /* the SSR entry */
#endif
{
- {{BTA_DM_PM_SNIFF, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open sniff */
+ {{BTA_DM_PM_SNIFF_A2DP_IDX, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open sniff */
{{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn close */
{{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app open */
{{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app close */
@@ -328,8 +318,64 @@
{{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */
{{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}} /* mode change retry */
}
- }
+ },
+ /* PANU */
+ {
+ (BTA_DM_PM_SNIFF), /* allow sniff */
+#if (BTM_SSR_INCLUDED == TRUE)
+ (BTA_DM_PM_SSR2), /* the SSR entry */
+#endif
+ {
+ {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open active */
+ {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn close */
+ {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app open */
+ {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app close */
+ {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open */
+ {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close */
+ {{BTA_DM_PM_SNIFF_A2DP_IDX, 7000}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */
+ {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */
+ {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}} /* mode change retry */
+ }
+ },
+
+ /* NAP */
+ {
+ (BTA_DM_PM_SNIFF), /* allow sniff */
+#if (BTM_SSR_INCLUDED == TRUE)
+ (BTA_DM_PM_SSR2), /* the SSR entry */
+#endif
+ {
+ {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open active */
+ {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn close */
+ {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app open */
+ {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app close */
+ {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open */
+ {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close */
+ {{BTA_DM_PM_SNIFF_A2DP_IDX, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */
+ {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */
+ {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}} /* mode change retry */
+ }
+ },
+
+ /* HS */
+ {
+ (BTA_DM_PM_SNIFF | BTA_DM_PM_PARK), /* allow park & sniff */
+#if (BTM_SSR_INCLUDED == TRUE)
+ (BTA_DM_PM_SSR2), /* the SSR entry */
+#endif
+ {
+ {{BTA_DM_PM_SNIFF, 7000}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open sniff */
+ {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn close */
+ {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app open */
+ {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app close */
+ {{BTA_DM_PM_SNIFF3, 7000}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open, active */
+ {{BTA_DM_PM_SNIFF, 7000}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close sniff */
+ {{BTA_DM_PM_SNIFF, 7000}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */
+ {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */
+ {{BTA_DM_PM_RETRY, 7000}, {BTA_DM_PM_NO_ACTION, 0}} /* mode change retry */
+ }
+ }
#if BLE_INCLUDED == TRUE
/* GATTC */
,{
@@ -338,13 +384,13 @@
(BTA_DM_PM_SSR2), /* the SSR entry */
#endif
{
- {{BTA_DM_PM_SNIFF, 10000}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open active */
+ {{BTA_DM_PM_SNIFF_A2DP_IDX, 10000}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open active */
{{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn close */
{{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app open */
{{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app close */
{{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open */
{{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close */
- {{BTA_DM_PM_SNIFF, 10000}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */
+ {{BTA_DM_PM_SNIFF_A2DP_IDX, 10000}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */
{{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */
#if (AMP_INCLUDED == TRUE)
{{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* amp */
@@ -387,21 +433,29 @@
#endif /* BTE_SIM_APP */
};
+/* Please refer to the SNIFF table definitions in bta_api.h.
+ *
+ * Adding to or Modifying the Table
+ * Additional sniff parameter entries can be added for BTA_DM_PM_SNIFF5 - BTA_DM_PM_SNIFF7.
+ * Overrides of additional table entries can be specified in bdroid_buildcfg.h. If additional
+ * sniff parameter entries are added or an override of an existing entry is specified in
+ * bdroid_buildcfg.h then the BTA_DM_PM_*_IDX defines in bta_api.h will need to be match the new
+ * ordering.
+ *
+ * Table Ordering
+ * Sniff Table entries must be ordered from highest latency (biggest interval) to lowest latency.
+ * If there is a conflict among the connected services the setting with the lowest latency will
+ * be selected.
+ */
tBTA_DM_PM_TYPE_QUALIFIER tBTM_PM_PWR_MD bta_dm_pm_md[] =
{
-/* more sniff parameter entries can be added for BTA_DM_PM_SNIFF3 - BTA_DM_PM_SNIFF7, if needed
-When entries are added or removed, BTA_DM_PM_PARK_IDX needs to be updated to reflect the actual index
-BTA_DM_PM_PARK_IDX is defined in bta_api.h and can be override by the bdroid_buildcfg.h settings.
-The SNIFF table entries must be in the order from highest latency (biggest interval) to lowest latency.
-If there's a conflict among the connected services, the setting with lowest latency wins.
-*/
/* sniff modes: max interval, min interval, attempt, timeout */
- {800, 400, 4, 1, BTM_PM_MD_SNIFF}, /*for BTA_DM_PM_SNIFF - A2DP */
- {400, 200, 4, 1, BTM_PM_MD_SNIFF}, /*for BTA_DM_PM_SNIFF1 */
- {180, 150, 4, 1, BTM_PM_MD_SNIFF}, /*for BTA_DM_PM_SNIFF2- HD idle */
- {150, 50, 4, 1, BTM_PM_MD_SNIFF}, /*for BTA_DM_PM_SNIFF3- SCO open */
- { 54, 30, 4, 1, BTM_PM_MD_SNIFF}, /*for BTA_DM_PM_SNIFF4- HD active*/
- {800, 400, 0, 0, BTM_PM_MD_PARK}
+ {BTA_DM_PM_SNIFF_MAX, BTA_DM_PM_SNIFF_MIN, BTA_DM_PM_SNIFF_ATTEMPT, BTA_DM_PM_SNIFF_TIMEOUT, BTM_PM_MD_SNIFF}, /*for BTA_DM_PM_SNIFF - A2DP */
+ {BTA_DM_PM_SNIFF1_MAX, BTA_DM_PM_SNIFF1_MIN, BTA_DM_PM_SNIFF1_ATTEMPT, BTA_DM_PM_SNIFF1_TIMEOUT, BTM_PM_MD_SNIFF}, /*for BTA_DM_PM_SNIFF1 */
+ {BTA_DM_PM_SNIFF2_MAX, BTA_DM_PM_SNIFF2_MIN, BTA_DM_PM_SNIFF2_ATTEMPT, BTA_DM_PM_SNIFF2_TIMEOUT, BTM_PM_MD_SNIFF}, /*for BTA_DM_PM_SNIFF2- HD idle */
+ {BTA_DM_PM_SNIFF3_MAX, BTA_DM_PM_SNIFF3_MIN, BTA_DM_PM_SNIFF3_ATTEMPT, BTA_DM_PM_SNIFF3_TIMEOUT, BTM_PM_MD_SNIFF}, /*for BTA_DM_PM_SNIFF3- SCO open */
+ {BTA_DM_PM_SNIFF4_MAX, BTA_DM_PM_SNIFF4_MIN, BTA_DM_PM_SNIFF4_ATTEMPT, BTA_DM_PM_SNIFF4_TIMEOUT, BTM_PM_MD_SNIFF}, /*for BTA_DM_PM_SNIFF4- HD active*/
+ {BTA_DM_PM_PARK_MAX, BTA_DM_PM_PARK_MIN, BTA_DM_PM_PARK_ATTEMPT, BTA_DM_PM_PARK_TIMEOUT, BTM_PM_MD_PARK}
#ifdef BTE_SIM_APP /* For Insight builds only */
/* Entries at the end of the bta_dm_pm_md table are user-defined (runtime configurable),
diff --git a/bta/dm/bta_dm_int.h b/bta/dm/bta_dm_int.h
index dd3e16c..e54dcff 100644
--- a/bta/dm/bta_dm_int.h
+++ b/bta/dm/bta_dm_int.h
@@ -99,10 +99,30 @@
BTA_DM_API_BLE_CONN_PARAM_EVT,
BTA_DM_API_BLE_SCAN_PARAM_EVT,
BTA_DM_API_BLE_OBSERVE_EVT,
+ BTA_DM_API_UPDATE_CONN_PARAM_EVT,
+#if BLE_PRIVACY_SPT == TRUE
+ BTA_DM_API_LOCAL_PRIVACY_EVT,
+#endif
BTA_DM_API_BLE_ADV_PARAM_EVT,
BTA_DM_API_BLE_SET_ADV_CONFIG_EVT,
BTA_DM_API_BLE_SET_SCAN_RSP_EVT,
BTA_DM_API_BLE_BROADCAST_EVT,
+
+#if BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE
+ BTA_DM_API_CFG_FILTER_COND_EVT,
+ BTA_DM_API_SCAN_FILTER_SETUP_EVT,
+ BTA_DM_API_SCAN_FILTER_ENABLE_EVT,
+#endif
+ BTA_DM_API_BLE_MULTI_ADV_ENB_EVT,
+ BTA_DM_API_BLE_MULTI_ADV_PARAM_UPD_EVT,
+ BTA_DM_API_BLE_MULTI_ADV_DATA_EVT,
+ BTA_DM_API_BLE_MULTI_ADV_DISABLE_EVT,
+ BTA_DM_API_BLE_SETUP_STORAGE_EVT,
+ BTA_DM_API_BLE_ENABLE_BATCH_SCAN_EVT,
+ BTA_DM_API_BLE_DISABLE_BATCH_SCAN_EVT,
+ BTA_DM_API_BLE_READ_SCAN_REPORTS_EVT,
+ BTA_DM_API_BLE_TRACK_ADVERTISER_EVT,
+ BTA_DM_API_BLE_ENERGY_INFO_EVT,
#endif
#if ( BTM_EIR_SERVER_INCLUDED == TRUE )&&( BTA_EIR_CANNED_UUID_LIST != TRUE )&&(BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0)
@@ -209,6 +229,7 @@
tBTA_SERVICE_MASK services;
tBTA_DM_SEARCH_CBACK * p_cback;
BOOLEAN sdp_search;
+ tBTA_TRANSPORT transport;
#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
UINT8 num_uuid;
tBT_UUID *p_uuid;
@@ -231,6 +252,7 @@
{
BT_HDR hdr;
BD_ADDR bd_addr;
+ tBTA_TRANSPORT transport;
} tBTA_DM_API_BOND;
/* data type for BTA_DM_API_BOND_CANCEL_EVT */
@@ -238,6 +260,7 @@
{
BT_HDR hdr;
BD_ADDR bd_addr;
+ tBTA_TRANSPORT transport;
} tBTA_DM_API_BOND_CANCEL;
/* data type for BTA_DM_API_PIN_REPLY_EVT */
@@ -365,6 +388,10 @@
UINT8 new_role;
BD_ADDR bd_addr;
UINT8 hci_status;
+#if BLE_INCLUDED == TRUE
+ UINT16 handle;
+ tBT_TRANSPORT transport;
+#endif
} tBTA_DM_ACL_CHANGE;
/* data type for BTA_DM_PM_BTM_STATUS_EVT */
@@ -424,6 +451,7 @@
typedef struct
{
BT_HDR hdr;
+ tBTA_TRANSPORT transport;
tBTA_DM_ENCRYPT_CBACK *p_callback;
tBTA_DM_BLE_SEC_ACT sec_act;
BD_ADDR bd_addr;
@@ -526,11 +554,99 @@
typedef struct
{
BT_HDR hdr;
+ BOOLEAN enable;
+
+}tBTA_DM_API_BLE_FEATURE;
+
+/* multi adv data structure */
+typedef struct
+{
+ BT_HDR hdr;
+ tBTA_BLE_MULTI_ADV_CBACK *p_cback;
+ void *p_ref;
+ tBTA_BLE_ADV_PARAMS *p_params;
+}tBTA_DM_API_BLE_MULTI_ADV_ENB;
+
+typedef struct
+{
+ BT_HDR hdr;
+ UINT8 inst_id;
+ tBTA_BLE_ADV_PARAMS *p_params;
+}tBTA_DM_API_BLE_MULTI_ADV_PARAM;
+
+typedef struct
+{
+ BT_HDR hdr;
+ UINT8 inst_id;
+ BOOLEAN is_scan_rsp;
+ tBTA_BLE_AD_MASK data_mask;
+ tBTA_BLE_ADV_DATA *p_data;
+}tBTA_DM_API_BLE_MULTI_ADV_DATA;
+
+typedef struct
+{
+ BT_HDR hdr;
+ UINT8 inst_id;
+}tBTA_DM_API_BLE_MULTI_ADV_DISABLE;
+
+typedef struct
+{
+ BT_HDR hdr;
UINT16 data_mask;
tBTA_BLE_ADV_DATA *p_adv_cfg;
+ tBTA_SET_ADV_DATA_CMPL_CBACK *p_adv_data_cback;
}tBTA_DM_API_SET_ADV_CONFIG;
-#endif
+typedef struct
+{
+ BT_HDR hdr;
+ UINT8 batch_scan_full_max;
+ UINT8 batch_scan_trunc_max;
+ UINT8 batch_scan_notify_threshold;
+ tBTA_BLE_SCAN_SETUP_CBACK *p_setup_cback;
+ tBTA_BLE_SCAN_THRESHOLD_CBACK *p_thres_cback;
+ tBTA_BLE_SCAN_REP_CBACK *p_read_rep_cback;
+ tBTA_DM_BLE_REF_VALUE ref_value;
+} tBTA_DM_API_SET_STORAGE_CONFIG;
+
+typedef struct
+{
+ BT_HDR hdr;
+ tBTA_BLE_SCAN_MODE scan_mode;
+ UINT32 scan_int;
+ UINT32 scan_window;
+ tBTA_BLE_DISCARD_RULE discard_rule;
+ tBLE_ADDR_TYPE addr_type;
+ tBTA_DM_BLE_REF_VALUE ref_value;
+} tBTA_DM_API_ENABLE_SCAN;
+
+typedef struct
+{
+ BT_HDR hdr;
+ tBTA_DM_BLE_REF_VALUE ref_value;
+} tBTA_DM_API_DISABLE_SCAN;
+
+typedef struct
+{
+ BT_HDR hdr;
+ tBTA_BLE_SCAN_MODE scan_type;
+ tBTA_DM_BLE_REF_VALUE ref_value;
+} tBTA_DM_API_READ_SCAN_REPORTS;
+
+typedef struct
+{
+ BT_HDR hdr;
+ tBTA_DM_BLE_REF_VALUE ref_value;
+ tBTA_BLE_TRACK_ADV_CBACK *p_track_adv_cback;
+} tBTA_DM_API_TRACK_ADVERTISER;
+
+typedef struct
+{
+ BT_HDR hdr;
+ tBTA_BLE_ENERGY_INFO_CBACK *p_energy_info_cback;
+} tBTA_DM_API_ENERGY_INFO;
+
+#endif /* BLE_INCLUDED */
typedef struct
{
@@ -563,7 +679,50 @@
BT_HDR hdr;
BD_ADDR bd_addr;
BOOLEAN remove_dev;
+ tBTA_TRANSPORT transport;
+
}tBTA_DM_API_REMOVE_ACL;
+typedef struct
+{
+ BT_HDR hdr;
+ BD_ADDR bd_addr;
+ UINT16 min_int;
+ UINT16 max_int;
+ UINT16 latency;
+ UINT16 timeout;
+}tBTA_DM_API_UPDATE_CONN_PARAM;
+
+#if BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE
+typedef struct
+{
+ BT_HDR hdr;
+ tBTA_DM_BLE_SCAN_COND_OP action;
+ tBTA_DM_BLE_PF_COND_TYPE cond_type;
+ tBTA_DM_BLE_PF_FILT_INDEX filt_index;
+ tBTA_DM_BLE_PF_COND_PARAM *p_cond_param;
+ tBTA_DM_BLE_PF_CFG_CBACK *p_filt_cfg_cback;
+ tBTA_DM_BLE_REF_VALUE ref_value;
+}tBTA_DM_API_CFG_FILTER_COND;
+
+typedef struct
+{
+ BT_HDR hdr;
+ UINT8 action;
+ tBTA_DM_BLE_PF_STATUS_CBACK *p_filt_status_cback;
+ tBTA_DM_BLE_REF_VALUE ref_value;
+}tBTA_DM_API_ENABLE_SCAN_FILTER;
+
+typedef struct
+{
+ BT_HDR hdr;
+ UINT8 action;
+ tBTA_DM_BLE_PF_FILT_INDEX filt_index;
+ tBTA_DM_BLE_PF_FILT_PARAMS *p_filt_params;
+ tBLE_BD_ADDR *p_target;
+ tBTA_DM_BLE_PF_PARAM_CBACK *p_filt_param_cback;
+ tBTA_DM_BLE_REF_VALUE ref_value;
+}tBTA_DM_API_SCAN_FILTER_PARAM_SETUP;
+#endif
/* union of all data types */
typedef union
@@ -640,6 +799,23 @@
tBTA_DM_API_LOCAL_PRIVACY ble_local_privacy;
tBTA_DM_API_BLE_ADV_PARAMS ble_set_adv_params;
tBTA_DM_API_SET_ADV_CONFIG ble_set_adv_data;
+#if BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE
+ tBTA_DM_API_SCAN_FILTER_PARAM_SETUP ble_scan_filt_param_setup;
+ tBTA_DM_API_CFG_FILTER_COND ble_cfg_filter_cond;
+ tBTA_DM_API_ENABLE_SCAN_FILTER ble_enable_scan_filt;
+#endif
+ tBTA_DM_API_UPDATE_CONN_PARAM ble_update_conn_params;
+ tBTA_DM_API_BLE_MULTI_ADV_ENB ble_multi_adv_enb;
+ tBTA_DM_API_BLE_MULTI_ADV_PARAM ble_multi_adv_param;
+ tBTA_DM_API_BLE_MULTI_ADV_DATA ble_multi_adv_data;
+ tBTA_DM_API_BLE_MULTI_ADV_DISABLE ble_multi_adv_disable;
+
+ tBTA_DM_API_SET_STORAGE_CONFIG ble_set_storage;
+ tBTA_DM_API_ENABLE_SCAN ble_enable_scan;
+ tBTA_DM_API_READ_SCAN_REPORTS ble_read_reports;
+ tBTA_DM_API_DISABLE_SCAN ble_disable_scan;
+ tBTA_DM_API_TRACK_ADVERTISER ble_track_advert;
+ tBTA_DM_API_ENERGY_INFO ble_energy_info;
#endif
tBTA_DM_API_SET_AFH_CHANNEL_ASSESSMENT set_afh_channel_assessment;
@@ -679,13 +855,15 @@
tBTA_PREF_ROLES pref_role;
BOOLEAN in_use;
tBTA_DM_DEV_INFO info;
+ tBTA_DM_ENCRYPT_CBACK *p_encrypt_cback;
#if (BTM_SSR_INCLUDED == TRUE)
tBTM_PM_STATUS prev_low; /* previous low power mode used */
#endif
tBTA_DM_PM_ACTTION pm_mode_attempted;
tBTA_DM_PM_ACTTION pm_mode_failed;
BOOLEAN remove_dev_pending;
-
+ UINT16 conn_handle;
+ tBT_TRANSPORT transport;
} tBTA_DM_PEER_DEVICE;
@@ -696,7 +874,9 @@
{
tBTA_DM_PEER_DEVICE peer_device[BTA_DM_NUM_PEER_DEVICE];
UINT8 count;
-
+#if BLE_INCLUDED == TRUE
+ UINT8 le_count;
+#endif
} tBTA_DM_ACTIVE_LINK;
@@ -738,6 +918,14 @@
BOOLEAN is_bta_dm_active;
tBTA_DM_ACTIVE_LINK device_list;
tBTA_DM_SEC_CBACK *p_sec_cback;
+#if ((defined BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
+ tBTA_BLE_SCAN_SETUP_CBACK *p_setup_cback;
+ tBTA_DM_BLE_PF_CFG_CBACK *p_scan_filt_cfg_cback;
+ tBTA_DM_BLE_PF_STATUS_CBACK *p_scan_filt_status_cback;
+ tBTA_DM_BLE_PF_PARAM_CBACK *p_scan_filt_param_cback;
+ tBTA_BLE_MULTI_ADV_CBACK *p_multi_adv_cback;
+ tBTA_BLE_ENERGY_INFO_CBACK *p_energy_info_cback;
+#endif
TIMER_LIST_ENT signal_strength_timer;
tBTA_SIG_STRENGTH_MASK signal_strength_mask;
UINT16 state;
@@ -777,8 +965,6 @@
#endif
- tBTA_DM_ENCRYPT_CBACK *p_encrypt_cback;
- tBTA_DM_BLE_SEC_ACT sec_act;
TIMER_LIST_ENT switch_delay_timer;
} tBTA_DM_CB;
@@ -809,7 +995,7 @@
tSDP_UUID uuid;
UINT8 peer_scn;
BOOLEAN sdp_search;
-
+ tBTA_TRANSPORT transport;
#if ((defined BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
tBTA_DM_SEARCH_CBACK * p_scan_cback;
#if ((defined BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE))
@@ -996,11 +1182,30 @@
extern void bta_dm_ble_set_scan_params (tBTA_DM_MSG *p_data);
extern void bta_dm_close_gatt_conn(tBTA_DM_MSG *p_data);
extern void bta_dm_ble_observe (tBTA_DM_MSG *p_data);
+extern void bta_dm_ble_update_conn_params (tBTA_DM_MSG *p_data);
+extern void bta_dm_ble_config_local_privacy (tBTA_DM_MSG *p_data);
extern void bta_dm_ble_set_adv_params (tBTA_DM_MSG *p_data);
extern void bta_dm_ble_set_adv_config (tBTA_DM_MSG *p_data);
extern void bta_dm_ble_set_scan_rsp (tBTA_DM_MSG *p_data);
extern void bta_dm_ble_broadcast (tBTA_DM_MSG *p_data);
+#if BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE
+extern void bta_dm_cfg_filter_cond (tBTA_DM_MSG *p_data);
+extern void bta_dm_scan_filter_param_setup (tBTA_DM_MSG *p_data);
+extern void bta_dm_enable_scan_filter(tBTA_DM_MSG *p_data);
+#endif
+extern void btm_dm_ble_multi_adv_disable(tBTA_DM_MSG *p_data);
+extern void bta_dm_ble_multi_adv_data(tBTA_DM_MSG *p_data);
+extern void bta_dm_ble_multi_adv_upd_param(tBTA_DM_MSG *p_data);
+extern void bta_dm_ble_multi_adv_enb(tBTA_DM_MSG *p_data);
+
+extern void bta_dm_ble_setup_storage(tBTA_DM_MSG *p_data);
+extern void bta_dm_ble_enable_batch_scan(tBTA_DM_MSG * p_data);
+extern void bta_dm_ble_disable_batch_scan(tBTA_DM_MSG * p_data);
+extern void bta_dm_ble_read_scan_reports(tBTA_DM_MSG * p_data);
+extern void bta_dm_ble_track_advertiser(tBTA_DM_MSG * p_data);
+extern void bta_dm_ble_get_energy_info(tBTA_DM_MSG *p_data);
+
#endif
extern void bta_dm_set_encryption(tBTA_DM_MSG *p_data);
extern void bta_dm_confirm(tBTA_DM_MSG *p_data);
@@ -1035,6 +1240,8 @@
extern void bta_dm_disc_rmt_name (tBTA_DM_MSG *p_data);
extern tBTA_DM_PEER_DEVICE * bta_dm_find_peer_device(BD_ADDR peer_addr);
+extern void bta_dm_ble_config_local_privacy (tBTA_DM_MSG *p_data);
+
extern void bta_dm_pm_active(BD_ADDR peer_addr);
#if ( BTM_EIR_SERVER_INCLUDED == TRUE )
diff --git a/bta/dm/bta_dm_main.c b/bta/dm/bta_dm_main.c
index 0f6b91a..35835c7 100644
--- a/bta/dm/bta_dm_main.c
+++ b/bta/dm/bta_dm_main.c
@@ -96,10 +96,29 @@
bta_dm_ble_set_conn_params, /* BTA_DM_API_BLE_CONN_PARAM_EVT */
bta_dm_ble_set_scan_params, /* BTA_DM_API_BLE_SCAN_PARAM_EVT */
bta_dm_ble_observe,
+ bta_dm_ble_update_conn_params, /* BTA_DM_API_UPDATE_CONN_PARAM_EVT */
+#if BLE_PRIVACY_SPT == TRUE
+ bta_dm_ble_config_local_privacy, /* BTA_DM_API_LOCAL_PRIVACY_EVT */
+#endif
bta_dm_ble_set_adv_params, /* BTA_DM_API_BLE_SCAN_PARAM_EVT */
bta_dm_ble_set_adv_config, /* BTA_DM_API_BLE_SET_ADV_CONFIG_EVT */
bta_dm_ble_set_scan_rsp, /* BTA_DM_API_BLE_SET_SCAN_RSP_EVT */
bta_dm_ble_broadcast, /* BTA_DM_API_BLE_BROADCAST_EVT */
+#if BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE
+ bta_dm_cfg_filter_cond, /* BTA_DM_API_CFG_FILTER_COND_EVT */
+ bta_dm_scan_filter_param_setup, /* BTA_DM_API_SCAN_FILTER_SETUP_EVT */
+ bta_dm_enable_scan_filter, /* BTA_DM_API_SCAN_FILTER_ENABLE_EVT */
+#endif
+ bta_dm_ble_multi_adv_enb, /* BTA_DM_API_BLE_MULTI_ADV_ENB_EVT*/
+ bta_dm_ble_multi_adv_upd_param, /* BTA_DM_API_BLE_MULTI_ADV_PARAM_UPD_EVT */
+ bta_dm_ble_multi_adv_data, /* BTA_DM_API_BLE_MULTI_ADV_DATA_EVT */
+ btm_dm_ble_multi_adv_disable, /* BTA_DM_API_BLE_MULTI_ADV_DISABLE_EVT */
+ bta_dm_ble_setup_storage, /* BTA_DM_API_BLE_SETUP_STORAGE_EVT */
+ bta_dm_ble_enable_batch_scan, /* BTA_DM_API_BLE_ENABLE_BATCH_SCAN_EVT */
+ bta_dm_ble_disable_batch_scan, /* BTA_DM_API_BLE_DISABLE_BATCH_SCAN_EVT */
+ bta_dm_ble_read_scan_reports, /* BTA_DM_API_BLE_READ_SCAN_REPORTS_EVT */
+ bta_dm_ble_track_advertiser, /* BTA_DM_API_BLE_TRACK_ADVERTISER_EVT */
+ bta_dm_ble_get_energy_info, /* BTA_DM_API_BLE_ENERGY_INFO_EVT */
#endif
#if ( BTM_EIR_SERVER_INCLUDED == TRUE )&&( BTA_EIR_CANNED_UUID_LIST != TRUE )&&(BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0)
@@ -300,7 +319,7 @@
{
UINT16 event = p_msg->event & 0x00ff;
- APPL_TRACE_EVENT1("bta_dm_sm_execute event:0x%x", event);
+ APPL_TRACE_EVENT("bta_dm_sm_execute event:0x%x", event);
/* execute action functions */
if(event < BTA_DM_NUM_ACTIONS)
@@ -344,7 +363,7 @@
UINT8 action;
int i;
- APPL_TRACE_EVENT2("bta_dm_search_sm_execute state:%d, event:0x%x",
+ APPL_TRACE_EVENT("bta_dm_search_sm_execute state:%d, event:0x%x",
bta_dm_search_cb.state, p_msg->event);
/* look up the state table for the current state */
diff --git a/bta/dm/bta_dm_pm.c b/bta/dm/bta_dm_pm.c
index 7008498..6bf1697 100644
--- a/bta/dm/bta_dm_pm.c
+++ b/bta/dm/bta_dm_pm.c
@@ -31,8 +31,6 @@
#include "btm_api.h"
#include <string.h>
-#include <cutils/properties.h>
-#include <utils/Log.h>
static void bta_dm_pm_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, BD_ADDR peer_addr);
@@ -107,7 +105,7 @@
{
if(bta_dm_cb.pm_timer[i].in_use)
{
- APPL_TRACE_DEBUG1("stop dm_pm_timer:%d", i);
+ APPL_TRACE_DEBUG("stop dm_pm_timer:%d", i);
bta_sys_stop_timer(&bta_dm_cb.pm_timer[i].timer);
bta_dm_cb.pm_timer[i].in_use = FALSE;
}
@@ -133,7 +131,7 @@
if(bta_dm_cb.pm_timer[i].in_use && !bdcmp(bta_dm_cb.pm_timer[i].peer_bdaddr, peer_addr))
{
- APPL_TRACE_DEBUG1("stop dm_pm_timer:%d", i);
+ APPL_TRACE_DEBUG("stop dm_pm_timer:%d", i);
bta_sys_stop_timer(&bta_dm_cb.pm_timer[i].timer);
bta_dm_cb.pm_timer[i].in_use = FALSE;
break;
@@ -164,7 +162,7 @@
#endif
tBTA_DM_PEER_DEVICE *p_dev;
- APPL_TRACE_DEBUG3("bta_dm_pm_cback: st(%d), id(%d), app(%d)", status, id, app_id);
+ APPL_TRACE_DEBUG("bta_dm_pm_cback: st(%d), id(%d), app(%d)", status, id, app_id);
btm_status = BTM_ReadLocalVersion (&vers);
p_dev = bta_dm_find_peer_device(peer_addr);
@@ -243,7 +241,7 @@
}
else
{
- APPL_TRACE_WARNING0("bta_dm_act no entry for connected service cbs");
+ APPL_TRACE_WARNING("bta_dm_act no entry for connected service cbs");
return;
}
}
@@ -252,7 +250,7 @@
/* check if we have more connected service that cbs */
if(bta_dm_conn_srvcs.count == BTA_DM_NUM_CONN_SRVS)
{
- APPL_TRACE_WARNING0("bta_dm_act no more connected service cbs");
+ APPL_TRACE_WARNING("bta_dm_act no more connected service cbs");
return;
}
@@ -261,7 +259,7 @@
bta_dm_conn_srvcs.conn_srvc[j].app_id = app_id;
bdcpy(bta_dm_conn_srvcs.conn_srvc[j].peer_bdaddr, peer_addr);
- APPL_TRACE_WARNING2("new conn_srvc id:%d, app_id:%d", id, app_id);
+ APPL_TRACE_WARNING("new conn_srvc id:%d, app_id:%d", id, app_id);
bta_dm_conn_srvcs.count++;
bta_dm_conn_srvcs.conn_srvc[j].state = status;
@@ -336,8 +334,6 @@
tBTA_DM_PM_SPEC *p_pm_spec;
tBTA_DM_PM_ACTN *p_act0, *p_act1;
tBTA_DM_SRVCS *p_srvcs;
- char buf[PROPERTY_VALUE_MAX];
- int len = 0, temp = 0;
if(!bta_dm_cb.device_list.count)
@@ -372,7 +368,7 @@
p_act0 = &p_pm_spec->actn_tbl[p_srvcs->state][0];
p_act1 = &p_pm_spec->actn_tbl[p_srvcs->state][1];
- APPL_TRACE_DEBUG3("bta_dm_pm_set_mode: srvcsid: %d, state: %d, j: %d", p_srvcs->id, p_srvcs->state, j);
+ APPL_TRACE_DEBUG("bta_dm_pm_set_mode: srvcsid: %d, state: %d, j: %d", p_srvcs->id, p_srvcs->state, j);
allowed_modes |= p_pm_spec->allow_mask;
/* PM actions are in the order of strictness */
@@ -436,14 +432,8 @@
bta_dm_cb.pm_timer[i].in_use = TRUE;
bdcpy(bta_dm_cb.pm_timer[i].peer_bdaddr, peer_addr);
bta_dm_cb.pm_timer[i].timer.p_cback = bta_dm_pm_timer_cback;
- len = property_get("bluetooth.force_pm_timer", buf, NULL);
- if(len > 0)
- {
- sscanf(buf, "%d", &temp);
- timeout = temp;
- }
bta_sys_start_timer(&bta_dm_cb.pm_timer[i].timer, 0, timeout);
- APPL_TRACE_DEBUG2("start dm_pm_timer:%d, %d", i, timeout);
+ APPL_TRACE_DEBUG("start dm_pm_timer:%d, %d", i, timeout);
return;
}
@@ -453,7 +443,7 @@
/* no more timers */
if(i==BTA_DM_NUM_PM_TIMER)
{
- APPL_TRACE_WARNING0("bta_dm_act dm_pm_timer no more");
+ APPL_TRACE_WARNING("bta_dm_act dm_pm_timer no more");
return;
}
}
@@ -479,7 +469,7 @@
}
else
{
- APPL_TRACE_DEBUG0("bta_dm_pm_set_mode: Link policy disallows SNIFF, ignore request");
+ APPL_TRACE_DEBUG("bta_dm_pm_set_mode: Link policy disallows SNIFF, ignore request");
}
}
else if(pm_action == BTA_DM_PM_ACTIVE)
@@ -539,13 +529,13 @@
BTM_ReadPowerMode(p_peer_dev->peer_bdaddr, &mode);
#if (BTM_SSR_INCLUDED == TRUE)
- APPL_TRACE_DEBUG3("bta_dm_pm_sniff cur:%d, idx:%d, info:x%x", mode, index, p_peer_dev->info);
+ APPL_TRACE_DEBUG("bta_dm_pm_sniff cur:%d, idx:%d, info:x%x", mode, index, p_peer_dev->info);
if (mode != BTM_PM_MD_SNIFF ||
(HCI_SNIFF_SUB_RATE_SUPPORTED(BTM_ReadLocalFeatures ()) &&
HCI_SNIFF_SUB_RATE_SUPPORTED(BTM_ReadRemoteFeatures (p_peer_dev->peer_bdaddr)) &&
!(p_peer_dev->info & BTA_DM_DI_USE_SSR)))
#else
- APPL_TRACE_DEBUG2("bta_dm_pm_sniff cur:%d, idx:%d", mode, index);
+ APPL_TRACE_DEBUG("bta_dm_pm_sniff cur:%d, idx:%d", mode, index);
if(mode != BTM_PM_MD_SNIFF)
#endif
{
@@ -564,12 +554,12 @@
}
else if (status == BTM_SUCCESS)
{
- APPL_TRACE_DEBUG0("bta_dm_pm_sniff BTM_SetPowerMode() returns BTM_SUCCESS");
+ APPL_TRACE_DEBUG("bta_dm_pm_sniff BTM_SetPowerMode() returns BTM_SUCCESS");
p_peer_dev->info &= ~(BTA_DM_DI_INT_SNIFF|BTA_DM_DI_ACP_SNIFF|BTA_DM_DI_SET_SNIFF);
}
else /* error */
{
- APPL_TRACE_ERROR1("bta_dm_pm_sniff BTM_SetPowerMode() returns ERROR status=%d", status);
+ APPL_TRACE_ERROR("bta_dm_pm_sniff BTM_SetPowerMode() returns ERROR status=%d", status);
p_peer_dev->info &= ~(BTA_DM_DI_INT_SNIFF|BTA_DM_DI_ACP_SNIFF|BTA_DM_DI_SET_SNIFF);
}
}
@@ -607,7 +597,7 @@
&& ((p_bta_dm_pm_cfg[j].app_id == BTA_ALL_APP_ID )
|| (p_bta_dm_pm_cfg[j].app_id == bta_dm_conn_srvcs.conn_srvc[i].app_id)))
{
- APPL_TRACE_WARNING2("bta_dm_pm_ssr conn_srvc id:%d, app_id:%d",
+ APPL_TRACE_WARNING("bta_dm_pm_ssr conn_srvc id:%d, app_id:%d",
bta_dm_conn_srvcs.conn_srvc[i].id, bta_dm_conn_srvcs.conn_srvc[i].app_id);
break;
}
@@ -635,7 +625,7 @@
}
p_spec = &p_bta_dm_ssr_spec[ssr];
- APPL_TRACE_WARNING2("bta_dm_pm_ssr:%d, lat:%d", ssr, p_spec->max_lat);
+ APPL_TRACE_WARNING("bta_dm_pm_ssr:%d, lat:%d", ssr, p_spec->max_lat);
if(p_spec->max_lat)
{
/* set the SSR parameters. */
@@ -708,7 +698,7 @@
tBTA_DM_PM_TIMER *p_buf;
UINT8 i;
- APPL_TRACE_WARNING0("dm_pm_timer expires");
+ APPL_TRACE_WARNING("dm_pm_timer expires");
for(i=0; i<BTA_DM_NUM_PM_TIMER; i++)
{
@@ -718,7 +708,7 @@
if(&bta_dm_cb.pm_timer[i].timer == (TIMER_LIST_ENT*) p_tle)
{
- APPL_TRACE_WARNING1("dm_pm_timer expires %d", i);
+ APPL_TRACE_WARNING("dm_pm_timer expires %d", i);
bta_dm_cb.pm_timer[i].in_use = FALSE;
break;
}
@@ -758,7 +748,7 @@
tBTA_DM_PEER_DEVICE *p_dev;
tBTA_DM_DEV_INFO info;
- APPL_TRACE_DEBUG1("bta_dm_pm_btm_status:%d", p_data->pm_status.status);
+ APPL_TRACE_DEBUG("bta_dm_pm_btm_status:%d", p_data->pm_status.status);
p_dev = bta_dm_find_peer_device(p_data->pm_status.bd_addr);
if(NULL == p_dev)
return;
@@ -772,7 +762,7 @@
we should not try it again*/
if (p_data->pm_status.hci_status != 0)
{
- APPL_TRACE_ERROR1("bta_dm_pm_btm_status hci_status=%d", p_data->pm_status.hci_status);
+ APPL_TRACE_ERROR("bta_dm_pm_btm_status hci_status=%d", p_data->pm_status.hci_status);
p_dev->info &= ~(BTA_DM_DI_INT_SNIFF|BTA_DM_DI_ACP_SNIFF|BTA_DM_DI_SET_SNIFF);
if(p_dev->pm_mode_attempted &(BTA_DM_PM_PARK | BTA_DM_PM_SNIFF))
@@ -816,6 +806,16 @@
break;
#endif
case BTM_PM_STS_SNIFF:
+ if (p_data->pm_status.hci_status == 0)
+ {
+ /* Stop PM timer now if already active for
+ * particular device since link is already
+ * put in sniff mode by remote device, and
+ * PM timer sole purpose is to put the link
+ * in sniff mode from host side.
+ */
+ bta_dm_pm_stop_timer(p_data->pm_status.bd_addr);
+ }
p_dev->info &= ~(BTA_DM_DI_SET_SNIFF|BTA_DM_DI_INT_SNIFF|BTA_DM_DI_ACP_SNIFF);
if (info & BTA_DM_DI_SET_SNIFF)
p_dev->info |= BTA_DM_DI_INT_SNIFF;
@@ -848,7 +848,7 @@
void bta_dm_pm_timer(tBTA_DM_MSG *p_data)
{
- APPL_TRACE_WARNING0("proc dm_pm_timer expires");
+ APPL_TRACE_WARNING("proc dm_pm_timer expires");
bta_dm_pm_set_mode(p_data->pm_status.bd_addr, TRUE);
@@ -904,7 +904,7 @@
}
}
- APPL_TRACE_DEBUG1("bta_dm_is_sco_active: SCO active: %d", bScoActive);
+ APPL_TRACE_DEBUG("bta_dm_is_sco_active: SCO active: %d", bScoActive);
return bScoActive;
}
@@ -929,7 +929,7 @@
/* check if an entry already present */
if(bta_dm_conn_srvcs.conn_srvc[j].id == BTA_ID_HH )
{
- APPL_TRACE_DEBUG2 ("SCO status change(Active: %d), modify HID link policy. state: %d",
+ APPL_TRACE_DEBUG ("SCO status change(Active: %d), modify HID link policy. state: %d",
bScoActive, bta_dm_conn_srvcs.conn_srvc[j].state);
bta_dm_pm_set_sniff_policy( bta_dm_find_peer_device(bta_dm_conn_srvcs.conn_srvc[j].peer_bdaddr), bScoActive);
@@ -980,3 +980,26 @@
BTM_SetLinkPolicy(p_dev->peer_bdaddr, &policy_setting);
}
+
+#if ((defined BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
+/*******************************************************************************
+**
+** Function bta_dm_pm_obtain_controller_state
+**
+** Description This function obtains the consolidated controller power state
+**
+** Parameters:
+**
+*******************************************************************************/
+tBTA_DM_CONTRL_STATE bta_dm_pm_obtain_controller_state(void)
+{
+ /* Did not use counts as it is not sure, how accurate the count values are in
+ ** bta_dm_cb.device_list.count > 0 || bta_dm_cb.device_list.le_count > 0 */
+
+ tBTA_DM_CONTRL_STATE cur_state = BTA_DM_CONTRL_UNKNOWN;
+ cur_state = BTM_PM_ReadControllerState();
+
+ APPL_TRACE_DEBUG("bta_dm_pm_obtain_controller_state: %d", cur_state);
+ return cur_state;
+}
+#endif
diff --git a/bta/dm/bta_dm_sco.c b/bta/dm/bta_dm_sco.c
index 803242b..109140a 100644
--- a/bta/dm/bta_dm_sco.c
+++ b/bta/dm/bta_dm_sco.c
@@ -247,7 +247,7 @@
SRC_TYPE *pOv, *pOvEnd;
INT16 *psBtOut = (INT16 *)pDst;
#if BTA_DM_SCO_DEBUG
- APPL_TRACE_DEBUG1("Convert_8M_ToBT_Filtered, CurrentPos %d\n", CurrentPos);
+ APPL_TRACE_DEBUG("Convert_8M_ToBT_Filtered, CurrentPos %d\n", CurrentPos);
#endif
memcpy (pOverlapArea + (BTA_DM_PCM_OVERLAP_SIZE * 2), pSrc, BTA_DM_PCM_OVERLAP_SIZE * 2);
@@ -411,7 +411,7 @@
INT16 *psBtOut = (INT16 *)pDst;
#if BTA_DM_SCO_DEBUG
- APPL_TRACE_DEBUG5("Convert_8S_ToBT_Filtered CurrentPos %d, SRC_TYPE %d, SRC_CHANNELS %d, \
+ APPL_TRACE_DEBUG("Convert_8S_ToBT_Filtered CurrentPos %d, SRC_TYPE %d, SRC_CHANNELS %d, \
dwSrcSamples %d, dwSrcSps %d", CurrentPos, sizeof (SRC_TYPE), SRC_CHANNELS, \
dwSrcSamples, dwSrcSps);
#endif
@@ -608,7 +608,7 @@
p_cb->can_be_filtered = 0;
#if BTA_DM_SCO_DEBUG
- APPL_TRACE_DEBUG2("bta_dm_pcm_init_samples: n_channels = %d bits = %d", n_channels, bits);
+ APPL_TRACE_DEBUG("bta_dm_pcm_init_samples: n_channels = %d bits = %d", n_channels, bits);
#endif
if(n_channels == 1)
{
@@ -642,11 +642,11 @@
}
#if BTA_DM_SCO_DEBUG
- APPL_TRACE_DEBUG2("bta_pcm_init_dwn_sample: cur_pos %d, src_sps %d", \
+ APPL_TRACE_DEBUG("bta_pcm_init_dwn_sample: cur_pos %d, src_sps %d", \
p_cb->cur_pos, p_cb->src_sps);
- APPL_TRACE_DEBUG3("bta_pcm_init_dwn_sample: bits %d, n_channels %d, sample_size %d, ", \
+ APPL_TRACE_DEBUG("bta_pcm_init_dwn_sample: bits %d, n_channels %d, sample_size %d, ", \
p_cb->bits, p_cb->n_channels, p_cb->sample_size);
- APPL_TRACE_DEBUG3("bta_pcm_init_dwn_sample: can_be_filtered %d, n_channels: %d, \
+ APPL_TRACE_DEBUG("bta_pcm_init_dwn_sample: can_be_filtered %d, n_channels: %d, \
divisor %d", p_cb->can_be_filtered, p_cb->n_channels, p_cb->divisor);
#endif
@@ -673,7 +673,7 @@
UINT32 out_sample;
#if BTA_DM_SCO_DEBUG
- APPL_TRACE_DEBUG1("bta_pcm_resample : insamples %d", (in_bytes / bta_dm_pcm_cb.divisor));
+ APPL_TRACE_DEBUG("bta_pcm_resample : insamples %d", (in_bytes / bta_dm_pcm_cb.divisor));
#endif
if(bta_dm_pcm_cb.can_be_filtered)
{
@@ -687,7 +687,7 @@
}
#if BTA_DM_SCO_DEBUG
- APPL_TRACE_DEBUG1("bta_pcm_resample : outsamples %d", out_sample);
+ APPL_TRACE_DEBUG("bta_pcm_resample : outsamples %d", out_sample);
#endif
return (out_sample * bta_dm_pcm_cb.sample_size);
diff --git a/bta/gatt/bta_gattc_act.c b/bta/gatt/bta_gattc_act.c
old mode 100644
new mode 100755
index 44f88e4..546a56f
--- a/bta/gatt/bta_gattc_act.c
+++ b/bta/gatt/bta_gattc_act.c
@@ -45,14 +45,15 @@
** Constants
*****************************************************************************/
static void bta_gattc_conn_cback(tGATT_IF gattc_if, BD_ADDR bda, UINT16 conn_id,
- BOOLEAN connected, tGATT_DISCONN_REASON reason);
+ BOOLEAN connected, tGATT_DISCONN_REASON reason,
+ tBT_TRANSPORT transport);
static void bta_gattc_cmpl_cback(UINT16 conn_id, tGATTC_OPTYPE op, tGATT_STATUS status,
tGATT_CL_COMPLETE *p_data);
static void bta_gattc_deregister_cmpl(tBTA_GATTC_RCB *p_clreg);
-
static void bta_gattc_enc_cmpl_cback(tGATT_IF gattc_if, BD_ADDR bda);
+static void bta_gattc_cong_cback (UINT16 conn_id, BOOLEAN congested);
static tGATT_CBACK bta_gattc_cl_cback =
{
@@ -61,7 +62,8 @@
bta_gattc_disc_res_cback,
bta_gattc_disc_cmpl_cback,
NULL,
- bta_gattc_enc_cmpl_cback
+ bta_gattc_enc_cmpl_cback,
+ bta_gattc_cong_cback
};
/* opcode(tGATTC_OPTYPE) order has to be comply with internal event order */
@@ -102,7 +104,7 @@
*******************************************************************************/
static void bta_gattc_enable(tBTA_GATTC_CB *p_cb)
{
- APPL_TRACE_DEBUG0("bta_gattc_enable");
+ APPL_TRACE_DEBUG("bta_gattc_enable");
if (p_cb->state == BTA_GATTC_STATE_DISABLED)
{
@@ -112,7 +114,7 @@
}
else
{
- APPL_TRACE_DEBUG0("GATTC is arelady enabled");
+ APPL_TRACE_DEBUG("GATTC is arelady enabled");
}
}
@@ -131,11 +133,11 @@
{
UINT8 i;
- APPL_TRACE_DEBUG0("bta_gattc_disable");
+ APPL_TRACE_DEBUG("bta_gattc_disable");
if (p_cb->state != BTA_GATTC_STATE_ENABLED)
{
- APPL_TRACE_ERROR0("not enabled or disable in pogress");
+ APPL_TRACE_ERROR("not enabled or disable in pogress");
return;
}
@@ -182,7 +184,7 @@
tBTA_GATT_STATUS status = BTA_GATT_NO_RESOURCES;
- APPL_TRACE_DEBUG1("bta_gattc_register state %d",p_cb->state);
+ APPL_TRACE_DEBUG("bta_gattc_register state %d",p_cb->state);
memset(&cb_data, 0, sizeof(cb_data));
cb_data.reg_oper.status = BTA_GATT_NO_RESOURCES;
@@ -198,7 +200,7 @@
{
if ((p_app_uuid == NULL) || (p_cb->cl_rcb[i].client_if = GATT_Register(p_app_uuid, &bta_gattc_cl_cback)) == 0)
{
- APPL_TRACE_ERROR0("Register with GATT stack failed.");
+ APPL_TRACE_ERROR("Register with GATT stack failed.");
status = BTA_GATT_ERROR;
}
else
@@ -259,7 +261,7 @@
}
else
{
- APPL_TRACE_ERROR1("Unable to start app.: Unknown interface =%d",p_msg->int_start_if.client_if );
+ APPL_TRACE_ERROR("Unable to start app.: Unknown interface =%d",p_msg->int_start_if.client_if );
}
}
/*******************************************************************************
@@ -315,7 +317,7 @@
}
else
{
- APPL_TRACE_ERROR0("bta_gattc_deregister Deregister Failedm unknown client cif");
+ APPL_TRACE_ERROR("bta_gattc_deregister Deregister Failedm unknown client cif");
}
}
/*******************************************************************************
@@ -339,19 +341,20 @@
if (p_msg->api_conn.is_direct)
{
if ((p_clcb = bta_gattc_find_alloc_clcb(p_msg->api_conn.client_if,
- p_msg->api_conn.remote_bda)) != NULL)
+ p_msg->api_conn.remote_bda,
+ p_msg->api_conn.transport)) != NULL)
{
bta_gattc_sm_execute(p_clcb, event, p_msg);
}
else
{
- APPL_TRACE_ERROR0("No resources to open a new connection.");
+ APPL_TRACE_ERROR("No resources to open a new connection.");
bta_gattc_send_open_cback(p_clreg,
BTA_GATT_NO_RESOURCES,
p_msg->api_conn.remote_bda,
BTA_GATT_INVALID_CONN_ID,
- 0);
+ p_msg->api_conn.transport, 0);
}
}
else
@@ -361,7 +364,7 @@
}
else
{
- APPL_TRACE_ERROR1("bta_gattc_process_api_open Failed, unknown client_if: %d",
+ APPL_TRACE_ERROR("bta_gattc_process_api_open Failed, unknown client_if: %d",
p_msg->api_conn.client_if);
}
}
@@ -385,13 +388,14 @@
if (p_msg->api_cancel_conn.is_direct)
{
if ((p_clcb = bta_gattc_find_clcb_by_cif(p_msg->api_cancel_conn.client_if,
- p_msg->api_cancel_conn.remote_bda)) != NULL)
+ p_msg->api_cancel_conn.remote_bda,
+ BTA_GATT_TRANSPORT_LE)) != NULL)
{
bta_gattc_sm_execute(p_clcb, event, p_msg);
}
else
{
- APPL_TRACE_ERROR0("No such connection need to be cancelled");
+ APPL_TRACE_ERROR("No such connection need to be cancelled");
p_clreg = bta_gattc_cl_get_regcb(p_msg->api_cancel_conn.client_if);
@@ -470,12 +474,13 @@
{
UNUSED(p_data);
- APPL_TRACE_ERROR0("Connection already opened. wrong state");
+ APPL_TRACE_ERROR("Connection already opened. wrong state");
bta_gattc_send_open_cback(p_clcb->p_rcb,
BTA_GATT_OK,
p_clcb->bda,
p_clcb->bta_conn_id,
+ p_clcb->transport,
0);
}
/*******************************************************************************
@@ -495,8 +500,8 @@
BTA_GATT_ERROR,
p_clcb->bda,
p_clcb->bta_conn_id,
+ p_clcb->transport,
0);
-
/* open failure, remove clcb */
bta_gattc_clcb_dealloc(p_clcb);
}
@@ -515,9 +520,10 @@
tBTA_GATTC_DATA gattc_data;
/* open/hold a connection */
- if (!GATT_Connect(p_clcb->p_rcb->client_if, p_data->api_conn.remote_bda, TRUE))
+ if (!GATT_Connect(p_clcb->p_rcb->client_if, p_data->api_conn.remote_bda,
+ TRUE, p_data->api_conn.transport))
{
- APPL_TRACE_ERROR0("Connection open failure");
+ APPL_TRACE_ERROR("Connection open failure");
bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_OPEN_FAIL_EVT, p_data);
}
@@ -526,7 +532,8 @@
/* a connected remote device */
if (GATT_GetConnIdIfConnected(p_clcb->p_rcb->client_if,
p_data->api_conn.remote_bda,
- &p_clcb->bta_conn_id))
+ &p_clcb->bta_conn_id,
+ p_data->api_conn.transport))
{
gattc_data.int_conn.hdr.layer_specific = p_clcb->bta_conn_id;
@@ -553,11 +560,11 @@
if (bta_gattc_mark_bg_conn(p_data->client_if, p_data->remote_bda, TRUE, FALSE))
{
- /* alwaya call open to hold a connection */
- if (!GATT_Connect(p_data->client_if, p_data->remote_bda, FALSE))
+ /* always call open to hold a connection */
+ if (!GATT_Connect(p_data->client_if, p_data->remote_bda, FALSE, p_data->transport))
{
status = BTA_GATT_ERROR;
- APPL_TRACE_ERROR0("bta_gattc_init_bk_conn failed");
+ APPL_TRACE_ERROR("bta_gattc_init_bk_conn failed");
}
else
{
@@ -566,9 +573,11 @@
/* if is a connected remote device */
if (GATT_GetConnIdIfConnected(p_data->client_if,
p_data->remote_bda,
- &conn_id))
+ &conn_id,
+ p_data->transport))
{
- if ((p_clcb = bta_gattc_find_alloc_clcb(p_data->client_if, p_data->remote_bda)) != NULL)
+ if ((p_clcb = bta_gattc_find_alloc_clcb(p_data->client_if, p_data->remote_bda,
+ BTA_GATT_TRANSPORT_LE)) != NULL)
{
gattc_data.hdr.layer_specific = p_clcb->bta_conn_id = conn_id;
@@ -583,7 +592,8 @@
/* open failure, report OPEN_EVT */
if (status != BTA_GATT_OK)
{
- bta_gattc_send_open_cback(p_clreg, status, p_data->remote_bda, BTA_GATT_INVALID_CONN_ID, 0);
+ bta_gattc_send_open_cback(p_clreg, status, p_data->remote_bda,
+ BTA_GATT_INVALID_CONN_ID, BTA_GATT_TRANSPORT_LE, 0);
}
}
/*******************************************************************************
@@ -610,7 +620,7 @@
}
else
{
- APPL_TRACE_ERROR0("bta_gattc_cancel_bk_conn failed");
+ APPL_TRACE_ERROR("bta_gattc_cancel_bk_conn failed");
}
}
p_clreg = bta_gattc_cl_get_regcb(p_data->client_if);
@@ -681,13 +691,15 @@
void bta_gattc_conn(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
{
tBTA_GATTC_IF gatt_if;
- APPL_TRACE_DEBUG1("bta_gattc_conn server cache state=%d",p_clcb->p_srcb->state);
+ APPL_TRACE_DEBUG("bta_gattc_conn server cache state=%d",p_clcb->p_srcb->state);
if (p_data != NULL)
{
- APPL_TRACE_DEBUG1("bta_gattc_conn conn_id=%d",p_data->hdr.layer_specific);
+ APPL_TRACE_DEBUG("bta_gattc_conn conn_id=%d",p_data->hdr.layer_specific);
p_clcb->bta_conn_id = p_data->int_conn.hdr.layer_specific;
- GATT_GetConnectionInfor(p_data->int_conn.hdr.layer_specific, &gatt_if, p_clcb->bda);
+
+ GATT_GetConnectionInfor(p_data->hdr.layer_specific,
+ &gatt_if, p_clcb->bda, &p_clcb->transport);
}
p_clcb->p_srcb->connected = TRUE;
@@ -721,14 +733,16 @@
if (p_clcb->p_rcb)
{
- /* there is no RM for GATT */
- if (!BTM_IsBleLink(p_clcb->bda))
- bta_sys_conn_open(BTA_ID_GATTC, BTA_ALL_APP_ID, p_clcb->bda);
- bta_gattc_send_open_cback(p_clcb->p_rcb,
- BTA_GATT_OK,
- p_clcb->bda,
- p_clcb->bta_conn_id,
- p_clcb->p_srcb->mtu);
+ /* there is no RM for GATT */
+ if (p_clcb->transport == BTA_TRANSPORT_BR_EDR)
+ bta_sys_conn_open(BTA_ID_GATTC, BTA_ALL_APP_ID, p_clcb->bda);
+
+ bta_gattc_send_open_cback(p_clcb->p_rcb,
+ BTA_GATT_OK,
+ p_clcb->bda,
+ p_clcb->bta_conn_id,
+ p_clcb->transport,
+ p_clcb->p_srcb->mtu);
}
}
/*******************************************************************************
@@ -772,7 +786,7 @@
tBTA_GATTC_RCB *p_clreg = p_clcb->p_rcb;
tBTA_GATTC cb_data;
- APPL_TRACE_DEBUG1("bta_gattc_close conn_id=%d",p_clcb->bta_conn_id);
+ APPL_TRACE_DEBUG("bta_gattc_close conn_id=%d",p_clcb->bta_conn_id);
cb_data.close.client_if = p_clcb->p_rcb->client_if;
cb_data.close.conn_id = p_clcb->bta_conn_id;
@@ -780,13 +794,19 @@
cb_data.close.status = p_clcb->status;
bdcpy(cb_data.close.remote_bda, p_clcb->bda);
- if (!BTM_IsBleLink(p_clcb->bda))
+ if (p_clcb->transport == BTA_TRANSPORT_BR_EDR)
bta_sys_conn_close( BTA_ID_GATTC ,BTA_ALL_APP_ID, p_clcb->bda);
bta_gattc_clcb_dealloc(p_clcb);
if (p_data->hdr.event == BTA_GATTC_API_CLOSE_EVT)
+ {
cb_data.close.status = GATT_Disconnect(p_data->hdr.layer_specific);
+ }
+ else if (p_data->hdr.event == BTA_GATTC_INT_DISCONN_EVT)
+ {
+ cb_data.close.status = p_data->int_conn.reason;
+ }
if(p_cback)
(* p_cback)(BTA_GATTC_CLOSE_EVT, (tBTA_GATTC *)&cb_data);
@@ -830,10 +850,11 @@
*******************************************************************************/
void bta_gattc_disc_close(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
{
- APPL_TRACE_DEBUG1("Discovery cancel conn_id=%d",p_clcb->bta_conn_id);
-
- bta_gattc_reset_discover_st(p_clcb->p_srcb, BTA_GATT_ERROR);
- bta_gattc_sm_execute(p_clcb, BTA_GATTC_API_CLOSE_EVT, p_data);
+ APPL_TRACE_DEBUG("Discovery cancel conn_id=%d",p_clcb->bta_conn_id);
+ if (p_clcb->disc_active)
+ bta_gattc_reset_discover_st(p_clcb->p_srcb, BTA_GATT_ERROR);
+ else
+ p_clcb->state = BTA_GATTC_CONN_ST;
}
/*******************************************************************************
**
@@ -925,7 +946,7 @@
{
UNUSED(p_data);
- APPL_TRACE_DEBUG2("bta_gattc_start_discover conn_id=%d p_clcb->p_srcb->state = %d ",
+ APPL_TRACE_DEBUG("bta_gattc_start_discover conn_id=%d p_clcb->p_srcb->state = %d ",
p_clcb->bta_conn_id, p_clcb->p_srcb->state);
if (((p_clcb->p_q_cmd == NULL || p_clcb->auto_update == BTA_GATTC_REQ_WAITING) &&
@@ -942,22 +963,28 @@
p_clcb->p_srcb->update_count = 0;
p_clcb->p_srcb->state = BTA_GATTC_SERV_DISC_ACT;
+ if (p_clcb->transport == BTA_TRANSPORT_LE)
+ L2CA_EnableUpdateBleConnParams(p_clcb->p_srcb->server_bda, FALSE);
+
/* set all srcb related clcb into discovery ST */
bta_gattc_set_discover_st(p_clcb->p_srcb);
if ((p_clcb->status = bta_gattc_init_cache(p_clcb->p_srcb)) == BTA_GATT_OK)
{
- p_clcb->status = bta_gattc_discover_pri_service(p_clcb->bta_conn_id, p_clcb->p_srcb, GATT_DISC_SRVC_ALL);
+ p_clcb->status = bta_gattc_discover_pri_service(p_clcb->bta_conn_id,
+ p_clcb->p_srcb, GATT_DISC_SRVC_ALL);
}
if (p_clcb->status != BTA_GATT_OK)
{
- APPL_TRACE_ERROR0("discovery on server failed");
+ APPL_TRACE_ERROR("discovery on server failed");
bta_gattc_reset_discover_st(p_clcb->p_srcb, p_clcb->status);
}
+ else
+ p_clcb->disc_active = TRUE;
}
else
{
- APPL_TRACE_ERROR0("unknown device, can not start discovery");
+ APPL_TRACE_ERROR("unknown device, can not start discovery");
}
}
/* pending operation, wait until it finishes */
@@ -984,12 +1011,14 @@
tBTA_GATTC_DATA *p_q_cmd = p_clcb->p_q_cmd;
UNUSED(p_data);
- APPL_TRACE_DEBUG1("bta_gattc_disc_cmpl conn_id=%d",p_clcb->bta_conn_id);
+ APPL_TRACE_DEBUG("bta_gattc_disc_cmpl conn_id=%d",p_clcb->bta_conn_id);
#if BLE_INCLUDED == TRUE
- L2CA_EnableUpdateBleConnParams(p_clcb->p_srcb->server_bda, TRUE);
+ if(p_clcb->transport == BTA_TRANSPORT_LE)
+ L2CA_EnableUpdateBleConnParams(p_clcb->p_srcb->server_bda, TRUE);
#endif
p_clcb->p_srcb->state = BTA_GATTC_SERV_IDLE;
+ p_clcb->disc_active = FALSE;
if (p_clcb->status != GATT_SUCCESS)
{
@@ -1020,9 +1049,13 @@
p_clcb->p_q_cmd = NULL;
bta_gattc_sm_execute(p_clcb, p_q_cmd->hdr.event, p_q_cmd);
-
- utl_freebuf((void **)&p_q_cmd);
-
+ /* if the command executed requeued the cmd, we don't
+ * want to free the underlying buffer that's being
+ * referenced by p_clcb->p_q_cmd
+ */
+ if (p_q_cmd != p_clcb->p_q_cmd) {
+ utl_freebuf((void **)&p_q_cmd);
+ }
}
}
/*******************************************************************************
@@ -1112,7 +1145,7 @@
}
else
{
- APPL_TRACE_ERROR1("invalud ID type: %d", p_id->id_type);
+ APPL_TRACE_ERROR("invalud ID type: %d", p_id->id_type);
}
if (handle == 0)
@@ -1240,20 +1273,23 @@
&p_data->api_confirm.char_id,
NULL)) == 0)
{
- APPL_TRACE_ERROR0("Can not map service/char ID into valid handle");
+ APPL_TRACE_ERROR("Can not map service/char ID into valid handle");
}
else
{
if (GATTC_SendHandleValueConfirm(p_data->api_confirm.hdr.layer_specific, handle)
!= GATT_SUCCESS)
{
- APPL_TRACE_ERROR1("bta_gattc_confirm to handle [0x%04x] failed", handle);
+ APPL_TRACE_ERROR("bta_gattc_confirm to handle [0x%04x] failed", handle);
}
- /* if over BR_EDR, inform PM for mode change */
- else if (!BTM_IsBleLink(p_clcb->bda))
+ else
{
- bta_sys_busy(BTA_ID_GATTC, BTA_ALL_APP_ID, p_clcb->bda);
- bta_sys_idle(BTA_ID_GATTC, BTA_ALL_APP_ID, p_clcb->bda);
+ /* if over BR_EDR, inform PM for mode change */
+ if (p_clcb->transport == BTA_TRANSPORT_BR_EDR)
+ {
+ bta_sys_busy(BTA_ID_GATTC, BTA_ALL_APP_ID, p_clcb->bda);
+ bta_sys_idle(BTA_ID_GATTC, BTA_ALL_APP_ID, p_clcb->bda);
+ }
}
}
}
@@ -1286,7 +1322,8 @@
&cb_data.read.descr_type) == FALSE)
{
cb_data.read.status = BTA_GATT_INTERNAL_ERROR;
- APPL_TRACE_ERROR1("can not map to GATT ID. handle = 0x%04x", p_data->p_cmpl->att_value.handle);
+ APPL_TRACE_ERROR("can not map to GATT ID. handle = 0x%04x",
+ p_data->p_cmpl->att_value.handle);
}
else
{
@@ -1302,10 +1339,12 @@
cb_data.read.srvc_id = p_clcb->p_q_cmd->api_read.srvc_id;
cb_data.read.char_id = p_clcb->p_q_cmd->api_read.char_id;
if (p_clcb->p_q_cmd->api_read.p_descr_type)
- memcpy(&cb_data.read.descr_type, p_clcb->p_q_cmd->api_read.p_descr_type, sizeof(tBTA_GATT_ID));
+ memcpy(&cb_data.read.descr_type, p_clcb->p_q_cmd->api_read.p_descr_type,
+ sizeof(tBTA_GATT_ID));
}
- event = (p_clcb->p_q_cmd->api_read.p_descr_type == NULL) ? BTA_GATTC_READ_CHAR_EVT: BTA_GATTC_READ_DESCR_EVT;
+ event = (p_clcb->p_q_cmd->api_read.p_descr_type == NULL) ?
+ BTA_GATTC_READ_CHAR_EVT: BTA_GATTC_READ_DESCR_EVT;
cb_data.read.conn_id = p_clcb->bta_conn_id;
utl_freebuf((void **)&p_clcb->p_q_cmd);
@@ -1339,10 +1378,13 @@
}
else
{
- memcpy(&cb_data.write.srvc_id, &p_clcb->p_q_cmd->api_write.srvc_id, sizeof(tBTA_GATT_SRVC_ID));
- memcpy(&cb_data.write.char_id, &p_clcb->p_q_cmd->api_write.char_id, sizeof(tBTA_GATT_ID));
+ memcpy(&cb_data.write.srvc_id, &p_clcb->p_q_cmd->api_write.srvc_id,
+ sizeof(tBTA_GATT_SRVC_ID));
+ memcpy(&cb_data.write.char_id, &p_clcb->p_q_cmd->api_write.char_id,
+ sizeof(tBTA_GATT_ID));
if (p_clcb->p_q_cmd->api_write.p_descr_type)
- memcpy(&cb_data.write.descr_type, p_clcb->p_q_cmd->api_write.p_descr_type, sizeof(tBTA_GATT_ID));
+ memcpy(&cb_data.write.descr_type, p_clcb->p_q_cmd->api_write.p_descr_type,
+ sizeof(tBTA_GATT_ID));
}
if (p_clcb->p_q_cmd->api_write.hdr.event == BTA_GATTC_API_WRITE_EVT &&
@@ -1430,17 +1472,17 @@
UINT8 op = (UINT8)p_data->op_cmpl.op_code;
UINT8 mapped_op = 0;
- APPL_TRACE_DEBUG1("bta_gattc_op_cmpl op = %d", op);
+ APPL_TRACE_DEBUG("bta_gattc_op_cmpl op = %d", op);
if (op == GATTC_OPTYPE_INDICATION || op == GATTC_OPTYPE_NOTIFICATION)
{
- APPL_TRACE_ERROR0("unexpected operation, ignored");
+ APPL_TRACE_ERROR("unexpected operation, ignored");
}
else if (op >= GATTC_OPTYPE_READ)
{
if (p_clcb->p_q_cmd == NULL)
{
- APPL_TRACE_ERROR0("No pending command");
+ APPL_TRACE_ERROR("No pending command");
return;
}
if (p_clcb->p_q_cmd->hdr.event != bta_gattc_opcode_to_int_evt[op - GATTC_OPTYPE_READ])
@@ -1449,23 +1491,25 @@
if ( mapped_op > GATTC_OPTYPE_INDICATION) mapped_op = 0;
#if (BT_TRACE_VERBOSE == TRUE)
- APPL_TRACE_ERROR3("expect op:(%s :0x%04x), receive unexpected operation (%s).",
+ APPL_TRACE_ERROR("expect op:(%s :0x%04x), receive unexpected operation (%s).",
bta_gattc_op_code_name[mapped_op] , p_clcb->p_q_cmd->hdr.event,
bta_gattc_op_code_name[op]);
#else
- APPL_TRACE_ERROR3("expect op:(%u :0x%04x), receive unexpected operation (%u).",
+ APPL_TRACE_ERROR("expect op:(%u :0x%04x), receive unexpected operation (%u).",
mapped_op , p_clcb->p_q_cmd->hdr.event, op);
#endif
return;
}
- /* service handle change void the response, discard it */
- if (p_clcb->auto_update == BTA_GATTC_DISC_WAITING)
+ /* discard responses if service change indication is received before operation completed */
+ if (p_clcb->auto_update == BTA_GATTC_DISC_WAITING && p_clcb->p_srcb->srvc_hdl_chg)
{
- p_clcb->auto_update = BTA_GATTC_REQ_WAITING;
- bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_DISCOVER_EVT, NULL);
+ APPL_TRACE_DEBUG("Discard all responses when service change indication is received.");
+ p_data->op_cmpl.status = GATT_ERROR;
}
- else if (op == GATTC_OPTYPE_READ)
+
+ /* service handle change void the response, discard it */
+ if (op == GATTC_OPTYPE_READ)
bta_gattc_read_cmpl(p_clcb, &p_data->op_cmpl);
else if (op == GATTC_OPTYPE_WRITE)
@@ -1476,6 +1520,12 @@
else if (op == GATTC_OPTYPE_CONFIG)
bta_gattc_cfg_mtu_cmpl(p_clcb, &p_data->op_cmpl);
+
+ if (p_clcb->auto_update == BTA_GATTC_DISC_WAITING)
+ {
+ p_clcb->auto_update = BTA_GATTC_REQ_WAITING;
+ bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_DISCOVER_EVT, NULL);
+ }
}
}
/*******************************************************************************
@@ -1493,7 +1543,7 @@
/* receive op complete when discovery is started, ignore the response,
and wait for discovery finish and resent */
- APPL_TRACE_DEBUG1("bta_gattc_ignore_op_cmpl op = %d", p_data->hdr.layer_specific);
+ APPL_TRACE_DEBUG("bta_gattc_ignore_op_cmpl op = %d", p_data->hdr.layer_specific);
}
/*******************************************************************************
@@ -1509,7 +1559,7 @@
{
tBTA_GATT_STATUS status = GATT_INTERNAL_ERROR;
tBTA_GATTC cb_data;
- APPL_TRACE_DEBUG1("bta_gattc_search conn_id=%d",p_clcb->bta_conn_id);
+ APPL_TRACE_DEBUG("bta_gattc_search conn_id=%d",p_clcb->bta_conn_id);
if (p_clcb->p_srcb && p_clcb->p_srcb->p_srvc_cache)
{
status = BTA_GATT_OK;
@@ -1551,7 +1601,7 @@
bta_gattc_set_discover_st(p_clcb->p_srcb);
- APPL_TRACE_DEBUG1("bta_gattc_cache_open conn_id=%d",p_clcb->bta_conn_id);
+ APPL_TRACE_DEBUG("bta_gattc_cache_open conn_id=%d",p_clcb->bta_conn_id);
bta_gattc_co_cache_open(p_clcb->p_srcb->server_bda, BTA_GATTC_CI_CACHE_OPEN_EVT,
p_clcb->bta_conn_id, FALSE);
}
@@ -1566,7 +1616,7 @@
*******************************************************************************/
void bta_gattc_ci_open(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
{
- APPL_TRACE_DEBUG2("bta_gattc_ci_open conn_id=%d server state=%d" ,
+ APPL_TRACE_DEBUG("bta_gattc_ci_open conn_id=%d server state=%d" ,
p_clcb->bta_conn_id, p_clcb->p_srcb->state);
if (p_clcb->p_srcb->state == BTA_GATTC_SERV_LOAD)
{
@@ -1615,21 +1665,21 @@
void bta_gattc_ci_load(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
{
- APPL_TRACE_DEBUG2("bta_gattc_ci_load conn_id=%d load status=%d" ,
- p_clcb->bta_conn_id, p_data->ci_load.status );
- bta_gattc_co_cache_close(p_clcb->p_srcb->server_bda, 0);
+ APPL_TRACE_DEBUG("bta_gattc_ci_load conn_id=%d load status=%d",
+ p_clcb->bta_conn_id, p_data->ci_load.status);
- if ((p_data->ci_load.status == BTA_GATT_OK ||
- p_data->ci_load.status == BTA_GATT_MORE) &&
- p_data->ci_load.num_attr > 0)
+ if (p_data->ci_load.status == BTA_GATT_OK ||
+ p_data->ci_load.status == BTA_GATT_MORE)
{
- bta_gattc_rebuild_cache(p_clcb->p_srcb, p_data->ci_load.num_attr, p_data->ci_load.attr, p_clcb->p_srcb->attr_index);
+ if (p_data->ci_load.num_attr != 0)
+ bta_gattc_rebuild_cache(p_clcb->p_srcb, p_data->ci_load.num_attr,
+ p_data->ci_load.attr, p_clcb->p_srcb->attr_index);
if (p_data->ci_load.status == BTA_GATT_OK)
{
p_clcb->p_srcb->attr_index = 0;
bta_gattc_reset_discover_st(p_clcb->p_srcb, BTA_GATT_OK);
-
+ bta_gattc_co_cache_close(p_clcb->p_srcb->server_bda, 0);
}
else /* load more */
{
@@ -1643,6 +1693,7 @@
}
else
{
+ bta_gattc_co_cache_close(p_clcb->p_srcb->server_bda, 0);
p_clcb->p_srcb->state = BTA_GATTC_SERV_DISC;
p_clcb->p_srcb->attr_index = 0;
/* cache load failure, start discovery */
@@ -1651,7 +1702,7 @@
}
/*******************************************************************************
**
-** Function bta_gattc_ci_load
+** Function bta_gattc_ci_save
**
** Description cache loading received.
**
@@ -1662,7 +1713,7 @@
{
UNUSED(p_data);
- APPL_TRACE_DEBUG1("bta_gattc_ci_save conn_id=%d " ,
+ APPL_TRACE_DEBUG("bta_gattc_ci_save conn_id=%d " ,
p_clcb->bta_conn_id );
if (!bta_gattc_cache_save(p_clcb->p_srcb, p_clcb->bta_conn_id))
@@ -1687,7 +1738,7 @@
if (p_clcb->status == BTA_GATT_OK)
{
- APPL_TRACE_ERROR1("operation not supported at current state [%d]", p_clcb->state);
+ APPL_TRACE_ERROR("operation not supported at current state [%d]", p_clcb->state);
}
}
@@ -1735,27 +1786,33 @@
**
*******************************************************************************/
static void bta_gattc_conn_cback(tGATT_IF gattc_if, BD_ADDR bda, UINT16 conn_id,
- BOOLEAN connected, tGATT_DISCONN_REASON reason)
+ BOOLEAN connected, tGATT_DISCONN_REASON reason,
+ tBT_TRANSPORT transport)
{
tBTA_GATTC_DATA *p_buf;
- APPL_TRACE_DEBUG4("bta_gattc_conn_cback: cif = %d connected = %d conn_id = %d reaosn = 0x%04x",
- gattc_if, connected, conn_id, reason);
+ if (reason != 0)
+ {
+ APPL_TRACE_WARNING("%s() - cif=%d connected=%d conn_id=%d reason=0x%04x",
+ __FUNCTION__, gattc_if, connected, conn_id, reason);
+ }
if ((p_buf = (tBTA_GATTC_DATA *) GKI_getbuf(sizeof(tBTA_GATTC_DATA))) != NULL)
{
memset(p_buf, 0, sizeof(tBTA_GATTC_DATA));
- p_buf->int_conn.hdr.event = connected ? BTA_GATTC_INT_CONN_EVT: BTA_GATTC_INT_DISCONN_EVT;
+ p_buf->int_conn.hdr.event = connected ? BTA_GATTC_INT_CONN_EVT:
+ BTA_GATTC_INT_DISCONN_EVT;
p_buf->int_conn.hdr.layer_specific = conn_id;
p_buf->int_conn.client_if = gattc_if;
p_buf->int_conn.role = L2CA_GetBleConnRole(bda);
p_buf->int_conn.reason = reason;
+ p_buf->int_conn.transport = transport;
bdcpy(p_buf->int_conn.remote_bda, bda);
- bta_sys_sendmsg(p_buf);
- }
- }
+ bta_sys_sendmsg(p_buf);
+ }
+}
/*******************************************************************************
**
@@ -1771,7 +1828,7 @@
tBTA_GATTC_DATA *p_buf;
tBTA_GATTC_CLCB *p_clcb = NULL;
- if ((p_clcb = bta_gattc_find_clcb_by_cif(gattc_if, bda)) == NULL)
+ if ((p_clcb = bta_gattc_find_clcb_by_cif(gattc_if, bda, BTA_GATT_TRANSPORT_LE)) == NULL)
{
return;
}
@@ -1786,7 +1843,7 @@
}
#endif
- APPL_TRACE_DEBUG1("bta_gattc_enc_cmpl_cback: cif = %d", gattc_if);
+ APPL_TRACE_DEBUG("bta_gattc_enc_cmpl_cback: cif = %d", gattc_if);
if ((p_buf = (tBTA_GATTC_DATA *) GKI_getbuf(sizeof(tBTA_GATTC_DATA))) != NULL)
{
@@ -1934,10 +1991,10 @@
tGATT_CL_COMPLETE *p_data,
tBTA_GATTC_NOTIFY *p_notify)
{
- APPL_TRACE_DEBUG2("bta_gattc_proc_other_indication check \
+ APPL_TRACE_DEBUG("bta_gattc_proc_other_indication check \
p_data->att_value.handle=%d p_data->handle=%d",
p_data->att_value.handle, p_data->handle);
- APPL_TRACE_DEBUG1("is_notify", p_notify->is_notify);
+ APPL_TRACE_DEBUG("is_notify", p_notify->is_notify);
p_notify->is_notify = (op == GATTC_OPTYPE_INDICATION) ? FALSE : TRUE;
p_notify->len = p_data->att_value.len;
@@ -1967,22 +2024,23 @@
tBTA_GATTC_NOTIFY notify;
BD_ADDR remote_bda;
tBTA_GATTC_IF gatt_if;
+ tBTA_TRANSPORT transport;
- if (!GATT_GetConnectionInfor(conn_id, &gatt_if, remote_bda))
+ if (!GATT_GetConnectionInfor(conn_id, &gatt_if, remote_bda, &transport))
{
- APPL_TRACE_ERROR0("indication/notif for unknown app");
+ APPL_TRACE_ERROR("indication/notif for unknown app");
return;
}
if ((p_clrcb = bta_gattc_cl_get_regcb(gatt_if)) == NULL)
{
- APPL_TRACE_ERROR0("indication/notif for unregistered app");
+ APPL_TRACE_ERROR("indication/notif for unregistered app");
return;
}
if ((p_srcb = bta_gattc_find_srcb(remote_bda)) == NULL)
{
- APPL_TRACE_ERROR0("indication/notif for unknown device, ignore");
+ APPL_TRACE_ERROR("indication/notif for unknown device, ignore");
return;
}
@@ -2002,15 +2060,16 @@
/* connection not open yet */
if (p_clcb == NULL)
{
- if ((p_clcb = bta_gattc_clcb_alloc(gatt_if, remote_bda)) != NULL)
+ if ((p_clcb = bta_gattc_clcb_alloc(gatt_if, remote_bda, transport)) != NULL)
{
p_clcb->bta_conn_id = conn_id;
+ p_clcb->transport = transport;
bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_CONN_EVT, NULL);
}
else
{
- APPL_TRACE_ERROR0("No resources");
+ APPL_TRACE_ERROR("No resources");
}
}
@@ -2020,14 +2079,15 @@
/* no one intersted and need ack? */
else if (op == GATTC_OPTYPE_INDICATION)
{
- APPL_TRACE_DEBUG0("no one interested, ack now");
+ APPL_TRACE_DEBUG("no one interested, ack now");
GATTC_SendHandleValueConfirm(conn_id, handle);
}
}
}
else
{
- APPL_TRACE_ERROR1("Indi/Notif for Unknown handle[0x%04x], can not find in local cache.", handle);
+ APPL_TRACE_ERROR("Indi/Notif for Unknown handle[0x%04x], can not find in local cache.",
+ handle);
}
}
/*******************************************************************************
@@ -2046,7 +2106,7 @@
tBTA_GATTC_OP_CMPL *p_buf;
UINT16 len = sizeof(tBTA_GATTC_OP_CMPL) + sizeof(tGATT_CL_COMPLETE);
- APPL_TRACE_DEBUG3("bta_gattc_cmpl_cback: conn_id = %d op = %d status = %d",
+ APPL_TRACE_DEBUG("bta_gattc_cmpl_cback: conn_id = %d op = %d status = %d",
conn_id, op, status);
/* notification and indication processed right away */
@@ -2058,13 +2118,12 @@
/* for all other operation, not expected if w/o connection */
else if ((p_clcb = bta_gattc_find_clcb_by_conn_id(conn_id)) == NULL)
{
- APPL_TRACE_ERROR1("bta_gattc_cmpl_cback unknown conn_id = %d, ignore data", conn_id);
+ APPL_TRACE_ERROR("bta_gattc_cmpl_cback unknown conn_id = %d, ignore data", conn_id);
return;
}
-
-/* if over BR_EDR, inform PM for mode change */
- if (!BTM_IsBleLink(p_clcb->bda))
+ /* if over BR_EDR, inform PM for mode change */
+ if (p_clcb->transport == BTA_TRANSPORT_BR_EDR)
{
bta_sys_busy(BTA_ID_GATTC, BTA_ALL_APP_ID, p_clcb->bda);
bta_sys_idle(BTA_ID_GATTC, BTA_ALL_APP_ID, p_clcb->bda);
@@ -2089,6 +2148,33 @@
return;
}
+
+/*******************************************************************************
+**
+** Function bta_gattc_cong_cback
+**
+** Description congestion callback for BTA GATT client.
+**
+** Returns void
+**
+********************************************************************************/
+static void bta_gattc_cong_cback (UINT16 conn_id, BOOLEAN congested)
+{
+ tBTA_GATTC_CLCB *p_clcb;
+ tBTA_GATTC cb_data;
+
+ if ((p_clcb = bta_gattc_find_clcb_by_conn_id(conn_id)) != NULL)
+ {
+ if (p_clcb->p_rcb->p_cback)
+ {
+ cb_data.congest.conn_id = conn_id;
+ cb_data.congest.congested = congested;
+
+ (*p_clcb->p_rcb->p_cback)(BTA_GATTC_CONGEST_EVT, &cb_data);
+ }
+ }
+}
+
#if BLE_INCLUDED == TRUE
/*******************************************************************************
**
@@ -2106,14 +2192,14 @@
UINT16 conn_id;
/* should always get the connection ID */
- if (GATT_GetConnIdIfConnected(cif, remote_bda,&conn_id) == FALSE)
+ if (GATT_GetConnIdIfConnected(cif, remote_bda, &conn_id, BTA_GATT_TRANSPORT_LE) == FALSE)
{
- APPL_TRACE_ERROR0("bta_gattc_init_clcb_conn ERROR: not a connected device");
+ APPL_TRACE_ERROR("bta_gattc_init_clcb_conn ERROR: not a connected device");
return;
}
/* initaite a new connection here */
- if ((p_clcb = bta_gattc_clcb_alloc(cif, remote_bda)) != NULL)
+ if ((p_clcb = bta_gattc_clcb_alloc(cif, remote_bda, BTA_GATT_TRANSPORT_LE)) != NULL)
{
gattc_data.hdr.layer_specific = p_clcb->bta_conn_id = conn_id;
@@ -2125,7 +2211,7 @@
}
else
{
- APPL_TRACE_ERROR0("No resources");
+ APPL_TRACE_ERROR("No resources");
}
}
/*******************************************************************************
@@ -2147,7 +2233,7 @@
{
if (p_conn->in_use )
{
- if (bta_gattc_find_clcb_by_cif(cif, p_conn->remote_bda) == NULL)
+ if (bta_gattc_find_clcb_by_cif(cif, p_conn->remote_bda, BTA_GATT_TRANSPORT_LE) == NULL)
{
bta_gattc_init_clcb_conn(cif, p_conn->remote_bda);
}
@@ -2175,7 +2261,7 @@
if (p_clreg == NULL)
{
- APPL_TRACE_ERROR1("bta_gattc_listen failed, unknown client_if: %d",
+ APPL_TRACE_ERROR("bta_gattc_listen failed, unknown client_if: %d",
p_msg->api_listen.client_if);
return;
}
@@ -2189,7 +2275,7 @@
p_msg->api_listen.start,
p_msg->api_listen.remote_bda))
{
- APPL_TRACE_ERROR0("Listen failure");
+ APPL_TRACE_ERROR("Listen failure");
(*p_clreg->p_cback)(BTA_GATTC_LISTEN_EVT, &cb_data);
}
else
@@ -2206,7 +2292,9 @@
/* if is a connected remote device */
if (L2CA_GetBleConnRole(p_msg->api_listen.remote_bda) == HCI_ROLE_SLAVE &&
- bta_gattc_find_clcb_by_cif(p_msg->api_listen.client_if, p_msg->api_listen.remote_bda) == NULL)
+ bta_gattc_find_clcb_by_cif(p_msg->api_listen.client_if,
+ p_msg->api_listen.remote_bda,
+ BTA_GATT_TRANSPORT_LE) == NULL)
{
bta_gattc_init_clcb_conn(p_msg->api_listen.client_if,
@@ -2216,8 +2304,9 @@
/* if listen to all */
else
{
- APPL_TRACE_ERROR0("Listen For All now");
- /* go through all connected device and send callback for all connected slave connection */
+ APPL_TRACE_ERROR("Listen For All now");
+ /* go through all connected device and send
+ callback for all connected slave connection */
bta_gattc_process_listen_all(p_msg->api_listen.client_if);
}
}
@@ -2238,7 +2327,7 @@
{
tBTA_GATTC_RCB *p_clreg = bta_gattc_cl_get_regcb(p_msg->api_listen.client_if);
tBTA_GATTC cb_data;
- (void)(p_cb);
+ UNUSED(p_cb);
cb_data.reg_oper.client_if = p_msg->api_listen.client_if;
cb_data.reg_oper.status = BTM_BleBroadcast(p_msg->api_listen.start);
diff --git a/bta/gatt/bta_gattc_api.c b/bta/gatt/bta_gattc_api.c
index 0bc87ec..a91b20e 100644
--- a/bta/gatt/bta_gattc_api.c
+++ b/bta/gatt/bta_gattc_api.c
@@ -60,7 +60,7 @@
if (bta_sys_is_register(BTA_ID_GATTC) == FALSE)
{
- APPL_TRACE_WARNING0("GATTC Module not enabled/already disabled");
+ APPL_TRACE_WARNING("GATTC Module not enabled/already disabled");
return;
}
if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
@@ -91,9 +91,7 @@
if (bta_sys_is_register(BTA_ID_GATTC) == FALSE)
{
- GKI_sched_lock();
bta_sys_register(BTA_ID_GATTC, &bta_gattc_reg);
- GKI_sched_unlock();
}
if ((p_buf = (tBTA_GATTC_API_REG *) GKI_getbuf(sizeof(tBTA_GATTC_API_REG))) != NULL)
@@ -143,11 +141,13 @@
** Parameters client_if: server interface.
** remote_bda: remote device BD address.
** is_direct: direct connection or background auto connection
+** transport: Transport to be used for GATT connection (BREDR/LE)
**
** Returns void
**
*******************************************************************************/
-void BTA_GATTC_Open(tBTA_GATTC_IF client_if, BD_ADDR remote_bda, BOOLEAN is_direct)
+void BTA_GATTC_Open(tBTA_GATTC_IF client_if, BD_ADDR remote_bda,
+ BOOLEAN is_direct, tBTA_GATT_TRANSPORT transport)
{
tBTA_GATTC_API_OPEN *p_buf;
@@ -157,6 +157,7 @@
p_buf->client_if = client_if;
p_buf->is_direct = is_direct;
+ p_buf->transport = transport;
memcpy(p_buf->remote_bda, remote_bda, BD_ADDR_LEN);
@@ -414,7 +415,6 @@
memcpy(&p_descr_result->descr_id, &p_descr_result->char_id.char_id, sizeof(tBTA_GATT_ID));
memcpy(&p_descr_result->char_id, p_char_id, sizeof(tBTA_GATTC_CHAR_ID));
}
-
return status;
}
@@ -426,7 +426,7 @@
** of the characterisctic.
**
** Parameters conn_id: connection ID which identify the server.
-** p_start_descr_id: start the characteristic search from the next record
+** p_start_descr_id: start the descriptor search from the next record
** after the one identified by p_start_descr_id.
** p_descr_uuid_cond: Characteristic descriptor UUID, if NULL find
** the first available characteristic descriptor.
@@ -860,7 +860,7 @@
{
tBTA_GATTC_API_CONFIRM *p_buf;
- APPL_TRACE_API3("BTA_GATTC_SendIndConfirm conn_id=%d service uuid1=0x%x char uuid=0x%x",
+ APPL_TRACE_API("BTA_GATTC_SendIndConfirm conn_id=%d service uuid1=0x%x char uuid=0x%x",
conn_id, p_char_id->srvc_id.id.uuid.uu.uuid16, p_char_id->char_id.uuid.uu.uuid16);
if ((p_buf = (tBTA_GATTC_API_CONFIRM *) GKI_getbuf(sizeof(tBTA_GATTC_API_CONFIRM))) != NULL)
@@ -902,13 +902,10 @@
if (!p_char_id)
{
- APPL_TRACE_ERROR0("deregistration failed, unknow char id");
+ APPL_TRACE_ERROR("deregistration failed, unknow char id");
return status;
}
- /* lock other GKI task */
- GKI_sched_lock();
-
if ((p_clreg = bta_gattc_cl_get_regcb(client_if)) != NULL)
{
for (i = 0; i < BTA_GATTC_NOTIF_REG_MAX; i ++)
@@ -917,7 +914,7 @@
!memcmp(p_clreg->notif_reg[i].remote_bda, bda, BD_ADDR_LEN) &&
bta_gattc_charid_compare(&p_clreg->notif_reg[i].char_id, p_char_id))
{
- APPL_TRACE_WARNING0("notification already registered");
+ APPL_TRACE_WARNING("notification already registered");
status = BTA_GATT_OK;
break;
}
@@ -944,17 +941,15 @@
if (i == BTA_GATTC_NOTIF_REG_MAX)
{
status = BTA_GATT_NO_RESOURCES;
- APPL_TRACE_ERROR0("Max Notification Reached, registration failed.");
+ APPL_TRACE_ERROR("Max Notification Reached, registration failed.");
}
}
}
else
{
- APPL_TRACE_ERROR1("Client_if: %d Not Registered", client_if);
+ APPL_TRACE_ERROR("Client_if: %d Not Registered", client_if);
}
- GKI_sched_unlock();
-
return status;
}
@@ -981,13 +976,10 @@
if (!p_char_id)
{
- APPL_TRACE_ERROR0("deregistration failed, unknow char id");
+ APPL_TRACE_ERROR("deregistration failed, unknow char id");
return status;
}
- /* lock other GKI task */
- GKI_sched_lock();
-
if ((p_clreg = bta_gattc_cl_get_regcb(client_if)) != NULL)
{
for (i = 0; i < BTA_GATTC_NOTIF_REG_MAX; i ++)
@@ -996,7 +988,7 @@
!memcmp(p_clreg->notif_reg[i].remote_bda, bda, BD_ADDR_LEN) &&
bta_gattc_charid_compare(&p_clreg->notif_reg[i].char_id, p_char_id))
{
- APPL_TRACE_DEBUG0("Deregistered.");
+ APPL_TRACE_DEBUG("Deregistered.");
memset(&p_clreg->notif_reg[i], 0, sizeof(tBTA_GATTC_NOTIF_REG));
status = BTA_GATT_OK;
break;
@@ -1006,16 +998,14 @@
{
status = BTA_GATT_ERROR;
- APPL_TRACE_ERROR0("registration not found");
+ APPL_TRACE_ERROR("registration not found");
}
}
else
{
- APPL_TRACE_ERROR1("Client_if: %d Not Registered", client_if);
+ APPL_TRACE_ERROR("Client_if: %d Not Registered", client_if);
}
- GKI_sched_unlock();
-
return status;
}
diff --git a/bta/gatt/bta_gattc_cache.c b/bta/gatt/bta_gattc_cache.c
index 3d603c3..65026ba 100644
--- a/bta/gatt/bta_gattc_cache.c
+++ b/bta/gatt/bta_gattc_cache.c
@@ -70,11 +70,11 @@
tBTA_GATTC_CACHE *p_cur_srvc = p_cache;
tBTA_GATTC_CACHE_ATTR *p_attr;
- APPL_TRACE_ERROR0("<================Start Server Cache =============>");
+ APPL_TRACE_ERROR("<================Start Server Cache =============>");
while (p_cur_srvc)
{
- APPL_TRACE_ERROR6("Service[%d]: handle[%d ~ %d] %s[0x%04x] inst[%d]",
+ APPL_TRACE_ERROR("Service[%d]: handle[%d ~ %d] %s[0x%04x] inst[%d]",
i, p_cur_srvc->s_handle, p_cur_srvc->e_handle,
((p_cur_srvc->service_uuid.id.uuid.len == 2) ? "uuid16" : "uuid128"),
p_cur_srvc->service_uuid.id.uuid.uu.uuid16,
@@ -85,7 +85,7 @@
for (j = 0; p_attr; j ++ )
{
- APPL_TRACE_ERROR6("\t Attr[0x%04x] handle[%d] uuid[0x%04x] inst[%d] type[%s] prop[0x%1x]",
+ APPL_TRACE_ERROR("\t Attr[0x%04x] handle[%d] uuid[0x%04x] inst[%d] type[%s] prop[0x%1x]",
j + 1, p_attr->attr_handle, p_attr->p_uuid->uuid16, p_attr->inst_id,
bta_gattc_attr_type[p_attr->attr_type], p_attr->property);
@@ -94,8 +94,8 @@
p_cur_srvc = p_cur_srvc->p_next;
}
- APPL_TRACE_ERROR0("<================End Server Cache =============>");
- APPL_TRACE_ERROR0(" ");
+ APPL_TRACE_ERROR("<================End Server Cache =============>");
+ APPL_TRACE_ERROR(" ");
}
/*******************************************************************************
@@ -112,14 +112,14 @@
UINT8 i;
tBTA_GATTC_ATTR_REC *pp = p_rec;
- APPL_TRACE_ERROR0("<================Start Explore Queue =============>");
+ APPL_TRACE_ERROR("<================Start Explore Queue =============>");
for (i = 0; i < num_rec; i ++, pp ++)
{
- APPL_TRACE_ERROR5("\t rec[%d] uuid[0x%04x] s_handle[%d] e_handle[%d] is_primary[%d]",
+ APPL_TRACE_ERROR("\t rec[%d] uuid[0x%04x] s_handle[%d] e_handle[%d] is_primary[%d]",
i + 1, pp->uuid.uu.uuid16, pp->s_handle, pp->e_handle, pp->is_primary);
}
- APPL_TRACE_ERROR0("<================ End Explore Queue =============>");
- APPL_TRACE_ERROR0(" ");
+ APPL_TRACE_ERROR("<================ End Explore Queue =============>");
+ APPL_TRACE_ERROR(" ");
}
#endif /* BTA_GATT_DEBUG == TRUE */
@@ -140,7 +140,7 @@
if ((p_buf = (BT_HDR *)GKI_getpoolbuf(GATT_DB_POOL_ID)) == NULL)
{
- APPL_TRACE_DEBUG0("No resources: GKI buffer allocation failed.");
+ APPL_TRACE_DEBUG("No resources: GKI buffer allocation failed.");
utl_freebuf((void **)&p_srvc_cb->p_srvc_list);
p_srvc_cb->free_byte = 0;
}
@@ -154,7 +154,7 @@
GKI_enqueue(&p_srvc_cb->cache_buffer, p_buf);
}
#if BTA_GATT_DEBUG== TRUE
- APPL_TRACE_DEBUG1("allocating new buffer: free byte = %d", p_srvc_cb->free_byte);
+ APPL_TRACE_DEBUG("allocating new buffer: free byte = %d", p_srvc_cb->free_byte);
#endif
return p_buf;
}
@@ -178,7 +178,7 @@
if ((p_srvc_cb->p_srvc_list = (tBTA_GATTC_ATTR_REC*)GKI_getbuf(BTA_GATTC_ATTR_LIST_SIZE)) == NULL)
{
- APPL_TRACE_DEBUG0("No resources: GKI buffer allocation failed.");
+ APPL_TRACE_DEBUG("No resources: GKI buffer allocation failed.");
status = GATT_NO_RESOURCES;
}
else
@@ -301,8 +301,8 @@
tBTA_GATT_STATUS status = BTA_GATT_OK;
#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE)
- APPL_TRACE_DEBUG0("Add a service into Service");
- APPL_TRACE_DEBUG2("free byte = %d, req %d bytes.", p_srvc_cb->free_byte, sizeof(tBTA_GATTC_CACHE))
+ APPL_TRACE_DEBUG("Add a service into Service");
+ APPL_TRACE_DEBUG("free byte = %d, req %d bytes.", p_srvc_cb->free_byte, sizeof(tBTA_GATTC_CACHE))
#endif
if (p_srvc_cb->free_byte < sizeof(tBTA_GATTC_CACHE))
@@ -357,14 +357,14 @@
UINT8 *pp;
#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE)
- APPL_TRACE_DEBUG1("bta_gattc_add_attr_to_cache: Add a [%s] into Service", bta_gattc_attr_type[type]);
- APPL_TRACE_DEBUG4("handle=%d uuid16=0x%x property=0x%x type=%d", handle, p_uuid->uu.uuid16, property, type);
- APPL_TRACE_DEBUG2("free byte = %d, req %d bytes.", p_srvc_cb->free_byte, len);
+ APPL_TRACE_DEBUG("bta_gattc_add_attr_to_cache: Add a [%s] into Service", bta_gattc_attr_type[type]);
+ APPL_TRACE_DEBUG("handle=%d uuid16=0x%x property=0x%x type=%d", handle, p_uuid->uu.uuid16, property, type);
+ APPL_TRACE_DEBUG("free byte = %d, req %d bytes.", p_srvc_cb->free_byte, len);
#endif
if (p_srvc_cb->p_cur_srvc == NULL)
{
- APPL_TRACE_ERROR0("Illegal action to add char/descr/incl srvc before adding a service!");
+ APPL_TRACE_ERROR("Illegal action to add char/descr/incl srvc before adding a service!");
return GATT_WRONG_STATE;
}
@@ -447,7 +447,7 @@
*p_e_hdl = p_rec->e_handle;
#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE)
- APPL_TRACE_DEBUG2("discover range [%d ~ %d]",p_rec->s_handle, p_rec->e_handle);
+ APPL_TRACE_DEBUG("discover range [%d ~ %d]",p_rec->s_handle, p_rec->e_handle);
#endif
return;
}
@@ -460,12 +460,21 @@
** Returns status of the operation.
**
*******************************************************************************/
-tBTA_GATT_STATUS bta_gattc_discover_pri_service(UINT16 conn_id, tBTA_GATTC_SERV *p_server_cb, UINT8 disc_type)
+tBTA_GATT_STATUS bta_gattc_discover_pri_service(UINT16 conn_id, tBTA_GATTC_SERV *p_server_cb,
+ UINT8 disc_type)
{
- if (BTM_IsBleLink(p_server_cb->server_bda))
- return bta_gattc_discover_procedure(conn_id, p_server_cb, disc_type);
- else
- return bta_gattc_sdp_service_disc(conn_id, p_server_cb);
+ tBTA_GATTC_CLCB *p_clcb = bta_gattc_find_clcb_by_conn_id(conn_id);
+ tBTA_GATT_STATUS status = BTA_GATT_ERROR;
+
+ if (p_clcb)
+ {
+ if (p_clcb->transport == BTA_TRANSPORT_LE)
+ status = bta_gattc_discover_procedure(conn_id, p_server_cb, disc_type);
+ else
+ status = bta_gattc_sdp_service_disc(conn_id, p_server_cb);
+ }
+
+ return status;
}
/*******************************************************************************
**
@@ -476,7 +485,8 @@
** Returns status of the operation.
**
*******************************************************************************/
-tBTA_GATT_STATUS bta_gattc_discover_procedure(UINT16 conn_id, tBTA_GATTC_SERV *p_server_cb, UINT8 disc_type)
+tBTA_GATT_STATUS bta_gattc_discover_procedure(UINT16 conn_id, tBTA_GATTC_SERV *p_server_cb,
+ UINT8 disc_type)
{
tGATT_DISC_PARAM param;
BOOLEAN is_service = TRUE;
@@ -542,7 +552,7 @@
*******************************************************************************/
void bta_gattc_start_disc_char_dscp(UINT16 conn_id, tBTA_GATTC_SERV *p_srvc_cb)
{
- APPL_TRACE_DEBUG0("starting discover characteristics descriptor");
+ APPL_TRACE_DEBUG("starting discover characteristics descriptor");
if (bta_gattc_discover_procedure(conn_id, p_srvc_cb, GATT_DISC_CHAR_DSCPT) != 0)
bta_gattc_char_dscpt_disc_cmpl(conn_id, p_srvc_cb);
@@ -562,13 +572,13 @@
tBTA_GATTC_ATTR_REC *p_rec = p_srvc_cb->p_srvc_list + p_srvc_cb->cur_srvc_idx;
tBTA_GATTC_CLCB *p_clcb = bta_gattc_find_clcb_by_conn_id(conn_id);
- APPL_TRACE_DEBUG1("Start service discovery: srvc_idx = %d", p_srvc_cb->cur_srvc_idx);
+ APPL_TRACE_DEBUG("Start service discovery: srvc_idx = %d", p_srvc_cb->cur_srvc_idx);
p_srvc_cb->cur_char_idx = p_srvc_cb->next_avail_idx = p_srvc_cb->total_srvc;
if (p_clcb == NULL)
{
- APPL_TRACE_ERROR0("unknown connection ID");
+ APPL_TRACE_ERROR("unknown connection ID");
return;
}
/* start expore a service if there is service not been explored */
@@ -588,7 +598,7 @@
}
}
/* no service found at all, the end of server discovery*/
- APPL_TRACE_ERROR0("No More Service found");
+ APPL_TRACE_ERROR("No More Service found");
#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE)
bta_gattc_display_cache_server(p_srvc_cb->p_srvc_cache);
@@ -677,7 +687,7 @@
/* all characteristic has been explored, start with next service if any */
{
#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE)
- APPL_TRACE_ERROR0("all char has been explored");
+ APPL_TRACE_ERROR("all char has been explored");
#endif
p_srvc_cb->cur_srvc_idx ++;
bta_gattc_explore_srvc (conn_id, p_srvc_cb);
@@ -694,7 +704,7 @@
if (!GATT_HANDLE_IS_VALID(s_handle) || !GATT_HANDLE_IS_VALID(e_handle))
{
- APPL_TRACE_ERROR2("invalid included service handle: [0x%04x ~ 0x%04x]", s_handle, e_handle);
+ APPL_TRACE_ERROR("invalid included service handle: [0x%04x ~ 0x%04x]", s_handle, e_handle);
exist_srvc = TRUE;
}
else
@@ -735,7 +745,7 @@
p_srvc_cb->total_srvc ++;
- APPL_TRACE_DEBUG2("bta_gattc_add_srvc_to_list handle = %d, service type = 0x%04x",
+ APPL_TRACE_DEBUG("bta_gattc_add_srvc_to_list handle = %d, service type = 0x%04x",
s_handle, uuid.uu.uuid16);
p_rec->s_handle = s_handle;
@@ -751,7 +761,7 @@
{ /* allocate bigger buffer ?? */
status = GATT_DB_FULL;
- APPL_TRACE_ERROR0("service not added, no resources or wrong state");
+ APPL_TRACE_ERROR("service not added, no resources or wrong state");
}
return status;
}
@@ -773,7 +783,7 @@
if (p_srvc_cb->p_srvc_list == NULL)
{
- APPL_TRACE_ERROR0("No service available, unexpected char discovery result");
+ APPL_TRACE_ERROR("No service available, unexpected char discovery result");
status = BTA_GATT_INTERNAL_ERROR;
}
else if (p_srvc_cb->next_avail_idx < BTA_GATTC_MAX_CACHE_CHAR)
@@ -798,7 +808,7 @@
}
else
{
- APPL_TRACE_ERROR0("char not added, no resources");
+ APPL_TRACE_ERROR("char not added, no resources");
/* allocate bigger buffer ?? */
status = BTA_GATT_DB_FULL;
}
@@ -840,11 +850,11 @@
end_handle = (UINT16) pe.params[1];
#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE)
- APPL_TRACE_EVENT3("Found ATT service [0x%04x] handle[0x%04x ~ 0x%04x]",
+ APPL_TRACE_EVENT("Found ATT service [0x%04x] handle[0x%04x ~ 0x%04x]",
service_uuid.uu.uuid16, start_handle, end_handle);
#endif
- if (GATT_HANDLE_IS_VALID(start_handle) && GATT_HANDLE_IS_VALID(end_handle) &&
+ if (GATT_HANDLE_IS_VALID(start_handle) && GATT_HANDLE_IS_VALID(end_handle)&&
p_srvc_cb != NULL)
{
/* discover services result, add services into a service list */
@@ -856,7 +866,8 @@
}
else
{
- APPL_TRACE_ERROR2("invalid start_handle = %d end_handle = %d", start_handle, end_handle);
+ APPL_TRACE_ERROR("invalid start_handle = %d end_handle = %d",
+ start_handle, end_handle);
}
}
@@ -871,7 +882,7 @@
bta_gattc_explore_srvc(bta_gattc_cb.sdp_conn_id, p_srvc_cb);
else
{
- APPL_TRACE_ERROR0("GATT service discovery is done on unknown connection");
+ APPL_TRACE_ERROR("GATT service discovery is done on unknown connection");
}
GKI_freebuf(bta_gattc_cb.p_sdp_db);
@@ -904,9 +915,11 @@
attr_list[0] = ATTR_ID_SERVICE_CLASS_ID_LIST;
attr_list[1] = ATTR_ID_PROTOCOL_DESC_LIST;
- SDP_InitDiscoveryDb (bta_gattc_cb.p_sdp_db, BTA_GATT_SDP_DB_SIZE, 1, &uuid, num_attrs, attr_list);
+ SDP_InitDiscoveryDb (bta_gattc_cb.p_sdp_db, BTA_GATT_SDP_DB_SIZE, 1,
+ &uuid, num_attrs, attr_list);
- if(!SDP_ServiceSearchAttributeRequest (p_server_cb->server_bda, bta_gattc_cb.p_sdp_db, &bta_gattc_sdp_callback))
+ if(!SDP_ServiceSearchAttributeRequest (p_server_cb->server_bda,
+ bta_gattc_cb.p_sdp_db, &bta_gattc_sdp_callback))
{
GKI_freebuf(bta_gattc_cb.p_sdp_db);
bta_gattc_cb.p_sdp_db = NULL;
@@ -990,7 +1003,8 @@
break;
case GATT_DISC_CHAR_DSCPT:
- bta_gattc_add_attr_to_cache(p_srvc_cb, p_data->handle, &p_data->type, 0, BTA_GATTC_ATTR_TYPE_CHAR_DESCR);
+ bta_gattc_add_attr_to_cache(p_srvc_cb, p_data->handle, &p_data->type, 0,
+ BTA_GATTC_ATTR_TYPE_CHAR_DESCR);
break;
}
}
@@ -1061,7 +1075,7 @@
while (p_service_id && p_cache && !done)
{
#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE)
- APPL_TRACE_DEBUG3("Service: handle[%d] uuid[0x%04x] inst[%d]",
+ APPL_TRACE_DEBUG("Service: handle[%d] uuid[0x%04x] inst[%d]",
p_cache->s_handle, p_cache->service_uuid.id.uuid.uu.uuid16,
p_cache->service_uuid.id.inst_id);
#endif
@@ -1072,8 +1086,9 @@
for (j = 0; p_attr; j ++)
{
#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE)
- APPL_TRACE_DEBUG5("\t Attr[0x%04x] handle[0x%04x] uuid[0x%04x] inst[%d] type[%d]",
- j + 1, p_attr->attr_handle, p_attr->p_uuid->uuid16, p_attr->inst_id, p_attr->attr_type);
+ APPL_TRACE_DEBUG("\t Attr[0x%04x] handle[0x%04x] uuid[0x%04x] inst[%d] type[%d]",
+ j + 1, p_attr->attr_handle, p_attr->p_uuid->uuid16,
+ p_attr->inst_id, p_attr->attr_type);
#endif
bta_gattc_pack_attr_uuid(p_attr, &attr_uuid);
@@ -1089,7 +1104,7 @@
else
{
#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE)
- APPL_TRACE_DEBUG0("found matching characteristic for the descriptor");
+ APPL_TRACE_DEBUG("found matching characteristic for the descriptor");
#endif
char_map = TRUE;
}
@@ -1104,7 +1119,7 @@
p_descr_uuid->inst_id == p_attr->inst_id)
{
#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE)
- APPL_TRACE_DEBUG0("found descriptor!!");
+ APPL_TRACE_DEBUG("found descriptor!!");
#endif
handle = p_attr->attr_handle;
done = TRUE;
@@ -1113,14 +1128,14 @@
else
{
#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE)
- APPL_TRACE_DEBUG0("descriptor UUID not matching");
+ APPL_TRACE_DEBUG("descriptor UUID not matching");
#endif
}
}
else /* another char */
{
#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE)
- APPL_TRACE_DEBUG0("no matching descriptor found!! start of next characteristic");
+ APPL_TRACE_DEBUG("no matching descptr found!!start of next characteristic");
#endif
char_map = FALSE;
done = TRUE;
@@ -1159,7 +1174,7 @@
while (p_cache)
{
#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE)
- APPL_TRACE_DEBUG3("Service: handle[%d] uuid[0x%04x] inst[%d]",
+ APPL_TRACE_DEBUG("Service: handle[%d] uuid[0x%04x] inst[%d]",
p_cache->s_handle, p_cache->service_uuid.id.uuid.uu.uuid16,
p_cache->service_uuid.id.inst_id);
#endif
@@ -1177,8 +1192,9 @@
for (j = 0; p_attr; j ++)
{
#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE)
- APPL_TRACE_DEBUG5("\t Attr[0x%04x] handle[0x%04x] uuid[0x%04x] inst[%d] type[%d]",
- j + 1, p_attr->attr_handle, p_attr->p_uuid->uuid16, p_attr->inst_id, p_attr->attr_type);
+ APPL_TRACE_DEBUG("\t Attr[0x%04x] handle[0x%04x] uuid[0x%04x] inst[%d] type[%d]",
+ j + 1, p_attr->attr_handle, p_attr->p_uuid->uuid16,
+ p_attr->inst_id, p_attr->attr_type);
#endif
if (p_attr->attr_type == BTA_GATTC_ATTR_TYPE_CHAR)
p_char = p_attr;
@@ -1199,7 +1215,7 @@
}
else
{
- APPL_TRACE_ERROR0("descriptor does not belong to any chracteristic, error");
+ APPL_TRACE_ERROR("descptr does not belong to any chracteristic");
}
}
else
@@ -1239,7 +1255,7 @@
if (bta_gattc_uuid_compare(p_uuid, &p_cache->service_uuid.id.uuid, FALSE))
{
#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE)
- APPL_TRACE_DEBUG3("found service [0x%04x], inst[%d] handle [%d]",
+ APPL_TRACE_DEBUG("found service [0x%04x], inst[%d] handle [%d]",
p_cache->service_uuid.id.uuid.uu.uuid16,
p_cache->service_uuid.id.inst_id,
p_cache->s_handle);
@@ -1249,7 +1265,8 @@
memset(&cb_data, 0, sizeof(tBTA_GATTC));
cb_data.srvc_res.conn_id = p_clcb->bta_conn_id;
- memcpy(&cb_data.srvc_res.service_uuid, &p_cache->service_uuid ,sizeof(tBTA_GATT_SRVC_ID));
+ memcpy(&cb_data.srvc_res.service_uuid, &p_cache->service_uuid,
+ sizeof(tBTA_GATT_SRVC_ID));
(* p_clcb->p_rcb->p_cback)(BTA_GATTC_SEARCH_RES_EVT, &cb_data);
}
@@ -1289,7 +1306,7 @@
if (bta_gattc_srvcid_compare(p_service_id, &p_cache->service_uuid))
{
#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE)
- APPL_TRACE_DEBUG2("found matching service [0x%04x], inst[%d]",
+ APPL_TRACE_DEBUG("found matching service [0x%04x], inst[%d]",
p_cache->service_uuid.id.uuid.uu.uuid16,
p_cache->service_uuid.id.inst_id);
#endif
@@ -1298,7 +1315,7 @@
for (j = 0; p_attr; j ++)
{
#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE)
- APPL_TRACE_DEBUG5("\t Attr[%d] handle[0x%04x] uuid[0x%04x] inst[%d] type[%d]",
+ APPL_TRACE_DEBUG("\t Attr[%d] handle[0x%04x] uuid[0x%04x] inst[%d] type[%d]",
j + 1, p_attr->attr_handle,
p_attr->p_uuid->uuid16,
p_attr->inst_id,
@@ -1359,7 +1376,7 @@
{
#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE)
- APPL_TRACE_DEBUG0("found char handle mapping characteristic");
+ APPL_TRACE_DEBUG("found char handle mapping characteristic");
#endif
p_result->inst_id = p_attr->inst_id;
@@ -1382,7 +1399,7 @@
#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE)
if (status)
{
- APPL_TRACE_ERROR0("In the given service, can not find matching record");
+ APPL_TRACE_ERROR("In the given service, can not find matching record");
}
#endif
break;
@@ -1423,9 +1440,6 @@
tBTA_GATTC_CLCB *p_clcb = bta_gattc_find_clcb_by_conn_id(conn_id);
tBTA_GATT_STATUS status = BTA_GATT_ILLEGAL_PARAMETER;
- /* lock other GKI task */
- GKI_sched_lock();
-
if (p_clcb != NULL )
{
if (p_clcb->state == BTA_GATTC_CONN_ST)
@@ -1445,21 +1459,20 @@
else
{
status = BTA_GATT_ERROR;
- APPL_TRACE_ERROR0("No server cache available");
+ APPL_TRACE_ERROR("No server cache available");
}
}
else
{
- APPL_TRACE_ERROR1("server cache not available, CLCB state = %d", p_clcb->state);
+ APPL_TRACE_ERROR("server cache not available, CLCB state = %d", p_clcb->state);
status = (p_clcb->state == BTA_GATTC_DISCOVER_ST) ? BTA_GATT_BUSY : BTA_GATT_ERROR;
}
}
else
{
- APPL_TRACE_ERROR1("Unknown conn ID: %d", conn_id);
+ APPL_TRACE_ERROR("Unknown conn ID: %d", conn_id);
}
- GKI_sched_unlock();
return status;
}
@@ -1479,7 +1492,7 @@
tBTA_GATTC_NV_ATTR *p_attr, UINT16 attr_index)
{
/* first attribute loading, initialize buffer */
- APPL_TRACE_ERROR0("bta_gattc_rebuild_cache");
+ APPL_TRACE_ERROR("bta_gattc_rebuild_cache");
if (attr_index == 0)
{
while (p_srvc_cb->cache_buffer.p_first)
@@ -1487,7 +1500,7 @@
if (bta_gattc_alloc_cache_buf(p_srvc_cb) == NULL)
{
- APPL_TRACE_ERROR0("allocate cache buffer failed, no resources");
+ APPL_TRACE_ERROR("allocate cache buffer failed, no resources");
}
else
{
@@ -1533,7 +1546,8 @@
**
*******************************************************************************/
void bta_gattc_fill_nv_attr(tBTA_GATTC_NV_ATTR *p_attr, UINT8 type, UINT16 s_handle,
- UINT16 e_handle, UINT8 id, tBT_UUID uuid, UINT8 prop, BOOLEAN is_primary)
+ UINT16 e_handle, UINT8 id, tBT_UUID uuid, UINT8 prop,
+ BOOLEAN is_primary)
{
p_attr->s_handle = s_handle;
p_attr->e_handle = e_handle;
diff --git a/bta/gatt/bta_gattc_int.h b/bta/gatt/bta_gattc_int.h
index 4f192cb..3b8430f 100644
--- a/bta/gatt/bta_gattc_int.h
+++ b/bta/gatt/bta_gattc_int.h
@@ -118,6 +118,7 @@
BD_ADDR remote_bda;
tBTA_GATTC_IF client_if;
BOOLEAN is_direct;
+ tBTA_TRANSPORT transport;
} tBTA_GATTC_API_OPEN;
typedef tBTA_GATTC_API_OPEN tBTA_GATTC_API_CANCEL_OPEN;
@@ -202,6 +203,7 @@
BD_ADDR remote_bda;
tBTA_GATTC_IF client_if;
UINT8 role;
+ tBT_TRANSPORT transport;
tGATT_DISCONN_REASON reason;
}tBTA_GATTC_INT_CONN;
@@ -340,7 +342,7 @@
} tBTA_GATTC_SERV;
#ifndef BTA_GATTC_NOTIF_REG_MAX
-#define BTA_GATTC_NOTIF_REG_MAX 7
+#define BTA_GATTC_NOTIF_REG_MAX 15
#endif
typedef struct
@@ -366,6 +368,7 @@
{
UINT16 bta_conn_id; /* client channel ID, unique for clcb */
BD_ADDR bda;
+ tBTA_TRANSPORT transport; /* channel transport */
tBTA_GATTC_RCB *p_rcb; /* pointer to the registration CB */
tBTA_GATTC_SERV *p_srcb; /* server cache CB */
tBTA_GATTC_DATA *p_q_cmd; /* command in queue waiting for execution */
@@ -375,6 +378,7 @@
#define BTA_GATTC_REQ_WAITING 0x10
UINT8 auto_update; /* auto update is waiting */
+ BOOLEAN disc_active;
BOOLEAN in_use;
tBTA_GATTC_STATE state;
tBTA_GATT_STATUS status;
@@ -444,7 +448,7 @@
** Function prototypes
*****************************************************************************/
extern BOOLEAN bta_gattc_hdl_event(BT_HDR *p_msg);
-extern void bta_gattc_sm_execute(tBTA_GATTC_CLCB *p_clcb, UINT16 event, tBTA_GATTC_DATA *p_data);
+extern BOOLEAN bta_gattc_sm_execute(tBTA_GATTC_CLCB *p_clcb, UINT16 event, tBTA_GATTC_DATA *p_data);
/* function processed outside SM */
extern void bta_gattc_disable(tBTA_GATTC_CB *p_cb);
@@ -491,7 +495,7 @@
extern void bta_gattc_init_bk_conn(tBTA_GATTC_API_OPEN *p_data, tBTA_GATTC_RCB *p_clreg);
extern void bta_gattc_cancel_bk_conn(tBTA_GATTC_API_CANCEL_OPEN *p_data);
extern void bta_gattc_send_open_cback( tBTA_GATTC_RCB *p_clreg, tBTA_GATT_STATUS status,
- BD_ADDR remote_bda, UINT16 conn_id, UINT16 mtu);
+ BD_ADDR remote_bda, UINT16 conn_id, tBTA_TRANSPORT transport, UINT16 mtu);
extern void bta_gattc_process_api_refresh(tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA * p_msg);
extern void bta_gattc_cfg_mtu(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data);
#if BLE_INCLUDED == TRUE
@@ -499,11 +503,11 @@
extern void bta_gattc_broadcast(tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA * p_msg);
#endif
/* utility functions */
-extern tBTA_GATTC_CLCB * bta_gattc_find_clcb_by_cif (UINT8 client_if, BD_ADDR remote_bda);
+extern tBTA_GATTC_CLCB * bta_gattc_find_clcb_by_cif (UINT8 client_if, BD_ADDR remote_bda, tBTA_TRANSPORT transport);
extern tBTA_GATTC_CLCB * bta_gattc_find_clcb_by_conn_id (UINT16 conn_id);
-extern tBTA_GATTC_CLCB * bta_gattc_clcb_alloc(tBTA_GATTC_IF client_if, BD_ADDR remote_bda);
+extern tBTA_GATTC_CLCB * bta_gattc_clcb_alloc(tBTA_GATTC_IF client_if, BD_ADDR remote_bda, tBTA_TRANSPORT transport);
extern void bta_gattc_clcb_dealloc(tBTA_GATTC_CLCB *p_clcb);
-extern tBTA_GATTC_CLCB * bta_gattc_find_alloc_clcb(tBTA_GATTC_IF client_if, BD_ADDR remote_bda);
+extern tBTA_GATTC_CLCB * bta_gattc_find_alloc_clcb(tBTA_GATTC_IF client_if, BD_ADDR remote_bda, tBTA_TRANSPORT transport);
extern tBTA_GATTC_RCB * bta_gattc_cl_get_regcb(UINT8 client_if);
extern tBTA_GATTC_SERV * bta_gattc_find_srcb(BD_ADDR bda);
extern tBTA_GATTC_SERV * bta_gattc_srcb_alloc(BD_ADDR bda);
diff --git a/bta/gatt/bta_gattc_main.c b/bta/gatt/bta_gattc_main.c
index 932a1d7..7885fa6 100644
--- a/bta/gatt/bta_gattc_main.c
+++ b/bta/gatt/bta_gattc_main.c
@@ -288,18 +288,20 @@
** Description State machine event handling function for GATTC
**
**
-** Returns void
+** Returns BOOLEAN : TRUE if queued client request buffer can be immediately released
+** else FALSE
**
*******************************************************************************/
-void bta_gattc_sm_execute(tBTA_GATTC_CLCB *p_clcb, UINT16 event, tBTA_GATTC_DATA *p_data)
+BOOLEAN bta_gattc_sm_execute(tBTA_GATTC_CLCB *p_clcb, UINT16 event, tBTA_GATTC_DATA *p_data)
{
tBTA_GATTC_ST_TBL state_table;
UINT8 action;
int i;
+ BOOLEAN rt = TRUE;
#if BTA_GATT_DEBUG == TRUE
tBTA_GATTC_STATE in_state = p_clcb->state;
UINT16 in_event = event;
- APPL_TRACE_DEBUG4("bta_gattc_sm_execute: State 0x%02x [%s], Event 0x%x[%s]", in_state,
+ APPL_TRACE_DEBUG("bta_gattc_sm_execute: State 0x%02x [%s], Event 0x%x[%s]", in_state,
gattc_state_code(in_state),
in_event,
gattc_evt_code(in_event));
@@ -320,6 +322,12 @@
if ((action = state_table[event][i]) != BTA_GATTC_IGNORE)
{
(*bta_gattc_action[action])(p_clcb, p_data);
+ if (p_clcb->p_q_cmd == p_data) {
+ /* buffer is queued, don't free in the bta dispatcher.
+ * we free it ourselves when a completion event is received.
+ */
+ rt = FALSE;
+ }
}
else
{
@@ -330,12 +338,13 @@
#if BTA_GATT_DEBUG == TRUE
if (in_state != p_clcb->state)
{
- APPL_TRACE_DEBUG3("GATTC State Change: [%s] -> [%s] after Event [%s]",
+ APPL_TRACE_DEBUG("GATTC State Change: [%s] -> [%s] after Event [%s]",
gattc_state_code(in_state),
gattc_state_code(p_clcb->state),
gattc_evt_code(in_event));
}
#endif
+ return rt;
}
/*******************************************************************************
@@ -345,7 +354,7 @@
** Description GATT client main event handling function.
**
**
-** Returns void
+** Returns BOOLEAN
**
*******************************************************************************/
BOOLEAN bta_gattc_hdl_event(BT_HDR *p_msg)
@@ -353,8 +362,9 @@
tBTA_GATTC_CB *p_cb = &bta_gattc_cb;
tBTA_GATTC_CLCB *p_clcb = NULL;
tBTA_GATTC_RCB *p_clreg;
+ BOOLEAN rt = TRUE;
#if BTA_GATT_DEBUG == TRUE
- APPL_TRACE_DEBUG1("bta_gattc_hdl_event: Event [%s]", gattc_evt_code(p_msg->event));
+ APPL_TRACE_DEBUG("bta_gattc_hdl_event: Event [%s]", gattc_evt_code(p_msg->event));
#endif
switch (p_msg->event)
{
@@ -410,18 +420,18 @@
if (p_clcb != NULL)
{
- bta_gattc_sm_execute(p_clcb, p_msg->event, (tBTA_GATTC_DATA *) p_msg);
+ rt = bta_gattc_sm_execute(p_clcb, p_msg->event, (tBTA_GATTC_DATA *) p_msg);
}
else
{
- APPL_TRACE_DEBUG1("Ignore unknown conn ID: %d", p_msg->layer_specific);
+ APPL_TRACE_DEBUG("Ignore unknown conn ID: %d", p_msg->layer_specific);
}
break;
}
- return(TRUE);
+ return rt;
}
diff --git a/bta/gatt/bta_gattc_utils.c b/bta/gatt/bta_gattc_utils.c
index b52e52c..a7a9557 100644
--- a/bta/gatt/bta_gattc_utils.c
+++ b/bta/gatt/bta_gattc_utils.c
@@ -163,7 +163,8 @@
** Returns pointer to the clcb
**
*******************************************************************************/
-tBTA_GATTC_CLCB * bta_gattc_find_clcb_by_cif (UINT8 client_if, BD_ADDR remote_bda)
+tBTA_GATTC_CLCB * bta_gattc_find_clcb_by_cif (UINT8 client_if, BD_ADDR remote_bda,
+ tBTA_TRANSPORT transport)
{
tBTA_GATTC_CLCB *p_clcb = &bta_gattc_cb.clcb[0];
UINT8 i;
@@ -172,6 +173,7 @@
{
if (p_clcb->in_use &&
p_clcb->p_rcb->client_if == client_if &&
+ p_clcb->transport == transport &&
bdcmp(p_clcb->bda, remote_bda) == 0)
return p_clcb;
}
@@ -209,7 +211,8 @@
** Returns pointer to the clcb
**
*******************************************************************************/
-tBTA_GATTC_CLCB * bta_gattc_clcb_alloc(tBTA_GATTC_IF client_if, BD_ADDR remote_bda)
+tBTA_GATTC_CLCB * bta_gattc_clcb_alloc(tBTA_GATTC_IF client_if, BD_ADDR remote_bda,
+ tBTA_TRANSPORT transport)
{
UINT8 i_clcb = 0;
tBTA_GATTC_CLCB *p_clcb = NULL;
@@ -219,11 +222,12 @@
if (!bta_gattc_cb.clcb[i_clcb].in_use)
{
#if BTA_GATT_DEBUG == TRUE
- APPL_TRACE_DEBUG1("bta_gattc_clcb_alloc: found clcb[%d] available",i_clcb);
+ APPL_TRACE_DEBUG("bta_gattc_clcb_alloc: found clcb[%d] available",i_clcb);
#endif
p_clcb = &bta_gattc_cb.clcb[i_clcb];
p_clcb->in_use = TRUE;
p_clcb->status = BTA_GATT_OK;
+ p_clcb->transport = transport;
bdcpy(p_clcb->bda, remote_bda);
p_clcb->p_rcb = bta_gattc_cl_get_regcb(client_if);
@@ -256,13 +260,14 @@
** Returns pointer to the clcb
**
*******************************************************************************/
-tBTA_GATTC_CLCB *bta_gattc_find_alloc_clcb(tBTA_GATTC_IF client_if, BD_ADDR remote_bda)
+tBTA_GATTC_CLCB *bta_gattc_find_alloc_clcb(tBTA_GATTC_IF client_if, BD_ADDR remote_bda,
+ tBTA_TRANSPORT transport)
{
tBTA_GATTC_CLCB *p_clcb ;
- if ((p_clcb = bta_gattc_find_clcb_by_cif(client_if, remote_bda)) == NULL)
+ if ((p_clcb = bta_gattc_find_clcb_by_cif(client_if, remote_bda, transport)) == NULL)
{
- p_clcb = bta_gattc_clcb_alloc(client_if, remote_bda);
+ p_clcb = bta_gattc_clcb_alloc(client_if, remote_bda, transport);
}
return p_clcb;
}
@@ -303,7 +308,7 @@
}
else
{
- APPL_TRACE_ERROR0("bta_gattc_clcb_dealloc p_clcb=NULL");
+ APPL_TRACE_ERROR("bta_gattc_clcb_dealloc p_clcb=NULL");
}
}
@@ -427,168 +432,20 @@
*******************************************************************************/
BOOLEAN bta_gattc_enqueue(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
{
- BOOLEAN in_q = FALSE;
- if (p_clcb->p_q_cmd == NULL && p_data)
- {
- UINT16 len;
- switch (p_data->hdr.event)
- {
- case BTA_GATTC_API_SEARCH_EVT:
- {
- if (p_data->api_search.p_srvc_uuid)
- {
- len = sizeof(tBTA_GATTC_API_SEARCH) + sizeof(tBT_UUID);
- }
- else
- {
- len = sizeof(tBTA_GATTC_API_SEARCH);
- }
- p_clcb->p_q_cmd = (tBTA_GATTC_DATA *)GKI_getbuf(len);
- if (p_clcb->p_q_cmd == NULL)
- {
- APPL_TRACE_ERROR0("allocate buffer failed for p_q_cmd");
- return FALSE;
- }
- memcpy(p_clcb->p_q_cmd, p_data, sizeof(tBTA_GATTC_API_SEARCH));
- if (p_data->api_search.p_srvc_uuid)
- {
- tBTA_GATTC_API_SEARCH *p_buf;
- p_buf = &(p_clcb->p_q_cmd->api_search);
- p_buf->p_srvc_uuid = (tBT_UUID *)(p_buf + 1);
- memcpy(p_buf->p_srvc_uuid, p_data->api_search.p_srvc_uuid,
- sizeof(tBT_UUID));
- }
- break;
- }
- case BTA_GATTC_API_READ_EVT:
- {
- if (p_data->api_read.p_descr_type)
- {
- len = sizeof(tBTA_GATT_ID) + sizeof(tBTA_GATTC_API_READ);
- }
- else
- {
- len = sizeof(tBTA_GATTC_API_READ);
- }
- p_clcb->p_q_cmd = (tBTA_GATTC_DATA *)GKI_getbuf(len);
- if (p_clcb->p_q_cmd == NULL)
- {
- APPL_TRACE_ERROR0("allocate buffer failed for p_q_cmd");
- return FALSE;
- }
- memcpy(p_clcb->p_q_cmd, p_data, sizeof(tBTA_GATTC_API_READ));
- if (p_data->api_read.p_descr_type)
- {
- tBTA_GATTC_API_READ *p_buf;
- p_buf = &(p_clcb->p_q_cmd->api_read);
- p_buf->p_descr_type = (tBTA_GATT_ID *)(p_buf + 1);
- memcpy(p_buf->p_descr_type, p_data->api_read.p_descr_type,
- sizeof(tBTA_GATT_ID));
- }
- break;
- }
- case BTA_GATTC_API_WRITE_EVT:
- {
- tBTA_GATTC_API_WRITE *p_buf;
- len = sizeof(tBTA_GATTC_API_WRITE) + p_data->api_write.len;
- if (p_data->api_write.p_descr_type)
- {
- len += sizeof(tBTA_GATT_ID);
- }
- p_clcb->p_q_cmd = (tBTA_GATTC_DATA *)GKI_getbuf(len);
- if (p_clcb->p_q_cmd == NULL)
- {
- APPL_TRACE_ERROR0("allocate buffer failed for p_q_cmd");
- return FALSE;
- }
- memcpy(p_clcb->p_q_cmd, p_data, sizeof(tBTA_GATTC_API_WRITE));
- p_buf = &(p_clcb->p_q_cmd->api_write);
- if (p_data->api_write.p_descr_type)
- {
- p_buf->p_descr_type = (tBTA_GATT_ID *)(p_buf + 1);
- memcpy(p_buf->p_descr_type, p_data->api_write.p_descr_type,
- sizeof(tBTA_GATT_ID));
- if (p_buf->len && p_buf->p_value)
- {
- p_buf->p_value = (UINT8 *)(p_buf->p_descr_type + 1);
- memcpy(p_buf->p_value, p_data->api_write.p_value,
- p_data->api_write.len);
- }
- }
- else if (p_buf->len && p_buf->p_value)
- {
- p_buf->p_value = (UINT8 *)(p_buf + 1);
- memcpy(p_buf->p_value, p_data->api_write.p_value,
- p_data->api_write.len);
- }
- break;
- }
- case BTA_GATTC_API_EXEC_EVT:
- {
- len = sizeof(tBTA_GATTC_API_EXEC);
- p_clcb->p_q_cmd = (tBTA_GATTC_DATA *)GKI_getbuf(len);
- if (p_clcb->p_q_cmd == NULL)
- {
- APPL_TRACE_ERROR0("allocate buffer failed for p_q_cmd");
- return FALSE;
- }
- memcpy(p_clcb->p_q_cmd, p_data, len);
- break;
- }
- case BTA_GATTC_API_READ_MULTI_EVT:
- {
- len = sizeof(tBTA_GATTC_API_READ_MULTI) +
- p_data->api_read_multi.num_attr * sizeof(tBTA_GATTC_ATTR_ID);
- p_clcb->p_q_cmd = (tBTA_GATTC_DATA *)GKI_getbuf(len);
- if (p_clcb->p_q_cmd == NULL)
- {
- APPL_TRACE_ERROR0("allocate buffer failed for p_q_cmd");
- return FALSE;
- }
- memcpy(p_clcb->p_q_cmd, p_data, sizeof(tBTA_GATTC_API_READ_MULTI));
- if (p_data->api_read_multi.num_attr &&
- p_data->api_read_multi.p_id_list)
- {
- tBTA_GATTC_API_READ_MULTI *p_buf;
- p_buf = &(p_clcb->p_q_cmd->api_read_multi);
- p_buf->p_id_list = (tBTA_GATTC_ATTR_ID *)(p_buf + 1);
- memcpy(p_buf->p_id_list, p_data->api_read_multi.p_id_list,
- p_data->api_read_multi.num_attr * sizeof(tBTA_GATTC_ATTR_ID));
- }
- break;
- }
- case BTA_GATTC_API_CFG_MTU_EVT:
- {
- len = sizeof(tBTA_GATTC_API_CFG_MTU);
- p_clcb->p_q_cmd = (tBTA_GATTC_DATA *)GKI_getbuf(len);
- if (p_clcb->p_q_cmd == NULL)
- {
- APPL_TRACE_ERROR0("allocate buffer failed for p_q_cmd");
- return FALSE;
- }
- memcpy(p_clcb->p_q_cmd, p_data, len);
- break;
- }
- default:
- APPL_TRACE_ERROR1("queue unsupported command %d", p_data->hdr.event);
- return FALSE;
- }
+ if (p_clcb->p_q_cmd == NULL)
+ {
+ p_clcb->p_q_cmd = p_data;
+ }
+ else
+ {
+ APPL_TRACE_ERROR("already has a pending command!!");
+ /* skip the callback now. ----- need to send callback ? */
+ }
+ return (p_clcb->p_q_cmd != NULL) ? TRUE : FALSE;
- in_q = TRUE;
- }
- else if (p_clcb->p_q_cmd)
- {
- APPL_TRACE_ERROR0("already has a pending command!!");
- /* skip the callback now. ----- need to send callback ? */
- }
- else
- {
- APPL_TRACE_ERROR0("queue a null command");
- }
-
- return in_q;
}
+
/*******************************************************************************
**
** Function bta_gattc_pack_attr_uuid
@@ -716,7 +573,7 @@
bdcmp(p_clreg->notif_reg[i].remote_bda, p_srcb->server_bda) == 0 &&
bta_gattc_charid_compare (&p_clreg->notif_reg[i].char_id, &p_notify->char_id))
{
- APPL_TRACE_DEBUG0("Notification registered!");
+ APPL_TRACE_DEBUG("Notification registered!");
return TRUE;
}
}
@@ -738,21 +595,23 @@
tBTA_GATTC_IF gatt_if;
tBTA_GATTC_RCB *p_clrcb ;
UINT8 i;
+ tGATT_TRANSPORT transport;
- if (GATT_GetConnectionInfor(conn_id, &gatt_if, remote_bda))
+ if (GATT_GetConnectionInfor(conn_id, &gatt_if, remote_bda, &transport))
{
if ((p_clrcb = bta_gattc_cl_get_regcb(gatt_if)) != NULL)
{
for (i = 0 ; i < BTA_GATTC_NOTIF_REG_MAX; i ++)
{
- if (p_clrcb->notif_reg[i].in_use && !bdcmp(p_clrcb->notif_reg[i].remote_bda, remote_bda))
+ if (p_clrcb->notif_reg[i].in_use &&
+ !bdcmp(p_clrcb->notif_reg[i].remote_bda, remote_bda))
memset(&p_clrcb->notif_reg[i], 0, sizeof(tBTA_GATTC_NOTIF_REG));
}
}
}
else
{
- APPL_TRACE_ERROR0("can not clear indication/notif registration for unknown app");
+ APPL_TRACE_ERROR("can not clear indication/notif registration for unknown app");
}
return;
}
@@ -790,7 +649,7 @@
&p_value->aggre_value.pre_format[i].descr_id) == FALSE)
{
status = BTA_GATT_INTERNAL_ERROR;
- APPL_TRACE_ERROR1("can not map to GATT ID. handle = 0x%04x", handle);
+ APPL_TRACE_ERROR("can not map to GATT ID. handle = 0x%04x", handle);
break;
}
i ++;
@@ -851,7 +710,7 @@
}
if (!add)
{
- APPL_TRACE_ERROR0("Do not find the bg connection mask for the remote device");
+ APPL_TRACE_ERROR("Do not find the bg connection mask for the remote device");
return FALSE;
}
else /* adding a new device mask */
@@ -873,7 +732,7 @@
return TRUE;
}
}
- APPL_TRACE_ERROR0("no available space to mark the bg connection status");
+ APPL_TRACE_ERROR("no available space to mark the bg connection status");
return FALSE;
}
}
@@ -919,7 +778,8 @@
**
*******************************************************************************/
void bta_gattc_send_open_cback( tBTA_GATTC_RCB *p_clreg, tBTA_GATT_STATUS status,
- BD_ADDR remote_bda, UINT16 conn_id, UINT16 mtu)
+ BD_ADDR remote_bda, UINT16 conn_id,
+ tBTA_TRANSPORT transport, UINT16 mtu)
{
tBTA_GATTC cb_data;
@@ -931,6 +791,7 @@
cb_data.open.client_if = p_clreg->client_if;
cb_data.open.conn_id = conn_id;
cb_data.open.mtu = mtu;
+ cb_data.open.transport = transport;
bdcpy(cb_data.open.remote_bda, remote_bda);
(*p_clreg->p_cback)(BTA_GATTC_OPEN_EVT, &cb_data);
@@ -955,7 +816,7 @@
if (!p_conn->in_use)
{
#if BTA_GATT_DEBUG == TRUE
- APPL_TRACE_DEBUG1("bta_gattc_conn_alloc: found conn_track[%d] available",i_conn);
+ APPL_TRACE_DEBUG("bta_gattc_conn_alloc: found conn_track[%d] available",i_conn);
#endif
p_conn->in_use = TRUE;
bdcpy(p_conn->remote_bda, remote_bda);
@@ -984,7 +845,7 @@
if (p_conn->in_use && bdcmp(remote_bda, p_conn->remote_bda) == 0)
{
#if BTA_GATT_DEBUG == TRUE
- APPL_TRACE_DEBUG1("bta_gattc_conn_find: found conn_track[%d] matched",i_conn);
+ APPL_TRACE_DEBUG("bta_gattc_conn_find: found conn_track[%d] matched",i_conn);
#endif
return p_conn;
}
@@ -1053,16 +914,19 @@
/* try to locate a logic channel */
if ((p_clcb = bta_gattc_find_clcb_by_cif(p_msg->int_conn.client_if,
- p_msg->int_conn.remote_bda)) == NULL)
+ p_msg->int_conn.remote_bda,
+ p_msg->int_conn.transport)) == NULL)
{
/* for a background connection or listening connection */
- if (p_msg->int_conn.role == HCI_ROLE_SLAVE ||
+ if (/*p_msg->int_conn.role == HCI_ROLE_SLAVE || */
bta_gattc_check_bg_conn(p_msg->int_conn.client_if,
p_msg->int_conn.remote_bda,
p_msg->int_conn.role))
{
/* allocate a new channel */
- p_clcb = bta_gattc_clcb_alloc(p_msg->int_conn.client_if, p_msg->int_conn.remote_bda);
+ p_clcb = bta_gattc_clcb_alloc(p_msg->int_conn.client_if,
+ p_msg->int_conn.remote_bda,
+ p_msg->int_conn.transport);
}
}
return p_clcb;
@@ -1083,16 +947,17 @@
tGATT_DISCONN_REASON reason = p_msg->int_conn.reason;
bta_gattc_conn_dealloc(p_msg->int_conn.remote_bda);
- /* connection attempt timeout, send connection callback event */
- if (reason == GATT_CONN_CANCEL || reason == GATT_CONN_L2C_FAILURE)
+ if ((p_clcb = bta_gattc_find_clcb_by_conn_id(p_msg->int_conn.hdr.layer_specific)) == NULL)
{
+ /* connection attempt failed, send connection callback event */
p_clcb = bta_gattc_find_clcb_by_cif(p_msg->int_conn.client_if,
- p_msg->int_conn.remote_bda);
+ p_msg->int_conn.remote_bda,
+ p_msg->int_conn.transport);
}
- else if ((p_clcb = bta_gattc_find_clcb_by_conn_id(p_msg->int_conn.hdr.layer_specific)) == NULL)
+ if (p_clcb == NULL)
{
- APPL_TRACE_DEBUG1("disconnection ID: [%d] not used by BTA",
- p_msg->int_conn.hdr.layer_specific);
+ APPL_TRACE_DEBUG(" disconnection ID: [%d] not used by BTA",
+ p_msg->int_conn.hdr.layer_specific);
}
return p_clcb;
}
diff --git a/bta/gatt/bta_gatts_act.c b/bta/gatt/bta_gatts_act.c
index be03655..20faa62 100644
--- a/bta/gatt/bta_gatts_act.c
+++ b/bta/gatt/bta_gatts_act.c
@@ -37,12 +37,17 @@
#include <string.h>
static void bta_gatts_nv_save_cback(BOOLEAN is_saved, tGATTS_HNDL_RANGE *p_hndl_range);
-static BOOLEAN bta_gatts_nv_srv_chg_cback(tGATTS_SRV_CHG_CMD cmd, tGATTS_SRV_CHG_REQ *p_req, tGATTS_SRV_CHG_RSP *p_rsp);
+static BOOLEAN bta_gatts_nv_srv_chg_cback(tGATTS_SRV_CHG_CMD cmd, tGATTS_SRV_CHG_REQ *p_req,
+ tGATTS_SRV_CHG_RSP *p_rsp);
-static void bta_gatts_conn_cback (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id, BOOLEAN connected, tGATT_DISCONN_REASON reason);
+static void bta_gatts_conn_cback (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id,
+ BOOLEAN connected, tGATT_DISCONN_REASON reason,
+ tGATT_TRANSPORT transport);
static void bta_gatts_send_request_cback (UINT16 conn_id,
UINT32 trans_id,
tGATTS_REQ_TYPE req_type, tGATTS_DATA *p_data);
+static void bta_gatts_cong_cback (UINT16 conn_id, BOOLEAN congested);
+
static tGATT_CBACK bta_gatts_cback =
{
bta_gatts_conn_cback,
@@ -50,7 +55,8 @@
NULL,
NULL,
bta_gatts_send_request_cback,
- NULL
+ NULL,
+ bta_gatts_cong_cback
};
tGATT_APPL_INFO bta_gatts_nv_cback =
@@ -85,7 +91,8 @@
** Returns none.
**
*******************************************************************************/
-static BOOLEAN bta_gatts_nv_srv_chg_cback(tGATTS_SRV_CHG_CMD cmd, tGATTS_SRV_CHG_REQ *p_req, tGATTS_SRV_CHG_RSP *p_rsp)
+static BOOLEAN bta_gatts_nv_srv_chg_cback(tGATTS_SRV_CHG_CMD cmd,
+ tGATTS_SRV_CHG_REQ *p_req, tGATTS_SRV_CHG_RSP *p_rsp)
{
return bta_gatts_co_srv_chg((tBTA_GATTS_SRV_CHG_CMD) cmd,
(tBTA_GATTS_SRV_CHG_REQ *) p_req,
@@ -110,7 +117,7 @@
if (p_cb->enabled)
{
- APPL_TRACE_DEBUG0("GATTS already enabled.");
+ APPL_TRACE_DEBUG("GATTS already enabled.");
}
else
{
@@ -125,11 +132,11 @@
index++;
}
- APPL_TRACE_DEBUG1("bta_gatts_enable: num of handle range added=%d", index);
+ APPL_TRACE_DEBUG("bta_gatts_enable: num of handle range added=%d", index);
if (!GATTS_NVRegister(&bta_gatts_nv_cback))
{
- APPL_TRACE_ERROR0("BTA GATTS NV register failed.");
+ APPL_TRACE_ERROR("BTA GATTS NV register failed.");
status = BTA_GATT_ERROR;
}
}
@@ -162,7 +169,7 @@
}
else
{
- APPL_TRACE_ERROR0("GATTS not enabled");
+ APPL_TRACE_ERROR("GATTS not enabled");
}
}
@@ -193,7 +200,7 @@
{
if (bta_gatts_uuid_compare(p_cb->rcb[i].app_uuid, p_msg->api_reg.app_uuid))
{
- APPL_TRACE_ERROR0("application already registered.");
+ APPL_TRACE_ERROR("application already registered.");
status = BTA_GATT_DUP_REG;
break;
}
@@ -217,20 +224,22 @@
// btla-specific --
if (first_unuse != 0xff)
{
- APPL_TRACE_ERROR1("register application first_unuse rcb_idx = %d", first_unuse);
+ APPL_TRACE_ERROR("register application first_unuse rcb_idx = %d", first_unuse);
p_cb->rcb[first_unuse].in_use = TRUE;
p_cb->rcb[first_unuse].p_cback = p_msg->api_reg.p_cback;
memcpy(&p_cb->rcb[first_unuse].app_uuid, &p_msg->api_reg.app_uuid, sizeof(tBT_UUID));
cb_data.reg_oper.server_if =
- p_cb->rcb[first_unuse].gatt_if = GATT_Register(&p_msg->api_reg.app_uuid, &bta_gatts_cback);
+ p_cb->rcb[first_unuse].gatt_if =
+ GATT_Register(&p_msg->api_reg.app_uuid, &bta_gatts_cback);
if ( !p_cb->rcb[first_unuse].gatt_if)
{
status = BTA_GATT_NO_RESOURCES;
}
else
{
- if ((p_buf = (tBTA_GATTS_INT_START_IF *) GKI_getbuf(sizeof(tBTA_GATTS_INT_START_IF))) != NULL)
+ if ((p_buf =
+ (tBTA_GATTS_INT_START_IF *) GKI_getbuf(sizeof(tBTA_GATTS_INT_START_IF))) != NULL)
{
p_buf->hdr.event = BTA_GATTS_INT_START_IF_EVT;
p_buf->server_if = p_cb->rcb[first_unuse].gatt_if;
@@ -275,7 +284,8 @@
}
else
{
- APPL_TRACE_ERROR1("Unable to start app.: Unknown interface =%d",p_msg->int_start_if.server_if );
+ APPL_TRACE_ERROR("Unable to start app.: Unknown interface =%d",
+ p_msg->int_start_if.server_if );
}
}
/*******************************************************************************
@@ -320,7 +330,7 @@
}
else
{
- APPL_TRACE_ERROR0("application not registered.");
+ APPL_TRACE_ERROR("application not registered.");
}
}
/*******************************************************************************
@@ -343,7 +353,7 @@
rcb_idx = bta_gatts_find_app_rcb_idx_by_app_if(p_cb, p_msg->api_create_svc.server_if);
- APPL_TRACE_ERROR1("create service rcb_idx = %d", rcb_idx);
+ APPL_TRACE_ERROR("create service rcb_idx = %d", rcb_idx);
if (rcb_idx != BTA_GATTS_INVALID_APP)
{
@@ -358,7 +368,8 @@
if (service_id != 0)
{
- memcpy(&p_cb->srvc_cb[srvc_idx].service_uuid, &p_msg->api_create_svc.service_uuid, sizeof(tBT_UUID));
+ memcpy(&p_cb->srvc_cb[srvc_idx].service_uuid,
+ &p_msg->api_create_svc.service_uuid, sizeof(tBT_UUID));
p_cb->srvc_cb[srvc_idx].service_id = service_id;
p_cb->srvc_cb[srvc_idx].inst_num = p_msg->api_create_svc.inst;
p_cb->srvc_cb[srvc_idx].idx = srvc_idx;
@@ -374,7 +385,7 @@
{
cb_data.status = BTA_GATT_ERROR;
memset(&p_cb->srvc_cb[srvc_idx], 0, sizeof(tBTA_GATTS_SRVC_CB));
- APPL_TRACE_ERROR0("service creation failed.");
+ APPL_TRACE_ERROR("service creation failed.");
}
// btla-specific ++
memcpy(&cb_data.create.uuid, &p_msg->api_create_svc.service_uuid, sizeof(tBT_UUID));
@@ -386,7 +397,7 @@
}
else /* application not registered */
{
- APPL_TRACE_ERROR0("Application not registered");
+ APPL_TRACE_ERROR("Application not registered");
}
}
/*******************************************************************************
@@ -554,7 +565,7 @@
p_srvc_cb->service_id,
p_msg->api_start.transport) == GATT_SUCCESS)
{
- APPL_TRACE_DEBUG1("bta_gatts_start_service service_id= %d", p_srvc_cb->service_id);
+ APPL_TRACE_DEBUG("bta_gatts_start_service service_id= %d", p_srvc_cb->service_id);
cb_data.srvc_oper.status = BTA_GATT_OK;
}
else
@@ -585,7 +596,7 @@
cb_data.srvc_oper.server_if = p_rcb->gatt_if;
cb_data.srvc_oper.service_id = p_srvc_cb->service_id;
cb_data.srvc_oper.status = BTA_GATT_OK;
- APPL_TRACE_ERROR1("bta_gatts_stop_service service_id= %d", p_srvc_cb->service_id);
+ APPL_TRACE_ERROR("bta_gatts_stop_service service_id= %d", p_srvc_cb->service_id);
if (p_rcb->p_cback)
(*p_rcb->p_cback)(BTA_GATTS_STOP_EVT, &cb_data);
@@ -609,7 +620,7 @@
p_msg->api_rsp.status,
(tGATTS_RSP *)p_msg->api_rsp.p_rsp) != GATT_SUCCESS)
{
- APPL_TRACE_ERROR0("Sending response failed");
+ APPL_TRACE_ERROR("Sending response failed");
}
}
@@ -617,11 +628,7 @@
**
** Function bta_gatts_indicate_handle
**
-<<<<<<< HEAD
-** Description GATTS indicate handel value
-=======
** Description GATTS send handle value indication or notification.
->>>>>>> 6ea30bf... LE: UPF 45 bug fixes
**
** Returns none.
**
@@ -629,17 +636,22 @@
void bta_gatts_indicate_handle (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg)
{
tBTA_GATTS_SRVC_CB *p_srvc_cb;
+ tBTA_GATTS_RCB *p_rcb = NULL;
tBTA_GATT_STATUS status = BTA_GATT_ILLEGAL_PARAMETER;
tGATT_IF gatt_if;
BD_ADDR remote_bda;
-
+ tBTA_TRANSPORT transport;
+ tBTA_GATTS cb_data;
p_srvc_cb = bta_gatts_find_srvc_cb_by_attr_id (p_cb, p_msg->api_indicate.attr_id);
if (p_srvc_cb )
{
- if (GATT_GetConnectionInfor(p_msg->api_indicate.hdr.layer_specific, &gatt_if, remote_bda))
+ if (GATT_GetConnectionInfor(p_msg->api_indicate.hdr.layer_specific,
+ &gatt_if, remote_bda, &transport))
{
+ p_rcb = bta_gatts_find_app_rcb_by_app_if(gatt_if);
+
if (p_msg->api_indicate.need_confirm)
status = GATTS_HandleValueIndication (p_msg->api_indicate.hdr.layer_specific,
@@ -653,7 +665,7 @@
p_msg->api_indicate.value);
/* if over BR_EDR, inform PM for mode change */
- if (!BTM_IsBleLink(remote_bda))
+ if (transport == BTA_TRANSPORT_BR_EDR)
{
bta_sys_busy(BTA_ID_GATTS, BTA_ALL_APP_ID, remote_bda);
bta_sys_idle(BTA_ID_GATTS, BTA_ALL_APP_ID, remote_bda);
@@ -661,19 +673,22 @@
}
else
{
- APPL_TRACE_ERROR1("Unknown connection ID: %d fail sending notification",
+ APPL_TRACE_ERROR("Unknown connection ID: %d fail sending notification",
p_msg->api_indicate.hdr.layer_specific);
}
- if (status != GATT_SUCCESS && p_msg->api_indicate.need_confirm &&
- p_cb->rcb[p_srvc_cb->rcb_idx].p_cback)
+ if ((status != GATT_SUCCESS || !p_msg->api_indicate.need_confirm) &&
+ p_rcb && p_cb->rcb[p_srvc_cb->rcb_idx].p_cback)
{
- (*p_cb->rcb[p_srvc_cb->rcb_idx].p_cback)(BTA_GATTS_CONF_EVT, (tBTA_GATTS *)&status);
+ cb_data.req_data.status = status;
+ cb_data.req_data.conn_id = p_msg->api_indicate.hdr.layer_specific;
+
+ (*p_rcb->p_cback)(BTA_GATTS_CONF_EVT, &cb_data);
}
}
else
{
- APPL_TRACE_ERROR1("Not an registered servce attribute ID: 0x%04x",
+ APPL_TRACE_ERROR("Not an registered servce attribute ID: 0x%04x",
p_msg->api_indicate.attr_id);
}
}
@@ -692,18 +707,27 @@
{
tBTA_GATTS_RCB *p_rcb=NULL;
tBTA_GATT_STATUS status= BTA_GATT_ERROR;
+ UINT16 conn_id;
UNUSED(p_cb);
if ((p_rcb = bta_gatts_find_app_rcb_by_app_if(p_msg->api_open.server_if)) != NULL)
{
- if (GATT_Connect(p_rcb->gatt_if, p_msg->api_open.remote_bda, p_msg->api_open.is_direct))
+ /* should always get the connection ID */
+ if (GATT_Connect(p_rcb->gatt_if, p_msg->api_open.remote_bda,
+ p_msg->api_open.is_direct, p_msg->api_open.transport))
{
status = BTA_GATT_OK;
+
+ if (GATT_GetConnIdIfConnected(p_rcb->gatt_if, p_msg->api_open.remote_bda,
+ &conn_id, p_msg->api_open.transport))
+ {
+ status = BTA_GATT_ALREADY_OPEN;
+ }
}
}
else
{
- APPL_TRACE_ERROR1("Inavlide server_if=%d", p_msg->api_open.server_if);
+ APPL_TRACE_ERROR("Inavlide server_if=%d", p_msg->api_open.server_if);
}
if (p_rcb && p_rcb->p_cback)
@@ -727,9 +751,10 @@
if ((p_rcb = bta_gatts_find_app_rcb_by_app_if(p_msg->api_cancel_open.server_if)) != NULL)
{
- if (!GATT_CancelConnect(p_rcb->gatt_if, p_msg->api_cancel_open.remote_bda, p_msg->api_cancel_open.is_direct))
+ if (!GATT_CancelConnect(p_rcb->gatt_if, p_msg->api_cancel_open.remote_bda,
+ p_msg->api_cancel_open.is_direct))
{
- APPL_TRACE_ERROR0("bta_gatts_cancel_open failed for open request");
+ APPL_TRACE_ERROR("bta_gatts_cancel_open failed for open request");
}
else
{
@@ -738,7 +763,7 @@
}
else
{
- APPL_TRACE_ERROR1("Inavlide server_if=%d", p_msg->api_cancel_open.server_if);
+ APPL_TRACE_ERROR("Inavlide server_if=%d", p_msg->api_cancel_open.server_if);
}
if (p_rcb && p_rcb->p_cback)
@@ -759,13 +784,15 @@
tBTA_GATT_STATUS status= BTA_GATT_ERROR;
tGATT_IF gatt_if;
BD_ADDR remote_bda;
+ tBTA_GATT_TRANSPORT transport;
+
UNUSED(p_cb);
- if (GATT_GetConnectionInfor(p_msg->hdr.layer_specific, &gatt_if, remote_bda))
+ if (GATT_GetConnectionInfor(p_msg->hdr.layer_specific, &gatt_if, remote_bda, &transport))
{
if (GATT_Disconnect(p_msg->hdr.layer_specific) != GATT_SUCCESS)
{
- APPL_TRACE_ERROR1("bta_gatts_close fail conn_id=%d", p_msg->hdr.layer_specific);
+ APPL_TRACE_ERROR("bta_gatts_close fail conn_id=%d", p_msg->hdr.layer_specific);
}
else
{
@@ -776,7 +803,7 @@
if (p_rcb && p_rcb->p_cback)
{
- if (!BTM_IsBleLink(remote_bda))
+ if (transport == BTA_TRANSPORT_BR_EDR)
bta_sys_conn_close( BTA_ID_GATTS ,BTA_ALL_APP_ID, remote_bda);
(*p_rcb->p_cback)(BTA_GATTS_CLOSE_EVT, (tBTA_GATTS *)&status);
@@ -784,7 +811,7 @@
}
else
{
- APPL_TRACE_ERROR1("Unknown connection ID: %d", p_msg->hdr.layer_specific);
+ APPL_TRACE_ERROR("Unknown connection ID: %d", p_msg->hdr.layer_specific);
}
}
@@ -808,7 +835,7 @@
if (p_rcb == NULL)
{
- APPL_TRACE_ERROR0("Unknown GATTS application");
+ APPL_TRACE_ERROR("Unknown GATTS application");
return;
}
@@ -817,7 +844,7 @@
p_msg->api_listen.remote_bda))
{
cb_data.status = BTA_GATT_ERROR;
- APPL_TRACE_ERROR0("bta_gatts_listen Listen failed");
+ APPL_TRACE_ERROR("bta_gatts_listen Listen failed");
}
if (p_rcb->p_cback)
@@ -840,19 +867,21 @@
tBTA_GATTS cb_data;
tBTA_GATTS_RCB *p_rcb;
tGATT_IF gatt_if;
+ tBTA_GATT_TRANSPORT transport;
memset(&cb_data, 0 , sizeof(tBTA_GATTS));
- if (GATT_GetConnectionInfor(conn_id, &gatt_if, cb_data.req_data.remote_bda))
+ if (GATT_GetConnectionInfor(conn_id, &gatt_if, cb_data.req_data.remote_bda, &transport))
{
p_rcb = bta_gatts_find_app_rcb_by_app_if(gatt_if);
- APPL_TRACE_DEBUG3 ("bta_gatts_send_request_cback conn_id=%d trans_id=%d req_type=%d", conn_id, trans_id, req_type);
+ APPL_TRACE_DEBUG ("bta_gatts_send_request_cback conn_id=%d trans_id=%d req_type=%d",
+ conn_id, trans_id, req_type);
if (p_rcb && p_rcb->p_cback)
{
/* if over BR_EDR, inform PM for mode change */
- if (!BTM_IsBleLink(cb_data.req_data.remote_bda))
+ if (transport == BTA_TRANSPORT_BR_EDR)
{
bta_sys_busy(BTA_ID_GATTS, BTA_ALL_APP_ID, cb_data.req_data.remote_bda);
bta_sys_idle(BTA_ID_GATTS, BTA_ALL_APP_ID, cb_data.req_data.remote_bda);
@@ -866,12 +895,12 @@
}
else
{
- APPL_TRACE_ERROR1("connection request on gatt_if[%d] is not interested", gatt_if);
+ APPL_TRACE_ERROR("connection request on gatt_if[%d] is not interested", gatt_if);
}
}
else
{
- APPL_TRACE_ERROR1("request received on unknown connectino ID: %d", conn_id);
+ APPL_TRACE_ERROR("request received on unknown connectino ID: %d", conn_id);
}
}
@@ -885,15 +914,16 @@
**
*******************************************************************************/
static void bta_gatts_conn_cback (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id,
- BOOLEAN connected, tGATT_DISCONN_REASON reason)
+ BOOLEAN connected, tGATT_DISCONN_REASON reason,
+ tGATT_TRANSPORT transport)
{
tBTA_GATTS cb_data;
UINT8 evt = connected ? BTA_GATTS_CONNECT_EVT: BTA_GATTS_DISCONNECT_EVT;
tBTA_GATTS_RCB *p_reg;
- APPL_TRACE_DEBUG4 ("bta_gatts_conn_cback gatt_if=%d conn_id=%d connected=%d reason = 0x%04d",
+ APPL_TRACE_DEBUG ("bta_gatts_conn_cback gatt_if=%d conn_id=%d connected=%d reason = 0x%04d",
gatt_if, conn_id, connected, reason);
- APPL_TRACE_DEBUG6("bta_gatts_conn_cback bda :%02x-%02x-%02x-%02x-%02x-%02x ",
+ APPL_TRACE_DEBUG("bta_gatts_conn_cback bda :%02x-%02x-%02x-%02x-%02x-%02x ",
bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]);
p_reg = bta_gatts_find_app_rcb_by_app_if(gatt_if);
@@ -901,7 +931,7 @@
if (p_reg && p_reg->p_cback)
{
/* there is no RM for GATT */
- if (!BTM_IsBleLink(bda))
+ if (transport == BTA_TRANSPORT_BR_EDR)
{
if (connected)
bta_sys_conn_open(BTA_ID_GATTS, BTA_ALL_APP_ID, bda);
@@ -912,12 +942,43 @@
cb_data.conn.conn_id = conn_id;
cb_data.conn.server_if = gatt_if;
cb_data.conn.reason = reason;
+ cb_data.conn.transport = transport;
memcpy(cb_data.conn.remote_bda, bda, BD_ADDR_LEN);
(*p_reg->p_cback)(evt, &cb_data);
}
else
{
- APPL_TRACE_ERROR1("bta_gatts_conn_cback server_if=%d not found",gatt_if);
+ APPL_TRACE_ERROR("bta_gatts_conn_cback server_if=%d not found",gatt_if);
+ }
+}
+
+/*******************************************************************************
+**
+** Function bta_gatts_cong_cback
+**
+** Description congestion callback.
+**
+** Returns none.
+**
+*******************************************************************************/
+static void bta_gatts_cong_cback (UINT16 conn_id, BOOLEAN congested)
+{
+ tBTA_GATTS_RCB *p_rcb;
+ tGATT_IF gatt_if;
+ tBTA_GATT_TRANSPORT transport;
+ tBTA_GATTS cb_data;
+
+ if (GATT_GetConnectionInfor(conn_id, &gatt_if, cb_data.req_data.remote_bda, &transport))
+ {
+ p_rcb = bta_gatts_find_app_rcb_by_app_if(gatt_if);
+
+ if (p_rcb && p_rcb->p_cback)
+ {
+ cb_data.congest.conn_id = conn_id;
+ cb_data.congest.congested = congested;
+
+ (*p_rcb->p_cback)(BTA_GATTS_CONGEST_EVT, &cb_data);
+ }
}
}
#endif /* BTA_GATT_INCLUDED */
diff --git a/bta/gatt/bta_gatts_api.c b/bta/gatt/bta_gatts_api.c
index ad30d73..e2f1874 100644
--- a/bta/gatt/bta_gatts_api.c
+++ b/bta/gatt/bta_gatts_api.c
@@ -59,7 +59,7 @@
if (bta_sys_is_register(BTA_ID_GATTS) == FALSE)
{
- APPL_TRACE_WARNING0("GATTS Module not enabled/already disabled");
+ APPL_TRACE_WARNING("GATTS Module not enabled/already disabled");
return;
}
@@ -90,11 +90,9 @@
tBTA_GATTS_API_REG *p_buf;
/* register with BTA system manager */
- if (bta_sys_is_register(BTA_ID_GATTS) == FALSE)
- {
- GKI_sched_lock();
+ if (bta_sys_is_register(BTA_ID_GATTS) == FALSE)
+ {
bta_sys_register(BTA_ID_GATTS, &bta_gatts_reg);
- GKI_sched_unlock();
}
if ((p_buf = (tBTA_GATTS_API_REG *) GKI_getbuf(sizeof(tBTA_GATTS_API_REG))) != NULL)
@@ -464,11 +462,13 @@
** Parameters server_if: server interface.
** remote_bda: remote device BD address.
** is_direct: direct connection or background auto connection
+** transport : Transport on which GATT connection to be opened (BR/EDR or LE)
**
** Returns void
**
*******************************************************************************/
-void BTA_GATTS_Open(tBTA_GATTS_IF server_if, BD_ADDR remote_bda, BOOLEAN is_direct)
+void BTA_GATTS_Open(tBTA_GATTS_IF server_if, BD_ADDR remote_bda, BOOLEAN is_direct,
+ tBTA_GATT_TRANSPORT transport)
{
tBTA_GATTS_API_OPEN *p_buf;
@@ -477,6 +477,7 @@
p_buf->hdr.event = BTA_GATTS_API_OPEN_EVT;
p_buf->server_if = server_if;
p_buf->is_direct = is_direct;
+ p_buf->transport = transport;
memcpy(p_buf->remote_bda, remote_bda, BD_ADDR_LEN);
bta_sys_sendmsg(p_buf);
diff --git a/bta/gatt/bta_gatts_int.h b/bta/gatt/bta_gatts_int.h
index ce9553a..9a12dfd 100644
--- a/bta/gatt/bta_gatts_int.h
+++ b/bta/gatt/bta_gatts_int.h
@@ -139,10 +139,12 @@
typedef struct
{
- BT_HDR hdr;
- BD_ADDR remote_bda;
- tBTA_GATTS_IF server_if;
- BOOLEAN is_direct;
+ BT_HDR hdr;
+ BD_ADDR remote_bda;
+ tBTA_GATTS_IF server_if;
+ BOOLEAN is_direct;
+ tBTA_GATT_TRANSPORT transport;
+
}tBTA_GATTS_API_OPEN;
typedef tBTA_GATTS_API_OPEN tBTA_GATTS_API_CANCEL_OPEN;
diff --git a/bta/gatt/bta_gatts_main.c b/bta/gatt/bta_gatts_main.c
index 02810fc..9bcb471 100644
--- a/bta/gatt/bta_gatts_main.c
+++ b/bta/gatt/bta_gatts_main.c
@@ -128,7 +128,7 @@
}
else
{
- APPL_TRACE_ERROR0("service not created");
+ APPL_TRACE_ERROR("service not created");
}
break;
diff --git a/bta/gatt/bta_gatts_utils.c b/bta/gatt/bta_gatts_utils.c
index 5145c95..e7ac1e3 100644
--- a/bta/gatt/bta_gatts_utils.c
+++ b/bta/gatt/bta_gatts_utils.c
@@ -133,13 +133,13 @@
tBTA_GATTS_SRVC_CB * bta_gatts_find_srvc_cb_by_srvc_id(tBTA_GATTS_CB *p_cb, UINT16 service_id)
{
UINT8 i;
- APPL_TRACE_DEBUG1("bta_gatts_find_srvc_cb_by_srvc_id service_id=%d", service_id);
+ APPL_TRACE_DEBUG("bta_gatts_find_srvc_cb_by_srvc_id service_id=%d", service_id);
for (i = 0; i < BTA_GATTS_MAX_SRVC_NUM; i ++)
{
if (p_cb->srvc_cb[i].in_use &&
p_cb->srvc_cb[i].service_id == service_id)
{
- APPL_TRACE_DEBUG1("bta_gatts_find_srvc_cb_by_srvc_id found service cb index =%d", i);
+ APPL_TRACE_DEBUG("bta_gatts_find_srvc_cb_by_srvc_id found service cb index =%d", i);
return &p_cb->srvc_cb[i];
}
}
diff --git a/bta/hf_client/bta_hf_client_act.c b/bta/hf_client/bta_hf_client_act.c
new file mode 100644
index 0000000..8e37909
--- /dev/null
+++ b/bta/hf_client/bta_hf_client_act.c
@@ -0,0 +1,768 @@
+/******************************************************************************
+ *
+ * Copyright (c) 2014 The Android Open Source Project
+ * Copyright (C) 2003-2012 Broadcom Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * This file contains action functions for the handsfree client.
+ *
+ ******************************************************************************/
+
+#include "bta_api.h"
+#include "bd.h"
+#include "bta_hf_client_api.h"
+#include "bta_hf_client_int.h"
+#include "bta_dm_int.h"
+#include "l2c_api.h"
+#include "port_api.h"
+#include "bta_sys.h"
+#include "utl.h"
+#include "bt_utils.h"
+#include <string.h>
+
+/*****************************************************************************
+** Constants
+*****************************************************************************/
+
+/* maximum length of data to read from RFCOMM */
+#define BTA_HF_CLIENT_RFC_READ_MAX 512
+
+/*******************************************************************************
+**
+** Function bta_hf_client_register
+**
+** Description This function initializes values of the scb and sets up
+** the SDP record for the services.
+**
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_hf_client_register(tBTA_HF_CLIENT_DATA *p_data)
+{
+ tBTA_HF_CLIENT evt;
+ tBTA_UTL_COD cod;
+
+ memset(&evt, 0, sizeof(evt));
+
+ /* initialize control block */
+ bta_hf_client_scb_init();
+
+ bta_hf_client_cb.scb.serv_sec_mask = p_data->api_register.sec_mask;
+ bta_hf_client_cb.scb.features = p_data->api_register.features;
+
+ /* initialize AT control block */
+ bta_hf_client_at_init();
+
+ /* create SDP records */
+ bta_hf_client_create_record(p_data);
+
+ /* Set the Audio service class bit */
+ cod.service = BTM_COD_SERVICE_AUDIO;
+ utl_set_device_class(&cod, BTA_UTL_SET_COD_SERVICE_CLASS);
+
+ /* start RFCOMM server */
+ bta_hf_client_start_server();
+
+ /* call app callback with register event */
+ evt.reg.status = BTA_HF_CLIENT_SUCCESS;
+ (*bta_hf_client_cb.p_cback)(BTA_HF_CLIENT_REGISTER_EVT, &evt);
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_deregister
+**
+** Description This function removes the sdp records, closes the RFCOMM
+** servers, and deallocates the service control block.
+**
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_hf_client_deregister(tBTA_HF_CLIENT_DATA *p_data)
+{
+ bta_hf_client_cb.scb.deregister = TRUE;
+
+ /* remove sdp record */
+ bta_hf_client_del_record(p_data);
+
+ /* remove rfcomm server */
+ bta_hf_client_close_server();
+
+ /* disable */
+ bta_hf_client_scb_disable();
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_start_dereg
+**
+** Description Start a deregister event.
+**
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_hf_client_start_dereg(tBTA_HF_CLIENT_DATA *p_data)
+{
+ bta_hf_client_cb.scb.deregister = TRUE;
+
+ /* remove sdp record */
+ bta_hf_client_del_record(p_data);
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_start_close
+**
+** Description Start the process of closing SCO and RFCOMM connection.
+**
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_hf_client_start_close(tBTA_HF_CLIENT_DATA *p_data)
+{
+ /* Take the link out of sniff and set L2C idle time to 0 */
+ bta_dm_pm_active(bta_hf_client_cb.scb.peer_addr);
+ L2CA_SetIdleTimeoutByBdAddr(bta_hf_client_cb.scb.peer_addr, 0);
+
+ /* if SCO is open close SCO and wait on RFCOMM close */
+ if (bta_hf_client_cb.scb.sco_state == BTA_HF_CLIENT_SCO_OPEN_ST)
+ {
+ bta_hf_client_cb.scb.sco_close_rfc = TRUE;
+ }
+ else
+ {
+ bta_hf_client_rfc_do_close(p_data);
+ }
+
+ /* always do SCO shutdown to handle all SCO corner cases */
+ bta_hf_client_sco_shutdown(NULL);
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_start_open
+**
+** Description This starts an HF Client open.
+**
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_hf_client_start_open(tBTA_HF_CLIENT_DATA *p_data)
+{
+ BD_ADDR pending_bd_addr;
+
+ /* store parameters */
+ if (p_data)
+ {
+ bdcpy(bta_hf_client_cb.scb.peer_addr, p_data->api_open.bd_addr);
+ bta_hf_client_cb.scb.cli_sec_mask = p_data->api_open.sec_mask;
+ }
+
+ /* Check if RFCOMM has any incoming connection to avoid collision. */
+ if (PORT_IsOpening (pending_bd_addr))
+ {
+ /* Let the incoming connection goes through. */
+ /* Issue collision for now. */
+ /* We will decide what to do when we find incoming connection later.*/
+ bta_hf_client_collision_cback (0, BTA_ID_HS, 0, bta_hf_client_cb.scb.peer_addr);
+ return;
+ }
+
+ /* close server */
+ bta_hf_client_close_server();
+
+ /* set role */
+ bta_hf_client_cb.scb.role = BTA_HF_CLIENT_INT;
+
+ /* do service search */
+ bta_hf_client_do_disc();
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_cback_open
+**
+** Description Send open callback event to application.
+**
+**
+** Returns void
+**
+*******************************************************************************/
+static void bta_hf_client_cback_open(tBTA_HF_CLIENT_DATA *p_data, tBTA_HF_CLIENT_STATUS status)
+{
+ tBTA_HF_CLIENT evt;
+
+ memset(&evt, 0, sizeof(evt));
+
+ /* call app callback with open event */
+ evt.open.status = status;
+ if(p_data)
+ {
+ /* if p_data is provided then we need to pick the bd address from the open api structure */
+ bdcpy(evt.open.bd_addr, p_data->api_open.bd_addr);
+ }
+ else
+ {
+ bdcpy(evt.open.bd_addr, bta_hf_client_cb.scb.peer_addr);
+ }
+
+ (*bta_hf_client_cb.p_cback)(BTA_HF_CLIENT_OPEN_EVT, &evt);
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_rfc_open
+**
+** Description Handle RFCOMM channel open.
+**
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_hf_client_rfc_open(tBTA_HF_CLIENT_DATA *p_data)
+{
+ UNUSED(p_data);
+
+ bta_sys_conn_open(BTA_ID_HS, 1, bta_hf_client_cb.scb.peer_addr);
+
+ bta_hf_client_cback_open(NULL, BTA_HF_CLIENT_SUCCESS);
+
+ /* start SLC procedure */
+ bta_hf_client_slc_seq(FALSE);
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_rfc_acp_open
+**
+** Description Handle RFCOMM channel open when accepting connection.
+**
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_hf_client_rfc_acp_open(tBTA_HF_CLIENT_DATA *p_data)
+{
+ UINT16 lcid;
+ int i;
+ BD_ADDR dev_addr;
+ int status;
+
+ /* set role */
+ bta_hf_client_cb.scb.role = BTA_HF_CLIENT_ACP;
+
+ APPL_TRACE_DEBUG ("bta_hf_client_rfc_acp_open: serv_handle = %d rfc.port_handle = %d",
+ bta_hf_client_cb.scb.serv_handle, p_data->rfc.port_handle);
+
+ /* get bd addr of peer */
+ if (PORT_SUCCESS != (status=PORT_CheckConnection(p_data->rfc.port_handle, dev_addr, &lcid)))
+ {
+ APPL_TRACE_DEBUG ("bta_hf_client_rfc_acp_open error PORT_CheckConnection returned status %d", status);
+ }
+
+ /* Collision Handling */
+ if (bta_hf_client_cb.scb.colli_tmr_on)
+ {
+ /* stop collision timer */
+ bta_hf_client_cb.scb.colli_tmr_on = FALSE;
+ bta_sys_stop_timer (&bta_hf_client_cb.scb.colli_timer);
+
+ if (bdcmp (dev_addr, bta_hf_client_cb.scb.peer_addr) == 0)
+ {
+ /* If incoming and outgoing device are same, nothing more to do. */
+ /* Outgoing conn will be aborted because we have successful incoming conn. */
+ }
+ else
+ {
+ /* Resume outgoing connection. */
+ bta_hf_client_resume_open ();
+ }
+ }
+
+ bdcpy (bta_hf_client_cb.scb.peer_addr, dev_addr);
+ bta_hf_client_cb.scb.conn_handle = p_data->rfc.port_handle;
+
+ /* do service discovery to get features */
+ bta_hf_client_do_disc();
+
+ /* continue with open processing */
+ bta_hf_client_rfc_open(p_data);
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_rfc_fail
+**
+** Description RFCOMM connection failed.
+**
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_hf_client_rfc_fail(tBTA_HF_CLIENT_DATA *p_data)
+{
+ UNUSED(p_data);
+
+ /* reinitialize stuff */
+ bta_hf_client_cb.scb.conn_handle = 0;
+ bta_hf_client_cb.scb.peer_features = 0;
+ bta_hf_client_cb.scb.chld_features = 0;
+ bta_hf_client_cb.scb.role = BTA_HF_CLIENT_ACP;
+ bta_hf_client_cb.scb.svc_conn = FALSE;
+ bta_hf_client_cb.scb.send_at_reply = FALSE;
+ bta_hf_client_cb.scb.negotiated_codec = BTM_SCO_CODEC_CVSD;
+
+ bta_hf_client_at_reset();
+
+ /* reopen server */
+ bta_hf_client_start_server();
+
+ /* call open cback w. failure */
+ bta_hf_client_cback_open(NULL, BTA_HF_CLIENT_FAIL_RFCOMM);
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_disc_fail
+**
+** Description This function handles a discovery failure.
+**
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_hf_client_disc_fail(tBTA_HF_CLIENT_DATA *p_data)
+{
+ UNUSED(p_data);
+
+ /* reopen server */
+ bta_hf_client_start_server();
+
+ /* reinitialize stuff */
+
+ /* call open cback w. failure */
+ bta_hf_client_cback_open(NULL, BTA_HF_CLIENT_FAIL_SDP);
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_open_fail
+**
+** Description open connection failed.
+**
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_hf_client_open_fail(tBTA_HF_CLIENT_DATA *p_data)
+{
+ /* call open cback w. failure */
+ bta_hf_client_cback_open(p_data, BTA_HF_CLIENT_FAIL_RESOURCES);
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_rfc_close
+**
+** Description RFCOMM connection closed.
+**
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_hf_client_rfc_close(tBTA_HF_CLIENT_DATA *p_data)
+{
+ int i, num_active_conn = 0;
+ UNUSED(p_data);
+
+ /* reinitialize stuff */
+ bta_hf_client_cb.scb.peer_features = 0;
+ bta_hf_client_cb.scb.chld_features = 0;
+ bta_hf_client_cb.scb.role = BTA_HF_CLIENT_ACP;
+ bta_hf_client_cb.scb.svc_conn = FALSE;
+ bta_hf_client_cb.scb.send_at_reply = FALSE;
+ bta_hf_client_cb.scb.negotiated_codec = BTM_SCO_CODEC_CVSD;
+
+ bta_hf_client_at_reset();
+
+ bta_sys_conn_close(BTA_ID_HS, 1, bta_hf_client_cb.scb.peer_addr);
+
+ /* call close cback */
+ (*bta_hf_client_cb.p_cback)(BTA_HF_CLIENT_CLOSE_EVT, NULL);
+
+ /* if not deregistering reopen server */
+ if (bta_hf_client_cb.scb.deregister == FALSE)
+ {
+ /* Clear peer bd_addr so instance can be reused */
+ bdcpy(bta_hf_client_cb.scb.peer_addr, bd_addr_null);
+
+ /* start server as it might got closed on open*/
+ bta_hf_client_start_server();
+
+ bta_hf_client_cb.scb.conn_handle = 0;
+
+ /* Make sure SCO is shutdown */
+ bta_hf_client_sco_shutdown(NULL);
+
+ bta_sys_sco_unuse(BTA_ID_HS, 1, bta_hf_client_cb.scb.peer_addr);
+ }
+ /* else close port and deallocate scb */
+ else
+ {
+ bta_hf_client_close_server();
+ bta_hf_client_scb_disable();
+ }
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_disc_int_res
+**
+** Description This function handles a discovery result when initiator.
+**
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_hf_client_disc_int_res(tBTA_HF_CLIENT_DATA *p_data)
+{
+ UINT16 event = BTA_HF_CLIENT_DISC_FAIL_EVT;
+
+ APPL_TRACE_DEBUG ("bta_hf_client_disc_int_res: Status: %d", p_data->disc_result.status);
+
+ /* if found service */
+ if (p_data->disc_result.status == SDP_SUCCESS ||
+ p_data->disc_result.status == SDP_DB_FULL)
+ {
+ /* get attributes */
+ if (bta_hf_client_sdp_find_attr())
+ {
+ event = BTA_HF_CLIENT_DISC_OK_EVT;
+ }
+ }
+
+ /* free discovery db */
+ bta_hf_client_free_db(p_data);
+
+ /* send ourselves sdp ok/fail event */
+ bta_hf_client_sm_execute(event, p_data);
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_disc_acp_res
+**
+** Description This function handles a discovery result when acceptor.
+**
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_hf_client_disc_acp_res(tBTA_HF_CLIENT_DATA *p_data)
+{
+ /* if found service */
+ if (p_data->disc_result.status == SDP_SUCCESS ||
+ p_data->disc_result.status == SDP_DB_FULL)
+ {
+ /* get attributes */
+ bta_hf_client_sdp_find_attr();
+ }
+
+ /* free discovery db */
+ bta_hf_client_free_db(p_data);
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_rfc_data
+**
+** Description Read and process data from RFCOMM.
+**
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_hf_client_rfc_data(tBTA_HF_CLIENT_DATA *p_data)
+{
+ UINT16 len;
+ char buf[BTA_HF_CLIENT_RFC_READ_MAX];
+ UNUSED(p_data);
+
+ memset(buf, 0, sizeof(buf));
+
+ /* read data from rfcomm; if bad status, we're done */
+ while (PORT_ReadData(bta_hf_client_cb.scb.conn_handle, buf, BTA_HF_CLIENT_RFC_READ_MAX, &len) == PORT_SUCCESS)
+ {
+ /* if no data, we're done */
+ if (len == 0)
+ {
+ break;
+ }
+
+ bta_hf_client_at_parse(buf, len);
+
+ /* no more data to read, we're done */
+ if (len < BTA_HF_CLIENT_RFC_READ_MAX)
+ {
+ break;
+ }
+ }
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_svc_conn_open
+**
+** Description Service level connection opened
+**
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_hf_client_svc_conn_open(tBTA_HF_CLIENT_DATA *p_data)
+{
+ tBTA_HF_CLIENT evt;
+ UNUSED(p_data);
+
+ memset(&evt, 0, sizeof(evt));
+
+ if (!bta_hf_client_cb.scb.svc_conn)
+ {
+ /* set state variable */
+ bta_hf_client_cb.scb.svc_conn = TRUE;
+
+ /* call callback */
+ evt.conn.peer_feat = bta_hf_client_cb.scb.peer_features;
+ evt.conn.chld_feat = bta_hf_client_cb.scb.chld_features;
+
+ (*bta_hf_client_cb.p_cback)(BTA_HF_CLIENT_CONN_EVT, &evt);
+ }
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_cback_ind
+**
+** Description Send indicator callback event to application.
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_hf_client_ind(tBTA_HF_CLIENT_IND_TYPE type, UINT16 value)
+{
+ tBTA_HF_CLIENT evt;
+
+ memset(&evt, 0, sizeof(evt));
+
+ evt.ind.type = type;
+ evt.ind.value = value;
+
+ (*bta_hf_client_cb.p_cback)(BTA_HF_CLIENT_IND_EVT, &evt);
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_evt_val
+**
+** Description Send event to application.
+** This is a generic helper for events with common data.
+**
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_hf_client_evt_val(tBTA_HF_CLIENT_EVT type, UINT16 value)
+{
+ tBTA_HF_CLIENT evt;
+
+ memset(&evt, 0, sizeof(evt));
+
+ evt.val.value = value;
+
+ (*bta_hf_client_cb.p_cback)(type, &evt);
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_operator_name
+**
+** Description Send operator name event to application.
+**
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_hf_client_operator_name(char *name)
+{
+ tBTA_HF_CLIENT evt;
+
+ memset(&evt, 0, sizeof(evt));
+
+ strlcpy(evt.operator.name, name, BTA_HF_CLIENT_OPERATOR_NAME_LEN + 1);
+ evt.operator.name[BTA_HF_CLIENT_OPERATOR_NAME_LEN] = '\0';
+
+ (*bta_hf_client_cb.p_cback)(BTA_HF_CLIENT_OPERATOR_NAME_EVT, &evt);
+}
+
+
+/*******************************************************************************
+**
+** Function bta_hf_client_clip
+**
+** Description Send CLIP event to application.
+**
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_hf_client_clip(char *number)
+{
+ tBTA_HF_CLIENT evt;
+
+ memset(&evt, 0, sizeof(evt));
+
+ strlcpy(evt.number.number, number, BTA_HF_CLIENT_NUMBER_LEN + 1);
+ evt.number.number[BTA_HF_CLIENT_NUMBER_LEN] = '\0';
+
+ (*bta_hf_client_cb.p_cback)(BTA_HF_CLIENT_CLIP_EVT, &evt);
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_ccwa
+**
+** Description Send CLIP event to application.
+**
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_hf_client_ccwa(char *number)
+{
+ tBTA_HF_CLIENT evt;
+
+ memset(&evt, 0, sizeof(evt));
+
+ strlcpy(evt.number.number, number, BTA_HF_CLIENT_NUMBER_LEN + 1);
+ evt.number.number[BTA_HF_CLIENT_NUMBER_LEN] = '\0';
+
+ (*bta_hf_client_cb.p_cback)(BTA_HF_CLIENT_CCWA_EVT, &evt);
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_at_result
+**
+** Description Send AT result event to application.
+**
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_hf_client_at_result(tBTA_HF_CLIENT_AT_RESULT_TYPE type, UINT16 cme)
+{
+ tBTA_HF_CLIENT evt;
+
+ memset(&evt, 0, sizeof(evt));
+
+ evt.result.type = type;
+ evt.result.cme = cme;
+
+ (*bta_hf_client_cb.p_cback)(BTA_HF_CLIENT_AT_RESULT_EVT, &evt);
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_clcc
+**
+** Description Send clcc event to application.
+**
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_hf_client_clcc(UINT32 idx, BOOLEAN incoming, UINT8 status, BOOLEAN mpty, char *number)
+{
+ tBTA_HF_CLIENT evt;
+
+ memset(&evt, 0, sizeof(evt));
+
+ evt.clcc.idx = idx;
+ evt.clcc.inc = incoming;
+ evt.clcc.status = status;
+ evt.clcc.mpty = mpty;
+
+ if (number)
+ {
+ evt.clcc.number_present = TRUE;
+ strlcpy(evt.clcc.number, number, BTA_HF_CLIENT_NUMBER_LEN + 1);
+ evt.clcc.number[BTA_HF_CLIENT_NUMBER_LEN] = '\0';
+ }
+
+ (*bta_hf_client_cb.p_cback)(BTA_HF_CLIENT_CLCC_EVT, &evt);
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_cnum
+**
+** Description Send cnum event to application.
+**
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_hf_client_cnum(char *number, UINT16 service)
+{
+ tBTA_HF_CLIENT evt;
+
+ memset(&evt, 0, sizeof(evt));
+
+ evt.cnum.service = service;
+ strlcpy(evt.cnum.number, number, BTA_HF_CLIENT_NUMBER_LEN + 1);
+ evt.cnum.number[BTA_HF_CLIENT_NUMBER_LEN] = '\0';
+
+ (*bta_hf_client_cb.p_cback)(BTA_HF_CLIENT_CNUM_EVT, &evt);
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_binp
+**
+** Description Send BINP event to application.
+**
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_hf_client_binp(char *number)
+{
+ tBTA_HF_CLIENT evt;
+
+ memset(&evt, 0, sizeof(evt));
+
+ strlcpy(evt.number.number, number, BTA_HF_CLIENT_NUMBER_LEN + 1);
+ evt.number.number[BTA_HF_CLIENT_NUMBER_LEN] = '\0';
+
+ (*bta_hf_client_cb.p_cback)(BTA_HF_CLIENT_BINP_EVT, &evt);
+}
diff --git a/bta/hf_client/bta_hf_client_api.c b/bta/hf_client/bta_hf_client_api.c
new file mode 100644
index 0000000..6fdad9a
--- /dev/null
+++ b/bta/hf_client/bta_hf_client_api.c
@@ -0,0 +1,289 @@
+/******************************************************************************
+ *
+ * Copyright (c) 2014 The Android Open Source Project
+ * Copyright (C) 2003-2012 Broadcom Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * This is the implementation of the API for the handsfree (HF role)
+ * subsystem of BTA
+ *
+ ******************************************************************************/
+
+#include <string.h>
+#include "bta_hf_client_api.h"
+#include "bta_hf_client_int.h"
+#include "bd.h"
+
+/*****************************************************************************
+** Constants and data types
+*****************************************************************************/
+static const tBTA_SYS_REG bta_hf_client_reg =
+{
+ bta_hf_client_hdl_event,
+ BTA_HfClientDisable
+};
+
+
+/*****************************************************************************
+** External Function Declarations
+*****************************************************************************/
+
+/*******************************************************************************
+**
+** Function BTA_HfClientEnable
+**
+** Description Enable the HF CLient service. When the enable
+** operation is complete the callback function will be
+** called with a BTA_HF_CLIENT_ENABLE_EVT. This function must
+** be called before other function in the HF CLient API are
+** called.
+**
+** Returns BTA_SUCCESS if OK, BTA_FAILURE otherwise.
+**
+*******************************************************************************/
+BTA_API tBTA_STATUS BTA_HfClientEnable(tBTA_HF_CLIENT_CBACK *p_cback)
+{
+ tBTA_HF_CLIENT_API_ENABLE *p_buf;
+ UINT8 idx;
+
+ if (bta_sys_is_register (BTA_ID_HS))
+ {
+ APPL_TRACE_ERROR("BTA HF Client is already enabled, ignoring ...");
+ return BTA_FAILURE;
+ }
+
+ /* register with BTA system manager */
+ bta_sys_register(BTA_ID_HS, &bta_hf_client_reg);
+
+ if ((p_buf = (tBTA_HF_CLIENT_API_ENABLE *) GKI_getbuf(sizeof(tBTA_HF_CLIENT_API_ENABLE))) != NULL)
+ {
+ p_buf->hdr.event = BTA_HF_CLIENT_API_ENABLE_EVT;
+ p_buf->p_cback = p_cback;
+ bta_sys_sendmsg(p_buf);
+ }
+
+ return BTA_SUCCESS;
+}
+
+/*******************************************************************************
+**
+** Function BTA_HfClientDisable
+**
+** Description Disable the HF Client service
+**
+**
+** Returns void
+**
+*******************************************************************************/
+BTA_API void BTA_HfClientDisable(void)
+{
+ BT_HDR *p_buf;
+
+ if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
+ {
+ p_buf->event = BTA_HF_CLIENT_API_DISABLE_EVT;
+ bta_sys_sendmsg(p_buf);
+ }
+}
+
+/*******************************************************************************
+**
+** Function BTA_HfClientRegister
+**
+** Description Register an HF Client service.
+**
+**
+** Returns void
+**
+*******************************************************************************/
+BTA_API void BTA_HfClientRegister(tBTA_SEC sec_mask, tBTA_HF_CLIENT_FEAT features,
+ char *p_service_name)
+{
+ tBTA_HF_CLIENT_API_REGISTER *p_buf;
+
+ if ((p_buf = (tBTA_HF_CLIENT_API_REGISTER *) GKI_getbuf(sizeof(tBTA_HF_CLIENT_API_REGISTER))) != NULL)
+ {
+ p_buf->hdr.event = BTA_HF_CLIENT_API_REGISTER_EVT;
+ p_buf->features = features;
+ p_buf->sec_mask = sec_mask;
+ if(p_service_name)
+ {
+ BCM_STRNCPY_S(p_buf->name, BTA_SERVICE_NAME_LEN+1, p_service_name, BTA_SERVICE_NAME_LEN);
+ p_buf->name[BTA_SERVICE_NAME_LEN] = 0;
+ }
+ else
+ {
+ p_buf->name[0] = '\0';
+ }
+ bta_sys_sendmsg(p_buf);
+ }
+}
+
+/*******************************************************************************
+**
+** Function BTA_HfClientDeregister
+**
+** Description Deregister an HF Client service.
+**
+**
+** Returns void
+**
+*******************************************************************************/
+BTA_API void BTA_HfClientDeregister(UINT16 handle)
+{
+ BT_HDR *p_buf;
+
+ if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
+ {
+ p_buf->event = BTA_HF_CLIENT_API_DEREGISTER_EVT;
+ p_buf->layer_specific = handle;
+ bta_sys_sendmsg(p_buf);
+ }
+}
+
+/*******************************************************************************
+**
+** Function BTA_HfClientOpen
+**
+** Description Opens a connection to an audio gateway.
+** When connection is open callback function is called
+** with a BTA_AG_OPEN_EVT. Only the data connection is
+** opened. The audio connection is not opened.
+**
+**
+** Returns void
+**
+*******************************************************************************/
+BTA_API void BTA_HfClientOpen(UINT16 handle, BD_ADDR bd_addr, tBTA_SEC sec_mask)
+{
+ tBTA_HF_CLIENT_API_OPEN *p_buf;
+
+ if ((p_buf = (tBTA_HF_CLIENT_API_OPEN *) GKI_getbuf(sizeof(tBTA_HF_CLIENT_API_OPEN))) != NULL)
+ {
+ p_buf->hdr.event = BTA_HF_CLIENT_API_OPEN_EVT;
+ p_buf->hdr.layer_specific = handle;
+ bdcpy(p_buf->bd_addr, bd_addr);
+ p_buf->sec_mask = sec_mask;
+ bta_sys_sendmsg(p_buf);
+ }
+}
+
+/*******************************************************************************
+**
+** Function BTA_HfClientClose
+**
+** Description Close the current connection to an audio gateway.
+** Any current audio connection will also be closed
+**
+**
+** Returns void
+**
+*******************************************************************************/
+BTA_API void BTA_HfClientClose(UINT16 handle)
+{
+ BT_HDR *p_buf;
+
+ if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
+ {
+ p_buf->event = BTA_HF_CLIENT_API_CLOSE_EVT;
+ p_buf->layer_specific = handle;
+ bta_sys_sendmsg(p_buf);
+ }
+}
+
+/*******************************************************************************
+**
+** Function BTA_HfCllientAudioOpen
+**
+** Description Opens an audio connection to the currently connected
+** audio gateway
+**
+**
+** Returns void
+**
+*******************************************************************************/
+BTA_API void BTA_HfClientAudioOpen(UINT16 handle)
+{
+ BT_HDR *p_buf;
+
+ if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
+ {
+ p_buf->event = BTA_HF_CLIENT_API_AUDIO_OPEN_EVT;
+ p_buf->layer_specific = handle;
+ bta_sys_sendmsg(p_buf);
+ }
+}
+
+/*******************************************************************************
+**
+** Function BTA_HfClientAudioClose
+**
+** Description Close the currently active audio connection to an audio
+** gateway. The data connection remains open
+**
+**
+** Returns void
+**
+*******************************************************************************/
+BTA_API void BTA_HfClientAudioClose(UINT16 handle)
+{
+ BT_HDR *p_buf;
+
+ if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
+ {
+ p_buf->event = BTA_HF_CLIENT_API_AUDIO_CLOSE_EVT;
+ p_buf->layer_specific = handle;
+ bta_sys_sendmsg(p_buf);
+ }
+}
+
+/*******************************************************************************
+**
+** Function BTA_HfClientSendAT
+**
+** Description send AT command
+**
+**
+** Returns void
+**
+*******************************************************************************/
+BTA_API void BTA_HfClientSendAT(UINT16 handle, tBTA_HF_CLIENT_AT_CMD_TYPE at, UINT32 val1, UINT32 val2, const char *str)
+{
+ tBTA_HF_CLIENT_DATA_VAL *p_buf;
+
+ if ((p_buf = (tBTA_HF_CLIENT_DATA_VAL *) GKI_getbuf(sizeof(tBTA_HF_CLIENT_DATA_VAL))) != NULL)
+ {
+ p_buf->hdr.event = BTA_HF_CLIENT_SEND_AT_CMD_EVT;
+ p_buf->uint8_val = at;
+ p_buf->uint32_val1 = val1;
+ p_buf->uint32_val2 = val2;
+
+ if (str)
+ {
+ strlcpy(p_buf->str, str, BTA_HF_CLIENT_NUMBER_LEN + 1);
+ p_buf->str[BTA_HF_CLIENT_NUMBER_LEN] = '\0';
+ }
+ else
+ {
+ p_buf->str[0] = '\0';
+ }
+
+ p_buf->hdr.layer_specific = handle;
+ bta_sys_sendmsg(p_buf);
+ }
+}
diff --git a/bta/hf_client/bta_hf_client_at.c b/bta/hf_client/bta_hf_client_at.c
new file mode 100644
index 0000000..462b287
--- /dev/null
+++ b/bta/hf_client/bta_hf_client_at.c
@@ -0,0 +1,1816 @@
+/******************************************************************************
+ *
+ * Copyright (c) 2014 The Android Open Source Project
+ * Copyright (C) 2003-2012 Broadcom Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+#include <string.h>
+#include <stdio.h>
+#include <errno.h>
+#include "bta_hf_client_api.h"
+#include "bta_hf_client_int.h"
+#include "port_api.h"
+
+/* Uncomment to enable AT traffic dumping */
+/* #define BTA_HF_CLIENT_AT_DUMP 1 */
+
+/* minimum length of AT event */
+#define BTA_HF_CLIENT_AT_EVENT_MIN_LEN 3
+
+/* timeout for AT response */
+#define BTA_HF_CLIENT_AT_TIMEOUT 29989
+
+/* timeout for AT hold timer */
+#define BTA_HF_CLIENT_AT_HOLD_TIMEOUT 41
+
+/******************************************************************************
+**
+** DATA TYPES AND CONTAINERS
+**
+*******************************************************************************/
+/* BRSF: store received values here */
+extern tBTA_HF_CLIENT_CB bta_hf_client_cb;
+
+/******************************************************************************
+** SUPPORTED EVENT MESSAGES
+*******************************************************************************/
+
+/* CIND: supported indicator names */
+#define BTA_HF_CLIENT_INDICATOR_BATTERYCHG "battchg"
+#define BTA_HF_CLIENT_INDICATOR_SIGNAL "signal"
+#define BTA_HF_CLIENT_INDICATOR_SERVICE "service"
+#define BTA_HF_CLIENT_INDICATOR_CALL "call"
+#define BTA_HF_CLIENT_INDICATOR_ROAM "roam"
+#define BTA_HF_CLIENT_INDICATOR_CALLSETUP "callsetup"
+#define BTA_HF_CLIENT_INDICATOR_CALLHELD "callheld"
+
+/* CIND: represents each indicators boundaries */
+typedef struct
+{
+ char* name;
+ UINT8 min;
+ UINT8 max;
+ UINT8 namelen;
+} tBTA_HF_CLIENT_INDICATOR;
+
+#define BTA_HF_CLIENT_AT_SUPPORTED_INDICATOR_COUNT 7
+
+/* CIND: storage room for indicators value range and their statuses */
+static const tBTA_HF_CLIENT_INDICATOR bta_hf_client_indicators[BTA_HF_CLIENT_AT_SUPPORTED_INDICATOR_COUNT] =
+{
+ /* name | min | max | name length - used by parser */
+ {BTA_HF_CLIENT_INDICATOR_BATTERYCHG, 0, 5, sizeof(BTA_HF_CLIENT_INDICATOR_BATTERYCHG)},
+ {BTA_HF_CLIENT_INDICATOR_SIGNAL, 0, 5, sizeof(BTA_HF_CLIENT_INDICATOR_SIGNAL)},
+ {BTA_HF_CLIENT_INDICATOR_SERVICE, 0, 1, sizeof(BTA_HF_CLIENT_INDICATOR_SERVICE)},
+ {BTA_HF_CLIENT_INDICATOR_CALL, 0, 1, sizeof(BTA_HF_CLIENT_INDICATOR_CALL)},
+ {BTA_HF_CLIENT_INDICATOR_ROAM, 0, 1, sizeof(BTA_HF_CLIENT_INDICATOR_ROAM)},
+ {BTA_HF_CLIENT_INDICATOR_CALLSETUP, 0, 3, sizeof(BTA_HF_CLIENT_INDICATOR_CALLSETUP)},
+ {BTA_HF_CLIENT_INDICATOR_CALLHELD, 0, 2, sizeof(BTA_HF_CLIENT_INDICATOR_CALLHELD)}
+};
+
+/* +VGM/+VGS - gain min/max values */
+#define BTA_HF_CLIENT_VGS_MIN 0
+#define BTA_HF_CLIENT_VGS_MAX 15
+#define BTA_HF_CLIENT_VGM_MIN 0
+#define BTA_HF_CLIENT_VGM_MAX 15
+
+UINT32 service_index = 0;
+BOOLEAN service_availability = TRUE;
+/* helper functions for handling AT commands queueing */
+
+static void bta_hf_client_clear_queued_at(void)
+{
+ tBTA_HF_CLIENT_AT_QCMD *cur = bta_hf_client_cb.scb.at_cb.queued_cmd;
+ tBTA_HF_CLIENT_AT_QCMD *next;
+
+ while (cur != NULL) {
+ next = cur->next;
+ GKI_freebuf(cur);
+ cur = next;
+ }
+
+ bta_hf_client_cb.scb.at_cb.queued_cmd = NULL;
+}
+
+static void bta_hf_client_queue_at(tBTA_HF_CLIENT_AT_CMD cmd, const char *buf, UINT16 buf_len)
+{
+ tBTA_HF_CLIENT_AT_QCMD *new_cmd;
+
+ APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+ if ((new_cmd = (tBTA_HF_CLIENT_AT_QCMD *) GKI_getbuf(sizeof(tBTA_HF_CLIENT_AT_QCMD))) != NULL)
+ {
+ new_cmd->cmd = cmd;
+ new_cmd->buf_len = buf_len;
+ new_cmd->next = NULL;
+ memcpy(new_cmd->buf, buf, buf_len);
+
+ if (bta_hf_client_cb.scb.at_cb.queued_cmd != NULL)
+ {
+ tBTA_HF_CLIENT_AT_QCMD *qcmd = bta_hf_client_cb.scb.at_cb.queued_cmd;
+
+ while (qcmd->next != NULL)
+ qcmd = qcmd->next;
+
+ qcmd->next = new_cmd;
+ }
+ else
+ {
+ bta_hf_client_cb.scb.at_cb.queued_cmd = new_cmd;
+ }
+ }
+}
+
+static void bta_hf_client_at_resp_timer_cback (TIMER_LIST_ENT *p_tle)
+{
+ if (p_tle)
+ {
+ bta_hf_client_cb.scb.at_cb.resp_timer_on = FALSE;
+
+ APPL_TRACE_ERROR("HFPClient: AT response timeout, disconnecting");
+
+ bta_hf_client_sm_execute(BTA_HF_CLIENT_API_CLOSE_EVT, NULL);
+ }
+}
+
+static void bta_hf_client_stop_at_resp_timer(void)
+{
+ if (bta_hf_client_cb.scb.at_cb.resp_timer_on)
+ {
+ bta_hf_client_cb.scb.at_cb.resp_timer_on = FALSE;
+ bta_sys_stop_timer (&bta_hf_client_cb.scb.at_cb.resp_timer);
+ }
+}
+
+static void bta_hf_client_start_at_resp_timer(void)
+{
+ if (bta_hf_client_cb.scb.at_cb.resp_timer_on)
+ {
+ bta_sys_stop_timer (&bta_hf_client_cb.scb.at_cb.resp_timer);
+ }
+
+ bta_hf_client_cb.scb.at_cb.resp_timer.p_cback = (TIMER_CBACK*)&bta_hf_client_at_resp_timer_cback;
+ bta_sys_start_timer(&bta_hf_client_cb.scb.at_cb.resp_timer, 0, BTA_HF_CLIENT_AT_TIMEOUT);
+ bta_hf_client_cb.scb.at_cb.resp_timer_on = TRUE;
+}
+
+static void bta_hf_client_send_at(tBTA_HF_CLIENT_AT_CMD cmd, char *buf, UINT16 buf_len)
+{
+ if ((bta_hf_client_cb.scb.at_cb.current_cmd == BTA_HF_CLIENT_AT_NONE ||
+ bta_hf_client_cb.scb.svc_conn == FALSE) &&
+ bta_hf_client_cb.scb.at_cb.hold_timer_on == FALSE)
+ {
+ UINT16 len;
+
+#ifdef BTA_HF_CLIENT_AT_DUMP
+ APPL_TRACE_DEBUG("%s %.*s", __FUNCTION__, buf_len - 1, buf);
+#endif
+
+ bta_hf_client_cb.scb.at_cb.current_cmd = cmd;
+ PORT_WriteData(bta_hf_client_cb.scb.conn_handle, buf, buf_len, &len);
+
+ bta_hf_client_start_at_resp_timer();
+
+ return;
+ }
+
+ bta_hf_client_queue_at(cmd, buf, buf_len);
+}
+
+static void bta_hf_client_send_queued_at(void)
+{
+ tBTA_HF_CLIENT_AT_QCMD *cur = bta_hf_client_cb.scb.at_cb.queued_cmd;
+ tBTA_HF_CLIENT_AT_QCMD *next;
+
+ APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+ if (cur != NULL)
+ {
+ next = cur->next;
+
+ bta_hf_client_send_at(cur->cmd, cur->buf, cur->buf_len);
+
+ GKI_freebuf(cur);
+
+ bta_hf_client_cb.scb.at_cb.queued_cmd = next;
+ }
+}
+
+static void bta_hf_client_at_hold_timer_cback(TIMER_LIST_ENT *p_tle)
+{
+ APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+ if (p_tle)
+ {
+ bta_hf_client_cb.scb.at_cb.hold_timer_on = FALSE;
+ bta_hf_client_send_queued_at();
+ }
+}
+
+static void bta_hf_client_stop_at_hold_timer(void)
+{
+ APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+ if (bta_hf_client_cb.scb.at_cb.hold_timer_on)
+ {
+ bta_hf_client_cb.scb.at_cb.hold_timer_on = FALSE;
+ bta_sys_stop_timer (&bta_hf_client_cb.scb.at_cb.hold_timer);
+ }
+}
+
+static void bta_hf_client_start_at_hold_timer(void)
+{
+ TIMER_LIST_ENT *timer = &bta_hf_client_cb.scb.at_cb.hold_timer;
+
+ APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+ if (bta_hf_client_cb.scb.at_cb.hold_timer_on)
+ {
+ bta_sys_stop_timer (timer);
+ }
+
+ timer->p_cback = (TIMER_CBACK*)&bta_hf_client_at_hold_timer_cback;
+ bta_sys_start_timer(timer, 0, BTA_HF_CLIENT_AT_HOLD_TIMEOUT);
+ bta_hf_client_cb.scb.at_cb.hold_timer_on = TRUE;
+}
+
+/******************************************************************************
+**
+** COMMON AT EVENT HANDLING FUNCTIONS
+**
+** Receives data (strings, ints, etc.) from the parser and processes this data.
+** No buffer parsing is being done here.
+*******************************************************************************/
+
+static void bta_hf_client_handle_ok()
+{
+ APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+ bta_hf_client_stop_at_resp_timer();
+
+ if (!bta_hf_client_cb.scb.svc_conn)
+ {
+ bta_hf_client_slc_seq(FALSE);
+ return;
+ }
+
+ switch(bta_hf_client_cb.scb.at_cb.current_cmd)
+ {
+ case BTA_HF_CLIENT_AT_BIA:
+ case BTA_HF_CLIENT_AT_BCC:
+ break;
+ case BTA_HF_CLIENT_AT_BCS:
+ bta_hf_client_start_at_hold_timer();
+ bta_hf_client_cb.scb.at_cb.current_cmd = BTA_HF_CLIENT_AT_NONE;
+ return;
+ case BTA_HF_CLIENT_AT_CLIP: //last cmd is post slc seq
+ if (bta_hf_client_cb.scb.send_at_reply == FALSE)
+ {
+ bta_hf_client_cb.scb.send_at_reply = TRUE;
+ }
+ break;
+ case BTA_HF_CLIENT_AT_NONE:
+ bta_hf_client_stop_at_hold_timer();
+ break;
+ default:
+ if (bta_hf_client_cb.scb.send_at_reply)
+ {
+ bta_hf_client_at_result(BTA_HF_CLIENT_AT_RESULT_OK, 0);
+ }
+ break;
+ }
+
+ bta_hf_client_cb.scb.at_cb.current_cmd = BTA_HF_CLIENT_AT_NONE;
+
+ bta_hf_client_send_queued_at();
+}
+
+static void bta_hf_client_handle_error(tBTA_HF_CLIENT_AT_RESULT_TYPE type, UINT16 cme)
+{
+ APPL_TRACE_DEBUG("%s %u %u", __FUNCTION__, type, cme);
+
+ bta_hf_client_stop_at_resp_timer();
+
+ if (!bta_hf_client_cb.scb.svc_conn)
+ {
+ bta_hf_client_slc_seq(TRUE);
+ return;
+ }
+
+ switch(bta_hf_client_cb.scb.at_cb.current_cmd)
+ {
+ case BTA_HF_CLIENT_AT_BIA:
+ break;
+ case BTA_HF_CLIENT_AT_BCC:
+ case BTA_HF_CLIENT_AT_BCS:
+ bta_hf_client_cback_sco(BTA_HF_CLIENT_AUDIO_CLOSE_EVT);
+ break;
+ case BTA_HF_CLIENT_AT_CLIP: //last cmd is post slc seq
+ if (bta_hf_client_cb.scb.send_at_reply == FALSE)
+ {
+ bta_hf_client_cb.scb.send_at_reply = TRUE;
+ }
+ break;
+ default:
+ if (bta_hf_client_cb.scb.send_at_reply)
+ {
+ bta_hf_client_at_result(type, cme);
+ }
+ break;
+ }
+
+ bta_hf_client_cb.scb.at_cb.current_cmd = BTA_HF_CLIENT_AT_NONE;
+
+ bta_hf_client_send_queued_at();
+}
+
+static void bta_hf_client_handle_ring()
+{
+ APPL_TRACE_DEBUG("%s", __FUNCTION__);
+ bta_hf_client_evt_val(BTA_HF_CLIENT_RING_INDICATION,0);
+}
+
+static void bta_hf_client_handle_brsf(UINT32 value)
+{
+ APPL_TRACE_DEBUG("%s 0x%x", __FUNCTION__, value);
+ bta_hf_client_cb.scb.peer_features = value;
+}
+
+/* handles a single indicator descriptor - registers it for value changing events */
+static void bta_hf_client_handle_cind_list_item(char *name, UINT32 min, UINT32 max, UINT32 index)
+{
+
+ UINT8 i = 0;
+
+ APPL_TRACE_DEBUG("%s %lu.%s <%lu:%lu>", __FUNCTION__, index, name, min, max);
+
+ /* look for a matching indicator on list of supported ones */
+ for(i = 0; i < BTA_HF_CLIENT_AT_SUPPORTED_INDICATOR_COUNT; i++)
+ {
+ if (strcmp(name,BTA_HF_CLIENT_INDICATOR_SERVICE) == 0)
+ {
+ service_index = index;
+ }
+ /* look for a match - search one sign further than indicators name to check for string end */
+ /* It will distinguish 'callheld' which could be matched by strncmp as 'call'. */
+ if (strncmp(name, bta_hf_client_indicators[i].name, bta_hf_client_indicators[i].namelen) != 0)
+ continue;
+
+ /* index - enumerates value position in the incoming sequence */
+ /* if name matches one of the known indicators, add its incoming position */
+ /* to lookup table for easy value->indicator matching later, when only values come */
+ bta_hf_client_cb.scb.at_cb.indicator_lookup[index] = i;
+
+ return;
+ }
+}
+
+static void bta_hf_client_handle_cind_value(UINT32 index, UINT32 value)
+{
+ APPL_TRACE_DEBUG("%s index: %u value: %u", __FUNCTION__, index, value);
+
+ if (index >= BTA_HF_CLIENT_AT_INDICATOR_COUNT)
+ {
+ return;
+ }
+
+ if (service_index == index)
+ {
+ if (value == 0)
+ {
+ service_availability = FALSE;
+ }
+ else
+ {
+ service_availability = TRUE;
+ }
+ }
+ if (bta_hf_client_cb.scb.at_cb.indicator_lookup[index] == -1)
+ {
+ return;
+ }
+
+ /* get the real array index from lookup table */
+ index = bta_hf_client_cb.scb.at_cb.indicator_lookup[index];
+
+ /* Ignore out of range values */
+ if(value > bta_hf_client_indicators[index].max ||
+ value < bta_hf_client_indicators[index].min)
+ {
+ return;
+ }
+
+ /* tBTA_HF_CLIENT_IND_TYPE match index in bta_hf_client_indicators */
+ bta_hf_client_ind(index, value);
+}
+
+static void bta_hf_client_handle_chld(UINT32 mask)
+{
+ APPL_TRACE_DEBUG("%s 0x%x", __FUNCTION__, mask);
+
+ bta_hf_client_cb.scb.chld_features |= mask;
+}
+
+static void bta_hf_client_handle_ciev(UINT32 index, UINT32 value)
+{
+ INT8 realind = -1;
+
+ APPL_TRACE_DEBUG("%s index: %u value: %u", __FUNCTION__, index, value);
+
+ if(index == 0 || index >= BTA_HF_CLIENT_AT_INDICATOR_COUNT)
+ {
+ return;
+ }
+
+ realind = bta_hf_client_cb.scb.at_cb.indicator_lookup[index - 1];
+
+ if(realind >= 0 && realind < BTA_HF_CLIENT_AT_SUPPORTED_INDICATOR_COUNT)
+ {
+ /* get the real in-array index from lookup table by index it comes at */
+ /* if there is no bug it should automatically be correctly calculated */
+ if(value > bta_hf_client_indicators[realind].max || value < bta_hf_client_indicators[realind].min)
+ {
+ return;
+ }
+
+ /* tBTA_HF_CLIENT_IND_TYPE match index in bta_hf_client_indicators */
+ bta_hf_client_ind(realind, value);
+ }
+}
+
+static void bta_hf_client_handle_bcs(UINT32 codec)
+{
+ APPL_TRACE_DEBUG("%s %u", __FUNCTION__, codec);
+
+ if (codec == BTM_SCO_CODEC_CVSD ||
+ (codec == BTM_SCO_CODEC_MSBC && bta_hf_client_cb.msbc_enabled == TRUE))
+ {
+ bta_hf_client_cb.scb.negotiated_codec = codec;
+ bta_hf_client_send_at_bcs(codec);
+ }
+ else
+ {
+ bta_hf_client_cb.scb.negotiated_codec = BTM_SCO_CODEC_CVSD;
+ bta_hf_client_send_at_bac();
+ }
+}
+
+static void bta_hf_client_handle_bsir(UINT32 provided)
+{
+ APPL_TRACE_DEBUG("%s %u", __FUNCTION__, provided);
+
+ bta_hf_client_evt_val(BTA_HF_CLIENT_BSIR_EVT, provided);
+}
+
+static void bta_hf_client_handle_cmeerror(UINT32 code)
+{
+ bta_hf_client_handle_error(BTA_HF_CLIENT_AT_RESULT_CME, code);
+}
+
+static void bta_hf_client_handle_vgm(UINT32 value)
+{
+ APPL_TRACE_DEBUG("%s %lu", __FUNCTION__, value);
+
+ if(value <= BTA_HF_CLIENT_VGM_MAX)
+ {
+ bta_hf_client_evt_val(BTA_HF_CLIENT_MIC_EVT, value);
+ }
+}
+
+static void bta_hf_client_handle_vgs(UINT32 value)
+{
+ APPL_TRACE_DEBUG("%s %lu", __FUNCTION__, value);
+
+ if(value <= BTA_HF_CLIENT_VGS_MAX)
+ {
+ bta_hf_client_evt_val(BTA_HF_CLIENT_SPK_EVT, value);
+ }
+}
+
+static void bta_hf_client_handle_bvra(UINT32 value)
+{
+ APPL_TRACE_DEBUG("%s %lu", __FUNCTION__, value);
+
+ if (value > 1)
+ {
+ return;
+ }
+
+ bta_hf_client_evt_val(BTA_HF_CLIENT_VOICE_REC_EVT, value);
+}
+
+static void bta_hf_client_handle_clip(char *numstr, UINT32 type)
+{
+ APPL_TRACE_DEBUG("%s %u %s", __FUNCTION__, type, numstr);
+
+ bta_hf_client_clip(numstr);
+}
+
+static void bta_hf_client_handle_ccwa(char *numstr, UINT32 type)
+{
+ APPL_TRACE_DEBUG("%s %u %s", __FUNCTION__, type, numstr);
+
+ bta_hf_client_ccwa(numstr);
+}
+
+static void bta_hf_client_handle_cops(char *opstr, UINT32 mode)
+{
+ APPL_TRACE_DEBUG("%s %u %s", __FUNCTION__, mode, opstr);
+
+ bta_hf_client_operator_name(opstr);
+}
+
+static void bta_hf_client_handle_binp(char *numstr)
+{
+ APPL_TRACE_DEBUG("%s %s", __FUNCTION__, numstr);
+
+ bta_hf_client_binp(numstr);
+}
+
+static void bta_hf_client_handle_clcc(UINT16 idx, UINT16 dir, UINT16 status, UINT16 mode, UINT16 mpty, char *numstr, UINT16 type)
+{
+ APPL_TRACE_DEBUG("%s idx: %u dir: %u status: %u mode: %u mpty: %u",
+ __FUNCTION__, idx, dir, status, mode, mpty);
+
+ if (numstr)
+ {
+ APPL_TRACE_DEBUG("%s number: %s type: %u", __FUNCTION__, numstr, type);
+ }
+
+ bta_hf_client_clcc(idx, dir, status, mpty, numstr);
+}
+
+static void bta_hf_client_handle_cnum( char *numstr, UINT16 type, UINT16 service)
+{
+ APPL_TRACE_DEBUG("%s number: %s type: %u service: %u", __FUNCTION__, numstr, type, service);
+
+ /* TODO: should number be modified according to type? */
+ bta_hf_client_cnum(numstr, service);
+}
+
+static void bta_hf_client_handle_btrh( UINT16 code)
+{
+ APPL_TRACE_DEBUG("%s %lu", __FUNCTION__, code);
+
+ bta_hf_client_evt_val(BTA_HF_CLIENT_BTRH_EVT, code);
+}
+
+/******************************************************************************
+**
+** COMMON AT EVENTS PARSING FUNCTIONS
+**
+*******************************************************************************/
+
+/* Check if prefix match and skip spaces if any */
+#define AT_CHECK_EVENT(buf, event) \
+ if (strncmp("\r\n"event, buf,sizeof("\r\n"event) - 1) != 0) return buf; \
+ buf += sizeof("\r\n"event) - 1; \
+ while (*buf == ' ') buf++;
+
+/* check for <cr><lf> and forward buffer if match */
+#define AT_CHECK_RN(buf) \
+ if (strncmp("\r\n", buf, sizeof("\r\n") - 1) != 0) { \
+ APPL_TRACE_DEBUG("%s missing end <cr><lf>", __FUNCTION__); \
+ return NULL;} \
+ buf += sizeof("\r\n") - 1;
+
+/* skip rest of AT string up to <cr> */
+#define AT_SKIP_REST(buf) while(*buf != '\r') buf++;
+
+static char *bta_hf_client_parse_ok(char *buffer)
+{
+ AT_CHECK_EVENT(buffer, "OK");
+ AT_CHECK_RN(buffer);
+
+ bta_hf_client_handle_ok();
+
+ return buffer;
+}
+
+static char *bta_hf_client_parse_error(char *buffer)
+{
+ AT_CHECK_EVENT(buffer, "ERROR");
+ AT_CHECK_RN(buffer);
+
+ bta_hf_client_handle_error(BTA_HF_CLIENT_AT_RESULT_ERROR, 0);
+
+ return buffer;
+}
+
+static char *bta_hf_client_parse_ring(char *buffer)
+{
+ AT_CHECK_EVENT(buffer, "RING");
+ AT_CHECK_RN(buffer);
+
+ bta_hf_client_handle_ring();
+
+ return buffer;
+}
+
+/* generic uint32 parser */
+static char *bta_hf_client_parse_uint32(char *buffer, void (*handler_callback)(UINT32))
+{
+ UINT32 value;
+ int res;
+ int offset;
+
+ res = sscanf(buffer, "%u%n", &value, &offset);
+ if (res < 1)
+ {
+ return NULL;
+ }
+
+ buffer += offset;
+
+ AT_CHECK_RN(buffer);
+
+ handler_callback(value);
+ return buffer;
+}
+
+static char *bta_hf_client_parse_brsf(char *buffer)
+{
+ AT_CHECK_EVENT(buffer, "+BRSF:");
+
+ return bta_hf_client_parse_uint32(buffer, bta_hf_client_handle_brsf);
+}
+
+static char *bta_hf_client_parse_cind_values(char *buffer)
+{
+ /* value and its position */
+ UINT16 index = 0;
+ UINT32 value = 0;
+
+ int offset;
+ int res;
+
+ while((res = sscanf(buffer, "%u%n", &value, &offset)) > 0)
+ {
+ /* decides if its valid index and value, if yes stores it */
+ bta_hf_client_handle_cind_value(index, value);
+
+ buffer += offset;
+
+ /* check if more values are present */
+ if (*buffer != ',')
+ {
+ break;
+ }
+
+ index++;
+ buffer++;
+ }
+
+ if (res > 0)
+ {
+ AT_CHECK_RN(buffer);
+ return buffer;
+ }
+
+ return NULL;
+}
+
+static char *bta_hf_client_parse_cind_list(char *buffer)
+{
+ int offset;
+ char name[129];
+ UINT32 min, max;
+ UINT32 index = 0;
+ int res;
+
+ while ((res = sscanf(buffer, "(\"%128[^\"]\",(%u%*[-,]%u))%n", name, &min, &max, &offset)) > 2)
+ {
+ bta_hf_client_handle_cind_list_item(name, min, max, index);
+ buffer += offset;
+ index++;
+
+ if (*buffer != ',')
+ {
+ break;
+ }
+
+ buffer++;
+ }
+
+ if (res > 2)
+ {
+ AT_CHECK_RN(buffer);
+ return buffer;
+ }
+
+ return NULL;
+}
+
+static char *bta_hf_client_parse_cind(char *buffer)
+{
+ AT_CHECK_EVENT(buffer, "+CIND:");
+
+ if(*buffer == '(')
+ return bta_hf_client_parse_cind_list(buffer);
+
+ return bta_hf_client_parse_cind_values(buffer);
+}
+
+static char *bta_hf_client_parse_chld(char *buffer)
+{
+ AT_CHECK_EVENT(buffer, "+CHLD:");
+
+ if (*buffer != '(')
+ {
+ return NULL;
+ }
+
+ buffer++;
+
+ while(*buffer != '\0')
+ {
+ if(strncmp("0",buffer, 1) == 0)
+ {
+ bta_hf_client_handle_chld(BTA_HF_CLIENT_CHLD_REL);
+ buffer++;
+ }
+ else if(strncmp("1x",buffer, 2) == 0)
+ {
+ bta_hf_client_handle_chld(BTA_HF_CLIENT_CHLD_REL_X);
+ buffer += 2;
+ }
+ else if(strncmp("1",buffer, 1) == 0)
+ {
+ bta_hf_client_handle_chld(BTA_HF_CLIENT_CHLD_REL_ACC);
+ buffer++;
+ }
+ else if(strncmp("2x",buffer, 2) == 0)
+ {
+ bta_hf_client_handle_chld(BTA_HF_CLIENT_CHLD_PRIV_X);
+ buffer += 2;
+ }
+ else if(strncmp("2",buffer, 1) == 0)
+ {
+ bta_hf_client_handle_chld(BTA_HF_CLIENT_CHLD_HOLD_ACC);
+ buffer++;
+ }
+ else if(strncmp("3",buffer, 1) == 0)
+ {
+ bta_hf_client_handle_chld(BTA_HF_CLIENT_CHLD_MERGE);
+ buffer++;
+ }
+ else if(strncmp("4",buffer, 1) == 0)
+ {
+ bta_hf_client_handle_chld(BTA_HF_CLIENT_CHLD_MERGE_DETACH);
+ buffer++;
+ }
+ else
+ {
+ return NULL;
+ }
+
+ if (*buffer == ',')
+ {
+ buffer++;
+ continue;
+ }
+
+ if (*buffer == ')')
+ {
+ buffer++;
+ break;
+ }
+
+ return NULL;
+ }
+
+ AT_CHECK_RN(buffer);
+
+ return buffer;
+}
+
+static char *bta_hf_client_parse_ciev(char *buffer)
+{
+ UINT32 index, value;
+ int res;
+ int offset;
+
+ AT_CHECK_EVENT(buffer, "+CIEV:");
+
+ res = sscanf(buffer, "%u,%u%n", &index, &value, &offset);
+ if(res < 2)
+ {
+ return NULL;
+ }
+
+ buffer += offset;
+
+ AT_CHECK_RN(buffer);
+
+ bta_hf_client_handle_ciev(index, value);
+ return buffer;
+}
+
+static char *bta_hf_client_parse_bcs(char *buffer)
+{
+ AT_CHECK_EVENT(buffer, "+BCS:");
+
+ return bta_hf_client_parse_uint32(buffer, bta_hf_client_handle_bcs);
+}
+
+static char *bta_hf_client_parse_bsir(char *buffer)
+{
+ AT_CHECK_EVENT(buffer, "+BSIR:");
+
+ return bta_hf_client_parse_uint32(buffer, bta_hf_client_handle_bsir);
+}
+
+static char *bta_hf_client_parse_cmeerror(char *buffer)
+{
+ AT_CHECK_EVENT(buffer, "+CME ERROR:");
+
+ return bta_hf_client_parse_uint32(buffer, bta_hf_client_handle_cmeerror);
+}
+
+static char *bta_hf_client_parse_vgm(char *buffer)
+{
+ AT_CHECK_EVENT(buffer, "+VGM:");
+
+ return bta_hf_client_parse_uint32(buffer, bta_hf_client_handle_vgm);
+}
+
+static char *bta_hf_client_parse_vgme(char *buffer)
+{
+ AT_CHECK_EVENT(buffer, "+VGM=");
+
+ return bta_hf_client_parse_uint32(buffer, bta_hf_client_handle_vgm);
+}
+
+static char *bta_hf_client_parse_vgs(char *buffer)
+{
+ AT_CHECK_EVENT(buffer, "+VGS:");
+
+ return bta_hf_client_parse_uint32(buffer, bta_hf_client_handle_vgs);
+}
+
+static char *bta_hf_client_parse_vgse(char *buffer)
+{
+ AT_CHECK_EVENT(buffer, "+VGS=");
+
+ return bta_hf_client_parse_uint32(buffer, bta_hf_client_handle_vgs);
+}
+
+static char *bta_hf_client_parse_bvra(char *buffer)
+{
+ AT_CHECK_EVENT(buffer, "+BVRA:");
+
+ return bta_hf_client_parse_uint32(buffer, bta_hf_client_handle_bvra);
+}
+
+static char *bta_hf_client_parse_clip(char *buffer)
+{
+ /* spec forces 32 chars, plus \0 here */
+ char number[33];
+ UINT32 type = 0;
+ int res;
+ int offset;
+
+ AT_CHECK_EVENT(buffer, "+CLIP:");
+
+ /* there might be something more after %lu but HFP doesn't care */
+ res = sscanf(buffer, "\"%32[^\"]\",%u%n", number, &type, &offset);
+ if(res < 2)
+ {
+ return NULL;
+ }
+
+ buffer += offset;
+
+ AT_SKIP_REST(buffer);
+
+ AT_CHECK_RN(buffer);
+
+ bta_hf_client_handle_clip(number, type);
+ return buffer;
+}
+
+/* in HFP context there is no difference between ccwa and clip */
+static char *bta_hf_client_parse_ccwa(char *buffer)
+{
+ /* ac to spec 32 chars max, plus \0 here */
+ char number[33];
+ UINT32 type = 0;
+ int res ;
+ int offset;
+
+ AT_CHECK_EVENT(buffer, "+CCWA:");
+
+ /* there might be something more after %lu but HFP doesn't care */
+ res = sscanf(buffer, "\"%32[^\"]\",%u%n", number, &type, &offset);
+ if(res < 2)
+ {
+ return NULL;
+ }
+
+ buffer += offset;
+
+ AT_SKIP_REST(buffer);
+
+ AT_CHECK_RN(buffer);
+
+ bta_hf_client_handle_ccwa(number, type);
+ return buffer;
+}
+
+static char *bta_hf_client_parse_cops(char *buffer)
+{
+ UINT8 mode;
+ /* spec forces 16 chars max, plus \0 here */
+ char opstr[17];
+ int res;
+ int offset;
+
+ AT_CHECK_EVENT(buffer, "+COPS:");
+
+ /* TODO: Not sure if operator string actually can contain escaped " char inside */
+ res = sscanf(buffer, "%hhi,0,\"%16[^\"]\"%n", &mode, opstr, &offset);
+ if(res < 2)
+ {
+ return NULL;
+ }
+
+ buffer += offset;
+
+ AT_SKIP_REST(buffer);
+
+ AT_CHECK_RN(buffer);
+
+ bta_hf_client_handle_cops(opstr, mode);
+ return buffer;
+}
+
+static char *bta_hf_client_parse_binp(char *buffer)
+{
+ /* HFP only supports phone number as BINP data */
+ /* phone number is 32 chars plus one for \0*/
+ char numstr[33];
+ int res;
+ int offset;
+
+ AT_CHECK_EVENT(buffer, "+BINP:");
+
+ res = sscanf(buffer, "\"%32[^\"]\"\r\n%n", numstr, &offset);
+ if(res < 1)
+ {
+ return NULL;
+ }
+
+ buffer += offset;
+
+ /* some phones might sent type as well, just skip it */
+ AT_SKIP_REST(buffer);
+
+ AT_CHECK_RN(buffer);
+
+ bta_hf_client_handle_binp(numstr);
+ return buffer;
+}
+
+static char *bta_hf_client_parse_clcc(char *buffer)
+{
+ UINT16 idx, dir, status, mode, mpty;
+ char numstr[33]; /* spec forces 32 chars, plus one for \0*/
+ UINT16 type;
+ int res;
+ int offset;
+
+ AT_CHECK_EVENT(buffer, "+CLCC:");
+
+ res = sscanf(buffer, "%hu,%hu,%hu,%hu,%hu%n",
+ &idx, &dir, &status, &mode, &mpty, &offset);
+ if (res < 5)
+ {
+ return NULL;
+ }
+
+ buffer += offset;
+
+ /* check optional part */
+ if (*buffer == ',')
+ {
+ int res2;
+
+ res2 = sscanf(buffer, ",\"%32[^\"]\",%hu%n", numstr, &type, &offset);
+ if (res2 < 0)
+ {
+ return NULL;
+ }
+
+ if (res2 == 0)
+ {
+ res2 = sscanf(buffer, ",\"\",%hu%n", &type, &offset);
+ if (res < 0)
+ {
+ return NULL;
+ }
+
+ /* numstr is not matched in second attempt, correct this */
+ res2++;
+ numstr[0] = '\0';
+ }
+
+ if (res2 < 2)
+ {
+ return NULL;
+ }
+
+ res += res2;
+ buffer += offset;
+ }
+
+ AT_CHECK_RN(buffer);
+
+ if(res > 6)
+ {
+ /* we also have last two optional parameters */
+ bta_hf_client_handle_clcc(idx, dir, status, mode, mpty, numstr, type);
+ }
+ else
+ {
+ /* we didn't get the last two parameters */
+ bta_hf_client_handle_clcc(idx, dir, status, mode, mpty, NULL, 0);
+ }
+
+ return buffer;
+}
+
+static char *bta_hf_client_parse_cnum(char *buffer)
+{
+ char numstr[33]; /* spec forces 32 chars, plus one for \0*/
+ UINT16 type;
+ UINT16 service = 0; /* 0 in case this optional parameter is not being sent */
+ int res;
+ int offset;
+
+ AT_CHECK_EVENT(buffer, "+CNUM:");
+
+ res = sscanf(buffer, ",\"%32[^\"]\",%hu,,%hu%n", numstr, &type, &service, &offset);
+ if(res < 0)
+ {
+ return NULL;
+ }
+
+ if (res == 0)
+ {
+ res = sscanf(buffer, ",\"\",%hu,,%hu%n", &type, &service, &offset);
+ if (res < 0)
+ {
+ return NULL;
+ }
+
+ /* numstr is not matched in second attempt, correct this */
+ res++;
+ numstr[0] = '\0';
+ }
+
+ if (res < 3)
+ {
+ return NULL;
+ }
+
+ buffer += offset;
+
+ AT_CHECK_RN(buffer);
+
+ /* service is optional */
+ if(res == 2)
+ {
+ bta_hf_client_handle_cnum(numstr, type, service);
+ return buffer;
+ }
+
+ if (service != 4 && service != 5)
+ {
+ return NULL;
+ }
+
+ bta_hf_client_handle_cnum(numstr, type, service);
+ return buffer;
+}
+
+static char *bta_hf_client_parse_btrh(char *buffer)
+{
+ UINT16 code = 0;
+ int res;
+ int offset;
+
+ AT_CHECK_EVENT(buffer, "+BTRH:");
+
+ res = sscanf(buffer, "%hu%n", &code, &offset);
+ if(res < 1)
+ {
+ return NULL;
+ }
+
+ buffer += offset;
+
+ AT_CHECK_RN(buffer);
+
+ bta_hf_client_handle_btrh(code);
+ return buffer;
+}
+
+static char *bta_hf_client_parse_busy(char *buffer)
+{
+ AT_CHECK_EVENT(buffer, "BUSY");
+ AT_CHECK_RN(buffer);
+
+ bta_hf_client_handle_error(BTA_HF_CLIENT_AT_RESULT_BUSY, 0);
+
+ return buffer;
+}
+
+static char *bta_hf_client_parse_delayed(char *buffer)
+{
+ AT_CHECK_EVENT(buffer, "DELAYED");
+ AT_CHECK_RN(buffer);
+
+ bta_hf_client_handle_error(BTA_HF_CLIENT_AT_RESULT_DELAY, 0);
+
+ return buffer;
+}
+
+static char *bta_hf_client_parse_no_carrier(char *buffer)
+{
+ AT_CHECK_EVENT(buffer, "NO CARRIER");
+ AT_CHECK_RN(buffer);
+
+ bta_hf_client_handle_error(BTA_HF_CLIENT_AT_RESULT_NO_CARRIER, 0);
+
+ return buffer;
+}
+
+static char *bta_hf_client_parse_no_answer(char *buffer)
+{
+ AT_CHECK_EVENT(buffer, "NO ANSWER");
+ AT_CHECK_RN(buffer);
+
+ bta_hf_client_handle_error(BTA_HF_CLIENT_AT_RESULT_NO_ANSWER, 0);
+
+ return buffer;
+}
+
+static char *bta_hf_client_parse_blacklisted(char *buffer)
+{
+ AT_CHECK_EVENT(buffer, "BLACKLISTED");
+ AT_CHECK_RN(buffer);
+
+ bta_hf_client_handle_error(BTA_HF_CLIENT_AT_RESULT_BLACKLISTED, 0);
+
+ return buffer;
+}
+
+static char *bta_hf_client_skip_unknown(char *buffer)
+{
+ char *start;
+ char *tmp;
+
+ tmp = strstr(buffer, "\r\n");
+ if (tmp == NULL)
+ {
+ return NULL;
+ }
+
+ buffer += 2;
+ start = buffer;
+
+ tmp = strstr(buffer, "\r\n");
+ if (tmp == NULL)
+ {
+ return NULL;
+ }
+
+ buffer = tmp + 2;
+
+ APPL_TRACE_DEBUG("%s %.*s", __FUNCTION__, buffer - start - 2, start);
+
+ return buffer;
+}
+
+
+/******************************************************************************
+** SUPPORTED EVENT MESSAGES
+*******************************************************************************/
+
+/* returned values are as follow:
+ * != NULL && != buf : match and parsed ok
+ * == NULL : match but parse failed
+ * != NULL && == buf : no match
+ */
+typedef char* (*tBTA_HF_CLIENT_PARSER_CALLBACK)(char*);
+
+static const tBTA_HF_CLIENT_PARSER_CALLBACK bta_hf_client_parser_cb[] =
+{
+ bta_hf_client_parse_ok,
+ bta_hf_client_parse_error,
+ bta_hf_client_parse_ring,
+ bta_hf_client_parse_brsf,
+ bta_hf_client_parse_cind,
+ bta_hf_client_parse_ciev,
+ bta_hf_client_parse_chld,
+ bta_hf_client_parse_bcs,
+ bta_hf_client_parse_bsir,
+ bta_hf_client_parse_cmeerror,
+ bta_hf_client_parse_vgm,
+ bta_hf_client_parse_vgme,
+ bta_hf_client_parse_vgs,
+ bta_hf_client_parse_vgse,
+ bta_hf_client_parse_bvra,
+ bta_hf_client_parse_clip,
+ bta_hf_client_parse_ccwa,
+ bta_hf_client_parse_cops,
+ bta_hf_client_parse_binp,
+ bta_hf_client_parse_clcc,
+ bta_hf_client_parse_cnum,
+ bta_hf_client_parse_btrh,
+ bta_hf_client_parse_busy,
+ bta_hf_client_parse_delayed,
+ bta_hf_client_parse_no_carrier,
+ bta_hf_client_parse_no_answer,
+ bta_hf_client_parse_blacklisted,
+ bta_hf_client_skip_unknown
+};
+
+/* calculate supported event list length */
+static const UINT16 bta_hf_client_psraser_cb_count =
+ sizeof(bta_hf_client_parser_cb) / sizeof(bta_hf_client_parser_cb[0]);
+
+#ifdef BTA_HF_CLIENT_AT_DUMP
+static void bta_hf_client_dump_at(void)
+{
+ char dump[(4 * BTA_HF_CLIENT_AT_PARSER_MAX_LEN) + 1];
+ char *p1, *p2;
+
+ p1 = bta_hf_client_cb.scb.at_cb.buf;
+ p2 = dump;
+
+ while (*p1 != '\0')
+ {
+ if (*p1 == '\r')
+ {
+ strlcpy(p2, "<cr>", 4);
+ p2 += 4;
+ }
+ else if (*p1 == '\n')
+ {
+ strlcpy(p2, "<lf>", 4);
+ p2 += 4;
+ }
+ else
+ {
+ *p2 = *p1;
+ p2++;
+ }
+ p1++;
+ }
+
+ *p2 = '\0';
+
+ APPL_TRACE_DEBUG("%s %s", __FUNCTION__, dump);
+}
+#endif
+
+static void bta_hf_client_at_parse_start(void)
+{
+ char *buf = bta_hf_client_cb.scb.at_cb.buf;
+
+ APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+#ifdef BTA_HF_CLIENT_AT_DUMP
+ bta_hf_client_dump_at();
+#endif
+
+ while(*buf != '\0')
+ {
+ int i;
+ char *tmp = NULL;
+
+ for(i = 0; i < bta_hf_client_psraser_cb_count; i++)
+ {
+ tmp = bta_hf_client_parser_cb[i](buf);
+ if (tmp == NULL)
+ {
+ APPL_TRACE_ERROR("HFPCient: AT event/reply parsing failed, skipping");
+ tmp = bta_hf_client_skip_unknown(buf);
+ break;
+ }
+
+ /* matched or unknown skipped, if unknown failed tmp is NULL so
+ this is also handled */
+ if (tmp != buf)
+ {
+ buf = tmp;
+ break;
+ }
+ }
+
+ /* could not skip unknown (received garbage?)... disconnect */
+ if (tmp == NULL)
+ {
+ APPL_TRACE_ERROR("HFPCient: could not skip unknown AT event, disconnecting");
+ bta_hf_client_at_reset();
+ bta_hf_client_sm_execute(BTA_HF_CLIENT_API_CLOSE_EVT, NULL);
+ return;
+ }
+
+ buf = tmp;
+ }
+}
+
+static BOOLEAN bta_hf_client_check_at_complete(void)
+{
+ BOOLEAN ret = FALSE;
+ tBTA_HF_CLIENT_AT_CB *at_cb = &bta_hf_client_cb.scb.at_cb;
+
+ if (at_cb->offset >= BTA_HF_CLIENT_AT_EVENT_MIN_LEN)
+ {
+ if (at_cb->buf[at_cb->offset - 2] == '\r' && at_cb->buf[at_cb->offset - 1] == '\n')
+ {
+ ret = TRUE;
+ }
+ }
+
+ APPL_TRACE_DEBUG("%s %d", __FUNCTION__, ret);
+
+ return ret;
+}
+
+static void bta_hf_client_at_clear_buf(void)
+{
+ memset(bta_hf_client_cb.scb.at_cb.buf, 0, sizeof(bta_hf_client_cb.scb.at_cb.buf));
+ bta_hf_client_cb.scb.at_cb.offset = 0;
+}
+
+/******************************************************************************
+**
+** MAIN PARSING FUNCTION
+**
+**
+*******************************************************************************/
+void bta_hf_client_at_parse(char *buf, unsigned int len)
+{
+ APPL_TRACE_DEBUG("%s offset: %u len: %u", __FUNCTION__, bta_hf_client_cb.scb.at_cb.offset, len);
+
+ if (len + bta_hf_client_cb.scb.at_cb.offset > BTA_HF_CLIENT_AT_PARSER_MAX_LEN)
+ {
+ char tmp_buff[BTA_HF_CLIENT_AT_PARSER_MAX_LEN];
+ unsigned int tmp = bta_hf_client_cb.scb.at_cb.offset;
+ unsigned int space_left = BTA_HF_CLIENT_AT_PARSER_MAX_LEN - bta_hf_client_cb.scb.at_cb.offset;
+
+ APPL_TRACE_DEBUG("%s overrun, trying to recover", __FUNCTION__);
+
+ /* fill up parser buffer */
+ memcpy(bta_hf_client_cb.scb.at_cb.buf + bta_hf_client_cb.scb.at_cb.offset, buf, space_left);
+ len -= space_left;
+ buf += space_left;
+ bta_hf_client_cb.scb.at_cb.offset += space_left;
+
+ /* find end of last complete command before proceeding */
+ while(bta_hf_client_check_at_complete() == FALSE)
+ {
+ if (bta_hf_client_cb.scb.at_cb.offset == 0) {
+ APPL_TRACE_ERROR("HFPClient: AT parser buffer overrun, disconnecting");
+
+ bta_hf_client_at_reset();
+ bta_hf_client_sm_execute(BTA_HF_CLIENT_API_CLOSE_EVT, NULL);
+ return;
+ }
+
+ bta_hf_client_cb.scb.at_cb.offset--;
+ }
+
+ /* cut buffer to complete AT event and keep cut data */
+ tmp += space_left - bta_hf_client_cb.scb.at_cb.offset;
+ memcpy(tmp_buff, bta_hf_client_cb.scb.at_cb.buf + bta_hf_client_cb.scb.at_cb.offset, tmp);
+ bta_hf_client_cb.scb.at_cb.buf[bta_hf_client_cb.scb.at_cb.offset] = '\0';
+
+ /* parse */
+ bta_hf_client_at_parse_start();
+ bta_hf_client_at_clear_buf();
+
+ /* recover cut data */
+ memcpy(bta_hf_client_cb.scb.at_cb.buf, tmp_buff, tmp);
+ bta_hf_client_cb.scb.at_cb.offset += tmp;
+ }
+
+ memcpy(bta_hf_client_cb.scb.at_cb.buf + bta_hf_client_cb.scb.at_cb.offset, buf, len);
+ bta_hf_client_cb.scb.at_cb.offset += len;
+
+ /* If last event is complete, parsing can be started */
+ if (bta_hf_client_check_at_complete() == TRUE)
+ {
+ bta_hf_client_at_parse_start();
+ bta_hf_client_at_clear_buf();
+ }
+}
+
+void bta_hf_client_send_at_brsf(void)
+{
+ char buf[BTA_HF_CLIENT_AT_MAX_LEN];
+ int at_len;
+
+ APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+ at_len = snprintf(buf, sizeof(buf), "AT+BRSF=%u\r", bta_hf_client_cb.scb.features);
+
+ bta_hf_client_send_at(BTA_HF_CLIENT_AT_BRSF , buf, at_len);
+}
+
+void bta_hf_client_send_at_bac(void)
+{
+ char *buf;
+
+ APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+ if (bta_hf_client_cb.msbc_enabled)
+ {
+ buf = "AT+BAC=1,2\r";
+ }
+ else
+ {
+ buf = "AT+BAC=1\r";
+ }
+
+ bta_hf_client_send_at(BTA_HF_CLIENT_AT_BAC, buf, strlen(buf));
+}
+
+void bta_hf_client_send_at_bcs(UINT32 codec)
+{
+ char buf[BTA_HF_CLIENT_AT_MAX_LEN];
+ int at_len;
+
+ APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+ at_len = snprintf(buf, sizeof(buf), "AT+BCS=%u\r", codec);
+
+ bta_hf_client_send_at(BTA_HF_CLIENT_AT_BCS, buf, at_len);
+}
+
+void bta_hf_client_send_at_cind(BOOLEAN status)
+{
+ char *buf;
+ tBTA_HF_CLIENT_AT_CMD cmd;
+
+ APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+ if (status)
+ {
+ buf = "AT+CIND?\r";
+ cmd = BTA_HF_CLIENT_AT_CIND_STATUS;
+ }
+ else
+ {
+ buf = "AT+CIND=?\r";
+ cmd = BTA_HF_CLIENT_AT_CIND;
+ }
+
+ bta_hf_client_send_at(cmd, buf, strlen(buf));
+}
+
+void bta_hf_client_send_at_cmer(BOOLEAN activate)
+{
+ char *buf;
+
+ APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+ if (activate)
+ buf = "AT+CMER=3,0,0,1\r";
+ else
+ buf = "AT+CMER=3,0,0,0\r";
+
+ bta_hf_client_send_at(BTA_HF_CLIENT_AT_CMER, buf, strlen(buf));
+}
+
+void bta_hf_client_send_at_chld(char cmd, UINT32 idx)
+{
+ char buf[BTA_HF_CLIENT_AT_MAX_LEN];
+ int at_len;
+
+ APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+ if (idx > 0)
+ at_len = snprintf(buf, sizeof(buf), "AT+CHLD=%c%u\r", cmd, idx);
+ else
+ at_len = snprintf(buf, sizeof(buf), "AT+CHLD=%c\r", cmd);
+
+ bta_hf_client_send_at(BTA_HF_CLIENT_AT_CHLD, buf, at_len);
+}
+
+void bta_hf_client_send_at_clip(BOOLEAN activate)
+{
+ char *buf;
+
+ APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+ if (activate)
+ buf = "AT+CLIP=1\r";
+ else
+ buf = "AT+CLIP=0\r";
+
+ bta_hf_client_send_at(BTA_HF_CLIENT_AT_CLIP, buf, strlen(buf));
+}
+
+void bta_hf_client_send_at_ccwa(BOOLEAN activate)
+{
+ char *buf;
+
+ APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+ if (activate)
+ buf = "AT+CCWA=1\r";
+ else
+ buf = "AT+CCWA=0\r";
+
+ bta_hf_client_send_at(BTA_HF_CLIENT_AT_CCWA, buf, strlen(buf));
+}
+
+
+void bta_hf_client_send_at_cmee(BOOLEAN activate)
+{
+ char *buf;
+
+ APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+ if (activate)
+ buf = "AT+CMEE=1\r";
+ else
+ buf = "AT+CMEE=0\r";
+
+ bta_hf_client_send_at(BTA_HF_CLIENT_AT_CMEE, buf, strlen(buf));
+}
+
+void bta_hf_client_send_at_cops(BOOLEAN query)
+{
+ char *buf;
+
+ APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+ if (!service_availability)
+ {
+ APPL_TRACE_DEBUG("Skip AT+COPS no service");
+ return;
+ }
+ if (query)
+ buf = "AT+COPS?\r";
+ else
+ buf = "AT+COPS=3,0\r";
+
+ bta_hf_client_send_at(BTA_HF_CLIENT_AT_COPS, buf, strlen(buf));
+}
+
+void bta_hf_client_send_at_clcc(void)
+{
+ char *buf;
+
+ APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+ buf = "AT+CLCC\r";
+
+ bta_hf_client_send_at(BTA_HF_CLIENT_AT_CLCC, buf, strlen(buf));
+}
+
+void bta_hf_client_send_at_bvra(BOOLEAN enable)
+{
+ char *buf;
+
+ APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+ if (enable)
+ buf = "AT+BVRA=1\r";
+ else
+ buf = "AT+BVRA=0\r";
+
+ bta_hf_client_send_at(BTA_HF_CLIENT_AT_BVRA, buf, strlen(buf));
+}
+
+void bta_hf_client_send_at_vgs(UINT32 volume)
+{
+ char buf[BTA_HF_CLIENT_AT_MAX_LEN];
+ int at_len;
+
+ APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+ at_len = snprintf(buf, sizeof(buf), "AT+VGS=%u\r", volume);
+
+ bta_hf_client_send_at(BTA_HF_CLIENT_AT_VGS, buf, at_len);
+}
+
+void bta_hf_client_send_at_vgm(UINT32 volume)
+{
+ char buf[BTA_HF_CLIENT_AT_MAX_LEN];
+ int at_len;
+
+ APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+ at_len = snprintf(buf, sizeof(buf), "AT+VGM=%u\r", volume);
+
+ bta_hf_client_send_at(BTA_HF_CLIENT_AT_VGM, buf, at_len);
+}
+
+void bta_hf_client_send_at_atd(char *number, UINT32 memory)
+{
+ char buf[BTA_HF_CLIENT_AT_MAX_LEN];
+ int at_len;
+
+ APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+ if (number[0] != '\0')
+ {
+ at_len = snprintf(buf, sizeof(buf), "ATD%s;\r", number);
+ }
+ else
+ {
+ at_len = snprintf(buf, sizeof(buf), "ATD>%u;\r", memory);
+ }
+
+ bta_hf_client_send_at(BTA_HF_CLIENT_AT_ATD, buf, at_len);
+}
+
+void bta_hf_client_send_at_bldn(void)
+{
+ char *buf;
+
+ APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+ buf = "AT+BLDN\r";
+
+ bta_hf_client_send_at(BTA_HF_CLIENT_AT_BLDN, buf, strlen(buf));
+}
+
+void bta_hf_client_send_at_ata(void)
+{
+ char *buf;
+
+ APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+ buf = "ATA\r";
+
+ bta_hf_client_send_at(BTA_HF_CLIENT_AT_ATA, buf, strlen(buf));
+}
+
+void bta_hf_client_send_at_chup(void)
+{
+ char *buf;
+
+ APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+ buf = "AT+CHUP\r";
+
+ bta_hf_client_send_at(BTA_HF_CLIENT_AT_CHUP, buf, strlen(buf));
+}
+
+void bta_hf_client_send_at_btrh(BOOLEAN query, UINT32 val)
+{
+ char buf[BTA_HF_CLIENT_AT_MAX_LEN];
+ int at_len;
+
+ APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+ if (query == TRUE)
+ {
+ at_len = snprintf(buf, sizeof(buf), "AT+BTRH?\r");
+ }
+ else
+ {
+ at_len = snprintf(buf, sizeof(buf), "AT+BTRH=%u\r", val);
+ }
+
+ bta_hf_client_send_at(BTA_HF_CLIENT_AT_BTRH, buf, at_len);
+}
+
+void bta_hf_client_send_at_vts(char code)
+{
+ char buf[BTA_HF_CLIENT_AT_MAX_LEN];
+ int at_len;
+
+ APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+ at_len = snprintf(buf, sizeof(buf), "AT+VTS=%c\r", code);
+
+ bta_hf_client_send_at(BTA_HF_CLIENT_AT_VTS, buf, at_len);
+}
+
+void bta_hf_client_send_at_bcc(void)
+{
+ char *buf;
+
+ APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+ buf = "AT+BCC\r";
+
+ bta_hf_client_send_at(BTA_HF_CLIENT_AT_BCC, buf, strlen(buf));
+}
+
+void bta_hf_client_send_at_cnum(void)
+{
+ char *buf;
+
+ APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+ if (!service_availability)
+ {
+ APPL_TRACE_DEBUG("Skip AT+CNUM no Service");
+ return;
+ }
+ buf = "AT+CNUM\r";
+
+ bta_hf_client_send_at(BTA_HF_CLIENT_AT_CNUM, buf, strlen(buf));
+}
+
+void bta_hf_client_send_at_nrec(void)
+{
+ char *buf;
+
+ APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+ if (!(bta_hf_client_cb.scb.peer_features & BTA_HF_CLIENT_PEER_FEAT_ECNR))
+ {
+ APPL_TRACE_DEBUG("Remote does not support NREC.");
+ return;
+ }
+
+ buf = "AT+NREC=0\r";
+
+ bta_hf_client_send_at(BTA_HF_CLIENT_AT_NREC, buf, strlen(buf));
+}
+
+void bta_hf_client_send_at_binp(UINT32 action)
+{
+ char buf[BTA_HF_CLIENT_AT_MAX_LEN];
+ int at_len;
+
+ APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+ at_len = snprintf(buf, sizeof(buf), "AT+BINP=%u\r", action);
+
+ bta_hf_client_send_at(BTA_HF_CLIENT_AT_BINP, buf, at_len);
+}
+
+void bta_hf_client_send_at_bia(void)
+{
+ char buf[BTA_HF_CLIENT_AT_MAX_LEN];
+ int at_len;
+ int i;
+
+ APPL_TRACE_DEBUG("%s", __FUNCTION__);
+ if (bta_hf_client_cb.scb.peer_version < HFP_VERSION_1_6)
+ {
+ APPL_TRACE_DEBUG("Remote does not Support AT+BIA");
+ return;
+ }
+
+ at_len = snprintf(buf, sizeof(buf), "AT+BIA=");
+
+ for(i = 0; i < BTA_HF_CLIENT_AT_INDICATOR_COUNT; i++)
+ {
+ int sup = bta_hf_client_cb.scb.at_cb.indicator_lookup[i] == -1 ? 0 : 1;
+
+ at_len += snprintf(buf + at_len, sizeof(buf) - at_len, "%u,", sup);
+ }
+
+ buf[at_len - 1] = '\r';
+
+ bta_hf_client_send_at(BTA_HF_CLIENT_AT_BIA, buf, at_len);
+}
+
+void bta_hf_client_at_init(void)
+{
+ memset(&bta_hf_client_cb.scb.at_cb, 0, sizeof(tBTA_HF_CLIENT_AT_CB));
+ bta_hf_client_at_reset();
+}
+
+void bta_hf_client_at_reset(void)
+{
+ int i;
+
+ bta_hf_client_stop_at_resp_timer();
+ bta_hf_client_stop_at_hold_timer();
+
+ bta_hf_client_clear_queued_at();
+
+ bta_hf_client_at_clear_buf();
+
+ for (i = 0; i < BTA_HF_CLIENT_AT_INDICATOR_COUNT; i++)
+ {
+ bta_hf_client_cb.scb.at_cb.indicator_lookup[i] = -1;
+ }
+
+ bta_hf_client_cb.scb.at_cb.current_cmd = BTA_HF_CLIENT_AT_NONE;
+}
diff --git a/bta/hf_client/bta_hf_client_at.h b/bta/hf_client/bta_hf_client_at.h
new file mode 100644
index 0000000..917c605
--- /dev/null
+++ b/bta/hf_client/bta_hf_client_at.h
@@ -0,0 +1,117 @@
+/******************************************************************************
+ *
+ * Copyright (c) 2014 The Android Open Source Project
+ * Copyright (C) 2003-2012 Broadcom Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+/*****************************************************************************
+** Data types
+*****************************************************************************/
+
+/* ASCII character string of arguments to the AT command */
+#define BTA_HF_CLIENT_AT_MAX_LEN 512
+
+/* AT command table element */
+typedef struct
+{
+ const char *p_cmd; /* AT command string */
+ UINT8 arg_type; /* allowable argument type syntax */
+ UINT8 fmt; /* whether arg is int or string */
+ UINT8 min; /* minimum value for int arg */
+ INT16 max; /* maximum value for int arg */
+} tBTA_AG_AT_CMD;
+
+/* callback function executed when command is parsed */
+typedef void (tBTA_AG_AT_CMD_CBACK)(void *p_user, UINT16 cmd, UINT8 arg_type,
+ char *p_arg, INT16 int_arg);
+
+/* callback function executed to send "ERROR" result code */
+typedef void (tBTA_AG_AT_ERR_CBACK)(void *p_user, BOOLEAN unknown, char *p_arg);
+
+enum
+{
+ BTA_HF_CLIENT_AT_NONE,
+ BTA_HF_CLIENT_AT_BRSF,
+ BTA_HF_CLIENT_AT_BAC,
+ BTA_HF_CLIENT_AT_CIND,
+ BTA_HF_CLIENT_AT_CIND_STATUS,
+ BTA_HF_CLIENT_AT_CMER,
+ BTA_HF_CLIENT_AT_CHLD,
+ BTA_HF_CLIENT_AT_CMEE,
+ BTA_HF_CLIENT_AT_BIA,
+ BTA_HF_CLIENT_AT_CLIP,
+ BTA_HF_CLIENT_AT_CCWA,
+ BTA_HF_CLIENT_AT_COPS,
+ BTA_HF_CLIENT_AT_CLCC,
+ BTA_HF_CLIENT_AT_BVRA,
+ BTA_HF_CLIENT_AT_VGS,
+ BTA_HF_CLIENT_AT_VGM,
+ BTA_HF_CLIENT_AT_ATD,
+ BTA_HF_CLIENT_AT_BLDN,
+ BTA_HF_CLIENT_AT_ATA,
+ BTA_HF_CLIENT_AT_CHUP,
+ BTA_HF_CLIENT_AT_BTRH,
+ BTA_HF_CLIENT_AT_VTS,
+ BTA_HF_CLIENT_AT_BCC,
+ BTA_HF_CLIENT_AT_BCS,
+ BTA_HF_CLIENT_AT_CNUM,
+ BTA_HF_CLIENT_AT_NREC,
+ BTA_HF_CLIENT_AT_BINP,
+};
+
+typedef UINT8 tBTA_HF_CLIENT_AT_CMD;
+
+/* Maximum combined buffer for received AT events string */
+#define BTA_HF_CLIENT_AT_PARSER_MAX_LEN 4096
+
+/* This structure holds prepared AT command queued for sending */
+struct queued_at_cmd{
+ tBTA_HF_CLIENT_AT_CMD cmd;
+ char buf[BTA_HF_CLIENT_AT_MAX_LEN];
+ UINT16 buf_len;
+ struct queued_at_cmd *next;
+};
+typedef struct queued_at_cmd tBTA_HF_CLIENT_AT_QCMD;
+
+/* Maximum number of indicators */
+#define BTA_HF_CLIENT_AT_INDICATOR_COUNT 20
+
+/* AT command parsing control block */
+typedef struct
+{
+ char buf[BTA_HF_CLIENT_AT_PARSER_MAX_LEN + 1]; /* extra byte to always have \0 at the end */
+ unsigned int offset;
+ tBTA_HF_CLIENT_AT_CMD current_cmd;
+ tBTA_HF_CLIENT_AT_QCMD *queued_cmd;
+
+ TIMER_LIST_ENT resp_timer; /* AT response timer */
+ BOOLEAN resp_timer_on; /* TRUE if AT response timer is active */
+
+ TIMER_LIST_ENT hold_timer; /* AT hold timer */
+ BOOLEAN hold_timer_on; /* TRUE if AT hold timer is active */
+
+ /* CIND: lookup table to store the sequence of incoming indicators and their values
+ so when their values come later, we know which value in sequence match certain indicator */
+ int indicator_lookup[BTA_HF_CLIENT_AT_INDICATOR_COUNT];
+
+} tBTA_HF_CLIENT_AT_CB;
+
+/*****************************************************************************
+** Functions
+*****************************************************************************/
+
+void bta_hf_client_at_init(void);
+void bta_hf_client_at_reset(void);
diff --git a/bta/hf_client/bta_hf_client_cmd.c b/bta/hf_client/bta_hf_client_cmd.c
new file mode 100644
index 0000000..59d7b5f
--- /dev/null
+++ b/bta/hf_client/bta_hf_client_cmd.c
@@ -0,0 +1,88 @@
+/******************************************************************************
+ *
+ * Copyright (c) 2014 The Android Open Source Project
+ * Copyright (C) 2003-2012 Broadcom Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+#include "bta_hf_client_int.h"
+#include "stdio.h"
+
+void bta_hf_client_send_at_cmd(tBTA_HF_CLIENT_DATA *p_data)
+{
+ tBTA_HF_CLIENT_DATA_VAL *p_val = (tBTA_HF_CLIENT_DATA_VAL *)p_data;
+ char buf[BTA_HF_CLIENT_AT_MAX_LEN];
+
+ switch(p_val->uint8_val)
+ {
+ case BTA_HF_CLIENT_AT_CMD_VTS:
+ bta_hf_client_send_at_vts((char)p_val->uint32_val1);
+ break;
+ case BTA_HF_CLIENT_AT_CMD_BTRH:
+ bta_hf_client_send_at_btrh(FALSE, p_val->uint32_val1);
+ break;
+ case BTA_HF_CLIENT_AT_CMD_CHUP:
+ bta_hf_client_send_at_chup();
+ break;
+ case BTA_HF_CLIENT_AT_CMD_CHLD:
+ /* expects ascii code for command */
+ bta_hf_client_send_at_chld('0' + p_val->uint32_val1, p_val->uint32_val2);
+ break;
+ case BTA_HF_CLIENT_AT_CMD_BCC:
+ bta_hf_client_send_at_bcc();
+ break;
+ case BTA_HF_CLIENT_AT_CMD_CNUM:
+ bta_hf_client_send_at_cnum();
+ break;
+ case BTA_HF_CLIENT_AT_CMD_ATA:
+ bta_hf_client_send_at_ata();
+ break;
+ case BTA_HF_CLIENT_AT_CMD_COPS:
+ bta_hf_client_send_at_cops(TRUE);
+ break;
+ case BTA_HF_CLIENT_AT_CMD_ATD:
+ bta_hf_client_send_at_atd(p_val->str, p_val->uint32_val1);
+ break;
+ case BTA_HF_CLIENT_AT_CMD_VGM:
+ bta_hf_client_send_at_vgm(p_val->uint32_val1);
+ break;
+ case BTA_HF_CLIENT_AT_CMD_VGS:
+ bta_hf_client_send_at_vgs(p_val->uint32_val1);
+ break;
+ case BTA_HF_CLIENT_AT_CMD_BVRA:
+ bta_hf_client_send_at_bvra(p_val->uint32_val1 == 0 ? FALSE : TRUE);
+ break;
+ case BTA_HF_CLIENT_AT_CMD_CLCC:
+ bta_hf_client_send_at_clcc();
+ break;
+ case BTA_HF_CLIENT_AT_CMD_BINP:
+ bta_hf_client_send_at_binp(p_val->uint32_val1);
+ break;
+ case BTA_HF_CLIENT_AT_CMD_BLDN:
+ bta_hf_client_send_at_bldn();
+ break;
+ case BTA_HF_CLIENT_AT_CMD_NREC:
+ bta_hf_client_send_at_nrec();
+ break;
+ default:
+ APPL_TRACE_ERROR("Default case");
+ snprintf(buf,BTA_HF_CLIENT_AT_MAX_LEN,
+ "Cmd %d 1st arg %u 2nd arg %u string arg %s",
+ p_val->uint8_val, p_val->uint32_val1,
+ p_val->uint32_val2, p_val->str);
+ APPL_TRACE_ERROR("%s ", buf);
+ break;
+ }
+}
diff --git a/bta/hf_client/bta_hf_client_int.h b/bta/hf_client/bta_hf_client_int.h
new file mode 100644
index 0000000..fbd5082
--- /dev/null
+++ b/bta/hf_client/bta_hf_client_int.h
@@ -0,0 +1,294 @@
+/******************************************************************************
+ *
+ * Copyright (c) 2014 The Android Open Source Project
+ * Copyright (C) 2003-2012 Broadcom Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+#include "bta_sys.h"
+#include "bta_api.h"
+#include "bta_hf_client_api.h"
+#include "bta_hf_client_at.h"
+
+/*****************************************************************************
+** Constants
+*****************************************************************************/
+#define HFP_VERSION_1_1 0x0101
+#define HFP_VERSION_1_5 0x0105
+#define HFP_VERSION_1_6 0x0106
+
+/* RFCOMM MTU SIZE */
+#define BTA_HF_CLIENT_MTU 256
+
+/* profile role for connection */
+#define BTA_HF_CLIENT_ACP 0 /* accepted connection */
+#define BTA_HF_CLIENT_INT 1 /* initiating connection */
+
+/* Timer to wait for retry in case of collision */
+#ifndef BTA_HF_CLIENT_COLLISION_TIMER
+#define BTA_HF_CLIENT_COLLISION_TIMER 2411
+#endif
+
+enum
+{
+ /* these events are handled by the state machine */
+ BTA_HF_CLIENT_API_REGISTER_EVT = BTA_SYS_EVT_START(BTA_ID_HS),
+ BTA_HF_CLIENT_API_DEREGISTER_EVT,
+ BTA_HF_CLIENT_API_OPEN_EVT,
+ BTA_HF_CLIENT_API_CLOSE_EVT,
+ BTA_HF_CLIENT_API_AUDIO_OPEN_EVT,
+ BTA_HF_CLIENT_API_AUDIO_CLOSE_EVT,
+ BTA_HF_CLIENT_RFC_OPEN_EVT,
+ BTA_HF_CLIENT_RFC_CLOSE_EVT,
+ BTA_HF_CLIENT_RFC_SRV_CLOSE_EVT,
+ BTA_HF_CLIENT_RFC_DATA_EVT,
+ BTA_HF_CLIENT_DISC_ACP_RES_EVT,
+ BTA_HF_CLIENT_DISC_INT_RES_EVT,
+ BTA_HF_CLIENT_DISC_OK_EVT,
+ BTA_HF_CLIENT_DISC_FAIL_EVT,
+ BTA_HF_CLIENT_SCO_OPEN_EVT,
+ BTA_HF_CLIENT_SCO_CLOSE_EVT,
+ BTA_HF_CLIENT_SEND_AT_CMD_EVT,
+ BTA_HF_CLIENT_MAX_EVT,
+
+ /* these events are handled outside of the state machine */
+ BTA_HF_CLIENT_API_ENABLE_EVT,
+ BTA_HF_CLIENT_API_DISABLE_EVT
+};
+
+/*****************************************************************************
+** Data types
+*****************************************************************************/
+
+/* data type for BTA_HF_CLIENT_API_ENABLE_EVT */
+typedef struct
+{
+ BT_HDR hdr;
+ tBTA_HF_CLIENT_CBACK *p_cback;
+} tBTA_HF_CLIENT_API_ENABLE;
+
+/* data type for BTA_HF_CLIENT_API_REGISTER_EVT */
+typedef struct
+{
+ BT_HDR hdr;
+ tBTA_HF_CLIENT_CBACK *p_cback;
+ tBTA_SEC sec_mask;
+ tBTA_HF_CLIENT_FEAT features;
+ char name[BTA_SERVICE_NAME_LEN+1];
+} tBTA_HF_CLIENT_API_REGISTER;
+
+/* data type for BTA_HF_CLIENT_API_OPEN_EVT */
+typedef struct
+{
+ BT_HDR hdr;
+ BD_ADDR bd_addr;
+ tBTA_SEC sec_mask;
+} tBTA_HF_CLIENT_API_OPEN;
+
+/* data type for BTA_HF_CLIENT_DISC_RESULT_EVT */
+typedef struct
+{
+ BT_HDR hdr;
+ UINT16 status;
+} tBTA_HF_CLIENT_DISC_RESULT;
+
+/* data type for RFCOMM events */
+typedef struct
+{
+ BT_HDR hdr;
+ UINT16 port_handle;
+} tBTA_HF_CLIENT_RFC;
+
+/* generic purpose data type for other events */
+typedef struct
+{
+ BT_HDR hdr;
+ BOOLEAN bool_val;
+ UINT8 uint8_val;
+ UINT32 uint32_val1;
+ UINT32 uint32_val2;
+ char str[BTA_HF_CLIENT_NUMBER_LEN + 1];
+} tBTA_HF_CLIENT_DATA_VAL;
+
+/* union of all event datatypes */
+typedef union
+{
+ BT_HDR hdr;
+ tBTA_HF_CLIENT_API_ENABLE api_enable;
+ tBTA_HF_CLIENT_API_REGISTER api_register;
+ tBTA_HF_CLIENT_API_OPEN api_open;
+ tBTA_HF_CLIENT_DISC_RESULT disc_result;
+ tBTA_HF_CLIENT_RFC rfc;
+ tBTA_HF_CLIENT_DATA_VAL val;
+
+} tBTA_HF_CLIENT_DATA;
+
+/* type for each service control block */
+typedef struct
+{
+ UINT16 serv_handle; /* RFCOMM server handle */
+ BD_ADDR peer_addr; /* peer bd address */
+ tSDP_DISCOVERY_DB *p_disc_db; /* pointer to discovery database */
+ UINT16 conn_handle; /* RFCOMM handle of connected service */
+ tBTA_SEC serv_sec_mask; /* server security mask */
+ tBTA_SEC cli_sec_mask; /* client security mask */
+ tBTA_HF_CLIENT_FEAT features; /* features registered by application */
+ tBTA_HF_CLIENT_PEER_FEAT peer_features; /* peer device features */
+ tBTA_HF_CLIENT_CHLD_FEAT chld_features; /* call handling features */
+ UINT16 peer_version; /* profile version of peer device */
+ UINT8 peer_scn; /* peer scn */
+ UINT8 role; /* initiator/acceptor role */
+ UINT16 sco_idx; /* SCO handle */
+ UINT8 sco_state; /* SCO state variable */
+ BOOLEAN sco_close_rfc; /* TRUE if also close RFCOMM after SCO */
+ BOOLEAN retry_with_sco_only;
+ BOOLEAN deregister; /* TRUE if service shutting down */
+ BOOLEAN svc_conn; /* set to TRUE when service level connection is up */
+ BOOLEAN send_at_reply; /* set to TRUE to notify framework about AT results */
+ tBTA_HF_CLIENT_AT_CB at_cb; /* AT Parser control block */
+ UINT8 state; /* state machine state */
+ tBTM_SCO_CODEC_TYPE negotiated_codec; /* negotiated codec */
+ TIMER_LIST_ENT colli_timer; /* Collision timer */
+ BOOLEAN colli_tmr_on; /* TRUE if collision timer is active */
+} tBTA_HF_CLIENT_SCB;
+
+/* sco states */
+enum
+{
+ BTA_HF_CLIENT_SCO_SHUTDOWN_ST, /* no listening, no connection */
+ BTA_HF_CLIENT_SCO_LISTEN_ST, /* listening */
+ BTA_HF_CLIENT_SCO_OPENING_ST, /* connection opening */
+ BTA_HF_CLIENT_SCO_OPEN_CL_ST, /* opening connection being closed */
+ BTA_HF_CLIENT_SCO_OPEN_ST, /* open */
+ BTA_HF_CLIENT_SCO_CLOSING_ST, /* closing */
+ BTA_HF_CLIENT_SCO_CLOSE_OP_ST, /* closing sco being opened */
+ BTA_HF_CLIENT_SCO_SHUTTING_ST /* sco shutting down */
+};
+
+/* type for AG control block */
+typedef struct
+{
+ tBTA_HF_CLIENT_SCB scb; /* service control block */
+ UINT32 sdp_handle;
+ UINT8 scn;
+ tBTA_HF_CLIENT_CBACK *p_cback; /* application callback */
+ BOOLEAN msbc_enabled;
+} tBTA_HF_CLIENT_CB;
+
+/*****************************************************************************
+** Global data
+*****************************************************************************/
+
+/* control block declaration */
+extern tBTA_HF_CLIENT_CB bta_hf_client_cb;
+
+/*****************************************************************************
+** Function prototypes
+*****************************************************************************/
+
+/* main functions */
+extern void bta_hf_client_scb_init(void);
+extern void bta_hf_client_scb_disable(void);
+extern BOOLEAN bta_hf_client_hdl_event(BT_HDR *p_msg);
+extern void bta_hf_client_sm_execute(UINT16 event,
+ tBTA_HF_CLIENT_DATA *p_data);
+extern void bta_hf_client_slc_seq(BOOLEAN error);
+extern void bta_hf_client_collision_cback (tBTA_SYS_CONN_STATUS status, UINT8 id,
+ UINT8 app_id, BD_ADDR peer_addr);
+extern void bta_hf_client_resume_open ();
+
+/* SDP functions */
+extern BOOLEAN bta_hf_client_add_record(char *p_service_name,
+ UINT8 scn, tBTA_HF_CLIENT_FEAT features,
+ UINT32 sdp_handle);
+extern void bta_hf_client_create_record(tBTA_HF_CLIENT_DATA *p_data);
+extern void bta_hf_client_del_record(tBTA_HF_CLIENT_DATA *p_data);
+extern BOOLEAN bta_hf_client_sdp_find_attr(void);
+extern void bta_hf_client_do_disc(void);
+extern void bta_hf_client_free_db(tBTA_HF_CLIENT_DATA *p_data);
+
+/* RFCOMM functions */
+extern void bta_hf_client_setup_port(UINT16 handle);
+extern void bta_hf_client_start_server(void);
+extern void bta_hf_client_close_server(void);
+extern void bta_hf_client_rfc_do_open(tBTA_HF_CLIENT_DATA *p_data);
+extern void bta_hf_client_rfc_do_close(tBTA_HF_CLIENT_DATA *p_data);
+
+/* SCO functions */
+extern void bta_hf_client_sco_listen(tBTA_HF_CLIENT_DATA *p_data);
+extern void bta_hf_client_sco_shutdown(tBTA_HF_CLIENT_DATA *p_data);
+extern void bta_hf_client_sco_conn_open(tBTA_HF_CLIENT_DATA *p_data);
+extern void bta_hf_client_sco_conn_close(tBTA_HF_CLIENT_DATA *p_data);
+extern void bta_hf_client_sco_open(tBTA_HF_CLIENT_DATA *p_data);
+extern void bta_hf_client_sco_close(tBTA_HF_CLIENT_DATA *p_data);
+extern void bta_hf_client_cback_sco(UINT8 event);
+
+/* AT command functions */
+extern void bta_hf_client_at_parse(char *buf, unsigned int len);
+extern void bta_hf_client_send_at_brsf(void);
+extern void bta_hf_client_send_at_bac(void);
+extern void bta_hf_client_send_at_cind(BOOLEAN status);
+extern void bta_hf_client_send_at_cmer(BOOLEAN activate);
+extern void bta_hf_client_send_at_chld(char cmd, UINT32 idx);
+extern void bta_hf_client_send_at_clip(BOOLEAN activate);
+extern void bta_hf_client_send_at_ccwa(BOOLEAN activate);
+extern void bta_hf_client_send_at_cmee(BOOLEAN activate);
+extern void bta_hf_client_send_at_cops(BOOLEAN query);
+extern void bta_hf_client_send_at_clcc(void);
+extern void bta_hf_client_send_at_bvra(BOOLEAN enable);
+extern void bta_hf_client_send_at_vgs(UINT32 volume);
+extern void bta_hf_client_send_at_vgm(UINT32 volume);
+extern void bta_hf_client_send_at_atd(char *number, UINT32 memory);
+extern void bta_hf_client_send_at_bldn(void);
+extern void bta_hf_client_send_at_ata(void);
+extern void bta_hf_client_send_at_chup(void);
+extern void bta_hf_client_send_at_btrh(BOOLEAN query, UINT32 val);
+extern void bta_hf_client_send_at_vts(char code);
+extern void bta_hf_client_send_at_bcc(void);
+extern void bta_hf_client_send_at_bcs(UINT32 codec);
+extern void bta_hf_client_send_at_cnum(void);
+extern void bta_hf_client_send_at_nrec(void);
+extern void bta_hf_client_send_at_binp(UINT32 action);
+extern void bta_hf_client_send_at_bia(void);
+
+/* Action functions */
+extern void bta_hf_client_register(tBTA_HF_CLIENT_DATA *p_data);
+extern void bta_hf_client_deregister(tBTA_HF_CLIENT_DATA *p_data);
+extern void bta_hf_client_start_dereg(tBTA_HF_CLIENT_DATA *p_data);
+extern void bta_hf_client_start_close(tBTA_HF_CLIENT_DATA *p_data);
+extern void bta_hf_client_start_open(tBTA_HF_CLIENT_DATA *p_data);
+extern void bta_hf_client_rfc_acp_open(tBTA_HF_CLIENT_DATA *p_data);
+extern void bta_hf_client_rfc_open(tBTA_HF_CLIENT_DATA *p_data);
+extern void bta_hf_client_rfc_fail(tBTA_HF_CLIENT_DATA *p_data);
+extern void bta_hf_client_disc_fail(tBTA_HF_CLIENT_DATA *p_data);
+extern void bta_hf_client_open_fail(tBTA_HF_CLIENT_DATA *p_data);
+extern void bta_hf_client_rfc_close(tBTA_HF_CLIENT_DATA *p_data);
+extern void bta_hf_client_disc_acp_res(tBTA_HF_CLIENT_DATA *p_data);
+extern void bta_hf_client_rfc_data(tBTA_HF_CLIENT_DATA *p_data);
+extern void bta_hf_client_disc_int_res(tBTA_HF_CLIENT_DATA *p_data);
+extern void bta_hf_client_svc_conn_open(tBTA_HF_CLIENT_DATA *p_data);
+extern void bta_hf_client_ind(tBTA_HF_CLIENT_IND_TYPE type, UINT16 value);
+extern void bta_hf_client_evt_val(tBTA_HF_CLIENT_EVT type, UINT16 value);
+extern void bta_hf_client_operator_name(char *name);
+extern void bta_hf_client_clip(char *number);
+extern void bta_hf_client_ccwa(char *number);
+extern void bta_hf_client_at_result(tBTA_HF_CLIENT_AT_RESULT_TYPE type, UINT16 cme);
+extern void bta_hf_client_clcc(UINT32 idx, BOOLEAN incoming, UINT8 status, BOOLEAN mpty, char *number);
+extern void bta_hf_client_cnum(char *number, UINT16 service);
+extern void bta_hf_client_binp(char *number);
+
+/* Commands handling functions */
+extern void bta_hf_client_dial(tBTA_HF_CLIENT_DATA *p_data);
+extern void bta_hf_client_send_at_cmd(tBTA_HF_CLIENT_DATA *p_data);
diff --git a/bta/hf_client/bta_hf_client_main.c b/bta/hf_client/bta_hf_client_main.c
new file mode 100644
index 0000000..27c00cb
--- /dev/null
+++ b/bta/hf_client/bta_hf_client_main.c
@@ -0,0 +1,668 @@
+/******************************************************************************
+ *
+ * Copyright (c) 2014 The Android Open Source Project
+ * Copyright (C) 2003-2012 Broadcom Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+#include <string.h>
+#include <stdlib.h>
+#include <cutils/properties.h>
+#include "bt_utils.h"
+#include "bta_api.h"
+#include "bta_sys.h"
+#include "bta_hf_client_api.h"
+#include "bta_hf_client_int.h"
+
+/* uncomment to enable extra debug */
+/* #define BTA_HF_CLIENT_DEBUG TRUE */
+
+#ifndef BTA_HF_CLIENT_DEBUG
+#define BTA_HF_CLIENT_DEBUG FALSE
+#endif
+
+#if BTA_HF_CLIENT_DEBUG == TRUE
+static char *bta_hf_client_evt_str(UINT16 event);
+static char *bta_hf_client_state_str(UINT8 state);
+#endif
+
+/* state machine states */
+enum
+{
+ BTA_HF_CLIENT_INIT_ST,
+ BTA_HF_CLIENT_OPENING_ST,
+ BTA_HF_CLIENT_OPEN_ST,
+ BTA_HF_CLIENT_CLOSING_ST
+};
+
+/* state machine action enumeration list */
+enum
+{
+ BTA_HF_CLIENT_REGISTER,
+ BTA_HF_CLIENT_DEREGISTER,
+ BTA_HF_CLIENT_START_DEREG,
+ BTA_HF_CLIENT_RFC_DO_CLOSE,
+ BTA_HF_CLIENT_START_CLOSE,
+ BTA_HF_CLIENT_START_OPEN,
+ BTA_HF_CLIENT_RFC_ACP_OPEN,
+ BTA_HF_CLIENT_SCO_LISTEN,
+ BTA_HF_CLIENT_SCO_CONN_OPEN,
+ BTA_HF_CLIENT_SCO_CONN_CLOSE,
+ BTA_HF_CLIENT_SCO_OPEN,
+ BTA_HF_CLIENT_SCO_CLOSE,
+ BTA_HF_CLIENT_SCO_SHUTDOWN,
+ BTA_HF_CLIENT_FREE_DB,
+ BTA_HF_CLIENT_OPEN_FAIL,
+ BTA_HF_CLIENT_RFC_OPEN,
+ BTA_HF_CLIENT_RFC_FAIL,
+ BTA_HF_CLIENT_DISC_INT_RES,
+ BTA_HF_CLIENT_RFC_DO_OPEN,
+ BTA_HF_CLIENT_DISC_FAIL,
+ BTA_HF_CLIENT_RFC_CLOSE,
+ BTA_HF_CLIENT_RFC_DATA,
+ BTA_HF_CLIENT_DISC_ACP_RES,
+ BTA_HF_CLIENT_SVC_CONN_OPEN,
+ BTA_HF_CLIENT_SEND_AT_CMD,
+ BTA_HF_CLIENT_NUM_ACTIONS,
+};
+
+#define BTA_HF_CLIENT_IGNORE BTA_HF_CLIENT_NUM_ACTIONS
+
+/* type for action functions */
+typedef void (*tBTA_HF_CLIENT_ACTION)(tBTA_HF_CLIENT_DATA *p_data);
+
+/* action functions table, indexed with action enum */
+const tBTA_HF_CLIENT_ACTION bta_hf_client_action[] =
+{
+/* BTA_HF_CLIENT_REGISTER */ bta_hf_client_register,
+/* BTA_HF_CLIENT_DEREGISTER */ bta_hf_client_deregister,
+/* BTA_HF_CLIENT_START_DEREG */ bta_hf_client_start_dereg,
+/* BTA_HF_CLIENT_RFC_DO_CLOSE */ bta_hf_client_rfc_do_close,
+/* BTA_HF_CLIENT_START_CLOSE */ bta_hf_client_start_close,
+/* BTA_HF_CLIENT_START_OPEN */ bta_hf_client_start_open,
+/* BTA_HF_CLIENT_RFC_ACP_OPEN */ bta_hf_client_rfc_acp_open,
+/* BTA_HF_CLIENT_SCO_LISTEN */ bta_hf_client_sco_listen,
+/* BTA_HF_CLIENT_SCO_CONN_OPEN */ bta_hf_client_sco_conn_open,
+/* BTA_HF_CLIENT_SCO_CONN_CLOSE*/ bta_hf_client_sco_conn_close,
+/* BTA_HF_CLIENT_SCO_OPEN */ bta_hf_client_sco_open,
+/* BTA_HF_CLIENT_SCO_CLOSE */ bta_hf_client_sco_close,
+/* BTA_HF_CLIENT_SCO_SHUTDOWN */ bta_hf_client_sco_shutdown,
+/* BTA_HF_CLIENT_FREE_DB */ bta_hf_client_free_db,
+/* BTA_HF_CLIENT_OPEN_FAIL */ bta_hf_client_open_fail,
+/* BTA_HF_CLIENT_RFC_OPEN */ bta_hf_client_rfc_open,
+/* BTA_HF_CLIENT_RFC_FAIL */ bta_hf_client_rfc_fail,
+/* BTA_HF_CLIENT_DISC_INT_RES */ bta_hf_client_disc_int_res,
+/* BTA_HF_CLIENT_RFC_DO_OPEN */ bta_hf_client_rfc_do_open,
+/* BTA_HF_CLIENT_DISC_FAIL */ bta_hf_client_disc_fail,
+/* BTA_HF_CLIENT_RFC_CLOSE */ bta_hf_client_rfc_close,
+/* BTA_HF_CLIENT_RFC_DATA */ bta_hf_client_rfc_data,
+/* BTA_HF_CLIENT_DISC_ACP_RES */ bta_hf_client_disc_acp_res,
+/* BTA_HF_CLIENT_SVC_CONN_OPEN */ bta_hf_client_svc_conn_open,
+/* BTA_HF_CLIENT_SEND_AT_CMD */ bta_hf_client_send_at_cmd,
+};
+
+/* state table information */
+#define BTA_HF_CLIENT_ACTIONS 2 /* number of actions */
+#define BTA_HF_CLIENT_NEXT_STATE 2 /* position of next state */
+#define BTA_HF_CLIENT_NUM_COLS 3 /* number of columns in state tables */
+
+/* state table for init state */
+const UINT8 bta_hf_client_st_init[][BTA_HF_CLIENT_NUM_COLS] =
+{
+/* Event Action 1 Action 2 Next state */
+/* API_REGISTER_EVT */ {BTA_HF_CLIENT_REGISTER, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_INIT_ST},
+/* API_DEREGISTER_EVT */ {BTA_HF_CLIENT_DEREGISTER, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_INIT_ST},
+/* API_OPEN_EVT */ {BTA_HF_CLIENT_START_OPEN, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_OPENING_ST},
+/* API_CLOSE_EVT */ {BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_INIT_ST},
+/* API_AUDIO_OPEN_EVT */ {BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_INIT_ST},
+/* API_AUDIO_CLOSE_EVT */ {BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_INIT_ST},
+/* RFC_OPEN_EVT */ {BTA_HF_CLIENT_RFC_ACP_OPEN, BTA_HF_CLIENT_SCO_LISTEN, BTA_HF_CLIENT_OPEN_ST},
+/* RFC_CLOSE_EVT */ {BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_INIT_ST},
+/* RFC_SRV_CLOSE_EVT */ {BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_INIT_ST},
+/* RFC_DATA_EVT */ {BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_INIT_ST},
+/* DISC_ACP_RES_EVT */ {BTA_HF_CLIENT_FREE_DB, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_INIT_ST},
+/* DISC_INT_RES_EVT */ {BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_INIT_ST},
+/* DISC_OK_EVT */ {BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_INIT_ST},
+/* DISC_FAIL_EVT */ {BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_INIT_ST},
+/* SCO_OPEN_EVT */ {BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_INIT_ST},
+/* SCO_CLOSE_EVT */ {BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_INIT_ST},
+/* SEND_AT_CMD_EVT */ {BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_INIT_ST},
+};
+
+/* state table for opening state */
+const UINT8 bta_hf_client_st_opening[][BTA_HF_CLIENT_NUM_COLS] =
+{
+/* Event Action 1 Action 2 Next state */
+/* API_REGISTER_EVT */ {BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_OPENING_ST},
+/* API_DEREGISTER_EVT */ {BTA_HF_CLIENT_RFC_DO_CLOSE, BTA_HF_CLIENT_START_DEREG, BTA_HF_CLIENT_CLOSING_ST},
+/* API_OPEN_EVT */ {BTA_HF_CLIENT_OPEN_FAIL, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_OPENING_ST},
+/* API_CLOSE_EVT */ {BTA_HF_CLIENT_RFC_DO_CLOSE, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_CLOSING_ST},
+/* API_AUDIO_OPEN_EVT */ {BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_OPENING_ST},
+/* API_AUDIO_CLOSE_EVT */ {BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_OPENING_ST},
+/* RFC_OPEN_EVT */ {BTA_HF_CLIENT_RFC_OPEN, BTA_HF_CLIENT_SCO_LISTEN, BTA_HF_CLIENT_OPEN_ST},
+/* RFC_CLOSE_EVT */ {BTA_HF_CLIENT_RFC_FAIL, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_INIT_ST},
+/* RFC_SRV_CLOSE_EVT */ {BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_OPENING_ST},
+/* RFC_DATA_EVT */ {BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_OPENING_ST},
+/* DISC_ACP_RES_EVT */ {BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_OPENING_ST},
+/* DISC_INT_RES_EVT */ {BTA_HF_CLIENT_DISC_INT_RES, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_OPENING_ST},
+/* DISC_OK_EVT */ {BTA_HF_CLIENT_RFC_DO_OPEN, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_OPENING_ST},
+/* DISC_FAIL_EVT */ {BTA_HF_CLIENT_DISC_FAIL, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_INIT_ST},
+/* SCO_OPEN_EVT */ {BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_OPENING_ST},
+/* SCO_CLOSE_EVT */ {BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_OPENING_ST},
+/* SEND_AT_CMD_EVT */ {BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_OPENING_ST},
+};
+
+/* state table for open state */
+const UINT8 bta_hf_client_st_open[][BTA_HF_CLIENT_NUM_COLS] =
+{
+/* Event Action 1 Action 2 Next state */
+/* API_REGISTER_EVT */ {BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_OPEN_ST},
+/* API_DEREGISTER_EVT */ {BTA_HF_CLIENT_START_CLOSE, BTA_HF_CLIENT_START_DEREG, BTA_HF_CLIENT_CLOSING_ST},
+/* API_OPEN_EVT */ {BTA_HF_CLIENT_OPEN_FAIL, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_OPEN_ST},
+/* API_CLOSE_EVT */ {BTA_HF_CLIENT_START_CLOSE, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_CLOSING_ST},
+/* API_AUDIO_OPEN_EVT */ {BTA_HF_CLIENT_SCO_OPEN, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_OPEN_ST},
+/* API_AUDIO_CLOSE_EVT */ {BTA_HF_CLIENT_SCO_CLOSE, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_OPEN_ST},
+/* RFC_OPEN_EVT */ {BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_OPEN_ST},
+/* RFC_CLOSE_EVT */ {BTA_HF_CLIENT_RFC_CLOSE, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_INIT_ST},
+/* RFC_SRV_CLOSE_EVT */ {BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_OPEN_ST},
+/* RFC_DATA_EVT */ {BTA_HF_CLIENT_RFC_DATA, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_OPEN_ST},
+/* DISC_ACP_RES_EVT */ {BTA_HF_CLIENT_DISC_ACP_RES, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_OPEN_ST},
+/* DISC_INT_RES_EVT */ {BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_OPEN_ST},
+/* DISC_OK_EVT */ {BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_OPEN_ST},
+/* DISC_FAIL_EVT */ {BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_OPEN_ST},
+/* SCO_OPEN_EVT */ {BTA_HF_CLIENT_SCO_CONN_OPEN, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_OPEN_ST},
+/* SCO_CLOSE_EVT */ {BTA_HF_CLIENT_SCO_CONN_CLOSE, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_OPEN_ST},
+/* SEND_AT_CMD_EVT */ {BTA_HF_CLIENT_SEND_AT_CMD, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_OPEN_ST},
+};
+
+/* state table for closing state */
+const UINT8 bta_hf_client_st_closing[][BTA_HF_CLIENT_NUM_COLS] =
+{
+/* Event Action 1 Action 2 Next state */
+/* API_REGISTER_EVT */ {BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_CLOSING_ST},
+/* API_DEREGISTER_EVT */ {BTA_HF_CLIENT_START_DEREG, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_CLOSING_ST},
+/* API_OPEN_EVT */ {BTA_HF_CLIENT_OPEN_FAIL, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_CLOSING_ST},
+/* API_CLOSE_EVT */ {BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_CLOSING_ST},
+/* API_AUDIO_OPEN_EVT */ {BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_CLOSING_ST},
+/* API_AUDIO_CLOSE_EVT */ {BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_CLOSING_ST},
+/* RFC_OPEN_EVT */ {BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_CLOSING_ST},
+/* RFC_CLOSE_EVT */ {BTA_HF_CLIENT_RFC_CLOSE, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_INIT_ST},
+/* RFC_SRV_CLOSE_EVT */ {BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_CLOSING_ST},
+/* RFC_DATA_EVT */ {BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_CLOSING_ST},
+/* DISC_ACP_RES_EVT */ {BTA_HF_CLIENT_FREE_DB, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_CLOSING_ST},
+/* DISC_INT_RES_EVT */ {BTA_HF_CLIENT_FREE_DB, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_INIT_ST},
+/* DISC_OK_EVT */ {BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_CLOSING_ST},
+/* DISC_FAIL_EVT */ {BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_CLOSING_ST},
+/* SCO_OPEN_EVT */ {BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_CLOSING_ST},
+/* SCO_CLOSE_EVT */ {BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_CLOSING_ST},
+/* SEND_AT_CMD_EVT */ {BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_CLOSING_ST},
+};
+
+/* type for state table */
+typedef const UINT8 (*tBTA_HF_CLIENT_ST_TBL)[BTA_HF_CLIENT_NUM_COLS];
+
+/* state table */
+const tBTA_HF_CLIENT_ST_TBL bta_hf_client_st_tbl[] =
+{
+ bta_hf_client_st_init,
+ bta_hf_client_st_opening,
+ bta_hf_client_st_open,
+ bta_hf_client_st_closing
+};
+
+/* HF Client control block */
+tBTA_HF_CLIENT_CB bta_hf_client_cb;
+
+/*******************************************************************************
+**
+** Function bta_hf_client_scb_init
+**
+** Description Initialize an HF_Client service control block.
+**
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_hf_client_scb_init(void)
+{
+ APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+ memset(&bta_hf_client_cb.scb, 0, sizeof(tBTA_HF_CLIENT_SCB));
+ bta_hf_client_cb.scb.sco_idx = BTM_INVALID_SCO_INDEX;
+ bta_hf_client_cb.scb.negotiated_codec = BTM_SCO_CODEC_CVSD;
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_scb_disable
+**
+** Description Disable a service control block.
+**
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_hf_client_scb_disable(void)
+{
+ APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+ bta_hf_client_scb_init();
+
+ (*bta_hf_client_cb.p_cback)(BTA_HF_CLIENT_DISABLE_EVT, NULL);
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_resume_open
+**
+** Description Resume opening process.
+**
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_hf_client_resume_open (void)
+{
+ APPL_TRACE_DEBUG ("%s", __FUNCTION__);
+
+ /* resume opening process. */
+ if (bta_hf_client_cb.scb.state == BTA_HF_CLIENT_INIT_ST)
+ {
+ bta_hf_client_cb.scb.state = BTA_HF_CLIENT_OPENING_ST;
+ bta_hf_client_start_open (NULL);
+ }
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_colli_timer_cback
+**
+** Description HF Client connection collision timer callback
+**
+**
+** Returns void
+**
+*******************************************************************************/
+static void bta_hf_client_colli_timer_cback (TIMER_LIST_ENT *p_tle)
+{
+ APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+ if (p_tle)
+ {
+ bta_hf_client_cb.scb.colli_tmr_on = FALSE;
+
+ /* If the peer haven't opened connection, restart opening process */
+ bta_hf_client_resume_open ();
+ }
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_collision_cback
+**
+** Description Get notified about collision.
+**
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_hf_client_collision_cback (tBTA_SYS_CONN_STATUS status, UINT8 id,
+ UINT8 app_id, BD_ADDR peer_addr)
+{
+ UNUSED(status);
+ UNUSED(app_id);
+ UNUSED(peer_addr);
+
+ if (bta_hf_client_cb.scb.state == BTA_HF_CLIENT_OPENING_ST)
+ {
+ if (id == BTA_ID_SYS) /* ACL collision */
+ {
+ APPL_TRACE_WARNING ("HF Client found collision (ACL) ...");
+ }
+ else if (id == BTA_ID_HS) /* RFCOMM collision */
+ {
+ APPL_TRACE_WARNING ("HF Client found collision (RFCOMM) ...");
+ }
+ else
+ {
+ APPL_TRACE_WARNING ("HF Client found collision (\?\?\?) ...");
+ }
+
+ bta_hf_client_cb.scb.state = BTA_HF_CLIENT_INIT_ST;
+
+ /* Cancel SDP if it had been started. */
+ if(bta_hf_client_cb.scb.p_disc_db)
+ {
+ (void)SDP_CancelServiceSearch (bta_hf_client_cb.scb.p_disc_db);
+ bta_hf_client_free_db(NULL);
+ }
+
+ /* reopen registered server */
+ /* Collision may be detected before or after we close servers. */
+ bta_hf_client_start_server();
+
+ /* Start timer to handle connection opening restart */
+ bta_hf_client_cb.scb.colli_timer.p_cback = (TIMER_CBACK*)&bta_hf_client_colli_timer_cback;
+ bta_sys_start_timer(&bta_hf_client_cb.scb.colli_timer, 0, BTA_HF_CLIENT_COLLISION_TIMER);
+ bta_hf_client_cb.scb.colli_tmr_on = TRUE;
+ }
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_api_enable
+**
+** Description Handle an API enable event.
+**
+**
+** Returns void
+**
+*******************************************************************************/
+static void bta_hf_client_api_enable(tBTA_HF_CLIENT_DATA *p_data)
+{
+ char value[PROPERTY_VALUE_MAX];
+
+ /* initialize control block */
+ memset(&bta_hf_client_cb, 0, sizeof(tBTA_HF_CLIENT_CB));
+
+ /* store callback function */
+ bta_hf_client_cb.p_cback = p_data->api_enable.p_cback;
+
+ /* check if mSBC support enabled */
+ property_get("ro.bluetooth.hfp.ver", value, "0");
+ if (strcmp(value,"1.6") == 0)
+ {
+ bta_hf_client_cb.msbc_enabled = TRUE;
+ }
+
+ bta_hf_client_cb.scb.negotiated_codec = BTM_SCO_CODEC_CVSD;
+
+ /* set same setting as AG does */
+ BTM_WriteVoiceSettings(AG_VOICE_SETTINGS);
+
+ bta_sys_collision_register (BTA_ID_HS, bta_hf_client_collision_cback);
+
+ /* call callback with enable event */
+ (*bta_hf_client_cb.p_cback)(BTA_HF_CLIENT_ENABLE_EVT, NULL);
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_api_disable
+**
+** Description Handle an API disable event.
+**
+**
+** Returns void
+**
+*******************************************************************************/
+static void bta_hf_client_api_disable(tBTA_HF_CLIENT_DATA *p_data)
+{
+ if (!bta_sys_is_register (BTA_ID_HS))
+ {
+ APPL_TRACE_ERROR("BTA HF Client is already disabled, ignoring ...");
+ return;
+ }
+
+ /* De-register with BTA system manager */
+ bta_sys_deregister(BTA_ID_HS);
+
+ bta_hf_client_sm_execute(BTA_HF_CLIENT_API_DEREGISTER_EVT, p_data);
+
+ bta_sys_collision_register (BTA_ID_HS, NULL);
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_hdl_event
+**
+** Description Data HF Client main event handling function.
+**
+**
+** Returns BOOLEAN
+**
+*******************************************************************************/
+BOOLEAN bta_hf_client_hdl_event(BT_HDR *p_msg)
+{
+#if BTA_HF_CLIENT_DEBUG == TRUE
+ APPL_TRACE_DEBUG("bta_hf_client_hdl_event %s (0x%x)", bta_hf_client_evt_str(p_msg->event), p_msg->event);
+#endif
+
+ switch (p_msg->event)
+ {
+ /* handle enable event */
+ case BTA_HF_CLIENT_API_ENABLE_EVT:
+ bta_hf_client_api_enable((tBTA_HF_CLIENT_DATA *) p_msg);
+ break;
+
+ /* handle disable event */
+ case BTA_HF_CLIENT_API_DISABLE_EVT:
+ bta_hf_client_api_disable((tBTA_HF_CLIENT_DATA *) p_msg);
+ break;
+
+ default:
+ bta_hf_client_sm_execute(p_msg->event, (tBTA_HF_CLIENT_DATA *) p_msg);
+ break;
+ }
+ return TRUE;
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_sm_execute
+**
+** Description State machine event handling function for HF Client
+**
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_hf_client_sm_execute(UINT16 event, tBTA_HF_CLIENT_DATA *p_data)
+{
+ tBTA_HF_CLIENT_ST_TBL state_table;
+ UINT8 action;
+ int i;
+
+#if BTA_HF_CLIENT_DEBUG == TRUE
+ UINT16 in_event = event;
+ UINT8 in_state = bta_hf_client_cb.scb.state;
+
+ /* Ignore displaying of AT results when not connected (Ignored in state machine) */
+ if (bta_hf_client_cb.scb.state == BTA_HF_CLIENT_OPEN_ST)
+ {
+ APPL_TRACE_EVENT("HF Client evt : State %d (%s), Event 0x%04x (%s)",
+ bta_hf_client_cb.scb.state,
+ bta_hf_client_state_str(bta_hf_client_cb.scb.state),
+ event, bta_hf_client_evt_str(event));
+ }
+#endif
+
+ event &= 0x00FF;
+ if (event >= (BTA_HF_CLIENT_MAX_EVT & 0x00FF))
+ {
+ APPL_TRACE_ERROR("HF Client evt out of range, ignoring...");
+ return;
+ }
+
+ /* look up the state table for the current state */
+ state_table = bta_hf_client_st_tbl[bta_hf_client_cb.scb.state];
+
+ /* set next state */
+ bta_hf_client_cb.scb.state = state_table[event][BTA_HF_CLIENT_NEXT_STATE];
+
+ /* execute action functions */
+ for (i = 0; i < BTA_HF_CLIENT_ACTIONS; i++)
+ {
+ if ((action = state_table[event][i]) != BTA_HF_CLIENT_IGNORE)
+ {
+ (*bta_hf_client_action[action])(p_data);
+ }
+ else
+ {
+ break;
+ }
+ }
+
+#if BTA_HF_CLIENT_DEBUG == TRUE
+ if (bta_hf_client_cb.scb.state != in_state)
+ {
+ APPL_TRACE_EVENT("BTA HF Client State Change: [%s] -> [%s] after Event [%s]",
+ bta_hf_client_state_str(in_state),
+ bta_hf_client_state_str(bta_hf_client_cb.scb.state),
+ bta_hf_client_evt_str(in_event));
+ }
+#endif
+}
+
+static void send_post_slc_cmd(void)
+{
+ bta_hf_client_cb.scb.at_cb.current_cmd = BTA_HF_CLIENT_AT_NONE;
+
+ bta_hf_client_send_at_bia();
+ bta_hf_client_send_at_ccwa(TRUE);
+ bta_hf_client_send_at_cmee(TRUE);
+ bta_hf_client_send_at_cops(FALSE);
+ bta_hf_client_send_at_btrh(TRUE, 0);
+ bta_hf_client_send_at_clip(TRUE);
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_slc_seq
+**
+** Description Handles AT commands sequence required for SLC creation
+**
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_hf_client_slc_seq(BOOLEAN error)
+{
+ APPL_TRACE_DEBUG("bta_hf_client_slc_seq cmd: %u", bta_hf_client_cb.scb.at_cb.current_cmd);
+
+ if (error) {
+ /* SLC establishment error, sent close rfcomm event */
+ APPL_TRACE_ERROR("HFPClient: Failed to create SLC due to AT error, disconnecting (%u)",
+ bta_hf_client_cb.scb.at_cb.current_cmd);
+
+ bta_hf_client_sm_execute(BTA_HF_CLIENT_API_CLOSE_EVT, NULL);
+ return;
+ }
+
+ if (bta_hf_client_cb.scb.svc_conn)
+ return;
+
+ switch (bta_hf_client_cb.scb.at_cb.current_cmd)
+ {
+ case BTA_HF_CLIENT_AT_NONE:
+ bta_hf_client_send_at_brsf();
+ break;
+
+ case BTA_HF_CLIENT_AT_BRSF:
+ if (bta_hf_client_cb.scb.peer_features & BTA_HF_CLIENT_PEER_CODEC)
+ {
+ bta_hf_client_send_at_bac();
+ break;
+ }
+
+ bta_hf_client_send_at_cind(FALSE);
+ break;
+
+ case BTA_HF_CLIENT_AT_BAC:
+ bta_hf_client_send_at_cind(FALSE);
+ break;
+
+ case BTA_HF_CLIENT_AT_CIND:
+ bta_hf_client_send_at_cind(TRUE);
+ break;
+
+ case BTA_HF_CLIENT_AT_CIND_STATUS:
+ bta_hf_client_send_at_cmer(TRUE);
+ break;
+
+ case BTA_HF_CLIENT_AT_CMER:
+ if (bta_hf_client_cb.scb.peer_features & BTA_HF_CLIENT_PEER_FEAT_3WAY)
+ {
+ bta_hf_client_send_at_chld('?', 0);
+ }
+ else
+ {
+ bta_hf_client_svc_conn_open(NULL);
+ send_post_slc_cmd();
+ }
+ break;
+
+ case BTA_HF_CLIENT_AT_CHLD:
+ bta_hf_client_svc_conn_open(NULL);
+ send_post_slc_cmd();
+ break;
+
+ default:
+ /* If happen there is a bug in SLC creation procedure... */
+ APPL_TRACE_ERROR("HFPClient: Failed to create SLCdue to unexpected AT command, disconnecting (%u)",
+ bta_hf_client_cb.scb.at_cb.current_cmd);
+
+ bta_hf_client_sm_execute(BTA_HF_CLIENT_API_CLOSE_EVT, NULL);
+ break;
+ }
+}
+
+#if BTA_HF_CLIENT_DEBUG == TRUE
+
+#ifndef CASE_RETURN_STR
+#define CASE_RETURN_STR(const) case const: return #const;
+#endif
+
+static char *bta_hf_client_evt_str(UINT16 event)
+{
+ switch (event)
+ {
+ CASE_RETURN_STR(BTA_HF_CLIENT_API_REGISTER_EVT)
+ CASE_RETURN_STR(BTA_HF_CLIENT_API_DEREGISTER_EVT)
+ CASE_RETURN_STR(BTA_HF_CLIENT_API_OPEN_EVT)
+ CASE_RETURN_STR(BTA_HF_CLIENT_API_CLOSE_EVT)
+ CASE_RETURN_STR(BTA_HF_CLIENT_API_AUDIO_OPEN_EVT)
+ CASE_RETURN_STR(BTA_HF_CLIENT_API_AUDIO_CLOSE_EVT)
+ CASE_RETURN_STR(BTA_HF_CLIENT_RFC_OPEN_EVT)
+ CASE_RETURN_STR(BTA_HF_CLIENT_RFC_CLOSE_EVT)
+ CASE_RETURN_STR(BTA_HF_CLIENT_RFC_SRV_CLOSE_EVT)
+ CASE_RETURN_STR(BTA_HF_CLIENT_RFC_DATA_EVT)
+ CASE_RETURN_STR(BTA_HF_CLIENT_DISC_ACP_RES_EVT)
+ CASE_RETURN_STR(BTA_HF_CLIENT_DISC_INT_RES_EVT)
+ CASE_RETURN_STR(BTA_HF_CLIENT_DISC_OK_EVT)
+ CASE_RETURN_STR(BTA_HF_CLIENT_DISC_FAIL_EVT)
+ CASE_RETURN_STR(BTA_HF_CLIENT_API_ENABLE_EVT)
+ CASE_RETURN_STR(BTA_HF_CLIENT_API_DISABLE_EVT)
+ CASE_RETURN_STR(BTA_HF_CLIENT_SCO_OPEN_EVT)
+ CASE_RETURN_STR(BTA_HF_CLIENT_SCO_CLOSE_EVT)
+ CASE_RETURN_STR(BTA_HF_CLIENT_SEND_AT_CMD_EVT)
+ default:
+ return "Unknown HF Client Event";
+ }
+}
+
+static char *bta_hf_client_state_str(UINT8 state)
+{
+ switch (state)
+ {
+ CASE_RETURN_STR(BTA_HF_CLIENT_INIT_ST)
+ CASE_RETURN_STR(BTA_HF_CLIENT_OPENING_ST)
+ CASE_RETURN_STR(BTA_HF_CLIENT_OPEN_ST)
+ CASE_RETURN_STR(BTA_HF_CLIENT_CLOSING_ST)
+ default:
+ return "Unknown HF Client State";
+ }
+}
+#endif
diff --git a/bta/hf_client/bta_hf_client_rfc.c b/bta/hf_client/bta_hf_client_rfc.c
new file mode 100644
index 0000000..4c73b5a
--- /dev/null
+++ b/bta/hf_client/bta_hf_client_rfc.c
@@ -0,0 +1,268 @@
+/******************************************************************************
+ *
+ * Copyright (c) 2014 The Android Open Source Project
+ * Copyright (C) 2004-2012 Broadcom Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * This file contains the audio gateway functions controlling the RFCOMM
+ * connections.
+ *
+ ******************************************************************************/
+
+#include <string.h>
+#include "bta_api.h"
+#include "bta_hf_client_int.h"
+#include "port_api.h"
+#include "bd.h"
+#include "bt_utils.h"
+
+/*******************************************************************************
+**
+** Function bta_hf_client_port_cback
+**
+** Description RFCOMM Port callback
+**
+**
+** Returns void
+**
+*******************************************************************************/
+static void bta_hf_client_port_cback(UINT32 code, UINT16 port_handle)
+{
+ BT_HDR *p_buf;
+ UNUSED(code);
+
+ /* ignore port events for port handles other than connected handle */
+ if (port_handle != bta_hf_client_cb.scb.conn_handle)
+ {
+ APPL_TRACE_DEBUG("bta_hf_client_port_cback ignoring handle:%d conn_handle = %d",
+ port_handle, bta_hf_client_cb.scb.conn_handle);
+ return;
+ }
+
+ if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
+ {
+ p_buf->event = BTA_HF_CLIENT_RFC_DATA_EVT;
+ bta_sys_sendmsg(p_buf);
+ }
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_mgmt_cback
+**
+** Description RFCOMM management callback
+**
+**
+** Returns void
+**
+*******************************************************************************/
+static void bta_hf_client_mgmt_cback(UINT32 code, UINT16 port_handle)
+{
+ tBTA_HF_CLIENT_RFC *p_buf;
+ UINT16 event;
+
+ APPL_TRACE_DEBUG("bta_hf_client_mgmt_cback : code = %d, port_handle = %d, conn_handle = %d, serv_handle = %d",
+ code, port_handle, bta_hf_client_cb.scb.conn_handle, bta_hf_client_cb.scb.serv_handle);
+
+ /* ignore close event for port handles other than connected handle */
+ if ((code != PORT_SUCCESS) && (port_handle != bta_hf_client_cb.scb.conn_handle))
+ {
+ APPL_TRACE_DEBUG("bta_hf_client_mgmt_cback ignoring handle:%d", port_handle);
+ return;
+ }
+
+ if (code == PORT_SUCCESS)
+ {
+ if ((bta_hf_client_cb.scb.conn_handle && (port_handle == bta_hf_client_cb.scb.conn_handle)) || /* outgoing connection */
+ (port_handle == bta_hf_client_cb.scb.serv_handle)) /* incoming connection */
+ {
+ event = BTA_HF_CLIENT_RFC_OPEN_EVT;
+ }
+ else
+ {
+ APPL_TRACE_ERROR ("bta_hf_client_mgmt_cback: PORT_SUCCESS, ignoring handle = %d", port_handle);
+ return;
+ }
+ }
+ /* distinguish server close events */
+ else if (port_handle == bta_hf_client_cb.scb.conn_handle)
+ {
+ event = BTA_HF_CLIENT_RFC_CLOSE_EVT;
+ }
+ else
+ {
+ event = BTA_HF_CLIENT_RFC_SRV_CLOSE_EVT;
+ }
+
+ if ((p_buf = (tBTA_HF_CLIENT_RFC *) GKI_getbuf(sizeof(tBTA_HF_CLIENT_RFC))) != NULL)
+ {
+ p_buf->hdr.event = event;
+ p_buf->port_handle = port_handle;
+ bta_sys_sendmsg(p_buf);
+ }
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_setup_port
+**
+** Description Setup RFCOMM port for use by HF Client.
+**
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_hf_client_setup_port(UINT16 handle)
+{
+ PORT_SetEventMask(handle, PORT_EV_RXCHAR);
+ PORT_SetEventCallback(handle, bta_hf_client_port_cback);
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_start_server
+**
+** Description Setup RFCOMM server for use by HF Client.
+**
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_hf_client_start_server(void)
+{
+ int i;
+ int port_status;
+
+ if (bta_hf_client_cb.scb.serv_handle > 0)
+ {
+ APPL_TRACE_DEBUG("%s already started, handle: %d", __FUNCTION__, bta_hf_client_cb.scb.serv_handle);
+ return;
+ }
+
+ BTM_SetSecurityLevel(FALSE, "", BTM_SEC_SERVICE_HF_HANDSFREE, bta_hf_client_cb.scb.serv_sec_mask,
+ BT_PSM_RFCOMM, BTM_SEC_PROTO_RFCOMM, bta_hf_client_cb.scn);
+
+ port_status = RFCOMM_CreateConnection(UUID_SERVCLASS_HF_HANDSFREE, bta_hf_client_cb.scn,
+ TRUE, BTA_HF_CLIENT_MTU, (UINT8 *) bd_addr_any, &(bta_hf_client_cb.scb.serv_handle),
+ bta_hf_client_mgmt_cback);
+
+ if (port_status == PORT_SUCCESS)
+ {
+ bta_hf_client_setup_port(bta_hf_client_cb.scb.serv_handle);
+ }
+ else
+ {
+ /* TODO: can we handle this better? */
+ APPL_TRACE_DEBUG("bta_hf_client_start_server: RFCOMM_CreateConnection returned error:%d", port_status);
+ }
+
+ APPL_TRACE_DEBUG("bta_hf_client_start_server handle: %d", bta_hf_client_cb.scb.serv_handle);
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_close_server
+**
+** Description Close RFCOMM server port for use by HF Client.
+**
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_hf_client_close_server(void)
+{
+ APPL_TRACE_DEBUG("%s %d", __FUNCTION__, bta_hf_client_cb.scb.serv_handle);
+
+ if (bta_hf_client_cb.scb.serv_handle == 0)
+ {
+ APPL_TRACE_DEBUG("%s already stopped", __FUNCTION__);
+ return;
+ }
+
+ RFCOMM_RemoveServer(bta_hf_client_cb.scb.serv_handle);
+ bta_hf_client_cb.scb.serv_handle = 0;
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_rfc_do_open
+**
+** Description Open an RFCOMM connection to the peer device.
+**
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_hf_client_rfc_do_open(tBTA_HF_CLIENT_DATA *p_data)
+{
+ BTM_SetSecurityLevel(TRUE, "", BTM_SEC_SERVICE_HF_HANDSFREE,
+ bta_hf_client_cb.scb.cli_sec_mask, BT_PSM_RFCOMM,
+ BTM_SEC_PROTO_RFCOMM, bta_hf_client_cb.scb.peer_scn);
+
+ if (RFCOMM_CreateConnection(UUID_SERVCLASS_HF_HANDSFREE, bta_hf_client_cb.scb.peer_scn,
+ FALSE, BTA_HF_CLIENT_MTU, bta_hf_client_cb.scb.peer_addr, &(bta_hf_client_cb.scb.conn_handle),
+ bta_hf_client_mgmt_cback) == PORT_SUCCESS)
+ {
+ bta_hf_client_setup_port(bta_hf_client_cb.scb.conn_handle);
+ APPL_TRACE_DEBUG("bta_hf_client_rfc_do_open : conn_handle = %d", bta_hf_client_cb.scb.conn_handle);
+ }
+ /* RFCOMM create connection failed; send ourselves RFCOMM close event */
+ else
+ {
+ bta_hf_client_sm_execute(BTA_HF_CLIENT_RFC_CLOSE_EVT, p_data);
+ }
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_rfc_do_close
+**
+** Description Close RFCOMM connection.
+**
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_hf_client_rfc_do_close(tBTA_HF_CLIENT_DATA *p_data)
+{
+ tBTA_HF_CLIENT_RFC *p_buf;
+ UNUSED(p_data);
+
+ if (bta_hf_client_cb.scb.conn_handle)
+ {
+ RFCOMM_RemoveConnection(bta_hf_client_cb.scb.conn_handle);
+ }
+ else
+ {
+ /* Close API was called while HF Client is in Opening state. */
+ /* Need to trigger the state machine to send callback to the app */
+ /* and move back to INIT state. */
+ if ((p_buf = (tBTA_HF_CLIENT_RFC *) GKI_getbuf(sizeof(tBTA_HF_CLIENT_RFC))) != NULL)
+ {
+ p_buf->hdr.event = BTA_HF_CLIENT_RFC_CLOSE_EVT;
+ bta_sys_sendmsg(p_buf);
+ }
+
+ /* Cancel SDP if it had been started. */
+ if(bta_hf_client_cb.scb.p_disc_db)
+ {
+ (void)SDP_CancelServiceSearch (bta_hf_client_cb.scb.p_disc_db);
+ bta_hf_client_free_db(NULL);
+ }
+ }
+}
diff --git a/bta/hf_client/bta_hf_client_sco.c b/bta/hf_client/bta_hf_client_sco.c
new file mode 100644
index 0000000..eb0929c
--- /dev/null
+++ b/bta/hf_client/bta_hf_client_sco.c
@@ -0,0 +1,734 @@
+/******************************************************************************
+ *
+ * Copyright (c) 2014 The Android Open Source Project
+ * Copyright (C) 2004-2012 Broadcom Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+#include "bta_hf_client_int.h"
+#include <bt_trace.h>
+#include <bd.h>
+#include <string.h>
+#include "bt_utils.h"
+
+#define BTA_HF_CLIENT_NO_EDR_ESCO (BTM_SCO_PKT_TYPES_MASK_NO_2_EV3 | \
+ BTM_SCO_PKT_TYPES_MASK_NO_3_EV3 | \
+ BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 | \
+ BTM_SCO_PKT_TYPES_MASK_NO_3_EV5)
+
+static const tBTM_ESCO_PARAMS bta_hf_client_esco_params[] = {
+ /* SCO CVSD */
+ {
+ .rx_bw = BTM_64KBITS_RATE,
+ .tx_bw = BTM_64KBITS_RATE,
+ .max_latency = 10,
+ .voice_contfmt = BTM_VOICE_SETTING_CVSD,
+ .packet_types = (BTM_SCO_LINK_ONLY_MASK |
+ BTM_SCO_PKT_TYPES_MASK_NO_2_EV3 |
+ BTM_SCO_PKT_TYPES_MASK_NO_3_EV3 |
+ BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 |
+ BTM_SCO_PKT_TYPES_MASK_NO_3_EV5),
+ .retrans_effort = BTM_ESCO_RETRANS_POWER,
+ },
+ /* ESCO CVSD */
+ {
+ .rx_bw = BTM_64KBITS_RATE,
+ .tx_bw = BTM_64KBITS_RATE,
+ .max_latency = 10,
+ .voice_contfmt = BTM_VOICE_SETTING_CVSD,
+ /* Allow controller to use all types available except 5-slot EDR */
+ .packet_types = (BTM_SCO_LINK_ALL_PKT_MASK |
+ BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 |
+ BTM_SCO_PKT_TYPES_MASK_NO_3_EV5),
+ .retrans_effort = BTM_ESCO_RETRANS_POWER,
+ },
+ /* ESCO mSBC */
+ {
+ .rx_bw = BTM_64KBITS_RATE,
+ .tx_bw = BTM_64KBITS_RATE,
+ .max_latency = 13,
+ .voice_contfmt = BTM_VOICE_SETTING_TRANS,
+ /* Packet Types : EV3 + 2-EV3 */
+ .packet_types = (BTM_SCO_PKT_TYPES_MASK_EV3 |
+ BTM_SCO_PKT_TYPES_MASK_NO_3_EV3 |
+ BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 |
+ BTM_SCO_PKT_TYPES_MASK_NO_3_EV5),
+ .retrans_effort = BTM_ESCO_RETRANS_QUALITY,
+ }
+};
+
+enum
+{
+ BTA_HF_CLIENT_SCO_LISTEN_E,
+ BTA_HF_CLIENT_SCO_OPEN_E, /* open request */
+ BTA_HF_CLIENT_SCO_CLOSE_E, /* close request */
+ BTA_HF_CLIENT_SCO_SHUTDOWN_E, /* shutdown request */
+ BTA_HF_CLIENT_SCO_CONN_OPEN_E, /* sco opened */
+ BTA_HF_CLIENT_SCO_CONN_CLOSE_E, /* sco closed */
+};
+
+/*******************************************************************************
+**
+** Function bta_hf_client_remove_sco
+**
+** Description Removes the specified SCO from the system.
+** If only_active is TRUE, then SCO is only removed if connected
+**
+** Returns BOOLEAN - TRUE if Sco removal was started
+**
+*******************************************************************************/
+static BOOLEAN bta_hf_client_sco_remove(BOOLEAN only_active)
+{
+ BOOLEAN removed_started = FALSE;
+ tBTM_STATUS status;
+
+ APPL_TRACE_DEBUG("%s %d", __FUNCTION__, only_active);
+
+ if (bta_hf_client_cb.scb.sco_idx != BTM_INVALID_SCO_INDEX)
+ {
+ status = BTM_RemoveSco(bta_hf_client_cb.scb.sco_idx);
+
+ APPL_TRACE_DEBUG("%s idx 0x%04x, status:0x%x", __FUNCTION__, bta_hf_client_cb.scb.sco_idx, status);
+
+ if (status == BTM_CMD_STARTED)
+ {
+ removed_started = TRUE;
+ }
+ /* If no connection reset the sco handle */
+ else if ( (status == BTM_SUCCESS) || (status == BTM_UNKNOWN_ADDR) )
+ {
+ bta_hf_client_cb.scb.sco_idx = BTM_INVALID_SCO_INDEX;
+ }
+ }
+ return removed_started;
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_cback_sco
+**
+** Description Call application callback function with SCO event.
+**
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_hf_client_cback_sco(UINT8 event)
+{
+ tBTA_HF_CLIENT evt;
+
+ memset(&evt, 0, sizeof(evt));
+
+ /* call app cback */
+ (*bta_hf_client_cb.p_cback)(event, (tBTA_HF_CLIENT *) &evt);
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_sco_conn_rsp
+**
+** Description Process the SCO connection request
+**
+**
+** Returns void
+**
+*******************************************************************************/
+static void bta_hf_client_sco_conn_rsp(tBTM_ESCO_CONN_REQ_EVT_DATA *p_data)
+{
+ tBTM_ESCO_PARAMS resp;
+ UINT8 hci_status = HCI_SUCCESS;
+
+ APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+ if (bta_hf_client_cb.scb.sco_state == BTA_HF_CLIENT_SCO_LISTEN_ST)
+ {
+ if (p_data->link_type == BTM_LINK_TYPE_SCO)
+ {
+ resp = bta_hf_client_esco_params[0];
+ }
+ else
+ {
+ resp = bta_hf_client_esco_params[bta_hf_client_cb.scb.negotiated_codec];
+ }
+
+ /* tell sys to stop av if any */
+ bta_sys_sco_use(BTA_ID_HS, 1, bta_hf_client_cb.scb.peer_addr);
+ }
+ else
+ {
+ hci_status = HCI_ERR_HOST_REJECT_DEVICE;
+ }
+
+ BTM_EScoConnRsp(p_data->sco_inx, hci_status, &resp);
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_sco_connreq_cback
+**
+** Description BTM eSCO connection requests and eSCO change requests
+** Only the connection requests are processed by BTA.
+**
+** Returns void
+**
+*******************************************************************************/
+static void bta_hf_client_esco_connreq_cback(tBTM_ESCO_EVT event, tBTM_ESCO_EVT_DATA *p_data)
+{
+ APPL_TRACE_DEBUG("%s %d", __FUNCTION__, event);
+
+ if (event != BTM_ESCO_CONN_REQ_EVT)
+ {
+ return;
+ }
+
+ /* TODO check remote bdaddr, should allow connect only from device with
+ * active SLC */
+
+ bta_hf_client_cb.scb.sco_idx = p_data->conn_evt.sco_inx;
+
+ bta_hf_client_sco_conn_rsp(&p_data->conn_evt);
+
+ bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_OPENING_ST;
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_sco_conn_cback
+**
+** Description BTM SCO connection callback.
+**
+**
+** Returns void
+**
+*******************************************************************************/
+static void bta_hf_client_sco_conn_cback(UINT16 sco_idx)
+{
+ BT_HDR *p_buf;
+ UINT8 *rem_bd;
+
+ APPL_TRACE_DEBUG("%s %d", __FUNCTION__, sco_idx);
+
+ rem_bd = BTM_ReadScoBdAddr(sco_idx);
+
+ if (rem_bd && bdcmp(bta_hf_client_cb.scb.peer_addr, rem_bd) == 0 &&
+ bta_hf_client_cb.scb.svc_conn && bta_hf_client_cb.scb.sco_idx == sco_idx)
+ {
+ if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
+ {
+ p_buf->event = BTA_HF_CLIENT_SCO_OPEN_EVT;
+ p_buf->layer_specific = bta_hf_client_cb.scb.conn_handle;
+ bta_sys_sendmsg(p_buf);
+ }
+ }
+ /* no match found; disconnect sco, init sco variables */
+ else
+ {
+ bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_SHUTDOWN_ST;
+ BTM_RemoveSco(sco_idx);
+ }
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_sco_disc_cback
+**
+** Description BTM SCO disconnection callback.
+**
+**
+** Returns void
+**
+*******************************************************************************/
+static void bta_hf_client_sco_disc_cback(UINT16 sco_idx)
+{
+ BT_HDR *p_buf;
+
+ APPL_TRACE_DEBUG("%s %d", __FUNCTION__, sco_idx);
+
+ if (bta_hf_client_cb.scb.sco_idx == sco_idx)
+ {
+ if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
+ {
+ p_buf->event = BTA_HF_CLIENT_SCO_CLOSE_EVT;
+ p_buf->layer_specific = bta_hf_client_cb.scb.conn_handle;;
+ bta_sys_sendmsg(p_buf);
+ }
+ }
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_create_sco
+**
+** Description
+**
+**
+** Returns void
+**
+*******************************************************************************/
+static void bta_hf_client_sco_create(BOOLEAN is_orig)
+{
+ tBTM_STATUS status;
+ UINT8 *p_bd_addr = NULL;
+ tBTM_ESCO_PARAMS params;
+
+ APPL_TRACE_DEBUG("%s %d", __FUNCTION__, is_orig);
+
+ /* Make sure this sco handle is not already in use */
+ if (bta_hf_client_cb.scb.sco_idx != BTM_INVALID_SCO_INDEX)
+ {
+ APPL_TRACE_WARNING("%s: Index 0x%04x already in use", __FUNCTION__,
+ bta_hf_client_cb.scb.sco_idx);
+ return;
+ }
+
+ params = bta_hf_client_esco_params[1];
+
+ /* if initiating set current scb and peer bd addr */
+ if (is_orig)
+ {
+ /* Attempt to use eSCO if remote host supports HFP >= 1.5 */
+ if (bta_hf_client_cb.scb.peer_version >= HFP_VERSION_1_5 && !bta_hf_client_cb.scb.retry_with_sco_only)
+ {
+ BTM_SetEScoMode(BTM_LINK_TYPE_ESCO, ¶ms);
+ /* If ESCO or EDR ESCO, retry with SCO only in case of failure */
+ if((params.packet_types & BTM_ESCO_LINK_ONLY_MASK)
+ ||!((params.packet_types & ~(BTM_ESCO_LINK_ONLY_MASK | BTM_SCO_LINK_ONLY_MASK)) ^ BTA_HF_CLIENT_NO_EDR_ESCO))
+ {
+ bta_hf_client_cb.scb.retry_with_sco_only = TRUE;
+ APPL_TRACE_API("Setting retry_with_sco_only to TRUE");
+ }
+ }
+ else
+ {
+ if(bta_hf_client_cb.scb.retry_with_sco_only)
+ APPL_TRACE_API("retrying with SCO only");
+ bta_hf_client_cb.scb.retry_with_sco_only = FALSE;
+
+ BTM_SetEScoMode(BTM_LINK_TYPE_SCO, ¶ms);
+ }
+
+ /* tell sys to stop av if any */
+ bta_sys_sco_use(BTA_ID_HS, 1, bta_hf_client_cb.scb.peer_addr);
+ }
+ else
+ {
+ bta_hf_client_cb.scb.retry_with_sco_only = FALSE;
+ }
+
+ p_bd_addr = bta_hf_client_cb.scb.peer_addr;
+
+ status = BTM_CreateSco(p_bd_addr, is_orig, params.packet_types,
+ &bta_hf_client_cb.scb.sco_idx, bta_hf_client_sco_conn_cback,
+ bta_hf_client_sco_disc_cback);
+ if (status == BTM_CMD_STARTED && !is_orig)
+ {
+ if(!BTM_RegForEScoEvts(bta_hf_client_cb.scb.sco_idx, bta_hf_client_esco_connreq_cback))
+ APPL_TRACE_DEBUG("%s SCO registration success", __FUNCTION__);
+ }
+
+ APPL_TRACE_API("%s: orig %d, inx 0x%04x, status 0x%x, pkt types 0x%04x",
+ __FUNCTION__, is_orig, bta_hf_client_cb.scb.sco_idx,
+ status, params.packet_types);
+}
+
+
+/*******************************************************************************
+**
+** Function bta_hf_client_sco_event
+**
+** Description Handle SCO events
+**
+**
+** Returns void
+**
+*******************************************************************************/
+static void bta_hf_client_sco_event(UINT8 event)
+{
+ APPL_TRACE_DEBUG("%s state: %d event: %d", __FUNCTION__,
+ bta_hf_client_cb.scb.sco_state, event);
+
+ switch (bta_hf_client_cb.scb.sco_state)
+ {
+ case BTA_HF_CLIENT_SCO_SHUTDOWN_ST:
+ switch (event)
+ {
+ case BTA_HF_CLIENT_SCO_LISTEN_E:
+ /* create sco listen connection */
+ bta_hf_client_sco_create(FALSE);
+ bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_LISTEN_ST;
+ break;
+
+ default:
+ APPL_TRACE_WARNING("BTA_HF_CLIENT_SCO_SHUTDOWN_ST: Ignoring event %d", event);
+ break;
+ }
+ break;
+
+ case BTA_HF_CLIENT_SCO_LISTEN_ST:
+ switch (event)
+ {
+ case BTA_HF_CLIENT_SCO_LISTEN_E:
+ /* create sco listen connection (Additional channel) */
+ bta_hf_client_sco_create(FALSE);
+ break;
+
+ case BTA_HF_CLIENT_SCO_OPEN_E:
+ /* remove listening connection */
+ bta_hf_client_sco_remove(FALSE);
+
+ /* create sco connection to peer */
+ bta_hf_client_sco_create(TRUE);
+ bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_OPENING_ST;
+ break;
+
+ case BTA_HF_CLIENT_SCO_SHUTDOWN_E:
+ /* remove listening connection */
+ bta_hf_client_sco_remove(FALSE);
+
+ bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_SHUTDOWN_ST;
+ break;
+
+ case BTA_HF_CLIENT_SCO_CLOSE_E:
+ /* remove listening connection */
+ /* Ignore the event. We need to keep listening SCO for the active SLC */
+ APPL_TRACE_WARNING("BTA_HF_CLIENT_SCO_LISTEN_ST: Ignoring event %d", event);
+ break;
+
+ case BTA_HF_CLIENT_SCO_CONN_CLOSE_E:
+ /* sco failed; create sco listen connection */
+ bta_hf_client_sco_create(FALSE);
+ bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_LISTEN_ST;
+ break;
+
+ default:
+ APPL_TRACE_WARNING("BTA_HF_CLIENT_SCO_LISTEN_ST: Ignoring event %d", event);
+ break;
+ }
+ break;
+
+ case BTA_HF_CLIENT_SCO_OPENING_ST:
+ switch (event)
+ {
+ case BTA_HF_CLIENT_SCO_CLOSE_E:
+ bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_OPEN_CL_ST;
+ break;
+
+ case BTA_HF_CLIENT_SCO_SHUTDOWN_E:
+ bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_SHUTTING_ST;
+ break;
+
+ case BTA_HF_CLIENT_SCO_CONN_OPEN_E:
+ bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_OPEN_ST;
+ break;
+
+ case BTA_HF_CLIENT_SCO_CONN_CLOSE_E:
+ /* sco failed; create sco listen connection */
+ bta_hf_client_sco_create(FALSE);
+ bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_LISTEN_ST;
+ break;
+
+ default:
+ APPL_TRACE_WARNING("BTA_HF_CLIENT_SCO_OPENING_ST: Ignoring event %d", event);
+ break;
+ }
+ break;
+
+ case BTA_HF_CLIENT_SCO_OPEN_CL_ST:
+ switch (event)
+ {
+ case BTA_HF_CLIENT_SCO_OPEN_E:
+ bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_OPENING_ST;
+ break;
+
+ case BTA_HF_CLIENT_SCO_SHUTDOWN_E:
+ bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_SHUTTING_ST;
+ break;
+
+ case BTA_HF_CLIENT_SCO_CONN_OPEN_E:
+ /* close sco connection */
+ bta_hf_client_sco_remove(TRUE);
+
+ bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_CLOSING_ST;
+ break;
+
+ case BTA_HF_CLIENT_SCO_CONN_CLOSE_E:
+ /* sco failed; create sco listen connection */
+
+ bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_LISTEN_ST;
+ break;
+
+ default:
+ APPL_TRACE_WARNING("BTA_HF_CLIENT_SCO_OPEN_CL_ST: Ignoring event %d", event);
+ break;
+ }
+ break;
+
+ case BTA_HF_CLIENT_SCO_OPEN_ST:
+ switch (event)
+ {
+ case BTA_HF_CLIENT_SCO_CLOSE_E:
+ /* close sco connection if active */
+ if (bta_hf_client_sco_remove(TRUE))
+ {
+ bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_CLOSING_ST;
+ }
+ break;
+
+ case BTA_HF_CLIENT_SCO_SHUTDOWN_E:
+ /* remove all listening connections */
+ bta_hf_client_sco_remove(FALSE);
+
+ bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_SHUTTING_ST;
+ break;
+
+ case BTA_HF_CLIENT_SCO_CONN_CLOSE_E:
+ /* peer closed sco; create sco listen connection */
+ bta_hf_client_sco_create(FALSE);
+ bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_LISTEN_ST;
+ break;
+
+ default:
+ APPL_TRACE_WARNING("BTA_HF_CLIENT_SCO_OPEN_ST: Ignoring event %d", event);
+ break;
+ }
+ break;
+
+ case BTA_HF_CLIENT_SCO_CLOSING_ST:
+ switch (event)
+ {
+ case BTA_HF_CLIENT_SCO_OPEN_E:
+ bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_CLOSE_OP_ST;
+ break;
+
+ case BTA_HF_CLIENT_SCO_SHUTDOWN_E:
+ bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_SHUTTING_ST;
+ break;
+
+ case BTA_HF_CLIENT_SCO_CONN_CLOSE_E:
+ /* peer closed sco; create sco listen connection */
+ bta_hf_client_sco_create(FALSE);
+
+ bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_LISTEN_ST;
+ break;
+
+ default:
+ APPL_TRACE_WARNING("BTA_HF_CLIENT_SCO_CLOSING_ST: Ignoring event %d", event);
+ break;
+ }
+ break;
+
+ case BTA_HF_CLIENT_SCO_CLOSE_OP_ST:
+ switch (event)
+ {
+ case BTA_HF_CLIENT_SCO_CLOSE_E:
+ bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_CLOSING_ST;
+ break;
+
+ case BTA_HF_CLIENT_SCO_SHUTDOWN_E:
+ bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_SHUTTING_ST;
+ break;
+
+ case BTA_HF_CLIENT_SCO_CONN_CLOSE_E:
+ /* open sco connection */
+ bta_hf_client_sco_create(TRUE);
+ bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_OPENING_ST;
+ break;
+
+ default:
+ APPL_TRACE_WARNING("BTA_HF_CLIENT_SCO_CLOSE_OP_ST: Ignoring event %d", event);
+ break;
+ }
+ break;
+
+ case BTA_HF_CLIENT_SCO_SHUTTING_ST:
+ switch (event)
+ {
+ case BTA_HF_CLIENT_SCO_CONN_OPEN_E:
+ /* close sco connection; wait for conn close event */
+ bta_hf_client_sco_remove(TRUE);
+ break;
+
+ case BTA_HF_CLIENT_SCO_CONN_CLOSE_E:
+ bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_SHUTDOWN_ST;
+ break;
+
+ case BTA_HF_CLIENT_SCO_SHUTDOWN_E:
+ bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_SHUTDOWN_ST;
+ break;
+
+ default:
+ APPL_TRACE_WARNING("BTA_HF_CLIENT_SCO_SHUTTING_ST: Ignoring event %d", event);
+ break;
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_sco_listen
+**
+** Description Initialize SCO listener
+**
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_hf_client_sco_listen(tBTA_HF_CLIENT_DATA *p_data)
+{
+ UNUSED(p_data);
+
+ APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+ bta_hf_client_sco_event(BTA_HF_CLIENT_SCO_LISTEN_E);
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_sco_shutdown
+**
+** Description
+**
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_hf_client_sco_shutdown(tBTA_HF_CLIENT_DATA *p_data)
+{
+ UNUSED(p_data);
+
+ APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+ bta_hf_client_sco_event(BTA_HF_CLIENT_SCO_SHUTDOWN_E);
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_sco_conn_open
+**
+** Description
+**
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_hf_client_sco_conn_open(tBTA_HF_CLIENT_DATA *p_data)
+{
+ UNUSED(p_data);
+
+ APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+ bta_hf_client_sco_event(BTA_HF_CLIENT_SCO_CONN_OPEN_E);
+
+ bta_sys_sco_open(BTA_ID_HS, 1, bta_hf_client_cb.scb.peer_addr);
+
+ if (bta_hf_client_cb.scb.negotiated_codec == BTM_SCO_CODEC_MSBC)
+ {
+ bta_hf_client_cback_sco(BTA_HF_CLIENT_AUDIO_MSBC_OPEN_EVT);
+ }
+ else
+ {
+ bta_hf_client_cback_sco(BTA_HF_CLIENT_AUDIO_OPEN_EVT);
+ }
+
+ bta_hf_client_cb.scb.retry_with_sco_only = FALSE;
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_sco_conn_close
+**
+** Description
+**
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_hf_client_sco_conn_close(tBTA_HF_CLIENT_DATA *p_data)
+{
+ APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+ /* clear current scb */
+ bta_hf_client_cb.scb.sco_idx = BTM_INVALID_SCO_INDEX;
+
+ /* retry_with_sco_only, will be set only when initiator
+ ** and HFClient is first trying to establish an eSCO connection */
+ if (bta_hf_client_cb.scb.retry_with_sco_only && bta_hf_client_cb.scb.svc_conn)
+ {
+ bta_hf_client_sco_create(TRUE);
+ }
+ else
+ {
+ bta_hf_client_sco_event(BTA_HF_CLIENT_SCO_CONN_CLOSE_E);
+
+ bta_sys_sco_close(BTA_ID_HS, 1, bta_hf_client_cb.scb.peer_addr);
+
+ bta_sys_sco_unuse(BTA_ID_HS, 1, bta_hf_client_cb.scb.peer_addr);
+
+ /* call app callback */
+ bta_hf_client_cback_sco(BTA_HF_CLIENT_AUDIO_CLOSE_EVT);
+
+ if (bta_hf_client_cb.scb.sco_close_rfc == TRUE)
+ {
+ bta_hf_client_cb.scb.sco_close_rfc = FALSE;
+ bta_hf_client_rfc_do_close(p_data);
+ }
+ }
+ bta_hf_client_cb.scb.retry_with_sco_only = FALSE;
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_sco_open
+**
+** Description
+**
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_hf_client_sco_open(tBTA_HF_CLIENT_DATA *p_data)
+{
+ UNUSED(p_data);
+
+ APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+ bta_hf_client_sco_event(BTA_HF_CLIENT_SCO_OPEN_E);
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_sco_close
+**
+** Description
+**
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_hf_client_sco_close(tBTA_HF_CLIENT_DATA *p_data)
+{
+ UNUSED(p_data);
+
+ APPL_TRACE_DEBUG("%s 0x%x", __FUNCTION__, bta_hf_client_cb.scb.sco_idx);
+
+ if (bta_hf_client_cb.scb.sco_idx != BTM_INVALID_SCO_INDEX)
+ {
+ bta_hf_client_sco_event(BTA_HF_CLIENT_SCO_CLOSE_E);
+ }
+}
diff --git a/bta/hf_client/bta_hf_client_sdp.c b/bta/hf_client/bta_hf_client_sdp.c
new file mode 100644
index 0000000..a19912c
--- /dev/null
+++ b/bta/hf_client/bta_hf_client_sdp.c
@@ -0,0 +1,383 @@
+/******************************************************************************
+ *
+ * Copyright (c) 2014 The Android Open Source Project
+ * Copyright (C) 2003-2012 Broadcom Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * This file contains the audio gateway functions performing SDP
+ * operations.
+ *
+ ******************************************************************************/
+
+#include <string.h>
+#include "bta_api.h"
+#include "bta_sys.h"
+#include "bt_utils.h"
+#include "bta_hf_client_api.h"
+#include "bta_hf_client_int.h"
+
+/* Number of protocol elements in protocol element list. */
+#define BTA_HF_CLIENT_NUM_PROTO_ELEMS 2
+
+/* Number of elements in service class id list. */
+#define BTA_HF_CLIENT_NUM_SVC_ELEMS 2
+
+/*******************************************************************************
+**
+** Function bta_hf_client_sdp_cback
+**
+** Description SDP callback function.
+**
+**
+** Returns void
+**
+*******************************************************************************/
+static void bta_hf_client_sdp_cback(UINT16 status)
+{
+ tBTA_HF_CLIENT_DISC_RESULT *p_buf;
+ UINT16 event;
+
+ APPL_TRACE_DEBUG("bta_hf_client_sdp_cback status:0x%x", status);
+
+ /* set event according to int/acp */
+ if (bta_hf_client_cb.scb.role == BTA_HF_CLIENT_ACP)
+ {
+ event = BTA_HF_CLIENT_DISC_ACP_RES_EVT;
+ }
+ else
+ {
+ event = BTA_HF_CLIENT_DISC_INT_RES_EVT;
+ }
+
+ if ((p_buf = (tBTA_HF_CLIENT_DISC_RESULT *) GKI_getbuf(sizeof(tBTA_HF_CLIENT_DISC_RESULT))) != NULL)
+ {
+ p_buf->hdr.event = event;
+ p_buf->status = status;
+ bta_sys_sendmsg(p_buf);
+ }
+}
+
+/******************************************************************************
+**
+** Function bta_hf_client_add_record
+**
+** Description This function is called by a server application to add
+** HFP Client information to an SDP record. Prior to
+** calling this function the application must call
+** SDP_CreateRecord() to create an SDP record.
+**
+** Returns TRUE if function execution succeeded,
+** FALSE if function execution failed.
+**
+******************************************************************************/
+BOOLEAN bta_hf_client_add_record(char *p_service_name, UINT8 scn,
+ tBTA_HF_CLIENT_FEAT features, UINT32 sdp_handle)
+{
+ tSDP_PROTOCOL_ELEM proto_elem_list[BTA_HF_CLIENT_NUM_PROTO_ELEMS];
+ UINT16 svc_class_id_list[BTA_HF_CLIENT_NUM_SVC_ELEMS];
+ UINT16 browse_list[] = {UUID_SERVCLASS_PUBLIC_BROWSE_GROUP};
+ UINT16 version;
+ UINT16 profile_uuid;
+ BOOLEAN result = TRUE;
+ BOOLEAN codec_supported = FALSE;
+ UINT8 buf[2];
+ UINT16 sdp_features = 0;
+
+ APPL_TRACE_DEBUG("bta_hf_client_add_record");
+
+ memset( proto_elem_list, 0 , BTA_HF_CLIENT_NUM_PROTO_ELEMS*sizeof(tSDP_PROTOCOL_ELEM));
+
+ /* add the protocol element sequence */
+ proto_elem_list[0].protocol_uuid = UUID_PROTOCOL_L2CAP;
+ proto_elem_list[0].num_params = 0;
+ proto_elem_list[1].protocol_uuid = UUID_PROTOCOL_RFCOMM;
+ proto_elem_list[1].num_params = 1;
+ proto_elem_list[1].params[0] = scn;
+ result &= SDP_AddProtocolList(sdp_handle, BTA_HF_CLIENT_NUM_PROTO_ELEMS, proto_elem_list);
+
+ /* add service class id list */
+ svc_class_id_list[0] = UUID_SERVCLASS_HF_HANDSFREE;
+ svc_class_id_list[1] = UUID_SERVCLASS_GENERIC_AUDIO;
+ result &= SDP_AddServiceClassIdList(sdp_handle, BTA_HF_CLIENT_NUM_SVC_ELEMS, svc_class_id_list);
+
+ /* add profile descriptor list */
+ profile_uuid = UUID_SERVCLASS_HF_HANDSFREE;
+ version = HFP_VERSION_1_6;
+
+ result &= SDP_AddProfileDescriptorList(sdp_handle, profile_uuid, version);
+
+ /* add service name */
+ if (p_service_name != NULL && p_service_name[0] != 0)
+ {
+ result &= SDP_AddAttribute(sdp_handle, ATTR_ID_SERVICE_NAME, TEXT_STR_DESC_TYPE,
+ (UINT32)(strlen(p_service_name)+1), (UINT8 *) p_service_name);
+ }
+
+ /* add features */
+ if (features & BTA_HF_CLIENT_FEAT_ECNR)
+ sdp_features |= BTA_HF_CLIENT_FEAT_ECNR;
+
+ if (features & BTA_HF_CLIENT_FEAT_3WAY)
+ sdp_features |= BTA_HF_CLIENT_FEAT_3WAY;
+
+ if (features & BTA_HF_CLIENT_FEAT_CLI)
+ sdp_features |= BTA_HF_CLIENT_FEAT_CLI;
+
+ if (features & BTA_HF_CLIENT_FEAT_VREC)
+ sdp_features |= BTA_HF_CLIENT_FEAT_VREC;
+
+ if (features & BTA_HF_CLIENT_FEAT_VOL)
+ sdp_features |= BTA_HF_CLIENT_FEAT_VOL;
+
+ /* Codec bit position is different in SDP (bit 5) and in BRSF (bit 7) */
+ if (features & BTA_HF_CLIENT_FEAT_CODEC)
+ sdp_features |= 0x0020;
+
+ UINT16_TO_BE_FIELD(buf, sdp_features);
+ result &= SDP_AddAttribute(sdp_handle, ATTR_ID_SUPPORTED_FEATURES, UINT_DESC_TYPE, 2, buf);
+
+ /* add browse group list */
+ result &= SDP_AddUuidSequence(sdp_handle, ATTR_ID_BROWSE_GROUP_LIST, 1, browse_list);
+
+ return result;
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_create_record
+**
+** Description Create SDP record for registered service.
+**
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_hf_client_create_record(tBTA_HF_CLIENT_DATA *p_data)
+{
+ /* add sdp record if not already registered */
+ if (bta_hf_client_cb.sdp_handle == 0)
+ {
+ bta_hf_client_cb.sdp_handle = SDP_CreateRecord();
+ bta_hf_client_cb.scn = BTM_AllocateSCN();
+ bta_hf_client_add_record(p_data->api_register.name,
+ bta_hf_client_cb.scn,
+ p_data->api_register.features,
+ bta_hf_client_cb.sdp_handle);
+
+ bta_sys_add_uuid(UUID_SERVCLASS_HF_HANDSFREE);
+ }
+
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_del_record
+**
+** Description Delete SDP record for registered service.
+**
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_hf_client_del_record(tBTA_HF_CLIENT_DATA *p_data)
+{
+ UNUSED(p_data);
+
+ APPL_TRACE_DEBUG("bta_hf_client_del_record");
+
+ if (bta_hf_client_cb.sdp_handle != 0)
+ {
+ SDP_DeleteRecord(bta_hf_client_cb.sdp_handle);
+ bta_hf_client_cb.sdp_handle = 0;
+ BTM_FreeSCN(bta_hf_client_cb.scn);
+ BTM_SecClrService(BTM_SEC_SERVICE_HF_HANDSFREE);
+ bta_sys_remove_uuid(UUID_SERVCLASS_HF_HANDSFREE);
+ }
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_sdp_find_attr
+**
+** Description Process SDP discovery results to find requested attribute
+**
+**
+** Returns TRUE if results found, FALSE otherwise.
+**
+*******************************************************************************/
+BOOLEAN bta_hf_client_sdp_find_attr(void)
+{
+ tSDP_DISC_REC *p_rec = NULL;
+ tSDP_DISC_ATTR *p_attr;
+ tSDP_PROTOCOL_ELEM pe;
+ BOOLEAN result = FALSE;
+
+ bta_hf_client_cb.scb.peer_version = HFP_VERSION_1_1; /* Default version */
+
+ /* loop through all records we found */
+ while (TRUE)
+ {
+ /* get next record; if none found, we're done */
+ if ((p_rec = SDP_FindServiceInDb(bta_hf_client_cb.scb.p_disc_db, UUID_SERVCLASS_AG_HANDSFREE, p_rec)) == NULL)
+ {
+ break;
+ }
+
+ /* get scn from proto desc list if initiator */
+ if (bta_hf_client_cb.scb.role == BTA_HF_CLIENT_INT)
+ {
+ if (SDP_FindProtocolListElemInRec(p_rec, UUID_PROTOCOL_RFCOMM, &pe))
+ {
+ bta_hf_client_cb.scb.peer_scn = (UINT8) pe.params[0];
+ }
+ else
+ {
+ continue;
+ }
+ }
+
+ /* get profile version (if failure, version parameter is not updated) */
+ SDP_FindProfileVersionInRec(p_rec, UUID_SERVCLASS_HF_HANDSFREE, &bta_hf_client_cb.scb.peer_version);
+
+ /* get features */
+ if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SUPPORTED_FEATURES)) != NULL)
+ {
+ /* Found attribute. Get value. */
+ /* There might be race condition between SDP and BRSF. */
+ /* Do not update if we already received BRSF. */
+ if (bta_hf_client_cb.scb.peer_features == 0)
+ {
+ bta_hf_client_cb.scb.peer_features = p_attr->attr_value.v.u16;
+
+ /* SDP and BRSF WBS bit are different, correct it if set */
+ if (bta_hf_client_cb.scb.peer_features & 0x0020)
+ {
+ bta_hf_client_cb.scb.peer_features &= ~0x0020;
+ bta_hf_client_cb.scb.peer_features |= BTA_HF_CLIENT_PEER_CODEC;
+ }
+
+ /* get network for ability to reject calls */
+ if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_NETWORK)) != NULL)
+ {
+ if (p_attr->attr_value.v.u16 == 0x01)
+ {
+ bta_hf_client_cb.scb.peer_features |= BTA_HF_CLIENT_PEER_REJECT;
+ }
+ }
+ }
+ }
+
+ /* found what we needed */
+ result = TRUE;
+ break;
+ }
+
+ APPL_TRACE_DEBUG("%s peer_version=0x%x peer_features=0x%x",
+ __FUNCTION__, bta_hf_client_cb.scb.peer_version,
+ bta_hf_client_cb.scb.peer_features);
+
+ return result;
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_do_disc
+**
+** Description Do service discovery.
+**
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_hf_client_do_disc(void)
+{
+ tSDP_UUID uuid_list[2];
+ UINT16 num_uuid = 1;
+ UINT16 attr_list[4];
+ UINT8 num_attr;
+ BOOLEAN db_inited = FALSE;
+
+ /* initiator; get proto list and features */
+ if (bta_hf_client_cb.scb.role == BTA_HF_CLIENT_INT)
+ {
+ attr_list[0] = ATTR_ID_SERVICE_CLASS_ID_LIST;
+ attr_list[1] = ATTR_ID_PROTOCOL_DESC_LIST;
+ attr_list[2] = ATTR_ID_BT_PROFILE_DESC_LIST;
+ attr_list[3] = ATTR_ID_SUPPORTED_FEATURES;
+ num_attr = 4;
+ uuid_list[0].uu.uuid16 = UUID_SERVCLASS_AG_HANDSFREE;
+ }
+ /* acceptor; get features */
+ else
+ {
+ attr_list[0] = ATTR_ID_SERVICE_CLASS_ID_LIST;
+ attr_list[1] = ATTR_ID_BT_PROFILE_DESC_LIST;
+ attr_list[2] = ATTR_ID_SUPPORTED_FEATURES;
+ num_attr = 3;
+ uuid_list[0].uu.uuid16 = UUID_SERVCLASS_AG_HANDSFREE;
+ }
+
+ /* allocate buffer for sdp database */
+ bta_hf_client_cb.scb.p_disc_db = (tSDP_DISCOVERY_DB *) GKI_getbuf(GKI_MAX_BUF_SIZE);
+
+ if (bta_hf_client_cb.scb.p_disc_db)
+ {
+ /* set up service discovery database; attr happens to be attr_list len */
+ uuid_list[0].len = LEN_UUID_16;
+ uuid_list[1].len = LEN_UUID_16;
+ db_inited = SDP_InitDiscoveryDb(bta_hf_client_cb.scb.p_disc_db, GKI_MAX_BUF_SIZE, num_uuid,
+ uuid_list, num_attr, attr_list);
+ }
+
+ if (db_inited)
+ {
+ /*Service discovery not initiated */
+ db_inited = SDP_ServiceSearchAttributeRequest(bta_hf_client_cb.scb.peer_addr,
+ bta_hf_client_cb.scb.p_disc_db, bta_hf_client_sdp_cback);
+ }
+
+ if (!db_inited)
+ {
+ /*free discover db */
+ bta_hf_client_free_db(NULL);
+ /* sent failed event */
+ bta_hf_client_sm_execute(BTA_HF_CLIENT_DISC_FAIL_EVT, NULL);
+ }
+
+}
+
+/*******************************************************************************
+**
+** Function bta_hf_client_free_db
+**
+** Description Free discovery database.
+**
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_hf_client_free_db(tBTA_HF_CLIENT_DATA *p_data)
+{
+ UNUSED(p_data);
+
+ if (bta_hf_client_cb.scb.p_disc_db != NULL)
+ {
+ GKI_freebuf(bta_hf_client_cb.scb.p_disc_db);
+ bta_hf_client_cb.scb.p_disc_db = NULL;
+ }
+}
diff --git a/bta/hh/bta_hh_act.c b/bta/hh/bta_hh_act.c
index 8ec2698..3c5cf73 100644
--- a/bta/hh/bta_hh_act.c
+++ b/bta/hh/bta_hh_act.c
@@ -200,7 +200,7 @@
attr_mask |= HID_SEC_REQUIRED;
#if BTA_HH_DEBUG
- APPL_TRACE_EVENT4("bta_hh_sdp_cback: p_cb: %d result 0x%02x, \
+ APPL_TRACE_EVENT("bta_hh_sdp_cback: p_cb: %d result 0x%02x, \
attr_mask 0x%02x, handle %x", \
p_cb, result, attr_mask,p_cb->hid_handle);
#endif
@@ -273,7 +273,7 @@
tSDP_DI_GET_RECORD di_rec;
tHID_STATUS ret;
#if BTA_HH_DEBUG
- APPL_TRACE_EVENT2("bta_hh_di_sdp_cback: p_cb: %d result 0x%02x", p_cb, result);
+ APPL_TRACE_EVENT("bta_hh_di_sdp_cback: p_cb: %d result 0x%02x", p_cb, result);
#endif
/* if DI record does not exist on remote device, vendor_id in tBTA_HH_DEV_DSCP_INFO will be
@@ -306,7 +306,7 @@
else
{
#if BTA_HH_DEBUG
- APPL_TRACE_DEBUG1 ("bta_hh_di_sdp_cback: HID_HostGetSDPRecord failed: Status 0x%2x",
+ APPL_TRACE_DEBUG ("bta_hh_di_sdp_cback: HID_HostGetSDPRecord failed: Status 0x%2x",
ret);
#endif
}
@@ -358,7 +358,7 @@
{
status = BTA_HH_OK;
#if BTA_HH_DEBUG
- APPL_TRACE_DEBUG0("bta_hh_start_sdp:: skip SDP for known devices");
+ APPL_TRACE_DEBUG("bta_hh_start_sdp:: skip SDP for known devices");
#endif
if (p_cb->hid_handle == BTA_HH_INVALID_HANDLE)
{
@@ -400,7 +400,7 @@
bta_hh_di_sdp_cback) != SDP_SUCCESS)
{
#if BTA_HH_DEBUG
- APPL_TRACE_DEBUG1 ("bta_hh_start_sdp: SDP_DiDiscover failed: \
+ APPL_TRACE_DEBUG ("bta_hh_start_sdp: SDP_DiDiscover failed: \
Status 0x%2X",status);
#endif
status = BTA_HH_ERR_SDP;
@@ -434,7 +434,7 @@
tBTA_HH_STATUS status = p_data->status;
#if BTA_HH_DEBUG
- APPL_TRACE_DEBUG1 ("bta_hh_sdp_cmpl: status 0x%2X",p_data->status);
+ APPL_TRACE_DEBUG ("bta_hh_sdp_cmpl: status 0x%2X",p_data->status);
#endif
/* initialize call back data */
@@ -456,7 +456,7 @@
if ((ret = HID_HostOpenDev (p_cb->hid_handle)) != HID_SUCCESS)
{
#if BTA_HH_DEBUG
- APPL_TRACE_DEBUG1 ("bta_hh_sdp_cmpl: HID_HostOpenDev failed: \
+ APPL_TRACE_DEBUG ("bta_hh_sdp_cmpl: HID_HostOpenDev failed: \
Status 0x%2X",ret);
#endif
/* open fail, remove device from management device list */
@@ -483,7 +483,7 @@
if ((status == BTA_HH_ERR_SDP) &&
(p_cb->incoming_conn) &&(p_cb->app_id == 0))
{
- APPL_TRACE_DEBUG1 ("bta_hh_sdp_cmpl:SDP failed for incoming conn :hndl %d",
+ APPL_TRACE_DEBUG ("bta_hh_sdp_cmpl:SDP failed for incoming conn :hndl %d",
p_cb->incoming_hid_handle);
HID_HostRemoveDev( p_cb->incoming_hid_handle);
}
@@ -625,7 +625,7 @@
p_cb->hid_handle;
#if BTA_HH_DEBUG
- APPL_TRACE_EVENT1 ("bta_hh_open_act: Device[%d] connected", dev_handle);
+ APPL_TRACE_EVENT ("bta_hh_open_act: Device[%d] connected", dev_handle);
#endif
/* SDP has been done */
@@ -689,7 +689,7 @@
tBTA_HH_CONN conn ;
#if BTA_HH_DEBUG
- APPL_TRACE_DEBUG2("HANDSHAKE received for: event = %s data= %d",
+ APPL_TRACE_DEBUG("HANDSHAKE received for: event = %s data= %d",
bta_hh_get_w4_event(p_cb->w4_evt), p_data->hid_cback.data);
#endif
@@ -737,7 +737,7 @@
default:
/* unknow transaction handshake response */
- APPL_TRACE_DEBUG0("unknown transaction type");
+ APPL_TRACE_DEBUG("unknown transaction type");
break;
}
@@ -762,7 +762,7 @@
tBTA_HH_HSDATA hs_data;
#if BTA_HH_DEBUG
- APPL_TRACE_DEBUG1("Ctrl DATA received w4: event[%s]",
+ APPL_TRACE_DEBUG("Ctrl DATA received w4: event[%s]",
bta_hh_get_w4_event(p_cb->w4_evt));
#endif
hs_data.status = BTA_HH_OK;
@@ -781,7 +781,7 @@
hs_data.rsp_data.proto_mode = ((*data) == HID_PAR_PROTOCOL_REPORT)? \
BTA_HH_PROTO_RPT_MODE : BTA_HH_PROTO_BOOT_MODE;
#if BTA_HH_DEBUG
- APPL_TRACE_DEBUG1("GET_PROTOCOL Mode = [%s]",
+ APPL_TRACE_DEBUG("GET_PROTOCOL Mode = [%s]",
(hs_data.rsp_data.proto_mode == BTA_HH_PROTO_RPT_MODE)? "Report" : "Boot");
#endif
break;
@@ -794,7 +794,7 @@
/* fall through */
default:
#if BTA_HH_DEBUG
- APPL_TRACE_DEBUG1("invalid transaction type for DATA payload: 4_evt[%s]",
+ APPL_TRACE_DEBUG("invalid transaction type for DATA payload: 4_evt[%s]",
bta_hh_get_w4_event(p_cb->w4_evt));
#endif
break;
@@ -1060,7 +1060,7 @@
break;
default:
- APPL_TRACE_DEBUG0("invalid command");
+ APPL_TRACE_DEBUG("invalid command");
break;
}
@@ -1104,7 +1104,7 @@
p_data->api_sndcmd.rpt_id,
p_data->api_sndcmd.p_data) != HID_SUCCESS)
{
- APPL_TRACE_ERROR0("HID_HostWriteDev Error ");
+ APPL_TRACE_ERROR("HID_HostWriteDev Error ");
cbdata.status = BTA_HH_ERR;
if (p_data->api_sndcmd.t_type != HID_TRANS_CONTROL &&
@@ -1143,7 +1143,7 @@
/* currently not expected */
case HID_TRANS_DATAC:
default:
- APPL_TRACE_DEBUG1("bta_hh_write_dev_act:: cmd type = %d",
+ APPL_TRACE_DEBUG("bta_hh_write_dev_act:: cmd type = %d",
p_data->api_sndcmd.t_type);
break;
}
@@ -1190,7 +1190,7 @@
UINT8 xx = 0;
#if BTA_HH_DEBUG
- APPL_TRACE_DEBUG1("bta_hh_cback::HID_event [%s]", bta_hh_hid_event_name(event));
+ APPL_TRACE_DEBUG("bta_hh_cback::HID_event [%s]", bta_hh_hid_event_name(event));
#endif
switch (event)
diff --git a/bta/hh/bta_hh_api.c b/bta/hh/bta_hh_api.c
index df41a52..58090f6 100644
--- a/bta/hh/bta_hh_api.c
+++ b/bta/hh/bta_hh_api.c
@@ -63,11 +63,9 @@
tBTA_HH_API_ENABLE *p_buf;
/* register with BTA system manager */
- GKI_sched_lock();
bta_sys_register(BTA_ID_HH, &bta_hh_reg);
- GKI_sched_unlock();
- APPL_TRACE_ERROR0("Calling BTA_HhEnable");
+ APPL_TRACE_ERROR("Calling BTA_HhEnable");
p_buf = (tBTA_HH_API_ENABLE *)GKI_getbuf((UINT16)sizeof(tBTA_HH_API_ENABLE));
if (p_buf != NULL)
@@ -157,7 +155,7 @@
}
else
{
- APPL_TRACE_ERROR0("No resource to send HID host Connect request.");
+ APPL_TRACE_ERROR("No resource to send HID host Connect request.");
}
}
@@ -310,7 +308,7 @@
#if (defined BTA_HH_LE_INCLUDED && BTA_HH_LE_INCLUDED == TRUE)
if (p_data->layer_specific != BTA_HH_RPTT_OUTPUT)
{
- APPL_TRACE_ERROR0("ERROR! Wrong report type! Write Command only valid for output report!");
+ APPL_TRACE_ERROR("ERROR! Wrong report type! Write Command only valid for output report!");
return;
}
#endif
@@ -484,7 +482,7 @@
break;
default:
- APPL_TRACE_DEBUG1("Unknown boot report: %d", p_report[0]);;
+ APPL_TRACE_DEBUG("Unknown boot report: %d", p_report[0]);;
break;
}
}
diff --git a/bta/hh/bta_hh_int.h b/bta/hh/bta_hh_int.h
index 1ac40da..ac9bb61 100644
--- a/bta/hh/bta_hh_int.h
+++ b/bta/hh/bta_hh_int.h
@@ -194,12 +194,12 @@
BOOLEAN in_use;
UINT8 inst_id; /* share service instance ID and report instance ID, as
hi 4 for service instance ID, low 4 as charatceristic instance ID */
- tBTA_HH_RPT_TYPE rpt_type;
+ tBTA_HH_RPT_TYPE rpt_type;
UINT16 uuid;
- UINT16 prop;
- UINT8 rpt_id;
- BOOLEAN client_cfg_exist;
- UINT16 client_cfg_value;
+ UINT8 prop;
+ UINT8 rpt_id;
+ BOOLEAN client_cfg_exist;
+ UINT16 client_cfg_value;
}tBTA_HH_LE_RPT;
#ifndef BTA_HH_LE_RPT_MAX
@@ -209,19 +209,15 @@
typedef struct
{
BOOLEAN in_use;
- tBTA_HH_LE_RPT report[BTA_HH_LE_RPT_MAX];
+ tBTA_HH_LE_RPT report[BTA_HH_LE_RPT_MAX];
#define BTA_HH_LE_PROTO_MODE_BIT 0x01
#define BTA_HH_LE_CP_BIT 0x02
- UINT8 option_char; /* control point char exisit or not */
+ UINT8 option_char; /* control point char exisit or not */
BOOLEAN expl_incl_srvc;
UINT8 incl_srvc_inst; /* assuming only one included service : battery service */
UINT8 cur_expl_char_idx; /* currently discovering service index */
-
-#define BTA_HH_LE_REMOTE_WAKE 0x01
-#define BTA_HH_LE_NORMAL_CONN 0x02
- UINT8 flag; /* HID Information flag */
UINT8 *rpt_map;
UINT16 ext_rpt_ref;
tBTA_HH_DEV_DESCR descriptor;
@@ -270,6 +266,7 @@
UINT8 disc_active;
tBTA_HH_STATUS status;
+ tBTA_GATT_REASON reason;
BOOLEAN is_le_device;
tBTA_HH_LE_HID_SRVC hid_srvc[BTA_HH_LE_HID_SRVC_MAX];
UINT16 conn_id;
@@ -408,6 +405,7 @@
extern void bta_hh_security_cmpl(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_buf);
extern void bta_hh_le_update_scpp(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_buf);
extern void bta_hh_le_notify_enc_cmpl(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data);
+extern void bta_hh_ci_load_rpt (tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_buf);
#if BTA_HH_DEBUG
extern void bta_hh_trace_dev_db(void);
diff --git a/bta/hh/bta_hh_le.c b/bta/hh/bta_hh_le.c
index 4f297ee..7cbf09c 100644
--- a/bta/hh/bta_hh_le.c
+++ b/bta/hh/bta_hh_le.c
@@ -81,6 +81,9 @@
static void bta_hh_le_register_scpp_notif(tBTA_HH_DEV_CB *p_dev_cb, tBTA_GATT_STATUS status);
static void bta_hh_le_register_scpp_notif_cmpl(tBTA_HH_DEV_CB *p_dev_cb, tBTA_GATT_STATUS status);
static void bta_hh_le_add_dev_bg_conn(tBTA_HH_DEV_CB *p_cb, BOOLEAN check_bond);
+static void bta_hh_process_cache_rpt (tBTA_HH_DEV_CB *p_cb,
+ tBTA_HH_RPT_CACHE_ENTRY *p_rpt_cache,
+ UINT8 num_rpt);
#define BTA_HH_LE_SRVC_DEF 0
@@ -109,14 +112,14 @@
tBTA_HH_LE_RPT *p_rpt;
char * rpt_name;
- APPL_TRACE_DEBUG0("HID Report DB");
+ APPL_TRACE_DEBUG("HID Report DB");
for (i = 0; i < BTA_HH_LE_HID_SRVC_MAX; i ++)
{
if (p_cb->hid_srvc[i].in_use)
{
p_rpt = &p_cb->hid_srvc[i].report[0];
- APPL_TRACE_DEBUG1("\t HID serivce inst: %d", i);
+ APPL_TRACE_DEBUG("\t HID serivce inst: %d", i);
for (j = 0; j < BTA_HH_LE_RPT_MAX; j ++, p_rpt++)
{
@@ -133,7 +136,7 @@
rpt_name = "Boot MI Input";
- APPL_TRACE_DEBUG6("\t\t [%s- 0x%04x] [Type: %s], [ReportID: %d] [inst_id: %d] [Clt_cfg: %d]",
+ APPL_TRACE_DEBUG("\t\t [%s- 0x%04x] [Type: %s], [ReportID: %d] [inst_id: %d] [Clt_cfg: %d]",
rpt_name,
p_rpt->uuid ,
((p_rpt->rpt_type < 4) ? bta_hh_le_rpt_name[p_rpt->rpt_type] : "UNKNOWN"),
@@ -149,6 +152,7 @@
break;
}
}
+
/*******************************************************************************
**
** Function bta_hh_uuid_to_str
@@ -188,6 +192,7 @@
return "Unknown UUID";
}
}
+
#endif
/*******************************************************************************
**
@@ -219,6 +224,7 @@
return;
}
+
/*******************************************************************************
**
** Function bta_hh_le_register_cmpl
@@ -289,22 +295,7 @@
return p_cb->is_le_device;
}
-/*******************************************************************************
-**
-** Function bta_hh_le_hid_srvc_cached
-**
-** Description Check to see if LE HID service has been discovered and cached
-**
-** Parameters: TRUE : has cache; FALSE: none.
-**
-*******************************************************************************/
-BOOLEAN bta_hh_le_hid_srvc_cached(tBTA_HH_DEV_CB *p_dev_cb)
-{
- if (p_dev_cb->hid_srvc[BTA_HH_LE_SRVC_DEF].in_use)
- return TRUE;
- else
- return FALSE;
-}
+
/*******************************************************************************
**
** Function bta_hh_le_add_hid_srvc_entry
@@ -325,11 +316,11 @@
}
else
{
- APPL_TRACE_ERROR0("DB full,max HID service entry!");
+ APPL_TRACE_ERROR("DB full,max HID service entry!");
}
return added;
-
}
+
/*******************************************************************************
**
** Function bta_hh_le_open_conn
@@ -347,8 +338,9 @@
bta_hh_cb.le_cb_index[BTA_HH_GET_LE_CB_IDX(p_cb->hid_handle)] = p_cb->index;
p_cb->in_use = TRUE;
- BTA_GATTC_Open(bta_hh_cb.gatt_if, remote_bda, TRUE);
+ BTA_GATTC_Open(bta_hh_cb.gatt_if, remote_bda, TRUE, BTA_GATT_TRANSPORT_LE);
}
+
/*******************************************************************************
**
** Function bta_hh_le_fill_16bits_gatt_id
@@ -362,6 +354,7 @@
p_output->uuid.len = LEN_UUID_16;
p_output->uuid.uu.uuid16 = uuid;
}
+
/*******************************************************************************
**
** Function bta_hh_le_fill_16bits_srvc_id
@@ -378,6 +371,7 @@
bta_hh_le_fill_16bits_gatt_id(inst_id, srvc_uuid, &p_output->id);
}
+
/*******************************************************************************
**
** Function bta_hh_le_fill_16bits_char_id
@@ -392,6 +386,7 @@
memset((void *)p_output, 0, sizeof(tBTA_GATT_ID));
bta_hh_le_fill_16bits_gatt_id(inst_id, char_uuid, p_output);
}
+
/*******************************************************************************
**
** Function bta_hh_le_find_dev_cb_by_conn_id
@@ -411,6 +406,7 @@
}
return NULL;
}
+
/*******************************************************************************
**
** Function bta_hh_le_find_dev_cb_by_bda
@@ -431,6 +427,14 @@
}
return NULL;
}
+
+/*******************************************************************************
+**
+** Function bta_hh_le_find_service_inst_by_battery_inst_id
+**
+** Description find HID service instance ID by battery service instance ID
+**
+*******************************************************************************/
UINT8 bta_hh_le_find_service_inst_by_battery_inst_id(tBTA_HH_DEV_CB *p_cb, UINT8 ba_inst_id)
{
UINT8 i;
@@ -445,6 +449,7 @@
}
return BTA_HH_IDX_INVALID;
}
+
/*******************************************************************************
**
** Function bta_hh_le_find_report_entry
@@ -484,6 +489,7 @@
return NULL;
}
+
/*******************************************************************************
**
** Function bta_hh_le_find_rpt_by_idtype
@@ -500,7 +506,7 @@
UINT8 i;
#if BTA_HH_DEBUG == TRUE
- APPL_TRACE_DEBUG2("bta_hh_le_find_rpt_by_idtype: r_tpye: %d rpt_id: %d", r_type, rpt_id);
+ APPL_TRACE_DEBUG("bta_hh_le_find_rpt_by_idtype: r_type: %d rpt_id: %d", r_type, rpt_id);
#endif
for (i = 0 ; i < BTA_HH_LE_RPT_MAX; i ++, p_rpt++)
@@ -521,6 +527,7 @@
}
return NULL;
}
+
/*******************************************************************************
**
** Function bta_hh_le_find_alloc_report_entry
@@ -577,7 +584,6 @@
}
}
}
-
return p_rpt;
}
}
@@ -620,12 +626,13 @@
else
{
#if BTA_HH_DEBUG == TRUE
- APPL_TRACE_ERROR2("bta_hh_le_read_char_dscrpt: No such descrpt exists: %s(0x%04x)",
+ APPL_TRACE_ERROR("bta_hh_le_read_char_dscrpt: No such descrpt exists: %s(0x%04x)",
bta_hh_uuid_to_str(char_descp_uuid), char_descp_uuid);
#endif
}
return status;
}
+
/*******************************************************************************
**
** Function bta_hh_le_read_rpt_ref_descr
@@ -640,7 +647,8 @@
while (p_rpt != NULL)
{
- if (!p_rpt->in_use) break;
+ if(!p_rpt->in_use)
+ break;
if (p_rpt->rpt_type == BTA_HH_RPTT_INPUT)
{
@@ -648,7 +656,7 @@
if (p_rpt->uuid == GATT_UUID_BATTERY_LEVEL)
{
#if BTA_HH_DEBUG == TRUE
- APPL_TRACE_DEBUG0("read battery level report reference descriptor");
+ APPL_TRACE_DEBUG("read battery level report reference descriptor");
#endif
srvc_uuid = UUID_SERVCLASS_BATTERY;
char_uuid = GATT_UUID_BATTERY_LEVEL;
@@ -656,7 +664,7 @@
else
{
#if BTA_HH_DEBUG == TRUE
- APPL_TRACE_DEBUG0("read HID report reference descriptor");
+ APPL_TRACE_DEBUG("read HID report reference descriptor");
#endif
srvc_uuid = UUID_SERVCLASS_LE_HID;
char_uuid = GATT_UUID_HID_REPORT;
@@ -674,8 +682,6 @@
break;
}
}
- else
- break;
if (p_rpt->index == BTA_HH_LE_RPT_MAX - 1)
break;
@@ -691,6 +697,7 @@
bta_hh_le_search_hid_chars(p_dev_cb);
}
}
+
/*******************************************************************************
**
** Function bta_hh_le_save_rpt_ref
@@ -703,7 +710,8 @@
void bta_hh_le_save_rpt_ref(tBTA_HH_DEV_CB *p_dev_cb, tBTA_HH_LE_RPT *p_rpt,
tBTA_GATTC_READ *p_data)
{
- UINT8 *pp;
+ UINT8 *pp;
+ tBTA_HH_RPT_CACHE_ENTRY rpt_entry;
/* if the length of the descriptor value is right, parse it */
if (p_data->status == BTA_GATT_OK &&
@@ -718,18 +726,37 @@
p_rpt->rpt_type = BTA_HH_RPTT_RESRV;
#if BTA_HH_DEBUG == TRUE
- APPL_TRACE_DEBUG1("report ID: %d", p_rpt->rpt_id);
+ APPL_TRACE_DEBUG("report ID: %d", p_rpt->rpt_id);
#endif
+ rpt_entry.rpt_id = p_rpt->rpt_id;
+ rpt_entry.rpt_type = p_rpt->rpt_type;
+ rpt_entry.rpt_uuid = p_rpt->uuid;
+ rpt_entry.prop = p_rpt->prop;
+ rpt_entry.inst_id = p_rpt->inst_id;
+
+ bta_hh_le_co_rpt_info(p_dev_cb->addr,
+ &rpt_entry,
+ p_dev_cb->app_id);
+ }
+ else if (p_data->status == BTA_GATT_INSUF_AUTHENTICATION)
+ {
+ /* close connection right away */
+ p_dev_cb->status = BTA_HH_ERR_AUTH_FAILED;
+ /* close the connection and report service discovery complete with error */
+ bta_hh_le_api_disc_act(p_dev_cb);
+ return;
}
if (p_rpt->index < BTA_HH_LE_RPT_MAX - 1)
p_rpt ++;
else
p_rpt = NULL;
+
/* read next report reference descriptor */
bta_hh_le_read_rpt_ref_descr(p_dev_cb, p_rpt);
}
+
/*******************************************************************************
**
** Function bta_hh_le_save_rpt_ref
@@ -753,13 +780,14 @@
STREAM_TO_UINT16(p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].ext_rpt_ref, pp);
#if BTA_HH_DEBUG == TRUE
- APPL_TRACE_DEBUG1("External Report Reference UUID 0x%04x",
+ APPL_TRACE_DEBUG("External Report Reference UUID 0x%04x",
p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].ext_rpt_ref);
#endif
}
bta_hh_le_search_hid_chars(p_dev_cb);
}
+
/*******************************************************************************
**
** Function bta_hh_le_register_input_notif
@@ -779,7 +807,7 @@
UINT16 srvc_uuid;
#if BTA_HH_DEBUG == TRUE
- APPL_TRACE_DEBUG1("bta_hh_le_register_input_notif mode: %d", proto_mode);
+ APPL_TRACE_DEBUG("bta_hh_le_register_input_notif mode: %d", proto_mode);
#endif
for (i = 0; i < BTA_HH_LE_RPT_MAX; i ++, p_rpt ++)
@@ -806,7 +834,7 @@
if (p_rpt->uuid == GATT_UUID_HID_REPORT &&
p_rpt->client_cfg_value == BTA_GATT_CLT_CONFIG_NOTIFICATION)
{
- APPL_TRACE_DEBUG1("---> Deregister Report ID: %d", p_rpt->rpt_id);
+ APPL_TRACE_DEBUG("---> Deregister Report ID: %d", p_rpt->rpt_id);
BTA_GATTC_DeregisterForNotifications(bta_hh_cb.gatt_if,
p_dev_cb->addr,
&char_id);
@@ -815,7 +843,7 @@
else if (p_rpt->uuid == GATT_UUID_HID_BT_KB_INPUT ||
p_rpt->uuid == GATT_UUID_HID_BT_MOUSE_INPUT)
{
- APPL_TRACE_DEBUG1("<--- Register Boot Report ID: %d", p_rpt->rpt_id);
+ APPL_TRACE_DEBUG("<--- Register Boot Report ID: %d", p_rpt->rpt_id);
BTA_GATTC_RegisterForNotifications(bta_hh_cb.gatt_if,
p_dev_cb->addr,
&char_id);
@@ -828,7 +856,7 @@
p_rpt->client_cfg_value == BTA_GATT_CLT_CONFIG_NOTIFICATION)
{
- APPL_TRACE_DEBUG1("---> Deregister Boot Report ID: %d", p_rpt->rpt_id);
+ APPL_TRACE_DEBUG("---> Deregister Boot Report ID: %d", p_rpt->rpt_id);
BTA_GATTC_DeregisterForNotifications(bta_hh_cb.gatt_if,
p_dev_cb->addr,
&char_id);
@@ -836,7 +864,7 @@
else if (p_rpt->uuid == GATT_UUID_HID_REPORT &&
p_rpt->client_cfg_value == BTA_GATT_CLT_CONFIG_NOTIFICATION)
{
- APPL_TRACE_DEBUG1("<--- Register Report ID: %d", p_rpt->rpt_id);
+ APPL_TRACE_DEBUG("<--- Register Report ID: %d", p_rpt->rpt_id);
BTA_GATTC_RegisterForNotifications(bta_hh_cb.gatt_if,
p_dev_cb->addr,
&char_id);
@@ -864,6 +892,7 @@
#endif
bta_hh_le_register_input_notif(p_cb, 0, p_cb->mode, TRUE);
bta_hh_sm_execute(p_cb, BTA_HH_OPEN_CMPL_EVT, NULL);
+
#if (BTA_HH_LE_RECONN == TRUE)
if (p_cb->status == BTA_HH_OK)
{
@@ -872,6 +901,7 @@
#endif
}
}
+
/*******************************************************************************
**
** Function bta_hh_le_write_char_clt_cfg
@@ -909,7 +939,7 @@
{
BTA_GATTC_WriteCharDescr(p_cb->conn_id,
&descr_id,
- BTA_GATTC_TYPE_WRITE_NO_RSP,
+ BTA_GATTC_TYPE_WRITE,
&value,
BTA_GATT_AUTH_REQ_NONE);
@@ -917,6 +947,7 @@
}
return FALSE;
}
+
/*******************************************************************************
**
** Function bta_hh_le_write_rpt_clt_cfg
@@ -979,21 +1010,20 @@
{
tBTA_GATTC_CHAR_ID char_id;
tBTA_HH_CBDATA cback_data ;
- BOOLEAN exec = TRUE;
+ BOOLEAN exec = FALSE;
- APPL_TRACE_DEBUG1("bta_hh_le_set_protocol_mode attempt mode: %s",
+ APPL_TRACE_DEBUG("bta_hh_le_set_protocol_mode attempt mode: %s",
(mode == BTA_HH_PROTO_RPT_MODE)? "Report": "Boot");
cback_data.handle = p_cb->hid_handle;
/* boot mode is not supported in the remote device */
if ((p_cb->hid_srvc[BTA_HH_LE_SRVC_DEF].option_char & BTA_HH_LE_PROTO_MODE_BIT) == 0)
{
- exec = FALSE;
p_cb->mode = BTA_HH_PROTO_RPT_MODE;
if (mode == BTA_HH_PROTO_BOOT_MODE)
{
- APPL_TRACE_ERROR0("Set Boot Mode failed!! No PROTO_MODE Char!");
+ APPL_TRACE_ERROR("Set Boot Mode failed!! No PROTO_MODE Char!");
cback_data.status = BTA_HH_ERR;
}
else
@@ -1009,7 +1039,7 @@
else
(* bta_hh_cb.p_cback)(BTA_HH_SET_PROTO_EVT, (tBTA_HH *)&cback_data);
}
- else
+ else if (p_cb->mode != mode)
{
bta_hh_le_fill_16bits_srvc_id(TRUE, 0, UUID_SERVCLASS_LE_HID, &char_id.srvc_id);
bta_hh_le_fill_16bits_char_id(0, GATT_UUID_HID_PROTO_MODE, &char_id.char_id);
@@ -1023,7 +1053,9 @@
1,
&mode,
BTA_GATT_AUTH_REQ_NONE);
+ exec = TRUE;
}
+
return exec;
}
@@ -1067,6 +1099,7 @@
}
}
+
/*******************************************************************************
**
** Function bta_hh_le_expl_rpt
@@ -1089,11 +1122,11 @@
p_char_id->char_id.inst_id,
prop) == NULL)
{
- APPL_TRACE_ERROR0("Add report entry failed !!!");
+ APPL_TRACE_ERROR("Add report entry failed !!!");
break;
}
- APPL_TRACE_DEBUG0("Find more REPORT");
+ APPL_TRACE_DEBUG("Find more REPORT");
if (BTA_GATTC_GetNextChar(p_dev_cb->conn_id,
p_char_id,
@@ -1106,13 +1139,14 @@
}
while (1);
- APPL_TRACE_ERROR0("all report searched");
+ APPL_TRACE_ERROR("all report searched");
bta_hh_le_read_rpt_ref_descr(p_dev_cb,
&p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].report[0]);
return ;
}
+
/*******************************************************************************
**
** Function bta_hh_le_expl_boot_rpt
@@ -1130,11 +1164,12 @@
prop) == NULL)
{
- APPL_TRACE_ERROR0("Add report entry failed !!!");
+ APPL_TRACE_ERROR("Add report entry failed !!!");
}
return;
}
+
/*******************************************************************************
**
** Function bta_hh_le_dis_cback
@@ -1151,7 +1186,7 @@
if (p_cb == NULL || p_dis_value == NULL)
{
- APPL_TRACE_ERROR0("received unexpected/error DIS callback");
+ APPL_TRACE_ERROR("received unexpected/error DIS callback");
return;
}
@@ -1160,7 +1195,7 @@
if (p_dis_value->attr_mask & DIS_ATTR_PNP_ID_BIT)
{
#if BTA_HH_DEBUG == TRUE
- APPL_TRACE_DEBUG3("Plug in PnP info: product_id = %02x, vendor_id = %04x, version = %04x",
+ APPL_TRACE_DEBUG("Plug in PnP info: product_id = %02x, vendor_id = %04x, version = %04x",
p_dis_value->pnp_id.product_id,
p_dis_value->pnp_id.vendor_id,
p_dis_value->pnp_id.product_version);
@@ -1171,6 +1206,7 @@
}
bta_hh_le_open_cmpl(p_cb);
}
+
/*******************************************************************************
**
** Function bta_hh_le_pri_service_discovery
@@ -1185,12 +1221,14 @@
{
tBT_UUID pri_srvc;
+ bta_hh_le_co_reset_rpt_cache(p_cb->addr, p_cb->app_id);
+
p_cb->disc_active |= (BTA_HH_LE_DISC_HIDS|BTA_HH_LE_DISC_DIS);
/* read DIS info */
- if (!DIS_ReadDISInfo(p_cb->addr, bta_hh_le_dis_cback))
+ if (!DIS_ReadDISInfo(p_cb->addr, bta_hh_le_dis_cback, DIS_ATTR_PNP_ID_BIT))
{
- APPL_TRACE_ERROR0("read DIS failed");
+ APPL_TRACE_ERROR("read DIS failed");
p_cb->disc_active &= ~BTA_HH_LE_DISC_DIS;
}
@@ -1201,6 +1239,7 @@
BTA_GATTC_ServiceSearchRequest(p_cb->conn_id, &pri_srvc);
return;
}
+
/*******************************************************************************
**
** Function bta_hh_le_encrypt_cback
@@ -1210,25 +1249,27 @@
** Returns None
**
*******************************************************************************/
-void bta_hh_le_encrypt_cback(BD_ADDR bd_addr, void *p_ref_data, tBTM_STATUS result)
+void bta_hh_le_encrypt_cback(BD_ADDR bd_addr, tBTA_GATT_TRANSPORT transport,
+ void *p_ref_data, tBTM_STATUS result)
{
UINT8 idx = bta_hh_find_cb(bd_addr);
tBTA_HH_DEV_CB *p_dev_cb;
UNUSED(p_ref_data);
-
- APPL_TRACE_ERROR0("bta_hh_le_encrypt_cback");
+ UNUSED (transport);
if (idx != BTA_HH_IDX_INVALID)
p_dev_cb = &bta_hh_cb.kdev[idx];
else
{
- APPL_TRACE_ERROR0("unexpected encryption callback, ignore");
+ APPL_TRACE_ERROR("unexpected encryption callback, ignore");
return;
}
p_dev_cb->status = (result == BTM_SUCCESS) ? BTA_HH_OK : BTA_HH_ERR_SEC;
+ p_dev_cb->reason = result;
bta_hh_sm_execute(p_dev_cb, BTA_HH_ENC_CMPL_EVT, NULL);
}
+
/*******************************************************************************
**
** Function bta_hh_security_cmpl
@@ -1241,17 +1282,29 @@
*******************************************************************************/
void bta_hh_security_cmpl(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_buf)
{
+ tBTA_HH_RPT_CACHE_ENTRY *p_rpt_cache;
+ UINT8 num_rpt = 0;
UNUSED(p_buf);
if (p_cb->status == BTA_HH_OK)
{
+ APPL_TRACE_DEBUG("bta_hh_security_cmpl OK");
+ if (!p_cb->hid_srvc[BTA_HH_LE_SRVC_DEF].in_use)
+ {
+ APPL_TRACE_DEBUG("bta_hh_security_cmpl no reports loaded, try to load");
+ /* start loading the cache if not in stack */
+ if ((p_rpt_cache = bta_hh_le_co_cache_load(p_cb->addr, &num_rpt, p_cb->app_id)) != NULL)
+ {
+ bta_hh_process_cache_rpt(p_cb, p_rpt_cache, num_rpt);
+ }
+ }
/* discovery has been done for HID service */
- if (p_cb->app_id != 0 && bta_hh_le_hid_srvc_cached(p_cb))
+ if (p_cb->app_id != 0 && p_cb->hid_srvc[BTA_HH_LE_SRVC_DEF].in_use)
{
/* configure protocol mode */
if (bta_hh_le_set_protocol_mode(p_cb, p_cb->mode) == FALSE)
{
- APPL_TRACE_ERROR0("bta_hh_security_cmpl");
+ APPL_TRACE_ERROR("bta_hh_security_cmpl");
bta_hh_le_open_cmpl(p_cb);
}
}
@@ -1262,8 +1315,12 @@
}
}
else
- bta_hh_le_api_disc_act(p_cb);
-
+ {
+ APPL_TRACE_ERROR("%s() - encryption failed; status=0x%04x, reason=0x%04x",
+ __FUNCTION__, p_cb->status, p_cb->reason);
+ if (!(p_cb->status == BTA_HH_ERR_SEC && p_cb->reason == BTM_ERR_PROCESSING))
+ bta_hh_le_api_disc_act(p_cb);
+ }
}
/*******************************************************************************
@@ -1289,6 +1346,31 @@
/*******************************************************************************
**
+** Function bta_hh_clear_service_cache
+**
+** Description clear the service cache
+**
+** Parameters:
+**
+*******************************************************************************/
+void bta_hh_clear_service_cache(tBTA_HH_DEV_CB *p_cb)
+{
+ UINT8 i;
+ tBTA_HH_LE_HID_SRVC *p_hid_srvc = &p_cb->hid_srvc[0];
+
+ p_cb->app_id = 0;
+ p_cb->total_srvc = 0;
+ p_cb->dscp_info.descriptor.dsc_list = NULL;
+
+ for (i = 0; i < BTA_HH_LE_HID_SRVC_MAX; i ++, p_hid_srvc ++)
+ {
+ utl_freebuf((void **)&p_hid_srvc->rpt_map);
+ memset(p_hid_srvc, 0, sizeof(tBTA_HH_LE_HID_SRVC));
+ }
+}
+
+/*******************************************************************************
+**
** Function bta_hh_start_security
**
** Description start the security check of the established connection
@@ -1315,7 +1397,7 @@
}
/* verify bond */
- BTM_GetSecurityFlags(p_cb->addr, &sec_flag);
+ BTM_GetSecurityFlagsByTransport(p_cb->addr, &sec_flag, BT_TRANSPORT_LE);
/* if link has been encrypted */
if (sec_flag & BTM_SEC_FLAG_ENCRYPTED)
@@ -1327,14 +1409,15 @@
{
sec_flag = BTM_BLE_SEC_ENCRYPT;
p_cb->status = BTA_HH_ERR_AUTH_FAILED;
- BTM_SetEncryption(p_cb->addr, bta_hh_le_encrypt_cback, &sec_flag);
+ BTM_SetEncryption(p_cb->addr, BTA_TRANSPORT_LE, bta_hh_le_encrypt_cback, &sec_flag);
}
/* unbonded device, report security error here */
else if (p_cb->sec_mask != BTA_SEC_NONE)
{
sec_flag = BTM_BLE_SEC_ENCRYPT_NO_MITM;
p_cb->status = BTA_HH_ERR_AUTH_FAILED;
- BTM_SetEncryption(p_cb->addr, bta_hh_le_encrypt_cback, &sec_flag);
+ bta_hh_clear_service_cache(p_cb);
+ BTM_SetEncryption(p_cb->addr, BTA_TRANSPORT_LE, bta_hh_le_encrypt_cback, &sec_flag);
}
/* otherwise let it go through */
else
@@ -1344,6 +1427,7 @@
}
+
/*******************************************************************************
**
** Function bta_hh_gatt_open
@@ -1365,13 +1449,13 @@
p2 = p_data->remote_bda;
- APPL_TRACE_DEBUG3("bta_hh_gatt_open BTA_GATTC_OPEN_EVT bda= [%08x%04x] status =%d",
+ APPL_TRACE_DEBUG("bta_hh_gatt_open BTA_GATTC_OPEN_EVT bda= [%08x%04x] status =%d",
((p2[0])<<24)+((p2[1])<<16)+((p2[2])<<8)+(p2[3]),
((p2[4])<<8)+ p2[5],p_data->status);
if (p_data->status == BTA_GATT_OK)
{
-
+ p_cb->is_le_device = TRUE;
p_cb->in_use = TRUE;
p_cb->conn_id = p_data->conn_id;
p_cb->hid_handle = BTA_HH_GET_LE_DEV_HDL(p_cb->index);
@@ -1379,7 +1463,7 @@
bta_hh_cb.le_cb_index[BTA_HH_GET_LE_CB_IDX(p_cb->hid_handle)] = p_cb->index;
#if BTA_HH_DEBUG == TRUE
- APPL_TRACE_DEBUG3("hid_handle = %2x conn_id = %04x cb_index = %d", p_cb->hid_handle, p_cb->conn_id, p_cb->index);
+ APPL_TRACE_DEBUG("hid_handle = %2x conn_id = %04x cb_index = %d", p_cb->hid_handle, p_cb->conn_id, p_cb->index);
#endif
bta_hh_sm_execute(p_cb, BTA_HH_START_ENC_EVT, NULL);
@@ -1391,6 +1475,7 @@
}
}
+
/*******************************************************************************
**
** Function bta_hh_le_close
@@ -1445,7 +1530,7 @@
/* TODO: proceed to find battery and device info */
if (bta_hh_le_add_hid_srvc_entry(p_dev_cb, p_dev_cb->total_srvc))
p_dev_cb->total_srvc ++;
- APPL_TRACE_DEBUG1("num of hid service: %d", p_dev_cb->total_srvc);
+ APPL_TRACE_DEBUG("num of hid service: %d", p_dev_cb->total_srvc);
}
break;
@@ -1470,7 +1555,7 @@
*******************************************************************************/
void bta_hh_le_gatt_disc_cmpl(tBTA_HH_DEV_CB *p_cb, tBTA_HH_STATUS status)
{
- APPL_TRACE_DEBUG0("bta_hh_le_gatt_disc_cmpl ");
+ APPL_TRACE_DEBUG("bta_hh_le_gatt_disc_cmpl ");
/* if open sucessful or protocol mode not desired, keep the connection open but inform app */
if (status == BTA_HH_OK || status == BTA_HH_ERR_PROTO)
@@ -1501,7 +1586,7 @@
void bta_hh_le_srvc_expl_srvc(tBTA_HH_DEV_CB *p_dev_cb)
{
#if BTA_HH_DEBUG == TRUE
- APPL_TRACE_DEBUG2("bta_hh_le_srvc_expl_srvc cur_srvc_index = %d in_use = %d",
+ APPL_TRACE_DEBUG("bta_hh_le_srvc_expl_srvc cur_srvc_index = %d in_use = %d",
p_dev_cb->cur_srvc_index,
p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].in_use);
#endif
@@ -1511,9 +1596,7 @@
{
if (!p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].expl_incl_srvc)
/* explore included service first */
- {
- bta_hh_le_search_hid_included(p_dev_cb);
- }
+ bta_hh_le_search_hid_included(p_dev_cb);
else
{
/* explore characterisc */
@@ -1526,6 +1609,7 @@
bta_hh_le_gatt_disc_cmpl(p_dev_cb, p_dev_cb->status);
}
}
+
/*******************************************************************************
**
** Function bta_hh_le_srvc_search_cmpl
@@ -1593,7 +1677,6 @@
&inc_srvc_result) == BTA_GATT_OK)
{
/* read include service UUID */
-
p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].incl_srvc_inst = inc_srvc_result.incl_svc_id.id.inst_id;
char_cond.len = LEN_UUID_16;
@@ -1606,13 +1689,14 @@
&char_result,
&prop) == BTA_GATT_OK)
{
+
if (bta_hh_le_find_alloc_report_entry(p_dev_cb,
char_result.srvc_id.id.inst_id,
GATT_UUID_BATTERY_LEVEL,
char_result.char_id.inst_id,
prop) == NULL)
{
- APPL_TRACE_ERROR0("Add battery report entry failed !!!")
+ APPL_TRACE_ERROR("Add battery report entry failed !!!")
}
/* read the battery characteristic */
@@ -1625,7 +1709,7 @@
}
else
{
- APPL_TRACE_ERROR0("Remote device does not have battery level");
+ APPL_TRACE_ERROR("Remote device does not have battery level");
}
}
@@ -1634,6 +1718,7 @@
bta_hh_le_srvc_expl_srvc(p_dev_cb);
}
+
/*******************************************************************************
**
** Function bta_hh_read_battery_level_cmpl
@@ -1689,7 +1774,7 @@
bta_hh_le_fill_16bits_srvc_id(TRUE, p_dev_cb->cur_srvc_index, UUID_SERVCLASS_LE_HID, &srvc_id);
#if BTA_HH_DEBUG == TRUE
- APPL_TRACE_DEBUG2("bta_hh_le_search_hid_chars: looking for %s(0x%04x)",
+ APPL_TRACE_DEBUG("bta_hh_le_search_hid_chars: looking for %s(0x%04x)",
bta_hh_uuid_to_str(char_uuid), char_uuid);
#endif
@@ -1744,6 +1829,7 @@
bta_hh_le_search_hid_chars(p_dev_cb);
}
}
+
/*******************************************************************************
**
** Function bta_hh_le_save_rpt_map
@@ -1783,9 +1869,8 @@
{
bta_hh_le_search_hid_chars(p_dev_cb);
}
-
-
}
+
/*******************************************************************************
**
** Function bta_hh_le_proc_get_rpt_cmpl
@@ -1805,7 +1890,7 @@
if (p_dev_cb->w4_evt != BTA_HH_GET_RPT_EVT)
{
- APPL_TRACE_ERROR1("Unexpected READ cmpl, w4_evt = %d", p_dev_cb->w4_evt);
+ APPL_TRACE_ERROR("Unexpected READ cmpl, w4_evt = %d", p_dev_cb->w4_evt);
return;
}
@@ -1827,6 +1912,7 @@
hs_data.status = BTA_HH_OK;
p_buf->len = p_data->p_value->unformat.len + 1;
p_buf->layer_specific = 0;
+ p_buf->offset = 0;
/* attach report ID as the first byte of the report before sending it to USB HID driver */
pp = (UINT8*)(p_buf + 1);
@@ -1841,8 +1927,8 @@
(* bta_hh_cb.p_cback)(BTA_HH_GET_RPT_EVT, (tBTA_HH *)&hs_data);
utl_freebuf((void **)&p_buf);
-
}
+
/*******************************************************************************
**
** Function bta_hh_le_proc_read_proto_mode
@@ -1873,7 +1959,7 @@
p_dev_cb->mode = hs_data.rsp_data.proto_mode;
}
#if BTA_HH_DEBUG
- APPL_TRACE_DEBUG1("LE GET_PROTOCOL Mode = [%s]",
+ APPL_TRACE_DEBUG("LE GET_PROTOCOL Mode = [%s]",
(hs_data.rsp_data.proto_mode == BTA_HH_PROTO_RPT_MODE)? "Report" : "Boot");
#endif
@@ -1881,6 +1967,7 @@
(* bta_hh_cb.p_cback)(BTA_HH_GET_PROTO_EVT, (tBTA_HH *)&hs_data);
}
+
/*******************************************************************************
**
** Function bta_hh_w4_le_read_char_cmpl
@@ -1920,7 +2007,7 @@
default:
#if BTA_HH_DEBUG == TRUE
- APPL_TRACE_ERROR2("Unexpected read %s(0x%04x)",
+ APPL_TRACE_ERROR("Unexpected read %s(0x%04x)",
bta_hh_uuid_to_str(p_data->char_id.uuid.uu.uuid16),
p_data->char_id.uuid.uu.uuid16);
#endif
@@ -1930,18 +2017,19 @@
else
{
#if BTA_HH_DEBUG == TRUE
- APPL_TRACE_ERROR3("read uuid %s[0x%04x] error: %d",
+ APPL_TRACE_ERROR("read uuid %s[0x%04x] error: %d",
bta_hh_uuid_to_str(p_data->char_id.uuid.uu.uuid16),
p_data->char_id.uuid.uu.uuid16,
p_data->status);
#else
- APPL_TRACE_ERROR2("read uuid [0x%04x] error: %d", p_data->char_id.uuid.uu.uuid16, p_data->status);
+ APPL_TRACE_ERROR("read uuid [0x%04x] error: %d", p_data->char_id.uuid.uu.uuid16, p_data->status);
#endif
}
bta_hh_le_search_hid_chars(p_dev_cb);
}
}
+
/*******************************************************************************
**
** Function bta_hh_le_read_char_cmpl
@@ -1971,11 +2059,12 @@
break;
default:
- APPL_TRACE_ERROR1("Unexpected Read UUID: 0x%04x", p_data->char_id.uuid.uu.uuid16);
+ APPL_TRACE_ERROR("Unexpected Read UUID: 0x%04x", p_data->char_id.uuid.uu.uuid16);
break;
}
}
+
/*******************************************************************************
**
** Function bta_hh_le_read_descr_cmpl
@@ -2002,11 +2091,20 @@
pp = p_data->p_value->unformat.p_value;
STREAM_TO_UINT16(p_rpt->client_cfg_value, pp);
- APPL_TRACE_DEBUG1("Read Client Configuration: 0x%04x", p_rpt->client_cfg_value);
+ APPL_TRACE_DEBUG("Read Client Configuration: 0x%04x", p_rpt->client_cfg_value);
}
}
}
+/*******************************************************************************
+**
+** Function bta_hh_le_read_battery_level_descr_cmpl
+**
+** Description Process report reference descriptor for battery level is completed
+**
+** Parameters:
+**
+*******************************************************************************/
void bta_hh_le_read_battery_level_descr_cmpl(tBTA_HH_DEV_CB *p_dev_cb, tBTA_GATTC_READ * p_data)
{
tBTA_HH_LE_RPT *p_rpt;
@@ -2024,9 +2122,9 @@
}
else
bta_hh_le_save_rpt_ref(p_dev_cb, p_rpt, p_data);
-
}
}
+
/*******************************************************************************
**
** Function bta_hh_w4_le_read_descr_cmpl
@@ -2048,7 +2146,7 @@
char_uuid16 = p_data->char_id.uuid.uu.uuid16;
#if BTA_HH_DEBUG == TRUE
- APPL_TRACE_DEBUG2("bta_hh_w4_le_read_descr_cmpl uuid: %s(0x%04x)",
+ APPL_TRACE_DEBUG("bta_hh_w4_le_read_descr_cmpl uuid: %s(0x%04x)",
bta_hh_uuid_to_str(p_data->descr_type.uuid.uu.uuid16),
p_data->descr_type.uuid.uu.uuid16);
#endif
@@ -2075,7 +2173,7 @@
break;
default:
- APPL_TRACE_ERROR1("unknown descriptor read complete for uuid: 0x%04x", char_uuid16);
+ APPL_TRACE_ERROR("unknown descriptor read complete for uuid: 0x%04x", char_uuid16);
break;
}
}
@@ -2110,6 +2208,7 @@
}
}
}
+
/*******************************************************************************
**
** Function bta_hh_le_write_cmpl
@@ -2129,7 +2228,7 @@
return;
#if BTA_HH_DEBUG
- APPL_TRACE_DEBUG1("bta_hh_le_write_cmpl w4_evt: %d", p_dev_cb->w4_evt);
+ APPL_TRACE_DEBUG("bta_hh_le_write_cmpl w4_evt: %d", p_dev_cb->w4_evt);
#endif
switch (p_data->char_id.uuid.uu.uuid16)
{
@@ -2168,6 +2267,7 @@
}
}
+
/*******************************************************************************
**
** Function bta_hh_le_write_char_descr_cmpl
@@ -2183,7 +2283,7 @@
UINT8 srvc_inst_id, hid_inst_id;
/* only write client configuration possible */
- if (p_data && p_data->descr_type.uuid.uu.uuid16 == GATT_UUID_CHAR_CLIENT_CONFIG)
+ if (p_data->descr_type.uuid.uu.uuid16 == GATT_UUID_CHAR_CLIENT_CONFIG)
{
srvc_inst_id = p_data->srvc_id.id.inst_id;
hid_inst_id = srvc_inst_id;
@@ -2196,9 +2296,9 @@
case GATT_UUID_HID_BT_MOUSE_INPUT:
case GATT_UUID_HID_REPORT:
if (p_data->status == BTA_GATT_OK)
- p_dev_cb->hid_srvc[hid_inst_id].report[p_dev_cb->clt_cfg_idx ++].client_cfg_value =
+ p_dev_cb->hid_srvc[hid_inst_id].report[p_dev_cb->clt_cfg_idx].client_cfg_value =
BTA_GATT_CLT_CONFIG_NOTIFICATION;
-
+ p_dev_cb->clt_cfg_idx ++;
bta_hh_le_write_rpt_clt_cfg(p_dev_cb, hid_inst_id);
break;
@@ -2206,22 +2306,24 @@
case GATT_UUID_SCAN_REFRESH:
bta_hh_le_register_scpp_notif_cmpl(p_dev_cb, p_data->status);
break;
+
default:
- APPL_TRACE_ERROR1("Unknown char ID clt cfg: 0x%04x", p_data->char_id.uuid.uu.uuid16);
+ APPL_TRACE_ERROR("Unknown char ID clt cfg: 0x%04x", p_data->char_id.uuid.uu.uuid16);
}
}
else
{
#if BTA_HH_DEBUG == TRUE
- APPL_TRACE_ERROR2("Unexpected write to %s(0x%04x)",
+ APPL_TRACE_ERROR("Unexpected write to %s(0x%04x)",
bta_hh_uuid_to_str(p_data->descr_type.uuid.uu.uuid16),
p_data->descr_type.uuid.uu.uuid16);
#else
- APPL_TRACE_ERROR1("Unexpected write to (0x%04x)", p_data->descr_type.uuid.uu.uuid16);
+ APPL_TRACE_ERROR("Unexpected write to (0x%04x)", p_data->descr_type.uuid.uu.uuid16);
#endif
}
}
+
/*******************************************************************************
**
** Function bta_hh_le_input_rpt_notify
@@ -2240,10 +2342,9 @@
if (p_dev_cb == NULL)
{
- APPL_TRACE_ERROR0("notification received from Unknown device");
+ APPL_TRACE_ERROR("notification received from Unknown device");
return;
}
-
app_id= p_dev_cb->app_id;
p_rpt = bta_hh_le_find_report_entry(p_dev_cb,
@@ -2252,7 +2353,7 @@
p_data->char_id.char_id.inst_id);
if (p_rpt == NULL)
{
- APPL_TRACE_ERROR0("notification received for Unknown Report");
+ APPL_TRACE_ERROR("notification received for Unknown Report");
return;
}
@@ -2261,14 +2362,14 @@
else if (p_data->char_id.char_id.uuid.uu.uuid16 == GATT_UUID_HID_BT_KB_INPUT)
app_id = BTA_HH_APP_ID_KB;
- APPL_TRACE_ERROR1("Notification received on report ID: %d", p_rpt->rpt_id);
+ APPL_TRACE_DEBUG("Notification received on report ID: %d", p_rpt->rpt_id);
/* need to append report ID to the head of data */
if (p_rpt->rpt_id != 0)
{
if ((p_buf = (UINT8 *)GKI_getbuf((UINT16)(p_data->len + 1))) == NULL)
{
- APPL_TRACE_ERROR0("No resources to send report data");
+ APPL_TRACE_ERROR("No resources to send report data");
return;
}
@@ -2292,7 +2393,6 @@
GKI_freebuf(p_buf);
}
-
/*******************************************************************************
**
** Function bta_hh_gatt_open_fail
@@ -2306,7 +2406,12 @@
{
tBTA_HH_CONN conn_dat ;
tBTA_HH_LE_HID_SRVC *p_hid_srvc = &p_cb->hid_srvc[0];
- UINT8 i;
+
+ /* open failure in the middle of service discovery, clear all services */
+ if (p_cb->disc_active & BTA_HH_LE_DISC_HIDS)
+ {
+ bta_hh_clear_service_cache(p_cb);
+ }
p_cb->disc_active = BTA_HH_LE_DISC_NONE;
/* Failure in opening connection or GATT discovery failure */
@@ -2320,16 +2425,11 @@
else
conn_dat.status = p_cb->status;
- for (i = 0; i < BTA_HH_LE_HID_SRVC_MAX; i ++, p_hid_srvc ++)
- {
- utl_freebuf((void **)&p_hid_srvc->rpt_map);
- memset(p_hid_srvc, 0, sizeof(tBTA_HH_LE_HID_SRVC));
- }
-
/* Report OPEN fail event */
(*bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH *)&conn_dat);
}
+
/*******************************************************************************
**
** Function bta_hh_gatt_close
@@ -2371,6 +2471,7 @@
return;
}
+
/*******************************************************************************
**
** Function bta_hh_le_api_disc_act
@@ -2383,7 +2484,12 @@
void bta_hh_le_api_disc_act(tBTA_HH_DEV_CB *p_cb)
{
if (p_cb->conn_id != BTA_GATT_INVALID_CONN_ID)
+ {
BTA_GATTC_Close(p_cb->conn_id);
+ /* remove device from background connection if intended to disconnect,
+ do not allow reconnection */
+ bta_hh_le_remove_dev_bg_conn(p_cb);
+ }
}
/*******************************************************************************
@@ -2403,7 +2509,7 @@
if (p_rpt == NULL)
{
- APPL_TRACE_ERROR0("bta_hh_le_get_rpt: no matching report");
+ APPL_TRACE_ERROR("bta_hh_le_get_rpt: no matching report");
return;
}
if (p_rpt->uuid == GATT_UUID_BATTERY_LEVEL)
@@ -2439,7 +2545,7 @@
if (p_buf == NULL || p_buf->len == 0)
{
- APPL_TRACE_ERROR0("bta_hh_le_write_rpt: Illegal data");
+ APPL_TRACE_ERROR("bta_hh_le_write_rpt: Illegal data");
return;
}
@@ -2452,11 +2558,11 @@
if (p_rpt == NULL)
{
- APPL_TRACE_ERROR0("bta_hh_le_write_rpt: no matching report");
+ APPL_TRACE_ERROR("bta_hh_le_write_rpt: no matching report");
return;
}
- APPL_TRACE_ERROR2("bta_hh_le_write_rpt: ReportID: 0x%02x Data Len: %d", rpt_id, p_buf->len);
+ APPL_TRACE_ERROR("bta_hh_le_write_rpt: ReportID: 0x%02x Data Len: %d", rpt_id, p_buf->len);
p_cb->w4_evt = w4_evt;
@@ -2471,6 +2577,7 @@
BTA_GATT_AUTH_REQ_NONE);
}
+
/*******************************************************************************
**
** Function bta_hh_le_suspend
@@ -2560,11 +2667,11 @@
break;
default:
- APPL_TRACE_ERROR1("unsupported trsanction for LE HID device: %d", p_data->api_sndcmd.t_type);
+ APPL_TRACE_ERROR("unsupported trsanction for LE HID device: %d", p_data->api_sndcmd.t_type);
break;
}
-
}
+
/*******************************************************************************
**
** Function bta_hh_le_get_dscp_act
@@ -2610,7 +2717,7 @@
{
/* start reconnection if remote is a bonded device */
/* verify bond */
- BTM_GetSecurityFlags(p_cb->addr, &sec_flag);
+ BTM_GetSecurityFlagsByTransport(p_cb->addr, &sec_flag, BT_TRANSPORT_LE);
if ((sec_flag & BTM_SEC_FLAG_LKEY_KNOWN) == 0)
to_add = FALSE;
@@ -2620,7 +2727,7 @@
!p_cb->in_bg_conn && to_add)
{
/* add device into BG connection to accept remote initiated connection */
- BTA_GATTC_Open(bta_hh_cb.gatt_if, p_cb->addr, FALSE);
+ BTA_GATTC_Open(bta_hh_cb.gatt_if, p_cb->addr, FALSE, BTA_GATT_TRANSPORT_LE);
p_cb->in_bg_conn = TRUE;
BTA_DmBleSetBgConnType(BTA_DM_BLE_CONN_AUTO, NULL);
@@ -2682,6 +2789,7 @@
BTA_GATTC_CancelOpen(bta_hh_cb.gatt_if, p_dev_cb->addr, FALSE);
}
}
+
/*******************************************************************************
**
** Function bta_hh_le_update_scpp
@@ -2702,7 +2810,7 @@
p_dev_cb->mode != BTA_HH_PROTO_RPT_MODE ||
p_dev_cb->scps_supported == FALSE)
{
- APPL_TRACE_ERROR0("Can not set ScPP scan paramter as boot host, or remote does not support ScPP ");
+ APPL_TRACE_ERROR("Can not set ScPP scan paramter as boot host, or remote does not support ScPP ");
cback_data.handle = p_dev_cb->hid_handle;
cback_data.status = BTA_HH_ERR;
@@ -2727,6 +2835,7 @@
BTA_GATT_AUTH_REQ_NONE);
}
+
/*******************************************************************************
**
** Function bta_hh_gattc_callback
@@ -2741,7 +2850,7 @@
tBTA_HH_DEV_CB *p_dev_cb;
UINT16 evt;
#if BTA_HH_DEBUG
- APPL_TRACE_DEBUG1("bta_hh_gattc_callback event = %d", event);
+ APPL_TRACE_DEBUG("bta_hh_gattc_callback event = %d", event);
#endif
if (p_data == NULL)
return;
@@ -2834,7 +2943,7 @@
index = bta_hh_find_cb(bd_addr);
if ((index = bta_hh_find_cb(bd_addr))== BTA_HH_IDX_INVALID)
{
- APPL_TRACE_ERROR0("unknown device");
+ APPL_TRACE_ERROR("unknown device");
return;
}
@@ -2844,7 +2953,7 @@
if (p_rpt == NULL)
{
- APPL_TRACE_ERROR0("bta_hh_le_write_rpt: no matching report");
+ APPL_TRACE_ERROR("bta_hh_le_write_rpt: no matching report");
return;
}
@@ -2859,6 +2968,7 @@
return;
}
+
/*******************************************************************************
**
** Function bta_hh_le_search_scps
@@ -2885,6 +2995,7 @@
else
bta_hh_le_open_cmpl(p_cb);
}
+
/*******************************************************************************
**
** Function bta_hh_le_search_scps_chars
@@ -2943,7 +3054,7 @@
(p_dev_cb->scps_notify & BTA_HH_LE_SCPS_NOTIFY_SPT) != 0 &&
(p_dev_cb->scps_notify & BTA_HH_LE_SCPS_NOTIFY_ENB) == 0)
{
- BTM_GetSecurityFlags(p_dev_cb->addr, &sec_flag);
+ BTM_GetSecurityFlagsByTransport(p_dev_cb->addr, &sec_flag, BT_TRANSPORT_LE);
if ((sec_flag & BTM_SEC_FLAG_LKEY_KNOWN))
{
if (bta_hh_le_write_char_clt_cfg (p_dev_cb,
@@ -2965,6 +3076,7 @@
}
bta_hh_le_register_scpp_notif_cmpl(p_dev_cb, status);
}
+
/*******************************************************************************
**
** Function bta_hh_le_register_scpp_notif_cmpl
@@ -2989,6 +3101,60 @@
}
+
+/*******************************************************************************
+**
+** Function bta_hh_process_cache_rpt
+**
+** Description Process the cached reports
+**
+** Parameters:
+**
+*******************************************************************************/
+static void bta_hh_process_cache_rpt (tBTA_HH_DEV_CB *p_cb,
+ tBTA_HH_RPT_CACHE_ENTRY *p_rpt_cache,
+ UINT8 num_rpt)
+{
+ UINT8 i = 0;
+ tBTA_HH_LE_RPT *p_rpt;
+
+ if (num_rpt != 0) /* no cache is found */
+ {
+ p_cb->hid_srvc[BTA_HH_LE_RPT_GET_SRVC_INST_ID(p_rpt_cache->inst_id)].in_use = TRUE;
+
+ /* set the descriptor info */
+ p_cb->hid_srvc[BTA_HH_LE_RPT_GET_SRVC_INST_ID(p_rpt_cache->inst_id)].descriptor.dl_len =
+ p_cb->dscp_info.descriptor.dl_len;
+ p_cb->hid_srvc[BTA_HH_LE_RPT_GET_SRVC_INST_ID(p_rpt_cache->inst_id)].descriptor.dsc_list =
+ p_cb->dscp_info.descriptor.dsc_list;
+
+ for (; i <num_rpt; i ++, p_rpt_cache ++)
+ {
+ if ((p_rpt = bta_hh_le_find_alloc_report_entry (p_cb,
+ BTA_HH_LE_RPT_GET_SRVC_INST_ID(p_rpt_cache->inst_id),
+ p_rpt_cache->rpt_uuid,
+ BTA_HH_LE_RPT_GET_RPT_INST_ID(p_rpt_cache->inst_id),
+ p_rpt_cache->prop)) == NULL)
+ {
+ APPL_TRACE_ERROR("bta_hh_process_cache_rpt: allocation report entry failure");
+ break;
+ }
+ else
+ {
+ p_rpt->rpt_type = p_rpt_cache->rpt_type;
+ p_rpt->rpt_id = p_rpt_cache->rpt_id;
+
+ if(p_rpt->uuid == GATT_UUID_HID_BT_KB_INPUT ||
+ p_rpt->uuid == GATT_UUID_HID_BT_MOUSE_INPUT ||
+ (p_rpt->uuid == GATT_UUID_HID_REPORT && p_rpt->rpt_type == BTA_HH_RPTT_INPUT))
+ {
+ p_rpt->client_cfg_value = BTA_GATT_CLT_CONFIG_NOTIFICATION;
+ }
+ }
+ }
+ }
+}
+
#endif
diff --git a/bta/hh/bta_hh_main.c b/bta/hh/bta_hh_main.c
index c2554c1..e5c353d 100644
--- a/bta/hh/bta_hh_main.c
+++ b/bta/hh/bta_hh_main.c
@@ -357,7 +357,13 @@
default:
/* invalid handle, call bad API event */
- APPL_TRACE_ERROR1("wrong device handle: [%d]", p_data->hdr.layer_specific);
+ APPL_TRACE_ERROR("wrong device handle: [%d]", p_data->hdr.layer_specific);
+ /* Free the callback buffer now */
+ if (p_data != NULL && p_data->hid_cback.p_data != NULL)
+ {
+ GKI_freebuf(p_data->hid_cback.p_data);
+ p_data->hid_cback.p_data = NULL;
+ }
break;
}
if (cback_event)
@@ -369,14 +375,14 @@
{
#if BTA_HH_DEBUG == TRUE
in_state = p_cb->state;
- APPL_TRACE_EVENT3("bta_hh_sm_execute: State 0x%02x [%s], Event [%s]",
+ APPL_TRACE_EVENT("bta_hh_sm_execute: State 0x%02x [%s], Event [%s]",
in_state, bta_hh_state_code(in_state),
bta_hh_evt_code(debug_event));
#endif
if ((p_cb->state == BTA_HH_NULL_ST) || (p_cb->state >= BTA_HH_INVALID_ST))
{
- APPL_TRACE_ERROR2("bta_hh_sm_execute: Invalid state State = 0x%x, Event = %d",
+ APPL_TRACE_ERROR("bta_hh_sm_execute: Invalid state State = 0x%x, Event = %d",
p_cb->state,event);
return;
}
@@ -394,7 +400,7 @@
#if BTA_HH_DEBUG == TRUE
if (in_state != p_cb->state)
{
- APPL_TRACE_DEBUG3("HH State Change: [%s] -> [%s] after Event [%s]",
+ APPL_TRACE_DEBUG("HH State Change: [%s] -> [%s] after Event [%s]",
bta_hh_state_code(in_state),
bta_hh_state_code(p_cb->state),
bta_hh_evt_code(debug_event));
@@ -475,7 +481,7 @@
p_cb = &bta_hh_cb.kdev[index];
#if BTA_HH_DEBUG
- APPL_TRACE_DEBUG2("bta_hh_hdl_event:: handle = %d dev_cb[%d] ", p_msg->layer_specific, index);
+ APPL_TRACE_DEBUG("bta_hh_hdl_event:: handle = %d dev_cb[%d] ", p_msg->layer_specific, index);
#endif
bta_hh_sm_execute(p_cb, p_msg->event, (tBTA_HH_DATA *) p_msg);
}
diff --git a/bta/hh/bta_hh_utils.c b/bta/hh/bta_hh_utils.c
index 6130a88..dc20a0d 100644
--- a/bta/hh/bta_hh_utils.c
+++ b/bta/hh/bta_hh_utils.c
@@ -72,14 +72,14 @@
bdcmp(bda, bd_addr_null) != 0) )
{
#if BTA_HH_DEBUG
- APPL_TRACE_DEBUG2("found kdev_cb[%d] hid_handle = %d ", xx,
+ APPL_TRACE_DEBUG("found kdev_cb[%d] hid_handle = %d ", xx,
bta_hh_cb.kdev[xx].hid_handle)
#endif
return xx;
}
#if BTA_HH_DEBUG
else
- APPL_TRACE_DEBUG4("in_use ? [%d] kdev[%d].hid_handle = %d state = [%d]",
+ APPL_TRACE_DEBUG("in_use ? [%d] kdev[%d].hid_handle = %d state = [%d]",
bta_hh_cb.kdev[xx].in_use, xx,
bta_hh_cb.kdev[xx].hid_handle,
bta_hh_cb.kdev[xx].state);
@@ -97,7 +97,7 @@
}
/* If device list full, report BTA_HH_IDX_INVALID */
#if BTA_HH_DEBUG
- APPL_TRACE_DEBUG2("bta_hh_find_cb:: index = %d while max = %d",
+ APPL_TRACE_DEBUG("bta_hh_find_cb:: index = %d while max = %d",
xx, BTA_HH_MAX_DEVICE);
#endif
@@ -157,7 +157,7 @@
UINT16 version, UINT8 flag)
{
#if BTA_HH_DEBUG
- APPL_TRACE_DEBUG3("vendor_id = 0x%2x product_id = 0x%2x version = 0x%2x",
+ APPL_TRACE_DEBUG("vendor_id = 0x%2x product_id = 0x%2x version = 0x%2x",
vendor_id, product_id, version);
#endif
p_cb->dscp_info.vendor_id = vendor_id;
@@ -187,7 +187,7 @@
UINT8 app_id)
{
#if BTA_HH_DEBUG
- APPL_TRACE_DEBUG1("subclass = 0x%2x", sub_class);
+ APPL_TRACE_DEBUG("subclass = 0x%2x", sub_class);
#endif
p_cb->hid_handle = handle;
@@ -237,13 +237,13 @@
{
p_cb->app_id = p_bta_hh_cfg->p_devt_list[xx].app_id;
#if BTA_HH_DEBUG
- APPL_TRACE_EVENT1("bta_hh_tod_spt sub_class:0x%x supported", sub_class);
+ APPL_TRACE_EVENT("bta_hh_tod_spt sub_class:0x%x supported", sub_class);
#endif
return TRUE;
}
}
#if BTA_HH_DEBUG
- APPL_TRACE_EVENT1("bta_hh_tod_spt sub_class:0x%x NOT supported", sub_class);
+ APPL_TRACE_EVENT("bta_hh_tod_spt sub_class:0x%x NOT supported", sub_class);
#endif
return FALSE;
}
@@ -269,7 +269,7 @@
UINT8 this_report[BTA_HH_MAX_RPT_CHARS];
#if BTA_HH_DEBUG
- APPL_TRACE_DEBUG2("bta_hh_parse_keybd_rpt: (report=%p, report_len=%d) called",
+ APPL_TRACE_DEBUG("bta_hh_parse_keybd_rpt: (report=%p, report_len=%d) called",
p_report, report_len);
#endif
@@ -291,7 +291,7 @@
{
if (ctl_shift & bta_hh_mod_key_mask[xx])
{
- APPL_TRACE_DEBUG1("Mod Key[%02x] pressed", bta_hh_mod_key_mask[xx] );
+ APPL_TRACE_DEBUG("Mod Key[%02x] pressed", bta_hh_mod_key_mask[xx] );
p_kb->mod_key[xx] = TRUE;
}
else if (p_kb->mod_key[xx])
@@ -321,7 +321,7 @@
for (xx = 0; xx < report_len; xx++)
{
#if BTA_HH_DEBUG
- APPL_TRACE_DEBUG1("this_char = %02x", this_report[xx]);
+ APPL_TRACE_DEBUG("this_char = %02x", this_report[xx]);
#endif
if ((this_char = this_report[xx]) == 0)
continue;
@@ -334,7 +334,7 @@
p_data->this_char[key_idx ++] = this_char;
#if BTA_HH_DEBUG
- APPL_TRACE_DEBUG1("found keycode %02x ", this_report[xx]);
+ APPL_TRACE_DEBUG("found keycode %02x ", this_report[xx]);
#endif
p_data->caps_lock = p_kb->caps_lock;
p_data->num_lock = p_kb->num_lock;
@@ -362,7 +362,7 @@
#if BTA_HH_DEBUG
UINT8 xx;
- APPL_TRACE_DEBUG2("bta_hh_parse_mice_rpt: bta_keybd_rpt_rcvd(report=%p, \
+ APPL_TRACE_DEBUG("bta_hh_parse_mice_rpt: bta_keybd_rpt_rcvd(report=%p, \
report_len=%d) called", p_report, report_len);
#endif
@@ -375,7 +375,7 @@
#if BTA_HH_DEBUG
for (xx = 0; xx < report_len; xx++)
{
- APPL_TRACE_DEBUG1("this_char = %02x", p_report[xx]);
+ APPL_TRACE_DEBUG("this_char = %02x", p_report[xx]);
}
#endif
@@ -389,8 +389,8 @@
p_data->delta_y = p_report[2];
#if BTA_HH_DEBUG
- APPL_TRACE_DEBUG1("mice button: 0x%2x", p_data->mouse_button);
- APPL_TRACE_DEBUG2("mice move: x = %d y = %d", p_data->delta_x,
+ APPL_TRACE_DEBUG("mice button: 0x%2x", p_data->mouse_button);
+ APPL_TRACE_DEBUG("mice move: x = %d y = %d", p_data->delta_x,
p_data->delta_y );
#endif
@@ -413,8 +413,6 @@
tBTA_HH_CB *p_cb = &bta_hh_cb;
UINT8 i;
UINT16 ssr_max_latency;
- /* lock other GKI task */
- GKI_sched_lock();
for (i = 0; i < BTA_HH_MAX_KNOWN; i ++)
{
if (memcmp(p_cb->kdev[i].addr, bd_addr, BD_ADDR_LEN) == 0)
@@ -449,7 +447,6 @@
break;
}
}
- GKI_sched_unlock();
return status;
}
@@ -499,7 +496,7 @@
if (BTA_HH_IS_LE_DEV_HDL_VALID(dev_handle))
index = bta_hh_cb.le_cb_index[BTA_HH_GET_LE_CB_IDX(dev_handle)];
#if BTA_HH_DEBUG == TRUE
- APPL_TRACE_DEBUG2("bta_hh_dev_handle_to_cb_idx dev_handle = %d index = %d", dev_handle, index);
+ APPL_TRACE_DEBUG("bta_hh_dev_handle_to_cb_idx dev_handle = %d index = %d", dev_handle, index);
#endif
}
else
@@ -525,18 +522,18 @@
{
UINT8 xx;
- APPL_TRACE_DEBUG0("bta_hh_trace_dev_db:: Device DB list********************");
+ APPL_TRACE_DEBUG("bta_hh_trace_dev_db:: Device DB list********************");
for (xx = 0; xx < BTA_HH_MAX_DEVICE; xx++)
{
- APPL_TRACE_DEBUG3("kdev[%d] in_use[%d] handle[%d] ",xx,
+ APPL_TRACE_DEBUG("kdev[%d] in_use[%d] handle[%d] ",xx,
bta_hh_cb.kdev[xx].in_use, bta_hh_cb.kdev[xx].hid_handle);
- APPL_TRACE_DEBUG4("\t\t\t attr_mask[%04x] state [%d] sub_class[%02x] index = %d",
+ APPL_TRACE_DEBUG("\t\t\t attr_mask[%04x] state [%d] sub_class[%02x] index = %d",
bta_hh_cb.kdev[xx].attr_mask, bta_hh_cb.kdev[xx].state,
bta_hh_cb.kdev[xx].sub_class, bta_hh_cb.kdev[xx].index);
}
- APPL_TRACE_DEBUG0("*********************************************************");
+ APPL_TRACE_DEBUG("*********************************************************");
}
#endif
#endif /* HL_INCLUDED */
diff --git a/bta/hl/bta_hl_act.c b/bta/hl/bta_hl_act.c
index 01528aa..b4c65c3 100644
--- a/bta/hl/bta_hl_act.c
+++ b/bta/hl/bta_hl_act.c
@@ -91,7 +91,7 @@
tBTA_HL evt_data;
#if (BTA_HL_DEBUG == TRUE)
- APPL_TRACE_DEBUG2("bta_hl_dch_mca_cong_change mdl_id=%d cong=%d",
+ APPL_TRACE_DEBUG("bta_hl_dch_mca_cong_change mdl_id=%d cong=%d",
p_cong_chg->mdl_id,
p_cong_chg->cong);
#endif
@@ -124,7 +124,7 @@
UNUSED(p_data);
#if (BTA_HL_DEBUG == TRUE)
- APPL_TRACE_DEBUG0("bta_hl_dch_echo_test");
+ APPL_TRACE_DEBUG("bta_hl_dch_echo_test");
#endif
p_dcb->echo_oper = BTA_HL_ECHO_OP_CI_GET_ECHO_DATA;
@@ -152,7 +152,7 @@
tBTA_HL_MDL_CB *p_dcb = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
#if (BTA_HL_DEBUG == TRUE)
- APPL_TRACE_DEBUG0("bta_hl_dch_sdp_init");
+ APPL_TRACE_DEBUG("bta_hl_dch_sdp_init");
#endif
if ( p_mcb->sdp_oper == BTA_HL_SDP_OP_NONE)
{
@@ -169,14 +169,14 @@
if (bta_hl_init_sdp(p_mcb->sdp_oper, app_idx, mcl_idx, mdl_idx) != BTA_HL_STATUS_OK)
{
- APPL_TRACE_ERROR0("SDP INIT failed");
+ APPL_TRACE_ERROR("SDP INIT failed");
p_mcb->sdp_oper = BTA_HL_SDP_OP_NONE;
bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_SDP_FAIL_EVT, p_data);
}
}
else
{
- APPL_TRACE_ERROR0("SDP in use");
+ APPL_TRACE_ERROR("SDP in use");
bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_SDP_FAIL_EVT, p_data);
}
}
@@ -197,7 +197,7 @@
tBTA_HL_MDL_CB *p_dcb = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
#if (BTA_HL_DEBUG == TRUE)
- APPL_TRACE_DEBUG0("bta_hl_dch_close_echo_test");
+ APPL_TRACE_DEBUG("bta_hl_dch_close_echo_test");
#endif
switch (p_dcb->echo_oper)
@@ -238,7 +238,7 @@
tBTA_HL_MDL_CB *p_dcb = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
#if (BTA_HL_DEBUG == TRUE)
- APPL_TRACE_DEBUG0("bta_hl_dch_mca_rcv_data");
+ APPL_TRACE_DEBUG("bta_hl_dch_mca_rcv_data");
#endif
if (p_dcb->local_mdep_id == BTA_HL_ECHO_TEST_MDEP_ID)
@@ -266,7 +266,7 @@
BTA_HL_CI_PUT_ECHO_DATA_EVT);
break;
default:
- APPL_TRACE_ERROR1("Unknonw echo_oper=%d",p_dcb->echo_oper);
+ APPL_TRACE_ERROR("Unknonw echo_oper=%d",p_dcb->echo_oper);
break;
}
@@ -302,7 +302,7 @@
tBTA_HL_MDL_CB *p_dcb = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
#if (BTA_HL_DEBUG == TRUE)
- APPL_TRACE_DEBUG0("bta_hl_dch_ci_put_echo_data");
+ APPL_TRACE_DEBUG("bta_hl_dch_ci_put_echo_data");
#endif
p_dcb->cout_oper &= ~BTA_HL_CO_PUT_ECHO_DATA_MASK;
@@ -332,7 +332,7 @@
tBTA_HL_STATUS status;
#if (BTA_HL_DEBUG == TRUE)
- APPL_TRACE_DEBUG0("bta_hl_dch_ci_get_echo_data");
+ APPL_TRACE_DEBUG("bta_hl_dch_ci_get_echo_data");
#endif
p_dcb->cout_oper &= ~BTA_HL_CO_GET_ECHO_DATA_MASK;
@@ -376,7 +376,7 @@
tBTA_HL evt_data;
#if (BTA_HL_DEBUG == TRUE)
- APPL_TRACE_DEBUG0("bta_hl_dch_ci_put_rx_data");
+ APPL_TRACE_DEBUG("bta_hl_dch_ci_put_rx_data");
#endif
p_dcb->cout_oper &= ~BTA_HL_CO_PUT_RX_DATA_MASK;
@@ -422,7 +422,7 @@
#if (BTA_HL_DEBUG == TRUE)
- APPL_TRACE_DEBUG0("bta_hl_dch_ci_get_tx_data");
+ APPL_TRACE_DEBUG("bta_hl_dch_ci_get_tx_data");
#endif
p_dcb->cout_oper &= ~BTA_HL_CO_GET_TX_DATA_MASK;
@@ -495,7 +495,7 @@
BOOLEAN success = TRUE;
#if (BTA_HL_DEBUG == TRUE)
- APPL_TRACE_DEBUG0("bta_hl_dch_send_data");
+ APPL_TRACE_DEBUG("bta_hl_dch_send_data");
#endif
if (!(p_dcb->cout_oper & BTA_HL_CO_GET_TX_DATA_MASK))
@@ -552,9 +552,9 @@
#if (BTA_HL_DEBUG == TRUE)
#if (BT_TRACE_VERBOSE == TRUE)
- APPL_TRACE_DEBUG1("bta_hl_dch_close_cmpl dch oper=%s", bta_hl_dch_oper_code(p_dcb->dch_oper));
+ APPL_TRACE_DEBUG("bta_hl_dch_close_cmpl dch oper=%s", bta_hl_dch_oper_code(p_dcb->dch_oper));
#else
- APPL_TRACE_DEBUG1("bta_hl_dch_close_cmpl dch oper=%d", p_dcb->dch_oper);
+ APPL_TRACE_DEBUG("bta_hl_dch_close_cmpl dch oper=%d", p_dcb->dch_oper);
#endif
#endif
@@ -653,9 +653,9 @@
default:
#if (BTA_HL_DEBUG == TRUE)
#if (BT_TRACE_VERBOSE == TRUE)
- APPL_TRACE_ERROR1("DCH operation not found oper=%s", bta_hl_dch_oper_code(p_dcb->dch_oper));
+ APPL_TRACE_ERROR("DCH operation not found oper=%s", bta_hl_dch_oper_code(p_dcb->dch_oper));
#else
- APPL_TRACE_ERROR1("DCH operation not found oper=%d", p_dcb->dch_oper);
+ APPL_TRACE_ERROR("DCH operation not found oper=%d", p_dcb->dch_oper);
#endif
#endif
send_evt=FALSE;
@@ -684,7 +684,7 @@
case BTA_HL_ECHO_OP_ECHO_PKT:
break;
default:
- APPL_TRACE_ERROR1("Invalid echo_oper=%d", p_dcb->echo_oper);
+ APPL_TRACE_ERROR("Invalid echo_oper=%d", p_dcb->echo_oper);
break;
}
}
@@ -712,9 +712,9 @@
{
#if (BTA_HL_DEBUG == TRUE)
#if (BT_TRACE_VERBOSE == TRUE)
- APPL_TRACE_DEBUG1("Send Event: %s", bta_hl_cback_evt_code(event));
+ APPL_TRACE_DEBUG("Send Event: %s", bta_hl_cback_evt_code(event));
#else
- APPL_TRACE_DEBUG1("Send Event: 0x%02x", event);
+ APPL_TRACE_DEBUG("Send Event: 0x%02x", event);
#endif
#endif
p_acb->p_cback(event,(tBTA_HL *) &evt_data );
@@ -739,9 +739,9 @@
#if (BTA_HL_DEBUG == TRUE)
#if (BT_TRACE_VERBOSE == TRUE)
- APPL_TRACE_DEBUG1("bta_hl_dch_mca_close_ind dch oper=%s", bta_hl_dch_oper_code(p_dcb->dch_oper));
+ APPL_TRACE_DEBUG("bta_hl_dch_mca_close_ind dch oper=%s", bta_hl_dch_oper_code(p_dcb->dch_oper));
#else
- APPL_TRACE_DEBUG1("bta_hl_dch_mca_close_ind dch oper=%d", p_dcb->dch_oper);
+ APPL_TRACE_DEBUG("bta_hl_dch_mca_close_ind dch oper=%d", p_dcb->dch_oper);
#endif
#endif
@@ -783,9 +783,9 @@
#if (BTA_HL_DEBUG == TRUE)
#if (BT_TRACE_VERBOSE == TRUE)
- APPL_TRACE_DEBUG1("bta_hl_dch_mca_close_cfm dch_oper=%s", bta_hl_dch_oper_code(p_dcb->dch_oper) );
+ APPL_TRACE_DEBUG("bta_hl_dch_mca_close_cfm dch_oper=%s", bta_hl_dch_oper_code(p_dcb->dch_oper) );
#else
- APPL_TRACE_DEBUG1("bta_hl_dch_mca_close_cfm dch_oper=%d", p_dcb->dch_oper);
+ APPL_TRACE_DEBUG("bta_hl_dch_mca_close_cfm dch_oper=%d", p_dcb->dch_oper);
#endif
#endif
@@ -803,9 +803,9 @@
default:
#if (BTA_HL_DEBUG == TRUE)
#if (BT_TRACE_VERBOSE == TRUE)
- APPL_TRACE_ERROR1("Invalid dch_oper=%s for close cfm", bta_hl_dch_oper_code(p_dcb->dch_oper) );
+ APPL_TRACE_ERROR("Invalid dch_oper=%s for close cfm", bta_hl_dch_oper_code(p_dcb->dch_oper) );
#else
- APPL_TRACE_ERROR1("Invalid dch_oper=%d for close cfm", p_dcb->dch_oper);
+ APPL_TRACE_ERROR("Invalid dch_oper=%d for close cfm", p_dcb->dch_oper);
#endif
#endif
break;
@@ -832,7 +832,7 @@
tBTA_HL evt_data;
#if (BTA_HL_DEBUG == TRUE)
- APPL_TRACE_DEBUG0("bta_hl_dch_mca_close");
+ APPL_TRACE_DEBUG("bta_hl_dch_mca_close");
#endif
if (!p_dcb->cout_oper)
{
@@ -887,7 +887,7 @@
#if (BTA_HL_DEBUG == TRUE)
- APPL_TRACE_DEBUG0("bta_hl_dch_mca_open_ind");
+ APPL_TRACE_DEBUG("bta_hl_dch_mca_open_ind");
#endif
if ((p_dcb->dch_oper == BTA_HL_DCH_OP_REMOTE_OPEN) ||
(p_dcb->dch_oper == BTA_HL_DCH_OP_REMOTE_RECONNECT) )
@@ -957,7 +957,7 @@
}
else
{
- APPL_TRACE_ERROR0("Unabel to close DCH for reconnect cfg mismatch");
+ APPL_TRACE_ERROR("Unabel to close DCH for reconnect cfg mismatch");
}
}
break;
@@ -995,7 +995,7 @@
#if (BTA_HL_DEBUG == TRUE)
- APPL_TRACE_DEBUG0("bta_hl_dch_mca_open_cfm");
+ APPL_TRACE_DEBUG("bta_hl_dch_mca_open_cfm");
#endif
if ((p_dcb->dch_oper == BTA_HL_DCH_OP_LOCAL_OPEN) ||
(p_dcb->dch_oper == BTA_HL_DCH_OP_LOCAL_RECONNECT))
@@ -1034,7 +1034,7 @@
}
else
{
- APPL_TRACE_ERROR1("Error dch oper =%d", p_dcb->dch_oper);
+ APPL_TRACE_ERROR("Error dch oper =%d", p_dcb->dch_oper);
return;
}
@@ -1079,7 +1079,7 @@
}
else
{
- APPL_TRACE_ERROR0("Unabel to close DCH for reconnect cfg mismatch");
+ APPL_TRACE_ERROR("Unabel to close DCH for reconnect cfg mismatch");
}
}
break;
@@ -1108,7 +1108,7 @@
#if (BTA_HL_DEBUG == TRUE)
- APPL_TRACE_DEBUG0("bta_hl_dch_mca_abort_ind");
+ APPL_TRACE_DEBUG("bta_hl_dch_mca_abort_ind");
#endif
p_dcb->abort_oper |= BTA_HL_ABORT_REMOTE_MASK;
@@ -1133,7 +1133,7 @@
tBTA_HL evt_data;
#if (BTA_HL_DEBUG == TRUE)
- APPL_TRACE_DEBUG0("bta_hl_dch_mca_abort_cfm");
+ APPL_TRACE_DEBUG("bta_hl_dch_mca_abort_cfm");
#endif
if (p_dcb->abort_oper)
@@ -1156,7 +1156,7 @@
}
else
{
- APPL_TRACE_ERROR0("Not expecting Abort CFM ");
+ APPL_TRACE_ERROR("Not expecting Abort CFM ");
}
}
@@ -1216,7 +1216,7 @@
}
#if (BTA_HL_DEBUG == TRUE)
- APPL_TRACE_DEBUG1("bta_hl_dch_mca_abort abort_oper=0x%x", p_dcb->abort_oper);
+ APPL_TRACE_DEBUG("bta_hl_dch_mca_abort abort_oper=0x%x", p_dcb->abort_oper);
#endif
}
@@ -1242,7 +1242,7 @@
#if (BTA_HL_DEBUG == TRUE)
- APPL_TRACE_DEBUG1("bta_hl_dch_mca_reconnect_ind mdl_id=%d", p_reconnect_ind->mdl_id);
+ APPL_TRACE_DEBUG("bta_hl_dch_mca_reconnect_ind mdl_id=%d", p_reconnect_ind->mdl_id);
#endif
if (bta_hl_find_mdl_cfg_idx(app_idx, mcl_idx, p_reconnect_ind->mdl_id, &mdl_cfg_idx))
@@ -1313,7 +1313,7 @@
#if (BTA_HL_DEBUG == TRUE)
- APPL_TRACE_DEBUG0("bta_hl_dch_mca_reconnect_cfm");
+ APPL_TRACE_DEBUG("bta_hl_dch_mca_reconnect_cfm");
#endif
if (p_dcb->abort_oper & BTA_HL_ABORT_PENDING_MASK)
{
@@ -1362,7 +1362,7 @@
UINT8 sdp_idx;
#if (BTA_HL_DEBUG == TRUE)
- APPL_TRACE_DEBUG0("bta_hl_dch_mca_reconnect");
+ APPL_TRACE_DEBUG("bta_hl_dch_mca_reconnect");
#endif
if (bta_hl_find_sdp_idx_using_ctrl_psm(&p_mcb->sdp, p_mcb->ctrl_psm, &sdp_idx))
{
@@ -1401,7 +1401,7 @@
UINT8 mca_rsp_code = MCA_RSP_SUCCESS;
#if (BTA_HL_DEBUG == TRUE)
- APPL_TRACE_DEBUG0("bta_hl_dch_create_rsp");
+ APPL_TRACE_DEBUG("bta_hl_dch_create_rsp");
#endif
if (p_create_rsp->rsp_code == BTA_HL_DCH_CREATE_RSP_SUCCESS)
{
@@ -1452,7 +1452,7 @@
tBTA_HL_ECHO_CFG *p_echo_cfg;
#if (BTA_HL_DEBUG == TRUE)
- APPL_TRACE_DEBUG0("bta_hl_dch_mca_create_ind");
+ APPL_TRACE_DEBUG("bta_hl_dch_mca_create_ind");
#endif
if (bta_hl_find_mdep_cfg_idx(app_idx, p_create_ind->dep_id, &mdep_cfg_idx))
@@ -1551,7 +1551,7 @@
tMCA_CREATE_CFM *p_create_cfm = &p_data->mca_evt.mca_data.create_cfm;
#if (BTA_HL_DEBUG == TRUE)
- APPL_TRACE_DEBUG0("bta_hl_dch_mca_create_cfm");
+ APPL_TRACE_DEBUG("bta_hl_dch_mca_create_cfm");
#endif
if (p_dcb->abort_oper & BTA_HL_ABORT_PENDING_MASK)
@@ -1572,7 +1572,7 @@
if (MCA_DataChnlCfg((tMCA_CL) p_mcb->mcl_handle, &p_dcb->chnl_cfg)!= MCA_SUCCESS)
{
/* this should not happen */
- APPL_TRACE_ERROR0("Unable to create data channel");
+ APPL_TRACE_ERROR("Unable to create data channel");
MCA_Abort((tMCA_CL) p_mcb->mcl_handle);
bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_CLOSE_CMPL_EVT, p_data);
}
@@ -1592,7 +1592,7 @@
}
else
{
- APPL_TRACE_ERROR0("MCA Create- failed");
+ APPL_TRACE_ERROR("MCA Create- failed");
bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_CLOSE_CMPL_EVT, p_data);
}
}
@@ -1616,7 +1616,7 @@
UINT8 sdp_idx;
#if BTA_HL_DEBUG == TRUE
- APPL_TRACE_DEBUG0("bta_hl_dch_mca_create");
+ APPL_TRACE_DEBUG("bta_hl_dch_mca_create");
#endif
if (bta_hl_find_sdp_idx_using_ctrl_psm(&p_mcb->sdp, p_mcb->ctrl_psm, &sdp_idx) &&
@@ -1635,13 +1635,13 @@
p_dcb->local_cfg,
NULL )) != MCA_SUCCESS)
{
- APPL_TRACE_ERROR1("MCA_CreateMdl FAIL mca_result=%d", result);
+ APPL_TRACE_ERROR("MCA_CreateMdl FAIL mca_result=%d", result);
bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_CLOSE_CMPL_EVT, p_data);
}
}
else
{
- APPL_TRACE_ERROR0("MCA Create- SDP idx or peer MDEP cfg not found");
+ APPL_TRACE_ERROR("MCA Create- SDP idx or peer MDEP cfg not found");
bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_CLOSE_CMPL_EVT, p_data);
}
}
@@ -1660,7 +1660,7 @@
{
#if (BTA_HL_DEBUG == TRUE)
- APPL_TRACE_DEBUG0("bta_hl_dch_sdp_fail");
+ APPL_TRACE_DEBUG("bta_hl_dch_sdp_fail");
#endif
bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_CLOSE_CMPL_EVT, p_data);
}
@@ -1698,7 +1698,7 @@
UINT16 name_len;
#if BTA_HL_DEBUG == TRUE
- APPL_TRACE_DEBUG5("bta_hl_sdp_cback status:%d sdp_oper=%d app_idx=%d, mcl_idx=%d, mdl_idx=%d",
+ APPL_TRACE_DEBUG("bta_hl_sdp_cback status:%d sdp_oper=%d app_idx=%d, mcl_idx=%d, mdl_idx=%d",
status, sdp_oper, app_idx, mcl_idx, mdl_idx);
#endif
@@ -1726,7 +1726,7 @@
}
else
{
- APPL_TRACE_WARNING0("Control PSM not found");
+ APPL_TRACE_WARNING("Control PSM not found");
break;
}
if (SDP_FindAddProtoListsElemInRec(p_rec, UUID_PROTOCOL_L2CAP, &pe))
@@ -1735,7 +1735,7 @@
}
else
{
- APPL_TRACE_WARNING0("Data PSM not found");
+ APPL_TRACE_WARNING("Data PSM not found");
break;
}
@@ -1776,7 +1776,7 @@
}
else
{
- APPL_TRACE_WARNING0("MCAP SUP PROC not found");
+ APPL_TRACE_WARNING("MCAP SUP PROC not found");
break;
}
@@ -1785,7 +1785,7 @@
if (bta_hl_fill_sup_feature_list (p_attr, &sup_feature))
{
p_hdp_rec->num_mdeps = (UINT8) sup_feature.num_elems;
- APPL_TRACE_WARNING1("bta_hl_sdp_cback num_mdeps %d",sup_feature.num_elems);
+ APPL_TRACE_WARNING("bta_hl_sdp_cback num_mdeps %d",sup_feature.num_elems);
for (i=0; i<sup_feature.num_elems; i++)
{
p_hdp_rec->mdep_cfg[i].data_type = sup_feature.list_elem[i].data_type;
@@ -1801,7 +1801,7 @@
}
else
{
- APPL_TRACE_ERROR1("bta_hl_sdp_cback Incorrect Mdep[%d] Description (Null ptr)", i);
+ APPL_TRACE_ERROR("bta_hl_sdp_cback Incorrect Mdep[%d] Description (Null ptr)", i);
}
}
@@ -1809,39 +1809,39 @@
}
else
{
- APPL_TRACE_WARNING0("HDP supported feature list fill failed");
+ APPL_TRACE_WARNING("HDP supported feature list fill failed");
break;
}
}
else
{
- APPL_TRACE_WARNING0("HDP supported feature list not found");
+ APPL_TRACE_WARNING("HDP supported feature list not found");
break;
}
#if BTA_HL_DEBUG == TRUE
- APPL_TRACE_DEBUG3("record=%d ctrl_psm=%0x data_psm=%x",
+ APPL_TRACE_DEBUG("record=%d ctrl_psm=%0x data_psm=%x",
rec_cnt+1,
p_hdp_rec->ctrl_psm,
p_hdp_rec->data_psm );
- APPL_TRACE_DEBUG1("srv_name=[%s]",(p_hdp_rec->srv_name[0] != '\0')? p_hdp_rec->srv_name:"NULL");
- APPL_TRACE_DEBUG1("srv_desp=[%s]",(p_hdp_rec->srv_desp[0] != '\0')? p_hdp_rec->srv_desp:"NULL");
+ APPL_TRACE_DEBUG("srv_name=[%s]",(p_hdp_rec->srv_name[0] != '\0')? p_hdp_rec->srv_name:"NULL");
+ APPL_TRACE_DEBUG("srv_desp=[%s]",(p_hdp_rec->srv_desp[0] != '\0')? p_hdp_rec->srv_desp:"NULL");
for (i=0; i<sup_feature.num_elems; i++)
{
- APPL_TRACE_DEBUG5("index=0x%02x mdep_id=0x%04x data type=0x%04x mdep role=%s(0x%02x)",
+ APPL_TRACE_DEBUG("index=0x%02x mdep_id=0x%04x data type=0x%04x mdep role=%s(0x%02x)",
(i+1),
p_hdp_rec->mdep_cfg[i].mdep_id,
p_hdp_rec->mdep_cfg[i].data_type,
(p_hdp_rec->mdep_cfg[i].mdep_role == BTA_HL_MDEP_ROLE_SOURCE)?"Src":"Snk",
p_hdp_rec->mdep_cfg[i].mdep_role);
}
- APPL_TRACE_DEBUG1("provider_name=[%s]",(p_hdp_rec->provider_name[0] != '\0')? p_hdp_rec->provider_name:"NULL");
- APPL_TRACE_DEBUG1("found MCAP sup procedure=%d",
+ APPL_TRACE_DEBUG("provider_name=[%s]",(p_hdp_rec->provider_name[0] != '\0')? p_hdp_rec->provider_name:"NULL");
+ APPL_TRACE_DEBUG("found MCAP sup procedure=%d",
p_cb->sdp.sdp_rec[rec_cnt].mcap_sup_proc );
#endif
rec_cnt++;
if (rec_cnt >= BTA_HL_NUM_SDP_RECS)
{
- APPL_TRACE_WARNING1("No more spaces for SDP recs max_rec_cnt=%d", BTA_HL_NUM_SDP_RECS);
+ APPL_TRACE_WARNING("No more spaces for SDP recs max_rec_cnt=%d", BTA_HL_NUM_SDP_RECS);
break;
}
@@ -1860,7 +1860,7 @@
}
else
{
- APPL_TRACE_WARNING3("SDP Failed sdp_status=%d num_recs=%d sdp_parsing_ok=%d ",
+ APPL_TRACE_WARNING("SDP Failed sdp_status=%d num_recs=%d sdp_parsing_ok=%d ",
status, p_cb->sdp.num_recs,sdp_parsing_ok );
}
@@ -2113,7 +2113,7 @@
memset(p_spd_cb, 0, sizeof(tBTA_HL_SDP_CB));
#if BTA_HL_DEBUG == TRUE
- APPL_TRACE_DEBUG1("bta_hl_deallocate_spd_cback index=%d", sdp_cback_idx);
+ APPL_TRACE_DEBUG("bta_hl_deallocate_spd_cback index=%d", sdp_cback_idx);
#endif
@@ -2155,13 +2155,13 @@
if (i == BTA_HL_NUM_SDP_CBACKS)
{
- APPL_TRACE_WARNING0("No scb is available to allocate")
+ APPL_TRACE_WARNING("No scb is available to allocate")
}
else
{
#if BTA_HL_DEBUG == TRUE
- APPL_TRACE_DEBUG1("bta_hl_allocate_spd_cback cback_idx=%d ",i );
- APPL_TRACE_DEBUG4("sdp_oper=%d, app_idx=%d, mcl_idx=%d, mdl_idx=%d",
+ APPL_TRACE_DEBUG("bta_hl_allocate_spd_cback cback_idx=%d ",i );
+ APPL_TRACE_DEBUG("sdp_oper=%d, app_idx=%d, mcl_idx=%d, mdl_idx=%d",
bta_hl_cb.scb[i].sdp_oper,
bta_hl_cb.scb[i].app_idx,
bta_hl_cb.scb[i].mcl_idx,
@@ -2191,7 +2191,7 @@
tBTA_HL_STATUS status;
UINT8 sdp_cback_idx;
#if BTA_HL_DEBUG == TRUE
- APPL_TRACE_DEBUG4("bta_hl_init_sdp sdp_oper=%d app_idx=%d mcl_idx=%d, mdl_idx=%d",
+ APPL_TRACE_DEBUG("bta_hl_init_sdp sdp_oper=%d app_idx=%d mcl_idx=%d, mdl_idx=%d",
sdp_oper, app_idx, mcl_idx, mdl_idx);
#endif
if ((p_cb->sdp_cback = bta_hl_allocate_spd_cback(sdp_oper, app_idx, mcl_idx, mdl_idx, &sdp_cback_idx)) != NULL)
@@ -2260,7 +2260,7 @@
{
tBTA_HL_MCL_CB *p_cb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
#if BTA_HL_DEBUG == TRUE
- APPL_TRACE_DEBUG0("bta_hl_cch_init_sdp");
+ APPL_TRACE_DEBUG("bta_hl_cch_init_sdp");
#endif
if ( p_cb->sdp_oper == BTA_HL_SDP_OP_NONE)
{
@@ -2275,7 +2275,7 @@
}
else
{
- APPL_TRACE_ERROR0("SDP in use");
+ APPL_TRACE_ERROR("SDP in use");
bta_hl_cch_sm_execute(app_idx, mcl_idx, BTA_HL_CCH_SDP_FAIL_EVT, p_data);
}
}
@@ -2296,7 +2296,7 @@
UINT8 sdp_idx;
#if BTA_HL_DEBUG == TRUE
- APPL_TRACE_DEBUG0("bta_hl_cch_mca_open");
+ APPL_TRACE_DEBUG("bta_hl_cch_mca_open");
#endif
if (bta_hl_find_sdp_idx_using_ctrl_psm(&p_mcb->sdp, p_mcb->req_ctrl_psm, &sdp_idx))
@@ -2332,7 +2332,7 @@
tBTA_HL_MCL_CB *p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
#if BTA_HL_DEBUG == TRUE
- APPL_TRACE_DEBUG1("bta_hl_cch_mca_close mcl_handle=%d", p_mcb->mcl_handle);
+ APPL_TRACE_DEBUG("bta_hl_cch_mca_close mcl_handle=%d", p_mcb->mcl_handle);
#endif
if (p_mcb->sdp_oper != BTA_HL_SDP_OP_CCH_INIT)
{
@@ -2346,13 +2346,13 @@
else
{
p_mcb->close_pending = TRUE;
- APPL_TRACE_DEBUG0("No valid mcl_handle to stop the CCH setup now so wait until CCH is up then close it" );
+ APPL_TRACE_DEBUG("No valid mcl_handle to stop the CCH setup now so wait until CCH is up then close it" );
}
}
else
{
p_mcb->close_pending = TRUE;
- APPL_TRACE_DEBUG0("can not stop the CCH setup becasue SDP is in progress so wait until it is done" );
+ APPL_TRACE_DEBUG("can not stop the CCH setup becasue SDP is in progress so wait until it is done" );
}
}
@@ -2374,14 +2374,14 @@
tBTA_HL_EVT event;
BOOLEAN send_evt=TRUE;
#if BTA_HL_DEBUG == TRUE
- APPL_TRACE_DEBUG0("bta_hl_cch_close_cmpl");
+ APPL_TRACE_DEBUG("bta_hl_cch_close_cmpl");
#endif
bta_sys_conn_close(BTA_ID_HL, p_acb->app_id, p_mcb->bd_addr);
if (p_mcb->cch_oper == BTA_HL_CCH_OP_LOCAL_CLOSE && p_mcb->force_close_local_cch_opening)
{
p_mcb->cch_oper = BTA_HL_CCH_OP_LOCAL_OPEN;
- APPL_TRACE_DEBUG0("change cch_oper from BTA_HL_CCH_OP_LOCAL_CLOSE to BTA_HL_CCH_OP_LOCAL_OPEN");
+ APPL_TRACE_DEBUG("change cch_oper from BTA_HL_CCH_OP_LOCAL_CLOSE to BTA_HL_CCH_OP_LOCAL_OPEN");
}
switch (p_mcb->cch_oper)
@@ -2435,7 +2435,7 @@
tBTA_HL_MDL_CB *p_dcb;
UINT8 i;
#if BTA_HL_DEBUG == TRUE
- APPL_TRACE_DEBUG0("bta_hl_cch_mca_disconnect");
+ APPL_TRACE_DEBUG("bta_hl_cch_mca_disconnect");
#endif
p_mcb->intentional_close = FALSE;
@@ -2476,7 +2476,7 @@
tBTA_HL_MCL_CB *p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
#if BTA_HL_DEBUG == TRUE
- APPL_TRACE_DEBUG2("bta_hl_cch_mca_disc_open mcl_handle=0x%x close_pending=%d", p_data->mca_evt.mcl_handle, p_mcb->close_pending );
+ APPL_TRACE_DEBUG("bta_hl_cch_mca_disc_open mcl_handle=0x%x close_pending=%d", p_data->mca_evt.mcl_handle, p_mcb->close_pending );
#endif
p_mcb->close_pending = FALSE;
@@ -2498,7 +2498,7 @@
tBTA_HL_MCL_CB *p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
#if BTA_HL_DEBUG == TRUE
- APPL_TRACE_DEBUG0("bta_hl_cch_mca_rsp_tout");
+ APPL_TRACE_DEBUG("bta_hl_cch_mca_rsp_tout");
#endif
p_mcb->rsp_tout = TRUE;
@@ -2524,7 +2524,7 @@
BOOLEAN send_event=TRUE;
#if BTA_HL_DEBUG == TRUE
- APPL_TRACE_DEBUG1("bta_hl_cch_mca_connect mcl_handle=%d ", p_data->mca_evt.mcl_handle);
+ APPL_TRACE_DEBUG("bta_hl_cch_mca_connect mcl_handle=%d ", p_data->mca_evt.mcl_handle);
#endif
p_mcb->mcl_handle = p_data->mca_evt.mcl_handle;
@@ -2574,9 +2574,9 @@
#if (BTA_HL_DEBUG == TRUE)
#if (BT_TRACE_VERBOSE == TRUE)
- APPL_TRACE_EVENT1("bta_hl_mcap_ctrl_cback event[%s]",bta_hl_mcap_evt_code(event));
+ APPL_TRACE_EVENT("bta_hl_mcap_ctrl_cback event[%s]",bta_hl_mcap_evt_code(event));
#else
- APPL_TRACE_EVENT1("bta_hl_mcap_ctrl_cback event[0x%02x]", event);
+ APPL_TRACE_EVENT("bta_hl_mcap_ctrl_cback event[0x%02x]", event);
#endif
#endif
diff --git a/bta/hl/bta_hl_api.c b/bta/hl/bta_hl_api.c
index 6f5572b..86cb17f 100644
--- a/bta/hl/bta_hl_api.c
+++ b/bta/hl/bta_hl_api.c
@@ -63,9 +63,7 @@
tBTA_HL_API_ENABLE *p_buf;
/* register with BTA system manager */
- GKI_sched_lock();
bta_sys_register(BTA_ID_HL, &bta_hl_reg);
- GKI_sched_unlock();
if ((p_buf = (tBTA_HL_API_ENABLE *)GKI_getbuf(sizeof(tBTA_HL_API_ENABLE))) != NULL)
{
@@ -116,7 +114,7 @@
{
tBTA_HL_API_UPDATE *p_buf;
- APPL_TRACE_DEBUG0("BTA_HlUpdate");
+ APPL_TRACE_DEBUG("BTA_HlUpdate");
if (is_register)
{
diff --git a/bta/hl/bta_hl_ci.c b/bta/hl/bta_hl_ci.c
index bd04b44..e4749d7 100644
--- a/bta/hl/bta_hl_ci.c
+++ b/bta/hl/bta_hl_ci.c
@@ -51,7 +51,7 @@
tBTA_HL_CI_GET_PUT_DATA *p_evt;
#if (BTA_HL_DEBUG == TRUE)
- APPL_TRACE_DEBUG3("bta_hl_ci_get_tx_data mdl_handle=%d status=%d evt=%d\n",
+ APPL_TRACE_DEBUG("bta_hl_ci_get_tx_data mdl_handle=%d status=%d evt=%d\n",
mdl_handle, status, evt);
#endif
@@ -85,7 +85,7 @@
{
tBTA_HL_CI_GET_PUT_DATA *p_evt;
#if (BTA_HL_DEBUG == TRUE)
- APPL_TRACE_DEBUG3("bta_hl_ci_put_rx_data mdl_handle=%d status=%d evt=%d\n",
+ APPL_TRACE_DEBUG("bta_hl_ci_put_rx_data mdl_handle=%d status=%d evt=%d\n",
mdl_handle, status, evt);
#endif
@@ -121,7 +121,7 @@
tBTA_HL_CI_ECHO_DATA *p_evt;
#if (BTA_HL_DEBUG == TRUE)
- APPL_TRACE_DEBUG3("bta_hl_ci_get_echo_data mcl_handle=%d status=%d evt=%d\n",
+ APPL_TRACE_DEBUG("bta_hl_ci_get_echo_data mcl_handle=%d status=%d evt=%d\n",
mcl_handle, status, evt);
#endif
@@ -156,7 +156,7 @@
tBTA_HL_CI_ECHO_DATA *p_evt;
#if (BTA_HL_DEBUG == TRUE)
- APPL_TRACE_DEBUG3("bta_hl_ci_put_echo_data mcl_handle=%d status=%d evt=%d\n",
+ APPL_TRACE_DEBUG("bta_hl_ci_put_echo_data mcl_handle=%d status=%d evt=%d\n",
mcl_handle, status, evt);
#endif
diff --git a/bta/hl/bta_hl_main.c b/bta/hl/bta_hl_main.c
index 7b15585..7f08752 100644
--- a/bta/hl/bta_hl_main.c
+++ b/bta/hl/bta_hl_main.c
@@ -426,7 +426,7 @@
#if (BTA_HL_DEBUG == TRUE) && (BT_USE_TRACES == TRUE)
tBTA_HL_CCH_STATE in_state = p_cb->cch_state;
UINT16 cur_evt = event;
- APPL_TRACE_DEBUG3("HDP CCH Event Handler: State 0x%02x [%s], Event [%s]", in_state,
+ APPL_TRACE_DEBUG("HDP CCH Event Handler: State 0x%02x [%s], Event [%s]", in_state,
bta_hl_cch_state_code(in_state),
bta_hl_evt_code(cur_evt));
#endif
@@ -455,7 +455,7 @@
#if (BTA_HL_DEBUG == TRUE) && (BT_USE_TRACES == TRUE)
if (in_state != p_cb->cch_state)
{
- APPL_TRACE_DEBUG3("HL CCH State Change: [%s] -> [%s] after [%s]",
+ APPL_TRACE_DEBUG("HL CCH State Change: [%s] -> [%s] after [%s]",
bta_hl_cch_state_code(in_state),
bta_hl_cch_state_code(p_cb->cch_state),
bta_hl_evt_code(cur_evt));
@@ -484,7 +484,7 @@
#if (BTA_HL_DEBUG == TRUE) && (BT_USE_TRACES == TRUE)
tBTA_HL_DCH_STATE in_state = p_cb->dch_state;
UINT16 cur_evt = event;
- APPL_TRACE_DEBUG3("HDP DCH Event Handler: State 0x%02x [%s], Event [%s]", in_state,
+ APPL_TRACE_DEBUG("HDP DCH Event Handler: State 0x%02x [%s], Event [%s]", in_state,
bta_hl_dch_state_code(in_state),
bta_hl_evt_code(cur_evt));
#endif
@@ -514,7 +514,7 @@
#if (BTA_HL_DEBUG == TRUE) && (BT_USE_TRACES == TRUE)
if (in_state != p_cb->dch_state)
{
- APPL_TRACE_DEBUG3("HL DCH State Change: [%s] -> [%s] after [%s]",
+ APPL_TRACE_DEBUG("HL DCH State Change: [%s] -> [%s] after [%s]",
bta_hl_dch_state_code(in_state),
bta_hl_dch_state_code(p_cb->dch_state),
bta_hl_evt_code(cur_evt));
@@ -537,7 +537,7 @@
/* If already enabled then reject this request */
if (p_cb->enable)
{
- APPL_TRACE_ERROR0("HL is already enabled");
+ APPL_TRACE_ERROR("HL is already enabled");
evt_data.enable_cfm.status = BTA_HL_STATUS_FAIL;
if (p_data->api_enable.p_cback)
p_data->api_enable.p_cback(BTA_HL_CTRL_ENABLE_CFM_EVT, (tBTA_HL_CTRL *) &evt_data);
@@ -584,7 +584,7 @@
#if BTA_HL_DEBUG == TRUE
if (status != BTA_HL_STATUS_OK)
{
- APPL_TRACE_DEBUG1("bta_hl_api_disable status =%s", bta_hl_status_code(status));
+ APPL_TRACE_DEBUG("bta_hl_api_disable status =%s", bta_hl_status_code(status));
}
#endif
@@ -606,14 +606,14 @@
tBTA_HL_STATUS status = BTA_HL_STATUS_FAIL;
- APPL_TRACE_DEBUG0("bta_hl_api_update");
+ APPL_TRACE_DEBUG("bta_hl_api_update");
if (p_cb->enable)
{
status = bta_hl_app_update(p_data->api_update.app_id, p_data->api_update.is_register);
if (!p_data->api_update.is_register)
{
- APPL_TRACE_DEBUG0("Deregister");
+ APPL_TRACE_DEBUG("Deregister");
memset(&evt_data, 0, sizeof(tBTA_HL));
evt_data.dereg_cfm.status = status;
evt_data.dereg_cfm.app_id = p_data->api_update.app_id;
@@ -640,7 +640,7 @@
#if BTA_HL_DEBUG == TRUE
if (status != BTA_HL_STATUS_OK)
{
- APPL_TRACE_DEBUG1("bta_hl_api_register status =%s", bta_hl_status_code(status));
+ APPL_TRACE_DEBUG("bta_hl_api_register status =%s", bta_hl_status_code(status));
}
#endif
@@ -730,7 +730,7 @@
#if BTA_HL_DEBUG == TRUE
if (status != BTA_HL_STATUS_OK)
{
- APPL_TRACE_DEBUG1("bta_hl_api_register status =%s", bta_hl_status_code(status));
+ APPL_TRACE_DEBUG("bta_hl_api_register status =%s", bta_hl_status_code(status));
}
#endif
@@ -782,7 +782,7 @@
}
else
{
- APPL_TRACE_ERROR1("Invalid app_handle=%d", p_data->api_dereg.app_handle);
+ APPL_TRACE_ERROR("Invalid app_handle=%d", p_data->api_dereg.app_handle);
}
}
@@ -827,7 +827,7 @@
{
/* Only one MCL per BD_ADDR */
status = BTA_HL_STATUS_DUPLICATE_CCH_OPEN;
- APPL_TRACE_DEBUG1("bta_hl_api_cch_open: CCH already open: status =%d",status)
+ APPL_TRACE_DEBUG("bta_hl_api_cch_open: CCH already open: status =%d",status)
p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
if (p_acb->p_cback)
@@ -841,7 +841,7 @@
}
else
{
- APPL_TRACE_ERROR0("bta_hl_api_cch_open Null Callback");
+ APPL_TRACE_ERROR("bta_hl_api_cch_open Null Callback");
}
return;
}
@@ -853,7 +853,7 @@
#if BTA_HL_DEBUG == TRUE
if (status != BTA_HL_STATUS_OK)
{
- APPL_TRACE_DEBUG1("bta_hl_api_cch_open status =%s", bta_hl_status_code(status));
+ APPL_TRACE_DEBUG("bta_hl_api_cch_open status =%s", bta_hl_status_code(status));
}
#endif
switch (status)
@@ -876,11 +876,11 @@
}
else
{
- APPL_TRACE_ERROR0("bta_hl_api_cch_open Null Callback");
+ APPL_TRACE_ERROR("bta_hl_api_cch_open Null Callback");
}
break;
default:
- APPL_TRACE_ERROR1("status code=%d", status);
+ APPL_TRACE_ERROR("status code=%d", status);
break;
}
}
@@ -915,7 +915,7 @@
#if BTA_HL_DEBUG == TRUE
if (status != BTA_HL_STATUS_OK)
{
- APPL_TRACE_DEBUG1("bta_hl_api_cch_close status =%s", bta_hl_status_code(status));
+ APPL_TRACE_DEBUG("bta_hl_api_cch_close status =%s", bta_hl_status_code(status));
}
#endif
switch (status)
@@ -936,12 +936,12 @@
}
else
{
- APPL_TRACE_ERROR0("bta_hl_api_cch_close Null Callback");
+ APPL_TRACE_ERROR("bta_hl_api_cch_close Null Callback");
}
break;
default:
- APPL_TRACE_ERROR1("status code=%d", status);
+ APPL_TRACE_ERROR("status code=%d", status);
break;
}
@@ -974,7 +974,7 @@
p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
- APPL_TRACE_DEBUG4("bta_hl_api_dch_open: app_ix=%d, mcl_idx=%d, cch_state=%d, mcl_handle=%d",app_idx,mcl_idx,p_mcb->cch_state,p_data->api_dch_open.mcl_handle);
+ APPL_TRACE_DEBUG("bta_hl_api_dch_open: app_ix=%d, mcl_idx=%d, cch_state=%d, mcl_handle=%d",app_idx,mcl_idx,p_mcb->cch_state,p_data->api_dch_open.mcl_handle);
if (p_mcb->cch_state == BTA_HL_CCH_OPEN_ST)
{
if (bta_hl_find_avail_mdl_idx(app_idx, mcl_idx, &mdl_idx))
@@ -1057,7 +1057,7 @@
#if BTA_HL_DEBUG == TRUE
if (status != BTA_HL_STATUS_OK)
{
- APPL_TRACE_DEBUG1("bta_hl_api_dch_open status =%s", bta_hl_status_code(status));
+ APPL_TRACE_DEBUG("bta_hl_api_dch_open status =%s", bta_hl_status_code(status));
}
#endif
switch (status)
@@ -1091,12 +1091,12 @@
}
else
{
- APPL_TRACE_ERROR0("bta_hl_api_dch_open Null Callback");
+ APPL_TRACE_ERROR("bta_hl_api_dch_open Null Callback");
}
break;
default:
- APPL_TRACE_ERROR1("Status code=%d", status);
+ APPL_TRACE_ERROR("Status code=%d", status);
break;
}
@@ -1137,7 +1137,7 @@
#if BTA_HL_DEBUG == TRUE
if (status != BTA_HL_STATUS_OK)
{
- APPL_TRACE_DEBUG1("bta_hl_api_dch_close status =%s", bta_hl_status_code(status));
+ APPL_TRACE_DEBUG("bta_hl_api_dch_close status =%s", bta_hl_status_code(status));
}
#endif
@@ -1161,11 +1161,11 @@
}
else
{
- APPL_TRACE_ERROR0("bta_hl_api_dch_close Null Callback");
+ APPL_TRACE_ERROR("bta_hl_api_dch_close Null Callback");
}
break;
default:
- APPL_TRACE_ERROR1("Status code=%d", status);
+ APPL_TRACE_ERROR("Status code=%d", status);
break;
}
}
@@ -1230,12 +1230,12 @@
if (p_mdep_cfg->mdep_role == BTA_HL_MDEP_ROLE_SINK)
{
p_dcb->peer_mdep_role = BTA_HL_MDEP_ROLE_SOURCE;
- APPL_TRACE_DEBUG0("peer mdep role = SOURCE ");
+ APPL_TRACE_DEBUG("peer mdep role = SOURCE ");
}
else
{
p_dcb->peer_mdep_role = BTA_HL_MDEP_ROLE_SINK;
- APPL_TRACE_DEBUG0("peer mdep role = SINK ");
+ APPL_TRACE_DEBUG("peer mdep role = SINK ");
}
bta_hl_find_rxtx_apdu_size(app_idx, mdep_cfg_idx,
@@ -1271,7 +1271,7 @@
#if BTA_HL_DEBUG == TRUE
if (status != BTA_HL_STATUS_OK)
{
- APPL_TRACE_DEBUG1("bta_hl_api_dch_reconnect status=%s", bta_hl_status_code(status));
+ APPL_TRACE_DEBUG("bta_hl_api_dch_reconnect status=%s", bta_hl_status_code(status));
}
#endif
@@ -1303,11 +1303,11 @@
}
else
{
- APPL_TRACE_ERROR0("bta_hl_api_dch_reconnect Null Callback");
+ APPL_TRACE_ERROR("bta_hl_api_dch_reconnect Null Callback");
}
break;
default:
- APPL_TRACE_ERROR1("Status code=%d", status);
+ APPL_TRACE_ERROR("Status code=%d", status);
break;
}
}
@@ -1404,7 +1404,7 @@
#if BTA_HL_DEBUG == TRUE
if (status != BTA_HL_STATUS_OK)
{
- APPL_TRACE_DEBUG1("bta_hl_api_dch_echo_test status=%s", bta_hl_status_code(status));
+ APPL_TRACE_DEBUG("bta_hl_api_dch_echo_test status=%s", bta_hl_status_code(status));
}
#endif
@@ -1434,12 +1434,12 @@
}
else
{
- APPL_TRACE_ERROR0("bta_hl_api_dch_echo_test Null Callback");
+ APPL_TRACE_ERROR("bta_hl_api_dch_echo_test Null Callback");
}
break;
default:
- APPL_TRACE_ERROR1("Status code=%s", status);
+ APPL_TRACE_ERROR("Status code=%s", status);
break;
}
}
@@ -1472,7 +1472,7 @@
p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
p_mcb->in_use = TRUE;
bdcpy(p_mcb->bd_addr, p_data->api_sdp_query.bd_addr);
- APPL_TRACE_DEBUG3("bta_hl_api_sdp_query p_mcb->app_id %d app_idx %d mcl_idx %d", p_mcb->app_id, app_idx, mcl_idx);
+ APPL_TRACE_DEBUG("bta_hl_api_sdp_query p_mcb->app_id %d app_idx %d mcl_idx %d", p_mcb->app_id, app_idx, mcl_idx);
p_mcb->app_id = p_data->api_sdp_query.app_id;
p_mcb->sdp_oper = BTA_HL_SDP_OP_SDP_QUERY_NEW ;
}
@@ -1512,7 +1512,7 @@
#if BTA_HL_DEBUG == TRUE
if (status != BTA_HL_STATUS_OK)
{
- APPL_TRACE_DEBUG1("bta_hl_api_sdp_query status=%s", bta_hl_status_code(status));
+ APPL_TRACE_DEBUG("bta_hl_api_sdp_query status=%s", bta_hl_status_code(status));
}
#endif
switch (status)
@@ -1533,13 +1533,13 @@
}
else
{
- APPL_TRACE_ERROR0("bta_hl_api_sdp_query Null Callback");
+ APPL_TRACE_ERROR("bta_hl_api_sdp_query Null Callback");
}
break;
case BTA_HL_STATUS_OK:
break;
default:
- APPL_TRACE_ERROR1("Status code=%d", status);
+ APPL_TRACE_ERROR("Status code=%d", status);
break;
}
}
@@ -1593,11 +1593,11 @@
#if BTA_HL_DEBUG == TRUE
if (status != BTA_HL_STATUS_OK)
{
- APPL_TRACE_DEBUG1("bta_hl_sdp_query_results status=%s", bta_hl_status_code(status));
+ APPL_TRACE_DEBUG("bta_hl_sdp_query_results status=%s", bta_hl_status_code(status));
}
#endif
- APPL_TRACE_DEBUG3("bta_hl_sdp_query_results p_mcb->app_id %d app_idx %d mcl_idx %d", p_mcb->app_id, app_idx, mcl_idx);
+ APPL_TRACE_DEBUG("bta_hl_sdp_query_results p_mcb->app_id %d app_idx %d mcl_idx %d", p_mcb->app_id, app_idx, mcl_idx);
bta_hl_build_sdp_query_cfm(&evt_data,p_mcb->app_id, p_acb->app_handle,
p_mcb->bd_addr,p_sdp,status);
p_acb->p_cback(BTA_HL_SDP_QUERY_CFM_EVT,(tBTA_HL *) &evt_data );
@@ -1685,7 +1685,7 @@
#if BTA_HL_DEBUG == TRUE
if (status != BTA_HL_STATUS_OK)
{
- APPL_TRACE_DEBUG1("bta_hl_api_delete_mdl status=%s", bta_hl_status_code(status));
+ APPL_TRACE_DEBUG("bta_hl_api_delete_mdl status=%s", bta_hl_status_code(status));
}
#endif
switch (status)
@@ -1707,11 +1707,11 @@
}
else
{
- APPL_TRACE_ERROR0("bta_hl_api_delete_mdl Null Callback");
+ APPL_TRACE_ERROR("bta_hl_api_delete_mdl Null Callback");
}
break;
default:
- APPL_TRACE_ERROR1("status code =%d", status);
+ APPL_TRACE_ERROR("status code =%d", status);
break;
}
}
@@ -1771,7 +1771,7 @@
#if BTA_HL_DEBUG == TRUE
if (status != BTA_HL_STATUS_OK)
{
- APPL_TRACE_DEBUG1("bta_hl_api_delete_mdl status=%s", bta_hl_status_code(status));
+ APPL_TRACE_DEBUG("bta_hl_api_delete_mdl status=%s", bta_hl_status_code(status));
}
#endif
@@ -1790,7 +1790,7 @@
}
else
{
- APPL_TRACE_ERROR0("bta_hl_mca_delete_mdl_cfm Null Callback");
+ APPL_TRACE_ERROR("bta_hl_mca_delete_mdl_cfm Null Callback");
}
}
@@ -1836,7 +1836,7 @@
#if BTA_HL_DEBUG == TRUE
if (!send_ind_evt)
{
- APPL_TRACE_DEBUG1("bta_hl_mca_delete_mdl_ind is_send_ind_evt =%d", send_ind_evt);
+ APPL_TRACE_DEBUG("bta_hl_mca_delete_mdl_ind is_send_ind_evt =%d", send_ind_evt);
}
#endif
@@ -1852,7 +1852,7 @@
}
else
{
- APPL_TRACE_ERROR0("bta_hl_mca_delete_mdl_ind Null Callback");
+ APPL_TRACE_ERROR("bta_hl_mca_delete_mdl_ind Null Callback");
}
}
}
@@ -1908,7 +1908,7 @@
#if BTA_HL_DEBUG == TRUE
if (status != BTA_HL_STATUS_OK)
{
- APPL_TRACE_DEBUG1("bta_hl_api_dch_abort status=%s", bta_hl_status_code(status));
+ APPL_TRACE_DEBUG("bta_hl_api_dch_abort status=%s", bta_hl_status_code(status));
}
#endif
switch (status)
@@ -1935,11 +1935,11 @@
}
else
{
- APPL_TRACE_ERROR0("bta_hl_api_dch_abort Null Callback");
+ APPL_TRACE_ERROR("bta_hl_api_dch_abort Null Callback");
}
break;
default:
- APPL_TRACE_ERROR1("Status code=%d", status);
+ APPL_TRACE_ERROR("Status code=%d", status);
break;
}
}
@@ -1959,7 +1959,7 @@
BOOLEAN success = TRUE;
#if BTA_HL_DEBUG == TRUE
- APPL_TRACE_DEBUG1("BTA HL Event Handler: Event [%s]",
+ APPL_TRACE_DEBUG("BTA HL Event Handler: Event [%s]",
bta_hl_evt_code(p_msg->event));
#endif
@@ -2036,10 +2036,10 @@
else
{
#if BTA_HL_DEBUG == TRUE
- APPL_TRACE_ERROR1("unable to find control block indexes for CCH: [event=%s]",
+ APPL_TRACE_ERROR("unable to find control block indexes for CCH: [event=%s]",
bta_hl_evt_code(p_msg->event));
#else
- APPL_TRACE_ERROR1("unable to find control block indexes for CCH: [event=%d]", p_msg->event);
+ APPL_TRACE_ERROR("unable to find control block indexes for CCH: [event=%d]", p_msg->event);
#endif
success = FALSE;
}
@@ -2057,10 +2057,10 @@
{
#if BTA_HL_DEBUG == TRUE
- APPL_TRACE_ERROR1("unable to find control block indexes for DCH : [event=%s]",
+ APPL_TRACE_ERROR("unable to find control block indexes for DCH : [event=%s]",
bta_hl_evt_code(p_msg->event));
#else
- APPL_TRACE_ERROR1("unable to find control block indexes for DCH: [event=%d]", p_msg->event);
+ APPL_TRACE_ERROR("unable to find control block indexes for DCH: [event=%d]", p_msg->event);
#endif
success = FALSE;
}
diff --git a/bta/hl/bta_hl_sdp.c b/bta/hl/bta_hl_sdp.c
index 43d22d2..14171fa 100644
--- a/bta/hl/bta_hl_sdp.c
+++ b/bta/hl/bta_hl_sdp.c
@@ -286,7 +286,7 @@
mdep_id = (UINT8)p_cb->sup_feature.mdep[i].mdep_id;
mdep_role = (UINT8)p_cb->sup_feature.mdep[i].mdep_cfg.mdep_role;
- APPL_TRACE_DEBUG1("num_of_mdep_data_types %d ", p_cb->sup_feature.mdep[i].mdep_cfg.num_of_mdep_data_types);
+ APPL_TRACE_DEBUG("num_of_mdep_data_types %d ", p_cb->sup_feature.mdep[i].mdep_cfg.num_of_mdep_data_types);
for (j=0; j<p_cb->sup_feature.mdep[i].mdep_cfg.num_of_mdep_data_types; j++)
{
sup_feature_list.list_elem[cnt].mdep_id = mdep_id;
@@ -338,7 +338,7 @@
for(i=0; i < num_services; i++)
{
bta_sys_add_uuid(svc_class_id_list[i]);
- APPL_TRACE_DEBUG2("dbg bta_sys_add_uuid i=%d uuid=0x%x", i, svc_class_id_list[i]); //todo
+ APPL_TRACE_DEBUG("dbg bta_sys_add_uuid i=%d uuid=0x%x", i, svc_class_id_list[i]); //todo
}
}
else
@@ -351,7 +351,7 @@
status = BTA_HL_STATUS_SDP_FAIL;
}
#if BTA_HL_DEBUG == TRUE
- APPL_TRACE_DEBUG1("bta_hl_sdp_update status=%s", bta_hl_status_code(status));
+ APPL_TRACE_DEBUG("bta_hl_sdp_update status=%s", bta_hl_status_code(status));
#endif
return status;
}
@@ -390,7 +390,7 @@
tBTA_HL_STATUS status = BTA_HL_STATUS_OK;
#if BTA_HL_DEBUG == TRUE
- APPL_TRACE_DEBUG1("bta_hl_sdp_register app_idx=%d",app_idx);
+ APPL_TRACE_DEBUG("bta_hl_sdp_register app_idx=%d",app_idx);
#endif
if ((p_cb->sup_feature.app_role_mask == BTA_HL_MDEP_ROLE_MASK_SOURCE) &&
@@ -545,7 +545,7 @@
for(i=0; i < num_services; i++)
{
bta_sys_add_uuid(svc_class_id_list[i]);
- APPL_TRACE_DEBUG2("dbg bta_sys_add_uuid i=%d uuid=0x%x", i, svc_class_id_list[i]); //todo
+ APPL_TRACE_DEBUG("dbg bta_sys_add_uuid i=%d uuid=0x%x", i, svc_class_id_list[i]); //todo
}
}
else
@@ -558,7 +558,7 @@
status = BTA_HL_STATUS_SDP_FAIL;
}
#if BTA_HL_DEBUG == TRUE
- APPL_TRACE_DEBUG1("bta_hl_sdp_register status=%s", bta_hl_status_code(status));
+ APPL_TRACE_DEBUG("bta_hl_sdp_register status=%s", bta_hl_status_code(status));
#endif
return status;
}
@@ -628,7 +628,7 @@
/* If here, no matching UUID found */
#if BTA_HL_DEBUG == TRUE
- APPL_TRACE_DEBUG0("bta_hl_find_sink_or_src_srv_class_in_db failed");
+ APPL_TRACE_DEBUG("bta_hl_find_sink_or_src_srv_class_in_db failed");
#endif
return(NULL);
diff --git a/bta/hl/bta_hl_utils.c b/bta/hl/bta_hl_utils.c
index 6a08b74..3a5df45 100644
--- a/bta/hl/bta_hl_utils.c
+++ b/bta/hl/bta_hl_utils.c
@@ -78,7 +78,7 @@
#if BTA_HL_DEBUG == TRUE
if (!success)
{
- APPL_TRACE_DEBUG4("bta_hl_set_ctrl_psm_for_dch num_recs=%d success=%d update_ctrl_psm=%d ctrl_psm=0x%x ",
+ APPL_TRACE_DEBUG("bta_hl_set_ctrl_psm_for_dch num_recs=%d success=%d update_ctrl_psm=%d ctrl_psm=0x%x ",
p_mcb->sdp.num_recs, success, update_ctrl_psm, ctrl_psm );
}
#endif
@@ -126,7 +126,7 @@
#if BTA_HL_DEBUG == TRUE
if (!found)
{
- APPL_TRACE_DEBUG3("bta_hl_find_sdp_idx_using_ctrl_psm found=%d sdp_idx=%d ctrl_psm=0x%x ",
+ APPL_TRACE_DEBUG("bta_hl_find_sdp_idx_using_ctrl_psm found=%d sdp_idx=%d ctrl_psm=0x%x ",
found, *p_sdp_idx, ctrl_psm );
}
#endif
@@ -157,7 +157,7 @@
}
#if BTA_HL_DEBUG == TRUE
- APPL_TRACE_DEBUG3("bta_hl_set_user_rx_pool_id pool_id=%d max_tx_size=%d default_ertm_pool_size=%d",
+ APPL_TRACE_DEBUG("bta_hl_set_user_rx_pool_id pool_id=%d max_tx_size=%d default_ertm_pool_size=%d",
pool_id, max_tx_size, GKI_get_pool_bufsize (OBX_FCR_TX_POOL_ID));
#endif
@@ -188,7 +188,7 @@
}
#if BTA_HL_DEBUG == TRUE
- APPL_TRACE_DEBUG3("bta_hl_set_user_rx_pool_id pool_id=%d mtu=%d default_ertm_pool_size=%d",
+ APPL_TRACE_DEBUG("bta_hl_set_user_rx_pool_id pool_id=%d mtu=%d default_ertm_pool_size=%d",
pool_id, mtu, GKI_get_pool_bufsize (OBX_FCR_RX_POOL_ID));
#endif
@@ -222,13 +222,13 @@
}
else
{
- APPL_TRACE_ERROR0("The MPS is zero");
+ APPL_TRACE_ERROR("The MPS is zero");
tx_win_size = 10;
}
}
#if BTA_HL_DEBUG == TRUE
- APPL_TRACE_DEBUG3("bta_hl_set_tx_win_size win_size=%d mtu=%d mps=%d",
+ APPL_TRACE_DEBUG("bta_hl_set_tx_win_size win_size=%d mtu=%d mps=%d",
tx_win_size, mtu, mps);
#endif
return tx_win_size;
@@ -255,7 +255,7 @@
mps = mtu;
}
#if BTA_HL_DEBUG == TRUE
- APPL_TRACE_DEBUG2("bta_hl_set_mps mps=%d mtu=%d",
+ APPL_TRACE_DEBUG("bta_hl_set_mps mps=%d mtu=%d",
mps, mtu);
#endif
return mps;
@@ -275,7 +275,7 @@
{
tBTA_HL_MDL_CB *p_dcb = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
#if BTA_HL_DEBUG == TRUE
- APPL_TRACE_DEBUG3("bta_hl_clean_mdl_cb app_idx=%d mcl_idx=%d mdl_idx=%d",
+ APPL_TRACE_DEBUG("bta_hl_clean_mdl_cb app_idx=%d mcl_idx=%d mdl_idx=%d",
app_idx, mcl_idx, mdl_idx);
#endif
utl_freebuf((void **) &p_dcb->p_tx_pkt);
@@ -400,7 +400,7 @@
break;
}
#if BTA_HL_DEBUG == TRUE
- APPL_TRACE_DEBUG1("bta_hl_get_service_uuids service_uuid=0x%x",service_uuid );
+ APPL_TRACE_DEBUG("bta_hl_get_service_uuids service_uuid=0x%x",service_uuid );
#endif
return service_uuid;
}
@@ -436,7 +436,7 @@
else
{
status = FALSE;
- APPL_TRACE_ERROR0("Inavlid echo cfg value");
+ APPL_TRACE_ERROR("Inavlid echo cfg value");
}
return status;
}
@@ -444,7 +444,7 @@
#if BTA_HL_DEBUG == TRUE
if (!status)
{
- APPL_TRACE_DEBUG4("bta_hl_find_echo_cfg_rsp status=failed app_idx=%d mcl_idx=%d mdep_idx=%d cfg=%d",
+ APPL_TRACE_DEBUG("bta_hl_find_echo_cfg_rsp status=failed app_idx=%d mcl_idx=%d mdep_idx=%d cfg=%d",
app_idx, mcl_idx, mdep_idx, cfg);
}
#endif
@@ -472,7 +472,7 @@
if (!bta_hl_is_the_first_reliable_existed(app_idx, mcl_idx) &&
(cfg != BTA_HL_DCH_CFG_RELIABLE))
{
- APPL_TRACE_ERROR0("the first DCH should be a reliable channel");
+ APPL_TRACE_ERROR("the first DCH should be a reliable channel");
return is_valid;
}
@@ -499,7 +499,7 @@
#if BTA_HL_DEBUG == TRUE
if (!is_valid)
{
- APPL_TRACE_DEBUG2("bta_hl_validate_dch_open_cfg is_valid=%d, cfg=%d", is_valid, cfg );
+ APPL_TRACE_DEBUG("bta_hl_validate_dch_open_cfg is_valid=%d, cfg=%d", is_valid, cfg );
}
#endif
return is_valid;
@@ -605,7 +605,7 @@
#if BTA_HL_DEBUG == TRUE
if (!found)
{
- APPL_TRACE_DEBUG4("bta_hl_find_cch_cb_indexes event=%s found=%d app_idx=%d mcl_idx=%d",
+ APPL_TRACE_DEBUG("bta_hl_find_cch_cb_indexes event=%s found=%d app_idx=%d mcl_idx=%d",
bta_hl_evt_code(p_msg->hdr.event), found, app_idx, mcl_idx);
}
#endif
@@ -779,7 +779,7 @@
#if BTA_HL_DEBUG == TRUE
if (!found)
{
- APPL_TRACE_DEBUG5("bta_hl_find_dch_cb_indexes event=%s found=%d app_idx=%d mcl_idx=%d mdl_idx=%d",
+ APPL_TRACE_DEBUG("bta_hl_find_dch_cb_indexes event=%s found=%d app_idx=%d mcl_idx=%d mdl_idx=%d",
bta_hl_evt_code(p_msg->hdr.event), found, *p_app_idx, *p_mcl_idx, *p_mdl_idx );
}
#endif
@@ -841,7 +841,7 @@
}while (TRUE);
#if BTA_HL_DEBUG == TRUE
- APPL_TRACE_DEBUG1("bta_hl_allocate_mdl OK mdl_id=%d", mdl_id);
+ APPL_TRACE_DEBUG("bta_hl_allocate_mdl OK mdl_id=%d", mdl_id);
#endif
return mdl_id;
}
@@ -876,7 +876,7 @@
#if BTA_HL_DEBUG == TRUE
if (!found)
{
- APPL_TRACE_DEBUG3("bta_hl_find_mdl_idx found=%d mdl_id=%d mdl_idx=%d ",
+ APPL_TRACE_DEBUG("bta_hl_find_mdl_idx found=%d mdl_id=%d mdl_idx=%d ",
found, mdl_id, i);
}
#endif
@@ -914,7 +914,7 @@
#if BTA_HL_DEBUG == TRUE
if (found)
{
- APPL_TRACE_DEBUG4("bta_hl_find_an_opened_mdl_idx found=%d app_idx=%d mcl_idx=%d mdl_idx=%d",
+ APPL_TRACE_DEBUG("bta_hl_find_an_opened_mdl_idx found=%d app_idx=%d mcl_idx=%d mdl_idx=%d",
found, app_idx, mcl_idx, i);
}
#endif
@@ -952,7 +952,7 @@
#if BTA_HL_DEBUG == TRUE
if (found)
{
- APPL_TRACE_DEBUG4("bta_hl_find_dch_setup_mdl_idx found=%d app_idx=%d mcl_idx=%d mdl_idx=%d",
+ APPL_TRACE_DEBUG("bta_hl_find_dch_setup_mdl_idx found=%d app_idx=%d mcl_idx=%d mdl_idx=%d",
found, app_idx, mcl_idx, i);
}
#endif
@@ -991,7 +991,7 @@
#if BTA_HL_DEBUG == TRUE
if (found)
{
- APPL_TRACE_DEBUG3("bta_hl_find_an_in_use_mcl_idx found=%d app_idx=%d mcl_idx=%d ",
+ APPL_TRACE_DEBUG("bta_hl_find_an_in_use_mcl_idx found=%d app_idx=%d mcl_idx=%d ",
found, app_idx, i);
}
#endif
@@ -1029,7 +1029,7 @@
#if BTA_HL_DEBUG == TRUE
if (found)
{
- APPL_TRACE_DEBUG2("bta_hl_find_an_in_use_app_idx found=%d app_idx=%d ",
+ APPL_TRACE_DEBUG("bta_hl_find_an_in_use_app_idx found=%d app_idx=%d ",
found, i);
}
#endif
@@ -1063,7 +1063,7 @@
}
#if BTA_HL_DEBUG == TRUE
- APPL_TRACE_DEBUG3("bta_hl_find_app_idx found=%d app_id=%d idx=%d ",
+ APPL_TRACE_DEBUG("bta_hl_find_app_idx found=%d app_id=%d idx=%d ",
found, app_id, i);
#endif
@@ -1101,7 +1101,7 @@
#if BTA_HL_DEBUG == TRUE
if (!found)
{
- APPL_TRACE_DEBUG3("bta_hl_find_app_idx_using_mca_handle status=%d handle=%d app_idx=%d ",
+ APPL_TRACE_DEBUG("bta_hl_find_app_idx_using_mca_handle status=%d handle=%d app_idx=%d ",
found, app_handle , i);
}
#endif
@@ -1148,7 +1148,7 @@
#if BTA_HL_DEBUG == TRUE
if (!found)
{
- APPL_TRACE_DEBUG3("bta_hl_find_mcl_idx_using_handle found=%d app_idx=%d mcl_idx=%d",
+ APPL_TRACE_DEBUG("bta_hl_find_mcl_idx_using_handle found=%d app_idx=%d mcl_idx=%d",
found, i, j);
}
#endif
@@ -1187,7 +1187,7 @@
#if BTA_HL_DEBUG == TRUE
if (!found)
{
- APPL_TRACE_DEBUG2("bta_hl_find_mcl_idx found=%d idx=%d",
+ APPL_TRACE_DEBUG("bta_hl_find_mcl_idx found=%d idx=%d",
found, i);
}
#endif
@@ -1250,7 +1250,7 @@
#if BTA_HL_DEBUG == TRUE
if (!found)
{
- APPL_TRACE_DEBUG2("bta_hl_find_mdl_idx_using_handle found=%d mdl_handle=%d ",
+ APPL_TRACE_DEBUG("bta_hl_find_mdl_idx_using_handle found=%d mdl_handle=%d ",
found, mdl_handle);
}
#endif
@@ -1283,7 +1283,7 @@
}
#if BTA_HL_DEBUG == TRUE
- APPL_TRACE_DEBUG1("bta_hl_is_the_first_reliable_existed is_existed=%d ",is_existed );
+ APPL_TRACE_DEBUG("bta_hl_is_the_first_reliable_existed is_existed=%d ",is_existed );
#endif
return is_existed;
}
@@ -1435,7 +1435,7 @@
#if BTA_HL_DEBUG == TRUE
if (!found)
{
- APPL_TRACE_DEBUG2("bta_hl_find_avail_mdl_cfg_idx found=%d mdl_cfg_idx=%d ",found, *p_mdl_cfg_idx );
+ APPL_TRACE_DEBUG("bta_hl_find_avail_mdl_cfg_idx found=%d mdl_cfg_idx=%d ",found, *p_mdl_cfg_idx );
}
#endif
@@ -1462,11 +1462,13 @@
tBTA_HL_MDL_CFG *p_mdl;
UINT8 i ;
BOOLEAN found=FALSE;
+
+ *p_mdl_cfg_idx = 0;
for (i=0; i< BTA_HL_NUM_MDL_CFGS; i++)
{
p_mdl = BTA_HL_GET_MDL_CFG_PTR(app_idx, i);
if(p_mdl->active)
- APPL_TRACE_DEBUG2("bta_hl_find_mdl_cfg_idx: mdl_id =%d, p_mdl->mdl_id=%d",mdl_id,
+ APPL_TRACE_DEBUG("bta_hl_find_mdl_cfg_idx: mdl_id =%d, p_mdl->mdl_id=%d",mdl_id,
p_mdl->mdl_id);
if (p_mdl->active &&
(!memcmp (p_mcb->bd_addr, p_mdl->peer_bd_addr, BD_ADDR_LEN))&&
@@ -1481,7 +1483,7 @@
#if BTA_HL_DEBUG == TRUE
if (!found)
{
- APPL_TRACE_DEBUG2("bta_hl_find_mdl_cfg_idx found=%d mdl_cfg_idx=%d ",found, i );
+ APPL_TRACE_DEBUG("bta_hl_find_mdl_cfg_idx found=%d mdl_cfg_idx=%d ",found, i );
}
#endif
@@ -1551,7 +1553,7 @@
#if BTA_HL_DEBUG == TRUE
if (!result)
{
- APPL_TRACE_DEBUG2("bta_hl_get_cur_time result=%s cur_time=%d",
+ APPL_TRACE_DEBUG("bta_hl_get_cur_time result=%s cur_time=%d",
(result?"OK":"FAIL"), *p_cur_time);
}
#endif
@@ -1621,7 +1623,7 @@
#if BTA_HL_DEBUG == TRUE
- APPL_TRACE_DEBUG1("bta_hl_compact_mdl_cfg_time cnt=%d ",cnt );
+ APPL_TRACE_DEBUG("bta_hl_compact_mdl_cfg_time cnt=%d ",cnt );
#endif
@@ -1803,7 +1805,7 @@
#if BTA_HL_DEBUG == TRUE
if (!found)
{
- APPL_TRACE_DEBUG3("bta_hl_find_mdep_cfg_idx found=%d mdep_idx=%d local_mdep_id=%d ",
+ APPL_TRACE_DEBUG("bta_hl_find_mdep_cfg_idx found=%d mdep_idx=%d local_mdep_id=%d ",
found,i, local_mdep_id );
}
#endif
@@ -1852,7 +1854,7 @@
*p_tx_apu_size = max_tx_apdu_size;
#if BTA_HL_DEBUG == TRUE
- APPL_TRACE_DEBUG2("bta_hl_find_rxtx_apdu_size max_rx_apdu_size=%d max_tx_apdu_size=%d ",
+ APPL_TRACE_DEBUG("bta_hl_find_rxtx_apdu_size max_rx_apdu_size=%d max_tx_apdu_size=%d ",
max_rx_apdu_size, max_tx_apdu_size );
#endif
@@ -1880,7 +1882,7 @@
BOOLEAN peer_found =FALSE;
UINT8 i;
- APPL_TRACE_DEBUG2("bta_hl_validate_peer_cfg sdp_idx=%d app_idx %d", sdp_idx, app_idx);
+ APPL_TRACE_DEBUG("bta_hl_validate_peer_cfg sdp_idx=%d app_idx %d", sdp_idx, app_idx);
if (p_dcb->local_mdep_id == BTA_HL_ECHO_TEST_MDEP_ID)
@@ -1891,8 +1893,8 @@
p_rec = &p_mcb->sdp.sdp_rec[sdp_idx];
for (i=0; i< p_rec->num_mdeps; i++)
{
- APPL_TRACE_DEBUG2("mdep_id %d peer_mdep_id %d",p_rec->mdep_cfg[i].mdep_id , peer_mdep_id);
- APPL_TRACE_DEBUG2("mdep_role %d peer_mdep_role %d",p_rec->mdep_cfg[i].mdep_role,
+ APPL_TRACE_DEBUG("mdep_id %d peer_mdep_id %d",p_rec->mdep_cfg[i].mdep_id , peer_mdep_id);
+ APPL_TRACE_DEBUG("mdep_role %d peer_mdep_role %d",p_rec->mdep_cfg[i].mdep_role,
peer_mdep_role)
if ( (p_rec->mdep_cfg[i].mdep_id == peer_mdep_id) &&
(p_rec->mdep_cfg[i].mdep_role == peer_mdep_role))
@@ -1906,7 +1908,7 @@
#if BTA_HL_DEBUG == TRUE
if (!peer_found)
{
- APPL_TRACE_DEBUG1("bta_hl_validate_peer_cfg failed num_mdeps=%d",p_rec->num_mdeps);
+ APPL_TRACE_DEBUG("bta_hl_validate_peer_cfg failed num_mdeps=%d",p_rec->num_mdeps);
}
#endif
return peer_found;
@@ -1937,7 +1939,7 @@
(local_cfg != BTA_HL_DCH_CFG_RELIABLE))
{
status = BTA_HL_STATUS_NO_FIRST_RELIABLE;
- APPL_TRACE_ERROR0("BTA_HL_STATUS_INVALID_DCH_CFG");
+ APPL_TRACE_ERROR("BTA_HL_STATUS_INVALID_DCH_CFG");
}
return status;
@@ -1967,7 +1969,7 @@
UINT8 i, in_use_mdl_idx = 0;
#if BTA_HL_DEBUG == TRUE
- APPL_TRACE_DEBUG2("bta_hl_validate_reconnect_params mdl_id=%d app_idx=%d", p_reconnect->mdl_id, app_idx);
+ APPL_TRACE_DEBUG("bta_hl_validate_reconnect_params mdl_id=%d app_idx=%d", p_reconnect->mdl_id, app_idx);
#endif
if (bta_hl_find_mdl_cfg_idx(app_idx, mcl_idx, p_reconnect->mdl_id, &mdl_cfg_idx))
{
@@ -1977,7 +1979,7 @@
#if BTA_HL_DEBUG == TRUE
if (!mdl_cfg_found)
{
- APPL_TRACE_DEBUG0("mdl_cfg_found not found");
+ APPL_TRACE_DEBUG("mdl_cfg_found not found");
}
#endif
@@ -2000,7 +2002,7 @@
#if BTA_HL_DEBUG == TRUE
if (!local_mdep_id_found)
{
- APPL_TRACE_DEBUG0("local_mdep_id not found");
+ APPL_TRACE_DEBUG("local_mdep_id not found");
}
#endif
@@ -2013,14 +2015,14 @@
}
else
{
- APPL_TRACE_ERROR1("mdl_id=%d is curreltly in use",p_reconnect->mdl_id);
+ APPL_TRACE_ERROR("mdl_id=%d is curreltly in use",p_reconnect->mdl_id);
}
}
#if BTA_HL_DEBUG == TRUE
if (!status)
{
- APPL_TRACE_DEBUG3("Reconnect validation failed local_mdep_id found=%d mdl_cfg_idx found=%d in_use_mdl_idx=%d ",
+ APPL_TRACE_DEBUG("Reconnect validation failed local_mdep_id found=%d mdl_cfg_idx found=%d in_use_mdl_idx=%d ",
local_mdep_id_found, mdl_cfg_found, in_use_mdl_idx);
}
#endif
@@ -2053,7 +2055,7 @@
#if BTA_HL_DEBUG == TRUE
if (!found)
{
- APPL_TRACE_DEBUG2("bta_hl_find_avail_mcl_idx found=%d idx=%d",
+ APPL_TRACE_DEBUG("bta_hl_find_avail_mcl_idx found=%d idx=%d",
found, i);
}
#endif
@@ -2093,7 +2095,7 @@
#if BTA_HL_DEBUG == TRUE
if (!found)
{
- APPL_TRACE_DEBUG2("bta_hl_find_avail_mdl_idx found=%d idx=%d",
+ APPL_TRACE_DEBUG("bta_hl_find_avail_mdl_idx found=%d idx=%d",
found, i);
}
#endif
@@ -2129,7 +2131,7 @@
if (is_duplicate)
{
- APPL_TRACE_DEBUG2("bta_hl_is_a_duplicate_id app_id=%d is_duplicate=%d",
+ APPL_TRACE_DEBUG("bta_hl_is_a_duplicate_id app_id=%d is_duplicate=%d",
app_id, is_duplicate);
}
#endif
@@ -2166,7 +2168,7 @@
#if BTA_HL_DEBUG == TRUE
if (!found)
{
- APPL_TRACE_DEBUG2("bta_hl_find_avail_app_idx found=%d app_idx=%d",
+ APPL_TRACE_DEBUG("bta_hl_find_avail_app_idx found=%d app_idx=%d",
found, i);
}
#endif
@@ -2192,7 +2194,7 @@
#if BTA_HL_DEBUG == TRUE
- APPL_TRACE_DEBUG1("bta_hl_app_update app_id=%d", app_id);
+ APPL_TRACE_DEBUG("bta_hl_app_update app_id=%d", app_id);
#endif
if (is_register)
@@ -2221,7 +2223,7 @@
/* If no available MDEPs, return error */
if (mdep_idx == BTA_HL_NUM_MDEPS)
{
- APPL_TRACE_ERROR0("bta_hl_app_update: Out of MDEP IDs");
+ APPL_TRACE_ERROR("bta_hl_app_update: Out of MDEP IDs");
status = BTA_HL_STATUS_MCAP_REG_FAIL;
break;
}
@@ -2235,7 +2237,7 @@
&p_acb->sup_feature.mdep[mdep_idx].mdep_cfg))
{
p_acb->sup_feature.mdep[mdep_idx].ori_app_id = app_id;
- APPL_TRACE_DEBUG4("mdep idx %d id %d ori_app_id %d num data type %d",mdep_idx,
+ APPL_TRACE_DEBUG("mdep idx %d id %d ori_app_id %d num data type %d",mdep_idx,
p_acb->sup_feature.mdep[mdep_idx].mdep_id,
p_acb->sup_feature.mdep[mdep_idx].ori_app_id,
p_acb->sup_feature.mdep[mdep_idx].mdep_cfg.num_of_mdep_data_types);
@@ -2251,7 +2253,7 @@
}
else
{
- APPL_TRACE_ERROR1("bta_hl_app_registration: Invalid Role %d",
+ APPL_TRACE_ERROR("bta_hl_app_registration: Invalid Role %d",
p_acb->sup_feature.mdep[mdep_idx].mdep_cfg.mdep_role);
status = BTA_HL_STATUS_MDEP_CO_FAIL;
break;
@@ -2259,21 +2261,21 @@
}
else
{
- APPL_TRACE_ERROR0("bta_hl_app_registration: Cfg callout failed");
+ APPL_TRACE_ERROR("bta_hl_app_registration: Cfg callout failed");
status = BTA_HL_STATUS_MDEP_CO_FAIL;
break;
}
}
else
{
- APPL_TRACE_ERROR0("bta_hl_app_registration: MCA_CreateDep failed");
+ APPL_TRACE_ERROR("bta_hl_app_registration: MCA_CreateDep failed");
status = BTA_HL_STATUS_MCAP_REG_FAIL;
break;
}
}
p_acb->sup_feature.num_of_mdeps += num_of_mdeps;
- APPL_TRACE_DEBUG1("num_of_mdeps %d", p_acb->sup_feature.num_of_mdeps);
+ APPL_TRACE_DEBUG("num_of_mdeps %d", p_acb->sup_feature.num_of_mdeps);
if ((status == BTA_HL_STATUS_OK) &&
(p_acb->sup_feature.app_role_mask == BTA_HL_MDEP_ROLE_MASK_SOURCE))
@@ -2305,13 +2307,13 @@
{
if (p_acb->sup_feature.mdep[i].ori_app_id == app_id)
{
- APPL_TRACE_DEBUG1("Found index %", i);
+ APPL_TRACE_DEBUG("Found index %", i);
if (MCA_DeleteDep((tMCA_HANDLE)p_acb->app_handle,
(p_acb->sup_feature.mdep[i].mdep_id)) != MCA_SUCCESS)
{
- APPL_TRACE_ERROR0("Error deregistering");
+ APPL_TRACE_ERROR("Error deregistering");
status = BTA_HL_STATUS_MCAP_REG_FAIL;
return status;
}
@@ -2353,7 +2355,7 @@
UINT8 mdep_counter = 0;
#if BTA_HL_DEBUG == TRUE
- APPL_TRACE_DEBUG1("bta_hl_app_registration app_idx=%d", app_idx);
+ APPL_TRACE_DEBUG("bta_hl_app_registration app_idx=%d", app_idx);
#endif
reg.ctrl_psm = p_acb->ctrl_psm;
@@ -2374,14 +2376,14 @@
if (p_acb->sup_feature.mdep[0].mdep_id != BTA_HL_ECHO_TEST_MDEP_ID)
{
status = BTA_HL_STATUS_MCAP_REG_FAIL;
- APPL_TRACE_ERROR1("BAD MDEP ID for echo test mdep_id=%d",
+ APPL_TRACE_ERROR("BAD MDEP ID for echo test mdep_id=%d",
p_acb->sup_feature.mdep[0].mdep_id );
}
}
else
{
status = BTA_HL_STATUS_MCAP_REG_FAIL;
- APPL_TRACE_ERROR0("MCA_CreateDep for echo test(mdep_id=0) failed");
+ APPL_TRACE_ERROR("MCA_CreateDep for echo test(mdep_id=0) failed");
}
@@ -2418,7 +2420,7 @@
break;
}
p_acb->sup_feature.mdep[i].ori_app_id = p_acb->app_id;
- APPL_TRACE_DEBUG2("index %d ori_app_id %d", i,
+ APPL_TRACE_DEBUG("index %d ori_app_id %d", i,
p_acb->sup_feature.mdep[i].ori_app_id);
}
else
@@ -2488,7 +2490,7 @@
{
#if BTA_HL_DEBUG == TRUE
- APPL_TRACE_ERROR1("BTA HL Discard event=%s",bta_hl_evt_code(event));
+ APPL_TRACE_ERROR("BTA HL Discard event=%s",bta_hl_evt_code(event));
#endif
@@ -2533,7 +2535,7 @@
{
if (!bta_hl_find_avail_mdl_cfg_idx(app_idx, mcl_idx, &mdl_cfg_idx))
{
- APPL_TRACE_ERROR0("No space to save the MDL config");
+ APPL_TRACE_ERROR("No space to save the MDL config");
found= FALSE; /*no space available*/
}
}
@@ -2566,11 +2568,11 @@
{
if (p_dcb->mtu != l2cap_cfg.mtu)
{
- APPL_TRACE_WARNING2("MCAP and L2CAP peer mtu size out of sync from MCAP mtu=%d from l2cap mtu=%d",
+ APPL_TRACE_WARNING("MCAP and L2CAP peer mtu size out of sync from MCAP mtu=%d from l2cap mtu=%d",
p_dcb->mtu, l2cap_cfg.mtu);
}
- APPL_TRACE_DEBUG1("bta_hl_save_mdl_cfg saved=%d", found);
- APPL_TRACE_DEBUG4("Saved. L2cap cfg mdl_id=%d mtu=%d fcs=%d dch_mode=%d",
+ APPL_TRACE_DEBUG("bta_hl_save_mdl_cfg saved=%d", found);
+ APPL_TRACE_DEBUG("Saved. L2cap cfg mdl_id=%d mtu=%d fcs=%d dch_mode=%d",
mdl_cfg.mdl_id, mdl_cfg.mtu, mdl_cfg.fcs, mdl_cfg.dch_mode);
}
#endif
@@ -2611,7 +2613,7 @@
l2cap_mode = L2CAP_FCR_STREAM_MODE;
break;
default:
- APPL_TRACE_ERROR1("Invalid dch oper=%d for set dch chan cfg", p_dcb->dch_oper);
+ APPL_TRACE_ERROR("Invalid dch oper=%d for set dch chan cfg", p_dcb->dch_oper);
break;
}
p_dcb->chnl_cfg.fcr_opt.mode = l2cap_mode;
@@ -2643,17 +2645,17 @@
}
#if BTA_HL_DEBUG == TRUE
- APPL_TRACE_DEBUG1("L2CAP Params l2cap_mode[3-ERTM 4-STREAM]=%d", l2cap_mode);
- APPL_TRACE_DEBUG2("Use FCS =%s mtu=%d", ((p_dcb->chnl_cfg.fcs & 1)?"YES":"NO"),
+ APPL_TRACE_DEBUG("L2CAP Params l2cap_mode[3-ERTM 4-STREAM]=%d", l2cap_mode);
+ APPL_TRACE_DEBUG("Use FCS =%s mtu=%d", ((p_dcb->chnl_cfg.fcs & 1)?"YES":"NO"),
p_dcb->chnl_cfg.data_mtu);
- APPL_TRACE_DEBUG5("tx_win_sz=%d, max_transmit=%d, rtrans_tout=%d, mon_tout=%d, mps=%d",
+ APPL_TRACE_DEBUG("tx_win_sz=%d, max_transmit=%d, rtrans_tout=%d, mon_tout=%d, mps=%d",
p_dcb->chnl_cfg.fcr_opt.tx_win_sz,
p_dcb->chnl_cfg.fcr_opt.max_transmit,
p_dcb->chnl_cfg.fcr_opt.rtrans_tout,
p_dcb->chnl_cfg.fcr_opt.mon_tout,
p_dcb->chnl_cfg.fcr_opt.mps);
- APPL_TRACE_DEBUG4("USER rx_pool_id=%d, tx_pool_id=%d, FCR rx_pool_id=%d, tx_pool_id=%d",
+ APPL_TRACE_DEBUG("USER rx_pool_id=%d, tx_pool_id=%d, FCR rx_pool_id=%d, tx_pool_id=%d",
p_dcb->chnl_cfg.user_rx_pool_id,
p_dcb->chnl_cfg.user_tx_pool_id,
p_dcb->chnl_cfg.fcr_rx_pool_id,
@@ -2725,12 +2727,17 @@
}
success = TRUE;
}
+ else
+ {
+ p_cfg->mtu = L2CAP_DEFAULT_MTU;
+ p_cfg->fcs = BTA_HL_L2C_NO_FCS;
+ }
#if BTA_HL_DEBUG == TRUE
if (!success)
{
- APPL_TRACE_DEBUG3("bta_hl_get_l2cap_cfg success=%d mdl=%d lcid=%d", success, mdl_hnd, lcid);
- APPL_TRACE_DEBUG2("l2cap mtu=%d fcs=%d", p_cfg->mtu, p_cfg->fcs);
+ APPL_TRACE_DEBUG("bta_hl_get_l2cap_cfg success=%d mdl=%d lcid=%d", success, mdl_hnd, lcid);
+ APPL_TRACE_DEBUG("l2cap mtu=%d fcs=%d", p_cfg->mtu, p_cfg->fcs);
}
#endif
@@ -2772,15 +2779,15 @@
if (p_dcb->mtu != l2cap_cfg.mtu)
{
- APPL_TRACE_WARNING2("MCAP and L2CAP peer mtu size out of sync from MCAP mtu=%d from l2cap mtu=%d",
+ APPL_TRACE_WARNING("MCAP and L2CAP peer mtu size out of sync from MCAP mtu=%d from l2cap mtu=%d",
p_dcb->mtu, l2cap_cfg.mtu);
}
if (!success)
{
- APPL_TRACE_DEBUG4("bta_hl_validate_chan_cfg success=%d app_idx=%d mcl_idx=%d mdl_idx=%d",success, app_idx, mcl_idx, mdl_idx);
- APPL_TRACE_DEBUG3("Cur. L2cap cfg mtu=%d fcs=%d dch_mode=%d", l2cap_cfg.mtu, l2cap_cfg.fcs, p_dcb->dch_mode);
- APPL_TRACE_DEBUG3("From saved: L2cap cfg mtu=%d fcs=%d dch_mode=%d", p_acb->mdl_cfg[mdl_cfg_idx].mtu,
+ APPL_TRACE_DEBUG("bta_hl_validate_chan_cfg success=%d app_idx=%d mcl_idx=%d mdl_idx=%d",success, app_idx, mcl_idx, mdl_idx);
+ APPL_TRACE_DEBUG("Cur. L2cap cfg mtu=%d fcs=%d dch_mode=%d", l2cap_cfg.mtu, l2cap_cfg.fcs, p_dcb->dch_mode);
+ APPL_TRACE_DEBUG("From saved: L2cap cfg mtu=%d fcs=%d dch_mode=%d", p_acb->mdl_cfg[mdl_cfg_idx].mtu,
p_acb->mdl_cfg[mdl_cfg_idx].fcs , p_acb->mdl_cfg[mdl_cfg_idx].dch_mode);
}
#endif
@@ -2837,7 +2844,7 @@
UINT8 mdl_idx;
#if (BTA_HL_DEBUG == TRUE)
- APPL_TRACE_DEBUG1("bta_hl_check_cch_close cch_close_dch_oper=%d",p_mcb->cch_close_dch_oper );
+ APPL_TRACE_DEBUG("bta_hl_check_cch_close cch_close_dch_oper=%d",p_mcb->cch_close_dch_oper );
#endif
if (p_mcb->cch_oper == BTA_HL_CCH_OP_LOCAL_CLOSE)
@@ -2889,7 +2896,7 @@
int i, num_act_apps=0;
#if BTA_HL_DEBUG == TRUE
- APPL_TRACE_DEBUG0("bta_hl_clean_app");
+ APPL_TRACE_DEBUG("bta_hl_clean_app");
#endif
MCA_Deregister((tMCA_HANDLE)p_acb->app_handle);
@@ -2927,7 +2934,7 @@
tBTA_HL evt_data;
#if (BTA_HL_DEBUG == TRUE)
- APPL_TRACE_DEBUG0("bta_hl_check_deregistration");
+ APPL_TRACE_DEBUG("bta_hl_check_deregistration");
#endif
if (p_acb->deregistering)
@@ -2940,7 +2947,7 @@
if (p_mcb->cch_state == BTA_HL_CCH_OPENING_ST)
p_mcb->force_close_local_cch_opening = TRUE;
p_mcb->cch_oper = BTA_HL_CCH_OP_LOCAL_CLOSE;
- APPL_TRACE_DEBUG1("p_mcb->force_close_local_cch_opening=%d", p_mcb->force_close_local_cch_opening );
+ APPL_TRACE_DEBUG("p_mcb->force_close_local_cch_opening=%d", p_mcb->force_close_local_cch_opening );
bta_hl_check_cch_close(app_idx,mcl_idx,p_data, TRUE);
}
}
@@ -2976,7 +2983,7 @@
tBTA_HL_CTRL evt_data;
#if (BTA_HL_DEBUG == TRUE)
- APPL_TRACE_DEBUG0("bta_hl_check_disable");
+ APPL_TRACE_DEBUG("bta_hl_check_disable");
#endif
if (bta_hl_cb.disabling)
@@ -3141,7 +3148,7 @@
p_evt_data->cch_open_cfm.mcl_handle = mcl_handle;
bdcpy(p_evt_data->cch_open_cfm.bd_addr, bd_addr);
p_evt_data->cch_open_cfm.status = status;
- APPL_TRACE_DEBUG1("bta_hl_build_cch_open_cfm: status=%d",status);
+ APPL_TRACE_DEBUG("bta_hl_build_cch_open_cfm: status=%d",status);
}
/*******************************************************************************
@@ -3252,7 +3259,7 @@
tBTA_HL_STATUS status)
{
- APPL_TRACE_DEBUG2("bta_hl_build_sdp_query_cfm: app_id = %d, app_handle=%d",
+ APPL_TRACE_DEBUG("bta_hl_build_sdp_query_cfm: app_id = %d, app_handle=%d",
app_id,app_handle);
p_evt_data->sdp_query_cfm.app_id = app_id;
p_evt_data->sdp_query_cfm.app_handle = app_handle;
diff --git a/bta/include/bta_ag_api.h b/bta/include/bta_ag_api.h
index f16687c..62342cb 100644
--- a/bta/include/bta_ag_api.h
+++ b/bta/include/bta_ag_api.h
@@ -229,7 +229,9 @@
#define BTA_AG_MIC_EVT 8 /* Microphone volume changed */
#define BTA_AG_AT_CKPD_EVT 9 /* CKPD from the HS */
#define BTA_AG_DISABLE_EVT 30 /* AG disabled */
-
+#if (BTM_WBS_INCLUDED == TRUE )
+#define BTA_AG_WBS_EVT 31 /* SCO codec info */
+#endif
/* Values below are for HFP only */
#define BTA_AG_AT_A_EVT 10 /* Answer a call */
#define BTA_AG_AT_D_EVT 11 /* Place a call using number or memory dial */
@@ -247,7 +249,7 @@
#define BTA_AG_AT_COPS_EVT 23 /* Query list of current calls */
#define BTA_AG_AT_UNAT_EVT 24 /* Unknown AT command */
#define BTA_AG_AT_CBC_EVT 25 /* Battery Level report from HF */
-#define BTA_AG_AT_BAC_EVT 26 /* Codec select */
+#define BTA_AG_AT_BAC_EVT 26 /* avablable codec */
#define BTA_AG_AT_BCS_EVT 27 /* Codec select */
typedef UINT8 tBTA_AG_EVT;
@@ -257,6 +259,7 @@
{
UINT16 handle;
UINT8 app_id;
+ tBTA_AG_STATUS status;
} tBTA_AG_HDR;
/* data associated with BTA_AG_REGISTER_EVT */
@@ -275,11 +278,19 @@
tBTA_AG_STATUS status;
} tBTA_AG_OPEN;
+/* data associated with BTA_AG_CLOSE_EVT */
+typedef struct
+{
+ tBTA_AG_HDR hdr;
+ BD_ADDR bd_addr;
+} tBTA_AG_CLOSE;
+
/* data associated with BTA_AG_CONN_EVT */
typedef struct
{
tBTA_AG_HDR hdr;
tBTA_AG_PEER_FEAT peer_feat;
+ BD_ADDR bd_addr;
tBTA_AG_PEER_CODEC peer_codec;
} tBTA_AG_CONN;
@@ -287,6 +298,7 @@
typedef struct
{
tBTA_AG_HDR hdr;
+ BD_ADDR bd_addr;
char str[BTA_AG_AT_MAX_LEN+1];
UINT16 num;
UINT8 idx; /* call number used by CLCC and CHLD */
@@ -298,6 +310,7 @@
tBTA_AG_HDR hdr;
tBTA_AG_REGISTER reg;
tBTA_AG_OPEN open;
+ tBTA_AG_CLOSE close;
tBTA_AG_CONN conn;
tBTA_AG_VAL val;
} tBTA_AG;
diff --git a/bta/include/bta_ag_co.h b/bta/include/bta_ag_co.h
index c6a3392..4ef3ce7 100644
--- a/bta/include/bta_ag_co.h
+++ b/bta/include/bta_ag_co.h
@@ -60,11 +60,21 @@
** BTA_AG_CO_AUD_STATE_OFF_XFER - Audio is closed pending transfer
** BTA_AG_CO_AUD_STATE_ON - Audio has been turned on
** BTA_AG_CO_AUD_STATE_SETUP - Audio is about to be turned on
+** codec - if WBS support is compiled in, codec to going to be used is provided
+** and when in BTA_AG_CO_AUD_STATE_SETUP, BTM_I2SPCMConfig() must be called with
+** the correct platform parameters.
+** in the other states codec type should not be ignored
**
** Returns void
**
*******************************************************************************/
+#if (BTM_WBS_INCLUDED == TRUE )
+BTA_API extern void bta_ag_co_audio_state(UINT16 handle, UINT8 app_id, UINT8 state,
+ tBTA_AG_PEER_CODEC codec);
+
+#else
BTA_API extern void bta_ag_co_audio_state(UINT16 handle, UINT8 app_id, UINT8 state);
+#endif
/*******************************************************************************
**
diff --git a/bta/include/bta_api.h b/bta/include/bta_api.h
index 4345fbf..b9403e9 100644
--- a/bta/include/bta_api.h
+++ b/bta/include/bta_api.h
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 2003-2012 Broadcom Corporation
+ * Copyright (C) 2003-2014 Broadcom Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -200,7 +200,11 @@
// btla-specific ++
typedef UINT16 tBTA_DM_CONN;
-// btla-specific --
+
+#define BTA_TRANSPORT_UNKNOWN 0
+#define BTA_TRANSPORT_BR_EDR BT_TRANSPORT_BR_EDR
+#define BTA_TRANSPORT_LE BT_TRANSPORT_LE
+typedef tBT_TRANSPORT tBTA_TRANSPORT;
/* Pairable Modes */
#define BTA_DM_PAIRABLE 1
@@ -311,6 +315,8 @@
#define BTA_BLE_LIMIT_DISC_FLAG BTM_BLE_LIMIT_DISC_FLAG
#define BTA_BLE_GEN_DISC_FLAG BTM_BLE_GEN_DISC_FLAG
#define BTA_BLE_BREDR_NOT_SPT BTM_BLE_BREDR_NOT_SPT
+#define BTA_BLE_DMT_CONTROLLER_SPT BTM_BLE_DMT_CONTROLLER_SPT
+#define BTA_BLE_DMT_HOST_SPT BTM_BLE_DMT_HOST_SPT
#define BTA_BLE_NON_LIMIT_DISC_FLAG BTM_BLE_NON_LIMIT_DISC_FLAG
#define BTA_BLE_ADV_FLAG_MASK BTM_BLE_ADV_FLAG_MASK
#define BTA_BLE_LIMIT_DISC_MASK BTM_BLE_LIMIT_DISC_MASK
@@ -330,8 +336,9 @@
#define BTA_DM_BLE_AD_BIT_SERVICE_128SOL BTM_BLE_AD_BIT_SERVICE_128SOL
#define BTA_DM_BLE_AD_BIT_PUBLIC_ADDR BTM_BLE_AD_BIT_PUBLIC_ADDR
#define BTA_DM_BLE_AD_BIT_RANDOM_ADDR BTM_BLE_AD_BIT_RANDOM_ADDR
+#define BTA_DM_BLE_AD_BIT_SERVICE_128 BTM_BLE_AD_BIT_SERVICE_128 /*128-bit Service UUIDs*/
-typedef UINT16 tBTA_BLE_AD_MASK;
+typedef tBTM_BLE_AD_MASK tBTA_BLE_AD_MASK;
/* slave preferred connection interval range */
typedef struct
@@ -372,15 +379,68 @@
typedef struct
{
- tBTA_BLE_MANU manu; /* manufactuer data */
- tBTA_BLE_INT_RANGE int_range; /* slave prefered conn interval range */
- tBTA_BLE_SERVICE services; /* services */
- UINT16 appearance; /* appearance data */
- UINT8 flag;
- tBTA_BLE_PROPRIETARY *p_proprietary;
+ tBT_UUID service_uuid;
+ UINT8 len;
+ UINT8 *p_val;
+}tBTA_BLE_SERVICE_DATA;
+typedef tBTM_BLE_128SERVICE tBTA_BLE_128SERVICE;
+typedef tBTM_BLE_32SERVICE tBTA_BLE_32SERVICE;
+
+typedef struct
+{
+ tBTA_BLE_INT_RANGE int_range; /* slave prefered conn interval range */
+ tBTA_BLE_MANU *p_manu; /* manufacturer data */
+ tBTA_BLE_SERVICE *p_services; /* 16 bits services */
+ tBTA_BLE_128SERVICE *p_services_128b; /* 128 bits service */
+ tBTA_BLE_32SERVICE *p_service_32b; /* 32 bits Service UUID */
+ tBTA_BLE_SERVICE *p_sol_services; /* 16 bits services Solicitation UUIDs */
+ tBTA_BLE_32SERVICE *p_sol_service_32b; /* List of 32 bit Service Solicitation UUIDs */
+ tBTA_BLE_128SERVICE *p_sol_service_128b;/* List of 128 bit Service Solicitation UUIDs */
+ tBTA_BLE_PROPRIETARY *p_proprietary; /* proprietary data */
+ tBTA_BLE_SERVICE_DATA *p_service_data; /* service data */
+ UINT16 appearance; /* appearance data */
+ UINT8 flag;
+ UINT8 tx_power;
}tBTA_BLE_ADV_DATA;
+typedef void (tBTA_SET_ADV_DATA_CMPL_CBACK) (tBTA_STATUS status);
+
+/* advertising channel map */
+#define BTA_BLE_ADV_CHNL_37 BTM_BLE_ADV_CHNL_37
+#define BTA_BLE_ADV_CHNL_38 BTM_BLE_ADV_CHNL_38
+#define BTA_BLE_ADV_CHNL_39 BTM_BLE_ADV_CHNL_39
+typedef tBTM_BLE_ADV_CHNL_MAP tBTA_BLE_ADV_CHNL_MAP; /* use as a bit mask */
+
+/* advertising filter policy */
+typedef tBTM_BLE_AFP tBTA_BLE_AFP;
+
+/* adv event type */
+#define BTA_BLE_CONNECT_EVT BTM_BLE_CONNECT_EVT /* Connectable undirected advertising */
+#define BTA_BLE_CONNECT_DIR_EVT BTM_BLE_CONNECT_DIR_EVT /* Connectable directed advertising */
+#define BTA_BLE_DISCOVER_EVT BTM_BLE_DISCOVER_EVT /* Scannable undirected advertising */
+#define BTA_BLE_NON_CONNECT_EVT BTM_BLE_NON_CONNECT_EVT /* Non connectable undirected advertising */
+typedef UINT8 tBTA_BLE_ADV_EVT;
+
+/* adv tx power level */
+#define BTA_BLE_ADV_TX_POWER_MIN 0 /* minimum tx power */
+#define BTA_BLE_ADV_TX_POWER_LOW 1 /* low tx power */
+#define BTA_BLE_ADV_TX_POWER_MID 2 /* middle tx power */
+#define BTA_BLE_ADV_TX_POWER_UPPER 3 /* upper tx power */
+#define BTA_BLE_ADV_TX_POWER_MAX 4 /* maximum tx power */
+typedef UINT8 tBTA_BLE_ADV_TX_POWER;
+
+/* advertising instance parameters */
+typedef struct
+{
+ UINT16 adv_int_min; /* minimum adv interval */
+ UINT16 adv_int_max; /* maximum adv interval */
+ tBTA_BLE_ADV_EVT adv_type; /* adv event type */
+ tBTA_BLE_ADV_CHNL_MAP channel_map; /* adv channel map */
+ tBTA_BLE_AFP adv_filter_policy; /* advertising filter policy */
+ tBTA_BLE_ADV_TX_POWER tx_power; /* adv tx power */
+}tBTA_BLE_ADV_PARAMS;
+
/* These are the fields returned in each device adv packet. It
** is returned in the results callback if registered.
*/
@@ -394,6 +454,41 @@
UINT8 *p_remote_name;
tBTA_BLE_SERVICE service;
} tBTA_BLE_INQ_DATA;
+
+enum
+{
+ BTA_BLE_SCAN_MODE_PASS=1,
+ BTA_BLE_SCAN_MODE_ACTI=2,
+ BTA_BLE_SCAN_MODE_PASS_ACTI=3
+};
+typedef UINT8 tBTA_BLE_SCAN_MODE;
+
+enum
+{
+ BTA_BLE_DISCARD_OLD_ITEMS=0,
+ BTA_BLE_DISCARD_LOWER_RSSI_ITEMS=1
+};
+typedef UINT8 tBTA_BLE_DISCARD_RULE;
+
+enum
+{
+ BTA_BLE_ADV_SEEN_FIRST_TIME=0,
+ BTA_BLE_ADV_TRACKING_TIMEOUT=1
+};
+typedef UINT8 tBTA_BLE_ADV_CHANGE_REASON;
+
+enum
+{
+ BTA_BLE_BATCH_SCAN_ENB_EVT = 1,
+ BTA_BLE_BATCH_SCAN_CFG_STRG_EVT = 2,
+ BTA_BLE_BATCH_SCAN_DATA_EVT = 3,
+ BTA_BLE_BATCH_SCAN_THRES_EVT = 4,
+ BTA_BLE_BATCH_SCAN_PARAM_EVT = 5,
+ BTA_BLE_BATCH_SCAN_DIS_EVT = 6
+};
+typedef tBTM_BLE_BATCH_SCAN_EVT tBTA_BLE_BATCH_SCAN_EVT;
+
+typedef tBTM_BLE_TRACK_ADV_ACTION tBTA_BLE_TRACK_ADV_ACTION;
#endif
/* BLE customer specific feature function type definitions */
@@ -430,22 +525,38 @@
};
typedef UINT8 tBTA_DM_BLE_SCAN_COND_OP;
+/* ADV payload filtering vendor specific call event */
+enum
+{
+ BTA_BLE_SCAN_PF_ENABLE_EVT = 7,
+ BTA_BLE_SCAN_PF_COND_EVT
+};
+
/* filter selection bit index */
#define BTA_DM_BLE_PF_ADDR_FILTER BTM_BLE_PF_ADDR_FILTER
+#define BTA_DM_BLE_PF_SRVC_DATA BTM_BLE_PF_SRVC_DATA
#define BTA_DM_BLE_PF_SRVC_UUID BTM_BLE_PF_SRVC_UUID
#define BTA_DM_BLE_PF_SRVC_SOL_UUID BTM_BLE_PF_SRVC_SOL_UUID
#define BTA_DM_BLE_PF_LOCAL_NAME BTM_BLE_PF_LOCAL_NAME
#define BTA_DM_BLE_PF_MANU_DATA BTM_BLE_PF_MANU_DATA
-#define BTA_DM_BLE_PF_SRVC_DATA BTM_BLE_PF_SRVC_DATA
-#define BTA_DM_BLE_PF_TYPE_MAX BTM_BLE_PF_TYPE_MAX
+#define BTA_DM_BLE_PF_SRVC_DATA_PATTERN BTM_BLE_PF_SRVC_DATA_PATTERN
#define BTA_DM_BLE_PF_TYPE_ALL BTM_BLE_PF_TYPE_ALL
+#define BTA_DM_BLE_PF_TYPE_MAX BTM_BLE_PF_TYPE_MAX
typedef UINT8 tBTA_DM_BLE_PF_COND_TYPE;
+typedef union
+{
+ UINT16 uuid16_mask;
+ UINT32 uuid32_mask;
+ UINT8 uuid128_mask[LEN_UUID_128];
+}tBTA_DM_BLE_PF_COND_MASK;
+
typedef struct
{
tBLE_BD_ADDR *p_target_addr; /* target address, if NULL, generic UUID filter */
tBT_UUID uuid; /* UUID condition */
tBTA_DM_BLE_PF_LOGIC_TYPE cond_logic; /* AND/OR */
+ tBTA_DM_BLE_PF_COND_MASK *p_uuid_mask; /* UUID condition mask, if NULL, match exact as UUID condition */
}tBTA_DM_BLE_PF_UUID_COND;
typedef struct
@@ -459,8 +570,20 @@
UINT16 company_id; /* company ID */
UINT8 data_len; /* <= 20 bytes */
UINT8 *p_pattern;
+ UINT16 company_id_mask; /* UUID value mask */
+ UINT8 *p_pattern_mask; /* Manufacturer data matching mask, same length
+ as data pattern, set to all 0xff, match exact data */
}tBTA_DM_BLE_PF_MANU_COND;
+typedef struct
+{
+ UINT16 uuid; /* service ID */
+ UINT8 data_len; /* <= 20 bytes */
+ UINT8 *p_pattern;
+ UINT8 *p_pattern_mask; /* Service data matching mask, same length
+ as data pattern, set to all 0xff, match exact data */
+}tBTA_DM_BLE_PF_SRVC_PATTERN_COND;
+
typedef union
{
tBLE_BD_ADDR target_addr;
@@ -468,8 +591,11 @@
tBTA_DM_BLE_PF_MANU_COND manu_data; /* manufactuer data filtering */
tBTA_DM_BLE_PF_UUID_COND srvc_uuid; /* service UUID filtering */
tBTA_DM_BLE_PF_UUID_COND solicitate_uuid; /* solicitated service UUID filtering */
+ tBTA_DM_BLE_PF_SRVC_PATTERN_COND srvc_data; /* service data pattern */
}tBTA_DM_BLE_PF_COND_PARAM;
+typedef UINT8 tBTA_DM_BLE_PF_FILT_INDEX;
+typedef UINT8 tBTA_DM_BLE_PF_AVBL_SPACE;
typedef INT8 tBTA_DM_RSSI_VALUE;
typedef UINT8 tBTA_DM_LINK_QUALITY_VALUE;
@@ -510,6 +636,8 @@
// btla-specific --
#define BTA_DM_DEV_UNPAIRED_EVT 23
#define BTA_DM_HW_ERROR_EVT 24 /* BT Chip H/W error */
+#define BTA_DM_LE_FEATURES_READ 25 /* Cotroller specific LE features are read */
+#define BTA_DM_ENER_INFO_READ 26 /* Energy info read */
typedef UINT8 tBTA_DM_SEC_EVT;
/* Structure associated with BTA_DM_ENABLE_EVT */
@@ -522,6 +650,7 @@
/* Structure associated with BTA_DM_PIN_REQ_EVT */
typedef struct
{
+ /* Note: First 3 data members must be, bd_addr, dev_class, and bd_name in order */
BD_ADDR bd_addr; /* BD address peer device. */
DEV_CLASS dev_class; /* Class of Device */
BD_NAME bd_name; /* Name of peer device. */
@@ -655,6 +784,9 @@
typedef struct
{
BD_ADDR bd_addr; /* BD address peer device. */
+#if BLE_INCLUDED == TRUE
+ tBTA_TRANSPORT link_type;
+#endif
} tBTA_DM_LINK_UP;
/* Structure associated with BTA_DM_LINK_DOWN_EVT */
@@ -663,6 +795,9 @@
BD_ADDR bd_addr; /* BD address peer device. */
UINT8 status; /* connection open/closed */
BOOLEAN is_removed; /* TRUE if device is removed when link is down */
+#if BLE_INCLUDED == TRUE
+ tBTA_TRANSPORT link_type;
+#endif
} tBTA_DM_LINK_DOWN;
/* Structure associated with BTA_DM_ROLE_CHG_EVT */
@@ -809,6 +944,88 @@
/* Security callback */
typedef void (tBTA_DM_SEC_CBACK)(tBTA_DM_SEC_EVT event, tBTA_DM_SEC *p_data);
+#define BTA_BLE_MULTI_ADV_ILLEGAL 0
+
+/* multi adv callback event */
+#define BTA_BLE_MULTI_ADV_ENB_EVT 1
+#define BTA_BLE_MULTI_ADV_DISABLE_EVT 2
+#define BTA_BLE_MULTI_ADV_PARAM_EVT 3
+#define BTA_BLE_MULTI_ADV_DATA_EVT 4
+
+typedef UINT8 tBTA_BLE_MULTI_ADV_EVT;
+
+/* multi adv callback */
+typedef void (tBTA_BLE_MULTI_ADV_CBACK)(tBTA_BLE_MULTI_ADV_EVT event,
+ UINT8 inst_id, void *p_ref, tBTA_STATUS status);
+typedef UINT32 tBTA_DM_BLE_REF_VALUE;
+
+#define BTA_DM_BLE_PF_ENABLE_EVT BTM_BLE_PF_ENABLE
+#define BTA_DM_BLE_PF_CONFIG_EVT BTM_BLE_PF_CONFIG
+typedef UINT8 tBTA_DM_BLE_PF_EVT;
+
+typedef UINT8 tBTA_DM_BLE_PF_COND_TYPE;
+
+#define BTA_DM_BLE_PF_LOGIC_OR 0
+#define BTA_DM_BLE_PF_LOGIC_AND 1
+typedef UINT8 tBTA_DM_BLE_PF_LOGIC_TYPE;
+
+#define BTA_DM_BLE_PF_ENABLE 1
+#define BTA_DM_BLE_PF_CONFIG 2
+typedef UINT8 tBTA_DM_BLE_PF_ACTION;
+
+typedef UINT8 tBTA_DM_BLE_PF_FILT_INDEX;
+
+typedef UINT8 tBTA_DM_BLE_PF_AVBL_SPACE;
+
+/* Config callback */
+typedef void (tBTA_DM_BLE_PF_CFG_CBACK) (tBTA_DM_BLE_PF_ACTION action,
+ tBTA_DM_BLE_PF_COND_TYPE cfg_cond,
+ tBTA_DM_BLE_PF_AVBL_SPACE avbl_space, tBTA_STATUS status,
+ tBTA_DM_BLE_REF_VALUE ref_value);
+/* Param callback */
+typedef void (tBTA_DM_BLE_PF_PARAM_CBACK) (UINT8 action_type, tBTA_DM_BLE_PF_AVBL_SPACE avbl_space,
+ tBTA_DM_BLE_REF_VALUE ref_value, tBTA_STATUS status);
+
+/* Status callback */
+typedef void (tBTA_DM_BLE_PF_STATUS_CBACK) (UINT8 action, tBTA_STATUS status,
+ tBTA_DM_BLE_REF_VALUE ref_value);
+
+
+#define BTA_DM_BLE_PF_BRDCAST_ADDR_FILT 1
+#define BTA_DM_BLE_PF_SERV_DATA_CHG_FILT 2
+#define BTA_DM_BLE_PF_SERV_UUID 4
+#define BTA_DM_BLE_PF_SERV_SOLC_UUID 8
+#define BTA_DM_BLE_PF_LOC_NAME_CHECK 16
+#define BTA_DM_BLE_PF_MANUF_NAME_CHECK 32
+#define BTA_DM_BLE_PF_SERV_DATA_CHECK 64
+typedef UINT16 tBTA_DM_BLE_PF_FEAT_SEL;
+
+#define BTA_DM_BLE_PF_LIST_LOGIC_OR 1
+#define BTA_DM_BLE_PF_LIST_LOGIC_AND 2
+typedef UINT16 tBTA_DM_BLE_PF_LIST_LOGIC_TYPE;
+
+#define BTA_DM_BLE_PF_FILT_LOGIC_OR 0
+#define BTA_DM_BLE_PF_FILT_LOGIC_AND 1
+typedef UINT16 tBTA_DM_BLE_PF_FILT_LOGIC_TYPE;
+
+typedef UINT8 tBTA_DM_BLE_PF_RSSI_THRESHOLD;
+typedef UINT8 tBTA_DM_BLE_PF_DELIVERY_MODE;
+typedef UINT16 tBTA_DM_BLE_PF_TIMEOUT;
+typedef UINT8 tBTA_DM_BLE_PF_TIMEOUT_CNT;
+
+typedef struct
+{
+ tBTA_DM_BLE_PF_FEAT_SEL feat_seln;
+ tBTA_DM_BLE_PF_LIST_LOGIC_TYPE list_logic_type;
+ tBTA_DM_BLE_PF_FILT_LOGIC_TYPE filt_logic_type;
+ tBTA_DM_BLE_PF_RSSI_THRESHOLD rssi_high_thres;
+ tBTA_DM_BLE_PF_RSSI_THRESHOLD rssi_low_thres;
+ tBTA_DM_BLE_PF_DELIVERY_MODE dely_mode;
+ tBTA_DM_BLE_PF_TIMEOUT found_timeout;
+ tBTA_DM_BLE_PF_TIMEOUT lost_timeout;
+ tBTA_DM_BLE_PF_TIMEOUT_CNT found_timeout_cnt;
+} tBTA_DM_BLE_PF_FILT_PARAMS;
+
/* Vendor Specific Command Callback */
typedef tBTM_VSC_CMPL_CB tBTA_VENDOR_CMPL_CBACK;
@@ -840,6 +1057,7 @@
UINT8 ble_addr_type;
tBTM_BLE_EVT_TYPE ble_evt_type;
tBT_DEVICE_TYPE device_type;
+ UINT8 flag;
#endif
} tBTA_DM_INQ_RES;
@@ -901,7 +1119,7 @@
typedef void (tBTA_DM_EXEC_CBACK) (void * p_param);
/* Encryption callback*/
-typedef void (tBTA_DM_ENCRYPT_CBACK) (BD_ADDR bd_addr, tBTA_STATUS result);
+typedef void (tBTA_DM_ENCRYPT_CBACK) (BD_ADDR bd_addr, tBTA_TRANSPORT transport, tBTA_STATUS result);
#if BLE_INCLUDED == TRUE
#define BTA_DM_BLE_SEC_NONE BTM_BLE_SEC_NONE
@@ -909,6 +1127,44 @@
#define BTA_DM_BLE_SEC_NO_MITM BTM_BLE_SEC_ENCRYPT_NO_MITM
#define BTA_DM_BLE_SEC_MITM BTM_BLE_SEC_ENCRYPT_MITM
typedef tBTM_BLE_SEC_ACT tBTA_DM_BLE_SEC_ACT;
+
+typedef tBTM_BLE_TX_TIME_MS tBTA_DM_BLE_TX_TIME_MS;
+typedef tBTM_BLE_RX_TIME_MS tBTA_DM_BLE_RX_TIME_MS;
+typedef tBTM_BLE_IDLE_TIME_MS tBTA_DM_BLE_IDLE_TIME_MS;
+typedef tBTM_BLE_ENERGY_USED tBTA_DM_BLE_ENERGY_USED;
+
+#define BTA_DM_CONTRL_UNKNOWN 0 /* Unknown state */
+#define BTA_DM_CONTRL_ACTIVE 1 /* ACL link on, SCO link ongoing, sniff mode */
+#define BTA_DM_CONTRL_SCAN 2 /* Scan state - paging/inquiry/trying to connect*/
+#define BTA_DM_CONTRL_IDLE 3 /* Idle state - page scan, LE advt, inquiry scan */
+
+typedef UINT8 tBTA_DM_CONTRL_STATE;
+
+
+typedef void (tBTA_BLE_SCAN_THRESHOLD_CBACK)(tBTA_DM_BLE_REF_VALUE ref_value);
+
+typedef void (tBTA_BLE_SCAN_REP_CBACK) (tBTA_DM_BLE_REF_VALUE ref_value, UINT8 report_format,
+ UINT8 num_records, UINT16 data_len,
+ UINT8* p_rep_data, tBTA_STATUS status);
+
+typedef void (tBTA_BLE_SCAN_SETUP_CBACK) (tBTA_BLE_BATCH_SCAN_EVT evt,
+ tBTA_DM_BLE_REF_VALUE ref_value,
+ tBTA_STATUS status);
+
+typedef void (tBTA_BLE_TRACK_ADV_CMPL_CBACK)(int action, tBTA_STATUS status,
+ tBTA_DM_BLE_PF_AVBL_SPACE avbl_space,
+ tBTA_DM_BLE_REF_VALUE ref_value);
+
+typedef void (tBTA_BLE_TRACK_ADV_CBACK)(int filt_index, tBLE_ADDR_TYPE addr_type, BD_ADDR bda,
+ int adv_state, tBTA_DM_BLE_REF_VALUE ref_value);
+
+typedef void (tBTA_BLE_ENERGY_INFO_CBACK)(tBTA_DM_BLE_TX_TIME_MS tx_time,
+ tBTA_DM_BLE_RX_TIME_MS rx_time,
+ tBTA_DM_BLE_IDLE_TIME_MS idle_time,
+ tBTA_DM_BLE_ENERGY_USED energy_used,
+ tBTA_DM_CONTRL_STATE ctrl_state,
+ tBTA_STATUS status);
+
#else
typedef UINT8 tBTA_DM_BLE_SEC_ACT;
#endif
@@ -961,12 +1217,95 @@
#define BTA_DM_PM_PARK_IDX 5 /* the actual index to bta_dm_pm_md[] for PARK mode */
#endif
-#define BTA_DM_SW_BB_TO_MM BTM_SW_BB_TO_MM
-#define BTA_DM_SW_MM_TO_BB BTM_SW_MM_TO_BB
-#define BTA_DM_SW_BB_TO_BTC BTM_SW_BB_TO_BTC
-#define BTA_DM_SW_BTC_TO_BB BTM_SW_BTC_TO_BB
+#ifndef BTA_DM_PM_SNIFF_A2DP_IDX
+#define BTA_DM_PM_SNIFF_A2DP_IDX BTA_DM_PM_SNIFF
+#endif
-typedef tBTM_SW_DIR tBTA_DM_SW_DIR;
+#ifndef BTA_DM_PM_SNIFF_HD_IDLE_IDX
+#define BTA_DM_PM_SNIFF_HD_IDLE_IDX BTA_DM_PM_SNIFF2
+#endif
+
+#ifndef BTA_DM_PM_SNIFF_SCO_OPEN_IDX
+#define BTA_DM_PM_SNIFF_SCO_OPEN_IDX BTA_DM_PM_SNIFF3
+#endif
+
+#ifndef BTA_DM_PM_SNIFF_HD_ACTIVE_IDX
+#define BTA_DM_PM_SNIFF_HD_ACTIVE_IDX BTA_DM_PM_SNIFF4
+#endif
+
+#ifndef BTA_DM_PM_SNIFF_HH_OPEN_IDX
+#define BTA_DM_PM_SNIFF_HH_OPEN_IDX BTA_DM_PM_SNIFF2
+#endif
+
+#ifndef BTA_DM_PM_SNIFF_HH_ACTIVE_IDX
+#define BTA_DM_PM_SNIFF_HH_ACTIVE_IDX BTA_DM_PM_SNIFF2
+#endif
+
+#ifndef BTA_DM_PM_SNIFF_HH_IDLE_IDX
+#define BTA_DM_PM_SNIFF_HH_IDLE_IDX BTA_DM_PM_SNIFF2
+#endif
+
+
+#ifndef BTA_DM_PM_HH_OPEN_DELAY
+#define BTA_DM_PM_HH_OPEN_DELAY 30000
+#endif
+
+#ifndef BTA_DM_PM_HH_ACTIVE_DELAY
+#define BTA_DM_PM_HH_ACTIVE_DELAY 30000
+#endif
+
+#ifndef BTA_DM_PM_HH_IDLE_DELAY
+#define BTA_DM_PM_HH_IDLE_DELAY 30000
+#endif
+
+/* The Sniff Parameters defined below must be ordered from highest
+ * latency (biggest interval) to lowest latency. If there is a conflict
+ * among the connected services the setting with the lowest latency will
+ * be selected. If a device should override a sniff parameter then it
+ * must insure that order is maintained.
+ */
+#ifndef BTA_DM_PM_SNIFF_MAX
+#define BTA_DM_PM_SNIFF_MAX 800
+#define BTA_DM_PM_SNIFF_MIN 400
+#define BTA_DM_PM_SNIFF_ATTEMPT 4
+#define BTA_DM_PM_SNIFF_TIMEOUT 1
+#endif
+
+#ifndef BTA_DM_PM_SNIFF1_MAX
+#define BTA_DM_PM_SNIFF1_MAX 400
+#define BTA_DM_PM_SNIFF1_MIN 200
+#define BTA_DM_PM_SNIFF1_ATTEMPT 4
+#define BTA_DM_PM_SNIFF1_TIMEOUT 1
+#endif
+
+#ifndef BTA_DM_PM_SNIFF2_MAX
+#define BTA_DM_PM_SNIFF2_MAX 180
+#define BTA_DM_PM_SNIFF2_MIN 150
+#define BTA_DM_PM_SNIFF2_ATTEMPT 4
+#define BTA_DM_PM_SNIFF2_TIMEOUT 1
+#endif
+
+#ifndef BTA_DM_PM_SNIFF3_MAX
+#define BTA_DM_PM_SNIFF3_MAX 150
+#define BTA_DM_PM_SNIFF3_MIN 50
+#define BTA_DM_PM_SNIFF3_ATTEMPT 4
+#define BTA_DM_PM_SNIFF3_TIMEOUT 1
+#endif
+
+#ifndef BTA_DM_PM_SNIFF4_MAX
+#define BTA_DM_PM_SNIFF4_MAX 54
+#define BTA_DM_PM_SNIFF4_MIN 30
+#define BTA_DM_PM_SNIFF4_ATTEMPT 4
+#define BTA_DM_PM_SNIFF4_TIMEOUT 1
+#endif
+
+#ifndef BTA_DM_PM_PARK_MAX
+#define BTA_DM_PM_PARK_MAX 800
+#define BTA_DM_PM_PARK_MIN 400
+#define BTA_DM_PM_PARK_ATTEMPT 0
+#define BTA_DM_PM_PARK_TIMEOUT 0
+#endif
+
/* Switch callback events */
#define BTA_DM_SWITCH_CMPL_EVT 0 /* Completion of the Switch API */
@@ -1004,6 +1343,18 @@
/* Device features mask definitions */
#define BTA_FEATURE_BYTES_PER_PAGE BTM_FEATURE_BYTES_PER_PAGE
#define BTA_EXT_FEATURES_PAGE_MAX BTM_EXT_FEATURES_PAGE_MAX
+/* ACL type
+*/
+#define BTA_DM_LINK_TYPE_BR_EDR 0x01
+#define BTA_DM_LINK_TYPE_LE 0x02
+#define BTA_DM_LINK_TYPE_ALL 0xFF
+typedef UINT8 tBTA_DM_LINK_TYPE;
+
+#define IMMEDIATE_DELY_MODE 0x00
+#define ONFOUND_DELY_MODE 0x01
+#define BATCH_DELY_MODE 0x02
+#define ALLOW_ALL_FILTER 0x00
+#define LOWEST_RSSI_VALUE 129
/*****************************************************************************
** External Function Declarations
@@ -1255,6 +1606,21 @@
/*******************************************************************************
**
+** Function BTA_DmBondByTransport
+**
+** Description This function initiates a bonding procedure with a peer
+** device by designated transport. The bonding procedure enables
+** authentication and optionally encryption on the Bluetooth link.
+**
+**
+** Returns void
+**
+*******************************************************************************/
+BTA_API extern void BTA_DmBondByTransport(BD_ADDR bd_addr, tBTA_TRANSPORT transport);
+
+
+/*******************************************************************************
+**
** Function BTA_DmBondCancel
**
** Description This function cancels a bonding procedure with a peer
@@ -1515,6 +1881,17 @@
*******************************************************************************/
BTA_API extern BOOLEAN BTA_DmUseSsr( BD_ADDR bd_addr );
+/*******************************************************************************
+**
+** Function BTA_DmGetConnectionState
+**
+** Description Returns whether the remote device is currently connected.
+**
+** Returns 0 if the device is NOT connected.
+**
+*******************************************************************************/
+BTA_API extern UINT16 BTA_DmGetConnectionState( BD_ADDR bd_addr );
+
/*******************************************************************************
**
@@ -1577,11 +1954,13 @@
**
** Parameters: bd_addr - Address of the peer device
** remove_dev - remove device or not after link down
+** transport - which transport to close
+
**
** Returns void.
**
*******************************************************************************/
-BTA_API extern void BTA_DmCloseACL(BD_ADDR bd_addr, BOOLEAN remove_dev);
+BTA_API extern void BTA_DmCloseACL(BD_ADDR bd_addr, BOOLEAN remove_dev, tBTA_TRANSPORT transport);
/*******************************************************************************
**
@@ -1727,7 +2106,8 @@
** Returns void
**
*******************************************************************************/
-BTA_API extern void BTA_DmAddBleKey (BD_ADDR bd_addr, tBTA_LE_KEY_VALUE *p_le_key,
+BTA_API extern void BTA_DmAddBleKey (BD_ADDR bd_addr,
+ tBTA_LE_KEY_VALUE *p_le_key,
tBTA_LE_KEY_TYPE key_type);
/*******************************************************************************
@@ -1825,6 +2205,25 @@
BTA_API extern void BTA_DmDiscoverExt(BD_ADDR bd_addr, tBTA_SERVICE_MASK_EXT *p_services,
tBTA_DM_SEARCH_CBACK *p_cback, BOOLEAN sdp_search);
+/*******************************************************************************
+**
+** Function BTA_DmDiscoverByTransport
+**
+** Description This function does service discovery on particular transport
+** for services of a
+** peer device. When services.num_uuid is 0, it indicates all
+** GATT based services are to be searched; other wise a list of
+** UUID of interested services should be provided through
+** p_services->p_uuid.
+**
+**
+**
+** Returns void
+**
+*******************************************************************************/
+BTA_API extern void BTA_DmDiscoverByTransport(BD_ADDR bd_addr, tBTA_SERVICE_MASK_EXT *p_services,
+ tBTA_DM_SEARCH_CBACK *p_cback, BOOLEAN sdp_search,
+ tBTA_TRANSPORT transport);
/*******************************************************************************
**
@@ -1836,6 +2235,7 @@
** bring up unencrypted links, then later encrypt them.
**
** Parameters: bd_addr - Address of the peer device
+** transport - transport of the link to be encruypted
** p_callback - Pointer to callback function to indicat the
** link encryption status
** sec_act - This is the security action to indicate
@@ -1848,8 +2248,9 @@
**
**
*******************************************************************************/
-BTA_API extern void BTA_DmSetEncryption(BD_ADDR bd_addr, tBTA_DM_ENCRYPT_CBACK *p_callback,
- tBTA_DM_BLE_SEC_ACT sec_act);
+BTA_API extern void BTA_DmSetEncryption(BD_ADDR bd_addr, tBTA_TRANSPORT transport,
+ tBTA_DM_ENCRYPT_CBACK *p_callback,
+ tBTA_DM_BLE_SEC_ACT sec_act);
/*******************************************************************************
@@ -1926,7 +2327,8 @@
**
*******************************************************************************/
BTA_API extern void BTA_DmBleSetAdvConfig (tBTA_BLE_AD_MASK data_mask,
- tBTA_BLE_ADV_DATA *p_adv_cfg);
+ tBTA_BLE_ADV_DATA *p_adv_cfg,
+ tBTA_SET_ADV_DATA_CMPL_CBACK *p_adv_data_cback);
/*******************************************************************************
**
@@ -1940,7 +2342,8 @@
**
*******************************************************************************/
BTA_API extern void BTA_DmBleSetScanRsp (tBTA_BLE_AD_MASK data_mask,
- tBTA_BLE_ADV_DATA *p_adv_cfg);
+ tBTA_BLE_ADV_DATA *p_adv_cfg,
+ tBTA_SET_ADV_DATA_CMPL_CBACK *p_adv_data_cback);
/*******************************************************************************
**
@@ -1955,6 +2358,275 @@
*******************************************************************************/
BTA_API extern void BTA_DmBleBroadcast (BOOLEAN start);
+
+/*******************************************************************************
+**
+** Function BTA_BleEnableAdvInstance
+**
+** Description This function enables the Multi ADV instance feature
+**
+** Parameters p_params Pointer to ADV param user defined structure
+** p_cback Pointer to Multi ADV callback structure
+** p_ref - Reference pointer
+**
+** Returns None
+**
+*******************************************************************************/
+BTA_API extern void BTA_BleEnableAdvInstance (tBTA_BLE_ADV_PARAMS *p_params,
+ tBTA_BLE_MULTI_ADV_CBACK *p_cback,void *p_ref);
+
+/*******************************************************************************
+**
+** Function BTA_BleUpdateAdvInstParam
+**
+** Description This function updates the Multi ADV instance params
+**
+** Parameters inst_id Instance ID
+** p_params Pointer to ADV param user defined structure
+**
+** Returns None
+**
+*******************************************************************************/
+BTA_API extern void BTA_BleUpdateAdvInstParam (UINT8 inst_id,
+ tBTA_BLE_ADV_PARAMS *p_params);
+
+/*******************************************************************************
+**
+** Function BTA_BleCfgAdvInstData
+**
+** Description This function is called to configure the ADV instance data
+**
+** Parameters inst_id - Instance ID
+** is_scan_rsp - Boolean value Scan response
+** Pointer to User defined ADV data structure
+** Returns None
+**
+*******************************************************************************/
+BTA_API extern void BTA_BleCfgAdvInstData (UINT8 inst_id, BOOLEAN is_scan_rsp,
+ tBTA_BLE_AD_MASK data_mask, tBTA_BLE_ADV_DATA *p_data);
+
+/*******************************************************************************
+**
+** Function BTA_BleDisableAdvInstance
+**
+** Description This function is called to disable the ADV instance
+**
+** Parameters inst_id - Instance ID to be disabled
+**
+** Returns None
+**
+*******************************************************************************/
+BTA_API extern void BTA_BleDisableAdvInstance(UINT8 inst_id);
+
+/*******************************************************************************
+**
+** Function BTA_DmBleUpdateConnectionParams
+**
+** Description Update connection parameters, can only be used when connection is up.
+**
+** Parameters: bd_addr - BD address of the peer
+** min_int - minimum connection interval, [0x0004~ 0x4000]
+** max_int - maximum connection interval, [0x0004~ 0x4000]
+** latency - slave latency [0 ~ 500]
+** timeout - supervision timeout [0x000a ~ 0xc80]
+**
+** Returns void
+**
+*******************************************************************************/
+BTA_API extern void BTA_DmBleUpdateConnectionParams(BD_ADDR bd_addr, UINT16 min_int,
+ UINT16 max_int, UINT16 latency, UINT16 timeout);
+
+/*******************************************************************************
+**
+** Function BTA_DmBleSetStorageParams
+**
+** Description This function is called to set the storage parameters
+**
+** Parameters batch_scan_full_max -Max storage space (in %) allocated to full scanning
+** batch_scan_trunc_max -Max storage space (in %) allocated to truncated scanning
+** batch_scan_notify_threshold - Setup notification level based on total space
+** consumed by both pools. Setting it to 0 will disable threshold notification
+** p_setup_cback - Setup callback
+** p_thres_cback - Threshold callback
+** p_rep_cback - Reports callback
+** ref_value - Reference value
+**
+** Returns None
+**
+*******************************************************************************/
+BTA_API extern void BTA_DmBleSetStorageParams(UINT8 batch_scan_full_max,
+ UINT8 batch_scan_trunc_max,
+ UINT8 batch_scan_notify_threshold,
+ tBTA_BLE_SCAN_SETUP_CBACK *p_setup_cback,
+ tBTA_BLE_SCAN_THRESHOLD_CBACK *p_thres_cback,
+ tBTA_BLE_SCAN_REP_CBACK* p_rep_cback,
+ tBTA_DM_BLE_REF_VALUE ref_value);
+
+/*******************************************************************************
+**
+** Function BTA_DmBleEnableBatchScan
+**
+** Description This function is called to enable the batch scan
+**
+** Parameters scan_mode -Batch scan mode
+** scan_interval - Scan interval
+** scan_window - Scan window
+** discard_rule -Discard rules
+** addr_type - Address type
+** ref_value - Reference value
+**
+** Returns None
+**
+*******************************************************************************/
+BTA_API extern void BTA_DmBleEnableBatchScan(tBTA_BLE_SCAN_MODE scan_mode,
+ UINT32 scan_interval, UINT32 scan_window,
+ tBTA_BLE_DISCARD_RULE discard_rule,
+ tBLE_ADDR_TYPE addr_type,
+ tBTA_DM_BLE_REF_VALUE ref_value);
+
+/*******************************************************************************
+**
+** Function BTA_DmBleReadScanReports
+**
+** Description This function is called to read the batch scan reports
+**
+** Parameters scan_mode -Batch scan mode
+** ref_value - Reference value
+**
+** Returns None
+**
+*******************************************************************************/
+BTA_API extern void BTA_DmBleReadScanReports(tBTA_BLE_SCAN_MODE scan_type,
+ tBTA_DM_BLE_REF_VALUE ref_value);
+
+/*******************************************************************************
+**
+** Function BTA_DmBleDisableBatchScan
+**
+** Description This function is called to disable the batch scanning
+**
+** Parameters ref_value - Reference value
+**
+** Returns None
+**
+*******************************************************************************/
+BTA_API extern void BTA_DmBleDisableBatchScan(tBTA_DM_BLE_REF_VALUE ref_value);
+
+/*******************************************************************************
+**
+** Function BTA_DmEnableScanFilter
+**
+** Description This function is called to enable the adv data payload filter
+**
+** Parameters action - enable or disable the APCF feature
+** p_cmpl_cback - Command completed callback
+** ref_value - Reference value
+**
+** Returns void
+**
+*******************************************************************************/
+BTA_API extern void BTA_DmEnableScanFilter(UINT8 action,
+ tBTA_DM_BLE_PF_STATUS_CBACK *p_cmpl_cback,
+ tBTA_DM_BLE_REF_VALUE ref_value);
+
+/*******************************************************************************
+**
+** Function BTA_DmBleScanFilterSetup
+**
+** Description This function is called to setup the filter params
+**
+** Parameters p_target: enable the filter condition on a target device; if NULL
+** filt_index - Filter index
+** p_filt_params -Filter parameters
+** ref_value - Reference value
+** action - Add, delete or clear
+** p_cmpl_back - Command completed callback
+**
+** Returns void
+**
+*******************************************************************************/
+BTA_API extern void BTA_DmBleScanFilterSetup(UINT8 action,
+ tBTA_DM_BLE_PF_FILT_INDEX filt_index,
+ tBTA_DM_BLE_PF_FILT_PARAMS *p_filt_params,
+ tBLE_BD_ADDR *p_target,
+ tBTA_DM_BLE_PF_PARAM_CBACK *p_cmpl_cback,
+ tBTA_DM_BLE_REF_VALUE ref_value);
+
+/*******************************************************************************
+**
+** Function BTA_DmBleCfgFilterCondition
+**
+** Description This function is called to configure the adv data payload filter
+** condition.
+**
+** Parameters action: to read/write/clear
+** cond_type: filter condition type
+** filt_index - Filter index
+** p_cond: filter condition parameter
+** p_cmpl_back - Command completed callback
+** ref_value - Reference value
+**
+** Returns void
+**
+*******************************************************************************/
+BTA_API extern void BTA_DmBleCfgFilterCondition(tBTA_DM_BLE_SCAN_COND_OP action,
+ tBTA_DM_BLE_PF_COND_TYPE cond_type,
+ tBTA_DM_BLE_PF_FILT_INDEX filt_index,
+ tBTA_DM_BLE_PF_COND_PARAM *p_cond,
+ tBTA_DM_BLE_PF_CFG_CBACK *p_cmpl_cback,
+ tBTA_DM_BLE_REF_VALUE ref_value);
+
+
+/*******************************************************************************
+**
+** Function BTA_DmBleTrackAdvertiser
+**
+** Description This function is called to track the advertiser
+**
+** Parameters ref_value - Reference value
+** p_track_adv_cback - ADV callback
+**
+** Returns None
+**
+*******************************************************************************/
+BTA_API extern void BTA_DmBleTrackAdvertiser(tBTA_DM_BLE_REF_VALUE ref_value,
+ tBTA_BLE_TRACK_ADV_CBACK *p_track_adv_cback);
+
+/*******************************************************************************
+**
+** Function BTA_DmBleGetEnergyInfo
+**
+** Description This function is called to obtain the energy info
+**
+** Parameters p_cmpl_cback - Command complete callback
+**
+** Returns void
+**
+*******************************************************************************/
+BTA_API extern void BTA_DmBleGetEnergyInfo(tBTA_BLE_ENERGY_INFO_CBACK *p_cmpl_cback);
+
+/*******************************************************************************
+**
+** Function BTA_BrcmInit
+**
+** Description This function initializes Broadcom specific VS handler in BTA
+**
+** Returns void
+**
+*******************************************************************************/
+BTA_API extern void BTA_VendorInit (void);
+
+/*******************************************************************************
+**
+** Function BTA_BrcmCleanup
+**
+** Description This function frees up Broadcom specific VS specific dynamic memory
+**
+** Returns void
+**
+*******************************************************************************/
+BTA_API extern void BTA_VendorCleanup (void);
+
#endif
#ifdef __cplusplus
diff --git a/bta/include/bta_av_api.h b/bta/include/bta_av_api.h
index 1ea570c..22ee91c 100644
--- a/bta/include/bta_av_api.h
+++ b/bta/include/bta_av_api.h
@@ -249,8 +249,11 @@
#define BTA_AV_META_MSG_EVT 17 /* metadata messages */
#define BTA_AV_REJECT_EVT 18 /* incoming connection rejected */
#define BTA_AV_RC_FEAT_EVT 19 /* remote control channel peer supported features update */
+#define BTA_AV_MEDIA_SINK_CFG_EVT 20 /* command to configure codec */
+#define BTA_AV_MEDIA_DATA_EVT 21 /* sending data to Media Task */
/* Max BTA event */
-#define BTA_AV_MAX_EVT 20
+#define BTA_AV_MAX_EVT 22
+
typedef UINT8 tBTA_AV_EVT;
@@ -282,6 +285,7 @@
tBTA_AV_STATUS status;
BOOLEAN starting;
tBTA_AV_EDR edr; /* 0, if peer device does not support EDR */
+ UINT8 sep; /* sep type of peer device */
} tBTA_AV_OPEN;
/* data associated with BTA_AV_CLOSE_EVT */
@@ -446,6 +450,13 @@
tBTA_AV_RC_FEAT rc_feat;
} tBTA_AV;
+/* union of data associated with AV Media callback */
+typedef union
+{
+ BT_HDR *p_data;
+ UINT8 *codec_info;
+} tBTA_AV_MEDIA;
+
#define BTA_AVC_PACKET_LEN AVRC_PACKET_LEN
#define BTA_VENDOR_DATA_OFFSET 6
@@ -464,6 +475,7 @@
/* AV callback */
typedef void (tBTA_AV_CBACK)(tBTA_AV_EVT event, tBTA_AV *p_data);
+typedef void (tBTA_AV_DATA_CBACK)(tBTA_AV_EVT event, tBTA_AV_MEDIA *p_data);
/* type for stream state machine action functions */
typedef void (*tBTA_AV_ACT)(void *p_cb, void *p_data);
@@ -548,7 +560,7 @@
**
*******************************************************************************/
BTA_API void BTA_AvRegister(tBTA_AV_CHNL chnl, const char *p_service_name,
- UINT8 app_id);
+ UINT8 app_id, tBTA_AV_DATA_CBACK *p_data_cback);
/*******************************************************************************
**
@@ -573,7 +585,7 @@
**
*******************************************************************************/
BTA_API void BTA_AvOpen(BD_ADDR bd_addr, tBTA_AV_HNDL handle,
- BOOLEAN use_rc, tBTA_SEC sec_mask);
+ BOOLEAN use_rc, tBTA_SEC sec_mask, UINT16 uuid);
/*******************************************************************************
**
@@ -599,6 +611,17 @@
/*******************************************************************************
**
+** Function BTA_AvEnable_Sink
+**
+** Description Enable/Disable A2DP Sink.
+**
+** Returns void
+**
+*******************************************************************************/
+void BTA_AvEnable_Sink(int enable);
+
+/*******************************************************************************
+**
** Function BTA_AvStart
**
** Description Start audio/video stream data transfer.
diff --git a/bta/include/bta_av_ci.h b/bta/include/bta_av_ci.h
index 63668a9..faad260 100644
--- a/bta/include/bta_av_ci.h
+++ b/bta/include/bta_av_ci.h
@@ -63,7 +63,7 @@
*******************************************************************************/
BTA_API extern void bta_av_ci_setconfig(tBTA_AV_HNDL hndl, UINT8 err_code,
UINT8 category, UINT8 num_seid, UINT8 *p_seid,
- BOOLEAN recfg_needed);
+ BOOLEAN recfg_needed, UINT8 avdt_handle);
#ifdef __cplusplus
diff --git a/bta/include/bta_av_co.h b/bta/include/bta_av_co.h
index 862ac5e..ed11c50 100644
--- a/bta/include/bta_av_co.h
+++ b/bta/include/bta_av_co.h
@@ -100,7 +100,7 @@
**
*******************************************************************************/
BTA_API extern void bta_av_co_audio_disc_res(tBTA_AV_HNDL hndl, UINT8 num_seps,
- UINT8 num_snk, BD_ADDR addr);
+ UINT8 num_snk, UINT8 num_src, BD_ADDR addr, UINT16 uuid_local);
/*******************************************************************************
**
@@ -162,7 +162,7 @@
*******************************************************************************/
BTA_API extern void bta_av_co_audio_setconfig(tBTA_AV_HNDL hndl, tBTA_AV_CODEC codec_type,
UINT8 *p_codec_info, UINT8 seid, BD_ADDR addr,
- UINT8 num_protect, UINT8 *p_protect_info);
+ UINT8 num_protect, UINT8 *p_protect_info,UINT8 t_local_sep, UINT8 avdt_handle);
/*******************************************************************************
**
diff --git a/bta/include/bta_av_sbc.h b/bta/include/bta_av_sbc.h
index 98eb6ae..d7cfa89 100644
--- a/bta/include/bta_av_sbc.h
+++ b/bta/include/bta_av_sbc.h
@@ -194,6 +194,18 @@
/*******************************************************************************
**
+** Function bta_av_sbc_cfg_matches_cap
+**
+** Description This function checks whether an SBC codec configuration
+** matched with capabilities. Here we check subset.
+**
+** Returns 0 if ok, nonzero if error.
+**
+*******************************************************************************/
+extern UINT8 bta_av_sbc_cfg_matches_cap(UINT8 *p_cfg, tA2D_SBC_CIE *p_cap);
+
+/*******************************************************************************
+**
** Function bta_av_sbc_bld_hdr
**
** Description This function builds the packet header for MPF1.
diff --git a/bta/include/bta_gatt_api.h b/bta/include/bta_gatt_api.h
index b53b180..9e75eef 100644
--- a/bta/include/bta_gatt_api.h
+++ b/bta/include/bta_gatt_api.h
@@ -77,21 +77,33 @@
#define BTA_GATT_INSUF_RESOURCE GATT_INSUF_RESOURCE /* 0x0011 */
-#define BTA_GATT_ILLEGAL_PARAMETER GATT_ILLEGAL_PARAMETER /* 0x0087 */
-#define BTA_GATT_NO_RESOURCES GATT_NO_RESOURCES /* 0x0080 */
-#define BTA_GATT_INTERNAL_ERROR GATT_INTERNAL_ERROR /* 0x0081 */
-#define BTA_GATT_WRONG_STATE GATT_WRONG_STATE /* 0x0082 */
-#define BTA_GATT_DB_FULL GATT_DB_FULL /* 0x0083 */
-#define BTA_GATT_BUSY GATT_BUSY /* 0x0084 */
-#define BTA_GATT_ERROR GATT_ERROR /* 0x0085 */
-#define BTA_GATT_CMD_STARTED GATT_CMD_STARTED /* 0x0086 */
-#define BTA_GATT_PENDING GATT_PENDING /* 0x0088 */
-#define BTA_GATT_AUTH_FAIL GATT_AUTH_FAIL /* 0x0089 */
-#define BTA_GATT_MORE GATT_MORE /* 0x008a */
-#define BTA_GATT_INVALID_CFG GATT_INVALID_CFG /* 0x008b */
-#define BTA_GATT_DUP_REG 0x008c
-#define BTA_GATT_ALREADY_OPEN 0x008d /* 0x008d */
-#define BTA_GATT_CANCEL 0x008e /* 0x008e */
+#define BTA_GATT_NO_RESOURCES GATT_NO_RESOURCES /* 0x80 */
+#define BTA_GATT_INTERNAL_ERROR GATT_INTERNAL_ERROR /* 0x81 */
+#define BTA_GATT_WRONG_STATE GATT_WRONG_STATE /* 0x82 */
+#define BTA_GATT_DB_FULL GATT_DB_FULL /* 0x83 */
+#define BTA_GATT_BUSY GATT_BUSY /* 0x84 */
+#define BTA_GATT_ERROR GATT_ERROR /* 0x85 */
+#define BTA_GATT_CMD_STARTED GATT_CMD_STARTED /* 0x86 */
+#define BTA_GATT_ILLEGAL_PARAMETER GATT_ILLEGAL_PARAMETER /* 0x87 */
+#define BTA_GATT_PENDING GATT_PENDING /* 0x88 */
+#define BTA_GATT_AUTH_FAIL GATT_AUTH_FAIL /* 0x89 */
+#define BTA_GATT_MORE GATT_MORE /* 0x8a */
+#define BTA_GATT_INVALID_CFG GATT_INVALID_CFG /* 0x8b */
+#define BTA_GATT_SERVICE_STARTED GATT_SERVICE_STARTED /* 0x8c */
+#define BTA_GATT_ENCRYPED_MITM GATT_ENCRYPED_MITM /* GATT_SUCCESS */
+#define BTA_GATT_ENCRYPED_NO_MITM GATT_ENCRYPED_NO_MITM /* 0x8d */
+#define BTA_GATT_NOT_ENCRYPTED GATT_NOT_ENCRYPTED /* 0x8e */
+#define BTA_GATT_CONGESTED GATT_CONGESTED /* 0x8f */
+
+#define BTA_GATT_DUP_REG 0x90 /* 0x90 */
+#define BTA_GATT_ALREADY_OPEN 0x91 /* 0x91 */
+#define BTA_GATT_CANCEL 0x92 /* 0x92 */
+
+ /* 0xE0 ~ 0xFC reserved for future use */
+#define BTA_GATT_CCC_CFG_ERR GATT_CCC_CFG_ERR /* 0xFD Client Characteristic Configuration Descriptor Improperly Configured */
+#define BTA_GATT_PRC_IN_PROGRESS GATT_PRC_IN_PROGRESS /* 0xFE Procedure Already in progress */
+#define BTA_GATT_OUT_OF_RANGE GATT_OUT_OF_RANGE /* 0xFFAttribute value out of range */
+
typedef UINT8 tBTA_GATT_STATUS;
#define BTA_GATT_INVALID_CONN_ID GATT_INVALID_CONN_ID
@@ -117,6 +129,22 @@
#define BTA_GATTC_LISTEN_EVT 16 /* listen event */
#define BTA_GATTC_ENC_CMPL_CB_EVT 17 /* encryption complete callback event */
#define BTA_GATTC_CFG_MTU_EVT 18 /* configure MTU complete event */
+#define BTA_GATTC_ADV_DATA_EVT 19 /* ADV data event */
+#define BTA_GATTC_MULT_ADV_ENB_EVT 20 /* Enable Multi ADV event */
+#define BTA_GATTC_MULT_ADV_UPD_EVT 21 /* Update parameter event */
+#define BTA_GATTC_MULT_ADV_DATA_EVT 22 /* Multi ADV data event */
+#define BTA_GATTC_MULT_ADV_DIS_EVT 23 /* Disable Multi ADV event */
+#define BTA_GATTC_CONGEST_EVT 24 /* Congestion event */
+#define BTA_GATTC_BTH_SCAN_ENB_EVT 25 /* Enable batch scan event */
+#define BTA_GATTC_BTH_SCAN_CFG_EVT 26 /* Config storage event */
+#define BTA_GATTC_BTH_SCAN_RD_EVT 27 /* Batch scan reports read event */
+#define BTA_GATTC_BTH_SCAN_THR_EVT 28 /* Batch scan threshold event */
+#define BTA_GATTC_BTH_SCAN_PARAM_EVT 29 /* Batch scan param event */
+#define BTA_GATTC_BTH_SCAN_DIS_EVT 30 /* Disable batch scan event */
+#define BTA_GATTC_SCAN_FLT_CFG_EVT 31 /* Scan filter config event */
+#define BTA_GATTC_SCAN_FLT_PARAM_EVT 32 /* Param filter event */
+#define BTA_GATTC_SCAN_FLT_STATUS_EVT 33 /* Filter status event */
+#define BTA_GATTC_ADV_VSC_EVT 34 /* ADV VSC event */
typedef UINT8 tBTA_GATTC_EVT;
@@ -325,6 +353,7 @@
UINT16 conn_id;
tBTA_GATTC_IF client_if;
BD_ADDR remote_bda;
+ tBTA_TRANSPORT transport;
UINT16 mtu;
}tBTA_GATTC_OPEN;
@@ -348,6 +377,12 @@
BOOLEAN is_notify;
}tBTA_GATTC_NOTIFY;
+typedef struct
+{
+ UINT16 conn_id;
+ BOOLEAN congested; /* congestion indicator */
+}tBTA_GATTC_CONGEST;
+
// btla-specific ++
typedef struct
{
@@ -380,6 +415,7 @@
tBTA_GATTC_ENC_CMPL_CB enc_cmpl;
BD_ADDR remote_bda; /* service change event */
tBTA_GATTC_CFG_MTU cfg_mtu; /* configure MTU operation */
+ tBTA_GATTC_CONGEST congest;
} tBTA_GATTC;
/* GATTC enable callback function */
@@ -411,6 +447,7 @@
#define BTA_GATTS_CANCEL_OPEN_EVT 17
#define BTA_GATTS_CLOSE_EVT 18
#define BTA_GATTS_LISTEN_EVT 19
+#define BTA_GATTS_CONGEST_EVT 20
typedef UINT8 tBTA_GATTS_EVT;
typedef tGATT_IF tBTA_GATTS_IF;
@@ -469,12 +506,9 @@
typedef tGATTS_SRV_CHG_REQ tBTA_GATTS_SRV_CHG_REQ;
typedef tGATTS_SRV_CHG_RSP tBTA_GATTS_SRV_CHG_RSP;
-enum
-{
- BTA_GATT_TRANSPORT_LE,
- BTA_GATT_TRANSPORT_BR_EDR,
- BTA_GATT_TRANSPORT_LE_BR_EDR
-};
+#define BTA_GATT_TRANSPORT_LE GATT_TRANSPORT_LE
+#define BTA_GATT_TRANSPORT_BR_EDR GATT_TRANSPORT_BR_EDR
+#define BTA_GATT_TRANSPORT_LE_BR_EDR GATT_TRANSPORT_LE_BR_EDR
typedef UINT8 tBTA_GATT_TRANSPORT;
/* attribute value */
@@ -499,6 +533,7 @@
typedef struct
{
+ tBTA_GATT_STATUS status;
BD_ADDR remote_bda;
UINT32 trans_id;
UINT16 conn_id;
@@ -552,21 +587,35 @@
BD_ADDR remote_bda;
UINT16 conn_id;
tBTA_GATT_REASON reason; /* report disconnect reason */
+ tBTA_GATT_TRANSPORT transport;
}tBTA_GATTS_CONN;
+typedef struct
+{
+ UINT16 conn_id;
+ BOOLEAN congested; /* report channel congestion indicator */
+}tBTA_GATTS_CONGEST;
+
+typedef struct
+{
+ UINT16 conn_id; /* connection ID */
+ tBTA_GATT_STATUS status; /* notification/indication status */
+}tBTA_GATTS_CONF;
+
/* GATTS callback data */
typedef union
{
tBTA_GATTS_REG_OPER reg_oper;
tBTA_GATTS_CREATE create;
tBTA_GATTS_SRVC_OPER srvc_oper;
- tBTA_GATT_STATUS status; /* BTA_GATTS_CONF_EVT */
+ tBTA_GATT_STATUS status; /* BTA_GATTS_LISTEN_EVT */
tBTA_GATTS_ADD_RESULT add_result; /* add included service: BTA_GATTS_ADD_INCL_SRVC_EVT
add char : BTA_GATTS_ADD_CHAR_EVT
add char descriptor: BTA_GATTS_ADD_CHAR_DESCR_EVT */
tBTA_GATTS_REQ req_data;
tBTA_GATTS_CONN conn; /* BTA_GATTS_CONN_EVT */
-
+ tBTA_GATTS_CONGEST congest; /* BTA_GATTS_CONGEST_EVT callback data */
+ tBTA_GATTS_CONF confirm; /* BTA_GATTS_CONF_EVT callback data */
}tBTA_GATTS;
/* GATTS enable callback function */
@@ -644,7 +693,8 @@
** Returns void
**
*******************************************************************************/
-BTA_API extern void BTA_GATTC_Open(tBTA_GATTC_IF client_if, BD_ADDR remote_bda, BOOLEAN is_direct);
+BTA_API extern void BTA_GATTC_Open(tBTA_GATTC_IF client_if, BD_ADDR remote_bda,
+ BOOLEAN is_direct, tBTA_GATT_TRANSPORT transport);
/*******************************************************************************
**
@@ -1301,7 +1351,8 @@
** Returns void
**
*******************************************************************************/
- BTA_API extern void BTA_GATTS_Open(tBTA_GATTS_IF server_if, BD_ADDR remote_bda, BOOLEAN is_direct);
+ BTA_API extern void BTA_GATTS_Open(tBTA_GATTS_IF server_if, BD_ADDR remote_bda,
+ BOOLEAN is_direct, tBTA_GATT_TRANSPORT transport);
/*******************************************************************************
diff --git a/bta/include/bta_hf_client_api.h b/bta/include/bta_hf_client_api.h
new file mode 100644
index 0000000..8ef42f4
--- /dev/null
+++ b/bta/include/bta_hf_client_api.h
@@ -0,0 +1,382 @@
+/******************************************************************************
+ *
+ * Copyright (c) 2014 The Android Open Source Project
+ * Copyright (C) 2003-2012 Broadcom Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * This is the public interface file for the handsfree (HF role) subsystem
+ *
+ ******************************************************************************/
+#ifndef BTA_HF_CLIENT_API_H
+#define BTA_HF_CLIENT_API_H
+
+#include "bta_api.h"
+
+/*****************************************************************************
+** Constants and data types
+*****************************************************************************/
+
+/* HFP peer (AG) features*/
+#define BTA_HF_CLIENT_PEER_FEAT_3WAY 0x00000001 /* Three-way calling */
+#define BTA_HF_CLIENT_PEER_FEAT_ECNR 0x00000002 /* Echo cancellation and/or noise reduction */
+#define BTA_HF_CLIENT_PEER_FEAT_VREC 0x00000004 /* Voice recognition */
+#define BTA_HF_CLIENT_PEER_INBAND 0x00000008 /* In-band ring tone */
+#define BTA_HF_CLIENT_PEER_VTAG 0x00000010 /* Attach a phone number to a voice tag */
+#define BTA_HF_CLIENT_PEER_REJECT 0x00000020 /* Ability to reject incoming call */
+#define BTA_HF_CLIENT_PEER_ECS 0x00000040 /* Enhanced Call Status */
+#define BTA_HF_CLIENT_PEER_ECC 0x00000080 /* Enhanced Call Control */
+#define BTA_HF_CLIENT_PEER_EXTERR 0x00000100 /* Extended error codes */
+#define BTA_HF_CLIENT_PEER_CODEC 0x00000200 /* Codec Negotiation */
+
+typedef UINT16 tBTA_HF_CLIENT_PEER_FEAT;
+
+/* HFP HF features */
+#define BTA_HF_CLIENT_FEAT_ECNR 0x00000001 /* Echo cancellation and/or noise reduction */
+#define BTA_HF_CLIENT_FEAT_3WAY 0x00000002 /* Call waiting and three-way calling */
+#define BTA_HF_CLIENT_FEAT_CLI 0x00000004 /* Caller ID presentation capability */
+#define BTA_HF_CLIENT_FEAT_VREC 0x00000008 /* Voice recognition activation */
+#define BTA_HF_CLIENT_FEAT_VOL 0x00000010 /* Remote volume control */
+#define BTA_HF_CLIENT_FEAT_ECS 0x00000020 /* Enhanced Call Status */
+#define BTA_HF_CLIENT_FEAT_ECC 0x00000040 /* Enhanced Call Control */
+#define BTA_HF_CLIENT_FEAT_CODEC 0x00000080 /* Codec Negotiation */
+
+/* HFP HF extended call handling - masks not related to any spec */
+#define BTA_HF_CLIENT_CHLD_REL 0x00000001 /* 0 Release waiting call or held calls */
+#define BTA_HF_CLIENT_CHLD_REL_ACC 0x00000002 /* 1 Release active calls and accept other (waiting or held) cal */
+#define BTA_HF_CLIENT_CHLD_REL_X 0x00000004 /* 1x Release x call*/
+#define BTA_HF_CLIENT_CHLD_HOLD_ACC 0x00000008 /* 2 Active calls on hold and accept other call */
+#define BTA_HF_CLIENT_CHLD_PRIV_X 0x00000010 /* 2x Active multiparty call on hold except call x */
+#define BTA_HF_CLIENT_CHLD_MERGE 0x00000020 /* 3 Add held call to multiparty */
+#define BTA_HF_CLIENT_CHLD_MERGE_DETACH 0x00000040 /* 4 Add held call to multiparty */
+
+typedef UINT16 tBTA_HF_CLIENT_CHLD_FEAT;
+
+/* HFP AG errors ot OK sent to HF Unit */
+#define BTA_HF_CLIENT_AT_RESULT_OK 0
+#define BTA_HF_CLIENT_AT_RESULT_ERROR 1
+#define BTA_HF_CLIENT_AT_RESULT_NO_CARRIER 2
+#define BTA_HF_CLIENT_AT_RESULT_BUSY 3
+#define BTA_HF_CLIENT_AT_RESULT_NO_ANSWER 4
+#define BTA_HF_CLIENT_AT_RESULT_DELAY 5
+#define BTA_HF_CLIENT_AT_RESULT_BLACKLISTED 6
+#define BTA_HF_CLIENT_AT_RESULT_CME 7
+
+typedef UINT8 tBTA_HF_CLIENT_AT_RESULT_TYPE;
+
+/* HF Client callback events */
+#define BTA_HF_CLIENT_ENABLE_EVT 0 /* HF Client enabled */
+#define BTA_HF_CLIENT_REGISTER_EVT 1 /* HF Client registered */
+#define BTA_HF_CLIENT_OPEN_EVT 2 /* HF Client connection open */
+#define BTA_HF_CLIENT_CLOSE_EVT 3 /* HF Client connection closed */
+#define BTA_HF_CLIENT_CONN_EVT 4 /* Service level connection opened */
+#define BTA_HF_CLIENT_AUDIO_OPEN_EVT 5 /* Audio connection open */
+#define BTA_HF_CLIENT_AUDIO_MSBC_OPEN_EVT 6 /* Audio connection with mSBC codec open */
+#define BTA_HF_CLIENT_AUDIO_CLOSE_EVT 7 /* Audio connection closed */
+#define BTA_HF_CLIENT_SPK_EVT 8 /* Speaker volume changed */
+#define BTA_HF_CLIENT_MIC_EVT 9 /* Microphone volume changed */
+#define BTA_HF_CLIENT_IND_EVT 10 /* Indicator */
+#define BTA_HF_CLIENT_VOICE_REC_EVT 11 /* AG changed voice recognition setting */
+#define BTA_HF_CLIENT_OPERATOR_NAME_EVT 12 /* Operator name acquired */
+#define BTA_HF_CLIENT_CLIP_EVT 13 /* Calling line identification event */
+#define BTA_HF_CLIENT_CCWA_EVT 14 /* Call waiting notification */
+#define BTA_HF_CLIENT_AT_RESULT_EVT 15 /* Call waiting notification */
+#define BTA_HF_CLIENT_CLCC_EVT 16 /* current call event */
+#define BTA_HF_CLIENT_CNUM_EVT 17 /* subscriber information event */
+#define BTA_HF_CLIENT_BTRH_EVT 18 /* bluetooth response and hold event */
+#define BTA_HF_CLIENT_BSIR_EVT 19 /* in-band ring tone setting changed event */
+#define BTA_HF_CLIENT_BINP_EVT 20 /* binp number event */
+#define BTA_HF_CLIENT_RING_INDICATION 21 /* HF Client ring indication */
+#define BTA_HF_CLIENT_DISABLE_EVT 30 /* HF Client disabled */
+
+typedef UINT8 tBTA_HF_CLIENT_EVT;
+
+/* HF Client open status */
+#define BTA_HF_CLIENT_SUCCESS 0 /* Connection successfully opened */
+#define BTA_HF_CLIENT_FAIL_SDP 1 /* Open failed due to SDP */
+#define BTA_HF_CLIENT_FAIL_RFCOMM 2 /* Open failed due to RFCOMM */
+#define BTA_HF_CLIENT_FAIL_RESOURCES 3 /* out of resources failure */
+
+typedef UINT8 tBTA_HF_CLIENT_STATUS;
+
+/* indicator type */
+#define BTA_HF_CLIENT_IND_BATTCH 0 /* Battery charge indicator */
+#define BTA_HF_CLIENT_IND_SIGNAL 1 /* Signal Strength indicator */
+#define BTA_HF_CLIENT_IND_SERVICE 2 /* Service availability indicator */
+#define BTA_HF_CLIENT_IND_CALL 3 /* Standard call status indicator*/
+#define BTA_HF_CLIENT_IND_ROAM 4 /* Roaming status indicator */
+#define BTA_HF_CLIENT_IND_CALLSETUP 5 /* Call setup status indicator */
+#define BTA_HF_CLIENT_IND_CALLHELD 6 /* Call hold status indicator */
+
+typedef UINT8 tBTA_HF_CLIENT_IND_TYPE;
+
+/* AT commands */
+#define BTA_HF_CLIENT_AT_CMD_VTS 0
+#define BTA_HF_CLIENT_AT_CMD_BTRH 1
+#define BTA_HF_CLIENT_AT_CMD_CHUP 2
+#define BTA_HF_CLIENT_AT_CMD_CHLD 3
+#define BTA_HF_CLIENT_AT_CMD_BCC 4
+#define BTA_HF_CLIENT_AT_CMD_CNUM 5
+#define BTA_HF_CLIENT_AT_CMD_ATA 6
+#define BTA_HF_CLIENT_AT_CMD_COPS 7
+#define BTA_HF_CLIENT_AT_CMD_ATD 8
+#define BTA_HF_CLIENT_AT_CMD_VGM 9
+#define BTA_HF_CLIENT_AT_CMD_VGS 10
+#define BTA_HF_CLIENT_AT_CMD_BVRA 11
+#define BTA_HF_CLIENT_AT_CMD_CLCC 12
+#define BTA_HF_CLIENT_AT_CMD_BINP 13
+#define BTA_HF_CLIENT_AT_CMD_BLDN 14
+#define BTA_HF_CLIENT_AT_CMD_NREC 15
+
+typedef UINT8 tBTA_HF_CLIENT_AT_CMD_TYPE;
+
+/* data associated with most non-AT events */
+/* placeholder, if not needed should be removed*/
+typedef struct
+{
+} tBTA_HF_CLIENT_HDR;
+
+/* data associated with BTA_HF_CLIENT_REGISTER_EVT */
+typedef struct
+{
+ tBTA_HF_CLIENT_HDR hdr;
+ UINT16 handle;
+ tBTA_HF_CLIENT_STATUS status;
+} tBTA_HF_CLIENT_REGISTER;
+
+/* data associated with BTA_HF_CLIENT_OPEN_EVT */
+typedef struct
+{
+ tBTA_HF_CLIENT_HDR hdr;
+ BD_ADDR bd_addr;
+ tBTA_HF_CLIENT_STATUS status;
+} tBTA_HF_CLIENT_OPEN;
+
+/* data associated with BTA_HF_CLIENT_CONN_EVT */
+typedef struct
+{
+ tBTA_HF_CLIENT_HDR hdr;
+ tBTA_HF_CLIENT_PEER_FEAT peer_feat;
+ tBTA_HF_CLIENT_CHLD_FEAT chld_feat;
+} tBTA_HF_CLIENT_CONN;
+
+/* data associated with BTA_HF_CLIENT_IND_EVT event */
+typedef struct
+{
+ tBTA_HF_CLIENT_HDR hdr;
+ tBTA_HF_CLIENT_IND_TYPE type;
+ UINT16 value;
+} tBTA_HF_CLIENT_IND;
+
+/* data associated with BTA_HF_CLIENT_OPERATOR_NAME_EVT */
+#define BTA_HF_CLIENT_OPERATOR_NAME_LEN 16
+typedef struct
+{
+ char name[BTA_HF_CLIENT_OPERATOR_NAME_LEN + 1];
+} tBTA_HF_CLIENT_OPERATOR_NAME;
+
+/* data associated with BTA_HF_CLIENT_CLIP_EVT and BTA_HF_CLIENT_CCWA_EVT*/
+#define BTA_HF_CLIENT_NUMBER_LEN 32
+typedef struct
+{
+ char number[BTA_HF_CLIENT_NUMBER_LEN + 1];
+} tBTA_HF_CLIENT_NUMBER;
+
+/* data associated with BTA_HF_CLIENT_AT_RESULT_EVT event */
+typedef struct
+{
+ tBTA_HF_CLIENT_AT_RESULT_TYPE type;
+ UINT16 cme;
+} tBTA_HF_CLIENT_AT_RESULT;
+
+/* data associated with BTA_HF_CLIENT_CLCC_EVT event */
+typedef struct
+{
+ UINT32 idx;
+ BOOLEAN inc;
+ UINT8 status;
+ BOOLEAN mpty;
+ BOOLEAN number_present;
+ char number[BTA_HF_CLIENT_NUMBER_LEN + 1];
+} tBTA_HF_CLIENT_CLCC;
+
+/* data associated with BTA_HF_CLIENT_CNUM_EVT event */
+typedef struct
+{
+ UINT16 service;
+ char number[BTA_HF_CLIENT_NUMBER_LEN + 1];
+} tBTA_HF_CLIENT_CNUM;
+
+/* data associated with other events */
+typedef struct
+{
+ UINT16 value;
+} tBTA_HF_CLIENT_VAL;
+
+/* union of data associated with AG callback */
+typedef union
+{
+ tBTA_HF_CLIENT_HDR hdr;
+ tBTA_HF_CLIENT_REGISTER reg;
+ tBTA_HF_CLIENT_OPEN open;
+ tBTA_HF_CLIENT_CONN conn;
+ tBTA_HF_CLIENT_IND ind;
+ tBTA_HF_CLIENT_VAL val;
+ tBTA_HF_CLIENT_OPERATOR_NAME operator;
+ tBTA_HF_CLIENT_NUMBER number;
+ tBTA_HF_CLIENT_AT_RESULT result;
+ tBTA_HF_CLIENT_CLCC clcc;
+ tBTA_HF_CLIENT_CNUM cnum;
+} tBTA_HF_CLIENT;
+
+typedef UINT32 tBTA_HF_CLIENT_FEAT;
+
+/* HF Client callback */
+typedef void (tBTA_HF_CLIENT_CBACK)(tBTA_HF_CLIENT_EVT event, tBTA_HF_CLIENT *p_data);
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/*****************************************************************************
+** External Function Declarations
+*****************************************************************************/
+
+/*******************************************************************************
+**
+** Function BTA_HfClientEnable
+**
+** Description Enable the HF CLient service. When the enable
+** operation is complete the callback function will be
+** called with a BTA_HF_CLIENT_ENABLE_EVT. This function must
+** be called before other function in the HF CLient API are
+** called.
+**
+** Returns BTA_SUCCESS if OK, BTA_FAILURE otherwise.
+**
+*******************************************************************************/
+BTA_API tBTA_STATUS BTA_HfClientEnable(tBTA_HF_CLIENT_CBACK *p_cback);
+
+/*******************************************************************************
+**
+** Function BTA_HfClientDisable
+**
+** Description Disable the HF Client service
+**
+**
+** Returns void
+**
+*******************************************************************************/
+BTA_API void BTA_HfClientDisable(void);
+
+/*******************************************************************************
+**
+** Function BTA_HfClientRegister
+**
+** Description Register an HF Client service.
+**
+**
+** Returns void
+**
+*******************************************************************************/
+BTA_API void BTA_HfClientRegister(tBTA_SEC sec_mask, tBTA_HF_CLIENT_FEAT features,
+ char *p_service_name);
+
+/*******************************************************************************
+**
+** Function BTA_HfClientDeregister
+**
+** Description Deregister an HF Client service.
+**
+**
+** Returns void
+**
+*******************************************************************************/
+BTA_API void BTA_HfClientDeregister(UINT16 handle);
+
+/*******************************************************************************
+**
+** Function BTA_HfClientOpen
+**
+** Description Opens a connection to an audio gateway.
+** When connection is open callback function is called
+** with a BTA_HF_CLIENT_OPEN_EVT. Only the data connection is
+** opened. The audio connection is not opened.
+**
+**
+** Returns void
+**
+*******************************************************************************/
+BTA_API void BTA_HfClientOpen(UINT16 handle, BD_ADDR bd_addr, tBTA_SEC sec_mask);
+
+/*******************************************************************************
+**
+** Function BTA_HfClientClose
+**
+** Description Close the current connection to an audio gateway.
+** Any current audio connection will also be closed
+**
+**
+** Returns void
+**
+*******************************************************************************/
+BTA_API void BTA_HfClientClose(UINT16 handle);
+
+/*******************************************************************************
+**
+** Function BTA_HfCllientAudioOpen
+**
+** Description Opens an audio connection to the currently connected
+** audio gateway
+**
+**
+** Returns void
+**
+*******************************************************************************/
+BTA_API void BTA_HfClientAudioOpen(UINT16 handle);
+
+/*******************************************************************************
+**
+** Function BTA_HfClientAudioClose
+**
+** Description Close the currently active audio connection to an audio
+** gateway. The data connection remains open
+**
+**
+** Returns void
+**
+*******************************************************************************/
+BTA_API void BTA_HfClientAudioClose(UINT16 handle);
+
+/*******************************************************************************
+**
+** Function BTA_HfClientSendAT
+**
+** Description send AT command
+**
+**
+** Returns void
+**
+*******************************************************************************/
+BTA_API void BTA_HfClientSendAT(UINT16 handle, tBTA_HF_CLIENT_AT_CMD_TYPE at, UINT32 val1, UINT32 val2, const char *str);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* BTA_HF_CLIENT_API_H */
diff --git a/bta/include/bta_hh_co.h b/bta/include/bta_hh_co.h
old mode 100644
new mode 100755
index 8f648df..bf73b46
--- a/bta/include/bta_hh_co.h
+++ b/bta/include/bta_hh_co.h
@@ -26,6 +26,14 @@
#include "bta_hh_api.h"
+typedef struct
+{
+ UINT16 rpt_uuid;
+ UINT8 rpt_id;
+ tBTA_HH_RPT_TYPE rpt_type;
+ UINT8 inst_id;
+ UINT8 prop;
+}tBTA_HH_RPT_CACHE_ENTRY;
/*******************************************************************************
**
@@ -68,5 +76,59 @@
*******************************************************************************/
BTA_API extern void bta_hh_co_close(UINT8 dev_handle, UINT8 app_id);
+#if (BLE_INCLUDED == TRUE && BTA_HH_LE_INCLUDED == TRUE)
+/*******************************************************************************
+**
+** Function bta_hh_le_co_rpt_info
+**
+** Description This callout function is to convey the report information on
+** a HOGP device to the application. Application can save this
+** information in NV if device is bonded and load it back when
+** stack reboot.
+**
+** Parameters remote_bda - remote device address
+** p_entry - report entry pointer
+** app_id - application id
+**
+** Returns void.
+**
+*******************************************************************************/
+BTA_API extern void bta_hh_le_co_rpt_info(BD_ADDR remote_bda,
+ tBTA_HH_RPT_CACHE_ENTRY *p_entry,
+ UINT8 app_id);
+
+/*******************************************************************************
+**
+** Function bta_hh_le_co_cache_load
+**
+** Description This callout function is to request the application to load the
+** cached HOGP report if there is any. When cache reading is completed,
+** bta_hh_le_ci_cache_load() is called by the application.
+**
+** Parameters remote_bda - remote device address
+** p_num_rpt: number of cached report
+** app_id - application id
+**
+** Returns the acched report array
+**
+*******************************************************************************/
+BTA_API extern tBTA_HH_RPT_CACHE_ENTRY *bta_hh_le_co_cache_load (BD_ADDR remote_bda,
+ UINT8 *p_num_rpt,
+ UINT8 app_id);
+
+/*******************************************************************************
+**
+** Function bta_hh_le_co_reset_rpt_cache
+**
+** Description This callout function is to reset the HOGP device cache.
+**
+** Parameters remote_bda - remote device address
+**
+** Returns none
+**
+*******************************************************************************/
+BTA_API extern void bta_hh_le_co_reset_rpt_cache (BD_ADDR remote_bda, UINT8 app_id);
+
+#endif /* #if (BLE_INCLUDED == TRUE && BTA_HH_LE_INCLUDED == TRUE) */
#endif /* BTA_HH_CO_H */
diff --git a/bta/include/bta_mce_api.h b/bta/include/bta_mce_api.h
new file mode 100644
index 0000000..b9fbf6a
--- /dev/null
+++ b/bta/include/bta_mce_api.h
@@ -0,0 +1,132 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright (C) 2006-2012 Broadcom Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * This is the public interface file the BTA MCE I/F
+ *
+ ******************************************************************************/
+#ifndef BTA_MCE_API_H
+#define BTA_MCE_API_H
+
+#include "data_types.h"
+#include "bt_target.h"
+#include "bt_types.h"
+#include "bta_api.h"
+#include "btm_api.h"
+
+/*****************************************************************************
+** Constants and data types
+*****************************************************************************/
+/* status values */
+#define BTA_MCE_SUCCESS 0 /* Successful operation. */
+#define BTA_MCE_FAILURE 1 /* Generic failure. */
+#define BTA_MCE_BUSY 2 /* Temporarily can not handle this request. */
+
+typedef UINT8 tBTA_MCE_STATUS;
+
+/* MCE I/F callback events */
+/* events received by tBTA_MCE_DM_CBACK */
+#define BTA_MCE_ENABLE_EVT 0 /* MCE enabled */
+#define BTA_MCE_MAS_DISCOVERY_COMP_EVT 1 /* SDP MAS discovery complete */
+#define BTA_MCE_MAX_EVT 2 /* max number of MCE events */
+
+#define BTA_MCE_MAX_MAS_INSTANCES 12
+
+typedef UINT16 tBTA_MCE_EVT;
+
+typedef struct
+{
+ UINT8 scn;
+ char *p_srv_name;
+ UINT16 srv_name_len;
+ UINT8 instance_id;
+ UINT8 msg_type;
+} tBTA_MCE_MAS_INFO;
+
+/* data associated with BTA_MCE_MAS_DISCOVERY_COMP_EVT */
+typedef struct
+{
+ tBTA_MCE_STATUS status;
+ BD_ADDR remote_addr;
+ int num_mas;
+ tBTA_MCE_MAS_INFO mas[BTA_MCE_MAX_MAS_INSTANCES];
+} tBTA_MCE_MAS_DISCOVERY_COMP;
+
+/* union of data associated with MCE callback */
+typedef union
+{
+ tBTA_MCE_STATUS status; /* BTA_MCE_ENABLE_EVT */
+ tBTA_MCE_MAS_DISCOVERY_COMP mas_disc_comp; /* BTA_MCE_MAS_DISCOVERY_COMP_EVT */
+} tBTA_MCE;
+
+/* MCE DM Interface callback */
+typedef void (tBTA_MCE_DM_CBACK)(tBTA_MCE_EVT event, tBTA_MCE *p_data, void * user_data);
+
+/* MCE configuration structure */
+typedef struct
+{
+ UINT16 sdp_db_size; /* The size of p_sdp_db */
+ tSDP_DISCOVERY_DB *p_sdp_db; /* The data buffer to keep SDP database */
+} tBTA_MCE_CFG;
+
+/*****************************************************************************
+** External Function Declarations
+*****************************************************************************/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/*******************************************************************************
+**
+** Function BTA_MceEnable
+**
+** Description Enable the MCE I/F service. When the enable
+** operation is complete the callback function will be
+** called with a BTA_MCE_ENABLE_EVT. This function must
+** be called before other functions in the MCE API are
+** called.
+**
+** Returns BTA_MCE_SUCCESS if successful.
+** BTA_MCE_FAIL if internal failure.
+**
+*******************************************************************************/
+BTA_API extern tBTA_MCE_STATUS BTA_MceEnable(tBTA_MCE_DM_CBACK *p_cback);
+
+/*******************************************************************************
+**
+** Function BTA_MceGetRemoteMasInstances
+**
+** Description This function performs service discovery for the MAS service
+** by the given peer device. When the operation is completed
+** the tBTA_MCE_DM_CBACK callback function will be called with
+** a BTA_MCE_MAS_DISCOVERY_COMP_EVT.
+**
+** Returns BTA_MCE_SUCCESS, if the request is being processed.
+** BTA_MCE_FAILURE, otherwise.
+**
+*******************************************************************************/
+BTA_API extern tBTA_MCE_STATUS BTA_MceGetRemoteMasInstances(BD_ADDR bd_addr);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* BTA_MCE_API_H */
diff --git a/bta/jv/bta_jv_act.c b/bta/jv/bta_jv_act.c
index dd09ca7..3419089 100644
--- a/bta/jv/bta_jv_act.c
+++ b/bta/jv/bta_jv_act.c
@@ -56,7 +56,7 @@
{
char uuids[128];
uuid_to_string((bt_uuid_t*)p_uuid, uuids);
- APPL_TRACE_DEBUG2("%s: %s", title, uuids);
+ APPL_TRACE_DEBUG("%s: %s", title, uuids);
}
@@ -135,7 +135,7 @@
used++;
}
if (used == BTA_JV_NUM_SERVICE_ID)
- APPL_TRACE_ERROR1("get_sec_id_used, sec id exceeds the limit:%d",
+ APPL_TRACE_ERROR("get_sec_id_used, sec id exceeds the limit:%d",
BTA_JV_NUM_SERVICE_ID);
return used;
}
@@ -149,7 +149,7 @@
used++;
}
if (used == BTA_JV_MAX_RFC_CONN)
- APPL_TRACE_ERROR1("get_sec_id_used, rfc ctrl block exceeds the limit:%d",
+ APPL_TRACE_ERROR("get_sec_id_used, rfc ctrl block exceeds the limit:%d",
BTA_JV_MAX_RFC_CONN);
return used;
}
@@ -201,7 +201,7 @@
for (j = 0; j < BTA_JV_MAX_RFC_SR_SESSION; j++)
p_cb->rfc_hdl[j] = 0;
p_cb->rfc_hdl[0] = port_handle;
- APPL_TRACE_DEBUG2( "bta_jv_alloc_rfc_cb port_handle:%d handle:0x%2x",
+ APPL_TRACE_DEBUG( "bta_jv_alloc_rfc_cb port_handle:%d handle:0x%2x",
port_handle, p_cb->handle);
p_pcb = &bta_jv_cb.port_cb[port_handle - 1];
@@ -214,7 +214,7 @@
}
if(p_cb == NULL)
{
- APPL_TRACE_ERROR2( "bta_jv_alloc_rfc_cb: port_handle:%d, ctrl block exceeds "
+ APPL_TRACE_ERROR( "bta_jv_alloc_rfc_cb: port_handle:%d, ctrl block exceeds "
"limit:%d", port_handle, BTA_JV_MAX_RFC_CONN);
}
return p_cb;
@@ -267,7 +267,7 @@
}
else
{
- APPL_TRACE_WARNING2("bta_jv_rfc_port_to_cb(port_handle:0x%x):jv handle:0x%x not"
+ APPL_TRACE_WARNING("bta_jv_rfc_port_to_cb(port_handle:0x%x):jv handle:0x%x not"
" FOUND", port_handle, bta_jv_cb.port_cb[port_handle - 1].handle);
}
return p_cb;
@@ -281,12 +281,12 @@
if (!p_cb || !p_pcb)
{
- APPL_TRACE_ERROR0("bta_jv_free_sr_rfc_cb, p_cb or p_pcb cannot be null");
+ APPL_TRACE_ERROR("bta_jv_free_sr_rfc_cb, p_cb or p_pcb cannot be null");
return BTA_JV_FAILURE;
}
- APPL_TRACE_DEBUG6("bta_jv_free_sr_rfc_cb: max_sess:%d, curr_sess:%d, p_pcb:%p, user:"
- "%d, state:%d, jv handle: 0x%x" ,p_cb->max_sess, p_cb->curr_sess, p_pcb,
- (int)p_pcb->user_data, p_pcb->state, p_pcb->handle);
+ APPL_TRACE_DEBUG("bta_jv_free_sr_rfc_cb: max_sess:%d, curr_sess:%d, p_pcb:%p, user:"
+ "%p, state:%d, jv handle: 0x%x" ,p_cb->max_sess, p_cb->curr_sess, p_pcb,
+ p_pcb->user_data, p_pcb->state, p_pcb->handle);
if (p_cb->curr_sess <= 0)
return BTA_JV_SUCCESS;
@@ -295,33 +295,33 @@
{
case BTA_JV_ST_CL_CLOSING:
case BTA_JV_ST_SR_CLOSING:
- APPL_TRACE_WARNING4("bta_jv_free_sr_rfc_cb: return on closing, port state:%d, "
- "scn:%d, p_pcb:%p, user_data:%d", p_pcb->state, p_cb->scn, p_pcb,
- (int)p_pcb->user_data);
+ APPL_TRACE_WARNING("bta_jv_free_sr_rfc_cb: return on closing, port state:%d, "
+ "scn:%d, p_pcb:%p, user_data:%p", p_pcb->state, p_cb->scn, p_pcb,
+ p_pcb->user_data);
status = BTA_JV_FAILURE;
return status;
case BTA_JV_ST_CL_OPEN:
case BTA_JV_ST_CL_OPENING:
- APPL_TRACE_DEBUG3("bta_jv_free_sr_rfc_cb: state: %d, scn:%d,"
- " user_data:%d", p_pcb->state, p_cb->scn, (int)p_pcb->user_data);
+ APPL_TRACE_DEBUG("bta_jv_free_sr_rfc_cb: state: %d, scn:%d,"
+ " user_data:%p", p_pcb->state, p_cb->scn, p_pcb->user_data);
p_pcb->state = BTA_JV_ST_CL_CLOSING;
break;
case BTA_JV_ST_SR_LISTEN:
p_pcb->state = BTA_JV_ST_SR_CLOSING;
remove_server = TRUE;
- APPL_TRACE_DEBUG2("bta_jv_free_sr_rfc_cb: state: BTA_JV_ST_SR_LISTEN, scn:%d,"
- " user_data:%d", p_cb->scn, (int)p_pcb->user_data);
+ APPL_TRACE_DEBUG("bta_jv_free_sr_rfc_cb: state: BTA_JV_ST_SR_LISTEN, scn:%d,"
+ " user_data:%p", p_cb->scn, p_pcb->user_data);
break;
case BTA_JV_ST_SR_OPEN:
p_pcb->state = BTA_JV_ST_SR_CLOSING;
- APPL_TRACE_DEBUG2("bta_jv_free_sr_rfc_cb: state: BTA_JV_ST_SR_OPEN, scn:%d,"
- " user_data:%d", p_cb->scn, (int)p_pcb->user_data);
+ APPL_TRACE_DEBUG("bta_jv_free_sr_rfc_cb: state: BTA_JV_ST_SR_OPEN, scn:%d,"
+ " user_data:%p", p_cb->scn, p_pcb->user_data);
break;
default:
- APPL_TRACE_WARNING6("bta_jv_free_sr_rfc_cb():failed, ignore port state:%d, scn:"
- "%d, p_pcb:%p, jv handle: 0x%x, port_handle: %d, user_data:%d",
+ APPL_TRACE_WARNING("bta_jv_free_sr_rfc_cb():failed, ignore port state:%d, scn:"
+ "%d, p_pcb:%p, jv handle: 0x%x, port_handle: %d, user_data:%p",
p_pcb->state, p_cb->scn, p_pcb, p_pcb->handle, p_pcb->port_handle,
- (int)p_pcb->user_data);
+ p_pcb->user_data);
status = BTA_JV_FAILURE;
break;
}
@@ -336,7 +336,7 @@
if (port_status != PORT_SUCCESS)
{
status = BTA_JV_FAILURE;
- APPL_TRACE_WARNING5("bta_jv_free_rfc_cb(jv handle: 0x%x, state %d)::"
+ APPL_TRACE_WARNING("bta_jv_free_rfc_cb(jv handle: 0x%x, state %d)::"
"port_status: %d, port_handle: %d, close_pending: %d:Remove",
p_pcb->handle, p_pcb->state, port_status, p_pcb->port_handle,
close_pending);
@@ -449,7 +449,7 @@
{
tBTA_JV_STATUS status = BTA_JV_FAILURE;
tBTA_JV_PM_CB **p_cb;
- int i;
+ int i, j, bd_counter = 0, appid_counter = 0;
for (i = 0; i < BTA_JV_PM_MAX_NUM; i++)
{
@@ -457,10 +457,31 @@
if ((bta_jv_cb.pm_cb[i].state != BTA_JV_PM_FREE_ST) &&
(jv_handle == bta_jv_cb.pm_cb[i].handle))
{
- APPL_TRACE_API3("bta_jv_free_set_pm_profile_cb(jv_handle: 0x%2x), idx: %d, "
- "app_id: 0x%x", jv_handle, i, bta_jv_cb.pm_cb[i].app_id);
+ for (j = 0; j < BTA_JV_PM_MAX_NUM; j++)
+ {
+ if (bdcmp(bta_jv_cb.pm_cb[j].peer_bd_addr, bta_jv_cb.pm_cb[i].peer_bd_addr) == 0)
+ bd_counter++;
+ if (bta_jv_cb.pm_cb[j].app_id == bta_jv_cb.pm_cb[i].app_id)
+ appid_counter++;
+ }
- bta_jv_clear_pm_cb(&bta_jv_cb.pm_cb[i], TRUE);
+ APPL_TRACE_API("bta_jv_free_set_pm_profile_cb(jv_handle: 0x%2x), idx: %d, "
+ "app_id: 0x%x", jv_handle, i, bta_jv_cb.pm_cb[i].app_id);
+ APPL_TRACE_API("bta_jv_free_set_pm_profile_cb, bd_counter = %d, "
+ "appid_counter = %d", bd_counter, appid_counter);
+ if (bd_counter > 1)
+ {
+ bta_jv_pm_conn_idle(&bta_jv_cb.pm_cb[i]);
+ }
+
+ if (bd_counter <= 1 || (appid_counter <= 1))
+ {
+ bta_jv_clear_pm_cb(&bta_jv_cb.pm_cb[i], TRUE);
+ }
+ else
+ {
+ bta_jv_clear_pm_cb(&bta_jv_cb.pm_cb[i], FALSE);
+ }
if (BTA_JV_RFCOMM_MASK & jv_handle)
{
@@ -473,7 +494,7 @@
if (p_pcb)
{
if (NULL == p_pcb->p_pm_cb)
- APPL_TRACE_WARNING3("bta_jv_free_set_pm_profile_cb(jv_handle:"
+ APPL_TRACE_WARNING("bta_jv_free_set_pm_profile_cb(jv_handle:"
" 0x%x):port_handle: 0x%x, p_pm_cb: %d: no link to "
"pm_cb?", jv_handle, p_pcb->port_handle, i);
p_cb = &p_pcb->p_pm_cb;
@@ -486,7 +507,7 @@
{
tBTA_JV_L2C_CB *p_l2c_cb = &bta_jv_cb.l2c_cb[jv_handle];
if (NULL == p_l2c_cb->p_pm_cb)
- APPL_TRACE_WARNING2("bta_jv_free_set_pm_profile_cb(jv_handle: "
+ APPL_TRACE_WARNING("bta_jv_free_set_pm_profile_cb(jv_handle: "
"0x%x): p_pm_cb: %d: no link to pm_cb?", jv_handle, i);
p_cb = &p_l2c_cb->p_pm_cb;
}
@@ -556,7 +577,7 @@
}
}
}
- APPL_TRACE_API5("bta_jv_alloc_set_pm_profile_cb(handle 0x%2x, app_id %d): "
+ APPL_TRACE_API("bta_jv_alloc_set_pm_profile_cb(handle 0x%2x, app_id %d): "
"idx: %d, (BTA_JV_PM_MAX_NUM: %d), pp_cb: 0x%x", jv_handle, app_id,
i, BTA_JV_PM_MAX_NUM, pp_cb);
break;
@@ -572,7 +593,7 @@
bta_jv_cb.pm_cb[i].state = BTA_JV_PM_IDLE_ST;
return &bta_jv_cb.pm_cb[i];
}
- APPL_TRACE_WARNING2("bta_jv_alloc_set_pm_profile_cb(jv_handle: 0x%x, app_id: %d) "
+ APPL_TRACE_WARNING("bta_jv_alloc_set_pm_profile_cb(jv_handle: 0x%x, app_id: %d) "
"return NULL", jv_handle, app_id);
return (tBTA_JV_PM_CB *)NULL;
}
@@ -736,7 +757,7 @@
{
UNUSED(p_data);
- APPL_TRACE_ERROR0("bta_jv_disable not used");
+ APPL_TRACE_ERROR("bta_jv_disable not used");
#if 0
int i;
@@ -746,7 +767,7 @@
{
if(bta_jv_cb.sdp_handle[i])
{
- APPL_TRACE_DEBUG1( "delete SDP record: %d", bta_jv_cb.sdp_handle[i]);
+ APPL_TRACE_DEBUG( "delete SDP record: %d", bta_jv_cb.sdp_handle[i]);
SDP_DeleteRecord(bta_jv_cb.sdp_handle[i]);
bta_jv_cb.sdp_handle[i] = 0;
}
@@ -757,7 +778,7 @@
{
if(bta_jv_cb.scn[i])
{
- APPL_TRACE_DEBUG1( "free scn: %d", (i+1));
+ APPL_TRACE_DEBUG( "free scn: %d", (i+1));
BTM_FreeSCN((UINT8)(i+1));
bta_jv_cb.scn[i] = FALSE;
}
@@ -865,7 +886,7 @@
{
BTM_ReadRemoteDeviceName(p_data->get_rmt_name.bd_addr,
- (tBTM_CMPL_CB *)bta_jv_get_remote_device_name_cback);
+ (tBTM_CMPL_CB *)bta_jv_get_remote_device_name_cback, BT_TRANSPORT_BR_EDR);
}
/*******************************************************************************
@@ -882,11 +903,16 @@
tBTA_UTL_COD cod;
/* set class of device */
- /* BTA_JvSetServiceClass(UINT32 service) assumes that the service class passed to the API function as defined in the assigned number page.
- For example: the object transfer bit is bit 20 of the 24-bit Class of device; the value of this bit is 0x00100000 (value 1)
- Our btm_api.h defines this bit as #define BTM_COD_SERVICE_OBJ_TRANSFER 0x1000 // (value 2)
- This reflects that the service class defined at btm is UINT16, which starts at bit 8 of the 24 bit Class of Device
- The following statement converts from (value 1) into (value 2) */
+ /*
+ BTA_JvSetServiceClass(UINT32 service) assumes that the service class passed to the
+ API function as defined in the assigned number page.
+ For example: the object transfer bit is bit 20 of the 24-bit Class of device;
+ the value of this bit is 0x00100000 (value 1)
+ Our btm_api.h defines this bit as #define BTM_COD_SERVICE_OBJ_TRANSFER 0x1000 (value 2)
+ This reflects that the service class defined at btm is UINT16,
+ which starts at bit 8 of the 24 bit Class of Device
+ The following statement converts from (value 1) into (value 2)
+ */
cod.service = (p_data->set_service.service >> 8);
utl_set_device_class(&cod, BTA_UTL_SET_COD_SERVICE_CLASS);
}
@@ -900,9 +926,11 @@
** Returns void
**
*******************************************************************************/
-static void bta_jv_sec_cback (BD_ADDR bd_addr, void *p_ref_data, tBTM_STATUS result)
+static void bta_jv_sec_cback (BD_ADDR bd_addr, tBTA_TRANSPORT transport,
+ void *p_ref_data, tBTM_STATUS result)
{
UNUSED(p_ref_data);
+ UNUSED(transport);
tBTA_JV_SET_ENCRYPTION set_enc;
if(bta_jv_cb.p_dm_cback)
@@ -926,7 +954,7 @@
*******************************************************************************/
void bta_jv_set_encryption(tBTA_JV_MSG *p_data)
{
- BTM_SetEncryption(p_data->set_encrypt.bd_addr, bta_jv_sec_cback, NULL);
+ BTM_SetEncryption(p_data->set_encrypt.bd_addr, BTA_TRANSPORT_BR_EDR, bta_jv_sec_cback, NULL);
}
/*******************************************************************************
@@ -977,7 +1005,7 @@
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB };
logu("in, uuid:", u->uu.uuid128);
- APPL_TRACE_DEBUG1("uuid len:%d", u->len);
+ APPL_TRACE_DEBUG("uuid len:%d", u->len);
if(u->len == 16)
{
if(memcmp(&u->uu.uuid128[4], &bt_base_uuid[4], 12) == 0)
@@ -990,7 +1018,7 @@
uint16_t u16;
memcpy(&u16, &u->uu.uuid128[2], sizeof(u16));
su.uu.uuid16 = ntohs(u16);
- APPL_TRACE_DEBUG1("shorten to 16 bits uuid: %x", su.uu.uuid16);
+ APPL_TRACE_DEBUG("shorten to 16 bits uuid: %x", su.uu.uuid16);
}
else
{
@@ -998,12 +1026,12 @@
uint32_t u32;
memcpy(&u32, &u->uu.uuid128[0], sizeof(u32));
su.uu.uuid32 = ntohl(u32);
- APPL_TRACE_DEBUG1("shorten to 32 bits uuid: %x", su.uu.uuid32);
+ APPL_TRACE_DEBUG("shorten to 32 bits uuid: %x", su.uu.uuid32);
}
return su;
}
}
- APPL_TRACE_DEBUG0("cannot shorten none-reserved 128 bits uuid");
+ APPL_TRACE_DEBUG("cannot shorten none-reserved 128 bits uuid");
return *u;
}
@@ -1021,14 +1049,14 @@
tBTA_JV_STATUS status;
UINT8 old_sdp_act = bta_jv_cb.sdp_active;
- APPL_TRACE_DEBUG1("bta_jv_start_discovery_cback res: 0x%x", result);
+ APPL_TRACE_DEBUG("bta_jv_start_discovery_cback res: 0x%x", result);
bta_jv_cb.sdp_active = BTA_JV_SDP_ACT_NONE;
if(bta_jv_cb.p_dm_cback)
{
if (old_sdp_act == BTA_JV_SDP_ACT_CANCEL)
{
- APPL_TRACE_DEBUG0("BTA_JV_SDP_ACT_CANCEL");
+ APPL_TRACE_DEBUG("BTA_JV_SDP_ACT_CANCEL");
status = BTA_JV_SUCCESS;
bta_jv_cb.p_dm_cback(BTA_JV_CANCEL_DISCVRY_EVT, (tBTA_JV *)&status, user_data);
}
@@ -1045,7 +1073,7 @@
tBT_UUID su = shorten_sdp_uuid(&bta_jv_cb.uuid);
logu("shorten uuid:", su.uu.uuid128);
p_sdp_rec = SDP_FindServiceUUIDInDb(p_bta_jv_cfg->p_sdp_db, &su, p_sdp_rec);
- APPL_TRACE_DEBUG1("p_sdp_rec:%p", p_sdp_rec);
+ APPL_TRACE_DEBUG("p_sdp_rec:%p", p_sdp_rec);
if(p_sdp_rec && SDP_FindProtocolListElemInRec(p_sdp_rec, UUID_PROTOCOL_RFCOMM, &pe))
{
dcomp.scn = (UINT8) pe.params[0];
@@ -1073,7 +1101,7 @@
void bta_jv_start_discovery(tBTA_JV_MSG *p_data)
{
tBTA_JV_STATUS status = BTA_JV_FAILURE;
- APPL_TRACE_DEBUG1("bta_jv_start_discovery in, sdp_active:%d", bta_jv_cb.sdp_active);
+ APPL_TRACE_DEBUG("bta_jv_start_discovery in, sdp_active:%d", bta_jv_cb.sdp_active);
if (bta_jv_cb.sdp_active != BTA_JV_SDP_ACT_NONE)
{
/* SDP is still in progress */
@@ -1091,7 +1119,7 @@
}
*/
/* init the database/set up the filter */
- APPL_TRACE_DEBUG1("call SDP_InitDiscoveryDb, p_data->start_discovery.num_uuid:%d",
+ APPL_TRACE_DEBUG("call SDP_InitDiscoveryDb, p_data->start_discovery.num_uuid:%d",
p_data->start_discovery.num_uuid);
SDP_InitDiscoveryDb (p_bta_jv_cfg->p_sdp_db, p_bta_jv_cfg->sdp_db_size,
p_data->start_discovery.num_uuid, p_data->start_discovery.uuid_list, 0, NULL);
@@ -1240,7 +1268,7 @@
bta_jv_cb.sel_len = len;
serv_sel.service_len = len;
bdcpy(serv_sel.bd_addr, p_rec->remote_bd_addr);
- APPL_TRACE_DEBUG1( "bta_jv_service_select found uuid: 0x%x",
+ APPL_TRACE_DEBUG( "bta_jv_service_select found uuid: 0x%x",
p_data->service_select.uuid);
break;
}
@@ -1258,7 +1286,7 @@
p_tmp = p_tmp->p_next_rec;
} /* end of while */
}
- APPL_TRACE_DEBUG1( "service_len: %d", serv_sel.service_len);
+ APPL_TRACE_DEBUG( "service_len: %d", serv_sel.service_len);
if(bta_jv_cb.p_dm_cback)
bta_jv_cb.p_dm_cback(BTA_JV_SERVICE_SEL_EVT, (tBTA_JV *)&serv_sel);
#endif
@@ -1378,7 +1406,7 @@
ptr = aa->p_value;
type = *ptr;
next_ptr = sdpu_get_len_from_type(ptr + 1, *ptr, &len);
- APPL_TRACE_DEBUG3( "bta_jv_add_attribute: ptr chg:%d len:%d, size:%d",
+ APPL_TRACE_DEBUG( "bta_jv_add_attribute: ptr chg:%d len:%d, size:%d",
(next_ptr - ptr), len, aa->value_size);
if(ATTR_ID_SERVICE_RECORD_HDL != aa->attr_id && /* do not allow the SDP record handle to be updated */
((INT32)(next_ptr - ptr + len) == aa->value_size) && /* double check data size */
@@ -1447,65 +1475,6 @@
}
}
-/*******************************************************************************
-**
-** Function bta_jv_l2cap_client_cback
-**
-** Description handles the l2cap client events
-**
-** Returns void
-**
-*******************************************************************************/
-static void bta_jv_l2cap_client_cback(UINT16 gap_handle, UINT16 event)
-{
- UNUSED(gap_handle);
- UNUSED(event);
-#if 0
- tBTA_JV_L2C_CB *p_cb = &bta_jv_cb.l2c_cb[gap_handle];
- tBTA_JV evt_data;
-
- if(gap_handle >= BTA_JV_MAX_L2C_CONN && !p_cb->p_cback)
- return;
-
- APPL_TRACE_DEBUG2( "bta_jv_l2cap_client_cback: %d evt:x%x",
- gap_handle, event);
- evt_data.l2c_open.status = BTA_JV_SUCCESS;
- evt_data.l2c_open.handle = gap_handle;
- switch (event)
- {
- case GAP_EVT_CONN_OPENED:
- bdcpy(evt_data.l2c_open.rem_bda, GAP_ConnGetRemoteAddr(gap_handle));
- evt_data.l2c_open.tx_mtu = GAP_ConnGetRemMtuSize(gap_handle);
- p_cb->state = BTA_JV_ST_CL_OPEN;
- p_cb->p_cback(BTA_JV_L2CAP_OPEN_EVT, &evt_data);
- break;
-
- case GAP_EVT_CONN_CLOSED:
- p_cb->state = BTA_JV_ST_NONE;
- bta_jv_free_sec_id(&p_cb->sec_id);
- evt_data.l2c_close.async = TRUE;
- p_cb->p_cback(BTA_JV_L2CAP_CLOSE_EVT, &evt_data);
- p_cb->p_cback = NULL;
- break;
-
- case GAP_EVT_CONN_DATA_AVAIL:
- evt_data.handle = gap_handle;
- p_cb->p_cback(BTA_JV_L2CAP_DATA_IND_EVT, &evt_data);
- break;
-
- case GAP_EVT_CONN_CONGESTED:
- case GAP_EVT_CONN_UNCONGESTED:
- p_cb->cong = (event == GAP_EVT_CONN_CONGESTED) ? TRUE : FALSE;
- evt_data.l2c_cong.cong = p_cb->cong;
- p_cb->p_cback(BTA_JV_L2CAP_CONG_EVT, &evt_data);
- break;
-
- default:
- break;
- }
-#endif
-}
-
#if SDP_FOR_JV_INCLUDED == TRUE
/*******************************************************************************
**
@@ -1521,7 +1490,7 @@
tBTA_JV evt_data;
tBTA_JV_L2C_CB *p_cb = &bta_jv_cb.l2c_cb[BTA_JV_L2C_FOR_SDP_HDL];
- APPL_TRACE_DEBUG2( "bta_jv_sdp_res_cback: %d evt:x%x",
+ APPL_TRACE_DEBUG( "bta_jv_sdp_res_cback: %d evt:x%x",
bta_jv_cb.sdp_for_jv, event);
if(!bta_jv_cb.sdp_for_jv)
@@ -1541,7 +1510,7 @@
case SDP_EVT_DATA_IND:
evt_data.handle = BTA_JV_L2C_FOR_SDP_HDL;
memcpy(p_bta_jv_cfg->p_sdp_raw_data, p_data->data.p_data, p_data->data.data_len);
- APPL_TRACE_DEBUG2( "data size: %d/%d ", bta_jv_cb.sdp_data_size, p_data->data.data_len);
+ APPL_TRACE_DEBUG( "data size: %d/%d ", bta_jv_cb.sdp_data_size, p_data->data.data_len);
bta_jv_cb.sdp_data_size = p_data->data.data_len;
p_cb->p_cback(BTA_JV_L2CAP_DATA_IND_EVT, &evt_data);
break;
@@ -1561,7 +1530,7 @@
{
tBTA_JV_L2CAP_CLOSE close;
tBTA_JV_L2C_CB *p_cb = &bta_jv_cb.l2c_cb[BTA_JV_L2C_FOR_SDP_HDL];
- APPL_TRACE_DEBUG1( "bta_jv_sdp_cback: result:x%x", result);
+ APPL_TRACE_DEBUG( "bta_jv_sdp_cback: result:x%x", result);
if(p_cb->p_cback)
{
@@ -1678,68 +1647,7 @@
if (p_cback)
p_cback(BTA_JV_L2CAP_CLOSE_EVT, (tBTA_JV *)&evt_data);
else
- APPL_TRACE_ERROR0("### NO CALLBACK SET !!! ###");
-#endif
-}
-
-/*******************************************************************************
-**
-** Function bta_jv_l2cap_server_cback
-**
-** Description handles the l2cap server callback
-**
-** Returns void
-**
-*******************************************************************************/
-static void bta_jv_l2cap_server_cback(UINT16 gap_handle, UINT16 event)
-{
- UNUSED(gap_handle);
- UNUSED(event);
-#if 0
- tBTA_JV_L2C_CB *p_cb = &bta_jv_cb.l2c_cb[gap_handle];
- tBTA_JV evt_data;
- tBTA_JV_L2CAP_CBACK *p_cback;
-
- if(gap_handle >= BTA_JV_MAX_L2C_CONN && !p_cb->p_cback)
- return;
-
- APPL_TRACE_DEBUG2( "bta_jv_l2cap_server_cback: %d evt:x%x",
- gap_handle, event);
- evt_data.l2c_open.status = BTA_JV_SUCCESS;
- evt_data.l2c_open.handle = gap_handle;
-
- switch (event)
- {
- case GAP_EVT_CONN_OPENED:
- bdcpy(evt_data.l2c_open.rem_bda, GAP_ConnGetRemoteAddr(gap_handle));
- evt_data.l2c_open.tx_mtu = GAP_ConnGetRemMtuSize(gap_handle);
- p_cb->state = BTA_JV_ST_SR_OPEN;
- p_cb->p_cback(BTA_JV_L2CAP_OPEN_EVT, &evt_data);
- break;
-
- case GAP_EVT_CONN_CLOSED:
- evt_data.l2c_close.async = TRUE;
- evt_data.l2c_close.handle = p_cb->handle;
- p_cback = p_cb->p_cback;
- evt_data.l2c_close.status = bta_jv_free_l2c_cb(p_cb);
- p_cback(BTA_JV_L2CAP_CLOSE_EVT, &evt_data);
- break;
-
- case GAP_EVT_CONN_DATA_AVAIL:
- evt_data.handle = gap_handle;
- p_cb->p_cback(BTA_JV_L2CAP_DATA_IND_EVT, &evt_data);
- break;
-
- case GAP_EVT_CONN_CONGESTED:
- case GAP_EVT_CONN_UNCONGESTED:
- p_cb->cong = (event == GAP_EVT_CONN_CONGESTED) ? TRUE : FALSE;
- evt_data.l2c_cong.cong = p_cb->cong;
- p_cb->p_cback(BTA_JV_L2CAP_CONG_EVT, &evt_data);
- break;
-
- default:
- break;
- }
+ APPL_TRACE_ERROR("### NO CALLBACK SET !!! ###");
#endif
}
@@ -1964,7 +1872,7 @@
tBTA_JV_RFC_CB *p_cb = bta_jv_rfc_port_to_cb(port_handle);
tBTA_JV_PCB *p_pcb = bta_jv_rfc_port_to_pcb(port_handle);
int ret = 0;
- APPL_TRACE_DEBUG4("bta_jv_port_data_co_cback, p_cb:%p, p_pcb:%p, len:%d, type:%d",
+ APPL_TRACE_DEBUG("bta_jv_port_data_co_cback, p_cb:%p, p_pcb:%p, len:%d, type:%d",
p_cb, p_pcb, len, type);
if (p_pcb != NULL)
{
@@ -1980,7 +1888,7 @@
case DATA_CO_CALLBACK_TYPE_OUTGOING:
return bta_co_rfc_data_outgoing(p_pcb->user_data, buf, len);
default:
- APPL_TRACE_ERROR1("unknown callout type:%d", type);
+ APPL_TRACE_ERROR("unknown callout type:%d", type);
break;
}
}
@@ -2006,11 +1914,11 @@
UINT16 lcid;
tBTA_JV_RFCOMM_CBACK *p_cback; /* the callback function */
- APPL_TRACE_DEBUG2( "bta_jv_port_mgmt_cl_cback:code:%d, port_handle%d", code, port_handle);
+ APPL_TRACE_DEBUG( "bta_jv_port_mgmt_cl_cback:code:%d, port_handle%d", code, port_handle);
if(NULL == p_cb || NULL == p_cb->p_cback)
return;
- APPL_TRACE_DEBUG3( "bta_jv_port_mgmt_cl_cback code=%d port_handle:%d handle:%d",
+ APPL_TRACE_DEBUG( "bta_jv_port_mgmt_cl_cback code=%d port_handle:%d handle:%d",
code, port_handle, p_cb->handle);
PORT_CheckConnection(port_handle, rem_bda, &lcid);
@@ -2057,11 +1965,11 @@
tBTA_JV_PCB *p_pcb = bta_jv_rfc_port_to_pcb(port_handle);
tBTA_JV evt_data;
- APPL_TRACE_DEBUG1( "bta_jv_port_event_cl_cback:%d", port_handle);
+ APPL_TRACE_DEBUG( "bta_jv_port_event_cl_cback:%d", port_handle);
if(NULL == p_cb || NULL == p_cb->p_cback)
return;
- APPL_TRACE_DEBUG3( "bta_jv_port_event_cl_cback code=x%x port_handle:%d handle:%d",
+ APPL_TRACE_DEBUG( "bta_jv_port_event_cl_cback code=x%x port_handle:%d handle:%d",
code, port_handle, p_cb->handle);
if (code & PORT_EV_RXCHAR)
{
@@ -2116,14 +2024,14 @@
BTM_SEC_PROTO_RFCOMM, cc->remote_scn) == FALSE)
{
evt_data.status = BTA_JV_FAILURE;
- APPL_TRACE_ERROR2("sec_id:%d is zero or BTM_SetSecurityLevel failed, remote_scn:%d", sec_id, cc->remote_scn);
+ APPL_TRACE_ERROR("sec_id:%d is zero or BTM_SetSecurityLevel failed, remote_scn:%d", sec_id, cc->remote_scn);
}
if (evt_data.status == BTA_JV_SUCCESS &&
RFCOMM_CreateConnection(UUID_SERVCLASS_SERIAL_PORT, cc->remote_scn, FALSE,
BTA_JV_DEF_RFC_MTU, cc->peer_bd_addr, &handle, bta_jv_port_mgmt_cl_cback) != PORT_SUCCESS)
{
- APPL_TRACE_ERROR0("bta_jv_rfcomm_connect, RFCOMM_CreateConnection failed");
+ APPL_TRACE_ERROR("bta_jv_rfcomm_connect, RFCOMM_CreateConnection failed");
evt_data.status = BTA_JV_FAILURE;
}
if (evt_data.status == BTA_JV_SUCCESS)
@@ -2155,7 +2063,7 @@
else
{
evt_data.status = BTA_JV_FAILURE;
- APPL_TRACE_ERROR0("run out of rfc control block");
+ APPL_TRACE_ERROR("run out of rfc control block");
}
}
cc->p_cback(BTA_JV_RFCOMM_CL_INIT_EVT, (tBTA_JV *)&evt_data, cc->user_data);
@@ -2181,13 +2089,13 @@
{
*pcb = &bta_jv_cb.port_cb[i];
*cb = &bta_jv_cb.rfc_cb[rfc_handle - 1];
- APPL_TRACE_DEBUG4("find_rfc_pcb(): FOUND rfc_cb_handle 0x%x, port.jv_handle:"
+ APPL_TRACE_DEBUG("find_rfc_pcb(): FOUND rfc_cb_handle 0x%x, port.jv_handle:"
" 0x%x, state: %d, rfc_cb->handle: 0x%x", rfc_handle, (*pcb)->handle,
(*pcb)->state, (*cb)->handle);
return 1;
}
}
- APPL_TRACE_DEBUG1("find_rfc_pcb: cannot find rfc_cb from user data:%d", (UINT32)user_data);
+ APPL_TRACE_DEBUG("find_rfc_pcb: cannot find rfc_cb from user data:%d", (UINT32)user_data);
return 0;
}
@@ -2205,10 +2113,10 @@
tBTA_JV_API_RFCOMM_CLOSE *cc = &(p_data->rfcomm_close);
tBTA_JV_RFC_CB *p_cb = NULL;
tBTA_JV_PCB *p_pcb = NULL;
- APPL_TRACE_DEBUG1("bta_jv_rfcomm_close, rfc handle:%d", cc->handle);
+ APPL_TRACE_DEBUG("bta_jv_rfcomm_close, rfc handle:%d", cc->handle);
if (!cc->handle)
{
- APPL_TRACE_ERROR0("bta_jv_rfcomm_close, rfc handle is null");
+ APPL_TRACE_ERROR("bta_jv_rfcomm_close, rfc handle is null");
return;
}
@@ -2216,45 +2124,12 @@
if (!find_rfc_pcb(user_data, &p_cb, &p_pcb))
return;
bta_jv_free_rfc_cb(p_cb, p_pcb);
- APPL_TRACE_DEBUG2("bta_jv_rfcomm_close: sec id in use:%d, rfc_cb in use:%d",
+ APPL_TRACE_DEBUG("bta_jv_rfcomm_close: sec id in use:%d, rfc_cb in use:%d",
get_sec_id_used(), get_rfc_cb_used());
}
/*******************************************************************************
**
-** Function bta_jv_get_num_rfc_listen
-**
-** Description when a RFCOMM connection goes down, make sure that there's only
-** one port stays listening on this scn.
-**
-** Returns
-**
-*******************************************************************************/
-static UINT8 bta_jv_get_num_rfc_listen(tBTA_JV_RFC_CB *p_cb)
-{
- UINT8 i, listen=1;
- tBTA_JV_PCB *p_pcb;
-
- if (p_cb->max_sess > 1)
- {
- listen = 0;
- for (i=0; i<p_cb->max_sess; i++)
- {
- if (p_cb->rfc_hdl[i] != 0)
- {
- p_pcb = &bta_jv_cb.port_cb[p_cb->rfc_hdl[i] - 1];
- if (BTA_JV_ST_SR_LISTEN == p_pcb->state)
- {
- listen++;
- }
- }
- }
- }
- return listen;
-}
-
-/*******************************************************************************
-**
** Function bta_jv_port_mgmt_sr_cback
**
** Description callback for port mamangement function of rfcomm
@@ -2272,15 +2147,15 @@
UINT16 lcid;
UINT8 num;
UINT32 si;
- APPL_TRACE_DEBUG2("bta_jv_port_mgmt_sr_cback, code:%d, port_handle:%d", code, port_handle);
+ APPL_TRACE_DEBUG("bta_jv_port_mgmt_sr_cback, code:%d, port_handle:%d", code, port_handle);
if(NULL == p_cb || NULL == p_cb->p_cback)
{
- APPL_TRACE_ERROR2("bta_jv_port_mgmt_sr_cback, p_cb:%p, p_cb->p_cback%p",
+ APPL_TRACE_ERROR("bta_jv_port_mgmt_sr_cback, p_cb:%p, p_cb->p_cback%p",
p_cb, p_cb ? p_cb->p_cback : NULL);
return;
}
void *user_data = p_pcb->user_data;
- APPL_TRACE_DEBUG5( "bta_jv_port_mgmt_sr_cback code=%d port_handle:0x%x handle:0x%x, p_pcb:%p, user:%d",
+ APPL_TRACE_DEBUG( "bta_jv_port_mgmt_sr_cback code=%d port_handle:0x%x handle:0x%x, p_pcb:%p, user:%d",
code, port_handle, p_cb->handle, p_pcb, p_pcb->user_data);
PORT_CheckConnection(port_handle, rem_bda, &lcid);
@@ -2295,11 +2170,11 @@
{
evt_data.rfc_srv_open.new_listen_handle = p_pcb_new_listen->handle;
p_pcb_new_listen->user_data = p_cb->p_cback(BTA_JV_RFCOMM_SRV_OPEN_EVT, &evt_data, user_data);
- APPL_TRACE_DEBUG2("PORT_SUCCESS: curr_sess:%d, max_sess:%d", p_cb->curr_sess, p_cb->max_sess);
+ APPL_TRACE_DEBUG("PORT_SUCCESS: curr_sess:%d, max_sess:%d", p_cb->curr_sess, p_cb->max_sess);
failed = FALSE;
}
else
- APPL_TRACE_ERROR0("bta_jv_add_rfc_port failed to create new listen port");
+ APPL_TRACE_ERROR("bta_jv_add_rfc_port failed to create new listen port");
}
if (failed)
{
@@ -2310,7 +2185,7 @@
p_pcb->cong = FALSE;
tBTA_JV_RFCOMM_CBACK *p_cback = p_cb->p_cback;
- APPL_TRACE_DEBUG2("PORT_CLOSED before BTA_JV_RFCOMM_CLOSE_EVT: curr_sess:%d, max_sess:%d",
+ APPL_TRACE_DEBUG("PORT_CLOSED before BTA_JV_RFCOMM_CLOSE_EVT: curr_sess:%d, max_sess:%d",
p_cb->curr_sess, p_cb->max_sess);
if(BTA_JV_ST_SR_CLOSING == p_pcb->state)
{
@@ -2321,7 +2196,7 @@
p_cback(BTA_JV_RFCOMM_CLOSE_EVT, &evt_data, user_data);
//bta_jv_free_rfc_cb(p_cb, p_pcb);
- APPL_TRACE_DEBUG2("PORT_CLOSED after BTA_JV_RFCOMM_CLOSE_EVT: curr_sess:%d, max_sess:%d",
+ APPL_TRACE_DEBUG("PORT_CLOSED after BTA_JV_RFCOMM_CLOSE_EVT: curr_sess:%d, max_sess:%d",
p_cb->curr_sess, p_cb->max_sess);
}
}
@@ -2344,7 +2219,7 @@
if(NULL == p_cb || NULL == p_cb->p_cback)
return;
- APPL_TRACE_DEBUG3( "bta_jv_port_event_sr_cback code=x%x port_handle:%d handle:%d",
+ APPL_TRACE_DEBUG( "bta_jv_port_event_sr_cback code=x%x port_handle:%d handle:%d",
code, port_handle, p_cb->handle);
void *user_data = p_pcb->user_data;
@@ -2397,14 +2272,14 @@
listen++;
if(p_pcb_open == p_pcb)
{
- APPL_TRACE_DEBUG1("bta_jv_add_rfc_port, port_handle:%d, change the listen port to open state",
+ APPL_TRACE_DEBUG("bta_jv_add_rfc_port, port_handle:%d, change the listen port to open state",
p_pcb->port_handle);
p_pcb->state = BTA_JV_ST_SR_OPEN;
}
else
{
- APPL_TRACE_ERROR3("bta_jv_add_rfc_port, open pcb not matching listen one,"
+ APPL_TRACE_ERROR("bta_jv_add_rfc_port, open pcb not matching listen one,"
"listen count:%d, listen pcb handle:%d, open pcb:%d",
listen, p_pcb->port_handle, p_pcb_open->handle);
return NULL;
@@ -2418,7 +2293,7 @@
}
}
- APPL_TRACE_DEBUG5("bta_jv_add_rfc_port max_sess=%d used:%d curr_sess:%d, listen:%d si:%d",
+ APPL_TRACE_DEBUG("bta_jv_add_rfc_port max_sess=%d used:%d curr_sess:%d, listen:%d si:%d",
p_cb->max_sess, used, p_cb->curr_sess, listen, si);
if (used < p_cb->max_sess && listen == 1 && si)
{
@@ -2444,14 +2319,14 @@
FALSE-POSITIVE: port_state is initialized at PORT_GetState() */
PORT_SetState(p_pcb->port_handle, &port_state);
p_pcb->handle = BTA_JV_RFC_H_S_TO_HDL(p_cb->handle, si);
- APPL_TRACE_DEBUG2("bta_jv_add_rfc_port: p_pcb->handle:0x%x, curr_sess:%d",
+ APPL_TRACE_DEBUG("bta_jv_add_rfc_port: p_pcb->handle:0x%x, curr_sess:%d",
p_pcb->handle, p_cb->curr_sess);
}
}
else
- APPL_TRACE_ERROR0("bta_jv_add_rfc_port, cannot create new rfc listen port");
+ APPL_TRACE_ERROR("bta_jv_add_rfc_port, cannot create new rfc listen port");
}
- APPL_TRACE_DEBUG2("bta_jv_add_rfc_port: sec id in use:%d, rfc_cb in use:%d",
+ APPL_TRACE_DEBUG("bta_jv_add_rfc_port: sec id in use:%d, rfc_cb in use:%d",
get_sec_id_used(), get_rfc_cb_used());
return p_pcb;
}
@@ -2480,7 +2355,7 @@
L2CA_SetDesireRole(rs->role);
*/
evt_data.status = BTA_JV_FAILURE;
- APPL_TRACE_DEBUG2("bta_jv_rfcomm_start_server: sec id in use:%d, rfc_cb in use:%d",
+ APPL_TRACE_DEBUG("bta_jv_rfcomm_start_server: sec id in use:%d, rfc_cb in use:%d",
get_sec_id_used(), get_rfc_cb_used());
do
@@ -2491,14 +2366,14 @@
BTM_SetSecurityLevel(FALSE, "JV PORT", sec_id, rs->sec_mask,
BT_PSM_RFCOMM, BTM_SEC_PROTO_RFCOMM, rs->local_scn) == FALSE)
{
- APPL_TRACE_ERROR0("bta_jv_rfcomm_start_server, run out of sec_id");
+ APPL_TRACE_ERROR("bta_jv_rfcomm_start_server, run out of sec_id");
break;
}
if (RFCOMM_CreateConnection(sec_id, rs->local_scn, TRUE,
BTA_JV_DEF_RFC_MTU, (UINT8 *) bd_addr_any, &handle, bta_jv_port_mgmt_sr_cback) != PORT_SUCCESS)
{
- APPL_TRACE_ERROR0("bta_jv_rfcomm_start_server, RFCOMM_CreateConnection failed");
+ APPL_TRACE_ERROR("bta_jv_rfcomm_start_server, RFCOMM_CreateConnection failed");
break;
}
@@ -2506,7 +2381,7 @@
p_cb = bta_jv_alloc_rfc_cb(handle, &p_pcb);
if(!p_cb)
{
- APPL_TRACE_ERROR0("bta_jv_rfcomm_start_server, run out of rfc control block");
+ APPL_TRACE_ERROR("bta_jv_rfcomm_start_server, run out of rfc control block");
break;
}
@@ -2561,19 +2436,19 @@
tBTA_JV_API_RFCOMM_SERVER *ls = &(p_data->rfcomm_server);
tBTA_JV_RFC_CB *p_cb = NULL;
tBTA_JV_PCB *p_pcb = NULL;
- APPL_TRACE_ERROR0("bta_jv_rfcomm_stop_server");
+ APPL_TRACE_DEBUG("bta_jv_rfcomm_stop_server");
if(!ls->handle)
{
- APPL_TRACE_ERROR0("bta_jv_rfcomm_stop_server, jv handle is null");
+ APPL_TRACE_ERROR("bta_jv_rfcomm_stop_server, jv handle is null");
return;
}
void* user_data = ls->user_data;
if(!find_rfc_pcb(user_data, &p_cb, &p_pcb))
return;
- APPL_TRACE_DEBUG2("bta_jv_rfcomm_stop_server: p_pcb:%p, p_pcb->port_handle:%d",
+ APPL_TRACE_DEBUG("bta_jv_rfcomm_stop_server: p_pcb:%p, p_pcb->port_handle:%d",
p_pcb, p_pcb->port_handle);
bta_jv_free_rfc_cb(p_cb, p_pcb);
- APPL_TRACE_DEBUG2("bta_jv_rfcomm_stop_server: sec id in use:%d, rfc_cb in use:%d",
+ APPL_TRACE_DEBUG("bta_jv_rfcomm_stop_server: sec id in use:%d, rfc_cb in use:%d",
get_sec_id_used(), get_rfc_cb_used());
}
@@ -2642,7 +2517,7 @@
}
else
{
- APPL_TRACE_ERROR0("bta_jv_rfcomm_write :: WARNING ! No JV callback set");
+ APPL_TRACE_ERROR("bta_jv_rfcomm_write :: WARNING ! No JV callback set");
}
}
@@ -2660,7 +2535,7 @@
tBTA_JV_STATUS status;
tBTA_JV_PM_CB *p_cb;
- APPL_TRACE_API3("bta_jv_set_pm_profile(handle: 0x%x, app_id: %d, init_st: %d)",
+ APPL_TRACE_API("bta_jv_set_pm_profile(handle: 0x%x, app_id: %d, init_st: %d)",
p_data->set_pm.handle, p_data->set_pm.app_id, p_data->set_pm.init_st);
/* clear PM control block */
@@ -2670,7 +2545,7 @@
if (status != BTA_JV_SUCCESS)
{
- APPL_TRACE_WARNING1("bta_jv_set_pm_profile() free pm cb failed: reason %d",
+ APPL_TRACE_WARNING("bta_jv_set_pm_profile() free pm cb failed: reason %d",
status);
}
}
@@ -2682,7 +2557,7 @@
if (NULL != p_cb)
bta_jv_pm_state_change(p_cb, p_data->set_pm.init_st);
else
- APPL_TRACE_WARNING0("bta_jv_alloc_set_pm_profile_cb() failed");
+ APPL_TRACE_WARNING("bta_jv_alloc_set_pm_profile_cb() failed");
}
}
@@ -2726,7 +2601,7 @@
if (NULL == p_cb)
return status;
- APPL_TRACE_API2("bta_jv_set_pm_conn_state(handle:0x%x, state: %d)", p_cb->handle,
+ APPL_TRACE_API("bta_jv_set_pm_conn_state(handle:0x%x, state: %d)", p_cb->handle,
new_st);
if ((p_msg = (tBTA_JV_API_PM_STATE_CHANGE *)GKI_getbuf(
sizeof(tBTA_JV_API_PM_STATE_CHANGE))) != NULL)
@@ -2787,7 +2662,7 @@
*******************************************************************************/
static void bta_jv_pm_state_change(tBTA_JV_PM_CB *p_cb, const tBTA_JV_CONN_STATE state)
{
- APPL_TRACE_API5("bta_jv_pm_state_change(p_cb: 0x%x, handle: 0x%x, busy/idle_state: %d"
+ APPL_TRACE_API("bta_jv_pm_state_change(p_cb: 0x%x, handle: 0x%x, busy/idle_state: %d"
", app_id: %d, conn_state: %d)", p_cb, p_cb->handle, p_cb->state,
p_cb->app_id, state);
@@ -2828,7 +2703,7 @@
break;
default:
- APPL_TRACE_WARNING1("bta_jv_pm_state_change(state: %d): Invalid state", state);
+ APPL_TRACE_WARNING("bta_jv_pm_state_change(state: %d): Invalid state", state);
break;
}
}
diff --git a/bta/jv/bta_jv_api.c b/bta/jv/bta_jv_api.c
index 16ab2d5..e0d100d 100644
--- a/bta/jv/bta_jv_api.c
+++ b/bta/jv/bta_jv_api.c
@@ -63,7 +63,7 @@
tBTA_JV_API_ENABLE *p_buf;
int i;
- APPL_TRACE_API0( "BTA_JvEnable");
+ APPL_TRACE_API( "BTA_JvEnable");
if(p_cback && FALSE == bta_sys_is_register(BTA_ID_JV))
{
memset(&bta_jv_cb, 0, sizeof(tBTA_JV_CB));
@@ -74,9 +74,7 @@
}
/* register with BTA system manager */
- GKI_sched_lock();
bta_sys_register(BTA_ID_JV, &bta_jv_reg);
- GKI_sched_unlock();
if (p_cback && (p_buf = (tBTA_JV_API_ENABLE *) GKI_getbuf(sizeof(tBTA_JV_API_ENABLE))) != NULL)
{
@@ -88,7 +86,7 @@
}
else
{
- APPL_TRACE_ERROR0("JVenable fails");
+ APPL_TRACE_ERROR("JVenable fails");
}
return(status);
}
@@ -106,7 +104,7 @@
{
BT_HDR *p_buf;
- APPL_TRACE_API0( "BTA_JvDisable");
+ APPL_TRACE_API( "BTA_JvDisable");
bta_sys_deregister(BTA_ID_JV);
if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
{
@@ -149,7 +147,7 @@
tBTA_JV_STATUS status = BTA_JV_FAILURE;
tBTA_JV_API_SET_DISCOVERABILITY *p_msg;
- APPL_TRACE_API0( "BTA_JvSetDiscoverability");
+ APPL_TRACE_API( "BTA_JvSetDiscoverability");
if ((p_msg = (tBTA_JV_API_SET_DISCOVERABILITY *)GKI_getbuf(sizeof(tBTA_JV_MSG))) != NULL)
{
p_msg->hdr.event = BTA_JV_API_SET_DISCOVERABILITY_EVT;
@@ -173,7 +171,7 @@
*******************************************************************************/
tBTA_JV_DISC BTA_JvGetDiscoverability(void)
{
- APPL_TRACE_API0( "BTA_JvGetDiscoverability");
+ APPL_TRACE_API( "BTA_JvGetDiscoverability");
return BTM_ReadDiscoverability(0, 0);
}
@@ -194,7 +192,7 @@
tBTA_JV_STATUS ret = BTA_JV_FAILURE;
BT_HDR *p_msg;
- APPL_TRACE_API0( "BTA_JvGetLocalDeviceAddr");
+ APPL_TRACE_API( "BTA_JvGetLocalDeviceAddr");
if ((p_msg = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR))) != NULL)
{
p_msg->event = BTA_JV_API_GET_LOCAL_DEVICE_ADDR_EVT;
@@ -222,7 +220,7 @@
tBTA_JV_STATUS ret = BTA_JV_FAILURE;
BT_HDR *p_msg;
- APPL_TRACE_API0( "BTA_JvGetLocalDeviceName");
+ APPL_TRACE_API( "BTA_JvGetLocalDeviceName");
if ((p_msg = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR))) != NULL)
{
p_msg->event = BTA_JV_API_GET_LOCAL_DEVICE_NAME_EVT;
@@ -250,7 +248,7 @@
tBTA_JV_STATUS ret = BTA_JV_FAILURE;
tBTA_JV_API_GET_REMOTE_NAME *p_msg;
- APPL_TRACE_API0( "BTA_JvGetRemoteDeviceName");
+ APPL_TRACE_API( "BTA_JvGetRemoteDeviceName");
if ((p_msg = (tBTA_JV_API_GET_REMOTE_NAME *)GKI_getbuf(sizeof(tBTA_JV_API_GET_REMOTE_NAME))) != NULL)
{
p_msg->hdr.event = BTA_JV_API_GET_REMOTE_DEVICE_NAME_EVT;
@@ -281,7 +279,7 @@
UINT32 count = 0;
INT32 ret = BTA_JV_INTERNAL_ERR;
- APPL_TRACE_API0( "BTA_JvGetPreknownDevice");
+ APPL_TRACE_API( "BTA_JvGetPreknownDevice");
p_info = BTM_InqFirstResult();
if(p_info)
{
@@ -348,7 +346,7 @@
*******************************************************************************/
UINT8 * BTA_JvGetDeviceClass(void)
{
- APPL_TRACE_API0( "BTA_JvGetDeviceClass");
+ APPL_TRACE_API( "BTA_JvGetDeviceClass");
return BTM_ReadDeviceClass();
}
@@ -367,7 +365,7 @@
tBTA_JV_STATUS status = BTA_JV_FAILURE;
tBTA_JV_API_SET_SERVICE_CLASS *p_msg;
- APPL_TRACE_API0( "BTA_JvSetServiceClass");
+ APPL_TRACE_API( "BTA_JvSetServiceClass");
if ((p_msg = (tBTA_JV_API_SET_SERVICE_CLASS *)GKI_getbuf(sizeof(tBTA_JV_API_SET_SERVICE_CLASS))) != NULL)
{
p_msg->hdr.event = BTA_JV_API_SET_SERVICE_CLASS_EVT;
@@ -397,7 +395,7 @@
tBTA_JV_STATUS ret = BTA_JV_FAILURE;
tBTA_JV_API_SET_ENCRYPTION *p_msg;
- APPL_TRACE_API0( "BTA_JvSetEncryption");
+ APPL_TRACE_API( "BTA_JvSetEncryption");
if ((p_msg = (tBTA_JV_API_SET_ENCRYPTION *)GKI_getbuf(sizeof(tBTA_JV_API_SET_ENCRYPTION))) != NULL)
{
p_msg->hdr.event = BTA_JV_API_SET_ENCRYPTION_EVT;
@@ -495,11 +493,13 @@
BOOLEAN BTA_JvIsEncrypted(BD_ADDR bd_addr)
{
BOOLEAN is_encrypted = FALSE;
- UINT8 sec_flags;
+ UINT8 sec_flags, le_flags;
- if(BTM_GetSecurityFlags(bd_addr, &sec_flags))
+ if (BTM_GetSecurityFlags(bd_addr, &sec_flags) &&
+ BTM_GetSecurityFlagsByTransport(bd_addr, &le_flags, BT_TRANSPORT_LE))
{
- if(sec_flags&BTM_SEC_FLAG_ENCRYPTED)
+ if(sec_flags & BTM_SEC_FLAG_ENCRYPTED ||
+ le_flags & BTM_SEC_FLAG_ENCRYPTED)
is_encrypted = TRUE;
}
return is_encrypted;
@@ -541,7 +541,7 @@
tBTA_JV_STATUS status = BTA_JV_FAILURE;
BT_HDR *p_msg;
- APPL_TRACE_API0( "BTA_JvGetSCN");
+ APPL_TRACE_API( "BTA_JvGetSCN");
if ((p_msg = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR))) != NULL)
{
p_msg->event = BTA_JV_API_GET_SCN_EVT;
@@ -568,7 +568,7 @@
tBTA_JV_STATUS status = BTA_JV_FAILURE;
tBTA_JV_API_FREE_SCN *p_msg;
- APPL_TRACE_API0( "BTA_JvFreeSCN");
+ APPL_TRACE_API( "BTA_JvFreeSCN");
if ((p_msg = (tBTA_JV_API_FREE_SCN *)GKI_getbuf(sizeof(tBTA_JV_API_FREE_SCN))) != NULL)
{
p_msg->hdr.event = BTA_JV_API_FREE_SCN_EVT;
@@ -595,7 +595,7 @@
UINT16 BTA_JvGetPSM(void)
{
#if 0
- APPL_TRACE_API0( "BTA_JvGetPSM");
+ APPL_TRACE_API( "BTA_JvGetPSM");
return (L2CA_AllocatePSM());
#endif
@@ -622,7 +622,7 @@
tBTA_JV_STATUS status = BTA_JV_FAILURE;
tBTA_JV_API_START_DISCOVERY *p_msg;
- APPL_TRACE_API0( "BTA_JvStartDiscovery");
+ APPL_TRACE_API( "BTA_JvStartDiscovery");
if ((p_msg = (tBTA_JV_API_START_DISCOVERY *)GKI_getbuf(sizeof(tBTA_JV_API_START_DISCOVERY))) != NULL)
{
p_msg->hdr.event = BTA_JV_API_START_DISCOVERY_EVT;
@@ -656,7 +656,7 @@
tBTA_JV_STATUS status = BTA_JV_FAILURE;
tBTA_JV_API_CANCEL_DISCOVERY *p_msg;
- APPL_TRACE_API0( "BTA_JvCancelDiscovery");
+ APPL_TRACE_API( "BTA_JvCancelDiscovery");
if ((p_msg = (tBTA_JV_API_CANCEL_DISCOVERY *)GKI_getbuf(sizeof(tBTA_JV_API_CANCEL_DISCOVERY))) != NULL)
{
p_msg->hdr.event = BTA_JV_API_CANCEL_DISCOVERY_EVT;
@@ -687,7 +687,7 @@
tBTA_JV_STATUS status = BTA_JV_FAILURE;
tBTA_JV_API_GET_SERVICES_LENGTH *p_msg;
- APPL_TRACE_API0( "BTA_JvGetServicesLength");
+ APPL_TRACE_API( "BTA_JvGetServicesLength");
if ((p_msg = (tBTA_JV_API_GET_SERVICES_LENGTH *)GKI_getbuf(sizeof(tBTA_JV_API_GET_SERVICES_LENGTH))) != NULL)
{
p_msg->hdr.event = BTA_JV_API_GET_SERVICES_LENGTH_EVT;
@@ -724,7 +724,7 @@
UINT32 len;
UINT32 hdr_len;
- APPL_TRACE_API0( "BTA_JvGetServicesResult");
+ APPL_TRACE_API( "BTA_JvGetServicesResult");
if(p_bta_jv_cfg->p_sdp_db->p_first_rec)
{
/* the database is valid */
@@ -781,7 +781,7 @@
tBTA_JV_STATUS status = BTA_JV_FAILURE;
tBTA_JV_API_SERVICE_SELECT *p_msg;
- APPL_TRACE_API0( "BTA_JvServiceSelect");
+ APPL_TRACE_API( "BTA_JvServiceSelect");
if ((p_msg = (tBTA_JV_API_SERVICE_SELECT *)GKI_getbuf(sizeof(tBTA_JV_API_SERVICE_SELECT))) != NULL)
{
p_msg->hdr.event = BTA_JV_API_SERVICE_SELECT_EVT;
@@ -808,7 +808,7 @@
{
INT32 serv_sel = -1;
- APPL_TRACE_API0( "BTA_JvServiceResult");
+ APPL_TRACE_API( "BTA_JvServiceResult");
if(bta_jv_cb.p_sel_raw_data)
{
serv_sel = bta_jv_cb.sel_len;
@@ -836,7 +836,7 @@
tBTA_JV_STATUS status = BTA_JV_FAILURE;
tBTA_JV_API_CREATE_RECORD *p_msg;
- APPL_TRACE_API0( "BTA_JvCreateRecordByUser");
+ APPL_TRACE_API( "BTA_JvCreateRecordByUser");
if ((p_msg = (tBTA_JV_API_CREATE_RECORD *)GKI_getbuf(sizeof(tBTA_JV_API_CREATE_RECORD))) != NULL)
{
p_msg->hdr.event = BTA_JV_API_CREATE_RECORD_EVT;
@@ -872,7 +872,7 @@
tBTA_JV_STATUS status = BTA_JV_FAILURE;
tBTA_JV_API_UPDATE_RECORD *p_msg;
- APPL_TRACE_API0( "BTA_JvUpdateRecord");
+ APPL_TRACE_API( "BTA_JvUpdateRecord");
if ((p_msg = (tBTA_JV_API_UPDATE_RECORD *)GKI_getbuf(sizeof(tBTA_JV_API_UPDATE_RECORD))) != NULL)
{
p_msg->hdr.event = BTA_JV_API_UPDATE_RECORD_EVT;
@@ -907,7 +907,7 @@
tBTA_JV_STATUS status = BTA_JV_FAILURE;
tBTA_JV_API_ADD_ATTRIBUTE *p_msg;
- APPL_TRACE_API0( "BTA_JvAddAttribute");
+ APPL_TRACE_API( "BTA_JvAddAttribute");
if ((p_msg = (tBTA_JV_API_ADD_ATTRIBUTE *)GKI_getbuf(sizeof(tBTA_JV_API_ADD_ATTRIBUTE))) != NULL)
{
p_msg->hdr.event = BTA_JV_API_ADD_ATTRIBUTE_EVT;
@@ -938,7 +938,7 @@
tBTA_JV_STATUS status = BTA_JV_FAILURE;
tBTA_JV_API_ADD_ATTRIBUTE *p_msg;
- APPL_TRACE_API0( "BTA_JvDeleteAttribute");
+ APPL_TRACE_API( "BTA_JvDeleteAttribute");
if ((p_msg = (tBTA_JV_API_ADD_ATTRIBUTE *)GKI_getbuf(sizeof(tBTA_JV_API_ADD_ATTRIBUTE))) != NULL)
{
p_msg->hdr.event = BTA_JV_API_DELETE_ATTRIBUTE_EVT;
@@ -965,7 +965,7 @@
tBTA_JV_STATUS status = BTA_JV_FAILURE;
tBTA_JV_API_ADD_ATTRIBUTE *p_msg;
- APPL_TRACE_API0( "BTA_JvDeleteRecord");
+ APPL_TRACE_API( "BTA_JvDeleteRecord");
if ((p_msg = (tBTA_JV_API_ADD_ATTRIBUTE *)GKI_getbuf(sizeof(tBTA_JV_API_ADD_ATTRIBUTE))) != NULL)
{
p_msg->hdr.event = BTA_JV_API_DELETE_RECORD_EVT;
@@ -1024,7 +1024,7 @@
tBTA_JV_STATUS status = BTA_JV_FAILURE;
tBTA_JV_API_L2CAP_CONNECT *p_msg;
- APPL_TRACE_API0( "BTA_JvL2capConnect");
+ APPL_TRACE_API( "BTA_JvL2capConnect");
if (p_cback &&
(p_msg = (tBTA_JV_API_L2CAP_CONNECT *)GKI_getbuf(sizeof(tBTA_JV_API_L2CAP_CONNECT))) != NULL)
{
@@ -1057,7 +1057,7 @@
tBTA_JV_STATUS status = BTA_JV_FAILURE;
tBTA_JV_API_L2CAP_CLOSE *p_msg;
- APPL_TRACE_API0( "BTA_JvL2capClose");
+ APPL_TRACE_API( "BTA_JvL2capClose");
if (handle < BTA_JV_MAX_L2C_CONN && bta_jv_cb.l2c_cb[handle].p_cback &&
(p_msg = (tBTA_JV_API_L2CAP_CLOSE *)GKI_getbuf(sizeof(tBTA_JV_API_L2CAP_CLOSE))) != NULL)
{
@@ -1092,7 +1092,7 @@
tBTA_JV_STATUS status = BTA_JV_FAILURE;
tBTA_JV_API_L2CAP_SERVER *p_msg;
- APPL_TRACE_API0( "BTA_JvL2capStartServer");
+ APPL_TRACE_API( "BTA_JvL2capStartServer");
if (p_cback &&
(p_msg = (tBTA_JV_API_L2CAP_SERVER *)GKI_getbuf(sizeof(tBTA_JV_API_L2CAP_SERVER))) != NULL)
{
@@ -1125,7 +1125,7 @@
tBTA_JV_STATUS status = BTA_JV_FAILURE;
tBTA_JV_API_L2CAP_SERVER *p_msg;
- APPL_TRACE_API0( "BTA_JvL2capStopServer");
+ APPL_TRACE_API( "BTA_JvL2capStopServer");
if ((p_msg = (tBTA_JV_API_L2CAP_SERVER *)GKI_getbuf(sizeof(tBTA_JV_API_L2CAP_SERVER))) != NULL)
{
p_msg->hdr.event = BTA_JV_API_L2CAP_STOP_SERVER_EVT;
@@ -1165,7 +1165,7 @@
#endif
tBTA_JV_L2CAP_READ evt_data;
- APPL_TRACE_API0( "BTA_JvL2capRead");
+ APPL_TRACE_API( "BTA_JvL2capRead");
#if SDP_FOR_JV_INCLUDED == TRUE
if(BTA_JV_L2C_FOR_SDP_HDL == handle)
@@ -1231,7 +1231,7 @@
UINT32 left_over = 0;
UINT16 max_len, read_len;
- APPL_TRACE_API0( "BTA_JvL2capReceive");
+ APPL_TRACE_API( "BTA_JvL2capReceive");
if (handle < BTA_JV_MAX_L2C_CONN && bta_jv_cb.l2c_cb[handle].p_cback)
{
@@ -1278,7 +1278,7 @@
#if 0
tBTA_JV_STATUS status = BTA_JV_FAILURE;
- APPL_TRACE_API1( "BTA_JvL2capReady: %d", handle);
+ APPL_TRACE_API( "BTA_JvL2capReady: %d", handle);
if (p_data_size && handle < BTA_JV_MAX_L2C_CONN && bta_jv_cb.l2c_cb[handle].p_cback)
{
*p_data_size = 0;
@@ -1319,7 +1319,7 @@
tBTA_JV_STATUS status = BTA_JV_FAILURE;
tBTA_JV_API_L2CAP_WRITE *p_msg;
- APPL_TRACE_API0( "BTA_JvL2capWrite");
+ APPL_TRACE_API( "BTA_JvL2capWrite");
if (handle < BTA_JV_MAX_L2C_CONN && bta_jv_cb.l2c_cb[handle].p_cback &&
(p_msg = (tBTA_JV_API_L2CAP_WRITE *)GKI_getbuf(sizeof(tBTA_JV_API_L2CAP_WRITE))) != NULL)
{
@@ -1358,7 +1358,7 @@
tBTA_JV_STATUS status = BTA_JV_FAILURE;
tBTA_JV_API_RFCOMM_CONNECT *p_msg;
- APPL_TRACE_API0( "BTA_JvRfcommConnect");
+ APPL_TRACE_API( "BTA_JvRfcommConnect");
if (p_cback &&
(p_msg = (tBTA_JV_API_RFCOMM_CONNECT *)GKI_getbuf(sizeof(tBTA_JV_API_RFCOMM_CONNECT))) != NULL)
{
@@ -1393,7 +1393,7 @@
UINT32 hi = ((handle & BTA_JV_RFC_HDL_MASK)&~BTA_JV_RFCOMM_MASK) - 1;
UINT32 si = BTA_JV_RFC_HDL_TO_SIDX(handle);
- APPL_TRACE_API0( "BTA_JvRfcommClose");
+ APPL_TRACE_API( "BTA_JvRfcommClose");
if (hi < BTA_JV_MAX_RFC_CONN && bta_jv_cb.rfc_cb[hi].p_cback &&
si < BTA_JV_MAX_RFC_SR_SESSION && bta_jv_cb.rfc_cb[hi].rfc_hdl[si] &&
(p_msg = (tBTA_JV_API_RFCOMM_CLOSE *)GKI_getbuf(sizeof(tBTA_JV_API_RFCOMM_CLOSE))) != NULL)
@@ -1432,7 +1432,7 @@
tBTA_JV_STATUS status = BTA_JV_FAILURE;
tBTA_JV_API_RFCOMM_SERVER *p_msg;
- APPL_TRACE_API0( "BTA_JvRfcommStartServer");
+ APPL_TRACE_API( "BTA_JvRfcommStartServer");
if (p_cback &&
(p_msg = (tBTA_JV_API_RFCOMM_SERVER *)GKI_getbuf(sizeof(tBTA_JV_API_RFCOMM_SERVER))) != NULL)
{
@@ -1440,7 +1440,7 @@
max_session = 1;
if (max_session > BTA_JV_MAX_RFC_SR_SESSION)
{
- APPL_TRACE_DEBUG2( "max_session is too big. use max (%d)", max_session, BTA_JV_MAX_RFC_SR_SESSION);
+ APPL_TRACE_DEBUG( "max_session is too big. use max (%d)", max_session, BTA_JV_MAX_RFC_SR_SESSION);
max_session = BTA_JV_MAX_RFC_SR_SESSION;
}
p_msg->hdr.event = BTA_JV_API_RFCOMM_START_SERVER_EVT;
@@ -1472,7 +1472,7 @@
{
tBTA_JV_STATUS status = BTA_JV_FAILURE;
tBTA_JV_API_RFCOMM_SERVER *p_msg;
- APPL_TRACE_API0( "BTA_JvRfcommStopServer");
+ APPL_TRACE_API( "BTA_JvRfcommStopServer");
if ((p_msg = (tBTA_JV_API_RFCOMM_SERVER *)GKI_getbuf(sizeof(tBTA_JV_API_RFCOMM_SERVER))) != NULL)
{
p_msg->hdr.event = BTA_JV_API_RFCOMM_STOP_SERVER_EVT;
@@ -1503,7 +1503,7 @@
UINT32 hi = ((handle & BTA_JV_RFC_HDL_MASK)&~BTA_JV_RFCOMM_MASK) - 1;
UINT32 si = BTA_JV_RFC_HDL_TO_SIDX(handle);
- APPL_TRACE_API0( "BTA_JvRfcommRead");
+ APPL_TRACE_API( "BTA_JvRfcommRead");
if (hi < BTA_JV_MAX_RFC_CONN && bta_jv_cb.rfc_cb[hi].p_cback &&
si < BTA_JV_MAX_RFC_SR_SESSION && bta_jv_cb.rfc_cb[hi].rfc_hdl[si] &&
(p_msg = (tBTA_JV_API_RFCOMM_READ *)GKI_getbuf(sizeof(tBTA_JV_API_RFCOMM_READ))) != NULL)
@@ -1563,7 +1563,7 @@
UINT32 hi = ((handle & BTA_JV_RFC_HDL_MASK)&~BTA_JV_RFCOMM_MASK) - 1;
UINT32 si = BTA_JV_RFC_HDL_TO_SIDX(handle);
- APPL_TRACE_API0( "BTA_JvRfcommReady");
+ APPL_TRACE_API( "BTA_JvRfcommReady");
if (hi < BTA_JV_MAX_RFC_CONN && bta_jv_cb.rfc_cb[hi].p_cback &&
si < BTA_JV_MAX_RFC_SR_SESSION && bta_jv_cb.rfc_cb[hi].rfc_hdl[si])
{
@@ -1593,8 +1593,8 @@
UINT32 hi = ((handle & BTA_JV_RFC_HDL_MASK)&~BTA_JV_RFCOMM_MASK) - 1;
UINT32 si = BTA_JV_RFC_HDL_TO_SIDX(handle);
- APPL_TRACE_API0( "BTA_JvRfcommWrite");
- APPL_TRACE_DEBUG3( "handle:0x%x, hi:%d, si:%d", handle, hi, si);
+ APPL_TRACE_API( "BTA_JvRfcommWrite");
+ APPL_TRACE_DEBUG( "handle:0x%x, hi:%d, si:%d", handle, hi, si);
if (hi < BTA_JV_MAX_RFC_CONN && bta_jv_cb.rfc_cb[hi].p_cback &&
si < BTA_JV_MAX_RFC_SR_SESSION && bta_jv_cb.rfc_cb[hi].rfc_hdl[si] &&
(p_msg = (tBTA_JV_API_RFCOMM_WRITE *)GKI_getbuf(sizeof(tBTA_JV_API_RFCOMM_WRITE))) != NULL)
@@ -1604,7 +1604,7 @@
p_msg->req_id = req_id;
p_msg->p_cb = &bta_jv_cb.rfc_cb[hi];
p_msg->p_pcb = &bta_jv_cb.port_cb[p_msg->p_cb->rfc_hdl[si] - 1];
- APPL_TRACE_API0( "write ok");
+ APPL_TRACE_API( "write ok");
bta_sys_sendmsg(p_msg);
status = BTA_JV_SUCCESS;
}
@@ -1637,7 +1637,7 @@
tBTA_JV_STATUS status = BTA_JV_FAILURE;
tBTA_JV_API_SET_PM_PROFILE *p_msg;
- APPL_TRACE_API2("BTA_JVSetPmProfile handle:0x%x, app_id:%d", handle, app_id);
+ APPL_TRACE_API("BTA_JVSetPmProfile handle:0x%x, app_id:%d", handle, app_id);
if ((p_msg = (tBTA_JV_API_SET_PM_PROFILE *)GKI_getbuf(sizeof(tBTA_JV_API_SET_PM_PROFILE)))
!= NULL)
{
diff --git a/bta/jv/bta_jv_cfg.c b/bta/jv/bta_jv_cfg.c
index 675801f..21bd2a8 100644
--- a/bta/jv/bta_jv_cfg.c
+++ b/bta/jv/bta_jv_cfg.c
@@ -1,5 +1,6 @@
/******************************************************************************
*
+ * Copyright (C) 2014 The Android Open Source Project
* Copyright (C) 2004-2012 Broadcom Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -42,7 +43,7 @@
* p_bta_jv_cfg->p_sdp_raw_data can be allocated before calling BTA_JvStartDiscovery
* it can be de-allocated after the last call to access the database */
static UINT8 bta_jv_sdp_raw_data[BTA_JV_SDP_RAW_DATA_SIZE];
-static UINT8 bta_jv_sdp_db_data[BTA_JV_SDP_DB_SIZE];
+static UINT8 __attribute__ ((aligned(4))) bta_jv_sdp_db_data[BTA_JV_SDP_DB_SIZE];
/* JV configuration structure */
const tBTA_JV_CFG bta_jv_cfg =
diff --git a/bta/mce/bta_mce_act.c b/bta/mce/bta_mce_act.c
new file mode 100644
index 0000000..652254f
--- /dev/null
+++ b/bta/mce/bta_mce_act.c
@@ -0,0 +1,186 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright (C) 2003-2012 Broadcom Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * This file contains action functions for MCE.
+ *
+ ******************************************************************************/
+
+#include <hardware/bluetooth.h>
+#include <arpa/inet.h>
+
+#include "bt_types.h"
+#include "gki.h"
+#include "bd.h"
+#include "utl.h"
+#include "bta_sys.h"
+#include "bta_api.h"
+#include "bta_mce_api.h"
+#include "bta_mce_int.h"
+#include "btm_api.h"
+#include "btm_int.h"
+#include "sdp_api.h"
+#include <string.h>
+
+/*****************************************************************************
+** Constants
+*****************************************************************************/
+
+static const tBT_UUID bta_mce_mas_uuid = {
+ .len = 2,
+ .uu.uuid16 = UUID_SERVCLASS_MESSAGE_ACCESS
+};
+
+/*******************************************************************************
+**
+** Function bta_mce_search_cback
+**
+** Description Callback from btm after search is completed
+**
+** Returns void
+**
+*******************************************************************************/
+
+static void bta_mce_search_cback(UINT16 result, void * user_data)
+{
+ tSDP_DISC_REC *p_rec = NULL;
+ tBTA_MCE_MAS_DISCOVERY_COMP evt_data;
+ int found = 0;
+
+ APPL_TRACE_DEBUG("bta_mce_start_discovery_cback res: 0x%x", result);
+
+ bta_mce_cb.sdp_active = BTA_MCE_SDP_ACT_NONE;
+
+ if (bta_mce_cb.p_dm_cback == NULL) return;
+
+ evt_data.status = BTA_MCE_FAILURE;
+ bdcpy(evt_data.remote_addr, bta_mce_cb.remote_addr);
+ evt_data.num_mas = 0;
+
+ if (result == SDP_SUCCESS || result == SDP_DB_FULL)
+ {
+ do
+ {
+ tSDP_DISC_ATTR *p_attr;
+ tSDP_PROTOCOL_ELEM pe;
+
+ p_rec = SDP_FindServiceUUIDInDb(p_bta_mce_cfg->p_sdp_db, (tBT_UUID*) &bta_mce_mas_uuid, p_rec);
+
+ APPL_TRACE_DEBUG("p_rec:%p", p_rec);
+
+ if (p_rec == NULL)
+ break;
+
+ if (!SDP_FindProtocolListElemInRec(p_rec, UUID_PROTOCOL_RFCOMM, &pe))
+ continue;
+
+ evt_data.mas[found].scn = pe.params[0];
+
+ if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SERVICE_NAME)) == NULL)
+ continue;
+
+ evt_data.mas[found].p_srv_name = (char *) p_attr->attr_value.v.array;
+ evt_data.mas[found].srv_name_len= SDP_DISC_ATTR_LEN(p_attr->attr_len_type);
+
+ if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_MAS_INSTANCE_ID)) == NULL)
+ break;
+
+ evt_data.mas[found].instance_id = p_attr->attr_value.v.u8;
+
+ if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SUPPORTED_MSG_TYPE)) == NULL)
+ break;
+
+ evt_data.mas[found].msg_type = p_attr->attr_value.v.u8;
+
+ found++;
+ } while (p_rec != NULL && found < BTA_MCE_MAX_MAS_INSTANCES);
+
+ evt_data.num_mas = found;
+ evt_data.status = BTA_MCE_SUCCESS;
+ }
+
+ bta_mce_cb.p_dm_cback(BTA_MCE_MAS_DISCOVERY_COMP_EVT, (tBTA_MCE*) &evt_data, user_data);
+}
+
+/*******************************************************************************
+**
+** Function bta_mce_enable
+**
+** Description Initializes the MCE I/F
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_mce_enable(tBTA_MCE_MSG *p_data)
+{
+ tBTA_MCE_STATUS status = BTA_MCE_SUCCESS;
+ bta_mce_cb.p_dm_cback = p_data->enable.p_cback;
+ bta_mce_cb.p_dm_cback(BTA_MCE_ENABLE_EVT, (tBTA_MCE *)&status, NULL);
+}
+
+/*******************************************************************************
+**
+** Function bta_mce_get_remote_mas_instances
+**
+** Description Discovers MAS instances on remote device
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_mce_get_remote_mas_instances(tBTA_MCE_MSG *p_data)
+{
+ if(p_data == NULL)
+ {
+ APPL_TRACE_DEBUG("MCE control block handle is null");
+ return;
+ }
+ tBTA_MCE_STATUS status = BTA_MCE_FAILURE;
+
+ APPL_TRACE_DEBUG("%s in, sdp_active:%d", __FUNCTION__, bta_mce_cb.sdp_active);
+
+ if (bta_mce_cb.sdp_active != BTA_MCE_SDP_ACT_NONE)
+ {
+ /* SDP is still in progress */
+ status = BTA_MCE_BUSY;
+ if(bta_mce_cb.p_dm_cback)
+ bta_mce_cb.p_dm_cback(BTA_MCE_MAS_DISCOVERY_COMP_EVT, (tBTA_MCE *)&status, NULL);
+
+ return;
+ }
+
+ bta_mce_cb.sdp_active = BTA_MCE_SDP_ACT_YES;
+ bdcpy(bta_mce_cb.remote_addr, p_data->get_rmt_mas.bd_addr);
+
+ SDP_InitDiscoveryDb (p_bta_mce_cfg->p_sdp_db, p_bta_mce_cfg->sdp_db_size, 1,
+ (tBT_UUID*) &bta_mce_mas_uuid, 0, NULL);
+
+ if (!SDP_ServiceSearchAttributeRequest2(p_data->get_rmt_mas.bd_addr, p_bta_mce_cfg->p_sdp_db,
+ bta_mce_search_cback, NULL))
+ {
+ bta_mce_cb.sdp_active = BTA_MCE_SDP_ACT_NONE;
+
+ /* failed to start SDP. report the failure right away */
+ if (bta_mce_cb.p_dm_cback)
+ bta_mce_cb.p_dm_cback(BTA_MCE_MAS_DISCOVERY_COMP_EVT, (tBTA_MCE *)&status, NULL);
+ }
+ /*
+ else report the result when the cback is called
+ */
+}
diff --git a/bta/mce/bta_mce_api.c b/bta/mce/bta_mce_api.c
new file mode 100644
index 0000000..ff2713c
--- /dev/null
+++ b/bta/mce/bta_mce_api.c
@@ -0,0 +1,112 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright (C) 2003-2012 Broadcom Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * This is the implementation of the API for MCE subsystem
+ *
+ ******************************************************************************/
+
+#include "bta_api.h"
+#include "bd.h"
+#include "bta_sys.h"
+#include "bta_mce_api.h"
+#include "bta_mce_int.h"
+#include "gki.h"
+#include <string.h>
+#include "port_api.h"
+#include "sdp_api.h"
+
+/*****************************************************************************
+** Constants
+*****************************************************************************/
+
+static const tBTA_SYS_REG bta_mce_reg =
+{
+ bta_mce_sm_execute,
+ NULL
+};
+
+/*******************************************************************************
+**
+** Function BTA_MceEnable
+**
+** Description Enable the MCE I/F service. When the enable
+** operation is complete the callback function will be
+** called with a BTA_MCE_ENABLE_EVT. This function must
+** be called before other functions in the MCE API are
+** called.
+**
+** Returns BTA_MCE_SUCCESS if successful.
+** BTA_MCE_FAIL if internal failure.
+**
+*******************************************************************************/
+tBTA_MCE_STATUS BTA_MceEnable(tBTA_MCE_DM_CBACK *p_cback)
+{
+ tBTA_MCE_STATUS status = BTA_MCE_FAILURE;
+ tBTA_MCE_API_ENABLE *p_buf;
+
+ APPL_TRACE_API(__FUNCTION__);
+ if(p_cback && FALSE == bta_sys_is_register(BTA_ID_MCE))
+ {
+ memset(&bta_mce_cb, 0, sizeof(tBTA_MCE_CB));
+
+ /* register with BTA system manager */
+ bta_sys_register(BTA_ID_MCE, &bta_mce_reg);
+
+ if (p_cback && (p_buf = (tBTA_MCE_API_ENABLE *) GKI_getbuf(sizeof(tBTA_MCE_API_ENABLE))) != NULL)
+ {
+ p_buf->hdr.event = BTA_MCE_API_ENABLE_EVT;
+ p_buf->p_cback = p_cback;
+ bta_sys_sendmsg(p_buf);
+ status = BTA_MCE_SUCCESS;
+ }
+ }
+ return(status);
+}
+
+/*******************************************************************************
+**
+** Function BTA_MceGetRemoteMasInstances
+**
+** Description This function performs service discovery for the MAS service
+** by the given peer device. When the operation is completed
+** the tBTA_MCE_DM_CBACK callback function will be called with
+** a BTA_MCE_MAS_DISCOVERY_COMP_EVT.
+**
+** Returns BTA_MCE_SUCCESS, if the request is being processed.
+** BTA_MCE_FAILURE, otherwise.
+**
+*******************************************************************************/
+tBTA_MCE_STATUS BTA_MceGetRemoteMasInstances(BD_ADDR bd_addr)
+{
+ tBTA_MCE_STATUS ret = BTA_MCE_FAILURE;
+ tBTA_MCE_API_GET_REMOTE_MAS_INSTANCES *p_msg;
+
+ APPL_TRACE_API(__FUNCTION__);
+ if ((p_msg = (tBTA_MCE_API_GET_REMOTE_MAS_INSTANCES *)GKI_getbuf(sizeof(tBTA_MCE_API_GET_REMOTE_MAS_INSTANCES))) != NULL)
+ {
+ p_msg->hdr.event = BTA_MCE_API_GET_REMOTE_MAS_INSTANCES_EVT;
+ bdcpy(p_msg->bd_addr, bd_addr);
+ bta_sys_sendmsg(p_msg);
+ ret = BTA_MCE_SUCCESS;
+ }
+
+ return(ret);
+}
diff --git a/bta/mce/bta_mce_cfg.c b/bta/mce/bta_mce_cfg.c
new file mode 100644
index 0000000..db9fe66
--- /dev/null
+++ b/bta/mce/bta_mce_cfg.c
@@ -0,0 +1,44 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright (C) 2003-2012 Broadcom Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * This file contains compile-time configurable constants for MCE
+ *
+ ******************************************************************************/
+
+#include "gki.h"
+#include "bta_api.h"
+#include "bd.h"
+#include "bta_mce_api.h"
+
+#ifndef BTA_MCE_SDP_DB_SIZE
+#define BTA_MCE_SDP_DB_SIZE 4500
+#endif
+
+static UINT8 __attribute__ ((aligned(4))) bta_mce_sdp_db_data[BTA_MCE_SDP_DB_SIZE];
+
+/* MCE configuration structure */
+const tBTA_MCE_CFG bta_mce_cfg =
+{
+ BTA_MCE_SDP_DB_SIZE,
+ (tSDP_DISCOVERY_DB *)bta_mce_sdp_db_data /* The data buffer to keep SDP database */
+};
+
+tBTA_MCE_CFG *p_bta_mce_cfg = (tBTA_MCE_CFG *) &bta_mce_cfg;
diff --git a/bta/mce/bta_mce_int.h b/bta/mce/bta_mce_int.h
new file mode 100644
index 0000000..9032f6a
--- /dev/null
+++ b/bta/mce/bta_mce_int.h
@@ -0,0 +1,97 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright (C) 2003-2012 Broadcom Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * This is the private interface file for the BTA MCE I/F
+ *
+ ******************************************************************************/
+#ifndef BTA_MCE_INT_H
+#define BTA_MCE_INT_H
+
+#include "bta_sys.h"
+#include "bta_api.h"
+#include "bta_mce_api.h"
+
+/*****************************************************************************
+** Constants
+*****************************************************************************/
+
+enum
+{
+ /* these events are handled by the state machine */
+ BTA_MCE_API_ENABLE_EVT = BTA_SYS_EVT_START(BTA_ID_MCE),
+ BTA_MCE_API_GET_REMOTE_MAS_INSTANCES_EVT,
+ BTA_MCE_MAX_INT_EVT
+};
+
+/* data type for BTA_MCE_API_ENABLE_EVT */
+typedef struct
+{
+ BT_HDR hdr;
+ tBTA_MCE_DM_CBACK *p_cback;
+} tBTA_MCE_API_ENABLE;
+
+/* data type for BTA_MCE_API_GET_REMOTE_MAS_INSTANCES_EVT */
+typedef struct
+{
+ BT_HDR hdr;
+ BD_ADDR bd_addr;
+} tBTA_MCE_API_GET_REMOTE_MAS_INSTANCES;
+
+/* union of all data types */
+typedef union
+{
+ /* GKI event buffer header */
+ BT_HDR hdr;
+ tBTA_MCE_API_ENABLE enable;
+ tBTA_MCE_API_GET_REMOTE_MAS_INSTANCES get_rmt_mas;
+} tBTA_MCE_MSG;
+
+/* MCE control block */
+typedef struct
+{
+ UINT8 sdp_active; /* see BTA_MCE_SDP_ACT_* */
+ BD_ADDR remote_addr;
+ tBTA_MCE_DM_CBACK *p_dm_cback;
+} tBTA_MCE_CB;
+
+enum
+{
+ BTA_MCE_SDP_ACT_NONE = 0,
+ BTA_MCE_SDP_ACT_YES /* waiting for SDP result */
+};
+
+/* MCE control block */
+#if BTA_DYNAMIC_MEMORY == FALSE
+extern tBTA_MCE_CB bta_mce_cb;
+#else
+extern tBTA_MCE_CB *bta_mce_cb_ptr;
+#define bta_mce_cb (*bta_mce_cb_ptr)
+#endif
+
+/* config struct */
+extern tBTA_MCE_CFG *p_bta_mce_cfg;
+
+extern BOOLEAN bta_mce_sm_execute(BT_HDR *p_msg);
+
+extern void bta_mce_enable (tBTA_MCE_MSG *p_data);
+extern void bta_mce_get_remote_mas_instances (tBTA_MCE_MSG *p_data);
+
+#endif /* BTA_MCE_INT_H */
diff --git a/bta/mce/bta_mce_main.c b/bta/mce/bta_mce_main.c
new file mode 100644
index 0000000..f313eb0
--- /dev/null
+++ b/bta/mce/bta_mce_main.c
@@ -0,0 +1,77 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright (C) 2003-2012 Broadcom Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * This is the main implementation file for the BTA MCE I/F
+ *
+ ******************************************************************************/
+
+#include "bta_api.h"
+#include "bta_sys.h"
+#include "bta_mce_api.h"
+#include "bta_mce_int.h"
+
+/*****************************************************************************
+** Constants and types
+*****************************************************************************/
+
+#if BTA_DYNAMIC_MEMORY == FALSE
+tBTA_MCE_CB bta_mce_cb;
+#endif
+
+/* state machine action enumeration list */
+#define BTA_MCE_NUM_ACTIONS (BTA_MCE_MAX_INT_EVT & 0x00ff)
+
+/* type for action functions */
+typedef void (*tBTA_MCE_ACTION)(tBTA_MCE_MSG *p_data);
+
+/* action function list */
+const tBTA_MCE_ACTION bta_mce_action[] =
+{
+ bta_mce_enable, /* BTA_MCE_API_ENABLE_EVT */
+ bta_mce_get_remote_mas_instances, /* BTA_MCE_API_GET_REMOTE_MAS_INSTANCES_EVT */
+};
+
+/*******************************************************************************
+**
+** Function bta_mce_sm_execute
+**
+** Description State machine event handling function for MCE
+**
+**
+** Returns void
+**
+*******************************************************************************/
+BOOLEAN bta_mce_sm_execute(BT_HDR *p_msg)
+{
+ if(p_msg == NULL) return FALSE;
+
+ BOOLEAN ret = FALSE;
+ UINT16 action = (p_msg->event & 0x00ff);
+
+ /* execute action functions */
+ if(action < BTA_MCE_NUM_ACTIONS)
+ {
+ (*bta_mce_action[action])((tBTA_MCE_MSG*)p_msg);
+ ret = TRUE;
+ }
+
+ return(ret);
+}
diff --git a/bta/pan/bta_pan_act.c b/bta/pan/bta_pan_act.c
index d0939d6..ca3567c 100644
--- a/bta/pan/bta_pan_act.c
+++ b/bta/pan/bta_pan_act.c
@@ -43,6 +43,40 @@
#define BTA_PAN_TX_MASK 0xF0
/*******************************************************************************
+ **
+ ** Function bta_pan_pm_conn_busy
+ **
+ ** Description set pan pm connection busy state
+ **
+ ** Params p_scb: state machine control block of pan connection
+ **
+ ** Returns void
+ **
+ *******************************************************************************/
+static void bta_pan_pm_conn_busy(tBTA_PAN_SCB *p_scb)
+{
+ if ((p_scb != NULL) && (p_scb->state != BTA_PAN_IDLE_ST))
+ bta_sys_busy(BTA_ID_PAN, p_scb->app_id, p_scb->bd_addr);
+}
+
+/*******************************************************************************
+ **
+ ** Function bta_pan_pm_conn_idle
+ **
+ ** Description set pan pm connection idle state
+ **
+ ** Params p_scb: state machine control block of pan connection
+ **
+ ** Returns void
+ **
+ *******************************************************************************/
+static void bta_pan_pm_conn_idle(tBTA_PAN_SCB *p_scb)
+{
+ if ((p_scb != NULL) && (p_scb->state != BTA_PAN_IDLE_ST))
+ bta_sys_idle(BTA_ID_PAN, p_scb->app_id, p_scb->bd_addr);
+}
+
+/*******************************************************************************
**
** Function bta_pan_conn_state_cback
**
@@ -177,7 +211,7 @@
p_new_buf = (BT_HDR *)GKI_getpoolbuf( PAN_POOL_ID );
if(!p_new_buf)
{
- APPL_TRACE_WARNING0("Cannot get a PAN GKI buffer");
+ APPL_TRACE_WARNING("Cannot get a PAN GKI buffer");
GKI_freebuf( p_buf );
return;
}
@@ -438,7 +472,7 @@
status = PAN_Connect (p_data->api_open.bd_addr, p_data->api_open.local_role, p_data->api_open.peer_role,
&p_scb->handle);
-
+ APPL_TRACE_DEBUG("%s pan connect status: %d", __func__, status);
if(status == PAN_SUCCESS)
{
@@ -511,6 +545,8 @@
tBTA_PAN_OPEN data;
+ APPL_TRACE_DEBUG("%s pan connection result: %d", __func__, p_data->conn.result);
+
bdcpy(data.bd_addr, p_scb->bd_addr);
data.handle = p_scb->handle;
data.local_role = p_scb->local_role;
@@ -520,7 +556,9 @@
{
data.status = BTA_PAN_SUCCESS;
bta_pan_co_open(p_scb->handle, p_scb->app_id, p_scb->local_role, p_scb->peer_role, p_scb->bd_addr);
-
+ p_scb->pan_flow_enable = TRUE;
+ p_scb->app_flow_enable = TRUE;
+ bta_sys_conn_open(BTA_ID_PAN ,p_scb->app_id, p_scb->bd_addr);
}
else
{
@@ -528,11 +566,6 @@
data.status = BTA_PAN_FAIL;
}
- p_scb->pan_flow_enable = TRUE;
- p_scb->app_flow_enable = TRUE;
-
- bta_sys_conn_open( BTA_ID_PAN ,p_scb->app_id, p_scb->bd_addr);
-
bta_pan_cb.p_cback(BTA_PAN_OPEN_EVT, (tBTA_PAN *)&data);
@@ -627,12 +660,14 @@
/* if data path configured for tx pull */
if ((bta_pan_cb.flow_mask & BTA_PAN_TX_MASK) == BTA_PAN_TX_PULL)
{
+ bta_pan_pm_conn_busy(p_scb);
/* call application callout function for tx path */
bta_pan_co_tx_path(p_scb->handle, p_scb->app_id);
/* free data that exceeds queue level */
while(p_scb->data_queue.count > bta_pan_cb.q_level)
GKI_freebuf(GKI_dequeue(&p_scb->data_queue));
+ bta_pan_pm_conn_idle(p_scb);
}
/* if configured for zero copy push */
else if ((bta_pan_cb.flow_mask & BTA_PAN_TX_MASK) == BTA_PAN_TX_PUSH_BUF)
@@ -704,6 +739,7 @@
{
if ((bta_pan_cb.flow_mask & BTA_PAN_RX_MASK) == BTA_PAN_RX_PUSH_BUF)
{
+ bta_pan_pm_conn_busy(p_scb);
PAN_WriteBuf (p_scb->handle,
((tBTA_PAN_DATA_PARAMS *)p_data)->dst,
@@ -711,6 +747,7 @@
((tBTA_PAN_DATA_PARAMS *)p_data)->protocol,
(BT_HDR *)p_data,
((tBTA_PAN_DATA_PARAMS *)p_data)->ext);
+ bta_pan_pm_conn_idle(p_scb);
}
}
diff --git a/bta/pan/bta_pan_api.c b/bta/pan/bta_pan_api.c
index 17ae6a7..0a69b0f 100644
--- a/bta/pan/bta_pan_api.c
+++ b/bta/pan/bta_pan_api.c
@@ -60,9 +60,7 @@
tBTA_PAN_API_ENABLE *p_buf;
/* register with BTA system manager */
- GKI_sched_lock();
bta_sys_register(BTA_ID_PAN, &bta_pan_reg);
- GKI_sched_unlock();
if ((p_buf = (tBTA_PAN_API_ENABLE *) GKI_getbuf(sizeof(tBTA_PAN_API_ENABLE))) != NULL)
{
diff --git a/bta/pan/bta_pan_int.h b/bta/pan/bta_pan_int.h
index 1667e57..bd75311 100644
--- a/bta/pan/bta_pan_int.h
+++ b/bta/pan/bta_pan_int.h
@@ -56,6 +56,14 @@
BTA_PAN_API_OPEN_EVT
};
+/* state machine states */
+enum
+{
+ BTA_PAN_IDLE_ST,
+ BTA_PAN_OPEN_ST,
+ BTA_PAN_CLOSING_ST
+};
+
diff --git a/bta/pan/bta_pan_main.c b/bta/pan/bta_pan_main.c
index 5ed545f..3a69994 100644
--- a/bta/pan/bta_pan_main.c
+++ b/bta/pan/bta_pan_main.c
@@ -84,14 +84,6 @@
#define BTA_PAN_NUM_COLS 2 /* number of columns in state tables */
-/* state machine states */
-enum
-{
- BTA_PAN_IDLE_ST,
- BTA_PAN_OPEN_ST,
- BTA_PAN_CLOSING_ST
-};
-
/* state table for listen state */
const UINT8 bta_pan_st_idle[][BTA_PAN_NUM_COLS] =
@@ -180,7 +172,7 @@
if (!p_scb->in_use)
{
p_scb->in_use = TRUE;
- APPL_TRACE_DEBUG1("bta_pan_scb_alloc %d", i);
+ APPL_TRACE_DEBUG("bta_pan_scb_alloc %d", i);
break;
}
}
@@ -189,7 +181,7 @@
{
/* out of scbs */
p_scb = NULL;
- APPL_TRACE_WARNING0("Out of scbs");
+ APPL_TRACE_WARNING("Out of scbs");
}
return p_scb;
}
@@ -210,7 +202,7 @@
UINT8 action;
int i;
- APPL_TRACE_EVENT3("PAN scb=%d event=0x%x state=%d", bta_pan_scb_to_idx(p_scb), event, p_scb->state);
+ APPL_TRACE_EVENT("PAN scb=%d event=0x%x state=%d", bta_pan_scb_to_idx(p_scb), event, p_scb->state);
/* look up the state table for the current state */
state_table = bta_pan_st_tbl[p_scb->state];
@@ -312,7 +304,7 @@
*******************************************************************************/
void bta_pan_scb_dealloc(tBTA_PAN_SCB *p_scb)
{
- APPL_TRACE_DEBUG1("bta_pan_scb_dealloc %d", bta_pan_scb_to_idx(p_scb));
+ APPL_TRACE_DEBUG("bta_pan_scb_dealloc %d", bta_pan_scb_to_idx(p_scb));
memset(p_scb, 0, sizeof(tBTA_PAN_SCB));
}
@@ -358,7 +350,7 @@
}
- APPL_TRACE_WARNING1("No scb for handle %d", handle);
+ APPL_TRACE_WARNING("No scb for handle %d", handle);
return NULL;
}
diff --git a/bta/sys/bta_sys.h b/bta/sys/bta_sys.h
index 5d724e5..7b60b1f 100644
--- a/bta/sys/bta_sys.h
+++ b/bta/sys/bta_sys.h
@@ -31,6 +31,9 @@
** Constants and data types
*****************************************************************************/
+/* vendor specific event handler function type */
+typedef BOOLEAN (tBTA_SYS_VS_EVT_HDLR)(UINT16 evt, void *p);
+
/* event handler function type */
typedef BOOLEAN (tBTA_SYS_EVT_HDLR)(BT_HDR *p_msg);
@@ -300,6 +303,7 @@
extern void bta_sys_clear_policy (UINT8 id, UINT8 policy, BD_ADDR peer_addr);
extern void bta_sys_set_default_policy (UINT8 id, UINT8 policy);
extern void bta_sys_clear_default_policy (UINT8 id, UINT8 policy);
+extern BOOLEAN bta_sys_vs_hdl(UINT16 evt, void *p);
#ifdef __cplusplus
}
diff --git a/bta/sys/bta_sys_conn.c b/bta/sys/bta_sys_conn.c
index a5d1017..aef155b 100644
--- a/bta/sys/bta_sys_conn.c
+++ b/bta/sys/bta_sys_conn.c
@@ -578,3 +578,20 @@
}
#endif
+/*******************************************************************************
+**
+** Function bta_sys_vs_hdl
+**
+** Description Called by BTA subsystems to execute a VS event handler function
+**
+** Returns void
+**
+*******************************************************************************/
+BOOLEAN bta_sys_vs_hdl(UINT16 evt, void *p)
+{
+ if (bta_sys_cb.p_vs_evt_hdlr)
+ return (*bta_sys_cb.p_vs_evt_hdlr)(evt, p);
+
+ return FALSE;
+}
+
diff --git a/bta/sys/bta_sys_int.h b/bta/sys/bta_sys_int.h
index d187b29..32101a5 100644
--- a/bta/sys/bta_sys_int.h
+++ b/bta/sys/bta_sys_int.h
@@ -78,6 +78,9 @@
#if (BTM_SSR_INCLUDED == TRUE)
tBTA_SYS_SSR_CFG_CBACK *p_ssr_cb;
#endif
+ /* VS event handler */
+ tBTA_SYS_VS_EVT_HDLR *p_vs_evt_hdlr;
+
} tBTA_SYS_CB;
diff --git a/bta/sys/bta_sys_main.c b/bta/sys/bta_sys_main.c
index a440f52..0219290 100644
--- a/bta/sys/bta_sys_main.c
+++ b/bta/sys/bta_sys_main.c
@@ -205,7 +205,7 @@
UINT8 action;
int i;
- APPL_TRACE_EVENT2("bta_sys_sm_execute state:%d, event:0x%x", bta_sys_cb.state, p_msg->event);
+ APPL_TRACE_EVENT("bta_sys_sm_execute state:%d, event:0x%x", bta_sys_cb.state, p_msg->event);
/* look up the state table for the current state */
state_table = bta_sys_st_tbl[bta_sys_cb.state];
@@ -255,7 +255,7 @@
tBTA_SYS_HW_MSG *sys_event;
- APPL_TRACE_DEBUG1(" bta_sys_hw_btm_cback was called with parameter: %i" , status );
+ APPL_TRACE_DEBUG(" bta_sys_hw_btm_cback was called with parameter: %i" , status );
/* send a message to BTA SYS */
if ((sys_event = (tBTA_SYS_HW_MSG *) GKI_getbuf(sizeof(tBTA_SYS_HW_MSG))) != NULL)
@@ -278,7 +278,7 @@
}
else
{
- APPL_TRACE_DEBUG0("ERROR bta_sys_hw_btm_cback couldn't send msg" );
+ APPL_TRACE_DEBUG("ERROR bta_sys_hw_btm_cback couldn't send msg" );
}
}
@@ -299,7 +299,7 @@
UINT8 module_index;
UNUSED(p_sys_hw_msg);
- APPL_TRACE_DEBUG1("%s", __FUNCTION__);
+ APPL_TRACE_DEBUG("%s", __FUNCTION__);
for (module_index = 0; module_index < BTA_SYS_MAX_HW_MODULES; module_index++)
{
@@ -352,7 +352,7 @@
bta_sys_cb.sys_hw_cback[p_sys_hw_msg->hw_module ]( BTA_SYS_HW_ON_EVT );
}
- APPL_TRACE_EVENT2 ("bta_sys_hw_api_enable for %d, active modules 0x%04X",
+ APPL_TRACE_EVENT ("bta_sys_hw_api_enable for %d, active modules 0x%04X",
p_sys_hw_msg->hw_module, bta_sys_cb.sys_hw_module_active);
}
@@ -369,7 +369,7 @@
*******************************************************************************/
void bta_sys_hw_api_disable(tBTA_SYS_HW_MSG *p_sys_hw_msg)
{
- APPL_TRACE_DEBUG2("bta_sys_hw_api_disable for %d, active modules: 0x%04X",
+ APPL_TRACE_DEBUG("bta_sys_hw_api_disable for %d, active modules: 0x%04X",
p_sys_hw_msg->hw_module, bta_sys_cb.sys_hw_module_active );
/* make sure the related SW blocks were stopped */
@@ -410,7 +410,7 @@
*******************************************************************************/
void bta_sys_hw_evt_enabled(tBTA_SYS_HW_MSG *p_sys_hw_msg)
{
- APPL_TRACE_EVENT1("bta_sys_hw_evt_enabled for %i", p_sys_hw_msg->hw_module);
+ APPL_TRACE_EVENT("bta_sys_hw_evt_enabled for %i", p_sys_hw_msg->hw_module);
#if ( defined BTM_AUTOMATIC_HCI_RESET && BTM_AUTOMATIC_HCI_RESET == TRUE )
/* If device is already up, send a fake "BTM DEVICE UP" using BTA SYS state machine */
@@ -443,7 +443,7 @@
{
UINT8 hw_module_index;
- APPL_TRACE_DEBUG1("bta_sys_hw_evt_disabled - module 0x%X", p_sys_hw_msg->hw_module);
+ APPL_TRACE_DEBUG("bta_sys_hw_evt_disabled - module 0x%X", p_sys_hw_msg->hw_module);
for (hw_module_index = 0; hw_module_index < BTA_SYS_MAX_HW_MODULES; hw_module_index++)
{
@@ -467,7 +467,7 @@
UINT8 hw_module_index;
UNUSED(p_sys_hw_msg);
- APPL_TRACE_DEBUG0(" bta_sys_hw_evt_stack_enabled!notify the callers");
+ APPL_TRACE_DEBUG(" bta_sys_hw_evt_stack_enabled!notify the callers");
for (hw_module_index = 0; hw_module_index < BTA_SYS_MAX_HW_MODULES; hw_module_index++ )
{
@@ -494,7 +494,7 @@
UINT8 id;
BOOLEAN freebuf = TRUE;
- APPL_TRACE_EVENT1("BTA got event 0x%x", p_msg->event);
+ APPL_TRACE_EVENT("BTA got event 0x%x", p_msg->event);
/* get subsystem id from event */
id = (UINT8) (p_msg->event >> 8);
@@ -506,7 +506,7 @@
}
else
{
- APPL_TRACE_WARNING1("BTA got unregistered event id %d", id);
+ APPL_TRACE_WARNING("BTA got unregistered event id %d", id);
}
if (freebuf)
@@ -642,7 +642,7 @@
int bta_id = 0;
int bta_id_max = 0;
- APPL_TRACE_DEBUG1("bta_sys_disable: module %i", module);
+ APPL_TRACE_DEBUG("bta_sys_disable: module %i", module);
switch( module )
{
@@ -663,7 +663,7 @@
bta_id_max = BTA_ID_GPS;
break;
default:
- APPL_TRACE_WARNING0("bta_sys_disable: unkown module");
+ APPL_TRACE_WARNING("bta_sys_disable: unkown module");
return;
}
diff --git a/bta/sys/ptim.c b/bta/sys/ptim.c
index 9dffc66..cc69349 100644
--- a/bta/sys/ptim.c
+++ b/bta/sys/ptim.c
@@ -137,6 +137,7 @@
p_tle->event = type;
p_tle->ticks = timeout;
+ p_tle->ticks_initial = timeout;
GKI_add_to_timer_list(&p_cb->timer_queue, p_tle);
}
diff --git a/btif/co/bta_ag_co.c b/btif/co/bta_ag_co.c
old mode 100644
new mode 100755
index 9c6de7d..13c1aff
--- a/btif/co/bta_ag_co.c
+++ b/btif/co/bta_ag_co.c
@@ -37,6 +37,11 @@
#endif
+/************************************************************************************
+** Externs
+************************************************************************************/
+extern int set_audio_state(UINT16 handle, UINT16 codec, UINT8 state, void *param);
+
/*******************************************************************************
**
** Function bta_ag_co_init
@@ -69,14 +74,53 @@
** BTA_AG_CO_AUD_STATE_OFF_XFER - Audio has been turned off (xfer)
** BTA_AG_CO_AUD_STATE_ON - Audio has been turned on
** BTA_AG_CO_AUD_STATE_SETUP - Audio is about to be turned on
+** codec - if WBS support is compiled in, codec to going to be used is provided
+** and when in BTA_AG_CO_AUD_STATE_SETUP, BTM_I2SPCMConfig() must be called with
+** the correct platform parameters.
+** in the other states codec type should not be ignored
**
** Returns void
**
*******************************************************************************/
+#if (BTM_WBS_INCLUDED == TRUE )
+void bta_ag_co_audio_state(UINT16 handle, UINT8 app_id, UINT8 state, tBTA_AG_PEER_CODEC codec)
+#else
void bta_ag_co_audio_state(UINT16 handle, UINT8 app_id, UINT8 state)
+#endif
{
- UNUSED(app_id);
- BTIF_TRACE_DEBUG2("bta_ag_co_audio_state: handle %d, state %d", handle, state);
+ BTIF_TRACE_DEBUG("bta_ag_co_audio_state: handle %d, state %d", handle, state);
+ switch (state)
+ {
+ case BTA_AG_CO_AUD_STATE_OFF:
+#if (BTM_WBS_INCLUDED == TRUE )
+ BTIF_TRACE_DEBUG("bta_ag_co_audio_state(handle %d)::Closed (OFF), codec: 0x%x",
+ handle, codec);
+ set_audio_state(handle, codec, state, NULL);
+#else
+ BTIF_TRACE_DEBUG("bta_ag_co_audio_state(handle %d)::Closed (OFF)",
+ handle);
+#endif
+ break;
+ case BTA_AG_CO_AUD_STATE_OFF_XFER:
+ BTIF_TRACE_DEBUG("bta_ag_co_audio_state(handle %d)::Closed (XFERRING)", handle);
+ break;
+ case BTA_AG_CO_AUD_STATE_SETUP:
+#if (BTM_WBS_INCLUDED == TRUE )
+ set_audio_state(handle, codec, state, NULL);
+#else
+ set_audio_state(handle, BTA_AG_CODEC_CVSD, state, NULL);
+#endif
+ break;
+ default:
+ break;
+ }
+#if (BTM_WBS_INCLUDED == TRUE )
+ APPL_TRACE_DEBUG("bta_ag_co_audio_state(handle %d, app_id: %d, state %d, codec: 0x%x)",
+ handle, app_id, state, codec);
+#else
+ APPL_TRACE_DEBUG("bta_ag_co_audio_state(handle %d, app_id: %d, state %d)", \
+ handle, app_id, state);
+#endif
}
@@ -95,7 +139,7 @@
*******************************************************************************/
void bta_ag_co_data_open(UINT16 handle, tBTA_SERVICE_ID service)
{
- BTIF_TRACE_DEBUG2("bta_ag_co_data_open handle:%d service:%d", handle, service);
+ BTIF_TRACE_DEBUG("bta_ag_co_data_open handle:%d service:%d", handle, service);
}
/*******************************************************************************
@@ -111,7 +155,7 @@
*******************************************************************************/
void bta_ag_co_data_close(UINT16 handle)
{
- BTIF_TRACE_DEBUG1("bta_ag_co_data_close handle:%d", handle);
+ BTIF_TRACE_DEBUG("bta_ag_co_data_close handle:%d", handle);
}
@@ -130,6 +174,6 @@
void bta_ag_co_tx_write(UINT16 handle, UINT8 * p_data, UINT16 len)
{
UNUSED(p_data);
- BTIF_TRACE_DEBUG2( "bta_ag_co_tx_write: handle: %d, len: %d", handle, len );
+ BTIF_TRACE_DEBUG( "bta_ag_co_tx_write: handle: %d, len: %d", handle, len );
}
diff --git a/btif/co/bta_av_co.c b/btif/co/bta_av_co.c
index fecf621..985d39f 100644
--- a/btif/co/bta_av_co.c
+++ b/btif/co/bta_av_co.c
@@ -42,7 +42,7 @@
** Constants
*****************************************************************************/
-#define FUNC_TRACE() APPL_TRACE_DEBUG1("%s", __FUNCTION__);
+#define FUNC_TRACE() APPL_TRACE_DEBUG("%s", __FUNCTION__);
/* Macro to retrieve the number of elements in a statically allocated array */
#define BTA_AV_CO_NUM_ELEMENTS(__a) (sizeof(__a)/sizeof((__a)[0]))
@@ -67,7 +67,7 @@
/* SCMS-T protect info */
const UINT8 bta_av_co_cp_scmst[BTA_AV_CP_INFO_LEN] = "\x02\x02\x00";
-/* SBC codec capabilities */
+/* SBC SRC codec capabilities */
const tA2D_SBC_CIE bta_av_co_sbc_caps =
{
(A2D_SBC_IE_SAMP_FREQ_44), /* samp_freq */
@@ -79,6 +79,18 @@
A2D_SBC_IE_MIN_BITPOOL /* min_bitpool */
};
+/* SBC SINK codec capabilities */
+const tA2D_SBC_CIE bta_av_co_sbc_sink_caps =
+{
+ (A2D_SBC_IE_SAMP_FREQ_48 | A2D_SBC_IE_SAMP_FREQ_44), /* samp_freq */
+ (A2D_SBC_IE_CH_MD_MONO | A2D_SBC_IE_CH_MD_STEREO | A2D_SBC_IE_CH_MD_JOINT | A2D_SBC_IE_CH_MD_DUAL), /* ch_mode */
+ (A2D_SBC_IE_BLOCKS_16 | A2D_SBC_IE_BLOCKS_12 | A2D_SBC_IE_BLOCKS_8 | A2D_SBC_IE_BLOCKS_4), /* block_len */
+ (A2D_SBC_IE_SUBBAND_4 | A2D_SBC_IE_SUBBAND_8), /* num_subbands */
+ (A2D_SBC_IE_ALLOC_MD_L | A2D_SBC_IE_ALLOC_MD_S), /* alloc_mthd */
+ A2D_SBC_IE_MAX_BITPOOL, /* max_bitpool */
+ A2D_SBC_IE_MIN_BITPOOL /* min_bitpool */
+};
+
#if !defined(BTIF_AV_SBC_DEFAULT_SAMP_FREQ)
#define BTIF_AV_SBC_DEFAULT_SAMP_FREQ A2D_SBC_IE_SAMP_FREQ_44
#endif
@@ -113,17 +125,23 @@
{
BD_ADDR addr; /* address of audio/video peer */
tBTA_AV_CO_SINK snks[BTIF_SV_AV_AA_SEP_INDEX]; /* array of supported sinks */
+ tBTA_AV_CO_SINK srcs[BTIF_SV_AV_AA_SEP_INDEX]; /* array of supported srcs */
UINT8 num_snks; /* total number of sinks at peer */
+ UINT8 num_srcs; /* total number of srcs at peer */
UINT8 num_seps; /* total number of seids at peer */
UINT8 num_rx_snks; /* number of received sinks */
+ UINT8 num_rx_srcs; /* number of received srcs */
UINT8 num_sup_snks; /* number of supported sinks in the snks array */
+ UINT8 num_sup_srcs; /* number of supported srcs in the srcs array */
tBTA_AV_CO_SINK *p_snk; /* currently selected sink */
+ tBTA_AV_CO_SINK *p_src; /* currently selected src */
UINT8 codec_cfg[AVDT_CODEC_SIZE]; /* current codec configuration */
BOOLEAN cp_active; /* current CP configuration */
BOOLEAN acp; /* acceptor */
BOOLEAN recfg_needed; /* reconfiguration is needed */
BOOLEAN opened; /* opened */
UINT16 mtu; /* maximum transmit unit size */
+ UINT16 uuid_to_connect; /* uuid of peer device */
} tBTA_AV_CO_PEER;
typedef struct
@@ -152,7 +170,8 @@
static BOOLEAN bta_av_co_audio_sink_has_scmst(const tBTA_AV_CO_SINK *p_sink);
static BOOLEAN bta_av_co_audio_peer_supports_codec(tBTA_AV_CO_PEER *p_peer, UINT8 *p_snk_index);
static BOOLEAN bta_av_co_audio_media_supports_config(UINT8 codec_type, const UINT8 *p_codec_cfg);
-
+static BOOLEAN bta_av_co_audio_sink_supports_config(UINT8 codec_type, const UINT8 *p_codec_cfg);
+static BOOLEAN bta_av_co_audio_peer_src_supports_codec(tBTA_AV_CO_PEER *p_peer, UINT8 *p_src_index);
@@ -235,7 +254,7 @@
/* Sanity check */
if (index >= BTA_AV_CO_NUM_ELEMENTS(bta_av_co_cb.peers))
{
- APPL_TRACE_ERROR1("bta_av_co_get_peer peer index out of bounds:%d", index);
+ APPL_TRACE_ERROR("bta_av_co_get_peer peer index out of bounds:%d", index);
return NULL;
}
@@ -260,7 +279,7 @@
{
FUNC_TRACE();
- APPL_TRACE_DEBUG1("bta_av_co_audio_init: %d", index);
+ APPL_TRACE_DEBUG("bta_av_co_audio_init: %d", index);
#if defined(BTA_AV_CO_CP_SCMS_T) && (BTA_AV_CO_CP_SCMS_T == TRUE)
{
@@ -284,7 +303,7 @@
switch (index)
{
case BTIF_SV_AV_AA_SBC_INDEX:
- /* Set up for SBC codec */
+ /* Set up for SBC codec for SRC*/
*p_codec_type = BTA_AV_CODEC_SBC;
/* This should not fail because we are using constants for parameters */
@@ -292,8 +311,16 @@
/* Codec is valid */
return TRUE;
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+ case BTIF_SV_AV_AA_SBC_SINK_INDEX:
+ *p_codec_type = BTA_AV_CODEC_SBC;
+ /* This should not fail because we are using constants for parameters */
+ A2D_BldSbcInfo(AVDT_MEDIA_AUDIO, (tA2D_SBC_CIE *) &bta_av_co_sbc_sink_caps, p_codec_info);
+ /* Codec is valid */
+ return TRUE;
+#endif
default:
/* Not valid */
return FALSE;
@@ -313,39 +340,246 @@
**
*******************************************************************************/
BTA_API void bta_av_co_audio_disc_res(tBTA_AV_HNDL hndl, UINT8 num_seps, UINT8 num_snk,
- BD_ADDR addr)
+ UINT8 num_src, BD_ADDR addr, UINT16 uuid_local)
{
tBTA_AV_CO_PEER *p_peer;
FUNC_TRACE();
- APPL_TRACE_DEBUG3("bta_av_co_audio_disc_res h:x%x num_seps:%d num_snk:%d",
- hndl, num_seps, num_snk);
+ APPL_TRACE_DEBUG("bta_av_co_audio_disc_res h:x%x num_seps:%d num_snk:%d num_src:%d",
+ hndl, num_seps, num_snk, num_src);
/* Find the peer info */
p_peer = bta_av_co_get_peer(hndl);
if (p_peer == NULL)
{
- APPL_TRACE_ERROR0("bta_av_co_audio_disc_res could not find peer entry");
+ APPL_TRACE_ERROR("bta_av_co_audio_disc_res could not find peer entry");
return;
}
/* Sanity check : this should never happen */
if (p_peer->opened)
{
- APPL_TRACE_ERROR0("bta_av_co_audio_disc_res peer already opened");
+ APPL_TRACE_ERROR("bta_av_co_audio_disc_res peer already opened");
}
/* Copy the discovery results */
bdcpy(p_peer->addr, addr);
p_peer->num_snks = num_snk;
+ p_peer->num_srcs = num_src;
p_peer->num_seps = num_seps;
p_peer->num_rx_snks = 0;
+ p_peer->num_rx_srcs = 0;
p_peer->num_sup_snks = 0;
+ if (uuid_local == UUID_SERVCLASS_AUDIO_SINK)
+ p_peer->uuid_to_connect = UUID_SERVCLASS_AUDIO_SOURCE;
+ else if (uuid_local == UUID_SERVCLASS_AUDIO_SOURCE)
+ p_peer->uuid_to_connect = UUID_SERVCLASS_AUDIO_SINK;
}
/*******************************************************************************
**
+ ** Function bta_av_build_src_cfg
+ **
+ ** Description This function will build preferred config from src capabilities
+ **
+ **
+ ** Returns Pass or Fail for current getconfig.
+ **
+ *******************************************************************************/
+void bta_av_build_src_cfg (UINT8 *p_pref_cfg, UINT8 *p_src_cap)
+{
+ tA2D_SBC_CIE src_cap;
+ tA2D_SBC_CIE pref_cap;
+ UINT8 status = 0;
+
+ /* initialize it to default SBC configuration */
+ A2D_BldSbcInfo(AVDT_MEDIA_AUDIO, (tA2D_SBC_CIE *) &btif_av_sbc_default_config, p_pref_cfg);
+ /* now try to build a preferred one */
+ /* parse configuration */
+ if ((status = A2D_ParsSbcInfo(&src_cap, p_src_cap, TRUE)) != 0)
+ {
+ APPL_TRACE_DEBUG(" Cant parse src cap ret = %d", status);
+ return ;
+ }
+
+ if (src_cap.samp_freq & A2D_SBC_IE_SAMP_FREQ_48)
+ pref_cap.samp_freq = A2D_SBC_IE_SAMP_FREQ_48;
+ else if (src_cap.samp_freq & A2D_SBC_IE_SAMP_FREQ_44)
+ pref_cap.samp_freq = A2D_SBC_IE_SAMP_FREQ_44;
+
+ if (src_cap.ch_mode & A2D_SBC_IE_CH_MD_JOINT)
+ pref_cap.ch_mode = A2D_SBC_IE_CH_MD_JOINT;
+ else if (src_cap.ch_mode & A2D_SBC_IE_CH_MD_STEREO)
+ pref_cap.ch_mode = A2D_SBC_IE_CH_MD_STEREO;
+ else if (src_cap.ch_mode & A2D_SBC_IE_CH_MD_DUAL)
+ pref_cap.ch_mode = A2D_SBC_IE_CH_MD_DUAL;
+ else if (src_cap.ch_mode & A2D_SBC_IE_CH_MD_MONO)
+ pref_cap.ch_mode = A2D_SBC_IE_CH_MD_MONO;
+
+ if (src_cap.block_len & A2D_SBC_IE_BLOCKS_16)
+ pref_cap.block_len = A2D_SBC_IE_BLOCKS_16;
+ else if (src_cap.block_len & A2D_SBC_IE_BLOCKS_12)
+ pref_cap.block_len = A2D_SBC_IE_BLOCKS_12;
+ else if (src_cap.block_len & A2D_SBC_IE_BLOCKS_8)
+ pref_cap.block_len = A2D_SBC_IE_BLOCKS_8;
+ else if (src_cap.block_len & A2D_SBC_IE_BLOCKS_4)
+ pref_cap.block_len = A2D_SBC_IE_BLOCKS_4;
+
+ if (src_cap.num_subbands & A2D_SBC_IE_SUBBAND_8)
+ pref_cap.num_subbands = A2D_SBC_IE_SUBBAND_8;
+ else if(src_cap.num_subbands & A2D_SBC_IE_SUBBAND_4)
+ pref_cap.num_subbands = A2D_SBC_IE_SUBBAND_4;
+
+ if (src_cap.alloc_mthd & A2D_SBC_IE_ALLOC_MD_L)
+ pref_cap.alloc_mthd = A2D_SBC_IE_ALLOC_MD_L;
+ else if(src_cap.alloc_mthd & A2D_SBC_IE_ALLOC_MD_S)
+ pref_cap.alloc_mthd = A2D_SBC_IE_ALLOC_MD_S;
+
+ pref_cap.max_bitpool = src_cap.max_bitpool;
+ pref_cap.min_bitpool = src_cap.min_bitpool;
+
+ A2D_BldSbcInfo(AVDT_MEDIA_AUDIO, (tA2D_SBC_CIE *) &pref_cap, p_pref_cfg);
+}
+
+/*******************************************************************************
+ **
+ ** Function bta_av_audio_sink_getconfig
+ **
+ ** Description This callout function is executed by AV to retrieve the
+ ** desired codec and content protection configuration for the
+ ** A2DP Sink audio stream in Initiator.
+ **
+ **
+ ** Returns Pass or Fail for current getconfig.
+ **
+ *******************************************************************************/
+UINT8 bta_av_audio_sink_getconfig(tBTA_AV_HNDL hndl, tBTA_AV_CODEC codec_type,
+ UINT8 *p_codec_info, UINT8 *p_sep_info_idx, UINT8 seid, UINT8 *p_num_protect,
+ UINT8 *p_protect_info)
+{
+
+ UINT8 result = A2D_FAIL;
+ BOOLEAN supported;
+ tBTA_AV_CO_PEER *p_peer;
+ tBTA_AV_CO_SINK *p_src;
+ UINT8 codec_cfg[AVDT_CODEC_SIZE];
+ UINT8 pref_cfg[AVDT_CODEC_SIZE];
+ UINT8 index;
+
+ FUNC_TRACE();
+
+ APPL_TRACE_DEBUG("bta_av_audio_sink_getconfig handle:0x%x codec_type:%d seid:%d",
+ hndl, codec_type, seid);
+ APPL_TRACE_DEBUG("num_protect:0x%02x protect_info:0x%02x%02x%02x",
+ *p_num_protect, p_protect_info[0], p_protect_info[1], p_protect_info[2]);
+
+ /* Retrieve the peer info */
+ p_peer = bta_av_co_get_peer(hndl);
+ if (p_peer == NULL)
+ {
+ APPL_TRACE_ERROR("bta_av_audio_sink_getconfig could not find peer entry");
+ return A2D_FAIL;
+ }
+
+ APPL_TRACE_DEBUG("bta_av_audio_sink_getconfig peer(o=%d,n_snks=%d,n_rx_snks=%d,n_sup_snks=%d)",
+ p_peer->opened, p_peer->num_srcs, p_peer->num_rx_srcs, p_peer->num_sup_srcs);
+
+ p_peer->num_rx_srcs++;
+
+ /* Check if this is a supported configuration */
+ supported = FALSE;
+ switch (codec_type)
+ {
+ case BTA_AV_CODEC_SBC:
+ supported = TRUE;
+ break;
+
+ default:
+ break;
+ }
+
+ if (supported)
+ {
+ /* If there is room for a new one */
+ if (p_peer->num_sup_srcs < BTA_AV_CO_NUM_ELEMENTS(p_peer->srcs))
+ {
+ p_src = &p_peer->srcs[p_peer->num_sup_srcs++];
+
+ APPL_TRACE_DEBUG("bta_av_audio_sink_getconfig saved caps[%x:%x:%x:%x:%x:%x]",
+ p_codec_info[1], p_codec_info[2], p_codec_info[3],
+ p_codec_info[4], p_codec_info[5], p_codec_info[6]);
+
+ memcpy(p_src->codec_caps, p_codec_info, AVDT_CODEC_SIZE);
+ p_src->codec_type = codec_type;
+ p_src->sep_info_idx = *p_sep_info_idx;
+ p_src->seid = seid;
+ p_src->num_protect = *p_num_protect;
+ memcpy(p_src->protect_info, p_protect_info, BTA_AV_CP_INFO_LEN);
+ }
+ else
+ {
+ APPL_TRACE_ERROR("bta_av_audio_sink_getconfig no more room for SRC info");
+ }
+ }
+
+ /* If last SNK get capabilities or all supported codec caps retrieved */
+ if ((p_peer->num_rx_srcs == p_peer->num_srcs) ||
+ (p_peer->num_sup_srcs == BTA_AV_CO_NUM_ELEMENTS(p_peer->srcs)))
+ {
+ APPL_TRACE_DEBUG("bta_av_audio_sink_getconfig last SRC reached");
+
+ /* Protect access to bta_av_co_cb.codec_cfg */
+ GKI_disable();
+
+ /* Find a src that matches the codec config */
+ if (bta_av_co_audio_peer_src_supports_codec(p_peer, &index))
+ {
+ APPL_TRACE_DEBUG(" Codec Supported ");
+ p_src = &p_peer->srcs[index];
+
+ /* Build the codec configuration for this sink */
+ {
+ /* Save the new configuration */
+ p_peer->p_src = p_src;
+ /* get preferred config from src_caps */
+ bta_av_build_src_cfg(pref_cfg, p_src->codec_caps);
+ memcpy(p_peer->codec_cfg, pref_cfg, AVDT_CODEC_SIZE);
+
+ APPL_TRACE_DEBUG("bta_av_audio_sink_getconfig p_codec_info[%x:%x:%x:%x:%x:%x]",
+ p_peer->codec_cfg[1], p_peer->codec_cfg[2], p_peer->codec_cfg[3],
+ p_peer->codec_cfg[4], p_peer->codec_cfg[5], p_peer->codec_cfg[6]);
+ /* By default, no content protection */
+ *p_num_protect = 0;
+
+#if defined(BTA_AV_CO_CP_SCMS_T) && (BTA_AV_CO_CP_SCMS_T == TRUE)
+ /* Check if this sink supports SCMS */
+ if (bta_av_co_audio_sink_has_scmst(p_sink))
+ {
+ p_peer->cp_active = TRUE;
+ bta_av_co_cb.cp.active = TRUE;
+ *p_num_protect = BTA_AV_CP_INFO_LEN;
+ memcpy(p_protect_info, bta_av_co_cp_scmst, BTA_AV_CP_INFO_LEN);
+ }
+ else
+ {
+ p_peer->cp_active = FALSE;
+ bta_av_co_cb.cp.active = FALSE;
+ }
+#endif
+
+ *p_sep_info_idx = p_src->sep_info_idx;
+ memcpy(p_codec_info, p_peer->codec_cfg, AVDT_CODEC_SIZE);
+ result = A2D_SUCCESS;
+ }
+ }
+ /* Protect access to bta_av_co_cb.codec_cfg */
+ GKI_enable();
+ }
+ return result;
+}
+/*******************************************************************************
+ **
** Function bta_av_co_audio_getconfig
**
** Description This callout function is executed by AV to retrieve the
@@ -370,22 +604,28 @@
FUNC_TRACE();
- APPL_TRACE_DEBUG3("bta_av_co_audio_getconfig handle:0x%x codec_type:%d seid:%d", hndl, codec_type, seid);
- APPL_TRACE_DEBUG4("num_protect:0x%02x protect_info:0x%02x%02x%02x",
- *p_num_protect, p_protect_info[0], p_protect_info[1], p_protect_info[2]);
-
/* Retrieve the peer info */
p_peer = bta_av_co_get_peer(hndl);
if (p_peer == NULL)
{
- APPL_TRACE_ERROR0("bta_av_co_audio_getconfig could not find peer entry");
+ APPL_TRACE_ERROR("bta_av_co_audio_getconfig could not find peer entry");
return A2D_FAIL;
}
- APPL_TRACE_DEBUG4("bta_av_co_audio_getconfig peer(o=%d,n_snks=%d,n_rx_snks=%d,n_sup_snks=%d)",
+ if (p_peer->uuid_to_connect == UUID_SERVCLASS_AUDIO_SOURCE)
+ {
+ result = bta_av_audio_sink_getconfig(hndl, codec_type, p_codec_info, p_sep_info_idx,
+ seid, p_num_protect, p_protect_info);
+ return result;
+ }
+ APPL_TRACE_DEBUG("bta_av_co_audio_getconfig handle:0x%x codec_type:%d seid:%d",
+ hndl, codec_type, seid);
+ APPL_TRACE_DEBUG("num_protect:0x%02x protect_info:0x%02x%02x%02x",
+ *p_num_protect, p_protect_info[0], p_protect_info[1], p_protect_info[2]);
+
+ APPL_TRACE_DEBUG("bta_av_co_audio_getconfig peer(o=%d,n_snks=%d,n_rx_snks=%d,n_sup_snks=%d)",
p_peer->opened, p_peer->num_snks, p_peer->num_rx_snks, p_peer->num_sup_snks);
- /* Increment the number of received sinks capabilities */
p_peer->num_rx_snks++;
/* Check if this is a supported configuration */
@@ -407,7 +647,7 @@
{
p_sink = &p_peer->snks[p_peer->num_sup_snks++];
- APPL_TRACE_DEBUG6("bta_av_co_audio_getconfig saved caps[%x:%x:%x:%x:%x:%x]",
+ APPL_TRACE_DEBUG("bta_av_co_audio_getconfig saved caps[%x:%x:%x:%x:%x:%x]",
p_codec_info[1], p_codec_info[2], p_codec_info[3],
p_codec_info[4], p_codec_info[5], p_codec_info[6]);
@@ -420,7 +660,7 @@
}
else
{
- APPL_TRACE_ERROR0("bta_av_co_audio_getconfig no more room for SNK info");
+ APPL_TRACE_ERROR("bta_av_co_audio_getconfig no more room for SNK info");
}
}
@@ -428,7 +668,7 @@
if ((p_peer->num_rx_snks == p_peer->num_snks) ||
(p_peer->num_sup_snks == BTA_AV_CO_NUM_ELEMENTS(p_peer->snks)))
{
- APPL_TRACE_DEBUG0("bta_av_co_audio_getconfig last sink reached");
+ APPL_TRACE_DEBUG("bta_av_co_audio_getconfig last sink reached");
/* Protect access to bta_av_co_cb.codec_cfg */
GKI_disable();
@@ -440,7 +680,7 @@
if (p_peer->acp)
{
*p_sep_info_idx = p_peer->num_seps;
- APPL_TRACE_EVENT0("no need to fetch more SEPs");
+ APPL_TRACE_EVENT("no need to fetch more SEPs");
}
p_sink = &p_peer->snks[index];
@@ -448,7 +688,7 @@
/* Build the codec configuration for this sink */
if (bta_av_co_audio_codec_build_config(p_sink->codec_caps, codec_cfg))
{
- APPL_TRACE_DEBUG6("bta_av_co_audio_getconfig reconfig p_codec_info[%x:%x:%x:%x:%x:%x]",
+ APPL_TRACE_DEBUG("bta_av_co_audio_getconfig reconfig p_codec_info[%x:%x:%x:%x:%x:%x]",
codec_cfg[1], codec_cfg[2], codec_cfg[3],
codec_cfg[4], codec_cfg[5], codec_cfg[6]);
@@ -480,7 +720,7 @@
{
if (p_peer->recfg_needed)
{
- APPL_TRACE_DEBUG1("bta_av_co_audio_getconfig call BTA_AvReconfig(x%x)", hndl);
+ APPL_TRACE_DEBUG("bta_av_co_audio_getconfig call BTA_AvReconfig(x%x)", hndl);
BTA_AvReconfig(hndl, TRUE, p_sink->sep_info_idx, p_peer->codec_cfg, *p_num_protect, (UINT8 *)bta_av_co_cp_scmst);
}
}
@@ -510,39 +750,43 @@
**
*******************************************************************************/
BTA_API void bta_av_co_audio_setconfig(tBTA_AV_HNDL hndl, tBTA_AV_CODEC codec_type,
- UINT8 *p_codec_info, UINT8 seid, BD_ADDR addr, UINT8 num_protect, UINT8 *p_protect_info)
+ UINT8 *p_codec_info, UINT8 seid, BD_ADDR addr, UINT8 num_protect, UINT8 *p_protect_info,
+ UINT8 t_local_sep, UINT8 avdt_handle)
{
tBTA_AV_CO_PEER *p_peer;
UINT8 status = A2D_SUCCESS;
UINT8 category = A2D_SUCCESS;
BOOLEAN recfg_needed = FALSE;
+ BOOLEAN codec_cfg_supported = FALSE;
UNUSED(seid);
UNUSED(addr);
FUNC_TRACE();
- APPL_TRACE_DEBUG6("bta_av_co_audio_setconfig p_codec_info[%x:%x:%x:%x:%x:%x]",
+ APPL_TRACE_DEBUG("bta_av_co_audio_setconfig p_codec_info[%x:%x:%x:%x:%x:%x]",
p_codec_info[1], p_codec_info[2], p_codec_info[3],
p_codec_info[4], p_codec_info[5], p_codec_info[6]);
- APPL_TRACE_DEBUG4("num_protect:0x%02x protect_info:0x%02x%02x%02x",
+ APPL_TRACE_DEBUG("num_protect:0x%02x protect_info:0x%02x%02x%02x",
num_protect, p_protect_info[0], p_protect_info[1], p_protect_info[2]);
/* Retrieve the peer info */
p_peer = bta_av_co_get_peer(hndl);
if (p_peer == NULL)
{
- APPL_TRACE_ERROR0("bta_av_co_audio_setconfig could not find peer entry");
+ APPL_TRACE_ERROR("bta_av_co_audio_setconfig could not find peer entry");
/* Call call-in rejecting the configuration */
- bta_av_ci_setconfig(hndl, A2D_BUSY, AVDT_ASC_CODEC, 0, NULL, FALSE);
+ bta_av_ci_setconfig(hndl, A2D_BUSY, AVDT_ASC_CODEC, 0, NULL, FALSE, avdt_handle);
return;
}
+ APPL_TRACE_DEBUG("bta_av_co_audio_setconfig peer(o=%d,n_snks=%d,n_rx_snks=%d,n_sup_snks=%d)",
+ p_peer->opened, p_peer->num_snks, p_peer->num_rx_snks, p_peer->num_sup_snks);
/* Sanity check: should not be opened at this point */
if (p_peer->opened)
{
- APPL_TRACE_ERROR0("bta_av_co_audio_setconfig peer already in use");
+ APPL_TRACE_ERROR("bta_av_co_audio_setconfig peer already in use");
}
#if defined(BTA_AV_CO_CP_SCMS_T) && (BTA_AV_CO_CP_SCMS_T == TRUE)
@@ -552,7 +796,7 @@
if ((num_protect != 1) ||
(bta_av_co_cp_is_scmst(p_protect_info) == FALSE))
{
- APPL_TRACE_ERROR0("bta_av_co_audio_setconfig wrong CP configuration");
+ APPL_TRACE_ERROR("bta_av_co_audio_setconfig wrong CP configuration");
status = A2D_BAD_CP_TYPE;
category = AVDT_ASC_PROTECT;
}
@@ -561,16 +805,27 @@
/* Do not support content protection for the time being */
if (num_protect != 0)
{
- APPL_TRACE_ERROR0("bta_av_co_audio_setconfig wrong CP configuration");
+ APPL_TRACE_ERROR("bta_av_co_audio_setconfig wrong CP configuration");
status = A2D_BAD_CP_TYPE;
category = AVDT_ASC_PROTECT;
}
#endif
if (status == A2D_SUCCESS)
{
- /* Check if codec configuration is supported */
- if (bta_av_co_audio_media_supports_config(codec_type, p_codec_info))
+ if(AVDT_TSEP_SNK == t_local_sep)
{
+ codec_cfg_supported = bta_av_co_audio_sink_supports_config(codec_type, p_codec_info);
+ APPL_TRACE_DEBUG(" Peer is A2DP SRC ");
+ }
+ if(AVDT_TSEP_SRC == t_local_sep)
+ {
+ codec_cfg_supported = bta_av_co_audio_media_supports_config(codec_type, p_codec_info);
+ APPL_TRACE_DEBUG(" Peer is A2DP SINK ");
+ }
+ /* Check if codec configuration is supported */
+ if (codec_cfg_supported)
+ {
+
/* Protect access to bta_av_co_cb.codec_cfg */
GKI_disable();
@@ -589,17 +844,24 @@
/* if remote side requests a restricted notify sinks preferred bitpool range as all other params are
already checked for validify */
- APPL_TRACE_EVENT2("remote peer setconfig bitpool range [%d:%d]",
+ APPL_TRACE_EVENT("remote peer setconfig bitpool range [%d:%d]",
p_codec_info[BTA_AV_CO_SBC_MIN_BITPOOL_OFF],
p_codec_info[BTA_AV_CO_SBC_MAX_BITPOOL_OFF] );
bta_av_co_cb.codec_cfg_setconfig.id = BTIF_AV_CODEC_SBC;
memcpy(bta_av_co_cb.codec_cfg_setconfig.info, p_codec_info, AVDT_CODEC_SIZE);
+ if(AVDT_TSEP_SNK == t_local_sep)
+ {
+ /* If Peer is SRC, and our cfg subset matches with what is requested by peer, then
+ just accept what peer wants */
+ memcpy(bta_av_co_cb.codec_cfg.info, p_codec_info, AVDT_CODEC_SIZE);
+ recfg_needed = FALSE;
+ }
break;
default:
- APPL_TRACE_ERROR1("bta_av_co_audio_setconfig unsupported cid %d", bta_av_co_cb.codec_cfg.id);
+ APPL_TRACE_ERROR("bta_av_co_audio_setconfig unsupported cid %d", bta_av_co_cb.codec_cfg.id);
recfg_needed = TRUE;
break;
}
@@ -615,10 +877,10 @@
if (status != A2D_SUCCESS)
{
- APPL_TRACE_DEBUG2("bta_av_co_audio_setconfig reject s=%d c=%d", status, category);
+ APPL_TRACE_DEBUG("bta_av_co_audio_setconfig reject s=%d c=%d", status, category);
/* Call call-in rejecting the configuration */
- bta_av_ci_setconfig(hndl, status, category, 0, NULL, FALSE);
+ bta_av_ci_setconfig(hndl, status, category, 0, NULL, FALSE, avdt_handle);
}
else
{
@@ -626,10 +888,10 @@
p_peer->acp = TRUE;
p_peer->recfg_needed = recfg_needed;
- APPL_TRACE_DEBUG1("bta_av_co_audio_setconfig accept reconf=%d", recfg_needed);
+ APPL_TRACE_DEBUG("bta_av_co_audio_setconfig accept reconf=%d", recfg_needed);
/* Call call-in accepting the configuration */
- bta_av_ci_setconfig(hndl, A2D_SUCCESS, A2D_SUCCESS, 0, NULL, recfg_needed);
+ bta_av_ci_setconfig(hndl, A2D_SUCCESS, A2D_SUCCESS, 0, NULL, recfg_needed, avdt_handle);
}
}
@@ -652,13 +914,13 @@
FUNC_TRACE();
- APPL_TRACE_DEBUG2("bta_av_co_audio_open mtu:%d codec_type:%d", mtu, codec_type);
+ APPL_TRACE_DEBUG("bta_av_co_audio_open mtu:%d codec_type:%d", mtu, codec_type);
/* Retrieve the peer info */
p_peer = bta_av_co_get_peer(hndl);
if (p_peer == NULL)
{
- APPL_TRACE_ERROR0("bta_av_co_audio_setconfig could not find peer entry");
+ APPL_TRACE_ERROR("bta_av_co_audio_setconfig could not find peer entry");
}
else
{
@@ -687,7 +949,7 @@
FUNC_TRACE();
- APPL_TRACE_DEBUG0("bta_av_co_audio_close");
+ APPL_TRACE_DEBUG("bta_av_co_audio_close");
/* Retrieve the peer info */
p_peer = bta_av_co_get_peer(hndl);
@@ -698,7 +960,7 @@
}
else
{
- APPL_TRACE_ERROR0("bta_av_co_audio_close could not find peer entry");
+ APPL_TRACE_ERROR("bta_av_co_audio_close could not find peer entry");
}
/* reset remote preference through setconfig */
@@ -726,7 +988,7 @@
FUNC_TRACE();
- APPL_TRACE_DEBUG0("bta_av_co_audio_start");
+ APPL_TRACE_DEBUG("bta_av_co_audio_start");
}
@@ -748,7 +1010,7 @@
FUNC_TRACE();
- APPL_TRACE_DEBUG0("bta_av_co_audio_stop");
+ APPL_TRACE_DEBUG("bta_av_co_audio_stop");
}
/*******************************************************************************
@@ -788,7 +1050,7 @@
default:
- APPL_TRACE_ERROR1("bta_av_co_audio_src_data_path Unsupported codec type (%d)", codec_type);
+ APPL_TRACE_ERROR("bta_av_co_audio_src_data_path Unsupported codec type (%d)", codec_type);
break;
}
#if defined(BTA_AV_CO_CP_SCMS_T) && (BTA_AV_CO_CP_SCMS_T == TRUE)
@@ -823,7 +1085,7 @@
{
FUNC_TRACE();
- APPL_TRACE_ERROR1("bta_av_co_audio_drop dropped: x%x", hndl);
+ APPL_TRACE_ERROR("bta_av_co_audio_drop dropped: x%x", hndl);
}
/*******************************************************************************
@@ -841,7 +1103,7 @@
{
FUNC_TRACE();
- APPL_TRACE_ERROR2("bta_av_co_audio_delay handle: x%x, delay:0x%x", hndl, delay);
+ APPL_TRACE_ERROR("bta_av_co_audio_delay handle: x%x, delay:0x%x", hndl, delay);
}
@@ -872,12 +1134,12 @@
p_codec_cfg[BTA_AV_CO_SBC_MIN_BITPOOL_OFF] = p_codec_caps[BTA_AV_CO_SBC_MIN_BITPOOL_OFF];
p_codec_cfg[BTA_AV_CO_SBC_MAX_BITPOOL_OFF] = p_codec_caps[BTA_AV_CO_SBC_MAX_BITPOOL_OFF];
- APPL_TRACE_EVENT2("bta_av_co_audio_codec_build_config : bitpool min %d, max %d",
+ APPL_TRACE_EVENT("bta_av_co_audio_codec_build_config : bitpool min %d, max %d",
p_codec_cfg[BTA_AV_CO_SBC_MIN_BITPOOL_OFF],
p_codec_caps[BTA_AV_CO_SBC_MAX_BITPOOL_OFF]);
break;
default:
- APPL_TRACE_ERROR1("bta_av_co_audio_codec_build_config: unsupported codec id %d", bta_av_co_cb.codec_cfg.id);
+ APPL_TRACE_ERROR("bta_av_co_audio_codec_build_config: unsupported codec id %d", bta_av_co_cb.codec_cfg.id);
return FALSE;
break;
}
@@ -901,7 +1163,7 @@
{
case BTIF_AV_CODEC_SBC:
- APPL_TRACE_EVENT4("bta_av_co_audio_codec_cfg_matches_caps : min %d/%d max %d/%d",
+ APPL_TRACE_EVENT("bta_av_co_audio_codec_cfg_matches_caps : min %d/%d max %d/%d",
p_codec_caps[BTA_AV_CO_SBC_MIN_BITPOOL_OFF],
p_codec_cfg[BTA_AV_CO_SBC_MIN_BITPOOL_OFF],
p_codec_caps[BTA_AV_CO_SBC_MAX_BITPOOL_OFF],
@@ -911,7 +1173,7 @@
if (!((p_codec_caps[BTA_AV_CO_SBC_FREQ_CHAN_OFF] & p_codec_cfg[BTA_AV_CO_SBC_FREQ_CHAN_OFF]) &&
(p_codec_caps[BTA_AV_CO_SBC_BLOCK_BAND_OFF] & p_codec_cfg[BTA_AV_CO_SBC_BLOCK_BAND_OFF])))
{
- APPL_TRACE_EVENT4("FALSE %x %x %x %x",
+ APPL_TRACE_EVENT("FALSE %x %x %x %x",
p_codec_caps[BTA_AV_CO_SBC_FREQ_CHAN_OFF],
p_codec_cfg[BTA_AV_CO_SBC_FREQ_CHAN_OFF],
p_codec_caps[BTA_AV_CO_SBC_BLOCK_BAND_OFF],
@@ -922,11 +1184,11 @@
default:
- APPL_TRACE_ERROR1("bta_av_co_audio_codec_cfg_matches_caps: unsupported codec id %d", codec_id);
+ APPL_TRACE_ERROR("bta_av_co_audio_codec_cfg_matches_caps: unsupported codec id %d", codec_id);
return FALSE;
break;
}
- APPL_TRACE_EVENT0("TRUE");
+ APPL_TRACE_EVENT("TRUE");
return TRUE;
}
@@ -984,7 +1246,7 @@
STREAM_TO_UINT16(cp_id, p_protectinfo);
if (cp_id == BTA_AV_CP_SCMS_T_ID)
{
- APPL_TRACE_DEBUG0("bta_av_co_cp_is_scmst: SCMS-T found");
+ APPL_TRACE_DEBUG("bta_av_co_cp_is_scmst: SCMS-T found");
return TRUE;
}
}
@@ -1022,7 +1284,7 @@
/* Decrement the SC counter */
index--;
}
- APPL_TRACE_DEBUG0("bta_av_co_audio_sink_has_scmst: SCMS-T not found");
+ APPL_TRACE_DEBUG("bta_av_co_audio_sink_has_scmst: SCMS-T not found");
return FALSE;
}
@@ -1046,7 +1308,7 @@
}
else
{
- APPL_TRACE_DEBUG0("bta_av_co_audio_sink_supports_cp: not required");
+ APPL_TRACE_DEBUG("bta_av_co_audio_sink_supports_cp: not required");
return TRUE;
}
}
@@ -1083,7 +1345,7 @@
default:
- APPL_TRACE_ERROR1("bta_av_co_audio_peer_supports_codec: unsupported codec id %d", bta_av_co_cb.codec_cfg.id);
+ APPL_TRACE_ERROR("bta_av_co_audio_peer_supports_codec: unsupported codec id %d", bta_av_co_cb.codec_cfg.id);
return FALSE;
break;
}
@@ -1094,13 +1356,89 @@
/*******************************************************************************
**
- ** Function bta_av_co_audio_media_supports_config
+ ** Function bta_av_co_audio_peer_src_supports_codec
+ **
+ ** Description Check if a peer acting as src supports codec config
+ **
+ ** Returns TRUE if the connection supports this codec, FALSE otherwise
+ **
+ *******************************************************************************/
+static BOOLEAN bta_av_co_audio_peer_src_supports_codec(tBTA_AV_CO_PEER *p_peer, UINT8 *p_src_index)
+{
+ int index;
+ UINT8 codec_type;
+ FUNC_TRACE();
+
+ /* Configure the codec type to look for */
+ codec_type = bta_av_co_cb.codec_cfg.id;
+
+
+ for (index = 0; index < p_peer->num_sup_srcs; index++)
+ {
+ if (p_peer->srcs[index].codec_type == codec_type)
+ {
+ switch (bta_av_co_cb.codec_cfg.id)
+ {
+ case BTIF_AV_CODEC_SBC:
+ if (p_src_index) *p_src_index = index;
+ if (0 == bta_av_sbc_cfg_matches_cap((UINT8 *)p_peer->srcs[index].codec_caps,
+ (tA2D_SBC_CIE *)&bta_av_co_sbc_sink_caps))
+ {
+ return TRUE;
+ }
+ break;
+
+ default:
+ APPL_TRACE_ERROR("peer_src_supports_codec: unsupported codec id %d",
+ bta_av_co_cb.codec_cfg.id);
+ return FALSE;
+ break;
+ }
+ }
+ }
+ return FALSE;
+}
+
+/*******************************************************************************
+ **
+ ** Function bta_av_co_audio_sink_supports_config
**
** Description Check if the media source supports a given configuration
**
** Returns TRUE if the media source supports this config, FALSE otherwise
**
*******************************************************************************/
+static BOOLEAN bta_av_co_audio_sink_supports_config(UINT8 codec_type, const UINT8 *p_codec_cfg)
+{
+ FUNC_TRACE();
+
+ switch (codec_type)
+ {
+ case BTA_AV_CODEC_SBC:
+ if (bta_av_sbc_cfg_in_cap((UINT8 *)p_codec_cfg, (tA2D_SBC_CIE *)&bta_av_co_sbc_sink_caps))
+ {
+ return FALSE;
+ }
+ break;
+
+
+ default:
+ APPL_TRACE_ERROR("bta_av_co_audio_media_supports_config unsupported codec type %d", codec_type);
+ return FALSE;
+ break;
+ }
+ return TRUE;
+}
+
+/*******************************************************************************
+ **
+ ** Function bta_av_co_audio_media_supports_config
+ **
+ ** Description Check if the media sink supports a given configuration
+ **
+ ** Returns TRUE if the media source supports this config, FALSE otherwise
+ **
+ *******************************************************************************/
static BOOLEAN bta_av_co_audio_media_supports_config(UINT8 codec_type, const UINT8 *p_codec_cfg)
{
FUNC_TRACE();
@@ -1116,7 +1454,7 @@
default:
- APPL_TRACE_ERROR1("bta_av_co_audio_media_supports_config unsupported codec type %d", codec_type);
+ APPL_TRACE_ERROR("bta_av_co_audio_media_supports_config unsupported codec type %d", codec_type);
return FALSE;
break;
}
@@ -1147,7 +1485,7 @@
FUNC_TRACE();
- APPL_TRACE_DEBUG0("bta_av_co_audio_codec_supported");
+ APPL_TRACE_DEBUG("bta_av_co_audio_codec_supported");
/* Check AV feeding is supported */
*p_status = BTIF_ERROR_SRV_AV_FEEDING_NOT_SUPPORTED;
@@ -1164,7 +1502,7 @@
/* Check that this sink is compatible with the CP */
if (!bta_av_co_audio_sink_supports_cp(p_sink))
{
- APPL_TRACE_DEBUG2("bta_av_co_audio_codec_supported sink %d of peer %d doesn't support cp",
+ APPL_TRACE_DEBUG("bta_av_co_audio_codec_supported sink %d of peer %d doesn't support cp",
snk_index, index);
*p_status = BTIF_ERROR_SRV_AV_CP_NOT_SUPPORTED;
return FALSE;
@@ -1200,7 +1538,7 @@
bta_av_co_cb.cp.active = FALSE;
}
#endif
- APPL_TRACE_DEBUG1("bta_av_co_audio_codec_supported call BTA_AvReconfig(x%x)", BTA_AV_CO_AUDIO_INDX_TO_HNDL(index));
+ APPL_TRACE_DEBUG("bta_av_co_audio_codec_supported call BTA_AvReconfig(x%x)", BTA_AV_CO_AUDIO_INDX_TO_HNDL(index));
BTA_AvReconfig(BTA_AV_CO_AUDIO_INDX_TO_HNDL(index), TRUE, p_sink->sep_info_idx,
p_peer->codec_cfg, num_protect, (UINT8 *)bta_av_co_cp_scmst);
}
@@ -1208,7 +1546,7 @@
}
else
{
- APPL_TRACE_DEBUG1("bta_av_co_audio_codec_supported index %d doesn't support codec", index);
+ APPL_TRACE_DEBUG("bta_av_co_audio_codec_supported index %d doesn't support codec", index);
return FALSE;
}
}
@@ -1237,7 +1575,7 @@
if (A2D_BldSbcInfo(A2D_MEDIA_TYPE_AUDIO, (tA2D_SBC_CIE *)&btif_av_sbc_default_config, bta_av_co_cb.codec_cfg.info) != A2D_SUCCESS)
{
- APPL_TRACE_ERROR0("bta_av_co_audio_codec_reset A2D_BldSbcInfo failed");
+ APPL_TRACE_ERROR("bta_av_co_audio_codec_reset A2D_BldSbcInfo failed");
}
GKI_enable();
@@ -1264,7 +1602,7 @@
/* Check AV feeding is supported */
*p_status = BTIF_ERROR_SRV_AV_FEEDING_NOT_SUPPORTED;
- APPL_TRACE_DEBUG1("bta_av_co_audio_set_codec cid=%d", p_feeding->format);
+ APPL_TRACE_DEBUG("bta_av_co_audio_set_codec cid=%d", p_feeding->format);
/* Supported codecs */
switch (p_feeding->format)
@@ -1276,13 +1614,13 @@
if ((p_feeding->cfg.pcm.num_channel != 1) &&
(p_feeding->cfg.pcm.num_channel != 2))
{
- APPL_TRACE_ERROR0("bta_av_co_audio_set_codec PCM channel number unsupported");
+ APPL_TRACE_ERROR("bta_av_co_audio_set_codec PCM channel number unsupported");
return FALSE;
}
if ((p_feeding->cfg.pcm.bit_per_sample != 8) &&
(p_feeding->cfg.pcm.bit_per_sample != 16))
{
- APPL_TRACE_ERROR0("bta_av_co_audio_set_codec PCM sample size unsupported");
+ APPL_TRACE_ERROR("bta_av_co_audio_set_codec PCM sample size unsupported");
return FALSE;
}
switch (p_feeding->cfg.pcm.sampling_freq)
@@ -1302,21 +1640,21 @@
sbc_config.samp_freq = A2D_SBC_IE_SAMP_FREQ_44;
break;
default:
- APPL_TRACE_ERROR0("bta_av_co_audio_set_codec PCM sampling frequency unsupported");
+ APPL_TRACE_ERROR("bta_av_co_audio_set_codec PCM sampling frequency unsupported");
return FALSE;
break;
}
/* Build the codec config */
if (A2D_BldSbcInfo(A2D_MEDIA_TYPE_AUDIO, &sbc_config, new_cfg.info) != A2D_SUCCESS)
{
- APPL_TRACE_ERROR0("bta_av_co_audio_set_codec A2D_BldSbcInfo failed");
+ APPL_TRACE_ERROR("bta_av_co_audio_set_codec A2D_BldSbcInfo failed");
return FALSE;
}
break;
default:
- APPL_TRACE_ERROR0("bta_av_co_audio_set_codec Feeding format unsupported");
+ APPL_TRACE_ERROR("bta_av_co_audio_set_codec Feeding format unsupported");
return FALSE;
break;
}
@@ -1347,7 +1685,7 @@
tBTA_AV_CO_PEER *p_peer;
tBTA_AV_CO_SINK *p_sink;
- APPL_TRACE_EVENT1("bta_av_co_cb.codec_cfg.id : codec 0x%x", bta_av_co_cb.codec_cfg.id);
+ APPL_TRACE_EVENT("bta_av_co_cb.codec_cfg.id : codec 0x%x", bta_av_co_cb.codec_cfg.id);
/* Minimum MTU is by default very large */
*p_minmtu = 0xFFFF;
@@ -1378,7 +1716,7 @@
p_sbc_config->max_bitpool =
BTA_AV_CO_MIN(p_sink->codec_caps[BTA_AV_CO_SBC_MAX_BITPOOL_OFF],
p_sbc_config->max_bitpool);
- APPL_TRACE_EVENT2("bta_av_co_audio_get_sbc_config : sink bitpool min %d, max %d",
+ APPL_TRACE_EVENT("bta_av_co_audio_get_sbc_config : sink bitpool min %d, max %d",
p_sbc_config->min_bitpool, p_sbc_config->max_bitpool);
break;
}
@@ -1418,7 +1756,7 @@
p_peer = bta_av_co_get_peer(hndl);
if (p_peer == NULL)
{
- APPL_TRACE_ERROR0("bta_av_co_audio_discard_config could not find peer entry");
+ APPL_TRACE_ERROR("bta_av_co_audio_discard_config could not find peer entry");
return;
}
@@ -1476,7 +1814,7 @@
p_peer = bta_av_co_get_peer(hndl);
if (p_peer == NULL)
{
- APPL_TRACE_ERROR0("bta_av_co_peer_cp_supported could not find peer entry");
+ APPL_TRACE_ERROR("bta_av_co_peer_cp_supported could not find peer entry");
return FALSE;
}
@@ -1488,7 +1826,7 @@
return bta_av_co_audio_sink_has_scmst(p_sink);
}
}
- APPL_TRACE_ERROR0("bta_av_co_peer_cp_supported did not find SBC sink");
+ APPL_TRACE_ERROR("bta_av_co_peer_cp_supported did not find SBC sink");
return FALSE;
}
diff --git a/btif/co/bta_dm_co.c b/btif/co/bta_dm_co.c
index 13a5c8f..d576049 100644
--- a/btif/co/bta_dm_co.c
+++ b/btif/co/bta_dm_co.c
@@ -29,7 +29,14 @@
#if (defined BLE_INCLUDED && BLE_INCLUDED == TRUE)
#include "bte_appl.h"
-tBTE_APPL_CFG bte_appl_cfg = { 0x5, 0x4, 0x7, 0x7, 0x10 };
+tBTE_APPL_CFG bte_appl_cfg =
+{
+ BTM_AUTH_SPGB_YES, // Authentication requirements
+ BTM_LOCAL_IO_CAPS, // I/O capabilities
+ 7, // Initiaor key size
+ 7, // Responder key size
+ 16 // Maximum key size
+};
#endif
/*******************************************************************************
@@ -75,10 +82,11 @@
#if (BTM_OOB_INCLUDED == TRUE)
btif_dm_set_oob_for_io_req(p_oob_data);
#endif
- BTIF_TRACE_DEBUG1("bta_dm_co_io_req *p_oob_data = %d", *p_oob_data);
- BTIF_TRACE_DEBUG1("bta_dm_co_io_req *p_io_cap = %d", *p_io_cap);
- BTIF_TRACE_DEBUG1("bta_dm_co_io_req *p_auth_req = %d", *p_auth_req);
- BTIF_TRACE_DEBUG1("bta_dm_co_io_req is_orig = %d", is_orig);
+ btif_dm_proc_io_req(bd_addr, p_io_cap, p_oob_data, p_auth_req, is_orig);
+ BTIF_TRACE_DEBUG("bta_dm_co_io_req *p_oob_data = %d", *p_oob_data);
+ BTIF_TRACE_DEBUG("bta_dm_co_io_req *p_io_cap = %d", *p_io_cap);
+ BTIF_TRACE_DEBUG("bta_dm_co_io_req *p_auth_req = %d", *p_auth_req);
+ BTIF_TRACE_DEBUG("bta_dm_co_io_req is_orig = %d", is_orig);
}
/*******************************************************************************
@@ -99,10 +107,7 @@
void bta_dm_co_io_rsp(BD_ADDR bd_addr, tBTA_IO_CAP io_cap,
tBTA_OOB_DATA oob_data, tBTA_AUTH_REQ auth_req)
{
- UNUSED(bd_addr);
- UNUSED(io_cap);
- UNUSED(oob_data);
- UNUSED(auth_req);
+ btif_dm_proc_io_rsp(bd_addr, io_cap, oob_data, auth_req);
}
/*******************************************************************************
@@ -141,7 +146,7 @@
*******************************************************************************/
void bta_dm_co_loc_oob(BOOLEAN valid, BT_OCTET16 c, BT_OCTET16 r)
{
- BTIF_TRACE_DEBUG1("bta_dm_co_loc_oob, valid = %d", valid);
+ BTIF_TRACE_DEBUG("bta_dm_co_loc_oob, valid = %d", valid);
#ifdef BTIF_DM_OOB_TEST
btif_dm_proc_loc_oob(valid, c, r);
#endif
@@ -170,7 +175,7 @@
result = btif_dm_proc_rmt_oob(bd_addr, p_c, p_r);
#endif
- BTIF_TRACE_DEBUG1("bta_dm_co_rmt_oob: result=%d",result);
+ BTIF_TRACE_DEBUG("bta_dm_co_rmt_oob: result=%d",result);
bta_dm_ci_rmt_oob(result, bd_addr, p_c, p_r);
}
@@ -212,7 +217,7 @@
{
tBTM_SCO_ROUTE_TYPE route = BTA_DM_SCO_ROUTE_PCM;
- BTIF_TRACE_DEBUG0("bta_dm_sco_co_init");
+ BTIF_TRACE_DEBUG("bta_dm_sco_co_init");
/* set up SCO routing configuration if SCO over HCI app ID is used and run time
configuration is set to SCO over HCI */
@@ -232,7 +237,7 @@
/* initialize SCO codec */
if (!btui_sco_codec_init(rx_bw, tx_bw))
{
- BTIF_TRACE_ERROR0("codec initialization exception!");
+ BTIF_TRACE_ERROR("codec initialization exception!");
}
}
@@ -257,7 +262,7 @@
if (btui_cb.sco_hci)
{
- BTIF_TRACE_DEBUG2("bta_dm_sco_co_open handle:%d pkt_size:%d", handle, pkt_size);
+ BTIF_TRACE_DEBUG("bta_dm_sco_co_open handle:%d pkt_size:%d", handle, pkt_size);
/* use dedicated SCO buffer pool for SCO TX data */
cfg.pool_id = HCI_SCO_POOL_ID;
cfg.p_cback = btui_sco_codec_callback;
@@ -283,7 +288,7 @@
{
if (btui_cb.sco_hci)
{
- BTIF_TRACE_DEBUG0("bta_dm_sco_co_close close codec");
+ BTIF_TRACE_DEBUG("bta_dm_sco_co_close close codec");
/* close sco codec */
btui_sco_codec_close();
@@ -346,9 +351,9 @@
tBTA_LE_KEY_TYPE *p_resp_key )
{
UNUSED(bd_addr);
- BTIF_TRACE_ERROR0("##################################");
- BTIF_TRACE_ERROR0("bta_dm_co_le_io_key_req: only setting max size to 16");
- BTIF_TRACE_ERROR0("##################################");
+ BTIF_TRACE_ERROR("##################################");
+ BTIF_TRACE_ERROR("bta_dm_co_le_io_key_req: only setting max size to 16");
+ BTIF_TRACE_ERROR("##################################");
*p_max_key_size = 16;
*p_init_key = *p_resp_key =
(BTA_LE_KEY_PENC|BTA_LE_KEY_PID|BTA_LE_KEY_PCSRK|BTA_LE_KEY_LENC|BTA_LE_KEY_LID|BTA_LE_KEY_LCSRK);
@@ -370,9 +375,9 @@
void bta_dm_co_ble_load_local_keys(tBTA_DM_BLE_LOCAL_KEY_MASK *p_key_mask, BT_OCTET16 er,
tBTA_BLE_LOCAL_ID_KEYS *p_id_keys)
{
- BTIF_TRACE_DEBUG0("##################################");
- BTIF_TRACE_DEBUG0("bta_dm_co_ble_load_local_keys: Load local keys if any are persisted");
- BTIF_TRACE_DEBUG0("##################################");
+ BTIF_TRACE_DEBUG("##################################");
+ BTIF_TRACE_DEBUG("bta_dm_co_ble_load_local_keys: Load local keys if any are persisted");
+ BTIF_TRACE_DEBUG("##################################");
btif_dm_get_ble_local_keys( p_key_mask, er, p_id_keys);
}
diff --git a/btif/co/bta_fs_co.c b/btif/co/bta_fs_co.c
index 958fef5..54bb87e 100644
--- a/btif/co/bta_fs_co.c
+++ b/btif/co/bta_fs_co.c
@@ -63,11 +63,11 @@
int ret = 0;
char nameBuffer[PATH_MAX] = {0};
struct stat statBuffer;
- BTIF_TRACE_DEBUG1("in del_path for path:%s", path);
+ BTIF_TRACE_DEBUG("in del_path for path:%s", path);
dir = opendir(path);
if (dir == NULL) {
- BTIF_TRACE_DEBUG1("opendir failed on path:%s", path);
+ BTIF_TRACE_DEBUG("opendir failed on path:%s", path);
return -1;
}
@@ -82,7 +82,7 @@
de = readdir(dir);
if (de == NULL) {
- BTIF_TRACE_DEBUG1("readdir failed for path:%s", path);
+ BTIF_TRACE_DEBUG("readdir failed for path:%s", path);
//ret = -1;
break;
}
@@ -91,7 +91,7 @@
continue;
if((int)strlen(de->d_name) > PATH_MAX - nameLen) {
- BTIF_TRACE_DEBUG1("d_name len:%d is too big", strlen(de->d_name));
+ BTIF_TRACE_DEBUG("d_name len:%d is too big", strlen(de->d_name));
ret = -1;
break;
}
@@ -101,7 +101,7 @@
ret = lstat (nameBuffer, &statBuffer);
if (ret != 0) {
- BTIF_TRACE_DEBUG1("lstat failed for path:%s", nameBuffer);
+ BTIF_TRACE_DEBUG("lstat failed for path:%s", nameBuffer);
break;
}
@@ -113,7 +113,7 @@
} else {
ret = unlink(nameBuffer);
if (ret != 0) {
- BTIF_TRACE_DEBUG1("unlink failed for path:%s", nameBuffer);
+ BTIF_TRACE_DEBUG("unlink failed for path:%s", nameBuffer);
break;
}
}
@@ -122,7 +122,7 @@
closedir(dir);
if(ret == 0) {
ret = rmdir(path);
- BTIF_TRACE_DEBUG2("rmdir return:%d for path:%s", ret, path);
+ BTIF_TRACE_DEBUG("rmdir return:%d for path:%s", ret, path);
}
return ret;
@@ -191,7 +191,7 @@
default:
return BTA_FS_CO_OK;
}
- BTIF_TRACE_DEBUG0("*************FTP- Access Failed **********");
+ BTIF_TRACE_DEBUG("*************FTP- Access Failed **********");
return BTA_FS_CO_EACCES;
}
@@ -274,7 +274,7 @@
max_space = fs_buffer.f_bavail * fs_buffer.f_bsize;
#if (BTA_FS_DEBUG==TRUE)
- BTIF_TRACE_DEBUG2("btapp_fs_enough_space(file size: %d): (uint)max_size: %u", size, (UINT32)max_space);
+ BTIF_TRACE_DEBUG("btapp_fs_enough_space(file size: %d): (uint)max_size: %u", size, (UINT32)max_space);
#endif
if (max_space < size)
err = EFBIG;
@@ -282,7 +282,7 @@
else
{
err = errno;
- BTIF_TRACE_WARNING1("btapp_fs_enough_space(): statfs() failed with err: %d", err);
+ BTIF_TRACE_WARNING("btapp_fs_enough_space(): statfs() failed with err: %d", err);
}
}
else
@@ -353,7 +353,7 @@
if (oflags & O_CREAT)
{
fchown(fd, BT_UID, BT_GID);
- BTIF_TRACE_DEBUG0("\n ******CHANGED OWNERSHIP SUCCESSFULLY**********");
+ BTIF_TRACE_DEBUG("\n ******CHANGED OWNERSHIP SUCCESSFULLY**********");
}
}
}
@@ -364,9 +364,9 @@
}
}
- BTIF_TRACE_DEBUG4("[CO] bta_fs_co_open: handle:%d err:%d, flags:%x, app id:%d",
+ BTIF_TRACE_DEBUG("[CO] bta_fs_co_open: handle:%d err:%d, flags:%x, app id:%d",
fd, err, oflags, app_id);
- BTIF_TRACE_DEBUG1("file=%s", p_path);
+ BTIF_TRACE_DEBUG("file=%s", p_path);
/* convert fs error into bta_fs err. erro is set by first call to enough space to a valid value
* and needs only updating in case of error. This reports correct failure to remote obex! */
@@ -412,13 +412,13 @@
tBTA_FS_CO_STATUS status = BTA_FS_CO_OK;
int err;
- BTIF_TRACE_DEBUG2("[CO] bta_fs_co_close: handle:%d, app id:%d",
+ BTIF_TRACE_DEBUG("[CO] bta_fs_co_close: handle:%d, app id:%d",
fd, app_id);
if (close (fd) < 0)
{
err = errno;
status = BTA_FS_CO_FAIL;
- BTIF_TRACE_WARNING3("[CO] bta_fs_co_close: handle:%d error=%d app_id:%d", fd, err, app_id);
+ BTIF_TRACE_WARNING("[CO] bta_fs_co_close: handle:%d error=%d app_id:%d", fd, err, app_id);
}
return (status);
@@ -462,7 +462,7 @@
{
err = errno;
status = BTA_FS_CO_FAIL;
- BTIF_TRACE_WARNING3("[CO] bta_fs_co_read: handle:%d error=%d app_id:%d",
+ BTIF_TRACE_WARNING("[CO] bta_fs_co_read: handle:%d error=%d app_id:%d",
fd, err, app_id);
}
else if (num_read < nbytes)
@@ -510,7 +510,7 @@
err = errno;
status = BTA_FS_CO_FAIL;
}
-/* BTIF_TRACE_DEBUG3("[CO] bta_fs_co_write: handle:%d error=%d, num_written:%d", fd, err, num_written);*/
+/* BTIF_TRACE_DEBUG("[CO] bta_fs_co_write: handle:%d error=%d, num_written:%d", fd, err, num_written);*/
bta_fs_ci_write(fd, status, evt);
}
@@ -610,7 +610,7 @@
}
else
{
- BTIF_TRACE_DEBUG0("stat() failed! ");
+ BTIF_TRACE_DEBUG("stat() failed! ");
return BTA_FS_CO_FAIL;
}
@@ -645,7 +645,7 @@
{
err = errno;
status = BTA_FS_CO_FAIL;
- BTIF_TRACE_WARNING3("[CO] bta_fs_co_mkdir: error=%d, path [%s] app_id:%d",
+ BTIF_TRACE_WARNING("[CO] bta_fs_co_mkdir: error=%d, path [%s] app_id:%d",
err, p_path, app_id);
}
return (status);
@@ -678,10 +678,10 @@
char *dirName, *tmp = NULL;
path_len = strlen( p_path )+1;
- BTIF_TRACE_DEBUG2( "bta_fs_co_rmdir( app_id: %d ): path_len: %d", app_id, path_len );
+ BTIF_TRACE_DEBUG( "bta_fs_co_rmdir( app_id: %d ): path_len: %d", app_id, path_len );
#if (TRUE==BTA_FS_DEBUG)
- BTIF_TRACE_DEBUG1( "bta_fs_co_rmdir():path_len: %d, p_path", app_id );
- BTIF_TRACE_DEBUG0( p_path );
+ BTIF_TRACE_DEBUG( "bta_fs_co_rmdir():path_len: %d, p_path", app_id );
+ BTIF_TRACE_DEBUG( p_path );
#endif
/* allocate a temp buffer for path with 0 char. make sure not to crash if path is too big! */
@@ -692,7 +692,7 @@
}
else
{
- BTIF_TRACE_WARNING2( "bta_fs_co_rmdir( app_id: %d ) for path_len: %d::out of memory",
+ BTIF_TRACE_WARNING( "bta_fs_co_rmdir( app_id: %d ) for path_len: %d::out of memory",
app_id, path_len );
return BTA_FS_CO_FAIL;
}
@@ -709,7 +709,7 @@
{
free(dirName);
#if (TRUE==BTA_FS_DEBUG)
- BTIF_TRACE_WARNING0( "bta_fs_co_rmdir()::stat(dirName) failed" );
+ BTIF_TRACE_WARNING( "bta_fs_co_rmdir()::stat(dirName) failed" );
#endif
return BTA_FS_CO_FAIL;
}
@@ -718,7 +718,7 @@
if (status != BTA_FS_CO_OK)
{
#if (TRUE==BTA_FS_DEBUG)
- BTIF_TRACE_WARNING0( "bta_fs_co_rmdir()::getAccess(dirName) FAILED");
+ BTIF_TRACE_WARNING( "bta_fs_co_rmdir()::getAccess(dirName) FAILED");
#endif
return status;
}
@@ -730,7 +730,7 @@
else
{
#if (TRUE==BTA_FS_DEBUG)
- BTIF_TRACE_WARNING0( "bta_fs_co_rmdir()::stat(p_path) FAILED");
+ BTIF_TRACE_WARNING( "bta_fs_co_rmdir()::stat(p_path) FAILED");
#endif
return BTA_FS_CO_FAIL;
}
@@ -738,7 +738,7 @@
if (status != BTA_FS_CO_OK)
{
#if (TRUE==BTA_FS_DEBUG)
- BTIF_TRACE_DEBUG0( "bta_fs_co_rmdir()::getAccess(p_path) FAILED");
+ BTIF_TRACE_DEBUG( "bta_fs_co_rmdir()::getAccess(p_path) FAILED");
#endif
return status;
}
@@ -746,7 +746,7 @@
if (del_path(p_path) != 0)
{
err = errno;
- BTIF_TRACE_WARNING1( "bta_fs_co_rmdir():rmdir/del_path FAILED with err: %d", err );
+ BTIF_TRACE_WARNING( "bta_fs_co_rmdir():rmdir/del_path FAILED with err: %d", err );
if (err == EACCES)
status = BTA_FS_CO_EACCES;
else if (err == ENOTEMPTY)
@@ -777,7 +777,7 @@
*******************************************************************************/
tBTA_FS_CO_STATUS bta_fs_co_unlink(const char *p_path, UINT8 app_id)
{
- BTIF_TRACE_DEBUG0("bta_fs_co_unlink");
+ BTIF_TRACE_DEBUG("bta_fs_co_unlink");
int err;
tBTA_FS_CO_STATUS status = BTA_FS_CO_OK;
char *dirName, *tmp=NULL;
@@ -806,7 +806,7 @@
}
else
{
- BTIF_TRACE_DEBUG0("stat() failed! ");
+ BTIF_TRACE_DEBUG("stat() failed! ");
free(dirName);
return BTA_FS_CO_FAIL;
}
@@ -865,32 +865,32 @@
char fullname[500];
UNUSED(app_id);
- BTIF_TRACE_DEBUG0("Entered bta_fs_co_getdirentry");
+ BTIF_TRACE_DEBUG("Entered bta_fs_co_getdirentry");
/* First item is to be retrieved */
if (first_item)
{
- BTIF_TRACE_DEBUG1("bta_fs_co_getdirentry: path = %s", p_path);
+ BTIF_TRACE_DEBUG("bta_fs_co_getdirentry: path = %s", p_path);
dir = opendir(p_path);
if(dir == NULL)
{
- BTIF_TRACE_DEBUG1("bta_fs_co_getdirentry: dir is NULL so error out with errno=%d", errno);
+ BTIF_TRACE_DEBUG("bta_fs_co_getdirentry: dir is NULL so error out with errno=%d", errno);
co_status = BTA_FS_CO_EODIR;
bta_fs_ci_direntry(co_status, evt);
return;
}
- BTIF_TRACE_DEBUG1("bta_fs_co_getdirentry: dir = %p", dir);
+ BTIF_TRACE_DEBUG("bta_fs_co_getdirentry: dir = %p", dir);
if((dirent = readdir(dir)) != NULL)
{
p_entry->refdata = (UINT32) dir; /* Save this for future searches */
status = 0;
- BTIF_TRACE_DEBUG1("bta_fs_co_getdirentry: dirent = %p", dirent);
+ BTIF_TRACE_DEBUG("bta_fs_co_getdirentry: dirent = %p", dirent);
}
else
{
- BTIF_TRACE_DEBUG1("bta_fs_co_getdirentry: dirent = %p", dirent);
+ BTIF_TRACE_DEBUG("bta_fs_co_getdirentry: dirent = %p", dirent);
/* Close the search if there are no more items */
closedir( (DIR*) p_entry->refdata);
co_status = BTA_FS_CO_EODIR;
@@ -903,18 +903,18 @@
/* Close the search if there are no more items */
closedir( (DIR*) p_entry->refdata);
co_status = BTA_FS_CO_EODIR;
- BTIF_TRACE_DEBUG1("bta_fs_co_getdirentry: dirent = %p", dirent);
+ BTIF_TRACE_DEBUG("bta_fs_co_getdirentry: dirent = %p", dirent);
}
else
{
- BTIF_TRACE_DEBUG1("bta_fs_co_getdirentry: dirent = %p", dirent);
+ BTIF_TRACE_DEBUG("bta_fs_co_getdirentry: dirent = %p", dirent);
status = 0;
}
}
if (status == 0)
{
- BTIF_TRACE_DEBUG0("bta_fs_co_getdirentry: status = 0");
+ BTIF_TRACE_DEBUG("bta_fs_co_getdirentry: status = 0");
sprintf(fullname, "%s/%s", p_path, dirent->d_name);
@@ -957,11 +957,11 @@
#endif
co_status = BTA_FS_CO_OK;
} else {
- BTIF_TRACE_WARNING0("stat() failed! ");
+ BTIF_TRACE_WARNING("stat() failed! ");
co_status = BTA_FS_CO_EACCES;
}
}
- BTIF_TRACE_DEBUG0("bta_fs_co_getdirentry: calling bta_fs_ci_getdirentry");
+ BTIF_TRACE_DEBUG("bta_fs_co_getdirentry: calling bta_fs_ci_getdirentry");
bta_fs_ci_direntry(co_status, evt);
}
@@ -989,7 +989,7 @@
UNUSED(p_path);
UNUSED(app_id);
- BTIF_TRACE_DEBUG2("Entered %s. New path: %s", __FUNCTION__, p_path);
+ BTIF_TRACE_DEBUG("Entered %s. New path: %s", __FUNCTION__, p_path);
}
/*******************************************************************************
@@ -1020,7 +1020,7 @@
UNUSED(evt);
UNUSED(app_id);
- BTIF_TRACE_WARNING0("[CO] bta_fs_co_resume - NOT implemented");
+ BTIF_TRACE_WARNING("[CO] bta_fs_co_resume - NOT implemented");
}
/*******************************************************************************
@@ -1050,7 +1050,7 @@
UNUSED(evt);
UNUSED(app_id);
- BTIF_TRACE_WARNING0("[CO] bta_fs_co_set_perms - NOT implemented");
+ BTIF_TRACE_WARNING("[CO] bta_fs_co_set_perms - NOT implemented");
}
/*******************************************************************************
@@ -1082,7 +1082,7 @@
UNUSED(evt);
UNUSED(app_id);
- BTIF_TRACE_WARNING0("[CO] bta_fs_co_rename - NOT implemented");
+ BTIF_TRACE_WARNING("[CO] bta_fs_co_rename - NOT implemented");
}
/*******************************************************************************
@@ -1116,7 +1116,7 @@
UNUSED(evt);
UNUSED(app_id);
- BTIF_TRACE_WARNING0("[CO] bta_fs_co_copy - NOT implemented");
+ BTIF_TRACE_WARNING("[CO] bta_fs_co_copy - NOT implemented");
}
/*******************************************************************************
@@ -1141,7 +1141,7 @@
UNUSED(evt);
UNUSED(app_id);
- BTIF_TRACE_WARNING0("[CO] bta_fs_co_resume_op - NOT implemented");
+ BTIF_TRACE_WARNING("[CO] bta_fs_co_resume_op - NOT implemented");
}
@@ -1172,7 +1172,7 @@
UNUSED(p_info);
UNUSED(app_id);
- BTIF_TRACE_WARNING0("[CO] bta_fs_co_session_info - NOT implemented");
+ BTIF_TRACE_WARNING("[CO] bta_fs_co_session_info - NOT implemented");
}
@@ -1205,7 +1205,7 @@
UNUSED(info);
UNUSED(app_id);
- BTIF_TRACE_WARNING0("[CO] bta_fs_co_suspend - NOT implemented");
+ BTIF_TRACE_WARNING("[CO] bta_fs_co_suspend - NOT implemented");
}
/*******************************************************************************
@@ -1231,6 +1231,6 @@
UNUSED(ssn);
UNUSED(app_id);
- BTIF_TRACE_WARNING0("[CO] bta_fs_co_suspend - NOT implemented");
+ BTIF_TRACE_WARNING("[CO] bta_fs_co_suspend - NOT implemented");
}
diff --git a/btif/co/bta_gattc_co.c b/btif/co/bta_gattc_co.c
index 29fbb09..8541aa3 100644
--- a/btif/co/bta_gattc_co.c
+++ b/btif/co/bta_gattc_co.c
@@ -25,6 +25,43 @@
#if( defined BLE_INCLUDED ) && (BLE_INCLUDED == TRUE)
#if( defined BTA_GATT_INCLUDED ) && (BTA_GATT_INCLUDED == TRUE)
+#define GATT_CACHE_PREFIX "/data/misc/bluedroid/gatt_cache_"
+
+static FILE* sCacheFD = 0;
+
+static void getFilename(char *buffer, BD_ADDR bda)
+{
+ sprintf(buffer, "%s%02x%02x%02x%02x%02x%02x", GATT_CACHE_PREFIX
+ , bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]);
+}
+
+static void cacheClose()
+{
+ if (sCacheFD != 0)
+ {
+ fclose(sCacheFD);
+ sCacheFD = 0;
+ }
+}
+
+static bool cacheOpen(BD_ADDR bda, bool to_save)
+{
+ char fname[255] = {0};
+ getFilename(fname, bda);
+
+ cacheClose();
+ sCacheFD = fopen(fname, to_save ? "w" : "r");
+
+ return (sCacheFD != 0);
+}
+
+static void cacheReset(BD_ADDR bda)
+{
+ char fname[255] = {0};
+ getFilename(fname, bda);
+ unlink(fname);
+}
+
/*****************************************************************************
** Function Declarations
@@ -47,10 +84,12 @@
*******************************************************************************/
void bta_gattc_co_cache_open(BD_ADDR server_bda, UINT16 evt, UINT16 conn_id, BOOLEAN to_save)
{
- tBTA_GATT_STATUS status = BTA_GATT_OK;
- UNUSED(to_save);
-
/* open NV cache and send call in */
+ tBTA_GATT_STATUS status = BTA_GATT_OK;
+ if (!cacheOpen(server_bda, to_save))
+ status = BTA_GATT_ERROR;
+
+ BTIF_TRACE_DEBUG("%s() - status=%d", __FUNCTION__, status);
bta_gattc_ci_cache_open(server_bda, evt, status, conn_id);
}
@@ -73,11 +112,19 @@
{
UINT16 num_attr = 0;
tBTA_GATTC_NV_ATTR attr[BTA_GATTC_NV_LOAD_MAX];
- tBTA_GATT_STATUS status = BTA_GATT_MORE;
- UNUSED(start_index);
+ tBTA_GATT_STATUS status = BTA_GATT_ERROR;
+ if (sCacheFD && (0 == fseek(sCacheFD, start_index * sizeof(tBTA_GATTC_NV_ATTR), SEEK_SET)))
+ {
+ num_attr = fread(attr, sizeof(tBTA_GATTC_NV_ATTR), BTA_GATTC_NV_LOAD_MAX, sCacheFD);
+ status = (num_attr < BTA_GATTC_NV_LOAD_MAX ? BTA_GATT_OK : BTA_GATT_MORE);
+ }
+
+ BTIF_TRACE_DEBUG("%s() - sCacheFD=%p, start_index=%d, read=%d, status=%d",
+ __FUNCTION__, sCacheFD, start_index, num_attr, status);
bta_gattc_ci_cache_load(server_bda, evt, num_attr, attr, status, conn_id);
}
+
/*******************************************************************************
**
** Function bta_gattc_co_cache_save
@@ -98,10 +145,14 @@
tBTA_GATTC_NV_ATTR *p_attr_list, UINT16 attr_index, UINT16 conn_id)
{
tBTA_GATT_STATUS status = BTA_GATT_OK;
- UNUSED(num_attr);
- UNUSED(p_attr_list);
UNUSED(attr_index);
+ if (sCacheFD != 0)
+ {
+ int num = fwrite(p_attr_list, sizeof(tBTA_GATTC_NV_ATTR), num_attr, sCacheFD);
+ BTIF_TRACE_DEBUG("%s() wrote %d", __FUNCTION__, num);
+ }
+
bta_gattc_ci_cache_save(server_bda, evt, status, conn_id);
}
@@ -122,8 +173,13 @@
{
UNUSED(server_bda);
UNUSED(conn_id);
+
+ cacheClose();
+
/* close NV when server cache is done saving or loading,
does not need to do anything for now on Insight */
+
+ BTIF_TRACE_DEBUG("%s()", __FUNCTION__);
}
/*******************************************************************************
@@ -140,7 +196,8 @@
*******************************************************************************/
void bta_gattc_co_cache_reset(BD_ADDR server_bda)
{
- UNUSED(server_bda);
+ BTIF_TRACE_DEBUG("%s()", __FUNCTION__);
+ cacheReset(server_bda);
}
#endif
diff --git a/btif/co/bta_gatts_co.c b/btif/co/bta_gatts_co.c
index d030075..c061a28 100644
--- a/btif/co/bta_gatts_co.c
+++ b/btif/co/bta_gatts_co.c
@@ -61,97 +61,6 @@
}
}
-static BOOLEAN btif_gatts_srv_chg(tBTA_GATTS_SRV_CHG_CMD cmd,
- tBTA_GATTS_SRV_CHG_REQ *p_req,
- tBTA_GATTS_SRV_CHG_RSP *p_rsp)
-{
- BOOLEAN status = TRUE;
- BOOLEAN found = FALSE;
- UINT8 i, j, idx, last_idx;
- btif_gatts_srv_chg_cb_t *p_cb = &btif_gatts_srv_chg_cb;
-
- btif_gatts_check_init();
-
- switch (cmd)
- {
- case BTA_GATTS_SRV_CHG_CMD_ADD_CLIENT:
-
- if (p_cb->num_clients < BTIF_GATTS_MAX_SRV_CHG_CLT_SIZE)
- {
- memcpy(&p_cb->srv_chg[p_cb->num_clients], &p_req->srv_chg, sizeof(tBTA_GATTS_SRV_CHG));
- p_cb->num_clients++;
- } else {
- status = FALSE;
- }
- break;
-
- case BTA_GATTS_SRV_CHG_CMD_UPDATE_CLIENT:
-
- for (i=0; i != p_cb->num_clients; ++i)
- {
- if (!memcmp(p_cb->srv_chg[i].bda, p_req->srv_chg.bda, sizeof(BD_ADDR)))
- {
- found = TRUE;
- memcpy(&p_cb->srv_chg[i], &p_req->srv_chg, sizeof(tBTA_GATTS_SRV_CHG));
- break;
- }
- }
-
- if (!found)
- status = FALSE;
- break;
-
- case BTA_GATTS_SRV_CHG_CMD_REMOVE_CLIENT:
-
- for (i=0; i != p_cb->num_clients; ++i)
- {
- if (!memcmp(p_cb->srv_chg[i].bda, p_req->srv_chg.bda, sizeof(BD_ADDR)))
- {
- found = TRUE;
- last_idx = p_cb->num_clients - 1;
-
- if (i != last_idx )
- {
- /* Update the array so there is no gap */
- for (j=i; j != last_idx; ++j )
- {
- memcpy(&p_cb->srv_chg[j], &p_cb->srv_chg[j+1], sizeof(tBTA_GATTS_SRV_CHG));
- }
-
- }
-
- /* Reset the last client and update num_clients */
- memset(&p_cb->srv_chg[last_idx], 0, sizeof(tBTA_GATTS_SRV_CHG));
- p_cb->num_clients--;
- break;
- }
- }
-
- if (!found)
- status = FALSE;
- break;
-
- case BTA_GATTS_SRV_CHG_CMD_READ_NUM_CLENTS:
- p_rsp->num_clients = p_cb->num_clients;
- break;
-
- case BTA_GATTS_SRV_CHG_CMD_READ_CLENT:
- idx = p_req->client_read_index - 1;
-
- if (idx < p_cb->num_clients )
- memcpy(&p_rsp->srv_chg, &p_cb->srv_chg[idx], sizeof(tBTA_GATTS_SRV_CHG));
- else
- status = FALSE;
- break;
-
- default:
- status = FALSE;
- break;
- }
-
- return status;
-}
-
/*****************************************************************************
** Externally called functions
*****************************************************************************/
diff --git a/btif/co/bta_hh_co.c b/btif/co/bta_hh_co.c
index b393099..d7458b1 100644
--- a/btif/co/bta_hh_co.c
+++ b/btif/co/bta_hh_co.c
@@ -31,10 +31,15 @@
#include "bta_api.h"
#include "bta_hh_api.h"
#include "btif_util.h"
-
+#include "bta_hh_co.h"
const char *dev_path = "/dev/uhid";
+#if (BLE_INCLUDED == TRUE && BTA_HH_LE_INCLUDED == TRUE)
+#include "btif_config.h"
+#define BTA_HH_NV_LOAD_MAX 16
+static tBTA_HH_RPT_CACHE_ENTRY sReportCache[BTA_HH_NV_LOAD_MAX];
+#endif
/*Internal function to perform UHID write and error checking*/
static int uhid_write(int fd, const struct uhid_event *ev)
@@ -43,10 +48,10 @@
ret = write(fd, ev, sizeof(*ev));
if (ret < 0){
int rtn = -errno;
- APPL_TRACE_ERROR2("%s: Cannot write to uhid:%s", __FUNCTION__, strerror(errno));
+ APPL_TRACE_ERROR("%s: Cannot write to uhid:%s", __FUNCTION__, strerror(errno));
return rtn;
} else if (ret != sizeof(*ev)) {
- APPL_TRACE_ERROR3("%s: Wrong size written to uhid: %ld != %lu",
+ APPL_TRACE_ERROR("%s: Wrong size written to uhid: %ld != %lu",
__FUNCTION__, ret, sizeof(*ev));
return -EFAULT;
} else {
@@ -62,39 +67,39 @@
memset(&ev, 0, sizeof(ev));
if(!p_dev)
{
- APPL_TRACE_ERROR1("%s: Device not found",__FUNCTION__)
+ APPL_TRACE_ERROR("%s: Device not found",__FUNCTION__)
return -1;
}
ret = read(p_dev->fd, &ev, sizeof(ev));
if (ret == 0) {
- APPL_TRACE_ERROR2("%s: Read HUP on uhid-cdev %s", __FUNCTION__,
+ APPL_TRACE_ERROR("%s: Read HUP on uhid-cdev %s", __FUNCTION__,
strerror(errno));
return -EFAULT;
} else if (ret < 0) {
- APPL_TRACE_ERROR2("%s:Cannot read uhid-cdev: %s", __FUNCTION__,
+ APPL_TRACE_ERROR("%s:Cannot read uhid-cdev: %s", __FUNCTION__,
strerror(errno));
return -errno;
} else if (ret != sizeof(ev)) {
- APPL_TRACE_ERROR3("%s:Invalid size read from uhid-dev: %ld != %lu",
+ APPL_TRACE_ERROR("%s:Invalid size read from uhid-dev: %ld != %lu",
__FUNCTION__, ret, sizeof(ev));
return -EFAULT;
}
switch (ev.type) {
case UHID_START:
- APPL_TRACE_DEBUG0("UHID_START from uhid-dev\n");
+ APPL_TRACE_DEBUG("UHID_START from uhid-dev\n");
break;
case UHID_STOP:
- APPL_TRACE_DEBUG0("UHID_STOP from uhid-dev\n");
+ APPL_TRACE_DEBUG("UHID_STOP from uhid-dev\n");
break;
case UHID_OPEN:
- APPL_TRACE_DEBUG0("UHID_OPEN from uhid-dev\n");
+ APPL_TRACE_DEBUG("UHID_OPEN from uhid-dev\n");
break;
case UHID_CLOSE:
- APPL_TRACE_DEBUG0("UHID_CLOSE from uhid-dev\n");
+ APPL_TRACE_DEBUG("UHID_CLOSE from uhid-dev\n");
break;
case UHID_OUTPUT:
- APPL_TRACE_DEBUG2("UHID_OUTPUT: Report type = %d, report_size = %d"
+ APPL_TRACE_DEBUG("UHID_OUTPUT: Report type = %d, report_size = %d"
,ev.u.output.rtype, ev.u.output.size);
//Send SET_REPORT with feature report if the report type in output event is FEATURE
if(ev.u.output.rtype == UHID_FEATURE_REPORT)
@@ -105,17 +110,17 @@
btif_hh_setreport(p_dev,BTHH_INPUT_REPORT,ev.u.output.size,ev.u.output.data);
break;
case UHID_OUTPUT_EV:
- APPL_TRACE_DEBUG0("UHID_OUTPUT_EV from uhid-dev\n");
+ APPL_TRACE_DEBUG("UHID_OUTPUT_EV from uhid-dev\n");
break;
case UHID_FEATURE:
- APPL_TRACE_DEBUG0("UHID_FEATURE from uhid-dev\n");
+ APPL_TRACE_DEBUG("UHID_FEATURE from uhid-dev\n");
break;
case UHID_FEATURE_ANSWER:
- APPL_TRACE_DEBUG0("UHID_FEATURE_ANSWER from uhid-dev\n");
+ APPL_TRACE_DEBUG("UHID_FEATURE_ANSWER from uhid-dev\n");
break;
default:
- APPL_TRACE_DEBUG1("Invalid event from uhid-dev: %u\n", ev.type);
+ APPL_TRACE_DEBUG("Invalid event from uhid-dev: %u\n", ev.type);
}
return 0;
@@ -131,7 +136,7 @@
**
*******************************************************************************/
static inline pthread_t create_thread(void *(*start_routine)(void *), void * arg){
- APPL_TRACE_DEBUG0("create_thread: entered");
+ APPL_TRACE_DEBUG("create_thread: entered");
pthread_attr_t thread_attr;
pthread_attr_init(&thread_attr);
@@ -139,10 +144,10 @@
pthread_t thread_id = -1;
if ( pthread_create(&thread_id, &thread_attr, start_routine, arg)!=0 )
{
- APPL_TRACE_ERROR1("pthread_create : %s", strerror(errno));
+ APPL_TRACE_ERROR("pthread_create : %s", strerror(errno));
return -1;
}
- APPL_TRACE_DEBUG0("create_thread: thread created successfully");
+ APPL_TRACE_DEBUG("create_thread: thread created successfully");
return thread_id;
}
@@ -159,20 +164,20 @@
{
btif_hh_device_t *p_dev = arg;
- APPL_TRACE_DEBUG2("%s: Thread created fd = %d", __FUNCTION__, p_dev->fd);
+ APPL_TRACE_DEBUG("%s: Thread created fd = %d", __FUNCTION__, p_dev->fd);
struct pollfd pfds[1];
int ret;
pfds[0].fd = p_dev->fd;
pfds[0].events = POLLIN;
while(p_dev->hh_keep_polling){
- ret = poll(pfds, 1, 500);
+ ret = poll(pfds, 1, 50);
if (ret < 0) {
- APPL_TRACE_ERROR2("%s: Cannot poll for fds: %s\n", __FUNCTION__, strerror(errno));
+ APPL_TRACE_ERROR("%s: Cannot poll for fds: %s\n", __FUNCTION__, strerror(errno));
break;
}
if (pfds[0].revents & POLLIN) {
- APPL_TRACE_DEBUG0("btif_hh_poll_event_thread: POLLIN");
+ APPL_TRACE_DEBUG("btif_hh_poll_event_thread: POLLIN");
ret = uhid_event(p_dev);
if (ret){
break;
@@ -186,7 +191,7 @@
static inline void btif_hh_close_poll_thread(btif_hh_device_t *p_dev)
{
- APPL_TRACE_DEBUG1("%s", __FUNCTION__);
+ APPL_TRACE_DEBUG("%s", __FUNCTION__);
p_dev->hh_keep_polling = 0;
if(p_dev->hh_poll_thread_id > 0)
pthread_join(p_dev->hh_poll_thread_id,NULL);
@@ -205,13 +210,13 @@
int bta_hh_co_write(int fd, UINT8* rpt, UINT16 len)
{
- APPL_TRACE_DEBUG0("bta_hh_co_data: UHID write");
+ APPL_TRACE_DEBUG("bta_hh_co_data: UHID write");
struct uhid_event ev;
memset(&ev, 0, sizeof(ev));
ev.type = UHID_INPUT;
ev.u.input.size = len;
if(len > sizeof(ev.u.input.data)){
- APPL_TRACE_WARNING1("%s:report size greater than allowed size",__FUNCTION__);
+ APPL_TRACE_WARNING("%s:report size greater than allowed size",__FUNCTION__);
return -1;
}
memcpy(ev.u.input.data, rpt, len);
@@ -236,7 +241,7 @@
btif_hh_device_t *p_dev = NULL;
if (dev_handle == BTA_HH_INVALID_HANDLE) {
- APPL_TRACE_WARNING2("%s: Oops, dev_handle (%d) is invalid...", __FUNCTION__, dev_handle);
+ APPL_TRACE_WARNING("%s: Oops, dev_handle (%d) is invalid...", __FUNCTION__, dev_handle);
return;
}
@@ -244,22 +249,22 @@
p_dev = &btif_hh_cb.devices[i];
if (p_dev->dev_status != BTHH_CONN_STATE_UNKNOWN && p_dev->dev_handle == dev_handle) {
// We found a device with the same handle. Must be a device reconnected.
- APPL_TRACE_WARNING2("%s: Found an existing device with the same handle "
+ APPL_TRACE_WARNING("%s: Found an existing device with the same handle "
"dev_status = %d",__FUNCTION__,
p_dev->dev_status);
- APPL_TRACE_WARNING6("%s: bd_addr = [%02X:%02X:%02X:%02X:%02X:]", __FUNCTION__,
+ APPL_TRACE_WARNING("%s: bd_addr = [%02X:%02X:%02X:%02X:%02X:]", __FUNCTION__,
p_dev->bd_addr.address[0], p_dev->bd_addr.address[1], p_dev->bd_addr.address[2],
p_dev->bd_addr.address[3], p_dev->bd_addr.address[4]);
- APPL_TRACE_WARNING4("%s: attr_mask = 0x%04x, sub_class = 0x%02x, app_id = %d",
+ APPL_TRACE_WARNING("%s: attr_mask = 0x%04x, sub_class = 0x%02x, app_id = %d",
__FUNCTION__, p_dev->attr_mask, p_dev->sub_class, p_dev->app_id);
if(p_dev->fd<0) {
p_dev->fd = open(dev_path, O_RDWR | O_CLOEXEC);
if (p_dev->fd < 0){
- APPL_TRACE_ERROR2("%s: Error: failed to open uhid, err:%s",
+ APPL_TRACE_ERROR("%s: Error: failed to open uhid, err:%s",
__FUNCTION__,strerror(errno));
}else
- APPL_TRACE_DEBUG2("%s: uhid fd = %d", __FUNCTION__, p_dev->fd);
+ APPL_TRACE_DEBUG("%s: uhid fd = %d", __FUNCTION__, p_dev->fd);
}
p_dev->hh_keep_polling = 1;
p_dev->hh_poll_thread_id = create_thread(btif_hh_poll_event_thread, p_dev);
@@ -283,10 +288,10 @@
// This is a new device,open the uhid driver now.
p_dev->fd = open(dev_path, O_RDWR | O_CLOEXEC);
if (p_dev->fd < 0){
- APPL_TRACE_ERROR2("%s: Error: failed to open uhid, err:%s",
+ APPL_TRACE_ERROR("%s: Error: failed to open uhid, err:%s",
__FUNCTION__,strerror(errno));
}else{
- APPL_TRACE_DEBUG2("%s: uhid fd = %d", __FUNCTION__, p_dev->fd);
+ APPL_TRACE_DEBUG("%s: uhid fd = %d", __FUNCTION__, p_dev->fd);
p_dev->hh_keep_polling = 1;
p_dev->hh_poll_thread_id = create_thread(btif_hh_poll_event_thread, p_dev);
}
@@ -298,12 +303,12 @@
}
if (p_dev == NULL) {
- APPL_TRACE_ERROR1("%s: Error: too many HID devices are connected", __FUNCTION__);
+ APPL_TRACE_ERROR("%s: Error: too many HID devices are connected", __FUNCTION__);
return;
}
p_dev->dev_status = BTHH_CONN_STATE_CONNECTED;
- APPL_TRACE_DEBUG2("%s: Return device status %d", __FUNCTION__, p_dev->dev_status);
+ APPL_TRACE_DEBUG("%s: Return device status %d", __FUNCTION__, p_dev->dev_status);
}
@@ -324,16 +329,16 @@
UINT32 i;
btif_hh_device_t *p_dev = NULL;
- APPL_TRACE_WARNING3("%s: dev_handle = %d, app_id = %d", __FUNCTION__, dev_handle, app_id);
+ APPL_TRACE_WARNING("%s: dev_handle = %d, app_id = %d", __FUNCTION__, dev_handle, app_id);
if (dev_handle == BTA_HH_INVALID_HANDLE) {
- APPL_TRACE_WARNING2("%s: Oops, dev_handle (%d) is invalid...", __FUNCTION__, dev_handle);
+ APPL_TRACE_WARNING("%s: Oops, dev_handle (%d) is invalid...", __FUNCTION__, dev_handle);
return;
}
for (i = 0; i < BTIF_HH_MAX_HID; i++) {
p_dev = &btif_hh_cb.devices[i];
if (p_dev->dev_status != BTHH_CONN_STATE_UNKNOWN && p_dev->dev_handle == dev_handle) {
- APPL_TRACE_WARNING3("%s: Found an existing device with the same handle "
+ APPL_TRACE_WARNING("%s: Found an existing device with the same handle "
"dev_status = %d, dev_handle =%d"
,__FUNCTION__,p_dev->dev_status
,p_dev->dev_handle);
@@ -341,7 +346,6 @@
break;
}
}
-
}
@@ -367,20 +371,20 @@
btif_hh_device_t *p_dev;
UNUSED(peer_addr);
- APPL_TRACE_DEBUG6("%s: dev_handle = %d, subclass = 0x%02X, mode = %d, "
+ APPL_TRACE_DEBUG("%s: dev_handle = %d, subclass = 0x%02X, mode = %d, "
"ctry_code = %d, app_id = %d",
__FUNCTION__, dev_handle, sub_class, mode, ctry_code, app_id);
p_dev = btif_hh_find_connected_dev_by_handle(dev_handle);
if (p_dev == NULL) {
- APPL_TRACE_WARNING2("%s: Error: unknown HID device handle %d", __FUNCTION__, dev_handle);
+ APPL_TRACE_WARNING("%s: Error: unknown HID device handle %d", __FUNCTION__, dev_handle);
return;
}
// Send the HID report to the kernel.
if (p_dev->fd >= 0) {
bta_hh_co_write(p_dev->fd, p_rpt, len);
}else {
- APPL_TRACE_WARNING3("%s: Error: fd = %d, len = %d", __FUNCTION__, p_dev->fd, len);
+ APPL_TRACE_WARNING("%s: Error: fd = %d, len = %d", __FUNCTION__, p_dev->fd, len);
}
}
@@ -405,13 +409,13 @@
struct uhid_event ev;
if (p_dev->fd < 0) {
- APPL_TRACE_WARNING3("%s: Error: fd = %d, dscp_len = %d", __FUNCTION__, p_dev->fd, dscp_len);
+ APPL_TRACE_WARNING("%s: Error: fd = %d, dscp_len = %d", __FUNCTION__, p_dev->fd, dscp_len);
return;
}
- APPL_TRACE_WARNING4("%s: fd = %d, name = [%s], dscp_len = %d", __FUNCTION__,
+ APPL_TRACE_WARNING("%s: fd = %d, name = [%s], dscp_len = %d", __FUNCTION__,
p_dev->fd, dev_name, dscp_len);
- APPL_TRACE_WARNING5("%s: vendor_id = 0x%04x, product_id = 0x%04x, version= 0x%04x,"
+ APPL_TRACE_WARNING("%s: vendor_id = 0x%04x, product_id = 0x%04x, version= 0x%04x,"
"ctry_code=0x%02x",__FUNCTION__,
vendor_id, product_id,
version, ctry_code);
@@ -434,11 +438,11 @@
ev.u.create.country = ctry_code;
result = uhid_write(p_dev->fd, &ev);
- APPL_TRACE_WARNING4("%s: fd = %d, dscp_len = %d, result = %d", __FUNCTION__,
+ APPL_TRACE_WARNING("%s: fd = %d, dscp_len = %d, result = %d", __FUNCTION__,
p_dev->fd, dscp_len, result);
if (result) {
- APPL_TRACE_WARNING2("%s: Error: failed to send DSCP, result = %d", __FUNCTION__, result);
+ APPL_TRACE_WARNING("%s: Error: failed to send DSCP, result = %d", __FUNCTION__, result);
/* The HID report descriptor is corrupted. Close the driver. */
close(p_dev->fd);
@@ -446,4 +450,118 @@
}
}
+#if (BLE_INCLUDED == TRUE && BTA_HH_LE_INCLUDED == TRUE)
+/*******************************************************************************
+**
+** Function bta_hh_le_co_rpt_info
+**
+** Description This callout function is to convey the report information on
+** a HOGP device to the application. Application can save this
+** information in NV if device is bonded and load it back when
+** stack reboot.
+**
+** Parameters remote_bda - remote device address
+** p_entry - report entry pointer
+** app_id - application id
+**
+** Returns void.
+**
+*******************************************************************************/
+void bta_hh_le_co_rpt_info(BD_ADDR remote_bda, tBTA_HH_RPT_CACHE_ENTRY *p_entry, UINT8 app_id)
+{
+ UNUSED(app_id);
+
+ unsigned len = 0;
+ unsigned type = 0;
+ unsigned idx = 0;
+
+ bdstr_t bdstr;
+ sprintf(bdstr, "%02x:%02x:%02x:%02x:%02x:%02x",
+ remote_bda[0], remote_bda[1], remote_bda[2],
+ remote_bda[3], remote_bda[4], remote_bda[5]);
+
+ btif_config_get("Remote", bdstr, "HidReport", NULL, (int*)&len, (int*)&type);
+ if (len >= sizeof(tBTA_HH_RPT_CACHE_ENTRY) && len <= sizeof(sReportCache))
+ {
+ btif_config_get("Remote", bdstr, "HidReport", (char*)sReportCache, (int*)&len, (int*)&type);
+ idx = len / sizeof(tBTA_HH_RPT_CACHE_ENTRY);
+ }
+
+ if (idx < BTA_HH_NV_LOAD_MAX)
+ {
+ memcpy(&sReportCache[idx++], p_entry, sizeof(tBTA_HH_RPT_CACHE_ENTRY));
+ btif_config_set("Remote", bdstr, "HidReport", (const char*)sReportCache,
+ idx * sizeof(tBTA_HH_RPT_CACHE_ENTRY), BTIF_CFG_TYPE_BIN);
+ BTIF_TRACE_DEBUG("%s() - Saving report; dev=%s, idx=%d", __FUNCTION__, bdstr, idx);
+ }
+}
+
+
+/*******************************************************************************
+**
+** Function bta_hh_le_co_cache_load
+**
+** Description This callout function is to request the application to load the
+** cached HOGP report if there is any. When cache reading is completed,
+** bta_hh_le_ci_cache_load() is called by the application.
+**
+** Parameters remote_bda - remote device address
+** p_num_rpt: number of cached report
+** app_id - application id
+**
+** Returns the acched report array
+**
+*******************************************************************************/
+tBTA_HH_RPT_CACHE_ENTRY * bta_hh_le_co_cache_load (BD_ADDR remote_bda,
+ UINT8 *p_num_rpt, UINT8 app_id)
+{
+ UNUSED(app_id);
+
+ unsigned len = 0;
+ unsigned type = 0;
+ unsigned idx = 0;
+
+ bdstr_t bdstr;
+ sprintf(bdstr, "%02x:%02x:%02x:%02x:%02x:%02x",
+ remote_bda[0], remote_bda[1], remote_bda[2],
+ remote_bda[3], remote_bda[4], remote_bda[5]);
+
+ btif_config_get("Remote", bdstr, "HidReport", NULL, (int*)&len, (int*)&type);
+ if (!p_num_rpt && len < sizeof(tBTA_HH_RPT_CACHE_ENTRY))
+ return NULL;
+
+ if (len > sizeof(sReportCache))
+ len = sizeof(sReportCache);
+ btif_config_get("Remote", bdstr, "HidReport", (char*)sReportCache, (int*)&len, (int*)&type);
+ *p_num_rpt = len / sizeof(tBTA_HH_RPT_CACHE_ENTRY);
+
+ BTIF_TRACE_DEBUG("%s() - Loaded %d reports; dev=%s", __FUNCTION__, *p_num_rpt, bdstr);
+
+ return sReportCache;
+}
+
+/*******************************************************************************
+**
+** Function bta_hh_le_co_reset_rpt_cache
+**
+** Description This callout function is to reset the HOGP device cache.
+**
+** Parameters remote_bda - remote device address
+**
+** Returns none
+**
+*******************************************************************************/
+void bta_hh_le_co_reset_rpt_cache (BD_ADDR remote_bda, UINT8 app_id)
+{
+ UNUSED(app_id);
+
+ bdstr_t bdstr;
+ sprintf(bdstr, "%02x:%02x:%02x:%02x:%02x:%02x",
+ remote_bda[0], remote_bda[1], remote_bda[2],
+ remote_bda[3], remote_bda[4], remote_bda[5]);
+ btif_config_remove("Remote", bdstr, "HidReport");
+
+ BTIF_TRACE_DEBUG("%s() - Reset cache for bda %s", __FUNCTION__, bdstr);
+}
+#endif /* #if (BLE_INCLUDED == TRUE && BTA_HH_LE_INCLUDED == TRUE) */
diff --git a/btif/co/bta_hl_co.c b/btif/co/bta_hl_co.c
index 1432974..22b7c89 100644
--- a/btif/co/bta_hl_co.c
+++ b/btif/co/bta_hl_co.c
@@ -81,7 +81,7 @@
}
- BTIF_TRACE_DEBUG3("%s success=%d num_mdeps=%d",
+ BTIF_TRACE_DEBUG("%s success=%d num_mdeps=%d",
__FUNCTION__, success, *p_num_of_mdep );
return success;
}
@@ -110,7 +110,7 @@
}
- BTIF_TRACE_DEBUG2("%s advertize_flag=%d", __FUNCTION__, advertize_source_sdp );
+ BTIF_TRACE_DEBUG("%s advertize_flag=%d", __FUNCTION__, advertize_source_sdp );
return advertize_source_sdp;
}
@@ -141,7 +141,7 @@
UINT8 app_idx;
BOOLEAN success = FALSE;
- BTIF_TRACE_DEBUG5("%s app_id=%d mdep_idx=%d mdep_id=%d mdep_counter=%d",
+ BTIF_TRACE_DEBUG("%s app_id=%d mdep_idx=%d mdep_id=%d mdep_counter=%d",
__FUNCTION__, app_id,mdep_idx,mdep_id,mdep_counter);
if (btif_hl_find_app_idx(app_id, &app_idx))
@@ -155,7 +155,7 @@
success = TRUE;
}
- BTIF_TRACE_DEBUG4("%s success=%d mdep_idx=%d mdep_id=%d",
+ BTIF_TRACE_DEBUG("%s success=%d mdep_idx=%d mdep_id=%d",
__FUNCTION__, success, mdep_idx, mdep_id );
return success;
@@ -183,7 +183,7 @@
btif_hl_app_cb_t *p_acb;
tBTA_HL_SUP_FEATURE *p_sup;
- BTIF_TRACE_DEBUG2("%s app_id=%d",__FUNCTION__, app_id );
+ BTIF_TRACE_DEBUG("%s app_id=%d",__FUNCTION__, app_id );
if (btif_hl_find_app_idx(app_id, &app_idx))
{
@@ -194,7 +194,7 @@
success = TRUE;
}
- BTIF_TRACE_DEBUG4("%s success=%d max tx_size=%d rx_size=%d",
+ BTIF_TRACE_DEBUG("%s success=%d max tx_size=%d rx_size=%d",
__FUNCTION__, success, p_echo_cfg->max_tx_apdu_size,
p_echo_cfg->max_rx_apdu_size );
@@ -219,7 +219,7 @@
void bta_hl_co_save_mdl(UINT8 mdep_id, UINT8 item_idx, tBTA_HL_MDL_CFG *p_mdl_cfg )
{
- BTIF_TRACE_DEBUG6("%s mdep_id =%d, item_idx=%d active=%d mdl_id=%d time=%d",
+ BTIF_TRACE_DEBUG("%s mdep_id =%d, item_idx=%d active=%d mdl_id=%d time=%d",
__FUNCTION__, mdep_id, item_idx,
p_mdl_cfg->active,
p_mdl_cfg->mdl_id,
@@ -246,7 +246,7 @@
{
- BTIF_TRACE_DEBUG3("%s mdep_id=%d, item_idx=%d", __FUNCTION__, mdep_id, item_idx);
+ BTIF_TRACE_DEBUG("%s mdep_id=%d, item_idx=%d", __FUNCTION__, mdep_id, item_idx);
btif_hl_delete_mdl_cfg(mdep_id, item_idx);
@@ -276,7 +276,7 @@
UINT8 i;
tBTA_HL_MDL_CFG *p;
- BTIF_TRACE_DEBUG3("%s app_id=%d, num_items=%d",
+ BTIF_TRACE_DEBUG("%s app_id=%d, num_items=%d",
__FUNCTION__, app_id, buffer_size);
if (buffer_size > BTA_HL_NUM_MDL_CFGS)
@@ -292,13 +292,13 @@
{
if (p->active)
{
- BTIF_TRACE_DEBUG6("i=%d mdl_id=0x%x dch_mode=%d local mdep_role=%d mdep_id=%d mtu=%d",
+ BTIF_TRACE_DEBUG("i=%d mdl_id=0x%x dch_mode=%d local mdep_role=%d mdep_id=%d mtu=%d",
i, p->mdl_id, p->dch_mode, p->local_mdep_role, p->local_mdep_role, p->mtu);
}
}
}
- BTIF_TRACE_DEBUG3("%s success=%d num_items=%d", __FUNCTION__, result, buffer_size);
+ BTIF_TRACE_DEBUG("%s success=%d num_items=%d", __FUNCTION__, result, buffer_size);
return result;
}
@@ -326,7 +326,7 @@
btif_hl_mdl_cb_t *p_dcb;
tBTA_HL_STATUS status = BTA_HL_STATUS_FAIL;
- BTIF_TRACE_DEBUG4("%s app_id=%d mdl_handle=0x%x buf_size=%d",
+ BTIF_TRACE_DEBUG("%s app_id=%d mdl_handle=0x%x buf_size=%d",
__FUNCTION__, app_id, mdl_handle, buf_size);
if (btif_hl_find_mdl_idx_using_handle(mdl_handle, &app_idx, &mcl_idx, &mdl_idx))
@@ -371,7 +371,7 @@
btif_hl_mdl_cb_t *p_dcb;
tBTA_HL_STATUS status = BTA_HL_STATUS_FAIL;
int r;
- BTIF_TRACE_DEBUG4("%s app_id=%d mdl_handle=0x%x data_size=%d",
+ BTIF_TRACE_DEBUG("%s app_id=%d mdl_handle=0x%x data_size=%d",
__FUNCTION__,app_id, mdl_handle, data_size);
if (btif_hl_find_mdl_idx_using_handle(mdl_handle, &app_idx, &mcl_idx, &mdl_idx))
@@ -383,18 +383,18 @@
memcpy(p_dcb->p_rx_pkt, p_data, data_size);
if (p_dcb->p_scb)
{
- BTIF_TRACE_DEBUG4("app_idx=%d mcl_idx=0x%x mdl_idx=0x%x data_size=%d",
+ BTIF_TRACE_DEBUG("app_idx=%d mcl_idx=0x%x mdl_idx=0x%x data_size=%d",
app_idx, mcl_idx, mdl_idx, data_size);
r = send(p_dcb->p_scb->socket_id[1], p_dcb->p_rx_pkt, data_size, 0);
if (r == data_size)
{
- BTIF_TRACE_DEBUG1("socket send success data_size=%d", data_size);
+ BTIF_TRACE_DEBUG("socket send success data_size=%d", data_size);
status = BTA_HL_STATUS_OK;
}
else
{
- BTIF_TRACE_ERROR2("socket send failed r=%d data_size=%d",r, data_size);
+ BTIF_TRACE_ERROR("socket send failed r=%d data_size=%d",r, data_size);
}
@@ -431,7 +431,7 @@
UNUSED(buf_size);
UNUSED(p_buf);
- BTIF_TRACE_ERROR1("%s not supported",__FUNCTION__);
+ BTIF_TRACE_ERROR("%s not supported",__FUNCTION__);
bta_hl_ci_get_echo_data(mcl_handle, status, evt);
}
@@ -460,7 +460,7 @@
UNUSED(data_size);
UNUSED(p_data);
- BTIF_TRACE_ERROR1("%s not supported",__FUNCTION__);
+ BTIF_TRACE_ERROR("%s not supported",__FUNCTION__);
bta_hl_ci_put_echo_data(mcl_handle, status, evt);
}
diff --git a/btif/co/bta_pan_co.c b/btif/co/bta_pan_co.c
index 1dcce8e..ad0c796 100644
--- a/btif/co/bta_pan_co.c
+++ b/btif/co/bta_pan_co.c
@@ -33,6 +33,7 @@
#include <hardware/bluetooth.h>
#include <hardware/bt_pan.h>
#include "btif_pan_internal.h"
+#include "btif_sock_thread.h"
#include "bd.h"
#include <string.h>
#include "btif_util.h"
@@ -49,7 +50,7 @@
*******************************************************************************/
UINT8 bta_pan_co_init(UINT8 *q_level)
{
- BTIF_TRACE_API0("bta_pan_co_init");
+ BTIF_TRACE_API("bta_pan_co_init");
/* set the q_level to 30 buffers */
*q_level = 30;
@@ -74,14 +75,14 @@
void bta_pan_co_open(UINT16 handle, UINT8 app_id, tBTA_PAN_ROLE local_role,
tBTA_PAN_ROLE peer_role, BD_ADDR peer_addr)
{
- BTIF_TRACE_API4("bta_pan_co_open:app_id:%d, local_role:%d, peer_role:%d, "
+ BTIF_TRACE_API("bta_pan_co_open:app_id:%d, local_role:%d, peer_role:%d, "
"handle:%d", app_id, local_role, peer_role, handle);
btpan_conn_t* conn = btpan_find_conn_addr(peer_addr);
if(conn == NULL)
conn = btpan_new_conn(handle, peer_addr, local_role, peer_role);
if(conn)
{
- BTIF_TRACE_DEBUG6("bta_pan_co_open:tap_fd:%d, open_count:%d, "
+ BTIF_TRACE_DEBUG("bta_pan_co_open:tap_fd:%d, open_count:%d, "
"conn->handle:%d should = handle:%d, local_role:%d, remote_role:%d",
btpan_cb.tap_fd, btpan_cb.open_count, conn->handle, handle,
conn->local_role, conn->remote_role);
@@ -98,6 +99,7 @@
}
if(btpan_cb.tap_fd >= 0)
{
+ btpan_cb.flow = 1;
conn->state = PAN_STATE_OPEN;
bta_pan_ci_rx_ready(handle);
}
@@ -117,11 +119,11 @@
*******************************************************************************/
void bta_pan_co_close(UINT16 handle, UINT8 app_id)
{
- BTIF_TRACE_API2("bta_pan_co_close:app_id:%d, handle:%d", app_id, handle);
+ BTIF_TRACE_API("bta_pan_co_close:app_id:%d, handle:%d", app_id, handle);
btpan_conn_t* conn = btpan_find_conn_handle(handle);
if(conn && conn->state == PAN_STATE_OPEN)
{
- BTIF_TRACE_DEBUG0("bta_pan_co_close");
+ BTIF_TRACE_DEBUG("bta_pan_co_close");
// let bta close event reset this handle as it needs
// the handle to find the connection upon CLOSE
@@ -129,14 +131,10 @@
conn->state = PAN_STATE_CLOSE;
btpan_cb.open_count--;
- if(btpan_cb.open_count == 0)
+ if(btpan_cb.open_count == 0 && btpan_cb.tap_fd != -1)
{
- destroy_tap_read_thread();
- if(btpan_cb.tap_fd != -1)
- {
- btpan_tap_close(btpan_cb.tap_fd);
- btpan_cb.tap_fd = -1;
- }
+ btpan_tap_close(btpan_cb.tap_fd);
+ btpan_cb.tap_fd = -1;
}
}
}
@@ -168,12 +166,12 @@
BOOLEAN ext;
BOOLEAN forward;
- BTIF_TRACE_API2("bta_pan_co_tx_path, handle:%d, app_id:%d", handle, app_id);
+ BTIF_TRACE_API("bta_pan_co_tx_path, handle:%d, app_id:%d", handle, app_id);
btpan_conn_t* conn = btpan_find_conn_handle(handle);
- if(conn && conn->state != PAN_STATE_OPEN)
+ if(!conn || conn->state != PAN_STATE_OPEN)
{
- BTIF_TRACE_ERROR2("bta_pan_co_tx_path: cannot find pan connction or conn"
+ BTIF_TRACE_ERROR("bta_pan_co_tx_path: cannot find pan connction or conn"
"is not opened, conn:%p, conn->state:%d", conn, conn->state);
return;
}
@@ -183,14 +181,14 @@
if ((p_buf = bta_pan_ci_readbuf(handle, src, dst, &protocol,
&ext, &forward)))
{
- BTIF_TRACE_DEBUG2("bta_pan_co_tx_path, calling btapp_tap_send, "
+ BTIF_TRACE_DEBUG("bta_pan_co_tx_path, calling btapp_tap_send, "
"p_buf->len:%d, offset:%d", p_buf->len, p_buf->offset);
if(is_empty_eth_addr(conn->eth_addr) && is_valid_bt_eth_addr(src))
{
- BTIF_TRACE_DEBUG6("pan bt peer addr: %02x:%02x:%02x:%02x:%02x:%02x",
+ BTIF_TRACE_DEBUG("pan bt peer addr: %02x:%02x:%02x:%02x:%02x:%02x",
conn->peer[0], conn->peer[1], conn->peer[2],
conn->peer[3],conn->peer[4], conn->peer[5]);
- BTIF_TRACE_DEBUG6(" update its ethernet addr: "
+ BTIF_TRACE_DEBUG(" update its ethernet addr: "
"%02x:%02x:%02x:%02x:%02x:%02x", src[0], src[1], src[2],
src[3],src[4], src[5]);
memcpy(conn->eth_addr, src, sizeof(conn->eth_addr));
@@ -221,7 +219,7 @@
UNUSED(handle);
UNUSED(app_id);
- BTIF_TRACE_API0("bta_pan_co_rx_path not used");
+ BTIF_TRACE_API("bta_pan_co_rx_path not used");
}
/*******************************************************************************
@@ -251,7 +249,7 @@
UNUSED(ext);
UNUSED(forward);
- BTIF_TRACE_API0("bta_pan_co_tx_write not used");
+ BTIF_TRACE_API("bta_pan_co_tx_write not used");
}
/*******************************************************************************
@@ -280,7 +278,7 @@
UNUSED(ext);
UNUSED(forward);
- BTIF_TRACE_API0("bta_pan_co_tx_writebuf not used");
+ BTIF_TRACE_API("bta_pan_co_tx_writebuf not used");
}
/*******************************************************************************
@@ -303,7 +301,11 @@
UNUSED(app_id);
UNUSED(enable);
- BTIF_TRACE_API1("bta_pan_co_rx_flow, enabled:%d, not used", enable);
+ BTIF_TRACE_API("bta_pan_co_rx_flow, enabled:%d, not used", enable);
+ btpan_conn_t* conn = btpan_find_conn_handle(handle);
+ if(!conn || conn->state != PAN_STATE_OPEN)
+ return;
+ btpan_set_flow_control(enable);
}
/*******************************************************************************
@@ -324,7 +326,7 @@
UNUSED(len);
UNUSED(p_filters);
- BTIF_TRACE_API0("bta_pan_co_pfilt_ind");
+ BTIF_TRACE_API("bta_pan_co_pfilt_ind");
}
/*******************************************************************************
@@ -345,6 +347,6 @@
UNUSED(len);
UNUSED(p_filters);
- BTIF_TRACE_API0("bta_pan_co_mfilt_ind");
+ BTIF_TRACE_API("bta_pan_co_mfilt_ind");
}
diff --git a/btif/include/btif_api.h b/btif/include/btif_api.h
index 3a5607f..2e41d22 100644
--- a/btif/include/btif_api.h
+++ b/btif/include/btif_api.h
@@ -206,7 +206,7 @@
** Returns bt_status_t
**
*******************************************************************************/
-bt_status_t btif_dm_create_bond(const bt_bdaddr_t *bd_addr);
+bt_status_t btif_dm_create_bond(const bt_bdaddr_t *bd_addr, int transport);
/*******************************************************************************
**
@@ -232,6 +232,17 @@
/*******************************************************************************
**
+** Function btif_dm_get_connection_state
+**
+** Description Returns whether the remote device is currently connected
+**
+** Returns 0 if not connected
+**
+*******************************************************************************/
+uint16_t btif_dm_get_connection_state(const bt_bdaddr_t *bd_addr);
+
+/*******************************************************************************
+**
** Function btif_dm_pin_reply
**
** Description BT legacy pairing - PIN code reply
@@ -338,6 +349,17 @@
/*******************************************************************************
**
+** Function btif_dm_read_energy_info
+**
+** Description Reads the energy info from controller
+**
+** Returns void
+**
+*******************************************************************************/
+void btif_dm_read_energy_info();
+
+/*******************************************************************************
+**
** Function btif_config_hci_snoop_log
**
** Description enable or disable HCI snoop log
diff --git a/btif/include/btif_av.h b/btif/include/btif_av.h
index 9e537cd..12174c9 100644
--- a/btif/include/btif_av.h
+++ b/btif/include/btif_av.h
@@ -44,7 +44,7 @@
BTIF_AV_START_STREAM_REQ_EVT,
BTIF_AV_STOP_STREAM_REQ_EVT,
BTIF_AV_SUSPEND_STREAM_REQ_EVT,
- BTIF_AV_RECONFIGURE_REQ_EVT,
+ BTIF_AV_SINK_CONFIG_REQ_EVT,
} btif_av_sm_event_t;
diff --git a/btif/include/btif_av_co.h b/btif/include/btif_av_co.h
index 20e9a1e..a6a5bfa 100644
--- a/btif/include/btif_av_co.h
+++ b/btif/include/btif_av_co.h
@@ -28,6 +28,7 @@
enum
{
BTIF_SV_AV_AA_SBC_INDEX = 0,
+ BTIF_SV_AV_AA_SBC_SINK_INDEX,
BTIF_SV_AV_AA_SEP_INDEX /* Last index */
};
diff --git a/btif/include/btif_common.h b/btif/include/btif_common.h
index f11b629..f6361e1 100644
--- a/btif/include/btif_common.h
+++ b/btif/include/btif_common.h
@@ -1,5 +1,6 @@
/******************************************************************************
*
+ * Copyright (c) 2014 The Android Open Source Project
* Copyright (C) 2009-2012 Broadcom Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -49,12 +50,13 @@
#define BTIF_HFP 2
#define BTIF_AV 3
#define BTIF_PAN 4
+#define BTIF_HF_CLIENT 5
extern bt_callbacks_t *bt_hal_cbacks;
#define HAL_CBACK(P_CB, P_CBACK, ...)\
if (P_CB && P_CB->P_CBACK) { \
- BTIF_TRACE_API2("HAL %s->%s", #P_CB, #P_CBACK); \
+ BTIF_TRACE_API("HAL %s->%s", #P_CB, #P_CBACK); \
P_CB->P_CBACK(__VA_ARGS__); \
} \
else { \
@@ -116,6 +118,9 @@
BTIF_PAN_CB_START = BTIF_SIG_CB_START(BTIF_PAN),
BTIF_PAN_CB_DISCONNECTING, /* PAN Disconnect has been sent to BTA successfully */
+
+ BTIF_HF_CLIENT_CLIENT_CB_START = BTIF_SIG_CB_START(BTIF_HF_CLIENT),
+ BTIF_HF_CLIENT_CB_AUDIO_CONNECTING, /* AUDIO connect has been sent to BTA successfully */
};
/* Macro definitions for BD ADDR persistence */
diff --git a/btif/include/btif_config_util.h b/btif/include/btif_config_util.h
index 3a2f53e..6a8bb72 100644
--- a/btif/include/btif_config_util.h
+++ b/btif/include/btif_config_util.h
@@ -44,7 +44,7 @@
#define BLUEZ_TYPES "types"
#define BLUEZ_CONFIG "config"
#define BLUEZ_ALIASES "aliases"
-
+#define BLUEZ_SDP "sdp"
/*******************************************************************************
** Functions
diff --git a/btif/include/btif_dm.h b/btif/include/btif_dm.h
index ed03e34..297e2a9 100644
--- a/btif/include/btif_dm.h
+++ b/btif/include/btif_dm.h
@@ -36,6 +36,17 @@
void btif_dm_on_disable(void);
/**
+ * Callout for handling io_capabilities request
+ */
+void btif_dm_proc_io_req(BD_ADDR bd_addr, tBTA_IO_CAP *p_io_cap, tBTA_OOB_DATA *p_oob_data,
+ tBTA_AUTH_REQ *p_auth_req, BOOLEAN is_orig);
+/**
+ * Callout for handling io_capabilities response
+ */
+void btif_dm_proc_io_rsp(BD_ADDR bd_addr, tBTA_IO_CAP io_cap,
+ tBTA_OOB_DATA oob_data, tBTA_AUTH_REQ auth_req);
+
+/**
* Out-of-band functions
*/
#if (BTM_OOB_INCLUDED == TRUE)
@@ -81,12 +92,19 @@
typedef struct
{
+ BT_OCTET16 irk;
+ tBLE_ADDR_TYPE addr_type;
+ BD_ADDR static_addr;
+}btif_dm_ble_pid_keys_t;
+
+typedef struct
+{
BOOLEAN is_penc_key_rcvd;
btif_dm_ble_penc_keys_t penc_key; /* received peer encryption key */
BOOLEAN is_pcsrk_key_rcvd;
btif_dm_ble_pcsrk_keys_t pcsrk_key; /* received peer device SRK */
BOOLEAN is_pid_key_rcvd;
- UINT8 pid_key[BT_OCTET16_LEN]; /* peer device ID key */
+ btif_dm_ble_pid_keys_t pid_key; /* peer device ID key */
BOOLEAN is_lenc_key_rcvd;
btif_dm_ble_lenc_keys_t lenc_key; /* local encryption reproduction keys LTK = = d1(ER,DIV,0)*/
BOOLEAN is_lcsrk_key_rcvd;
diff --git a/btif/include/btif_gatt_multi_adv_util.h b/btif/include/btif_gatt_multi_adv_util.h
new file mode 100644
index 0000000..e6c26a0
--- /dev/null
+++ b/btif/include/btif_gatt_multi_adv_util.h
@@ -0,0 +1,94 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 Broadcom Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+
+#ifndef BTIF_GATT_MULTI_ADV_UTIL_H
+#define BTIF_GATT_MULTI_ADV_UTIL_H
+
+#include <hardware/bluetooth.h>
+#include "bta_api.h"
+
+#define CLNT_IF_IDX 0
+#define INST_ID_IDX 1
+#define INST_ID_IDX_MAX INST_ID_IDX + 1
+#define INVALID_ADV_INST -1
+#define STD_ADV_INSTID 0
+
+/* Default ADV flags for general and limited discoverability */
+#define ADV_FLAGS_LIMITED BTA_DM_LIMITED_DISC
+#define ADV_FLAGS_GENERAL BTA_DM_GENERAL_DISC
+
+typedef struct
+{
+ int client_if;
+ BOOLEAN set_scan_rsp;
+ BOOLEAN include_name;
+ BOOLEAN include_txpower;
+ int min_interval;
+ int max_interval;
+ int appearance;
+ uint16_t manufacturer_len;
+ uint8_t* p_manufacturer_data;
+ uint16_t service_data_len;
+ uint8_t* p_service_data;
+ uint16_t service_uuid_len;
+ uint8_t* p_service_uuid;
+} btif_adv_data_t;
+
+typedef struct
+{
+ UINT8 inst_id;
+ BOOLEAN is_scan_rsp;
+ UINT8 client_if;
+ UINT16 service_uuid_len;
+ tBTA_BLE_AD_MASK mask;
+ tBTA_BLE_ADV_DATA data;
+ tBTA_BLE_ADV_PARAMS param;
+ TIMER_LIST_ENT tle_limited_timer;
+ int timeout_s;
+}btgatt_multi_adv_inst_cb;
+
+typedef struct
+{
+ INT8 *clntif_map;
+ // Includes the stored data for standard LE instance
+ btgatt_multi_adv_inst_cb *inst_cb;
+
+} btgatt_multi_adv_common_data;
+
+extern btgatt_multi_adv_common_data *btif_obtain_multi_adv_data_cb();
+extern void btif_gattc_init_multi_adv_cb(void);
+extern void btif_gattc_destroy_multi_adv_cb();
+extern int btif_multi_adv_add_instid_map(int client_if, int inst_id,
+ BOOLEAN gen_temp_instid);
+extern int btif_multi_adv_instid_for_clientif(int client_if);
+extern int btif_gattc_obtain_idx_for_datacb(int value, int clnt_inst_index);
+extern void btif_gattc_clear_clientif(int client_if);
+extern void btif_gattc_cleanup_inst_cb(int inst_id);
+extern void btif_gattc_cleanup_multi_inst_cb(btgatt_multi_adv_inst_cb *p_inst_cb);
+extern BOOLEAN btif_gattc_copy_datacb(int arrindex, btif_adv_data_t *p_adv_data,
+ BOOLEAN bInstData);
+extern void btif_gattc_adv_data_packager(int client_if, bool set_scan_rsp,
+ bool include_name, bool include_txpower, int min_interval, int max_interval,
+ int appearance, int manufacturer_len, char* manufacturer_data,
+ int service_data_len, char* service_data, int service_uuid_len,
+ char* service_uuid, btif_adv_data_t *p_multi_adv_inst);
+void btif_multi_adv_timer_ctrl(int client_if, TIMER_CBACK cb);
+#endif
+
+
diff --git a/btif/include/btif_gatt_util.h b/btif/include/btif_gatt_util.h
index 74ac6bc..87c263b 100644
--- a/btif/include/btif_gatt_util.h
+++ b/btif/include/btif_gatt_util.h
@@ -26,6 +26,7 @@
void btif_to_bta_gatt_id(tBTA_GATT_ID *p_dest, btgatt_gatt_id_t *p_src);
void btif_to_bta_srvc_id(tBTA_GATT_SRVC_ID *p_dest, btgatt_srvc_id_t *p_src);
void btif_to_bta_response(tBTA_GATTS_RSP *p_dest, btgatt_response_t* p_src);
+void btif_to_bta_uuid_mask(tBTA_DM_BLE_PF_COND_MASK *p_mask, bt_uuid_t *p_src);
void bta_to_btif_uuid(bt_uuid_t *p_dest, tBT_UUID *p_src);
void bta_to_btif_srvc_id(btgatt_srvc_id_t *p_dest, tBTA_GATT_SRVC_ID *p_src);
diff --git a/main/bte_version.c b/btif/include/btif_mce.h
similarity index 60%
copy from main/bte_version.c
copy to btif/include/btif_mce.h
index 826f31b..aa61cfb 100644
--- a/main/bte_version.c
+++ b/btif/include/btif_mce.h
@@ -1,6 +1,7 @@
/******************************************************************************
*
- * Copyright (C) 2001-2012 Broadcom Corporation
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright (C) 2009-2012 Broadcom Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,8 +17,19 @@
*
******************************************************************************/
-#include "bt_types.h"
+/*******************************************************************************
+ *
+ * Filename: btif_mce.h
+ *
+ * Description: Bluetooth MCE Interface
+ *
+ *******************************************************************************/
-const UINT8 bte_version_string[] = "BCM1200_PI_10.3.20.52";
-const UINT8 btif_version_string[] = "BDROID-PLUS-420-10_00.10";
+#ifndef BTIF_MCE_H
+#define BTIF_MCE_H
+#include <hardware/bt_mce.h>
+
+btmce_interface_t *btif_mce_get_interface();
+
+#endif
diff --git a/btif/include/btif_media.h b/btif/include/btif_media.h
old mode 100755
new mode 100644
index 4cdbb8c..f01286b
--- a/btif/include/btif_media.h
+++ b/btif/include/btif_media.h
@@ -90,8 +90,13 @@
tBTIF_AV_FEEDING_MODE feeding_mode;
tBTIF_AV_MEDIA_FEEDINGS feeding;
} tBTIF_MEDIA_INIT_AUDIO_FEEDING;
-#endif
+typedef struct
+{
+ BT_HDR hdr;
+ UINT8 codec_info[AVDT_CODEC_SIZE];
+} tBTIF_MEDIA_SINK_CFG_UPDATE;
+#endif
/*******************************************************************************
** Public functions
@@ -154,7 +159,16 @@
*******************************************************************************/
extern BOOLEAN btif_media_task_stop_aa_req(void);
-
+/*******************************************************************************
+ **
+ ** Function btif_media_task_aa_rx_flush_req
+ **
+ ** Description Request to flush audio decoding pipe
+ **
+ ** Returns TRUE is success
+ **
+ *******************************************************************************/
+extern BOOLEAN btif_media_task_aa_rx_flush_req(void);
/*******************************************************************************
**
** Function btif_media_task_aa_tx_flush_req
@@ -179,6 +193,19 @@
/*******************************************************************************
**
+ ** Function btif_media_sink_enque_buf
+ **
+ ** Description This function is called by the av_co to fill A2DP Sink Queue
+ **
+ **
+ ** Returns size of the queue
+ *******************************************************************************/
+ UINT8 btif_media_sink_enque_buf(BT_HDR *p_buf);
+
+
+
+/*******************************************************************************
+ **
** Function btif_media_aa_writebuf
**
** Description Enqueue a Advance Audio media GKI buffer to be processed by btif media task.
@@ -243,5 +270,13 @@
void btif_a2dp_on_suspend(void);
void btif_a2dp_on_suspended(tBTA_AV_SUSPEND *p_av);
void btif_a2dp_set_tx_flush(BOOLEAN enable);
+void btif_a2dp_set_rx_flush(BOOLEAN enable);
+void btif_media_check_iop_exceptions(UINT8 *peer_bda);
+void btif_reset_decoder(UINT8 *p_av);
+BOOLEAN btif_media_task_start_decoding_req(void);
+
+int btif_a2dp_get_track_frequency(UINT8 frequency);
+int btif_a2dp_get_track_channel_count(UINT8 channeltype);
+void btif_a2dp_set_peer_sep(UINT8 sep);
#endif
diff --git a/btif/include/btif_pan_internal.h b/btif/include/btif_pan_internal.h
index d697ac8..64bab99 100644
--- a/btif/include/btif_pan_internal.h
+++ b/btif/include/btif_pan_internal.h
@@ -79,7 +79,10 @@
int tap_fd;
int enabled;
int open_count;
+ int flow; // 1: outbound data flow on; 0: outbound data flow off
btpan_conn_t conns[MAX_PAN_CONNS];
+ int congest_packet_size;
+ unsigned char congest_packet[1600]; //max ethernet packet size
} btpan_cb_t;
@@ -91,6 +94,7 @@
btpan_conn_t *btpan_new_conn(int handle, const BD_ADDR addr, int local_role, int peer_role);
btpan_conn_t *btpan_find_conn_addr(const BD_ADDR addr);
btpan_conn_t *btpan_find_conn_handle(UINT16 handle);
+void btpan_set_flow_control(BOOLEAN enable);
int btpan_get_connected_count(void);
int btpan_tap_open(void);
void create_tap_read_thread(int tap_fd);
diff --git a/btif/include/btif_profile_queue.h b/btif/include/btif_profile_queue.h
index 931f457..b586575 100644
--- a/btif/include/btif_profile_queue.h
+++ b/btif/include/btif_profile_queue.h
@@ -27,10 +27,9 @@
#ifndef BTIF_PROFILE_QUEUE_H
#define BTIF_PROFILE_QUEUE_H
-typedef bt_status_t (btif_connect_cb_t) (bt_bdaddr_t *bda);
+typedef bt_status_t (*btif_connect_cb_t) (bt_bdaddr_t *bda, uint16_t uuid);
-bt_status_t btif_queue_connect(uint16_t uuid, const bt_bdaddr_t *bda,
- btif_connect_cb_t *connect_cb);
+bt_status_t btif_queue_connect(uint16_t uuid, const bt_bdaddr_t *bda, btif_connect_cb_t connect_cb);
void btif_queue_advance();
void btif_queue_release();
diff --git a/btif/include/btif_storage.h b/btif/include/btif_storage.h
index 9a69b00..f64c695 100644
--- a/btif/include/btif_storage.h
+++ b/btif/include/btif_storage.h
@@ -353,4 +353,34 @@
bt_status_t btif_storage_get_remote_version(const bt_bdaddr_t *remote_bd_addr,
bt_remote_version_t *p_ver);
+
+/*******************************************************************************
+**
+** Function btif_storage_set_dmt_support_type
+**
+** Description Sets DMT support status for a remote device
+**
+** Returns BT_STATUS_SUCCESS if config update is successful
+** BT_STATUS_FAIL otherwise
+**
+*******************************************************************************/
+
+bt_status_t btif_storage_set_dmt_support_type(const bt_bdaddr_t *remote_bd_addr,
+ BOOLEAN dmt_supported);
+
+
+
+/*******************************************************************************
+**
+** Function btif_storage_is_dmt_supported_device
+**
+** Description checks if a device supports Dual mode topology
+**
+** Returns TRUE if remote supports DMT else FALSE
+**
+*******************************************************************************/
+
+BOOLEAN btif_storage_is_dmt_supported_device(const bt_bdaddr_t *remote_bd_addr);
+
+
#endif /* BTIF_STORAGE_H */
diff --git a/btif/include/btif_util.h b/btif/include/btif_util.h
old mode 100755
new mode 100644
index 95969dd..4f1a9cc
--- a/btif/include/btif_util.h
+++ b/btif/include/btif_util.h
@@ -1,5 +1,6 @@
/******************************************************************************
*
+ * Copyright (c) 2014 The Android Open Source Project
* Copyright (C) 2009-2012 Broadcom Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -50,6 +51,7 @@
const char* dump_dm_search_event(UINT16 event);
const char* dump_dm_event(UINT16 event);
const char* dump_hf_event(UINT16 event);
+const char* dump_hf_client_event(UINT16 event);
const char* dump_hh_event(UINT16 event);
const char* dump_hf_conn_state(UINT16 event);
const char* dump_hf_call_state(bthf_call_state_t call_state);
diff --git a/btif/src/bluetooth.c b/btif/src/bluetooth.c
old mode 100755
new mode 100644
index f6c2f48..5c730f9
--- a/btif/src/bluetooth.c
+++ b/btif/src/bluetooth.c
@@ -30,11 +30,13 @@
#include <hardware/bluetooth.h>
#include <hardware/bt_hf.h>
+#include <hardware/bt_hf_client.h>
#include <hardware/bt_av.h>
#include <hardware/bt_sock.h>
#include <hardware/bt_hh.h>
#include <hardware/bt_hl.h>
#include <hardware/bt_pan.h>
+#include <hardware/bt_mce.h>
#include <hardware/bt_gatt.h>
#include <hardware/bt_rc.h>
@@ -60,6 +62,9 @@
bt_callbacks_t *bt_hal_cbacks = NULL;
+/** Operating System specific callouts for resource management */
+bt_os_callouts_t *bt_os_callouts = NULL;
+
/************************************************************************************
** Static functions
************************************************************************************/
@@ -68,14 +73,15 @@
** Externs
************************************************************************************/
-extern bt_wakelock_callback config_wakelock_callback;
-
/* list all extended interfaces here */
/* handsfree profile */
extern bthf_interface_t *btif_hf_get_interface();
+/* handsfree profile - client */
+extern bthf_client_interface_t *btif_hf_client_get_interface();
/* advanced audio profile */
-extern btav_interface_t *btif_av_get_interface();
+extern btav_interface_t *btif_av_get_src_interface();
+extern btav_interface_t *btif_av_get_sink_interface();
/*rfc l2cap*/
extern btsock_interface_t *btif_sock_get_interface();
/* hid host profile */
@@ -84,12 +90,16 @@
extern bthl_interface_t *btif_hl_get_interface();
/*pan*/
extern btpan_interface_t *btif_pan_get_interface();
+/*map client*/
+extern btmce_interface_t *btif_mce_get_interface();
#if BLE_INCLUDED == TRUE
/* gatt */
extern btgatt_interface_t *btif_gatt_get_interface();
#endif
-/* avrc */
+/* avrc target */
extern btrc_interface_t *btif_rc_get_interface();
+/* avrc controller */
+extern btrc_interface_t *btif_rc_ctrl_get_interface();
/************************************************************************************
** Functions
@@ -121,7 +131,6 @@
/* store reference to user callbacks */
bt_hal_cbacks = callbacks;
- config_wakelock_callback = callbacks->bt_wakelock_cb;
/* add checks for individual callbacks ? */
@@ -256,13 +265,13 @@
return btif_dm_cancel_discovery();
}
-static int create_bond(const bt_bdaddr_t *bd_addr)
+static int create_bond(const bt_bdaddr_t *bd_addr, int transport)
{
/* sanity check */
if (interface_ready() == FALSE)
return BT_STATUS_NOT_READY;
- return btif_dm_create_bond(bd_addr);
+ return btif_dm_create_bond(bd_addr, transport);
}
static int cancel_bond(const bt_bdaddr_t *bd_addr)
@@ -283,6 +292,15 @@
return btif_dm_remove_bond(bd_addr);
}
+static int get_connection_state(const bt_bdaddr_t *bd_addr)
+{
+ /* sanity check */
+ if (interface_ready() == FALSE)
+ return 0;
+
+ return btif_dm_get_connection_state(bd_addr);
+}
+
static int pin_reply(const bt_bdaddr_t *bd_addr, uint8_t accept,
uint8_t pin_len, bt_pin_code_t *pin_code)
{
@@ -303,6 +321,14 @@
return btif_dm_ssp_reply(bd_addr, variant, accept, passkey);
}
+static int read_energy_info()
+{
+ if (interface_ready() == FALSE)
+ return BT_STATUS_NOT_READY;
+ btif_dm_read_energy_info();
+ return BT_STATUS_SUCCESS;
+}
+
static const void* get_profile_interface (const char *profile_id)
{
ALOGI("get_profile_interface %s", profile_id);
@@ -315,6 +341,9 @@
if (is_profile(profile_id, BT_PROFILE_HANDSFREE_ID))
return btif_hf_get_interface();
+ if (is_profile(profile_id, BT_PROFILE_HANDSFREE_CLIENT_ID))
+ return btif_hf_client_get_interface();
+
if (is_profile(profile_id, BT_PROFILE_SOCKETS_ID))
return btif_sock_get_interface();
@@ -322,7 +351,10 @@
return btif_pan_get_interface();
if (is_profile(profile_id, BT_PROFILE_ADVANCED_AUDIO_ID))
- return btif_av_get_interface();
+ return btif_av_get_src_interface();
+
+ if (is_profile(profile_id, BT_PROFILE_ADVANCED_AUDIO_SINK_ID))
+ return btif_av_get_sink_interface();
if (is_profile(profile_id, BT_PROFILE_HIDHOST_ID))
return btif_hh_get_interface();
@@ -330,7 +362,10 @@
if (is_profile(profile_id, BT_PROFILE_HEALTH_ID))
return btif_hl_get_interface();
-#if BTA_GATT_INCLUDED == TRUE
+ if (is_profile(profile_id, BT_PROFILE_MAP_CLIENT_ID))
+ return btif_mce_get_interface();
+
+#if ( BTA_GATT_INCLUDED == TRUE && BLE_INCLUDED == TRUE)
if (is_profile(profile_id, BT_PROFILE_GATT_ID))
return btif_gatt_get_interface();
#endif
@@ -338,6 +373,9 @@
if (is_profile(profile_id, BT_PROFILE_AV_RC_ID))
return btif_rc_get_interface();
+ if (is_profile(profile_id, BT_PROFILE_AV_RC_CTRL_ID))
+ return btif_rc_ctrl_get_interface();
+
return NULL;
}
@@ -387,6 +425,11 @@
return btif_config_hci_snoop_log(enable);
}
+static int set_os_callouts(bt_os_callouts_t *callouts) {
+ bt_os_callouts = callouts;
+ return BT_STATUS_SUCCESS;
+}
+
static const bt_interface_t bluetoothInterface = {
sizeof(bluetoothInterface),
init,
@@ -406,6 +449,7 @@
create_bond,
remove_bond,
cancel_bond,
+ get_connection_state,
pin_reply,
ssp_reply,
get_profile_interface,
@@ -416,7 +460,9 @@
#else
NULL,
#endif
- config_hci_snoop_log
+ config_hci_snoop_log,
+ set_os_callouts,
+ read_energy_info,
};
const bt_interface_t* bluetooth__get_bluetooth_interface ()
diff --git a/btif/src/btif_av.c b/btif/src/btif_av.c
old mode 100755
new mode 100644
index 3c0c293..8f3a974
--- a/btif/src/btif_av.c
+++ b/btif/src/btif_av.c
@@ -26,6 +26,7 @@
*****************************************************************************/
#include <hardware/bluetooth.h>
+#include <system/audio.h>
#include "hardware/bt_av.h"
#define LOG_TAG "BTIF_AV"
@@ -39,6 +40,7 @@
#include "gki.h"
#include "bd.h"
#include "btu.h"
+#include "bt_utils.h"
/*****************************************************************************
** Constants & Macros
@@ -76,24 +78,39 @@
btif_sm_handle_t sm_handle;
UINT8 flags;
tBTA_AV_EDR edr;
+ UINT8 peer_sep; /* sep type of peer device */
} btif_av_cb_t;
+typedef struct
+{
+ bt_bdaddr_t *target_bda;
+ uint16_t uuid;
+} btif_av_connect_req_t;
+
+typedef struct
+{
+ int sample_rate;
+ int channel_count;
+} btif_av_sink_config_req_t;
+
/*****************************************************************************
** Static variables
******************************************************************************/
-static btav_callbacks_t *bt_av_callbacks = NULL;
+static btav_callbacks_t *bt_av_src_callbacks = NULL;
+static btav_callbacks_t *bt_av_sink_callbacks = NULL;
static btif_av_cb_t btif_av_cb;
static TIMER_LIST_ENT tle_av_open_on_rc;
/* both interface and media task needs to be ready to alloc incoming request */
-#define CHECK_BTAV_INIT() if ((bt_av_callbacks == NULL) || (btif_av_cb.sm_handle == NULL))\
+#define CHECK_BTAV_INIT() if (((bt_av_src_callbacks == NULL) &&(bt_av_sink_callbacks == NULL)) \
+ || (btif_av_cb.sm_handle == NULL))\
{\
- BTIF_TRACE_WARNING1("%s: BTAV not initialized", __FUNCTION__);\
+ BTIF_TRACE_WARNING("%s: BTAV not initialized", __FUNCTION__);\
return BT_STATUS_NOT_READY;\
}\
else\
{\
- BTIF_TRACE_EVENT1("%s", __FUNCTION__);\
+ BTIF_TRACE_EVENT("%s", __FUNCTION__);\
}
/* Helper macro to avoid code duplication in the state machine handlers */
@@ -178,8 +195,7 @@
CASE_RETURN_STR(BTIF_AV_START_STREAM_REQ_EVT)
CASE_RETURN_STR(BTIF_AV_STOP_STREAM_REQ_EVT)
CASE_RETURN_STR(BTIF_AV_SUSPEND_STREAM_REQ_EVT)
- CASE_RETURN_STR(BTIF_AV_RECONFIGURE_REQ_EVT)
-
+ CASE_RETURN_STR(BTIF_AV_SINK_CONFIG_REQ_EVT)
default: return "UNKNOWN_EVENT";
}
}
@@ -202,15 +218,19 @@
{
BD_ADDR peer_addr;
UNUSED(tle);
-
+ btif_av_connect_req_t connect_req;
+ UNUSED(tle);
/* is there at least one RC connection - There should be */
if (btif_rc_get_connected_peer(peer_addr)) {
- BTIF_TRACE_DEBUG1("%s Issuing connect to the remote RC peer", __FUNCTION__);
- btif_sm_dispatch(btif_av_cb.sm_handle, BTIF_AV_CONNECT_REQ_EVT, (void*)&peer_addr);
+ BTIF_TRACE_DEBUG("%s Issuing connect to the remote RC peer", __FUNCTION__);
+ /* In case of AVRCP connection request, we will initiate SRC connection */
+ connect_req.target_bda = (bt_bdaddr_t*)&peer_addr;
+ connect_req.uuid = UUID_SERVCLASS_AUDIO_SOURCE;
+ btif_sm_dispatch(btif_av_cb.sm_handle, BTIF_AV_CONNECT_REQ_EVT, (char*)&connect_req);
}
else
{
- BTIF_TRACE_ERROR1("%s No connected RC peers", __FUNCTION__);
+ BTIF_TRACE_ERROR("%s No connected RC peers", __FUNCTION__);
}
}
@@ -218,9 +238,27 @@
** Static functions
******************************************************************************/
+static void btif_report_connection_state(btav_connection_state_t state, bt_bdaddr_t *bd_addr)
+{
+ if (btif_av_cb.peer_sep == AVDT_TSEP_SRC && bt_av_sink_callbacks != NULL) {
+ HAL_CBACK(bt_av_sink_callbacks, connection_state_cb, state, bd_addr);
+ } else if (btif_av_cb.peer_sep == AVDT_TSEP_SNK && bt_av_src_callbacks != NULL) {
+ HAL_CBACK(bt_av_src_callbacks, connection_state_cb, state, bd_addr);
+ }
+}
+
+static void btif_report_audio_state(btav_audio_state_t state, bt_bdaddr_t *bd_addr)
+{
+ if (btif_av_cb.peer_sep == AVDT_TSEP_SRC && bt_av_sink_callbacks != NULL) {
+ HAL_CBACK(bt_av_sink_callbacks, audio_state_cb, state, bd_addr);
+ } else if (btif_av_cb.peer_sep == AVDT_TSEP_SNK && bt_av_src_callbacks != NULL) {
+ HAL_CBACK(bt_av_src_callbacks, audio_state_cb, state, bd_addr);
+ }
+}
+
/*****************************************************************************
**
-** Function btif_av_state_idle_handler
+** Function btif_av_state_idle_handler
**
** Description State managing disconnected AV link
**
@@ -230,7 +268,7 @@
static BOOLEAN btif_av_state_idle_handler(btif_sm_event_t event, void *p_data)
{
- BTIF_TRACE_DEBUG3("%s event:%s flags %x", __FUNCTION__,
+ BTIF_TRACE_DEBUG("%s event:%s flags %x", __FUNCTION__,
dump_av_sm_event_name(event), btif_av_cb.flags);
switch (event)
@@ -258,14 +296,17 @@
{
if (event == BTIF_AV_CONNECT_REQ_EVT)
{
- memcpy(&btif_av_cb.peer_bda, (bt_bdaddr_t*)p_data, sizeof(bt_bdaddr_t));
+ memcpy(&btif_av_cb.peer_bda, ((btif_av_connect_req_t*)p_data)->target_bda,
+ sizeof(bt_bdaddr_t));
+ BTA_AvOpen(btif_av_cb.peer_bda.address, btif_av_cb.bta_handle,
+ TRUE, BTA_SEC_NONE, ((btif_av_connect_req_t*)p_data)->uuid);
}
else if (event == BTA_AV_PENDING_EVT)
{
bdcpy(btif_av_cb.peer_bda.address, ((tBTA_AV*)p_data)->pend.bd_addr);
+ BTA_AvOpen(btif_av_cb.peer_bda.address, btif_av_cb.bta_handle,
+ TRUE, BTA_SEC_NONE, UUID_SERVCLASS_AUDIO_SOURCE);
}
- BTA_AvOpen(btif_av_cb.peer_bda.address, btif_av_cb.bta_handle,
- TRUE, BTA_SEC_NONE);
btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_OPENING);
} break;
@@ -280,7 +321,7 @@
* TODO: We may need to do this only on an AVRCP Play. FixMe
*/
- BTIF_TRACE_DEBUG0("BTA_AV_RC_OPEN_EVT received w/o AV");
+ BTIF_TRACE_DEBUG("BTA_AV_RC_OPEN_EVT received w/o AV");
memset(&tle_av_open_on_rc, 0, sizeof(tle_av_open_on_rc));
tle_av_open_on_rc.param = (UINT32)btif_initiate_av_open_tmr_hdlr;
btu_start_timer(&tle_av_open_on_rc, BTU_TTYPE_USER_FUNC,
@@ -297,14 +338,14 @@
case BTA_AV_RC_CLOSE_EVT:
if (tle_av_open_on_rc.in_use) {
- BTIF_TRACE_DEBUG0("BTA_AV_RC_CLOSE_EVT: Stopping AV timer.");
+ BTIF_TRACE_DEBUG("BTA_AV_RC_CLOSE_EVT: Stopping AV timer.");
btu_stop_timer(&tle_av_open_on_rc);
}
btif_rc_handler(event, p_data);
break;
default:
- BTIF_TRACE_WARNING2("%s : unhandled event:%s", __FUNCTION__,
+ BTIF_TRACE_WARNING("%s : unhandled event:%s", __FUNCTION__,
dump_av_sm_event_name(event));
return FALSE;
@@ -324,26 +365,31 @@
static BOOLEAN btif_av_state_opening_handler(btif_sm_event_t event, void *p_data)
{
- BTIF_TRACE_DEBUG3("%s event:%s flags %x", __FUNCTION__,
+ BTIF_TRACE_DEBUG("%s event:%s flags %x", __FUNCTION__,
dump_av_sm_event_name(event), btif_av_cb.flags);
switch (event)
{
case BTIF_SM_ENTER_EVT:
/* inform the application that we are entering connecting state */
- HAL_CBACK(bt_av_callbacks, connection_state_cb,
- BTAV_CONNECTION_STATE_CONNECTING, &(btif_av_cb.peer_bda));
+ btif_report_connection_state(BTAV_CONNECTION_STATE_CONNECTING, &(btif_av_cb.peer_bda));
break;
case BTIF_SM_EXIT_EVT:
break;
+ case BTA_AV_REJECT_EVT:
+ BTIF_TRACE_DEBUG(" Received BTA_AV_REJECT_EVT ");
+ btif_report_connection_state(BTAV_CONNECTION_STATE_DISCONNECTED, &(btif_av_cb.peer_bda));
+ btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_IDLE);
+ break;
+
case BTA_AV_OPEN_EVT:
{
tBTA_AV *p_bta_data = (tBTA_AV*)p_data;
btav_connection_state_t state;
btif_sm_state_t av_state;
- BTIF_TRACE_DEBUG2("status:%d, edr 0x%x",p_bta_data->open.status,
+ BTIF_TRACE_DEBUG("status:%d, edr 0x%x",p_bta_data->open.status,
p_bta_data->open.edr);
if (p_bta_data->open.status == BTA_AV_SUCCESS)
@@ -351,30 +397,56 @@
state = BTAV_CONNECTION_STATE_CONNECTED;
av_state = BTIF_AV_STATE_OPENED;
btif_av_cb.edr = p_bta_data->open.edr;
+
+ btif_av_cb.peer_sep = p_bta_data->open.sep;
+ btif_a2dp_set_peer_sep(p_bta_data->open.sep);
}
else
{
- BTIF_TRACE_WARNING1("BTA_AV_OPEN_EVT::FAILED status: %d",
+ BTIF_TRACE_WARNING("BTA_AV_OPEN_EVT::FAILED status: %d",
p_bta_data->open.status );
state = BTAV_CONNECTION_STATE_DISCONNECTED;
av_state = BTIF_AV_STATE_IDLE;
}
/* inform the application of the event */
- HAL_CBACK(bt_av_callbacks, connection_state_cb,
- state, &(btif_av_cb.peer_bda));
+ btif_report_connection_state(state, &(btif_av_cb.peer_bda));
/* change state to open/idle based on the status */
btif_sm_change_state(btif_av_cb.sm_handle, av_state);
- /* if queued PLAY command, send it now */
- btif_rc_check_handle_pending_play(p_bta_data->open.bd_addr,
+ if (btif_av_cb.peer_sep == AVDT_TSEP_SNK)
+ {
+ /* if queued PLAY command, send it now */
+ btif_rc_check_handle_pending_play(p_bta_data->open.bd_addr,
(p_bta_data->open.status == BTA_AV_SUCCESS));
+ }
+ else if (btif_av_cb.peer_sep == AVDT_TSEP_SRC)
+ {
+ /* if queued PLAY command, send it now */
+ btif_rc_check_handle_pending_play(p_bta_data->open.bd_addr, FALSE);
+ /* Bring up AVRCP connection too */
+ BTA_AvOpenRc(btif_av_cb.bta_handle);
+ }
btif_queue_advance();
} break;
+ case BTIF_AV_SINK_CONFIG_REQ_EVT:
+ {
+ btif_av_sink_config_req_t req;
+ // copy to avoid alignment problems
+ memcpy(&req, p_data, sizeof(req));
+
+ BTIF_TRACE_WARNING("BTIF_AV_SINK_CONFIG_REQ_EVT %d %d", req.sample_rate,
+ req.channel_count);
+ if (btif_av_cb.peer_sep == AVDT_TSEP_SRC && bt_av_sink_callbacks != NULL) {
+ HAL_CBACK(bt_av_sink_callbacks, audio_config_cb, &(btif_av_cb.peer_bda),
+ req.sample_rate, req.channel_count);
+ }
+ } break;
+
CHECK_RC_EVENT(event, p_data);
default:
- BTIF_TRACE_WARNING2("%s : unhandled event:%s", __FUNCTION__,
+ BTIF_TRACE_WARNING("%s : unhandled event:%s", __FUNCTION__,
dump_av_sm_event_name(event));
return FALSE;
@@ -396,26 +468,38 @@
static BOOLEAN btif_av_state_closing_handler(btif_sm_event_t event, void *p_data)
{
- BTIF_TRACE_DEBUG3("%s event:%s flags %x", __FUNCTION__,
+ BTIF_TRACE_DEBUG("%s event:%s flags %x", __FUNCTION__,
dump_av_sm_event_name(event), btif_av_cb.flags);
switch (event)
{
case BTIF_SM_ENTER_EVT:
-
- /* immediately stop transmission of frames */
- btif_a2dp_set_tx_flush(TRUE);
- /* wait for audioflinger to stop a2dp */
+ if (btif_av_cb.peer_sep == AVDT_TSEP_SNK)
+ {
+ /* immediately stop transmission of frames */
+ btif_a2dp_set_tx_flush(TRUE);
+ /* wait for audioflinger to stop a2dp */
+ }
+ if (btif_av_cb.peer_sep == AVDT_TSEP_SRC)
+ {
+ btif_a2dp_set_rx_flush(TRUE);
+ }
break;
case BTA_AV_STOP_EVT:
case BTIF_AV_STOP_STREAM_REQ_EVT:
+ if (btif_av_cb.peer_sep == AVDT_TSEP_SNK)
+ {
/* immediately flush any pending tx frames while suspend is pending */
btif_a2dp_set_tx_flush(TRUE);
+ }
+ if (btif_av_cb.peer_sep == AVDT_TSEP_SRC)
+ {
+ btif_a2dp_set_rx_flush(TRUE);
+ }
- btif_a2dp_on_stopped(NULL);
-
- break;
+ btif_a2dp_on_stopped(NULL);
+ break;
case BTIF_SM_EXIT_EVT:
break;
@@ -423,8 +507,7 @@
case BTA_AV_CLOSE_EVT:
/* inform the application that we are disconnecting */
- HAL_CBACK(bt_av_callbacks, connection_state_cb,
- BTAV_CONNECTION_STATE_DISCONNECTED, &(btif_av_cb.peer_bda));
+ btif_report_connection_state(BTAV_CONNECTION_STATE_DISCONNECTED, &(btif_av_cb.peer_bda));
btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_IDLE);
break;
@@ -435,7 +518,7 @@
break;
default:
- BTIF_TRACE_WARNING2("%s : unhandled event:%s", __FUNCTION__,
+ BTIF_TRACE_WARNING("%s : unhandled event:%s", __FUNCTION__,
dump_av_sm_event_name(event));
return FALSE;
}
@@ -457,13 +540,13 @@
{
tBTA_AV *p_av = (tBTA_AV*)p_data;
- BTIF_TRACE_DEBUG3("%s event:%s flags %x", __FUNCTION__,
+ BTIF_TRACE_DEBUG("%s event:%s flags %x", __FUNCTION__,
dump_av_sm_event_name(event), btif_av_cb.flags);
if ( (event == BTA_AV_REMOTE_CMD_EVT) && (btif_av_cb.flags & BTIF_AV_FLAG_REMOTE_SUSPEND) &&
(p_av->remote_cmd.rc_id == BTA_AV_RC_PLAY) )
{
- BTIF_TRACE_EVENT1("%s: Resetting remote suspend flag on RC PLAY", __FUNCTION__);
+ BTIF_TRACE_EVENT("%s: Resetting remote suspend flag on RC PLAY", __FUNCTION__);
btif_av_cb.flags &= ~BTIF_AV_FLAG_REMOTE_SUSPEND;
}
@@ -479,32 +562,44 @@
break;
case BTIF_AV_START_STREAM_REQ_EVT:
- btif_a2dp_setup_codec();
+ if (btif_av_cb.peer_sep != AVDT_TSEP_SRC)
+ btif_a2dp_setup_codec();
BTA_AvStart();
btif_av_cb.flags |= BTIF_AV_FLAG_PENDING_START;
break;
case BTA_AV_START_EVT:
{
- BTIF_TRACE_EVENT3("BTA_AV_START_EVT status %d, suspending %d, init %d",
+ BTIF_TRACE_EVENT("BTA_AV_START_EVT status %d, suspending %d, init %d",
p_av->start.status, p_av->start.suspending, p_av->start.initiator);
if ((p_av->start.status == BTA_SUCCESS) && (p_av->start.suspending == TRUE))
return TRUE;
- if (btif_a2dp_on_started(&p_av->start,
- ((btif_av_cb.flags & BTIF_AV_FLAG_PENDING_START) != 0))) {
- /* only clear pending flag after acknowledgement */
- btif_av_cb.flags &= ~BTIF_AV_FLAG_PENDING_START;
+ /* In case peer is A2DP SRC we do not want to ack commands on UIPC*/
+ if (btif_av_cb.peer_sep == AVDT_TSEP_SNK)
+ {
+ if (btif_a2dp_on_started(&p_av->start,
+ ((btif_av_cb.flags & BTIF_AV_FLAG_PENDING_START) != 0)))
+ {
+ /* only clear pending flag after acknowledgement */
+ btif_av_cb.flags &= ~BTIF_AV_FLAG_PENDING_START;
+ }
}
/* remain in open state if status failed */
if (p_av->start.status != BTA_AV_SUCCESS)
return FALSE;
+ if (btif_av_cb.peer_sep == AVDT_TSEP_SRC)
+ {
+ btif_a2dp_set_rx_flush(FALSE); /* remove flush state, ready for streaming*/
+ }
+
/* change state to started, send acknowledgement if start is pending */
if (btif_av_cb.flags & BTIF_AV_FLAG_PENDING_START) {
- btif_a2dp_on_started(NULL, TRUE);
+ if (btif_av_cb.peer_sep == AVDT_TSEP_SNK)
+ btif_a2dp_on_started(NULL, TRUE);
/* pending start flag will be cleared when exit current state */
}
btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_STARTED);
@@ -513,20 +608,20 @@
case BTIF_AV_DISCONNECT_REQ_EVT:
BTA_AvClose(btif_av_cb.bta_handle);
+ if (btif_av_cb.peer_sep == AVDT_TSEP_SRC) {
+ BTA_AvCloseRc(btif_av_cb.bta_handle);
+ }
/* inform the application that we are disconnecting */
- HAL_CBACK(bt_av_callbacks, connection_state_cb,
- BTAV_CONNECTION_STATE_DISCONNECTING, &(btif_av_cb.peer_bda));
+ btif_report_connection_state(BTAV_CONNECTION_STATE_DISCONNECTING, &(btif_av_cb.peer_bda));
break;
case BTA_AV_CLOSE_EVT:
-
- /* avdtp link is closed */
+ /* avdtp link is closed */
btif_a2dp_on_stopped(NULL);
/* inform the application that we are disconnected */
- HAL_CBACK(bt_av_callbacks, connection_state_cb,
- BTAV_CONNECTION_STATE_DISCONNECTED, &(btif_av_cb.peer_bda));
+ btif_report_connection_state(BTAV_CONNECTION_STATE_DISCONNECTED, &(btif_av_cb.peer_bda));
/* change state to idle, send acknowledgement if start is pending */
if (btif_av_cb.flags & BTIF_AV_FLAG_PENDING_START) {
@@ -540,7 +635,7 @@
if((btif_av_cb.flags & BTIF_AV_FLAG_PENDING_START) &&
(p_av->reconfig.status == BTA_AV_SUCCESS))
{
- APPL_TRACE_WARNING0("reconfig done BTA_AVstart()");
+ APPL_TRACE_WARNING("reconfig done BTA_AVstart()");
BTA_AvStart();
}
else if(btif_av_cb.flags & BTIF_AV_FLAG_PENDING_START)
@@ -553,7 +648,7 @@
CHECK_RC_EVENT(event, p_data);
default:
- BTIF_TRACE_WARNING2("%s : unhandled event:%s", __FUNCTION__,
+ BTIF_TRACE_WARNING("%s : unhandled event:%s", __FUNCTION__,
dump_av_sm_event_name(event));
return FALSE;
@@ -575,7 +670,7 @@
{
tBTA_AV *p_av = (tBTA_AV*)p_data;
- BTIF_TRACE_DEBUG3("%s event:%s flags %x", __FUNCTION__,
+ BTIF_TRACE_DEBUG("%s event:%s flags %x", __FUNCTION__,
dump_av_sm_event_name(event), btif_av_cb.flags);
switch (event)
@@ -585,16 +680,24 @@
/* we are again in started state, clear any remote suspend flags */
btif_av_cb.flags &= ~BTIF_AV_FLAG_REMOTE_SUSPEND;
- HAL_CBACK(bt_av_callbacks, audio_state_cb,
- BTAV_AUDIO_STATE_STARTED, &(btif_av_cb.peer_bda));
+ btif_report_audio_state(BTAV_AUDIO_STATE_STARTED, &(btif_av_cb.peer_bda));
+
+ /* increase the a2dp consumer task priority temporarily when start
+ ** audio playing, to avoid overflow the audio packet queue. */
+ adjust_priority_a2dp(TRUE);
+
break;
case BTIF_SM_EXIT_EVT:
+ /* restore the a2dp consumer task priority when stop audio playing. */
+ adjust_priority_a2dp(FALSE);
+
break;
case BTIF_AV_START_STREAM_REQ_EVT:
/* we were remotely started, just ack back the local request */
- btif_a2dp_on_started(NULL, TRUE);
+ if (btif_av_cb.peer_sep == AVDT_TSEP_SNK)
+ btif_a2dp_on_started(NULL, TRUE);
break;
/* fixme -- use suspend = true always to work around issue with BTA AV */
@@ -609,8 +712,16 @@
always overrides */
btif_av_cb.flags &= ~BTIF_AV_FLAG_REMOTE_SUSPEND;
+ if (btif_av_cb.peer_sep == AVDT_TSEP_SNK)
+ {
/* immediately stop transmission of frames while suspend is pending */
- btif_a2dp_set_tx_flush(TRUE);
+ btif_a2dp_set_tx_flush(TRUE);
+ }
+
+ if (btif_av_cb.peer_sep == AVDT_TSEP_SRC) {
+ btif_a2dp_set_rx_flush(TRUE);
+ btif_a2dp_on_stopped(NULL);
+ }
BTA_AvStop(TRUE);
break;
@@ -619,10 +730,12 @@
/* request avdtp to close */
BTA_AvClose(btif_av_cb.bta_handle);
+ if (btif_av_cb.peer_sep == AVDT_TSEP_SRC) {
+ BTA_AvCloseRc(btif_av_cb.bta_handle);
+ }
/* inform the application that we are disconnecting */
- HAL_CBACK(bt_av_callbacks, connection_state_cb,
- BTAV_CONNECTION_STATE_DISCONNECTING, &(btif_av_cb.peer_bda));
+ btif_report_connection_state(BTAV_CONNECTION_STATE_DISCONNECTING, &(btif_av_cb.peer_bda));
/* wait in closing state until fully closed */
btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_CLOSING);
@@ -630,7 +743,7 @@
case BTA_AV_SUSPEND_EVT:
- BTIF_TRACE_EVENT2("BTA_AV_SUSPEND_EVT status %d, init %d",
+ BTIF_TRACE_EVENT("BTA_AV_SUSPEND_EVT status %d, init %d",
p_av->suspend.status, p_av->suspend.initiator);
/* a2dp suspended, stop media task until resumed */
@@ -641,8 +754,11 @@
{
btif_av_cb.flags &= ~BTIF_AV_FLAG_LOCAL_SUSPEND_PENDING;
+ if (btif_av_cb.peer_sep == AVDT_TSEP_SNK)
+ {
/* suspend failed, reset back tx flush state */
- btif_a2dp_set_tx_flush(FALSE);
+ btif_a2dp_set_tx_flush(FALSE);
+ }
return FALSE;
}
@@ -656,13 +772,11 @@
if ((btif_av_cb.flags & BTIF_AV_FLAG_LOCAL_SUSPEND_PENDING) == 0)
btif_av_cb.flags |= BTIF_AV_FLAG_REMOTE_SUSPEND;
- HAL_CBACK(bt_av_callbacks, audio_state_cb,
- BTAV_AUDIO_STATE_REMOTE_SUSPEND, &(btif_av_cb.peer_bda));
+ btif_report_audio_state(BTAV_AUDIO_STATE_REMOTE_SUSPEND, &(btif_av_cb.peer_bda));
}
else
{
- HAL_CBACK(bt_av_callbacks, audio_state_cb,
- BTAV_AUDIO_STATE_STOPPED, &(btif_av_cb.peer_bda));
+ btif_report_audio_state(BTAV_AUDIO_STATE_STOPPED, &(btif_av_cb.peer_bda));
}
btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_OPENED);
@@ -674,11 +788,9 @@
case BTA_AV_STOP_EVT:
btif_av_cb.flags |= BTIF_AV_FLAG_PENDING_STOP;
-
btif_a2dp_on_stopped(&p_av->suspend);
- HAL_CBACK(bt_av_callbacks, audio_state_cb,
- BTAV_AUDIO_STATE_STOPPED, &(btif_av_cb.peer_bda));
+ btif_report_audio_state(BTAV_AUDIO_STATE_STOPPED, &(btif_av_cb.peer_bda));
/* if stop was successful, change state to open */
if (p_av->suspend.status == BTA_AV_SUCCESS)
@@ -691,12 +803,10 @@
btif_av_cb.flags |= BTIF_AV_FLAG_PENDING_STOP;
/* avdtp link is closed */
-
btif_a2dp_on_stopped(NULL);
/* inform the application that we are disconnected */
- HAL_CBACK(bt_av_callbacks, connection_state_cb,
- BTAV_CONNECTION_STATE_DISCONNECTED, &(btif_av_cb.peer_bda));
+ btif_report_connection_state(BTAV_CONNECTION_STATE_DISCONNECTED, &(btif_av_cb.peer_bda));
btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_IDLE);
break;
@@ -704,7 +814,7 @@
CHECK_RC_EVENT(event, p_data);
default:
- BTIF_TRACE_WARNING2("%s : unhandled event:%s", __FUNCTION__,
+ BTIF_TRACE_WARNING("%s : unhandled event:%s", __FUNCTION__,
dump_av_sm_event_name(event));
return FALSE;
@@ -728,6 +838,43 @@
(char*)p_data, sizeof(tBTA_AV), NULL);
}
+static void bte_av_media_callback(tBTA_AV_EVT event, tBTA_AV_MEDIA *p_data)
+{
+ btif_sm_state_t state;
+ UINT8 que_len;
+ tA2D_STATUS a2d_status;
+ tA2D_SBC_CIE sbc_cie;
+ btif_av_sink_config_req_t config_req;
+
+ if (event == BTA_AV_MEDIA_DATA_EVT)/* Switch to BTIF_MEDIA context */
+ {
+ state= btif_sm_get_state(btif_av_cb.sm_handle);
+ if ( (state == BTIF_AV_STATE_STARTED) || /* send SBC packets only in Started State */
+ (state == BTIF_AV_STATE_OPENED) )
+ {
+ que_len = btif_media_sink_enque_buf((BT_HDR *)p_data);
+ BTIF_TRACE_DEBUG(" Packets in Que %d",que_len);
+ }
+ else
+ return;
+ }
+
+ if (event == BTA_AV_MEDIA_SINK_CFG_EVT) {
+ /* send a command to BT Media Task */
+ btif_reset_decoder((UINT8*)p_data);
+
+ a2d_status = A2D_ParsSbcInfo(&sbc_cie, (UINT8 *)p_data, FALSE);
+ if (a2d_status == A2D_SUCCESS) {
+ /* Switch to BTIF context */
+ config_req.sample_rate = btif_a2dp_get_track_frequency(sbc_cie.samp_freq);
+ config_req.channel_count = btif_a2dp_get_track_channel_count(sbc_cie.ch_mode);
+ btif_transfer_context(btif_av_handle_event, BTIF_AV_SINK_CONFIG_REQ_EVT,
+ (char*)&config_req, sizeof(config_req), NULL);
+ } else {
+ APPL_TRACE_ERROR("ERROR dump_codec_info A2D_ParsSbcInfo fail:%d", a2d_status);
+ }
+ }
+}
/*******************************************************************************
**
** Function btif_av_init
@@ -738,7 +885,7 @@
**
*******************************************************************************/
-bt_status_t btif_av_init(void)
+bt_status_t btif_av_init()
{
if (btif_av_cb.sm_handle == NULL)
{
@@ -752,7 +899,7 @@
btif_a2dp_on_init();
- return BT_STATUS_SUCCESS;
+ return BT_STATUS_SUCCESS;
}
return BT_STATUS_DONE;
@@ -760,27 +907,63 @@
/*******************************************************************************
**
-** Function init
+** Function init_src
**
-** Description Initializes the AV interface
+** Description Initializes the AV interface for source mode
**
** Returns bt_status_t
**
*******************************************************************************/
-static bt_status_t init(btav_callbacks_t* callbacks )
+static bt_status_t init_src(btav_callbacks_t* callbacks)
{
- int status;
+ bt_status_t status;
- BTIF_TRACE_EVENT1("%s", __FUNCTION__);
+ BTIF_TRACE_EVENT("%s", __FUNCTION__);
- if (bt_av_callbacks)
- return BT_STATUS_DONE;
+ if (bt_av_sink_callbacks != NULL) {
+ // already did btif_av_init()
+ status = BT_STATUS_SUCCESS;
+ } else {
+ status = btif_av_init();
+ }
- bt_av_callbacks = callbacks;
- btif_av_cb.sm_handle = NULL;
+ if (status == BT_STATUS_SUCCESS) {
+ bt_av_src_callbacks = callbacks;
+ }
- return btif_av_init();
+ return status;
+}
+
+/*******************************************************************************
+**
+** Function init_sink
+**
+** Description Initializes the AV interface for sink mode
+**
+** Returns bt_status_t
+**
+*******************************************************************************/
+
+static bt_status_t init_sink(btav_callbacks_t* callbacks)
+{
+ bt_status_t status;
+
+ BTIF_TRACE_EVENT("%s", __FUNCTION__);
+
+ if (bt_av_src_callbacks != NULL) {
+ // already did btif_av_init()
+ status = BT_STATUS_SUCCESS;
+ } else {
+ status = btif_av_init();
+ }
+
+ if (status == BT_STATUS_SUCCESS) {
+ bt_av_sink_callbacks = callbacks;
+ BTA_AvEnable_Sink(TRUE);
+ }
+
+ return status;
}
/*******************************************************************************
@@ -793,23 +976,34 @@
**
*******************************************************************************/
-static bt_status_t connect_int(bt_bdaddr_t *bd_addr)
+static bt_status_t connect_int(bt_bdaddr_t *bd_addr, uint16_t uuid)
{
- BTIF_TRACE_EVENT1("%s", __FUNCTION__);
+ btif_av_connect_req_t connect_req;
+ connect_req.target_bda = bd_addr;
+ connect_req.uuid = uuid;
+ BTIF_TRACE_EVENT("%s", __FUNCTION__);
- btif_sm_dispatch(btif_av_cb.sm_handle, BTIF_AV_CONNECT_REQ_EVT, (char*)bd_addr);
+ btif_sm_dispatch(btif_av_cb.sm_handle, BTIF_AV_CONNECT_REQ_EVT, (char*)&connect_req);
return BT_STATUS_SUCCESS;
}
-static bt_status_t connect(bt_bdaddr_t *bd_addr)
+static bt_status_t src_connect_sink(bt_bdaddr_t *bd_addr)
{
- BTIF_TRACE_EVENT1("%s", __FUNCTION__);
+ BTIF_TRACE_EVENT("%s", __FUNCTION__);
CHECK_BTAV_INIT();
return btif_queue_connect(UUID_SERVCLASS_AUDIO_SOURCE, bd_addr, connect_int);
}
+static bt_status_t sink_connect_src(bt_bdaddr_t *bd_addr)
+{
+ BTIF_TRACE_EVENT("%s", __FUNCTION__);
+ CHECK_BTAV_INIT();
+
+ return btif_queue_connect(UUID_SERVCLASS_AUDIO_SINK, bd_addr, connect_int);
+}
+
/*******************************************************************************
**
** Function disconnect
@@ -821,7 +1015,7 @@
*******************************************************************************/
static bt_status_t disconnect(bt_bdaddr_t *bd_addr)
{
- BTIF_TRACE_EVENT1("%s", __FUNCTION__);
+ BTIF_TRACE_EVENT("%s", __FUNCTION__);
CHECK_BTAV_INIT();
@@ -841,28 +1035,53 @@
*******************************************************************************/
static void cleanup(void)
{
- BTIF_TRACE_EVENT1("%s", __FUNCTION__);
+ BTIF_TRACE_EVENT("%s", __FUNCTION__);
- if (bt_av_callbacks)
- {
- btif_a2dp_stop_media_task();
+ btif_a2dp_stop_media_task();
- btif_disable_service(BTA_A2DP_SERVICE_ID);
- bt_av_callbacks = NULL;
+ btif_disable_service(BTA_A2DP_SERVICE_ID);
- /* Also shut down the AV state machine */
- btif_sm_shutdown(btif_av_cb.sm_handle);
- btif_av_cb.sm_handle = NULL;
- }
- return;
+ /* Also shut down the AV state machine */
+ btif_sm_shutdown(btif_av_cb.sm_handle);
+ btif_av_cb.sm_handle = NULL;
}
-static const btav_interface_t bt_av_interface = {
+static void cleanup_src(void) {
+ BTIF_TRACE_EVENT("%s", __FUNCTION__);
+
+ if (bt_av_src_callbacks)
+ {
+ bt_av_src_callbacks = NULL;
+ if (bt_av_sink_callbacks == NULL)
+ cleanup();
+ }
+}
+
+static void cleanup_sink(void) {
+ BTIF_TRACE_EVENT("%s", __FUNCTION__);
+
+ if (bt_av_sink_callbacks)
+ {
+ bt_av_sink_callbacks = NULL;
+ if (bt_av_src_callbacks == NULL)
+ cleanup();
+ }
+}
+
+static const btav_interface_t bt_av_src_interface = {
sizeof(btav_interface_t),
- init,
- connect,
+ init_src,
+ src_connect_sink,
disconnect,
- cleanup,
+ cleanup_src,
+};
+
+static const btav_interface_t bt_av_sink_interface = {
+ sizeof(btav_interface_t),
+ init_sink,
+ sink_connect_src,
+ disconnect,
+ cleanup_sink,
};
/*******************************************************************************
@@ -894,13 +1113,13 @@
{
btif_sm_state_t state = btif_sm_get_state(btif_av_cb.sm_handle);
- BTIF_TRACE_DEBUG3("btif_av_stream_ready : sm hdl %d, state %d, flags %x",
+ BTIF_TRACE_DEBUG("btif_av_stream_ready : sm hdl %d, state %d, flags %x",
btif_av_cb.sm_handle, state, btif_av_cb.flags);
/* also make sure main adapter is enabled */
if (btif_is_enabled() == 0)
{
- BTIF_TRACE_EVENT0("main adapter not enabled");
+ BTIF_TRACE_EVENT("main adapter not enabled");
return FALSE;
}
@@ -925,7 +1144,7 @@
{
btif_sm_state_t state = btif_sm_get_state(btif_av_cb.sm_handle);
- BTIF_TRACE_DEBUG3("btif_av_stream_started : sm hdl %d, state %d, flags %x",
+ BTIF_TRACE_DEBUG("btif_av_stream_started : sm hdl %d, state %d, flags %x",
btif_av_cb.sm_handle, state, btif_av_cb.flags);
/* disallow media task to start if we have pending actions */
@@ -986,7 +1205,7 @@
BTA_AvEnable(BTA_SEC_AUTHENTICATE, (BTA_AV_FEAT_RCTG | BTA_AV_FEAT_NO_SCO_SSPD),
bte_av_callback);
#endif
- BTA_AvRegister(BTA_AV_CHNL_AUDIO, BTIF_AV_SERVICE_NAME, 0);
+ BTA_AvRegister(BTA_AV_CHNL_AUDIO, BTIF_AV_SERVICE_NAME, 0, bte_av_media_callback);
}
else {
BTA_AvDeregister(btif_av_cb.bta_handle);
@@ -997,17 +1216,32 @@
/*******************************************************************************
**
-** Function btif_av_get_interface
+** Function btif_av_get_src_interface
**
-** Description Get the AV callback interface
+** Description Get the AV callback interface for A2DP source profile
**
** Returns btav_interface_t
**
*******************************************************************************/
-const btav_interface_t *btif_av_get_interface(void)
+const btav_interface_t *btif_av_get_src_interface(void)
{
- BTIF_TRACE_EVENT1("%s", __FUNCTION__);
- return &bt_av_interface;
+ BTIF_TRACE_EVENT("%s", __FUNCTION__);
+ return &bt_av_src_interface;
+}
+
+/*******************************************************************************
+**
+** Function btif_av_get_sink_interface
+**
+** Description Get the AV callback interface for A2DP sink profile
+**
+** Returns btav_interface_t
+**
+*******************************************************************************/
+const btav_interface_t *btif_av_get_sink_interface(void)
+{
+ BTIF_TRACE_EVENT("%s", __FUNCTION__);
+ return &bt_av_sink_interface;
}
/*******************************************************************************
diff --git a/btif/src/btif_config.c b/btif/src/btif_config.c
index e7809a7..7b5ab07 100644
--- a/btif/src/btif_config.c
+++ b/btif/src/btif_config.c
@@ -89,11 +89,10 @@
static int pth = -1; //poll thread handle
static cfg_node root;
static int cached_change;
-static int processing_save_cmd;
+static int save_cmds_queued;
static void cfg_cmd_callback(int cmd_fd, int type, int flags, uint32_t user_id);
static inline short alloc_node(cfg_node* p, short grow);
static inline void free_node(cfg_node* p);
-static inline void free_inode(cfg_node* p, int child);
static inline short find_inode(const cfg_node* p, const char* name);
static cfg_node* find_node(const char* section, const char* key, const char* name);
static int remove_node(const char* section, const char* key, const char* name);
@@ -104,7 +103,6 @@
static int save_cfg();
static void load_cfg();
static short find_next_node(const cfg_node* p, short start, char* name, int* bytes);
-static int create_dir(const char* path);
#ifdef UNIT_TEST
static void cfg_test_load();
static void cfg_test_write();
@@ -339,11 +337,22 @@
}
int btif_config_save()
{
+ int post_cmd = 0;
lock_slot(&slot_lock);
- bdld("processing_save_cmd:%d, cached change:%d", processing_save_cmd, cached_change);
- if(!processing_save_cmd && cached_change > 0)
- btsock_thread_post_cmd(pth, CFG_CMD_SAVE, NULL, 0, 0);
+ bdld("save_cmds_queued:%d, cached_change:%d", save_cmds_queued, cached_change);
+ if((save_cmds_queued == 0) && (cached_change > 0))
+ {
+ post_cmd = 1;
+ save_cmds_queued++;
+ bdld("post_cmd set to 1, save_cmds_queued:%d", save_cmds_queued);
+ }
unlock_slot(&slot_lock);
+ /* don't hold lock when invoking send or else a deadlock could
+ * occur when the socket thread tries to do the actual saving.
+ */
+ if (post_cmd)
+ btsock_thread_post_cmd(pth, CFG_CMD_SAVE, NULL, 0, 0);
+
return TRUE;
}
void btif_config_flush()
@@ -436,7 +445,7 @@
} else ADD_CHILD_COUNT(p, 1);
}
else node = &p->child[i];
- if(!node->name)
+ if(node && (!node->name))
node->name = strdup(name);
return node;
}
@@ -691,7 +700,6 @@
if(btif_config_save_file(file_name_new))
{
cached_change = 0;
- processing_save_cmd = 0;
chown(file_name_new, -1, AID_NET_BT_STACK);
chmod(file_name_new, 0660);
rename(file_name, file_name_old);
@@ -786,25 +794,34 @@
UNUSED(size);
UNUSED(user_id);
- //bdld("cmd type:%d, size:%d", type, size);
switch(type)
{
case CFG_CMD_SAVE:
{
- int last_cached_change = cached_change;
- processing_save_cmd = 1;
+ int i;
+ int last_cached_change;
+
+ // grab lock while accessing cached_change.
+ lock_slot(&slot_lock);
+ bdla(save_cmds_queued > 0);
+ save_cmds_queued--;
+ last_cached_change = cached_change;
//hold the file saving until no more change in last 3 seconds.
bdld("wait until no more changes in short time, cached change:%d", cached_change);
- int i;
- for(i = 0; i < 100; i ++) //5 minitue max waiting
+ for(i = 0; i < 100; i ++) //5 minutes max waiting
{
+ // don't sleep if there is nothing to do
+ if(cached_change == 0)
+ break;
+ // release lock during sleep
+ unlock_slot(&slot_lock);
sleep(3);
- if(cached_change == 0 || last_cached_change == cached_change)
+ lock_slot(&slot_lock);
+ if(last_cached_change == cached_change)
break;
last_cached_change = cached_change;
}
bdld("writing the bt_config.xml now, cached change:%d", cached_change);
- lock_slot(&slot_lock);
if(cached_change > 0)
save_cfg();
unlock_slot(&slot_lock);
diff --git a/btif/src/btif_config_util.cpp b/btif/src/btif_config_util.cpp
index 0cc2b36..a6d9f6f 100644
--- a/btif/src/btif_config_util.cpp
+++ b/btif/src/btif_config_util.cpp
@@ -56,6 +56,41 @@
#define BLUEDROID_VALUE_TYPE "Type"
#define BLUEDROID_TAG_REMOTE_DEVICE "Remote Devices"
+#define HID_SUB_CLASS "020208"
+#define HID_COUNTRY_CODE "020308"
+#define HID_VIRTUAL_CABLE "020428"
+#define HID_RECON_INNITIATE "020528"
+#define HID_REP_DSC_1 "020636"
+#define HID_REP_DSC_2 "020635"
+#define HID_SDP_DISABLE "020828"
+#define HID_BAT_POWER "020928"
+#define HID_REM_WAKE "020A28"
+#define HID_SUP_TIME "020C09"
+#define HID_NORM_CONN "020D28"
+#define HID_SSR_MAX_LAT "020F09"
+#define HID_SSR_MIN_TIM "021009"
+#define HID_VENDOR_ID "020109"
+#define HID_PRODUCT_ID "020209"
+#define HID_PRODUCT_VERSION "020309"
+#define HID_APP_ID_MOUSE 1
+#define HID_APP_ID_KYB 2
+#define HID_PAIRED_DEV_PRIORITY 100
+#define HID_SSR_PARAM_INVALID 0xffff
+#define HID_RPT_DSCR_HDR_LEN_1 10
+#define HID_RPT_DSCR_HDR_LEN_2 7
+
+/* Hid Atribute Mask */
+#define HID_ATTR_MASK_VIRTUAL_CABLE 0x0001
+#define HID_ATTR_MASK_NORMALLY_CONNECTABLE 0x0002
+#define HID_ATTR_MASK_RECONN_INIT 0x0004
+#define HID_ATTR_MASK_SDP_DISABLE 0x0008
+#define HID_ATTR_MASK_BATTERY_POWER 0x0010
+#define HID_ATTR_MASK_REMOTE_WAKE 0x0020
+#define HID_ATTR_MASK_SUP_TOUT_AVLBL 0x0040
+#define HID_ATTR_MASK_SSR_MAX_LATENCY 0x0080
+#define HID_ATTR_MASK_SSR_MIN_TOUT 0x0100
+#define HID_ATTR_MASK_SEC_REQUIRED 0x8000
+
using namespace tinyxml2;
struct enum_user_data
{
@@ -523,6 +558,200 @@
laddr[i] - ('a' - 'A') : laddr[i];
uaddr[i] = 0;
}
+
+static int parse_hid_attribute(const char *str, int line_size, int len)
+{
+ if (len == 0 || line_size == 0 || str == NULL || (len%2))
+ return 0;
+
+ char hex_string[len + 1], hex_bytes[len/2];
+ memcpy(hex_string, str - 1, len);
+ hex_string[len] = 0;
+ hex2bytes(hex_string, len, hex_bytes);
+ if (len == 2)
+ return hex_bytes[0];
+ else if (len == 4)
+ return hex_bytes[0] << 8 | hex_bytes[1];
+ else return 0;
+}
+
+static int parse_bluez_hid_sdp_records(const char* adapter_path, const char* bd_addr)
+{
+ //debug("in");
+ char addr[32];
+ char pattern_to_search[50];
+ upcase_addr(bd_addr, addr, sizeof(addr));
+
+ const char* map = NULL;
+ int size = 0;
+ int ret = FALSE;
+ char path[256];
+ snprintf(path, sizeof(path), "%s/%s", adapter_path, BLUEZ_SDP);
+ int fd = open_file_map(path, &map, &size);
+ //debug("in, path:%s, addr:%s, fd:%d, size:%d", path, addr, fd, size);
+ if(fd < 0 || size == 0)
+ {
+ error("open_file_map fail, fd:%d, path:%s, size:%d", fd, path, size);
+ //debug("out");
+ return FALSE;
+ }
+ int line_size = 0;
+ snprintf(pattern_to_search, sizeof(pattern_to_search), "%s#00010000", addr);
+ const char *value_line = find_value_line(map, size, pattern_to_search, &line_size);
+ int dev_sub_class = 0;
+ int app_id = 0;
+ int countrycode = 0;
+ int product = 0;
+ int vendor = 0;
+ int product_ver = 0;
+ int attr_mask = 0;
+ int ssr_max_lat = 0;
+ int ssr_min_timeout = 0;
+ int rep_desc_len = 0;
+ if(value_line && line_size)
+ {
+ char hid_sdp[line_size + 2];
+ memcpy(hid_sdp, value_line - 1, line_size);
+ hid_sdp[line_size + 1] = 0;
+ //debug("addr:%s, hid_sdp:%s", bd_addr, hid_sdp);
+ value_line = find_value_line(hid_sdp, strlen(hid_sdp), HID_SUB_CLASS, &line_size);
+ dev_sub_class = parse_hid_attribute(value_line, line_size, 2);
+ if(dev_sub_class)
+ {
+ if ((dev_sub_class & 0x80) == 0x80)
+ app_id = HID_APP_ID_MOUSE;
+ else
+ app_id = HID_APP_ID_KYB;
+ //debug("dev_sub_class:%d", dev_sub_class);
+ }
+ value_line = find_value_line(hid_sdp, strlen(hid_sdp), HID_COUNTRY_CODE, &line_size);
+ countrycode = parse_hid_attribute(value_line, line_size, 2);
+ value_line = find_value_line(hid_sdp, strlen(hid_sdp), HID_VIRTUAL_CABLE, &line_size);
+ if(parse_hid_attribute(value_line, line_size, 2))
+ {
+ attr_mask |= HID_ATTR_MASK_VIRTUAL_CABLE;
+ //debug("attr_mask after Virtual Unplug:%04x", attr_mask);
+ }
+ value_line = find_value_line(hid_sdp, strlen(hid_sdp), HID_RECON_INNITIATE, &line_size);
+ if(parse_hid_attribute(value_line, line_size, 2))
+ {
+ attr_mask |= HID_ATTR_MASK_RECONN_INIT;
+ //debug("attr_mask after Reconnect Initiate:%04x", attr_mask);
+ }
+ value_line = find_value_line(hid_sdp, strlen(hid_sdp), HID_REP_DSC_1, &line_size);
+ if(value_line && line_size)
+ {
+ char rep_desc[line_size + 1], rd[line_size/2 + 1];
+ char rep_dsc_len[5], rd_len[2];
+ memcpy(rep_dsc_len, value_line - 1, 4);
+ rep_dsc_len[4] = 0;
+ hex2bytes(rep_dsc_len, 4, rd_len);
+ rep_desc_len = (rd_len[0] << 8 | rd_len[1]) - (HID_RPT_DSCR_HDR_LEN_1 - 2);
+ //debug("rep_desc_len:%d", rep_desc_len);
+ memcpy(rep_desc, value_line - 1 + (HID_RPT_DSCR_HDR_LEN_1 * 2), rep_desc_len * 2);
+ rep_desc[rep_desc_len * 2] = 0;
+ hex2bytes(rep_desc, rep_desc_len* 2, rd);
+ if (rep_desc_len)
+ {
+ //debug("rep_desc:%s", rep_desc);
+ btif_config_set("Remote", bd_addr, "HidDescriptor", rd, rep_desc_len,
+ BTIF_CFG_TYPE_BIN);
+ }
+ }
+ else
+ {
+ value_line = find_value_line(hid_sdp, strlen(hid_sdp), HID_REP_DSC_2, &line_size);
+ if(value_line && line_size)
+ {
+ char rep_dsc_len[3], rd_len[1];
+ memcpy(rep_dsc_len, value_line - 1, 2);
+ rep_dsc_len[2] = 0;
+ hex2bytes(rep_dsc_len, 2, rd_len);
+ rep_desc_len = rd_len[0] - (HID_RPT_DSCR_HDR_LEN_2 - 1);
+ //debug("rep_desc_len:%d", rep_desc_len);
+ char rep_desc[(rep_desc_len * 2) + 1], rd[rep_desc_len + 1];
+ memcpy(rep_desc, value_line - 1 + (HID_RPT_DSCR_HDR_LEN_2 * 2), rep_desc_len * 2);
+ rep_desc[rep_desc_len * 2] = 0;
+ hex2bytes(rep_desc, rep_desc_len * 2, rd);
+ if (rep_desc_len)
+ {
+ //debug("rep_desc:%s", rep_desc);
+ btif_config_set("Remote", bd_addr, "HidDescriptor", rd, rep_desc_len,
+ BTIF_CFG_TYPE_BIN);
+ }
+ }
+ }
+ value_line = find_value_line(hid_sdp, strlen(hid_sdp), HID_SDP_DISABLE, &line_size);
+ if(parse_hid_attribute(value_line, line_size, 2))
+ {
+ attr_mask |= HID_ATTR_MASK_SDP_DISABLE;
+ //debug("attr_mask after SDP Disable:%04x", attr_mask);
+ }
+ value_line = find_value_line(hid_sdp, strlen(hid_sdp), HID_BAT_POWER, &line_size);
+ if(parse_hid_attribute(value_line, line_size, 2))
+ {
+ attr_mask |= HID_ATTR_MASK_BATTERY_POWER;
+ //debug("attr_mask after Battery Powered:%04x", attr_mask);
+ }
+ value_line = find_value_line(hid_sdp, strlen(hid_sdp), HID_REM_WAKE, &line_size);
+ if(parse_hid_attribute(value_line, line_size, 2))
+ {
+ attr_mask |= HID_ATTR_MASK_REMOTE_WAKE;
+ //debug("attr_mask after Remote Wake:%04x", attr_mask);
+ }
+ value_line = find_value_line(hid_sdp, strlen(hid_sdp), HID_NORM_CONN, &line_size);
+ if(parse_hid_attribute(value_line, line_size, 2))
+ {
+ attr_mask |= HID_ATTR_MASK_NORMALLY_CONNECTABLE;
+ //debug("attr_mask after Normally Conenctable:%04x", attr_mask);
+ }
+ value_line = find_value_line(hid_sdp, strlen(hid_sdp), HID_SUP_TIME, &line_size);
+ if(value_line && line_size)
+ attr_mask |= HID_ATTR_MASK_SUP_TOUT_AVLBL;
+ //debug("attr_mask after Supervision Timeout:%04x", attr_mask);
+ value_line = find_value_line(hid_sdp, strlen(hid_sdp), HID_SSR_MAX_LAT, &line_size);
+ ssr_max_lat = parse_hid_attribute(value_line, line_size, 4);
+ if(!ssr_max_lat)
+ ssr_max_lat = HID_SSR_PARAM_INVALID;
+ value_line = find_value_line(hid_sdp, strlen(hid_sdp), HID_SSR_MIN_TIM, &line_size);
+ ssr_min_timeout = parse_hid_attribute(value_line, line_size, 4);
+ if(!ssr_min_timeout)
+ ssr_min_timeout = HID_SSR_PARAM_INVALID;
+ snprintf(pattern_to_search, sizeof(pattern_to_search), "%s#00010001", addr);
+ value_line = find_value_line(map, size, pattern_to_search, &line_size);
+ if(value_line && line_size)
+ {
+ char did_sdp[line_size + 2];
+ memcpy(did_sdp, value_line - 1, line_size + 1);
+ did_sdp[line_size + 1] = 0;
+ //debug("addr:%s, did_sdp:%s", bd_addr, did_sdp);
+ value_line = find_value_line(did_sdp, strlen(did_sdp), HID_VENDOR_ID, &line_size);
+ vendor = parse_hid_attribute(value_line, line_size, 4);
+ value_line = find_value_line(did_sdp, strlen(did_sdp), HID_PRODUCT_ID, &line_size);
+ product = parse_hid_attribute(value_line, line_size, 4);
+ value_line = find_value_line(did_sdp, strlen(did_sdp), HID_PRODUCT_VERSION, &line_size);
+ product_ver = parse_hid_attribute(value_line, line_size, 4);
+ }
+ }
+ btif_config_set_int("Remote", bd_addr, "HidAttrMask", attr_mask);
+ btif_config_set_int("Remote", bd_addr, "HidSubClass", dev_sub_class);
+ btif_config_set_int("Remote", bd_addr, "HidAppId", app_id);
+ btif_config_set_int("Remote", bd_addr, "HidVendorId", vendor);
+ btif_config_set_int("Remote", bd_addr, "HidProductId", product);
+ btif_config_set_int("Remote", bd_addr, "HidVersion", product_ver);
+ btif_config_set_int("Remote", bd_addr, "HidCountryCode", countrycode);
+ btif_config_set_int("Remote", bd_addr, "HidSSRMinTimeout", ssr_min_timeout);
+ btif_config_set_int("Remote", bd_addr, "HidSSRMaxLatency", ssr_max_lat);
+ //debug("HidSubClass: %02x, app_id = %d, vendor = %04x, product = %04x, product_ver = %04x"
+ // "countrycode = %02x, ssr_min_timeout = %04x, ssr_max_lat = %04x",
+ // HidSubClass, app_id, vendor, product, product_ver, countrycode, ssr_min_timeout,
+ // ssr_max_lat);
+ close_file_map(fd, map, size);
+ ret = TRUE;
+ //debug("out, ret:%d", ret);
+ return ret;
+}
+
static int load_bluez_dev_value(const char* adapter_path, const char* bd_addr,
const char* file_name, const char* cfg_value_name, int type)
{
@@ -558,15 +787,15 @@
else if(type == BTIF_CFG_TYPE_INT)
{
int v = strtol(line, NULL, 16);
- //filter out unspported devices by its class
+ //parse sdp record in case remote device is hid
if(strcmp(file_name, BLUEZ_CLASSES) == 0)
{
switch((v & 0x1f00) >> 8)
{
case 0x5: //hid device
- error("skip paired hid devices");
- close_file_map(fd, map, size);
- return FALSE;
+ info("parsing sdp for hid device %s", bd_addr);
+ parse_bluez_hid_sdp_records(adapter_path, bd_addr);
+ break;
}
}
btif_config_set_int("Remote", bd_addr, cfg_value_name, v);
diff --git a/btif/src/btif_core.c b/btif/src/btif_core.c
index 5fcee4e..8964f5c 100644
--- a/btif/src/btif_core.c
+++ b/btif/src/btif_core.c
@@ -1,5 +1,6 @@
/******************************************************************************
*
+ * Copyright (C) 2014 The Android Open Source Project
* Copyright (C) 2009-2012 Broadcom Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -48,6 +49,7 @@
#include "btif_util.h"
#include "btif_sock.h"
#include "btif_pan.h"
+#include "btif_mce.h"
#include "btif_profile_queue.h"
#include "btif_config.h"
/************************************************************************************
@@ -170,7 +172,7 @@
{
tBTIF_CONTEXT_SWITCH_CBACK *p;
- BTIF_TRACE_VERBOSE0("btif_context_switched");
+ BTIF_TRACE_VERBOSE("btif_context_switched");
p = (tBTIF_CONTEXT_SWITCH_CBACK *) p_msg;
@@ -200,7 +202,7 @@
{
tBTIF_CONTEXT_SWITCH_CBACK *p_msg;
- BTIF_TRACE_VERBOSE2("btif_transfer_context event %d, len %d", event, param_len);
+ BTIF_TRACE_VERBOSE("btif_transfer_context event %d, len %d", event, param_len);
/* allocate and send message that will be executed in btif context */
if ((p_msg = (tBTIF_CONTEXT_SWITCH_CBACK *) GKI_getbuf(sizeof(tBTIF_CONTEXT_SWITCH_CBACK) + param_len)) != NULL)
@@ -277,7 +279,7 @@
BT_HDR *p_msg;
UNUSED(params);
- BTIF_TRACE_DEBUG0("btif task starting");
+ BTIF_TRACE_DEBUG("btif task starting");
btif_associate_evt();
@@ -292,7 +294,7 @@
*/
if (event == BT_EVT_TRIGGER_STACK_INIT)
{
- BTIF_TRACE_DEBUG0("btif_task: received trigger stack init event");
+ BTIF_TRACE_DEBUG("btif_task: received trigger stack init event");
#if (BLE_INCLUDED == TRUE)
btif_dm_load_ble_local_keys();
#endif
@@ -305,7 +307,7 @@
*/
if (event == BT_EVT_HARDWARE_INIT_FAIL)
{
- BTIF_TRACE_DEBUG0("btif_task: hardware init failed");
+ BTIF_TRACE_DEBUG("btif_task: hardware init failed");
bte_main_disable();
btif_queue_release();
GKI_task_self_cleanup(BTIF_TASK);
@@ -323,7 +325,7 @@
{
while((p_msg = GKI_read_mbox(BTU_BTIF_MBOX)) != NULL)
{
- BTIF_TRACE_VERBOSE1("btif task fetched event %x", p_msg->event);
+ BTIF_TRACE_VERBOSE("btif task fetched event %x", p_msg->event);
switch (p_msg->event)
{
@@ -331,7 +333,7 @@
btif_context_switched(p_msg);
break;
default:
- BTIF_TRACE_ERROR1("unhandled btif event (%d)", p_msg->event & BT_EVT_MASK);
+ BTIF_TRACE_ERROR("unhandled btif event (%d)", p_msg->event & BT_EVT_MASK);
break;
}
@@ -342,7 +344,7 @@
btif_disassociate_evt();
- BTIF_TRACE_DEBUG0("btif task exiting");
+ BTIF_TRACE_DEBUG("btif task exiting");
}
@@ -373,7 +375,7 @@
{
int addr_fd;
- BTIF_TRACE_DEBUG1("local bdaddr is stored in %s", val);
+ BTIF_TRACE_DEBUG("local bdaddr is stored in %s", val);
if ((addr_fd = open(val, O_RDONLY)) != -1)
{
@@ -384,7 +386,7 @@
if (memcmp(local_addr->address, null_bdaddr, BD_ADDR_LEN) != 0)
{
valid_bda = TRUE;
- BTIF_TRACE_DEBUG6("Got Factory BDA %02X:%02X:%02X:%02X:%02X:%02X",
+ BTIF_TRACE_DEBUG("Got Factory BDA %02X:%02X:%02X:%02X:%02X:%02X",
local_addr->address[0], local_addr->address[1], local_addr->address[2],
local_addr->address[3], local_addr->address[4], local_addr->address[5]);
}
@@ -399,7 +401,7 @@
if(btif_config_get_str("Local", "Adapter", "Address", val, &val_size))
{
str2bd(val, local_addr);
- BTIF_TRACE_DEBUG1("local bdaddr from bt_config.xml is %s", val);
+ BTIF_TRACE_DEBUG("local bdaddr from bt_config.xml is %s", val);
return;
}
}
@@ -410,7 +412,7 @@
{
str2bd(val, local_addr);
valid_bda = TRUE;
- BTIF_TRACE_DEBUG6("Got prior random BDA %02X:%02X:%02X:%02X:%02X:%02X",
+ BTIF_TRACE_DEBUG("Got prior random BDA %02X:%02X:%02X:%02X:%02X:%02X",
local_addr->address[0], local_addr->address[1], local_addr->address[2],
local_addr->address[3], local_addr->address[4], local_addr->address[5]);
}
@@ -433,11 +435,11 @@
/* Convert to ascii, and store as a persistent property */
bd2str(local_addr, &bdstr);
- BTIF_TRACE_DEBUG2("No preset BDA. Generating BDA: %s for prop %s",
+ BTIF_TRACE_DEBUG("No preset BDA. Generating BDA: %s for prop %s",
(char*)bdstr, PERSIST_BDADDR_PROPERTY);
if (property_set(PERSIST_BDADDR_PROPERTY, (char*)bdstr) < 0)
- BTIF_TRACE_ERROR1("Failed to set random BDA in prop %s",PERSIST_BDADDR_PROPERTY);
+ BTIF_TRACE_ERROR("Failed to set random BDA in prop %s",PERSIST_BDADDR_PROPERTY);
}
//save the bd address to config file
@@ -506,7 +508,7 @@
static bt_status_t btif_associate_evt(void)
{
- BTIF_TRACE_DEBUG1("%s: notify ASSOCIATE_JVM", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s: notify ASSOCIATE_JVM", __FUNCTION__);
HAL_CBACK(bt_hal_cbacks, thread_evt_cb, ASSOCIATE_JVM);
return BT_STATUS_SUCCESS;
@@ -525,7 +527,7 @@
bt_status_t btif_enable_bluetooth(void)
{
- BTIF_TRACE_DEBUG0("BTIF ENABLE BLUETOOTH");
+ BTIF_TRACE_DEBUG("BTIF ENABLE BLUETOOTH");
if (btif_core_state != BTIF_CORE_STATE_DISABLED)
{
@@ -559,7 +561,7 @@
bdstr_t bdstr;
bdcpy(bd_addr.address, local_bd);
- BTIF_TRACE_DEBUG3("%s: status %d, local bd [%s]", __FUNCTION__, status,
+ BTIF_TRACE_DEBUG("%s: status %d, local bd [%s]", __FUNCTION__, status,
bd2str(&bd_addr, &bdstr));
if (bdcmp(btif_local_bd_addr.address,local_bd))
@@ -573,15 +575,15 @@
* the Controller's non-volatile memory rather than in device's file
* system.
**/
- BTIF_TRACE_WARNING0("***********************************************");
- BTIF_TRACE_WARNING6("BTIF init BDA was %02X:%02X:%02X:%02X:%02X:%02X",
+ BTIF_TRACE_WARNING("***********************************************");
+ BTIF_TRACE_WARNING("BTIF init BDA was %02X:%02X:%02X:%02X:%02X:%02X",
btif_local_bd_addr.address[0], btif_local_bd_addr.address[1],
btif_local_bd_addr.address[2], btif_local_bd_addr.address[3],
btif_local_bd_addr.address[4], btif_local_bd_addr.address[5]);
- BTIF_TRACE_WARNING6("Controller BDA is %02X:%02X:%02X:%02X:%02X:%02X",
+ BTIF_TRACE_WARNING("Controller BDA is %02X:%02X:%02X:%02X:%02X:%02X",
local_bd[0], local_bd[1], local_bd[2],
local_bd[3], local_bd[4], local_bd[5]);
- BTIF_TRACE_WARNING0("***********************************************");
+ BTIF_TRACE_WARNING("***********************************************");
bdcpy(btif_local_bd_addr.address, local_bd);
@@ -607,6 +609,9 @@
/* callback to HAL */
if (status == BTA_SUCCESS)
{
+ /* initialize a2dp service */
+ btif_av_init();
+
/* init rfcomm & l2cap api */
btif_sock_init();
@@ -655,11 +660,11 @@
if (!btif_is_enabled())
{
- BTIF_TRACE_ERROR0("btif_disable_bluetooth : not yet enabled");
+ BTIF_TRACE_ERROR("btif_disable_bluetooth : not yet enabled");
return BT_STATUS_NOT_READY;
}
- BTIF_TRACE_DEBUG0("BTIF DISABLE BLUETOOTH");
+ BTIF_TRACE_DEBUG("BTIF DISABLE BLUETOOTH");
btif_dm_on_disable();
btif_core_state = BTIF_CORE_STATE_DISABLING;
@@ -675,7 +680,7 @@
if (status != BTA_SUCCESS)
{
- BTIF_TRACE_ERROR1("disable bt failed (%d)", status);
+ BTIF_TRACE_ERROR("disable bt failed (%d)", status);
/* reset the original state to allow attempting disable again */
btif_core_state = BTIF_CORE_STATE_ENABLED;
@@ -699,13 +704,17 @@
void btif_disable_bluetooth_evt(void)
{
- BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s", __FUNCTION__);
#if (defined(HCILP_INCLUDED) && HCILP_INCLUDED == TRUE)
bte_main_enable_lpm(FALSE);
#endif
- bte_main_disable();
+#if (BLE_INCLUDED == TRUE)
+ BTA_VendorCleanup();
+#endif
+
+ bte_main_disable();
/* update local state */
btif_core_state = BTIF_CORE_STATE_DISABLED;
@@ -715,7 +724,7 @@
if (btif_shutdown_pending)
{
- BTIF_TRACE_DEBUG1("%s: calling btif_shutdown_bluetooth", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s: calling btif_shutdown_bluetooth", __FUNCTION__);
btif_shutdown_bluetooth();
}
}
@@ -734,11 +743,11 @@
bt_status_t btif_shutdown_bluetooth(void)
{
- BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s", __FUNCTION__);
if (btif_core_state == BTIF_CORE_STATE_DISABLING)
{
- BTIF_TRACE_WARNING0("shutdown during disabling");
+ BTIF_TRACE_WARNING("shutdown during disabling");
/* shutdown called before disabling is done */
btif_shutdown_pending = 1;
return BT_STATUS_NOT_READY;
@@ -746,7 +755,7 @@
if (btif_is_enabled())
{
- BTIF_TRACE_WARNING0("shutdown while still enabled, initiate disable");
+ BTIF_TRACE_WARNING("shutdown while still enabled, initiate disable");
/* shutdown called prior to disabling, initiate disable */
btif_disable_bluetooth();
@@ -774,7 +783,7 @@
bt_utils_cleanup();
- BTIF_TRACE_DEBUG1("%s done", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s done", __FUNCTION__);
return BT_STATUS_SUCCESS;
}
@@ -793,7 +802,7 @@
static bt_status_t btif_disassociate_evt(void)
{
- BTIF_TRACE_DEBUG1("%s: notify DISASSOCIATE_JVM", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s: notify DISASSOCIATE_JVM", __FUNCTION__);
HAL_CBACK(bt_hal_cbacks, thread_evt_cb, DISASSOCIATE_JVM);
@@ -835,10 +844,10 @@
*******************************************************************************/
bt_status_t btif_dut_mode_configure(uint8_t enable)
{
- BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s", __FUNCTION__);
if (btif_core_state != BTIF_CORE_STATE_ENABLED) {
- BTIF_TRACE_ERROR0("btif_dut_mode_configure : Bluetooth not enabled");
+ BTIF_TRACE_ERROR("btif_dut_mode_configure : Bluetooth not enabled");
return BT_STATUS_NOT_READY;
}
@@ -863,9 +872,9 @@
bt_status_t btif_dut_mode_send(uint16_t opcode, uint8_t *buf, uint8_t len)
{
/* TODO: Check that opcode is a vendor command group */
- BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s", __FUNCTION__);
if (!btif_is_dut_mode()) {
- BTIF_TRACE_ERROR0("Bluedroid HAL needs to be init with test_mode set to 1.");
+ BTIF_TRACE_ERROR("Bluedroid HAL needs to be init with test_mode set to 1.");
return BT_STATUS_FAIL;
}
BTM_VendorSpecificCommand(opcode, len, buf, btif_dut_mode_cback);
@@ -996,7 +1005,7 @@
int num_entries = 0;
bt_status_t status = BT_STATUS_SUCCESS;
- BTIF_TRACE_EVENT1("execute storage request event : %d", event);
+ BTIF_TRACE_EVENT("execute storage request event : %d", event);
switch(event)
{
@@ -1004,7 +1013,7 @@
{
btif_storage_req_t *p_req = (btif_storage_req_t*)p_param;
bt_property_t *p_prop = &(p_req->write_req.prop);
- BTIF_TRACE_EVENT3("type: %d, len %d, 0x%x", p_prop->type,
+ BTIF_TRACE_EVENT("type: %d, len %d, 0x%x", p_prop->type,
p_prop->len, p_prop->val);
status = btif_storage_set_adapter_property(p_prop);
@@ -1019,7 +1028,36 @@
prop.type = p_req->read_req.type;
prop.val = (void*)buf;
prop.len = sizeof(buf);
- status = btif_storage_get_adapter_property(&prop);
+ if (prop.type == BT_PROPERTY_LOCAL_LE_FEATURES)
+ {
+ #if (BLE_INCLUDED == TRUE)
+ tBTM_BLE_VSC_CB cmn_vsc_cb;
+ bt_local_le_features_t local_le_features;
+
+ /* LE features are not stored in storage. Should be retrived from stack */
+ BTM_BleGetVendorCapabilities(&cmn_vsc_cb);
+ local_le_features.local_privacy_enabled = BTM_BleLocalPrivacyEnabled();
+
+ prop.len = sizeof (bt_local_le_features_t);
+ if (cmn_vsc_cb.filter_support == 1)
+ local_le_features.max_adv_filter_supported = cmn_vsc_cb.max_filter;
+ else
+ local_le_features.max_adv_filter_supported = 0;
+ local_le_features.max_adv_instance = cmn_vsc_cb.adv_inst_max;
+ local_le_features.max_irk_list_size = cmn_vsc_cb.max_irk_list_sz;
+ local_le_features.rpa_offload_supported = cmn_vsc_cb.rpa_offloading;
+ local_le_features.scan_result_storage_size_hibyte =
+ (cmn_vsc_cb.tot_scan_results_strg >> 8) & (0xFF);
+ local_le_features.scan_result_storage_size_lobyte =
+ (cmn_vsc_cb.tot_scan_results_strg) & (0xFF);
+ local_le_features.activity_energy_info_supported = cmn_vsc_cb.energy_support;
+ memcpy(prop.val, &local_le_features, prop.len);
+ #endif
+ }
+ else
+ {
+ status = btif_storage_get_adapter_property(&prop);
+ }
HAL_CBACK(bt_hal_cbacks, adapter_properties_cb, status, 1, &prop);
} break;
@@ -1034,7 +1072,7 @@
} break;
default:
- BTIF_TRACE_ERROR2("%s invalid event id (%d)", __FUNCTION__, event);
+ BTIF_TRACE_ERROR("%s invalid event id (%d)", __FUNCTION__, event);
break;
}
}
@@ -1044,7 +1082,7 @@
bt_status_t status = BT_STATUS_FAIL;
bt_property_t prop;
- BTIF_TRACE_EVENT1("execute storage remote request event : %d", event);
+ BTIF_TRACE_EVENT("execute storage remote request event : %d", event);
switch (event)
{
@@ -1105,7 +1143,7 @@
btif_storage_req_t *new_req = (btif_storage_req_t*)p_new_buf;
btif_storage_req_t *old_req = (btif_storage_req_t*)p_old_buf;
- BTIF_TRACE_EVENT1("%s", __FUNCTION__);
+ BTIF_TRACE_EVENT("%s", __FUNCTION__);
switch (event)
{
case BTIF_CORE_STORAGE_REMOTE_WRITE:
@@ -1135,7 +1173,7 @@
bt_status_t btif_get_adapter_properties(void)
{
- BTIF_TRACE_EVENT1("%s", __FUNCTION__);
+ BTIF_TRACE_EVENT("%s", __FUNCTION__);
if (!btif_is_enabled())
return BT_STATUS_NOT_READY;
@@ -1159,7 +1197,7 @@
{
btif_storage_req_t req;
- BTIF_TRACE_EVENT2("%s %d", __FUNCTION__, type);
+ BTIF_TRACE_EVENT("%s %d", __FUNCTION__, type);
/* Allow get_adapter_property only for BDADDR and BDNAME if BT is disabled */
if (!btif_is_enabled() && (type != BT_PROPERTY_BDADDR) && (type != BT_PROPERTY_BDNAME))
@@ -1192,7 +1230,7 @@
char bd_name[BTM_MAX_LOC_BD_NAME_LEN +1];
UINT16 name_len = 0;
- BTIF_TRACE_EVENT3("btif_set_adapter_property type: %d, len %d, 0x%x",
+ BTIF_TRACE_EVENT("btif_set_adapter_property type: %d, len %d, 0x%x",
property->type, property->len, property->val);
if (!btif_is_enabled())
@@ -1207,7 +1245,7 @@
memcpy(bd_name,property->val, name_len);
bd_name[name_len] = '\0';
- BTIF_TRACE_EVENT1("set property name : %s", (char *)bd_name);
+ BTIF_TRACE_EVENT("set property name : %s", (char *)bd_name);
BTA_DmSetDeviceName((char *)bd_name);
@@ -1239,11 +1277,11 @@
break;
default:
- BTIF_TRACE_ERROR1("invalid scan mode (0x%x)", mode);
+ BTIF_TRACE_ERROR("invalid scan mode (0x%x)", mode);
return BT_STATUS_PARM_INVALID;
}
- BTIF_TRACE_EVENT1("set property scan mode : %x", mode);
+ BTIF_TRACE_EVENT("set property scan mode : %x", mode);
BTA_DmSetVisibility(disc_mode, conn_mode, BTA_DM_IGNORE, BTA_DM_IGNORE);
@@ -1266,7 +1304,7 @@
status = BT_STATUS_FAIL;
break;
default:
- BTIF_TRACE_ERROR1("btif_get_adapter_property : invalid type %d",
+ BTIF_TRACE_ERROR("btif_get_adapter_property : invalid type %d",
property->type);
status = BT_STATUS_FAIL;
break;
@@ -1427,7 +1465,7 @@
btif_enabled_services |= (1 << service_id);
- BTIF_TRACE_DEBUG2("%s: current services:0x%x", __FUNCTION__, btif_enabled_services);
+ BTIF_TRACE_DEBUG("%s: current services:0x%x", __FUNCTION__, btif_enabled_services);
if (btif_is_enabled())
{
@@ -1460,7 +1498,7 @@
btif_enabled_services &= (tBTA_SERVICE_MASK)(~(1<<service_id));
- BTIF_TRACE_DEBUG2("%s: Current Services:0x%x", __FUNCTION__, btif_enabled_services);
+ BTIF_TRACE_DEBUG("%s: Current Services:0x%x", __FUNCTION__, btif_enabled_services);
if (btif_is_enabled())
{
diff --git a/btif/src/btif_dm.c b/btif/src/btif_dm.c
index f907b67..1194c42 100644
--- a/btif/src/btif_dm.c
+++ b/btif/src/btif_dm.c
@@ -44,6 +44,34 @@
#include "btif_config.h"
#include "bta_gatt_api.h"
+
+/******************************************************************************
+** Device specific workarounds
+******************************************************************************/
+
+/**
+ * The devices below have proven problematic during the pairing process, often
+ * requiring multiple retries to complete pairing. To avoid degrading the user
+ * experience for other devices, explicitely blacklist troubled devices here.
+ */
+static const UINT8 blacklist_pairing_retries[][3] = {
+ {0x9C, 0xDF, 0x03} // BMW car kits (Harman/Becker)
+};
+
+BOOLEAN blacklistPairingRetries(BD_ADDR bd_addr)
+{
+ const unsigned blacklist_size = sizeof(blacklist_pairing_retries)
+ / sizeof(blacklist_pairing_retries[0]);
+ for (unsigned i = 0; i != blacklist_size; ++i)
+ {
+ if (blacklist_pairing_retries[i][0] == bd_addr[0] &&
+ blacklist_pairing_retries[i][1] == bd_addr[1] &&
+ blacklist_pairing_retries[i][2] == bd_addr[2])
+ return TRUE;
+ }
+ return FALSE;
+}
+
/******************************************************************************
** Constants & Macros
******************************************************************************/
@@ -64,6 +92,8 @@
#define BTIF_DM_DEFAULT_INQ_MAX_DURATION 10
#define BTIF_DM_MAX_SDP_ATTEMPTS_AFTER_PAIRING 2
+#define NUM_TIMEOUT_RETRIES 5
+
#define PROPERTY_PRODUCT_MODEL "ro.product.model"
#define DEFAULT_LOCAL_NAME_MAX 31
#if (DEFAULT_LOCAL_NAME_MAX > BTM_MAX_LOC_BD_NAME_LEN)
@@ -77,6 +107,8 @@
#define BTIF_DM_INTERLEAVE_DURATION_LE_TWO 4
#endif
+#define MAX_SDP_BL_ENTRIES 3
+
#define BOND_TYPE_UNKNOWN 0
#define BOND_TYPE_PERSISTENT 1
#define BOND_TYPE_TEMPORARY 2
@@ -88,7 +120,10 @@
UINT8 bond_type;
UINT8 pin_code_len;
UINT8 is_ssp;
+ UINT8 auth_req;
+ UINT8 io_cap;
UINT8 autopair_attempts;
+ UINT8 timeout_retries;
UINT8 is_local_initiated;
UINT8 sdp_attempts;
#if (defined(BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
@@ -126,11 +161,41 @@
BT_OCTET16 sp_r;
BD_ADDR oob_bdaddr; /* peer bdaddr*/
} btif_dm_oob_cb_t;
+
+typedef struct
+{
+ bt_bdaddr_t bdaddr;
+ UINT8 transport; /* 0=Unknown, 1=BR/EDR, 2=LE */
+} btif_dm_create_bond_cb_t;
+
+typedef struct
+{
+ uint8_t status;
+ uint8_t ctrl_state;
+ uint64_t tx_time;
+ uint64_t rx_time;
+ uint64_t idle_time;
+ uint64_t energy_used;
+} btif_activity_energy_info_cb_t;
+
+typedef struct
+{
+ unsigned int manufact_id;
+}skip_sdp_entry_t;
+
#define BTA_SERVICE_ID_TO_SERVICE_MASK(id) (1 << (id))
+#define MAX_SDP_BL_ENTRIES 3
+#define UUID_HUMAN_INTERFACE_DEVICE "00001124-0000-1000-8000-00805f9b34fb"
+
+static skip_sdp_entry_t sdp_blacklist[] = {{76}}; //Apple Mouse and Keyboard
+
+
/* This flag will be true if HCI_Inquiry is in progress */
static BOOLEAN btif_dm_inquiry_in_progress = FALSE;
+
+
/************************************************************************************
** Static variables
************************************************************************************/
@@ -142,7 +207,7 @@
static btif_dm_pairing_cb_t pairing_cb;
static btif_dm_oob_cb_t oob_cb;
static void btif_dm_generic_evt(UINT16 event, char* p_param);
-static void btif_dm_cb_create_bond(bt_bdaddr_t *bd_addr);
+static void btif_dm_cb_create_bond(bt_bdaddr_t *bd_addr, tBTA_TRANSPORT transport);
static void btif_dm_cb_hid_remote_name(tBTM_REMOTE_DEV_NAME *p_remote_name);
static void btif_update_remote_properties(BD_ADDR bd_addr, BD_NAME bd_name,
DEV_CLASS dev_class, tBT_DEVICE_TYPE dev_type);
@@ -152,6 +217,11 @@
static void btif_dm_ble_auth_cmpl_evt (tBTA_DM_AUTH_CMPL *p_auth_cmpl);
static void btif_dm_ble_passkey_req_evt(tBTA_DM_PIN_REQ *p_pin_req);
#endif
+
+static void bte_scan_filt_param_cfg_evt(UINT8 action_type,
+ tBTA_DM_BLE_PF_AVBL_SPACE avbl_space,
+ tBTA_DM_BLE_REF_VALUE ref_value, tBTA_STATUS status);
+
static char* btif_get_default_local_name();
/******************************************************************************
** Externs
@@ -160,6 +230,8 @@
extern bt_status_t btif_hf_execute_service(BOOLEAN b_enable);
extern bt_status_t btif_av_execute_service(BOOLEAN b_enable);
extern bt_status_t btif_hh_execute_service(BOOLEAN b_enable);
+extern bt_status_t btif_hf_client_execute_service(BOOLEAN b_enable);
+extern bt_status_t btif_mce_execute_service(BOOLEAN b_enable);
extern int btif_hh_connect(bt_bdaddr_t *bd_addr);
extern void bta_gatt_convert_uuid16_to_uuid128(UINT8 uuid_128[LEN_UUID_128], UINT16 uuid_16);
@@ -187,9 +259,16 @@
{
btif_hh_execute_service(b_enable);
}break;
-
+ case BTA_HFP_HS_SERVICE_ID:
+ {
+ btif_hf_client_execute_service(b_enable);
+ }break;
+ case BTA_MAP_SERVICE_ID:
+ {
+ btif_mce_execute_service(b_enable);
+ }break;
default:
- BTIF_TRACE_ERROR1("%s: Unknown service being enabled", __FUNCTION__);
+ BTIF_TRACE_ERROR("%s: Unknown service being enabled", __FUNCTION__);
return BT_STATUS_FAIL;
}
return BT_STATUS_SUCCESS;
@@ -287,6 +366,7 @@
sizeof(uint32_t), &remote_cod);
if (btif_storage_get_remote_device_property((bt_bdaddr_t *)remote_bdaddr, &prop_name) == BT_STATUS_SUCCESS)
{
+ BTIF_TRACE_ERROR("%s: remote_cod = 0x%06x", __FUNCTION__, remote_cod);
if ((remote_cod & 0x7ff) == cod)
return TRUE;
}
@@ -305,6 +385,7 @@
if (btif_storage_get_remote_device_property((bt_bdaddr_t *)remote_bdaddr,
&prop_name) == BT_STATUS_SUCCESS)
{
+ BTIF_TRACE_DEBUG("%s: remote_cod = 0x%06x", __FUNCTION__, remote_cod);
if ((remote_cod & 0x700) == cod)
return TRUE;
}
@@ -333,6 +414,59 @@
return FALSE;
}
+/*****************************************************************************
+**
+** Function check_sdp_bl
+**
+** Description Checks if a given device is blacklisted to skip sdp
+**
+** Parameters skip_sdp_entry
+**
+** Returns TRUE if the device is present in blacklist, else FALSE
+**
+*******************************************************************************/
+BOOLEAN check_sdp_bl(const bt_bdaddr_t *remote_bdaddr)
+{
+ UINT8 i = 0;
+ UINT16 manufacturer = 0;
+ UINT8 lmp_ver = 0;
+ UINT16 lmp_subver = 0;
+ tBTM_STATUS btm_status;
+ bt_property_t prop_name;
+ bt_remote_version_t info;
+ bt_status_t status;
+
+
+ if (remote_bdaddr == NULL)
+ return FALSE;
+
+/* fetch additional info about remote device used in iop query */
+ btm_status = BTM_ReadRemoteVersion(*(BD_ADDR*)remote_bdaddr, &lmp_ver,
+ &manufacturer, &lmp_subver);
+
+
+
+ /* if not available yet, try fetching from config database */
+ BTIF_STORAGE_FILL_PROPERTY(&prop_name, BT_PROPERTY_REMOTE_VERSION_INFO,
+ sizeof(bt_remote_version_t), &info);
+
+ if (btif_storage_get_remote_device_property((bt_bdaddr_t *)remote_bdaddr,
+ &prop_name) != BT_STATUS_SUCCESS)
+ {
+
+ return FALSE;
+ }
+ manufacturer = info.manufacturer;
+
+ for (int i = 0; i < MAX_SDP_BL_ENTRIES; i++)
+ {
+ if (manufacturer == sdp_blacklist[i].manufact_id)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+
static void bond_state_changed(bt_status_t status, bt_bdaddr_t *bd_addr, bt_bond_state_t state)
{
/* Send bonding state only once - based on outgoing/incoming we may receive duplicates */
@@ -343,7 +477,7 @@
{
state = BT_BOND_STATE_NONE;
}
- BTIF_TRACE_DEBUG3("%s: state=%d prev_state=%d", __FUNCTION__, state, pairing_cb.state);
+ BTIF_TRACE_DEBUG("%s: state=%d prev_state=%d", __FUNCTION__, state, pairing_cb.state);
HAL_CBACK(bt_hal_cbacks, bond_state_changed_cb, status, bd_addr, state);
@@ -419,9 +553,18 @@
/* class of device */
cod = devclass2uint(dev_class);
+ BTIF_TRACE_DEBUG("%s():cod is 0x%06x", __FUNCTION__, cod);
if ( cod == 0) {
- BTIF_TRACE_DEBUG1("%s():cod is 0, set as unclassified", __FUNCTION__);
- cod = COD_UNCLASSIFIED;
+ /* Try to retrieve cod from storage */
+ BTIF_TRACE_DEBUG("%s():cod is 0, checking cod from storage", __FUNCTION__);
+ BTIF_STORAGE_FILL_PROPERTY(&properties[num_properties],
+ BT_PROPERTY_CLASS_OF_DEVICE, sizeof(cod), &cod);
+ status = btif_storage_get_remote_device_property(&bdaddr, &properties[num_properties]);
+ BTIF_TRACE_DEBUG("%s():cod retreived from storage is 0x%06x", __FUNCTION__, cod);
+ if ( cod == 0) {
+ BTIF_TRACE_DEBUG("%s():cod is again 0, set as unclassified", __FUNCTION__);
+ cod = COD_UNCLASSIFIED;
+ }
}
BTIF_STORAGE_FILL_PROPERTY(&properties[num_properties],
@@ -441,23 +584,6 @@
HAL_CBACK(bt_hal_cbacks, remote_device_properties_cb,
status, &bdaddr, num_properties, properties);
}
-/*******************************************************************************
-**
-** Function hid_remote_name_cback
-**
-** Description Remote name callback for HID device. Called in stack context
-** Special handling for HID devices
-**
-** Returns void
-**
-*******************************************************************************/
-static void hid_remote_name_cback(void *p_param)
-{
- BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
-
- btif_transfer_context(btif_dm_generic_evt, BTIF_DM_CB_HID_REMOTE_NAME,
- (char *)p_param, sizeof(tBTM_REMOTE_DEV_NAME), NULL);
-}
/*******************************************************************************
**
@@ -471,7 +597,7 @@
*******************************************************************************/
static void btif_dm_cb_hid_remote_name(tBTM_REMOTE_DEV_NAME *p_remote_name)
{
- BTIF_TRACE_DEBUG3("%s: status=%d pairing_cb.state=%d", __FUNCTION__, p_remote_name->status, pairing_cb.state);
+ BTIF_TRACE_DEBUG("%s: status=%d pairing_cb.state=%d", __FUNCTION__, p_remote_name->status, pairing_cb.state);
if (pairing_cb.state == BT_BOND_STATE_BONDING)
{
bt_bdaddr_t remote_bd;
@@ -497,35 +623,49 @@
** Returns void
**
*******************************************************************************/
-static void btif_dm_cb_create_bond(bt_bdaddr_t *bd_addr)
+static void btif_dm_cb_create_bond(bt_bdaddr_t *bd_addr, tBTA_TRANSPORT transport)
{
BOOLEAN is_hid = check_cod(bd_addr, COD_HID_POINTING);
-
-
bond_state_changed(BT_STATUS_SUCCESS, bd_addr, BT_BOND_STATE_BONDING);
- if (is_hid){
+#if BLE_INCLUDED == TRUE
+ int device_type;
+ int addr_type;
+ bdstr_t bdstr;
+ bd2str(bd_addr, &bdstr);
+ if (transport == BT_TRANSPORT_LE)
+ {
+ if (!btif_config_get_int("Remote", (char const *)&bdstr,"DevType", &device_type))
+ {
+ btif_config_set_int("Remote", bdstr, "DevType", BT_DEVICE_TYPE_BLE);
+ }
+ if (btif_storage_get_remote_addr_type(bd_addr, &addr_type) != BT_STATUS_SUCCESS)
+ {
+ btif_storage_set_remote_addr_type(bd_addr, BLE_ADDR_PUBLIC);
+ }
+ }
+ if((btif_config_get_int("Remote", (char const *)&bdstr,"DevType", &device_type) &&
+ (btif_storage_get_remote_addr_type(bd_addr, &addr_type) == BT_STATUS_SUCCESS) &&
+ (device_type == BT_DEVICE_TYPE_BLE)) || (transport == BT_TRANSPORT_LE))
+ {
+ BTA_DmAddBleDevice(bd_addr->address, addr_type, BT_DEVICE_TYPE_BLE);
+ }
+#endif
- int status;
- status = btif_hh_connect(bd_addr);
- if(status != BT_STATUS_SUCCESS)
- bond_state_changed(status, bd_addr, BT_BOND_STATE_NONE);
+#if BLE_INCLUDED == TRUE
+ if(is_hid && device_type != BT_DEVICE_TYPE_BLE)
+#else
+ if(is_hid)
+#endif
+ {
+ int status;
+ status = btif_hh_connect(bd_addr);
+ if(status != BT_STATUS_SUCCESS)
+ bond_state_changed(status, bd_addr, BT_BOND_STATE_NONE);
}
else
{
-#if BLE_INCLUDED == TRUE
- int device_type;
- int addr_type;
- bdstr_t bdstr;
- bd2str(bd_addr, &bdstr);
- if(btif_config_get_int("Remote", (char const *)&bdstr,"DevType", &device_type) &&
- (btif_storage_get_remote_addr_type(bd_addr, &addr_type) == BT_STATUS_SUCCESS) &&
- (device_type == BT_DEVICE_TYPE_BLE))
- {
- BTA_DmAddBleDevice(bd_addr->address, addr_type, BT_DEVICE_TYPE_BLE);
- }
-#endif
- BTA_DmBond ((UINT8 *)bd_addr->address);
+ BTA_DmBondByTransport((UINT8 *)bd_addr->address, transport);
}
/* Track originator of bond creation */
pairing_cb.is_local_initiated = TRUE;
@@ -558,6 +698,20 @@
/*******************************************************************************
**
+** Function btif_dm_get_connection_state
+**
+** Description Returns whether the remote device is currently connected
+**
+** Returns 0 if not connected
+**
+*******************************************************************************/
+uint16_t btif_dm_get_connection_state(const bt_bdaddr_t *bd_addr)
+{
+ return BTA_DmGetConnectionState((UINT8 *)bd_addr->address);
+}
+
+/*******************************************************************************
+**
** Function search_devices_copy_cb
**
** Description Deep copy callback for search devices event
@@ -573,7 +727,7 @@
if (!p_src)
return;
- BTIF_TRACE_DEBUG2("%s: event=%s", __FUNCTION__, dump_dm_search_event(event));
+ BTIF_TRACE_DEBUG("%s: event=%s", __FUNCTION__, dump_dm_search_event(event));
memcpy(p_dest_data, p_src_data, sizeof(tBTA_DM_SEARCH));
switch (event)
{
@@ -664,7 +818,7 @@
cod = devclass2uint(p_pin_req->dev_class);
if ( cod == 0) {
- BTIF_TRACE_DEBUG1("%s():cod is 0, set as unclassified", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s():cod is 0, set as unclassified", __FUNCTION__);
cod = COD_UNCLASSIFIED;
}
@@ -678,12 +832,12 @@
check_cod(&bd_addr, COD_AV_HIFI_AUDIO) ||
check_cod(&bd_addr, COD_HID_POINTING))
{
- BTIF_TRACE_DEBUG1("%s()cod matches for auto pair", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s()cod matches for auto pair", __FUNCTION__);
/* Check if this device can be auto paired */
if ((btif_storage_is_device_autopair_blacklisted(&bd_addr) == FALSE) &&
(pairing_cb.autopair_attempts == 0))
{
- BTIF_TRACE_DEBUG1("%s() Attempting auto pair", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s() Attempting auto pair", __FUNCTION__);
pin_code.pin[0] = 0x30;
pin_code.pin[1] = 0x30;
pin_code.pin[2] = 0x30;
@@ -700,7 +854,7 @@
if(( btif_storage_is_fixed_pin_zeros_keyboard (&bd_addr) == TRUE) &&
(pairing_cb.autopair_attempts == 0))
{
- BTIF_TRACE_DEBUG1("%s() Attempting auto pair", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s() Attempting auto pair", __FUNCTION__);
pin_code.pin[0] = 0x30;
pin_code.pin[1] = 0x30;
pin_code.pin[2] = 0x30;
@@ -732,7 +886,7 @@
UINT32 cod;
BOOLEAN is_incoming = !(pairing_cb.state == BT_BOND_STATE_BONDING);
- BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s", __FUNCTION__);
/* Remote properties update */
btif_update_remote_properties(p_ssp_cfm_req->bd_addr, p_ssp_cfm_req->bd_name,
@@ -765,12 +919,12 @@
if ((is_incoming) && ((p_ssp_cfm_req->loc_io_caps == 0x01) &&
(p_ssp_cfm_req->rmt_io_caps == 0x00 || p_ssp_cfm_req->rmt_io_caps == 0x03)))
{
- BTIF_TRACE_EVENT3("%s: User consent needed for incoming pairing request. loc_io_caps: %d, rmt_io_caps: %d",
+ BTIF_TRACE_EVENT("%s: User consent needed for incoming pairing request. loc_io_caps: %d, rmt_io_caps: %d",
__FUNCTION__, p_ssp_cfm_req->loc_io_caps, p_ssp_cfm_req->rmt_io_caps);
}
else
{
- BTIF_TRACE_EVENT1("%s: Auto-accept JustWorks pairing", __FUNCTION__);
+ BTIF_TRACE_EVENT("%s: Auto-accept JustWorks pairing", __FUNCTION__);
btif_dm_ssp_reply(&bd_addr, BT_SSP_VARIANT_CONSENT, TRUE, 0);
return;
}
@@ -795,7 +949,7 @@
bt_bdname_t bd_name;
UINT32 cod;
- BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s", __FUNCTION__);
/* Remote properties update */
btif_update_remote_properties(p_ssp_key_notif->bd_addr, p_ssp_key_notif->bd_name,
@@ -832,6 +986,7 @@
bt_bdaddr_t bd_addr;
bt_status_t status = BT_STATUS_FAIL;
bt_bond_state_t state = BT_BOND_STATE_NONE;
+ BOOLEAN skip_sdp = FALSE;
bdcpy(bd_addr.address, p_auth_cmpl->bd_addr);
if ( (p_auth_cmpl->success == TRUE) && (p_auth_cmpl->key_present) )
@@ -840,7 +995,7 @@
(p_auth_cmpl->key_type == HCI_LKEY_TYPE_CHANGED_COMB) || pairing_cb.bond_type == BOND_TYPE_PERSISTENT)
{
bt_status_t ret;
- BTIF_TRACE_DEBUG3("%s: Storing link key. key_type=0x%x, bond_type=%d",
+ BTIF_TRACE_DEBUG("%s: Storing link key. key_type=0x%x, bond_type=%d",
__FUNCTION__, p_auth_cmpl->key_type, pairing_cb.bond_type);
ret = btif_storage_add_bonded_device(&bd_addr,
p_auth_cmpl->key, p_auth_cmpl->key_type,
@@ -849,30 +1004,63 @@
}
else
{
- BTIF_TRACE_DEBUG3("%s: Temporary key. Not storing. key_type=0x%x, bond_type=%d",
+ BTIF_TRACE_DEBUG("%s: Temporary key. Not storing. key_type=0x%x, bond_type=%d",
__FUNCTION__, p_auth_cmpl->key_type, pairing_cb.bond_type);
if(pairing_cb.bond_type == BOND_TYPE_TEMPORARY)
{
- BTIF_TRACE_DEBUG1("%s: sending BT_BOND_STATE_NONE for Temp pairing",
+ BTIF_TRACE_DEBUG("%s: sending BT_BOND_STATE_NONE for Temp pairing",
__FUNCTION__);
bond_state_changed(BT_STATUS_SUCCESS, &bd_addr, BT_BOND_STATE_NONE);
return;
}
}
}
+
+ // Skip SDP for certain HID Devices
if (p_auth_cmpl->success)
{
+ pairing_cb.timeout_retries = 0;
status = BT_STATUS_SUCCESS;
state = BT_BOND_STATE_BONDED;
+ bdcpy(bd_addr.address, p_auth_cmpl->bd_addr);
- /* Trigger SDP on the device */
- pairing_cb.sdp_attempts = 1;;
+ if (check_sdp_bl(&bd_addr) && check_cod_hid(&bd_addr, COD_HID_MAJOR))
+ {
+ ALOGW("%s:skip SDP",
+ __FUNCTION__);
+ skip_sdp = TRUE;
+ }
+ if(!pairing_cb.is_local_initiated && skip_sdp)
+ {
+ bond_state_changed(status, &bd_addr, state);
- if(btif_dm_inquiry_in_progress)
- btif_dm_cancel_discovery();
+ ALOGW("%s: Incoming HID Connection",__FUNCTION__);
+ bt_property_t prop;
+ bt_bdaddr_t bd_addr;
+ bt_uuid_t uuid;
+ char uuid_str[128] = UUID_HUMAN_INTERFACE_DEVICE;
- btif_dm_get_remote_services(&bd_addr);
- /* Do not call bond_state_changed_cb yet. Wait till fetch remote service is complete */
+ string_to_uuid(uuid_str, &uuid);
+
+ prop.type = BT_PROPERTY_UUIDS;
+ prop.val = uuid.uu;
+ prop.len = MAX_UUID_SIZE;
+
+ /* Send the event to the BTIF */
+ HAL_CBACK(bt_hal_cbacks, remote_device_properties_cb,
+ BT_STATUS_SUCCESS, &bd_addr, 1, &prop);
+ }
+ else
+ {
+ /* Trigger SDP on the device */
+ pairing_cb.sdp_attempts = 1;;
+
+ if(btif_dm_inquiry_in_progress)
+ btif_dm_cancel_discovery();
+
+ btif_dm_get_remote_services(&bd_addr);
+ }
+ /* Do not call bond_state_changed_cb yet. Wait till fetch remote service is complete */
}
else
{
@@ -880,21 +1068,42 @@
switch(p_auth_cmpl->fail_reason)
{
case HCI_ERR_PAGE_TIMEOUT:
+ if (blacklistPairingRetries(bd_addr.address) && pairing_cb.timeout_retries)
+ {
+ BTIF_TRACE_WARNING("%s() - Pairing timeout; retrying (%d) ...", __FUNCTION__, pairing_cb.timeout_retries);
+ --pairing_cb.timeout_retries;
+ btif_dm_cb_create_bond (&bd_addr, BTA_TRANSPORT_UNKNOWN);
+ return;
+ }
+ /* Fall-through */
case HCI_ERR_CONNECTION_TOUT:
status = BT_STATUS_RMT_DEV_DOWN;
break;
+ case HCI_ERR_PAIRING_NOT_ALLOWED:
+ status = BT_STATUS_AUTH_REJECTED;
+ break;
+
+ case HCI_ERR_LMP_RESPONSE_TIMEOUT:
+ status = BT_STATUS_AUTH_FAILURE;
+ break;
+
/* map the auth failure codes, so we can retry pairing if necessary */
case HCI_ERR_AUTH_FAILURE:
+ case HCI_ERR_KEY_MISSING:
+ btif_storage_remove_bonded_device(&bd_addr);
case HCI_ERR_HOST_REJECT_SECURITY:
case HCI_ERR_ENCRY_MODE_NOT_ACCEPTABLE:
case HCI_ERR_UNIT_KEY_USED:
case HCI_ERR_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED:
case HCI_ERR_INSUFFCIENT_SECURITY:
- BTIF_TRACE_DEBUG1(" %s() Authentication fail ", __FUNCTION__);
+ case HCI_ERR_PEER_USER:
+ case HCI_ERR_UNSPECIFIED:
+ BTIF_TRACE_DEBUG(" %s() Authentication fail reason %d",
+ __FUNCTION__, p_auth_cmpl->fail_reason);
if (pairing_cb.autopair_attempts == 1)
{
- BTIF_TRACE_DEBUG1("%s(): Adding device to blacklist ", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s(): Adding device to blacklist ", __FUNCTION__);
/* Add the device to dynamic black list only if this device belongs to Audio/pointing dev class */
if (check_cod(&bd_addr, COD_AV_HEADSETS) ||
@@ -909,8 +1118,8 @@
pairing_cb.autopair_attempts++;
/* Create the Bond once again */
- BTIF_TRACE_DEBUG1("%s() auto pair failed. Reinitiate Bond", __FUNCTION__);
- btif_dm_cb_create_bond (&bd_addr);
+ BTIF_TRACE_DEBUG("%s() auto pair failed. Reinitiate Bond", __FUNCTION__);
+ btif_dm_cb_create_bond (&bd_addr, BTA_TRANSPORT_UNKNOWN);
return;
}
else
@@ -923,6 +1132,12 @@
default:
status = BT_STATUS_FAIL;
}
+ /* Special Handling for HID Devices */
+ if (check_cod(&bd_addr, COD_HID_POINTING)) {
+ /* Remove Device as bonded in nvram as authentication failed */
+ BTIF_TRACE_DEBUG("%s(): removing hid pointing device from nvram", __FUNCTION__);
+ btif_storage_remove_bonded_device(&bd_addr);
+ }
bond_state_changed(status, &bd_addr, state);
}
}
@@ -939,7 +1154,7 @@
static void btif_dm_search_devices_evt (UINT16 event, char *p_param)
{
tBTA_DM_SEARCH *p_search_data;
- BTIF_TRACE_EVENT2("%s event=%s", __FUNCTION__, dump_dm_search_event(event));
+ BTIF_TRACE_EVENT("%s event=%s", __FUNCTION__, dump_dm_search_event(event));
switch (event)
{
@@ -982,7 +1197,7 @@
p_search_data = (tBTA_DM_SEARCH *)p_param;
bdcpy(bdaddr.address, p_search_data->inq_res.bd_addr);
- BTIF_TRACE_DEBUG3("%s() %s device_type = 0x%x\n", __FUNCTION__, bd2str(&bdaddr, &bdstr),
+ BTIF_TRACE_DEBUG("%s() %s device_type = 0x%x\n", __FUNCTION__, bd2str(&bdaddr, &bdstr),
#if (BLE_INCLUDED == TRUE)
p_search_data->inq_res.device_type);
#else
@@ -1004,7 +1219,7 @@
if (p_search_data->inq_res.p_eir)
{
BTA_GetEirService(p_search_data->inq_res.p_eir, &services);
- BTIF_TRACE_DEBUG2("%s()EIR BTA services = %08X", __FUNCTION__, (UINT32)services);
+ BTIF_TRACE_DEBUG("%s()EIR BTA services = %08X", __FUNCTION__, (UINT32)services);
/* TODO: Get the service list and check to see which uuids we got and send it back to the client. */
}
@@ -1056,6 +1271,12 @@
ASSERTC(status == BT_STATUS_SUCCESS, "failed to save remote device (inquiry)", status);
#if (defined(BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
status = btif_storage_set_remote_addr_type(&bdaddr, addr_type);
+ if (( dev_type == BT_DEVICE_TYPE_DUMO)&&
+ (p_search_data->inq_res.flag & BTA_BLE_DMT_CONTROLLER_SPT) &&
+ (p_search_data->inq_res.flag & BTA_BLE_DMT_HOST_SPT))
+ {
+ btif_storage_set_dmt_support_type (&bdaddr, TRUE);
+ }
ASSERTC(status == BT_STATUS_SUCCESS, "failed to save remote addr type (inquiry)", status);
#endif
/* Callback to notify upper layer of device */
@@ -1067,6 +1288,12 @@
case BTA_DM_INQ_CMPL_EVT:
{
+#if (defined(BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
+ tBTA_DM_BLE_PF_FILT_PARAMS adv_filt_param;
+ memset(&adv_filt_param, 0, sizeof(tBTA_DM_BLE_PF_FILT_PARAMS));
+ BTA_DmBleScanFilterSetup(BTA_DM_BLE_SCAN_COND_DELETE, 0, &adv_filt_param, NULL,
+ bte_scan_filt_param_cfg_evt, 0);
+#endif
}
break;
case BTA_DM_DISC_CMPL_EVT:
@@ -1106,7 +1333,7 @@
{
tBTA_DM_SEARCH *p_data = (tBTA_DM_SEARCH*)p_param;
- BTIF_TRACE_EVENT2("%s: event = %d", __FUNCTION__, event);
+ BTIF_TRACE_EVENT("%s: event = %d", __FUNCTION__, event);
switch (event)
{
case BTA_DM_DISC_RES_EVT:
@@ -1119,13 +1346,13 @@
bdcpy(bd_addr.address, p_data->disc_res.bd_addr);
- BTIF_TRACE_DEBUG3("%s:(result=0x%x, services 0x%x)", __FUNCTION__,
+ BTIF_TRACE_DEBUG("%s:(result=0x%x, services 0x%x)", __FUNCTION__,
p_data->disc_res.result, p_data->disc_res.services);
if ((p_data->disc_res.result != BTA_SUCCESS) &&
(pairing_cb.state == BT_BOND_STATE_BONDING ) &&
(pairing_cb.sdp_attempts < BTIF_DM_MAX_SDP_ATTEMPTS_AFTER_PAIRING))
{
- BTIF_TRACE_WARNING1("%s:SDP failed after bonding re-attempting", __FUNCTION__);
+ BTIF_TRACE_WARNING("%s:SDP failed after bonding re-attempting", __FUNCTION__);
pairing_cb.sdp_attempts++;
btif_dm_get_remote_services(&bd_addr);
return;
@@ -1140,7 +1367,7 @@
{
char temp[256];
uuid_to_string((bt_uuid_t*)(p_data->disc_res.p_uuid_list + (i*MAX_UUID_SIZE)), temp);
- BTIF_TRACE_ERROR2("Index: %d uuid:%s", i, temp);
+ BTIF_TRACE_ERROR("Index: %d uuid:%s", i, temp);
}
}
@@ -1151,7 +1378,7 @@
(bdcmp(p_data->disc_res.bd_addr, pairing_cb.bd_addr) == 0)&&
pairing_cb.sdp_attempts > 0)
{
- BTIF_TRACE_DEBUG1("%s Remote Service SDP done. Call bond_state_changed_cb BONDED",
+ BTIF_TRACE_DEBUG("%s Remote Service SDP done. Call bond_state_changed_cb BONDED",
__FUNCTION__);
pairing_cb.sdp_attempts = 0;
bond_state_changed(BT_STATUS_SUCCESS, &bd_addr, BT_BOND_STATE_BONDED);
@@ -1175,14 +1402,14 @@
#if (defined(BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
case BTA_DM_DISC_BLE_RES_EVT:
- BTIF_TRACE_DEBUG2("%s:, services 0x%x)", __FUNCTION__,
+ BTIF_TRACE_DEBUG("%s:, services 0x%x)", __FUNCTION__,
p_data->disc_ble_res.service.uu.uuid16);
bt_uuid_t uuid;
int i = 0;
int j = 15;
if (p_data->disc_ble_res.service.uu.uuid16 == UUID_SERVCLASS_LE_HID)
{
- BTIF_TRACE_DEBUG1("%s: Found HOGP UUID",__FUNCTION__);
+ BTIF_TRACE_DEBUG("%s: Found HOGP UUID",__FUNCTION__);
bt_property_t prop;
bt_bdaddr_t bd_addr;
char temp[256];
@@ -1200,7 +1427,7 @@
}
uuid_to_string(&uuid, temp);
- BTIF_TRACE_ERROR1(" uuid:%s", temp);
+ BTIF_TRACE_ERROR(" uuid:%s", temp);
bdcpy(bd_addr.address, p_data->disc_ble_res.bd_addr);
prop.type = BT_PROPERTY_UUIDS;
@@ -1240,7 +1467,7 @@
{
tBTA_DM_SEARCH *p_data = (tBTA_DM_SEARCH*)p_param;
- BTIF_TRACE_EVENT2("%s: event = %d", __FUNCTION__, event);
+ BTIF_TRACE_EVENT("%s: event = %d", __FUNCTION__, event);
switch (event)
{
case BTA_DM_DISC_RES_EVT:
@@ -1253,7 +1480,7 @@
memset(&rec, 0, sizeof(bt_service_record_t));
bdcpy(bd_addr.address, p_data->disc_res.bd_addr);
- BTIF_TRACE_DEBUG3("%s:(result=0x%x, services 0x%x)", __FUNCTION__,
+ BTIF_TRACE_DEBUG("%s:(result=0x%x, services 0x%x)", __FUNCTION__,
p_data->disc_res.result, p_data->disc_res.services);
prop.type = BT_PROPERTY_SERVICE_RECORD;
prop.val = (void*)&rec;
@@ -1296,7 +1523,7 @@
uint32_t i;
bt_bdaddr_t bd_addr;
- BTIF_TRACE_EVENT1("btif_dm_upstreams_cback ev: %s", dump_dm_event(event));
+ BTIF_TRACE_EVENT("btif_dm_upstreams_cback ev: %s", dump_dm_event(event));
switch (event)
{
@@ -1323,6 +1550,11 @@
BTA_DmSetDeviceName(btif_get_default_local_name());
}
+#if (defined(BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
+ /* Enable local privacy */
+ BTA_DmBleConfigLocalPrivacy(TRUE);
+#endif
+
/* for each of the enabled services in the mask, trigger the profile
* enable */
service_mask = btif_get_enabled_services_mask();
@@ -1426,7 +1658,7 @@
case BTA_DM_LINK_UP_EVT:
bdcpy(bd_addr.address, p_data->link_up.bd_addr);
- BTIF_TRACE_DEBUG0("BTA_DM_LINK_UP_EVT. Sending BT_ACL_STATE_CONNECTED");
+ BTIF_TRACE_DEBUG("BTA_DM_LINK_UP_EVT. Sending BT_ACL_STATE_CONNECTED");
btif_update_remote_version_property(&bd_addr);
@@ -1436,13 +1668,13 @@
case BTA_DM_LINK_DOWN_EVT:
bdcpy(bd_addr.address, p_data->link_down.bd_addr);
- BTIF_TRACE_DEBUG0("BTA_DM_LINK_DOWN_EVT. Sending BT_ACL_STATE_DISCONNECTED");
+ BTIF_TRACE_DEBUG("BTA_DM_LINK_DOWN_EVT. Sending BT_ACL_STATE_DISCONNECTED");
HAL_CBACK(bt_hal_cbacks, acl_state_changed_cb, BT_STATUS_SUCCESS,
&bd_addr, BT_ACL_STATE_DISCONNECTED);
break;
case BTA_DM_HW_ERROR_EVT:
- BTIF_TRACE_ERROR0("Received H/W Error. ");
+ BTIF_TRACE_ERROR("Received H/W Error. ");
/* Flush storage data */
btif_config_flush();
usleep(100000); /* 100milliseconds */
@@ -1452,27 +1684,27 @@
#if (defined(BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
case BTA_DM_BLE_KEY_EVT:
- BTIF_TRACE_DEBUG1("BTA_DM_BLE_KEY_EVT key_type=0x%02x ", p_data->ble_key.key_type);
+ BTIF_TRACE_DEBUG("BTA_DM_BLE_KEY_EVT key_type=0x%02x ", p_data->ble_key.key_type);
/* If this pairing is by-product of local initiated GATT client Read or Write,
BTA would not have sent BTA_DM_BLE_SEC_REQ_EVT event and Bond state would not
have setup properly. Setup pairing_cb and notify App about Bonding state now*/
if (pairing_cb.state != BT_BOND_STATE_BONDING)
{
- BTIF_TRACE_DEBUG0("Bond state not sent to App so far.Notify the app now");
+ BTIF_TRACE_DEBUG("Bond state not sent to App so far.Notify the app now");
bond_state_changed(BT_STATUS_SUCCESS, (bt_bdaddr_t*)p_data->ble_key.bd_addr,
BT_BOND_STATE_BONDING);
}
else if (memcmp (pairing_cb.bd_addr, p_data->ble_key.bd_addr, BD_ADDR_LEN)!=0)
{
- BTIF_TRACE_ERROR1("BD mismatch discard BLE key_type=%d ",p_data->ble_key.key_type);
+ BTIF_TRACE_ERROR("BD mismatch discard BLE key_type=%d ",p_data->ble_key.key_type);
break;
}
switch (p_data->ble_key.key_type)
{
case BTA_LE_KEY_PENC:
- BTIF_TRACE_DEBUG0("Rcv BTA_LE_KEY_PENC");
+ BTIF_TRACE_DEBUG("Rcv BTA_LE_KEY_PENC");
pairing_cb.ble.is_penc_key_rcvd = TRUE;
memcpy(pairing_cb.ble.penc_key.ltk,p_data->ble_key.key_value.penc_key.ltk, 16);
memcpy(pairing_cb.ble.penc_key.rand, p_data->ble_key.key_value.penc_key.rand,8);
@@ -1481,29 +1713,38 @@
for (i=0; i<16; i++)
{
- BTIF_TRACE_DEBUG2("pairing_cb.ble.penc_key.ltk[%d]=0x%02x",i,pairing_cb.ble.penc_key.ltk[i]);
+ BTIF_TRACE_DEBUG("pairing_cb.ble.penc_key.ltk[%d]=0x%02x",i,pairing_cb.ble.penc_key.ltk[i]);
}
for (i=0; i<8; i++)
{
- BTIF_TRACE_DEBUG2("pairing_cb.ble.penc_key.rand[%d]=0x%02x",i,pairing_cb.ble.penc_key.rand[i]);
+ BTIF_TRACE_DEBUG("pairing_cb.ble.penc_key.rand[%d]=0x%02x",i,pairing_cb.ble.penc_key.rand[i]);
}
- BTIF_TRACE_DEBUG1("pairing_cb.ble.penc_key.ediv=0x%04x",pairing_cb.ble.penc_key.ediv);
- BTIF_TRACE_DEBUG1("pairing_cb.ble.penc_key.sec_level=0x%02x",pairing_cb.ble.penc_key.sec_level);
- BTIF_TRACE_DEBUG1("pairing_cb.ble.penc_key.key_size=0x%02x",pairing_cb.ble.penc_key.key_size);
+ BTIF_TRACE_DEBUG("pairing_cb.ble.penc_key.ediv=0x%04x",pairing_cb.ble.penc_key.ediv);
+ BTIF_TRACE_DEBUG("pairing_cb.ble.penc_key.sec_level=0x%02x",pairing_cb.ble.penc_key.sec_level);
+ BTIF_TRACE_DEBUG("pairing_cb.ble.penc_key.key_size=0x%02x",pairing_cb.ble.penc_key.key_size);
break;
case BTA_LE_KEY_PID:
- BTIF_TRACE_DEBUG0("Rcv BTA_LE_KEY_PID");
+ BTIF_TRACE_DEBUG("Rcv BTA_LE_KEY_PID");
pairing_cb.ble.is_pid_key_rcvd = TRUE;
- memcpy(pairing_cb.ble.pid_key, p_data->ble_key.key_value.pid_key.irk, 16);
+ pairing_cb.ble.pid_key.addr_type = p_data->ble_key.key_value.pid_key.addr_type;
+ memcpy(pairing_cb.ble.pid_key.irk, p_data->ble_key.key_value.pid_key.irk, 16);
+ memcpy(pairing_cb.ble.pid_key.static_addr,
+ p_data->ble_key.key_value.pid_key.static_addr,BD_ADDR_LEN);
for (i=0; i<16; i++)
{
- BTIF_TRACE_DEBUG2("pairing_cb.ble.pid_key[%d]=0x%02x",i,pairing_cb.ble.pid_key[i]);
+ BTIF_TRACE_DEBUG("pairing_cb.ble.pid_key.irk[%d]=0x%02x"
+ ,i,pairing_cb.ble.pid_key.irk[i]);
+ }
+ for (i=0; i<BD_ADDR_LEN; i++)
+ {
+ BTIF_TRACE_DEBUG("piaring_cb.ble.pid_address[%d] = %x"
+ ,i, pairing_cb.ble.pid_key.static_addr[i]);
}
break;
case BTA_LE_KEY_PCSRK:
- BTIF_TRACE_DEBUG0("Rcv BTA_LE_KEY_PCSRK");
+ BTIF_TRACE_DEBUG("Rcv BTA_LE_KEY_PCSRK");
pairing_cb.ble.is_pcsrk_key_rcvd = TRUE;
pairing_cb.ble.pcsrk_key.counter = p_data->ble_key.key_value.pcsrk_key.counter;
pairing_cb.ble.pcsrk_key.sec_level = p_data->ble_key.key_value.pcsrk_key.sec_level;
@@ -1511,62 +1752,62 @@
for (i=0; i<16; i++)
{
- BTIF_TRACE_DEBUG2("pairing_cb.ble.pcsrk_key.csrk[%d]=0x%02x",i,pairing_cb.ble.pcsrk_key.csrk[i]);
+ BTIF_TRACE_DEBUG("pairing_cb.ble.pcsrk_key.csrk[%d]=0x%02x",i,pairing_cb.ble.pcsrk_key.csrk[i]);
}
- BTIF_TRACE_DEBUG1("pairing_cb.ble.pcsrk_key.counter=0x%08x",pairing_cb.ble.pcsrk_key.counter);
- BTIF_TRACE_DEBUG1("pairing_cb.ble.pcsrk_key.sec_level=0x%02x",pairing_cb.ble.pcsrk_key.sec_level);
+ BTIF_TRACE_DEBUG("pairing_cb.ble.pcsrk_key.counter=0x%08x",pairing_cb.ble.pcsrk_key.counter);
+ BTIF_TRACE_DEBUG("pairing_cb.ble.pcsrk_key.sec_level=0x%02x",pairing_cb.ble.pcsrk_key.sec_level);
break;
case BTA_LE_KEY_LENC:
- BTIF_TRACE_DEBUG0("Rcv BTA_LE_KEY_LENC");
+ BTIF_TRACE_DEBUG("Rcv BTA_LE_KEY_LENC");
pairing_cb.ble.is_lenc_key_rcvd = TRUE;
pairing_cb.ble.lenc_key.div = p_data->ble_key.key_value.lenc_key.div;
pairing_cb.ble.lenc_key.key_size = p_data->ble_key.key_value.lenc_key.key_size;
pairing_cb.ble.lenc_key.sec_level = p_data->ble_key.key_value.lenc_key.sec_level;
- BTIF_TRACE_DEBUG1("pairing_cb.ble.lenc_key.div=0x%04x",pairing_cb.ble.lenc_key.div);
- BTIF_TRACE_DEBUG1("pairing_cb.ble.lenc_key.key_size=0x%02x",pairing_cb.ble.lenc_key.key_size);
- BTIF_TRACE_DEBUG1("pairing_cb.ble.lenc_key.sec_level=0x%02x",pairing_cb.ble.lenc_key.sec_level);
+ BTIF_TRACE_DEBUG("pairing_cb.ble.lenc_key.div=0x%04x",pairing_cb.ble.lenc_key.div);
+ BTIF_TRACE_DEBUG("pairing_cb.ble.lenc_key.key_size=0x%02x",pairing_cb.ble.lenc_key.key_size);
+ BTIF_TRACE_DEBUG("pairing_cb.ble.lenc_key.sec_level=0x%02x",pairing_cb.ble.lenc_key.sec_level);
break;
case BTA_LE_KEY_LCSRK:
- BTIF_TRACE_DEBUG0("Rcv BTA_LE_KEY_LCSRK");
+ BTIF_TRACE_DEBUG("Rcv BTA_LE_KEY_LCSRK");
pairing_cb.ble.is_lcsrk_key_rcvd = TRUE;
pairing_cb.ble.lcsrk_key.counter = p_data->ble_key.key_value.lcsrk_key.counter;
pairing_cb.ble.lcsrk_key.div = p_data->ble_key.key_value.lcsrk_key.div;
pairing_cb.ble.lcsrk_key.sec_level = p_data->ble_key.key_value.lcsrk_key.sec_level;
- BTIF_TRACE_DEBUG1("pairing_cb.ble.lcsrk_key.div=0x%04x",pairing_cb.ble.lcsrk_key.div);
- BTIF_TRACE_DEBUG1("pairing_cb.ble.lcsrk_key.counter=0x%08x",pairing_cb.ble.lcsrk_key.counter);
- BTIF_TRACE_DEBUG1("pairing_cb.ble.lcsrk_key.sec_level=0x%02x",pairing_cb.ble.lcsrk_key.sec_level);
+ BTIF_TRACE_DEBUG("pairing_cb.ble.lcsrk_key.div=0x%04x",pairing_cb.ble.lcsrk_key.div);
+ BTIF_TRACE_DEBUG("pairing_cb.ble.lcsrk_key.counter=0x%08x",pairing_cb.ble.lcsrk_key.counter);
+ BTIF_TRACE_DEBUG("pairing_cb.ble.lcsrk_key.sec_level=0x%02x",pairing_cb.ble.lcsrk_key.sec_level);
break;
default:
- BTIF_TRACE_ERROR1("unknown BLE key type (0x%02x)", p_data->ble_key.key_type);
+ BTIF_TRACE_ERROR("unknown BLE key type (0x%02x)", p_data->ble_key.key_type);
break;
}
break;
case BTA_DM_BLE_SEC_REQ_EVT:
- BTIF_TRACE_DEBUG0("BTA_DM_BLE_SEC_REQ_EVT. ");
+ BTIF_TRACE_DEBUG("BTA_DM_BLE_SEC_REQ_EVT. ");
btif_dm_ble_sec_req_evt(&p_data->ble_req);
break;
case BTA_DM_BLE_PASSKEY_NOTIF_EVT:
- BTIF_TRACE_DEBUG0("BTA_DM_BLE_PASSKEY_NOTIF_EVT. ");
+ BTIF_TRACE_DEBUG("BTA_DM_BLE_PASSKEY_NOTIF_EVT. ");
btif_dm_ble_key_notif_evt(&p_data->key_notif);
break;
case BTA_DM_BLE_PASSKEY_REQ_EVT:
- BTIF_TRACE_DEBUG0("BTA_DM_BLE_PASSKEY_REQ_EVT. ");
+ BTIF_TRACE_DEBUG("BTA_DM_BLE_PASSKEY_REQ_EVT. ");
btif_dm_ble_passkey_req_evt(&p_data->pin_req);
break;
case BTA_DM_BLE_OOB_REQ_EVT:
- BTIF_TRACE_DEBUG0("BTA_DM_BLE_OOB_REQ_EVT. ");
+ BTIF_TRACE_DEBUG("BTA_DM_BLE_OOB_REQ_EVT. ");
break;
case BTA_DM_BLE_LOCAL_IR_EVT:
- BTIF_TRACE_DEBUG0("BTA_DM_BLE_LOCAL_IR_EVT. ");
+ BTIF_TRACE_DEBUG("BTA_DM_BLE_LOCAL_IR_EVT. ");
ble_local_key_cb.is_id_keys_rcvd = TRUE;
memcpy(&ble_local_key_cb.id_keys.irk[0], &p_data->ble_id_keys.irk[0], sizeof(BT_OCTET16));
memcpy(&ble_local_key_cb.id_keys.ir[0], &p_data->ble_id_keys.ir[0], sizeof(BT_OCTET16));
@@ -1582,7 +1823,7 @@
BT_OCTET16_LEN);
break;
case BTA_DM_BLE_LOCAL_ER_EVT:
- BTIF_TRACE_DEBUG0("BTA_DM_BLE_LOCAL_ER_EVT. ");
+ BTIF_TRACE_DEBUG("BTA_DM_BLE_LOCAL_ER_EVT. ");
ble_local_key_cb.is_er_rcvd = TRUE;
memcpy(&ble_local_key_cb.er[0], &p_data->ble_er[0], sizeof(BT_OCTET16));
btif_storage_add_ble_local_key( (char *)&ble_local_key_cb.er[0],
@@ -1591,9 +1832,55 @@
break;
case BTA_DM_BLE_AUTH_CMPL_EVT:
- BTIF_TRACE_DEBUG0("BTA_DM_BLE_KEY_EVT. ");
+ BTIF_TRACE_DEBUG("BTA_DM_BLE_KEY_EVT. ");
btif_dm_ble_auth_cmpl_evt(&p_data->auth_cmpl);
break;
+
+ case BTA_DM_LE_FEATURES_READ:
+ {
+ tBTM_BLE_VSC_CB cmn_vsc_cb;
+ bt_local_le_features_t local_le_features;
+ char buf[512];
+ bt_property_t prop;
+ prop.type = BT_PROPERTY_LOCAL_LE_FEATURES;
+ prop.val = (void*)buf;
+ prop.len = sizeof(buf);
+
+ /* LE features are not stored in storage. Should be retrived from stack */
+ BTM_BleGetVendorCapabilities(&cmn_vsc_cb);
+ local_le_features.local_privacy_enabled = BTM_BleLocalPrivacyEnabled();
+
+ prop.len = sizeof (bt_local_le_features_t);
+ if (cmn_vsc_cb.filter_support == 1)
+ local_le_features.max_adv_filter_supported = cmn_vsc_cb.max_filter;
+ else
+ local_le_features.max_adv_filter_supported = 0;
+ local_le_features.max_adv_instance = cmn_vsc_cb.adv_inst_max;
+ local_le_features.max_irk_list_size = cmn_vsc_cb.max_irk_list_sz;
+ local_le_features.rpa_offload_supported = cmn_vsc_cb.rpa_offloading;
+ local_le_features.scan_result_storage_size_hibyte =
+ (cmn_vsc_cb.tot_scan_results_strg >> 8) & (0xFF);
+ local_le_features.scan_result_storage_size_lobyte =
+ (cmn_vsc_cb.tot_scan_results_strg) & (0xFF);
+ local_le_features.activity_energy_info_supported = cmn_vsc_cb.energy_support;
+ memcpy(prop.val, &local_le_features, prop.len);
+ HAL_CBACK(bt_hal_cbacks, adapter_properties_cb, BT_STATUS_SUCCESS, 1, &prop);
+ break;
+ }
+
+ case BTA_DM_ENER_INFO_READ:
+ {
+ btif_activity_energy_info_cb_t *p_ener_data = (btif_activity_energy_info_cb_t*) p_param;
+ bt_activity_energy_info energy_info;
+ energy_info.status = p_ener_data->status;
+ energy_info.ctrl_state = p_ener_data->ctrl_state;
+ energy_info.rx_time = p_ener_data->rx_time;
+ energy_info.tx_time = p_ener_data->tx_time;
+ energy_info.idle_time = p_ener_data->idle_time;
+ energy_info.energy_used = p_ener_data->energy_used;
+ HAL_CBACK(bt_hal_cbacks, energy_info_cb, &energy_info);
+ break;
+ }
#endif
case BTA_DM_AUTHORIZE_EVT:
@@ -1603,7 +1890,7 @@
case BTA_DM_ROLE_CHG_EVT:
default:
- BTIF_TRACE_WARNING1( "btif_dm_cback : unhandled event (%d)", event );
+ BTIF_TRACE_WARNING( "btif_dm_cback : unhandled event (%d)", event );
break;
}
} /* btui_security_cback() */
@@ -1620,7 +1907,7 @@
*******************************************************************************/
static void btif_dm_generic_evt(UINT16 event, char* p_param)
{
- BTIF_TRACE_EVENT2("%s: event=%d", __FUNCTION__, event);
+ BTIF_TRACE_EVENT("%s: event=%d", __FUNCTION__, event);
switch(event)
{
case BTIF_DM_CB_DISCOVERY_STARTED:
@@ -1631,7 +1918,9 @@
case BTIF_DM_CB_CREATE_BOND:
{
- btif_dm_cb_create_bond((bt_bdaddr_t *)p_param);
+ pairing_cb.timeout_retries = NUM_TIMEOUT_RETRIES;
+ btif_dm_create_bond_cb_t *create_bond_cb = (btif_dm_create_bond_cb_t*)p_param;
+ btif_dm_cb_create_bond(&create_bond_cb->bdaddr, create_bond_cb->transport);
}
break;
@@ -1674,7 +1963,7 @@
break;
default:
{
- BTIF_TRACE_WARNING2("%s : Unknown event 0x%x", __FUNCTION__, event);
+ BTIF_TRACE_WARNING("%s : Unknown event 0x%x", __FUNCTION__, event);
}
break;
}
@@ -1733,7 +2022,7 @@
}
break;
}
- BTIF_TRACE_DEBUG3("%s event=%s param_len=%d", __FUNCTION__, dump_dm_search_event(event), param_len);
+ BTIF_TRACE_DEBUG("%s event=%s param_len=%d", __FUNCTION__, dump_dm_search_event(event), param_len);
/* if remote name is available in EIR, set teh flag so that stack doesnt trigger RNR */
if (event == BTA_DM_INQ_RES_EVT)
@@ -1789,6 +2078,62 @@
btif_transfer_context(btif_dm_remote_service_record_evt, event, (char*)p_data, sizeof(tBTA_DM_SEARCH), NULL);
}
+#if (defined(BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
+/*******************************************************************************
+**
+** Function bta_energy_info_cb
+**
+** Description Switches context from BTE to BTIF for DM energy info event
+**
+** Returns void
+**
+*******************************************************************************/
+static void bta_energy_info_cb(tBTA_DM_BLE_TX_TIME_MS tx_time, tBTA_DM_BLE_RX_TIME_MS rx_time,
+ tBTA_DM_BLE_IDLE_TIME_MS idle_time,
+ tBTA_DM_BLE_ENERGY_USED energy_used,
+ tBTA_DM_CONTRL_STATE ctrl_state, tBTA_STATUS status)
+{
+ BTIF_TRACE_DEBUG("energy_info_cb-Status:%d,state=%d,tx_t=%ld, rx_t=%ld, idle_time=%ld,used=%ld",
+ status, ctrl_state, tx_time, rx_time, idle_time, energy_used);
+
+ btif_activity_energy_info_cb_t btif_cb;
+ btif_cb.status = status;
+ btif_cb.ctrl_state = ctrl_state;
+ btif_cb.tx_time = (uint64_t) tx_time;
+ btif_cb.rx_time = (uint64_t) rx_time;
+ btif_cb.idle_time =(uint64_t) idle_time;
+ btif_cb.energy_used =(uint64_t) energy_used;
+ btif_transfer_context(btif_dm_upstreams_evt, BTA_DM_ENER_INFO_READ,
+ (char*) &btif_cb, sizeof(btif_activity_energy_info_cb_t), NULL);
+}
+#endif
+
+/*******************************************************************************
+**
+** Function bte_scan_filt_param_cfg_evt
+**
+** Description Scan filter param config event
+**
+** Returns void
+**
+*******************************************************************************/
+static void bte_scan_filt_param_cfg_evt(UINT8 action_type,
+ tBTA_DM_BLE_PF_AVBL_SPACE avbl_space,
+ tBTA_DM_BLE_REF_VALUE ref_value, tBTA_STATUS status)
+{
+ /* This event occurs on calling BTA_DmBleCfgFilterCondition internally,
+ ** and that is why there is no HAL callback
+ */
+ if(BTA_SUCCESS != status)
+ {
+ BTIF_TRACE_ERROR("%s, %d", __FUNCTION__, status);
+ }
+ else
+ {
+ BTIF_TRACE_DEBUG("%s", __FUNCTION__);
+ }
+}
+
/*****************************************************************************
**
** btif api functions (no context switch)
@@ -1808,12 +2153,29 @@
{
tBTA_DM_INQ inq_params;
tBTA_SERVICE_MASK services = 0;
+ tBTA_DM_BLE_PF_FILT_PARAMS adv_filt_param;
- BTIF_TRACE_EVENT1("%s", __FUNCTION__);
+ BTIF_TRACE_EVENT("%s", __FUNCTION__);
+
+#if (defined(BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
+ memset(&adv_filt_param, 0, sizeof(tBTA_DM_BLE_PF_FILT_PARAMS));
+ /* Cleanup anything remaining on index 0 */
+ BTA_DmBleScanFilterSetup(BTA_DM_BLE_SCAN_COND_DELETE, 0, &adv_filt_param, NULL,
+ bte_scan_filt_param_cfg_evt, 0);
+
+ /* Add an allow-all filter on index 0*/
+ adv_filt_param.dely_mode = IMMEDIATE_DELY_MODE;
+ adv_filt_param.feat_seln = ALLOW_ALL_FILTER;
+ adv_filt_param.filt_logic_type = BTA_DM_BLE_PF_FILT_LOGIC_OR;
+ adv_filt_param.list_logic_type = BTA_DM_BLE_PF_LIST_LOGIC_OR;
+ adv_filt_param.rssi_low_thres = LOWEST_RSSI_VALUE;
+ adv_filt_param.rssi_high_thres = LOWEST_RSSI_VALUE;
+ BTA_DmBleScanFilterSetup(BTA_DM_BLE_SCAN_COND_ADD, 0, &adv_filt_param, NULL,
+ bte_scan_filt_param_cfg_evt, 0);
+
/* TODO: Do we need to handle multiple inquiries at the same time? */
/* Set inquiry params and call API */
-#if (defined(BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
inq_params.mode = BTA_DM_GENERAL_INQUIRY|BTA_BLE_GENERAL_INQUIRY;
#if (defined(BTA_HOST_INTERLEAVE_SEARCH) && BTA_HOST_INTERLEAVE_SEARCH == TRUE)
inq_params.intl_duration[0]= BTIF_DM_INTERLEAVE_DURATION_BR_ONE;
@@ -1851,7 +2213,7 @@
*******************************************************************************/
bt_status_t btif_dm_cancel_discovery(void)
{
- BTIF_TRACE_EVENT1("%s", __FUNCTION__);
+ BTIF_TRACE_EVENT("%s", __FUNCTION__);
BTA_DmSearchCancel();
return BT_STATUS_SUCCESS;
}
@@ -1865,16 +2227,20 @@
** Returns bt_status_t
**
*******************************************************************************/
-bt_status_t btif_dm_create_bond(const bt_bdaddr_t *bd_addr)
+bt_status_t btif_dm_create_bond(const bt_bdaddr_t *bd_addr, int transport)
{
- bdstr_t bdstr;
+ btif_dm_create_bond_cb_t create_bond_cb;
+ create_bond_cb.transport = transport;
+ bdcpy(create_bond_cb.bdaddr.address, bd_addr->address);
- BTIF_TRACE_EVENT2("%s: bd_addr=%s", __FUNCTION__, bd2str((bt_bdaddr_t *) bd_addr, &bdstr));
+ bdstr_t bdstr;
+ BTIF_TRACE_EVENT("%s: bd_addr=%s, transport=%d", __FUNCTION__,
+ bd2str((bt_bdaddr_t *) bd_addr, &bdstr), transport);
if (pairing_cb.state != BT_BOND_STATE_NONE)
return BT_STATUS_BUSY;
btif_transfer_context(btif_dm_generic_evt, BTIF_DM_CB_CREATE_BOND,
- (char *)bd_addr, sizeof(bt_bdaddr_t), NULL);
+ (char *)&create_bond_cb, sizeof(btif_dm_create_bond_cb_t), NULL);
return BT_STATUS_SUCCESS;
}
@@ -1893,7 +2259,7 @@
{
bdstr_t bdstr;
- BTIF_TRACE_EVENT2("%s: bd_addr=%s", __FUNCTION__, bd2str((bt_bdaddr_t *)bd_addr, &bdstr));
+ BTIF_TRACE_EVENT("%s: bd_addr=%s", __FUNCTION__, bd2str((bt_bdaddr_t *)bd_addr, &bdstr));
/* TODO:
** 1. Restore scan modes
@@ -1911,7 +2277,11 @@
BTA_DmBleSecurityGrant((UINT8 *)bd_addr->address,BTA_DM_SEC_PAIR_NOT_SPT);
}
else
+ {
BTA_DmConfirm( (UINT8 *)bd_addr->address, FALSE);
+ BTA_DmBondCancel ((UINT8 *)bd_addr->address);
+ btif_storage_remove_bonded_device((bt_bdaddr_t *)bd_addr);
+ }
}
else
{
@@ -1978,7 +2348,7 @@
{
bdstr_t bdstr;
- BTIF_TRACE_EVENT2("%s: bd_addr=%s", __FUNCTION__, bd2str((bt_bdaddr_t *)bd_addr, &bdstr));
+ BTIF_TRACE_EVENT("%s: bd_addr=%s", __FUNCTION__, bd2str((bt_bdaddr_t *)bd_addr, &bdstr));
btif_transfer_context(btif_dm_generic_evt, BTIF_DM_CB_REMOVE_BOND,
(char *)bd_addr, sizeof(bt_bdaddr_t), NULL);
@@ -1998,7 +2368,9 @@
bt_status_t btif_dm_pin_reply( const bt_bdaddr_t *bd_addr, uint8_t accept,
uint8_t pin_len, bt_pin_code_t *pin_code)
{
- BTIF_TRACE_EVENT2("%s: accept=%d", __FUNCTION__, accept);
+ BTIF_TRACE_EVENT("%s: accept=%d", __FUNCTION__, accept);
+ if (pin_code == NULL)
+ return BT_STATUS_FAIL;
#if (defined(BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
if (pairing_cb.is_le_only)
@@ -2012,7 +2384,7 @@
{
passkey += (multi[i] * (pin_code->pin[i] - '0'));
}
- BTIF_TRACE_DEBUG1("btif_dm_pin_reply: passkey: %d", passkey);
+ BTIF_TRACE_DEBUG("btif_dm_pin_reply: passkey: %d", passkey);
BTA_DmBlePasskeyReply(remote_bd_addr, accept, passkey);
}
@@ -2051,11 +2423,11 @@
/* This is not implemented in the stack.
* For devices with display, this is not needed
*/
- BTIF_TRACE_WARNING1("%s: Not implemented", __FUNCTION__);
+ BTIF_TRACE_WARNING("%s: Not implemented", __FUNCTION__);
return BT_STATUS_FAIL;
}
/* BT_SSP_VARIANT_CONSENT & BT_SSP_VARIANT_PASSKEY_CONFIRMATION supported */
- BTIF_TRACE_EVENT2("%s: accept=%d", __FUNCTION__, accept);
+ BTIF_TRACE_EVENT("%s: accept=%d", __FUNCTION__, accept);
#if (defined(BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
if (pairing_cb.is_le_only)
{
@@ -2086,7 +2458,7 @@
{
bt_status_t status;
- BTIF_TRACE_EVENT2("%s: type=0x%x", __FUNCTION__, prop->type);
+ BTIF_TRACE_EVENT("%s: type=0x%x", __FUNCTION__, prop->type);
switch (prop->type)
{
case BT_PROPERTY_BDNAME:
@@ -2134,7 +2506,7 @@
{
bdstr_t bdstr;
- BTIF_TRACE_EVENT2("%s: remote_addr=%s", __FUNCTION__, bd2str(remote_addr, &bdstr));
+ BTIF_TRACE_EVENT("%s: remote_addr=%s", __FUNCTION__, bd2str(remote_addr, &bdstr));
BTA_DmDiscover(remote_addr->address, BTA_ALL_SERVICE_MASK,
bte_dm_search_services_evt, TRUE);
@@ -2157,7 +2529,7 @@
tSDP_UUID sdp_uuid;
bdstr_t bdstr;
- BTIF_TRACE_EVENT2("%s: remote_addr=%s", __FUNCTION__, bd2str(remote_addr, &bdstr));
+ BTIF_TRACE_EVENT("%s: remote_addr=%s", __FUNCTION__, bd2str(remote_addr, &bdstr));
sdp_uuid.len = MAX_UUID_SIZE;
memcpy(sdp_uuid.uu.uuid128, uuid->uu, MAX_UUID_SIZE);
@@ -2192,6 +2564,63 @@
return;
}
+void btif_dm_proc_io_req(BD_ADDR bd_addr, tBTA_IO_CAP *p_io_cap, tBTA_OOB_DATA *p_oob_data,
+ tBTA_AUTH_REQ *p_auth_req, BOOLEAN is_orig)
+{
+ UINT8 yes_no_bit = BTA_AUTH_SP_YES & *p_auth_req;
+ /* if local initiated:
+ ** 1. set DD + MITM
+ ** if remote initiated:
+ ** 1. Copy over the auth_req from peer's io_rsp
+ ** 2. Set the MITM if peer has it set or if peer has DisplayYesNo (iPhone)
+ ** as a fallback set MITM+GB if peer had MITM set
+ */
+ UNUSED (bd_addr);
+ UNUSED (p_io_cap);
+ UNUSED (p_oob_data);
+
+
+ BTIF_TRACE_DEBUG("+%s: p_auth_req=%d", __FUNCTION__, *p_auth_req);
+ if(pairing_cb.is_local_initiated)
+ {
+ /* if initing/responding to a dedicated bonding, use dedicate bonding bit */
+ *p_auth_req = BTA_AUTH_DD_BOND | BTA_AUTH_SP_YES;
+ }
+ else if (!is_orig)
+ {
+ /* peer initiated paring. They probably know what they want.
+ ** Copy the mitm from peer device.
+ */
+ BTIF_TRACE_DEBUG("%s: setting p_auth_req to peer's: %d",
+ __FUNCTION__, pairing_cb.auth_req);
+ *p_auth_req = (pairing_cb.auth_req & BTA_AUTH_BONDS);
+
+ /* copy over the MITM bit as well. In addition if the peer has DisplayYesNo, force MITM */
+ if ((yes_no_bit) || (pairing_cb.io_cap & BTM_IO_CAP_IO) )
+ *p_auth_req |= BTA_AUTH_SP_YES;
+ }
+ else if (yes_no_bit)
+ {
+ /* set the general bonding bit for stored device */
+ *p_auth_req = BTA_AUTH_GEN_BOND | yes_no_bit;
+ }
+ BTIF_TRACE_DEBUG("-%s: p_auth_req=%d", __FUNCTION__, *p_auth_req);
+}
+
+void btif_dm_proc_io_rsp(BD_ADDR bd_addr, tBTA_IO_CAP io_cap,
+ tBTA_OOB_DATA oob_data, tBTA_AUTH_REQ auth_req)
+{
+ UNUSED (bd_addr);
+ UNUSED (oob_data);
+
+ if(auth_req & BTA_AUTH_BONDS)
+ {
+ BTIF_TRACE_DEBUG("%s auth_req:%d", __FUNCTION__, auth_req);
+ pairing_cb.auth_req = auth_req;
+ pairing_cb.io_cap = io_cap;
+ }
+}
+
#if (BTM_OOB_INCLUDED == TRUE)
void btif_dm_set_oob_for_io_req(tBTA_OOB_DATA *p_oob_data)
{
@@ -2204,7 +2633,7 @@
{
*p_oob_data = TRUE;
}
- BTIF_TRACE_DEBUG1("btif_dm_set_oob_for_io_req *p_oob_data=%d", *p_oob_data);
+ BTIF_TRACE_DEBUG("btif_dm_set_oob_for_io_req *p_oob_data=%d", *p_oob_data);
}
#endif /* BTM_OOB_INCLUDED */
@@ -2213,18 +2642,18 @@
{
char prop_oob[PROPERTY_VALUE_MAX];
property_get("service.brcm.bt.oob", prop_oob, "3");
- BTIF_TRACE_DEBUG1("btif_dm_load_local_oob prop_oob = %s",prop_oob);
+ BTIF_TRACE_DEBUG("btif_dm_load_local_oob prop_oob = %s",prop_oob);
if (prop_oob[0] != '3')
{
#if (BTM_OOB_INCLUDED == TRUE)
if (oob_cb.sp_c[0] == 0 && oob_cb.sp_c[1] == 0 &&
oob_cb.sp_c[2] == 0 && oob_cb.sp_c[3] == 0 )
{
- BTIF_TRACE_DEBUG0("btif_dm_load_local_oob: read OOB, call BTA_DmLocalOob()");
+ BTIF_TRACE_DEBUG("btif_dm_load_local_oob: read OOB, call BTA_DmLocalOob()");
BTA_DmLocalOob();
}
#else
- BTIF_TRACE_ERROR0("BTM_OOB_INCLUDED is FALSE!!(btif_dm_load_local_oob)");
+ BTIF_TRACE_ERROR("BTM_OOB_INCLUDED is FALSE!!(btif_dm_load_local_oob)");
#endif
}
}
@@ -2236,16 +2665,16 @@
char *path_b = "/data/misc/bluedroid/LOCAL/b.key";
char *path = NULL;
char prop_oob[PROPERTY_VALUE_MAX];
- BTIF_TRACE_DEBUG1("btif_dm_proc_loc_oob: valid=%d", valid);
+ BTIF_TRACE_DEBUG("btif_dm_proc_loc_oob: valid=%d", valid);
if (oob_cb.sp_c[0] == 0 && oob_cb.sp_c[1] == 0 &&
oob_cb.sp_c[2] == 0 && oob_cb.sp_c[3] == 0 &&
valid)
{
- BTIF_TRACE_DEBUG0("save local OOB data in memory");
+ BTIF_TRACE_DEBUG("save local OOB data in memory");
memcpy(oob_cb.sp_c, c, BT_OCTET16_LEN);
memcpy(oob_cb.sp_r, r, BT_OCTET16_LEN);
property_get("service.brcm.bt.oob", prop_oob, "3");
- BTIF_TRACE_DEBUG1("btif_dm_proc_loc_oob prop_oob = %s",prop_oob);
+ BTIF_TRACE_DEBUG("btif_dm_proc_loc_oob prop_oob = %s",prop_oob);
if (prop_oob[0] == '1')
path = path_a;
else if (prop_oob[0] == '2')
@@ -2255,11 +2684,11 @@
fp = fopen(path, "wb+");
if (fp == NULL)
{
- BTIF_TRACE_DEBUG1("btif_dm_proc_loc_oob: failed to save local OOB data to %s", path);
+ BTIF_TRACE_DEBUG("btif_dm_proc_loc_oob: failed to save local OOB data to %s", path);
}
else
{
- BTIF_TRACE_DEBUG1("btif_dm_proc_loc_oob: save local OOB data into file %s",path);
+ BTIF_TRACE_DEBUG("btif_dm_proc_loc_oob: save local OOB data into file %s",path);
fwrite (c , 1 , BT_OCTET16_LEN , fp );
fwrite (r , 1 , BT_OCTET16_LEN , fp );
fclose(fp);
@@ -2279,7 +2708,7 @@
bt_bdaddr_t bt_bd_addr;
bdcpy(oob_cb.oob_bdaddr, bd_addr);
property_get("service.brcm.bt.oob", prop_oob, "3");
- BTIF_TRACE_DEBUG1("btif_dm_proc_rmt_oob prop_oob = %s",prop_oob);
+ BTIF_TRACE_DEBUG("btif_dm_proc_rmt_oob prop_oob = %s",prop_oob);
if (prop_oob[0] == '1')
path = path_b;
else if (prop_oob[0] == '2')
@@ -2289,35 +2718,35 @@
fp = fopen(path, "rb");
if (fp == NULL)
{
- BTIF_TRACE_DEBUG1("btapp_dm_rmt_oob_reply: failed to read OOB keys from %s",path);
+ BTIF_TRACE_DEBUG("btapp_dm_rmt_oob_reply: failed to read OOB keys from %s",path);
return FALSE;
}
else
{
- BTIF_TRACE_DEBUG1("btif_dm_proc_rmt_oob: read OOB data from %s",path);
+ BTIF_TRACE_DEBUG("btif_dm_proc_rmt_oob: read OOB data from %s",path);
fread (p_c , 1 , BT_OCTET16_LEN , fp );
fread (p_r , 1 , BT_OCTET16_LEN , fp );
fclose(fp);
}
- BTIF_TRACE_DEBUG0("----btif_dm_proc_rmt_oob: TRUE");
+ BTIF_TRACE_DEBUG("----btif_dm_proc_rmt_oob: TRUE");
sprintf(t, "%02x:%02x:%02x:%02x:%02x:%02x",
oob_cb.oob_bdaddr[0], oob_cb.oob_bdaddr[1], oob_cb.oob_bdaddr[2],
oob_cb.oob_bdaddr[3], oob_cb.oob_bdaddr[4], oob_cb.oob_bdaddr[5]);
- BTIF_TRACE_DEBUG1("----btif_dm_proc_rmt_oob: peer_bdaddr = %s", t);
+ BTIF_TRACE_DEBUG("----btif_dm_proc_rmt_oob: peer_bdaddr = %s", t);
sprintf(t, "%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x",
p_c[0], p_c[1], p_c[2], p_c[3], p_c[4], p_c[5], p_c[6], p_c[7],
p_c[8], p_c[9], p_c[10], p_c[11], p_c[12], p_c[13], p_c[14], p_c[15]);
- BTIF_TRACE_DEBUG1("----btif_dm_proc_rmt_oob: c = %s",t);
+ BTIF_TRACE_DEBUG("----btif_dm_proc_rmt_oob: c = %s",t);
sprintf(t, "%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x",
p_r[0], p_r[1], p_r[2], p_r[3], p_r[4], p_r[5], p_r[6], p_r[7],
p_r[8], p_r[9], p_r[10], p_r[11], p_r[12], p_r[13], p_r[14], p_r[15]);
- BTIF_TRACE_DEBUG1("----btif_dm_proc_rmt_oob: r = %s",t);
+ BTIF_TRACE_DEBUG("----btif_dm_proc_rmt_oob: r = %s",t);
bdcpy(bt_bd_addr.address, bd_addr);
btif_transfer_context(btif_dm_generic_evt, BTIF_DM_CB_BOND_STATE_BONDING,
(char *)&bt_bd_addr, sizeof(bt_bdaddr_t), NULL);
result = TRUE;
}
- BTIF_TRACE_DEBUG1("btif_dm_proc_rmt_oob result=%d",result);
+ BTIF_TRACE_DEBUG("btif_dm_proc_rmt_oob result=%d",result);
return result;
}
#endif /* BTIF_DM_OOB_TEST */
@@ -2329,7 +2758,7 @@
bt_bdname_t bd_name;
UINT32 cod;
- BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s", __FUNCTION__);
/* Remote name update */
btif_update_remote_properties(p_ssp_key_notif->bd_addr , p_ssp_key_notif->bd_name,
@@ -2381,6 +2810,14 @@
/*Map the HCI fail reason to bt status */
switch (p_auth_cmpl->fail_reason)
{
+ case BTA_DM_AUTH_SMP_PAIR_AUTH_FAIL:
+ case BTA_DM_AUTH_SMP_CONFIRM_VALUE_FAIL:
+ btif_dm_remove_ble_bonding_keys();
+ status = BT_STATUS_AUTH_FAILURE;
+ break;
+ case BTA_DM_AUTH_SMP_PAIR_NOT_SUPPORT:
+ status = BT_STATUS_AUTH_REJECTED;
+ break;
default:
btif_dm_remove_ble_bonding_keys();
status = BT_STATUS_FAIL;
@@ -2402,7 +2839,7 @@
BT_OCTET16_LEN)== BT_STATUS_SUCCESS)
{
ble_local_key_cb.is_er_rcvd = TRUE;
- BTIF_TRACE_DEBUG1("%s BLE ER key loaded",__FUNCTION__ );
+ BTIF_TRACE_DEBUG("%s BLE ER key loaded",__FUNCTION__ );
}
if ((btif_storage_get_ble_local_key(BTIF_DM_LE_LOCAL_KEY_IR,(char*)&ble_local_key_cb.id_keys.ir[0],
@@ -2413,7 +2850,7 @@
BT_OCTET16_LEN)== BT_STATUS_SUCCESS))
{
ble_local_key_cb.is_id_keys_rcvd = TRUE;
- BTIF_TRACE_DEBUG1("%s BLE ID keys loaded",__FUNCTION__ );
+ BTIF_TRACE_DEBUG("%s BLE ID keys loaded",__FUNCTION__ );
}
}
@@ -2433,7 +2870,7 @@
memcpy(&p_id_keys->dhk[0], &ble_local_key_cb.id_keys.dhk[0], sizeof(BT_OCTET16));
*p_key_mask |= BTA_BLE_LOCAL_KEY_TYPE_ID;
}
- BTIF_TRACE_DEBUG2("%s *p_key_mask=0x%02x",__FUNCTION__, *p_key_mask);
+ BTIF_TRACE_DEBUG("%s *p_key_mask=0x%02x",__FUNCTION__, *p_key_mask);
}
void btif_dm_save_ble_bonding_keys(void)
@@ -2441,7 +2878,7 @@
bt_bdaddr_t bd_addr;
- BTIF_TRACE_DEBUG1("%s",__FUNCTION__ );
+ BTIF_TRACE_DEBUG("%s",__FUNCTION__ );
bdcpy(bd_addr.address, pairing_cb.bd_addr);
@@ -2456,9 +2893,9 @@
if (pairing_cb.ble.is_pid_key_rcvd)
{
btif_storage_add_ble_bonding_key(&bd_addr,
- (char *) &pairing_cb.ble.pid_key[0],
+ (char *) &pairing_cb.ble.pid_key,
BTIF_DM_LE_KEY_PID,
- BT_OCTET16_LEN);
+ sizeof(btif_dm_ble_pid_keys_t));
}
@@ -2494,7 +2931,7 @@
{
bt_bdaddr_t bd_addr;
- BTIF_TRACE_DEBUG1("%s",__FUNCTION__ );
+ BTIF_TRACE_DEBUG("%s",__FUNCTION__ );
bdcpy(bd_addr.address, pairing_cb.bd_addr);
btif_storage_remove_ble_bonding_keys(&bd_addr);
@@ -2515,11 +2952,11 @@
bt_bdaddr_t bd_addr;
bt_bdname_t bd_name;
UINT32 cod;
- BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s", __FUNCTION__);
if (pairing_cb.state == BT_BOND_STATE_BONDING)
{
- BTIF_TRACE_DEBUG1("%s Discard security request", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s Discard security request", __FUNCTION__);
return;
}
@@ -2621,7 +3058,7 @@
BTM_BleTestEnd((tBTM_CMPL_CB*) btif_dm_ble_test_end_cback);
break;
default:
- BTIF_TRACE_ERROR2("%s: Unknown LE Test Mode Command 0x%x", __FUNCTION__, opcode);
+ BTIF_TRACE_ERROR("%s: Unknown LE Test Mode Command 0x%x", __FUNCTION__, opcode);
return BT_STATUS_UNSUPPORTED;
}
return BT_STATUS_SUCCESS;
@@ -2636,12 +3073,28 @@
{
bt_bdaddr_t bd_addr;
- BTIF_TRACE_DEBUG1("%s: Cancel pending pairing request", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s: Cancel pending pairing request", __FUNCTION__);
bdcpy(bd_addr.address, pairing_cb.bd_addr);
btif_dm_cancel_bond(&bd_addr);
}
}
+/*******************************************************************************
+**
+** Function btif_dm_read_energy_info
+**
+** Description Reads the energy info from controller
+**
+** Returns void
+**
+*******************************************************************************/
+void btif_dm_read_energy_info()
+{
+#if (defined(BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
+ BTA_DmBleGetEnergyInfo(bta_energy_info_cb);
+#endif
+}
+
static char* btif_get_default_local_name() {
if (btif_default_local_name[0] == '\0')
{
diff --git a/btif/src/btif_gatt_client.c b/btif/src/btif_gatt_client.c
index c788bd8..abe35c1 100644
--- a/btif/src/btif_gatt_client.c
+++ b/btif/src/btif_gatt_client.c
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 2009-2013 Broadcom Corporation
+ * Copyright (C) 2009-2014 Broadcom Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -38,7 +38,7 @@
#if (defined(BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
-#include "gki.h"
+#include "btif_gatt_multi_adv_util.h"
#include <hardware/bt_gatt.h>
#include "bta_api.h"
#include "bta_gatt_api.h"
@@ -51,20 +51,23 @@
#include "btif_dm.h"
#include "btif_storage.h"
+#include "vendor_api.h"
+
/*******************************************************************************
** Constants & Macros
********************************************************************************/
-#define ADV_FLAGS 0x02
-
#define CHECK_BTGATT_INIT() if (bt_gatt_callbacks == NULL)\
{\
- ALOGW("%s: BTGATT not initialized", __FUNCTION__);\
+ BTIF_TRACE_WARNING("%s: BTGATT not initialized", __FUNCTION__);\
return BT_STATUS_NOT_READY;\
} else {\
- ALOGD("%s", __FUNCTION__);\
+ BTIF_TRACE_DEBUG("%s", __FUNCTION__);\
}
+#define BLE_RESOLVE_ADDR_MSB 0x40 /* bit7, bit6 is 01 to be resolvable random */
+#define BLE_RESOLVE_ADDR_MASK 0xc0 /* bit 6, and bit7 */
+#define BTM_BLE_IS_RESOLVE_BDA(x) ((x[0] & BLE_RESOLVE_ADDR_MASK) == BLE_RESOLVE_ADDR_MSB)
typedef enum {
BTIF_GATTC_REGISTER_APP = 1000,
@@ -92,35 +95,104 @@
BTIF_GATTC_LISTEN,
BTIF_GATTC_SET_ADV_DATA,
BTIF_GATTC_CONFIGURE_MTU,
+ BTIF_GATTC_CONN_PARAM_UPDT,
+ BTIF_GATTC_SCAN_FILTER_PARAM_SETUP,
+ BTIF_GATTC_SCAN_FILTER_CONFIG,
+ BTIF_GATTC_SCAN_FILTER_CLEAR,
+ BTIF_GATTC_SCAN_FILTER_ENABLE,
+ BTIF_GATTC_SET_SCAN_PARAMS,
+ BTIF_GATTC_ADV_INSTANCE_ENABLE,
+ BTIF_GATTC_ADV_INSTANCE_UPDATE,
+ BTIF_GATTC_ADV_INSTANCE_SET_DATA,
+ BTIF_GATTC_ADV_INSTANCE_DISABLE,
+ BTIF_GATTC_CONFIG_STORAGE_PARAMS,
+ BTIF_GATTC_ENABLE_BATCH_SCAN,
+ BTIF_GATTC_READ_BATCH_SCAN_REPORTS,
+ BTIF_GATTC_DISABLE_BATCH_SCAN
} btif_gattc_event_t;
#define BTIF_GATT_MAX_OBSERVED_DEV 40
#define BTIF_GATT_OBSERVE_EVT 0x1000
#define BTIF_GATTC_RSSI_EVT 0x1001
+#define BTIF_GATTC_SCAN_FILTER_EVT 0x1003
+
+#define ENABLE_BATCH_SCAN 1
+#define DISABLE_BATCH_SCAN 0
/*******************************************************************************
** Local type definitions
********************************************************************************/
+typedef struct
+{
+ uint8_t report_format;
+ uint16_t data_len;
+ uint8_t num_records;
+ uint8_t *p_rep_data;
+} btgatt_batch_reports;
typedef struct
{
- tBTA_BLE_AD_MASK mask;
- tBTA_BLE_ADV_DATA data;
-} btgatt_adv_data;
+ uint8_t status;
+ uint8_t client_if;
+ uint8_t filt_index;
+ uint8_t adv_state;
+ uint8_t action;
+ uint8_t avbl_space;
+ uint8_t lost_timeout;
+ bt_bdaddr_t bd_addr;
+ uint8_t batch_scan_full_max;
+ uint8_t batch_scan_trunc_max;
+ uint8_t batch_scan_notify_threshold;
+ tBTA_BLE_SCAN_MODE scan_mode;
+ uint32_t scan_interval;
+ uint32_t scan_window;
+ tBTA_BLE_DISCARD_RULE discard_rule;
+ tBLE_ADDR_TYPE addr_type;
+ btgatt_batch_reports read_reports;
+} btgatt_batch_track_cb_t;
+
+typedef tBTA_DM_BLE_PF_FILT_PARAMS btgatt_adv_filt_param_t;
+
+typedef struct
+{
+ uint8_t client_if;
+ uint8_t action;
+ tBTA_DM_BLE_PF_COND_TYPE filt_type;
+ bt_bdaddr_t bd_addr;
+ uint8_t value[BTGATT_MAX_ATTR_LEN];
+ uint8_t value_len;
+ uint8_t filt_index;
+ uint16_t conn_id;
+ uint16_t company_id_mask;
+ bt_uuid_t uuid;
+ bt_uuid_t uuid_mask;
+ uint8_t value_mask[BTGATT_MAX_ATTR_LEN];
+ uint8_t value_mask_len;
+ uint8_t has_mask;
+ uint8_t addr_type;
+ uint8_t status;
+ tBTA_DM_BLE_PF_AVBL_SPACE avbl_space;
+ tBTA_DM_BLE_SCAN_COND_OP cond_op;
+ btgatt_adv_filt_param_t adv_filt_param;
+} btgatt_adv_filter_cb_t;
typedef struct
{
uint8_t value[BTGATT_MAX_ATTR_LEN];
- btgatt_adv_data adv_data;
+ uint8_t inst_id;
bt_bdaddr_t bd_addr;
btgatt_srvc_id_t srvc_id;
btgatt_srvc_id_t incl_srvc_id;
btgatt_gatt_id_t char_id;
btgatt_gatt_id_t descr_id;
bt_uuid_t uuid;
+ bt_uuid_t uuid_mask;
uint16_t conn_id;
uint16_t len;
+ uint16_t mask;
+ uint16_t scan_interval;
+ uint16_t scan_window;
uint8_t client_if;
uint8_t action;
uint8_t is_direct;
@@ -130,21 +202,33 @@
uint8_t status;
uint8_t addr_type;
uint8_t start;
+ uint8_t has_mask;
int8_t rssi;
+ uint8_t flag;
tBT_DEVICE_TYPE device_type;
+ btgatt_transport_t transport;
} __attribute__((packed)) btif_gattc_cb_t;
typedef struct
{
bt_bdaddr_t bd_addr;
+ uint16_t min_interval;
+ uint16_t max_interval;
+ uint16_t timeout;
+ uint16_t latency;
+} btif_conn_param_cb_t;
+
+typedef struct
+{
+ bt_bdaddr_t bd_addr;
BOOLEAN in_use;
}__attribute__((packed)) btif_gattc_dev_t;
typedef struct
{
btif_gattc_dev_t remote_dev[BTIF_GATT_MAX_OBSERVED_DEV];
- uint8_t addr_type;
- uint8_t next_storage_idx;
+ uint8_t addr_type;
+ uint8_t next_storage_idx;
}__attribute__((packed)) btif_gattc_dev_cb_t;
/*******************************************************************************
@@ -160,10 +244,17 @@
** Static functions
********************************************************************************/
+static bt_status_t btif_gattc_multi_adv_disable(int client_if);
+static void btif_multi_adv_stop_cb(void *p_tle)
+{
+ int client_if = ((TIMER_LIST_ENT*)p_tle)->data;
+ btif_gattc_multi_adv_disable(client_if); // Does context switch
+}
+
static void btapp_gattc_req_data(UINT16 event, char *p_dest, char *p_src)
{
- tBTA_GATTC *p_dest_data = (tBTA_GATTC*)p_dest;
- tBTA_GATTC *p_src_data = (tBTA_GATTC*)p_src;
+ tBTA_GATTC *p_dest_data = (tBTA_GATTC*) p_dest;
+ tBTA_GATTC *p_src_data = (tBTA_GATTC*) p_src;
if (!p_src_data || !p_dest_data)
return;
@@ -204,7 +295,7 @@
}
else
{
- BTIF_TRACE_WARNING2("%s :Src read.p_value ptr is NULL for event 0x%x",
+ BTIF_TRACE_WARNING("%s :Src read.p_value ptr is NULL for event 0x%x",
__FUNCTION__, event);
p_dest_data->read.p_value = NULL;
@@ -255,7 +346,7 @@
memcpy(p_dev_cb->remote_dev[i].bd_addr.address, p_bda, BD_ADDR_LEN);
p_dev_cb->addr_type = addr_type;
p_dev_cb->remote_dev[i].in_use = TRUE;
- ALOGD("%s device added idx=%d", __FUNCTION__, i );
+ BTIF_TRACE_DEBUG("%s device added idx=%d", __FUNCTION__, i );
break;
}
}
@@ -266,9 +357,9 @@
memcpy(p_dev_cb->remote_dev[i].bd_addr.address, p_bda, BD_ADDR_LEN);
p_dev_cb->addr_type = addr_type;
p_dev_cb->remote_dev[i].in_use = TRUE;
- ALOGD("%s device overwrite idx=%d", __FUNCTION__, i );
+ BTIF_TRACE_DEBUG("%s device overwrite idx=%d", __FUNCTION__, i );
p_dev_cb->next_storage_idx++;
- if(p_dev_cb->next_storage_idx >= BTIF_GATT_MAX_OBSERVED_DEV)
+ if (p_dev_cb->next_storage_idx >= BTIF_GATT_MAX_OBSERVED_DEV)
p_dev_cb->next_storage_idx = 0;
}
}
@@ -296,18 +387,18 @@
p_eir_remote_name = BTA_CheckEirData(p_btif_cb->value,
BTM_EIR_COMPLETE_LOCAL_NAME_TYPE, &remote_name_len);
- if(p_eir_remote_name == NULL)
+ if (p_eir_remote_name == NULL)
{
p_eir_remote_name = BTA_CheckEirData(p_btif_cb->value,
BT_EIR_SHORTENED_LOCAL_NAME_TYPE, &remote_name_len);
}
- if(p_eir_remote_name)
+ if (p_eir_remote_name)
{
- memcpy(bdname.name, p_eir_remote_name, remote_name_len);
- bdname.name[remote_name_len]='\0';
+ memcpy(bdname.name, p_eir_remote_name, remote_name_len);
+ bdname.name[remote_name_len]='\0';
- ALOGD("%s BLE device name=%s len=%d dev_type=%d", __FUNCTION__, bdname.name,
+ BTIF_TRACE_DEBUG("%s BLE device name=%s len=%d dev_type=%d", __FUNCTION__, bdname.name,
remote_name_len, p_btif_cb->device_type );
btif_dm_update_ble_remote_properties( p_btif_cb->bd_addr.address, bdname.name,
p_btif_cb->device_type);
@@ -318,9 +409,9 @@
static void btif_gattc_upstreams_evt(uint16_t event, char* p_param)
{
- ALOGD("%s: Event %d", __FUNCTION__, event);
+ BTIF_TRACE_EVENT("%s: Event %d", __FUNCTION__, event);
- tBTA_GATTC *p_data = (tBTA_GATTC*)p_param;
+ tBTA_GATTC *p_data = (tBTA_GATTC*) p_param;
switch (event)
{
case BTA_GATTC_REG_EVT:
@@ -460,7 +551,7 @@
}
case BTA_GATTC_ACL_EVT:
- ALOGD("BTA_GATTC_ACL_EVT: status = %d", p_data->status);
+ BTIF_TRACE_EVENT("BTA_GATTC_ACL_EVT: status = %d", p_data->status);
/* Ignore for now */
break;
@@ -469,14 +560,16 @@
case BTIF_GATT_OBSERVE_EVT:
{
- btif_gattc_cb_t *p_btif_cb = (btif_gattc_cb_t*)p_param;
+ btif_gattc_cb_t *p_btif_cb = (btif_gattc_cb_t*) p_param;
uint8_t remote_name_len;
uint8_t *p_eir_remote_name=NULL;
+ bt_device_type_t dev_type;
+ bt_property_t properties;
p_eir_remote_name = BTA_CheckEirData(p_btif_cb->value,
BTM_EIR_COMPLETE_LOCAL_NAME_TYPE, &remote_name_len);
- if(p_eir_remote_name == NULL)
+ if (p_eir_remote_name == NULL)
{
p_eir_remote_name = BTA_CheckEirData(p_btif_cb->value,
BT_EIR_SHORTENED_LOCAL_NAME_TYPE, &remote_name_len);
@@ -496,6 +589,19 @@
}
}
+
+ if (( p_btif_cb->device_type == BT_DEVICE_TYPE_DUMO)&&
+ (p_btif_cb->flag & BTA_BLE_DMT_CONTROLLER_SPT) &&
+ (p_btif_cb->flag & BTA_BLE_DMT_HOST_SPT))
+ {
+ btif_storage_set_dmt_support_type (&(p_btif_cb->bd_addr), TRUE);
+ }
+
+ dev_type = p_btif_cb->device_type;
+ BTIF_STORAGE_FILL_PROPERTY(&properties,
+ BT_PROPERTY_TYPE_OF_DEVICE, sizeof(dev_type), &dev_type);
+ btif_storage_set_remote_device_property(&(p_btif_cb->bd_addr), &properties);
+
HAL_CBACK(bt_gatt_callbacks, client->scan_result_cb,
&p_btif_cb->bd_addr, p_btif_cb->rssi, p_btif_cb->value);
break;
@@ -503,7 +609,7 @@
case BTIF_GATTC_RSSI_EVT:
{
- btif_gattc_cb_t *p_btif_cb = (btif_gattc_cb_t*)p_param;
+ btif_gattc_cb_t *p_btif_cb = (btif_gattc_cb_t*) p_param;
HAL_CBACK(bt_gatt_callbacks, client->read_remote_rssi_cb, p_btif_cb->client_if,
&p_btif_cb->bd_addr, p_btif_cb->rssi, p_btif_cb->status);
break;
@@ -525,8 +631,165 @@
break;
}
+ case BTA_GATTC_MULT_ADV_ENB_EVT:
+ {
+ btif_gattc_cb_t *p_btif_cb = (btif_gattc_cb_t*) p_param;
+ if (0xFF != p_btif_cb->inst_id)
+ btif_multi_adv_add_instid_map(p_btif_cb->client_if, p_btif_cb->inst_id, false);
+ HAL_CBACK(bt_gatt_callbacks, client->multi_adv_enable_cb
+ , p_btif_cb->client_if
+ , p_btif_cb->status
+ );
+ btif_multi_adv_timer_ctrl(p_btif_cb->client_if,
+ (p_btif_cb->status==0 ? btif_multi_adv_stop_cb : NULL));
+ break;
+ }
+
+ case BTA_GATTC_MULT_ADV_UPD_EVT:
+ {
+ btif_gattc_cb_t *p_btif_cb = (btif_gattc_cb_t*) p_param;
+ HAL_CBACK(bt_gatt_callbacks, client->multi_adv_update_cb
+ , p_btif_cb->client_if
+ , p_btif_cb->status
+ );
+ btif_multi_adv_timer_ctrl(p_btif_cb->client_if,
+ (p_btif_cb->status==0 ? btif_multi_adv_stop_cb : NULL));
+ break;
+ }
+
+ case BTA_GATTC_MULT_ADV_DATA_EVT:
+ {
+ btif_gattc_cb_t *p_btif_cb = (btif_gattc_cb_t*) p_param;
+ HAL_CBACK(bt_gatt_callbacks, client->multi_adv_data_cb
+ , p_btif_cb->client_if
+ , p_btif_cb->status
+ );
+ break;
+ }
+
+ case BTA_GATTC_MULT_ADV_DIS_EVT:
+ {
+ btif_gattc_cb_t *p_btif_cb = (btif_gattc_cb_t*) p_param;
+ btif_gattc_clear_clientif(p_btif_cb->client_if);
+ HAL_CBACK(bt_gatt_callbacks, client->multi_adv_disable_cb
+ , p_btif_cb->client_if
+ , p_btif_cb->status
+ );
+ break;
+ }
+
+ case BTA_GATTC_ADV_DATA_EVT:
+ {
+ btif_gattc_cleanup_inst_cb(STD_ADV_INSTID);
+ /* No HAL callback available */
+ break;
+ }
+
+ case BTA_GATTC_CONGEST_EVT:
+ HAL_CBACK(bt_gatt_callbacks, client->congestion_cb
+ , p_data->congest.conn_id
+ , p_data->congest.congested
+ );
+ break;
+
+ case BTA_GATTC_BTH_SCAN_CFG_EVT:
+ {
+ btgatt_batch_track_cb_t *p_data = (btgatt_batch_track_cb_t*) p_param;
+ HAL_CBACK(bt_gatt_callbacks, client->batchscan_cfg_storage_cb
+ , p_data->client_if
+ , p_data->status
+ );
+ break;
+ }
+
+ case BTA_GATTC_BTH_SCAN_ENB_EVT:
+ {
+ btgatt_batch_track_cb_t *p_data = (btgatt_batch_track_cb_t*) p_param;
+ HAL_CBACK(bt_gatt_callbacks, client->batchscan_enb_disable_cb
+ , ENABLE_BATCH_SCAN
+ , p_data->client_if
+ , p_data->status);
+ break;
+ }
+
+ case BTA_GATTC_BTH_SCAN_DIS_EVT:
+ {
+ btgatt_batch_track_cb_t *p_data = (btgatt_batch_track_cb_t*) p_param;
+ HAL_CBACK(bt_gatt_callbacks, client->batchscan_enb_disable_cb
+ , DISABLE_BATCH_SCAN
+ , p_data->client_if
+ , p_data->status);
+ break;
+ }
+
+ case BTA_GATTC_BTH_SCAN_THR_EVT:
+ {
+ btgatt_batch_track_cb_t *p_data = (btgatt_batch_track_cb_t*) p_param;
+ HAL_CBACK(bt_gatt_callbacks, client->batchscan_threshold_cb
+ , p_data->client_if);
+ break;
+ }
+
+ case BTA_GATTC_BTH_SCAN_RD_EVT:
+ {
+ btgatt_batch_track_cb_t *p_data = (btgatt_batch_track_cb_t*) p_param;
+ uint8_t *p_rep_data = NULL;
+
+ if (p_data->read_reports.data_len > 0 && NULL != p_data->read_reports.p_rep_data)
+ {
+ p_rep_data = GKI_getbuf(p_data->read_reports.data_len);
+ memcpy(p_rep_data, p_data->read_reports.p_rep_data, p_data->read_reports.data_len);
+ }
+
+ HAL_CBACK(bt_gatt_callbacks, client->batchscan_reports_cb
+ , p_data->client_if, p_data->status, p_data->read_reports.report_format
+ , p_data->read_reports.num_records, p_data->read_reports.data_len, p_rep_data);
+ if (NULL != p_rep_data)
+ GKI_freebuf(p_rep_data);
+ break;
+ }
+
+ case BTA_GATTC_SCAN_FLT_CFG_EVT:
+ {
+ btgatt_adv_filter_cb_t *p_btif_cb = (btgatt_adv_filter_cb_t*) p_param;
+ HAL_CBACK(bt_gatt_callbacks, client->scan_filter_cfg_cb, p_btif_cb->action,
+ p_btif_cb->client_if, p_btif_cb->status, p_btif_cb->cond_op,
+ p_btif_cb->avbl_space);
+ break;
+ }
+
+ case BTA_GATTC_SCAN_FLT_PARAM_EVT:
+ {
+ btgatt_adv_filter_cb_t *p_data = (btgatt_adv_filter_cb_t*) p_param;
+ BTIF_TRACE_DEBUG("BTA_GATTC_SCAN_FLT_PARAM_EVT: %d, %d, %d, %d",p_data->client_if,
+ p_data->action, p_data->avbl_space, p_data->status);
+ HAL_CBACK(bt_gatt_callbacks, client->scan_filter_param_cb
+ , p_data->action, p_data->client_if, p_data->status
+ , p_data->avbl_space);
+ break;
+ }
+
+ case BTA_GATTC_SCAN_FLT_STATUS_EVT:
+ {
+ btgatt_adv_filter_cb_t *p_data = (btgatt_adv_filter_cb_t*) p_param;
+ BTIF_TRACE_DEBUG("BTA_GATTC_SCAN_FLT_STATUS_EVT: %d, %d, %d",p_data->client_if,
+ p_data->action, p_data->status);
+ HAL_CBACK(bt_gatt_callbacks, client->scan_filter_status_cb
+ , p_data->action, p_data->client_if, p_data->status);
+ break;
+ }
+
+ case BTA_GATTC_ADV_VSC_EVT:
+ {
+ btgatt_batch_track_cb_t *p_data = (btgatt_batch_track_cb_t*) p_param;
+ HAL_CBACK(bt_gatt_callbacks, client->track_adv_event_cb
+ ,p_data->client_if, p_data->filt_index, p_data->addr_type, &p_data->bd_addr
+ ,p_data->adv_state);
+ break;
+ }
+
default:
- ALOGE("%s: Unhandled event (%d)!", __FUNCTION__, event);
+ BTIF_TRACE_ERROR("%s: Unhandled event (%d)!", __FUNCTION__, event);
break;
}
@@ -536,10 +799,163 @@
static void bta_gattc_cback(tBTA_GATTC_EVT event, tBTA_GATTC *p_data)
{
bt_status_t status = btif_transfer_context(btif_gattc_upstreams_evt,
- (uint16_t) event, (void*)p_data, sizeof(tBTA_GATTC), btapp_gattc_req_data);
+ (uint16_t) event, (void*) p_data, sizeof(tBTA_GATTC), btapp_gattc_req_data);
ASSERTC(status == BT_STATUS_SUCCESS, "Context transfer failed!", status);
}
+static void bta_gattc_multi_adv_cback(tBTA_BLE_MULTI_ADV_EVT event, UINT8 inst_id,
+ void *p_ref, tBTA_STATUS call_status)
+{
+ btif_gattc_cb_t btif_cb;
+ tBTA_GATTC_EVT upevt;
+ uint8_t client_if = 0;
+
+ if (NULL == p_ref)
+ {
+ BTIF_TRACE_WARNING("%s Invalid p_ref received",__FUNCTION__);
+ }
+ else
+ {
+ client_if = *(UINT8 *) p_ref;
+ }
+
+ BTIF_TRACE_DEBUG("%s -Inst ID %d, Status:%x, client_if:%d",__FUNCTION__,inst_id, call_status,
+ client_if);
+ btif_cb.status = call_status;
+ btif_cb.client_if = client_if;
+ btif_cb.inst_id = inst_id;
+
+ switch(event)
+ {
+ case BTA_BLE_MULTI_ADV_ENB_EVT:
+ upevt = BTA_GATTC_MULT_ADV_ENB_EVT;
+ break;
+
+ case BTA_BLE_MULTI_ADV_DISABLE_EVT:
+ upevt = BTA_GATTC_MULT_ADV_DIS_EVT;
+ break;
+
+ case BTA_BLE_MULTI_ADV_PARAM_EVT:
+ upevt = BTA_GATTC_MULT_ADV_UPD_EVT;
+ break;
+
+ case BTA_BLE_MULTI_ADV_DATA_EVT:
+ upevt = BTA_GATTC_MULT_ADV_DATA_EVT;
+ break;
+
+ default:
+ return;
+ }
+
+ bt_status_t status = btif_transfer_context(btif_gattc_upstreams_evt, (uint16_t) upevt,
+ (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
+ ASSERTC(status == BT_STATUS_SUCCESS, "Context transfer failed!", status);
+}
+
+static void bta_gattc_set_adv_data_cback(tBTA_STATUS call_status)
+{
+ UNUSED(call_status);
+ btif_gattc_cb_t btif_cb;
+ btif_cb.status = call_status;
+ btif_cb.action = 0;
+ btif_transfer_context(btif_gattc_upstreams_evt, BTA_GATTC_ADV_DATA_EVT,
+ (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
+}
+
+static void bta_batch_scan_setup_cb (tBTA_BLE_BATCH_SCAN_EVT evt,
+ tBTA_DM_BLE_REF_VALUE ref_value, tBTA_STATUS status)
+{
+ UINT8 upevt = 0;
+ btgatt_batch_track_cb_t btif_scan_track_cb;
+
+ btif_scan_track_cb.status = status;
+ btif_scan_track_cb.client_if = ref_value;
+ BTIF_TRACE_DEBUG("bta_batch_scan_setup_cb-Status:%x, client_if:%d, evt=%d",
+ status, ref_value, evt);
+
+ switch(evt)
+ {
+ case BTA_BLE_BATCH_SCAN_ENB_EVT:
+ {
+ upevt = BTA_GATTC_BTH_SCAN_ENB_EVT;
+ break;
+ }
+
+ case BTA_BLE_BATCH_SCAN_DIS_EVT:
+ {
+ upevt = BTA_GATTC_BTH_SCAN_DIS_EVT;
+ break;
+ }
+
+ case BTA_BLE_BATCH_SCAN_CFG_STRG_EVT:
+ {
+ upevt = BTA_GATTC_BTH_SCAN_CFG_EVT;
+ break;
+ }
+
+ case BTA_BLE_BATCH_SCAN_DATA_EVT:
+ {
+ upevt = BTA_GATTC_BTH_SCAN_RD_EVT;
+ break;
+ }
+
+ case BTA_BLE_BATCH_SCAN_THRES_EVT:
+ {
+ upevt = BTA_GATTC_BTH_SCAN_THR_EVT;
+ break;
+ }
+
+ default:
+ return;
+ }
+
+ btif_transfer_context(btif_gattc_upstreams_evt, upevt,(char*) &btif_scan_track_cb,
+ sizeof(btgatt_batch_track_cb_t), NULL);
+
+}
+
+static void bta_batch_scan_threshold_cb(tBTA_DM_BLE_REF_VALUE ref_value)
+{
+ btgatt_batch_track_cb_t btif_scan_track_cb;
+ btif_scan_track_cb.status = 0;
+ btif_scan_track_cb.client_if = ref_value;
+
+ BTIF_TRACE_DEBUG("%s - client_if:%d",__FUNCTION__, ref_value);
+
+ btif_transfer_context(btif_gattc_upstreams_evt, BTA_GATTC_BTH_SCAN_THR_EVT,
+ (char*) &btif_scan_track_cb, sizeof(btif_gattc_cb_t), NULL);
+}
+
+static void bta_batch_scan_reports_cb(tBTA_DM_BLE_REF_VALUE ref_value, UINT8 report_format,
+ UINT8 num_records, UINT16 data_len,
+ UINT8* p_rep_data, tBTA_STATUS status)
+{
+ btgatt_batch_track_cb_t btif_scan_track_cb;
+ memset(&btif_scan_track_cb, 0, sizeof(btgatt_batch_track_cb_t));
+ BTIF_TRACE_DEBUG("%s - client_if:%d, %d, %d, %d",__FUNCTION__, ref_value, status, num_records,
+ data_len);
+
+ btif_scan_track_cb.status = status;
+
+ btif_scan_track_cb.client_if = ref_value;
+ btif_scan_track_cb.read_reports.report_format = report_format;
+ btif_scan_track_cb.read_reports.data_len = data_len;
+ btif_scan_track_cb.read_reports.num_records = num_records;
+
+ if (data_len > 0)
+ {
+ btif_scan_track_cb.read_reports.p_rep_data = GKI_getbuf(data_len);
+ memcpy(btif_scan_track_cb.read_reports.p_rep_data, p_rep_data, data_len);
+ GKI_freebuf(p_rep_data);
+ }
+
+ btif_transfer_context(btif_gattc_upstreams_evt, BTA_GATTC_BTH_SCAN_RD_EVT,
+ (char*) &btif_scan_track_cb, sizeof(btgatt_batch_track_cb_t), NULL);
+
+ if (data_len > 0)
+ GKI_freebuf(btif_scan_track_cb.read_reports.p_rep_data);
+}
+
static void bta_scan_results_cb (tBTA_DM_SEARCH_EVT event, tBTA_DM_SEARCH *p_data)
{
btif_gattc_cb_t btif_cb;
@@ -553,6 +969,7 @@
btif_cb.device_type = p_data->inq_res.device_type;
btif_cb.rssi = p_data->inq_res.rssi;
btif_cb.addr_type = p_data->inq_res.ble_addr_type;
+ btif_cb.flag = p_data->inq_res.flag;
if (p_data->inq_res.p_eir)
{
memcpy(btif_cb.value, p_data->inq_res.p_eir, 62);
@@ -567,19 +984,34 @@
case BTA_DM_INQ_CMPL_EVT:
{
- BTIF_TRACE_DEBUG2("%s BLE observe complete. Num Resp %d",
+ BTIF_TRACE_DEBUG("%s BLE observe complete. Num Resp %d",
__FUNCTION__,p_data->inq_cmpl.num_resps);
return;
}
default:
- BTIF_TRACE_WARNING2("%s : Unknown event 0x%x", __FUNCTION__, event);
+ BTIF_TRACE_WARNING("%s : Unknown event 0x%x", __FUNCTION__, event);
return;
}
btif_transfer_context(btif_gattc_upstreams_evt, BTIF_GATT_OBSERVE_EVT,
(char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
}
+static void bta_track_adv_event_cb(int filt_index, tBLE_ADDR_TYPE addr_type, BD_ADDR bda,
+ int adv_state, tBTA_DM_BLE_REF_VALUE ref_value)
+{
+ btgatt_batch_track_cb_t btif_scan_track_cb;
+ BTIF_TRACE_DEBUG("%s :%d, %d, %d, %d",
+ __FUNCTION__,filt_index, addr_type, adv_state, ref_value);
+ btif_scan_track_cb.filt_index = filt_index;
+ btif_scan_track_cb.addr_type = addr_type;
+ memcpy(btif_scan_track_cb.bd_addr.address, bda, sizeof(BD_ADDR));
+ btif_scan_track_cb.client_if = ref_value;
+ btif_scan_track_cb.adv_state = adv_state;
+ btif_transfer_context(btif_gattc_upstreams_evt, BTA_GATTC_ADV_VSC_EVT,
+ (char*) &btif_scan_track_cb, sizeof(btgatt_batch_track_cb_t), NULL);
+}
+
static void btm_read_rssi_cb (tBTM_RSSI_RESULTS *p_result)
{
btif_gattc_cb_t btif_cb;
@@ -592,6 +1024,45 @@
(char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
}
+static void bta_scan_filt_cfg_cb(tBTA_DM_BLE_PF_ACTION action, tBTA_DM_BLE_SCAN_COND_OP cfg_op,
+ tBTA_DM_BLE_PF_AVBL_SPACE avbl_space, tBTA_STATUS status,
+ tBTA_DM_BLE_REF_VALUE ref_value)
+{
+ btgatt_adv_filter_cb_t btif_cb;
+ btif_cb.status = status;
+ btif_cb.action = action;
+ btif_cb.cond_op = cfg_op;
+ btif_cb.avbl_space = avbl_space;
+ btif_cb.client_if = ref_value;
+ btif_transfer_context(btif_gattc_upstreams_evt, BTA_GATTC_SCAN_FLT_CFG_EVT,
+ (char*) &btif_cb, sizeof(btgatt_adv_filter_cb_t), NULL);
+}
+
+static void bta_scan_filt_param_setup_cb(UINT8 action_type,
+ tBTA_DM_BLE_PF_AVBL_SPACE avbl_space,
+ tBTA_DM_BLE_REF_VALUE ref_value, tBTA_STATUS status)
+{
+ btgatt_adv_filter_cb_t btif_cb;
+
+ btif_cb.status = status;
+ btif_cb.action = action_type;
+ btif_cb.client_if = ref_value;
+ btif_cb.avbl_space = avbl_space;
+ btif_transfer_context(btif_gattc_upstreams_evt, BTA_GATTC_SCAN_FLT_PARAM_EVT,
+ (char*) &btif_cb, sizeof(btgatt_adv_filter_cb_t), NULL);
+}
+
+static void bta_scan_filt_status_cb(UINT8 action, tBTA_STATUS status,
+ tBTA_DM_BLE_REF_VALUE ref_value)
+{
+ btgatt_adv_filter_cb_t btif_cb;
+
+ btif_cb.status = status;
+ btif_cb.action = action;
+ btif_cb.client_if = ref_value;
+ btif_transfer_context(btif_gattc_upstreams_evt, BTA_GATTC_SCAN_FLT_STATUS_EVT,
+ (char*) &btif_cb, sizeof(btgatt_adv_filter_cb_t), NULL);
+}
static void btgattc_handle_event(uint16_t event, char* p_param)
{
@@ -607,19 +1078,22 @@
tBTA_GATTC_INCL_SVC_ID out_incl_svc_id;
tBTA_GATT_UNFMT descr_val;
- btif_gattc_cb_t* p_cb = (btif_gattc_cb_t*)p_param;
+ btif_gattc_cb_t* p_cb = (btif_gattc_cb_t*) p_param;
if (!p_cb) return;
- ALOGD("%s: Event %d", __FUNCTION__, event);
+ BTIF_TRACE_EVENT("%s: Event %d", __FUNCTION__, event);
switch (event)
{
case BTIF_GATTC_REGISTER_APP:
btif_to_bta_uuid(&uuid, &p_cb->uuid);
+ btif_gattc_init_multi_adv_cb();
BTA_GATTC_AppRegister(&uuid, bta_gattc_cback);
break;
case BTIF_GATTC_UNREGISTER_APP:
+ btif_gattc_clear_clientif(p_cb->client_if);
+ btif_gattc_destroy_multi_adv_cb();
BTA_GATTC_AppDeregister(p_cb->client_if);
break;
@@ -637,6 +1111,7 @@
// Ensure device is in inquiry database
int addr_type = 0;
int device_type = 0;
+ tBTA_GATT_TRANSPORT transport = BTA_GATT_TRANSPORT_LE;
if (btif_get_device_type(p_cb->bd_addr.address, &addr_type, &device_type) == TRUE
&& device_type != BT_DEVICE_TYPE_BREDR)
@@ -644,10 +1119,47 @@
// Mark background connections
if (!p_cb->is_direct)
+ {
+ // Check if RPA offloading is supported, otherwise, do not start
+ // background connection, since it will not connect after address
+ // changes
+ if (BTM_BLE_IS_RESOLVE_BDA(p_cb->bd_addr.address))
+ {
+ tBTM_BLE_VSC_CB vnd_capabilities;
+ BTM_BleGetVendorCapabilities(&vnd_capabilities);
+ if (!vnd_capabilities.rpa_offloading)
+ {
+ HAL_CBACK(bt_gatt_callbacks, client->open_cb, 0, BT_STATUS_UNSUPPORTED,
+ p_cb->client_if, &p_cb->bd_addr);
+ return;
+ }
+ }
BTA_DmBleSetBgConnType(BTM_BLE_CONN_AUTO, NULL);
+ }
+
+ switch(device_type)
+ {
+ case BT_DEVICE_TYPE_BREDR:
+ transport = BTA_GATT_TRANSPORT_BR_EDR;
+ break;
+
+ case BT_DEVICE_TYPE_BLE:
+ transport = BTA_GATT_TRANSPORT_LE;
+ break;
+
+ case BT_DEVICE_TYPE_DUMO:
+ if ((p_cb->transport == GATT_TRANSPORT_LE) &&
+ (btif_storage_is_dmt_supported_device(&(p_cb->bd_addr)) == TRUE))
+ transport = BTA_GATT_TRANSPORT_LE;
+ else
+ transport = BTA_GATT_TRANSPORT_BR_EDR;
+ break;
+ }
// Connect!
- BTA_GATTC_Open(p_cb->client_if, p_cb->bd_addr.address, p_cb->is_direct);
+ BTIF_TRACE_DEBUG ("BTA_GATTC_Open Transport = %d, dev type = %d",
+ transport, device_type);
+ BTA_GATTC_Open(p_cb->client_if, p_cb->bd_addr.address, p_cb->is_direct, transport);
break;
}
@@ -854,6 +1366,134 @@
BTM_ReadRSSI (p_cb->bd_addr.address, (tBTM_CMPL_CB *)btm_read_rssi_cb);
break;
+ case BTIF_GATTC_SCAN_FILTER_PARAM_SETUP:
+ {
+ btgatt_adv_filter_cb_t *p_adv_filt_cb = (btgatt_adv_filter_cb_t *) p_param;
+ if (1 == p_adv_filt_cb->adv_filt_param.dely_mode)
+ BTA_DmBleTrackAdvertiser(p_adv_filt_cb->client_if, bta_track_adv_event_cb);
+ BTA_DmBleScanFilterSetup(p_adv_filt_cb->action, p_adv_filt_cb->filt_index,
+ &p_adv_filt_cb->adv_filt_param, NULL, bta_scan_filt_param_setup_cb,
+ p_adv_filt_cb->client_if);
+ break;
+ }
+
+ case BTIF_GATTC_SCAN_FILTER_CONFIG:
+ {
+ btgatt_adv_filter_cb_t *p_adv_filt_cb = (btgatt_adv_filter_cb_t *) p_param;
+ tBTA_DM_BLE_PF_COND_PARAM cond;
+ memset(&cond, 0, sizeof(cond));
+
+ switch (p_adv_filt_cb->filt_type)
+ {
+ case BTA_DM_BLE_PF_ADDR_FILTER: // 0
+ bdcpy(cond.target_addr.bda, p_adv_filt_cb->bd_addr.address);
+ cond.target_addr.type = p_adv_filt_cb->addr_type;
+ BTA_DmBleCfgFilterCondition(p_adv_filt_cb->action,
+ p_adv_filt_cb->filt_type, p_adv_filt_cb->filt_index,
+ &cond, bta_scan_filt_cfg_cb,
+ p_adv_filt_cb->client_if);
+ break;
+
+ case BTA_DM_BLE_PF_SRVC_DATA: // 1
+ BTA_DmBleCfgFilterCondition(p_adv_filt_cb->action,
+ p_adv_filt_cb->filt_type, p_adv_filt_cb->filt_index,
+ NULL, bta_scan_filt_cfg_cb, p_adv_filt_cb->client_if);
+ break;
+
+ case BTA_DM_BLE_PF_SRVC_UUID: // 2
+ {
+ tBTA_DM_BLE_PF_COND_MASK uuid_mask;
+
+ cond.srvc_uuid.p_target_addr = NULL;
+ cond.srvc_uuid.cond_logic = BTA_DM_BLE_PF_LOGIC_AND;
+ btif_to_bta_uuid(&cond.srvc_uuid.uuid, &p_adv_filt_cb->uuid);
+
+ cond.srvc_uuid.p_uuid_mask = NULL;
+ if (p_adv_filt_cb->has_mask)
+ {
+ btif_to_bta_uuid_mask(&uuid_mask, &p_adv_filt_cb->uuid_mask);
+ cond.srvc_uuid.p_uuid_mask = &uuid_mask;
+ }
+ BTA_DmBleCfgFilterCondition(p_adv_filt_cb->action,
+ p_adv_filt_cb->filt_type, p_adv_filt_cb->filt_index,
+ &cond, bta_scan_filt_cfg_cb,
+ p_adv_filt_cb->client_if);
+ break;
+ }
+
+ case BTA_DM_BLE_PF_SRVC_SOL_UUID: // 3
+ {
+ cond.solicitate_uuid.p_target_addr = NULL;
+ cond.solicitate_uuid.cond_logic = BTA_DM_BLE_PF_LOGIC_AND;
+ btif_to_bta_uuid(&cond.solicitate_uuid.uuid, &p_adv_filt_cb->uuid);
+ BTA_DmBleCfgFilterCondition(p_adv_filt_cb->action,
+ p_adv_filt_cb->filt_type, p_adv_filt_cb->filt_index,
+ &cond, bta_scan_filt_cfg_cb,
+ p_adv_filt_cb->client_if);
+ break;
+ }
+
+ case BTA_DM_BLE_PF_LOCAL_NAME: // 4
+ {
+ cond.local_name.data_len = p_adv_filt_cb->value_len;
+ cond.local_name.p_data = p_adv_filt_cb->value;
+ BTA_DmBleCfgFilterCondition(p_adv_filt_cb->action,
+ p_adv_filt_cb->filt_type, p_adv_filt_cb->filt_index,
+ &cond, bta_scan_filt_cfg_cb,
+ p_adv_filt_cb->client_if);
+ break;
+ }
+
+ case BTA_DM_BLE_PF_MANU_DATA: // 5
+ {
+ cond.manu_data.company_id = p_adv_filt_cb->conn_id;
+ cond.manu_data.company_id_mask = p_adv_filt_cb->company_id_mask;
+ cond.manu_data.data_len = p_adv_filt_cb->value_len;
+ cond.manu_data.p_pattern = p_adv_filt_cb->value;
+ cond.manu_data.p_pattern_mask = p_adv_filt_cb->value_mask;
+ BTA_DmBleCfgFilterCondition(p_adv_filt_cb->action,
+ p_adv_filt_cb->filt_type, p_adv_filt_cb->filt_index,
+ &cond, bta_scan_filt_cfg_cb,
+ p_adv_filt_cb->client_if);
+ break;
+ }
+
+ case BTA_DM_BLE_PF_SRVC_DATA_PATTERN: //6
+ {
+ cond.srvc_data.data_len = p_adv_filt_cb->value_len;
+ cond.srvc_data.p_pattern = p_adv_filt_cb->value;
+ cond.srvc_data.p_pattern_mask = p_adv_filt_cb->value_mask;
+ BTA_DmBleCfgFilterCondition(p_adv_filt_cb->action,
+ p_adv_filt_cb->filt_type, p_adv_filt_cb->filt_index,
+ &cond, bta_scan_filt_cfg_cb,
+ p_adv_filt_cb->client_if);
+ break;
+ }
+
+ default:
+ BTIF_TRACE_ERROR("%s: Unknown filter type (%d)!", __FUNCTION__, p_cb->action);
+ break;
+ }
+ break;
+ }
+
+ case BTIF_GATTC_SCAN_FILTER_CLEAR:
+ {
+ btgatt_adv_filter_cb_t *p_adv_filt_cb = (btgatt_adv_filter_cb_t *) p_param;
+ BTA_DmBleCfgFilterCondition(BTA_DM_BLE_SCAN_COND_CLEAR, BTA_DM_BLE_PF_TYPE_ALL,
+ p_adv_filt_cb->filt_index, NULL, bta_scan_filt_cfg_cb,
+ p_adv_filt_cb->client_if);
+ break;
+ }
+
+ case BTIF_GATTC_SCAN_FILTER_ENABLE:
+ {
+ btgatt_adv_filter_cb_t *p_adv_filt_cb = (btgatt_adv_filter_cb_t *) p_param;
+ BTA_DmEnableScanFilter(p_adv_filt_cb->action, bta_scan_filt_status_cb,
+ p_adv_filt_cb->client_if);
+ break;
+ }
+
case BTIF_GATTC_LISTEN:
#if (defined(BLE_PERIPHERAL_MODE_SUPPORT) && (BLE_PERIPHERAL_MODE_SUPPORT == TRUE))
BTA_GATTC_Listen(p_cb->client_if, p_cb->start, NULL);
@@ -864,45 +1504,168 @@
case BTIF_GATTC_SET_ADV_DATA:
{
- if (p_cb->start == 0)
- BTA_DmBleSetAdvConfig(p_cb->adv_data.mask, &p_cb->adv_data.data);
- else
- BTA_DmBleSetScanRsp(p_cb->adv_data.mask, &p_cb->adv_data.data);
-
- // Cleanup ...
-
- // ... manufacturer data
- if (p_cb->adv_data.data.manu.p_val != NULL)
- GKI_freebuf(p_cb->adv_data.data.manu.p_val);
-
- // ... service data
- if (p_cb->adv_data.data.p_proprietary != NULL)
+ btif_adv_data_t *p_adv_data = (btif_adv_data_t*) p_param;
+ int cbindex = CLNT_IF_IDX;
+ if (cbindex >= 0 && NULL != p_adv_data)
{
- int i = 0;
- tBTA_BLE_PROP_ELEM *p_elem = p_cb->adv_data.data.p_proprietary->p_elem;
- while (i++ != p_cb->adv_data.data.p_proprietary->num_elem && p_elem)
+ btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
+ if (!btif_gattc_copy_datacb(cbindex, p_adv_data, false))
+ return;
+
+ if (!p_adv_data->set_scan_rsp)
{
- if (p_elem->p_val != NULL)
- GKI_freebuf(p_elem->p_val);
- ++p_elem;
+ BTA_DmBleSetAdvConfig(p_multi_adv_data_cb->inst_cb[cbindex].mask,
+ &p_multi_adv_data_cb->inst_cb[cbindex].data, bta_gattc_set_adv_data_cback);
}
- if (p_cb->adv_data.data.p_proprietary->p_elem != NULL)
- GKI_freebuf(p_cb->adv_data.data.p_proprietary->p_elem);
- GKI_freebuf(p_cb->adv_data.data.p_proprietary);
+ else
+ {
+ BTA_DmBleSetScanRsp(p_multi_adv_data_cb->inst_cb[cbindex].mask,
+ &p_multi_adv_data_cb->inst_cb[cbindex].data, bta_gattc_set_adv_data_cback);
+ }
+ break;
}
+ }
- // ... service list
- if (p_cb->adv_data.data.services.p_uuid != NULL)
- GKI_freebuf(p_cb->adv_data.data.services.p_uuid);
+ case BTIF_GATTC_ADV_INSTANCE_ENABLE:
+ {
+ btgatt_multi_adv_inst_cb *p_inst_cb = (btgatt_multi_adv_inst_cb*) p_param;
+ int cbindex = -1, arrindex = -1;
+
+ arrindex = btif_multi_adv_add_instid_map(p_inst_cb->client_if,INVALID_ADV_INST, true);
+ if (arrindex >= 0)
+ cbindex = btif_gattc_obtain_idx_for_datacb(p_inst_cb->client_if, CLNT_IF_IDX);
+
+ if (cbindex >= 0 && arrindex >= 0)
+ {
+ btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
+ memcpy(&p_multi_adv_data_cb->inst_cb[cbindex].param,
+ &p_inst_cb->param, sizeof(tBTA_BLE_ADV_PARAMS));
+ p_multi_adv_data_cb->inst_cb[cbindex].timeout_s = p_inst_cb->timeout_s;
+ BTIF_TRACE_DEBUG("%s, client_if value: %d", __FUNCTION__,
+ p_multi_adv_data_cb->clntif_map[arrindex + arrindex]);
+ BTA_BleEnableAdvInstance(&(p_multi_adv_data_cb->inst_cb[cbindex].param),
+ bta_gattc_multi_adv_cback,
+ &(p_multi_adv_data_cb->clntif_map[arrindex + arrindex]));
+ }
+ else
+ {
+ /* let the error propagate up from BTA layer */
+ BTIF_TRACE_ERROR("%s invalid index in BTIF_GATTC_ENABLE_ADV",__FUNCTION__);
+ BTA_BleEnableAdvInstance(&p_inst_cb->param, bta_gattc_multi_adv_cback, NULL);
+ }
break;
}
+
+ case BTIF_GATTC_ADV_INSTANCE_UPDATE:
+ {
+ btgatt_multi_adv_inst_cb *p_inst_cb = (btgatt_multi_adv_inst_cb*) p_param;
+ int inst_id = btif_multi_adv_instid_for_clientif(p_inst_cb->client_if);
+ int cbindex = btif_gattc_obtain_idx_for_datacb(p_inst_cb->client_if, CLNT_IF_IDX);
+ if (inst_id >= 0 && cbindex >= 0 && NULL != p_inst_cb)
+ {
+ btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
+ memcpy(&p_multi_adv_data_cb->inst_cb[cbindex].param, &p_inst_cb->param,
+ sizeof(tBTA_BLE_ADV_PARAMS));
+ BTA_BleUpdateAdvInstParam((UINT8)inst_id,
+ &(p_multi_adv_data_cb->inst_cb[cbindex].param));
+ }
+ else
+ BTIF_TRACE_ERROR("%s invalid index in BTIF_GATTC_UPDATE_ADV", __FUNCTION__);
+ break;
+ }
+
+ case BTIF_GATTC_ADV_INSTANCE_SET_DATA:
+ {
+ btif_adv_data_t *p_adv_data = (btif_adv_data_t*) p_param;
+ int cbindex = btif_gattc_obtain_idx_for_datacb(p_adv_data->client_if, CLNT_IF_IDX);
+ int inst_id = btif_multi_adv_instid_for_clientif(p_adv_data->client_if);
+ if (inst_id < 0 || cbindex < 0)
+ {
+ BTIF_TRACE_ERROR("%s invalid index in BTIF_GATTC_SETADV_INST_DATA", __FUNCTION__);
+ return;
+ }
+
+ if (!btif_gattc_copy_datacb(cbindex, p_adv_data, true))
+ return;
+
+ btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
+ BTA_BleCfgAdvInstData((UINT8)inst_id, p_multi_adv_data_cb->inst_cb[cbindex].is_scan_rsp,
+ p_multi_adv_data_cb->inst_cb[cbindex].mask,
+ &p_multi_adv_data_cb->inst_cb[cbindex].data);
+ break;
+ }
+
+ case BTIF_GATTC_ADV_INSTANCE_DISABLE:
+ {
+ btgatt_multi_adv_inst_cb *p_inst_cb = (btgatt_multi_adv_inst_cb*) p_param;
+ int inst_id = btif_multi_adv_instid_for_clientif(p_inst_cb->client_if);
+ if (inst_id >=0)
+ BTA_BleDisableAdvInstance((UINT8)inst_id);
+ else
+ BTIF_TRACE_ERROR("%s invalid instance ID in BTIF_GATTC_DISABLE_ADV",__FUNCTION__);
+ break;
+ }
+
case BTIF_GATTC_CONFIGURE_MTU:
BTA_GATTC_ConfigureMTU(p_cb->conn_id, p_cb->len);
break;
+ case BTIF_GATTC_CONN_PARAM_UPDT:
+ {
+ btif_conn_param_cb_t *p_conn_param_cb = (btif_conn_param_cb_t*) p_param;
+ if (BTA_DmGetConnectionState(p_conn_param_cb->bd_addr.address))
+ {
+ BTA_DmBleUpdateConnectionParams(p_conn_param_cb->bd_addr.address,
+ p_conn_param_cb->min_interval, p_conn_param_cb->max_interval,
+ p_conn_param_cb->latency, p_conn_param_cb->timeout);
+ } else {
+ BTA_DmSetBlePrefConnParams(p_conn_param_cb->bd_addr.address,
+ p_conn_param_cb->min_interval, p_conn_param_cb->max_interval,
+ p_conn_param_cb->latency, p_conn_param_cb->timeout);
+ }
+ break;
+ }
+
+ case BTIF_GATTC_SET_SCAN_PARAMS:
+ BTM_BleSetScanParams(p_cb->scan_interval, p_cb->scan_window, BTM_BLE_SCAN_MODE_ACTI);
+ break;
+
+ case BTIF_GATTC_CONFIG_STORAGE_PARAMS:
+ {
+ btgatt_batch_track_cb_t *p_scan_track_cb = (btgatt_batch_track_cb_t *) p_param;
+ BTA_DmBleSetStorageParams(p_scan_track_cb->batch_scan_full_max,
+ p_scan_track_cb->batch_scan_trunc_max, p_scan_track_cb->batch_scan_notify_threshold,
+ bta_batch_scan_setup_cb, bta_batch_scan_threshold_cb, bta_batch_scan_reports_cb,
+ (tBTA_DM_BLE_REF_VALUE) p_scan_track_cb->client_if);
+ break;
+ }
+
+ case BTIF_GATTC_ENABLE_BATCH_SCAN:
+ {
+ btgatt_batch_track_cb_t *p_scan_track_cb = (btgatt_batch_track_cb_t *) p_param;
+ BTA_DmBleEnableBatchScan(p_scan_track_cb->scan_mode, p_scan_track_cb->scan_interval,
+ p_scan_track_cb->scan_window, p_scan_track_cb->discard_rule,
+ p_scan_track_cb->addr_type, p_scan_track_cb->client_if);
+ break;
+ }
+
+ case BTIF_GATTC_DISABLE_BATCH_SCAN:
+ {
+ btgatt_batch_track_cb_t *p_scan_track_cb = (btgatt_batch_track_cb_t *) p_param;
+ BTA_DmBleDisableBatchScan(p_scan_track_cb->client_if);
+ break;
+ }
+
+ case BTIF_GATTC_READ_BATCH_SCAN_REPORTS:
+ {
+ btgatt_batch_track_cb_t *p_scan_track_cb = (btgatt_batch_track_cb_t *) p_param;
+ BTA_DmBleReadScanReports(p_scan_track_cb->scan_mode, p_scan_track_cb->client_if);
+ break;
+ }
+
default:
- ALOGE("%s: Unknown event (%d)!", __FUNCTION__, event);
+ BTIF_TRACE_ERROR("%s: Unknown event (%d)!", __FUNCTION__, event);
break;
}
}
@@ -929,21 +1692,22 @@
(char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
}
-static bt_status_t btif_gattc_scan( int client_if, bool start )
+static bt_status_t btif_gattc_scan( bool start )
{
CHECK_BTGATT_INIT();
btif_gattc_cb_t btif_cb;
- btif_cb.client_if = (uint8_t) client_if;
return btif_transfer_context(btgattc_handle_event, start ? BTIF_GATTC_SCAN_START : BTIF_GATTC_SCAN_STOP,
(char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
}
-static bt_status_t btif_gattc_open(int client_if, const bt_bdaddr_t *bd_addr, bool is_direct )
+static bt_status_t btif_gattc_open(int client_if, const bt_bdaddr_t *bd_addr,
+ bool is_direct,int transport)
{
CHECK_BTGATT_INIT();
btif_gattc_cb_t btif_cb;
btif_cb.client_if = (uint8_t) client_if;
btif_cb.is_direct = is_direct ? 1 : 0;
+ btif_cb.transport = (btgatt_transport_t)transport;
bdcpy(btif_cb.bd_addr.address, bd_addr->address);
return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_OPEN,
(char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
@@ -977,161 +1741,28 @@
uint16_t service_uuid_len, char* service_uuid)
{
CHECK_BTGATT_INIT();
- btif_gattc_cb_t btif_cb;
- memset(&btif_cb, 0, sizeof(btif_gattc_cb_t));
- memset(&btif_cb.adv_data, 0, sizeof(btgatt_adv_data));
+ bt_status_t status =0;
- btif_cb.client_if = (uint8_t) client_if;
- btif_cb.start = set_scan_rsp ? 1 : 0;
+ btif_adv_data_t adv_data;
- if (!set_scan_rsp)
- {
- btif_cb.adv_data.mask = BTM_BLE_AD_BIT_FLAGS;
- btif_cb.adv_data.data.flag = ADV_FLAGS;
- }
+ btif_gattc_adv_data_packager(client_if, set_scan_rsp, include_name,
+ include_txpower, min_interval, max_interval, appearance, manufacturer_len,
+ manufacturer_data, service_data_len, service_data, service_uuid_len, service_uuid,
+ &adv_data);
- if (include_name)
- btif_cb.adv_data.mask |= BTM_BLE_AD_BIT_DEV_NAME;
+ status = btif_transfer_context(btgattc_handle_event, BTIF_GATTC_SET_ADV_DATA,
+ (char*) &adv_data, sizeof(btif_adv_data_t), NULL);
- if (include_txpower)
- btif_cb.adv_data.mask |= BTM_BLE_AD_BIT_TX_PWR;
+ if (NULL != adv_data.p_service_data)
+ GKI_freebuf(adv_data.p_service_data);
- if (min_interval > 0 && max_interval > 0 && max_interval > min_interval)
- {
- btif_cb.adv_data.mask |= BTM_BLE_AD_BIT_INT_RANGE;
- btif_cb.adv_data.data.int_range.low = min_interval;
- btif_cb.adv_data.data.int_range.hi = max_interval;
- }
+ if (NULL != adv_data.p_service_uuid)
+ GKI_freebuf(adv_data.p_service_uuid);
- if (appearance != 0)
- {
- btif_cb.adv_data.mask |= BTM_BLE_AD_BIT_APPEARANCE;
- btif_cb.adv_data.data.appearance = appearance;
- }
+ if (NULL != adv_data.p_manufacturer_data)
+ GKI_freebuf(adv_data.p_manufacturer_data);
- if (manufacturer_len > 0 && manufacturer_data != NULL)
- {
- btif_cb.adv_data.data.manu.p_val = GKI_getbuf(manufacturer_len);
- if (btif_cb.adv_data.data.manu.p_val != NULL)
- {
- btif_cb.adv_data.mask |= BTM_BLE_AD_BIT_MANU;
- btif_cb.adv_data.data.manu.len = manufacturer_len;
- memcpy(btif_cb.adv_data.data.manu.p_val, manufacturer_data, manufacturer_len);
- }
- }
-
- tBTA_BLE_PROP_ELEM *p_elem_service_data = NULL;
- tBTA_BLE_PROP_ELEM *p_elem_service_128 = NULL;
-
- if (service_data_len > 0 && service_data != NULL)
- {
- p_elem_service_data = GKI_getbuf(sizeof(tBTA_BLE_PROP_ELEM));
- if (p_elem_service_data != NULL)
- {
- p_elem_service_data->p_val = GKI_getbuf(service_data_len);
- if (p_elem_service_data->p_val != NULL)
- {
- p_elem_service_data->adv_type = BTM_BLE_AD_TYPE_SERVICE_DATA;
- p_elem_service_data->len = service_data_len;
- memcpy(p_elem_service_data->p_val, service_data, service_data_len);
-
- } else {
- GKI_freebuf(p_elem_service_data);
- p_elem_service_data = NULL;
- }
- }
- }
-
- if (service_uuid_len > 0 && service_uuid != NULL)
- {
- btif_cb.adv_data.data.services.list_cmpl = FALSE;
- btif_cb.adv_data.data.services.num_service = 0;
-
- btif_cb.adv_data.data.services.p_uuid =
- GKI_getbuf(service_uuid_len / LEN_UUID_128 * LEN_UUID_16);
- if (btif_cb.adv_data.data.services.p_uuid != NULL)
- {
- UINT16 *p_uuid_out = btif_cb.adv_data.data.services.p_uuid;
- while (service_uuid_len >= LEN_UUID_128)
- {
- bt_uuid_t uuid;
- memset(&uuid, 0, sizeof(bt_uuid_t));
- memcpy(&uuid.uu, service_uuid, LEN_UUID_128);
-
- tBT_UUID bt_uuid;
- memset(&bt_uuid, 0, sizeof(tBT_UUID));
- btif_to_bta_uuid(&bt_uuid, &uuid);
-
- if (bt_uuid.len == LEN_UUID_16)
- {
- btif_cb.adv_data.mask |= BTM_BLE_AD_BIT_SERVICE;
- ++btif_cb.adv_data.data.services.num_service;
- *p_uuid_out++ = bt_uuid.uu.uuid16;
-
- } else if (bt_uuid.len == LEN_UUID_128 && p_elem_service_128 == NULL) {
- /* Currently, only one 128-bit UUID is supported */
- p_elem_service_128 = GKI_getbuf(sizeof(tBTA_BLE_PROP_ELEM));
- if (p_elem_service_128 != NULL)
- {
- p_elem_service_128->p_val = GKI_getbuf(LEN_UUID_128);
- if (p_elem_service_128->p_val != NULL)
- {
- p_elem_service_128->adv_type = BTM_BLE_AD_TYPE_128SRV_PART;
- p_elem_service_128->len = LEN_UUID_128;
- memcpy(p_elem_service_128->p_val, bt_uuid.uu.uuid128, LEN_UUID_128);
-
- } else {
- GKI_freebuf(p_elem_service_128);
- p_elem_service_128 = NULL;
- }
- }
- }
-
- service_uuid += LEN_UUID_128;
- service_uuid_len -= LEN_UUID_128;
- }
- }
- }
-
- if (p_elem_service_data != NULL || p_elem_service_128 != NULL)
- {
- btif_cb.adv_data.data.p_proprietary = GKI_getbuf(sizeof(tBTA_BLE_PROPRIETARY));
- if (btif_cb.adv_data.data.p_proprietary != NULL)
- {
- tBTA_BLE_PROPRIETARY *p_prop = btif_cb.adv_data.data.p_proprietary;
- tBTA_BLE_PROP_ELEM *p_elem = NULL;
- p_prop->num_elem = 0;
- btif_cb.adv_data.mask |= BTM_BLE_AD_BIT_PROPRIETARY;
-
- if (p_elem_service_128 != NULL)
- ++p_prop->num_elem;
-
- if (p_elem_service_data != NULL)
- ++p_prop->num_elem;
-
- p_prop->p_elem = GKI_getbuf(sizeof(tBTA_BLE_PROP_ELEM) * p_prop->num_elem);
- p_elem = p_prop->p_elem;
-
- if (p_elem_service_128 != NULL)
- {
- memcpy(p_elem++, p_elem_service_128, sizeof(tBTA_BLE_PROP_ELEM));
- GKI_freebuf(p_elem_service_128);
- }
-
- if (p_elem_service_data != NULL)
- {
- memcpy(p_elem++, p_elem_service_data, sizeof(tBTA_BLE_PROP_ELEM));
- GKI_freebuf(p_elem_service_data);
- }
- }
- }
-
-#if (defined(BLE_PERIPHERAL_ADV_NAME) && (BLE_PERIPHERAL_ADV_NAME == TRUE))
- btif_cb.adv_data.mask |= BTM_BLE_AD_BIT_DEV_NAME;
-#endif
-
- return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_SET_ADV_DATA,
- (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
+ return status;
}
static bt_status_t btif_gattc_refresh( int client_if, const bt_bdaddr_t *bd_addr )
@@ -1334,6 +1965,127 @@
(char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
}
+static bt_status_t btif_gattc_conn_parameter_update(const bt_bdaddr_t *bd_addr, int min_interval,
+ int max_interval, int latency, int timeout)
+{
+ CHECK_BTGATT_INIT();
+ btif_conn_param_cb_t btif_cb;
+ btif_cb.min_interval = min_interval;
+ btif_cb.max_interval = max_interval;
+ btif_cb.latency = latency;
+ btif_cb.timeout = timeout;
+ bdcpy(btif_cb.bd_addr.address, bd_addr->address);
+ return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_CONN_PARAM_UPDT,
+ (char*) &btif_cb, sizeof(btif_conn_param_cb_t), NULL);
+}
+
+static bt_status_t btif_gattc_scan_filter_param_setup(int client_if, int action,
+ int filt_index, int feat_seln, int list_logic_type, int filt_logic_type, int rssi_high_thres,
+ int rssi_low_thres, int dely_mode, int found_timeout, int lost_timeout, int found_timeout_cnt)
+{
+ CHECK_BTGATT_INIT();
+ BTIF_TRACE_DEBUG("%s", __FUNCTION__);
+ btgatt_adv_filter_cb_t btif_filt_cb;
+ memset(&btif_filt_cb, 0, sizeof(btgatt_adv_filter_cb_t));
+ btif_filt_cb.action = action;
+ btif_filt_cb.client_if = client_if;
+ btif_filt_cb.filt_index = filt_index;
+ btif_filt_cb.adv_filt_param.feat_seln = feat_seln;
+ btif_filt_cb.adv_filt_param.list_logic_type = list_logic_type;
+ btif_filt_cb.adv_filt_param.filt_logic_type = filt_logic_type;
+ btif_filt_cb.adv_filt_param.rssi_high_thres = rssi_high_thres;
+ btif_filt_cb.adv_filt_param.rssi_low_thres = rssi_low_thres;
+ btif_filt_cb.adv_filt_param.dely_mode = dely_mode;
+ btif_filt_cb.adv_filt_param.found_timeout = found_timeout;
+ btif_filt_cb.adv_filt_param.lost_timeout = lost_timeout;
+ btif_filt_cb.adv_filt_param.found_timeout_cnt = found_timeout_cnt;
+ return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_SCAN_FILTER_PARAM_SETUP,
+ (char*) &btif_filt_cb, sizeof(btgatt_adv_filter_cb_t), NULL);
+}
+
+static bt_status_t btif_gattc_scan_filter_add_remove(int client_if, int action,
+ int filt_type, int filt_index, int company_id,
+ int company_id_mask, const bt_uuid_t *p_uuid,
+ const bt_uuid_t *p_uuid_mask, const bt_bdaddr_t *bd_addr,
+ char addr_type, int data_len, char* p_data, int mask_len,
+ char* p_mask)
+{
+ CHECK_BTGATT_INIT();
+ btgatt_adv_filter_cb_t btif_filt_cb;
+ memset(&btif_filt_cb, 0, sizeof(btgatt_adv_filter_cb_t));
+ BTIF_TRACE_DEBUG("%s, %d, %d", __FUNCTION__, action, filt_type);
+
+ /* If data is passed, both mask and data have to be the same length */
+ if (data_len != mask_len && NULL != p_data && NULL != p_mask)
+ return BT_STATUS_PARM_INVALID;
+
+ btif_filt_cb.client_if = client_if;
+ btif_filt_cb.action = action;
+ btif_filt_cb.filt_index = filt_index;
+ btif_filt_cb.filt_type = filt_type;
+ btif_filt_cb.conn_id = company_id;
+ btif_filt_cb.company_id_mask = company_id_mask ? company_id_mask : 0xFFFF;
+ if (bd_addr)
+ bdcpy(btif_filt_cb.bd_addr.address, bd_addr->address);
+
+ btif_filt_cb.addr_type = addr_type;
+ btif_filt_cb.has_mask = (p_uuid_mask != NULL);
+
+ if (p_uuid != NULL)
+ memcpy(&btif_filt_cb.uuid, p_uuid, sizeof(bt_uuid_t));
+ if (p_uuid_mask != NULL)
+ memcpy(&btif_filt_cb.uuid_mask, p_uuid_mask, sizeof(bt_uuid_t));
+ if (p_data != NULL && data_len != 0)
+ {
+ memcpy(btif_filt_cb.value, p_data, data_len);
+ btif_filt_cb.value_len = data_len;
+ memcpy(btif_filt_cb.value_mask, p_mask, mask_len);
+ btif_filt_cb.value_mask_len = mask_len;
+ }
+ return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_SCAN_FILTER_CONFIG,
+ (char*) &btif_filt_cb, sizeof(btgatt_adv_filter_cb_t), NULL);
+}
+
+static bt_status_t btif_gattc_scan_filter_clear(int client_if, int filt_index)
+{
+ CHECK_BTGATT_INIT();
+ BTIF_TRACE_DEBUG("%s, %d", __FUNCTION__, filt_index);
+
+ btgatt_adv_filter_cb_t btif_filt_cb;
+ memset(&btif_filt_cb, 0, sizeof(btgatt_adv_filter_cb_t));
+ btif_filt_cb.client_if = client_if;
+ btif_filt_cb.filt_index = filt_index;
+ btif_filt_cb.action = BTA_DM_BLE_SCAN_COND_CLEAR;
+ return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_SCAN_FILTER_CONFIG,
+ (char*) &btif_filt_cb, sizeof(btgatt_adv_filter_cb_t), NULL);
+}
+
+static bt_status_t btif_gattc_scan_filter_enable(int client_if, bool enable)
+{
+ int action = 0;
+ CHECK_BTGATT_INIT();
+ BTIF_TRACE_DEBUG("%s, %d", __FUNCTION__, enable);
+
+ btgatt_adv_filter_cb_t btif_filt_cb;
+ memset(&btif_filt_cb, 0, sizeof(btgatt_adv_filter_cb_t));
+ btif_filt_cb.client_if = client_if;
+ if (true == enable)
+ action = 1;
+ btif_filt_cb.action = action;
+ return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_SCAN_FILTER_ENABLE,
+ (char*) &btif_filt_cb, sizeof(btgatt_adv_filter_cb_t), NULL);
+}
+
+static bt_status_t btif_gattc_set_scan_parameters(int scan_interval, int scan_window)
+{
+ CHECK_BTGATT_INIT();
+ btif_gattc_cb_t btif_cb;
+ btif_cb.scan_interval = scan_interval;
+ btif_cb.scan_window = scan_window;
+ return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_SET_SCAN_PARAMS,
+ (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
+}
+
static int btif_gattc_get_device_type( const bt_bdaddr_t *bd_addr )
{
int device_type = 0;
@@ -1345,6 +2097,139 @@
return 0;
}
+static bt_status_t btif_gattc_multi_adv_enable(int client_if, int min_interval, int max_interval,
+ int adv_type, int chnl_map, int tx_power, int timeout_s)
+{
+ CHECK_BTGATT_INIT();
+ btgatt_multi_adv_inst_cb adv_cb;
+ memset(&adv_cb, 0, sizeof(btgatt_multi_adv_inst_cb));
+ adv_cb.client_if = (uint8_t) client_if;
+
+ adv_cb.param.adv_int_min = min_interval;
+ adv_cb.param.adv_int_max = max_interval;
+ adv_cb.param.adv_type = adv_type;
+ adv_cb.param.channel_map = chnl_map;
+ adv_cb.param.adv_filter_policy = 0;
+ adv_cb.param.tx_power = tx_power;
+ adv_cb.timeout_s = timeout_s;
+ return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_ADV_INSTANCE_ENABLE,
+ (char*) &adv_cb, sizeof(btgatt_multi_adv_inst_cb), NULL);
+}
+
+static bt_status_t btif_gattc_multi_adv_update(int client_if, int min_interval, int max_interval,
+ int adv_type, int chnl_map,int tx_power, int timeout_s)
+{
+ CHECK_BTGATT_INIT();
+ btgatt_multi_adv_inst_cb adv_cb;
+ memset(&adv_cb, 0, sizeof(btgatt_multi_adv_inst_cb));
+ adv_cb.client_if = (uint8_t) client_if;
+
+ adv_cb.param.adv_int_min = min_interval;
+ adv_cb.param.adv_int_max = max_interval;
+ adv_cb.param.adv_type = adv_type;
+ adv_cb.param.channel_map = chnl_map;
+ adv_cb.param.adv_filter_policy = 0;
+ adv_cb.param.tx_power = tx_power;
+ adv_cb.timeout_s = timeout_s;
+ return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_ADV_INSTANCE_UPDATE,
+ (char*) &adv_cb, sizeof(btgatt_multi_adv_inst_cb), NULL);
+}
+
+static bt_status_t btif_gattc_multi_adv_setdata(int client_if, bool set_scan_rsp,
+ bool include_name, bool incl_txpower, int appearance,
+ int manufacturer_len, char* manufacturer_data,
+ int service_data_len, char* service_data,
+ int service_uuid_len, char* service_uuid)
+{
+ CHECK_BTGATT_INIT();
+
+ int min_interval = 0, max_interval = 0;
+ bt_status_t status =0;
+
+ btif_adv_data_t multi_adv_data_inst;
+ memset(&multi_adv_data_inst, 0, sizeof(btif_adv_data_t));
+
+ btif_gattc_adv_data_packager(client_if, set_scan_rsp, include_name, incl_txpower,
+ min_interval, max_interval, appearance, manufacturer_len, manufacturer_data,
+ service_data_len, service_data, service_uuid_len, service_uuid, &multi_adv_data_inst);
+
+ status = btif_transfer_context(btgattc_handle_event, BTIF_GATTC_ADV_INSTANCE_SET_DATA,
+ (char*) &multi_adv_data_inst, sizeof(btif_adv_data_t), NULL);
+
+ if (NULL != multi_adv_data_inst.p_service_data)
+ GKI_freebuf(multi_adv_data_inst.p_service_data);
+
+ if (NULL != multi_adv_data_inst.p_service_uuid)
+ GKI_freebuf(multi_adv_data_inst.p_service_uuid);
+
+ if (NULL != multi_adv_data_inst.p_manufacturer_data)
+ GKI_freebuf(multi_adv_data_inst.p_manufacturer_data);
+
+ return status;
+}
+
+static bt_status_t btif_gattc_multi_adv_disable(int client_if)
+{
+ CHECK_BTGATT_INIT();
+ btgatt_multi_adv_inst_cb adv_cb;
+ memset(&adv_cb, 0, sizeof(btgatt_multi_adv_inst_cb));
+ adv_cb.client_if = (uint8_t) client_if;
+
+ return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_ADV_INSTANCE_DISABLE,
+ (char*) &adv_cb, sizeof(btgatt_multi_adv_inst_cb), NULL);
+}
+
+static bt_status_t btif_gattc_cfg_storage(int client_if,int batch_scan_full_max,
+ int batch_scan_trunc_max, int batch_scan_notify_threshold)
+{
+ CHECK_BTGATT_INIT();
+ btgatt_batch_track_cb_t bt_scan_cb;
+ memset(&bt_scan_cb, 0, sizeof(btgatt_batch_track_cb_t));
+ bt_scan_cb.client_if = (uint8_t) client_if;
+ bt_scan_cb.batch_scan_full_max = batch_scan_full_max;
+ bt_scan_cb.batch_scan_trunc_max = batch_scan_trunc_max;
+ bt_scan_cb.batch_scan_notify_threshold = batch_scan_notify_threshold;
+ return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_CONFIG_STORAGE_PARAMS,
+ (char*) &bt_scan_cb, sizeof(btgatt_batch_track_cb_t), NULL);
+}
+
+static bt_status_t btif_gattc_enb_batch_scan(int client_if,int scan_mode, int scan_interval,
+ int scan_window, int addr_type, int discard_rule)
+{
+ CHECK_BTGATT_INIT();
+ btgatt_batch_track_cb_t bt_scan_cb;
+ memset(&bt_scan_cb, 0, sizeof(btgatt_batch_track_cb_t));
+ bt_scan_cb.client_if = (uint8_t) client_if;
+ bt_scan_cb.scan_mode = scan_mode;
+ bt_scan_cb.scan_interval = scan_interval;
+ bt_scan_cb.scan_window = scan_window;
+ bt_scan_cb.discard_rule = discard_rule;
+ bt_scan_cb.addr_type = addr_type;
+ return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_ENABLE_BATCH_SCAN,
+ (char*) &bt_scan_cb, sizeof(btgatt_batch_track_cb_t), NULL);
+}
+
+static bt_status_t btif_gattc_dis_batch_scan(int client_if)
+{
+ CHECK_BTGATT_INIT();
+ btgatt_batch_track_cb_t bt_scan_cb;
+ memset(&bt_scan_cb, 0, sizeof(btgatt_batch_track_cb_t));
+ bt_scan_cb.client_if = (uint8_t) client_if;
+ return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_DISABLE_BATCH_SCAN,
+ (char*) &bt_scan_cb, sizeof(btgatt_batch_track_cb_t), NULL);
+}
+
+static bt_status_t btif_gattc_read_batch_scan_reports(int client_if, int scan_mode)
+{
+ CHECK_BTGATT_INIT();
+ btgatt_batch_track_cb_t bt_scan_cb;
+ memset(&bt_scan_cb, 0, sizeof(btgatt_batch_track_cb_t));
+ bt_scan_cb.client_if = (uint8_t) client_if;
+ bt_scan_cb.scan_mode = scan_mode;
+ return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_READ_BATCH_SCAN_REPORTS,
+ (char*) &bt_scan_cb, sizeof(btgatt_batch_track_cb_t), NULL);
+}
+
extern bt_status_t btif_gattc_test_command_impl(int command, btgatt_test_params_t* params);
static bt_status_t btif_gattc_test_command(int command, btgatt_test_params_t* params)
@@ -1373,9 +2258,23 @@
btif_gattc_reg_for_notification,
btif_gattc_dereg_for_notification,
btif_gattc_read_remote_rssi,
+ btif_gattc_scan_filter_param_setup,
+ btif_gattc_scan_filter_add_remove,
+ btif_gattc_scan_filter_clear,
+ btif_gattc_scan_filter_enable,
btif_gattc_get_device_type,
btif_gattc_set_adv_data,
btif_gattc_configure_mtu,
+ btif_gattc_conn_parameter_update,
+ btif_gattc_set_scan_parameters,
+ btif_gattc_multi_adv_enable,
+ btif_gattc_multi_adv_update,
+ btif_gattc_multi_adv_setdata,
+ btif_gattc_multi_adv_disable,
+ btif_gattc_cfg_storage,
+ btif_gattc_enb_batch_scan,
+ btif_gattc_dis_batch_scan,
+ btif_gattc_read_batch_scan_reports,
btif_gattc_test_command
};
diff --git a/btif/src/btif_gatt_multi_adv_util.c b/btif/src/btif_gatt_multi_adv_util.c
new file mode 100755
index 0000000..68fc3ba
--- /dev/null
+++ b/btif/src/btif_gatt_multi_adv_util.c
@@ -0,0 +1,648 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 Broadcom Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+
+/*******************************************************************************
+ *
+ * Filename: btif_gatt_multi_adv_util.c
+ *
+ * Description: Multi ADV helper implementation
+ *
+ *******************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "btu.h"
+#include "bt_target.h"
+
+#define LOG_TAG "BtGatt.btif"
+#if (BLE_INCLUDED == TRUE)
+
+#include "btif_gatt_multi_adv_util.h"
+#include "btif_common.h"
+#include <hardware/bt_gatt.h>
+#include "bta_gatt_api.h"
+#include "btif_gatt_util.h"
+
+/*******************************************************************************
+** Static variables
+********************************************************************************/
+static int multi_adv_enable_count = 0;
+static btgatt_multi_adv_common_data *p_multi_adv_com_data_cb = NULL;
+
+btgatt_multi_adv_common_data *btif_obtain_multi_adv_data_cb()
+{
+ if(0 == BTM_BleMaxMultiAdvInstanceCount())
+ {
+ BTIF_TRACE_WARNING("%s - No instances found", __FUNCTION__);
+ return NULL;
+ }
+
+ BTIF_TRACE_DEBUG("%s, Count:%d", __FUNCTION__, BTM_BleMaxMultiAdvInstanceCount());
+ if (NULL == p_multi_adv_com_data_cb)
+ {
+ BTIF_TRACE_DEBUG("Initializing in %s", __FUNCTION__);
+ p_multi_adv_com_data_cb = GKI_getbuf(sizeof(btgatt_multi_adv_common_data));
+ if (NULL != p_multi_adv_com_data_cb)
+ {
+ memset(p_multi_adv_com_data_cb, 0, sizeof(btgatt_multi_adv_common_data));
+
+ /* Storing both client_if and inst_id details */
+ p_multi_adv_com_data_cb->clntif_map =
+ GKI_getbuf(( BTM_BleMaxMultiAdvInstanceCount() * INST_ID_IDX_MAX)* sizeof(INT8));
+ memset(p_multi_adv_com_data_cb->clntif_map, 0 ,
+ ( BTM_BleMaxMultiAdvInstanceCount() * INST_ID_IDX_MAX)* sizeof(INT8));
+
+ p_multi_adv_com_data_cb->inst_cb = GKI_getbuf(( BTM_BleMaxMultiAdvInstanceCount() + 1 )
+ * sizeof(btgatt_multi_adv_inst_cb));
+ memset(p_multi_adv_com_data_cb->inst_cb, 0 ,
+ ( BTM_BleMaxMultiAdvInstanceCount() + 1) * sizeof(btgatt_multi_adv_inst_cb));
+
+ for (int i=0; i < BTM_BleMaxMultiAdvInstanceCount()*2; i += 2)
+ {
+ p_multi_adv_com_data_cb->clntif_map[i] = INVALID_ADV_INST;
+ p_multi_adv_com_data_cb->clntif_map[i+1] = INVALID_ADV_INST;
+ }
+ }
+ }
+
+ return p_multi_adv_com_data_cb;
+}
+
+void btif_gattc_init_multi_adv_cb(void)
+{
+ // TODO: Instead of using a fragile reference counter here, one could
+ // simply track the client_if instances that are in the map.
+ ++multi_adv_enable_count;
+}
+
+void btif_gattc_destroy_multi_adv_cb(int client_if)
+{
+ if (multi_adv_enable_count > 0)
+ multi_adv_enable_count --;
+
+ if(multi_adv_enable_count == 0 && p_multi_adv_com_data_cb != 0)
+ {
+ if (NULL != p_multi_adv_com_data_cb)
+ {
+ GKI_freebuf (p_multi_adv_com_data_cb->clntif_map);
+ GKI_freebuf (p_multi_adv_com_data_cb->inst_cb);
+ GKI_freebuf(p_multi_adv_com_data_cb);
+ p_multi_adv_com_data_cb = NULL;
+ }
+ }
+}
+
+int btif_multi_adv_add_instid_map(int client_if, int inst_id, BOOLEAN gen_temp_instid)
+{
+ int i=1;
+
+ btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
+ if (NULL == p_multi_adv_data_cb)
+ return INVALID_ADV_INST;
+
+ for (i=1; i < BTM_BleMaxMultiAdvInstanceCount(); i++)
+ {
+ if (client_if == p_multi_adv_data_cb->clntif_map[i + i])
+ {
+ if (!gen_temp_instid)
+ {
+ // Write the final inst_id value obtained from stack layer
+ p_multi_adv_data_cb->clntif_map[i + (i + 1)] = inst_id;
+ BTIF_TRACE_DEBUG("%s -Index: %d, Found client_if: %d", __FUNCTION__,
+ i, p_multi_adv_data_cb->clntif_map[i + i]);
+ break;
+ }
+ else
+ {
+ //Store the passed in inst_id value
+ if (inst_id != INVALID_ADV_INST)
+ p_multi_adv_data_cb->clntif_map[i + (i + 1)] = inst_id;
+ else
+ p_multi_adv_data_cb->clntif_map[i + (i + 1)] = (i + 1);
+
+ BTIF_TRACE_DEBUG("%s - Index:%d,Found client_if: %d", __FUNCTION__,
+ i, p_multi_adv_data_cb->clntif_map[i + i]);
+ break;
+ }
+ }
+ }
+
+ if (i < BTM_BleMaxMultiAdvInstanceCount())
+ return i;
+
+ // If client ID if is not found, then write both values
+ for (i=1; i < BTM_BleMaxMultiAdvInstanceCount(); i++)
+ {
+ if (INVALID_ADV_INST == p_multi_adv_data_cb->clntif_map[i + i])
+ {
+ p_multi_adv_data_cb->clntif_map[i + i] = client_if;
+ if (inst_id != INVALID_ADV_INST)
+ p_multi_adv_data_cb->clntif_map[i + (i + 1)] = inst_id;
+ else
+ p_multi_adv_data_cb->clntif_map[i + (i + 1)] = (i + 1);
+ BTIF_TRACE_DEBUG("%s -Not found - Index:%d, client_if: %d, Inst ID: %d",
+ __FUNCTION__,i,
+ p_multi_adv_data_cb->clntif_map[i + i],
+ p_multi_adv_data_cb->clntif_map[i + (i + 1)]);
+ break;
+ }
+ }
+
+ if (i < BTM_BleMaxMultiAdvInstanceCount())
+ return i;
+ return INVALID_ADV_INST;
+}
+
+int btif_multi_adv_instid_for_clientif(int client_if)
+{
+ int i=1, ret = INVALID_ADV_INST;
+
+ btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
+
+ if (NULL == p_multi_adv_data_cb)
+ return INVALID_ADV_INST;
+
+ // Retrieve the existing inst_id for the client_if value
+ for (i=1; i < BTM_BleMaxMultiAdvInstanceCount(); i++)
+ {
+ if (client_if == p_multi_adv_data_cb->clntif_map[i + i])
+ {
+ BTIF_TRACE_DEBUG("%s - Client if found", __FUNCTION__, client_if);
+ ret = p_multi_adv_data_cb->clntif_map[i + (i + 1)];
+ }
+ }
+
+ return ret;
+}
+
+int btif_gattc_obtain_idx_for_datacb(int value, int clnt_inst_index)
+{
+ int i=1;
+
+ btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
+
+ if (NULL == p_multi_adv_data_cb)
+ return INVALID_ADV_INST;
+
+ // Retrieve the array index for the inst_id value
+ for (i=1; i < BTM_BleMaxMultiAdvInstanceCount(); i++)
+ {
+ if (value == p_multi_adv_data_cb->clntif_map[i + (i + clnt_inst_index)])
+ break;
+ }
+
+ if (i < BTM_BleMaxMultiAdvInstanceCount())
+ {
+ BTIF_TRACE_DEBUG("%s, %d",__FUNCTION__,i);
+ return i;
+ }
+
+ BTIF_TRACE_DEBUG("%s Invalid instance",__FUNCTION__);
+ return INVALID_ADV_INST;
+}
+
+
+void btif_gattc_adv_data_packager(int client_if, bool set_scan_rsp,
+ bool include_name, bool include_txpower, int min_interval, int max_interval,
+ int appearance, int manufacturer_len, char* manufacturer_data,
+ int service_data_len, char* service_data, int service_uuid_len,
+ char* service_uuid, btif_adv_data_t *p_multi_adv_inst)
+{
+ memset(p_multi_adv_inst, 0 , sizeof(btif_adv_data_t));
+
+ p_multi_adv_inst->client_if = (uint8_t) client_if;
+ p_multi_adv_inst->set_scan_rsp = set_scan_rsp;
+ p_multi_adv_inst->include_name = include_name;
+ p_multi_adv_inst->include_txpower = include_txpower;
+ p_multi_adv_inst->min_interval = min_interval;
+ p_multi_adv_inst->max_interval = max_interval;
+ p_multi_adv_inst->appearance = appearance;
+ p_multi_adv_inst->manufacturer_len = manufacturer_len;
+
+ if (manufacturer_len > 0)
+ {
+ p_multi_adv_inst->p_manufacturer_data = GKI_getbuf(manufacturer_len);
+ memcpy(p_multi_adv_inst->p_manufacturer_data, manufacturer_data, manufacturer_len);
+ }
+
+ p_multi_adv_inst->service_data_len = service_data_len;
+ if (service_data_len > 0)
+ {
+ p_multi_adv_inst->p_service_data = GKI_getbuf(service_data_len);
+ memcpy(p_multi_adv_inst->p_service_data, service_data, service_data_len);
+ }
+
+ p_multi_adv_inst->service_uuid_len = service_uuid_len;
+ if (service_uuid_len > 0)
+ {
+ p_multi_adv_inst->p_service_uuid = GKI_getbuf(service_uuid_len);
+ memcpy(p_multi_adv_inst->p_service_uuid, service_uuid, service_uuid_len);
+ }
+}
+
+BOOLEAN btif_gattc_copy_datacb(int cbindex, btif_adv_data_t *p_adv_data, BOOLEAN bInstData)
+{
+ int i=0;
+ btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
+ if (NULL == p_multi_adv_data_cb || cbindex < 0)
+ return false;
+
+ BTIF_TRACE_DEBUG("%s", __FUNCTION__);
+ memset(&p_multi_adv_data_cb->inst_cb[cbindex].data, 0, sizeof(tBTA_BLE_ADV_DATA));
+ p_multi_adv_data_cb->inst_cb[cbindex].mask = 0;
+
+ p_multi_adv_data_cb->inst_cb[cbindex].is_scan_rsp = p_adv_data->set_scan_rsp ? 1 : 0;
+ if (!p_adv_data->set_scan_rsp)
+ {
+ p_multi_adv_data_cb->inst_cb[cbindex].mask = BTM_BLE_AD_BIT_FLAGS;
+ p_multi_adv_data_cb->inst_cb[cbindex].data.flag = ADV_FLAGS_GENERAL;
+ if (p_multi_adv_data_cb->inst_cb[cbindex].timeout_s)
+ p_multi_adv_data_cb->inst_cb[cbindex].data.flag = ADV_FLAGS_LIMITED;
+ if (p_multi_adv_data_cb->inst_cb[cbindex].param.adv_type == BTA_BLE_NON_CONNECT_EVT)
+ p_multi_adv_data_cb->inst_cb[cbindex].data.flag &=
+ ~(BTA_DM_LIMITED_DISC | BTA_DM_GENERAL_DISC);
+ if (p_multi_adv_data_cb->inst_cb[cbindex].data.flag == 0)
+ p_multi_adv_data_cb->inst_cb[cbindex].mask = 0;
+ }
+
+ if (p_adv_data->include_name)
+ p_multi_adv_data_cb->inst_cb[cbindex].mask |= BTM_BLE_AD_BIT_DEV_NAME;
+
+ if (p_adv_data->include_txpower)
+ p_multi_adv_data_cb->inst_cb[cbindex].mask |= BTM_BLE_AD_BIT_TX_PWR;
+
+ if (false == bInstData && p_adv_data->min_interval > 0 && p_adv_data->max_interval > 0 &&
+ p_adv_data->max_interval > p_adv_data->min_interval)
+ {
+ p_multi_adv_data_cb->inst_cb[cbindex].mask |= BTM_BLE_AD_BIT_INT_RANGE;
+ p_multi_adv_data_cb->inst_cb[cbindex].data.int_range.low =
+ p_adv_data->min_interval;
+ p_multi_adv_data_cb->inst_cb[cbindex].data.int_range.hi =
+ p_adv_data->max_interval;
+ }
+ else
+ if (true == bInstData)
+ {
+ if (p_multi_adv_data_cb->inst_cb[cbindex].param.adv_int_min > 0 &&
+ p_multi_adv_data_cb->inst_cb[cbindex].param.adv_int_max > 0 &&
+ p_multi_adv_data_cb->inst_cb[cbindex].param.adv_int_max >
+ p_multi_adv_data_cb->inst_cb[cbindex].param.adv_int_min)
+ {
+ p_multi_adv_data_cb->inst_cb[cbindex].data.int_range.low =
+ p_multi_adv_data_cb->inst_cb[cbindex].param.adv_int_min;
+ p_multi_adv_data_cb->inst_cb[cbindex].data.int_range.hi =
+ p_multi_adv_data_cb->inst_cb[cbindex].param.adv_int_max;
+ }
+
+ if (p_adv_data->include_txpower)
+ {
+ p_multi_adv_data_cb->inst_cb[cbindex].data.tx_power =
+ p_multi_adv_data_cb->inst_cb[cbindex].param.tx_power;
+ }
+ }
+
+ if (p_adv_data->appearance != 0)
+ {
+ p_multi_adv_data_cb->inst_cb[cbindex].mask |= BTM_BLE_AD_BIT_APPEARANCE;
+ p_multi_adv_data_cb->inst_cb[cbindex].data.appearance = p_adv_data->appearance;
+ }
+
+ if (p_adv_data->manufacturer_len > 0 && p_adv_data->p_manufacturer_data != NULL)
+ {
+ p_multi_adv_data_cb->inst_cb[cbindex].data.p_manu =
+ GKI_getbuf(sizeof(tBTA_BLE_MANU));
+ if (p_multi_adv_data_cb->inst_cb[cbindex].data.p_manu != NULL)
+ {
+ p_multi_adv_data_cb->inst_cb[cbindex].data.p_manu->p_val =
+ GKI_getbuf(p_adv_data->manufacturer_len);
+ if (p_multi_adv_data_cb->inst_cb[cbindex].data.p_manu->p_val != NULL)
+ {
+ p_multi_adv_data_cb->inst_cb[cbindex].mask |= BTM_BLE_AD_BIT_MANU;
+ p_multi_adv_data_cb->inst_cb[cbindex].data.p_manu->len =
+ p_adv_data->manufacturer_len;
+ memcpy(p_multi_adv_data_cb->inst_cb[cbindex].data.p_manu->p_val,
+ p_adv_data->p_manufacturer_data, p_adv_data->manufacturer_len);
+ }
+ }
+ }
+
+ tBTA_BLE_PROP_ELEM *p_elem_service_data = NULL;
+ if (p_adv_data->service_data_len > 0 && p_adv_data->p_service_data != NULL)
+ {
+ BTIF_TRACE_DEBUG("%s - In service_data", __FUNCTION__);
+ p_elem_service_data = GKI_getbuf(sizeof(tBTA_BLE_PROP_ELEM));
+ if (p_elem_service_data != NULL)
+ {
+ p_elem_service_data->p_val = GKI_getbuf(p_adv_data->service_data_len);
+ if (p_elem_service_data->p_val != NULL)
+ {
+ p_elem_service_data->adv_type = BTM_BLE_AD_TYPE_SERVICE_DATA;
+ p_elem_service_data->len = p_adv_data->service_data_len;
+ memcpy(p_elem_service_data->p_val, p_adv_data->p_service_data,
+ p_adv_data->service_data_len);
+ } else {
+ GKI_freebuf(p_elem_service_data);
+ p_elem_service_data = NULL;
+ }
+ }
+ }
+
+ if (NULL != p_elem_service_data)
+ {
+ p_multi_adv_data_cb->inst_cb[cbindex].data.p_proprietary =
+ GKI_getbuf(sizeof(tBTA_BLE_PROPRIETARY));
+ if (NULL != p_multi_adv_data_cb->inst_cb[cbindex].data.p_proprietary)
+ {
+ tBTA_BLE_PROP_ELEM *p_elem = NULL;
+ tBTA_BLE_PROPRIETARY *p_prop = p_multi_adv_data_cb->inst_cb[cbindex].data.p_proprietary;
+ p_prop->num_elem = 0;
+ p_multi_adv_data_cb->inst_cb[cbindex].mask |= BTM_BLE_AD_BIT_PROPRIETARY;
+ p_prop->num_elem = 1;
+ p_prop->p_elem = GKI_getbuf(sizeof(tBTA_BLE_PROP_ELEM) * p_prop->num_elem);
+ p_elem = p_prop->p_elem;
+ if (NULL != p_elem)
+ memcpy(p_elem++, p_elem_service_data, sizeof(tBTA_BLE_PROP_ELEM));
+ GKI_freebuf(p_elem_service_data);
+ }
+ }
+
+ if (p_adv_data->service_uuid_len > 0 && NULL != p_adv_data->p_service_uuid)
+ {
+ UINT16 *p_uuid_out16 = NULL;
+ UINT32 *p_uuid_out32 = NULL;
+ while (p_adv_data->service_uuid_len >= LEN_UUID_128)
+ {
+ bt_uuid_t uuid;
+ memset(&uuid, 0, sizeof(bt_uuid_t));
+ memcpy(&uuid.uu, p_adv_data->p_service_uuid, LEN_UUID_128);
+
+ tBT_UUID bt_uuid;
+ memset(&bt_uuid, 0, sizeof(tBT_UUID));
+ btif_to_bta_uuid(&bt_uuid, &uuid);
+
+ switch(bt_uuid.len)
+ {
+ case (LEN_UUID_16):
+ {
+ if (NULL == p_multi_adv_data_cb->inst_cb[cbindex].data.p_services)
+ {
+ p_multi_adv_data_cb->inst_cb[cbindex].data.p_services =
+ GKI_getbuf(sizeof(tBTA_BLE_SERVICE));
+ p_multi_adv_data_cb->inst_cb[cbindex].data.p_services->list_cmpl = FALSE;
+ p_multi_adv_data_cb->inst_cb[cbindex].data.p_services->num_service = 0;
+ p_multi_adv_data_cb->inst_cb[cbindex].data.p_services->p_uuid =
+ GKI_getbuf(p_adv_data->service_uuid_len / LEN_UUID_128 * LEN_UUID_16);
+ p_uuid_out16 = p_multi_adv_data_cb->inst_cb[cbindex].data.p_services->p_uuid;
+ }
+
+ if (NULL != p_multi_adv_data_cb->inst_cb[cbindex].data.p_services->p_uuid)
+ {
+ BTIF_TRACE_DEBUG("%s - In 16-UUID_data", __FUNCTION__);
+ p_multi_adv_data_cb->inst_cb[cbindex].mask |= BTM_BLE_AD_BIT_SERVICE;
+ ++p_multi_adv_data_cb->inst_cb[cbindex].data.p_services->num_service;
+ *p_uuid_out16++ = bt_uuid.uu.uuid16;
+ }
+ break;
+ }
+
+ case (LEN_UUID_32):
+ {
+ if (NULL == p_multi_adv_data_cb->inst_cb[cbindex].data.p_service_32b)
+ {
+ p_multi_adv_data_cb->inst_cb[cbindex].data.p_service_32b =
+ GKI_getbuf(sizeof(tBTA_BLE_32SERVICE));
+ p_multi_adv_data_cb->inst_cb[cbindex].data.p_service_32b->list_cmpl = FALSE;
+ p_multi_adv_data_cb->inst_cb[cbindex].data.p_service_32b->num_service = 0;
+ p_multi_adv_data_cb->inst_cb[cbindex].data.p_service_32b->p_uuid =
+ GKI_getbuf(p_adv_data->service_uuid_len / LEN_UUID_128 * LEN_UUID_32);
+ p_uuid_out32 = p_multi_adv_data_cb->inst_cb[cbindex].data.p_service_32b->p_uuid;
+ }
+
+ if (NULL != p_multi_adv_data_cb->inst_cb[cbindex].data.p_service_32b->p_uuid)
+ {
+ BTIF_TRACE_DEBUG("%s - In 32-UUID_data", __FUNCTION__);
+ p_multi_adv_data_cb->inst_cb[cbindex].mask |= BTM_BLE_AD_BIT_SERVICE_32;
+ ++p_multi_adv_data_cb->inst_cb[cbindex].data.p_service_32b->num_service;
+ *p_uuid_out32++ = bt_uuid.uu.uuid32;
+ }
+ break;
+ }
+
+ case (LEN_UUID_128):
+ {
+ /* Currently, only one 128-bit UUID is supported */
+ if (NULL == p_multi_adv_data_cb->inst_cb[cbindex].data.p_services_128b)
+ {
+ p_multi_adv_data_cb->inst_cb[cbindex].data.p_services_128b =
+ GKI_getbuf(sizeof(tBTA_BLE_128SERVICE));
+ if (NULL != p_multi_adv_data_cb->inst_cb[cbindex].data.p_services_128b)
+ {
+ BTIF_TRACE_DEBUG("%s - In 128-UUID_data", __FUNCTION__);
+ p_multi_adv_data_cb->inst_cb[cbindex].mask |= BTM_BLE_AD_BIT_SERVICE_128;
+ memcpy(p_multi_adv_data_cb->inst_cb[cbindex].data.p_services_128b->uuid128,
+ bt_uuid.uu.uuid128, LEN_UUID_128);
+ BTIF_TRACE_DEBUG("%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x", bt_uuid.uu.uuid128[0],
+ bt_uuid.uu.uuid128[1],bt_uuid.uu.uuid128[2], bt_uuid.uu.uuid128[3],
+ bt_uuid.uu.uuid128[4],bt_uuid.uu.uuid128[5],bt_uuid.uu.uuid128[6],
+ bt_uuid.uu.uuid128[7],bt_uuid.uu.uuid128[8],bt_uuid.uu.uuid128[9],
+ bt_uuid.uu.uuid128[10],bt_uuid.uu.uuid128[11],bt_uuid.uu.uuid128[12],
+ bt_uuid.uu.uuid128[13],bt_uuid.uu.uuid128[14],bt_uuid.uu.uuid128[15]);
+ p_multi_adv_data_cb->inst_cb[cbindex].data.p_services_128b->list_cmpl = TRUE;
+ }
+ }
+ break;
+ }
+
+ default:
+ break;
+ }
+
+ p_adv_data->p_service_uuid += LEN_UUID_128;
+ p_adv_data->service_uuid_len -= LEN_UUID_128;
+ }
+ }
+
+#if (defined(BLE_PERIPHERAL_ADV_NAME) && (BLE_PERIPHERAL_ADV_NAME == TRUE))
+ p_multi_adv_data_cb->inst_cb[cbindex].mask |= BTM_BLE_AD_BIT_DEV_NAME;
+#endif
+ return true;
+}
+
+void btif_gattc_clear_clientif(int client_if)
+{
+ btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
+ if (NULL == p_multi_adv_data_cb)
+ return;
+
+ // Clear both the inst_id and client_if values
+ for (int i=0; i < BTM_BleMaxMultiAdvInstanceCount()*2; i+=2)
+ {
+ if (client_if == p_multi_adv_data_cb->clntif_map[i])
+ {
+ btif_gattc_cleanup_inst_cb(p_multi_adv_data_cb->clntif_map[i+1]);
+ p_multi_adv_data_cb->clntif_map[i] = INVALID_ADV_INST;
+ p_multi_adv_data_cb->clntif_map[i+1] = INVALID_ADV_INST;
+ BTIF_TRACE_DEBUG("Cleaning up index %d for clnt_if :%d,", i/2, client_if);
+ break;
+ }
+ }
+}
+
+void btif_gattc_cleanup_inst_cb(int inst_id)
+{
+ int cbindex = 0;
+ // Check for invalid instance id
+ if (inst_id < 0 || inst_id >= BTM_BleMaxMultiAdvInstanceCount())
+ return;
+
+ btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
+ if (NULL == p_multi_adv_data_cb)
+ return;
+
+ if (inst_id > 0)
+ {
+ cbindex = btif_gattc_obtain_idx_for_datacb(inst_id, INST_ID_IDX);
+ if (cbindex < 0)
+ return;
+ } else {
+ if (STD_ADV_INSTID == inst_id)
+ cbindex = STD_ADV_INSTID;
+ }
+
+ if (inst_id != INVALID_ADV_INST)
+ {
+ BTIF_TRACE_DEBUG("Cleaning up multi_inst_cb for inst_id %d, cbindex %d", inst_id, cbindex);
+ btif_gattc_cleanup_multi_inst_cb(&p_multi_adv_data_cb->inst_cb[cbindex]);
+ p_multi_adv_data_cb->inst_cb[cbindex].inst_id = INVALID_ADV_INST;
+ }
+}
+
+void btif_gattc_cleanup_multi_inst_cb(btgatt_multi_adv_inst_cb *p_multi_inst_cb)
+{
+ if (p_multi_inst_cb == NULL)
+ return;
+
+ // Discoverability timer cleanup
+ if (p_multi_inst_cb->tle_limited_timer.in_use)
+ btu_stop_timer_oneshot(&p_multi_inst_cb->tle_limited_timer);
+
+ // Manufacturer data cleanup
+ if (p_multi_inst_cb->data.p_manu != NULL)
+ {
+ if (p_multi_inst_cb->data.p_manu->p_val != NULL)
+ GKI_freebuf(p_multi_inst_cb->data.p_manu->p_val);
+ GKI_freebuf(p_multi_inst_cb->data.p_manu);
+ }
+
+ // Proprietary data cleanup
+ if (p_multi_inst_cb->data.p_proprietary != NULL)
+ {
+ int i = 0;
+ tBTA_BLE_PROP_ELEM *p_elem = p_multi_inst_cb->data.p_proprietary->p_elem;
+ while (i++ != p_multi_inst_cb->data.p_proprietary->num_elem
+ && p_elem)
+ {
+ if (p_elem->p_val != NULL)
+ GKI_freebuf(p_elem->p_val);
+ ++p_elem;
+ }
+
+ if (p_multi_inst_cb->data.p_proprietary->p_elem != NULL)
+ GKI_freebuf(p_multi_inst_cb->data.p_proprietary->p_elem);
+ GKI_freebuf(p_multi_inst_cb->data.p_proprietary);
+ }
+
+ // Service list cleanup
+ if (p_multi_inst_cb->data.p_services != NULL)
+ {
+ if (p_multi_inst_cb->data.p_services->p_uuid != NULL)
+ GKI_freebuf(p_multi_inst_cb->data.p_services->p_uuid);
+ GKI_freebuf(p_multi_inst_cb->data.p_services);
+ }
+
+ // Service data cleanup
+ if (p_multi_inst_cb->data.p_service_data != NULL)
+ {
+ if (p_multi_inst_cb->data.p_service_data->p_val != NULL)
+ GKI_freebuf(p_multi_inst_cb->data.p_service_data->p_val);
+ GKI_freebuf(p_multi_inst_cb->data.p_service_data);
+ }
+
+ if (p_multi_inst_cb->data.p_services_128b != NULL)
+ GKI_freebuf(p_multi_inst_cb->data.p_services_128b);
+
+ if (p_multi_inst_cb->data.p_service_32b != NULL)
+ {
+ if (p_multi_inst_cb->data.p_service_32b->p_uuid != NULL)
+ GKI_freebuf(p_multi_inst_cb->data.p_service_32b->p_uuid);
+ GKI_freebuf(p_multi_inst_cb->data.p_service_32b);
+ }
+
+ if (p_multi_inst_cb->data.p_sol_services != NULL)
+ {
+ if (p_multi_inst_cb->data.p_sol_services->p_uuid != NULL)
+ GKI_freebuf(p_multi_inst_cb->data.p_sol_services->p_uuid);
+ GKI_freebuf(p_multi_inst_cb->data.p_sol_services);
+ }
+
+ if (p_multi_inst_cb->data.p_sol_service_32b != NULL)
+ {
+ if (p_multi_inst_cb->data.p_sol_service_32b->p_uuid != NULL)
+ GKI_freebuf(p_multi_inst_cb->data.p_sol_service_32b->p_uuid);
+ GKI_freebuf(p_multi_inst_cb->data.p_sol_service_32b);
+ }
+
+ if (p_multi_inst_cb->data.p_sol_service_128b != NULL)
+ GKI_freebuf(p_multi_inst_cb->data.p_sol_service_128b);
+}
+
+void btif_multi_adv_timer_ctrl(int client_if, TIMER_CBACK cb)
+{
+ int inst_id = btif_multi_adv_instid_for_clientif(client_if);
+ if (inst_id == INVALID_ADV_INST)
+ return;
+
+ int cbindex = btif_gattc_obtain_idx_for_datacb(inst_id, INST_ID_IDX);
+ if (cbindex == INVALID_ADV_INST)
+ return;
+
+ btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
+ if (p_multi_adv_data_cb == NULL)
+ return;
+
+ if (cb == NULL)
+ {
+ if (p_multi_adv_data_cb->inst_cb[cbindex].tle_limited_timer.in_use)
+ btu_stop_timer_oneshot(&p_multi_adv_data_cb->inst_cb[cbindex].tle_limited_timer);
+ } else {
+ if (p_multi_adv_data_cb->inst_cb[cbindex].timeout_s != 0)
+ {
+ if (p_multi_adv_data_cb->inst_cb[cbindex].tle_limited_timer.in_use)
+ btu_stop_timer_oneshot(&p_multi_adv_data_cb->inst_cb[cbindex].tle_limited_timer);
+
+ memset(&p_multi_adv_data_cb->inst_cb[cbindex].tle_limited_timer, 0, sizeof(TIMER_LIST_ENT));
+ p_multi_adv_data_cb->inst_cb[cbindex].tle_limited_timer.param = (UINT32)cb;
+ p_multi_adv_data_cb->inst_cb[cbindex].tle_limited_timer.data = (UINT32)client_if;
+ btu_start_timer_oneshot(&p_multi_adv_data_cb->inst_cb[cbindex].tle_limited_timer,
+ BTU_TTYPE_USER_FUNC, p_multi_adv_data_cb->inst_cb[cbindex].timeout_s);
+ }
+ }
+}
+
+#endif
diff --git a/btif/src/btif_gatt_server.c b/btif/src/btif_gatt_server.c
index 9fc4fad..503b5a3 100644
--- a/btif/src/btif_gatt_server.c
+++ b/btif/src/btif_gatt_server.c
@@ -100,9 +100,10 @@
uint8_t is_direct;
uint8_t num_handles;
uint8_t properties;
- uint8_t transport;
uint8_t confirm;
uint8_t status;
+ btgatt_transport_t transport;
+
} __attribute__((packed)) btif_gatts_cb_t;
@@ -320,6 +321,18 @@
break;
}
+ case BTA_GATTS_CONF_EVT:
+ HAL_CBACK(bt_gatt_callbacks, server->indication_sent_cb,
+ p_data->req_data.conn_id, p_data->req_data.status);
+ break;
+
+ case BTA_GATTS_CONGEST_EVT:
+ HAL_CBACK(bt_gatt_callbacks, server->congestion_cb
+ , p_data->congest.conn_id
+ , p_data->congest.congested
+ );
+ break;
+
case BTA_GATTS_MTU_EVT:
case BTA_GATTS_OPEN_EVT:
case BTA_GATTS_CANCEL_OPEN_EVT:
@@ -369,6 +382,7 @@
// Ensure device is in inquiry database
int addr_type = 0;
int device_type = 0;
+ tBTA_GATT_TRANSPORT transport = BTA_GATT_TRANSPORT_LE;
if (btif_get_device_type(p_cb->bd_addr.address, &addr_type, &device_type) == TRUE
&& device_type != BT_DEVICE_TYPE_BREDR)
@@ -378,9 +392,32 @@
if (!p_cb->is_direct)
BTA_DmBleSetBgConnType(BTM_BLE_CONN_AUTO, NULL);
+ switch(device_type)
+ {
+ case BT_DEVICE_TYPE_BREDR:
+ transport = BTA_GATT_TRANSPORT_BR_EDR;
+ break;
+
+ case BT_DEVICE_TYPE_BLE:
+ transport = BTA_GATT_TRANSPORT_LE;
+ break;
+
+ case BT_DEVICE_TYPE_DUMO:
+ if ((p_cb->transport == GATT_TRANSPORT_LE) &&
+ (btif_storage_is_dmt_supported_device(&(p_cb->bd_addr)) == TRUE))
+ transport = BTA_GATT_TRANSPORT_LE;
+ else
+ transport = BTA_GATT_TRANSPORT_BR_EDR;
+ break;
+
+ default:
+ BTIF_TRACE_ERROR (" GATT Open :Invalid device type %d",device_type);
+ return;
+ }
+
// Connect!
BTA_GATTS_Open(p_cb->server_if, p_cb->bd_addr.address,
- p_cb->is_direct);
+ p_cb->is_direct, transport);
break;
}
@@ -489,12 +526,14 @@
(char*) &btif_cb, sizeof(btif_gatts_cb_t), NULL);
}
-static bt_status_t btif_gatts_open( int server_if, const bt_bdaddr_t *bd_addr, bool is_direct )
+static bt_status_t btif_gatts_open( int server_if, const bt_bdaddr_t *bd_addr,
+ bool is_direct, int transport )
{
CHECK_BTGATT_INIT();
btif_gatts_cb_t btif_cb;
btif_cb.server_if = (uint8_t) server_if;
btif_cb.is_direct = is_direct ? 1 : 0;
+ btif_cb.transport = (btgatt_transport_t)transport;
bdcpy(btif_cb.bd_addr.address, bd_addr->address);
return btif_transfer_context(btgatts_handle_event, BTIF_GATTS_OPEN,
(char*) &btif_cb, sizeof(btif_gatts_cb_t), NULL);
diff --git a/btif/src/btif_gatt_test.c b/btif/src/btif_gatt_test.c
index a2cca6a..4d71ad9 100644
--- a/btif/src/btif_gatt_test.c
+++ b/btif/src/btif_gatt_test.c
@@ -101,11 +101,12 @@
}
static void btif_test_connect_cback(tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id,
- BOOLEAN connected, tGATT_DISCONN_REASON reason)
+ BOOLEAN connected, tGATT_DISCONN_REASON reason, tBT_TRANSPORT transport)
{
UNUSED(gatt_if);
UNUSED(bda);
UNUSED(reason);
+ UNUSED (transport);
ALOGD("%s: conn_id=%d, connected=%d", __FUNCTION__, conn_id, connected);
test_cb.conn_id = connected ? conn_id : 0;
@@ -205,6 +206,7 @@
btif_test_discovery_result_cback,
btif_test_discovery_complete_cback,
NULL,
+ NULL,
NULL
};
@@ -232,17 +234,17 @@
case 0x02: /* Connect */
{
- ALOGD("%s: CONNECT - device=%02x:%02x:%02x:%02x:%02x:%02x (dev_type=%d)",
+ ALOGD("%s: CONNECT - device=%02x:%02x:%02x:%02x:%02x:%02x (dev_type=%d, addr_type=%d)",
__FUNCTION__,
params->bda1->address[0], params->bda1->address[1],
params->bda1->address[2], params->bda1->address[3],
params->bda1->address[4], params->bda1->address[5],
- params->u1);
+ params->u1, params->u2);
if (params->u1 == BT_DEVICE_TYPE_BLE)
- BTM_SecAddBleDevice(params->bda1->address, NULL, BT_DEVICE_TYPE_BLE, 0);
+ BTM_SecAddBleDevice(params->bda1->address, NULL, BT_DEVICE_TYPE_BLE, params->u2);
- if ( !GATT_Connect(test_cb.gatt_if, params->bda1->address, TRUE) )
+ if ( !GATT_Connect(test_cb.gatt_if, params->bda1->address, TRUE, BT_TRANSPORT_LE) )
{
ALOGE("%s: GATT_Connect failed!", __FUNCTION__);
}
diff --git a/btif/src/btif_gatt_util.c b/btif/src/btif_gatt_util.c
index 715dcd6..348bcea 100644
--- a/btif/src/btif_gatt_util.c
+++ b/btif/src/btif_gatt_util.c
@@ -43,13 +43,11 @@
#define GATTC_READ_VALUE_TYPE_VALUE 0x0000 /* Attribute value itself */
#define GATTC_READ_VALUE_TYPE_AGG_FORMAT 0x2905 /* Characteristic Aggregate Format*/
-static char BASE_UUID[16] = {
+static unsigned char BASE_UUID[16] = {
0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80,
0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
-extern bt_status_t btif_dm_remove_bond(const bt_bdaddr_t *bd_addr);
-
int uuidType(unsigned char* p_uuid)
{
int i = 0;
@@ -131,6 +129,32 @@
memcpy(p_dest->attr_value.value, p_src->attr_value.value, GATT_MAX_ATTR_LEN);
}
+void btif_to_bta_uuid_mask(tBTA_DM_BLE_PF_COND_MASK *p_mask, bt_uuid_t *p_src)
+{
+ char *p_byte = (char*)p_src;
+ int i = 0;
+
+ switch (uuidType(p_src->uu))
+ {
+ case LEN_UUID_16:
+ p_mask->uuid16_mask = (p_src->uu[13] << 8) + p_src->uu[12];
+ break;
+
+ case LEN_UUID_32:
+ p_mask->uuid32_mask = (p_src->uu[13] << 8) + p_src->uu[12];
+ p_mask->uuid32_mask += (p_src->uu[15] << 24) + (p_src->uu[14] << 16);
+ break;
+
+ case LEN_UUID_128:
+ for(i = 0; i != 16; ++i)
+ p_mask->uuid128_mask[i] = p_byte[i];
+ break;
+
+ default:
+ break;
+ }
+}
+
/*******************************************************************************
* BTA -> BTIF conversion functions
*******************************************************************************/
@@ -259,7 +283,7 @@
* Encrypted link map handling
*******************************************************************************/
-static void btif_gatt_set_encryption_cb (BD_ADDR bd_addr, tBTA_STATUS result);
+static void btif_gatt_set_encryption_cb (BD_ADDR bd_addr, tBTA_TRANSPORT transport, tBTA_STATUS result);
static BOOLEAN btif_gatt_is_link_encrypted (BD_ADDR bd_addr)
{
@@ -269,14 +293,14 @@
return BTA_JvIsEncrypted(bd_addr);
}
-static void btif_gatt_set_encryption_cb (BD_ADDR bd_addr, tBTA_STATUS result)
+static void btif_gatt_set_encryption_cb (BD_ADDR bd_addr, tBTA_TRANSPORT transport, tBTA_STATUS result)
{
+ UNUSED(bd_addr);
+ UNUSED(transport);
+
if (result != BTA_SUCCESS && result != BTA_BUSY)
{
- bt_bdaddr_t bda;
- bdcpy(bda.address, bd_addr);
-
- btif_dm_remove_bond(&bda);
+ BTIF_TRACE_WARNING("%s() - Encryption failed (%d)", __FUNCTION__, result);
}
}
@@ -286,16 +310,39 @@
bt_bdaddr_t bda;
bdcpy(bda.address, bd_addr);
+ int device_type = 0;
+ int addr_type = 0;
+#if (!defined(BLE_DELAY_REQUEST_ENC) || (BLE_DELAY_REQUEST_ENC == FALSE))
if ((btif_storage_get_ble_bonding_key(&bda, BTIF_DM_LE_KEY_PENC,
buf, sizeof(btif_dm_ble_penc_keys_t)) == BT_STATUS_SUCCESS)
&& !btif_gatt_is_link_encrypted(bd_addr))
{
-#if (!defined(BLE_DELAY_REQUEST_ENC) || (BLE_DELAY_REQUEST_ENC == FALSE))
- BTA_DmSetEncryption(bd_addr,
+ tBTA_GATT_TRANSPORT transport = BTA_GATT_TRANSPORT_LE;
+
+ btif_get_device_type(bd_addr, &addr_type, &device_type);
+ switch(device_type)
+ {
+ case BT_DEVICE_TYPE_BREDR:
+ transport = BTA_GATT_TRANSPORT_BR_EDR;
+ break;
+
+ case BT_DEVICE_TYPE_BLE:
+ transport = BTA_GATT_TRANSPORT_LE;
+ break;
+
+ case BT_DEVICE_TYPE_DUMO:
+ transport = BTA_GATT_TRANSPORT_LE_BR_EDR;
+ break;
+
+ default:
+ BTIF_TRACE_ERROR (" GATT Encrypt :Invalid device type %d",device_type);
+ return;
+ }
+ BTA_DmSetEncryption(bd_addr,transport,
&btif_gatt_set_encryption_cb, BTM_BLE_SEC_ENCRYPT);
-#endif
}
+#endif
}
/*******************************************************************************
diff --git a/btif/src/btif_hf.c b/btif/src/btif_hf.c
index b4ade0d..c0cc4df 100644
--- a/btif/src/btif_hf.c
+++ b/btif/src/btif_hf.c
@@ -60,6 +60,19 @@
#define BTIF_HF_SECURITY (BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT)
#endif
+#if (BTM_WBS_INCLUDED == TRUE )
+#ifndef BTIF_HF_FEATURES
+#define BTIF_HF_FEATURES ( BTA_AG_FEAT_3WAY | \
+ BTA_AG_FEAT_ECNR | \
+ BTA_AG_FEAT_REJECT | \
+ BTA_AG_FEAT_ECS | \
+ BTA_AG_FEAT_EXTERR | \
+ BTA_AG_FEAT_BTRH | \
+ BTA_AG_FEAT_VREC | \
+ BTA_AG_FEAT_CODEC |\
+ BTA_AG_FEAT_UNAT)
+#endif
+#else
#ifndef BTIF_HF_FEATURES
#define BTIF_HF_FEATURES ( BTA_AG_FEAT_3WAY | \
BTA_AG_FEAT_ECNR | \
@@ -70,11 +83,33 @@
BTA_AG_FEAT_VREC | \
BTA_AG_FEAT_UNAT)
#endif
-
-#define BTIF_HF_ID_1 0
+#endif
#define BTIF_HF_CALL_END_TIMEOUT 6
+#define BTIF_HF_INVALID_IDX -1
+
+/* Number of BTIF-HF control blocks */
+#define BTIF_HF_NUM_CB 2
+
+/* Max HF clients supported from App */
+UINT16 btif_max_hf_clients = -1;
+
+/* HF app ids for service registration */
+typedef enum {
+ BTIF_HF_ID_1 = 0,
+ BTIF_HF_ID_2,
+#if (BTIF_HF_NUM_CB == 3)
+ BTIF_HF_ID_3
+#endif
+} bthf_hf_id_t;
+
+UINT16 bthf_hf_id[BTIF_HF_NUM_CB] = {BTIF_HF_ID_1, BTIF_HF_ID_2,
+ #if (BTIF_HF_NUM_CB == 3)
+ BTIF_HF_ID_3
+ #endif
+ };
+
/************************************************************************************
** Local type definitions
************************************************************************************/
@@ -83,30 +118,31 @@
** Static variables
************************************************************************************/
static bthf_callbacks_t *bt_hf_callbacks = NULL;
+static int hf_idx = BTIF_HF_INVALID_IDX;
#define CHECK_BTHF_INIT() if (bt_hf_callbacks == NULL)\
{\
- BTIF_TRACE_WARNING1("BTHF: %s: BTHF not initialized", __FUNCTION__);\
+ BTIF_TRACE_WARNING("BTHF: %s: BTHF not initialized", __FUNCTION__);\
return BT_STATUS_NOT_READY;\
}\
else\
{\
- BTIF_TRACE_EVENT1("BTHF: %s", __FUNCTION__);\
+ BTIF_TRACE_EVENT("BTHF: %s", __FUNCTION__);\
}
#define CHECK_BTHF_SLC_CONNECTED() if (bt_hf_callbacks == NULL)\
{\
- BTIF_TRACE_WARNING1("BTHF: %s: BTHF not initialized", __FUNCTION__);\
+ BTIF_TRACE_WARNING("BTHF: %s: BTHF not initialized", __FUNCTION__);\
return BT_STATUS_NOT_READY;\
}\
else if (btif_hf_cb.state != BTHF_CONNECTION_STATE_SLC_CONNECTED)\
{\
- BTIF_TRACE_WARNING2("BTHF: %s: SLC connection not up. state=%s", __FUNCTION__, dump_hf_conn_state(btif_hf_cb.state));\
+ BTIF_TRACE_WARNING("BTHF: %s: SLC connection not up. state=%s", __FUNCTION__, dump_hf_conn_state(btif_hf_cb.state));\
return BT_STATUS_NOT_READY;\
}\
else\
{\
- BTIF_TRACE_EVENT1("BTHF: %s", __FUNCTION__);\
+ BTIF_TRACE_EVENT("BTHF: %s", __FUNCTION__);\
}
/* BTIF-HF control block to map bdaddr to BTA handle */
@@ -120,10 +156,11 @@
int num_active;
int num_held;
struct timespec call_end_timestamp;
+ struct timespec connected_timestamp;
bthf_call_state_t call_setup_state;
} btif_hf_cb_t;
-static btif_hf_cb_t btif_hf_cb;
+static btif_hf_cb_t btif_hf_cb[BTIF_HF_NUM_CB];
/************************************************************************************
@@ -133,6 +170,14 @@
/************************************************************************************
** Externs
************************************************************************************/
+/* By default, even though codec negotiation is enabled, we will not use WBS as the default
+* codec unless this variable is set to TRUE.
+*/
+#ifndef BTIF_HF_WBS_PREFERRED
+#define BTIF_HF_WBS_PREFERRED FALSE
+#endif
+
+BOOLEAN btif_conf_hf_force_wbs = BTIF_HF_WBS_PREFERRED;
/************************************************************************************
** Functions
@@ -149,15 +194,41 @@
*******************************************************************************/
static BOOLEAN is_connected(bt_bdaddr_t *bd_addr)
{
- if (((btif_hf_cb.state == BTHF_CONNECTION_STATE_CONNECTED) || (btif_hf_cb.state == BTHF_CONNECTION_STATE_SLC_CONNECTED))&&
- ((bd_addr == NULL) || (bdcmp(bd_addr->address, btif_hf_cb.connected_bda.address) == 0)))
- return TRUE;
- else
+ int i;
+ for (i = 0; i < btif_max_hf_clients; ++i)
+ {
+ if (((btif_hf_cb[i].state == BTHF_CONNECTION_STATE_CONNECTED) ||
+ (btif_hf_cb[i].state == BTHF_CONNECTION_STATE_SLC_CONNECTED)) &&
+ ((bd_addr == NULL) || (bdcmp(bd_addr->address,
+ btif_hf_cb[i].connected_bda.address) == 0)))
+ return TRUE;
+ }
return FALSE;
}
/*******************************************************************************
**
+** Function btif_hf_idx_by_bdaddr
+**
+** Description Internal function to get idx by bdaddr
+**
+** Returns idx
+**
+*******************************************************************************/
+static int btif_hf_idx_by_bdaddr(bt_bdaddr_t *bd_addr)
+{
+ int i;
+ for (i = 0; i < btif_max_hf_clients; ++i)
+ {
+ if ((bdcmp(bd_addr->address,
+ btif_hf_cb[i].connected_bda.address) == 0))
+ return i;
+ }
+ return BTIF_HF_INVALID_IDX;
+}
+
+/*******************************************************************************
+**
** Function callstate_to_callsetup
**
** Description Converts HAL call state to BTA call setup indicator value
@@ -187,7 +258,7 @@
** Returns void
**
*******************************************************************************/
-static void send_at_result(UINT8 ok_flag, UINT16 errcode)
+static void send_at_result(UINT8 ok_flag, UINT16 errcode, int idx)
{
tBTA_AG_RES_DATA ag_res;
memset (&ag_res, 0, sizeof (ag_res));
@@ -198,7 +269,7 @@
ag_res.errcode = errcode;
}
- BTA_AgResult (btif_hf_cb.handle, BTA_AG_UNAT_RES, &ag_res);
+ BTA_AgResult (btif_hf_cb[idx].handle, BTA_AG_UNAT_RES, &ag_res);
}
/*******************************************************************************
@@ -221,12 +292,77 @@
BTA_AgResult(BTA_AG_HANDLE_ALL, BTA_AG_IND_RES, &ag_res);
}
-void clear_phone_state()
+void clear_phone_state_multihf(int idx)
{
- btif_hf_cb.call_setup_state = BTHF_CALL_STATE_IDLE;
- btif_hf_cb.num_active = btif_hf_cb.num_held = 0;
+ btif_hf_cb[idx].call_setup_state = BTHF_CALL_STATE_IDLE;
+ btif_hf_cb[idx].num_active = btif_hf_cb[idx].num_held = 0;
}
+/*******************************************************************************
+**
+** Function btif_hf_latest_connected_idx
+**
+** Description Returns idx for latest connected HF
+**
+** Returns int
+**
+*******************************************************************************/
+static int btif_hf_latest_connected_idx()
+{
+ struct timespec now, conn_time_delta;
+ int latest_conn_idx = BTIF_HF_INVALID_IDX, i;
+
+ clock_gettime(CLOCK_MONOTONIC, &now);
+ conn_time_delta.tv_sec = now.tv_sec;
+
+ for (i = 0; i < btif_max_hf_clients; i++)
+ {
+ if (btif_hf_cb[i].state == BTHF_CONNECTION_STATE_SLC_CONNECTED)
+ {
+ if ((now.tv_sec - btif_hf_cb[i].connected_timestamp.tv_sec)
+ < conn_time_delta.tv_sec)
+ {
+ conn_time_delta.tv_sec =
+ now.tv_sec - btif_hf_cb[i].connected_timestamp.tv_sec;
+ latest_conn_idx = i;
+ }
+ }
+ }
+ return latest_conn_idx;
+}
+
+/*******************************************************************************
+**
+** Function btif_hf_check_if_slc_connected
+**
+** Description Returns BT_STATUS_SUCCESS if SLC is up for any HF
+**
+** Returns bt_status_t
+**
+*******************************************************************************/
+static bt_status_t btif_hf_check_if_slc_connected()
+{
+ if (bt_hf_callbacks == NULL)
+ {
+ BTIF_TRACE_WARNING("BTHF: %s: BTHF not initialized", __FUNCTION__);
+ return BT_STATUS_NOT_READY;
+ }
+ else
+ {
+ int i;
+ for (i = 0; i < btif_max_hf_clients; i++)
+ {
+ if ((btif_hf_cb[i].state == BTHF_CONNECTION_STATE_SLC_CONNECTED))
+ {
+ BTIF_TRACE_EVENT("BTHF: %s: slc connected for idx = %d",
+ __FUNCTION__, i);
+ return BT_STATUS_SUCCESS;
+ }
+ }
+ BTIF_TRACE_WARNING("BTHF: %s: No SLC connection up", __FUNCTION__);
+ return BT_STATUS_NOT_READY;
+ }
+}
/*****************************************************************************
** Section name (Group of functions)
@@ -252,8 +388,10 @@
{
tBTA_AG *p_data = (tBTA_AG *)p_param;
bdstr_t bdstr;
+ bt_bdaddr_t addr;
+ int idx = p_data->hdr.handle - 1;
- BTIF_TRACE_DEBUG2("%s: event=%s", __FUNCTION__, dump_hf_event(event));
+ BTIF_TRACE_DEBUG("%s: event=%s", __FUNCTION__, dump_hf_event(event));
switch (event)
{
@@ -262,43 +400,54 @@
break;
case BTA_AG_REGISTER_EVT:
- btif_hf_cb.handle = p_data->reg.hdr.handle;
+ btif_hf_cb[idx].handle = p_data->reg.hdr.handle;
+ BTIF_TRACE_DEBUG("%s: BTA_AG_REGISTER_EVT,"
+ "btif_hf_cb.handle = %d", __FUNCTION__, btif_hf_cb[idx].handle);
break;
case BTA_AG_OPEN_EVT:
if (p_data->open.status == BTA_AG_SUCCESS)
{
- bdcpy(btif_hf_cb.connected_bda.address, p_data->open.bd_addr);
- btif_hf_cb.state = BTHF_CONNECTION_STATE_CONNECTED;
- btif_hf_cb.peer_feat = 0;
- clear_phone_state();
+ bdcpy(btif_hf_cb[idx].connected_bda.address,
+ p_data->open.bd_addr);
+ btif_hf_cb[idx].state = BTHF_CONNECTION_STATE_CONNECTED;
+ btif_hf_cb[idx].peer_feat = 0;
+ clear_phone_state_multihf(idx);
}
- else if (btif_hf_cb.state == BTHF_CONNECTION_STATE_CONNECTING)
+ else if (btif_hf_cb[idx].state == BTHF_CONNECTION_STATE_CONNECTING)
{
- btif_hf_cb.state = BTHF_CONNECTION_STATE_DISCONNECTED;
+ btif_hf_cb[idx].state = BTHF_CONNECTION_STATE_DISCONNECTED;
}
else
{
- BTIF_TRACE_WARNING4("%s: AG open failed, but another device connected. status=%d state=%d connected device=%s",
- __FUNCTION__, p_data->open.status, btif_hf_cb.state, bd2str(&btif_hf_cb.connected_bda, &bdstr));
+ BTIF_TRACE_WARNING("%s: AG open failed, but another device connected. status=%d state=%d connected device=%s",
+ __FUNCTION__, p_data->open.status, btif_hf_cb[idx].state,
+ bd2str(&btif_hf_cb[idx].connected_bda, &bdstr));
break;
}
- HAL_CBACK(bt_hf_callbacks, connection_state_cb, btif_hf_cb.state, &btif_hf_cb.connected_bda);
+ HAL_CBACK(bt_hf_callbacks, connection_state_cb, btif_hf_cb[idx].state,
+ &btif_hf_cb[idx].connected_bda);
- if (btif_hf_cb.state == BTHF_CONNECTION_STATE_DISCONNECTED)
- bdsetany(btif_hf_cb.connected_bda.address);
+ if (btif_hf_cb[idx].state == BTHF_CONNECTION_STATE_DISCONNECTED)
+ bdsetany(btif_hf_cb[idx].connected_bda.address);
if (p_data->open.status != BTA_AG_SUCCESS)
btif_queue_advance();
break;
case BTA_AG_CLOSE_EVT:
- btif_hf_cb.state = BTHF_CONNECTION_STATE_DISCONNECTED;
- HAL_CBACK(bt_hf_callbacks, connection_state_cb, btif_hf_cb.state, &btif_hf_cb.connected_bda);
- bdsetany(btif_hf_cb.connected_bda.address);
- btif_hf_cb.peer_feat = 0;
- clear_phone_state();
+ btif_hf_cb[idx].connected_timestamp.tv_sec = 0;
+ btif_hf_cb[idx].state = BTHF_CONNECTION_STATE_DISCONNECTED;
+ BTIF_TRACE_DEBUG("%s: BTA_AG_CLOSE_EVT,"
+ "idx = %d, btif_hf_cb.handle = %d", __FUNCTION__, idx,
+ btif_hf_cb[idx].handle);
+ HAL_CBACK(bt_hf_callbacks, connection_state_cb, btif_hf_cb[idx].state,
+ &btif_hf_cb[idx].connected_bda);
+ bdsetany(btif_hf_cb[idx].connected_bda.address);
+ btif_hf_cb[idx].peer_feat = 0;
+ clear_phone_state_multihf(idx);
+ hf_idx = btif_hf_latest_connected_idx();
/* If AG_OPEN was received but SLC was not setup in a specified time (10 seconds),
** then AG_CLOSE may be received. We need to advance the queue here
*/
@@ -306,60 +455,87 @@
break;
case BTA_AG_CONN_EVT:
- btif_hf_cb.peer_feat = p_data->conn.peer_feat;
- btif_hf_cb.state = BTHF_CONNECTION_STATE_SLC_CONNECTED;
+ clock_gettime(CLOCK_MONOTONIC,
+ &btif_hf_cb[idx].connected_timestamp);
+ BTIF_TRACE_DEBUG("%s: BTA_AG_CONN_EVT, idx = %d ",
+ __FUNCTION__, idx);
+ btif_hf_cb[idx].peer_feat = p_data->conn.peer_feat;
+ btif_hf_cb[idx].state = BTHF_CONNECTION_STATE_SLC_CONNECTED;
+ hf_idx = btif_hf_latest_connected_idx();
- HAL_CBACK(bt_hf_callbacks, connection_state_cb, btif_hf_cb.state,
- &btif_hf_cb.connected_bda);
+ HAL_CBACK(bt_hf_callbacks, connection_state_cb, btif_hf_cb[idx].state,
+ &btif_hf_cb[idx].connected_bda);
btif_queue_advance();
break;
case BTA_AG_AUDIO_OPEN_EVT:
- HAL_CBACK(bt_hf_callbacks, audio_state_cb, BTHF_AUDIO_STATE_CONNECTED, &btif_hf_cb.connected_bda);
+ hf_idx = idx;
+ HAL_CBACK(bt_hf_callbacks, audio_state_cb, BTHF_AUDIO_STATE_CONNECTED,
+ &btif_hf_cb[idx].connected_bda);
break;
case BTA_AG_AUDIO_CLOSE_EVT:
- HAL_CBACK(bt_hf_callbacks, audio_state_cb, BTHF_AUDIO_STATE_DISCONNECTED, &btif_hf_cb.connected_bda);
+ HAL_CBACK(bt_hf_callbacks, audio_state_cb, BTHF_AUDIO_STATE_DISCONNECTED,
+ &btif_hf_cb[idx].connected_bda);
break;
/* BTA auto-responds, silently discard */
case BTA_AG_SPK_EVT:
case BTA_AG_MIC_EVT:
HAL_CBACK(bt_hf_callbacks, volume_cmd_cb,
- (event == BTA_AG_SPK_EVT) ? BTHF_VOLUME_TYPE_SPK : BTHF_VOLUME_TYPE_MIC, p_data->val.num);
+ (event == BTA_AG_SPK_EVT) ? BTHF_VOLUME_TYPE_SPK :
+ BTHF_VOLUME_TYPE_MIC, p_data->val.num,
+ &btif_hf_cb[idx].connected_bda);
break;
case BTA_AG_AT_A_EVT:
- HAL_CBACK(bt_hf_callbacks, answer_call_cmd_cb);
+ if ((btif_hf_cb[0].num_held + btif_hf_cb[0].num_active) == 0)
+ hf_idx = idx;
+ else
+ BTIF_TRACE_DEBUG("Donot set hf_idx for ATA since already in a call");
+
+ HAL_CBACK(bt_hf_callbacks, answer_call_cmd_cb,
+ &btif_hf_cb[idx].connected_bda);
break;
/* Java needs to send OK/ERROR for these commands */
case BTA_AG_AT_BLDN_EVT:
case BTA_AG_AT_D_EVT:
+ if ((btif_hf_cb[0].num_held + btif_hf_cb[0].num_active) == 0)
+ hf_idx = idx;
+ else
+ BTIF_TRACE_DEBUG("Donot set hf_idx for BLDN/D since already in a call");
+
HAL_CBACK(bt_hf_callbacks, dial_call_cmd_cb,
- (event == BTA_AG_AT_D_EVT) ? p_data->val.str : NULL);
+ (event == BTA_AG_AT_D_EVT) ? p_data->val.str : NULL,
+ &btif_hf_cb[idx].connected_bda);
break;
case BTA_AG_AT_CHUP_EVT:
- HAL_CBACK(bt_hf_callbacks, hangup_call_cmd_cb);
+ HAL_CBACK(bt_hf_callbacks, hangup_call_cmd_cb,
+ &btif_hf_cb[idx].connected_bda);
break;
case BTA_AG_AT_CIND_EVT:
- HAL_CBACK(bt_hf_callbacks, cind_cmd_cb);
+ HAL_CBACK(bt_hf_callbacks, cind_cmd_cb,
+ &btif_hf_cb[idx].connected_bda);
break;
case BTA_AG_AT_VTS_EVT:
- HAL_CBACK(bt_hf_callbacks, dtmf_cmd_cb, p_data->val.str[0]);
+ HAL_CBACK(bt_hf_callbacks, dtmf_cmd_cb, p_data->val.str[0],
+ &btif_hf_cb[idx].connected_bda);
break;
case BTA_AG_AT_BVRA_EVT:
HAL_CBACK(bt_hf_callbacks, vr_cmd_cb,
- (p_data->val.num == 1) ? BTHF_VR_STATE_STARTED : BTHF_VR_STATE_STOPPED);
+ (p_data->val.num == 1) ? BTHF_VR_STATE_STARTED :
+ BTHF_VR_STATE_STOPPED, &btif_hf_cb[idx].connected_bda);
break;
case BTA_AG_AT_NREC_EVT:
HAL_CBACK(bt_hf_callbacks, nrec_cmd_cb,
- (p_data->val.num == 1) ? BTHF_NREC_START : BTHF_NREC_STOP);
+ (p_data->val.num == 1) ? BTHF_NREC_START : BTHF_NREC_STOP,
+ &btif_hf_cb[idx].connected_bda);
break;
/* TODO: Add a callback for CBC */
@@ -367,40 +543,80 @@
break;
case BTA_AG_AT_CKPD_EVT:
- HAL_CBACK(bt_hf_callbacks, key_pressed_cmd_cb);
+ HAL_CBACK(bt_hf_callbacks, key_pressed_cmd_cb,
+ &btif_hf_cb[idx].connected_bda);
break;
+#if (BTM_WBS_INCLUDED == TRUE )
+ case BTA_AG_WBS_EVT:
+ BTIF_TRACE_DEBUG("BTA_AG_WBS_EVT Set codec status %d codec %d 1=CVSD 2=MSBC", \
+ p_data->val.hdr.status, p_data->val.num);
+ if(p_data->val.num == BTA_AG_CODEC_CVSD)
+ { HAL_CBACK(bt_hf_callbacks, wbs_cb, BTHF_WBS_NO, &btif_hf_cb[idx].connected_bda);}
+ else if(p_data->val.num == BTA_AG_CODEC_MSBC)
+ {HAL_CBACK(bt_hf_callbacks, wbs_cb, BTHF_WBS_YES, &btif_hf_cb[idx].connected_bda);}
+ else
+ {HAL_CBACK(bt_hf_callbacks, wbs_cb, BTHF_WBS_NONE, &btif_hf_cb[idx].connected_bda);}
+ break;
+#endif
/* Java needs to send OK/ERROR for these commands */
case BTA_AG_AT_CHLD_EVT:
- HAL_CBACK(bt_hf_callbacks, chld_cmd_cb, atoi(p_data->val.str));
+ HAL_CBACK(bt_hf_callbacks, chld_cmd_cb, atoi(p_data->val.str),
+ &btif_hf_cb[idx].connected_bda);
break;
case BTA_AG_AT_CLCC_EVT:
- HAL_CBACK(bt_hf_callbacks, clcc_cmd_cb, p_data->val.num);
+ HAL_CBACK(bt_hf_callbacks, clcc_cmd_cb,
+ &btif_hf_cb[idx].connected_bda);
break;
case BTA_AG_AT_COPS_EVT:
- HAL_CBACK(bt_hf_callbacks, cops_cmd_cb);
+ HAL_CBACK(bt_hf_callbacks, cops_cmd_cb,
+ &btif_hf_cb[idx].connected_bda);
break;
case BTA_AG_AT_UNAT_EVT:
- HAL_CBACK(bt_hf_callbacks, unknown_at_cmd_cb,
- p_data->val.str);
+ HAL_CBACK(bt_hf_callbacks, unknown_at_cmd_cb, p_data->val.str,
+ &btif_hf_cb[idx].connected_bda);
break;
case BTA_AG_AT_CNUM_EVT:
- HAL_CBACK(bt_hf_callbacks, cnum_cmd_cb);
+ HAL_CBACK(bt_hf_callbacks, cnum_cmd_cb,
+ &btif_hf_cb[idx].connected_bda);
break;
/* TODO: Some of these commands may need to be sent to app. For now respond with error */
case BTA_AG_AT_BINP_EVT:
case BTA_AG_AT_BTRH_EVT:
- send_at_result(BTA_AG_OK_ERROR, BTA_AG_ERR_OP_NOT_SUPPORTED);
+ send_at_result(BTA_AG_OK_ERROR, BTA_AG_ERR_OP_NOT_SUPPORTED, idx);
+ break;
+ case BTA_AG_AT_BAC_EVT:
+ BTIF_TRACE_DEBUG("AG Bitmap of peer-codecs %d", p_data->val.num);
+#if (BTM_WBS_INCLUDED == TRUE )
+ /* If the peer supports mSBC and the BTIF prefferred codec is also mSBC, then
+ we should set the BTA AG Codec to mSBC. This would trigger a +BCS to mSBC at the time
+ of SCO connection establishment */
+ if ((btif_conf_hf_force_wbs == TRUE) && (p_data->val.num & BTA_AG_CODEC_MSBC))
+ {
+ BTIF_TRACE_EVENT("%s btif_hf override-Preferred Codec to MSBC", __FUNCTION__);
+ BTA_AgSetCodec(btif_hf_cb[idx].handle,BTA_AG_CODEC_MSBC);
+ }
+ else
+ {
+ BTIF_TRACE_EVENT("%s btif_hf override-Preferred Codec to CVSD", __FUNCTION__);
+ BTA_AgSetCodec(btif_hf_cb[idx].handle,BTA_AG_CODEC_CVSD);
+ }
+#endif
+ break;
+ case BTA_AG_AT_BCS_EVT:
+ BTIF_TRACE_DEBUG("AG final seleded codec is %d 1=CVSD 2=MSBC", p_data->val.num);
+ /* no BTHF_WBS_NONE case, becuase HF1.6 supported device can send BCS */
+ HAL_CBACK(bt_hf_callbacks, wbs_cb,(p_data->val.num == BTA_AG_CODEC_MSBC) ? \
+ BTHF_WBS_YES : BTHF_WBS_NO, &btif_hf_cb[idx].connected_bda);
break;
-
default:
- BTIF_TRACE_WARNING2("%s: Unhandled event: %d", __FUNCTION__, event);
+ BTIF_TRACE_WARNING("%s: Unhandled event: %d", __FUNCTION__, event);
break;
}
}
@@ -452,18 +668,18 @@
*******************************************************************************/
static void btif_in_hf_generic_evt(UINT16 event, char *p_param)
{
- UNUSED(p_param);
+ int idx = btif_hf_idx_by_bdaddr((bt_bdaddr_t *)p_param);
- BTIF_TRACE_EVENT2("%s: event=%d", __FUNCTION__, event);
+ BTIF_TRACE_EVENT("%s: event=%d", __FUNCTION__, event);
switch (event) {
case BTIF_HFP_CB_AUDIO_CONNECTING:
{
HAL_CBACK(bt_hf_callbacks, audio_state_cb, BTHF_AUDIO_STATE_CONNECTING,
- &btif_hf_cb.connected_bda);
+ &btif_hf_cb[idx].connected_bda);
} break;
default:
{
- BTIF_TRACE_WARNING2("%s : Unknown event 0x%x", __FUNCTION__, event);
+ BTIF_TRACE_WARNING("%s : Unknown event 0x%x", __FUNCTION__, event);
}
break;
}
@@ -479,9 +695,10 @@
** Returns bt_status_t
**
*******************************************************************************/
-static bt_status_t init( bthf_callbacks_t* callbacks )
+static bt_status_t init( bthf_callbacks_t* callbacks, int max_hf_clients)
{
- BTIF_TRACE_EVENT1("%s", __FUNCTION__);
+ BTIF_TRACE_EVENT("%s", __FUNCTION__);
+ int i;
bt_hf_callbacks = callbacks;
@@ -495,8 +712,13 @@
btif_enable_service(BTA_HSP_SERVICE_ID);
#endif
- memset(&btif_hf_cb, 0, sizeof(btif_hf_cb_t));
- clear_phone_state();
+ memset(&btif_hf_cb, 0, sizeof(btif_hf_cb));
+ btif_max_hf_clients = max_hf_clients;
+ BTIF_TRACE_DEBUG("btif_max_hf_clients = %d", btif_max_hf_clients);
+ for (i = 0; i < btif_max_hf_clients; i++)
+ {
+ clear_phone_state_multihf(i);
+ }
return BT_STATUS_SUCCESS;
}
@@ -510,14 +732,28 @@
** Returns bt_status_t
**
*******************************************************************************/
-static bt_status_t connect_int( bt_bdaddr_t *bd_addr )
+static bt_status_t connect_int(bt_bdaddr_t *bd_addr, uint16_t uuid)
{
+ CHECK_BTHF_INIT();
+ int i;
+ for (i = 0; i < btif_max_hf_clients;)
+ {
+ if (((btif_hf_cb[i].state == BTHF_CONNECTION_STATE_CONNECTED) ||
+ (btif_hf_cb[i].state == BTHF_CONNECTION_STATE_SLC_CONNECTED)))
+ i++;
+ else
+ break;
+ }
+
+ if (i == btif_max_hf_clients)
+ return BT_STATUS_BUSY;
+
if (!is_connected(bd_addr))
{
- btif_hf_cb.state = BTHF_CONNECTION_STATE_CONNECTING;
- bdcpy(btif_hf_cb.connected_bda.address, bd_addr->address);
+ btif_hf_cb[i].state = BTHF_CONNECTION_STATE_CONNECTING;
+ bdcpy(btif_hf_cb[i].connected_bda.address, bd_addr->address);
- BTA_AgOpen(btif_hf_cb.handle, btif_hf_cb.connected_bda.address,
+ BTA_AgOpen(btif_hf_cb[i].handle, btif_hf_cb[i].connected_bda.address,
BTIF_HF_SECURITY, BTIF_HF_SERVICES);
return BT_STATUS_SUCCESS;
}
@@ -544,9 +780,11 @@
{
CHECK_BTHF_INIT();
- if (is_connected(bd_addr))
+ int idx = btif_hf_idx_by_bdaddr(bd_addr);
+
+ if (is_connected(bd_addr) && (idx != BTIF_HF_INVALID_IDX))
{
- BTA_AgClose(btif_hf_cb.handle);
+ BTA_AgClose(btif_hf_cb[idx].handle);
return BT_STATUS_SUCCESS;
}
@@ -566,9 +804,11 @@
{
CHECK_BTHF_INIT();
- if (is_connected(bd_addr))
+ int idx = btif_hf_idx_by_bdaddr(bd_addr);
+
+ if (is_connected(bd_addr) && (idx != BTIF_HF_INVALID_IDX))
{
- BTA_AgAudioOpen(btif_hf_cb.handle);
+ BTA_AgAudioOpen(btif_hf_cb[idx].handle);
/* Inform the application that the audio connection has been initiated successfully */
btif_transfer_context(btif_in_hf_generic_evt, BTIF_HFP_CB_AUDIO_CONNECTING,
@@ -592,9 +832,11 @@
{
CHECK_BTHF_INIT();
- if (is_connected(bd_addr))
+ int idx = btif_hf_idx_by_bdaddr(bd_addr);
+
+ if (is_connected(bd_addr) && (idx != BTIF_HF_INVALID_IDX))
{
- BTA_AgAudioClose(btif_hf_cb.handle);
+ BTA_AgAudioClose(btif_hf_cb[idx].handle);
return BT_STATUS_SUCCESS;
}
@@ -610,17 +852,20 @@
** Returns bt_status_t
**
*******************************************************************************/
-static bt_status_t start_voice_recognition()
+static bt_status_t start_voice_recognition(bt_bdaddr_t *bd_addr)
{
CHECK_BTHF_INIT();
- if (is_connected(NULL))
+
+ int idx = btif_hf_idx_by_bdaddr(bd_addr);
+
+ if (is_connected(bd_addr) && (idx != BTIF_HF_INVALID_IDX))
{
- if (btif_hf_cb.peer_feat & BTA_AG_PEER_FEAT_VREC)
+ if (btif_hf_cb[idx].peer_feat & BTA_AG_PEER_FEAT_VREC)
{
tBTA_AG_RES_DATA ag_res;
memset(&ag_res, 0, sizeof(ag_res));
ag_res.state = 1;
- BTA_AgResult (btif_hf_cb.handle, BTA_AG_BVRA_RES, &ag_res);
+ BTA_AgResult (btif_hf_cb[idx].handle, BTA_AG_BVRA_RES, &ag_res);
return BT_STATUS_SUCCESS;
}
@@ -642,18 +887,20 @@
** Returns bt_status_t
**
*******************************************************************************/
-static bt_status_t stop_voice_recognition()
+static bt_status_t stop_voice_recognition(bt_bdaddr_t *bd_addr)
{
CHECK_BTHF_INIT();
- if (is_connected(NULL))
+ int idx = btif_hf_idx_by_bdaddr(bd_addr);
+
+ if (is_connected(bd_addr) && (idx != BTIF_HF_INVALID_IDX))
{
- if (btif_hf_cb.peer_feat & BTA_AG_PEER_FEAT_VREC)
+ if (btif_hf_cb[idx].peer_feat & BTA_AG_PEER_FEAT_VREC)
{
tBTA_AG_RES_DATA ag_res;
memset(&ag_res, 0, sizeof(ag_res));
ag_res.state = 0;
- BTA_AgResult (btif_hf_cb.handle, BTA_AG_BVRA_RES, &ag_res);
+ BTA_AgResult (btif_hf_cb[idx].handle, BTA_AG_BVRA_RES, &ag_res);
return BT_STATUS_SUCCESS;
}
@@ -675,16 +922,19 @@
** Returns bt_status_t
**
*******************************************************************************/
-static bt_status_t volume_control(bthf_volume_type_t type, int volume)
+static bt_status_t volume_control(bthf_volume_type_t type, int volume,
+ bt_bdaddr_t *bd_addr)
{
CHECK_BTHF_INIT();
+ int idx = btif_hf_idx_by_bdaddr(bd_addr);
+
tBTA_AG_RES_DATA ag_res;
memset(&ag_res, 0, sizeof(tBTA_AG_RES_DATA));
- if (is_connected(NULL))
+ if (is_connected(bd_addr) && (idx != BTIF_HF_INVALID_IDX))
{
ag_res.num = volume;
- BTA_AgResult(btif_hf_cb.handle,
+ BTA_AgResult(btif_hf_cb[idx].handle,
(type == BTHF_VOLUME_TYPE_SPK) ? BTA_AG_SPK_RES : BTA_AG_MIC_RES,
&ag_res);
return BT_STATUS_SUCCESS;
@@ -733,11 +983,13 @@
** Returns bt_status_t
**
*******************************************************************************/
-static bt_status_t cops_response(const char *cops)
+static bt_status_t cops_response(const char *cops, bt_bdaddr_t *bd_addr)
{
CHECK_BTHF_INIT();
- if (is_connected(NULL))
+ int idx = btif_hf_idx_by_bdaddr(bd_addr);
+
+ if (is_connected(bd_addr) && (idx != BTIF_HF_INVALID_IDX))
{
tBTA_AG_RES_DATA ag_res;
@@ -745,7 +997,7 @@
sprintf (ag_res.str, "0,0,\"%s\"", cops);
ag_res.ok_flag = BTA_AG_OK_DONE;
- BTA_AgResult (btif_hf_cb.handle, BTA_AG_COPS_RES, &ag_res);
+ BTA_AgResult (btif_hf_cb[idx].handle, BTA_AG_COPS_RES, &ag_res);
return BT_STATUS_SUCCESS;
}
return BT_STATUS_FAIL;
@@ -762,11 +1014,14 @@
*******************************************************************************/
static bt_status_t cind_response(int svc, int num_active, int num_held,
bthf_call_state_t call_setup_state,
- int signal, int roam, int batt_chg)
+ int signal, int roam, int batt_chg,
+ bt_bdaddr_t *bd_addr)
{
CHECK_BTHF_INIT();
- if (is_connected(NULL))
+ int idx = btif_hf_idx_by_bdaddr(bd_addr);
+
+ if (is_connected(bd_addr) && (idx != BTIF_HF_INVALID_IDX))
{
tBTA_AG_RES_DATA ag_res;
@@ -783,7 +1038,7 @@
batt_chg, /* Battery level */
((num_held == 0) ? 0 : ((num_active == 0) ? 2 : 1))); /* Call held */
- BTA_AgResult (btif_hf_cb.handle, BTA_AG_CIND_RES, &ag_res);
+ BTA_AgResult (btif_hf_cb[idx].handle, BTA_AG_CIND_RES, &ag_res);
return BT_STATUS_SUCCESS;
}
@@ -800,17 +1055,18 @@
** Returns bt_status_t
**
*******************************************************************************/
-static bt_status_t formatted_at_response(const char *rsp)
+static bt_status_t formatted_at_response(const char *rsp, bt_bdaddr_t *bd_addr)
{
CHECK_BTHF_INIT();
tBTA_AG_RES_DATA ag_res;
+ int idx = btif_hf_idx_by_bdaddr(bd_addr);
- if (is_connected(NULL))
+ if (is_connected(bd_addr) && (idx != BTIF_HF_INVALID_IDX))
{
/* Format the response and send */
memset (&ag_res, 0, sizeof (ag_res));
strncpy(ag_res.str, rsp, BTA_AG_AT_MAX_LEN);
- BTA_AgResult (btif_hf_cb.handle, BTA_AG_UNAT_RES, &ag_res);
+ BTA_AgResult (btif_hf_cb[idx].handle, BTA_AG_UNAT_RES, &ag_res);
return BT_STATUS_SUCCESS;
}
@@ -827,14 +1083,17 @@
** Returns bt_status_t
**
*******************************************************************************/
-static bt_status_t at_response(bthf_at_response_t response_code, int error_code)
+static bt_status_t at_response(bthf_at_response_t response_code,
+ int error_code, bt_bdaddr_t *bd_addr)
{
CHECK_BTHF_INIT();
- if (is_connected(NULL))
+ int idx = btif_hf_idx_by_bdaddr(bd_addr);
+
+ if (is_connected(bd_addr) && (idx != BTIF_HF_INVALID_IDX))
{
send_at_result((response_code == BTHF_AT_RESPONSE_OK) ? BTA_AG_OK_DONE
- : BTA_AG_OK_ERROR, error_code);
+ : BTA_AG_OK_ERROR, error_code, idx);
return BT_STATUS_SUCCESS;
}
@@ -854,13 +1113,15 @@
**
*******************************************************************************/
static bt_status_t clcc_response(int index, bthf_call_direction_t dir,
- bthf_call_state_t state, bthf_call_mode_t mode,
- bthf_call_mpty_type_t mpty, const char *number,
- bthf_call_addrtype_t type)
+ bthf_call_state_t state, bthf_call_mode_t mode,
+ bthf_call_mpty_type_t mpty, const char *number,
+ bthf_call_addrtype_t type, bt_bdaddr_t *bd_addr)
{
CHECK_BTHF_INIT();
- if (is_connected(NULL))
+ int idx = btif_hf_idx_by_bdaddr(bd_addr);
+
+ if (is_connected(bd_addr) && (idx != BTIF_HF_INVALID_IDX))
{
tBTA_AG_RES_DATA ag_res;
int xx;
@@ -874,7 +1135,7 @@
}
else
{
- BTIF_TRACE_EVENT6("clcc_response: [%d] dir %d state %d mode %d number = %s type = %d",
+ BTIF_TRACE_EVENT("clcc_response: [%d] dir %d state %d mode %d number = %s type = %d",
index, dir, state, mode, number, type);
xx = sprintf (ag_res.str, "%d,%d,%d,%d,%d",
index, dir, state, mode, mpty);
@@ -887,7 +1148,7 @@
sprintf (&ag_res.str[xx], ",\"%s\",%d", number, type);
}
}
- BTA_AgResult (btif_hf_cb.handle, BTA_AG_CLCC_RES, &ag_res);
+ BTA_AgResult (btif_hf_cb[idx].handle, BTA_AG_CLCC_RES, &ag_res);
return BT_STATUS_SUCCESS;
}
@@ -913,29 +1174,44 @@
tBTA_AG_RES_DATA ag_res;
bt_status_t status = BT_STATUS_SUCCESS;
BOOLEAN activeCallUpdated = FALSE;
+ int idx, i;
- CHECK_BTHF_SLC_CONNECTED();
+ /* hf_idx is index of connected HS that sent ATA/BLDN,
+ otherwise index of latest connected HS */
+ if (hf_idx != BTIF_HF_INVALID_IDX)
+ idx = hf_idx;
+ else
+ idx = btif_hf_latest_connected_idx();
- BTIF_TRACE_DEBUG6("phone_state_change: num_active=%d [prev: %d] num_held=%d[prev: %d]"\
- " call_setup=%s [prev: %s]", num_active, btif_hf_cb.num_active,
- num_held, btif_hf_cb.num_held,
- dump_hf_call_state(call_setup_state), dump_hf_call_state(btif_hf_cb.call_setup_state));
+ BTIF_TRACE_DEBUG("phone_state_change: idx = %d", idx);
+
+ /* Check if SLC is connected */
+ if (btif_hf_check_if_slc_connected() != BT_STATUS_SUCCESS)
+ return BT_STATUS_NOT_READY;
+
+ BTIF_TRACE_DEBUG("phone_state_change: num_active=%d [prev: %d] num_held=%d[prev: %d]"
+ " call_setup=%s [prev: %s]", num_active, btif_hf_cb[idx].num_active,
+ num_held, btif_hf_cb[idx].num_held, dump_hf_call_state(call_setup_state),
+ dump_hf_call_state(btif_hf_cb[idx].call_setup_state));
/* if all indicators are 0, send end call and return */
if (num_active == 0 && num_held == 0 && call_setup_state == BTHF_CALL_STATE_IDLE)
{
- BTIF_TRACE_DEBUG1("%s: Phone on hook", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s: Phone on hook", __FUNCTION__);
- /* record call termination timestamp if there was an active/held call or callsetup state > BTHF_CALL_STATE_IDLE */
- if ((btif_hf_cb.call_setup_state != BTHF_CALL_STATE_IDLE ) || (btif_hf_cb.num_active) ||(btif_hf_cb.num_held))
+ /* record call termination timestamp if there was an active/held call or
+ callsetup state > BTHF_CALL_STATE_IDLE */
+ if ((btif_hf_cb[idx].call_setup_state != BTHF_CALL_STATE_IDLE ) ||
+ (btif_hf_cb[idx].num_active) ||(btif_hf_cb[idx].num_held))
{
- BTIF_TRACE_DEBUG1("%s: Record call termination timestamp", __FUNCTION__);
- clock_gettime(CLOCK_MONOTONIC, &btif_hf_cb.call_end_timestamp);
+ BTIF_TRACE_DEBUG("%s: Record call termination timestamp", __FUNCTION__);
+ clock_gettime(CLOCK_MONOTONIC, &btif_hf_cb[0].call_end_timestamp);
}
BTA_AgResult (BTA_AG_HANDLE_ALL, BTA_AG_END_CALL_RES, NULL);
+ hf_idx = BTIF_HF_INVALID_IDX;
/* if held call was present, reset that as well */
- if (btif_hf_cb.num_held)
+ if (btif_hf_cb[idx].num_held)
send_indicator_update(BTA_AG_IND_CALLHELD, 0);
goto update_call_states;
@@ -952,24 +1228,24 @@
** force the SCO to be setup. Handle this special case here prior to
** call setup handling
*/
- if ( (num_active == 1) && (btif_hf_cb.num_active == 0) && (btif_hf_cb.num_held == 0) &&
- (btif_hf_cb.call_setup_state == BTHF_CALL_STATE_IDLE) )
+ if ( (num_active == 1) && (btif_hf_cb[idx].num_active == 0) && (btif_hf_cb[idx].num_held == 0)
+ && (btif_hf_cb[idx].call_setup_state == BTHF_CALL_STATE_IDLE) )
{
- BTIF_TRACE_DEBUG1("%s: Active call notification received without call setup update",
+ BTIF_TRACE_DEBUG("%s: Active call notification received without call setup update",
__FUNCTION__);
memset(&ag_res, 0, sizeof(tBTA_AG_RES_DATA));
- ag_res.audio_handle = btif_hf_cb.handle;
+ ag_res.audio_handle = btif_hf_cb[idx].handle;
res = BTA_AG_OUT_CALL_CONN_RES;
BTA_AgResult(BTA_AG_HANDLE_ALL, res, &ag_res);
activeCallUpdated = TRUE;
}
/* Ringing call changed? */
- if (call_setup_state != btif_hf_cb.call_setup_state)
+ if (call_setup_state != btif_hf_cb[idx].call_setup_state)
{
- BTIF_TRACE_DEBUG3("%s: Call setup states changed. old: %s new: %s",
- __FUNCTION__, dump_hf_call_state(btif_hf_cb.call_setup_state),
+ BTIF_TRACE_DEBUG("%s: Call setup states changed. old: %s new: %s",
+ __FUNCTION__, dump_hf_call_state(btif_hf_cb[idx].call_setup_state),
dump_hf_call_state(call_setup_state));
memset(&ag_res, 0, sizeof(tBTA_AG_RES_DATA));
@@ -977,22 +1253,22 @@
{
case BTHF_CALL_STATE_IDLE:
{
- switch (btif_hf_cb.call_setup_state)
+ switch (btif_hf_cb[idx].call_setup_state)
{
case BTHF_CALL_STATE_INCOMING:
- if (num_active > btif_hf_cb.num_active)
+ if (num_active > btif_hf_cb[idx].num_active)
{
res = BTA_AG_IN_CALL_CONN_RES;
- ag_res.audio_handle = btif_hf_cb.handle;
+ ag_res.audio_handle = btif_hf_cb[idx].handle;
}
- else if (num_held > btif_hf_cb.num_held)
+ else if (num_held > btif_hf_cb[idx].num_held)
res = BTA_AG_IN_CALL_HELD_RES;
else
res = BTA_AG_CALL_CANCEL_RES;
break;
case BTHF_CALL_STATE_DIALING:
case BTHF_CALL_STATE_ALERTING:
- if (num_active > btif_hf_cb.num_active)
+ if (num_active > btif_hf_cb[idx].num_active)
{
ag_res.audio_handle = BTA_AG_HANDLE_SCO_NO_CHANGE;
res = BTA_AG_OUT_CALL_CONN_RES;
@@ -1001,7 +1277,7 @@
res = BTA_AG_CALL_CANCEL_RES;
break;
default:
- BTIF_TRACE_ERROR1("%s: Incorrect Call setup state transition", __FUNCTION__);
+ BTIF_TRACE_ERROR("%s: Incorrect Call setup state transition", __FUNCTION__);
status = BT_STATUS_PARM_INVALID;
break;
}
@@ -1026,21 +1302,21 @@
}
break;
case BTHF_CALL_STATE_DIALING:
- ag_res.audio_handle = btif_hf_cb.handle;
+ ag_res.audio_handle = btif_hf_cb[idx].handle;
res = BTA_AG_OUT_CALL_ORIG_RES;
break;
case BTHF_CALL_STATE_ALERTING:
/* if we went from idle->alert, force SCO setup here. dialing usually triggers it */
- if (btif_hf_cb.call_setup_state == BTHF_CALL_STATE_IDLE)
- ag_res.audio_handle = btif_hf_cb.handle;
+ if (btif_hf_cb[idx].call_setup_state == BTHF_CALL_STATE_IDLE)
+ ag_res.audio_handle = btif_hf_cb[idx].handle;
res = BTA_AG_OUT_CALL_ALERT_RES;
break;
default:
- BTIF_TRACE_ERROR1("%s: Incorrect new ringing call state", __FUNCTION__);
+ BTIF_TRACE_ERROR("%s: Incorrect new ringing call state", __FUNCTION__);
status = BT_STATUS_PARM_INVALID;
break;
}
- BTIF_TRACE_DEBUG3("%s: Call setup state changed. res=%d, audio_handle=%d", __FUNCTION__, res, ag_res.audio_handle);
+ BTIF_TRACE_DEBUG("%s: Call setup state changed. res=%d, audio_handle=%d", __FUNCTION__, res, ag_res.audio_handle);
if (res)
BTA_AgResult(BTA_AG_HANDLE_ALL, res, &ag_res);
@@ -1061,34 +1337,38 @@
** https://www.bluetooth.org/errata/errata_view.cfm?errata_id=2043
** Handle call indicator change
**/
- if (!activeCallUpdated && ((num_active + num_held) != (btif_hf_cb.num_active + btif_hf_cb.num_held)) )
+ if (!activeCallUpdated && ((num_active + num_held) !=
+ (btif_hf_cb[idx].num_active + btif_hf_cb[idx].num_held)) )
{
- BTIF_TRACE_DEBUG3("%s: Active call states changed. old: %d new: %d", __FUNCTION__, btif_hf_cb.num_active, num_active);
+ BTIF_TRACE_DEBUG("%s: Active call states changed. old: %d new: %d", __FUNCTION__, btif_hf_cb[idx].num_active, num_active);
send_indicator_update(BTA_AG_IND_CALL, ((num_active + num_held) > 0) ? 1 : 0);
}
/* Held Changed? */
- if (num_held != btif_hf_cb.num_held)
+ if (num_held != btif_hf_cb[idx].num_held)
{
- BTIF_TRACE_DEBUG3("%s: Held call states changed. old: %d new: %d", __FUNCTION__, btif_hf_cb.num_held, num_held);
+ BTIF_TRACE_DEBUG("%s: Held call states changed. old: %d new: %d",
+ __FUNCTION__, btif_hf_cb[idx].num_held, num_held);
send_indicator_update(BTA_AG_IND_CALLHELD, ((num_held == 0) ? 0 : ((num_active == 0) ? 2 : 1)));
}
/* Calls Swapped? */
- if ( (call_setup_state == btif_hf_cb.call_setup_state) &&
+ if ( (call_setup_state == btif_hf_cb[idx].call_setup_state) &&
(num_active && num_held) &&
- (num_active == btif_hf_cb.num_active) &&
- (num_held == btif_hf_cb.num_held) )
+ (num_active == btif_hf_cb[idx].num_active) &&
+ (num_held == btif_hf_cb[idx].num_held) )
{
- BTIF_TRACE_DEBUG1("%s: Calls swapped", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s: Calls swapped", __FUNCTION__);
send_indicator_update(BTA_AG_IND_CALLHELD, 1);
}
update_call_states:
- btif_hf_cb.num_active = num_active;
- btif_hf_cb.num_held = num_held;
- btif_hf_cb.call_setup_state = call_setup_state;
-
+ for (i = 0; i < btif_max_hf_clients; i++)
+ {
+ btif_hf_cb[i].num_active = num_active;
+ btif_hf_cb[i].num_held = num_held;
+ btif_hf_cb[i].call_setup_state = call_setup_state;
+ }
return status;
}
@@ -1107,13 +1387,14 @@
struct timespec now;
clock_gettime(CLOCK_MONOTONIC, &now);
- if (now.tv_sec < btif_hf_cb.call_end_timestamp.tv_sec + BTIF_HF_CALL_END_TIMEOUT)
+ if (now.tv_sec < btif_hf_cb[0].call_end_timestamp.tv_sec +
+ BTIF_HF_CALL_END_TIMEOUT)
{
return TRUE;
}
else
{
- btif_hf_cb.call_end_timestamp.tv_sec = 0;
+ btif_hf_cb[0].call_end_timestamp.tv_sec = 0;
return FALSE;
}
}
@@ -1129,7 +1410,7 @@
*******************************************************************************/
static void cleanup( void )
{
- BTIF_TRACE_EVENT1("%s", __FUNCTION__);
+ BTIF_TRACE_EVENT("%s", __FUNCTION__);
if (bt_hf_callbacks)
{
@@ -1138,6 +1419,34 @@
}
}
+/*******************************************************************************
+**
+** Function configure_wbs
+**
+** Description set to over-ride the current WBS configuration.
+** It will not send codec setting cmd to the controller now.
+** It just change the configure.
+**
+** Returns bt_status_t
+**
+*******************************************************************************/
+static bt_status_t configure_wbs( bt_bdaddr_t *bd_addr , bthf_wbs_config_t config )
+{
+ CHECK_BTHF_INIT();
+
+ int idx = btif_hf_idx_by_bdaddr(bd_addr);
+
+ BTIF_TRACE_EVENT("%s config is %d", __FUNCTION__,config);
+ if (config == BTHF_WBS_YES)
+ BTA_AgSetCodec(btif_hf_cb[idx].handle,BTA_AG_CODEC_MSBC);
+ else if(config == BTHF_WBS_NO)
+ BTA_AgSetCodec(btif_hf_cb[idx].handle,BTA_AG_CODEC_CVSD);
+ else
+ BTA_AgSetCodec(btif_hf_cb[idx].handle,BTA_AG_CODEC_NONE);
+
+ return BT_STATUS_SUCCESS;
+}
+
static const bthf_interface_t bthfInterface = {
sizeof(bthfInterface),
init,
@@ -1156,6 +1465,7 @@
clcc_response,
phone_state_change,
cleanup,
+ configure_wbs,
};
/*******************************************************************************
@@ -1170,16 +1480,23 @@
bt_status_t btif_hf_execute_service(BOOLEAN b_enable)
{
char * p_service_names[] = BTIF_HF_SERVICE_NAMES;
+ int i;
if (b_enable)
{
/* Enable and register with BTA-AG */
BTA_AgEnable (BTA_AG_PARSE, bte_hf_evt);
- BTA_AgRegister(BTIF_HF_SERVICES, BTIF_HF_SECURITY, BTIF_HF_FEATURES,
- p_service_names, BTIF_HF_ID_1);
+ for (i = 0; i < btif_max_hf_clients; i++)
+ {
+ BTA_AgRegister(BTIF_HF_SERVICES, BTIF_HF_SECURITY,
+ BTIF_HF_FEATURES, p_service_names, bthf_hf_id[i]);
+ }
}
else {
/* De-register AG */
- BTA_AgDeregister(btif_hf_cb.handle);
+ for (i = 0; i < btif_max_hf_clients; i++)
+ {
+ BTA_AgDeregister(btif_hf_cb[i].handle);
+ }
/* Disable AG */
BTA_AgDisable();
}
@@ -1197,6 +1514,6 @@
*******************************************************************************/
const bthf_interface_t *btif_hf_get_interface()
{
- BTIF_TRACE_EVENT1("%s", __FUNCTION__);
+ BTIF_TRACE_EVENT("%s", __FUNCTION__);
return &bthfInterface;
}
diff --git a/btif/src/btif_hf_client.c b/btif/src/btif_hf_client.c
new file mode 100644
index 0000000..22d5ba2
--- /dev/null
+++ b/btif/src/btif_hf_client.c
@@ -0,0 +1,985 @@
+/******************************************************************************
+ *
+ * Copyright (c) 2014 The Android Open Source Project
+ * Copyright (C) 2009-2012 Broadcom Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+/************************************************************************************
+ *
+ * Filename: btif_hf_client.c
+ *
+ * Description: Handsfree Profile (HF role) Bluetooth Interface
+ *
+ *
+ ***********************************************************************************/
+
+#include <hardware/bluetooth.h>
+#include <hardware/bt_hf_client.h>
+#include <stdlib.h>
+#include <cutils/properties.h>
+
+#define LOG_TAG "BTIF_HF_CLIENT"
+#include "btif_common.h"
+#include "btif_util.h"
+#include "btif_profile_queue.h"
+#include "bt_utils.h"
+#include "bd.h"
+#include "bta_hf_client_api.h"
+
+/************************************************************************************
+** Constants & Macros
+************************************************************************************/
+
+#ifndef BTIF_HF_CLIENT_SERVICE_NAME
+#define BTIF_HF_CLIENT_SERVICE_NAME ("Handsfree")
+#endif
+
+#ifndef BTIF_HF_CLIENT_SECURITY
+#define BTIF_HF_CLIENT_SECURITY (BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT)
+#endif
+
+#ifndef BTIF_HF_CLIENT_FEATURES
+#define BTIF_HF_CLIENT_FEATURES ( BTA_HF_CLIENT_FEAT_ECNR | \
+ BTA_HF_CLIENT_FEAT_3WAY | \
+ BTA_HF_CLIENT_FEAT_CLI | \
+ BTA_HF_CLIENT_FEAT_VREC | \
+ BTA_HF_CLIENT_FEAT_VOL | \
+ BTA_HF_CLIENT_FEAT_ECS | \
+ BTA_HF_CLIENT_FEAT_ECC | \
+ BTA_HF_CLIENT_FEAT_CODEC)
+#endif
+
+/************************************************************************************
+** Local type definitions
+************************************************************************************/
+
+/************************************************************************************
+** Static variables
+************************************************************************************/
+static bthf_client_callbacks_t *bt_hf_client_callbacks = NULL;
+char btif_hf_client_version[PROPERTY_VALUE_MAX];
+static UINT32 btif_hf_client_features = 0;
+
+
+#define CHECK_BTHF_CLIENT_INIT() if (bt_hf_client_callbacks == NULL)\
+ {\
+ BTIF_TRACE_WARNING("BTHF CLIENT: %s: not initialized", __FUNCTION__);\
+ return BT_STATUS_NOT_READY;\
+ }\
+ else\
+ {\
+ BTIF_TRACE_EVENT("BTHF CLIENT: %s", __FUNCTION__);\
+ }
+
+#define CHECK_BTHF_CLIENT_SLC_CONNECTED() if (bt_hf_client_callbacks == NULL)\
+ {\
+ BTIF_TRACE_WARNING("BTHF CLIENT: %s: not initialized", __FUNCTION__);\
+ return BT_STATUS_NOT_READY;\
+ }\
+ else if (btif_hf_client_cb.state != BTHF_CLIENT_CONNECTION_STATE_SLC_CONNECTED)\
+ {\
+ BTIF_TRACE_WARNING("BTHF CLIENT: %s: SLC connection not up. state=%s",\
+ __FUNCTION__, \
+ dump_hf_conn_state(btif_hf_client_cb.state));\
+ return BT_STATUS_NOT_READY;\
+ }\
+ else\
+ {\
+ BTIF_TRACE_EVENT("BTHF CLIENT: %s", __FUNCTION__);\
+ }
+
+/* BTIF-HF control block to map bdaddr to BTA handle */
+typedef struct
+{
+ UINT16 handle;
+ bt_bdaddr_t connected_bda;
+ bthf_client_connection_state_t state;
+ bthf_client_vr_state_t vr_state;
+ tBTA_HF_CLIENT_PEER_FEAT peer_feat;
+ tBTA_HF_CLIENT_CHLD_FEAT chld_feat;
+} btif_hf_client_cb_t;
+
+static btif_hf_client_cb_t btif_hf_client_cb;
+
+
+/************************************************************************************
+** Static functions
+************************************************************************************/
+
+/*******************************************************************************
+**
+** Function btif_in_hf_client_generic_evt
+**
+** Description Processes generic events to be sent to JNI that are not triggered from the BTA.
+** Always runs in BTIF context
+**
+** Returns void
+**
+*******************************************************************************/
+static void btif_in_hf_client_generic_evt(UINT16 event, char *p_param)
+{
+ UNUSED(p_param);
+
+ BTIF_TRACE_EVENT("%s: event=%d", __FUNCTION__, event);
+ switch (event) {
+ case BTIF_HF_CLIENT_CB_AUDIO_CONNECTING:
+ {
+ HAL_CBACK(bt_hf_client_callbacks, audio_state_cb, BTHF_AUDIO_STATE_CONNECTING,
+ &btif_hf_client_cb.connected_bda);
+ } break;
+ default:
+ {
+ BTIF_TRACE_WARNING("%s : Unknown event 0x%x", __FUNCTION__, event);
+ }
+ break;
+ }
+}
+
+/************************************************************************************
+** Externs
+************************************************************************************/
+
+/************************************************************************************
+** Functions
+************************************************************************************/
+
+static void clear_state(void)
+{
+ memset(&btif_hf_client_cb, 0, sizeof(btif_hf_client_cb_t));
+}
+
+static BOOLEAN is_connected(bt_bdaddr_t *bd_addr)
+{
+ if (((btif_hf_client_cb.state == BTHF_CLIENT_CONNECTION_STATE_CONNECTED) ||
+ (btif_hf_client_cb.state == BTHF_CLIENT_CONNECTION_STATE_SLC_CONNECTED))&&
+ ((bd_addr == NULL) || (bdcmp(bd_addr->address, btif_hf_client_cb.connected_bda.address) == 0)))
+ return TRUE;
+ return FALSE;
+}
+
+/*****************************************************************************
+** Section name (Group of functions)
+*****************************************************************************/
+
+/*****************************************************************************
+**
+** btif hf api functions (no context switch)
+**
+*****************************************************************************/
+
+/*******************************************************************************
+**
+** Function btif_hf_client_init
+**
+** Description initializes the hf interface
+**
+** Returns bt_status_t
+**
+*******************************************************************************/
+static bt_status_t init( bthf_client_callbacks_t* callbacks )
+{
+ BTIF_TRACE_EVENT("%s", __FUNCTION__);
+
+ bt_hf_client_callbacks = callbacks;
+
+ btif_enable_service(BTA_HFP_HS_SERVICE_ID);
+
+ clear_state();
+
+ return BT_STATUS_SUCCESS;
+}
+
+/*******************************************************************************
+**
+** Function connect
+**
+** Description connect to audio gateway
+**
+** Returns bt_status_t
+**
+*******************************************************************************/
+static bt_status_t connect_int( bt_bdaddr_t *bd_addr, uint16_t uuid )
+{
+ if (is_connected(bd_addr))
+ return BT_STATUS_BUSY;
+
+ btif_hf_client_cb.state = BTHF_CLIENT_CONNECTION_STATE_CONNECTING;
+ bdcpy(btif_hf_client_cb.connected_bda.address, bd_addr->address);
+
+ BTA_HfClientOpen(btif_hf_client_cb.handle, btif_hf_client_cb.connected_bda.address,
+ BTIF_HF_CLIENT_SECURITY);
+
+ return BT_STATUS_SUCCESS;
+}
+
+static bt_status_t connect( bt_bdaddr_t *bd_addr )
+{
+ BTIF_TRACE_EVENT("HFP Client version is %s", btif_hf_client_version);
+ CHECK_BTHF_CLIENT_INIT();
+ return btif_queue_connect(UUID_SERVCLASS_HF_HANDSFREE, bd_addr, connect_int);
+
+}
+
+/*******************************************************************************
+**
+** Function disconnect
+**
+** Description disconnect from audio gateway
+**
+** Returns bt_status_t
+**
+*******************************************************************************/
+static bt_status_t disconnect( bt_bdaddr_t *bd_addr )
+{
+ CHECK_BTHF_CLIENT_INIT();
+
+ if (is_connected(bd_addr))
+ {
+ BTA_HfClientClose(btif_hf_client_cb.handle);
+ return BT_STATUS_SUCCESS;
+ }
+
+ return BT_STATUS_FAIL;
+}
+
+/*******************************************************************************
+**
+** Function connect_audio
+**
+** Description create an audio connection
+**
+** Returns bt_status_t
+**
+*******************************************************************************/
+static bt_status_t connect_audio( bt_bdaddr_t *bd_addr )
+{
+ CHECK_BTHF_CLIENT_SLC_CONNECTED();
+
+ if (is_connected(bd_addr))
+ {
+ if (btif_hf_client_cb.peer_feat & BTA_HF_CLIENT_PEER_CODEC)
+ {
+ BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_BCC, 0, 0, NULL);
+ }
+ else
+ {
+ BTA_HfClientAudioOpen(btif_hf_client_cb.handle);
+ }
+
+ /* Inform the application that the audio connection has been initiated successfully */
+ btif_transfer_context(btif_in_hf_client_generic_evt, BTIF_HF_CLIENT_CB_AUDIO_CONNECTING,
+ (char *)bd_addr, sizeof(bt_bdaddr_t), NULL);
+ return BT_STATUS_SUCCESS;
+ }
+
+ return BT_STATUS_FAIL;
+}
+
+/*******************************************************************************
+**
+** Function disconnect_audio
+**
+** Description close the audio connection
+**
+** Returns bt_status_t
+**
+*******************************************************************************/
+static bt_status_t disconnect_audio( bt_bdaddr_t *bd_addr )
+{
+ CHECK_BTHF_CLIENT_SLC_CONNECTED();
+
+ if (is_connected(bd_addr))
+ {
+ BTA_HfClientAudioClose(btif_hf_client_cb.handle);
+ return BT_STATUS_SUCCESS;
+ }
+
+ return BT_STATUS_FAIL;
+}
+
+/*******************************************************************************
+**
+** Function start_voice_recognition
+**
+** Description start voice recognition
+**
+** Returns bt_status_t
+**
+*******************************************************************************/
+static bt_status_t start_voice_recognition()
+{
+ CHECK_BTHF_CLIENT_SLC_CONNECTED();
+
+ if (btif_hf_client_cb.peer_feat & BTA_HF_CLIENT_PEER_FEAT_VREC)
+ {
+ BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_BVRA, 1, 0, NULL);
+
+ return BT_STATUS_SUCCESS;
+ }
+
+ return BT_STATUS_UNSUPPORTED;
+}
+
+/*******************************************************************************
+**
+** Function stop_voice_recognition
+**
+** Description stop voice recognition
+**
+** Returns bt_status_t
+**
+*******************************************************************************/
+static bt_status_t stop_voice_recognition()
+{
+ CHECK_BTHF_CLIENT_SLC_CONNECTED();
+
+ if (btif_hf_client_cb.peer_feat & BTA_HF_CLIENT_PEER_FEAT_VREC)
+ {
+ BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_BVRA, 0, 0, NULL);
+
+ return BT_STATUS_SUCCESS;
+ }
+
+ return BT_STATUS_UNSUPPORTED;
+}
+
+/*******************************************************************************
+**
+** Function volume_control
+**
+** Description volume control
+**
+** Returns bt_status_t
+**
+*******************************************************************************/
+static bt_status_t volume_control(bthf_client_volume_type_t type, int volume)
+{
+ BOOLEAN speaker;
+
+ CHECK_BTHF_CLIENT_SLC_CONNECTED();
+
+ switch (type)
+ {
+ case BTHF_CLIENT_VOLUME_TYPE_SPK:
+ BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_VGS, volume, 0, NULL);
+ break;
+ case BTHF_CLIENT_VOLUME_TYPE_MIC:
+ BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_VGM, volume, 0, NULL);
+ break;
+ default:
+ return BT_STATUS_UNSUPPORTED;
+ }
+
+ return BT_STATUS_SUCCESS;
+}
+
+/*******************************************************************************
+**
+** Function dial
+**
+** Description place a call
+**
+** Returns bt_status_t
+**
+*******************************************************************************/
+static bt_status_t dial(const char *number)
+{
+ CHECK_BTHF_CLIENT_SLC_CONNECTED();
+
+ if (number)
+ {
+ BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_ATD, 0, 0, number);
+ }
+ else
+ {
+ BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_BLDN, 0, 0, NULL);
+ }
+
+ return BT_STATUS_SUCCESS;
+}
+
+/*******************************************************************************
+**
+** Function dial_memory
+**
+** Description place a call with number specified by location (speed dial)
+**
+** Returns bt_status_t
+**
+*******************************************************************************/
+static bt_status_t dial_memory(int location)
+{
+ CHECK_BTHF_CLIENT_SLC_CONNECTED();
+
+ BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_ATD, location, 0, NULL);
+
+ return BT_STATUS_SUCCESS;
+}
+
+/*******************************************************************************
+**
+** Function handle_call_action
+**
+** Description handle specified call related action
+**
+** Returns bt_status_t
+**
+*******************************************************************************/
+static bt_status_t handle_call_action(bthf_client_call_action_t action, int idx)
+{
+ CHECK_BTHF_CLIENT_SLC_CONNECTED();
+
+ switch (action)
+ {
+ case BTHF_CLIENT_CALL_ACTION_CHLD_0:
+ if (btif_hf_client_cb.chld_feat & BTA_HF_CLIENT_CHLD_REL)
+ {
+ BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_CHLD, 0, 0, NULL);
+ break;
+ }
+ return BT_STATUS_UNSUPPORTED;
+ case BTHF_CLIENT_CALL_ACTION_CHLD_1:
+ // CHLD 1 is mandatory for 3 way calling
+ if (btif_hf_client_cb.peer_feat & BTA_HF_CLIENT_PEER_FEAT_3WAY)
+ {
+ BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_CHLD, 1, 0, NULL);
+ break;
+ }
+ return BT_STATUS_UNSUPPORTED;
+ case BTHF_CLIENT_CALL_ACTION_CHLD_2:
+ // CHLD 2 is mandatory for 3 way calling
+ if (btif_hf_client_cb.peer_feat & BTA_HF_CLIENT_PEER_FEAT_3WAY)
+ {
+ BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_CHLD, 2, 0, NULL);
+ break;
+ }
+ return BT_STATUS_UNSUPPORTED;
+ case BTHF_CLIENT_CALL_ACTION_CHLD_3:
+ if (btif_hf_client_cb.chld_feat & BTA_HF_CLIENT_CHLD_MERGE)
+ {
+ BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_CHLD, 3, 0, NULL);
+ break;
+ }
+ return BT_STATUS_UNSUPPORTED;
+ case BTHF_CLIENT_CALL_ACTION_CHLD_4:
+ if (btif_hf_client_cb.chld_feat & BTA_HF_CLIENT_CHLD_MERGE_DETACH)
+ {
+ BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_CHLD, 4, 0, NULL);
+ break;
+ }
+ return BT_STATUS_UNSUPPORTED;
+ case BTHF_CLIENT_CALL_ACTION_CHLD_1x:
+ if (btif_hf_client_cb.peer_feat & BTA_HF_CLIENT_PEER_ECC)
+ {
+ if (idx < 1)
+ {
+ return BT_STATUS_FAIL;
+ }
+ BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_CHLD, 1, idx, NULL);
+ break;
+ }
+ return BT_STATUS_UNSUPPORTED;
+ case BTHF_CLIENT_CALL_ACTION_CHLD_2x:
+ if (btif_hf_client_cb.peer_feat & BTA_HF_CLIENT_PEER_ECC)
+ {
+ if (idx < 1)
+ {
+ return BT_STATUS_FAIL;
+ }
+ BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_CHLD, 2, idx, NULL);
+ break;
+ }
+ return BT_STATUS_UNSUPPORTED;
+ case BTHF_CLIENT_CALL_ACTION_ATA:
+ BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_ATA, 0, 0, NULL);
+ break;
+ case BTHF_CLIENT_CALL_ACTION_CHUP:
+ BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_CHUP, 0, 0, NULL);
+ break;
+ case BTHF_CLIENT_CALL_ACTION_BTRH_0:
+ BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_BTRH, 0, 0, NULL);
+ break;
+ case BTHF_CLIENT_CALL_ACTION_BTRH_1:
+ BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_BTRH, 1, 0, NULL);
+ break;
+ case BTHF_CLIENT_CALL_ACTION_BTRH_2:
+ BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_BTRH, 2, 0, NULL);
+ break;
+ default:
+ return BT_STATUS_FAIL;
+
+ }
+
+ return BT_STATUS_SUCCESS;
+}
+
+/*******************************************************************************
+**
+** Function query_current_calls
+**
+** Description query list of current calls
+**
+** Returns bt_status_t
+**
+*******************************************************************************/
+static bt_status_t query_current_calls(void)
+{
+ CHECK_BTHF_CLIENT_SLC_CONNECTED();
+
+ if (btif_hf_client_cb.peer_feat & BTA_HF_CLIENT_PEER_ECS)
+ {
+ BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_CLCC, 0, 0, NULL);
+
+ return BT_STATUS_SUCCESS;
+ }
+
+ return BT_STATUS_UNSUPPORTED;
+}
+
+/*******************************************************************************
+**
+** Function query_current_operator_name
+**
+** Description query current selected operator name
+**
+** Returns bt_status_t
+**
+*******************************************************************************/
+static bt_status_t query_current_operator_name(void)
+{
+ CHECK_BTHF_CLIENT_SLC_CONNECTED();
+
+ BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_COPS, 0, 0, NULL);
+
+ return BT_STATUS_SUCCESS;
+}
+
+/*******************************************************************************
+**
+** Function retieve_subscriber_info
+**
+** Description retrieve subscriber number information
+**
+** Returns bt_status_t
+**
+*******************************************************************************/
+static bt_status_t retrieve_subscriber_info(void)
+{
+ CHECK_BTHF_CLIENT_SLC_CONNECTED();
+
+ BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_CNUM, 0, 0, NULL);
+
+ return BT_STATUS_SUCCESS;
+}
+
+/*******************************************************************************
+**
+** Function send_dtmf
+**
+** Description send dtmf
+**
+** Returns bt_status_t
+**
+*******************************************************************************/
+static bt_status_t send_dtmf(char code)
+{
+ CHECK_BTHF_CLIENT_SLC_CONNECTED();
+
+ BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_VTS, code, 0, NULL);
+
+ return BT_STATUS_SUCCESS;
+}
+
+/*******************************************************************************
+**
+** Function request_last_voice_tag_number
+**
+** Description Request number from AG for VR purposes
+**
+** Returns bt_status_t
+**
+*******************************************************************************/
+static bt_status_t request_last_voice_tag_number(void)
+{
+ CHECK_BTHF_CLIENT_SLC_CONNECTED();
+
+ if (btif_hf_client_cb.peer_feat & BTA_HF_CLIENT_PEER_VTAG)
+ {
+ BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_BINP, 1, 0, NULL);
+
+ return BT_STATUS_SUCCESS;
+ }
+
+ return BT_STATUS_UNSUPPORTED;
+}
+
+/*******************************************************************************
+**
+** Function cleanup
+**
+** Description Closes the HF interface
+**
+** Returns bt_status_t
+**
+*******************************************************************************/
+static void cleanup( void )
+{
+ BTIF_TRACE_EVENT("%s", __FUNCTION__);
+
+ if (bt_hf_client_callbacks)
+ {
+ btif_disable_service(BTA_HFP_HS_SERVICE_ID);
+ bt_hf_client_callbacks = NULL;
+ }
+}
+
+/*******************************************************************************
+**
+** Function send_at_cmd
+**
+** Description Send requested AT command to rempte device.
+**
+** Returns bt_status_t
+**
+*******************************************************************************/
+static bt_status_t send_at_cmd(int cmd,int val1,int val2,const char *arg)
+{
+ CHECK_BTHF_CLIENT_SLC_CONNECTED();
+ BTIF_TRACE_EVENT("%s Cmd %d val1 %d val2 %d arg %s",
+ __FUNCTION__,cmd,val1,val2,arg);
+ BTA_HfClientSendAT(btif_hf_client_cb.handle, cmd, val1, val2, arg);
+
+ return BT_STATUS_SUCCESS;
+}
+
+static const bthf_client_interface_t bthfClientInterface = {
+ sizeof(bthf_client_interface_t),
+ .init = init,
+ .connect = connect,
+ .disconnect = disconnect,
+ .connect_audio = connect_audio,
+ .disconnect_audio = disconnect_audio,
+ .start_voice_recognition = start_voice_recognition,
+ .stop_voice_recognition = stop_voice_recognition,
+ .volume_control = volume_control,
+ .dial = dial,
+ .dial_memory = dial_memory,
+ .handle_call_action = handle_call_action,
+ .query_current_calls = query_current_calls,
+ .query_current_operator_name = query_current_operator_name,
+ .retrieve_subscriber_info = retrieve_subscriber_info,
+ .send_dtmf = send_dtmf,
+ .request_last_voice_tag_number = request_last_voice_tag_number,
+ .cleanup = cleanup,
+ .send_at_cmd = send_at_cmd,
+};
+
+static void process_ind_evt(tBTA_HF_CLIENT_IND *ind)
+{
+ switch (ind->type)
+ {
+ case BTA_HF_CLIENT_IND_CALL:
+ HAL_CBACK(bt_hf_client_callbacks, call_cb, ind->value);
+ break;
+
+ case BTA_HF_CLIENT_IND_CALLSETUP:
+ HAL_CBACK(bt_hf_client_callbacks, callsetup_cb, ind->value);
+ break;
+ case BTA_HF_CLIENT_IND_CALLHELD:
+ HAL_CBACK(bt_hf_client_callbacks, callheld_cb, ind->value);
+ break;
+
+ case BTA_HF_CLIENT_IND_SERVICE:
+ HAL_CBACK(bt_hf_client_callbacks, network_state_cb, ind->value);
+ break;
+
+ case BTA_HF_CLIENT_IND_SIGNAL:
+ HAL_CBACK(bt_hf_client_callbacks, network_signal_cb, ind->value);
+ break;
+
+ case BTA_HF_CLIENT_IND_ROAM:
+ HAL_CBACK(bt_hf_client_callbacks, network_roaming_cb, ind->value);
+ break;
+
+ case BTA_HF_CLIENT_IND_BATTCH:
+ HAL_CBACK(bt_hf_client_callbacks, battery_level_cb, ind->value);
+ break;
+
+ default:
+ break;
+ }
+}
+
+/*******************************************************************************
+**
+** Function btif_hf_client_upstreams_evt
+**
+** Description Executes HF CLIENT UPSTREAMS events in btif context
+**
+** Returns void
+**
+*******************************************************************************/
+static void btif_hf_client_upstreams_evt(UINT16 event, char* p_param)
+{
+ tBTA_HF_CLIENT *p_data = (tBTA_HF_CLIENT *)p_param;
+ bdstr_t bdstr;
+
+ BTIF_TRACE_DEBUG("%s: event=%s (%u)", __FUNCTION__, dump_hf_client_event(event), event);
+
+ switch (event)
+ {
+ case BTA_HF_CLIENT_ENABLE_EVT:
+ case BTA_HF_CLIENT_DISABLE_EVT:
+ break;
+
+ case BTA_HF_CLIENT_REGISTER_EVT:
+ btif_hf_client_cb.handle = p_data->reg.handle;
+ break;
+
+ case BTA_HF_CLIENT_OPEN_EVT:
+ if (p_data->open.status == BTA_HF_CLIENT_SUCCESS)
+ {
+ bdcpy(btif_hf_client_cb.connected_bda.address, p_data->open.bd_addr);
+ btif_hf_client_cb.state = BTHF_CLIENT_CONNECTION_STATE_CONNECTED;
+ btif_hf_client_cb.peer_feat = 0;
+ btif_hf_client_cb.chld_feat = 0;
+ //clear_phone_state();
+ }
+ else if (btif_hf_client_cb.state == BTHF_CLIENT_CONNECTION_STATE_CONNECTING)
+ {
+ btif_hf_client_cb.state = BTHF_CLIENT_CONNECTION_STATE_DISCONNECTED;
+ }
+ else
+ {
+ BTIF_TRACE_WARNING("%s: HF CLient open failed, but another device connected. status=%d state=%d connected device=%s",
+ __FUNCTION__, p_data->open.status, btif_hf_client_cb.state, bd2str(&btif_hf_client_cb.connected_bda, &bdstr));
+ break;
+ }
+
+ HAL_CBACK(bt_hf_client_callbacks, connection_state_cb, btif_hf_client_cb.state,
+ 0, 0, &btif_hf_client_cb.connected_bda);
+
+ if (btif_hf_client_cb.state == BTHF_CLIENT_CONNECTION_STATE_DISCONNECTED)
+ bdsetany(btif_hf_client_cb.connected_bda.address);
+
+ if (p_data->open.status != BTA_HF_CLIENT_SUCCESS)
+ btif_queue_advance();
+ break;
+
+ case BTA_HF_CLIENT_CONN_EVT:
+ btif_hf_client_cb.peer_feat = p_data->conn.peer_feat;
+ btif_hf_client_cb.chld_feat = p_data->conn.chld_feat;
+ btif_hf_client_cb.state = BTHF_CLIENT_CONNECTION_STATE_SLC_CONNECTED;
+
+ HAL_CBACK(bt_hf_client_callbacks, connection_state_cb, btif_hf_client_cb.state,
+ btif_hf_client_cb.peer_feat, btif_hf_client_cb.chld_feat,
+ &btif_hf_client_cb.connected_bda);
+
+ /* Inform the application about in-band ringtone */
+ if (btif_hf_client_cb.peer_feat & BTA_HF_CLIENT_PEER_INBAND)
+ {
+ HAL_CBACK(bt_hf_client_callbacks, in_band_ring_tone_cb, BTHF_CLIENT_IN_BAND_RINGTONE_PROVIDED);
+ }
+
+ btif_queue_advance();
+ break;
+
+ case BTA_HF_CLIENT_CLOSE_EVT:
+ btif_hf_client_cb.state = BTHF_CLIENT_CONNECTION_STATE_DISCONNECTED;
+ HAL_CBACK(bt_hf_client_callbacks, connection_state_cb, btif_hf_client_cb.state,
+ 0, 0, &btif_hf_client_cb.connected_bda);
+ bdsetany(btif_hf_client_cb.connected_bda.address);
+ btif_hf_client_cb.peer_feat = 0;
+ btif_hf_client_cb.chld_feat = 0;
+ btif_queue_advance();
+ break;
+
+ case BTA_HF_CLIENT_IND_EVT:
+ process_ind_evt(&p_data->ind);
+ break;
+
+ case BTA_HF_CLIENT_MIC_EVT:
+ HAL_CBACK(bt_hf_client_callbacks, volume_change_cb, BTHF_CLIENT_VOLUME_TYPE_MIC, p_data->val.value);
+ break;
+
+ case BTA_HF_CLIENT_SPK_EVT:
+ HAL_CBACK(bt_hf_client_callbacks, volume_change_cb, BTHF_CLIENT_VOLUME_TYPE_SPK, p_data->val.value);
+ break;
+
+ case BTA_HF_CLIENT_VOICE_REC_EVT:
+ HAL_CBACK(bt_hf_client_callbacks, vr_cmd_cb, p_data->val.value);
+ break;
+
+ case BTA_HF_CLIENT_OPERATOR_NAME_EVT:
+ HAL_CBACK(bt_hf_client_callbacks, current_operator_cb, p_data->operator.name);
+ break;
+
+ case BTA_HF_CLIENT_CLIP_EVT:
+ HAL_CBACK(bt_hf_client_callbacks, clip_cb, p_data->number.number);
+ break;
+
+ case BTA_HF_CLIENT_BINP_EVT:
+ HAL_CBACK(bt_hf_client_callbacks, last_voice_tag_number_callback, p_data->number.number);
+ break;
+
+ case BTA_HF_CLIENT_CCWA_EVT:
+ HAL_CBACK(bt_hf_client_callbacks, call_waiting_cb, p_data->number.number);
+ break;
+
+ case BTA_HF_CLIENT_AT_RESULT_EVT:
+ HAL_CBACK(bt_hf_client_callbacks, cmd_complete_cb, p_data->result.type, p_data->result.cme);
+ break;
+
+ case BTA_HF_CLIENT_CLCC_EVT:
+ HAL_CBACK(bt_hf_client_callbacks, current_calls_cb, p_data->clcc.idx,
+ p_data->clcc.inc ? BTHF_CLIENT_CALL_DIRECTION_INCOMING : BTHF_CLIENT_CALL_DIRECTION_OUTGOING,
+ p_data->clcc.status,
+ p_data->clcc.mpty ? BTHF_CLIENT_CALL_MPTY_TYPE_MULTI : BTHF_CLIENT_CALL_MPTY_TYPE_SINGLE,
+ p_data->clcc.number_present ? p_data->clcc.number : NULL);
+ break;
+
+ case BTA_HF_CLIENT_CNUM_EVT:
+ if (p_data->cnum.service == 4)
+ {
+ HAL_CBACK(bt_hf_client_callbacks, subscriber_info_cb, p_data->cnum.number, BTHF_CLIENT_SERVICE_VOICE);
+ }
+ else if (p_data->cnum.service == 5)
+ {
+ HAL_CBACK(bt_hf_client_callbacks, subscriber_info_cb, p_data->cnum.number, BTHF_CLIENT_SERVICE_FAX);
+ }
+ else
+ {
+ HAL_CBACK(bt_hf_client_callbacks, subscriber_info_cb, p_data->cnum.number, BTHF_CLIENT_SERVICE_UNKNOWN);
+ }
+ break;
+
+ case BTA_HF_CLIENT_BTRH_EVT:
+ if (p_data->val.value <= BTRH_CLIENT_RESP_AND_HOLD_REJECT)
+ {
+ HAL_CBACK(bt_hf_client_callbacks, resp_and_hold_cb, p_data->val.value);
+ }
+ break;
+
+ case BTA_HF_CLIENT_BSIR_EVT:
+ if (p_data->val.value != 0)
+ {
+ HAL_CBACK(bt_hf_client_callbacks, in_band_ring_tone_cb, BTHF_CLIENT_IN_BAND_RINGTONE_PROVIDED);
+ }
+ else
+ {
+ HAL_CBACK(bt_hf_client_callbacks, in_band_ring_tone_cb, BTHF_CLIENT_IN_BAND_RINGTONE_NOT_PROVIDED);
+ }
+ break;
+
+ case BTA_HF_CLIENT_AUDIO_OPEN_EVT:
+ HAL_CBACK(bt_hf_client_callbacks, audio_state_cb, BTHF_CLIENT_AUDIO_STATE_CONNECTED, &btif_hf_client_cb.connected_bda);
+ break;
+
+ case BTA_HF_CLIENT_AUDIO_MSBC_OPEN_EVT:
+ HAL_CBACK(bt_hf_client_callbacks, audio_state_cb, BTHF_CLIENT_AUDIO_STATE_CONNECTED_MSBC, &btif_hf_client_cb.connected_bda);
+ break;
+
+ case BTA_HF_CLIENT_AUDIO_CLOSE_EVT:
+ HAL_CBACK(bt_hf_client_callbacks, audio_state_cb, BTHF_CLIENT_AUDIO_STATE_DISCONNECTED, &btif_hf_client_cb.connected_bda);
+ break;
+ case BTA_HF_CLIENT_RING_INDICATION:
+ HAL_CBACK(bt_hf_client_callbacks, ring_indication_cb);
+ break;
+ default:
+ BTIF_TRACE_WARNING("%s: Unhandled event: %d", __FUNCTION__, event);
+ break;
+ }
+}
+
+/*******************************************************************************
+**
+** Function bte_hf_client_evt
+**
+** Description Switches context from BTE to BTIF for all HF Client events
+**
+** Returns void
+**
+*******************************************************************************/
+
+static void bte_hf_client_evt(tBTA_HF_CLIENT_EVT event, tBTA_HF_CLIENT *p_data)
+{
+ bt_status_t status;
+
+ /* switch context to btif task context (copy full union size for convenience) */
+ status = btif_transfer_context(btif_hf_client_upstreams_evt, (uint16_t)event, (void*)p_data, sizeof(*p_data), NULL);
+
+ /* catch any failed context transfers */
+ ASSERTC(status == BT_STATUS_SUCCESS, "context transfer failed", status);
+}
+
+/*******************************************************************************
+**
+** Function btif_hf_client_execute_service
+**
+** Description Initializes/Shuts down the service
+**
+** Returns BT_STATUS_SUCCESS on success, BT_STATUS_FAIL otherwise
+**
+*******************************************************************************/
+bt_status_t btif_hf_client_execute_service(BOOLEAN b_enable)
+{
+ BTIF_TRACE_EVENT("%s enable:%d", __FUNCTION__, b_enable);
+
+ property_get("ro.bluetooth.hfp.ver", btif_hf_client_version, "1.5");
+
+ if (b_enable)
+ {
+ /* Enable and register with BTA-HFClient */
+ BTA_HfClientEnable(bte_hf_client_evt);
+ if (strcmp(btif_hf_client_version, "1.6") == 0)
+ {
+ BTIF_TRACE_EVENT("Support Codec Nego. %d ", BTIF_HF_CLIENT_FEATURES);
+ BTA_HfClientRegister(BTIF_HF_CLIENT_SECURITY, BTIF_HF_CLIENT_FEATURES,
+ BTIF_HF_CLIENT_SERVICE_NAME);
+ }
+ else
+ {
+ BTIF_TRACE_EVENT("No Codec Nego Supported");
+ btif_hf_client_features = BTIF_HF_CLIENT_FEATURES;
+ btif_hf_client_features = btif_hf_client_features & (~BTA_HF_CLIENT_FEAT_CODEC);
+ BTIF_TRACE_EVENT("btif_hf_client_features is %d", btif_hf_client_features);
+ BTA_HfClientRegister(BTIF_HF_CLIENT_SECURITY, btif_hf_client_features,
+ BTIF_HF_CLIENT_SERVICE_NAME);
+ }
+
+ }
+ else
+ {
+ BTA_HfClientDeregister(btif_hf_client_cb.handle);
+ BTA_HfClientDisable();
+ }
+ return BT_STATUS_SUCCESS;
+}
+
+/*******************************************************************************
+**
+** Function btif_hf_get_interface
+**
+** Description Get the hf callback interface
+**
+** Returns bthf_interface_t
+**
+*******************************************************************************/
+const bthf_client_interface_t *btif_hf_client_get_interface(void)
+{
+ BTIF_TRACE_EVENT("%s", __FUNCTION__);
+ return &bthfClientInterface;
+}
diff --git a/btif/src/btif_hh.c b/btif/src/btif_hh.c
index 34b119d..8336f97 100644
--- a/btif/src/btif_hh.c
+++ b/btif/src/btif_hh.c
@@ -132,12 +132,12 @@
#define CHECK_BTHH_INIT() if (bt_hh_callbacks == NULL)\
{\
- BTIF_TRACE_WARNING1("BTHH: %s: BTHH not initialized", __FUNCTION__);\
+ BTIF_TRACE_WARNING("BTHH: %s: BTHH not initialized", __FUNCTION__);\
return BT_STATUS_NOT_READY;\
}\
else\
{\
- BTIF_TRACE_EVENT1("BTHH: %s", __FUNCTION__);\
+ BTIF_TRACE_EVENT("BTHH: %s", __FUNCTION__);\
}
@@ -203,7 +203,7 @@
static void toggle_os_keylockstates(int fd, int changedlockstates)
{
- BTIF_TRACE_EVENT3("%s: fd = %d, changedlockstates = 0x%x",
+ BTIF_TRACE_EVENT("%s: fd = %d, changedlockstates = 0x%x",
__FUNCTION__, fd, changedlockstates);
UINT8 hidreport[9];
int reportIndex;
@@ -212,37 +212,37 @@
reportIndex=4;
if (changedlockstates & BTIF_HH_KEYSTATE_MASK_CAPSLOCK) {
- BTIF_TRACE_DEBUG1("%s Setting CAPSLOCK", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s Setting CAPSLOCK", __FUNCTION__);
hidreport[reportIndex++] = (UINT8)HID_REPORT_CAPSLOCK;
}
if (changedlockstates & BTIF_HH_KEYSTATE_MASK_NUMLOCK) {
- BTIF_TRACE_DEBUG1("%s Setting NUMLOCK", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s Setting NUMLOCK", __FUNCTION__);
hidreport[reportIndex++] = (UINT8)HID_REPORT_NUMLOCK;
}
if (changedlockstates & BTIF_HH_KEYSTATE_MASK_SCROLLLOCK) {
- BTIF_TRACE_DEBUG1("%s Setting SCROLLLOCK", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s Setting SCROLLLOCK", __FUNCTION__);
hidreport[reportIndex++] = (UINT8) HID_REPORT_SCROLLLOCK;
}
- BTIF_TRACE_DEBUG4("Writing hidreport #1 to os: "\
+ BTIF_TRACE_DEBUG("Writing hidreport #1 to os: "\
"%s: %x %x %x", __FUNCTION__,
hidreport[0], hidreport[1], hidreport[2]);
- BTIF_TRACE_DEBUG4("%s: %x %x %x", __FUNCTION__,
+ BTIF_TRACE_DEBUG("%s: %x %x %x", __FUNCTION__,
hidreport[3], hidreport[4], hidreport[5]);
- BTIF_TRACE_DEBUG4("%s: %x %x %x", __FUNCTION__,
+ BTIF_TRACE_DEBUG("%s: %x %x %x", __FUNCTION__,
hidreport[6], hidreport[7], hidreport[8]);
bta_hh_co_write(fd , hidreport, sizeof(hidreport));
usleep(200000);
memset(hidreport,0,9);
hidreport[0]=1;
- BTIF_TRACE_DEBUG4("Writing hidreport #2 to os: "\
+ BTIF_TRACE_DEBUG("Writing hidreport #2 to os: "\
"%s: %x %x %x", __FUNCTION__,
hidreport[0], hidreport[1], hidreport[2]);
- BTIF_TRACE_DEBUG4("%s: %x %x %x", __FUNCTION__,
+ BTIF_TRACE_DEBUG("%s: %x %x %x", __FUNCTION__,
hidreport[3], hidreport[4], hidreport[5]);
- BTIF_TRACE_DEBUG4("%s: %x %x %x ", __FUNCTION__,
+ BTIF_TRACE_DEBUG("%s: %x %x %x ", __FUNCTION__,
hidreport[6], hidreport[7], hidreport[8]);
bta_hh_co_write(fd , hidreport, sizeof(hidreport));
}
@@ -286,7 +286,7 @@
btif_hh_keylockstates}; /* keystate */
/* Set report for other keyboards */
- BTIF_TRACE_EVENT3("%s: setting report on dev_handle %d to 0x%x",
+ BTIF_TRACE_EVENT("%s: setting report on dev_handle %d to 0x%x",
__FUNCTION__, p_dev->dev_handle, btif_hh_keylockstates);
/* Get SetReport buffer */
@@ -310,7 +310,7 @@
{
int keylockstates;
- BTIF_TRACE_EVENT1("%s: Syncing keyboard lock states after "\
+ BTIF_TRACE_EVENT("%s: Syncing keyboard lock states after "\
"reconnect...",__FUNCTION__);
/*If the device is connected, update keyboard state */
update_keyboard_lockstates(p_dev);
@@ -321,7 +321,7 @@
keylockstates = get_keylockstates();
if (keylockstates)
{
- BTIF_TRACE_DEBUG2("%s: Sending hid report to kernel "\
+ BTIF_TRACE_DEBUG("%s: Sending hid report to kernel "\
"indicating lock key state 0x%x",__FUNCTION__,
keylockstates);
usleep(200000);
@@ -329,7 +329,7 @@
}
else
{
- BTIF_TRACE_DEBUG2("%s: NOT sending hid report to kernel "\
+ BTIF_TRACE_DEBUG("%s: NOT sending hid report to kernel "\
"indicating lock key state 0x%x",__FUNCTION__,
keylockstates);
}
@@ -337,29 +337,6 @@
/*******************************************************************************
**
-** Function btif_hh_find_dev_by_handle
-**
-** Description Return the device pointer of the specified device handle
-**
-** Returns Device entry pointer in the device table
-*******************************************************************************/
-static btif_hh_device_t *btif_hh_find_dev_by_handle(UINT8 handle)
-{
- UINT32 i;
- // LOGV("%s: handle = %d", __FUNCTION__, handle);
- for (i = 0; i < BTIF_HH_MAX_HID; i++) {
- if (btif_hh_cb.devices[i].dev_status != BTHH_CONN_STATE_UNKNOWN &&
- btif_hh_cb.devices[i].dev_handle == handle)
- {
- return &btif_hh_cb.devices[i];
- }
- }
- return NULL;
-}
-
-
-/*******************************************************************************
-**
** Function btif_hh_find_connected_dev_by_handle
**
** Description Return the connected device pointer of the specified device handle
@@ -436,7 +413,7 @@
{
if (p_dev->vup_timer_active)
{
- BTIF_TRACE_DEBUG0("stop VUP timer ");
+ BTIF_TRACE_DEBUG("stop VUP timer ");
btu_stop_timer(&p_dev->vup_timer);
}
p_dev->vup_timer_active = FALSE;
@@ -456,7 +433,7 @@
if (p_dev->vup_timer_active == FALSE)
{
- BTIF_TRACE_DEBUG0("Start VUP timer ");
+ BTIF_TRACE_DEBUG("Start VUP timer ");
memset(&p_dev->vup_timer, 0, sizeof(TIMER_LIST_ENT));
p_dev->vup_timer.param = (UINT32)btif_hh_tmr_hdlr;
btu_start_timer(&p_dev->vup_timer, BTU_TTYPE_USER_FUNC,
@@ -464,7 +441,7 @@
}
else
{
- BTIF_TRACE_DEBUG0("Restart VUP timer ");
+ BTIF_TRACE_DEBUG("Restart VUP timer ");
btu_stop_timer(&p_dev->vup_timer);
btu_start_timer(&p_dev->vup_timer, BTU_TTYPE_USER_FUNC,
BTIF_TIMEOUT_VUP_SECS);
@@ -486,7 +463,7 @@
int i;
for (i = 0; i < BTIF_HH_MAX_ADDED_DEV; i++) {
if (memcmp(&(btif_hh_cb.added_devices[i].bd_addr), &bda, BD_ADDR_LEN) == 0) {
- BTIF_TRACE_WARNING6(" Device %02X:%02X:%02X:%02X:%02X:%02X already added",
+ BTIF_TRACE_WARNING(" Device %02X:%02X:%02X:%02X:%02X:%02X already added",
bda.address[0], bda.address[1], bda.address[2], bda.address[3], bda.address[4], bda.address[5]);
return FALSE;
}
@@ -499,7 +476,7 @@
btif_hh_cb.added_devices[i].bd_addr.address[4] == 0 &&
btif_hh_cb.added_devices[i].bd_addr.address[5] == 0)
{
- BTIF_TRACE_WARNING6(" Added device %02X:%02X:%02X:%02X:%02X:%02X",
+ BTIF_TRACE_WARNING(" Added device %02X:%02X:%02X:%02X:%02X:%02X",
bda.address[0], bda.address[1], bda.address[2], bda.address[3], bda.address[4], bda.address[5]);
memcpy(&(btif_hh_cb.added_devices[i].bd_addr), &bda, BD_ADDR_LEN);
btif_hh_cb.added_devices[i].dev_handle = BTA_HH_INVALID_HANDLE;
@@ -508,7 +485,7 @@
}
}
- BTIF_TRACE_WARNING1("%s: Error, out of space to add device",__FUNCTION__);
+ BTIF_TRACE_WARNING("%s: Error, out of space to add device",__FUNCTION__);
return FALSE;
}
@@ -542,7 +519,7 @@
p_dev = btif_hh_find_dev_by_bda(&bd_addr);
if (p_dev == NULL) {
- BTIF_TRACE_WARNING6(" Oops, can't find device [%02x:%02x:%02x:%02x:%02x:%02x]",
+ BTIF_TRACE_WARNING(" Oops, can't find device [%02x:%02x:%02x:%02x:%02x:%02x]",
bd_addr.address[0], bd_addr.address[1], bd_addr.address[2], bd_addr.address[3], bd_addr.address[4], bd_addr.address[5]);
return;
}
@@ -556,12 +533,12 @@
btif_hh_cb.device_num--;
}
else {
- BTIF_TRACE_WARNING1("%s: device_num = 0", __FUNCTION__);
+ BTIF_TRACE_WARNING("%s: device_num = 0", __FUNCTION__);
}
p_dev->hh_keep_polling = 0;
p_dev->hh_poll_thread_id = -1;
- BTIF_TRACE_DEBUG2("%s: uhid fd = %d", __FUNCTION__, p_dev->fd);
+ BTIF_TRACE_DEBUG("%s: uhid fd = %d", __FUNCTION__, p_dev->fd);
if (p_dev->fd >= 0) {
bta_hh_co_destroy(p_dev->fd);
p_dev->fd = -1;
@@ -577,7 +554,7 @@
dest->descriptor.dsc_list = (UINT8 *) GKI_getbuf(src->descriptor.dl_len);
if (dest->descriptor.dsc_list == NULL)
{
- BTIF_TRACE_WARNING1("%s: Failed to allocate DSCP for CB", __FUNCTION__);
+ BTIF_TRACE_WARNING("%s: Failed to allocate DSCP for CB", __FUNCTION__);
return FALSE;
}
}
@@ -587,6 +564,8 @@
dest->product_id = src->product_id;
dest->version = src->version;
dest->ctry_code = src->ctry_code;
+ dest->ssr_max_latency = src->ssr_max_latency;
+ dest->ssr_min_tout = src->ssr_min_tout;
return TRUE;
}
@@ -604,7 +583,7 @@
bt_status_t btif_hh_virtual_unplug(bt_bdaddr_t *bd_addr)
{
- BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s", __FUNCTION__);
btif_hh_device_t *p_dev;
char bd_str[18];
sprintf(bd_str, "%02X:%02X:%02X:%02X:%02X:%02X",
@@ -614,7 +593,7 @@
if ((p_dev != NULL) && (p_dev->dev_status == BTHH_CONN_STATE_CONNECTED)
&& (p_dev->attr_mask & HID_VIRTUAL_CABLE))
{
- BTIF_TRACE_DEBUG1("%s Sending BTA_HH_CTRL_VIRTUAL_CABLE_UNPLUG", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s Sending BTA_HH_CTRL_VIRTUAL_CABLE_UNPLUG", __FUNCTION__);
/* start the timer */
btif_hh_start_vup_timer(bd_addr);
p_dev->local_vup = TRUE;
@@ -623,7 +602,7 @@
}
else
{
- BTIF_TRACE_ERROR2("%s: Error, device %s not opened.", __FUNCTION__, bd_str);
+ BTIF_TRACE_ERROR("%s: Error, device %s not opened.", __FUNCTION__, bd_str);
return BT_STATUS_FAIL;
}
}
@@ -648,12 +627,12 @@
tBTA_HH_CONN conn;
CHECK_BTHH_INIT();
dev = btif_hh_find_dev_by_bda(bd_addr);
- BTIF_TRACE_DEBUG0("Connect _hh");
+ BTIF_TRACE_DEBUG("Connect _hh");
sprintf(bda_str, "%02X:%02X:%02X:%02X:%02X:%02X",
(*bda)[0], (*bda)[1], (*bda)[2], (*bda)[3], (*bda)[4], (*bda)[5]);
if (dev == NULL && btif_hh_cb.device_num >= BTIF_HH_MAX_HID) {
// No space for more HID device now.
- BTIF_TRACE_WARNING2("%s: Error, exceeded the maximum supported HID device number %d",
+ BTIF_TRACE_WARNING("%s: Error, exceeded the maximum supported HID device number %d",
__FUNCTION__, BTIF_HH_MAX_HID);
return BT_STATUS_FAIL;
}
@@ -661,7 +640,7 @@
for (i = 0; i < BTIF_HH_MAX_ADDED_DEV; i++) {
if (memcmp(&(btif_hh_cb.added_devices[i].bd_addr), bd_addr, BD_ADDR_LEN) == 0) {
added_dev = &btif_hh_cb.added_devices[i];
- BTIF_TRACE_WARNING3("%s: Device %s already added, attr_mask = 0x%x",
+ BTIF_TRACE_WARNING("%s: Device %s already added, attr_mask = 0x%x",
__FUNCTION__, bda_str, added_dev->attr_mask);
}
}
@@ -669,7 +648,7 @@
if (added_dev != NULL) {
if (added_dev->dev_handle == BTA_HH_INVALID_HANDLE) {
// No space for more HID device now.
- BTIF_TRACE_ERROR2("%s: Error, device %s added but addition failed", __FUNCTION__, bda_str);
+ BTIF_TRACE_ERROR("%s: Error, device %s added but addition failed", __FUNCTION__, bda_str);
memset(&(added_dev->bd_addr), 0, 6);
added_dev->dev_handle = BTA_HH_INVALID_HANDLE;
return BT_STATUS_FAIL;
@@ -688,7 +667,7 @@
else
{
// This device shall be connected from the host side.
- BTIF_TRACE_ERROR2("%s: Error, device %s can only be reconnected from device side",
+ BTIF_TRACE_ERROR("%s: Error, device %s can only be reconnected from device side",
__FUNCTION__, bda_str);
return BT_STATUS_FAIL;
}
@@ -717,7 +696,7 @@
BTA_HhClose(p_dev->dev_handle);
}
else
- BTIF_TRACE_DEBUG1("%s-- Error: device not connected:",__FUNCTION__);
+ BTIF_TRACE_DEBUG("%s-- Error: device not connected:",__FUNCTION__);
}
/*******************************************************************************
@@ -734,7 +713,7 @@
{
BT_HDR* p_buf = create_pbuf(size, report);
if (p_buf == NULL) {
- APPL_TRACE_ERROR2("%s: Error, failed to allocate RPT buffer, size = %d", __FUNCTION__, size);
+ APPL_TRACE_ERROR("%s: Error, failed to allocate RPT buffer, size = %d", __FUNCTION__, size);
return;
}
BTA_HhSetReport(p_dev->dev_handle, r_type, p_buf);
@@ -768,21 +747,21 @@
int i;
int len, tmplen;
- BTIF_TRACE_DEBUG2("%s: event=%s", __FUNCTION__, dump_hh_event(event));
+ BTIF_TRACE_DEBUG("%s: event=%s", __FUNCTION__, dump_hh_event(event));
switch (event)
{
case BTA_HH_ENABLE_EVT:
- BTIF_TRACE_DEBUG2("%s: BTA_HH_ENABLE_EVT: status =%d",__FUNCTION__, p_data->status);
+ BTIF_TRACE_DEBUG("%s: BTA_HH_ENABLE_EVT: status =%d",__FUNCTION__, p_data->status);
if (p_data->status == BTA_HH_OK) {
btif_hh_cb.status = BTIF_HH_ENABLED;
- BTIF_TRACE_DEBUG1("%s--Loading added devices",__FUNCTION__);
+ BTIF_TRACE_DEBUG("%s--Loading added devices",__FUNCTION__);
/* Add hid descriptors for already bonded hid devices*/
btif_storage_load_bonded_hid_info();
}
else {
btif_hh_cb.status = BTIF_HH_DISABLED;
- BTIF_TRACE_WARNING1("BTA_HH_ENABLE_EVT: Error, HH enabling failed, status = %d", p_data->status);
+ BTIF_TRACE_WARNING("BTA_HH_ENABLE_EVT: Error, HH enabling failed, status = %d", p_data->status);
}
break;
@@ -797,15 +776,15 @@
}
}
else
- BTIF_TRACE_WARNING1("BTA_HH_DISABLE_EVT: Error, HH disabling failed, status = %d", p_data->status);
+ BTIF_TRACE_WARNING("BTA_HH_DISABLE_EVT: Error, HH disabling failed, status = %d", p_data->status);
break;
case BTA_HH_OPEN_EVT:
- BTIF_TRACE_WARNING3("%s: BTA_HH_OPN_EVT: handle=%d, status =%d",__FUNCTION__, p_data->conn.handle, p_data->conn.status);
+ BTIF_TRACE_WARNING("%s: BTA_HH_OPN_EVT: handle=%d, status =%d",__FUNCTION__, p_data->conn.handle, p_data->conn.status);
if (p_data->conn.status == BTA_HH_OK) {
p_dev = btif_hh_find_connected_dev_by_handle(p_data->conn.handle);
if (p_dev == NULL) {
- BTIF_TRACE_WARNING1("BTA_HH_OPEN_EVT: Error, cannot find device with handle %d", p_data->conn.handle);
+ BTIF_TRACE_WARNING("BTA_HH_OPEN_EVT: Error, cannot find device with handle %d", p_data->conn.handle);
btif_hh_cb.status = BTIF_HH_DEV_DISCONNECTED;
// The connect request must come from device side and exceeded the connected
// HID device number.
@@ -813,14 +792,14 @@
HAL_CBACK(bt_hh_callbacks, connection_state_cb, (bt_bdaddr_t*) &p_data->conn.bda,BTHH_CONN_STATE_DISCONNECTED);
}
else if (p_dev->fd < 0) {
- BTIF_TRACE_WARNING0("BTA_HH_OPEN_EVT: Error, failed to find the uhid driver...");
+ BTIF_TRACE_WARNING("BTA_HH_OPEN_EVT: Error, failed to find the uhid driver...");
memcpy(&(p_dev->bd_addr), p_data->conn.bda, BD_ADDR_LEN);
//remove the connection and then try again to reconnect from the mouse side to recover
btif_hh_cb.status = BTIF_HH_DEV_DISCONNECTED;
BTA_HhClose(p_data->conn.handle);
}
else {
- BTIF_TRACE_WARNING1("BTA_HH_OPEN_EVT: Found device...Getting dscp info for handle ... %d",p_data->conn.handle);
+ BTIF_TRACE_WARNING("BTA_HH_OPEN_EVT: Found device...Getting dscp info for handle ... %d",p_data->conn.handle);
memcpy(&(p_dev->bd_addr), p_data->conn.bda, BD_ADDR_LEN);
btif_hh_cb.status = BTIF_HH_DEV_CONNECTED;
// Send set_idle if the peer_device is a keyboard
@@ -841,11 +820,11 @@
}
break;
case BTA_HH_CLOSE_EVT:
- BTIF_TRACE_DEBUG2("BTA_HH_CLOSE_EVT: status = %d, handle = %d",
+ BTIF_TRACE_DEBUG("BTA_HH_CLOSE_EVT: status = %d, handle = %d",
p_data->dev_status.status, p_data->dev_status.handle);
p_dev = btif_hh_find_connected_dev_by_handle(p_data->dev_status.handle);
if (p_dev != NULL) {
- BTIF_TRACE_DEBUG2("%s: uhid fd = %d", __FUNCTION__, p_dev->fd);
+ BTIF_TRACE_DEBUG("%s: uhid fd = %d", __FUNCTION__, p_dev->fd);
if(p_dev->vup_timer_active)
{
btif_hh_stop_vup_timer(&(p_dev->bd_addr));
@@ -853,12 +832,12 @@
btif_hh_cb.status = BTIF_HH_DEV_DISCONNECTED;
p_dev->dev_status = BTHH_CONN_STATE_DISCONNECTED;
HAL_CBACK(bt_hh_callbacks, connection_state_cb,&(p_dev->bd_addr), p_dev->dev_status);
- BTIF_TRACE_DEBUG2("%s: Closing uhid fd = %d", __FUNCTION__, p_dev->fd);
+ BTIF_TRACE_DEBUG("%s: Closing uhid fd = %d", __FUNCTION__, p_dev->fd);
bta_hh_co_destroy(p_dev->fd);
p_dev->fd = -1;
}
else {
- BTIF_TRACE_WARNING1("Error: cannot find device with handle %d", p_data->dev_status.handle);
+ BTIF_TRACE_WARNING("Error: cannot find device with handle %d", p_data->dev_status.handle);
}
break;
case BTA_HH_GET_RPT_EVT: {
@@ -866,7 +845,7 @@
UINT8 *data = NULL;
UINT16 len = 0;
- BTIF_TRACE_DEBUG2("BTA_HH_GET_RPT_EVT: status = %d, handle = %d",
+ BTIF_TRACE_DEBUG("BTA_HH_GET_RPT_EVT: status = %d, handle = %d",
p_data->hs_data.status, p_data->hs_data.handle);
p_dev = btif_hh_find_connected_dev_by_handle(p_data->hs_data.handle);
if (p_dev) {
@@ -883,12 +862,12 @@
(bthh_status_t) p_data->hs_data.status);
}
} else {
- BTIF_TRACE_WARNING1("Error: cannot find device with handle %d", p_data->hs_data.handle);
+ BTIF_TRACE_WARNING("Error: cannot find device with handle %d", p_data->hs_data.handle);
}
break;
}
case BTA_HH_SET_RPT_EVT:
- BTIF_TRACE_DEBUG2("BTA_HH_SET_RPT_EVT: status = %d, handle = %d",
+ BTIF_TRACE_DEBUG("BTA_HH_SET_RPT_EVT: status = %d, handle = %d",
p_data->dev_status.status, p_data->dev_status.handle);
p_dev = btif_hh_find_connected_dev_by_handle(p_data->dev_status.handle);
if (p_dev != NULL) {
@@ -900,7 +879,7 @@
case BTA_HH_GET_PROTO_EVT:
p_dev = btif_hh_find_connected_dev_by_handle(p_data->dev_status.handle);
- BTIF_TRACE_WARNING4("BTA_HH_GET_PROTO_EVT: status = %d, handle = %d, proto = [%d], %s",
+ BTIF_TRACE_WARNING("BTA_HH_GET_PROTO_EVT: status = %d, handle = %d, proto = [%d], %s",
p_data->hs_data.status, p_data->hs_data.handle,
p_data->hs_data.rsp_data.proto_mode,
(p_data->hs_data.rsp_data.proto_mode == BTA_HH_PROTO_RPT_MODE) ? "Report Mode" :
@@ -918,7 +897,7 @@
break;
case BTA_HH_SET_PROTO_EVT:
- BTIF_TRACE_DEBUG2("BTA_HH_SET_PROTO_EVT: status = %d, handle = %d",
+ BTIF_TRACE_DEBUG("BTA_HH_SET_PROTO_EVT: status = %d, handle = %d",
p_data->dev_status.status, p_data->dev_status.handle);
p_dev = btif_hh_find_connected_dev_by_handle(p_data->dev_status.handle);
if (p_dev) {
@@ -929,24 +908,22 @@
break;
case BTA_HH_GET_IDLE_EVT:
- BTIF_TRACE_DEBUG3("BTA_HH_GET_IDLE_EVT: handle = %d, status = %d, rate = %d",
+ BTIF_TRACE_DEBUG("BTA_HH_GET_IDLE_EVT: handle = %d, status = %d, rate = %d",
p_data->hs_data.handle, p_data->hs_data.status,
p_data->hs_data.rsp_data.idle_rate);
break;
case BTA_HH_SET_IDLE_EVT:
- BTIF_TRACE_DEBUG2("BTA_HH_SET_IDLE_EVT: status = %d, handle = %d",
+ BTIF_TRACE_DEBUG("BTA_HH_SET_IDLE_EVT: status = %d, handle = %d",
p_data->dev_status.status, p_data->dev_status.handle);
break;
case BTA_HH_GET_DSCP_EVT:
- BTIF_TRACE_WARNING2("BTA_HH_GET_DSCP_EVT: status = %d, handle = %d",
- p_data->dev_status.status, p_data->dev_status.handle);
- len = p_data->dscp_info.descriptor.dl_len;
- BTIF_TRACE_DEBUG1("BTA_HH_GET_DSCP_EVT: len = %d", len);
+ len = p_data->dscp_info.descriptor.dl_len;
+ BTIF_TRACE_DEBUG("BTA_HH_GET_DSCP_EVT: len = %d", len);
p_dev = btif_hh_cb.p_curr_dev;
if (p_dev == NULL) {
- BTIF_TRACE_ERROR0("BTA_HH_GET_DSCP_EVT: No HID device is currently connected");
+ BTIF_TRACE_ERROR("BTA_HH_GET_DSCP_EVT: No HID device is currently connected");
return;
}
if (p_dev->fd < 0) {
@@ -969,7 +946,7 @@
cached_name = "Bluetooth HID";
}
- BTIF_TRACE_WARNING2("%s: name = %s", __FUNCTION__, cached_name);
+ BTIF_TRACE_WARNING("%s: name = %s", __FUNCTION__, cached_name);
bta_hh_co_send_hid_info(p_dev, cached_name,
p_data->dscp_info.vendor_id, p_data->dscp_info.product_id,
p_data->dscp_info.version, p_data->dscp_info.ctry_code,
@@ -981,7 +958,7 @@
bt_status_t ret;
bdcpy(bda, p_dev->bd_addr.address);
btif_hh_copy_hid_info(&dscp_info, &p_data->dscp_info);
- BTIF_TRACE_DEBUG6("BTA_HH_GET_DSCP_EVT:bda = %02x:%02x:%02x:%02x:%02x:%02x",
+ BTIF_TRACE_DEBUG("BTA_HH_GET_DSCP_EVT:bda = %02x:%02x:%02x:%02x:%02x:%02x",
p_dev->bd_addr.address[0], p_dev->bd_addr.address[1],
p_dev->bd_addr.address[2],p_dev->bd_addr.address[3],
p_dev->bd_addr.address[4], p_dev->bd_addr.address[5]);
@@ -994,7 +971,7 @@
len, p_data->dscp_info.descriptor.dsc_list);
ASSERTC(ret == BT_STATUS_SUCCESS, "storing hid info failed", ret);
- BTIF_TRACE_WARNING0("BTA_HH_GET_DSCP_EVT: Called add device");
+ BTIF_TRACE_WARNING("BTA_HH_GET_DSCP_EVT: Called add device");
//Free buffer created for dscp_info;
if (dscp_info.descriptor.dl_len >0 && dscp_info.descriptor.dsc_list != NULL)
@@ -1006,7 +983,7 @@
}
else {
//Device already added.
- BTIF_TRACE_WARNING1("%s: Device already added ",__FUNCTION__);
+ BTIF_TRACE_WARNING("%s: Device already added ",__FUNCTION__);
}
/*Sync HID Keyboard lockstates */
tmplen = sizeof(hid_kb_numlock_on_list)
@@ -1018,7 +995,7 @@
p_data->dscp_info.product_id
== hid_kb_numlock_on_list[i].product_id)
{
- BTIF_TRACE_DEBUG3("%s() idx[%d] Enabling "\
+ BTIF_TRACE_DEBUG("%s() idx[%d] Enabling "\
"NUMLOCK for device :: %s", __FUNCTION__,
i, hid_kb_numlock_on_list[i].kb_name);
/* Enable NUMLOCK by default so that numeric
@@ -1034,7 +1011,7 @@
break;
case BTA_HH_ADD_DEV_EVT:
- BTIF_TRACE_WARNING2("BTA_HH_ADD_DEV_EVT: status = %d, handle = %d",p_data->dev_info.status, p_data->dev_info.handle);
+ BTIF_TRACE_WARNING("BTA_HH_ADD_DEV_EVT: status = %d, handle = %d",p_data->dev_info.status, p_data->dev_info.handle);
int i;
for (i = 0; i < BTIF_HH_MAX_ADDED_DEV; i++) {
if (memcmp(btif_hh_cb.added_devices[i].bd_addr.address, p_data->dev_info.bda, 6) == 0) {
@@ -1050,21 +1027,21 @@
}
break;
case BTA_HH_RMV_DEV_EVT:
- BTIF_TRACE_DEBUG2("BTA_HH_RMV_DEV_EVT: status = %d, handle = %d",
+ BTIF_TRACE_DEBUG("BTA_HH_RMV_DEV_EVT: status = %d, handle = %d",
p_data->dev_info.status, p_data->dev_info.handle);
- BTIF_TRACE_DEBUG6("BTA_HH_RMV_DEV_EVT:bda = %02x:%02x:%02x:%02x:%02x:%02x",
+ BTIF_TRACE_DEBUG("BTA_HH_RMV_DEV_EVT:bda = %02x:%02x:%02x:%02x:%02x:%02x",
p_data->dev_info.bda[0], p_data->dev_info.bda[1], p_data->dev_info.bda[2],
p_data->dev_info.bda[3], p_data->dev_info.bda[4], p_data->dev_info.bda[5]);
break;
case BTA_HH_VC_UNPLUG_EVT:
- BTIF_TRACE_DEBUG2("BTA_HH_VC_UNPLUG_EVT: status = %d, handle = %d",
+ BTIF_TRACE_DEBUG("BTA_HH_VC_UNPLUG_EVT: status = %d, handle = %d",
p_data->dev_status.status, p_data->dev_status.handle);
p_dev = btif_hh_find_connected_dev_by_handle(p_data->dev_status.handle);
btif_hh_cb.status = BTIF_HH_DEV_DISCONNECTED;
if (p_dev != NULL) {
- BTIF_TRACE_DEBUG6("BTA_HH_VC_UNPLUG_EVT:bda = %02x:%02x:%02x:%02x:%02x:%02x",
+ BTIF_TRACE_DEBUG("BTA_HH_VC_UNPLUG_EVT:bda = %02x:%02x:%02x:%02x:%02x:%02x",
p_dev->bd_addr.address[0], p_dev->bd_addr.address[1],
p_dev->bd_addr.address[2],p_dev->bd_addr.address[3],
p_dev->bd_addr.address[4], p_dev->bd_addr.address[5]);
@@ -1074,9 +1051,9 @@
btif_hh_stop_vup_timer(&(p_dev->bd_addr));
}
p_dev->dev_status = BTHH_CONN_STATE_DISCONNECTED;
- BTIF_TRACE_DEBUG1("%s---Sending connection state change", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s---Sending connection state change", __FUNCTION__);
HAL_CBACK(bt_hh_callbacks, connection_state_cb,&(p_dev->bd_addr), p_dev->dev_status);
- BTIF_TRACE_DEBUG1("%s---Removing HID bond", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s---Removing HID bond", __FUNCTION__);
/* If it is locally initiated VUP or remote device has its major COD as
Peripheral removed the bond.*/
if (p_dev->local_vup || check_cod_hid(&(p_dev->bd_addr), COD_HID_MAJOR))
@@ -1098,7 +1075,7 @@
default:
- BTIF_TRACE_WARNING2("%s: Unhandled event: %d", __FUNCTION__, event);
+ BTIF_TRACE_WARNING("%s: Unhandled event: %d", __FUNCTION__, event);
break;
}
}
@@ -1156,7 +1133,7 @@
static void btif_hh_handle_evt(UINT16 event, char *p_param)
{
bt_bdaddr_t *bd_addr = (bt_bdaddr_t*)p_param;
- BTIF_TRACE_EVENT2("%s: event=%d", __FUNCTION__, event);
+ BTIF_TRACE_EVENT("%s: event=%d", __FUNCTION__, event);
int ret;
switch(event)
{
@@ -1174,7 +1151,7 @@
case BTIF_HH_DISCONNECT_REQ_EVT:
{
- BTIF_TRACE_EVENT2("%s: event=%d", __FUNCTION__, event);
+ BTIF_TRACE_EVENT("%s: event=%d", __FUNCTION__, event);
btif_hh_disconnect(bd_addr);
HAL_CBACK(bt_hh_callbacks, connection_state_cb,bd_addr,BTHH_CONN_STATE_DISCONNECTING);
}
@@ -1182,14 +1159,14 @@
case BTIF_HH_VUP_REQ_EVT:
{
- BTIF_TRACE_EVENT2("%s: event=%d", __FUNCTION__, event);
+ BTIF_TRACE_EVENT("%s: event=%d", __FUNCTION__, event);
ret = btif_hh_virtual_unplug(bd_addr);
}
break;
default:
{
- BTIF_TRACE_WARNING2("%s : Unknown event 0x%x", __FUNCTION__, event);
+ BTIF_TRACE_WARNING("%s : Unknown event 0x%x", __FUNCTION__, event);
}
break;
}
@@ -1212,7 +1189,7 @@
int param_len = 0;
memset(&p_data, 0, sizeof(tBTA_HH));
- BTIF_TRACE_DEBUG2("%s timer_in_use=%d", __FUNCTION__, tle->in_use );
+ BTIF_TRACE_DEBUG("%s timer_in_use=%d", __FUNCTION__, tle->in_use );
for (i = 0; i < BTIF_HH_MAX_HID; i++) {
if (btif_hh_cb.devices[i].dev_status == BTHH_CONN_STATE_CONNECTED)
@@ -1248,7 +1225,7 @@
static bt_status_t init( bthh_callbacks_t* callbacks )
{
UINT32 i;
- BTIF_TRACE_EVENT1("%s", __FUNCTION__);
+ BTIF_TRACE_EVENT("%s", __FUNCTION__);
bt_hh_callbacks = callbacks;
memset(&btif_hh_cb, 0, sizeof(btif_hh_cb));
@@ -1297,7 +1274,7 @@
if (btif_hh_cb.status == BTIF_HH_DISABLED)
{
- BTIF_TRACE_WARNING2("%s: Error, HH status = %d", __FUNCTION__, btif_hh_cb.status);
+ BTIF_TRACE_WARNING("%s: Error, HH status = %d", __FUNCTION__, btif_hh_cb.status);
return BT_STATUS_FAIL;
}
p_dev = btif_hh_find_connected_dev_by_bda(bd_addr);
@@ -1308,7 +1285,7 @@
}
else
{
- BTIF_TRACE_WARNING1("%s: Error, device not opened.", __FUNCTION__);
+ BTIF_TRACE_WARNING("%s: Error, device not opened.", __FUNCTION__);
return BT_STATUS_FAIL;
}
}
@@ -1332,13 +1309,13 @@
bd_addr->address[4], bd_addr->address[5]);
if (btif_hh_cb.status == BTIF_HH_DISABLED)
{
- BTIF_TRACE_ERROR2("%s: Error, HH status = %d", __FUNCTION__, btif_hh_cb.status);
+ BTIF_TRACE_ERROR("%s: Error, HH status = %d", __FUNCTION__, btif_hh_cb.status);
return BT_STATUS_FAIL;
}
p_dev = btif_hh_find_dev_by_bda(bd_addr);
if (!p_dev)
{
- BTIF_TRACE_ERROR2("%s: Error, device %s not opened.", __FUNCTION__, bd_str);
+ BTIF_TRACE_ERROR("%s: Error, device %s not opened.", __FUNCTION__, bd_str);
return BT_STATUS_FAIL;
}
btif_transfer_context(btif_hh_handle_evt, BTIF_HH_VUP_REQ_EVT,
@@ -1362,9 +1339,9 @@
tBTA_HH_DEV_DSCP_INFO dscp_info;
BD_ADDR* bda = (BD_ADDR*) bd_addr;
- BTIF_TRACE_DEBUG6("addr = %02X:%02X:%02X:%02X:%02X:%02X",
+ BTIF_TRACE_DEBUG("addr = %02X:%02X:%02X:%02X:%02X:%02X",
(*bda)[0], (*bda)[1], (*bda)[2], (*bda)[3], (*bda)[4], (*bda)[5]);
- BTIF_TRACE_DEBUG6("%s: sub_class = 0x%02x, app_id = %d, vendor_id = 0x%04x, "
+ BTIF_TRACE_DEBUG("%s: sub_class = 0x%02x, app_id = %d, vendor_id = 0x%04x, "
"product_id = 0x%04x, version= 0x%04x",
__FUNCTION__, hid_info.sub_class,
hid_info.app_id, hid_info.vendor_id, hid_info.product_id,
@@ -1372,7 +1349,7 @@
if (btif_hh_cb.status == BTIF_HH_DISABLED)
{
- BTIF_TRACE_ERROR2("%s: Error, HH status = %d", __FUNCTION__, btif_hh_cb.status);
+ BTIF_TRACE_ERROR("%s: Error, HH status = %d", __FUNCTION__, btif_hh_cb.status);
return BT_STATUS_FAIL;
}
@@ -1400,75 +1377,6 @@
return BT_STATUS_SUCCESS;
}
-/*******************************************************************************
-**
-** Function get_idle_time
-**
-** Description Get the HID idle time
-**
-** Returns bt_status_t
-**
-*******************************************************************************/
-static bt_status_t get_idle_time(bt_bdaddr_t *bd_addr)
-{
- CHECK_BTHH_INIT();
- btif_hh_device_t *p_dev;
- BD_ADDR* bda = (BD_ADDR*) bd_addr;
-
- BTIF_TRACE_DEBUG6(" addr = %02X:%02X:%02X:%02X:%02X:%02X",
- (*bda)[0], (*bda)[1], (*bda)[2], (*bda)[3], (*bda)[4], (*bda)[5]);
-
- if (btif_hh_cb.status == BTIF_HH_DISABLED) {
- BTIF_TRACE_ERROR2("%s: Error, HH status = %d", __FUNCTION__, btif_hh_cb.status);
- return BT_STATUS_FAIL;
- }
-
- p_dev = btif_hh_find_connected_dev_by_bda(bd_addr);
- if (p_dev != NULL) {
- //BTA_HhGetIdle(p_dev->dev_handle);
- }
- else {
- return BT_STATUS_FAIL;
- }
- return BT_STATUS_SUCCESS;
-}
-
-/*******************************************************************************
-**
-** Function set_idle_time
-**
-** Description Set the HID idle time
-**
-** Returns bt_status_t
-**
-*******************************************************************************/
-static bt_status_t set_idle_time (bt_bdaddr_t *bd_addr, uint8_t idle_time)
-{
- UNUSED(idle_time);
-
- CHECK_BTHH_INIT();
- btif_hh_device_t *p_dev;
- BD_ADDR* bda = (BD_ADDR*) bd_addr;
-
- BTIF_TRACE_DEBUG6("addr = %02X:%02X:%02X:%02X:%02X:%02X",
- (*bda)[0], (*bda)[1], (*bda)[2], (*bda)[3], (*bda)[4], (*bda)[5]);
-
- if (btif_hh_cb.status == BTIF_HH_DISABLED) {
- BTIF_TRACE_ERROR2("%s: Error, HH status = %d", __FUNCTION__, btif_hh_cb.status);
- return BT_STATUS_FAIL;
- }
-
- p_dev = btif_hh_find_connected_dev_by_bda(bd_addr);
- if (p_dev == NULL) {
- BTIF_TRACE_WARNING6(" Error, device %02X:%02X:%02X:%02X:%02X:%02X not opened.",
- (*bda)[0], (*bda)[1], (*bda)[2], (*bda)[3], (*bda)[4], (*bda)[5]);
- return BT_STATUS_FAIL;
- }
- else {
- //BTA_HhSetIdle(p_dev->dev_handle, idle_time);
- }
- return BT_STATUS_SUCCESS;
-}
/*******************************************************************************
**
@@ -1486,11 +1394,11 @@
BD_ADDR* bda = (BD_ADDR*) bd_addr;
UNUSED(protocolMode);
- BTIF_TRACE_DEBUG6(" addr = %02X:%02X:%02X:%02X:%02X:%02X",
+ BTIF_TRACE_DEBUG(" addr = %02X:%02X:%02X:%02X:%02X:%02X",
(*bda)[0], (*bda)[1], (*bda)[2], (*bda)[3], (*bda)[4], (*bda)[5]);
if (btif_hh_cb.status == BTIF_HH_DISABLED) {
- BTIF_TRACE_ERROR2("%s: Error, HH status = %d", __FUNCTION__, btif_hh_cb.status);
+ BTIF_TRACE_ERROR("%s: Error, HH status = %d", __FUNCTION__, btif_hh_cb.status);
return BT_STATUS_FAIL;
}
@@ -1521,24 +1429,24 @@
UINT8 proto_mode = protocolMode;
BD_ADDR* bda = (BD_ADDR*) bd_addr;
- BTIF_TRACE_DEBUG2("%s:proto_mode = %d", __FUNCTION__,protocolMode);
+ BTIF_TRACE_DEBUG("%s:proto_mode = %d", __FUNCTION__,protocolMode);
- BTIF_TRACE_DEBUG6("addr = %02X:%02X:%02X:%02X:%02X:%02X",
+ BTIF_TRACE_DEBUG("addr = %02X:%02X:%02X:%02X:%02X:%02X",
(*bda)[0], (*bda)[1], (*bda)[2], (*bda)[3], (*bda)[4], (*bda)[5]);
if (btif_hh_cb.status == BTIF_HH_DISABLED) {
- BTIF_TRACE_ERROR2("%s: Error, HH status = %d", __FUNCTION__, btif_hh_cb.status);
+ BTIF_TRACE_ERROR("%s: Error, HH status = %d", __FUNCTION__, btif_hh_cb.status);
return BT_STATUS_FAIL;
}
p_dev = btif_hh_find_connected_dev_by_bda(bd_addr);
if (p_dev == NULL) {
- BTIF_TRACE_WARNING6(" Error, device %02X:%02X:%02X:%02X:%02X:%02X not opened.",
+ BTIF_TRACE_WARNING(" Error, device %02X:%02X:%02X:%02X:%02X:%02X not opened.",
(*bda)[0], (*bda)[1], (*bda)[2], (*bda)[3], (*bda)[4], (*bda)[5]);
return BT_STATUS_FAIL;
}
else if (protocolMode != BTA_HH_PROTO_RPT_MODE && protocolMode != BTA_HH_PROTO_BOOT_MODE) {
- BTIF_TRACE_WARNING2("s: Error, device proto_mode = %d.", __FUNCTION__, proto_mode);
+ BTIF_TRACE_WARNING("s: Error, device proto_mode = %d.", __FUNCTION__, proto_mode);
return BT_STATUS_FAIL;
}
else {
@@ -1564,26 +1472,26 @@
btif_hh_device_t *p_dev;
BD_ADDR* bda = (BD_ADDR*) bd_addr;
- BTIF_TRACE_DEBUG4("%s:proto_mode = %dr_type = %d, rpt_id = %d, buf_size = %d", __FUNCTION__,
+ BTIF_TRACE_DEBUG("%s:proto_mode = %dr_type = %d, rpt_id = %d, buf_size = %d", __FUNCTION__,
reportType, reportId, bufferSize);
- BTIF_TRACE_DEBUG6("addr = %02X:%02X:%02X:%02X:%02X:%02X",
+ BTIF_TRACE_DEBUG("addr = %02X:%02X:%02X:%02X:%02X:%02X",
(*bda)[0], (*bda)[1], (*bda)[2], (*bda)[3], (*bda)[4], (*bda)[5]);
if (btif_hh_cb.status == BTIF_HH_DISABLED) {
- BTIF_TRACE_ERROR2("%s: Error, HH status = %d", __FUNCTION__, btif_hh_cb.status);
+ BTIF_TRACE_ERROR("%s: Error, HH status = %d", __FUNCTION__, btif_hh_cb.status);
return BT_STATUS_FAIL;
}
p_dev = btif_hh_find_connected_dev_by_bda(bd_addr);
if (p_dev == NULL) {
- BTIF_TRACE_ERROR6("%s: Error, device %02X:%02X:%02X:%02X:%02X:%02X not opened.",
+ BTIF_TRACE_ERROR("%s: Error, device %02X:%02X:%02X:%02X:%02X:%02X not opened.",
(*bda)[0], (*bda)[1], (*bda)[2], (*bda)[3], (*bda)[4], (*bda)[5]);
return BT_STATUS_FAIL;
}
else if ( ((int) reportType) <= BTA_HH_RPTT_RESRV || ((int) reportType) > BTA_HH_RPTT_FEATURE) {
- BTIF_TRACE_ERROR6(" Error, device %02X:%02X:%02X:%02X:%02X:%02X not opened.",
+ BTIF_TRACE_ERROR(" Error, device %02X:%02X:%02X:%02X:%02X:%02X not opened.",
(*bda)[0], (*bda)[1], (*bda)[2], (*bda)[3], (*bda)[4], (*bda)[5]);
return BT_STATUS_FAIL;
}
@@ -1610,48 +1518,59 @@
btif_hh_device_t *p_dev;
BD_ADDR* bda = (BD_ADDR*) bd_addr;
- BTIF_TRACE_DEBUG2("%s:reportType = %d", __FUNCTION__,reportType);
+ BTIF_TRACE_DEBUG("%s:reportType = %d", __FUNCTION__,reportType);
- BTIF_TRACE_DEBUG6("addr = %02X:%02X:%02X:%02X:%02X:%02X",
+ BTIF_TRACE_DEBUG("addr = %02X:%02X:%02X:%02X:%02X:%02X",
(*bda)[0], (*bda)[1], (*bda)[2], (*bda)[3], (*bda)[4], (*bda)[5]);
if (btif_hh_cb.status == BTIF_HH_DISABLED) {
- BTIF_TRACE_ERROR2("%s: Error, HH status = %d", __FUNCTION__, btif_hh_cb.status);
+ BTIF_TRACE_ERROR("%s: Error, HH status = %d", __FUNCTION__, btif_hh_cb.status);
return BT_STATUS_FAIL;
}
p_dev = btif_hh_find_connected_dev_by_bda(bd_addr);
if (p_dev == NULL) {
- BTIF_TRACE_ERROR6("%s: Error, device %02X:%02X:%02X:%02X:%02X:%02X not opened.",
+ BTIF_TRACE_ERROR("%s: Error, device %02X:%02X:%02X:%02X:%02X:%02X not opened.",
(*bda)[0], (*bda)[1], (*bda)[2], (*bda)[3], (*bda)[4], (*bda)[5]);
return BT_STATUS_FAIL;
}
else if ( ( (int) reportType) <= BTA_HH_RPTT_RESRV || ( (int) reportType) > BTA_HH_RPTT_FEATURE) {
- BTIF_TRACE_ERROR6(" Error, device %02X:%02X:%02X:%02X:%02X:%02X not opened.",
+ BTIF_TRACE_ERROR(" Error, device %02X:%02X:%02X:%02X:%02X:%02X not opened.",
(*bda)[0], (*bda)[1], (*bda)[2], (*bda)[3], (*bda)[4], (*bda)[5]);
return BT_STATUS_FAIL;
}
else {
int hex_bytes_filled;
- UINT8 hexbuf[200];
+ UINT8 *hexbuf;
UINT16 len = (strlen(report) + 1) / 2;
+ hexbuf = GKI_getbuf(len);
+ if (hexbuf == NULL) {
+ BTIF_TRACE_ERROR("%s: Error, failed to allocate RPT buffer, len = %d",
+ __FUNCTION__, len);
+ return BT_STATUS_FAIL;
+ }
+
/* Build a SetReport data buffer */
- memset(hexbuf, 0, 200);
+ memset(hexbuf, 0, len);
//TODO
hex_bytes_filled = ascii_2_hex(report, len, hexbuf);
- BTIF_TRACE_DEBUG1("Hex bytes filled, hex value: %d", hex_bytes_filled);
+ BTIF_TRACE_DEBUG("Hex bytes filled, hex value: %d", hex_bytes_filled);
if (hex_bytes_filled) {
BT_HDR* p_buf = create_pbuf(hex_bytes_filled, hexbuf);
if (p_buf == NULL) {
- BTIF_TRACE_ERROR2("%s: Error, failed to allocate RPT buffer, len = %d",
+ BTIF_TRACE_ERROR("%s: Error, failed to allocate RPT buffer, len = %d",
__FUNCTION__, hex_bytes_filled);
+ GKI_freebuf(hexbuf);
return BT_STATUS_FAIL;
}
BTA_HhSetReport(p_dev->dev_handle, reportType, p_buf);
+ GKI_freebuf(hexbuf);
+ return BT_STATUS_SUCCESS;
}
- return BT_STATUS_SUCCESS;
+ GKI_freebuf(hexbuf);
+ return BT_STATUS_FAIL;
}
}
@@ -1670,47 +1589,56 @@
btif_hh_device_t *p_dev;
BD_ADDR* bda = (BD_ADDR*) bd_addr;
- BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s", __FUNCTION__);
- BTIF_TRACE_DEBUG6("addr = %02X:%02X:%02X:%02X:%02X:%02X",
+ BTIF_TRACE_DEBUG("addr = %02X:%02X:%02X:%02X:%02X:%02X",
(*bda)[0], (*bda)[1], (*bda)[2], (*bda)[3], (*bda)[4], (*bda)[5]);
if (btif_hh_cb.status == BTIF_HH_DISABLED) {
- BTIF_TRACE_ERROR2("%s: Error, HH status = %d", __FUNCTION__, btif_hh_cb.status);
+ BTIF_TRACE_ERROR("%s: Error, HH status = %d", __FUNCTION__, btif_hh_cb.status);
return BT_STATUS_FAIL;
}
p_dev = btif_hh_find_connected_dev_by_bda(bd_addr);
if (p_dev == NULL) {
- BTIF_TRACE_ERROR6("%s: Error, device %02X:%02X:%02X:%02X:%02X:%02X not opened.",
+ BTIF_TRACE_ERROR("%s: Error, device %02X:%02X:%02X:%02X:%02X:%02X not opened.",
(*bda)[0], (*bda)[1], (*bda)[2], (*bda)[3], (*bda)[4], (*bda)[5]);
return BT_STATUS_FAIL;
}
else {
int hex_bytes_filled;
- UINT8 hexbuf[200];
+ UINT8 *hexbuf;
UINT16 len = (strlen(data) + 1) / 2;
- /* Build a SetReport data buffer */
- memset(hexbuf, 0, 200);
+ hexbuf = GKI_getbuf(len);
+ if (hexbuf == NULL) {
+ BTIF_TRACE_ERROR("%s: Error, failed to allocate RPT buffer, len = %d",
+ __FUNCTION__, len);
+ return BT_STATUS_FAIL;
+ }
+
+ /* Build a SendData data buffer */
+ memset(hexbuf, 0, len);
hex_bytes_filled = ascii_2_hex(data, len, hexbuf);
- BTIF_TRACE_ERROR2("Hex bytes filled, hex value: %d, %d", hex_bytes_filled, len);
+ BTIF_TRACE_ERROR("Hex bytes filled, hex value: %d, %d", hex_bytes_filled, len);
if (hex_bytes_filled) {
BT_HDR* p_buf = create_pbuf(hex_bytes_filled, hexbuf);
if (p_buf == NULL) {
- BTIF_TRACE_ERROR2("%s: Error, failed to allocate RPT buffer, len = %d",
+ BTIF_TRACE_ERROR("%s: Error, failed to allocate RPT buffer, len = %d",
__FUNCTION__, hex_bytes_filled);
+ GKI_freebuf(hexbuf);
return BT_STATUS_FAIL;
}
p_buf->layer_specific = BTA_HH_RPTT_OUTPUT;
BTA_HhSendData(p_dev->dev_handle, *bda, p_buf);
+ GKI_freebuf(hexbuf);
return BT_STATUS_SUCCESS;
}
-
+ GKI_freebuf(hexbuf);
+ return BT_STATUS_FAIL;
}
- return BT_STATUS_FAIL;
}
@@ -1725,18 +1653,18 @@
*******************************************************************************/
static void cleanup( void )
{
- BTIF_TRACE_EVENT1("%s", __FUNCTION__);
+ BTIF_TRACE_EVENT("%s", __FUNCTION__);
btif_hh_device_t *p_dev;
int i;
if (btif_hh_cb.status == BTIF_HH_DISABLED) {
- BTIF_TRACE_WARNING2("%s: HH disabling or disabled already, status = %d", __FUNCTION__, btif_hh_cb.status);
+ BTIF_TRACE_WARNING("%s: HH disabling or disabled already, status = %d", __FUNCTION__, btif_hh_cb.status);
return;
}
btif_hh_cb.status = BTIF_HH_DISABLING;
for (i = 0; i < BTIF_HH_MAX_HID; i++) {
p_dev = &btif_hh_cb.devices[i];
if (p_dev->dev_status != BTHH_CONN_STATE_UNKNOWN && p_dev->fd >= 0) {
- BTIF_TRACE_DEBUG2("%s: Closing uhid fd = %d", __FUNCTION__, p_dev->fd);
+ BTIF_TRACE_DEBUG("%s: Closing uhid fd = %d", __FUNCTION__, p_dev->fd);
bta_hh_co_destroy(p_dev->fd);
p_dev->fd = -1;
p_dev->hh_keep_polling = 0;
@@ -1783,7 +1711,7 @@
if (b_enable)
{
/* Enable and register with BTA-HH */
- BTA_HhEnable(BTA_SEC_NONE, bte_hh_evt);
+ BTA_HhEnable(BTA_SEC_ENCRYPT, bte_hh_evt);
}
else {
/* Disable HH */
@@ -1803,6 +1731,6 @@
*******************************************************************************/
const bthh_interface_t *btif_hh_get_interface()
{
- BTIF_TRACE_EVENT1("%s", __FUNCTION__);
+ BTIF_TRACE_EVENT("%s", __FUNCTION__);
return &bthhInterface;
}
diff --git a/btif/src/btif_hl.c b/btif/src/btif_hl.c
index e80a0b9..64b1f59 100644
--- a/btif/src/btif_hl.c
+++ b/btif/src/btif_hl.c
@@ -41,6 +41,7 @@
#include <ctype.h>
#include <sys/select.h>
#include <sys/poll.h>
+#include <sys/prctl.h>
#include <cutils/sockets.h>
#include <cutils/log.h>
@@ -89,12 +90,11 @@
static int listen_s = -1;
static int connected_s = -1;
static int select_thread_id = -1;
-static int signal_fds[2];
+static int signal_fds[2] = { -1, -1 };
static BUFFER_Q soc_queue;
static int reg_counter;
static inline int btif_hl_select_wakeup(void);
-static inline int btif_hl_select_exit(void);
static inline int btif_hl_select_close_connected(void);
static inline int btif_hl_close_select_thread(void);
static UINT8 btif_hl_get_next_app_id(void);
@@ -131,12 +131,12 @@
#define CHECK_BTHL_INIT() if (bt_hl_callbacks == NULL)\
{\
- BTIF_TRACE_WARNING1("BTHL: %s: BTHL not initialized", __FUNCTION__);\
+ BTIF_TRACE_WARNING("BTHL: %s: BTHL not initialized", __FUNCTION__);\
return BT_STATUS_NOT_READY;\
}\
else\
{\
- BTIF_TRACE_EVENT1("BTHL: %s", __FUNCTION__);\
+ BTIF_TRACE_EVENT("BTHL: %s", __FUNCTION__);\
}
@@ -171,7 +171,7 @@
{
char name[16];
prctl(BTIF_IF_GET_NAME, name, 0, 0, 0);
- BTIF_TRACE_DEBUG1("Process name (%s)", name);
+ BTIF_TRACE_DEBUG("Process name (%s)", name);
}
#define BTIF_TIMEOUT_CCH_NO_DCH_SECS 30
/*******************************************************************************
@@ -189,6 +189,9 @@
btif_hl_mcl_cb_t *p_mcb;
UINT8 i, j;
BOOLEAN found=FALSE;
+
+ *p_app_idx = 0;
+ *p_mcl_idx = 0;
for (i=0; i < BTA_HL_NUM_APPS ; i ++)
{
p_acb =BTIF_HL_GET_APP_CB_PTR(i);
@@ -210,7 +213,7 @@
if (found)
break;
}
- BTIF_TRACE_DEBUG5("%s found=%d channel_id=0x%08x",
+ BTIF_TRACE_DEBUG("%s found=%d channel_id=0x%08x",
__FUNCTION__, found, channel_id, *p_app_idx, *p_mcl_idx);
return found;
@@ -232,25 +235,25 @@
for (i=0; i<BTA_HL_NUM_APPS; i++)
{
- BTIF_TRACE_DEBUG1("btif_hl_num_dchs:i = %d",i);
+ BTIF_TRACE_DEBUG("btif_hl_num_dchs:i = %d",i);
p_acb =BTIF_HL_GET_APP_CB_PTR(i);
if (p_acb && p_acb->in_use)
{
for (j=0; j < BTA_HL_NUM_MCLS ; j++)
{
if(p_acb->mcb[j].in_use)
- BTIF_TRACE_DEBUG3("btif_hl_num_dchs:mcb in use j=%d, mcl_handle=%d,mcb handle=%d",
+ BTIF_TRACE_DEBUG("btif_hl_num_dchs:mcb in use j=%d, mcl_handle=%d,mcb handle=%d",
j,mcl_handle, p_acb->mcb[j].mcl_handle);
if (p_acb->mcb[j].in_use &&
(p_acb->mcb[j].mcl_handle == mcl_handle))
{
p_mcb = &p_acb->mcb[j];
- BTIF_TRACE_DEBUG1("btif_hl_num_dchs: mcl handle found j =%d",j);
+ BTIF_TRACE_DEBUG("btif_hl_num_dchs: mcl handle found j =%d",j);
for (x=0; x < BTA_HL_NUM_MDLS_PER_MCL ; x ++)
{
if (p_mcb->mdl[x].in_use)
{
- BTIF_TRACE_DEBUG1("btif_hl_num_dchs_in_use:found x =%d",x);
+ BTIF_TRACE_DEBUG("btif_hl_num_dchs_in_use:found x =%d",x);
cnt++;
}
}
@@ -259,7 +262,7 @@
}
}
- BTIF_TRACE_DEBUG2("%s dch in use count=%d", __FUNCTION__, cnt);
+ BTIF_TRACE_DEBUG("%s dch in use count=%d", __FUNCTION__, cnt);
return cnt;
}
/*******************************************************************************
@@ -274,7 +277,7 @@
{
btif_hl_mcl_cb_t *p_mcb;
UINT8 i,j;
- BTIF_TRACE_DEBUG2("%s timer_in_use=%d", __FUNCTION__, tle->in_use );
+ BTIF_TRACE_DEBUG("%s timer_in_use=%d", __FUNCTION__, tle->in_use );
for (i=0; i < BTA_HL_NUM_APPS ; i ++)
{
@@ -284,18 +287,18 @@
if (p_mcb->cch_timer_active)
{
- BTIF_TRACE_DEBUG3("%app_idx=%d, mcl_idx=%d mcl-connected=%d",
+ BTIF_TRACE_DEBUG("%app_idx=%d, mcl_idx=%d mcl-connected=%d",
i, j, p_mcb->is_connected);
p_mcb->cch_timer_active = FALSE;
if (p_mcb->is_connected)
{
- BTIF_TRACE_DEBUG3("Idle timeout Close CCH app_idx=%d mcl_idx=%d mcl_handle=%d",
+ BTIF_TRACE_DEBUG("Idle timeout Close CCH app_idx=%d mcl_idx=%d mcl_handle=%d",
i ,j, p_mcb->mcl_handle);
BTA_HlCchClose(p_mcb->mcl_handle);
}
else
{
- BTIF_TRACE_DEBUG2("CCH idle timeout But CCH not connected app_idx=%d mcl_idx=%d ",i,j);
+ BTIF_TRACE_DEBUG("CCH idle timeout But CCH not connected app_idx=%d mcl_idx=%d ",i,j);
}
}
}
@@ -312,13 +315,13 @@
void btif_hl_stop_cch_timer(UINT8 app_idx, UINT8 mcl_idx)
{
btif_hl_mcl_cb_t *p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
- BTIF_TRACE_DEBUG4("%s app_idx=%d, mcl_idx=%d timer_in_use=%d",
+ BTIF_TRACE_DEBUG("%s app_idx=%d, mcl_idx=%d timer_in_use=%d",
__FUNCTION__,app_idx, mcl_idx, p_mcb->cch_timer.in_use);
p_mcb->cch_timer_active = FALSE;
if (p_mcb->cch_timer.in_use)
{
- BTIF_TRACE_DEBUG0("stop CCH timer ");
+ BTIF_TRACE_DEBUG("stop CCH timer ");
btu_stop_timer(&p_mcb->cch_timer);
}
}
@@ -333,14 +336,14 @@
void btif_hl_start_cch_timer(UINT8 app_idx, UINT8 mcl_idx)
{
btif_hl_mcl_cb_t *p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
- BTIF_TRACE_DEBUG5("%s app_idx=%d, mcl_idx=%d timer_active=%d timer_in_use=%d",
+ BTIF_TRACE_DEBUG("%s app_idx=%d, mcl_idx=%d timer_active=%d timer_in_use=%d",
__FUNCTION__,app_idx, mcl_idx,
p_mcb->cch_timer_active, p_mcb->cch_timer.in_use);
p_mcb->cch_timer_active = TRUE;
if (!p_mcb->cch_timer.in_use)
{
- BTIF_TRACE_DEBUG0("Start CCH timer ");
+ BTIF_TRACE_DEBUG("Start CCH timer ");
memset(&p_mcb->cch_timer, 0, sizeof(TIMER_LIST_ENT));
p_mcb->cch_timer.param = (UINT32)btif_hl_tmr_hdlr;
btu_start_timer(&p_mcb->cch_timer, BTU_TTYPE_USER_FUNC,
@@ -348,7 +351,7 @@
}
else
{
- BTIF_TRACE_DEBUG0("Restart CCH timer ");
+ BTIF_TRACE_DEBUG("Restart CCH timer ");
btu_stop_timer(&p_mcb->cch_timer);
btu_start_timer(&p_mcb->cch_timer, BTU_TTYPE_USER_FUNC,
BTIF_TIMEOUT_CCH_NO_DCH_SECS);
@@ -383,7 +386,7 @@
}
}
- BTIF_TRACE_DEBUG4("%s found=%d mdl_id=%d mdl_idx=%d ",
+ BTIF_TRACE_DEBUG("%s found=%d mdl_id=%d mdl_idx=%d ",
__FUNCTION__,found, mdl_id, i);
return found;
@@ -402,8 +405,8 @@
{
void *p_new;
- BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
- BTIF_TRACE_DEBUG2("ret size=%d GKI_MAX_BUF_SIZE=%d",size, 6000);
+ BTIF_TRACE_DEBUG("%s", __FUNCTION__);
+ BTIF_TRACE_DEBUG("ret size=%d GKI_MAX_BUF_SIZE=%d",size, 6000);
if (size < 6000)
{
@@ -411,7 +414,7 @@
}
else
{
- BTIF_TRACE_DEBUG0("btif_hl_get_buf use HL large data pool");
+ BTIF_TRACE_DEBUG("btif_hl_get_buf use HL large data pool");
p_new = GKI_getpoolbuf(4);
}
@@ -430,12 +433,12 @@
{
if (*p != NULL)
{
- BTIF_TRACE_DEBUG1("%s OK", __FUNCTION__ );
+ BTIF_TRACE_DEBUG("%s OK", __FUNCTION__ );
GKI_freebuf(*p);
*p = NULL;
}
else
- BTIF_TRACE_ERROR1("%s NULL pointer",__FUNCTION__ );
+ BTIF_TRACE_ERROR("%s NULL pointer",__FUNCTION__ );
}
/*******************************************************************************
**
@@ -463,7 +466,7 @@
}
}
- BTIF_TRACE_DEBUG1("bta_hl_is_the_first_reliable_existed is_existed=%d ",is_existed );
+ BTIF_TRACE_DEBUG("bta_hl_is_the_first_reliable_existed is_existed=%d ",is_existed );
return is_existed;
}
/*******************************************************************************
@@ -477,7 +480,7 @@
*******************************************************************************/
static void btif_hl_clean_delete_mdl(btif_hl_delete_mdl_t *p_cb)
{
- BTIF_TRACE_DEBUG1("%s", __FUNCTION__ );
+ BTIF_TRACE_DEBUG("%s", __FUNCTION__ );
memset(p_cb, 0 , sizeof(btif_hl_delete_mdl_t));
}
@@ -492,7 +495,7 @@
*******************************************************************************/
static void btif_hl_clean_pcb(btif_hl_pending_chan_cb_t *p_pcb)
{
- BTIF_TRACE_DEBUG1("%s", __FUNCTION__ );
+ BTIF_TRACE_DEBUG("%s", __FUNCTION__ );
memset(p_pcb, 0 , sizeof(btif_hl_pending_chan_cb_t));
}
@@ -508,7 +511,7 @@
*******************************************************************************/
static void btif_hl_clean_mdl_cb(btif_hl_mdl_cb_t *p_dcb)
{
- BTIF_TRACE_DEBUG1("%s", __FUNCTION__ );
+ BTIF_TRACE_DEBUG("%s", __FUNCTION__ );
btif_hl_free_buf((void **) &p_dcb->p_rx_pkt);
btif_hl_free_buf((void **) &p_dcb->p_tx_pkt);
memset(p_dcb, 0 , sizeof(btif_hl_mdl_cb_t));
@@ -527,7 +530,7 @@
static void btif_hl_clean_mcl_cb(UINT8 app_idx, UINT8 mcl_idx)
{
btif_hl_mcl_cb_t *p_mcb;
- BTIF_TRACE_DEBUG3("%s app_idx=%d, mcl_idx=%d", __FUNCTION__,app_idx, mcl_idx);
+ BTIF_TRACE_DEBUG("%s app_idx=%d, mcl_idx=%d", __FUNCTION__,app_idx, mcl_idx);
p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
memset(p_mcb, 0, sizeof(btif_hl_mcl_cb_t));
}
@@ -568,12 +571,12 @@
BOOLEAN found = FALSE;
BOOLEAN elem_found;
- BTIF_TRACE_DEBUG0("btif_hl_find_sdp_idx_using_mdep_filter");
+ BTIF_TRACE_DEBUG("btif_hl_find_sdp_idx_using_mdep_filter");
num_recs = p_mcb->sdp.num_recs;
num_elems = p_acb->filter.num_elems;
if (!num_elems)
{
- BTIF_TRACE_DEBUG0("btif_hl_find_sdp_idx_using_mdep_filter num_elem=0");
+ BTIF_TRACE_DEBUG("btif_hl_find_sdp_idx_using_mdep_filter num_elem=0");
*p_sdp_idx = 0;
found = TRUE;
return found;
@@ -616,13 +619,13 @@
if (found)
{
- BTIF_TRACE_DEBUG1("btif_hl_find_sdp_idx_using_mdep_filter found idx=%d",i);
+ BTIF_TRACE_DEBUG("btif_hl_find_sdp_idx_using_mdep_filter found idx=%d",i);
*p_sdp_idx = i;
break;
}
}
- BTIF_TRACE_DEBUG3("%s found=%d sdp_idx=%d",__FUNCTION__ , found, *p_sdp_idx);
+ BTIF_TRACE_DEBUG("%s found=%d sdp_idx=%d",__FUNCTION__ , found, *p_sdp_idx);
btif_hl_reset_mdep_filter(app_idx);
@@ -655,7 +658,7 @@
UINT8 mdl_idx;
- BTIF_TRACE_DEBUG4("%s app_idx=%d mcl_idx=%d mdep_cfg_idx=%d",
+ BTIF_TRACE_DEBUG("%s app_idx=%d mcl_idx=%d mdep_cfg_idx=%d",
__FUNCTION__, app_idx, mcl_idx, mdep_cfg_idx );
switch (local_cfg)
{
@@ -676,13 +679,13 @@
dch_mode = BTA_HL_DCH_MODE_STREAMING;
break;
default:
- BTIF_TRACE_ERROR1("Invalid local_cfg=%d",local_cfg );
+ BTIF_TRACE_ERROR("Invalid local_cfg=%d",local_cfg );
return is_reconnect_ok;
break;
}
- BTIF_TRACE_DEBUG3("local_cfg=%d use_mdl_dch_mode=%d dch_mode=%d ",
+ BTIF_TRACE_DEBUG("local_cfg=%d use_mdl_dch_mode=%d dch_mode=%d ",
local_cfg, use_mdl_dch_mode, dch_mode );
for (i=0, p_mdl=&p_acb->mdl_cfg[0] ; i< BTA_HL_NUM_MDL_CFGS; i++, p_mdl++ )
@@ -694,7 +697,7 @@
p_mdl->base.mdl_id &&
!btif_hl_find_mdl_idx(app_idx, mcl_idx,p_mdl->base.mdl_id, &mdl_idx))
{
- BTIF_TRACE_DEBUG4("i=%d Matched active=%d mdl_id =%d, mdl_dch_mode=%d",
+ BTIF_TRACE_DEBUG("i=%d Matched active=%d mdl_id =%d, mdl_dch_mode=%d",
i, p_mdl->base.active, p_mdl->base.mdl_id,p_mdl->base.dch_mode);
if (!use_mdl_dch_mode)
{
@@ -702,7 +705,7 @@
{
is_reconnect_ok = TRUE;
*p_mdl_id = p_mdl->base.mdl_id;
- BTIF_TRACE_DEBUG2("reconnect is possible dch_mode=%d mdl_id=%d", dch_mode, p_mdl->base.mdl_id );
+ BTIF_TRACE_DEBUG("reconnect is possible dch_mode=%d mdl_id=%d", dch_mode, p_mdl->base.mdl_id );
break;
}
}
@@ -718,7 +721,7 @@
p_mdl1->base.dch_mode == BTA_HL_DCH_MODE_STREAMING)
{
stream_mode_avail = TRUE;
- BTIF_TRACE_DEBUG1("found streaming mode mdl index=%d", j);
+ BTIF_TRACE_DEBUG("found streaming mode mdl index=%d", j);
break;
}
}
@@ -727,14 +730,14 @@
{
dch_mode = BTA_HL_DCH_MODE_STREAMING;
*p_mdl_id = p_mdl1->base.mdl_id;
- BTIF_TRACE_DEBUG2("reconnect is ok index=%d dch_mode=streaming mdl_id=%d", j, *p_mdl_id);
+ BTIF_TRACE_DEBUG("reconnect is ok index=%d dch_mode=streaming mdl_id=%d", j, *p_mdl_id);
break;
}
else
{
dch_mode= p_mdl->base.dch_mode;
*p_mdl_id = p_mdl->base.mdl_id;
- BTIF_TRACE_DEBUG3("reconnect is ok index=%d dch_mode=%d mdl_id=%d", i, p_mdl->base.dch_mode, *p_mdl_id);
+ BTIF_TRACE_DEBUG("reconnect is ok index=%d dch_mode=%d mdl_id=%d", i, p_mdl->base.dch_mode, *p_mdl_id);
break;
}
@@ -744,7 +747,7 @@
}
- BTIF_TRACE_DEBUG3("is_reconnect_ok dch_mode=%d mdl_id=%d",is_reconnect_ok, dch_mode, *p_mdl_id);
+ BTIF_TRACE_DEBUG("is_reconnect_ok dch_mode=%d mdl_id=%d",is_reconnect_ok, dch_mode, *p_mdl_id);
return is_reconnect_ok;
}
@@ -769,9 +772,9 @@
tBTA_HL_MDL_ID mdl_id;
tBTA_HL_DCH_RECONNECT_PARAM reconnect_param;
- BTIF_TRACE_DEBUG2("%s app_id=%d ",
+ BTIF_TRACE_DEBUG("%s app_id=%d ",
__FUNCTION__, app_id );
- BTIF_TRACE_DEBUG6("DB [%02x:%02x:%02x:%02x:%02x:%02x]",
+ BTIF_TRACE_DEBUG("DB [%02x:%02x:%02x:%02x:%02x:%02x]",
bd_addr[0], bd_addr[1],bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]);
if (btif_hl_find_app_idx(app_id, &app_idx))
@@ -803,14 +806,14 @@
if (!btif_hl_is_reconnect_possible(app_idx, mcl_idx, mdep_cfg_idx, p_dch_open_api, &mdl_id ))
{
- BTIF_TRACE_DEBUG0("Issue DCH open" );
+ BTIF_TRACE_DEBUG("Issue DCH open" );
BTA_HlDchOpen(p_mcb->mcl_handle, p_dch_open_api);
}
else
{
reconnect_param.ctrl_psm = p_mcb->ctrl_psm;
reconnect_param.mdl_id = mdl_id;;
- BTIF_TRACE_DEBUG2("Issue Reconnect ctrl_psm=0x%x mdl_id=0x%x",reconnect_param.ctrl_psm, reconnect_param.mdl_id );
+ BTIF_TRACE_DEBUG("Issue Reconnect ctrl_psm=0x%x mdl_id=0x%x",reconnect_param.ctrl_psm, reconnect_param.mdl_id );
BTA_HlDchReconnect(p_mcb->mcl_handle, &reconnect_param);
}
@@ -827,7 +830,7 @@
}
}
- BTIF_TRACE_DEBUG1("status=%d ", status);
+ BTIF_TRACE_DEBUG("status=%d ", status);
return status;
}
/*******************************************************************************
@@ -856,7 +859,7 @@
**
*******************************************************************************/
void btif_hl_display_bt_bda(bt_bdaddr_t *bd_addr){
- BTIF_TRACE_DEBUG6("DB [%02x:%02x:%02x:%02x:%02x:%02x]",
+ BTIF_TRACE_DEBUG("DB [%02x:%02x:%02x:%02x:%02x:%02x]",
bd_addr->address[0], bd_addr->address[1], bd_addr->address[2],
bd_addr->address[3], bd_addr->address[4], bd_addr->address[5]);
}
@@ -873,7 +876,7 @@
void btif_hl_dch_abort(UINT8 app_idx, UINT8 mcl_idx){
btif_hl_mcl_cb_t *p_mcb;
- BTIF_TRACE_DEBUG3("%s app_idx=%d mcl_idx=%d",__FUNCTION__, app_idx, mcl_idx );
+ BTIF_TRACE_DEBUG("%s app_idx=%d mcl_idx=%d",__FUNCTION__, app_idx, mcl_idx );
p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
if (p_mcb->is_connected)
{
@@ -904,9 +907,9 @@
UINT8 app_idx, mcl_idx, chan_idx;
BOOLEAN status = TRUE;
- BTIF_TRACE_DEBUG5("%s app_id=%d ctrl_psm=%d mdep_cfg_idx=%d op=%d",
+ BTIF_TRACE_DEBUG("%s app_id=%d ctrl_psm=%d mdep_cfg_idx=%d op=%d",
__FUNCTION__, app_id, ctrl_psm, mdep_cfg_idx, op);
- BTIF_TRACE_DEBUG6("DB [%02x:%02x:%02x:%02x:%02x:%02x]",
+ BTIF_TRACE_DEBUG("DB [%02x:%02x:%02x:%02x:%02x:%02x]",
bd_addr[0], bd_addr[1],bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]);
if (btif_hl_find_app_idx(app_id, &app_idx))
@@ -957,28 +960,28 @@
else
{
status = FALSE;
- BTIF_TRACE_ERROR0("Open CCH request discarded- No mcl cb");
+ BTIF_TRACE_ERROR("Open CCH request discarded- No mcl cb");
}
}
else
{
status = FALSE;
- BTIF_TRACE_ERROR0("Open CCH request discarded- already in USE");
+ BTIF_TRACE_ERROR("Open CCH request discarded- already in USE");
}
}
else
{
status = FALSE;
- BTIF_TRACE_ERROR1("Invalid app_id=%d", app_id);
+ BTIF_TRACE_ERROR("Invalid app_id=%d", app_id);
}
if (channel_id)
{
- BTIF_TRACE_DEBUG2("status=%d channel_id=0x%08x", status, *channel_id);
+ BTIF_TRACE_DEBUG("status=%d channel_id=0x%08x", status, *channel_id);
}
else
{
- BTIF_TRACE_DEBUG1("status=%d ", status);
+ BTIF_TRACE_DEBUG("status=%d ", status);
}
return status;
}
@@ -1002,6 +1005,8 @@
UINT8 i,j;
int mdl_cfg_channel_id;
+ *p_app_idx = 0;
+ *p_mdl_cfg_idx =0;
for (i=0; i < BTA_HL_NUM_APPS ; i ++)
{
p_acb =BTIF_HL_GET_APP_CB_PTR(i);
@@ -1021,7 +1026,7 @@
}
}
- BTIF_TRACE_EVENT5("%s found=%d channel_id=0x%08x, app_idx=%d mdl_cfg_idx=%d ",
+ BTIF_TRACE_EVENT("%s found=%d channel_id=0x%08x, app_idx=%d mdl_cfg_idx=%d ",
__FUNCTION__,found,channel_id, i,j );
return found;
}
@@ -1066,7 +1071,7 @@
}
}
}
- BTIF_TRACE_DEBUG5("%s found=%d app_idx=%d mcl_idx=%d mdl_idx=%d ",
+ BTIF_TRACE_DEBUG("%s found=%d app_idx=%d mcl_idx=%d mdl_idx=%d ",
__FUNCTION__,found,i,j,k );
return found;
}
@@ -1101,7 +1106,7 @@
}
}
}
- BTIF_TRACE_EVENT6("%s found=%d channel_id=0x%08x, mdl_id=0x%x app_idx=%d mdl_cfg_idx=%d ",
+ BTIF_TRACE_EVENT("%s found=%d channel_id=0x%08x, mdl_id=0x%x app_idx=%d mdl_cfg_idx=%d ",
__FUNCTION__,found,*p_channel_id,mdl_id, app_idx,j );
return found;
}
@@ -1125,6 +1130,9 @@
BOOLEAN found=FALSE;
UINT8 i,j,k;
+ *p_app_idx = 0;
+ *p_mcl_idx =0;
+ *p_mdl_idx = 0;
for (i=0; i < BTA_HL_NUM_APPS ; i ++)
{
p_acb =BTIF_HL_GET_APP_CB_PTR(i);
@@ -1150,7 +1158,7 @@
}
- BTIF_TRACE_EVENT5("%s found=%d app_idx=%d mcl_idx=%d mdl_idx=%d ",
+ BTIF_TRACE_EVENT("%s found=%d app_idx=%d mcl_idx=%d mdl_idx=%d ",
__FUNCTION__,found,i,j,k );
return found;
}
@@ -1176,17 +1184,17 @@
tBTA_HL_MDEP_ROLE peer_mdep_role;
- BTIF_TRACE_DEBUG4("%s app_id=%d local_mdep_role=%d, data_type=%d",
+ BTIF_TRACE_DEBUG("%s app_id=%d local_mdep_role=%d, data_type=%d",
__FUNCTION__, app_id, local_mdep_role, data_type);
- BTIF_TRACE_DEBUG6("DB [%02x:%02x:%02x:%02x:%02x:%02x]",
+ BTIF_TRACE_DEBUG("DB [%02x:%02x:%02x:%02x:%02x:%02x]",
bd_addr[0], bd_addr[1],
bd_addr[2], bd_addr[3],
bd_addr[4], bd_addr[5]);
- BTIF_TRACE_DEBUG1("local_mdep_role=%d", local_mdep_role);
- BTIF_TRACE_DEBUG1("data_type=%d", data_type);
+ BTIF_TRACE_DEBUG("local_mdep_role=%d", local_mdep_role);
+ BTIF_TRACE_DEBUG("data_type=%d", data_type);
if (local_mdep_role == BTA_HL_MDEP_ROLE_SINK)
peer_mdep_role = BTA_HL_MDEP_ROLE_SOURCE;
@@ -1200,18 +1208,18 @@
{
p_mcb =BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
- BTIF_TRACE_DEBUG2("app_idx=%d mcl_idx=%d",app_idx, mcl_idx);
- BTIF_TRACE_DEBUG2("valid_spd_idx=%d sdp_idx=%d",p_mcb->valid_sdp_idx, p_mcb->sdp_idx);
+ BTIF_TRACE_DEBUG("app_idx=%d mcl_idx=%d",app_idx, mcl_idx);
+ BTIF_TRACE_DEBUG("valid_spd_idx=%d sdp_idx=%d",p_mcb->valid_sdp_idx, p_mcb->sdp_idx);
if (p_mcb->valid_sdp_idx)
{
p_rec = &p_mcb->sdp.sdp_rec[p_mcb->sdp_idx];
num_mdeps = p_rec->num_mdeps;
- BTIF_TRACE_DEBUG1("num_mdeps=%d", num_mdeps);
+ BTIF_TRACE_DEBUG("num_mdeps=%d", num_mdeps);
for (i=0; i< num_mdeps; i++)
{
- BTIF_TRACE_DEBUG2("p_rec->mdep_cfg[%d].mdep_role=%d",i, p_rec->mdep_cfg[i].mdep_role);
- BTIF_TRACE_DEBUG2("p_rec->mdep_cfg[%d].data_type =%d",i, p_rec->mdep_cfg[i].data_type );
+ BTIF_TRACE_DEBUG("p_rec->mdep_cfg[%d].mdep_role=%d",i, p_rec->mdep_cfg[i].mdep_role);
+ BTIF_TRACE_DEBUG("p_rec->mdep_cfg[%d].data_type =%d",i, p_rec->mdep_cfg[i].data_type );
if ((p_rec->mdep_cfg[i].mdep_role == peer_mdep_role) &&
(p_rec->mdep_cfg[i].data_type == data_type))
{
@@ -1224,55 +1232,10 @@
}
}
- BTIF_TRACE_DEBUG2("found =%d *p_peer_mdep_id=%d", found, *p_peer_mdep_id);
+ BTIF_TRACE_DEBUG("found =%d *p_peer_mdep_id=%d", found, *p_peer_mdep_id);
return found;
}
-/*******************************************************************************
-**
-** Function btif_hl_find_local_mdep_id
-**
-** Description Find the local MDEP ID from the MDEP configuration
-**
-** Returns BOOLEAN
-**
-*******************************************************************************/
-static BOOLEAN btif_hl_find_local_mdep_id(UINT8 app_id,
- tBTA_HL_MDEP_ROLE local_mdep_role,
- UINT16 mdep_data_type,
- tBTA_HL_MDEP_ID *p_local_mdep_id){
- UINT8 app_idx;
- btif_hl_app_cb_t *p_acb;
- UINT8 i,j;
- BOOLEAN found = FALSE;
-
- BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
-
- if (btif_hl_find_app_idx(app_id, &app_idx) )
- {
- p_acb =BTIF_HL_GET_APP_CB_PTR(app_idx);
-
- for (i=0; i< p_acb->sup_feature.num_of_mdeps; i++)
- {
- if (p_acb->sup_feature.mdep[i].mdep_cfg.mdep_role == local_mdep_role )
- {
- for (j=0; j< p_acb->sup_feature.mdep[i].mdep_cfg.num_of_mdep_data_types; j++)
- {
- if ( p_acb->sup_feature.mdep[i].mdep_cfg.data_cfg[j].data_type == mdep_data_type)
- {
- found = TRUE;
- *p_local_mdep_id = p_acb->sup_feature.mdep[i].mdep_id;
- return found;
- }
- }
- }
- }
-
-
- }
- BTIF_TRACE_DEBUG2("found=%d local mdep id=%d", found, *p_local_mdep_id );
- return found;
-}
/*******************************************************************************
**
@@ -1292,7 +1255,7 @@
for (i=0; i< p_sup_feature->num_of_mdeps; i++)
{
- BTIF_TRACE_DEBUG2("btif_hl_find_mdep_cfg_idx: mdep_id=%d app_idx = %d",
+ BTIF_TRACE_DEBUG("btif_hl_find_mdep_cfg_idx: mdep_id=%d app_idx = %d",
p_sup_feature->mdep[i].mdep_id,app_idx);
if ( p_sup_feature->mdep[i].mdep_id == local_mdep_id)
{
@@ -1302,7 +1265,7 @@
}
}
- BTIF_TRACE_DEBUG5("%s found=%d mdep_idx=%d local_mdep_id=%d app_idx=%d ",
+ BTIF_TRACE_DEBUG("%s found=%d mdep_idx=%d local_mdep_id=%d app_idx=%d ",
__FUNCTION__, found,i, local_mdep_id,app_idx);
return found;
}
@@ -1324,6 +1287,7 @@
btif_hl_app_cb_t *p_acb =BTIF_HL_GET_APP_CB_PTR(app_idx);
btif_hl_mcl_cb_t *p_mcb;
+ *p_mcl_idx = 0;
for (i=0; i < BTA_HL_NUM_MCLS ; i ++)
{
p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, i);
@@ -1337,7 +1301,7 @@
}
- BTIF_TRACE_DEBUG3("%s found=%d idx=%d",__FUNCTION__, found, i);
+ BTIF_TRACE_DEBUG("%s found=%d idx=%d",__FUNCTION__, found, i);
return found;
}
/*******************************************************************************
@@ -1350,7 +1314,7 @@
**
*******************************************************************************/
static void btif_hl_init(void){
- BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s", __FUNCTION__);
memset(p_btif_hl_cb, 0, sizeof(btif_hl_cb_t));
btif_hl_init_next_app_id();
btif_hl_init_next_channel_id();
@@ -1365,7 +1329,7 @@
**
*******************************************************************************/
static void btif_hl_disable(void){
- BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s", __FUNCTION__);
if ((p_btif_hl_cb->state != BTIF_HL_STATE_DISABLING) &&
(p_btif_hl_cb->state != BTIF_HL_STATE_DISABLED))
@@ -1396,7 +1360,7 @@
}
}
- BTIF_TRACE_DEBUG2("%s no_active_app=%d ", __FUNCTION__, no_active_app );
+ BTIF_TRACE_DEBUG("%s no_active_app=%d ", __FUNCTION__, no_active_app );
return no_active_app;
}
@@ -1427,7 +1391,7 @@
**
*******************************************************************************/
static void btif_hl_set_state(btif_hl_state_t state){
- BTIF_TRACE_DEBUG2("btif_hl_set_state: %d ---> %d ", p_btif_hl_cb->state, state);
+ BTIF_TRACE_DEBUG("btif_hl_set_state: %d ---> %d ", p_btif_hl_cb->state, state);
p_btif_hl_cb->state = state;
}
@@ -1442,7 +1406,7 @@
*******************************************************************************/
static btif_hl_state_t btif_hl_get_state(void){
- BTIF_TRACE_DEBUG1("btif_hl_get_state: %d ", p_btif_hl_cb->state);
+ BTIF_TRACE_DEBUG("btif_hl_get_state: %d ", p_btif_hl_cb->state);
return p_btif_hl_cb->state;
}
@@ -1469,7 +1433,7 @@
}
}
- BTIF_TRACE_DEBUG4("%s found=%d, data_type=0x%x idx=%d", __FUNCTION__, found, data_type, i);
+ BTIF_TRACE_DEBUG("%s found=%d, data_type=0x%x idx=%d", __FUNCTION__, found, data_type, i);
return found;
}
@@ -1513,7 +1477,7 @@
}
- BTIF_TRACE_DEBUG4("%s mdep_role=%d data_type=0x%4x size=%d",
+ BTIF_TRACE_DEBUG("%s mdep_role=%d data_type=0x%4x size=%d",
__FUNCTION__, mdep_role, data_type, max_tx_apdu_size);
return max_tx_apdu_size;
}
@@ -1558,7 +1522,7 @@
}
- BTIF_TRACE_DEBUG4("%s mdep_role=%d data_type=0x%4x size=%d",
+ BTIF_TRACE_DEBUG("%s mdep_role=%d data_type=0x%4x size=%d",
__FUNCTION__, mdep_role, data_type, max_rx_apdu_size);
return max_rx_apdu_size;
@@ -1585,11 +1549,12 @@
*p = BTA_HL_MDEP_ROLE_SINK;
break;
default:
+ *p = BTA_HL_MDEP_ROLE_SOURCE;
status = FALSE;
break;
}
- BTIF_TRACE_DEBUG4("%s status=%d bta_mdep_role=%d (%d:btif)",
+ BTIF_TRACE_DEBUG("%s status=%d bta_mdep_role=%d (%d:btif)",
__FUNCTION__, status, *p, mdep);
return status;
}
@@ -1620,7 +1585,7 @@
status = FALSE;
break;
}
- BTIF_TRACE_DEBUG3("%s status = %d BTA DCH CFG=%d (1-rel 2-strm",
+ BTIF_TRACE_DEBUG("%s status = %d BTA DCH CFG=%d (1-rel 2-strm",
__FUNCTION__, status, *p);
return status;
}
@@ -1654,7 +1619,7 @@
int channel_id;
btif_hl_cb.next_channel_id++;
channel_id = (app_id << 16) + next_channel_id;
- BTIF_TRACE_DEBUG4("%s channel_id=0x%08x, app_id=0x%02x next_channel_id=0x%04x", __FUNCTION__,
+ BTIF_TRACE_DEBUG("%s channel_id=0x%08x, app_id=0x%02x next_channel_id=0x%04x", __FUNCTION__,
channel_id, app_id, next_channel_id);
return channel_id;
}
@@ -1670,7 +1635,7 @@
static UINT8 btif_hl_get_app_id(int channel_id){
UINT8 app_id =(UINT8) (channel_id >> 16);
- BTIF_TRACE_DEBUG3("%s channel_id=0x%08x, app_id=0x%02x ", __FUNCTION__,channel_id, app_id);
+ BTIF_TRACE_DEBUG("%s channel_id=0x%08x, app_id=0x%02x ", __FUNCTION__,channel_id, app_id);
return app_id;
}
/*******************************************************************************
@@ -1724,7 +1689,7 @@
}
}
- BTIF_TRACE_EVENT4("%s status=%d handle=%d app_idx=%d ",
+ BTIF_TRACE_EVENT("%s status=%d handle=%d app_idx=%d ",
__FUNCTION__, found, app_handle , i);
return found;
@@ -1744,6 +1709,7 @@
BOOLEAN found=FALSE;
UINT8 i;
+ *p_app_idx = 0;
for (i=0; i < BTA_HL_NUM_APPS ; i ++)
{
if (btif_hl_cb.acb[i].in_use &&
@@ -1755,7 +1721,7 @@
}
}
- BTIF_TRACE_EVENT4("%s found=%d app_id=%d app_idx=%d ",
+ BTIF_TRACE_EVENT("%s found=%d app_id=%d app_idx=%d ",
__FUNCTION__, found, app_id , i);
return found;
@@ -1782,7 +1748,7 @@
for (j=0; j < BTA_HL_NUM_MCLS ; j++)
{
if (p_acb->mcb[j].in_use)
- BTIF_TRACE_DEBUG3("btif_hl_find_mcl_idx_using_handle:app_idx=%d,"
+ BTIF_TRACE_DEBUG("btif_hl_find_mcl_idx_using_handle:app_idx=%d,"
"mcl_idx =%d mcl_handle=%d",i,j,p_acb->mcb[j].mcl_handle);
if (p_acb->mcb[j].in_use &&
(p_acb->mcb[j].mcl_handle == mcl_handle))
@@ -1794,7 +1760,7 @@
}
}
}
- BTIF_TRACE_DEBUG4("%s found=%d app_idx=%d mcl_idx=%d",__FUNCTION__,
+ BTIF_TRACE_DEBUG("%s found=%d app_idx=%d mcl_idx=%d",__FUNCTION__,
found, i, j);
return found;
}
@@ -1824,12 +1790,12 @@
(p_acb->mcb[j].mcl_handle == mcl_handle))
{
p_mcb = &p_acb->mcb[j];
- BTIF_TRACE_DEBUG1("btif_hl_find_mcl_idx_using_mdl_id: mcl handle found j =%d",j);
+ BTIF_TRACE_DEBUG("btif_hl_find_mcl_idx_using_mdl_id: mcl handle found j =%d",j);
for (x=0; x < BTA_HL_NUM_MDLS_PER_MCL ; x ++)
{
if (p_mcb->mdl[x].in_use && p_mcb->mdl[x].mdl_id == mdl_id)
{
- BTIF_TRACE_DEBUG1("btif_hl_find_mcl_idx_using_mdl_id:found x =%d",x);
+ BTIF_TRACE_DEBUG("btif_hl_find_mcl_idx_using_mdl_id:found x =%d",x);
found = TRUE;
*p_app_idx = i;
*p_mcl_idx = j;
@@ -1839,7 +1805,7 @@
}
}
}
- BTIF_TRACE_DEBUG4("%s found=%d app_idx=%d mcl_idx=%d",__FUNCTION__,
+ BTIF_TRACE_DEBUG("%s found=%d app_idx=%d mcl_idx=%d",__FUNCTION__,
found, i, j);
return found;
}
@@ -1863,7 +1829,7 @@
{
p_acb =BTIF_HL_GET_APP_CB_PTR(i);
if (p_acb->delete_mdl.active) {
- BTIF_TRACE_DEBUG3("btif_hl_find_app_idx_using_deleted_mdl_id: app_idx=%d,"
+ BTIF_TRACE_DEBUG("btif_hl_find_app_idx_using_deleted_mdl_id: app_idx=%d,"
"mdl_id=%d mcl_handle=%d",i,mdl_id,p_acb->mcb[i].mcl_handle);
}
if (p_acb->delete_mdl.active &&
@@ -1874,7 +1840,7 @@
break;
}
}
- BTIF_TRACE_DEBUG3("%s found=%d app_idx=%d",__FUNCTION__,
+ BTIF_TRACE_DEBUG("%s found=%d app_idx=%d",__FUNCTION__,
found, i);
return found;
}
@@ -1933,7 +1899,7 @@
break;
}
}
- BTIF_TRACE_DEBUG3("%s found=%dmcl_idx=%d",__FUNCTION__,
+ BTIF_TRACE_DEBUG("%s found=%dmcl_idx=%d",__FUNCTION__,
found, j);
return found;
}
@@ -1960,7 +1926,7 @@
if (p_acb->mcb[j].in_use)
{
p_mcb = &p_acb->mcb[j];
- BTIF_TRACE_DEBUG1("btif_hl_find_mcl_idx_using_mdl_id: mcl handle found j =%d",j);
+ BTIF_TRACE_DEBUG("btif_hl_find_mcl_idx_using_mdl_id: mcl handle found j =%d",j);
for (x=0; x < BTA_HL_NUM_MDLS_PER_MCL ; x ++)
{
if (p_mcb->mdl[x].in_use)
@@ -1977,7 +1943,7 @@
btif_hl_clean_mdl_cb(p_dcb);
if (!btif_hl_num_dchs_in_use(p_mcb->mcl_handle))
BTA_HlCchClose(p_mcb->mcl_handle);
- BTIF_TRACE_DEBUG1("remote DCH close success mdl_idx=%d", x);
+ BTIF_TRACE_DEBUG("remote DCH close success mdl_idx=%d", x);
}
}
}
@@ -2008,7 +1974,7 @@
break;
}
}
- BTIF_TRACE_DEBUG3("%s found=%d app_idx=%d", __FUNCTION__, found, i );
+ BTIF_TRACE_DEBUG("%s found=%d app_idx=%d", __FUNCTION__, found, i );
return found;
}
@@ -2026,9 +1992,10 @@
BOOLEAN found=FALSE;
UINT8 i;
+ *p_app_idx = 0;
for (i=0; i < BTA_HL_NUM_APPS ; i ++)
{
- BTIF_TRACE_DEBUG1("btif_hl_find_app_idx_using_mdepId: MDEP-ID = %d",
+ BTIF_TRACE_DEBUG("btif_hl_find_app_idx_using_mdepId: MDEP-ID = %d",
btif_hl_cb.acb[i].sup_feature.mdep[0].mdep_id);
if (btif_hl_cb.acb[i].in_use &&
(btif_hl_cb.acb[i].sup_feature.mdep[0].mdep_id == mdep_id))
@@ -2038,7 +2005,7 @@
break;
}
}
- BTIF_TRACE_DEBUG3("%s found=%d app_idx=%d", __FUNCTION__, found, i );
+ BTIF_TRACE_DEBUG("%s found=%d app_idx=%d", __FUNCTION__, found, i );
return found;
}
@@ -2069,7 +2036,7 @@
}
}
- BTIF_TRACE_DEBUG3("%s found=%d idx=%d",__FUNCTION__, found, i);
+ BTIF_TRACE_DEBUG("%s found=%d idx=%d",__FUNCTION__, found, i);
return found;
}
@@ -2095,7 +2062,7 @@
break;
}
}
- BTIF_TRACE_DEBUG3("%s found=%d mcl_idx=%d", __FUNCTION__, found, i);
+ BTIF_TRACE_DEBUG("%s found=%d mcl_idx=%d", __FUNCTION__, found, i);
return found;
}
@@ -2122,7 +2089,7 @@
}
}
- BTIF_TRACE_DEBUG3("%s found=%d app_idx=%d", __FUNCTION__, found, i);
+ BTIF_TRACE_DEBUG("%s found=%d app_idx=%d", __FUNCTION__, found, i);
return found;
}
@@ -2145,7 +2112,7 @@
bthl_app_reg_state_t state = BTHL_APP_REG_STATE_DEREG_SUCCESS;
bt_status_t status = BT_STATUS_SUCCESS;
- BTIF_TRACE_DEBUG3("%s de-reg status=%d app_handle=%d", __FUNCTION__,
+ BTIF_TRACE_DEBUG("%s de-reg status=%d app_handle=%d", __FUNCTION__,
p_data->dereg_cfm.status, p_data->dereg_cfm.app_handle);
if (btif_hl_find_app_idx_using_app_id(p_data->dereg_cfm.app_id, &app_idx))
@@ -2160,7 +2127,7 @@
else
state = BTHL_APP_REG_STATE_DEREG_FAILED;
- BTIF_TRACE_DEBUG2("call reg state callback app_id=%d state=%d", app_id, state);
+ BTIF_TRACE_DEBUG("call reg state callback app_id=%d state=%d", app_id, state);
BTIF_HL_CALL_CBACK(bt_hl_callbacks, app_reg_state_cb, app_id, state );
if (btif_hl_is_no_active_app())
@@ -2185,7 +2152,7 @@
bthl_app_reg_state_t state = BTHL_APP_REG_STATE_REG_SUCCESS;
bt_status_t bt_status;
- BTIF_TRACE_DEBUG3("%s reg status=%d app_handle=%d", __FUNCTION__, p_data->reg_cfm.status, p_data->reg_cfm.app_handle);
+ BTIF_TRACE_DEBUG("%s reg status=%d app_handle=%d", __FUNCTION__, p_data->reg_cfm.status, p_data->reg_cfm.app_handle);
if (btif_hl_find_app_idx(p_data->reg_cfm.app_id, &app_idx))
{
@@ -2201,35 +2168,13 @@
state = BTHL_APP_REG_STATE_REG_FAILED;
}
- BTIF_TRACE_DEBUG3("%s call reg state callback app_id=%d reg state=%d", __FUNCTION__, p_data->reg_cfm.app_id, state);
+ BTIF_TRACE_DEBUG("%s call reg state callback app_id=%d reg state=%d", __FUNCTION__, p_data->reg_cfm.app_id, state);
BTIF_HL_CALL_CBACK(bt_hl_callbacks, app_reg_state_cb, ((int) p_data->reg_cfm.app_id), state );
}
}
/*******************************************************************************
**
-** Function btif_hl_proc_sdp_info_ind
-**
-** Description Process the SDP info indication
-**
-** Returns Nothing
-**
-*******************************************************************************/
-static void btif_hl_proc_sdp_info_ind(tBTA_HL *p_data)
-
-{
- btif_hl_app_cb_t *p_acb;
- UINT8 app_idx;
-
- BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
- if (btif_hl_find_app_idx_using_handle(p_data->sdp_info_ind.app_handle, &app_idx))
- {
- p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
- memcpy(&p_acb->sdp_info_ind, &p_data->sdp_info_ind, sizeof(tBTA_HL_SDP_INFO_IND));
- }
-}
-/*******************************************************************************
-**
** Function btif_hl_set_chan_cb_state
**
** Description set the channel callback state
@@ -2244,7 +2189,7 @@
if (cur_state != state)
{
p_pcb->cb_state = state;
- BTIF_TRACE_DEBUG3("%s state %d--->%d",__FUNCTION__, cur_state, state);
+ BTIF_TRACE_DEBUG("%s state %d--->%d",__FUNCTION__, cur_state, state);
}
@@ -2263,8 +2208,8 @@
int app_id = (int) btif_hl_get_app_id(p_acb->delete_mdl.channel_id);
btif_hl_copy_bda(&bd_addr, p_acb->delete_mdl.bd_addr);
- BTIF_TRACE_DEBUG1("%s",__FUNCTION__);
- BTIF_TRACE_DEBUG4("call channel state callback channel_id=0x%08x mdep_cfg_idx=%d, state=%d fd=%d",p_acb->delete_mdl.channel_id,
+ BTIF_TRACE_DEBUG("%s",__FUNCTION__);
+ BTIF_TRACE_DEBUG("call channel state callback channel_id=0x%08x mdep_cfg_idx=%d, state=%d fd=%d",p_acb->delete_mdl.channel_id,
p_acb->delete_mdl.mdep_cfg_idx, BTHL_CONN_STATE_DESTROYED, 0);
btif_hl_display_bt_bda(&bd_addr);
@@ -2289,8 +2234,8 @@
btif_hl_copy_bda(&bd_addr, p_scb->bd_addr);
- BTIF_TRACE_DEBUG1("%s",__FUNCTION__);
- BTIF_TRACE_DEBUG4("call channel state callback channel_id=0x%08x mdep_cfg_idx=%d, state=%d fd=%d",p_scb->channel_id,
+ BTIF_TRACE_DEBUG("%s",__FUNCTION__);
+ BTIF_TRACE_DEBUG("call channel state callback channel_id=0x%08x mdep_cfg_idx=%d, state=%d fd=%d",p_scb->channel_id,
p_scb->mdep_cfg_idx, BTHL_CONN_STATE_DISCONNECTING, p_scb->socket_id[0]);
btif_hl_display_bt_bda(&bd_addr);
BTIF_HL_CALL_CBACK(bt_hl_callbacks, channel_state_cb, app_id,
@@ -2315,8 +2260,8 @@
if (p_pcb->in_use && p_pcb->cb_state == BTIF_HL_CHAN_CB_STATE_CONNECTING_PENDING)
{
- BTIF_TRACE_DEBUG1("%s",__FUNCTION__);
- BTIF_TRACE_DEBUG4("call channel state callback channel_id=0x%08x mdep_cfg_idx=%d state=%d fd=%d",p_pcb->channel_id,
+ BTIF_TRACE_DEBUG("%s",__FUNCTION__);
+ BTIF_TRACE_DEBUG("call channel state callback channel_id=0x%08x mdep_cfg_idx=%d state=%d fd=%d",p_pcb->channel_id,
p_pcb->mdep_cfg_idx, BTHL_CONN_STATE_CONNECTING, 0);
btif_hl_display_bt_bda(&bd_addr);
@@ -2342,20 +2287,20 @@
btif_hl_copy_bda(&bd_addr, p_pcb->bd_addr);
- BTIF_TRACE_DEBUG2("%s p_pcb->in_use=%d",__FUNCTION__, p_pcb->in_use);
+ BTIF_TRACE_DEBUG("%s p_pcb->in_use=%d",__FUNCTION__, p_pcb->in_use);
if (p_pcb->in_use)
{
- BTIF_TRACE_DEBUG1("%p_pcb->cb_state=%d",p_pcb->cb_state);
+ BTIF_TRACE_DEBUG("%p_pcb->cb_state=%d",p_pcb->cb_state);
if (p_pcb->cb_state == BTIF_HL_CHAN_CB_STATE_CONNECTING_PENDING)
{
- BTIF_TRACE_DEBUG4("call channel state callback channel_id=0x%08x mdep_cfg_idx=%d state=%d fd=%d",p_pcb->channel_id,
+ BTIF_TRACE_DEBUG("call channel state callback channel_id=0x%08x mdep_cfg_idx=%d state=%d fd=%d",p_pcb->channel_id,
p_pcb->mdep_cfg_idx, BTHL_CONN_STATE_CONNECTING, 0);
btif_hl_display_bt_bda(&bd_addr);
BTIF_HL_CALL_CBACK(bt_hl_callbacks, channel_state_cb, app_id,
&bd_addr, p_pcb->mdep_cfg_idx,
p_pcb->channel_id, BTHL_CONN_STATE_CONNECTING, 0 );
- BTIF_TRACE_DEBUG4("call channel state callback channel_id=0x%08x mdep_cfg_idx=%d state=%d fd=%d",p_pcb->channel_id,
+ BTIF_TRACE_DEBUG("call channel state callback channel_id=0x%08x mdep_cfg_idx=%d state=%d fd=%d",p_pcb->channel_id,
p_pcb->mdep_cfg_idx, BTHL_CONN_STATE_DISCONNECTED, 0);
btif_hl_display_bt_bda(&bd_addr);
BTIF_HL_CALL_CBACK(bt_hl_callbacks, channel_state_cb, app_id,
@@ -2364,7 +2309,7 @@
}
else if (p_pcb->cb_state == BTIF_HL_CHAN_CB_STATE_CONNECTED_PENDING)
{
- BTIF_TRACE_DEBUG4("call channel state callback channel_id=0x%08x mdep_cfg_idx=%d state=%d fd=%d",p_pcb->channel_id,
+ BTIF_TRACE_DEBUG("call channel state callback channel_id=0x%08x mdep_cfg_idx=%d state=%d fd=%d",p_pcb->channel_id,
p_pcb->mdep_cfg_idx, BTHL_CONN_STATE_DISCONNECTED, 0);
btif_hl_display_bt_bda(&bd_addr);
BTIF_HL_CALL_CBACK(bt_hl_callbacks, channel_state_cb, app_id,
@@ -2394,22 +2339,22 @@
BOOLEAN status =FALSE;
btif_hl_pending_chan_cb_t *p_pcb;
- BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s", __FUNCTION__);
p_sdp = p_data->sdp_query_cfm.p_sdp;
num_recs = p_sdp->num_recs;
- BTIF_TRACE_DEBUG1("num of SDP records=%d",num_recs);
+ BTIF_TRACE_DEBUG("num of SDP records=%d",num_recs);
for (i=0; i<num_recs; i++)
{
- BTIF_TRACE_DEBUG3("rec_idx=%d ctrl_psm=0x%x data_psm=0x%x",
+ BTIF_TRACE_DEBUG("rec_idx=%d ctrl_psm=0x%x data_psm=0x%x",
(i+1),p_sdp->sdp_rec[i].ctrl_psm, p_sdp->sdp_rec[i].data_psm);
- BTIF_TRACE_DEBUG1("MCAP supported procedures=0x%x",p_sdp->sdp_rec[i].mcap_sup_proc);
+ BTIF_TRACE_DEBUG("MCAP supported procedures=0x%x",p_sdp->sdp_rec[i].mcap_sup_proc);
num_mdeps = p_sdp->sdp_rec[i].num_mdeps;
- BTIF_TRACE_DEBUG1("num of mdeps =%d",num_mdeps);
+ BTIF_TRACE_DEBUG("num of mdeps =%d",num_mdeps);
for (j=0; j< num_mdeps; j++)
{
- BTIF_TRACE_DEBUG4("mdep_idx=%d mdep_id=0x%x data_type=0x%x mdep_role=0x%x",
+ BTIF_TRACE_DEBUG("mdep_idx=%d mdep_id=0x%x data_type=0x%x mdep_role=0x%x",
(j+1),
p_sdp->sdp_rec[i].mdep_cfg[j].mdep_id,
p_sdp->sdp_rec[i].mdep_cfg[j].data_type,
@@ -2471,7 +2416,7 @@
}
else
{
- BTIF_TRACE_DEBUG0("channel abort pending");
+ BTIF_TRACE_DEBUG("channel abort pending");
}
}
break;
@@ -2481,13 +2426,13 @@
break;
default:
- BTIF_TRACE_ERROR1("Invalid CCH oper %d", old_cch_oper);
+ BTIF_TRACE_ERROR("Invalid CCH oper %d", old_cch_oper);
break;
}
}
else
{
- BTIF_TRACE_ERROR0("Can not find SDP idx discard CCH Open request");
+ BTIF_TRACE_ERROR("Can not find SDP idx discard CCH Open request");
}
}
}
@@ -2512,7 +2457,7 @@
UINT8 app_idx, mcl_idx;
int i;
- BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s", __FUNCTION__);
for(i=0; i<BTA_HL_NUM_APPS; i++)
{
if (btif_hl_cb.acb[i].in_use)
@@ -2532,7 +2477,7 @@
}
else
{
- BTIF_TRACE_ERROR0("The MCL already exist for cch_open_ind");
+ BTIF_TRACE_ERROR("The MCL already exist for cch_open_ind");
}
}
}
@@ -2567,7 +2512,7 @@
case BTIF_HL_PEND_DCH_OP_OPEN:
if (!p_pcb->abort_pending)
{
- BTIF_TRACE_DEBUG0("op BTIF_HL_PEND_DCH_OP_OPEN");
+ BTIF_TRACE_DEBUG("op BTIF_HL_PEND_DCH_OP_OPEN");
dch_open.ctrl_psm = p_mcb->ctrl_psm;
dch_open.local_mdep_id = p_acb->sup_feature.mdep[p_pcb->mdep_cfg_idx].mdep_id;
if (btif_hl_find_peer_mdep_id(p_acb->app_id, p_mcb->bd_addr,
@@ -2581,19 +2526,19 @@
dch_open.local_cfg = BTA_HL_DCH_CFG_RELIABLE;
}
dch_open.sec_mask = (BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT);
- BTIF_TRACE_DEBUG1("dch_open.local_cfg=%d ", dch_open.local_cfg);
+ BTIF_TRACE_DEBUG("dch_open.local_cfg=%d ", dch_open.local_cfg);
btif_hl_send_setup_connecting_cb(app_idx,mcl_idx);
if (!btif_hl_is_reconnect_possible(app_idx, mcl_idx, p_pcb->mdep_cfg_idx, &dch_open, &mdl_id ))
{
- BTIF_TRACE_DEBUG1("Issue DCH open, mcl_handle=%d",p_mcb->mcl_handle);
+ BTIF_TRACE_DEBUG("Issue DCH open, mcl_handle=%d",p_mcb->mcl_handle);
BTA_HlDchOpen(p_mcb->mcl_handle, &dch_open);
}
else
{
reconnect_param.ctrl_psm = p_mcb->ctrl_psm;
reconnect_param.mdl_id = mdl_id;;
- BTIF_TRACE_DEBUG2("Issue Reconnect ctrl_psm=0x%x mdl_id=0x%x",reconnect_param.ctrl_psm, reconnect_param.mdl_id);
+ BTIF_TRACE_DEBUG("Issue Reconnect ctrl_psm=0x%x mdl_id=0x%x",reconnect_param.ctrl_psm, reconnect_param.mdl_id);
BTA_HlDchReconnect(p_mcb->mcl_handle, &reconnect_param);
}
status = TRUE;
@@ -2635,18 +2580,17 @@
BOOLEAN status = FALSE;
tBTA_HL_DCH_OPEN_PARAM dch_open;
-
- BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s", __FUNCTION__);
if (btif_hl_find_app_idx_using_app_id(p_data->cch_open_cfm.app_id, &app_idx))
{
- BTIF_TRACE_DEBUG1("app_idx=%d", app_idx);
+ BTIF_TRACE_DEBUG("app_idx=%d", app_idx);
if (btif_hl_find_mcl_idx(app_idx, p_data->cch_open_cfm.bd_addr, &mcl_idx))
{
p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
- BTIF_TRACE_DEBUG2("mcl_idx=%d, mcl_handle=%d", mcl_idx,p_data->cch_open_cfm.mcl_handle);
+ BTIF_TRACE_DEBUG("mcl_idx=%d, mcl_handle=%d", mcl_idx,p_data->cch_open_cfm.mcl_handle);
p_mcb->mcl_handle = p_data->cch_open_cfm.mcl_handle;
p_mcb->is_connected = TRUE;
status = btif_hl_proc_pending_op(app_idx, mcl_idx);
@@ -2677,7 +2621,7 @@
for (j=0; j < BTA_HL_NUM_MCLS ; j++)
{
if (p_acb->mcb[j].in_use)
- BTIF_TRACE_DEBUG3("btif_hl_find_mcl_idx_using_handle: app_idx=%d,"
+ BTIF_TRACE_DEBUG("btif_hl_find_mcl_idx_using_handle: app_idx=%d,"
"mcl_idx =%d mcl_handle=%d",i,j,p_acb->mcb[j].mcl_handle);
if (p_acb->mcb[j].in_use &&
(p_acb->mcb[j].mcl_handle == mcl_handle))
@@ -2704,7 +2648,7 @@
{
UINT8 app_idx, mcl_idx;
- BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s", __FUNCTION__);
btif_hl_clean_mcb_using_handle(p_data->cch_close_ind.mcl_handle);
}
@@ -2722,7 +2666,7 @@
static void btif_hl_proc_cch_close_cfm(tBTA_HL *p_data)
{
UINT8 app_idx, mcl_idx;
- BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s", __FUNCTION__);
btif_hl_clean_mcb_using_handle(p_data->cch_close_ind.mcl_handle);
}
@@ -2747,7 +2691,7 @@
tBTA_HL_DCH_CREATE_RSP rsp_code = BTA_HL_DCH_CREATE_RSP_CFG_REJ;
tBTA_HL_DCH_CREATE_RSP_PARAM create_rsp_param;
- BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s", __FUNCTION__);
// Find the correct app_idx based on the mdep_id;
btif_hl_find_app_idx_using_mdepId(p_data->dch_create_ind.local_mdep_id,&orig_app_idx);
@@ -2779,13 +2723,13 @@
break;
case BTA_HL_MDEP_ROLE_SINK:
- BTIF_TRACE_DEBUG0("btif_hl_proc_create_ind:BTA_HL_MDEP_ROLE_SINK");
+ BTIF_TRACE_DEBUG("btif_hl_proc_create_ind:BTA_HL_MDEP_ROLE_SINK");
if ((p_data->dch_create_ind.cfg == BTA_HL_DCH_CFG_RELIABLE) ||
(first_reliable_exist && (p_data->dch_create_ind.cfg == BTA_HL_DCH_CFG_STREAMING)))
{
rsp_code = BTA_HL_DCH_CREATE_RSP_SUCCESS;
rsp_cfg = p_data->dch_create_ind.cfg;
- BTIF_TRACE_DEBUG1("btif_hl_proc_create_ind:BTA_HL_MDEP_ROLE_SINK cfg = %d",rsp_cfg);
+ BTIF_TRACE_DEBUG("btif_hl_proc_create_ind:BTA_HL_MDEP_ROLE_SINK cfg = %d",rsp_cfg);
}
break;
default:
@@ -2800,7 +2744,7 @@
if (success)
{
- BTIF_TRACE_DEBUG2("create response rsp_code=%d rsp_cfg=%d", rsp_code, rsp_cfg );
+ BTIF_TRACE_DEBUG("create response rsp_code=%d rsp_cfg=%d", rsp_code, rsp_cfg );
create_rsp_param.local_mdep_id = p_data->dch_create_ind.local_mdep_id;
create_rsp_param.mdl_id = p_data->dch_create_ind.mdl_id;
create_rsp_param.rsp_code = rsp_code;
@@ -2828,7 +2772,7 @@
UINT8 dc_cfg;
BOOLEAN close_dch = FALSE;
- BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s", __FUNCTION__);
// Find the correct app_idx based on the mdep_id;
btif_hl_find_app_idx_using_mdepId(p_data->dch_open_ind.local_mdep_id,&orig_app_idx);
@@ -2856,23 +2800,23 @@
if(btif_hl_find_channel_id_using_mdl_id(orig_app_idx,p_dcb->mdl_id , &p_dcb->channel_id))
{
- BTIF_TRACE_DEBUG4(" app_idx=%d mcl_idx=%d mdl_idx=%d channel_id=%d",
+ BTIF_TRACE_DEBUG(" app_idx=%d mcl_idx=%d mdl_idx=%d channel_id=%d",
orig_app_idx, mcl_idx, mdl_idx, p_dcb->channel_id );
if (!btif_hl_create_socket(orig_app_idx, mcl_idx, mdl_idx))
{
- BTIF_TRACE_ERROR0("Unable to create socket");
+ BTIF_TRACE_ERROR("Unable to create socket");
close_dch = TRUE;
}
}
else
{
- BTIF_TRACE_ERROR1("Unable find channel id for mdl_id=0x%x", p_dcb->mdl_id );
+ BTIF_TRACE_ERROR("Unable find channel id for mdl_id=0x%x", p_dcb->mdl_id );
close_dch = TRUE;
}
}
else
{
- BTIF_TRACE_ERROR1("INVALID_LOCAL_MDEP_ID mdep_id=%d",p_data->dch_open_cfm.local_mdep_id);
+ BTIF_TRACE_ERROR("INVALID_LOCAL_MDEP_ID mdep_id=%d",p_data->dch_open_cfm.local_mdep_id);
close_dch = TRUE;
}
@@ -2909,7 +2853,7 @@
BOOLEAN status = FALSE;
BOOLEAN close_dch = FALSE;
- BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s", __FUNCTION__);
// Find the correct app_idx based on the mdep_id;
btif_hl_find_app_idx_using_mdepId(p_data->dch_open_cfm.local_mdep_id,&app_idx);
@@ -2936,24 +2880,24 @@
p_dcb->mtu = p_data->dch_open_cfm.mtu;
p_dcb->channel_id = p_pcb->channel_id;
- BTIF_TRACE_DEBUG3("app_idx=%d mcl_idx=%d mdl_idx=%d", app_idx, mcl_idx, mdl_idx );
+ BTIF_TRACE_DEBUG("app_idx=%d mcl_idx=%d mdl_idx=%d", app_idx, mcl_idx, mdl_idx );
btif_hl_send_setup_connecting_cb(app_idx, mcl_idx);
if (btif_hl_create_socket(app_idx, mcl_idx, mdl_idx))
{
status = TRUE;
- BTIF_TRACE_DEBUG4("app_idx=%d mcl_idx=%d mdl_idx=%d p_dcb->channel_id=0x%08x",
+ BTIF_TRACE_DEBUG("app_idx=%d mcl_idx=%d mdl_idx=%d p_dcb->channel_id=0x%08x",
app_idx, mcl_idx, mdl_idx, p_dcb->channel_id);
btif_hl_clean_pcb(p_pcb);
}
else
{
- BTIF_TRACE_ERROR0("Unable to create socket");
+ BTIF_TRACE_ERROR("Unable to create socket");
close_dch = TRUE;
}
}
else
{
- BTIF_TRACE_ERROR1("INVALID_LOCAL_MDEP_ID mdep_id=%d",p_data->dch_open_cfm.local_mdep_id);
+ BTIF_TRACE_ERROR("INVALID_LOCAL_MDEP_ID mdep_id=%d",p_data->dch_open_cfm.local_mdep_id);
close_dch = TRUE;
}
@@ -2986,7 +2930,7 @@
BOOLEAN status = FALSE;
BOOLEAN close_dch = FALSE;
- BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s", __FUNCTION__);
btif_hl_find_app_idx_using_mdepId(p_data->dch_reconnect_cfm.local_mdep_id,&app_idx);
@@ -3012,24 +2956,24 @@
p_dcb->mtu = p_data->dch_reconnect_cfm.mtu;
p_dcb->channel_id = p_pcb->channel_id;
- BTIF_TRACE_DEBUG3("app_idx=%d mcl_idx=%d mdl_idx=%d", app_idx, mcl_idx, mdl_idx );
+ BTIF_TRACE_DEBUG("app_idx=%d mcl_idx=%d mdl_idx=%d", app_idx, mcl_idx, mdl_idx );
btif_hl_send_setup_connecting_cb(app_idx, mcl_idx);
if (btif_hl_create_socket(app_idx, mcl_idx, mdl_idx))
{
status = TRUE;
- BTIF_TRACE_DEBUG4("app_idx=%d mcl_idx=%d mdl_idx=%d p_dcb->channel_id=0x%08x",
+ BTIF_TRACE_DEBUG("app_idx=%d mcl_idx=%d mdl_idx=%d p_dcb->channel_id=0x%08x",
app_idx, mcl_idx, mdl_idx, p_dcb->channel_id);
btif_hl_clean_pcb(p_pcb);
}
else
{
- BTIF_TRACE_ERROR0("Unable to create socket");
+ BTIF_TRACE_ERROR("Unable to create socket");
close_dch = TRUE;
}
}
else
{
- BTIF_TRACE_ERROR1("INVALID_LOCAL_MDEP_ID mdep_id=%d",p_data->dch_open_cfm.local_mdep_id);
+ BTIF_TRACE_ERROR("INVALID_LOCAL_MDEP_ID mdep_id=%d",p_data->dch_open_cfm.local_mdep_id);
close_dch = TRUE;
}
@@ -3062,7 +3006,7 @@
UINT8 app_idx, mcl_idx, mdl_idx, mdep_cfg_idx, dc_cfg;
BOOLEAN close_dch = FALSE;
- BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s", __FUNCTION__);
// Find the correct app_idx based on the mdep_id;
btif_hl_find_app_idx_using_mdepId(p_data->dch_reconnect_ind.local_mdep_id,&app_idx);
@@ -3070,7 +3014,7 @@
if (btif_hl_find_mcl_idx_using_app_idx(p_data->dch_reconnect_ind.mcl_handle, app_idx, &mcl_idx ))
{
p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
- BTIF_TRACE_DEBUG2("btif_hl_proc_dch_reconnect_ind: app_idx = %d, mcl_idx = %d",
+ BTIF_TRACE_DEBUG("btif_hl_proc_dch_reconnect_ind: app_idx = %d, mcl_idx = %d",
app_idx, mcl_idx);
p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
@@ -3091,17 +3035,17 @@
p_dcb->mtu = p_data->dch_reconnect_ind.mtu;
p_dcb->channel_id = btif_hl_get_next_channel_id(p_acb->app_id);
- BTIF_TRACE_DEBUG4(" app_idx=%d mcl_idx=%d mdl_idx=%d channel_id=%d",
+ BTIF_TRACE_DEBUG(" app_idx=%d mcl_idx=%d mdl_idx=%d channel_id=%d",
app_idx, mcl_idx, mdl_idx, p_dcb->channel_id );
if (!btif_hl_create_socket(app_idx, mcl_idx, mdl_idx))
{
- BTIF_TRACE_ERROR0("Unable to create socket");
+ BTIF_TRACE_ERROR("Unable to create socket");
close_dch = TRUE;
}
}
else
{
- BTIF_TRACE_ERROR1("INVALID_LOCAL_MDEP_ID mdep_id=%d",p_data->dch_open_cfm.local_mdep_id);
+ BTIF_TRACE_ERROR("INVALID_LOCAL_MDEP_ID mdep_id=%d",p_data->dch_open_cfm.local_mdep_id);
close_dch = TRUE;
}
@@ -3135,7 +3079,7 @@
btif_hl_mcl_cb_t *p_mcb;
UINT8 app_idx, mcl_idx, mdl_idx;
- BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s", __FUNCTION__);
if (btif_hl_find_mdl_idx_using_handle(p_data->dch_close_ind.mdl_handle,
&app_idx, &mcl_idx, &mdl_idx ))
{
@@ -3146,7 +3090,7 @@
btif_hl_clean_mdl_cb(p_dcb);
if (!btif_hl_num_dchs_in_use(p_mcb->mcl_handle))
btif_hl_start_cch_timer(app_idx, mcl_idx);
- BTIF_TRACE_DEBUG1("remote DCH close success mdl_idx=%d", mdl_idx);
+ BTIF_TRACE_DEBUG("remote DCH close success mdl_idx=%d", mdl_idx);
}
}
@@ -3166,7 +3110,7 @@
btif_hl_mcl_cb_t *p_mcb;
UINT8 app_idx, mcl_idx, mdl_idx;
- BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s", __FUNCTION__);
if (btif_hl_find_mdl_idx_using_handle(p_data->dch_close_cfm.mdl_handle,
&app_idx, &mcl_idx, &mdl_idx ))
{
@@ -3176,7 +3120,7 @@
p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx,mcl_idx);
if (!btif_hl_num_dchs_in_use(p_mcb->mcl_handle))
btif_hl_start_cch_timer(app_idx, mcl_idx);
- BTIF_TRACE_DEBUG1(" local DCH close success mdl_idx=%d", mdl_idx);
+ BTIF_TRACE_DEBUG(" local DCH close success mdl_idx=%d", mdl_idx);
}
}
@@ -3193,7 +3137,7 @@
static void btif_hl_proc_abort_ind(tBTA_HL_MCL_HANDLE mcl_handle){
UINT8 app_idx,mcl_idx;
- BTIF_TRACE_DEBUG1("%s", __FUNCTION__ );
+ BTIF_TRACE_DEBUG("%s", __FUNCTION__ );
btif_hl_app_cb_t *p_acb;
UINT8 i,j;
@@ -3203,7 +3147,7 @@
for (j=0; j < BTA_HL_NUM_MCLS ; j++)
{
if (p_acb->mcb[j].in_use)
- BTIF_TRACE_DEBUG3("btif_hl_find_mcl_idx_using_handle: app_idx=%d,mcl_idx =%d mcl_handle=%d",i,j,p_acb->mcb[j].mcl_handle);
+ BTIF_TRACE_DEBUG("btif_hl_find_mcl_idx_using_handle: app_idx=%d,mcl_idx =%d mcl_handle=%d",i,j,p_acb->mcb[j].mcl_handle);
if (p_acb->mcb[j].in_use &&
(p_acb->mcb[j].mcl_handle == mcl_handle))
{
@@ -3227,7 +3171,7 @@
static void btif_hl_proc_abort_cfm(tBTA_HL_MCL_HANDLE mcl_handle){
UINT8 app_idx,mcl_idx;
- BTIF_TRACE_DEBUG1("%s", __FUNCTION__ );
+ BTIF_TRACE_DEBUG("%s", __FUNCTION__ );
btif_hl_app_cb_t *p_acb;
UINT8 i,j;
@@ -3237,7 +3181,7 @@
for (j=0; j < BTA_HL_NUM_MCLS ; j++)
{
if (p_acb->mcb[j].in_use)
- BTIF_TRACE_DEBUG3("btif_hl_find_mcl_idx_using_handle: app_idx=%d,mcl_idx =%d mcl_handle=%d",i,j,p_acb->mcb[j].mcl_handle);
+ BTIF_TRACE_DEBUG("btif_hl_find_mcl_idx_using_handle: app_idx=%d,mcl_idx =%d mcl_handle=%d",i,j,p_acb->mcb[j].mcl_handle);
if (p_acb->mcb[j].in_use &&
(p_acb->mcb[j].mcl_handle == mcl_handle))
{
@@ -3265,13 +3209,13 @@
btif_hl_mdl_cb_t *p_dcb;
UNUSED(status);
- BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s", __FUNCTION__);
if (btif_hl_find_mdl_idx_using_handle(mdl_handle,
&app_idx, &mcl_idx, &mdl_idx ))
{
p_dcb =BTIF_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
btif_hl_free_buf((void **) &p_dcb->p_tx_pkt);
- BTIF_TRACE_DEBUG1("send success free p_tx_pkt tx_size=%d", p_dcb->tx_size);
+ BTIF_TRACE_DEBUG("send success free p_tx_pkt tx_size=%d", p_dcb->tx_size);
p_dcb->tx_size = 0;
}
}
@@ -3291,7 +3235,7 @@
btif_hl_mdl_cb_t *p_dcb;
UINT8 app_idx, mcl_idx, mdl_idx;
- BTIF_TRACE_DEBUG0("btif_hl_proc_dch_cong_ind");
+ BTIF_TRACE_DEBUG("btif_hl_proc_dch_cong_ind");
if (btif_hl_find_mdl_idx_using_handle(p_data->dch_cong_ind.mdl_handle, &app_idx, &mcl_idx, &mdl_idx))
@@ -3318,11 +3262,11 @@
btif_hl_app_data_t *p_data;
UNUSED(p_cback);
- BTIF_TRACE_DEBUG3("%s app_idx=%d app_id=%d", __FUNCTION__, app_idx, app_id);
+ BTIF_TRACE_DEBUG("%s app_idx=%d app_id=%d", __FUNCTION__, app_idx, app_id);
if(reg_counter >1)
{
- BTIF_TRACE_DEBUG0("btif_hl_proc_reg_request: calling uPDATE");
+ BTIF_TRACE_DEBUG("btif_hl_proc_reg_request: calling uPDATE");
BTA_HlUpdate(app_id, p_reg_param,TRUE, btif_hl_cback);
}
else
@@ -3352,7 +3296,7 @@
UINT8 preg_idx;
bt_status_t bt_status;
- BTIF_TRACE_DEBUG2("%s event %d", __FUNCTION__, event);
+ BTIF_TRACE_DEBUG("%s event %d", __FUNCTION__, event);
btif_hl_display_calling_process_name();
switch (event)
@@ -3369,7 +3313,7 @@
if (send_chan_cb)
{
btif_hl_copy_bda(&bd_addr, p_data->chan_cb.bd_addr);
- BTIF_TRACE_DEBUG4("state callbk: ch_id=0x%08x cb_state=%d state=%d fd=%d",
+ BTIF_TRACE_DEBUG("state callbk: ch_id=0x%08x cb_state=%d state=%d fd=%d",
p_data->chan_cb.channel_id,
p_data->chan_cb.cb_state,
state, p_data->chan_cb.fd);
@@ -3383,10 +3327,10 @@
case BTIF_HL_REG_APP:
p_acb = BTIF_HL_GET_APP_CB_PTR(p_data->reg.app_idx);
app_id = (int) p_acb->app_id;
- BTIF_TRACE_DEBUG2("Rcv BTIF_HL_REG_APP app_idx=%d reg_pending=%d", p_data->reg.app_idx, p_acb->reg_pending);
+ BTIF_TRACE_DEBUG("Rcv BTIF_HL_REG_APP app_idx=%d reg_pending=%d", p_data->reg.app_idx, p_acb->reg_pending);
if (btif_hl_get_state() == BTIF_HL_STATE_ENABLED && p_acb->reg_pending)
{
- BTIF_TRACE_DEBUG1("Rcv BTIF_HL_REG_APP reg_counter=%d",reg_counter);
+ BTIF_TRACE_DEBUG("Rcv BTIF_HL_REG_APP reg_counter=%d",reg_counter);
p_acb->reg_pending = FALSE;
reg_param.dev_type = p_acb->dev_type;
reg_param.sec_mask = BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT;
@@ -3397,13 +3341,13 @@
}
else
{
- BTIF_TRACE_DEBUG2("reg request is processed state=%d reg_pending=%d", btif_hl_get_state(), p_acb->reg_pending);
+ BTIF_TRACE_DEBUG("reg request is processed state=%d reg_pending=%d", btif_hl_get_state(), p_acb->reg_pending);
}
break;
case BTIF_HL_UNREG_APP:
- BTIF_TRACE_DEBUG1("Rcv BTIF_HL_UNREG_APP app_idx=%d", p_data->unreg.app_idx );
+ BTIF_TRACE_DEBUG("Rcv BTIF_HL_UNREG_APP app_idx=%d", p_data->unreg.app_idx );
p_acb = BTIF_HL_GET_APP_CB_PTR(p_data->unreg.app_idx);
if (btif_hl_get_state() == BTIF_HL_STATE_ENABLED)
{
@@ -3414,12 +3358,12 @@
}
break;
case BTIF_HL_UPDATE_MDL:
- BTIF_TRACE_DEBUG1("Rcv BTIF_HL_UPDATE_MDL app_idx=%d", p_data->update_mdl.app_idx );
+ BTIF_TRACE_DEBUG("Rcv BTIF_HL_UPDATE_MDL app_idx=%d", p_data->update_mdl.app_idx );
p_acb = BTIF_HL_GET_APP_CB_PTR(p_data->update_mdl.app_idx);
break;
default:
- BTIF_TRACE_ERROR1("Unknown event %d", event);
+ BTIF_TRACE_ERROR("Unknown event %d", event);
break;
}
}
@@ -3442,13 +3386,13 @@
btif_hl_pend_dch_op_t pending_op;
BOOLEAN status;
- BTIF_TRACE_DEBUG2("%s event %d", __FUNCTION__, event);
+ BTIF_TRACE_DEBUG("%s event %d", __FUNCTION__, event);
btif_hl_display_calling_process_name();
switch (event)
{
case BTA_HL_REGISTER_CFM_EVT:
- BTIF_TRACE_DEBUG0("Rcv BTA_HL_REGISTER_CFM_EVT");
- BTIF_TRACE_DEBUG3("app_id=%d app_handle=%d status=%d ",
+ BTIF_TRACE_DEBUG("Rcv BTA_HL_REGISTER_CFM_EVT");
+ BTIF_TRACE_DEBUG("app_id=%d app_handle=%d status=%d ",
p_data->reg_cfm.app_id,
p_data->reg_cfm.app_handle,
p_data->reg_cfm.status );
@@ -3456,8 +3400,8 @@
btif_hl_proc_reg_cfm(p_data);
break;
case BTA_HL_SDP_INFO_IND_EVT:
- BTIF_TRACE_DEBUG0("Rcv BTA_HL_SDP_INFO_IND_EVT");
- BTIF_TRACE_DEBUG5("app_handle=%d ctrl_psm=0x%04x data_psm=0x%04x x_spec=%d mcap_sup_procs=0x%02x",
+ BTIF_TRACE_DEBUG("Rcv BTA_HL_SDP_INFO_IND_EVT");
+ BTIF_TRACE_DEBUG("app_handle=%d ctrl_psm=0x%04x data_psm=0x%04x x_spec=%d mcap_sup_procs=0x%02x",
p_data->sdp_info_ind.app_handle,
p_data->sdp_info_ind.ctrl_psm,
p_data->sdp_info_ind.data_psm,
@@ -3467,20 +3411,20 @@
break;
case BTA_HL_DEREGISTER_CFM_EVT:
- BTIF_TRACE_DEBUG0("Rcv BTA_HL_DEREGISTER_CFM_EVT");
- BTIF_TRACE_DEBUG2("app_handle=%d status=%d ",
+ BTIF_TRACE_DEBUG("Rcv BTA_HL_DEREGISTER_CFM_EVT");
+ BTIF_TRACE_DEBUG("app_handle=%d status=%d ",
p_data->dereg_cfm.app_handle,
p_data->dereg_cfm.status );
btif_hl_proc_dereg_cfm(p_data);
break;
case BTA_HL_SDP_QUERY_CFM_EVT:
- BTIF_TRACE_DEBUG0("Rcv BTA_HL_SDP_QUERY_CFM_EVT");
- BTIF_TRACE_DEBUG3("app_handle=%d app_id =%d,status =%d",
+ BTIF_TRACE_DEBUG("Rcv BTA_HL_SDP_QUERY_CFM_EVT");
+ BTIF_TRACE_DEBUG("app_handle=%d app_id =%d,status =%d",
p_data->sdp_query_cfm.app_handle,p_data->sdp_query_cfm.app_id,
p_data->sdp_query_cfm.status);
- BTIF_TRACE_DEBUG6("DB [%02x] [%02x] [%02x] [%02x] [%02x] [%02x]",
+ BTIF_TRACE_DEBUG("DB [%02x] [%02x] [%02x] [%02x] [%02x] [%02x]",
p_data->sdp_query_cfm.bd_addr[0], p_data->sdp_query_cfm.bd_addr[1],
p_data->sdp_query_cfm.bd_addr[2], p_data->sdp_query_cfm.bd_addr[3],
p_data->sdp_query_cfm.bd_addr[4], p_data->sdp_query_cfm.bd_addr[5]);
@@ -3492,7 +3436,7 @@
if (!status)
{
- BTIF_TRACE_DEBUG1("BTA_HL_SDP_QUERY_CFM_EVT Status = %d",
+ BTIF_TRACE_DEBUG("BTA_HL_SDP_QUERY_CFM_EVT Status = %d",
p_data->sdp_query_cfm.status);
if (btif_hl_find_app_idx_using_app_id(p_data->sdp_query_cfm.app_id, &app_idx))
{
@@ -3525,13 +3469,13 @@
case BTA_HL_CCH_OPEN_CFM_EVT:
- BTIF_TRACE_DEBUG0("Rcv BTA_HL_CCH_OPEN_CFM_EVT");
- BTIF_TRACE_DEBUG4("app_id=%d,app_handle=%d mcl_handle=%d status =%d",
+ BTIF_TRACE_DEBUG("Rcv BTA_HL_CCH_OPEN_CFM_EVT");
+ BTIF_TRACE_DEBUG("app_id=%d,app_handle=%d mcl_handle=%d status =%d",
p_data->cch_open_cfm.app_id,
p_data->cch_open_cfm.app_handle,
p_data->cch_open_cfm.mcl_handle,
p_data->cch_open_cfm.status);
- BTIF_TRACE_DEBUG6("DB [%02x] [%02x] [%02x] [%02x] [%02x] [%02x]",
+ BTIF_TRACE_DEBUG("DB [%02x] [%02x] [%02x] [%02x] [%02x] [%02x]",
p_data->cch_open_cfm.bd_addr[0], p_data->cch_open_cfm.bd_addr[1],
p_data->cch_open_cfm.bd_addr[2], p_data->cch_open_cfm.bd_addr[3],
p_data->cch_open_cfm.bd_addr[4], p_data->cch_open_cfm.bd_addr[5]);
@@ -3572,12 +3516,12 @@
break;
case BTA_HL_DCH_OPEN_CFM_EVT:
- BTIF_TRACE_DEBUG0("Rcv BTA_HL_DCH_OPEN_CFM_EVT");
- BTIF_TRACE_DEBUG3("mcl_handle=%d mdl_handle=0x%x status=%d ",
+ BTIF_TRACE_DEBUG("Rcv BTA_HL_DCH_OPEN_CFM_EVT");
+ BTIF_TRACE_DEBUG("mcl_handle=%d mdl_handle=0x%x status=%d ",
p_data->dch_open_cfm.mcl_handle,
p_data->dch_open_cfm.mdl_handle,
p_data->dch_open_cfm.status);
- BTIF_TRACE_DEBUG5("first_reliable =%d dch_mode=%d local_mdep_id=%d mdl_id=%d mtu=%d",
+ BTIF_TRACE_DEBUG("first_reliable =%d dch_mode=%d local_mdep_id=%d mdl_id=%d mtu=%d",
p_data->dch_open_cfm.first_reliable,
p_data->dch_open_cfm.dch_mode,
p_data->dch_open_cfm.local_mdep_id,
@@ -3614,11 +3558,11 @@
case BTA_HL_CCH_OPEN_IND_EVT:
- BTIF_TRACE_DEBUG0("Rcv BTA_HL_CCH_OPEN_IND_EVT");
- BTIF_TRACE_DEBUG2("app_handle=%d mcl_handle=%d",
+ BTIF_TRACE_DEBUG("Rcv BTA_HL_CCH_OPEN_IND_EVT");
+ BTIF_TRACE_DEBUG("app_handle=%d mcl_handle=%d",
p_data->cch_open_ind.app_handle,
p_data->cch_open_ind.mcl_handle);
- BTIF_TRACE_DEBUG6("DB [%02x] [%02x] [%02x] [%02x] [%02x] [%02x]",
+ BTIF_TRACE_DEBUG("DB [%02x] [%02x] [%02x] [%02x] [%02x] [%02x]",
p_data->cch_open_ind.bd_addr[0], p_data->cch_open_ind.bd_addr[1],
p_data->cch_open_ind.bd_addr[2], p_data->cch_open_ind.bd_addr[3],
p_data->cch_open_ind.bd_addr[4], p_data->cch_open_ind.bd_addr[5]);
@@ -3627,10 +3571,10 @@
break;
case BTA_HL_DCH_CREATE_IND_EVT:
- BTIF_TRACE_DEBUG0("Rcv BTA_HL_DCH_CREATE_IND_EVT");
- BTIF_TRACE_DEBUG1("mcl_handle=%d",
+ BTIF_TRACE_DEBUG("Rcv BTA_HL_DCH_CREATE_IND_EVT");
+ BTIF_TRACE_DEBUG("mcl_handle=%d",
p_data->dch_create_ind.mcl_handle );
- BTIF_TRACE_DEBUG3("local_mdep_id =%d mdl_id=%d cfg=%d",
+ BTIF_TRACE_DEBUG("local_mdep_id =%d mdl_id=%d cfg=%d",
p_data->dch_create_ind.local_mdep_id,
p_data->dch_create_ind.mdl_id,
p_data->dch_create_ind.cfg);
@@ -3638,11 +3582,11 @@
break;
case BTA_HL_DCH_OPEN_IND_EVT:
- BTIF_TRACE_DEBUG0("Rcv BTA_HL_DCH_OPEN_IND_EVT");
- BTIF_TRACE_DEBUG2("mcl_handle=%d mdl_handle=0x%x",
+ BTIF_TRACE_DEBUG("Rcv BTA_HL_DCH_OPEN_IND_EVT");
+ BTIF_TRACE_DEBUG("mcl_handle=%d mdl_handle=0x%x",
p_data->dch_open_ind.mcl_handle,
p_data->dch_open_ind.mdl_handle );
- BTIF_TRACE_DEBUG5("first_reliable =%d dch_mode=%d local_mdep_id=%d mdl_id=%d mtu=%d",
+ BTIF_TRACE_DEBUG("first_reliable =%d dch_mode=%d local_mdep_id=%d mdl_id=%d mtu=%d",
p_data->dch_open_ind.first_reliable,
p_data->dch_open_ind.dch_mode,
p_data->dch_open_ind.local_mdep_id,
@@ -3653,15 +3597,15 @@
break;
case BTA_HL_DELETE_MDL_IND_EVT:
- BTIF_TRACE_DEBUG0("Rcv BTA_HL_DELETE_MDL_IND_EVT");
- BTIF_TRACE_DEBUG2("mcl_handle=%d mdl_id=0x%x",
+ BTIF_TRACE_DEBUG("Rcv BTA_HL_DELETE_MDL_IND_EVT");
+ BTIF_TRACE_DEBUG("mcl_handle=%d mdl_id=0x%x",
p_data->delete_mdl_ind.mcl_handle,
p_data->delete_mdl_ind.mdl_id);
break;
case BTA_HL_DELETE_MDL_CFM_EVT:
- BTIF_TRACE_DEBUG0("Rcv BTA_HL_DELETE_MDL_CFM_EVT");
- BTIF_TRACE_DEBUG3("mcl_handle=%d mdl_id=0x%x status=%d",
+ BTIF_TRACE_DEBUG("Rcv BTA_HL_DELETE_MDL_CFM_EVT");
+ BTIF_TRACE_DEBUG("mcl_handle=%d mdl_id=0x%x status=%d",
p_data->delete_mdl_cfm.mcl_handle,
p_data->delete_mdl_cfm.mdl_id,
p_data->delete_mdl_cfm.status);
@@ -3676,12 +3620,12 @@
break;
case BTA_HL_DCH_RECONNECT_CFM_EVT:
- BTIF_TRACE_DEBUG0("Rcv BTA_HL_DCH_RECONNECT_CFM_EVT");
- BTIF_TRACE_DEBUG3("mcl_handle=%d mdl_handle=%d status=%d ",
+ BTIF_TRACE_DEBUG("Rcv BTA_HL_DCH_RECONNECT_CFM_EVT");
+ BTIF_TRACE_DEBUG("mcl_handle=%d mdl_handle=%d status=%d ",
p_data->dch_reconnect_cfm.mcl_handle,
p_data->dch_reconnect_cfm.mdl_handle,
p_data->dch_reconnect_cfm.status);
- BTIF_TRACE_DEBUG4("first_reliable =%d dch_mode=%d mdl_id=%d mtu=%d",
+ BTIF_TRACE_DEBUG("first_reliable =%d dch_mode=%d mdl_id=%d mtu=%d",
p_data->dch_reconnect_cfm.first_reliable,
p_data->dch_reconnect_cfm.dch_mode,
p_data->dch_reconnect_cfm.mdl_id,
@@ -3719,8 +3663,8 @@
break;
case BTA_HL_CCH_CLOSE_CFM_EVT:
- BTIF_TRACE_DEBUG0("Rcv BTA_HL_CCH_CLOSE_CFM_EVT");
- BTIF_TRACE_DEBUG2("mcl_handle=%d status =%d",
+ BTIF_TRACE_DEBUG("Rcv BTA_HL_CCH_CLOSE_CFM_EVT");
+ BTIF_TRACE_DEBUG("mcl_handle=%d status =%d",
p_data->cch_close_cfm.mcl_handle,
p_data->cch_close_cfm.status);
if (p_data->cch_close_cfm.status == BTA_HL_STATUS_OK)
@@ -3730,8 +3674,8 @@
break;
case BTA_HL_CCH_CLOSE_IND_EVT:
- BTIF_TRACE_DEBUG0("Rcv BTA_HL_CCH_CLOSE_IND_EVT");
- BTIF_TRACE_DEBUG2("mcl_handle =%d intentional_close=%s",
+ BTIF_TRACE_DEBUG("Rcv BTA_HL_CCH_CLOSE_IND_EVT");
+ BTIF_TRACE_DEBUG("mcl_handle =%d intentional_close=%s",
p_data->cch_close_ind.mcl_handle,
(p_data->cch_close_ind.intentional?"Yes":"No"));
@@ -3739,8 +3683,8 @@
break;
case BTA_HL_DCH_CLOSE_IND_EVT:
- BTIF_TRACE_DEBUG0("Rcv BTA_HL_DCH_CLOSE_IND_EVT");
- BTIF_TRACE_DEBUG2("mdl_handle=%d intentional_close=%s",
+ BTIF_TRACE_DEBUG("Rcv BTA_HL_DCH_CLOSE_IND_EVT");
+ BTIF_TRACE_DEBUG("mdl_handle=%d intentional_close=%s",
p_data->dch_close_ind.mdl_handle,
(p_data->dch_close_ind.intentional?"Yes":"No") );
@@ -3748,8 +3692,8 @@
break;
case BTA_HL_DCH_CLOSE_CFM_EVT:
- BTIF_TRACE_DEBUG0("Rcv BTA_HL_DCH_CLOSE_CFM_EVT");
- BTIF_TRACE_DEBUG2("mdl_handle=%d status=%d ",
+ BTIF_TRACE_DEBUG("Rcv BTA_HL_DCH_CLOSE_CFM_EVT");
+ BTIF_TRACE_DEBUG("mdl_handle=%d status=%d ",
p_data->dch_close_cfm.mdl_handle,
p_data->dch_close_cfm.status);
@@ -3760,8 +3704,8 @@
break;
case BTA_HL_DCH_ECHO_TEST_CFM_EVT:
- BTIF_TRACE_DEBUG0("Rcv BTA_HL_DCH_ECHO_TEST_CFM_EVT");
- BTIF_TRACE_DEBUG2("mcl_handle=%d status=%d",
+ BTIF_TRACE_DEBUG("Rcv BTA_HL_DCH_ECHO_TEST_CFM_EVT");
+ BTIF_TRACE_DEBUG("mcl_handle=%d status=%d",
p_data->echo_test_cfm.mcl_handle,
p_data->echo_test_cfm.status );
/* not supported */
@@ -3769,12 +3713,12 @@
case BTA_HL_DCH_RECONNECT_IND_EVT:
- BTIF_TRACE_DEBUG0("Rcv BTA_HL_DCH_RECONNECT_IND_EVT");
+ BTIF_TRACE_DEBUG("Rcv BTA_HL_DCH_RECONNECT_IND_EVT");
- BTIF_TRACE_DEBUG2("mcl_handle=%d mdl_handle=5d",
+ BTIF_TRACE_DEBUG("mcl_handle=%d mdl_handle=5d",
p_data->dch_reconnect_ind.mcl_handle,
p_data->dch_reconnect_ind.mdl_handle );
- BTIF_TRACE_DEBUG4("first_reliable =%d dch_mode=%d mdl_id=%d mtu=%d",
+ BTIF_TRACE_DEBUG("first_reliable =%d dch_mode=%d mdl_id=%d mtu=%d",
p_data->dch_reconnect_ind.first_reliable,
p_data->dch_reconnect_ind.dch_mode,
p_data->dch_reconnect_ind.mdl_id,
@@ -3784,22 +3728,22 @@
break;
case BTA_HL_CONG_CHG_IND_EVT:
- BTIF_TRACE_DEBUG0("Rcv BTA_HL_CONG_CHG_IND_EVT");
- BTIF_TRACE_DEBUG2("mdl_handle=%d cong =%d",
+ BTIF_TRACE_DEBUG("Rcv BTA_HL_CONG_CHG_IND_EVT");
+ BTIF_TRACE_DEBUG("mdl_handle=%d cong =%d",
p_data->dch_cong_ind.mdl_handle,
p_data->dch_cong_ind.cong);
btif_hl_proc_dch_cong_ind(p_data);
break;
case BTA_HL_DCH_ABORT_IND_EVT:
- BTIF_TRACE_DEBUG0("Rcv BTA_HL_DCH_ABORT_IND_EVT");
- BTIF_TRACE_DEBUG1("mcl_handle=%d",
+ BTIF_TRACE_DEBUG("Rcv BTA_HL_DCH_ABORT_IND_EVT");
+ BTIF_TRACE_DEBUG("mcl_handle=%d",
p_data->dch_abort_ind.mcl_handle );
btif_hl_proc_abort_ind(p_data->dch_abort_ind.mcl_handle);
break;
case BTA_HL_DCH_ABORT_CFM_EVT:
- BTIF_TRACE_DEBUG0("Rcv BTA_HL_DCH_ABORT_CFM_EVT");
- BTIF_TRACE_DEBUG2("mcl_handle=%d status =%d",
+ BTIF_TRACE_DEBUG("Rcv BTA_HL_DCH_ABORT_CFM_EVT");
+ BTIF_TRACE_DEBUG("mcl_handle=%d status =%d",
p_data->dch_abort_cfm.mcl_handle,
p_data->dch_abort_cfm.status);
if (p_data->dch_abort_cfm.status == BTA_HL_STATUS_OK)
@@ -3809,8 +3753,8 @@
break;
case BTA_HL_DCH_SEND_DATA_CFM_EVT:
- BTIF_TRACE_DEBUG0("Rcv BTA_HL_DCH_SEND_DATA_CFM_EVT");
- BTIF_TRACE_DEBUG2("mdl_handle=0x%x status =%d",
+ BTIF_TRACE_DEBUG("Rcv BTA_HL_DCH_SEND_DATA_CFM_EVT");
+ BTIF_TRACE_DEBUG("mdl_handle=0x%x status =%d",
p_data->dch_send_data_cfm.mdl_handle,
p_data->dch_send_data_cfm.status);
btif_hl_proc_send_data_cfm(p_data->dch_send_data_cfm.mdl_handle,
@@ -3818,14 +3762,14 @@
break;
case BTA_HL_DCH_RCV_DATA_IND_EVT:
- BTIF_TRACE_DEBUG0("Rcv BTA_HL_DCH_RCV_DATA_IND_EVT");
- BTIF_TRACE_DEBUG1("mdl_handle=0x%x ",
+ BTIF_TRACE_DEBUG("Rcv BTA_HL_DCH_RCV_DATA_IND_EVT");
+ BTIF_TRACE_DEBUG("mdl_handle=0x%x ",
p_data->dch_rcv_data_ind.mdl_handle);
/* do nothing here */
break;
default:
- BTIF_TRACE_DEBUG1("Unknown Event (0x%02x)...", event);
+ BTIF_TRACE_DEBUG("Unknown Event (0x%02x)...", event);
break;
}
}
@@ -3842,7 +3786,7 @@
static void btif_hl_cback(tBTA_HL_EVT event, tBTA_HL *p_data){
bt_status_t status;
int param_len = 0;
- BTIF_TRACE_DEBUG2("%s event %d", __FUNCTION__, event);
+ BTIF_TRACE_DEBUG("%s event %d", __FUNCTION__, event);
btif_hl_display_calling_process_name();
switch (event)
{
@@ -3940,14 +3884,14 @@
tBTA_HL_REG_PARAM reg_param;
btif_hl_app_cb_t *p_acb;
- BTIF_TRACE_DEBUG2("%s event %d", __FUNCTION__, event);
+ BTIF_TRACE_DEBUG("%s event %d", __FUNCTION__, event);
btif_hl_display_calling_process_name();
switch ( event )
{
case BTA_HL_CTRL_ENABLE_CFM_EVT:
- BTIF_TRACE_DEBUG0("Rcv BTA_HL_CTRL_ENABLE_CFM_EVT");
- BTIF_TRACE_DEBUG1("status=%d", p_data->enable_cfm.status);
+ BTIF_TRACE_DEBUG("Rcv BTA_HL_CTRL_ENABLE_CFM_EVT");
+ BTIF_TRACE_DEBUG("status=%d", p_data->enable_cfm.status);
if (p_data->enable_cfm.status == BTA_HL_STATUS_OK)
{
@@ -3966,7 +3910,7 @@
reg_param.p_srv_desp = p_acb->srv_desp;
reg_param.p_provider_name = p_acb->provider_name;
- BTIF_TRACE_DEBUG1("Register pending app_id=%d", p_acb->app_id);
+ BTIF_TRACE_DEBUG("Register pending app_id=%d", p_acb->app_id);
btif_hl_proc_reg_request (i, p_acb->app_id, ®_param, btif_hl_cback);
}
}
@@ -3974,8 +3918,8 @@
break;
case BTA_HL_CTRL_DISABLE_CFM_EVT:
- BTIF_TRACE_DEBUG0("Rcv BTA_HL_CTRL_DISABLE_CFM_EVT");
- BTIF_TRACE_DEBUG1("status=%d",
+ BTIF_TRACE_DEBUG("Rcv BTA_HL_CTRL_DISABLE_CFM_EVT");
+ BTIF_TRACE_DEBUG("status=%d",
p_data->disable_cfm.status);
if (p_data->disable_cfm.status == BTA_HL_STATUS_OK)
@@ -4003,7 +3947,7 @@
bt_status_t status;
int param_len = 0;
- BTIF_TRACE_DEBUG2("%s event %d", __FUNCTION__, event);
+ BTIF_TRACE_DEBUG("%s event %d", __FUNCTION__, event);
btif_hl_display_calling_process_name();
switch ( event )
@@ -4039,7 +3983,7 @@
UINT8 i;
CHECK_BTHL_INIT();
- BTIF_TRACE_EVENT1("%s", __FUNCTION__);
+ BTIF_TRACE_EVENT("%s", __FUNCTION__);
btif_hl_display_calling_process_name();
@@ -4057,7 +4001,7 @@
{
dch_open.ctrl_psm = p_mcb->ctrl_psm;
dch_open.local_mdep_id = p_acb->sup_feature.mdep[mdep_cfg_index].mdep_id;
- BTIF_TRACE_DEBUG4("connect_channel: app_idx =%d, mdep_cfg_indx =%d, mdep_id =%d app_id= %d", app_idx,
+ BTIF_TRACE_DEBUG("connect_channel: app_idx =%d, mdep_cfg_indx =%d, mdep_id =%d app_id= %d", app_idx,
mdep_cfg_index, dch_open.local_mdep_id, app_id);
if (btif_hl_find_peer_mdep_id(p_acb->app_id, p_mcb->bd_addr,
p_acb->sup_feature.mdep[mdep_cfg_index].mdep_cfg.mdep_role,
@@ -4075,7 +4019,7 @@
mdep_cfg_index, BTIF_HL_PEND_DCH_OP_OPEN, channel_id ))
{
status = BT_STATUS_FAIL;
- BTIF_TRACE_EVENT1("%s loc0 status = BT_STATUS_FAIL", __FUNCTION__);
+ BTIF_TRACE_EVENT("%s loc0 status = BT_STATUS_FAIL", __FUNCTION__);
}
}
else
@@ -4117,7 +4061,7 @@
status = BT_STATUS_FAIL;
}
- BTIF_TRACE_DEBUG3("%s status=%d channel_id=0x%08x", __FUNCTION__, status, *channel_id);
+ BTIF_TRACE_DEBUG("%s status=%d channel_id=0x%08x", __FUNCTION__, status, *channel_id);
return status;
}
@@ -4131,7 +4075,7 @@
**
*******************************************************************************/
static bt_status_t destroy_channel(int channel_id){
- UINT8 app_idx, mcl_idx, mdl_idx, mdl_cfg_idx, app_id, mdep_cfg_idx;
+ UINT8 app_idx, mcl_idx, mdl_idx, mdl_cfg_idx, app_id, mdep_cfg_idx = 0;
bt_status_t status = BT_STATUS_SUCCESS;
btif_hl_mdl_cfg_t *p_mdl;
btif_hl_mcl_cb_t *p_mcb;
@@ -4139,7 +4083,7 @@
btif_hl_app_cb_t *p_acb;
CHECK_BTHL_INIT();
- BTIF_TRACE_EVENT2("%s channel_id=0x%08x", __FUNCTION__, channel_id);
+ BTIF_TRACE_EVENT("%s channel_id=0x%08x", __FUNCTION__, channel_id);
btif_hl_display_calling_process_name();
@@ -4167,7 +4111,7 @@
p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
if (p_mcb->is_connected)
{
- BTIF_TRACE_DEBUG1("calling BTA_HlDeleteMdl mdl_id=%d",p_acb->delete_mdl.mdl_id );
+ BTIF_TRACE_DEBUG("calling BTA_HlDeleteMdl mdl_id=%d",p_acb->delete_mdl.mdl_id );
BTA_HlDeleteMdl(p_mcb->mcl_handle, p_acb->delete_mdl.mdl_id);
}
else
@@ -4177,7 +4121,7 @@
}
else
{
- BTIF_TRACE_DEBUG0("btif_hl_delete_mdl calling btif_hl_cch_open" );
+ BTIF_TRACE_DEBUG("btif_hl_delete_mdl calling btif_hl_cch_open" );
mdep_cfg_idx = p_mdl->extra.mdep_cfg_idx;
p_acb->filter.num_elems =1;
p_acb->filter.elem[0].data_type = p_acb->sup_feature.mdep[mdep_cfg_idx].mdep_cfg.data_cfg[mdep_cfg_idx].data_type;
@@ -4229,7 +4173,7 @@
btif_hl_evt_cb_t evt_param;
CHECK_BTHL_INIT();
- BTIF_TRACE_EVENT2("%s app_id=%d", __FUNCTION__, app_id);
+ BTIF_TRACE_EVENT("%s app_id=%d", __FUNCTION__, app_id);
btif_hl_display_calling_process_name();
if (btif_hl_find_app_idx(((UINT8)app_id), &app_idx))
@@ -4247,7 +4191,7 @@
status = BT_STATUS_FAIL;
}
- BTIF_TRACE_DEBUG1("de-reg return status=%d", status);
+ BTIF_TRACE_DEBUG("de-reg return status=%d", status);
return status;
}
/*******************************************************************************
@@ -4271,7 +4215,7 @@
int len;
CHECK_BTHL_INIT();
- BTIF_TRACE_EVENT1("%s", __FUNCTION__);
+ BTIF_TRACE_EVENT("%s", __FUNCTION__);
btif_hl_display_calling_process_name();
if (btif_hl_get_state() == BTIF_HL_STATE_DISABLED)
@@ -4283,7 +4227,7 @@
if (!btif_hl_find_avail_app_idx(&app_idx))
{
- BTIF_TRACE_ERROR0("Unable to allocate a new application control block");
+ BTIF_TRACE_ERROR("Unable to allocate a new application control block");
return BT_STATUS_FAIL;
}
@@ -4319,7 +4263,7 @@
if ( !btif_hl_get_bta_mdep_role(p_mdep_cfg->mdep_role, &(p_cfg->mdep_role)))
{
- BTIF_TRACE_ERROR1("Invalid mdep_role=%d", p_mdep_cfg->mdep_role);
+ BTIF_TRACE_ERROR("Invalid mdep_role=%d", p_mdep_cfg->mdep_role);
status = BT_STATUS_FAIL;
break;
}
@@ -4350,7 +4294,7 @@
if ( !btif_hl_get_bta_channel_type(p_mdep_cfg->channel_type, &(p_acb->channel_type[i])))
{
- BTIF_TRACE_ERROR1("Invalid channel_type=%d", p_mdep_cfg->channel_type);
+ BTIF_TRACE_ERROR("Invalid channel_type=%d", p_mdep_cfg->channel_type);
status = BT_STATUS_FAIL;
break;
}
@@ -4364,7 +4308,7 @@
len = sizeof(btif_hl_reg_t);
p_acb->reg_pending = TRUE;
reg_counter++;
- BTIF_TRACE_DEBUG2("calling btif_transfer_context status=%d app_id=%d", status, *app_id);
+ BTIF_TRACE_DEBUG("calling btif_transfer_context status=%d app_id=%d", status, *app_id);
status = btif_transfer_context (btif_hl_proc_cb_evt, BTIF_HL_REG_APP,
(char*) &evt_param, len, NULL);
ASSERTC(status == BT_STATUS_SUCCESS, "context transfer failed", status);
@@ -4375,7 +4319,7 @@
btif_hl_free_app_idx(app_idx);
}
- BTIF_TRACE_DEBUG2("register_application status=%d app_id=%d", status, *app_id);
+ BTIF_TRACE_DEBUG("register_application status=%d app_id=%d", status, *app_id);
return status;
}
@@ -4399,7 +4343,7 @@
btif_hl_evt_cb_t evt_param;
int *p_channel_id;
- BTIF_TRACE_DEBUG6("%s mdep_id=%d item_idx=%d, local_mdep_id=%d mdl_id=0x%x dch_mode=%d",
+ BTIF_TRACE_DEBUG("%s mdep_id=%d item_idx=%d, local_mdep_id=%d mdl_id=0x%x dch_mode=%d",
__FUNCTION__, mdep_id, item_idx, p_mdl_cfg->local_mdep_id,
p_mdl_cfg->mdl_id, p_mdl_cfg->dch_mode );
@@ -4428,11 +4372,11 @@
{
p_mdl->extra.peer_mdep_id = BTA_HL_INVALID_MDEP_ID;
}
- BTIF_TRACE_DEBUG4("%s app_idx=%d item_idx=%d mld_id=0x%x",
+ BTIF_TRACE_DEBUG("%s app_idx=%d item_idx=%d mld_id=0x%x",
__FUNCTION__, app_idx, item_idx, p_mdl->base.mdl_id);
evt_param.update_mdl.app_idx = app_idx;
len = sizeof(btif_hl_update_mdl_t);
- BTIF_TRACE_DEBUG1("send BTIF_HL_UPDATE_MDL event app_idx=%d ",app_idx);
+ BTIF_TRACE_DEBUG("send BTIF_HL_UPDATE_MDL event app_idx=%d ",app_idx);
if ((bt_status = btif_transfer_context (btif_hl_proc_cb_evt, BTIF_HL_UPDATE_MDL,
(char*) &evt_param, len, NULL)) == BT_STATUS_SUCCESS)
{
@@ -4442,7 +4386,7 @@
}
}
}
- BTIF_TRACE_DEBUG2("%s success=%d ",__FUNCTION__, success );
+ BTIF_TRACE_DEBUG("%s success=%d ",__FUNCTION__, success );
return success;
}
@@ -4475,7 +4419,7 @@
memset(p_mdl, 0, sizeof(btif_hl_mdl_cfg_t));
evt_param.update_mdl.app_idx = app_idx;
len = sizeof(btif_hl_update_mdl_t);
- BTIF_TRACE_DEBUG1("send BTIF_HL_UPDATE_MDL event app_idx=%d ",app_idx);
+ BTIF_TRACE_DEBUG("send BTIF_HL_UPDATE_MDL event app_idx=%d ",app_idx);
if ((bt_status = btif_transfer_context (btif_hl_proc_cb_evt, BTIF_HL_UPDATE_MDL,
(char*) &evt_param, len, NULL)) == BT_STATUS_SUCCESS)
{
@@ -4485,51 +4429,12 @@
}
}
- BTIF_TRACE_DEBUG2("%s success=%d ",__FUNCTION__, success );
+ BTIF_TRACE_DEBUG("%s success=%d ",__FUNCTION__, success );
return success;
}
/*******************************************************************************
**
-** Function get_device_datatype
-**
-** Description Start SDP on remote device and look for Remote HDP Data type and role
-**
-** Returns bt_status_t
-**
-*******************************************************************************/
-static bt_status_t get_device_datatype(int app_id, bt_bdaddr_t *bd_addr){
- btif_hl_app_cb_t *p_acb;
- UINT8 app_idx;
- bt_status_t status = BT_STATUS_SUCCESS;
- BD_ADDR bda;
- UINT8 i;
-
- CHECK_BTHL_INIT();
- BTIF_TRACE_EVENT2("%s app_id=%d", __FUNCTION__, app_id);
- btif_hl_display_calling_process_name();
-
- for (i=0; i<6; i++)
- {
- bda[i] = (UINT8) bd_addr->address[i];
- }
-
- if (btif_hl_find_app_idx(((UINT8)app_id), &app_idx))
- {
- p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
- BTA_HlSdpQuery(app_id,p_acb->app_handle,bda);
- }
- else
- {
- status = BT_STATUS_FAIL;
- }
-
- BTIF_TRACE_DEBUG1("de-reg return status=%d", status);
- return status;
-}
-
-/*******************************************************************************
-**
** Function init
**
** Description initializes the hl interface
@@ -4540,7 +4445,7 @@
static bt_status_t init( bthl_callbacks_t* callbacks ){
bt_status_t status = BT_STATUS_SUCCESS;
- BTIF_TRACE_EVENT1("%s", __FUNCTION__);
+ BTIF_TRACE_EVENT("%s", __FUNCTION__);
btif_hl_display_calling_process_name();
bt_hl_callbacks_cb = *callbacks;
bt_hl_callbacks = &bt_hl_callbacks_cb;
@@ -4558,7 +4463,7 @@
**
*******************************************************************************/
static void cleanup( void ){
- BTIF_TRACE_EVENT1("%s", __FUNCTION__);
+ BTIF_TRACE_EVENT("%s", __FUNCTION__);
btif_hl_display_calling_process_name();
if (bt_hl_callbacks)
{
@@ -4592,7 +4497,7 @@
**
*******************************************************************************/
const bthl_interface_t *btif_hl_get_interface(){
- BTIF_TRACE_EVENT1("%s", __FUNCTION__);
+ BTIF_TRACE_EVENT("%s", __FUNCTION__);
return &bthlInterface;
}
@@ -4609,7 +4514,7 @@
btif_hl_soc_cb_t *p_scb = NULL;
int maxfd=0;
- BTIF_TRACE_DEBUG1("btif_hl_update_maxfd max_org_s= %d", max_org_s);
+ BTIF_TRACE_DEBUG("btif_hl_update_maxfd max_org_s= %d", max_org_s);
maxfd = max_org_s;
if (!GKI_queue_is_empty(&soc_queue))
@@ -4618,20 +4523,20 @@
if (maxfd < p_scb->max_s)
{
maxfd = p_scb->max_s;
- BTIF_TRACE_DEBUG1("btif_hl_update_maxfd 1 maxfd=%d", maxfd);
+ BTIF_TRACE_DEBUG("btif_hl_update_maxfd 1 maxfd=%d", maxfd);
}
while (p_scb != NULL)
{
if (maxfd < p_scb->max_s)
{
maxfd = p_scb->max_s;
- BTIF_TRACE_DEBUG1("btif_hl_update_maxfd 2 maxfd=%d", maxfd);
+ BTIF_TRACE_DEBUG("btif_hl_update_maxfd 2 maxfd=%d", maxfd);
}
p_scb = (btif_hl_soc_cb_t *)GKI_getnext((void *)p_scb );
}
}
- BTIF_TRACE_DEBUG1("btif_hl_update_maxfd final *p_max_s=%d", maxfd);
+ BTIF_TRACE_DEBUG("btif_hl_update_maxfd final *p_max_s=%d", maxfd);
return maxfd;
}
/*******************************************************************************
@@ -4644,7 +4549,7 @@
**
*******************************************************************************/
btif_hl_soc_state_t btif_hl_get_socket_state(btif_hl_soc_cb_t *p_scb){
- BTIF_TRACE_DEBUG1("btif_hl_get_socket_state state=%d", p_scb->state);
+ BTIF_TRACE_DEBUG("btif_hl_get_socket_state state=%d", p_scb->state);
return p_scb->state;
}
/*******************************************************************************
@@ -4657,7 +4562,7 @@
**
*******************************************************************************/
void btif_hl_set_socket_state(btif_hl_soc_cb_t *p_scb, btif_hl_soc_state_t new_state){
- BTIF_TRACE_DEBUG2("btif_hl_set_socket_state %d---->%d", p_scb->state, new_state);
+ BTIF_TRACE_DEBUG("btif_hl_set_socket_state %d---->%d", p_scb->state, new_state);
p_scb->state = new_state;
}
/*******************************************************************************
@@ -4674,13 +4579,13 @@
UINT8 i;
btif_hl_mdl_cb_t *p_dcb;
BOOLEAN found= FALSE;
- BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s", __FUNCTION__);
for (i=0; i < BTA_HL_NUM_MDLS_PER_MCL ; i ++)
{
p_dcb = BTIF_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, i);
if (p_dcb && p_dcb->in_use && p_dcb->p_scb)
{
- BTIF_TRACE_DEBUG3("found socket for app_idx=%d mcl_id=%d, mdl_idx=%d", app_idx, mcl_idx, i);
+ BTIF_TRACE_DEBUG("found socket for app_idx=%d mcl_id=%d, mdl_idx=%d", app_idx, mcl_idx, i);
btif_hl_set_socket_state (p_dcb->p_scb, BTIF_HL_SOC_STATE_W4_REL);
p_dcb->p_scb = NULL;
found = TRUE;
@@ -4702,8 +4607,8 @@
btif_hl_soc_cb_t *p_scb = NULL;
btif_hl_mdl_cb_t *p_dcb = BTIF_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
- BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
- BTIF_TRACE_DEBUG3("app_idx=%d mcl_idx=%d mdl_idx=%d", app_idx, mcl_idx, mdl_idx );
+ BTIF_TRACE_DEBUG("%s", __FUNCTION__);
+ BTIF_TRACE_DEBUG("app_idx=%d mcl_idx=%d mdl_idx=%d", app_idx, mcl_idx, mdl_idx );
if (p_dcb && p_dcb->p_scb)
{
@@ -4729,13 +4634,13 @@
UINT8 soc_idx;
BOOLEAN status = FALSE;
- BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s", __FUNCTION__);
if (p_dcb && ((p_scb = (btif_hl_soc_cb_t *)GKI_getbuf((UINT16)sizeof(btif_hl_soc_cb_t)))!=NULL))
{
if (socketpair(AF_UNIX, SOCK_STREAM, 0, p_scb->socket_id) >= 0)
{
- BTIF_TRACE_DEBUG2("socket id[0]=%d id[1]=%d",p_scb->socket_id[0], p_scb->socket_id[1] );
+ BTIF_TRACE_DEBUG("socket id[0]=%d id[1]=%d",p_scb->socket_id[0], p_scb->socket_id[1] );
p_dcb->p_scb = p_scb;
p_scb->app_idx = app_idx;
p_scb->mcl_idx = mcl_idx;
@@ -4756,7 +4661,7 @@
}
}
- BTIF_TRACE_DEBUG2("%s status=%d", __FUNCTION__, status);
+ BTIF_TRACE_DEBUG("%s status=%d", __FUNCTION__, status);
return status;
}
/*******************************************************************************
@@ -4777,19 +4682,19 @@
bt_status_t status;
int len;
- BTIF_TRACE_DEBUG1("entering %s",__FUNCTION__);
+ BTIF_TRACE_DEBUG("entering %s",__FUNCTION__);
if (!GKI_queue_is_empty(&soc_queue))
{
p_scb = (btif_hl_soc_cb_t *)GKI_getfirst((void *)&soc_queue);
- BTIF_TRACE_DEBUG1("btif_hl_add_socket_to_set first p_scb=0x%x", p_scb);
+ BTIF_TRACE_DEBUG("btif_hl_add_socket_to_set first p_scb=0x%x", p_scb);
while (p_scb != NULL)
{
if (btif_hl_get_socket_state(p_scb) == BTIF_HL_SOC_STATE_W4_ADD)
{
btif_hl_set_socket_state(p_scb, BTIF_HL_SOC_STATE_W4_READ);
FD_SET(p_scb->socket_id[1], p_org_set);
- BTIF_TRACE_DEBUG2("found and set socket_id=%d is_set=%d", p_scb->socket_id[1], FD_ISSET(p_scb->socket_id[1], p_org_set));
+ BTIF_TRACE_DEBUG("found and set socket_id=%d is_set=%d", p_scb->socket_id[1], FD_ISSET(p_scb->socket_id[1], p_org_set));
p_mcb = BTIF_HL_GET_MCL_CB_PTR(p_scb->app_idx, p_scb->mcl_idx);
p_dcb = BTIF_HL_GET_MDL_CB_PTR(p_scb->app_idx, p_scb->mcl_idx, p_scb->mdl_idx);
p_acb = BTIF_HL_GET_APP_CB_PTR(p_scb->app_idx);
@@ -4809,11 +4714,11 @@
}
}
p_scb = (btif_hl_soc_cb_t *)GKI_getnext((void *)p_scb );
- BTIF_TRACE_DEBUG1("next p_scb=0x%x", p_scb);
+ BTIF_TRACE_DEBUG("next p_scb=0x%x", p_scb);
}
}
- BTIF_TRACE_DEBUG1("leaving %s",__FUNCTION__);
+ BTIF_TRACE_DEBUG("leaving %s",__FUNCTION__);
}
/*******************************************************************************
**
@@ -4834,7 +4739,7 @@
int app_idx;
bt_status_t status;
- BTIF_TRACE_DEBUG1("entering %s",__FUNCTION__);
+ BTIF_TRACE_DEBUG("entering %s",__FUNCTION__);
if (!GKI_queue_is_empty(&soc_queue))
{
p_scb = (btif_hl_soc_cb_t *)GKI_getfirst((void *)&soc_queue);
@@ -4842,7 +4747,7 @@
{
if (btif_hl_get_socket_state(p_scb) == BTIF_HL_SOC_STATE_W4_REL)
{
- BTIF_TRACE_DEBUG3("app_idx=%d mcl_id=%d, mdl_idx=%d",
+ BTIF_TRACE_DEBUG("app_idx=%d mcl_id=%d, mdl_idx=%d",
p_scb->app_idx, p_scb->mcl_idx, p_scb->mdl_idx);
btif_hl_set_socket_state(p_scb, BTIF_HL_SOC_STATE_IDLE);
if (p_scb->socket_id[1] != -1)
@@ -4866,7 +4771,7 @@
}
}
p_scb = (btif_hl_soc_cb_t *)GKI_getnext((void *)p_scb );
- BTIF_TRACE_DEBUG1("while loop next p_scb=0x%x", p_scb);
+ BTIF_TRACE_DEBUG("while loop next p_scb=0x%x", p_scb);
}
p_scb = (btif_hl_soc_cb_t *)GKI_getfirst((void *)&soc_queue);
@@ -4875,14 +4780,14 @@
if (btif_hl_get_socket_state(p_scb) == BTIF_HL_SOC_STATE_IDLE)
{
p_dcb = BTIF_HL_GET_MDL_CB_PTR(p_scb->app_idx, p_scb->mcl_idx, p_scb->mdl_idx);
- BTIF_TRACE_DEBUG4("idle socket app_idx=%d mcl_id=%d, mdl_idx=%d p_dcb->in_use=%d",
+ BTIF_TRACE_DEBUG("idle socket app_idx=%d mcl_id=%d, mdl_idx=%d p_dcb->in_use=%d",
p_scb->app_idx, p_scb->mcl_idx, p_scb->mdl_idx, p_dcb->in_use);
GKI_remove_from_queue((void *)&soc_queue, p_scb);
btif_hl_free_buf((void **)&p_scb);
p_dcb->p_scb = NULL;
element_removed = TRUE;
}
- BTIF_TRACE_DEBUG2("element_removed=%d p_scb=0x%x", element_removed, p_scb);
+ BTIF_TRACE_DEBUG("element_removed=%d p_scb=0x%x", element_removed, p_scb);
if (element_removed)
{
element_removed = FALSE;
@@ -4891,10 +4796,10 @@
else
p_scb = (btif_hl_soc_cb_t *)GKI_getnext((void *)p_scb );
- BTIF_TRACE_DEBUG1("while loop p_scb=0x%x", p_scb);
+ BTIF_TRACE_DEBUG("while loop p_scb=0x%x", p_scb);
}
}
- BTIF_TRACE_DEBUG1("leaving %s",__FUNCTION__);
+ BTIF_TRACE_DEBUG("leaving %s",__FUNCTION__);
}
/*******************************************************************************
**
@@ -4907,7 +4812,7 @@
*******************************************************************************/
void btif_hl_select_wakeup_callback( fd_set *p_org_set , int wakeup_signal){
- BTIF_TRACE_DEBUG2("entering %s wakeup_signal=0x%04x",__FUNCTION__, wakeup_signal);
+ BTIF_TRACE_DEBUG("entering %s wakeup_signal=0x%04x",__FUNCTION__, wakeup_signal);
if (wakeup_signal == btif_hl_signal_select_wakeup )
{
@@ -4917,7 +4822,7 @@
{
btif_hl_close_socket(p_org_set);
}
- BTIF_TRACE_DEBUG1("leaving %s",__FUNCTION__);
+ BTIF_TRACE_DEBUG("leaving %s",__FUNCTION__);
}
/*******************************************************************************
@@ -4935,24 +4840,24 @@
int r;
UNUSED(p_org_set);
- BTIF_TRACE_DEBUG1("entering %s",__FUNCTION__);
+ BTIF_TRACE_DEBUG("entering %s",__FUNCTION__);
if (!GKI_queue_is_empty(&soc_queue))
{
p_scb = (btif_hl_soc_cb_t *)GKI_getfirst((void *)&soc_queue);
- BTIF_TRACE_DEBUG0(" GKI queue is not empty ");
+ BTIF_TRACE_DEBUG(" GKI queue is not empty ");
while (p_scb != NULL)
{
if (btif_hl_get_socket_state(p_scb) == BTIF_HL_SOC_STATE_W4_READ)
{
if (FD_ISSET(p_scb->socket_id[1], p_cur_set))
{
- BTIF_TRACE_DEBUG0("read data");
- BTIF_TRACE_DEBUG0("state= BTIF_HL_SOC_STATE_W4_READ");
+ BTIF_TRACE_DEBUG("read data");
+ BTIF_TRACE_DEBUG("state= BTIF_HL_SOC_STATE_W4_READ");
p_dcb = BTIF_HL_GET_MDL_CB_PTR(p_scb->app_idx, p_scb->mcl_idx, p_scb->mdl_idx);
if (p_dcb->p_tx_pkt)
{
- BTIF_TRACE_ERROR1("Rcv new pkt but the last pkt is still not been sent tx_size=%d", p_dcb->tx_size);
+ BTIF_TRACE_ERROR("Rcv new pkt but the last pkt is still not been sent tx_size=%d", p_dcb->tx_size);
btif_hl_free_buf((void **) &p_dcb->p_tx_pkt);
}
p_dcb->p_tx_pkt = btif_hl_get_buf (p_dcb->mtu);
@@ -4965,15 +4870,15 @@
if ((r = (int)recv(p_scb->socket_id[1], p_dcb->p_tx_pkt, p_dcb->mtu , MSG_DONTWAIT)) > 0)
{
- BTIF_TRACE_DEBUG1("btif_hl_select_monitor_callback send data r =%d", r);
+ BTIF_TRACE_DEBUG("btif_hl_select_monitor_callback send data r =%d", r);
p_dcb->tx_size = r;
- BTIF_TRACE_DEBUG1("btif_hl_select_monitor_callback send data tx_size=%d", p_dcb->tx_size );
+ BTIF_TRACE_DEBUG("btif_hl_select_monitor_callback send data tx_size=%d", p_dcb->tx_size );
BTA_HlSendData(p_dcb->mdl_handle, p_dcb->tx_size );
}
if (r <= 0 )
{
- BTIF_TRACE_DEBUG1("btif_hl_select_monitor_callback receive failed r=%d",r);
+ BTIF_TRACE_DEBUG("btif_hl_select_monitor_callback receive failed r=%d",r);
BTA_HlDchClose(p_dcb->mdl_handle );
}
}
@@ -4984,9 +4889,9 @@
}
else
{
- BTIF_TRACE_DEBUG0("btif_hl_select_monitor_queue is empty");
+ BTIF_TRACE_DEBUG("btif_hl_select_monitor_queue is empty");
}
- BTIF_TRACE_DEBUG1("leaving %s",__FUNCTION__);
+ BTIF_TRACE_DEBUG("leaving %s",__FUNCTION__);
}
/*******************************************************************************
**
@@ -4998,14 +4903,14 @@
**
*******************************************************************************/
static inline int btif_hl_select_wakeup_init(fd_set* set){
- BTIF_TRACE_DEBUG0("btif_hl_select_wakeup_init");
- if (socketpair(AF_UNIX, SOCK_STREAM, 0, signal_fds) < 0)
+ BTIF_TRACE_DEBUG("%s", __func__);
+ if (signal_fds[0] == -1 && socketpair(AF_UNIX, SOCK_STREAM, 0, signal_fds) < 0)
{
- BTIF_TRACE_ERROR1("socketpair failed: %s", strerror(errno));
+ BTIF_TRACE_ERROR("socketpair failed: %s", strerror(errno));
return -1;
}
- BTIF_TRACE_DEBUG2("btif_hl_select_wakeup_init signal_fds[0]=%d signal_fds[1]=%d",signal_fds[0], signal_fds[1] );
+ BTIF_TRACE_DEBUG("btif_hl_select_wakeup_init signal_fds[0]=%d signal_fds[1]=%d",signal_fds[0], signal_fds[1] );
FD_SET(signal_fds[0], set);
return signal_fds[0];
@@ -5022,7 +4927,7 @@
*******************************************************************************/
static inline int btif_hl_select_wakeup(void){
char sig_on = btif_hl_signal_select_wakeup;
- BTIF_TRACE_DEBUG0("btif_hl_select_wakeup");
+ BTIF_TRACE_DEBUG("btif_hl_select_wakeup");
return send(signal_fds[1], &sig_on, sizeof(sig_on), 0);
}
@@ -5037,7 +4942,7 @@
*******************************************************************************/
static inline int btif_hl_select_close_connected(void){
char sig_on = btif_hl_signal_select_close_connected;
- BTIF_TRACE_DEBUG0("btif_hl_select_close_connected");
+ BTIF_TRACE_DEBUG("btif_hl_select_close_connected");
return send(signal_fds[1], &sig_on, sizeof(sig_on), 0);
}
@@ -5054,23 +4959,16 @@
{
int result = 0;
char sig_on = btif_hl_signal_select_exit;
- BTIF_TRACE_DEBUG0("btif_hl_signal_select_exit");
+ BTIF_TRACE_DEBUG("btif_hl_signal_select_exit");
result = send(signal_fds[1], &sig_on, sizeof(sig_on), 0);
- /* Wait for the select_thread_id to exit */
- if (select_thread_id != -1) {
- pthread_join(select_thread_id, NULL);
- select_thread_id = -1;
- }
- /* Cleanup signal sockets */
- if(signal_fds[0] != -1)
+ if (btif_is_enabled())
{
- close(signal_fds[0]);
- signal_fds[0] = -1;
- }
- if(signal_fds[1] != -1)
- {
- close(signal_fds[1]);
- signal_fds[1] = -1;
+ /* Wait for the select_thread_id to exit if BT is still enabled
+ and only this profile getting cleaned up*/
+ if (select_thread_id != -1) {
+ pthread_join(select_thread_id, NULL);
+ select_thread_id = -1;
+ }
}
return result;
}
@@ -5087,7 +4985,7 @@
static inline int btif_hl_select_wake_reset(void){
char sig_recv = 0;
- BTIF_TRACE_DEBUG0("btif_hl_select_wake_reset");
+ BTIF_TRACE_DEBUG("btif_hl_select_wake_reset");
recv(signal_fds[0], &sig_recv, sizeof(sig_recv), MSG_WAITALL);
return(int)sig_recv;
}
@@ -5101,7 +4999,7 @@
**
*******************************************************************************/
static inline int btif_hl_select_wake_signaled(fd_set* set){
- BTIF_TRACE_DEBUG0("btif_hl_select_wake_signaled");
+ BTIF_TRACE_DEBUG("btif_hl_select_wake_signaled");
return FD_ISSET(signal_fds[0], set);
}
/*******************************************************************************
@@ -5122,7 +5020,7 @@
close(connected_s);
}
listen_s = connected_s = -1;
- BTIF_TRACE_DEBUG0("hl thread cleanup");
+ BTIF_TRACE_DEBUG("hl thread cleanup");
}
/*******************************************************************************
**
@@ -5138,33 +5036,33 @@
int r, max_curr_s, max_org_s;
UNUSED(arg);
- BTIF_TRACE_DEBUG0("entered btif_hl_select_thread");
+ BTIF_TRACE_DEBUG("entered btif_hl_select_thread");
FD_ZERO(&org_set);
max_org_s = btif_hl_select_wakeup_init(&org_set);
- BTIF_TRACE_DEBUG1("max_s=%d ", max_org_s);
+ BTIF_TRACE_DEBUG("max_s=%d ", max_org_s);
for (;;)
{
r = 0;
- BTIF_TRACE_DEBUG0("set curr_set = org_set ");
+ BTIF_TRACE_DEBUG("set curr_set = org_set ");
curr_set = org_set;
max_curr_s = max_org_s;
int ret = select((max_curr_s + 1), &curr_set, NULL, NULL, NULL);
- BTIF_TRACE_DEBUG1("select unblocked ret=%d", ret);
+ BTIF_TRACE_DEBUG("select unblocked ret=%d", ret);
if (ret == -1)
{
- BTIF_TRACE_DEBUG0("select() ret -1, exit the thread");
+ BTIF_TRACE_DEBUG("select() ret -1, exit the thread");
btif_hl_thread_cleanup();
select_thread_id = -1;
return 0;
}
else if (ret)
{
- BTIF_TRACE_DEBUG1("btif_hl_select_wake_signaled, signal ret=%d", ret);
+ BTIF_TRACE_DEBUG("btif_hl_select_wake_signaled, signal ret=%d", ret);
if (btif_hl_select_wake_signaled(&curr_set))
{
r = btif_hl_select_wake_reset();
- BTIF_TRACE_DEBUG1("btif_hl_select_wake_signaled, signal:%d", r);
+ BTIF_TRACE_DEBUG("btif_hl_select_wake_signaled, signal:%d", r);
if (r == btif_hl_signal_select_wakeup || r == btif_hl_signal_select_close_connected )
{
btif_hl_select_wakeup_callback(&org_set, r);
@@ -5172,7 +5070,7 @@
else if( r == btif_hl_signal_select_exit)
{
btif_hl_thread_cleanup();
- BTIF_TRACE_DEBUG0("Exit hl_select_thread for btif_hl_signal_select_exit");
+ BTIF_TRACE_DEBUG("Exit hl_select_thread for btif_hl_signal_select_exit");
return 0;
}
}
@@ -5181,9 +5079,9 @@
max_org_s = btif_hl_update_maxfd(max_org_s);
}
else
- BTIF_TRACE_DEBUG1("no data, select ret: %d\n", ret);
+ BTIF_TRACE_DEBUG("no data, select ret: %d\n", ret);
}
- BTIF_TRACE_DEBUG0("leaving hl_select_thread");
+ BTIF_TRACE_DEBUG("leaving hl_select_thread");
return 0;
}
@@ -5197,7 +5095,7 @@
**
*******************************************************************************/
static inline pthread_t create_thread(void *(*start_routine)(void *), void * arg){
- BTIF_TRACE_DEBUG0("create_thread: entered");
+ BTIF_TRACE_DEBUG("create_thread: entered");
pthread_attr_t thread_attr;
pthread_attr_init(&thread_attr);
@@ -5205,10 +5103,10 @@
pthread_t thread_id = -1;
if ( pthread_create(&thread_id, &thread_attr, start_routine, arg)!=0 )
{
- BTIF_TRACE_ERROR1("pthread_create : %s", strerror(errno));
+ BTIF_TRACE_ERROR("pthread_create : %s", strerror(errno));
return -1;
}
- BTIF_TRACE_DEBUG0("create_thread: thread created successfully");
+ BTIF_TRACE_DEBUG("create_thread: thread created successfully");
return thread_id;
}
@@ -5222,7 +5120,7 @@
**
*******************************************************************************/
void btif_hl_soc_thread_init(void){
- BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s", __FUNCTION__);
GKI_init_q(&soc_queue);
select_thread_id = create_thread(btif_hl_select_thread, NULL);
}
@@ -5242,7 +5140,7 @@
btif_hl_app_cb_t *p_acb;
tBTA_HL_MDL_CFG *p;
int i;
- BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s", __FUNCTION__);
if (btif_hl_find_app_idx(app_id, &app_idx))
{
@@ -5254,6 +5152,6 @@
result = TRUE;
}
- BTIF_TRACE_DEBUG1("result=%d", result);
+ BTIF_TRACE_DEBUG("result=%d", result);
return result;
}
diff --git a/btif/src/btif_mce.c b/btif/src/btif_mce.c
new file mode 100644
index 0000000..2ec2d41
--- /dev/null
+++ b/btif/src/btif_mce.c
@@ -0,0 +1,177 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright (C) 2009-2012 Broadcom Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+/************************************************************************************
+ *
+ * Filename: btif_mce.c
+ *
+ * Description: Message Access Profile (MCE role) Bluetooth Interface
+ *
+ *
+ ***********************************************************************************/
+
+#include <hardware/bluetooth.h>
+#include <hardware/bt_mce.h>
+#include <stdlib.h>
+
+#define LOG_TAG "BTIF_MCE"
+#include "btif_common.h"
+#include "btif_util.h"
+#include "btif_profile_queue.h"
+#include "bta_api.h"
+#include "bta_mce_api.h"
+
+#include "bd.h"
+
+/*****************************************************************************
+** Static variables
+******************************************************************************/
+
+static btmce_callbacks_t *bt_mce_callbacks = NULL;
+
+static void btif_mce_mas_discovery_comp_evt(UINT16 event, char *p_param)
+{
+ tBTA_MCE_MAS_DISCOVERY_COMP *evt_data = (tBTA_MCE_MAS_DISCOVERY_COMP*) p_param;
+ btmce_mas_instance_t insts[BTA_MCE_MAX_MAS_INSTANCES];
+ bt_bdaddr_t addr;
+ int i;
+
+ BTIF_TRACE_EVENT("%s: event = %d", __FUNCTION__, event);
+
+ if (event != BTA_MCE_MAS_DISCOVERY_COMP_EVT)
+ return;
+
+ for (i = 0; i < evt_data->num_mas; i++)
+ {
+ insts[i].id = evt_data->mas[i].instance_id;
+ insts[i].scn = evt_data->mas[i].scn;
+ insts[i].msg_types = evt_data->mas[i].msg_type;
+ insts[i].p_name = evt_data->mas[i].p_srv_name;
+ }
+
+ bdcpy(addr.address, evt_data->remote_addr);
+
+ HAL_CBACK(bt_mce_callbacks, remote_mas_instances_cb, evt_data->status, &addr, evt_data->num_mas, insts);
+}
+
+static void mas_discovery_comp_copy_cb(UINT16 event, char *p_dest, char *p_src)
+{
+ tBTA_MCE_MAS_DISCOVERY_COMP *p_dest_data = (tBTA_MCE_MAS_DISCOVERY_COMP *) p_dest;
+ tBTA_MCE_MAS_DISCOVERY_COMP *p_src_data = (tBTA_MCE_MAS_DISCOVERY_COMP *) p_src;
+ char *p_dest_str;
+ int i;
+
+ if (!p_src)
+ return;
+
+ if (event != BTA_MCE_MAS_DISCOVERY_COMP_EVT)
+ return;
+
+ memcpy(p_dest_data, p_src_data, sizeof(tBTA_MCE_MAS_DISCOVERY_COMP));
+
+ p_dest_str = p_dest + sizeof(tBTA_MCE_MAS_DISCOVERY_COMP);
+
+ for (i = 0; i < p_src_data->num_mas; i++)
+ {
+ p_dest_data->mas[i].p_srv_name = p_dest_str;
+ memcpy(p_dest_str, p_src_data->mas[i].p_srv_name, p_src_data->mas[i].srv_name_len);
+ p_dest_str += p_src_data->mas[i].srv_name_len;
+ *(p_dest_str++) = '\0';
+ }
+}
+
+static void mce_dm_cback(tBTA_MCE_EVT event, tBTA_MCE *p_data, void *user_data)
+{
+ switch (event)
+ {
+ case BTA_MCE_MAS_DISCOVERY_COMP_EVT:
+ {
+ int i;
+ UINT16 param_len = sizeof(tBTA_MCE);
+
+ /* include space for all p_srv_name copies including null-termination */
+ for (i = 0; i < p_data->mas_disc_comp.num_mas; i++)
+ param_len += (p_data->mas_disc_comp.mas[i].srv_name_len + 1);
+
+ /* need to deepy copy p_srv_name and null-terminate */
+ btif_transfer_context(btif_mce_mas_discovery_comp_evt, event,
+ (char*)p_data, param_len, mas_discovery_comp_copy_cb);
+
+ break;
+ }
+ }
+}
+
+static bt_status_t init(btmce_callbacks_t* callbacks)
+{
+ BTIF_TRACE_EVENT("%s", __FUNCTION__);
+
+ bt_mce_callbacks = callbacks;
+
+ btif_enable_service(BTA_MAP_SERVICE_ID);
+
+ return BT_STATUS_SUCCESS;
+}
+
+static bt_status_t get_remote_mas_instances(bt_bdaddr_t *bd_addr)
+{
+ bdstr_t bdstr;
+
+ BTIF_TRACE_EVENT("%s: remote_addr=%s", __FUNCTION__, bd2str(bd_addr, &bdstr));
+
+ BTA_MceGetRemoteMasInstances(bd_addr->address);
+
+ return BT_STATUS_SUCCESS;
+}
+
+static const btmce_interface_t mce_if = {
+ sizeof(btmce_interface_t),
+ init,
+ get_remote_mas_instances,
+};
+
+const btmce_interface_t *btif_mce_get_interface(void)
+{
+ BTIF_TRACE_EVENT("%s", __FUNCTION__);
+ return &mce_if;
+}
+
+/*******************************************************************************
+**
+** Function btif_mce_execute_service
+**
+** Description Initializes/Shuts down the service
+**
+** Returns BT_STATUS_SUCCESS on success, BT_STATUS_FAIL otherwise
+**
+*******************************************************************************/
+bt_status_t btif_mce_execute_service(BOOLEAN b_enable)
+{
+ BTIF_TRACE_EVENT("%s enable:%d", __FUNCTION__, b_enable);
+
+ if (b_enable)
+ {
+ BTA_MceEnable(mce_dm_cback);
+ }
+ else
+ {
+ /* This is called on BT disable so no need to extra cleanup */
+ }
+ return BT_STATUS_SUCCESS;
+}
diff --git a/btif/src/btif_media_task.c b/btif/src/btif_media_task.c
old mode 100755
new mode 100644
index 0b9b613..4b04e1e
--- a/btif/src/btif_media_task.c
+++ b/btif/src/btif_media_task.c
@@ -66,12 +66,32 @@
#include "btif_av.h"
#include "btif_sm.h"
#include "btif_util.h"
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+#include "oi_codec_sbc.h"
+#include "oi_status.h"
+#endif
+#include "stdio.h"
+#include <dlfcn.h>
+
+//#define DEBUG_MEDIA_AV_FLOW TRUE
+
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+OI_CODEC_SBC_DECODER_CONTEXT context;
+OI_UINT32 contextData[CODEC_DATA_WORDS(2, SBC_CODEC_FAST_FILTER_BUFFERS)];
+OI_INT16 pcmData[15*SBC_MAX_SAMPLES_PER_FRAME*SBC_MAX_CHANNELS];
+#endif
/*****************************************************************************
** Constants
*****************************************************************************/
-//#define DEBUG_MEDIA_AV_FLOW TRUE
+#ifndef AUDIO_CHANNEL_OUT_MONO
+#define AUDIO_CHANNEL_OUT_MONO 0x01
+#endif
+
+#ifndef AUDIO_CHANNEL_OUT_STEREO
+#define AUDIO_CHANNEL_OUT_STEREO 0x03
+#endif
/* BTIF media task gki event definition */
#define BTIF_MEDIA_TASK_CMD TASK_MBOX_0_EVT_MASK
@@ -81,8 +101,12 @@
#define BTIF_MEDIA_AA_TASK_TIMER_ID TIMER_0
#define BTIF_MEDIA_AV_TASK_TIMER_ID TIMER_1
+#define BTIF_MEDIA_AVK_TASK_TIMER_ID TIMER_2
+
#define BTIF_MEDIA_AA_TASK_TIMER TIMER_0_EVT_MASK
#define BTIF_MEDIA_AV_TASK_TIMER TIMER_1_EVT_MASK
+#define BTIF_MEDIA_AVK_TASK_TIMER TIMER_2_EVT_MASK
+
#define BTIF_MEDIA_TASK_CMD_MBOX TASK_MBOX_0 /* cmd mailbox */
#define BTIF_MEDIA_TASK_DATA_MBOX TASK_MBOX_1 /* data mailbox */
@@ -102,7 +126,11 @@
BTIF_MEDIA_FLUSH_AA_TX,
BTIF_MEDIA_FLUSH_AA_RX,
BTIF_MEDIA_AUDIO_FEEDING_INIT,
- BTIF_MEDIA_AUDIO_RECEIVING_INIT
+ BTIF_MEDIA_AUDIO_RECEIVING_INIT,
+ BTIF_MEDIA_AUDIO_SINK_CFG_UPDATE,
+ BTIF_MEDIA_AUDIO_SINK_START_DECODING,
+ BTIF_MEDIA_AUDIO_SINK_STOP_DECODING,
+ BTIF_MEDIA_AUDIO_SINK_CLEAR_TRACK
};
enum {
@@ -121,6 +149,8 @@
#define BTIF_MEDIA_TIME_TICK (20 * BTIF_MEDIA_NUM_TICK)
#define A2DP_DATA_READ_POLL_MS (BTIF_MEDIA_TIME_TICK / 2)
+#define BTIF_SINK_MEDIA_TIME_TICK (20 * BTIF_MEDIA_NUM_TICK)
+
/* buffer pool */
#define BTIF_MEDIA_AA_POOL_ID GKI_POOL_ID_3
@@ -179,10 +209,17 @@
/* 18 frames is equivalent to 6.89*18*2.9 ~= 360 ms @ 44.1 khz, 20 ms mediatick */
#define MAX_OUTPUT_A2DP_FRAME_QUEUE_SZ 18
#define A2DP_PACKET_COUNT_LOW_WATERMARK 5
-#define MAX_PCM_FRAME_NUM_PER_TICK 40
+#define MAX_PCM_FRAME_NUM_PER_TICK 10
#define RESET_RATE_COUNTER_THRESHOLD_MS 2000
//#define BTIF_MEDIA_VERBOSE_ENABLED
+/* In case of A2DP SINK, we will delay start by 5 AVDTP Packets*/
+#define MAX_A2DP_DELAYED_START_FRAME_COUNT 5
+#define PACKET_PLAYED_PER_TICK_48 8
+#define PACKET_PLAYED_PER_TICK_44 7
+#define PACKET_PLAYED_PER_TICK_32 5
+#define PACKET_PLAYED_PER_TICK_16 3
+
#ifdef BTIF_MEDIA_VERBOSE_ENABLED
#define VERBOSE(fmt, ...) \
@@ -195,6 +232,13 @@
/*****************************************************************************
** Data types
*****************************************************************************/
+typedef struct
+{
+ UINT16 num_frames_to_be_processed;
+ UINT16 len;
+ UINT16 offset;
+ UINT16 layer_specific;
+} tBT_SBC_HDR;
typedef struct
{
@@ -219,7 +263,9 @@
{
#if (BTA_AV_INCLUDED == TRUE)
BUFFER_Q TxAaQ;
+ BUFFER_Q RxSbcQ;
BOOLEAN is_tx_timer;
+ BOOLEAN is_rx_timer;
UINT16 TxAaMtuSize;
UINT32 timestamp;
UINT8 TxTranscoding;
@@ -231,6 +277,13 @@
void* av_sm_hdl;
UINT8 a2dp_cmd_pending; /* we can have max one command pending */
BOOLEAN tx_flush; /* discards any outgoing data when true */
+ BOOLEAN rx_flush; /* discards any incoming data when true */
+ UINT8 peer_sep;
+ BOOLEAN data_channel_open;
+ UINT8 frames_to_process;
+
+ UINT32 sample_rate;
+ UINT8 channel_count;
#endif
} tBTIF_MEDIA_CB;
@@ -249,6 +302,7 @@
static tBTIF_MEDIA_CB btif_media_cb;
static int media_task_running = MEDIA_TASK_STATE_OFF;
+static UINT64 last_frame_us = 0;
/*****************************************************************************
@@ -259,13 +313,34 @@
static void btif_a2dp_ctrl_cb(tUIPC_CH_ID ch_id, tUIPC_EVENT event);
static void btif_a2dp_encoder_update(void);
const char* dump_media_event(UINT16 event);
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+extern OI_STATUS OI_CODEC_SBC_DecodeFrame(OI_CODEC_SBC_DECODER_CONTEXT *context,
+ const OI_BYTE **frameData,
+ unsigned long *frameBytes,
+ OI_INT16 *pcmData,
+ unsigned long *pcmBytes);
+extern OI_STATUS OI_CODEC_SBC_DecoderReset(OI_CODEC_SBC_DECODER_CONTEXT *context,
+ unsigned long *decoderData,
+ unsigned long decoderDataBytes,
+ OI_UINT8 maxChannels,
+ OI_UINT8 pcmStride,
+ OI_BOOL enhanced);
+#endif
+static void btif_media_flush_q(BUFFER_Q *p_q);
+static void btif_media_task_aa_handle_stop_decoding(void );
+static void btif_media_task_aa_rx_flush(void);
+static BOOLEAN btif_media_task_stop_decoding_req(void);
/*****************************************************************************
** Externs
*****************************************************************************/
static void btif_media_task_handle_cmd(BT_HDR *p_msg);
-static void btif_media_task_handle_media(BT_HDR *p_msg);
+static void btif_media_task_handle_media(BT_HDR*p_msg);
+/* Handle incoming media packets A2DP SINK streaming*/
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+static void btif_media_task_handle_inc_media(tBT_SBC_HDR*p_msg);
+#endif
#if (BTA_AV_INCLUDED == TRUE)
static void btif_media_send_aa_frame(void);
@@ -277,72 +352,32 @@
static void btif_media_task_audio_feeding_init(BT_HDR *p_msg);
static void btif_media_task_aa_tx_flush(BT_HDR *p_msg);
static void btif_media_aa_prep_2_send(UINT8 nb_frame);
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+static void btif_media_task_aa_handle_decoder_reset(BT_HDR *p_msg);
+static void btif_media_task_aa_handle_clear_track(void);
#endif
-
-
+static void btif_media_task_aa_handle_start_decoding(void );
+#endif
+BOOLEAN btif_media_task_start_decoding_req(void);
+BOOLEAN btif_media_task_clear_track(void);
/*****************************************************************************
** Misc helper functions
*****************************************************************************/
-static void tput_mon(int is_rx, int len, int reset)
+static UINT64 time_now_us()
{
- /* only monitor one connection at a time for now */
- static t_stat cur_stat;
- struct timespec now;
- unsigned long long prev_us;
- unsigned long long now_us;
-
- if (reset == TRUE)
- {
- memset(&cur_stat, 0, sizeof(t_stat));
- return;
- }
-
- if (is_rx)
- {
- cur_stat.rx+=len;
- cur_stat.rx_tot+=len;
- }
- else
- {
- cur_stat.tx+=len;
- cur_stat.tx_tot+=len;
- }
- clock_gettime(CLOCK_MONOTONIC, &now);
-
- now_us = now.tv_sec*USEC_PER_SEC + now.tv_nsec/1000;
-
- if ((now_us - cur_stat.ts_prev_us) < TPUT_STATS_INTERVAL_US)
- return;
-
- APPL_TRACE_WARNING4("tput rx:%d, tx:%d (bytes/s) (tot : rx %d, tx %d bytes)",
- (cur_stat.rx*1000000)/((now_us - cur_stat.ts_prev_us)),
- (cur_stat.tx*1000000)/((now_us - cur_stat.ts_prev_us)),
- cur_stat.rx_tot, cur_stat.tx_tot);
-
- /* stats dumped. now reset stats for next interval */
- cur_stat.rx = 0;
- cur_stat.tx = 0;
- cur_stat.ts_prev_us = now_us;
+ struct timespec ts_now;
+ clock_gettime(CLOCK_BOOTTIME, &ts_now);
+ return ((UINT64)ts_now.tv_sec * USEC_PER_SEC) + ((UINT64)ts_now.tv_nsec / 1000);
}
-
static void log_tstamps_us(char *comment)
{
- #define USEC_PER_SEC 1000000L
- static struct timespec prev = {0, 0};
- struct timespec now, diff;
- unsigned int diff_us = 0;
- unsigned int now_us = 0;
-
- clock_gettime(CLOCK_MONOTONIC, &now);
- now_us = now.tv_sec*USEC_PER_SEC + now.tv_nsec/1000;
- diff_us = (now.tv_sec - prev.tv_sec) * USEC_PER_SEC + (now.tv_nsec - prev.tv_nsec)/1000;
-
- APPL_TRACE_DEBUG4("[%s] ts %08d, diff : %08d, queue sz %d", comment, now_us, diff_us,
+ static UINT64 prev_us = 0;
+ const UINT64 now_us = time_now_us();
+ APPL_TRACE_DEBUG("[%s] ts %08llu, diff : %08llu, queue sz %d", comment, now_us, now_us - prev_us,
btif_media_cb.TxAaQ.count);
-
- prev = now;
+ prev_us = now_us;
}
const char* dump_media_event(UINT16 event)
@@ -361,6 +396,10 @@
CASE_RETURN_STR(BTIF_MEDIA_FLUSH_AA_RX)
CASE_RETURN_STR(BTIF_MEDIA_AUDIO_FEEDING_INIT)
CASE_RETURN_STR(BTIF_MEDIA_AUDIO_RECEIVING_INIT)
+ CASE_RETURN_STR(BTIF_MEDIA_AUDIO_SINK_CFG_UPDATE)
+ CASE_RETURN_STR(BTIF_MEDIA_AUDIO_SINK_START_DECODING)
+ CASE_RETURN_STR(BTIF_MEDIA_AUDIO_SINK_STOP_DECODING)
+ CASE_RETURN_STR(BTIF_MEDIA_AUDIO_SINK_CLEAR_TRACK)
default:
return "UNKNOWN MEDIA EVENT";
@@ -387,7 +426,7 @@
static void btif_audiopath_detached(void)
{
- APPL_TRACE_EVENT0("## AUDIO PATH DETACHED ##");
+ APPL_TRACE_EVENT("## AUDIO PATH DETACHED ##");
/* send stop request only if we are actively streaming and haven't received
a stop request. Potentially audioflinger detached abnormally */
@@ -402,13 +441,13 @@
{
UINT8 ack = status;
- APPL_TRACE_EVENT2("## a2dp ack : %s, status %d ##",
+ APPL_TRACE_EVENT("## a2dp ack : %s, status %d ##",
dump_a2dp_ctrl_event(btif_media_cb.a2dp_cmd_pending), status);
/* sanity check */
if (btif_media_cb.a2dp_cmd_pending == A2DP_CTRL_CMD_NONE)
{
- APPL_TRACE_ERROR0("warning : no command pending, ignore ack");
+ APPL_TRACE_ERROR("warning : no command pending, ignore ack");
return;
}
@@ -424,13 +463,12 @@
{
UINT8 cmd = 0;
int n;
-
n = UIPC_Read(UIPC_CH_ID_AV_CTRL, NULL, &cmd, 1);
/* detach on ctrl channel means audioflinger process was terminated */
if (n == 0)
{
- APPL_TRACE_EVENT0("CTRL CH DETACHED");
+ APPL_TRACE_EVENT("CTRL CH DETACHED");
UIPC_Close(UIPC_CH_ID_AV_CTRL);
/* we can operate only on datachannel, if af client wants to
do send additional commands the ctrl channel would be reestablished */
@@ -438,7 +476,7 @@
return;
}
- APPL_TRACE_DEBUG1("a2dp-ctrl-cmd : %s", dump_a2dp_ctrl_event(cmd));
+ APPL_TRACE_DEBUG("a2dp-ctrl-cmd : %s", dump_a2dp_ctrl_event(cmd));
btif_media_cb.a2dp_cmd_pending = cmd;
@@ -472,6 +510,11 @@
/* post start event and wait for audio path to open */
btif_dispatch_sm_event(BTIF_AV_START_STREAM_REQ_EVT, NULL, 0);
+
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+ if (btif_media_cb.peer_sep == AVDT_TSEP_SRC)
+ a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
+#endif
}
else if (btif_av_stream_started_ready())
{
@@ -489,8 +532,7 @@
break;
case A2DP_CTRL_CMD_STOP:
-
- if (btif_media_cb.is_tx_timer == FALSE)
+ if (btif_media_cb.peer_sep == AVDT_TSEP_SNK && btif_media_cb.is_tx_timer == FALSE)
{
/* we are already stopped, just ack back */
a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
@@ -498,6 +540,7 @@
}
btif_dispatch_sm_event(BTIF_AV_STOP_STREAM_REQ_EVT, NULL, 0);
+ a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
break;
case A2DP_CTRL_CMD_SUSPEND:
@@ -515,19 +558,30 @@
}
break;
+ case A2DP_CTRL_GET_AUDIO_CONFIG:
+ {
+ uint32_t sample_rate = btif_media_cb.sample_rate;
+ uint8_t channel_count = btif_media_cb.channel_count;
+
+ a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
+ UIPC_Send(UIPC_CH_ID_AV_CTRL, 0, (UINT8 *)&sample_rate, 4);
+ UIPC_Send(UIPC_CH_ID_AV_CTRL, 0, &channel_count, 1);
+ break;
+ }
+
default:
- APPL_TRACE_ERROR1("UNSUPPORTED CMD (%d)", cmd);
+ APPL_TRACE_ERROR("UNSUPPORTED CMD (%d)", cmd);
a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE);
break;
}
- APPL_TRACE_DEBUG1("a2dp-ctrl-cmd : %s DONE", dump_a2dp_ctrl_event(cmd));
+ APPL_TRACE_DEBUG("a2dp-ctrl-cmd : %s DONE", dump_a2dp_ctrl_event(cmd));
}
static void btif_a2dp_ctrl_cb(tUIPC_CH_ID ch_id, tUIPC_EVENT event)
{
UNUSED(ch_id);
- APPL_TRACE_DEBUG1("A2DP-CTRL-CHANNEL EVENT %s", dump_uipc_event(event));
+ APPL_TRACE_DEBUG("A2DP-CTRL-CHANNEL EVENT %s", dump_uipc_event(event));
switch(event)
{
@@ -547,7 +601,7 @@
break;
default :
- APPL_TRACE_ERROR1("### A2DP-CTRL-CHANNEL EVENT %d NOT HANDLED ###", event);
+ APPL_TRACE_ERROR("### A2DP-CTRL-CHANNEL EVENT %d NOT HANDLED ###", event);
break;
}
}
@@ -556,7 +610,7 @@
{
UNUSED(ch_id);
- APPL_TRACE_DEBUG1("BTIF MEDIA (A2DP-DATA) EVENT %s", dump_uipc_event(event));
+ APPL_TRACE_DEBUG("BTIF MEDIA (A2DP-DATA) EVENT %s", dump_uipc_event(event));
switch(event)
{
@@ -567,11 +621,15 @@
UIPC_Ioctl(UIPC_CH_ID_AV_AUDIO, UIPC_REG_REMOVE_ACTIVE_READSET, NULL);
UIPC_Ioctl(UIPC_CH_ID_AV_AUDIO, UIPC_SET_READ_POLL_TMO,
(void *)A2DP_DATA_READ_POLL_MS);
- /* Start the media task to encode SBC */
- btif_media_task_start_aa_req();
- /* make sure we update any changed sbc encoder params */
- btif_a2dp_encoder_update();
+ if (btif_media_cb.peer_sep == AVDT_TSEP_SNK) {
+ /* Start the media task to encode SBC */
+ btif_media_task_start_aa_req();
+
+ /* make sure we update any changed sbc encoder params */
+ btif_a2dp_encoder_update();
+ }
+ btif_media_cb.data_channel_open = TRUE;
/* ack back when media task is fully started */
break;
@@ -579,10 +637,11 @@
case UIPC_CLOSE_EVT:
a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
btif_audiopath_detached();
+ btif_media_cb.data_channel_open = FALSE;
break;
default :
- APPL_TRACE_ERROR1("### A2DP-DATA EVENT %d NOT HANDLED ###", event);
+ APPL_TRACE_ERROR("### A2DP-DATA EVENT %d NOT HANDLED ###", event);
break;
}
}
@@ -600,7 +659,7 @@
if (!btif_av_is_peer_edr())
{
rate = BTIF_A2DP_NON_EDR_MAX_RATE;
- APPL_TRACE_DEBUG1("non-edr a2dp sink detected, restrict rate to %d", rate);
+ APPL_TRACE_DEBUG("non-edr a2dp sink detected, restrict rate to %d", rate);
}
return rate;
@@ -621,7 +680,7 @@
/* lookup table to convert freq */
UINT16 freq_block_tbl[5] = { SBC_sf48000, SBC_sf44100, SBC_sf32000, 0, SBC_sf16000 };
- APPL_TRACE_DEBUG0("btif_a2dp_encoder_init");
+ APPL_TRACE_DEBUG("btif_a2dp_encoder_init");
/* Retrieve the current SBC configuration (default if currently not used) */
bta_av_co_audio_get_sbc_config(&sbc_config, &minmtu);
@@ -632,7 +691,7 @@
msg.SamplingFreq = freq_block_tbl[sbc_config.samp_freq >> 5];
msg.MtuSize = minmtu;
- APPL_TRACE_EVENT1("msg.ChannelMode %x", msg.ChannelMode);
+ APPL_TRACE_EVENT("msg.ChannelMode %x", msg.ChannelMode);
/* Init the media task to encode SBC properly */
btif_media_task_enc_init_req(&msg);
@@ -646,18 +705,18 @@
UINT8 pref_min;
UINT8 pref_max;
- APPL_TRACE_DEBUG0("btif_a2dp_encoder_update");
+ APPL_TRACE_DEBUG("btif_a2dp_encoder_update");
/* Retrieve the current SBC configuration (default if currently not used) */
bta_av_co_audio_get_sbc_config(&sbc_config, &minmtu);
- APPL_TRACE_DEBUG4("btif_a2dp_encoder_update: Common min_bitpool:%d(0x%x) max_bitpool:%d(0x%x)",
+ APPL_TRACE_DEBUG("btif_a2dp_encoder_update: Common min_bitpool:%d(0x%x) max_bitpool:%d(0x%x)",
sbc_config.min_bitpool, sbc_config.min_bitpool,
sbc_config.max_bitpool, sbc_config.max_bitpool);
if (sbc_config.min_bitpool > sbc_config.max_bitpool)
{
- APPL_TRACE_ERROR0("btif_a2dp_encoder_update: ERROR btif_a2dp_encoder_update min_bitpool > max_bitpool");
+ APPL_TRACE_ERROR("btif_a2dp_encoder_update: ERROR btif_a2dp_encoder_update min_bitpool > max_bitpool");
}
/* check if remote sink has a preferred bitpool range */
@@ -677,7 +736,7 @@
if ((pref_min != sbc_config.min_bitpool) || (pref_max != sbc_config.max_bitpool))
{
- APPL_TRACE_EVENT2("## adjusted our bitpool range to peer pref [%d:%d] ##",
+ APPL_TRACE_EVENT("## adjusted our bitpool range to peer pref [%d:%d] ##",
pref_min, pref_max);
}
}
@@ -710,11 +769,11 @@
if (media_task_running != MEDIA_TASK_STATE_OFF)
{
- APPL_TRACE_ERROR0("warning : media task already running");
+ APPL_TRACE_ERROR("warning : media task already running");
return GKI_FAILURE;
}
- APPL_TRACE_EVENT0("## A2DP START MEDIA TASK ##");
+ APPL_TRACE_EVENT("## A2DP START MEDIA TASK ##");
/* start a2dp media task */
retval = GKI_create_task((TASKPTR)btif_media_task, A2DP_MEDIA_TASK,
@@ -729,7 +788,7 @@
while (media_task_running == MEDIA_TASK_STATE_OFF)
usleep(10);
- APPL_TRACE_EVENT0("## A2DP MEDIA TASK STARTED ##");
+ APPL_TRACE_EVENT("## A2DP MEDIA TASK STARTED ##");
return retval;
}
@@ -746,7 +805,7 @@
void btif_a2dp_stop_media_task(void)
{
- APPL_TRACE_EVENT0("## A2DP STOP MEDIA TASK ##");
+ APPL_TRACE_EVENT("## A2DP STOP MEDIA TASK ##");
GKI_destroy_task(BT_MEDIA_TASK);
}
@@ -781,7 +840,7 @@
tBTIF_AV_MEDIA_FEEDINGS media_feeding;
tBTIF_STATUS status;
- APPL_TRACE_EVENT0("## A2DP SETUP CODEC ##");
+ APPL_TRACE_EVENT("## A2DP SETUP CODEC ##");
GKI_disable();
@@ -821,12 +880,24 @@
void btif_a2dp_on_idle(void)
{
- APPL_TRACE_EVENT0("## ON A2DP IDLE ##");
-
- /* Make sure media task is stopped */
- btif_media_task_stop_aa_req();
+ APPL_TRACE_EVENT("## ON A2DP IDLE ##");
+ if (btif_media_cb.peer_sep == AVDT_TSEP_SNK)
+ {
+ /* Make sure media task is stopped */
+ btif_media_task_stop_aa_req();
+ }
bta_av_co_init();
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+ if (btif_media_cb.peer_sep == AVDT_TSEP_SRC)
+ {
+ btif_media_cb.rx_flush = TRUE;
+ btif_media_task_aa_rx_flush_req();
+ btif_media_task_stop_decoding_req();
+ btif_media_task_clear_track();
+ APPL_TRACE_DEBUG("Stopped BT track");
+ }
+#endif
}
/*****************************************************************************
@@ -841,12 +912,119 @@
void btif_a2dp_on_open(void)
{
- APPL_TRACE_EVENT0("## ON A2DP OPEN ##");
+ APPL_TRACE_EVENT("## ON A2DP OPEN ##");
/* always use callback to notify socket events */
UIPC_Open(UIPC_CH_ID_AV_AUDIO, btif_a2dp_data_cb);
}
+/*******************************************************************************
+ **
+ ** Function btif_media_task_clear_track
+ **
+ ** Description
+ **
+ ** Returns TRUE is success
+ **
+ *******************************************************************************/
+BOOLEAN btif_media_task_clear_track(void)
+{
+ BT_HDR *p_buf;
+
+ if (NULL == (p_buf = GKI_getbuf(sizeof(BT_HDR))))
+ {
+ return FALSE;
+ }
+
+ p_buf->event = BTIF_MEDIA_AUDIO_SINK_CLEAR_TRACK;
+
+ GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf);
+ return TRUE;
+}
+/*******************************************************************************
+ **
+ ** Function btif_media_task_stop_decoding_req
+ **
+ ** Description
+ **
+ ** Returns TRUE is success
+ **
+ *******************************************************************************/
+BOOLEAN btif_media_task_stop_decoding_req(void)
+{
+ BT_HDR *p_buf;
+
+ if (!btif_media_cb.is_rx_timer)
+ return TRUE; /* if timer is not running no need to send message */
+
+ if (NULL == (p_buf = GKI_getbuf(sizeof(BT_HDR))))
+ {
+ return FALSE;
+ }
+
+ p_buf->event = BTIF_MEDIA_AUDIO_SINK_STOP_DECODING;
+
+ GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf);
+ return TRUE;
+}
+
+/*******************************************************************************
+ **
+ ** Function btif_media_task_start_decoding_req
+ **
+ ** Description
+ **
+ ** Returns TRUE is success
+ **
+ *******************************************************************************/
+BOOLEAN btif_media_task_start_decoding_req(void)
+{
+ BT_HDR *p_buf;
+
+ if(btif_media_cb.is_rx_timer)
+ return FALSE; /* if timer is already running no need to send message */
+
+ if (NULL == (p_buf = GKI_getbuf(sizeof(BT_HDR))))
+ {
+ return FALSE;
+ }
+
+ p_buf->event = BTIF_MEDIA_AUDIO_SINK_START_DECODING;
+
+ GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf);
+ return TRUE;
+}
+
+/*****************************************************************************
+**
+** Function btif_reset_decoder
+**
+** Description
+**
+** Returns
+**
+*******************************************************************************/
+
+void btif_reset_decoder(UINT8 *p_av)
+{
+ APPL_TRACE_EVENT("btif_reset_decoder");
+ APPL_TRACE_DEBUG("btif_reset_decoder p_codec_info[%x:%x:%x:%x:%x:%x]",
+ p_av[1], p_av[2], p_av[3],
+ p_av[4], p_av[5], p_av[6]);
+
+ tBTIF_MEDIA_SINK_CFG_UPDATE *p_buf;
+ if (NULL == (p_buf = GKI_getbuf(sizeof(tBTIF_MEDIA_SINK_CFG_UPDATE))))
+ {
+ APPL_TRACE_EVENT("btif_reset_decoder No Buffer ");
+ return;
+ }
+
+ memcpy(p_buf->codec_info,p_av, AVDT_CODEC_SIZE);
+ p_buf->hdr.event = BTIF_MEDIA_AUDIO_SINK_CFG_UPDATE;
+
+ GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf);
+}
+
/*****************************************************************************
**
** Function btif_a2dp_on_started
@@ -862,7 +1040,7 @@
tBTIF_STATUS status;
BOOLEAN ack = FALSE;
- APPL_TRACE_EVENT0("## ON A2DP STARTED ##");
+ APPL_TRACE_EVENT("## ON A2DP STARTED ##");
if (p_av == NULL)
{
@@ -915,7 +1093,7 @@
{
tBTIF_STATUS status;
- APPL_TRACE_EVENT0("## A2DP_CTRL_ACK_FAILURE ##");
+ APPL_TRACE_EVENT("## A2DP_CTRL_ACK_FAILURE ##");
a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE);
}
@@ -931,14 +1109,22 @@
void btif_a2dp_on_stopped(tBTA_AV_SUSPEND *p_av)
{
- APPL_TRACE_EVENT0("## ON A2DP STOPPED ##");
-
+ APPL_TRACE_EVENT("## ON A2DP STOPPED ##");
+ if (btif_media_cb.peer_sep == AVDT_TSEP_SRC) /* Handling for A2DP SINK cases*/
+ {
+ btif_media_cb.rx_flush = TRUE;
+ btif_media_task_aa_rx_flush_req();
+ btif_media_task_stop_decoding_req();
+ UIPC_Close(UIPC_CH_ID_AV_AUDIO);
+ btif_media_cb.data_channel_open = FALSE;
+ return;
+ }
/* allow using this api for other than suspend */
if (p_av != NULL)
{
if (p_av->status != BTA_AV_SUCCESS)
{
- APPL_TRACE_EVENT1("AV STOP FAILED (%d)", p_av->status);
+ APPL_TRACE_EVENT("AV STOP FAILED (%d)", p_av->status);
if (p_av->initiator)
a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE);
@@ -969,7 +1155,14 @@
void btif_a2dp_on_suspended(tBTA_AV_SUSPEND *p_av)
{
- APPL_TRACE_EVENT0("## ON A2DP SUSPENDED ##");
+ APPL_TRACE_EVENT("## ON A2DP SUSPENDED ##");
+ if (btif_media_cb.peer_sep == AVDT_TSEP_SRC)
+ {
+ btif_media_cb.rx_flush = TRUE;
+ btif_media_task_aa_rx_flush_req();
+ btif_media_task_stop_decoding_req();
+ return;
+ }
/* check for status failures */
if (p_av->status != BTA_AV_SUCCESS)
@@ -987,46 +1180,89 @@
btif_media_task_stop_aa_req();
}
+/* when true media task discards any rx frames */
+void btif_a2dp_set_rx_flush(BOOLEAN enable)
+{
+ APPL_TRACE_EVENT("## DROP RX %d ##", enable);
+ btif_media_cb.rx_flush = enable;
+}
+
/* when true media task discards any tx frames */
void btif_a2dp_set_tx_flush(BOOLEAN enable)
{
- APPL_TRACE_EVENT1("## DROP TX %d ##", enable);
+ APPL_TRACE_EVENT("## DROP TX %d ##", enable);
btif_media_cb.tx_flush = enable;
}
-/*****************************************************************************
-**
-** Function btif_calc_pcmtime
-**
-** Description Calculates the pcmtime equivalent of a datapacket
-**
-** Returns microseconds
-**
-*******************************************************************************/
-
-static int btif_calc_pcmtime(UINT32 bytes_processed)
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+/*******************************************************************************
+ **
+ ** Function btif_media_task_avk_handle_timer
+ **
+ ** Description
+ **
+ ** Returns void
+ **
+ *******************************************************************************/
+static void btif_media_task_avk_handle_timer ( void )
{
- int pcm_time_us = 0;
- tBTIF_AV_MEDIA_FEED_CFG *p_cfg;
+ UINT8 count;
+ tBT_SBC_HDR *p_msg;
+ int num_sbc_frames;
+ int num_frames_to_process;
- p_cfg = &btif_media_cb.media_feeding.cfg;
-
- /* calculate corresponding pcm time based on data processed */
- switch(btif_media_cb.media_feeding.format)
+ count = btif_media_cb.RxSbcQ.count;
+ if (0 == count)
{
- case BTIF_AV_CODEC_PCM:
- pcm_time_us = (bytes_processed*1000000)/
- (p_cfg->pcm.num_channel*p_cfg->pcm.sampling_freq*p_cfg->pcm.bit_per_sample/8);
- break;
-
- default :
- APPL_TRACE_ERROR1("mediafeeding format invalid : %d", btif_media_cb.media_feeding.format);
- break;
+ APPL_TRACE_DEBUG(" QUE EMPTY ");
}
+ else
+ {
+ if (btif_media_cb.rx_flush == TRUE)
+ {
+ btif_media_flush_q(&(btif_media_cb.RxSbcQ));
+ return;
+ }
- return pcm_time_us;
+ num_frames_to_process = btif_media_cb.frames_to_process;
+ APPL_TRACE_DEBUG(" Process Frames + ");
+
+ do
+ {
+ p_msg = (tBT_SBC_HDR *)GKI_getfirst(&(btif_media_cb.RxSbcQ));
+ if (p_msg == NULL)
+ return;
+ num_sbc_frames = p_msg->num_frames_to_be_processed; /* num of frames in Que Packets */
+ APPL_TRACE_DEBUG(" Frames left in topmost packet %d", num_sbc_frames);
+ APPL_TRACE_DEBUG(" Remaining frames to process in tick %d", num_frames_to_process);
+ APPL_TRACE_DEBUG(" Num of Packets in Que %d", btif_media_cb.RxSbcQ.count);
+
+ if ( num_sbc_frames > num_frames_to_process) /* Que Packet has more frames*/
+ {
+ p_msg->num_frames_to_be_processed= num_frames_to_process;
+ btif_media_task_handle_inc_media(p_msg);
+ p_msg->num_frames_to_be_processed = num_sbc_frames - num_frames_to_process;
+ num_frames_to_process = 0;
+ break;
+ }
+ else /* Que packet has less frames */
+ {
+ btif_media_task_handle_inc_media(p_msg);
+ p_msg = (tBT_SBC_HDR *)GKI_dequeue(&(btif_media_cb.RxSbcQ));
+ if( p_msg == NULL )
+ {
+ APPL_TRACE_ERROR("Insufficient data in que ");
+ break;
+ }
+ num_frames_to_process = num_frames_to_process - p_msg->num_frames_to_be_processed;
+ GKI_freebuf(p_msg);
+ }
+ }while(num_frames_to_process > 0);
+
+ APPL_TRACE_DEBUG(" Process Frames - ");
+ }
}
-
+#endif
/*******************************************************************************
**
@@ -1042,13 +1278,20 @@
{
#if (defined(DEBUG_MEDIA_AV_FLOW) && (DEBUG_MEDIA_AV_FLOW == TRUE))
static UINT16 Debug = 0;
- APPL_TRACE_DEBUG1("btif_media_task_aa_handle_timer: %d", Debug++);
+ APPL_TRACE_DEBUG("btif_media_task_aa_handle_timer: %d", Debug++);
#endif
log_tstamps_us("media task tx timer");
#if (BTA_AV_INCLUDED == TRUE)
- btif_media_send_aa_frame();
+ if(btif_media_cb.is_tx_timer == TRUE)
+ {
+ btif_media_send_aa_frame();
+ }
+ else
+ {
+ APPL_TRACE_ERROR("ERROR Media task Scheduled after Suspend");
+ }
#endif
}
@@ -1066,7 +1309,7 @@
{
#if (defined(DEBUG_MEDIA_AV_FLOW) && (DEBUG_MEDIA_AV_FLOW == TRUE))
static UINT16 Debug = 0;
- APPL_TRACE_DEBUG1("btif_media_task_aa_handle_uipc_rx_rdy: %d", Debug++);
+ APPL_TRACE_DEBUG("btif_media_task_aa_handle_uipc_rx_rdy: %d", Debug++);
#endif
/* process all the UIPC data */
@@ -1097,8 +1340,6 @@
#if (BTA_AV_INCLUDED == TRUE)
UIPC_Open(UIPC_CH_ID_AV_CTRL , btif_a2dp_ctrl_cb);
#endif
-
-
}
/*******************************************************************************
**
@@ -1145,6 +1386,7 @@
if (event & BTIF_MEDIA_TASK_DATA)
{
+ VERBOSE("================= Received Media Packets %d ===============", event);
/* Process all messages in the queue */
while ((p_msg = (BT_HDR *) GKI_read_mbox(BTIF_MEDIA_TASK_DATA_MBOX)) != NULL)
{
@@ -1158,6 +1400,15 @@
btif_media_task_aa_handle_timer();
}
+ if (event & BTIF_MEDIA_AVK_TASK_TIMER)
+ {
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+ /* advance audio timer expiration for a2dp sink */
+ btif_media_task_avk_handle_timer();
+#endif
+ }
+
+
VERBOSE("=============== MEDIA TASK EVENT %d DONE ============", event);
@@ -1176,7 +1427,7 @@
/* Clear media task flag */
media_task_running = MEDIA_TASK_STATE_OFF;
- APPL_TRACE_DEBUG0("MEDIA TASK EXITING");
+ APPL_TRACE_DEBUG("MEDIA TASK EXITING");
return 0;
}
@@ -1216,7 +1467,7 @@
*******************************************************************************/
static void btif_media_flush_q(BUFFER_Q *p_q)
{
- while (GKI_IS_QUEUE_EMPTY(p_q) == FALSE)
+ while (!GKI_queue_is_empty(p_q))
{
GKI_freebuf(GKI_dequeue(p_q));
}
@@ -1261,14 +1512,87 @@
case BTIF_MEDIA_UIPC_RX_RDY:
btif_media_task_aa_handle_uipc_rx_rdy();
break;
+ case BTIF_MEDIA_AUDIO_SINK_CFG_UPDATE:
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+ btif_media_task_aa_handle_decoder_reset(p_msg);
+#endif
+ break;
+ case BTIF_MEDIA_AUDIO_SINK_START_DECODING:
+ btif_media_task_aa_handle_start_decoding();
+ break;
+ case BTIF_MEDIA_AUDIO_SINK_CLEAR_TRACK:
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+ btif_media_task_aa_handle_clear_track();
+#endif
+ break;
+ case BTIF_MEDIA_AUDIO_SINK_STOP_DECODING:
+ btif_media_task_aa_handle_stop_decoding();
+ break;
+ case BTIF_MEDIA_FLUSH_AA_RX:
+ btif_media_task_aa_rx_flush();
+ break;
#endif
default:
- APPL_TRACE_ERROR1("ERROR in btif_media_task_handle_cmd unknown event %d", p_msg->event);
+ APPL_TRACE_ERROR("ERROR in btif_media_task_handle_cmd unknown event %d", p_msg->event);
}
GKI_freebuf(p_msg);
VERBOSE("btif_media_task_handle_cmd : %s DONE", dump_media_event(p_msg->event));
}
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+/*******************************************************************************
+ **
+ ** Function btif_media_task_handle_inc_media
+ **
+ ** Description
+ **
+ ** Returns void
+ **
+ *******************************************************************************/
+static void btif_media_task_handle_inc_media(tBT_SBC_HDR*p_msg)
+{
+ UINT8 *sbc_start_frame = ((UINT8*)(p_msg + 1) + p_msg->offset + 1);
+ int count;
+ UINT32 pcmBytes, availPcmBytes;
+ OI_INT16 *pcmDataPointer = pcmData; /*Will be overwritten on next packet receipt*/
+ OI_STATUS status;
+ int num_sbc_frames = p_msg->num_frames_to_be_processed;
+ UINT32 sbc_frame_len = p_msg->len - 1;
+ availPcmBytes = 2*sizeof(pcmData);
+
+ if ((btif_media_cb.peer_sep == AVDT_TSEP_SNK) || (btif_media_cb.rx_flush))
+ {
+ APPL_TRACE_DEBUG(" State Changed happened in this tick ");
+ return;
+ }
+
+ // ignore data if no one is listening
+ if (!btif_media_cb.data_channel_open)
+ return;
+
+ APPL_TRACE_DEBUG("Number of sbc frames %d, frame_len %d", num_sbc_frames, sbc_frame_len);
+
+ for(count = 0; count < num_sbc_frames && sbc_frame_len != 0; count ++)
+ {
+ pcmBytes = availPcmBytes;
+ status = OI_CODEC_SBC_DecodeFrame(&context, (const OI_BYTE**)&sbc_start_frame,
+ (OI_UINT32 *)&sbc_frame_len,
+ (OI_INT16 *)pcmDataPointer,
+ (OI_UINT32 *)&pcmBytes);
+ if (!OI_SUCCESS(status)) {
+ APPL_TRACE_ERROR("Decoding failure: %d\n", status);
+ break;
+ }
+ availPcmBytes -= pcmBytes;
+ pcmDataPointer += pcmBytes/2;
+ p_msg->offset += (p_msg->len - 1) - sbc_frame_len;
+ p_msg->len = sbc_frame_len + 1;
+ }
+
+ UIPC_Send(UIPC_CH_ID_AV_AUDIO, 0, (UINT8 *)pcmData, (2*sizeof(pcmData) - availPcmBytes));
+}
+#endif
+
/*******************************************************************************
**
** Function btif_media_task_handle_media
@@ -1278,16 +1602,11 @@
** Returns void
**
*******************************************************************************/
-static void btif_media_task_handle_media(BT_HDR *p_msg)
+static void btif_media_task_handle_media(BT_HDR*p_msg)
{
- APPL_TRACE_ERROR0("ERROR btif_media_task_handle_media: not in use");
-
+ APPL_TRACE_DEBUG(" btif_media_task_handle_media ");
GKI_freebuf(p_msg);
}
-
-
-
-
#if (BTA_AV_INCLUDED == TRUE)
/*******************************************************************************
**
@@ -1375,7 +1694,7 @@
BT_HDR *p_buf;
if (NULL == (p_buf = GKI_getbuf(sizeof(BT_HDR))))
{
- APPL_TRACE_EVENT0("GKI failed");
+ APPL_TRACE_EVENT("GKI failed");
return FALSE;
}
@@ -1407,6 +1726,32 @@
GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf);
return TRUE;
}
+/*******************************************************************************
+ **
+ ** Function btif_media_task_aa_rx_flush_req
+ **
+ ** Description
+ **
+ ** Returns TRUE is success
+ **
+ *******************************************************************************/
+BOOLEAN btif_media_task_aa_rx_flush_req(void)
+{
+ BT_HDR *p_buf;
+
+ if (GKI_queue_is_empty(&(btif_media_cb.RxSbcQ))== TRUE) /* Que is already empty */
+ return TRUE;
+
+ if (NULL == (p_buf = GKI_getbuf(sizeof(BT_HDR))))
+ {
+ return FALSE;
+ }
+
+ p_buf->event = BTIF_MEDIA_FLUSH_AA_RX;
+
+ GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf);
+ return TRUE;
+}
/*******************************************************************************
**
@@ -1430,6 +1775,23 @@
GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf);
return TRUE;
}
+/*******************************************************************************
+ **
+ ** Function btif_media_task_aa_rx_flush
+ **
+ ** Description
+ **
+ ** Returns void
+ **
+ *******************************************************************************/
+static void btif_media_task_aa_rx_flush(void)
+{
+ /* Flush all enqueued GKI SBC buffers (encoded) */
+ APPL_TRACE_DEBUG("btif_media_task_aa_rx_flush");
+
+ btif_media_flush_q(&(btif_media_cb.RxSbcQ));
+}
+
/*******************************************************************************
**
@@ -1445,7 +1807,7 @@
UNUSED(p_msg);
/* Flush all enqueued GKI music buffers (encoded) */
- APPL_TRACE_DEBUG0("btif_media_task_aa_tx_flush");
+ APPL_TRACE_DEBUG("btif_media_task_aa_tx_flush");
btif_media_cb.media_feeding_state.pcm.counter = 0;
btif_media_cb.media_feeding_state.pcm.aa_feed_residue = 0;
@@ -1468,7 +1830,7 @@
{
tBTIF_MEDIA_INIT_AUDIO *pInitAudio = (tBTIF_MEDIA_INIT_AUDIO *) p_msg;
- APPL_TRACE_DEBUG0("btif_media_task_enc_init");
+ APPL_TRACE_DEBUG("btif_media_task_enc_init");
btif_media_cb.timestamp = 0;
@@ -1487,9 +1849,9 @@
< pInitAudio->MtuSize) ? (BTIF_MEDIA_AA_BUF_SIZE - BTIF_MEDIA_AA_SBC_OFFSET
- sizeof(BT_HDR)) : pInitAudio->MtuSize;
- APPL_TRACE_EVENT3("btif_media_task_enc_init busy %d, mtu %d, peer mtu %d",
+ APPL_TRACE_EVENT("btif_media_task_enc_init busy %d, mtu %d, peer mtu %d",
btif_media_cb.busy_level, btif_media_cb.TxAaMtuSize, pInitAudio->MtuSize);
- APPL_TRACE_EVENT6(" ch mode %d, subnd %d, nb blk %d, alloc %d, rate %d, freq %d",
+ APPL_TRACE_EVENT(" ch mode %d, subnd %d, nb blk %d, alloc %d, rate %d, freq %d",
btif_media_cb.encoder.s16ChannelMode, btif_media_cb.encoder.s16NumOfSubBands,
btif_media_cb.encoder.s16NumOfBlocks,
btif_media_cb.encoder.s16AllocationMethod, btif_media_cb.encoder.u16BitRate,
@@ -1497,7 +1859,7 @@
/* Reset entirely the SBC encoder */
SBC_Encoder_Init(&(btif_media_cb.encoder));
- APPL_TRACE_DEBUG1("btif_media_task_enc_init bit pool %d", btif_media_cb.encoder.s16BitPool);
+ APPL_TRACE_DEBUG("btif_media_task_enc_init bit pool %d", btif_media_cb.encoder.s16BitPool);
}
/*******************************************************************************
@@ -1515,12 +1877,12 @@
tBTIF_MEDIA_UPDATE_AUDIO * pUpdateAudio = (tBTIF_MEDIA_UPDATE_AUDIO *) p_msg;
SBC_ENC_PARAMS *pstrEncParams = &btif_media_cb.encoder;
UINT16 s16SamplingFreq;
- SINT16 s16BitPool;
+ SINT16 s16BitPool = 0;
SINT16 s16BitRate;
SINT16 s16FrameLen;
UINT8 protect = 0;
- APPL_TRACE_DEBUG3("btif_media_task_enc_update : minmtu %d, maxbp %d minbp %d",
+ APPL_TRACE_DEBUG("btif_media_task_enc_update : minmtu %d, maxbp %d minbp %d",
pUpdateAudio->MinMtuSize, pUpdateAudio->MaxBitPool, pUpdateAudio->MinBitPool);
/* Only update the bitrate and MTU size while timer is running to make sure it has been initialized */
@@ -1545,6 +1907,16 @@
do
{
+ if (pstrEncParams->s16NumOfBlocks == 0 || pstrEncParams->s16NumOfSubBands == 0
+ || pstrEncParams->s16NumOfChannels == 0)
+ {
+ APPL_TRACE_ERROR("btif_media_task_enc_update() - Avoiding division by zero...");
+ APPL_TRACE_ERROR("btif_media_task_enc_update() - block=%d, subBands=%d, channels=%d",
+ pstrEncParams->s16NumOfBlocks, pstrEncParams->s16NumOfSubBands,
+ pstrEncParams->s16NumOfChannels);
+ break;
+ }
+
if ((pstrEncParams->s16ChannelMode == SBC_JOINT_STEREO) ||
(pstrEncParams->s16ChannelMode == SBC_STEREO) )
{
@@ -1593,12 +1965,12 @@
s16BitPool = 0;
}
- APPL_TRACE_EVENT2("bitpool candidate : %d (%d kbps)",
+ APPL_TRACE_EVENT("bitpool candidate : %d (%d kbps)",
s16BitPool, pstrEncParams->u16BitRate);
if (s16BitPool > pUpdateAudio->MaxBitPool)
{
- APPL_TRACE_DEBUG1("btif_media_task_enc_update computed bitpool too large (%d)",
+ APPL_TRACE_DEBUG("btif_media_task_enc_update computed bitpool too large (%d)",
s16BitPool);
/* Decrease bitrate */
btif_media_cb.encoder.u16BitRate -= BTIF_MEDIA_BITRATE_STEP;
@@ -1607,11 +1979,16 @@
}
else if (s16BitPool < pUpdateAudio->MinBitPool)
{
- APPL_TRACE_WARNING1("btif_media_task_enc_update computed bitpool too small (%d)", s16BitPool);
+ APPL_TRACE_WARNING("btif_media_task_enc_update computed bitpool too small (%d)", s16BitPool);
+
/* Increase bitrate */
+ UINT16 previous_u16BitRate = btif_media_cb.encoder.u16BitRate;
btif_media_cb.encoder.u16BitRate += BTIF_MEDIA_BITRATE_STEP;
/* Record that we have increased the bitrate */
protect |= 2;
+ /* Check over-flow */
+ if (btif_media_cb.encoder.u16BitRate < previous_u16BitRate)
+ protect |= 3;
}
else
{
@@ -1620,7 +1997,7 @@
/* In case we have already increased and decreased the bitrate, just stop */
if (protect == 3)
{
- APPL_TRACE_ERROR0("btif_media_task_enc_update could not find bitpool in range");
+ APPL_TRACE_ERROR("btif_media_task_enc_update could not find bitpool in range");
break;
}
} while (1);
@@ -1628,7 +2005,7 @@
/* Finally update the bitpool in the encoder structure */
pstrEncParams->s16BitPool = s16BitPool;
- APPL_TRACE_DEBUG2("btif_media_task_enc_update final bit rate %d, final bit pool %d",
+ APPL_TRACE_DEBUG("btif_media_task_enc_update final bit rate %d, final bit pool %d",
btif_media_cb.encoder.u16BitRate, btif_media_cb.encoder.s16BitPool);
/* make sure we reinitialize encoder with new settings */
@@ -1649,10 +2026,10 @@
{
BOOLEAN reconfig_needed = FALSE;
- APPL_TRACE_DEBUG0("PCM feeding:");
- APPL_TRACE_DEBUG1("sampling_freq:%d", p_feeding->feeding.cfg.pcm.sampling_freq);
- APPL_TRACE_DEBUG1("num_channel:%d", p_feeding->feeding.cfg.pcm.num_channel);
- APPL_TRACE_DEBUG1("bit_per_sample:%d", p_feeding->feeding.cfg.pcm.bit_per_sample);
+ APPL_TRACE_DEBUG("PCM feeding:");
+ APPL_TRACE_DEBUG("sampling_freq:%d", p_feeding->feeding.cfg.pcm.sampling_freq);
+ APPL_TRACE_DEBUG("num_channel:%d", p_feeding->feeding.cfg.pcm.num_channel);
+ APPL_TRACE_DEBUG("bit_per_sample:%d", p_feeding->feeding.cfg.pcm.bit_per_sample);
/* Check the PCM feeding sampling_freq */
switch (p_feeding->feeding.cfg.pcm.sampling_freq)
@@ -1667,7 +2044,7 @@
if (btif_media_cb.encoder.s16SamplingFreq != SBC_sf48000)
{
/* Reconfiguration needed at 48000 */
- APPL_TRACE_DEBUG0("SBC Reconfiguration needed at 48000");
+ APPL_TRACE_DEBUG("SBC Reconfiguration needed at 48000");
btif_media_cb.encoder.s16SamplingFreq = SBC_sf48000;
reconfig_needed = TRUE;
}
@@ -1680,28 +2057,28 @@
if (btif_media_cb.encoder.s16SamplingFreq != SBC_sf44100)
{
/* Reconfiguration needed at 44100 */
- APPL_TRACE_DEBUG0("SBC Reconfiguration needed at 44100");
+ APPL_TRACE_DEBUG("SBC Reconfiguration needed at 44100");
btif_media_cb.encoder.s16SamplingFreq = SBC_sf44100;
reconfig_needed = TRUE;
}
break;
default:
- APPL_TRACE_DEBUG0("Feeding PCM sampling_freq unsupported");
+ APPL_TRACE_DEBUG("Feeding PCM sampling_freq unsupported");
break;
}
/* Some AV Headsets do not support Mono => always ask for Stereo */
if (btif_media_cb.encoder.s16ChannelMode == SBC_MONO)
{
- APPL_TRACE_DEBUG0("SBC Reconfiguration needed in Stereo");
+ APPL_TRACE_DEBUG("SBC Reconfiguration needed in Stereo");
btif_media_cb.encoder.s16ChannelMode = SBC_JOINT_STEREO;
reconfig_needed = TRUE;
}
if (reconfig_needed != FALSE)
{
- APPL_TRACE_DEBUG1("btif_media_task_pcm2sbc_init :: mtu %d", btif_media_cb.TxAaMtuSize);
- APPL_TRACE_DEBUG6("ch mode %d, nbsubd %d, nb %d, alloc %d, rate %d, freq %d",
+ APPL_TRACE_DEBUG("btif_media_task_pcm2sbc_init :: mtu %d", btif_media_cb.TxAaMtuSize);
+ APPL_TRACE_DEBUG("ch mode %d, nbsubd %d, nb %d, alloc %d, rate %d, freq %d",
btif_media_cb.encoder.s16ChannelMode,
btif_media_cb.encoder.s16NumOfSubBands, btif_media_cb.encoder.s16NumOfBlocks,
btif_media_cb.encoder.s16AllocationMethod, btif_media_cb.encoder.u16BitRate,
@@ -1711,7 +2088,7 @@
}
else
{
- APPL_TRACE_DEBUG0("btif_media_task_pcm2sbc_init no SBC reconfig needed");
+ APPL_TRACE_DEBUG("btif_media_task_pcm2sbc_init no SBC reconfig needed");
}
}
@@ -1729,7 +2106,7 @@
{
tBTIF_MEDIA_INIT_AUDIO_FEEDING *p_feeding = (tBTIF_MEDIA_INIT_AUDIO_FEEDING *) p_msg;
- APPL_TRACE_DEBUG1("btif_media_task_audio_feeding_init format:%d", p_feeding->feeding.format);
+ APPL_TRACE_DEBUG("btif_media_task_audio_feeding_init format:%d", p_feeding->feeding.format);
/* Save Media Feeding information */
btif_media_cb.feeding_mode = p_feeding->feeding_mode;
@@ -1744,41 +2121,232 @@
break;
default :
- APPL_TRACE_ERROR1("unknown feeding format %d", p_feeding->feeding.format);
+ APPL_TRACE_ERROR("unknown feeding format %d", p_feeding->feeding.format);
break;
}
}
+int btif_a2dp_get_track_frequency(UINT8 frequency) {
+ int freq = 48000;
+ switch (frequency) {
+ case A2D_SBC_IE_SAMP_FREQ_16:
+ freq = 16000;
+ break;
+ case A2D_SBC_IE_SAMP_FREQ_32:
+ freq = 32000;
+ break;
+ case A2D_SBC_IE_SAMP_FREQ_44:
+ freq = 44100;
+ break;
+ case A2D_SBC_IE_SAMP_FREQ_48:
+ freq = 48000;
+ break;
+ }
+ return freq;
+}
+
+int btif_a2dp_get_track_channel_count(UINT8 channeltype) {
+ int count = 1;
+ switch (channeltype) {
+ case A2D_SBC_IE_CH_MD_MONO:
+ count = 1;
+ break;
+ case A2D_SBC_IE_CH_MD_DUAL:
+ case A2D_SBC_IE_CH_MD_STEREO:
+ case A2D_SBC_IE_CH_MD_JOINT:
+ count = 2;
+ break;
+ }
+ return count;
+}
+
+void btif_a2dp_set_peer_sep(UINT8 sep) {
+ btif_media_cb.peer_sep = sep;
+}
+
/*******************************************************************************
**
- ** Function btif_media_task_uipc_cback
+ ** Function btif_media_task_aa_handle_stop_decoding
**
- ** Description UIPC call back function for synchronous mode only
+ ** Description
**
** Returns void
**
*******************************************************************************/
-static void btif_media_task_uipc_cback(BT_HDR *p_msg)
+static void btif_media_task_aa_handle_stop_decoding(void )
{
- /* Sanity check */
- if (NULL == p_msg)
- {
- return;
- }
-
- /* Just handle RX_EVT */
- if (p_msg->event != UIPC_RX_DATA_EVT)
- {
- return;
- }
-
- p_msg->event = BTIF_MEDIA_UIPC_RX_RDY;
-
- GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_msg);
+ btif_media_cb.is_rx_timer = FALSE;
+ GKI_stop_timer(BTIF_MEDIA_AVK_TASK_TIMER_ID);
}
/*******************************************************************************
**
+ ** Function btif_media_task_aa_handle_start_decoding
+ **
+ ** Description
+ **
+ ** Returns void
+ **
+ *******************************************************************************/
+static void btif_media_task_aa_handle_start_decoding(void )
+{
+ if(btif_media_cb.is_rx_timer == TRUE)
+ return;
+ btif_media_cb.is_rx_timer = TRUE;
+ GKI_start_timer(BTIF_MEDIA_AVK_TASK_TIMER_ID, GKI_MS_TO_TICKS(BTIF_SINK_MEDIA_TIME_TICK), TRUE);
+}
+
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+
+static void btif_media_task_aa_handle_clear_track (void)
+{
+ APPL_TRACE_DEBUG("btif_media_task_aa_handle_clear_track");
+}
+
+/*******************************************************************************
+ **
+ ** Function btif_media_task_aa_handle_decoder_reset
+ **
+ ** Description
+ **
+ ** Returns void
+ **
+ *******************************************************************************/
+static void btif_media_task_aa_handle_decoder_reset(BT_HDR *p_msg)
+{
+ tBTIF_MEDIA_SINK_CFG_UPDATE *p_buf = (tBTIF_MEDIA_SINK_CFG_UPDATE*) p_msg;
+ tA2D_STATUS a2d_status;
+ tA2D_SBC_CIE sbc_cie;
+ OI_STATUS status;
+ UINT32 freq_multiple = 48*20; /* frequency multiple for 20ms of data , initialize with 48K*/
+ UINT32 num_blocks = 16;
+ UINT32 num_subbands = 8;
+
+ APPL_TRACE_DEBUG("btif_media_task_aa_handle_decoder_reset p_codec_info[%x:%x:%x:%x:%x:%x]",
+ p_buf->codec_info[1], p_buf->codec_info[2], p_buf->codec_info[3],
+ p_buf->codec_info[4], p_buf->codec_info[5], p_buf->codec_info[6]);
+
+ a2d_status = A2D_ParsSbcInfo(&sbc_cie, p_buf->codec_info, FALSE);
+ if (a2d_status != A2D_SUCCESS)
+ {
+ APPL_TRACE_ERROR("ERROR dump_codec_info A2D_ParsSbcInfo fail:%d", a2d_status);
+ return;
+ }
+
+ btif_media_cb.sample_rate = btif_a2dp_get_track_frequency(sbc_cie.samp_freq);
+ btif_media_cb.channel_count = btif_a2dp_get_track_channel_count(sbc_cie.ch_mode);
+
+ btif_media_cb.rx_flush = FALSE;
+ APPL_TRACE_DEBUG("Reset to sink role");
+ status = OI_CODEC_SBC_DecoderReset(&context, contextData, sizeof(contextData), 2, 2, FALSE);
+ if (!OI_SUCCESS(status)) {
+ APPL_TRACE_ERROR("OI_CODEC_SBC_DecoderReset failed with error code %d\n", status);
+ }
+
+ UIPC_Open(UIPC_CH_ID_AV_AUDIO, btif_a2dp_data_cb);
+
+ switch(sbc_cie.samp_freq)
+ {
+ case A2D_SBC_IE_SAMP_FREQ_16:
+ APPL_TRACE_DEBUG("\tsamp_freq:%d (16000)", sbc_cie.samp_freq);
+ freq_multiple = 16*20;
+ break;
+ case A2D_SBC_IE_SAMP_FREQ_32:
+ APPL_TRACE_DEBUG("\tsamp_freq:%d (32000)", sbc_cie.samp_freq);
+ freq_multiple = 32*20;
+ break;
+ case A2D_SBC_IE_SAMP_FREQ_44:
+ APPL_TRACE_DEBUG("\tsamp_freq:%d (44100)", sbc_cie.samp_freq);
+ freq_multiple = 441*2;
+ break;
+ case A2D_SBC_IE_SAMP_FREQ_48:
+ APPL_TRACE_DEBUG("\tsamp_freq:%d (48000)", sbc_cie.samp_freq);
+ freq_multiple = 48*20;
+ break;
+ default:
+ APPL_TRACE_DEBUG(" Unknown Frequency ");
+ break;
+ }
+
+ switch(sbc_cie.ch_mode)
+ {
+ case A2D_SBC_IE_CH_MD_MONO:
+ APPL_TRACE_DEBUG("\tch_mode:%d (Mono)", sbc_cie.ch_mode);
+ break;
+ case A2D_SBC_IE_CH_MD_DUAL:
+ APPL_TRACE_DEBUG("\tch_mode:%d (DUAL)", sbc_cie.ch_mode);
+ break;
+ case A2D_SBC_IE_CH_MD_STEREO:
+ APPL_TRACE_DEBUG("\tch_mode:%d (STEREO)", sbc_cie.ch_mode);
+ break;
+ case A2D_SBC_IE_CH_MD_JOINT:
+ APPL_TRACE_DEBUG("\tch_mode:%d (JOINT)", sbc_cie.ch_mode);
+ break;
+ default:
+ APPL_TRACE_DEBUG(" Unknown Mode ");
+ break;
+ }
+
+ switch(sbc_cie.block_len)
+ {
+ case A2D_SBC_IE_BLOCKS_4:
+ APPL_TRACE_DEBUG("\tblock_len:%d (4)", sbc_cie.block_len);
+ num_blocks = 4;
+ break;
+ case A2D_SBC_IE_BLOCKS_8:
+ APPL_TRACE_DEBUG("\tblock_len:%d (8)", sbc_cie.block_len);
+ num_blocks = 8;
+ break;
+ case A2D_SBC_IE_BLOCKS_12:
+ APPL_TRACE_DEBUG("\tblock_len:%d (12)", sbc_cie.block_len);
+ num_blocks = 12;
+ break;
+ case A2D_SBC_IE_BLOCKS_16:
+ APPL_TRACE_DEBUG("\tblock_len:%d (16)", sbc_cie.block_len);
+ num_blocks = 16;
+ break;
+ default:
+ APPL_TRACE_DEBUG(" Unknown BlockLen ");
+ break;
+ }
+
+ switch(sbc_cie.num_subbands)
+ {
+ case A2D_SBC_IE_SUBBAND_4:
+ APPL_TRACE_DEBUG("\tnum_subbands:%d (4)", sbc_cie.num_subbands);
+ num_subbands = 4;
+ break;
+ case A2D_SBC_IE_SUBBAND_8:
+ APPL_TRACE_DEBUG("\tnum_subbands:%d (8)", sbc_cie.num_subbands);
+ num_subbands = 8;
+ break;
+ default:
+ APPL_TRACE_DEBUG(" Unknown SubBands ");
+ break;
+ }
+
+ switch(sbc_cie.alloc_mthd)
+ {
+ case A2D_SBC_IE_ALLOC_MD_S:
+ APPL_TRACE_DEBUG("\talloc_mthd:%d (SNR)", sbc_cie.alloc_mthd);
+ break;
+ case A2D_SBC_IE_ALLOC_MD_L:
+ APPL_TRACE_DEBUG("\talloc_mthd:%d (Loudness)", sbc_cie.alloc_mthd);
+ break;
+ default:
+ APPL_TRACE_DEBUG(" Unknown Allocation Method");
+ break;
+ }
+
+ APPL_TRACE_DEBUG("\tBit pool Min:%d Max:%d", sbc_cie.min_bitpool, sbc_cie.max_bitpool);
+
+ btif_media_cb.frames_to_process = ((freq_multiple)/(num_blocks*num_subbands)) + 1;
+ APPL_TRACE_DEBUG(" Frames to be processed in 20 ms %d",btif_media_cb.frames_to_process);
+}
+#endif
+
+/*******************************************************************************
+ **
** Function btif_media_task_feeding_state_reset
**
** Description Reset the media feeding state
@@ -1788,7 +2356,7 @@
*******************************************************************************/
static void btif_media_task_feeding_state_reset(void)
{
- APPL_TRACE_WARNING3("overflow %d, enter %d, exit %d",
+ APPL_TRACE_WARNING("overflow %d, enter %d, exit %d",
btif_media_cb.media_feeding_state.pcm.overflow_count,
btif_media_cb.media_feeding_state.pcm.max_counter_enter,
btif_media_cb.media_feeding_state.pcm.max_counter_exit);
@@ -1804,7 +2372,7 @@
btif_media_cb.media_feeding.cfg.pcm.num_channel *
BTIF_MEDIA_TIME_TICK)/1000;
- APPL_TRACE_WARNING1("pcm bytes per tick %d",
+ APPL_TRACE_WARNING("pcm bytes per tick %d",
(int)btif_media_cb.media_feeding_state.pcm.bytes_per_tick);
}
}
@@ -1819,18 +2387,19 @@
*******************************************************************************/
static void btif_media_task_aa_start_tx(void)
{
- APPL_TRACE_DEBUG2("btif_media_task_aa_start_tx is timer %d, feeding mode %d",
+ APPL_TRACE_DEBUG("btif_media_task_aa_start_tx is timer %d, feeding mode %d",
btif_media_cb.is_tx_timer, btif_media_cb.feeding_mode);
/* Use a timer to poll the UIPC, get rid of the UIPC call back */
// UIPC_Ioctl(UIPC_CH_ID_AV_AUDIO, UIPC_REG_CBACK, NULL);
btif_media_cb.is_tx_timer = TRUE;
+ last_frame_us = 0;
/* Reset the media feeding state */
btif_media_task_feeding_state_reset();
- APPL_TRACE_EVENT2("starting timer %d ticks (%d)",
+ APPL_TRACE_EVENT("starting timer %d ticks (%d)",
GKI_MS_TO_TICKS(BTIF_MEDIA_TIME_TICK), TICKS_PER_SEC);
GKI_start_timer(BTIF_MEDIA_AA_TASK_TIMER_ID, GKI_MS_TO_TICKS(BTIF_MEDIA_TIME_TICK), TRUE);
@@ -1847,7 +2416,7 @@
*******************************************************************************/
static void btif_media_task_aa_stop_tx(void)
{
- APPL_TRACE_DEBUG1("btif_media_task_aa_stop_tx is timer: %d", btif_media_cb.is_tx_timer);
+ APPL_TRACE_DEBUG("btif_media_task_aa_stop_tx is timer: %d", btif_media_cb.is_tx_timer);
/* Stop the timer first */
GKI_stop_timer(BTIF_MEDIA_AA_TASK_TIMER_ID);
@@ -1857,6 +2426,7 @@
/* audio engine stopped, reset tx suspended flag */
btif_media_cb.tx_flush = 0;
+ last_frame_us = 0;
/* Reset the media feeding state */
btif_media_task_feeding_state_reset();
@@ -1884,8 +2454,15 @@
btif_media_cb.media_feeding.cfg.pcm.num_channel *
btif_media_cb.media_feeding.cfg.pcm.bit_per_sample / 8;
+ UINT32 us_this_tick = BTIF_MEDIA_TIME_TICK * 1000;
+ UINT64 now_us = time_now_us();
+ if (last_frame_us != 0)
+ us_this_tick = (now_us - last_frame_us);
+ last_frame_us = now_us;
+
btif_media_cb.media_feeding_state.pcm.counter +=
- btif_media_cb.media_feeding_state.pcm.bytes_per_tick;
+ btif_media_cb.media_feeding_state.pcm.bytes_per_tick *
+ us_this_tick / (BTIF_MEDIA_TIME_TICK * 1000);
if ((!btif_media_cb.media_feeding_state.pcm.overflow) ||
(btif_media_cb.TxAaQ.count < A2DP_PACKET_COUNT_LOW_WATERMARK)) {
if (btif_media_cb.media_feeding_state.pcm.overflow) {
@@ -1899,24 +2476,30 @@
}
/* calculate nbr of frames pending for this media tick */
result = btif_media_cb.media_feeding_state.pcm.counter/pcm_bytes_per_frame;
- if (result > MAX_PCM_FRAME_NUM_PER_TICK) result = MAX_PCM_FRAME_NUM_PER_TICK;
+ if (result > MAX_PCM_FRAME_NUM_PER_TICK)
+ {
+ APPL_TRACE_ERROR("%s() - Limiting frames to be sent from %d to %d"
+ , __FUNCTION__, result, MAX_PCM_FRAME_NUM_PER_TICK);
+ result = MAX_PCM_FRAME_NUM_PER_TICK;
+ }
btif_media_cb.media_feeding_state.pcm.counter -= result*pcm_bytes_per_frame;
} else {
result = 0;
}
+
VERBOSE("WRITE %d FRAMES", result);
}
break;
default:
- APPL_TRACE_ERROR1("ERROR btif_get_num_aa_frame Unsupported transcoding format 0x%x",
+ APPL_TRACE_ERROR("ERROR btif_get_num_aa_frame Unsupported transcoding format 0x%x",
btif_media_cb.TxTranscoding);
result = 0;
break;
}
#if (defined(DEBUG_MEDIA_AV_FLOW) && (DEBUG_MEDIA_AV_FLOW == TRUE))
- APPL_TRACE_DEBUG1("btif_get_num_aa_frame returns %d", result);
+ APPL_TRACE_DEBUG("btif_get_num_aa_frame returns %d", result);
#endif
return (UINT8)result;
@@ -1924,6 +2507,49 @@
/*******************************************************************************
**
+ ** Function btif_media_sink_enque_buf
+ **
+ ** Description This function is called by the av_co to fill A2DP Sink Queue
+ **
+ **
+ ** Returns size of the queue
+ *******************************************************************************/
+UINT8 btif_media_sink_enque_buf(BT_HDR *p_pkt)
+{
+ tBT_SBC_HDR *p_msg;
+
+ if(btif_media_cb.rx_flush == TRUE) /* Flush enabled, do not enque*/
+ return btif_media_cb.RxSbcQ.count;
+ if(btif_media_cb.RxSbcQ.count == MAX_OUTPUT_A2DP_FRAME_QUEUE_SZ)
+ {
+ GKI_freebuf(GKI_dequeue(&(btif_media_cb.RxSbcQ)));
+ }
+
+ BTIF_TRACE_VERBOSE("btif_media_sink_enque_buf + ");
+ /* allocate and Queue this buffer */
+ if ((p_msg = (tBT_SBC_HDR *) GKI_getbuf(sizeof(tBT_SBC_HDR) +
+ p_pkt->offset+ p_pkt->len)) != NULL)
+ {
+ memcpy(p_msg, p_pkt, (sizeof(BT_HDR) + p_pkt->offset + p_pkt->len));
+ p_msg->num_frames_to_be_processed = (*((UINT8*)(p_msg + 1) + p_msg->offset)) & 0x0f;
+ BTIF_TRACE_VERBOSE("btif_media_sink_enque_buf + ", p_msg->num_frames_to_be_processed);
+ GKI_enqueue(&(btif_media_cb.RxSbcQ), p_msg);
+ if(btif_media_cb.RxSbcQ.count == MAX_A2DP_DELAYED_START_FRAME_COUNT)
+ {
+ BTIF_TRACE_DEBUG(" Initiate Decoding ");
+ btif_media_task_start_decoding_req();
+ }
+ }
+ else
+ {
+ /* let caller deal with a failed allocation */
+ BTIF_TRACE_VERBOSE("btif_media_sink_enque_buf No Buffer left - ");
+ }
+ return btif_media_cb.RxSbcQ.count;
+}
+
+/*******************************************************************************
+ **
** Function btif_media_aa_readbuf
**
** Description This function is called by the av_co to get the next buffer to send
@@ -1994,7 +2620,7 @@
btif_media_cb.media_feeding_state.pcm.aa_feed_residue = 0;
return TRUE;
} else {
- APPL_TRACE_WARNING2("### UNDERFLOW :: ONLY READ %d BYTES OUT OF %d ###",
+ APPL_TRACE_WARNING("### UNDERFLOW :: ONLY READ %d BYTES OUT OF %d ###",
nb_byte_read, read_size);
btif_media_cb.media_feeding_state.pcm.aa_feed_residue += nb_byte_read;
return FALSE;
@@ -2053,7 +2679,7 @@
if (nb_byte_read < read_size)
{
- APPL_TRACE_WARNING2("### UNDERRUN :: ONLY READ %d BYTES OUT OF %d ###",
+ APPL_TRACE_WARNING("### UNDERRUN :: ONLY READ %d BYTES OUT OF %d ###",
nb_byte_read, read_size);
if (nb_byte_read == 0)
@@ -2081,7 +2707,7 @@
&src_size_used);
#if (defined(DEBUG_MEDIA_AV_FLOW) && (DEBUG_MEDIA_AV_FLOW == TRUE))
- APPL_TRACE_DEBUG3("btif_media_aa_read_feeding readsz:%d src_size_used:%d dst_size_used:%d",
+ APPL_TRACE_DEBUG("btif_media_aa_read_feeding readsz:%d src_size_used:%d dst_size_used:%d",
read_size, src_size_used, dst_size_used);
#endif
@@ -2108,7 +2734,7 @@
}
#if (defined(DEBUG_MEDIA_AV_FLOW) && (DEBUG_MEDIA_AV_FLOW == TRUE))
- APPL_TRACE_DEBUG3("btif_media_aa_read_feeding residue:%d, dst_size_used %d, bytes_needed %d",
+ APPL_TRACE_DEBUG("btif_media_aa_read_feeding residue:%d, dst_size_used %d, bytes_needed %d",
btif_media_cb.media_feeding_state.pcm.aa_feed_residue, dst_size_used, bytes_needed);
#endif
@@ -2131,14 +2757,14 @@
btif_media_cb.encoder.s16NumOfBlocks;
#if (defined(DEBUG_MEDIA_AV_FLOW) && (DEBUG_MEDIA_AV_FLOW == TRUE))
- APPL_TRACE_DEBUG2("btif_media_aa_prep_sbc_2_send nb_frame %d, TxAaQ %d",
+ APPL_TRACE_DEBUG("btif_media_aa_prep_sbc_2_send nb_frame %d, TxAaQ %d",
nb_frame, btif_media_cb.TxAaQ.count);
#endif
while (nb_frame)
{
if (NULL == (p_buf = GKI_getpoolbuf(BTIF_MEDIA_AA_POOL_ID)))
{
- APPL_TRACE_ERROR1 ("ERROR btif_media_aa_prep_sbc_2_send no buffer TxCnt %d ",
+ APPL_TRACE_ERROR ("ERROR btif_media_aa_prep_sbc_2_send no buffer TxCnt %d ",
btif_media_cb.TxAaQ.count);
return;
}
@@ -2170,7 +2796,7 @@
}
else
{
- APPL_TRACE_WARNING2("btif_media_aa_prep_sbc_2_send underflow %d, %d",
+ APPL_TRACE_WARNING("btif_media_aa_prep_sbc_2_send underflow %d, %d",
nb_frame, btif_media_cb.media_feeding_state.pcm.aa_feed_residue);
btif_media_cb.media_feeding_state.pcm.counter += nb_frame *
btif_media_cb.encoder.s16NumOfSubBands *
@@ -2182,7 +2808,10 @@
/* break read loop if timer was stopped (media task stopped) */
if ( btif_media_cb.is_tx_timer == FALSE )
+ {
+ GKI_freebuf(p_buf);
return;
+ }
}
} while (((p_buf->len + btif_media_cb.encoder.u16PacketLength) < btif_media_cb.TxAaMtuSize)
@@ -2200,7 +2829,7 @@
if (btif_media_cb.tx_flush)
{
- APPL_TRACE_DEBUG0("### tx suspended, discarded frame ###");
+ APPL_TRACE_DEBUG("### tx suspended, discarded frame ###");
if (btif_media_cb.TxAaQ.count > 0)
btif_media_flush_q(&(btif_media_cb.TxAaQ));
@@ -2236,7 +2865,7 @@
if (btif_media_cb.media_feeding_state.pcm.counter > reset_rate_bytes) {
btif_media_cb.media_feeding_state.pcm.counter = 0;
- APPL_TRACE_WARNING0("btif_media_aa_prep_sbc_2_send:reset rate counter");
+ APPL_TRACE_WARNING("btif_media_aa_prep_sbc_2_send:reset rate counter");
}
/* no more pcm to read */
@@ -2269,7 +2898,7 @@
default:
- APPL_TRACE_ERROR1("ERROR btif_media_aa_prep_2_send unsupported transcoding format 0x%x",btif_media_cb.TxTranscoding);
+ APPL_TRACE_ERROR("ERROR btif_media_aa_prep_2_send unsupported transcoding format 0x%x",btif_media_cb.TxTranscoding);
break;
}
}
@@ -2319,59 +2948,60 @@
a2d_status = A2D_ParsSbcInfo(&sbc_cie, p_codec, FALSE);
if (a2d_status != A2D_SUCCESS)
{
- APPL_TRACE_ERROR1("ERROR dump_codec_info A2D_ParsSbcInfo fail:%d", a2d_status);
+ APPL_TRACE_ERROR("ERROR dump_codec_info A2D_ParsSbcInfo fail:%d", a2d_status);
return;
}
- APPL_TRACE_DEBUG0("dump_codec_info");
+ APPL_TRACE_DEBUG("dump_codec_info");
if (sbc_cie.samp_freq == A2D_SBC_IE_SAMP_FREQ_16)
- { APPL_TRACE_DEBUG1("\tsamp_freq:%d (16000)", sbc_cie.samp_freq);}
+ { APPL_TRACE_DEBUG("\tsamp_freq:%d (16000)", sbc_cie.samp_freq);}
else if (sbc_cie.samp_freq == A2D_SBC_IE_SAMP_FREQ_32)
- { APPL_TRACE_DEBUG1("\tsamp_freq:%d (32000)", sbc_cie.samp_freq);}
+ { APPL_TRACE_DEBUG("\tsamp_freq:%d (32000)", sbc_cie.samp_freq);}
else if (sbc_cie.samp_freq == A2D_SBC_IE_SAMP_FREQ_44)
- { APPL_TRACE_DEBUG1("\tsamp_freq:%d (44.100)", sbc_cie.samp_freq);}
+ { APPL_TRACE_DEBUG("\tsamp_freq:%d (44.100)", sbc_cie.samp_freq);}
else if (sbc_cie.samp_freq == A2D_SBC_IE_SAMP_FREQ_48)
- { APPL_TRACE_DEBUG1("\tsamp_freq:%d (48000)", sbc_cie.samp_freq);}
+ { APPL_TRACE_DEBUG("\tsamp_freq:%d (48000)", sbc_cie.samp_freq);}
else
- { APPL_TRACE_DEBUG1("\tBAD samp_freq:%d", sbc_cie.samp_freq);}
+ { APPL_TRACE_DEBUG("\tBAD samp_freq:%d", sbc_cie.samp_freq);}
if (sbc_cie.ch_mode == A2D_SBC_IE_CH_MD_MONO)
- { APPL_TRACE_DEBUG1("\tch_mode:%d (Mono)", sbc_cie.ch_mode);}
+ { APPL_TRACE_DEBUG("\tch_mode:%d (Mono)", sbc_cie.ch_mode);}
else if (sbc_cie.ch_mode == A2D_SBC_IE_CH_MD_DUAL)
- { APPL_TRACE_DEBUG1("\tch_mode:%d (Dual)", sbc_cie.ch_mode);}
+ { APPL_TRACE_DEBUG("\tch_mode:%d (Dual)", sbc_cie.ch_mode);}
else if (sbc_cie.ch_mode == A2D_SBC_IE_CH_MD_STEREO)
- { APPL_TRACE_DEBUG1("\tch_mode:%d (Stereo)", sbc_cie.ch_mode);}
+ { APPL_TRACE_DEBUG("\tch_mode:%d (Stereo)", sbc_cie.ch_mode);}
else if (sbc_cie.ch_mode == A2D_SBC_IE_CH_MD_JOINT)
- { APPL_TRACE_DEBUG1("\tch_mode:%d (Joint)", sbc_cie.ch_mode);}
+ { APPL_TRACE_DEBUG("\tch_mode:%d (Joint)", sbc_cie.ch_mode);}
else
- { APPL_TRACE_DEBUG1("\tBAD ch_mode:%d", sbc_cie.ch_mode);}
+ { APPL_TRACE_DEBUG("\tBAD ch_mode:%d", sbc_cie.ch_mode);}
if (sbc_cie.block_len == A2D_SBC_IE_BLOCKS_4)
- { APPL_TRACE_DEBUG1("\tblock_len:%d (4)", sbc_cie.block_len);}
+ { APPL_TRACE_DEBUG("\tblock_len:%d (4)", sbc_cie.block_len);}
else if (sbc_cie.block_len == A2D_SBC_IE_BLOCKS_8)
- { APPL_TRACE_DEBUG1("\tblock_len:%d (8)", sbc_cie.block_len);}
+ { APPL_TRACE_DEBUG("\tblock_len:%d (8)", sbc_cie.block_len);}
else if (sbc_cie.block_len == A2D_SBC_IE_BLOCKS_12)
- { APPL_TRACE_DEBUG1("\tblock_len:%d (12)", sbc_cie.block_len);}
+ { APPL_TRACE_DEBUG("\tblock_len:%d (12)", sbc_cie.block_len);}
else if (sbc_cie.block_len == A2D_SBC_IE_BLOCKS_16)
- { APPL_TRACE_DEBUG1("\tblock_len:%d (16)", sbc_cie.block_len);}
+ { APPL_TRACE_DEBUG("\tblock_len:%d (16)", sbc_cie.block_len);}
else
- { APPL_TRACE_DEBUG1("\tBAD block_len:%d", sbc_cie.block_len);}
+ { APPL_TRACE_DEBUG("\tBAD block_len:%d", sbc_cie.block_len);}
if (sbc_cie.num_subbands == A2D_SBC_IE_SUBBAND_4)
- { APPL_TRACE_DEBUG1("\tnum_subbands:%d (4)", sbc_cie.num_subbands);}
+ { APPL_TRACE_DEBUG("\tnum_subbands:%d (4)", sbc_cie.num_subbands);}
else if (sbc_cie.num_subbands == A2D_SBC_IE_SUBBAND_8)
- { APPL_TRACE_DEBUG1("\tnum_subbands:%d (8)", sbc_cie.num_subbands);}
+ { APPL_TRACE_DEBUG("\tnum_subbands:%d (8)", sbc_cie.num_subbands);}
else
- { APPL_TRACE_DEBUG1("\tBAD num_subbands:%d", sbc_cie.num_subbands);}
+ { APPL_TRACE_DEBUG("\tBAD num_subbands:%d", sbc_cie.num_subbands);}
if (sbc_cie.alloc_mthd == A2D_SBC_IE_ALLOC_MD_S)
- { APPL_TRACE_DEBUG1("\talloc_mthd:%d (SNR)", sbc_cie.alloc_mthd);}
+ { APPL_TRACE_DEBUG("\talloc_mthd:%d (SNR)", sbc_cie.alloc_mthd);}
else if (sbc_cie.alloc_mthd == A2D_SBC_IE_ALLOC_MD_L)
- { APPL_TRACE_DEBUG1("\talloc_mthd:%d (Loundess)", sbc_cie.alloc_mthd);}
+ { APPL_TRACE_DEBUG("\talloc_mthd:%d (Loundess)", sbc_cie.alloc_mthd);}
else
- { APPL_TRACE_DEBUG1("\tBAD alloc_mthd:%d", sbc_cie.alloc_mthd);}
+ { APPL_TRACE_DEBUG("\tBAD alloc_mthd:%d", sbc_cie.alloc_mthd);}
- APPL_TRACE_DEBUG2("\tBit pool Min:%d Max:%d", sbc_cie.min_bitpool, sbc_cie.max_bitpool);
+ APPL_TRACE_DEBUG("\tBit pool Min:%d Max:%d", sbc_cie.min_bitpool, sbc_cie.max_bitpool);
}
+
diff --git a/btif/src/btif_pan.c b/btif/src/btif_pan.c
index 28c5156..32ae984 100644
--- a/btif/src/btif_pan.c
+++ b/btif/src/btif_pan.c
@@ -26,6 +26,7 @@
***********************************************************************************/
#include <hardware/bluetooth.h>
#include <hardware/bt_pan.h>
+#include <assert.h>
#include <signal.h>
#include <ctype.h>
#include <sys/select.h>
@@ -56,7 +57,12 @@
#include "btif_sock_thread.h"
#include "btif_sock_util.h"
#include "btif_pan_internal.h"
+#include "gki.h"
+#define FORWARD_IGNORE 1
+#define FORWARD_SUCCESS 0
+#define FORWARD_FAILURE (-1)
+#define FORWARD_CONGEST (-2)
//#define PANU_DISABLED TRUE
#if (PAN_NAP_DISABLED == TRUE) && (PANU_DISABLED == TRUE)
@@ -69,7 +75,9 @@
#define BTPAN_LOCAL_ROLE (BTPAN_ROLE_PANU | BTPAN_ROLE_PANNAP)
#endif
-#define asrt(s) if(!(s)) BTIF_TRACE_ERROR3("btif_pan: ## %s assert %s failed at line:%d ##",__FUNCTION__, #s, __LINE__)
+#define asrt(s) if(!(s)) BTIF_TRACE_ERROR("btif_pan: ## %s assert %s failed at line:%d ##",__FUNCTION__, #s, __LINE__)
+
+#define MIN(x, y) (((x) < (y)) ? (x) : (y))
btpan_cb_t btpan_cb;
@@ -85,15 +93,8 @@
static void btpan_tap_fd_signaled(int fd, int type, int flags, uint32_t user_id);
static void btpan_cleanup_conn(btpan_conn_t* conn);
static void bta_pan_callback(tBTA_PAN_EVT event, tBTA_PAN *p_data);
-/*******************************************************************************
- **
- ** Function btpan_ini
- **
- ** Description initializes the pan interface
- **
- ** Returns bt_status_t
- **
- *******************************************************************************/
+static void btu_exec_tap_fd_read(void *p_param);
+
static btpan_interface_t pan_if = {
sizeof(pan_if),
btpan_jni_init,
@@ -103,19 +104,31 @@
btpan_disconnect,
btpan_jni_cleanup
};
+
btpan_interface_t *btif_pan_get_interface()
{
return &pan_if;
}
+
+/*******************************************************************************
+ **
+ ** Function btif_pan_init
+ **
+ ** Description initializes the pan interface
+ **
+ ** Returns bt_status_t
+ **
+ *******************************************************************************/
void btif_pan_init()
{
- BTIF_TRACE_DEBUG2("jni_initialized = %d, btpan_cb.enabled:%d", jni_initialized, btpan_cb.enabled);
+ BTIF_TRACE_DEBUG("jni_initialized = %d, btpan_cb.enabled:%d", jni_initialized, btpan_cb.enabled);
stack_initialized = TRUE;
if (jni_initialized && !btpan_cb.enabled)
{
- BTIF_TRACE_DEBUG0("Enabling PAN....");
+ BTIF_TRACE_DEBUG("Enabling PAN....");
memset(&btpan_cb, 0, sizeof(btpan_cb));
btpan_cb.tap_fd = -1;
+ btpan_cb.flow = 1;
int i;
for(i = 0; i < MAX_PAN_CONNS; i++)
btpan_cleanup_conn(&btpan_cb.conns[i]);
@@ -124,6 +137,7 @@
btpan_enable(BTPAN_LOCAL_ROLE);
}
}
+
static void pan_disable()
{
if(btpan_cb.enabled)
@@ -132,12 +146,12 @@
BTA_PanDisable();
if(btpan_cb.tap_fd != -1)
{
- destroy_tap_read_thread();
btpan_tap_close(btpan_cb.tap_fd);
btpan_cb.tap_fd = -1;
}
}
}
+
void btif_pan_cleanup()
{
if(stack_initialized)
@@ -154,7 +168,7 @@
static btpan_callbacks_t callback;
static bt_status_t btpan_jni_init(const btpan_callbacks_t* callbacks)
{
- BTIF_TRACE_DEBUG2("stack_initialized = %d, btpan_cb.enabled:%d", stack_initialized, btpan_cb.enabled);
+ BTIF_TRACE_DEBUG("stack_initialized = %d, btpan_cb.enabled:%d", stack_initialized, btpan_cb.enabled);
jni_initialized = TRUE;
if(stack_initialized && !btpan_cb.enabled)
btif_pan_init();
@@ -167,10 +181,11 @@
pan_disable();
jni_initialized = FALSE;
}
+
static inline int bta_role_to_btpan(int bta_pan_role)
{
int btpan_role = 0;
- BTIF_TRACE_DEBUG1("bta_pan_role:0x%x", bta_pan_role);
+ BTIF_TRACE_DEBUG("bta_pan_role:0x%x", bta_pan_role);
if(bta_pan_role & PAN_ROLE_NAP_SERVER)
{
btpan_role |= BTPAN_ROLE_PANNAP;
@@ -181,10 +196,11 @@
}
return btpan_role;
}
+
static inline int btpan_role_to_bta(int btpan_role)
{
int bta_pan_role = PAN_ROLE_INACTIVE;
- BTIF_TRACE_DEBUG1("btpan_role:0x%x", btpan_role);
+ BTIF_TRACE_DEBUG("btpan_role:0x%x", btpan_role);
if(btpan_role & BTPAN_ROLE_PANNAP)
{
bta_pan_role |= PAN_ROLE_NAP_SERVER;
@@ -195,14 +211,15 @@
}
return bta_pan_role;
}
+
static volatile int btpan_dev_local_role;
static tBTA_PAN_ROLE_INFO bta_panu_info = {PANU_SERVICE_NAME, 0, PAN_SECURITY};
-static tBTA_PAN_ROLE_INFO bta_pan_nap_info = {PAN_NAP_SERVICE_NAME, 0, PAN_SECURITY};
+static tBTA_PAN_ROLE_INFO bta_pan_nap_info = {PAN_NAP_SERVICE_NAME, 1, PAN_SECURITY};
static bt_status_t btpan_enable(int local_role)
{
int bta_pan_role;
- BTIF_TRACE_DEBUG1("local_role:%d", local_role);
+ BTIF_TRACE_DEBUG("local_role:%d", local_role);
bta_pan_role = btpan_role_to_bta(local_role);
#if BTA_PAN_INCLUDED == TRUE
BTA_PanSetRole(bta_pan_role, &bta_panu_info, NULL, &bta_pan_nap_info);
@@ -212,23 +229,26 @@
return BT_STATUS_FAIL;
#endif
}
+
static int btpan_get_local_role()
{
- BTIF_TRACE_DEBUG1("btpan_dev_local_role:%d", btpan_dev_local_role);
+ BTIF_TRACE_DEBUG("btpan_dev_local_role:%d", btpan_dev_local_role);
return btpan_dev_local_role;
}
+
static bt_status_t btpan_connect(const bt_bdaddr_t *bd_addr, int local_role, int remote_role)
{
- BTIF_TRACE_DEBUG2("local_role:%d, remote_role:%d", local_role, remote_role);
+ BTIF_TRACE_DEBUG("local_role:%d, remote_role:%d", local_role, remote_role);
int bta_local_role = btpan_role_to_bta(local_role);
int bta_remote_role = btpan_role_to_bta(remote_role);
btpan_new_conn(-1, bd_addr->address, bta_local_role, bta_remote_role);
BTA_PanOpen((UINT8*)bd_addr->address, bta_local_role, bta_remote_role);
return BT_STATUS_SUCCESS;
}
+
static void btif_in_pan_generic_evt(UINT16 event, char *p_param)
{
- BTIF_TRACE_EVENT2("%s: event=%d", __FUNCTION__, event);
+ BTIF_TRACE_EVENT("%s: event=%d", __FUNCTION__, event);
switch (event) {
case BTIF_PAN_CB_DISCONNECTING:
{
@@ -246,11 +266,12 @@
} break;
default:
{
- BTIF_TRACE_WARNING2("%s : Unknown event 0x%x", __FUNCTION__, event);
+ BTIF_TRACE_WARNING("%s : Unknown event 0x%x", __FUNCTION__, event);
}
break;
}
}
+
static bt_status_t btpan_disconnect(const bt_bdaddr_t *bd_addr)
{
btpan_conn_t* conn = btpan_find_conn_addr(bd_addr->address);
@@ -264,24 +285,25 @@
}
return BT_STATUS_FAIL;
}
-static int pth = -1;
+
+static int pan_pth = -1;
void create_tap_read_thread(int tap_fd)
{
- if(pth < 0)
- {
- pth = btsock_thread_create(btpan_tap_fd_signaled, NULL);
- if(pth >= 0)
- btsock_thread_add_fd(pth, tap_fd, 0, SOCK_THREAD_FD_RD, 0);
- }
+ if(pan_pth < 0)
+ pan_pth = btsock_thread_create(btpan_tap_fd_signaled, NULL);
+ if(pan_pth >= 0)
+ btsock_thread_add_fd(pan_pth, tap_fd, 0, SOCK_THREAD_FD_RD, 0);
}
+
void destroy_tap_read_thread(void)
{
- if(pth >= 0)
+ if(pan_pth >= 0)
{
- btsock_thread_exit(pth);
- pth = -1;
+ btsock_thread_exit(pan_pth);
+ pan_pth = -1;
}
}
+
static int tap_if_up(const char *devname, BD_ADDR addr)
{
struct ifreq ifr;
@@ -295,7 +317,7 @@
err = ioctl(sk, SIOCGIFHWADDR, &ifr);
if(err < 0)
{
- BTIF_TRACE_ERROR2("Could not get network hardware for interface:%s, errno:%s", devname, strerror(errno));
+ BTIF_TRACE_ERROR("Could not get network hardware for interface:%s, errno:%s", devname, strerror(errno));
close(sk);
return -1;
}
@@ -308,10 +330,20 @@
/* ifr.ifr_hwaddr.sa_data[0], ifr.ifr_hwaddr.sa_data[1], ifr.ifr_hwaddr.sa_data[2], */
/* ifr.ifr_hwaddr.sa_data[3], ifr.ifr_hwaddr.sa_data[4], ifr.ifr_hwaddr.sa_data[5]); */
+ /* The IEEE has specified that the most significant bit of the most significant byte is used to
+ * determine a multicast address. If its a 1, that means multicast, 0 means unicast.
+ * Kernel returns an error if we try to set a multicast address for the tun-tap ethernet interface.
+ * Mask this bit to avoid any issue with auto generated address.
+ */
+ if (ifr.ifr_hwaddr.sa_data[0] & 0x01) {
+ BTIF_TRACE_WARNING("Not a unicast MAC address, force multicast bit flipping");
+ ifr.ifr_hwaddr.sa_data[0] &= ~0x01;
+ }
+
err = ioctl(sk, SIOCSIFHWADDR, (caddr_t)&ifr);
if (err < 0) {
- BTIF_TRACE_ERROR2("Could not set bt address for interface:%s, errno:%s", devname, strerror(errno));
+ BTIF_TRACE_ERROR("Could not set bt address for interface:%s, errno:%s", devname, strerror(errno));
close(sk);
return -1;
}
@@ -327,12 +359,12 @@
if (err < 0) {
- BTIF_TRACE_ERROR2("Could not bring up network interface:%s, errno:%d", devname, errno);
+ BTIF_TRACE_ERROR("Could not bring up network interface:%s, errno:%d", devname, errno);
close(sk);
return -1;
}
close(sk);
- BTIF_TRACE_DEBUG1("network interface: %s is up", devname);
+ BTIF_TRACE_DEBUG("network interface: %s is up", devname);
return 0;
}
@@ -354,6 +386,18 @@
return 0;
}
+
+void btpan_set_flow_control(BOOLEAN enable) {
+ if (btpan_cb.tap_fd == -1)
+ return;
+
+ btpan_cb.flow = enable;
+ if (enable) {
+ btsock_thread_add_fd(pan_pth, btpan_cb.tap_fd, 0, SOCK_THREAD_FD_RD, 0);
+ bta_dmexecutecallback(btu_exec_tap_fd_read, (void *)btpan_cb.tap_fd);
+ }
+}
+
int btpan_tap_open()
{
struct ifreq ifr;
@@ -365,7 +409,7 @@
//system("insmod /system/lib/modules/tun.ko");
if( (fd = open(clonedev, O_RDWR)) < 0 ) {
- BTIF_TRACE_DEBUG2("could not open %s, err:%d", clonedev, errno);
+ BTIF_TRACE_DEBUG("could not open %s, err:%d", clonedev, errno);
return fd;
}
@@ -377,19 +421,22 @@
/* try to create the device */
if( (err = ioctl(fd, TUNSETIFF, (void *) &ifr)) < 0 )//|| tap_setup_ip(TAP_IF_NAME) == FALSE)
{
- BTIF_TRACE_DEBUG2("ioctl error:%d, errno:%s", err, strerror(errno));
+ BTIF_TRACE_DEBUG("ioctl error:%d, errno:%s", err, strerror(errno));
close(fd);
return err;
}
BTM_GetLocalDeviceAddr (local_addr);
if(tap_if_up(TAP_IF_NAME, local_addr) == 0)
{
+ int flags = fcntl(fd, F_GETFL, 0);
+ fcntl(fd, F_SETFL, flags | O_NONBLOCK);
return fd;
}
- BTIF_TRACE_ERROR1("can not bring up tap interface:%s", TAP_IF_NAME);
+ BTIF_TRACE_ERROR("can not bring up tap interface:%s", TAP_IF_NAME);
close(fd);
return -1;
}
+
int btpan_tap_send(int tap_fd, const BD_ADDR src, const BD_ADDR dst, UINT16 proto, const char* buf,
UINT16 len, BOOLEAN ext, BOOLEAN forward)
{
@@ -417,18 +464,22 @@
//btnet_send(btpan_cb.conn[i].sock.sock, &buffer, (len + sizeof(tETH_HDR)));
//dump_bin("packet to network", packet, len + sizeof(tETH_HDR));
int ret = write(tap_fd, packet, len + sizeof(tETH_HDR));
- BTIF_TRACE_DEBUG1("ret:%d", ret);
+ BTIF_TRACE_DEBUG("ret:%d", ret);
return ret;
}
return -1;
}
+
int btpan_tap_close(int fd)
{
tap_if_down(TAP_IF_NAME);
close(fd);
+ if(pan_pth >= 0)
+ btsock_thread_wakeup(pan_pth);
return 0;
}
+
btpan_conn_t * btpan_find_conn_handle(UINT16 handle)
{
int i;
@@ -437,6 +488,7 @@
return &btpan_cb.conns[i];
return NULL;
}
+
btpan_conn_t* btpan_find_conn_addr(const BD_ADDR addr)
{
int i;
@@ -445,6 +497,7 @@
return &btpan_cb.conns[i];
return NULL;
}
+
static void btpan_cleanup_conn(btpan_conn_t* conn)
{
if(conn)
@@ -456,15 +509,16 @@
conn->local_role = conn->remote_role = 0;
}
}
+
btpan_conn_t* btpan_new_conn(int handle, const BD_ADDR addr, int local_role, int remote_role )
{
int i;
for(i = 0; i < MAX_PAN_CONNS; i++)
{
- BTIF_TRACE_DEBUG2("conns[%d]:%d", i, btpan_cb.conns[i].handle);
+ BTIF_TRACE_DEBUG("conns[%d]:%d", i, btpan_cb.conns[i].handle);
if(btpan_cb.conns[i].handle == -1)
{
- BTIF_TRACE_DEBUG3("handle:%d, local_role:%d, remote_role:%d", handle, local_role, remote_role);
+ BTIF_TRACE_DEBUG("handle:%d, local_role:%d, remote_role:%d", handle, local_role, remote_role);
btpan_cb.conns[i].handle = handle;
bdcpy(btpan_cb.conns[i].peer, addr);
@@ -473,58 +527,51 @@
return &btpan_cb.conns[i];
}
}
- BTIF_TRACE_DEBUG1("MAX_PAN_CONNS:%d exceeded, return NULL as failed", MAX_PAN_CONNS);
+ BTIF_TRACE_DEBUG("MAX_PAN_CONNS:%d exceeded, return NULL as failed", MAX_PAN_CONNS);
return NULL;
}
void btpan_close_handle(btpan_conn_t *p)
{
- BTIF_TRACE_DEBUG1("btpan_close_handle : close handle %d", p->handle);
+ BTIF_TRACE_DEBUG("btpan_close_handle : close handle %d", p->handle);
p->handle = -1;
p->local_role = -1;
p->remote_role = -1;
memset(&p->peer, 0, 6);
}
-static inline int should_forward(tETH_HDR* hdr)
+
+static inline bool should_forward(tETH_HDR* hdr)
{
- if(ntohs(hdr->h_proto) == ETH_P_IP || ntohs(hdr->h_proto) == ETH_P_ARP)
- return TRUE;
- BTIF_TRACE_DEBUG1("unknown proto:%x", ntohs(hdr->h_proto));
- return FALSE;
+ uint16_t proto = ntohs(hdr->h_proto);
+ if(proto == ETH_P_IP || proto == ETH_P_ARP || proto == ETH_P_IPV6)
+ return true;
+ BTIF_TRACE_DEBUG("unknown proto:%x", proto);
+ return false;
}
-#if BTA_PAN_INCLUDED == TRUE
-extern void bta_pan_ci_rx_write(UINT16 handle, BD_ADDR dst, BD_ADDR src, UINT16 protocol,
- UINT8 *p_data, UINT16 len, BOOLEAN ext);
-#else
-static void bta_pan_ci_rx_write(UINT16 handle, BD_ADDR dst, BD_ADDR src, UINT16 protocol,
- UINT8 *p_data, UINT16 len, BOOLEAN ext)
-{
- UNUSED(handle);
- UNUSED(dst);
- UNUSED(src);
- UNUSED(protocol);
- UNUSED(p_data);
- UNUSED(len);
- UNUSED(ext);
-}
-#endif
-static void forward_bnep(tETH_HDR* eth_hdr, char * packet, int size)
-{
+
+static int forward_bnep(tETH_HDR* eth_hdr, BT_HDR *hdr) {
int broadcast = eth_hdr->h_dest[0] & 1;
int i;
- for(i = 0; i < MAX_PAN_CONNS; i++)
- {
+
+ // Find the right connection to send this frame over.
+ for (i = 0; i < MAX_PAN_CONNS; i++) {
UINT16 handle = btpan_cb.conns[i].handle;
- if(handle != (UINT16)-1 &&
+ if (handle != (UINT16)-1 &&
(broadcast || memcmp(btpan_cb.conns[i].eth_addr, eth_hdr->h_dest, sizeof(BD_ADDR)) == 0
- || memcmp(btpan_cb.conns[i].peer, eth_hdr->h_dest, sizeof(BD_ADDR)) == 0))
- {
- BTIF_TRACE_DEBUG1("calling bta_pan_ci_rx_write, handle:%d", handle);
- bta_pan_ci_rx_write(handle, eth_hdr->h_dest, eth_hdr->h_src,
- ntohs(eth_hdr->h_proto), (UINT8*)packet, size, 0);
- break;
+ || memcmp(btpan_cb.conns[i].peer, eth_hdr->h_dest, sizeof(BD_ADDR)) == 0)) {
+ int result = PAN_WriteBuf(handle, eth_hdr->h_dest, eth_hdr->h_src, ntohs(eth_hdr->h_proto), hdr, 0);
+ switch (result) {
+ case PAN_Q_SIZE_EXCEEDED:
+ return FORWARD_CONGEST;
+ case PAN_SUCCESS:
+ return FORWARD_SUCCESS;
+ default:
+ return FORWARD_FAILURE;
+ }
}
}
+ GKI_freebuf(hdr);
+ return FORWARD_IGNORE;
}
static void bta_pan_callback_transfer(UINT16 event, char *p_param)
@@ -533,7 +580,7 @@
switch(event)
{
case BTA_PAN_ENABLE_EVT:
- BTIF_TRACE_DEBUG0("BTA_PAN_ENABLE_EVT");
+ BTIF_TRACE_DEBUG("BTA_PAN_ENABLE_EVT");
break;
case BTA_PAN_SET_ROLE_EVT:
{
@@ -548,7 +595,7 @@
btpan_conn_t* conn;
bdstr_t bds;
bd2str((bt_bdaddr_t*)p_data->opening.bd_addr, &bds);
- BTIF_TRACE_DEBUG2("BTA_PAN_OPENING_EVT handle %d, addr: %s", p_data->opening.handle, bds);
+ BTIF_TRACE_DEBUG("BTA_PAN_OPENING_EVT handle %d, addr: %s", p_data->opening.handle, bds);
conn = btpan_find_conn_addr(p_data->opening.bd_addr);
asrt(conn != NULL);
@@ -561,7 +608,7 @@
(const bt_bdaddr_t*)p_data->opening.bd_addr, btpan_conn_local_role, btpan_remote_role);
}
else
- BTIF_TRACE_ERROR0("connection not found");
+ BTIF_TRACE_ERROR("connection not found");
break;
}
case BTA_PAN_OPEN_EVT:
@@ -572,6 +619,9 @@
/* p_data->open.bd_addr[3], p_data->open.bd_addr[4], p_data->open.bd_addr[5]); */
btpan_connection_state_t state;
bt_status_t status;
+ btpan_conn_t *conn = btpan_find_conn_handle(p_data->open.handle);
+
+ ALOGV("%s pan connection open status: %d", __func__, p_data->open.status);
if(p_data->open.status == BTA_PAN_SUCCESS)
{
state = BTPAN_STATE_CONNECTED;
@@ -581,8 +631,8 @@
{
state = BTPAN_STATE_DISCONNECTED;
status = BT_STATUS_FAIL;
+ btpan_cleanup_conn(conn);
}
- btpan_conn_t* conn = btpan_find_conn_handle(p_data->open.handle);
/* debug("BTA_PAN_OPEN_EVT handle:%d, conn:%p", p_data->open.handle, conn); */
/* debug("conn bta local_role:%d, bta remote role:%d", conn->local_role, conn->remote_role); */
int btpan_conn_local_role = bta_role_to_btpan(p_data->open.local_role);
@@ -608,11 +658,11 @@
btpan_cleanup_conn(conn);
}
else
- BTIF_TRACE_ERROR1("pan handle not found (%d)", p_data->close.handle);
+ BTIF_TRACE_ERROR("pan handle not found (%d)", p_data->close.handle);
break;
}
default:
- BTIF_TRACE_WARNING1("Unknown pan event %d", event);
+ BTIF_TRACE_WARNING("Unknown pan event %d", event);
break;
}
}
@@ -621,36 +671,100 @@
{
btif_transfer_context(bta_pan_callback_transfer, event, (char*)p_data, sizeof(tBTA_PAN), NULL);
}
-#define MAX_PACKET_SIZE 2000
-static void btpan_tap_fd_signaled(int fd, int type, int flags, uint32_t user_id)
-{
- char packet[MAX_PACKET_SIZE];
- tETH_HDR eth_hdr;
- UNUSED(type);
- UNUSED(user_id);
- if(flags & SOCK_THREAD_FD_EXCEPTION)
- {
- BTIF_TRACE_ERROR1("pan tap fd:%d exception", fd);
- }
- else if(flags & SOCK_THREAD_FD_RD)
- {
- /* debug("tab fd read trigged, data"); */
- int size = read(fd, packet, MAX_PACKET_SIZE);
- /* debug("tap fd read trigged, read size:%d", size); */
- memcpy(ð_hdr, &packet, sizeof(tETH_HDR));
- /* debug("eth src = %02x:%02x:%02x:%02x:%02x:%02x", */
- /* eth_hdr.h_src[0], eth_hdr.h_src[1], eth_hdr.h_src[2], eth_hdr.h_src[3], */
- /* eth_hdr.h_src[4], eth_hdr.h_src[5]); */
- /* debug("eth dest = %02x:%02x:%02x:%02x:%02x:%02x", */
- /* eth_hdr.h_dest[0], eth_hdr.h_dest[1], eth_hdr.h_dest[2], eth_hdr.h_dest[3], */
- /* eth_hdr.h_dest[4], eth_hdr.h_dest[5]); */
- //dump_bin("eth packet received", packet, size);
- if(should_forward(ð_hdr))
- {
- forward_bnep(ð_hdr, packet + sizeof(tETH_HDR), size - sizeof(tETH_HDR));
+#define IS_EXCEPTION(e) ((e) & (POLLHUP | POLLRDHUP | POLLERR | POLLNVAL))
+static void btu_exec_tap_fd_read(void *p_param) {
+ struct pollfd ufd;
+ int fd = (int)p_param;
+
+ if (fd == -1 || fd != btpan_cb.tap_fd)
+ return;
+
+ // Don't occupy BTU context too long, avoid GKI buffer overruns and
+ // give other profiles a chance to run by limiting the amount of memory
+ // PAN can use from the shared pool buffer.
+ for(int i = 0; i < PAN_POOL_MAX && btif_is_enabled() && btpan_cb.flow; i++) {
+ BT_HDR *buffer = (BT_HDR *)GKI_getpoolbuf(PAN_POOL_ID);
+ if (!buffer) {
+ BTIF_TRACE_WARNING("%s unable to allocate buffer for packet.", __func__);
+ break;
}
- btsock_thread_add_fd(pth, fd, 0, SOCK_THREAD_FD_RD | SOCK_THREAD_ADD_FD_SYNC, 0);
+ buffer->offset = PAN_MINIMUM_OFFSET;
+ buffer->len = GKI_get_buf_size(buffer) - sizeof(BT_HDR) - buffer->offset;
+
+ UINT8 *packet = (UINT8 *)buffer + sizeof(BT_HDR) + buffer->offset;
+
+ // If we don't have an undelivered packet left over, pull one from the TAP driver.
+ // We save it in the congest_packet right away in case we can't deliver it in this
+ // attempt.
+ if (!btpan_cb.congest_packet_size) {
+ ssize_t ret = read(fd, btpan_cb.congest_packet, sizeof(btpan_cb.congest_packet));
+ switch (ret) {
+ case -1:
+ BTIF_TRACE_ERROR("%s unable to read from driver: %s", __func__, strerror(errno));
+ GKI_freebuf(buffer);
+ return;
+ case 0:
+ BTIF_TRACE_WARNING("%s end of file reached.", __func__);
+ GKI_freebuf(buffer);
+ return;
+ default:
+ btpan_cb.congest_packet_size = ret;
+ break;
+ }
+ }
+
+ memcpy(packet, btpan_cb.congest_packet, MIN(btpan_cb.congest_packet_size, buffer->len));
+ buffer->len = MIN(btpan_cb.congest_packet_size, buffer->len);
+
+ if (buffer->len > sizeof(tETH_HDR) && should_forward((tETH_HDR *)packet)) {
+ // Extract the ethernet header from the buffer since the PAN_WriteBuf inside
+ // forward_bnep can't handle two pointers that point inside the same GKI buffer.
+ tETH_HDR hdr;
+ memcpy(&hdr, packet, sizeof(tETH_HDR));
+
+ // Skip the ethernet header.
+ buffer->len -= sizeof(tETH_HDR);
+ buffer->offset += sizeof(tETH_HDR);
+ if (forward_bnep(&hdr, buffer) != FORWARD_CONGEST)
+ btpan_cb.congest_packet_size = 0;
+ } else {
+ BTIF_TRACE_WARNING("%s dropping packet of length %d", __func__, buffer->len);
+ btpan_cb.congest_packet_size = 0;
+ GKI_freebuf(buffer);
+ }
+
+ // Bail out of the loop if reading from the TAP fd would block.
+ ufd.fd = fd;
+ ufd.events = POLLIN;
+ ufd.revents = 0;
+ if(poll(&ufd, 1, 0) <= 0 || IS_EXCEPTION(ufd.revents)) {
+ btsock_thread_add_fd(pan_pth, fd, 0, SOCK_THREAD_FD_RD, 0);
+ return;
+ }
}
}
+static void btif_pan_close_all_conns() {
+ int i;
+ if (!stack_initialized)
+ return;
+
+ for (i = 0; i < MAX_PAN_CONNS; ++i)
+ if (btpan_cb.conns[i].handle != -1)
+ BTA_PanClose(btpan_cb.conns[i].handle);
+}
+
+static void btpan_tap_fd_signaled(int fd, int type, int flags, uint32_t user_id) {
+ assert(btpan_cb.tap_fd == fd);
+
+ if (btpan_cb.tap_fd != fd)
+ return;
+
+ if(flags & SOCK_THREAD_FD_EXCEPTION) {
+ btpan_cb.tap_fd = -1;
+ btpan_tap_close(fd);
+ btif_pan_close_all_conns();
+ } else if(flags & SOCK_THREAD_FD_RD)
+ bta_dmexecutecallback(btu_exec_tap_fd_read, (void *)fd);
+}
diff --git a/btif/src/btif_profile_queue.c b/btif/src/btif_profile_queue.c
index 4af3b53..12cec2e 100644
--- a/btif/src/btif_profile_queue.c
+++ b/btif/src/btif_profile_queue.c
@@ -30,6 +30,7 @@
#include "btif_common.h"
#include "btif_profile_queue.h"
#include "gki.h"
+#include "list.h"
/*******************************************************************************
** Local type definitions
@@ -37,81 +38,64 @@
typedef enum {
BTIF_QUEUE_CONNECT_EVT,
- BTIF_QUEUE_ADVANCE_EVT
+ BTIF_QUEUE_ADVANCE_EVT,
} btif_queue_event_t;
-typedef struct connect_node_tag
-{
+typedef struct {
bt_bdaddr_t bda;
uint16_t uuid;
- uint16_t busy;
- void *p_cb;
- struct connect_node_tag *p_next;
-} __attribute__((packed))connect_node_t;
-
+ bool busy;
+ btif_connect_cb_t connect_cb;
+} connect_node_t;
/*******************************************************************************
** Static variables
*******************************************************************************/
-static connect_node_t *connect_queue;
-
+static list_t *connect_queue;
/*******************************************************************************
** Queue helper functions
*******************************************************************************/
-static void queue_int_add(connect_node_t *p_param)
-{
- connect_node_t *p_list = connect_queue;
+static void queue_int_add(connect_node_t *p_param) {
connect_node_t *p_node = GKI_getbuf(sizeof(connect_node_t));
ASSERTC(p_node != NULL, "Failed to allocate new list node", 0);
memcpy(p_node, p_param, sizeof(connect_node_t));
- if (connect_queue == NULL)
- {
- connect_queue = p_node;
- return;
+ if (!connect_queue) {
+ connect_queue = list_new(GKI_freebuf);
+ ASSERTC(connect_queue != NULL, "Failed to allocate list", 0);
}
- while (p_list->p_next)
- p_list = p_list->p_next;
- p_list->p_next = p_node;
+ list_append(connect_queue, p_node);
}
-static void queue_int_advance()
-{
- connect_node_t *p_head = connect_queue;
- if (connect_queue == NULL)
- return;
-
- connect_queue = connect_queue->p_next;
- GKI_freebuf(p_head);
+static void queue_int_advance() {
+ if (connect_queue && !list_is_empty(connect_queue))
+ list_remove(connect_queue, list_front(connect_queue));
}
-static bt_status_t queue_int_connect_next()
-{
- connect_node_t* p_head = connect_queue;
-
- if (p_head == NULL)
+static bt_status_t queue_int_connect_next() {
+ if (!connect_queue || list_is_empty(connect_queue))
return BT_STATUS_FAIL;
- /* If the queue is currently busy, we return success anyway,
- * since the connection has been queued... */
- if (p_head->busy != FALSE)
+ connect_node_t *p_head = list_front(connect_queue);
+
+ // If the queue is currently busy, we return success anyway,
+ // since the connection has been queued...
+ if (p_head->busy)
return BT_STATUS_SUCCESS;
- p_head->busy = TRUE;
- return (*(btif_connect_cb_t*)p_head->p_cb)(&p_head->bda);
+ p_head->busy = true;
+ return p_head->connect_cb(&p_head->bda, p_head->uuid);
}
-static void queue_int_handle_evt(UINT16 event, char *p_param)
-{
- switch(event)
- {
+static void queue_int_handle_evt(UINT16 event, char *p_param) {
+ switch(event) {
case BTIF_QUEUE_CONNECT_EVT:
- queue_int_add((connect_node_t*)p_param);
+ queue_int_add((connect_node_t *)p_param);
break;
case BTIF_QUEUE_ADVANCE_EVT:
@@ -132,17 +116,15 @@
** Returns BT_STATUS_SUCCESS if successful
**
*******************************************************************************/
-bt_status_t btif_queue_connect(uint16_t uuid, const bt_bdaddr_t *bda,
- btif_connect_cb_t *connect_cb)
-{
+bt_status_t btif_queue_connect(uint16_t uuid, const bt_bdaddr_t *bda, btif_connect_cb_t connect_cb) {
connect_node_t node;
memset(&node, 0, sizeof(connect_node_t));
- memcpy(&(node.bda), bda, sizeof(bt_bdaddr_t));
+ memcpy(&node.bda, bda, sizeof(bt_bdaddr_t));
node.uuid = uuid;
- node.p_cb = connect_cb;
+ node.connect_cb = connect_cb;
return btif_transfer_context(queue_int_handle_evt, BTIF_QUEUE_CONNECT_EVT,
- (char*)&node, sizeof(connect_node_t), NULL);
+ (char *)&node, sizeof(connect_node_t), NULL);
}
/*******************************************************************************
@@ -155,13 +137,11 @@
** Returns void
**
*******************************************************************************/
-void btif_queue_advance()
-{
+void btif_queue_advance() {
btif_transfer_context(queue_int_handle_evt, BTIF_QUEUE_ADVANCE_EVT,
NULL, 0, NULL);
}
-
/*******************************************************************************
**
** Function btif_queue_release
@@ -171,17 +151,7 @@
** Returns void
**
*******************************************************************************/
-void btif_queue_release()
-{
- connect_node_t *current = connect_queue;
-
- while (current != NULL)
- {
- connect_node_t *next = current->p_next;
- GKI_freebuf(current);
- current = next;
- }
-
+void btif_queue_release() {
+ list_free(connect_queue);
connect_queue = NULL;
}
-
diff --git a/btif/src/btif_rc.c b/btif/src/btif_rc.c
old mode 100755
new mode 100644
index 068d096..de6c328
--- a/btif/src/btif_rc.c
+++ b/btif/src/btif_rc.c
@@ -62,10 +62,10 @@
#define MAX_CMD_QUEUE_LEN 8
#define CHECK_RC_CONNECTED \
- BTIF_TRACE_DEBUG1("## %s ##", __FUNCTION__); \
+ BTIF_TRACE_DEBUG("## %s ##", __FUNCTION__); \
if(btif_rc_cb.rc_connected == FALSE) \
{ \
- BTIF_TRACE_WARNING1("Function %s() called when RC is not connected", __FUNCTION__); \
+ BTIF_TRACE_WARNING("Function %s() called when RC is not connected", __FUNCTION__); \
return BT_STATUS_NOT_READY; \
}
@@ -80,7 +80,7 @@
{ \
if(btif_rc_cb.rc_pdu_info[index].is_rsp_pending == FALSE) \
{ \
- BTIF_TRACE_WARNING1("%s Not sending response as no PDU was registered", __FUNCTION__); \
+ BTIF_TRACE_WARNING("%s Not sending response as no PDU was registered", __FUNCTION__); \
return BT_STATUS_UNHANDLED; \
} \
send_metamsg_rsp(btif_rc_cb.rc_handle, btif_rc_cb.rc_pdu_info[index].label, \
@@ -180,7 +180,12 @@
static const UINT8 rc_white_addr_prefix[][3] = {
{0x94, 0xCE, 0x2C}, // Sony SBH50
- {0x30, 0x17, 0xC8} // Sony wm600
+ {0x30, 0x17, 0xC8} // Sony wm600
+};
+
+static const char* rc_white_name[] = {
+ "SBH50",
+ "MW600"
};
static void send_reject_response (UINT8 rc_handle, UINT8 label,
@@ -204,6 +209,7 @@
******************************************************************************/
static btif_rc_cb_t btif_rc_cb;
static btrc_callbacks_t *bt_rc_callbacks = NULL;
+static btrc_ctrl_callbacks_t *bt_rc_ctrl_callbacks = NULL;
/*****************************************************************************
** Static functions
@@ -226,7 +232,7 @@
int send_event (int fd, uint16_t type, uint16_t code, int32_t value)
{
struct uinput_event event;
- BTIF_TRACE_DEBUG4("%s type:%u code:%u value:%d", __FUNCTION__,
+ BTIF_TRACE_DEBUG("%s type:%u code:%u value:%d", __FUNCTION__,
type, code, value);
memset(&event, 0, sizeof(event));
event.type = type;
@@ -238,7 +244,7 @@
void send_key (int fd, uint16_t key, int pressed)
{
- BTIF_TRACE_DEBUG4("%s fd:%d key:%u pressed:%d", __FUNCTION__,
+ BTIF_TRACE_DEBUG("%s fd:%d key:%u pressed:%d", __FUNCTION__,
fd, key, pressed);
if (fd < 0)
@@ -246,7 +252,7 @@
return;
}
- BTIF_TRACE_DEBUG3("AVRCP: Send key %d (%d) fd=%d", key, pressed, fd);
+ BTIF_TRACE_DEBUG("AVRCP: Send key %d (%d) fd=%d", key, pressed, fd);
send_event(fd, EV_KEY, key, pressed);
send_event(fd, EV_SYN, SYN_REPORT, 0);
}
@@ -261,7 +267,7 @@
return 0;
}
}
- BTIF_TRACE_ERROR1("%s ERROR: uinput device is not in the system", __FUNCTION__);
+ BTIF_TRACE_ERROR("%s ERROR: uinput device is not in the system", __FUNCTION__);
return -1;
}
@@ -278,7 +284,7 @@
break;
}
if (x == MAX_UINPUT_PATHS) {
- BTIF_TRACE_ERROR1("%s ERROR: uinput device open failed", __FUNCTION__);
+ BTIF_TRACE_ERROR("%s ERROR: uinput device open failed", __FUNCTION__);
return -1;
}
memset(&dev, 0, sizeof(dev));
@@ -291,7 +297,7 @@
dev.id.version = 0x0000;
if (write(fd, &dev, sizeof(dev)) < 0) {
- BTIF_TRACE_ERROR1("%s Unable to write device information", __FUNCTION__);
+ BTIF_TRACE_ERROR("%s Unable to write device information", __FUNCTION__);
close(fd);
return -1;
}
@@ -307,7 +313,7 @@
ioctl(fd, UI_SET_KEYBIT, x);
if (ioctl(fd, UI_DEV_CREATE, NULL) < 0) {
- BTIF_TRACE_ERROR1("%s Unable to create uinput device", __FUNCTION__);
+ BTIF_TRACE_ERROR("%s Unable to create uinput device", __FUNCTION__);
close(fd);
return -1;
}
@@ -318,13 +324,13 @@
{
char *name = "AVRCP";
- BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s", __FUNCTION__);
uinput_fd = uinput_create(name);
if (uinput_fd < 0) {
- BTIF_TRACE_ERROR3("%s AVRCP: Failed to initialize uinput for %s (%d)",
+ BTIF_TRACE_ERROR("%s AVRCP: Failed to initialize uinput for %s (%d)",
__FUNCTION__, name, uinput_fd);
} else {
- BTIF_TRACE_DEBUG3("%s AVRCP: Initialized uinput for %s (fd=%d)",
+ BTIF_TRACE_DEBUG("%s AVRCP: Initialized uinput for %s (fd=%d)",
__FUNCTION__, name, uinput_fd);
}
return uinput_fd;
@@ -332,7 +338,7 @@
void close_uinput (void)
{
- BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s", __FUNCTION__);
if (uinput_fd > 0) {
ioctl(uinput_fd, UI_DEV_DESTROY);
@@ -365,11 +371,11 @@
{
rc_features |= BTRC_FEAT_METADATA;
}
- BTIF_TRACE_DEBUG2("%s: rc_features=0x%x", __FUNCTION__, rc_features);
+ BTIF_TRACE_DEBUG("%s: rc_features=0x%x", __FUNCTION__, rc_features);
HAL_CBACK(bt_rc_callbacks, remote_features_cb, &rc_addr, rc_features)
#if (AVRC_ADV_CTRL_INCLUDED == TRUE)
- BTIF_TRACE_DEBUG1("Checking for feature flags in btif_rc_handler with label %d",
+ BTIF_TRACE_DEBUG("Checking for feature flags in btif_rc_handler with label %d",
btif_rc_cb.rc_vol_label);
// Register for volume change on connect
if(btif_rc_cb.rc_features & BTA_AV_FEAT_ADV_CTRL &&
@@ -386,7 +392,7 @@
p_transaction=get_transaction_by_lbl(btif_rc_cb.rc_vol_label);
if(NULL!=p_transaction)
{
- BTIF_TRACE_DEBUG1("register_volumechange already in progress for label %d",
+ BTIF_TRACE_DEBUG("register_volumechange already in progress for label %d",
btif_rc_cb.rc_vol_label);
return;
}
@@ -414,10 +420,13 @@
***************************************************************************/
void handle_rc_connect (tBTA_AV_RC_OPEN *p_rc_open)
{
- BTIF_TRACE_DEBUG2("%s: rc_handle: %d", __FUNCTION__, p_rc_open->rc_handle);
+ BTIF_TRACE_DEBUG("%s: rc_handle: %d", __FUNCTION__, p_rc_open->rc_handle);
bt_status_t result = BT_STATUS_SUCCESS;
int i;
char bd_str[18];
+#if (AVRC_CTLR_INCLUDED == TRUE)
+ bt_bdaddr_t rc_addr;
+#endif
if(p_rc_open->status == BTA_AV_SUCCESS)
{
@@ -438,10 +447,17 @@
{
init_uinput();
}
+#if (AVRC_CTLR_INCLUDED == TRUE)
+ bdcpy(rc_addr.address, btif_rc_cb.rc_addr);
+ /* report connection state if device is AVRCP target */
+ if (btif_rc_cb.rc_features & BTA_AV_FEAT_RCTG) {
+ HAL_CBACK(bt_rc_ctrl_callbacks, connection_state_cb, TRUE, &rc_addr);
+ }
+#endif
}
else
{
- BTIF_TRACE_ERROR2("%s Connect failed with error code: %d",
+ BTIF_TRACE_ERROR("%s Connect failed with error code: %d",
__FUNCTION__, p_rc_open->status);
btif_rc_cb.rc_connected = FALSE;
}
@@ -457,16 +473,34 @@
***************************************************************************/
void handle_rc_disconnect (tBTA_AV_RC_CLOSE *p_rc_close)
{
- BTIF_TRACE_DEBUG2("%s: rc_handle: %d", __FUNCTION__, p_rc_close->rc_handle);
+#if (AVRC_CTLR_INCLUDED == TRUE)
+ bt_bdaddr_t rc_addr;
+ tBTA_AV_FEAT features;
+#endif
+ BTIF_TRACE_DEBUG("%s: rc_handle: %d", __FUNCTION__, p_rc_close->rc_handle);
btif_rc_cb.rc_handle = 0;
btif_rc_cb.rc_connected = FALSE;
memset(btif_rc_cb.rc_addr, 0, sizeof(BD_ADDR));
+ memset(btif_rc_cb.rc_notif, 0, sizeof(btif_rc_cb.rc_notif));
+#if (AVRC_CTLR_INCLUDED == TRUE)
+ features = btif_rc_cb.rc_features;
+#endif
btif_rc_cb.rc_features = 0;
btif_rc_cb.rc_vol_label=MAX_LABEL;
btif_rc_cb.rc_volume=MAX_VOLUME;
init_all_transactions();
close_uinput();
+#if (AVRC_CTLR_INCLUDED == TRUE)
+ bdcpy(rc_addr.address, btif_rc_cb.rc_addr);
+#endif
+ memset(btif_rc_cb.rc_addr, 0, sizeof(BD_ADDR));
+#if (AVRC_CTLR_INCLUDED == TRUE)
+ /* report connection state if device is AVRCP target */
+ if (features & BTA_AV_FEAT_RCTG) {
+ HAL_CBACK(bt_rc_ctrl_callbacks, connection_state_cb, FALSE, &rc_addr);
+ }
+#endif
}
/***************************************************************************
@@ -483,7 +517,7 @@
const char *status;
int pressed, i;
- BTIF_TRACE_DEBUG2("%s: p_remote_cmd->rc_id=%d", __FUNCTION__, p_remote_cmd->rc_id);
+ BTIF_TRACE_DEBUG("%s: p_remote_cmd->rc_id=%d", __FUNCTION__, p_remote_cmd->rc_id);
/* If AVRC is open and peer sends PLAY but there is no AVDT, then we queue-up this PLAY */
if (p_remote_cmd)
@@ -493,7 +527,7 @@
{
if (p_remote_cmd->key_state == AVRC_STATE_PRESS)
{
- APPL_TRACE_WARNING1("%s: AVDT not open, queuing the PLAY command", __FUNCTION__);
+ APPL_TRACE_WARNING("%s: AVDT not open, queuing the PLAY command", __FUNCTION__);
btif_rc_cb.rc_pending_play = TRUE;
}
return;
@@ -501,7 +535,7 @@
if ((p_remote_cmd->rc_id == BTA_AV_RC_PAUSE) && (btif_rc_cb.rc_pending_play))
{
- APPL_TRACE_WARNING1("%s: Clear the pending PLAY on PAUSE received", __FUNCTION__);
+ APPL_TRACE_WARNING("%s: Clear the pending PLAY on PAUSE received", __FUNCTION__);
btif_rc_cb.rc_pending_play = FALSE;
return;
}
@@ -525,7 +559,7 @@
(btif_hf_call_terminated_recently() == TRUE) &&
(check_cod( (const bt_bdaddr_t*)&(btif_rc_cb.rc_addr), COD_AV_HEADSETS) != TRUE))
{
- BTIF_TRACE_DEBUG2("%s:Dropping the play/Pause command received right after call end cmd:%d",
+ BTIF_TRACE_DEBUG("%s:Dropping the play/Pause command received right after call end cmd:%d",
__FUNCTION__,p_remote_cmd->rc_id);
return;
}
@@ -537,7 +571,7 @@
for (i = 0; key_map[i].name != NULL; i++) {
if (p_remote_cmd->rc_id == key_map[i].avrcp) {
- BTIF_TRACE_DEBUG3("%s: %s %s", __FUNCTION__, key_map[i].name, status);
+ BTIF_TRACE_DEBUG("%s: %s %s", __FUNCTION__, key_map[i].name, status);
/* MusicPlayer uses a long_press_timeout of 1 second for PLAYPAUSE button
* and maps that to autoshuffle. So if for some reason release for PLAY/PAUSE
@@ -548,7 +582,7 @@
*/
if ((key_map[i].release_quirk == 1) && (pressed == 0))
{
- BTIF_TRACE_DEBUG2("%s: AVRC %s Release Faked earlier, drowned now",
+ BTIF_TRACE_DEBUG("%s: AVRC %s Release Faked earlier, drowned now",
__FUNCTION__, key_map[i].name);
return;
}
@@ -556,7 +590,7 @@
if ((key_map[i].release_quirk == 1) && (pressed == 1))
{
GKI_delay(30); // 30ms
- BTIF_TRACE_DEBUG2("%s: AVRC %s Release quirk enabled, send release now",
+ BTIF_TRACE_DEBUG("%s: AVRC %s Release quirk enabled, send release now",
__FUNCTION__, key_map[i].name);
send_key(uinput_fd, key_map[i].mapped_id, 0);
}
@@ -565,10 +599,50 @@
}
if (key_map[i].name == NULL)
- BTIF_TRACE_ERROR3("%s AVRCP: unknown button 0x%02X %s", __FUNCTION__,
+ BTIF_TRACE_ERROR("%s AVRCP: unknown button 0x%02X %s", __FUNCTION__,
p_remote_cmd->rc_id, status);
}
+/***************************************************************************
+ * Function handle_rc_passthrough_rsp
+ *
+ * - Argument: tBTA_AV_REMOTE_RSP passthrough command response
+ *
+ * - Description: Remote control passthrough response handler
+ *
+ ***************************************************************************/
+void handle_rc_passthrough_rsp ( tBTA_AV_REMOTE_RSP *p_remote_rsp)
+{
+#if (AVRC_CTLR_INCLUDED == TRUE)
+ const char *status;
+ if (btif_rc_cb.rc_features & BTA_AV_FEAT_RCTG)
+ {
+ int key_state;
+ if (p_remote_rsp->key_state == AVRC_STATE_RELEASE)
+ {
+ status = "released";
+ key_state = 1;
+ }
+ else
+ {
+ status = "pressed";
+ key_state = 0;
+ }
+
+ BTIF_TRACE_DEBUG("%s: rc_id=%d status=%s", __FUNCTION__, p_remote_rsp->rc_id, status);
+
+ release_transaction(p_remote_rsp->label);
+ HAL_CBACK(bt_rc_ctrl_callbacks, passthrough_rsp_cb, p_remote_rsp->rc_id, key_state);
+ }
+ else
+ {
+ BTIF_TRACE_ERROR("%s DUT does not support AVRCP controller role", __FUNCTION__);
+ }
+#else
+ BTIF_TRACE_ERROR("%s AVRCP controller role is not enabled", __FUNCTION__);
+#endif
+}
+
void handle_uid_changed_notification(tBTA_AV_META_MSG *pmeta_msg, tAVRC_COMMAND *pavrc_command)
{
tAVRC_RESPONSE avrc_rsp = {0};
@@ -602,16 +676,16 @@
tAVRC_STS status;
int param_len;
- BTIF_TRACE_EVENT1("+ %s", __FUNCTION__);
+ BTIF_TRACE_EVENT("+ %s", __FUNCTION__);
if (pmeta_msg->p_msg->hdr.opcode != AVRC_OP_VENDOR)
{
- BTIF_TRACE_WARNING1("Invalid opcode: %x", pmeta_msg->p_msg->hdr.opcode);
+ BTIF_TRACE_WARNING("Invalid opcode: %x", pmeta_msg->p_msg->hdr.opcode);
return;
}
if (pmeta_msg->len < 3)
{
- BTIF_TRACE_WARNING2("Invalid length.Opcode: 0x%x, len: 0x%x", pmeta_msg->p_msg->hdr.opcode,
+ BTIF_TRACE_WARNING("Invalid length.Opcode: 0x%x, len: 0x%x", pmeta_msg->p_msg->hdr.opcode,
pmeta_msg->len);
return;
}
@@ -628,14 +702,14 @@
}
else
{
- BTIF_TRACE_DEBUG3("%s:Discard vendor dependent rsp. code: %d label:%d.",
+ BTIF_TRACE_DEBUG("%s:Discard vendor dependent rsp. code: %d label:%d.",
__FUNCTION__, pmeta_msg->code, pmeta_msg->label);
}
return;
}
#else
{
- BTIF_TRACE_DEBUG3("%s:Received vendor dependent rsp. code: %d len: %d. Not processing it.",
+ BTIF_TRACE_DEBUG("%s:Received vendor dependent rsp. code: %d len: %d. Not processing it.",
__FUNCTION__, pmeta_msg->code, pmeta_msg->len);
return;
}
@@ -643,13 +717,13 @@
}
status=AVRC_ParsCommand(pmeta_msg->p_msg, &avrc_command, scratch_buf, sizeof(scratch_buf));
- BTIF_TRACE_DEBUG3("Received vendor command.code,PDU and label: %d, %d,%d",pmeta_msg->code,
+ BTIF_TRACE_DEBUG("Received vendor command.code,PDU and label: %d, %d,%d",pmeta_msg->code,
avrc_command.cmd.pdu, pmeta_msg->label);
if (status != AVRC_STS_NO_ERROR)
{
/* return error */
- BTIF_TRACE_WARNING2("%s: Error in parsing received metamsg command. status: 0x%02x",
+ BTIF_TRACE_WARNING("%s: Error in parsing received metamsg command. status: 0x%02x",
__FUNCTION__, status);
send_reject_response(pmeta_msg->rc_handle, pmeta_msg->label, avrc_command.pdu, status);
}
@@ -661,7 +735,7 @@
{
UINT8 event_id = avrc_command.reg_notif.event_id;
param_len = sizeof(tAVRC_REG_NOTIF_CMD);
- BTIF_TRACE_EVENT4("%s:New register notification received.event_id:%s,label:0x%x,code:%x",
+ BTIF_TRACE_EVENT("%s:New register notification received.event_id:%s,label:0x%x,code:%x",
__FUNCTION__,dump_rc_notification_event_id(event_id), pmeta_msg->label,pmeta_msg->code);
btif_rc_cb.rc_notif[event_id-1].bNotify = TRUE;
btif_rc_cb.rc_notif[event_id-1].label = pmeta_msg->label;
@@ -674,7 +748,7 @@
}
- BTIF_TRACE_EVENT2("%s: Passing received metamsg command to app. pdu: %s",
+ BTIF_TRACE_EVENT("%s: Passing received metamsg command to app. pdu: %s",
__FUNCTION__, dump_rc_pdu(avrc_command.cmd.pdu));
/* Since handle_rc_metamsg_cmd() itself is called from
@@ -694,12 +768,12 @@
***************************************************************************/
void btif_rc_handler(tBTA_AV_EVT event, tBTA_AV *p_data)
{
- BTIF_TRACE_DEBUG2 ("%s event:%s", __FUNCTION__, dump_rc_event(event));
+ BTIF_TRACE_DEBUG ("%s event:%s", __FUNCTION__, dump_rc_event(event));
switch (event)
{
case BTA_AV_RC_OPEN_EVT:
{
- BTIF_TRACE_DEBUG1("Peer_features:%x", p_data->rc_open.peer_features);
+ BTIF_TRACE_DEBUG("Peer_features:%x", p_data->rc_open.peer_features);
handle_rc_connect( &(p_data->rc_open) );
}break;
@@ -710,30 +784,39 @@
case BTA_AV_REMOTE_CMD_EVT:
{
- BTIF_TRACE_DEBUG2("rc_id:0x%x key_state:%d", p_data->remote_cmd.rc_id,
+ BTIF_TRACE_DEBUG("rc_id:0x%x key_state:%d", p_data->remote_cmd.rc_id,
p_data->remote_cmd.key_state);
handle_rc_passthrough_cmd( (&p_data->remote_cmd) );
}
break;
+#if (AVRC_CTLR_INCLUDED == TRUE)
+ case BTA_AV_REMOTE_RSP_EVT:
+ {
+ BTIF_TRACE_DEBUG("RSP: rc_id:0x%x key_state:%d", p_data->remote_rsp.rc_id,
+ p_data->remote_rsp.key_state);
+ handle_rc_passthrough_rsp( (&p_data->remote_rsp) );
+ }
+ break;
+#endif
case BTA_AV_RC_FEAT_EVT:
{
- BTIF_TRACE_DEBUG1("Peer_features:%x", p_data->rc_feat.peer_features);
+ BTIF_TRACE_DEBUG("Peer_features:%x", p_data->rc_feat.peer_features);
btif_rc_cb.rc_features = p_data->rc_feat.peer_features;
handle_rc_features();
}
break;
case BTA_AV_META_MSG_EVT:
{
- BTIF_TRACE_DEBUG2("BTA_AV_META_MSG_EVT code:%d label:%d", p_data->meta_msg.code,
+ BTIF_TRACE_DEBUG("BTA_AV_META_MSG_EVT code:%d label:%d", p_data->meta_msg.code,
p_data->meta_msg.label);
- BTIF_TRACE_DEBUG3(" company_id:0x%x len:%d handle:%d", p_data->meta_msg.company_id,
+ BTIF_TRACE_DEBUG(" company_id:0x%x len:%d handle:%d", p_data->meta_msg.company_id,
p_data->meta_msg.len, p_data->meta_msg.rc_handle);
/* handle the metamsg command */
handle_rc_metamsg_cmd(&(p_data->meta_msg));
}
break;
default:
- BTIF_TRACE_DEBUG1("Unhandled RC event : 0x%x", event);
+ BTIF_TRACE_DEBUG("Unhandled RC event : 0x%x", event);
}
}
@@ -766,13 +849,13 @@
{
UNUSED(peer_addr);
- BTIF_TRACE_DEBUG2("%s: bSendToApp=%d", __FUNCTION__, bSendToApp);
+ BTIF_TRACE_DEBUG("%s: bSendToApp=%d", __FUNCTION__, bSendToApp);
if (btif_rc_cb.rc_pending_play)
{
if (bSendToApp)
{
tBTA_AV_REMOTE_CMD remote_cmd;
- APPL_TRACE_DEBUG1("%s: Sending queued PLAYED event to app", __FUNCTION__);
+ APPL_TRACE_DEBUG("%s: Sending queued PLAYED event to app", __FUNCTION__);
memset (&remote_cmd, 0, sizeof(tBTA_AV_REMOTE_CMD));
remote_cmd.rc_handle = btif_rc_cb.rc_handle;
@@ -812,7 +895,7 @@
if (AVRC_STS_NO_ERROR == (status = AVRC_BldResponse(rc_handle, &avrc_rsp, &p_msg)) )
{
- BTIF_TRACE_DEBUG4("%s:Sending error notification to handle:%d. pdu:%s,status:0x%02x",
+ BTIF_TRACE_DEBUG("%s:Sending error notification to handle:%d. pdu:%s,status:0x%02x",
__FUNCTION__, rc_handle, dump_rc_pdu(pdu), status);
BTA_AvMetaRsp(rc_handle, label, ctype, p_msg);
}
@@ -838,11 +921,11 @@
if (!pmetamsg_resp)
{
- BTIF_TRACE_WARNING1("%s: Invalid response received from application", __FUNCTION__);
+ BTIF_TRACE_WARNING("%s: Invalid response received from application", __FUNCTION__);
return;
}
- BTIF_TRACE_EVENT5("+%s: rc_handle: %d, label: %d, code: 0x%02x, pdu: %s", __FUNCTION__,
+ BTIF_TRACE_EVENT("+%s: rc_handle: %d, label: %d, code: 0x%02x, pdu: %s", __FUNCTION__,
rc_handle, label, code, dump_rc_pdu(pmetamsg_resp->rsp.pdu));
if (pmetamsg_resp->rsp.status != AVRC_STS_NO_ERROR)
@@ -881,7 +964,7 @@
/* de-register this notification for a CHANGED response */
btif_rc_cb.rc_notif[event_id-1].bNotify = FALSE;
- BTIF_TRACE_DEBUG4("%s rc_handle: %d. event_id: 0x%02d bNotify:%u", __FUNCTION__,
+ BTIF_TRACE_DEBUG("%s rc_handle: %d. event_id: 0x%02d bNotify:%u", __FUNCTION__,
btif_rc_cb.rc_handle, event_id, bNotify);
if (bNotify)
{
@@ -891,7 +974,7 @@
if (AVRC_STS_NO_ERROR == (status = AVRC_BldResponse(btif_rc_cb.rc_handle,
pmetamsg_resp, &p_msg)) )
{
- BTIF_TRACE_DEBUG3("%s Sending notification to rc_handle: %d. event_id: 0x%02d",
+ BTIF_TRACE_DEBUG("%s Sending notification to rc_handle: %d. event_id: 0x%02d",
__FUNCTION__, btif_rc_cb.rc_handle, event_id);
bSent = TRUE;
BTA_AvMetaRsp(btif_rc_cb.rc_handle, btif_rc_cb.rc_notif[event_id-1].label,
@@ -899,7 +982,7 @@
}
else
{
- BTIF_TRACE_WARNING2("%s failed to build metamsg response. status: 0x%02x",
+ BTIF_TRACE_WARNING("%s failed to build metamsg response. status: 0x%02x",
__FUNCTION__, status);
}
@@ -907,7 +990,7 @@
if (!bSent)
{
- BTIF_TRACE_DEBUG2("%s: Notification not sent, as there are no RC connections or the \
+ BTIF_TRACE_DEBUG("%s: Notification not sent, as there are no RC connections or the \
CT has not subscribed for event_id: %s", __FUNCTION__, dump_rc_notification_event_id(event_id));
}
}
@@ -926,7 +1009,7 @@
}
else
{
- BTIF_TRACE_ERROR2("%s: failed to build metamsg response. status: 0x%02x",
+ BTIF_TRACE_ERROR("%s: failed to build metamsg response. status: 0x%02x",
__FUNCTION__, status);
}
}
@@ -962,7 +1045,7 @@
*******************************************************************************/
static void btif_rc_upstreams_evt(UINT16 event, tAVRC_COMMAND *pavrc_cmd, UINT8 ctype, UINT8 label)
{
- BTIF_TRACE_EVENT5("%s pdu: %s handle: 0x%x ctype:%x label:%x", __FUNCTION__,
+ BTIF_TRACE_EVENT("%s pdu: %s handle: 0x%x ctype:%x label:%x", __FUNCTION__,
dump_rc_pdu(pavrc_cmd->pdu), btif_rc_cb.rc_handle, ctype, label);
switch (event)
@@ -1008,33 +1091,9 @@
}
else
{
- int attr_cnt, filled_attr_count;
-
- num_attr = 0;
- /* Attribute IDs from 1 to AVRC_MAX_NUM_MEDIA_ATTR_ID are only valid,
- * hence HAL definition limits the attributes to AVRC_MAX_NUM_MEDIA_ATTR_ID.
- * Fill only valid entries.
- */
- for (attr_cnt = 0; (attr_cnt < pavrc_cmd->get_elem_attrs.num_attr) &&
- (num_attr < AVRC_MAX_NUM_MEDIA_ATTR_ID); attr_cnt++)
- {
- if ((pavrc_cmd->get_elem_attrs.attrs[attr_cnt] > 0) &&
- (pavrc_cmd->get_elem_attrs.attrs[attr_cnt] <= AVRC_MAX_NUM_MEDIA_ATTR_ID))
- {
- /* Skip the duplicate entries : PTS sends duplicate entries for Fragment cases
- */
- for (filled_attr_count = 0; filled_attr_count < num_attr; filled_attr_count++)
- {
- if (element_attrs[filled_attr_count] == pavrc_cmd->get_elem_attrs.attrs[attr_cnt])
- break;
- }
- if (filled_attr_count == num_attr)
- {
- element_attrs[num_attr] = pavrc_cmd->get_elem_attrs.attrs[attr_cnt];
- num_attr++;
- }
- }
- }
+ num_attr = pavrc_cmd->get_elem_attrs.num_attr;
+ memcpy(element_attrs, pavrc_cmd->get_elem_attrs.attrs, sizeof(UINT32)
+ *pavrc_cmd->get_elem_attrs.num_attr);
}
FILL_PDU_QUEUE(IDX_GET_ELEMENT_ATTR_RSP, ctype, label, TRUE);
HAL_CBACK(bt_rc_callbacks, get_element_attr_cb, num_attr, element_attrs);
@@ -1045,7 +1104,7 @@
if(pavrc_cmd->reg_notif.event_id == BTRC_EVT_PLAY_POS_CHANGED &&
pavrc_cmd->reg_notif.param == 0)
{
- BTIF_TRACE_WARNING1("%s Device registering position changed with illegal param 0.",
+ BTIF_TRACE_WARNING("%s Device registering position changed with illegal param 0.",
__FUNCTION__);
send_reject_response (btif_rc_cb.rc_handle, label, pavrc_cmd->pdu, AVRC_STS_BAD_PARAM);
/* de-register this notification for a rejected response */
@@ -1059,7 +1118,7 @@
case AVRC_PDU_INFORM_DISPLAY_CHARSET:
{
tAVRC_RESPONSE avrc_rsp;
- BTIF_TRACE_EVENT1("%s() AVRC_PDU_INFORM_DISPLAY_CHARSET", __FUNCTION__);
+ BTIF_TRACE_EVENT("%s() AVRC_PDU_INFORM_DISPLAY_CHARSET", __FUNCTION__);
if(btif_rc_cb.rc_connected == TRUE)
{
memset(&(avrc_rsp.inform_charset), 0, sizeof(tAVRC_RSP));
@@ -1093,7 +1152,7 @@
*******************************************************************************/
static void btif_rc_upstreams_rsp_evt(UINT16 event, tAVRC_RESPONSE *pavrc_resp, UINT8 ctype, UINT8 label)
{
- BTIF_TRACE_EVENT5("%s pdu: %s handle: 0x%x ctype:%x label:%x", __FUNCTION__,
+ BTIF_TRACE_EVENT("%s pdu: %s handle: 0x%x ctype:%x label:%x", __FUNCTION__,
dump_rc_pdu(pavrc_resp->pdu), btif_rc_cb.rc_handle, ctype, label);
#if (AVRC_ADV_CTRL_INCLUDED == TRUE)
@@ -1109,7 +1168,7 @@
case AVRC_PDU_SET_ABSOLUTE_VOLUME:
{
- BTIF_TRACE_DEBUG2("Set absolute volume change event received: volume %d,ctype %d",
+ BTIF_TRACE_DEBUG("Set absolute volume change event received: volume %d,ctype %d",
pavrc_resp->volume.volume,ctype);
if(AVRC_RSP_ACCEPT==ctype)
btif_rc_cb.rc_volume=pavrc_resp->volume.volume;
@@ -1138,7 +1197,7 @@
*******************************************************************************/
static bt_status_t init(btrc_callbacks_t* callbacks )
{
- BTIF_TRACE_EVENT1("## %s ##", __FUNCTION__);
+ BTIF_TRACE_EVENT("## %s ##", __FUNCTION__);
bt_status_t result = BT_STATUS_SUCCESS;
if (bt_rc_callbacks)
@@ -1153,6 +1212,32 @@
return result;
}
+/*******************************************************************************
+**
+** Function init_ctrl
+**
+** Description Initializes the AVRC interface
+**
+** Returns bt_status_t
+**
+*******************************************************************************/
+static bt_status_t init_ctrl(btrc_ctrl_callbacks_t* callbacks )
+{
+ BTIF_TRACE_EVENT("## %s ##", __FUNCTION__);
+ bt_status_t result = BT_STATUS_SUCCESS;
+
+ if (bt_rc_ctrl_callbacks)
+ return BT_STATUS_DONE;
+
+ bt_rc_ctrl_callbacks = callbacks;
+ memset (&btif_rc_cb, 0, sizeof(btif_rc_cb));
+ btif_rc_cb.rc_vol_label=MAX_LABEL;
+ btif_rc_cb.rc_volume=MAX_VOLUME;
+ lbl_init();
+
+ return result;
+}
+
/***************************************************************************
**
** Function get_play_status_rsp
@@ -1213,7 +1298,7 @@
element_attrs[i].name.charset_id = AVRC_CHARSET_ID_UTF8;
element_attrs[i].name.str_len = (UINT16)strlen((char *)p_attrs[i].text);
element_attrs[i].name.p_str = p_attrs[i].text;
- BTIF_TRACE_DEBUG5("%s attr_id:0x%x, charset_id:0x%x, str_len:%d, str:%s",
+ BTIF_TRACE_DEBUG("%s attr_id:0x%x, charset_id:0x%x, str_len:%d, str:%s",
__FUNCTION__, (unsigned int)element_attrs[i].attr_id,
element_attrs[i].name.charset_id, element_attrs[i].name.str_len,
element_attrs[i].name.p_str);
@@ -1244,7 +1329,12 @@
{
tAVRC_RESPONSE avrc_rsp;
CHECK_RC_CONNECTED
- BTIF_TRACE_EVENT2("## %s ## event_id:%s", __FUNCTION__, dump_rc_notification_event_id(event_id));
+ BTIF_TRACE_EVENT("## %s ## event_id:%s", __FUNCTION__, dump_rc_notification_event_id(event_id));
+ if (btif_rc_cb.rc_notif[event_id-1].bNotify == FALSE)
+ {
+ BTIF_TRACE_ERROR("Avrcp Event id not registered: event_id = %x", event_id);
+ return BT_STATUS_NOT_READY;
+ }
memset(&(avrc_rsp.reg_notif), 0, sizeof(tAVRC_REG_NOTIF_RSP));
avrc_rsp.reg_notif.event_id = event_id;
@@ -1260,7 +1350,7 @@
avrc_rsp.reg_notif.param.play_pos = p_param->song_pos;
break;
default:
- BTIF_TRACE_WARNING2("%s : Unhandled event ID : 0x%x", __FUNCTION__, event_id);
+ BTIF_TRACE_WARNING("%s : Unhandled event ID : 0x%x", __FUNCTION__, event_id);
return BT_STATUS_UNHANDLED;
}
@@ -1290,7 +1380,7 @@
***************************************************************************/
static bt_status_t set_volume(uint8_t volume)
{
- BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+ BTIF_TRACE_DEBUG("%s", __FUNCTION__);
CHECK_RC_CONNECTED
tAVRC_STS status = BT_STATUS_UNSUPPORTED;
rc_transaction_t *p_transaction=NULL;
@@ -1298,7 +1388,7 @@
if(btif_rc_cb.rc_volume==volume)
{
status=BT_STATUS_DONE;
- BTIF_TRACE_ERROR2("%s: volume value already set earlier: 0x%02x",__FUNCTION__, volume);
+ BTIF_TRACE_ERROR("%s: volume value already set earlier: 0x%02x",__FUNCTION__, volume);
return status;
}
@@ -1308,7 +1398,7 @@
tAVRC_COMMAND avrc_cmd = {0};
BT_HDR *p_msg = NULL;
- BTIF_TRACE_DEBUG2("%s: Peer supports absolute volume. newVolume=%d", __FUNCTION__, volume);
+ BTIF_TRACE_DEBUG("%s: Peer supports absolute volume. newVolume=%d", __FUNCTION__, volume);
avrc_cmd.volume.opcode = AVRC_OP_VENDOR;
avrc_cmd.volume.pdu = AVRC_PDU_SET_ABSOLUTE_VOLUME;
avrc_cmd.volume.status = AVRC_STS_NO_ERROR;
@@ -1319,7 +1409,7 @@
bt_status_t tran_status=get_transaction(&p_transaction);
if(BT_STATUS_SUCCESS == tran_status && NULL!=p_transaction)
{
- BTIF_TRACE_DEBUG2("%s msgreq being sent out with label %d",
+ BTIF_TRACE_DEBUG("%s msgreq being sent out with label %d",
__FUNCTION__,p_transaction->lbl);
BTA_AvMetaCmd(btif_rc_cb.rc_handle,p_transaction->lbl, AVRC_CMD_CTRL, p_msg);
status = BT_STATUS_SUCCESS;
@@ -1328,14 +1418,14 @@
{
if(NULL!=p_msg)
GKI_freebuf(p_msg);
- BTIF_TRACE_ERROR2("%s: failed to obtain transaction details. status: 0x%02x",
+ BTIF_TRACE_ERROR("%s: failed to obtain transaction details. status: 0x%02x",
__FUNCTION__, tran_status);
status = BT_STATUS_FAIL;
}
}
else
{
- BTIF_TRACE_ERROR2("%s: failed to build absolute volume command. status: 0x%02x",
+ BTIF_TRACE_ERROR("%s: failed to build absolute volume command. status: 0x%02x",
__FUNCTION__, status);
status = BT_STATUS_FAIL;
}
@@ -1365,7 +1455,7 @@
bt_status_t tran_status;
rc_transaction_t *p_transaction=NULL;
- BTIF_TRACE_DEBUG2("%s called with label:%d",__FUNCTION__,lbl);
+ BTIF_TRACE_DEBUG("%s called with label:%d",__FUNCTION__,lbl);
avrc_cmd.cmd.opcode=0x00;
avrc_cmd.pdu = AVRC_PDU_REGISTER_NOTIFICATION;
@@ -1379,17 +1469,17 @@
if(NULL!=p_transaction)
{
BTA_AvMetaCmd(btif_rc_cb.rc_handle,p_transaction->lbl, AVRC_CMD_NOTIF, p_msg);
- BTIF_TRACE_DEBUG1("%s:BTA_AvMetaCmd called",__FUNCTION__);
+ BTIF_TRACE_DEBUG("%s:BTA_AvMetaCmd called",__FUNCTION__);
}
else
{
if(NULL!=p_msg)
GKI_freebuf(p_msg);
- BTIF_TRACE_ERROR2("%s transaction not obtained with label: %d",__FUNCTION__,lbl);
+ BTIF_TRACE_ERROR("%s transaction not obtained with label: %d",__FUNCTION__,lbl);
}
}
else
- BTIF_TRACE_ERROR2("%s failed to build command:%d",__FUNCTION__,BldResp);
+ BTIF_TRACE_ERROR("%s failed to build command:%d",__FUNCTION__,BldResp);
}
@@ -1413,7 +1503,7 @@
|| AVRC_RSP_REJ==pmeta_msg->code || AVRC_RSP_NOT_IMPL==pmeta_msg->code))
{
status=AVRC_ParsResponse(pmeta_msg->p_msg, &avrc_response, scratch_buf, sizeof(scratch_buf));
- BTIF_TRACE_DEBUG6("%s: code %d,event ID %d,PDU %x,parsing status %d, label:%d",
+ BTIF_TRACE_DEBUG("%s: code %d,event ID %d,PDU %x,parsing status %d, label:%d",
__FUNCTION__,pmeta_msg->code,avrc_response.reg_notif.event_id,avrc_response.reg_notif.pdu,
status, pmeta_msg->label);
@@ -1437,14 +1527,14 @@
&& btif_rc_cb.rc_vol_label!=pmeta_msg->label)
{
// Just discard the message, if the device sends back with an incorrect label
- BTIF_TRACE_DEBUG3("%s:Discarding register notfn in rsp.code: %d and label %d",
+ BTIF_TRACE_DEBUG("%s:Discarding register notfn in rsp.code: %d and label %d",
__FUNCTION__, pmeta_msg->code, pmeta_msg->label);
return;
}
}
else
{
- BTIF_TRACE_DEBUG3("%s:Received vendor dependent in adv ctrl rsp. code: %d len: %d. Not processing it.",
+ BTIF_TRACE_DEBUG("%s:Received vendor dependent in adv ctrl rsp. code: %d len: %d. Not processing it.",
__FUNCTION__, pmeta_msg->code, pmeta_msg->len);
return;
}
@@ -1463,7 +1553,7 @@
release_transaction(pmeta_msg->label);
}
- BTIF_TRACE_EVENT2("%s: Passing received metamsg response to app. pdu: %s",
+ BTIF_TRACE_EVENT("%s: Passing received metamsg response to app. pdu: %s",
__FUNCTION__, dump_rc_pdu(avrc_response.pdu));
btif_rc_upstreams_rsp_evt((uint16_t)avrc_response.rsp.pdu, &avrc_response, pmeta_msg->code,
pmeta_msg->label);
@@ -1481,7 +1571,7 @@
***************************************************************************/
static void cleanup()
{
- BTIF_TRACE_EVENT1("## %s ##", __FUNCTION__);
+ BTIF_TRACE_EVENT("## %s ##", __FUNCTION__);
close_uinput();
if (bt_rc_callbacks)
{
@@ -1492,6 +1582,42 @@
}
+static bt_status_t send_passthrough_cmd(bt_bdaddr_t *bd_addr, uint8_t key_code, uint8_t key_state)
+{
+ tAVRC_STS status = BT_STATUS_UNSUPPORTED;
+#if (AVRC_CTLR_INCLUDED == TRUE)
+ CHECK_RC_CONNECTED
+ rc_transaction_t *p_transaction=NULL;
+ BTIF_TRACE_DEBUG("%s: key-code: %d, key-state: %d", __FUNCTION__,
+ key_code, key_state);
+ if (btif_rc_cb.rc_features & BTA_AV_FEAT_RCTG)
+ {
+ tAVRC_MSG_PASS avrc_cmd;
+ bt_status_t tran_status = get_transaction(&p_transaction);
+ if(BT_STATUS_SUCCESS == tran_status && NULL != p_transaction)
+ {
+ BTA_AvRemoteCmd(btif_rc_cb.rc_handle, p_transaction->lbl,
+ (tBTA_AV_RC)key_code, (tBTA_AV_STATE)key_state);
+ status = BT_STATUS_SUCCESS;
+ BTIF_TRACE_DEBUG("%s: succesfully sent passthrough command to BTA", __FUNCTION__);
+ }
+ else
+ {
+ status = BT_STATUS_FAIL;
+ BTIF_TRACE_DEBUG("%s: error in fetching transaction", __FUNCTION__);
+ }
+ }
+ else
+ {
+ status = BT_STATUS_FAIL;
+ BTIF_TRACE_DEBUG("%s: feature not supported", __FUNCTION__);
+ }
+#else
+ BTIF_TRACE_DEBUG("%s: feature not enabled", __FUNCTION__);
+#endif
+ return status;
+}
+
static const btrc_interface_t bt_rc_interface = {
sizeof(bt_rc_interface),
init,
@@ -1508,22 +1634,44 @@
cleanup,
};
+static const btrc_ctrl_interface_t bt_rc_ctrl_interface = {
+ sizeof(bt_rc_ctrl_interface),
+ init_ctrl,
+ send_passthrough_cmd,
+ cleanup,
+};
+
/*******************************************************************************
**
** Function btif_rc_get_interface
**
-** Description Get the AVRCP callback interface
+** Description Get the AVRCP Target callback interface
**
** Returns btav_interface_t
**
*******************************************************************************/
const btrc_interface_t *btif_rc_get_interface(void)
{
- BTIF_TRACE_EVENT1("%s", __FUNCTION__);
+ BTIF_TRACE_EVENT("%s", __FUNCTION__);
return &bt_rc_interface;
}
/*******************************************************************************
+**
+** Function btif_rc_ctrl_get_interface
+**
+** Description Get the AVRCP Controller callback interface
+**
+** Returns btav_interface_t
+**
+*******************************************************************************/
+const btrc_ctrl_interface_t *btif_rc_ctrl_get_interface(void)
+{
+ BTIF_TRACE_EVENT("%s", __FUNCTION__);
+ return &bt_rc_ctrl_interface;
+}
+
+/*******************************************************************************
** Function initialize_transaction
**
** Description Initializes fields of the transaction structure
@@ -1600,7 +1748,7 @@
else
{
transaction = &(device.transaction[lbl]);
- BTIF_TRACE_DEBUG2("%s: Got transaction.label: %d",__FUNCTION__,lbl);
+ BTIF_TRACE_DEBUG("%s: Got transaction.label: %d",__FUNCTION__,lbl);
}
}
@@ -1628,7 +1776,7 @@
{
if (FALSE==device.transaction[i].in_use)
{
- BTIF_TRACE_DEBUG2("%s:Got transaction.label: %d",__FUNCTION__,device.transaction[i].lbl);
+ BTIF_TRACE_DEBUG("%s:Got transaction.label: %d",__FUNCTION__,device.transaction[i].lbl);
device.transaction[i].in_use = TRUE;
*ptransaction = &(device.transaction[i]);
result = BT_STATUS_SUCCESS;
@@ -1656,7 +1804,7 @@
/* If the transaction is in use... */
if (transaction != NULL)
{
- BTIF_TRACE_DEBUG2("%s: lbl: %d", __FUNCTION__, lbl);
+ BTIF_TRACE_DEBUG("%s: lbl: %d", __FUNCTION__, lbl);
initialize_transaction(lbl);
}
}
@@ -1685,17 +1833,31 @@
static BOOLEAN dev_blacklisted_for_absolute_volume(BD_ADDR peer_dev)
{
int i;
+ char *dev_name_str = NULL;
int whitelist_size = sizeof(rc_white_addr_prefix)/sizeof(rc_white_addr_prefix[0]);
+
for (i = 0; i < whitelist_size; i++) {
if (rc_white_addr_prefix[i][0] == peer_dev[0] &&
rc_white_addr_prefix[i][1] == peer_dev[1] &&
rc_white_addr_prefix[i][2] == peer_dev[2]) {
- BTIF_TRACE_DEBUG3("whitelist absolute volume for %02x:%02x:%02x",
- peer_dev[0], peer_dev[1], peer_dev[2]);
+ BTIF_TRACE_DEBUG("whitelist absolute volume for %02x:%02x:%02x",
+ peer_dev[0], peer_dev[1], peer_dev[2]);
return FALSE;
}
}
- BTIF_TRACE_WARNING3("blacklist absolute volume for %02x:%02x:%02x",
- peer_dev[0], peer_dev[1], peer_dev[2]);
+
+ dev_name_str = BTM_SecReadDevName(peer_dev);
+ whitelist_size = sizeof(rc_white_name)/sizeof(char*);
+ if (dev_name_str != NULL) {
+ for (i = 0; i < whitelist_size; i++) {
+ if (strcmp(dev_name_str, rc_white_name[i]) == 0) {
+ BTIF_TRACE_DEBUG("whitelist absolute volume for %s", dev_name_str);
+ return FALSE;
+ }
+ }
+ }
+
+ BTIF_TRACE_WARNING("blacklist absolute volume for %02x:%02x:%02x, name = %s",
+ peer_dev[0], peer_dev[1], peer_dev[2], dev_name_str);
return TRUE;
}
diff --git a/btif/src/btif_sm.c b/btif/src/btif_sm.c
index cb4e5ad..e3ccbf8 100644
--- a/btif/src/btif_sm.c
+++ b/btif/src/btif_sm.c
@@ -79,7 +79,7 @@
if (p_handlers == NULL)
{
- BTIF_TRACE_ERROR1("%s : p_handlers is NULL", __FUNCTION__);
+ BTIF_TRACE_ERROR("%s : p_handlers is NULL", __FUNCTION__);
return NULL;
}
@@ -108,7 +108,7 @@
if (p_cb == NULL)
{
- BTIF_TRACE_ERROR1("%s : Invalid handle", __FUNCTION__);
+ BTIF_TRACE_ERROR("%s : Invalid handle", __FUNCTION__);
return;
}
GKI_os_free((void*)p_cb);
@@ -129,7 +129,7 @@
if (p_cb == NULL)
{
- BTIF_TRACE_ERROR1("%s : Invalid handle", __FUNCTION__);
+ BTIF_TRACE_ERROR("%s : Invalid handle", __FUNCTION__);
return 0;
}
@@ -156,7 +156,7 @@
if (p_cb == NULL)
{
- BTIF_TRACE_ERROR1("%s : Invalid handle", __FUNCTION__);
+ BTIF_TRACE_ERROR("%s : Invalid handle", __FUNCTION__);
return BT_STATUS_FAIL;
}
@@ -186,7 +186,7 @@
if (p_cb == NULL)
{
- BTIF_TRACE_ERROR1("%s : Invalid handle", __FUNCTION__);
+ BTIF_TRACE_ERROR("%s : Invalid handle", __FUNCTION__);
return BT_STATUS_FAIL;
}
diff --git a/btif/src/btif_sock.c b/btif/src/btif_sock.c
index 621a91e..4136cda 100644
--- a/btif/src/btif_sock.c
+++ b/btif/src/btif_sock.c
@@ -71,22 +71,22 @@
{
//fix me, the process doesn't exit right now. don't set the init flag for now
//binit = 1;
- BTIF_TRACE_DEBUG0("btsock initializing...");
+ BTIF_TRACE_DEBUG("btsock initializing...");
btsock_thread_init();
int handle = btsock_thread_create(btsock_signaled, NULL);
if(handle >= 0 && btsock_rfc_init(handle) == BT_STATUS_SUCCESS)
{
- BTIF_TRACE_DEBUG0("btsock successfully initialized");
+ BTIF_TRACE_DEBUG("btsock successfully initialized");
return BT_STATUS_SUCCESS;
}
}
- else BTIF_TRACE_ERROR0("btsock interface already initialized");
+ else BTIF_TRACE_ERROR("btsock interface already initialized");
return BT_STATUS_FAIL;
}
void btif_sock_cleanup()
{
btsock_rfc_cleanup();
- BTIF_TRACE_DEBUG0("leaving");
+ BTIF_TRACE_DEBUG("leaving");
}
static bt_status_t btsock_listen(btsock_type_t type, const char* service_name,
@@ -94,7 +94,7 @@
{
if((service_uuid == NULL && channel <= 0) || sock_fd == NULL)
{
- BTIF_TRACE_ERROR3("invalid parameters, uuid:%p, channel:%d, sock_fd:%p", service_uuid, channel, sock_fd);
+ BTIF_TRACE_ERROR("invalid parameters, uuid:%p, channel:%d, sock_fd:%p", service_uuid, channel, sock_fd);
return BT_STATUS_PARM_INVALID;
}
*sock_fd = -1;
@@ -105,15 +105,15 @@
status = btsock_rfc_listen(service_name, service_uuid, channel, sock_fd, flags);
break;
case BTSOCK_L2CAP:
- BTIF_TRACE_ERROR1("bt l2cap socket type not supported, type:%d", type);
+ BTIF_TRACE_ERROR("bt l2cap socket type not supported, type:%d", type);
status = BT_STATUS_UNSUPPORTED;
break;
case BTSOCK_SCO:
- BTIF_TRACE_ERROR1("bt sco socket not supported, type:%d", type);
+ BTIF_TRACE_ERROR("bt sco socket not supported, type:%d", type);
status = BT_STATUS_UNSUPPORTED;
break;
default:
- BTIF_TRACE_ERROR1("unknown bt socket type:%d", type);
+ BTIF_TRACE_ERROR("unknown bt socket type:%d", type);
status = BT_STATUS_UNSUPPORTED;
break;
}
@@ -124,7 +124,7 @@
{
if((uuid == NULL && channel <= 0) || bd_addr == NULL || sock_fd == NULL)
{
- BTIF_TRACE_ERROR4("invalid parameters, bd_addr:%p, uuid:%p, channel:%d, sock_fd:%p",
+ BTIF_TRACE_ERROR("invalid parameters, bd_addr:%p, uuid:%p, channel:%d, sock_fd:%p",
bd_addr, uuid, channel, sock_fd);
return BT_STATUS_PARM_INVALID;
}
@@ -136,15 +136,15 @@
status = btsock_rfc_connect(bd_addr, uuid, channel, sock_fd, flags);
break;
case BTSOCK_L2CAP:
- BTIF_TRACE_ERROR1("bt l2cap socket type not supported, type:%d", type);
+ BTIF_TRACE_ERROR("bt l2cap socket type not supported, type:%d", type);
status = BT_STATUS_UNSUPPORTED;
break;
case BTSOCK_SCO:
- BTIF_TRACE_ERROR1("bt sco socket not supported, type:%d", type);
+ BTIF_TRACE_ERROR("bt sco socket not supported, type:%d", type);
status = BT_STATUS_UNSUPPORTED;
break;
default:
- BTIF_TRACE_ERROR1("unknown bt socket type:%d", type);
+ BTIF_TRACE_ERROR("unknown bt socket type:%d", type);
status = BT_STATUS_UNSUPPORTED;
break;
}
@@ -158,13 +158,13 @@
btsock_rfc_signaled(fd, flags, user_id);
break;
case BTSOCK_L2CAP:
- BTIF_TRACE_ERROR2("bt l2cap socket type not supported, fd:%d, flags:%d", fd, flags);
+ BTIF_TRACE_ERROR("bt l2cap socket type not supported, fd:%d, flags:%d", fd, flags);
break;
case BTSOCK_SCO:
- BTIF_TRACE_ERROR2("bt sco socket type not supported, fd:%d, flags:%d", fd, flags);
+ BTIF_TRACE_ERROR("bt sco socket type not supported, fd:%d, flags:%d", fd, flags);
break;
default:
- BTIF_TRACE_ERROR3("unknown socket type:%d, fd:%d, flags:%d", type, fd, flags);
+ BTIF_TRACE_ERROR("unknown socket type:%d, fd:%d, flags:%d", type, fd, flags);
break;
}
}
diff --git a/btif/src/btif_sock_rfc.c b/btif/src/btif_sock_rfc.c
index abb2a97..d934c52 100644
--- a/btif/src/btif_sock_rfc.c
+++ b/btif/src/btif_sock_rfc.c
@@ -23,6 +23,7 @@
* Description: Handsfree Profile Bluetooth Interface
*
***********************************************************************************/
+#include <assert.h>
#include <hardware/bluetooth.h>
#include <hardware/bt_sock.h>
#include <sys/types.h>
@@ -51,10 +52,11 @@
#include "bta_jv_api.h"
#include "bta_jv_co.h"
#include "port_api.h"
+#include "list.h"
#include <cutils/log.h>
#include <hardware/bluetooth.h>
-#define asrt(s) if(!(s)) APPL_TRACE_ERROR3("## %s assert %s failed at line:%d ##",__FUNCTION__, #s, __LINE__)
+#define asrt(s) if(!(s)) APPL_TRACE_ERROR("## %s assert %s failed at line:%d ##",__FUNCTION__, #s, __LINE__)
extern void uuid_to_string(bt_uuid_t *p_uuid, char *str);
static inline void logu(const char* title, const uint8_t * p_uuid)
@@ -92,7 +94,7 @@
int rfc_handle;
int rfc_port_handle;
int role;
- BUFFER_Q incoming_que;
+ list_t *incoming_queue;
} rfc_slot_t;
static rfc_slot_t rfc_slots[MAX_RFC_CHANNEL];
@@ -100,9 +102,6 @@
static volatile int pth = -1; //poll thread handle
static void jv_dm_cback(tBTA_JV_EVT event, tBTA_JV *p_data, void *user_data);
static void cleanup_rfc_slot(rfc_slot_t* rs);
-static inline void close_rfc_connection(int rfc_handle, int server);
-static bt_status_t dm_get_remote_service_record(bt_bdaddr_t *remote_addr,
- bt_uuid_t *uuid);
static void *rfcomm_cback(tBTA_JV_EVT event, tBTA_JV *p_data, void *user_data);
static inline BOOLEAN send_app_scn(rfc_slot_t* rs);
static pthread_mutex_t slot_lock;
@@ -122,11 +121,6 @@
}
else memcpy(dest, src, 6);
}
-static inline void free_gki_que(BUFFER_Q* q)
-{
- while(!GKI_queue_is_empty(q))
- GKI_freebuf(GKI_dequeue(q));
-}
static void init_rfc_slots()
{
int i;
@@ -136,7 +130,8 @@
rfc_slots[i].scn = -1;
rfc_slots[i].sdp_handle = 0;
rfc_slots[i].fd = rfc_slots[i].app_fd = -1;
- GKI_init_q(&rfc_slots[i].incoming_que);
+ rfc_slots[i].incoming_queue = list_new(GKI_freebuf);
+ assert(rfc_slots[i].incoming_queue != NULL);
}
BTA_JvEnable(jv_dm_cback);
init_slot_lock(&slot_lock);
@@ -156,8 +151,10 @@
int i;
for(i = 0; i < MAX_RFC_CHANNEL; i++)
{
- if(rfc_slots[i].id)
+ if(rfc_slots[i].id) {
cleanup_rfc_slot(&rfc_slots[i]);
+ list_free(rfc_slots[i].incoming_queue);
+ }
}
unlock_slot(&slot_lock);
}
@@ -173,7 +170,7 @@
}
return NULL;
}
-static inline rfc_slot_t* find_rfc_slot_by_id(uint32_t id, const char* label)
+static inline rfc_slot_t* find_rfc_slot_by_id(uint32_t id)
{
int i;
if(id)
@@ -186,7 +183,7 @@
}
}
}
- APPL_TRACE_WARNING2("invalid rfc slot id: %d, %s", id, label);
+ APPL_TRACE_WARNING("invalid rfc slot id: %d", id);
return NULL;
}
static inline rfc_slot_t* find_rfc_slot_by_pending_sdp()
@@ -217,7 +214,7 @@
if(rfc_slots[i].id && rfc_slots[i].f.doing_sdp_request)
return &rfc_slots[i];
}
- APPL_TRACE_DEBUG0("can not find any slot is requesting sdp");
+ APPL_TRACE_DEBUG("can not find any slot is requesting sdp");
return NULL;
}
@@ -234,7 +231,7 @@
return &rfc_slots[i];
else
{
- APPL_TRACE_ERROR0("invalid rfc slot id, cannot be 0");
+ APPL_TRACE_ERROR("invalid rfc slot id, cannot be 0");
break;
}
}
@@ -256,7 +253,7 @@
int fds[2] = {-1, -1};
if(socketpair(AF_LOCAL, SOCK_STREAM, 0, fds))
{
- APPL_TRACE_ERROR1("socketpair failed, errno:%d", errno);
+ APPL_TRACE_ERROR("socketpair failed, errno:%d", errno);
return NULL;
}
rs->fd = fds[0];
@@ -283,35 +280,44 @@
int open_handle, int new_listen_handle)
{
rfc_slot_t *accept_rs = alloc_rfc_slot(addr, srv_rs->service_name, srv_rs->service_uuid, srv_rs->scn, 0, FALSE);
- clear_slot_flag(&accept_rs->f);
- accept_rs->f.server = FALSE;
- accept_rs->f.connected = TRUE;
- accept_rs->security = srv_rs->security;
- accept_rs->mtu = srv_rs->mtu;
- accept_rs->role = srv_rs->role;
- accept_rs->rfc_handle = open_handle;
- accept_rs->rfc_port_handle = BTA_JvRfcommGetPortHdl(open_handle);
- //now update listen rfc_handle of server slot
- srv_rs->rfc_handle = new_listen_handle;
- srv_rs->rfc_port_handle = BTA_JvRfcommGetPortHdl(new_listen_handle);
- BTIF_TRACE_DEBUG4("create_srv_accept__rfc_slot(open_handle: 0x%x, new_listen_handle:"
- "0x%x) accept_rs->rfc_handle:0x%x, srv_rs_listen->rfc_handle:0x%x"
- ,open_handle, new_listen_handle, accept_rs->rfc_port_handle, srv_rs->rfc_port_handle);
- asrt(accept_rs->rfc_port_handle != srv_rs->rfc_port_handle);
- //now swap the slot id
- uint32_t new_listen_id = accept_rs->id;
- accept_rs->id = srv_rs->id;
- srv_rs->id = new_listen_id;
- return accept_rs;
+ if( accept_rs)
+ {
+ clear_slot_flag(&accept_rs->f);
+ accept_rs->f.server = FALSE;
+ accept_rs->f.connected = TRUE;
+ accept_rs->security = srv_rs->security;
+ accept_rs->mtu = srv_rs->mtu;
+ accept_rs->role = srv_rs->role;
+ accept_rs->rfc_handle = open_handle;
+ accept_rs->rfc_port_handle = BTA_JvRfcommGetPortHdl(open_handle);
+ //now update listen rfc_handle of server slot
+ srv_rs->rfc_handle = new_listen_handle;
+ srv_rs->rfc_port_handle = BTA_JvRfcommGetPortHdl(new_listen_handle);
+ BTIF_TRACE_DEBUG("create_srv_accept__rfc_slot(open_handle: 0x%x, new_listen_handle:"
+ "0x%x) accept_rs->rfc_handle:0x%x, srv_rs_listen->rfc_handle:0x%x"
+ ,open_handle, new_listen_handle, accept_rs->rfc_port_handle, srv_rs->rfc_port_handle);
+ asrt(accept_rs->rfc_port_handle != srv_rs->rfc_port_handle);
+ //now swap the slot id
+ uint32_t new_listen_id = accept_rs->id;
+ accept_rs->id = srv_rs->id;
+ srv_rs->id = new_listen_id;
+
+ return accept_rs;
+ }
+ else
+ {
+ APPL_TRACE_ERROR(" accept_rs is NULL %s", __FUNCTION__);
+ return NULL;
+ }
}
bt_status_t btsock_rfc_listen(const char* service_name, const uint8_t* service_uuid, int channel,
int* sock_fd, int flags)
{
- APPL_TRACE_DEBUG1("btsock_rfc_listen, service_name:%s", service_name);
+ APPL_TRACE_DEBUG("btsock_rfc_listen, service_name:%s", service_name);
if(sock_fd == NULL || (service_uuid == NULL && (channel < 1 || channel > 30)))
{
- APPL_TRACE_ERROR3("invalid rfc channel:%d or sock_fd:%p, uuid:%p", channel, sock_fd, service_uuid);
+ APPL_TRACE_ERROR("invalid rfc channel:%d or sock_fd:%p, uuid:%p", channel, sock_fd, service_uuid);
return BT_STATUS_PARM_INVALID;
}
*sock_fd = -1;
@@ -333,12 +339,17 @@
rfc_slot_t* rs = alloc_rfc_slot(NULL, service_name, service_uuid, channel, flags, TRUE);
if(rs)
{
- APPL_TRACE_DEBUG1("BTA_JvCreateRecordByUser:%s", service_name);
- BTA_JvCreateRecordByUser((void *)rs->id);
+ APPL_TRACE_DEBUG("BTA_JvCreateRecordByUser:%s", service_name);
+ BTA_JvCreateRecordByUser((void *)(intptr_t)rs->id);
*sock_fd = rs->app_fd;
rs->app_fd = -1; //the fd ownership is transferred to app
- status = BT_STATUS_SUCCESS;
- btsock_thread_add_fd(pth, rs->fd, BTSOCK_RFCOMM, SOCK_THREAD_FD_EXCEPTION, rs->id);
+ if (btsock_thread_add_fd(pth, rs->fd, BTSOCK_RFCOMM, SOCK_THREAD_FD_EXCEPTION, rs->id)) {
+ status = BT_STATUS_SUCCESS;
+ }
+ else
+ {
+ cleanup_rfc_slot(rs);
+ }
}
unlock_slot(&slot_lock);
return status;
@@ -348,7 +359,7 @@
{
if(sock_fd == NULL || (service_uuid == NULL && (channel < 1 || channel > 30)))
{
- APPL_TRACE_ERROR3("invalid rfc channel:%d or sock_fd:%p, uuid:%p", channel, sock_fd,
+ APPL_TRACE_ERROR("invalid rfc channel:%d or sock_fd:%p, uuid:%p", channel, sock_fd,
service_uuid);
return BT_STATUS_PARM_INVALID;
}
@@ -362,9 +373,9 @@
{
if(is_uuid_empty(service_uuid))
{
- APPL_TRACE_DEBUG1("connecting to rfcomm channel:%d without service discovery", channel);
+ APPL_TRACE_DEBUG("connecting to rfcomm channel:%d without service discovery", channel);
if(BTA_JvRfcommConnect(rs->security, rs->role, rs->scn, rs->addr.address,
- rfcomm_cback, (void*)rs->id) == BTA_JV_SUCCESS)
+ rfcomm_cback, (void*)(intptr_t)rs->id) == BTA_JV_SUCCESS)
{
if(send_app_scn(rs))
{
@@ -390,7 +401,7 @@
rfc_slot_t* rs_doing_sdp = find_rfc_slot_requesting_sdp();
if(rs_doing_sdp == NULL)
{
- BTA_JvStartDiscovery((UINT8*)bd_addr->address, 1, &sdp_uuid, (void*)rs->id);
+ BTA_JvStartDiscovery((UINT8*)bd_addr->address, 1, &sdp_uuid, (void*)(intptr_t)rs->id);
rs->f.pending_sdp_request = FALSE;
rs->f.doing_sdp_request = TRUE;
}
@@ -413,13 +424,13 @@
{
if(BTM_TryAllocateSCN(rs->scn) == FALSE)
{
- APPL_TRACE_ERROR1("rfc channel:%d already in use", scn);
+ APPL_TRACE_ERROR("rfc channel:%d already in use", scn);
return FALSE;
}
}
else if((rs->scn = BTM_AllocateSCN()) == 0)
{
- APPL_TRACE_ERROR0("run out of rfc channels");
+ APPL_TRACE_ERROR("run out of rfc channels");
return FALSE;
}
if((rs->sdp_handle = add_rfc_sdp_rec(rs->service_name, rs->service_uuid, rs->scn)) <= 0)
@@ -473,7 +484,7 @@
{
if(rs->f.server && !rs->f.closing && rs->rfc_handle)
{
- BTA_JvRfcommStopServer(rs->rfc_handle, (void*)rs->id);
+ BTA_JvRfcommStopServer(rs->rfc_handle, (void*)(uintptr_t)rs->id);
rs->rfc_handle = 0;
}
if(rs->f.server)
@@ -483,7 +494,7 @@
}
static void cleanup_rfc_slot(rfc_slot_t* rs)
{
- APPL_TRACE_DEBUG4("cleanup slot:%d, fd:%d, scn:%d, sdp_handle:0x%x", rs->id, rs->fd, rs->scn, rs->sdp_handle);
+ APPL_TRACE_DEBUG("cleanup slot:%d, fd:%d, scn:%d, sdp_handle:0x%x", rs->id, rs->fd, rs->scn, rs->sdp_handle);
if(rs->fd != -1)
{
shutdown(rs->fd, 2);
@@ -502,12 +513,12 @@
}
if(rs->rfc_handle && !rs->f.closing && !rs->f.server)
{
- APPL_TRACE_DEBUG1("closing rfcomm connection, rfc_handle:0x%x", rs->rfc_handle);
- BTA_JvRfcommClose(rs->rfc_handle, (void*)rs->id);
+ APPL_TRACE_DEBUG("closing rfcomm connection, rfc_handle:0x%x", rs->rfc_handle);
+ BTA_JvRfcommClose(rs->rfc_handle, (void*)(uintptr_t)rs->id);
rs->rfc_handle = 0;
}
free_rfc_slot_scn(rs);
- free_gki_que(&rs->incoming_que);
+ list_clear(rs->incoming_queue);
rs->rfc_port_handle = 0;
//cleanup the flag
@@ -542,7 +553,7 @@
{
if(sock_send_fd(fd, (const uint8_t*)&cs, sizeof(cs), send_fd) == sizeof(cs))
return TRUE;
- else APPL_TRACE_ERROR2("sock_send_fd failed, fd:%d, send_fd:%d", fd, send_fd);
+ else APPL_TRACE_ERROR("sock_send_fd failed, fd:%d, send_fd:%d", fd, send_fd);
}
else if(sock_send_all(fd, (const uint8_t*)&cs, sizeof(cs)) == sizeof(cs))
{
@@ -552,8 +563,8 @@
}
static void on_cl_rfc_init(tBTA_JV_RFCOMM_CL_INIT *p_init, uint32_t id)
{
- lock_slot(&slot_lock);
- rfc_slot_t* rs = find_rfc_slot_by_id(id, "on_cl_rfc_init");
+ lock_slot(&slot_lock);
+ rfc_slot_t* rs = find_rfc_slot_by_id(id);
if(rs)
{
if (p_init->status != BTA_JV_SUCCESS)
@@ -568,7 +579,7 @@
static void on_srv_rfc_listen_started(tBTA_JV_RFCOMM_START *p_start, uint32_t id)
{
lock_slot(&slot_lock);
- rfc_slot_t* rs = find_rfc_slot_by_id(id, "on_srv_rfc_listen_started");
+ rfc_slot_t* rs = find_rfc_slot_by_id(id);
if(rs)
{
if (p_start->status != BTA_JV_SUCCESS)
@@ -580,7 +591,7 @@
if(!send_app_scn(rs))
{
//closed
- APPL_TRACE_DEBUG1("send_app_scn() failed, close rs->id:%d", rs->id);
+ APPL_TRACE_DEBUG("send_app_scn() failed, close rs->id:%d", rs->id);
cleanup_rfc_slot(rs);
}
}
@@ -591,7 +602,7 @@
{
uint32_t new_listen_slot_id = 0;
lock_slot(&slot_lock);
- rfc_slot_t* srv_rs = find_rfc_slot_by_id(id, "on_srv_rfc_connect");
+ rfc_slot_t* srv_rs = find_rfc_slot_by_id(id);
if(srv_rs)
{
rfc_slot_t* accept_rs = create_srv_accept_rfc_slot(srv_rs, (const bt_bdaddr_t*)p_open->rem_bda,
@@ -601,9 +612,9 @@
//start monitor the socket
btsock_thread_add_fd(pth, srv_rs->fd, BTSOCK_RFCOMM, SOCK_THREAD_FD_EXCEPTION, srv_rs->id);
btsock_thread_add_fd(pth, accept_rs->fd, BTSOCK_RFCOMM, SOCK_THREAD_FD_RD, accept_rs->id);
- APPL_TRACE_DEBUG1("sending connect signal & app fd:%dto app server to accept() the connection",
+ APPL_TRACE_DEBUG("sending connect signal & app fd:%dto app server to accept() the connection",
accept_rs->app_fd);
- APPL_TRACE_DEBUG2("server fd:%d, scn:%d", srv_rs->fd, srv_rs->scn);
+ APPL_TRACE_DEBUG("server fd:%d, scn:%d", srv_rs->fd, srv_rs->scn);
send_app_connect_signal(srv_rs->fd, &accept_rs->addr, srv_rs->scn, 0, accept_rs->app_fd);
accept_rs->app_fd = -1; //the fd is closed after sent to app
new_listen_slot_id = srv_rs->id;
@@ -615,22 +626,22 @@
static void on_cli_rfc_connect(tBTA_JV_RFCOMM_OPEN *p_open, uint32_t id)
{
lock_slot(&slot_lock);
- rfc_slot_t* rs = find_rfc_slot_by_id(id, "on_cli_rfc_connect");
+ rfc_slot_t* rs = find_rfc_slot_by_id(id);
if(rs && p_open->status == BTA_JV_SUCCESS)
{
rs->rfc_port_handle = BTA_JvRfcommGetPortHdl(p_open->handle);
bd_copy(rs->addr.address, p_open->rem_bda, 0);
//notify app rfc is connected
- APPL_TRACE_DEBUG4("call send_app_connect_signal, slot id:%d, fd:%d, rfc scn:%d, server:%d",
+ APPL_TRACE_DEBUG("call send_app_connect_signal, slot id:%d, fd:%d, rfc scn:%d, server:%d",
rs->id, rs->fd, rs->scn, rs->f.server);
if(send_app_connect_signal(rs->fd, &rs->addr, rs->scn, 0, -1))
{
//start monitoring the socketpair to get call back when app writing data
- APPL_TRACE_DEBUG3("on_rfc_connect_ind, connect signal sent, slot id:%d, rfc scn:%d, server:%d",
+ APPL_TRACE_DEBUG("on_rfc_connect_ind, connect signal sent, slot id:%d, rfc scn:%d, server:%d",
rs->id, rs->scn, rs->f.server);
rs->f.connected = TRUE;
}
- else APPL_TRACE_ERROR0("send_app_connect_signal failed");
+ else APPL_TRACE_ERROR("send_app_connect_signal failed");
}
else if(rs)
cleanup_rfc_slot(rs);
@@ -640,10 +651,10 @@
{
UNUSED(p_close);
lock_slot(&slot_lock);
- rfc_slot_t* rs = find_rfc_slot_by_id(id, "on_rfc_close");
+ rfc_slot_t* rs = find_rfc_slot_by_id(id);
if(rs)
{
- APPL_TRACE_DEBUG4("on_rfc_close, slot id:%d, fd:%d, rfc scn:%d, server:%d",
+ APPL_TRACE_DEBUG("on_rfc_close, slot id:%d, fd:%d, rfc scn:%d, server:%d",
rs->id, rs->fd, rs->scn, rs->f.server);
free_rfc_slot_scn(rs);
// rfc_handle already closed when receiving rfcomm close event from stack.
@@ -657,7 +668,7 @@
UNUSED(p);
lock_slot(&slot_lock);
- rfc_slot_t* rs = find_rfc_slot_by_id(id, "on_rfc_write_done");
+ rfc_slot_t* rs = find_rfc_slot_by_id(id);
if(rs && !rs->f.outgoing_congest)
{
//mointer the fd for any outgoing data
@@ -668,7 +679,7 @@
static void on_rfc_outgoing_congest(tBTA_JV_RFCOMM_CONG *p, uint32_t id)
{
lock_slot(&slot_lock);
- rfc_slot_t* rs = find_rfc_slot_by_id(id, "on_rfc_outgoing_congest");
+ rfc_slot_t* rs = find_rfc_slot_by_id(id);
if(rs)
{
rs->f.outgoing_congest = p->cong ? 1 : 0;
@@ -683,50 +694,50 @@
{
int rc;
void* new_user_data = NULL;
- APPL_TRACE_DEBUG1("event=%s", jv_evt[event]);
+ APPL_TRACE_DEBUG("event=%s", jv_evt[event]);
switch (event)
{
case BTA_JV_RFCOMM_START_EVT:
- on_srv_rfc_listen_started(&p_data->rfc_start, (uint32_t)user_data);
+ on_srv_rfc_listen_started(&p_data->rfc_start, (uintptr_t)user_data);
break;
case BTA_JV_RFCOMM_CL_INIT_EVT:
- on_cl_rfc_init(&p_data->rfc_cl_init, (uint32_t)user_data);
+ on_cl_rfc_init(&p_data->rfc_cl_init, (uintptr_t)user_data);
break;
case BTA_JV_RFCOMM_OPEN_EVT:
BTA_JvSetPmProfile(p_data->rfc_open.handle,BTA_JV_PM_ID_1,BTA_JV_CONN_OPEN);
- on_cli_rfc_connect(&p_data->rfc_open, (uint32_t)user_data);
+ on_cli_rfc_connect(&p_data->rfc_open, (uintptr_t)user_data);
break;
case BTA_JV_RFCOMM_SRV_OPEN_EVT:
BTA_JvSetPmProfile(p_data->rfc_srv_open.handle,BTA_JV_PM_ALL,BTA_JV_CONN_OPEN);
- new_user_data = (void*)on_srv_rfc_connect(&p_data->rfc_srv_open, (uint32_t)user_data);
+ new_user_data = (void*)(intptr_t)on_srv_rfc_connect(&p_data->rfc_srv_open, (uintptr_t)user_data);
break;
case BTA_JV_RFCOMM_CLOSE_EVT:
- APPL_TRACE_DEBUG1("BTA_JV_RFCOMM_CLOSE_EVT: user_data:%d", (uint32_t)user_data);
- on_rfc_close(&p_data->rfc_close, (uint32_t)user_data);
+ APPL_TRACE_DEBUG("BTA_JV_RFCOMM_CLOSE_EVT: user_data:%d", (uintptr_t)user_data);
+ on_rfc_close(&p_data->rfc_close, (uintptr_t)user_data);
break;
case BTA_JV_RFCOMM_READ_EVT:
- APPL_TRACE_DEBUG0("BTA_JV_RFCOMM_READ_EVT not used");
+ APPL_TRACE_DEBUG("BTA_JV_RFCOMM_READ_EVT not used");
break;
case BTA_JV_RFCOMM_WRITE_EVT:
- on_rfc_write_done(&p_data->rfc_write, (uint32_t)user_data);
+ on_rfc_write_done(&p_data->rfc_write, (uintptr_t)user_data);
break;
case BTA_JV_RFCOMM_DATA_IND_EVT:
- APPL_TRACE_DEBUG0("BTA_JV_RFCOMM_DATA_IND_EVT not used");
+ APPL_TRACE_DEBUG("BTA_JV_RFCOMM_DATA_IND_EVT not used");
break;
case BTA_JV_RFCOMM_CONG_EVT:
//on_rfc_cong(&p_data->rfc_cong);
- on_rfc_outgoing_congest(&p_data->rfc_cong, (uint32_t)user_data);
+ on_rfc_outgoing_congest(&p_data->rfc_cong, (uintptr_t)user_data);
break;
default:
- APPL_TRACE_ERROR2("unhandled event %d, slot id:%d", event, (uint32_t)user_data);
+ APPL_TRACE_ERROR("unhandled event %d, slot id:%d", event, (uintptr_t)user_data);
break;
}
return new_user_data;
@@ -734,23 +745,23 @@
static void jv_dm_cback(tBTA_JV_EVT event, tBTA_JV *p_data, void *user_data)
{
- uint32_t id = (uint32_t)user_data;
- APPL_TRACE_DEBUG2("jv_dm_cback: event:%d, slot id:%d", event, id);
+ uint32_t id = (uintptr_t)user_data;
+ APPL_TRACE_DEBUG("jv_dm_cback: event:%d, slot id:%d", event, id);
switch(event)
{
case BTA_JV_CREATE_RECORD_EVT:
{
lock_slot(&slot_lock);
- rfc_slot_t* rs = find_rfc_slot_by_id(id, "jv_dm_cback: BTA_JV_CREATE_RECORD_EVT");
+ rfc_slot_t* rs = find_rfc_slot_by_id(id);
if(rs && create_server_sdp_record(rs))
{
//now start the rfcomm server after sdp & channel # assigned
BTA_JvRfcommStartServer(rs->security, rs->role, rs->scn, MAX_RFC_SESSION, rfcomm_cback,
- (void*)rs->id);
+ (void*)(uintptr_t)rs->id);
}
else if(rs)
{
- APPL_TRACE_ERROR1("jv_dm_cback: cannot start server, slot found:%p", rs);
+ APPL_TRACE_ERROR("jv_dm_cback: cannot start server, slot found:%p", rs);
cleanup_rfc_slot(rs);
}
unlock_slot(&slot_lock);
@@ -762,14 +773,14 @@
lock_slot(&slot_lock);
if(p_data->disc_comp.status == BTA_JV_SUCCESS && p_data->disc_comp.scn)
{
- APPL_TRACE_DEBUG3("BTA_JV_DISCOVERY_COMP_EVT, slot id:%d, status:%d, scn:%d",
+ APPL_TRACE_DEBUG("BTA_JV_DISCOVERY_COMP_EVT, slot id:%d, status:%d, scn:%d",
id, p_data->disc_comp.status, p_data->disc_comp.scn);
- rs = find_rfc_slot_by_id(id, "jv_dm_cback: BTA_JV_DISCOVERY_COMP_EVT");
+ rs = find_rfc_slot_by_id(id);
if(rs && rs->f.doing_sdp_request)
{
if(BTA_JvRfcommConnect(rs->security, rs->role, p_data->disc_comp.scn, rs->addr.address,
- rfcomm_cback, (void*)rs->id) == BTA_JV_SUCCESS)
+ rfcomm_cback, (void*)(uintptr_t)rs->id) == BTA_JV_SUCCESS)
{
rs->scn = p_data->disc_comp.scn;
rs->f.doing_sdp_request = FALSE;
@@ -780,28 +791,28 @@
}
else if(rs)
{
- APPL_TRACE_ERROR3("DISCOVERY_COMP_EVT no pending sdp request, slot id:%d, \
+ APPL_TRACE_ERROR("DISCOVERY_COMP_EVT no pending sdp request, slot id:%d, \
flag sdp pending:%d, flag sdp doing:%d",
id, rs->f.pending_sdp_request, rs->f.doing_sdp_request);
}
}
else
{
- APPL_TRACE_ERROR3("DISCOVERY_COMP_EVT slot id:%d, failed to find channel, \
+ APPL_TRACE_ERROR("DISCOVERY_COMP_EVT slot id:%d, failed to find channle, \
status:%d, scn:%d", id, p_data->disc_comp.status,
p_data->disc_comp.scn);
- rs = find_rfc_slot_by_id(id, "jv_dm_cback: BTA_JV_DISCOVERY_COMP_EVT, no channel");
+ rs = find_rfc_slot_by_id(id);
if(rs)
cleanup_rfc_slot(rs);
}
rs = find_rfc_slot_by_pending_sdp();
if(rs)
{
- APPL_TRACE_DEBUG0("BTA_JV_DISCOVERY_COMP_EVT, start another pending scn sdp request");
+ APPL_TRACE_DEBUG("BTA_JV_DISCOVERY_COMP_EVT, start another pending scn sdp request");
tSDP_UUID sdp_uuid;
sdp_uuid.len = 16;
memcpy(sdp_uuid.uu.uuid128, rs->service_uuid, sizeof(sdp_uuid.uu.uuid128));
- BTA_JvStartDiscovery((UINT8*)rs->addr.address, 1, &sdp_uuid, (void*)rs->id);
+ BTA_JvStartDiscovery((UINT8*)rs->addr.address, 1, &sdp_uuid, (void*)(uintptr_t)rs->id);
rs->f.pending_sdp_request = FALSE;
rs->f.doing_sdp_request = TRUE;
}
@@ -809,7 +820,7 @@
break;
}
default:
- APPL_TRACE_DEBUG2("unhandled event:%d, slot id:%d", event, id);
+ APPL_TRACE_DEBUG("unhandled event:%d, slot id:%d", event, id);
break;
}
@@ -829,7 +840,7 @@
if(sent > 0 && sent < p_buf->len)
{
//sent partial
- APPL_TRACE_ERROR2("send partial, sent:%d, p_buf->len:%d", sent, p_buf->len);
+ APPL_TRACE_ERROR("send partial, sent:%d, p_buf->len:%d", sent, p_buf->len);
p_buf->offset += sent;
p_buf->len -= sent;
return SENT_PARTIAL;
@@ -838,39 +849,37 @@
if(sent < 0 &&
(errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR))
{
- APPL_TRACE_ERROR1("send none, EAGAIN or EWOULDBLOCK, errno:%d", errno);
+ APPL_TRACE_ERROR("send none, EAGAIN or EWOULDBLOCK, errno:%d", errno);
return SENT_NONE;
}
- APPL_TRACE_ERROR3("unknown send() error, sent:%d, p_buf->len:%d, errno:%d", sent, p_buf->len, errno);
+ APPL_TRACE_ERROR("unknown send() error, sent:%d, p_buf->len:%d, errno:%d", sent, p_buf->len, errno);
return SENT_FAILED;
}
static BOOLEAN flush_incoming_que_on_wr_signal(rfc_slot_t* rs)
{
- while(!GKI_queue_is_empty(&rs->incoming_que))
+ while(!list_is_empty(rs->incoming_queue))
{
- BT_HDR *p_buf = GKI_dequeue(&rs->incoming_que);
+ BT_HDR *p_buf = list_front(rs->incoming_queue);
int sent = send_data_to_app(rs->fd, p_buf);
switch(sent)
{
case SENT_NONE:
case SENT_PARTIAL:
- //add it back to the queue at same position
- GKI_enqueue_head (&rs->incoming_que, p_buf);
//monitor the fd to get callback when app is ready to receive data
btsock_thread_add_fd(pth, rs->fd, BTSOCK_RFCOMM, SOCK_THREAD_FD_WR, rs->id);
return TRUE;
case SENT_ALL:
- GKI_freebuf(p_buf);
+ list_remove(rs->incoming_queue, p_buf);
break;
case SENT_FAILED:
- GKI_freebuf(p_buf);
+ list_remove(rs->incoming_queue, p_buf);
return FALSE;
}
}
//app is ready to receive data, tell stack to start the data flow
//fix me: need a jv flow control api to serialize the call in stack
- APPL_TRACE_DEBUG3("enable data flow, rfc_handle:0x%x, rfc_port_handle:0x%x, user_id:%d",
+ APPL_TRACE_DEBUG("enable data flow, rfc_handle:0x%x, rfc_port_handle:0x%x, user_id:%d",
rs->rfc_handle, rs->rfc_port_handle, rs->id);
extern int PORT_FlowControl_MaxCredit(UINT16 handle, BOOLEAN enable);
PORT_FlowControl_MaxCredit(rs->rfc_port_handle, TRUE);
@@ -879,10 +888,10 @@
void btsock_rfc_signaled(int fd, int flags, uint32_t user_id)
{
lock_slot(&slot_lock);
- rfc_slot_t* rs = find_rfc_slot_by_id(user_id, "btsock_rfc_signaled");
+ rfc_slot_t* rs = find_rfc_slot_by_id(user_id);
if(rs)
{
- APPL_TRACE_DEBUG3("rfc slot id:%d, fd:%d, flags:%x", rs->id, fd, flags);
+ APPL_TRACE_DEBUG("rfc slot id:%d, fd:%d, flags:%x", rs->id, fd, flags);
BOOLEAN need_close = FALSE;
if(flags & SOCK_THREAD_FD_RD)
{
@@ -895,11 +904,18 @@
//make sure there's data pending in case the peer closed the socket
if(!(flags & SOCK_THREAD_FD_EXCEPTION) ||
(ioctl(rs->fd, FIONREAD, &size) == 0 && size))
- BTA_JvRfcommWrite(rs->rfc_handle, (UINT32)rs->id);
+ {
+ int rfc_handle = rs->rfc_handle;
+ UINT32 rs_id = rs->id;
+ //unlock before BTA_JvRfcommWrite to avoid deadlock on concurrnet multi rfcomm connectoins
+ unlock_slot(&slot_lock);
+ BTA_JvRfcommWrite(rfc_handle, rs_id);
+ return;
+ }
}
else
{
- APPL_TRACE_ERROR2("SOCK_THREAD_FD_RD signaled when rfc is not connected, \
+ APPL_TRACE_ERROR("SOCK_THREAD_FD_RD signaled when rfc is not connected, \
slot id:%d, channel:%d", rs->id, rs->scn);
need_close = TRUE;
}
@@ -911,7 +927,7 @@
if(!rs->f.connected || !flush_incoming_que_on_wr_signal(rs))
{
need_close = TRUE;
- APPL_TRACE_ERROR2("SOCK_THREAD_FD_WR signaled when rfc is not connected \
+ APPL_TRACE_ERROR("SOCK_THREAD_FD_WR signaled when rfc is not connected \
or app closed fd, slot id:%d, channel:%d", rs->id, rs->scn);
}
@@ -922,12 +938,12 @@
if(need_close || ioctl(rs->fd, FIONREAD, &size) != 0 || size == 0 )
{
//cleanup when no data pending
- APPL_TRACE_DEBUG3("SOCK_THREAD_FD_EXCEPTION, cleanup, flags:%x, need_close:%d, pending size:%d",
+ APPL_TRACE_DEBUG("SOCK_THREAD_FD_EXCEPTION, cleanup, flags:%x, need_close:%d, pending size:%d",
flags, need_close, size);
cleanup_rfc_slot(rs);
}
else
- APPL_TRACE_DEBUG3("SOCK_THREAD_FD_EXCEPTION, cleanup pending, flags:%x, need_close:%d, pending size:%d",
+ APPL_TRACE_DEBUG("SOCK_THREAD_FD_EXCEPTION, cleanup pending, flags:%x, need_close:%d, pending size:%d",
flags, need_close, size);
}
}
@@ -936,14 +952,14 @@
int bta_co_rfc_data_incoming(void *user_data, BT_HDR *p_buf)
{
- uint32_t id = (uint32_t)user_data;
+ uint32_t id = (uintptr_t)user_data;
int ret = 0;
lock_slot(&slot_lock);
- rfc_slot_t* rs = find_rfc_slot_by_id(id, "bta_co_rfc_data_incoming");
+ rfc_slot_t* rs = find_rfc_slot_by_id(id);
if(rs)
{
- if(!GKI_queue_is_empty(&rs->incoming_que))
- GKI_enqueue(&rs->incoming_que, p_buf);
+ if(!list_is_empty(rs->incoming_queue))
+ list_append(rs->incoming_queue, p_buf);
else
{
int sent = send_data_to_app(rs->fd, p_buf);
@@ -952,7 +968,7 @@
case SENT_NONE:
case SENT_PARTIAL:
//add it to the end of the queue
- GKI_enqueue(&rs->incoming_que, p_buf);
+ list_append(rs->incoming_queue, p_buf);
//monitor the fd to get callback when app is ready to receive data
btsock_thread_add_fd(pth, rs->fd, BTSOCK_RFCOMM, SOCK_THREAD_FD_WR, rs->id);
break;
@@ -972,34 +988,34 @@
}
int bta_co_rfc_data_outgoing_size(void *user_data, int *size)
{
- uint32_t id = (uint32_t)user_data;
+ uint32_t id = (uintptr_t)user_data;
int ret = FALSE;
*size = 0;
lock_slot(&slot_lock);
- rfc_slot_t* rs = find_rfc_slot_by_id(id, "bta_co_rfc_data_outgoing_size");
+ rfc_slot_t* rs = find_rfc_slot_by_id(id);
if(rs)
{
if(ioctl(rs->fd, FIONREAD, size) == 0)
{
- APPL_TRACE_DEBUG2("ioctl read avaiable size:%d, fd:%d", *size, rs->fd);
+ APPL_TRACE_DEBUG("ioctl read avaiable size:%d, fd:%d", *size, rs->fd);
ret = TRUE;
}
else
{
- APPL_TRACE_ERROR2("ioctl FIONREAD error, errno:%d, fd:%d", errno, rs->fd);
+ APPL_TRACE_ERROR("ioctl FIONREAD error, errno:%d, fd:%d", errno, rs->fd);
cleanup_rfc_slot(rs);
}
}
- else APPL_TRACE_ERROR1("bta_co_rfc_data_outgoing_size, invalid slot id:%d", id);
+ else APPL_TRACE_ERROR("bta_co_rfc_data_outgoing_size, invalid slot id:%d", id);
unlock_slot(&slot_lock);
return ret;
}
int bta_co_rfc_data_outgoing(void *user_data, UINT8* buf, UINT16 size)
{
- uint32_t id = (uint32_t)user_data;
+ uint32_t id = (uintptr_t)user_data;
int ret = FALSE;
lock_slot(&slot_lock);
- rfc_slot_t* rs = find_rfc_slot_by_id(id, "bta_co_rfc_data_outgoing");
+ rfc_slot_t* rs = find_rfc_slot_by_id(id);
if(rs)
{
int received = recv(rs->fd, buf, size, 0);
@@ -1007,12 +1023,13 @@
ret = TRUE;
else
{
- APPL_TRACE_ERROR4("recv error, errno:%d, fd:%d, size:%d, received:%d",
+ APPL_TRACE_ERROR("recv error, errno:%d, fd:%d, size:%d, received:%d",
errno, rs->fd, size, received);
cleanup_rfc_slot(rs);
}
}
- else APPL_TRACE_ERROR1("bta_co_rfc_data_outgoing, invalid slot id:%d", id);
+ else APPL_TRACE_ERROR("bta_co_rfc_data_outgoing, invalid slot id:%d", id);
unlock_slot(&slot_lock);
return ret;
}
+
diff --git a/btif/src/btif_sock_sdp.c b/btif/src/btif_sock_sdp.c
index e02a609..afd99ce 100644
--- a/btif/src/btif_sock_sdp.c
+++ b/btif/src/btif_sock_sdp.c
@@ -29,6 +29,7 @@
#include <hardware/bt_sock.h>
#include <sys/types.h>
#include <sys/socket.h>
+#include <stdlib.h>
#include <errno.h>
#define LOG_TAG "BTIF_SOCK_SDP"
@@ -114,7 +115,7 @@
}
}
}
- else APPL_TRACE_ERROR1("failed to create sdp record, service_name:%s", name);
+ else APPL_TRACE_ERROR("failed to create sdp record, service_name:%s", name);
return 0;
}
@@ -143,11 +144,11 @@
UINT32 sdp_handle = 0;
tBTA_PBS_CFG *p_bta_pbs_cfg = (tBTA_PBS_CFG *)&bta_pbs_cfg;
- APPL_TRACE_DEBUG2("add_pbap_sdd:scn %d, service name %s", scn, p_service_name);
+ APPL_TRACE_DEBUG("add_pbap_sdd:scn %d, service name %s", scn, p_service_name);
if ((sdp_handle = SDP_CreateRecord()) == 0)
{
- APPL_TRACE_ERROR0("PBS SDP: Unable to register PBS Service");
+ APPL_TRACE_ERROR("PBS SDP: Unable to register PBS Service");
return sdp_handle;
}
@@ -198,12 +199,12 @@
{
SDP_DeleteRecord(sdp_handle);
sdp_handle = 0;
- APPL_TRACE_ERROR0("bta_pbs_sdp_register FAILED");
+ APPL_TRACE_ERROR("bta_pbs_sdp_register FAILED");
}
else
{
bta_sys_add_uuid(pbs_service); /* UUID_SERVCLASS_PBAP_PSE */
- APPL_TRACE_DEBUG1("PBS: SDP Registered (handle 0x%08x)", sdp_handle);
+ APPL_TRACE_DEBUG("PBS: SDP Registered (handle 0x%08x)", sdp_handle);
}
return sdp_handle;
@@ -213,10 +214,6 @@
* a channel number to a hard coded SDP entry.
* TODO: expose a prober SDP API, to avoid hacks like this, and make it possible
* to set useful names for the ServiceName */
-#define BTA_MAP_MSG_TYPE_EMAIL 0x01
-#define BTA_MAP_MSG_TYPE_SMS_GSM 0x02
-#define BTA_MAP_MSG_TYPE_SMS_CDMA 0x04
-#define BTA_MAP_MSG_TYPE_MMS 0x08
#define BTA_MAPS_DEFAULT_VERSION 0x0101 /* MAP 1.1 */
typedef struct
@@ -225,18 +222,7 @@
const char* service_name; /* Description of the MAS instance */
UINT8 supported_message_types;/* Server supported message types - SMS/MMS/EMAIL */
} tBTA_MAPS_CFG;
-const tBTA_MAPS_CFG bta_maps_cfg_sms =
-{
- 0, /* Mas id 0 is for SMS/MMS */
- "MAP SMS",
- BTA_MAP_MSG_TYPE_SMS_GSM | BTA_MAP_MSG_TYPE_SMS_CDMA
-};
-const tBTA_MAPS_CFG bta_maps_cfg_email =
-{
- 1, /* Mas id 1 is for EMAIL */
- "MAP EMAIL",
- BTA_MAP_MSG_TYPE_EMAIL
-};
+
static int add_maps_sdp(const char* p_service_name, int scn)
{
@@ -245,14 +231,35 @@
UINT16 browse = UUID_SERVCLASS_PUBLIC_BROWSE_GROUP;
BOOLEAN status = FALSE;
UINT32 sdp_handle = 0;
- // TODO: To add support for EMAIL set below depending on the scn to either SMS or Email
- const tBTA_MAPS_CFG *p_bta_maps_cfg = &bta_maps_cfg_sms;
+ char map_handle_buf[3];
+ char map_type_buf[3];
+ char *map_name = (char*)&(p_service_name[4]);
+ tBTA_MAPS_CFG bta_maps_cfg;
+ tBTA_MAPS_CFG *p_bta_maps_cfg;
+ APPL_TRACE_DEBUG("add_maps_sdp: scn %d, service name %s", scn, p_service_name);
- APPL_TRACE_DEBUG2("add_maps_sdd:scn %d, service name %s", scn, p_service_name);
+ /* Service name for map is build as XX|YY|name where XX and YY is
+ * MasId and Type flag as 2byte hex as string */
+ map_handle_buf[0] = p_service_name[0];
+ map_handle_buf[1] = p_service_name[1];
+ map_handle_buf[2] = '\0';
+
+ map_type_buf[0] = p_service_name[2];
+ map_type_buf[1] = p_service_name[3];
+ map_type_buf[2] = '\0';
+
+ p_bta_maps_cfg = &bta_maps_cfg;
+ p_bta_maps_cfg->mas_id = (UINT16)strtol(&map_handle_buf[0],NULL, 16);
+ p_bta_maps_cfg->supported_message_types = (UINT16)strtol(&map_type_buf[0],NULL, 16);
+ p_bta_maps_cfg->service_name = map_name;
+
+ APPL_TRACE_DEBUG(" service_name: %s, mas-id: %d, flags: 0x%02x",
+ p_bta_maps_cfg->service_name, p_bta_maps_cfg->mas_id,
+ p_bta_maps_cfg->supported_message_types);
if ((sdp_handle = SDP_CreateRecord()) == 0)
{
- APPL_TRACE_ERROR0("MAPS SDP: Unable to register MAPS Service");
+ APPL_TRACE_ERROR("MAPS SDP: Unable to register MAPS Service");
return sdp_handle;
}
@@ -304,12 +311,12 @@
{
SDP_DeleteRecord(sdp_handle);
sdp_handle = 0;
- APPL_TRACE_ERROR0("bta_mass_sdp_register FAILED");
+ APPL_TRACE_ERROR("bta_mass_sdp_register FAILED");
}
else
{
bta_sys_add_uuid(service); /* UUID_SERVCLASS_MESSAGE_ACCESS */
- APPL_TRACE_DEBUG1("MAPSS: SDP Registered (handle 0x%08x)", sdp_handle);
+ APPL_TRACE_DEBUG("MAPSS: SDP Registered (handle 0x%08x)", sdp_handle);
}
return sdp_handle;
@@ -353,7 +360,7 @@
UINT32 sdp_handle;
tBTA_OP_FMT_MASK formats = BTUI_OPS_FORMATS;
- APPL_TRACE_DEBUG2("scn %d, service name %s", scn, p_service_name);
+ APPL_TRACE_DEBUG("scn %d, service name %s", scn, p_service_name);
sdp_handle = SDP_CreateRecord();
@@ -416,7 +423,7 @@
tSDP_PROTOCOL_ELEM proto_elem_list[SPP_NUM_PROTO_ELEMS];
int sdp_handle;
- APPL_TRACE_DEBUG2("scn %d, service name %s", scn, service_name);
+ APPL_TRACE_DEBUG("scn %d, service name %s", scn, service_name);
/* register the service */
if ((sdp_handle = SDP_CreateRecord()) != FALSE)
@@ -450,12 +457,11 @@
}
-
static int add_rfc_sdp_by_uuid(const char* name, const uint8_t* uuid, int scn)
{
int handle = 0;
- APPL_TRACE_DEBUG2("name:%s, scn:%d", name, scn);
+ APPL_TRACE_DEBUG("name:%s, scn:%d", name, scn);
/*
Bluetooth Socket API relies on having preregistered bluez sdp records for HSAG, HFAG, OPP & PBAP
@@ -546,7 +552,7 @@
void del_rfc_sdp_rec(int handle)
{
- APPL_TRACE_DEBUG1("del_rfc_sdp_rec: handle:0x%x", handle);
+ APPL_TRACE_DEBUG("del_rfc_sdp_rec: handle:0x%x", handle);
if(handle != -1 && handle != 0)
BTA_JvDeleteRecord( handle );
}
diff --git a/btif/src/btif_sock_thread.c b/btif/src/btif_sock_thread.c
index 475b8de..687a1c5 100644
--- a/btif/src/btif_sock_thread.c
+++ b/btif/src/btif_sock_thread.c
@@ -60,16 +60,16 @@
#include "btif_sock_util.h"
#include <cutils/log.h>
-#define asrt(s) if(!(s)) APPL_TRACE_ERROR3("## %s assert %s failed at line:%d ##",__FUNCTION__, #s, __LINE__)
+#define asrt(s) if(!(s)) APPL_TRACE_ERROR("## %s assert %s failed at line:%d ##",__FUNCTION__, #s, __LINE__)
#define print_events(events) do { \
- APPL_TRACE_DEBUG1("print poll event:%x", events); \
- if (events & POLLIN) APPL_TRACE_DEBUG0( " POLLIN "); \
- if (events & POLLPRI) APPL_TRACE_DEBUG0( " POLLPRI "); \
- if (events & POLLOUT) APPL_TRACE_DEBUG0( " POLLOUT "); \
- if (events & POLLERR) APPL_TRACE_DEBUG0( " POLLERR "); \
- if (events & POLLHUP) APPL_TRACE_DEBUG0( " POLLHUP "); \
- if (events & POLLNVAL) APPL_TRACE_DEBUG0(" POLLNVAL "); \
- if (events & POLLRDHUP) APPL_TRACE_DEBUG0(" POLLRDHUP"); \
+ APPL_TRACE_DEBUG("print poll event:%x", events); \
+ if (events & POLLIN) APPL_TRACE_DEBUG( " POLLIN "); \
+ if (events & POLLPRI) APPL_TRACE_DEBUG( " POLLPRI "); \
+ if (events & POLLOUT) APPL_TRACE_DEBUG( " POLLOUT "); \
+ if (events & POLLERR) APPL_TRACE_DEBUG( " POLLERR "); \
+ if (events & POLLHUP) APPL_TRACE_DEBUG( " POLLHUP "); \
+ if (events & POLLNVAL) APPL_TRACE_DEBUG(" POLLNVAL "); \
+ if (events & POLLRDHUP) APPL_TRACE_DEBUG(" POLLRDHUP"); \
} while(0)
#define MAX_THREAD 8
@@ -116,7 +116,7 @@
{
int opts;
opts = fcntl(s, F_GETFL);
- if (opts<0) APPL_TRACE_ERROR1("set blocking (%s)", strerror(errno));
+ if (opts<0) APPL_TRACE_ERROR("set blocking (%s)", strerror(errno));
if(blocking)
opts &= ~O_NONBLOCK;
else opts |= O_NONBLOCK;
@@ -126,17 +126,17 @@
static inline int create_server_socket(const char* name)
{
int s = socket(AF_LOCAL, SOCK_STREAM, 0);
- APPL_TRACE_DEBUG1("covert name to android abstract name:%s", name);
+ APPL_TRACE_DEBUG("covert name to android abstract name:%s", name);
if(socket_local_server_bind(s, name, ANDROID_SOCKET_NAMESPACE_ABSTRACT) >= 0)
{
if(listen(s, 5) == 0)
{
- APPL_TRACE_DEBUG2("listen to local socket:%s, fd:%d", name, s);
+ APPL_TRACE_DEBUG("listen to local socket:%s, fd:%d", name, s);
return s;
}
- else APPL_TRACE_ERROR3("listen to local socket:%s, fd:%d failed, errno:%d", name, s, errno);
+ else APPL_TRACE_ERROR("listen to local socket:%s, fd:%d failed, errno:%d", name, s, errno);
}
- else APPL_TRACE_ERROR3("create local socket:%s fd:%d, failed, errno:%d", name, s, errno);
+ else APPL_TRACE_ERROR("create local socket:%s fd:%d, failed, errno:%d", name, s, errno);
close(s);
return -1;
}
@@ -146,10 +146,10 @@
set_socket_blocking(s, TRUE);
if(socket_local_client_connect(s, name, ANDROID_SOCKET_NAMESPACE_ABSTRACT, SOCK_STREAM) >= 0)
{
- APPL_TRACE_DEBUG2("connected to local socket:%s, fd:%d", name, s);
+ APPL_TRACE_DEBUG("connected to local socket:%s, fd:%d", name, s);
return s;
}
- else APPL_TRACE_ERROR3("connect to local socket:%s, fd:%d failed, errno:%d", name, s, errno);
+ else APPL_TRACE_ERROR("connect to local socket:%s, fd:%d failed, errno:%d", name, s, errno);
close(s);
return -1;
}
@@ -158,7 +158,7 @@
struct sockaddr_un client_address;
socklen_t clen;
int fd = accept(s, (struct sockaddr*)&client_address, &clen);
- APPL_TRACE_DEBUG2("accepted fd:%d for server fd:%d", fd, s);
+ APPL_TRACE_DEBUG("accepted fd:%d for server fd:%d", fd, s);
return fd;
}
static inline pthread_t create_thread(void *(*start_routine)(void *), void * arg)
@@ -169,7 +169,7 @@
pthread_t thread_id = -1;
if( pthread_create(&thread_id, &thread_attr, start_routine, arg)!=0 )
{
- APPL_TRACE_ERROR1("pthread_create : %s", strerror(errno));
+ APPL_TRACE_ERROR("pthread_create : %s", strerror(errno));
return -1;
}
return thread_id;
@@ -181,14 +181,14 @@
//revserd order to save guard uninitialized access to 0 index
for(i = MAX_THREAD - 1; i >=0; i--)
{
- APPL_TRACE_DEBUG2("ts[%d].used:%d", i, ts[i].used);
+ APPL_TRACE_DEBUG("ts[%d].used:%d", i, ts[i].used);
if(!ts[i].used)
{
ts[i].used = 1;
return i;
}
}
- APPL_TRACE_ERROR0("execeeded max thread count");
+ APPL_TRACE_ERROR("execeeded max thread count");
return -1;
}
static void free_thread_slot(int h)
@@ -198,12 +198,12 @@
close_cmd_fd(h);
ts[h].used = 0;
}
- else APPL_TRACE_ERROR1("invalid thread handle:%d", h);
+ else APPL_TRACE_ERROR("invalid thread handle:%d", h);
}
int btsock_thread_init()
{
static int initialized;
- APPL_TRACE_DEBUG1("in initialized:%d", initialized);
+ APPL_TRACE_DEBUG("in initialized:%d", initialized);
if(!initialized)
{
initialized = 1;
@@ -228,13 +228,13 @@
lock_slot(&thread_slot_lock);
int h = alloc_thread_slot();
unlock_slot(&thread_slot_lock);
- APPL_TRACE_DEBUG1("alloc_thread_slot ret:%d", h);
+ APPL_TRACE_DEBUG("alloc_thread_slot ret:%d", h);
if(h >= 0)
{
init_poll(h);
- if((ts[h].thread_id = create_thread(sock_poll_thread, (void*)h)) != -1)
+ if((ts[h].thread_id = create_thread(sock_poll_thread, (void*)(uintptr_t)h)) != -1)
{
- APPL_TRACE_DEBUG2("h:%d, thread id:%d", h, ts[h].thread_id);
+ APPL_TRACE_DEBUG("h:%d, thread id:%d", h, ts[h].thread_id);
ts[h].callback = callback;
ts[h].cmd_callback = cmd_callback;
}
@@ -253,10 +253,10 @@
asrt(ts[h].cmd_fdr == -1 && ts[h].cmd_fdw == -1);
if(socketpair(AF_UNIX, SOCK_STREAM, 0, &ts[h].cmd_fdr) < 0)
{
- APPL_TRACE_ERROR1("socketpair failed: %s", strerror(errno));
+ APPL_TRACE_ERROR("socketpair failed: %s", strerror(errno));
return;
}
- APPL_TRACE_DEBUG3("h:%d, cmd_fdr:%d, cmd_fdw:%d", h, ts[h].cmd_fdr, ts[h].cmd_fdw);
+ APPL_TRACE_DEBUG("h:%d, cmd_fdr:%d, cmd_fdw:%d", h, ts[h].cmd_fdr, ts[h].cmd_fdw);
//add the cmd fd for read & write
add_poll(h, ts[h].cmd_fdr, 0, SOCK_THREAD_FD_RD, 0);
}
@@ -285,12 +285,12 @@
{
if(h < 0 || h >= MAX_THREAD)
{
- APPL_TRACE_ERROR1("invalid bt thread handle:%d", h);
+ APPL_TRACE_ERROR("invalid bt thread handle:%d", h);
return FALSE;
}
if(ts[h].cmd_fdw == -1)
{
- APPL_TRACE_ERROR0("cmd socket is not created. socket thread may not initialized");
+ APPL_TRACE_ERROR("cmd socket is not created. socket thread may not initialized");
return FALSE;
}
if(flags & SOCK_THREAD_ADD_FD_SYNC)
@@ -303,26 +303,26 @@
add_poll(h, fd, type, flags, user_id);
return TRUE;
}
- APPL_TRACE_DEBUG0("THREAD_ADD_FD_SYNC is not called in poll thread, fallback to async");
+ APPL_TRACE_DEBUG("THREAD_ADD_FD_SYNC is not called in poll thread, fallback to async");
}
sock_cmd_t cmd = {CMD_ADD_FD, fd, type, flags, user_id};
- APPL_TRACE_DEBUG2("adding fd:%d, flags:0x%x", fd, flags);
+ APPL_TRACE_DEBUG("adding fd:%d, flags:0x%x", fd, flags);
return send(ts[h].cmd_fdw, &cmd, sizeof(cmd), 0) == sizeof(cmd);
}
int btsock_thread_post_cmd(int h, int type, const unsigned char* data, int size, uint32_t user_id)
{
if(h < 0 || h >= MAX_THREAD)
{
- APPL_TRACE_ERROR1("invalid bt thread handle:%d", h);
+ APPL_TRACE_ERROR("invalid bt thread handle:%d", h);
return FALSE;
}
if(ts[h].cmd_fdw == -1)
{
- APPL_TRACE_ERROR0("cmd socket is not created. socket thread may not initialized");
+ APPL_TRACE_ERROR("cmd socket is not created. socket thread may not initialized");
return FALSE;
}
sock_cmd_t cmd = {CMD_USER_PRIVATE, 0, type, size, user_id};
- APPL_TRACE_DEBUG3("post cmd type:%d, size:%d, h:%d, ", type, size, h);
+ APPL_TRACE_DEBUG("post cmd type:%d, size:%d, h:%d, ", type, size, h);
sock_cmd_t* cmd_send = &cmd;
int size_send = sizeof(cmd);
if(data && size)
@@ -336,7 +336,7 @@
}
else
{
- APPL_TRACE_ERROR3("alloca failed at h:%d, cmd type:%d, size:%d", h, type, size_send);
+ APPL_TRACE_ERROR("alloca failed at h:%d, cmd type:%d, size:%d", h, type, size_send);
return FALSE;
}
}
@@ -346,12 +346,12 @@
{
if(h < 0 || h >= MAX_THREAD)
{
- APPL_TRACE_ERROR1("invalid bt thread handle:%d", h);
+ APPL_TRACE_ERROR("invalid bt thread handle:%d", h);
return FALSE;
}
if(ts[h].cmd_fdw == -1)
{
- APPL_TRACE_ERROR1("thread handle:%d, cmd socket is not created", h);
+ APPL_TRACE_ERROR("thread handle:%d, cmd socket is not created", h);
return FALSE;
}
sock_cmd_t cmd = {CMD_WAKEUP, 0, 0, 0, 0};
@@ -361,12 +361,12 @@
{
if(h < 0 || h >= MAX_THREAD)
{
- APPL_TRACE_ERROR1("invalid bt thread handle:%d", h);
+ APPL_TRACE_ERROR("invalid bt thread handle:%d", h);
return FALSE;
}
if(ts[h].cmd_fdw == -1)
{
- APPL_TRACE_ERROR0("cmd socket is not created");
+ APPL_TRACE_ERROR("cmd socket is not created");
return FALSE;
}
sock_cmd_t cmd = {CMD_EXIT, 0, 0, 0, 0};
@@ -410,7 +410,7 @@
ps->pfd.fd = fd;
ps->user_id = user_id;
if(ps->type != 0 && ps->type != type)
- APPL_TRACE_ERROR2("poll socket type should not changed! type was:%d, type now:%d", ps->type, type);
+ APPL_TRACE_ERROR("poll socket type should not changed! type was:%d, type now:%d", ps->type, type);
ps->type = type;
ps->flags = flags;
ps->pfd.events = flags2pevents(flags);
@@ -442,7 +442,7 @@
++ts[h].poll_count;
return;
}
- APPL_TRACE_ERROR1("exceeded max poll slot:%d!", MAX_POLL);
+ APPL_TRACE_ERROR("exceeded max poll slot:%d!", MAX_POLL);
}
static inline void remove_poll(int h, poll_slot_t* ps, int flags)
{
@@ -467,10 +467,10 @@
int fd = ts[h].cmd_fdr;
if(recv(fd, &cmd, sizeof(cmd), MSG_WAITALL) != sizeof(cmd))
{
- APPL_TRACE_ERROR1("recv cmd errno:%d", errno);
+ APPL_TRACE_ERROR("recv cmd errno:%d", errno);
return FALSE;
}
- APPL_TRACE_DEBUG1("cmd.id:%d", cmd.id);
+ APPL_TRACE_DEBUG("cmd.id:%d", cmd.id);
switch(cmd.id)
{
case CMD_ADD_FD:
@@ -486,7 +486,7 @@
case CMD_EXIT:
return FALSE;
default:
- APPL_TRACE_DEBUG1("unknown cmd: %d", cmd.id);
+ APPL_TRACE_DEBUG("unknown cmd: %d", cmd.id);
break;
}
return TRUE;
@@ -538,7 +538,7 @@
{
if(ps_i >= MAX_POLL)
{
- APPL_TRACE_ERROR4("exceed max poll range, ps_i:%d, MAX_POLL:%d, count:%d, ts[h].poll_count:%d",
+ APPL_TRACE_ERROR("exceed max poll range, ps_i:%d, MAX_POLL:%d, count:%d, ts[h].poll_count:%d",
ps_i, MAX_POLL, count, ts[h].poll_count);
return;
}
@@ -556,14 +556,14 @@
{
struct pollfd pfds[MAX_POLL];
memset(pfds, 0, sizeof(pfds));
- int h = (int)arg;
+ int h = (intptr_t)arg;
for(;;)
{
prepare_poll_fds(h, pfds);
int ret = poll(pfds, ts[h].poll_count, -1);
if(ret == -1)
{
- APPL_TRACE_ERROR2("poll ret -1, exit the thread, errno:%d, err:%s", errno, strerror(errno));
+ APPL_TRACE_ERROR("poll ret -1, exit the thread, errno:%d, err:%s", errno, strerror(errno));
break;
}
if(ret != 0)
@@ -574,7 +574,7 @@
asrt(pfds[0].fd == ts[h].cmd_fdr);
if(!process_cmd_sock(h))
{
- APPL_TRACE_DEBUG1("h:%d, process_cmd_sock return false, exit...", h);
+ APPL_TRACE_DEBUG("h:%d, process_cmd_sock return false, exit...", h);
break;
}
if(ret == 1)
@@ -584,10 +584,10 @@
if(need_process_data_fd)
process_data_sock(h, pfds, ret);
}
- else {APPL_TRACE_DEBUG1("no data, select ret: %d", ret)};
+ else {APPL_TRACE_DEBUG("no data, select ret: %d", ret)};
}
ts[h].thread_id = -1;
- APPL_TRACE_DEBUG1("socket poll thread exiting, h:%d", h);
+ APPL_TRACE_DEBUG("socket poll thread exiting, h:%d", h);
return 0;
}
diff --git a/btif/src/btif_sock_util.c b/btif/src/btif_sock_util.c
index 5b5de69..42089ed 100644
--- a/btif/src/btif_sock_util.c
+++ b/btif/src/btif_sock_util.c
@@ -66,7 +66,7 @@
#include "bta_jv_co.h"
#include "port_api.h"
-#define asrt(s) if(!(s)) BTIF_TRACE_ERROR3("## %s assert %s failed at line:%d ##",__FUNCTION__, #s, __LINE__)
+#define asrt(s) if(!(s)) BTIF_TRACE_ERROR("## %s assert %s failed at line:%d ##",__FUNCTION__, #s, __LINE__)
int sock_send_all(int sock_fd, const uint8_t* buf, int len)
@@ -79,7 +79,7 @@
while(ret < 0 && errno == EINTR);
if(ret <= 0)
{
- BTIF_TRACE_ERROR3("sock fd:%d send errno:%d, ret:%d", sock_fd, errno, ret);
+ BTIF_TRACE_ERROR("sock fd:%d send errno:%d, ret:%d", sock_fd, errno, ret);
return -1;
}
buf += ret;
@@ -97,7 +97,7 @@
while(ret < 0 && errno == EINTR);
if(ret <= 0)
{
- BTIF_TRACE_ERROR3("sock fd:%d recv errno:%d, ret:%d", sock_fd, errno, ret);
+ BTIF_TRACE_ERROR("sock fd:%d recv errno:%d, ret:%d", sock_fd, errno, ret);
return -1;
}
buf += ret;
@@ -145,7 +145,7 @@
} while (ret < 0 && errno == EINTR);
if (ret < 0) {
- BTIF_TRACE_ERROR5("fd:%d, send_fd:%d, sendmsg ret:%d, errno:%d, %s",
+ BTIF_TRACE_ERROR("fd:%d, send_fd:%d, sendmsg ret:%d, errno:%d, %s",
sock_fd, send_fd, (int)ret, errno, strerror(errno));
ret_len = -1;
break;
@@ -157,7 +157,7 @@
// Wipes out any msg_control too
memset(&msg, 0, sizeof(msg));
}
- BTIF_TRACE_DEBUG1("close fd:%d after sent", send_fd);
+ BTIF_TRACE_DEBUG("close fd:%d after sent", send_fd);
close(send_fd);
return ret_len;
}
diff --git a/btif/src/btif_storage.c b/btif/src/btif_storage.c
index 8f41ce5..5b1bf96 100644
--- a/btif/src/btif_storage.c
+++ b/btif/src/btif_storage.c
@@ -1,5 +1,6 @@
/******************************************************************************
*
+ * Copyright (c) 2014 The Android Open Source Project
* Copyright (C) 2009-2012 Broadcom Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -41,7 +42,9 @@
#include "btif_storage.h"
#include "btif_util.h"
#include "bd.h"
+#include "config.h"
#include "gki.h"
+#include "osi.h"
#include "bta_hh_api.h"
#include "btif_hh.h"
@@ -81,9 +84,6 @@
#define BTIF_STORAGE_KEY_AUTOPAIR_DYNAMIC_BLACKLIST_ADDR "DynamicAddressBlacklist"
#define BTIF_AUTO_PAIR_CONF_VALUE_SEPARATOR ","
-#define BTIF_AUTO_PAIR_CONF_SPACE ' '
-#define BTIF_AUTO_PAIR_CONF_COMMENT '#'
-#define BTIF_AUTO_PAIR_CONF_KEY_VAL_DELIMETER "="
/* This is a local property to add a device found */
@@ -186,35 +186,6 @@
/*******************************************************************************
**
-** Function btif_in_make_filename
-**
-** Description Internal helper function to create NVRAM file path
-** from address and filename
-**
-** Returns NVRAM file path if successfull, NULL otherwise
-**
-*******************************************************************************/
-static char* btif_in_make_filename(bt_bdaddr_t *bd_addr, char *fname)
-{
- static char path[256];
- bdstr_t bdstr;
-
- if (fname == NULL)return NULL;
- if (bd_addr)
- {
- sprintf(path, "%s/%s/%s", BTIF_STORAGE_PATH_BLUEDROID,
- bd2str(bd_addr, &bdstr), fname);
- }
- else
- {
- /* local adapter */
- sprintf(path, "%s/LOCAL/%s", BTIF_STORAGE_PATH_BLUEDROID, fname);
- }
-
- return(char*)path;
-}
-/*******************************************************************************
-**
** Function btif_in_split_uuids_string_to_list
**
** Description Internal helper function to split the string of UUIDs
@@ -249,11 +220,11 @@
bdstr_t bdstr = {0};
if(remote_bd_addr)
bd2str(remote_bd_addr, &bdstr);
- BTIF_TRACE_DEBUG3("in, bd addr:%s, prop type:%d, len:%d", bdstr, prop->type, prop->len);
+ BTIF_TRACE_DEBUG("in, bd addr:%s, prop type:%d, len:%d", bdstr, prop->type, prop->len);
char value[1024];
if(prop->len <= 0 || prop->len > (int)sizeof(value) - 1)
{
- BTIF_TRACE_ERROR2("property type:%d, len:%d is invalid", prop->type, prop->len);
+ BTIF_TRACE_ERROR("property type:%d, len:%d is invalid", prop->type, prop->len);
return FALSE;
}
switch(prop->type)
@@ -274,11 +245,15 @@
BTIF_STORAGE_PATH_REMOTE_NAME, value);
else btif_config_set_str("Local", "Adapter",
BTIF_STORAGE_KEY_ADAPTER_NAME, value);
+ /* save name immediately */
+ btif_config_save();
break;
case BT_PROPERTY_REMOTE_FRIENDLY_NAME:
strncpy(value, (char*)prop->val, prop->len);
value[prop->len]='\0';
btif_config_set_str("Remote", bdstr, BTIF_STORAGE_PATH_REMOTE_ALIASE, value);
+ /* save friendly name immediately */
+ btif_config_save();
break;
case BT_PROPERTY_ADAPTER_SCAN_MODE:
btif_config_set_int("Local", "Adapter",
@@ -331,7 +306,7 @@
} break;
default:
- BTIF_TRACE_ERROR1("Unknow prop type:%d", prop->type);
+ BTIF_TRACE_ERROR("Unknow prop type:%d", prop->type);
return FALSE;
}
return TRUE;
@@ -341,10 +316,10 @@
bdstr_t bdstr = {0};
if(remote_bd_addr)
bd2str(remote_bd_addr, &bdstr);
- BTIF_TRACE_DEBUG3("in, bd addr:%s, prop type:%d, len:%d", bdstr, prop->type, prop->len);
+ BTIF_TRACE_DEBUG("in, bd addr:%s, prop type:%d, len:%d", bdstr, prop->type, prop->len);
if(prop->len <= 0)
{
- BTIF_TRACE_ERROR2("property type:%d, len:%d is invalid", prop->type, prop->len);
+ BTIF_TRACE_ERROR("property type:%d, len:%d is invalid", prop->type, prop->len);
return FALSE;
}
int ret = FALSE;
@@ -446,12 +421,58 @@
} break;
default:
- BTIF_TRACE_ERROR1("Unknow prop type:%d", prop->type);
+ BTIF_TRACE_ERROR("Unknow prop type:%d", prop->type);
return FALSE;
}
return ret;
}
+/*******************************************************************************
+**
+** Function btif_in_fetch_bonded_devices
+**
+** Description Internal helper function to fetch the bonded devices
+** from NVRAM
+**
+** Returns BT_STATUS_SUCCESS if successful, BT_STATUS_FAIL otherwise
+**
+*******************************************************************************/
+static bt_status_t btif_in_fetch_bonded_device(char *bdstr)
+{
+ BOOLEAN bt_linkkey_file_found=FALSE;
+ int device_type;
+
+ int type = BTIF_CFG_TYPE_BIN;
+ LINK_KEY link_key;
+ int size = sizeof(link_key);
+ if(btif_config_get("Remote", bdstr, "LinkKey", (char*)link_key, &size, &type))
+ {
+ int linkkey_type;
+ if(btif_config_get_int("Remote", bdstr, "LinkKeyType", &linkkey_type))
+ {
+ bt_linkkey_file_found = TRUE;
+ }
+ else
+ {
+ bt_linkkey_file_found = FALSE;
+ }
+ }
+#if (BLE_INCLUDED == TRUE)
+ if((btif_in_fetch_bonded_ble_device(bdstr, FALSE, NULL) != BT_STATUS_SUCCESS)
+ && (!bt_linkkey_file_found))
+ {
+ BTIF_TRACE_DEBUG("Remote device:%s, no link key or ble key found", bdstr);
+ return BT_STATUS_FAIL;
+ }
+#else
+ if((!bt_linkkey_file_found))
+ {
+ BTIF_TRACE_DEBUG("Remote device:%s, no link key found", bdstr);
+ return BT_STATUS_FAIL;
+ }
+#endif
+ return BT_STATUS_SUCCESS;
+}
/*******************************************************************************
**
@@ -465,7 +486,7 @@
*******************************************************************************/
static bt_status_t btif_in_fetch_bonded_devices(btif_bonded_devices_t *p_bonded_devices, int add)
{
- BTIF_TRACE_DEBUG1("in add:%d", add);
+ BTIF_TRACE_DEBUG("in add:%d", add);
memset(p_bonded_devices, 0, sizeof(btif_bonded_devices_t));
char kname[128], vname[128];
@@ -480,7 +501,7 @@
do
{
kpos = btif_config_next_key(kpos, "Remote", kname, &kname_size);
- BTIF_TRACE_DEBUG2("Remote device:%s, size:%d", kname, kname_size);
+ BTIF_TRACE_DEBUG("Remote device:%s, size:%d", kname, kname_size);
int type = BTIF_CFG_TYPE_BIN;
LINK_KEY link_key;
int size = sizeof(link_key);
@@ -517,49 +538,26 @@
#if (BLE_INCLUDED == TRUE)
bt_linkkey_file_found = FALSE;
#else
- BTIF_TRACE_ERROR1("bounded device:%s, LinkKeyType or PinLength is invalid", kname);
+ BTIF_TRACE_ERROR("bounded device:%s, LinkKeyType or PinLength is invalid", kname);
#endif
}
}
#if (BLE_INCLUDED == TRUE)
if(!(btif_in_fetch_bonded_ble_device(kname,add, p_bonded_devices)) && (!bt_linkkey_file_found))
{
- BTIF_TRACE_DEBUG1("Remote device:%s, no link key or ble key found", kname);
+ BTIF_TRACE_DEBUG("Remote device:%s, no link key or ble key found", kname);
}
#else
if(!bt_linkkey_file_found)
- BTIF_TRACE_DEBUG1("Remote device:%s, no link key", kname);
+ BTIF_TRACE_DEBUG("Remote device:%s, no link key", kname);
#endif
kname_size = sizeof(kname);
kname[0] = 0;
} while(kpos != -1);
- BTIF_TRACE_DEBUG0("out");
+ BTIF_TRACE_DEBUG("out");
return BT_STATUS_SUCCESS;
}
-static int hex_str_to_int(const char* str, int size)
-{
- int n = 0;
- char c = *str++;
- while (size-- != 0)
- {
- n <<= 4;
- if (c >= '0' && c <= '9') {
- n |= c - '0';
- }
- else if (c >= 'a' && c <= 'z') {
- n |= c - 'a' + 10;
- }
- else // (c >= 'A' && c <= 'Z')
- {
- n |= c - 'A' + 10;
- }
-
- c = *str++;
- }
- return n;
-}
-
/************************************************************************************
** Externs
************************************************************************************/
@@ -605,7 +603,7 @@
btif_in_fetch_bonded_devices(&bonded_devices, 0);
- BTIF_TRACE_DEBUG2("%s: Number of bonded devices: %d Property:BT_PROPERTY_ADAPTER_BONDED_DEVICES", __FUNCTION__, bonded_devices.num_devices);
+ BTIF_TRACE_DEBUG("%s: Number of bonded devices: %d Property:BT_PROPERTY_ADAPTER_BONDED_DEVICES", __FUNCTION__, bonded_devices.num_devices);
if (bonded_devices.num_devices > 0)
{
@@ -624,7 +622,7 @@
uint32_t i;
tBTA_SERVICE_MASK service_mask = btif_get_enabled_services_mask();
- BTIF_TRACE_ERROR2("%s service_mask:0x%x", __FUNCTION__, service_mask);
+ BTIF_TRACE_ERROR("%s service_mask:0x%x", __FUNCTION__, service_mask);
for (i=0; i < BTA_MAX_SERVICE_ID; i++)
{
/* This should eventually become a function when more services are enabled */
@@ -652,6 +650,12 @@
p_uuid+num_uuids);
num_uuids++;
}break;
+ case BTA_HFP_HS_SERVICE_ID:
+ {
+ uuid16_to_uuid128(UUID_SERVCLASS_HF_HANDSFREE,
+ p_uuid+num_uuids);
+ num_uuids++;
+ }break;
}
}
}
@@ -783,7 +787,8 @@
int ret = btif_config_set_int("Remote", bdstr, "LinkKeyType", (int)key_type);
ret &= btif_config_set_int("Remote", bdstr, "PinLength", (int)pin_length);
ret &= btif_config_set("Remote", bdstr, "LinkKey", (const char*)link_key, sizeof(LINK_KEY), BTIF_CFG_TYPE_BIN);
- btif_config_save();
+ /* write bonded info immediately */
+ btif_config_flush();
return ret ? BT_STATUS_SUCCESS : BT_STATUS_FAIL;
}
@@ -801,11 +806,16 @@
{
bdstr_t bdstr;
bd2str(remote_bd_addr, &bdstr);
- BTIF_TRACE_DEBUG1("in bd addr:%s", bdstr);
- int ret = btif_config_remove("Remote", bdstr, "LinkKeyType");
- ret &= btif_config_remove("Remote", bdstr, "PinLength");
- ret &= btif_config_remove("Remote", bdstr, "LinkKey");
- btif_config_save();
+ BTIF_TRACE_DEBUG("in bd addr:%s", bdstr);
+ int ret = 1;
+ if(btif_config_exist("Remote", bdstr, "LinkKeyType"))
+ ret &= btif_config_remove("Remote", bdstr, "LinkKeyType");
+ if(btif_config_exist("Remote", bdstr, "PinLength"))
+ ret &= btif_config_remove("Remote", bdstr, "PinLength");
+ if(btif_config_exist("Remote", bdstr, "LinkKey"))
+ ret &= btif_config_remove("Remote", bdstr, "LinkKey");
+ /* write bonded info immediately */
+ btif_config_flush();
return ret ? BT_STATUS_SUCCESS : BT_STATUS_FAIL;
}
@@ -894,7 +904,7 @@
free(devices_list);
}
- BTIF_TRACE_EVENT2("%s: %d bonded devices found", __FUNCTION__, bonded_devices.num_devices);
+ BTIF_TRACE_EVENT("%s: %d bonded devices found", __FUNCTION__, bonded_devices.num_devices);
{
for (i = 0; i < bonded_devices.num_devices; i++)
@@ -1041,7 +1051,7 @@
{
bdstr_t bdstr;
bd2str(remote_bd_addr, &bdstr);
- BTIF_TRACE_DEBUG2(" %s in bd addr:%s",__FUNCTION__, bdstr);
+ BTIF_TRACE_DEBUG(" %s in bd addr:%s",__FUNCTION__, bdstr);
int ret = 1;
if(btif_config_exist("Remote", bdstr, "LE_KEY_PENC"))
ret &= btif_config_remove("Remote", bdstr, "LE_KEY_PENC");
@@ -1166,13 +1176,14 @@
bt_bdaddr_t bd_addr;
BD_ADDR bta_bd_addr;
BOOLEAN is_device_added =FALSE;
+ BOOLEAN key_found = FALSE;
tBTA_LE_KEY_VALUE *p;
if(!btif_config_get_int("Remote", remote_bd_addr,"DevType", &device_type))
return BT_STATUS_FAIL;
if(device_type == BT_DEVICE_TYPE_BLE)
{
- BTIF_TRACE_DEBUG2("%s %s found a BLE device", __FUNCTION__,remote_bd_addr);
+ BTIF_TRACE_DEBUG("%s %s found a BLE device", __FUNCTION__,remote_bd_addr);
str2bd(remote_bd_addr, &bd_addr);
bdcpy(bta_bd_addr, bd_addr.address);
if (btif_storage_get_remote_addr_type(&bd_addr, &addr_type) != BT_STATUS_SUCCESS)
@@ -1196,24 +1207,25 @@
p = (tBTA_LE_KEY_VALUE *)buf;
for (i=0; i<16; i++)
{
- BTIF_TRACE_DEBUG2("penc_key.ltk[%d]=0x%02x",i,p->penc_key.ltk[i]);
+ BTIF_TRACE_DEBUG("penc_key.ltk[%d]=0x%02x",i,p->penc_key.ltk[i]);
}
for (i=0; i<8; i++)
{
- BTIF_TRACE_DEBUG2("penc_key.rand[%d]=0x%02x",i,p->penc_key.rand[i]);
+ BTIF_TRACE_DEBUG("penc_key.rand[%d]=0x%02x",i,p->penc_key.rand[i]);
}
- BTIF_TRACE_DEBUG1("p->penc_key.ediv=0x%04x",p->penc_key.ediv);
- BTIF_TRACE_DEBUG1("p->penc_key.sec_level=0x%02x",p->penc_key.sec_level);
- BTIF_TRACE_DEBUG1("p->penc_key.key_size=0x%02x",p->penc_key.key_size);
+ BTIF_TRACE_DEBUG("p->penc_key.ediv=0x%04x",p->penc_key.ediv);
+ BTIF_TRACE_DEBUG("p->penc_key.sec_level=0x%02x",p->penc_key.sec_level);
+ BTIF_TRACE_DEBUG("p->penc_key.key_size=0x%02x",p->penc_key.key_size);
BTA_DmAddBleKey (bta_bd_addr, (tBTA_LE_KEY_VALUE *)buf, BTIF_DM_LE_KEY_PENC);
}
+ key_found = TRUE;
}
memset(buf, 0, sizeof(buf));
if (btif_storage_get_ble_bonding_key(&bd_addr,
BTIF_DM_LE_KEY_PID,
buf,
- sizeof(btif_dm_ble_pcsrk_keys_t)) == BT_STATUS_SUCCESS)
+ sizeof(btif_dm_ble_pid_keys_t)) == BT_STATUS_SUCCESS)
{
if(add)
{
@@ -1225,11 +1237,19 @@
p = (tBTA_LE_KEY_VALUE *)buf;
for (i=0; i<16; i++)
{
- BTIF_TRACE_DEBUG2("p->pid_key[%d]=0x%02x",i,p->pid_key.irk[i]);
+ BTIF_TRACE_DEBUG("p->pid_key.irk[%d]=0x%02x"
+ ,i,p->pid_key.irk[i]);
+ }
+ BTIF_TRACE_DEBUG("p->pid_key.addr_type=%d",p->pid_key.addr_type);
+ for (i=0; i<BD_ADDR_LEN; i++)
+ {
+ BTIF_TRACE_DEBUG("p->pid_key.static_addr[%d]=%02x"
+ ,i,p->pid_key.static_addr[i]);
}
BTA_DmAddBleKey (bta_bd_addr, (tBTA_LE_KEY_VALUE *)buf, BTIF_DM_LE_KEY_PID);
}
+ key_found = TRUE;
}
memset(buf, 0, sizeof(buf));
@@ -1249,13 +1269,14 @@
p = (tBTA_LE_KEY_VALUE *)buf;
for (i=0; i<16; i++)
{
- BTIF_TRACE_DEBUG2("p->pcsrk_key.csrk[%d]=0x%02x",i, p->psrk_key.csrk[i]);
+ BTIF_TRACE_DEBUG("p->pcsrk_key.csrk[%d]=0x%02x",i, p->psrk_key.csrk[i]);
}
- BTIF_TRACE_DEBUG1("p->pcsrk_key.counter=0x%08x",p->psrk_key.counter);
- BTIF_TRACE_DEBUG1("p->pcsrk_key.sec_level=0x%02x",p->psrk_key.sec_level);
+ BTIF_TRACE_DEBUG("p->pcsrk_key.counter=0x%08x",p->psrk_key.counter);
+ BTIF_TRACE_DEBUG("p->pcsrk_key.sec_level=0x%02x",p->psrk_key.sec_level);
BTA_DmAddBleKey (bta_bd_addr, (tBTA_LE_KEY_VALUE *)buf, BTIF_DM_LE_KEY_PCSRK);
}
+ key_found = TRUE;
}
memset(buf, 0, sizeof(buf));
@@ -1272,12 +1293,13 @@
is_device_added = TRUE;
}
p = (tBTA_LE_KEY_VALUE *)buf;
- BTIF_TRACE_DEBUG1("p->lenc_key.div=0x%04x",p->lenc_key.div);
- BTIF_TRACE_DEBUG1("p->lenc_key.key_size=0x%02x",p->lenc_key.key_size);
- BTIF_TRACE_DEBUG1("p->lenc_key.sec_level=0x%02x",p->lenc_key.sec_level);
+ BTIF_TRACE_DEBUG("p->lenc_key.div=0x%04x",p->lenc_key.div);
+ BTIF_TRACE_DEBUG("p->lenc_key.key_size=0x%02x",p->lenc_key.key_size);
+ BTIF_TRACE_DEBUG("p->lenc_key.sec_level=0x%02x",p->lenc_key.sec_level);
BTA_DmAddBleKey (bta_bd_addr, (tBTA_LE_KEY_VALUE *)buf, BTIF_DM_LE_KEY_LENC);
}
+ key_found = TRUE;
}
memset(buf, 0, sizeof(buf));
@@ -1294,12 +1316,13 @@
is_device_added = TRUE;
}
p = (tBTA_LE_KEY_VALUE *)buf;
- BTIF_TRACE_DEBUG1("p->lcsrk_key.div=0x%04x",p->lcsrk_key.div);
- BTIF_TRACE_DEBUG1("p->lcsrk_key.counter=0x%08x",p->lcsrk_key.counter);
- BTIF_TRACE_DEBUG1("p->lcsrk_key.sec_level=0x%02x",p->lcsrk_key.sec_level);
+ BTIF_TRACE_DEBUG("p->lcsrk_key.div=0x%04x",p->lcsrk_key.div);
+ BTIF_TRACE_DEBUG("p->lcsrk_key.counter=0x%08x",p->lcsrk_key.counter);
+ BTIF_TRACE_DEBUG("p->lcsrk_key.sec_level=0x%02x",p->lcsrk_key.sec_level);
BTA_DmAddBleKey (bta_bd_addr, (tBTA_LE_KEY_VALUE *)buf, BTIF_DM_LE_KEY_LCSRK);
}
+ key_found = TRUE;
}
/* Fill in the bonded devices */
@@ -1309,7 +1332,10 @@
btif_gatts_add_bonded_dev_from_nv(bta_bd_addr);
}
- return BT_STATUS_SUCCESS;
+ if(key_found)
+ return BT_STATUS_SUCCESS;
+ else
+ return BT_STATUS_FAIL;
}
return BT_STATUS_FAIL;
}
@@ -1362,7 +1388,7 @@
UINT16 ssr_min_tout, UINT16 dl_len, UINT8 *dsc_list)
{
bdstr_t bdstr;
- BTIF_TRACE_DEBUG0("btif_storage_add_hid_device_info:");
+ BTIF_TRACE_DEBUG("btif_storage_add_hid_device_info:");
bd2str(remote_bd_addr, &bdstr);
btif_config_set_int("Remote", bdstr, "HidAttrMask", attr_mask);
btif_config_set_int("Remote", bdstr, "HidSubClass", sub_class);
@@ -1409,53 +1435,64 @@
do
{
kpos = btif_config_next_key(kpos, "Remote", kname, &kname_size);
- BTIF_TRACE_DEBUG2("Remote device:%s, size:%d", kname, kname_size);
+ BTIF_TRACE_DEBUG("Remote device:%s, size:%d", kname, kname_size);
int value;
- if(btif_config_get_int("Remote", kname, "HidAttrMask", &value))
+ if(btif_in_fetch_bonded_device(kname) == BT_STATUS_SUCCESS)
{
- attr_mask = (uint16_t)value;
-
- btif_config_get_int("Remote", kname, "HidSubClass", &value);
- sub_class = (uint8_t)value;
-
- btif_config_get_int("Remote", kname, "HidAppId", &value);
- app_id = (uint8_t)value;
-
- btif_config_get_int("Remote", kname, "HidVendorId", &value);
- dscp_info.vendor_id = (uint16_t) value;
-
- btif_config_get_int("Remote", kname, "HidProductId", &value);
- dscp_info.product_id = (uint16_t) value;
-
- btif_config_get_int("Remote", kname, "HidVersion", &value);
- dscp_info.version = (uint8_t) value;
-
- btif_config_get_int("Remote", kname, "HidCountryCode", &value);
- dscp_info.ctry_code = (uint8_t) value;
-
- value = 0;
- btif_config_get_int("Remote", kname, "HidSSRMaxLatency", &value);
- dscp_info.ssr_max_latency = (uint16_t) value;
-
- value = 0;
- btif_config_get_int("Remote", kname, "HidSSRMinTimeout", &value);
- dscp_info.ssr_min_tout = (uint16_t) value;
-
- int len = 0;
- int type;
- btif_config_get("Remote", kname, "HidDescriptor", NULL, &len, &type);
- if(len > 0)
+ if(btif_config_get_int("Remote", kname, "HidAttrMask", &value))
{
- dscp_info.descriptor.dl_len = (uint16_t)len;
- dscp_info.descriptor.dsc_list = (uint8_t*)alloca(len);
- btif_config_get("Remote", kname, "HidDescriptor", (char*)dscp_info.descriptor.dsc_list, &len, &type);
+ attr_mask = (uint16_t)value;
+
+ btif_config_get_int("Remote", kname, "HidSubClass", &value);
+ sub_class = (uint8_t)value;
+
+ btif_config_get_int("Remote", kname, "HidAppId", &value);
+ app_id = (uint8_t)value;
+
+ btif_config_get_int("Remote", kname, "HidVendorId", &value);
+ dscp_info.vendor_id = (uint16_t) value;
+
+ btif_config_get_int("Remote", kname, "HidProductId", &value);
+ dscp_info.product_id = (uint16_t) value;
+
+ btif_config_get_int("Remote", kname, "HidVersion", &value);
+ dscp_info.version = (uint8_t) value;
+
+ btif_config_get_int("Remote", kname, "HidCountryCode", &value);
+ dscp_info.ctry_code = (uint8_t) value;
+
+ value = 0;
+ btif_config_get_int("Remote", kname, "HidSSRMaxLatency", &value);
+ dscp_info.ssr_max_latency = (uint16_t) value;
+
+ value = 0;
+ btif_config_get_int("Remote", kname, "HidSSRMinTimeout", &value);
+ dscp_info.ssr_min_tout = (uint16_t) value;
+
+ int len = 0;
+ int type;
+ btif_config_get("Remote", kname, "HidDescriptor", NULL, &len, &type);
+ if(len > 0)
+ {
+ dscp_info.descriptor.dl_len = (uint16_t)len;
+ dscp_info.descriptor.dsc_list = (uint8_t*)alloca(len);
+ btif_config_get("Remote", kname, "HidDescriptor", (char*)dscp_info.descriptor.dsc_list, &len, &type);
+ }
+ str2bd(kname, &bd_addr);
+ // add extracted information to BTA HH
+ if (btif_hh_add_added_dev(bd_addr,attr_mask))
+ {
+ BTA_HhAddDev(bd_addr.address, attr_mask, sub_class,
+ app_id, dscp_info);
+ }
}
- str2bd(kname, &bd_addr);
- // add extracted information to BTA HH
- if (btif_hh_add_added_dev(bd_addr,attr_mask))
+ }
+ else
+ {
+ if(btif_config_get_int("Remote", kname, "HidAttrMask", &value))
{
- BTA_HhAddDev(bd_addr.address, attr_mask, sub_class,
- app_id, dscp_info);
+ btif_storage_remove_hid_info(&bd_addr);
+ str2bd(kname, &bd_addr);
}
}
} while(kpos != -1);
@@ -1533,7 +1570,7 @@
{
if ((read_size != value_size) || (read_type != BTIF_CFG_TYPE_BIN) )
{
- BTIF_TRACE_ERROR4("%s value_size=%d read_size=%d read_type=%d",
+ BTIF_TRACE_ERROR("%s value_size=%d read_size=%d read_type=%d",
__FUNCTION__, value_size, read_size, read_type);
bt_status = BT_STATUS_FAIL;
}
@@ -1541,7 +1578,7 @@
}
- BTIF_TRACE_DEBUG3("%s status=%d value_size=%d", __FUNCTION__, bt_status, value_size);
+ BTIF_TRACE_DEBUG("%s status=%d value_size=%d", __FUNCTION__, bt_status, value_size);
return bt_status;
}
@@ -1556,59 +1593,34 @@
** BT_STATUS_FAIL otherwise
**
*******************************************************************************/
-
-bt_status_t btif_storage_load_autopair_device_list()
-{
- char *key_name, *key_value;
- int i=0;
- char linebuf[BTIF_STORAGE_MAX_LINE_SZ];
- char *line;
- FILE *fp;
-
- if(!btif_config_exist("Local", BTIF_STORAGE_PATH_AUTOPAIR_BLACKLIST, NULL))
- {
- /* first time loading of auto pair blacklist configuration */
-
- fp = fopen (BTIF_AUTO_PAIR_CONF_FILE, "r");
-
- if (fp == NULL)
- {
- ALOGE("%s: Failed to open auto pair blacklist conf file at %s", __FUNCTION__,BTIF_AUTO_PAIR_CONF_FILE );
- return BT_STATUS_FAIL;
- }
-
- /* read through auto_pairing.conf file and create the key value pairs specific to auto pair blacklist devices */
- while (fgets(linebuf, BTIF_STORAGE_MAX_LINE_SZ, fp) != NULL)
- {
- /* trip leading white spaces */
- while (linebuf[i] == BTIF_AUTO_PAIR_CONF_SPACE)
- i++;
-
- /* skip commented lines */
- if (linebuf[i] == BTIF_AUTO_PAIR_CONF_COMMENT)
- continue;
-
- line = (char*)&(linebuf[i]);
-
- if (line == NULL)
- continue;
-
- key_name = strtok(line, BTIF_AUTO_PAIR_CONF_KEY_VAL_DELIMETER);
-
- if (key_name == NULL)
- continue;
- else if((strcmp(key_name, BTIF_STORAGE_KEY_AUTOPAIR_BLACKLIST_ADDR) == 0) ||
- (strcmp(key_name, BTIF_STORAGE_KEY_AUTOPAIR_BLACKLIST_EXACTNAME) ==0) ||
- (strcmp(key_name, BTIF_STORAGE_KEY_AUTOPAIR_FIXPIN_KBLIST) ==0 ) ||
- (strcmp(key_name, BTIF_STORAGE_KEY_AUTOPAIR_BLACKLIST_PARTIALNAME) == 0) ||
- (strcmp(key_name, BTIF_STORAGE_KEY_AUTOPAIR_DYNAMIC_BLACKLIST_ADDR) == 0))
- {
- key_value = strtok(NULL, BTIF_AUTO_PAIR_CONF_KEY_VAL_DELIMETER);
- btif_config_set_str("Local", BTIF_STORAGE_PATH_AUTOPAIR_BLACKLIST, key_name, key_value);
- }
- }
- fclose(fp);
+bt_status_t btif_storage_load_autopair_device_list() {
+ // Configuration has already been loaded. No need to reload.
+ if (btif_config_exist("Local", BTIF_STORAGE_PATH_AUTOPAIR_BLACKLIST, NULL)) {
+ return BT_STATUS_SUCCESS;
}
+
+ static const char *key_names[] = {
+ BTIF_STORAGE_KEY_AUTOPAIR_BLACKLIST_ADDR,
+ BTIF_STORAGE_KEY_AUTOPAIR_BLACKLIST_EXACTNAME,
+ BTIF_STORAGE_KEY_AUTOPAIR_FIXPIN_KBLIST,
+ BTIF_STORAGE_KEY_AUTOPAIR_BLACKLIST_PARTIALNAME,
+ BTIF_STORAGE_KEY_AUTOPAIR_DYNAMIC_BLACKLIST_ADDR,
+ };
+
+ config_t *config = config_new(BTIF_AUTO_PAIR_CONF_FILE);
+ if (!config) {
+ ALOGE("%s failed to open auto pair blacklist conf file '%s'.", __func__, BTIF_AUTO_PAIR_CONF_FILE);
+ return BT_STATUS_FAIL;
+ }
+
+ for (size_t i = 0; i < ARRAY_SIZE(key_names); ++i) {
+ const char *value = config_get_string(config, CONFIG_DEFAULT_SECTION, key_names[i], NULL);
+ if (value) {
+ btif_config_set_str("Local", BTIF_STORAGE_PATH_AUTOPAIR_BLACKLIST, key_names[i], value);
+ }
+ }
+
+ config_free(config);
return BT_STATUS_SUCCESS;
}
@@ -1738,8 +1750,8 @@
bd2str(remote_bd_addr, &bdstr);
- /*consider on LAP part of BDA string*/
- bdstr[8] = '\0';
+ /*consider on LAP part of BDA string*/
+ bdstr[8] = '\0';
int line_size = sizeof(linebuf);
if(btif_config_get_str("Local", BTIF_STORAGE_PATH_AUTOPAIR_BLACKLIST,
@@ -1751,3 +1763,68 @@
return FALSE;
}
+
+/*******************************************************************************
+**
+** Function btif_storage_set_dmt_support_type
+**
+** Description Sets DMT support status for a remote device
+**
+** Returns BT_STATUS_SUCCESS if config update is successful
+** BT_STATUS_FAIL otherwise
+**
+*******************************************************************************/
+
+bt_status_t btif_storage_set_dmt_support_type(const bt_bdaddr_t *remote_bd_addr,
+ BOOLEAN dmt_supported)
+{
+ int ret;
+ bdstr_t bdstr = {0};
+ if(remote_bd_addr)
+ {
+ bd2str(remote_bd_addr, &bdstr);
+ }
+ else
+ {
+ BTIF_TRACE_ERROR("%s NULL BD Address", __FUNCTION__);
+ return BT_STATUS_FAIL;
+ }
+
+ ret = btif_config_set_int("Remote", bdstr,"DMTSupported", (int)dmt_supported);
+ return ret ? BT_STATUS_SUCCESS:BT_STATUS_FAIL;
+
+}
+
+/*******************************************************************************
+**
+** Function btif_storage_is_dmt_supported_device
+**
+** Description checks if a device supports Dual mode topology
+**
+** Returns TRUE if remote address is valid and supports DMT else FALSE
+**
+*******************************************************************************/
+
+BOOLEAN btif_storage_is_dmt_supported_device(const bt_bdaddr_t *remote_bd_addr)
+{
+ int dmt_supported = 0;
+ bdstr_t bdstr = {0};
+ if(remote_bd_addr)
+ bd2str(remote_bd_addr, &bdstr);
+
+ if(remote_bd_addr)
+ {
+ bd2str(remote_bd_addr, &bdstr);
+ }
+ else
+ {
+ BTIF_TRACE_ERROR("%s NULL BD Address", __FUNCTION__);
+ return FALSE;
+ }
+
+ btif_config_get_int("Remote", bdstr,"DMTSupported", &dmt_supported);
+
+ return dmt_supported == 1 ? TRUE:FALSE;
+}
+
+
diff --git a/btif/src/btif_util.c b/btif/src/btif_util.c
old mode 100755
new mode 100644
index 96685f2..bd376a6
--- a/btif/src/btif_util.c
+++ b/btif/src/btif_util.c
@@ -1,5 +1,6 @@
/******************************************************************************
*
+ * Copyright (c) 2014 The Android Open Source Project
* Copyright (C) 2009-2012 Broadcom Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -47,6 +48,7 @@
#include "bta_ag_api.h"
#include "bta_av_api.h"
#include "bta_hh_api.h"
+#include "bta_hf_client_api.h"
#include "avrc_defs.h"
@@ -85,7 +87,7 @@
{
int32_t i = 0;
for (i = 0; i < 6; i++) {
- addr->address[i] = (uint8_t) strtoul(str, (char **)&str, 16);
+ addr->address[i] = (uint8_t)strtoul(str, &str, 16);
str++;
}
return 0;
@@ -95,10 +97,10 @@
{
const uint8_t *addr = bdaddr->address;
- snprintf((char*)bdstr, sizeof(*bdstr), "%02x:%02x:%02x:%02x:%02x:%02x",
+ sprintf(*bdstr, "%02x:%02x:%02x:%02x:%02x:%02x",
addr[0], addr[1], addr[2],
addr[3], addr[4], addr[5]);
- return (char *)bdstr;
+ return *bdstr;
}
UINT32 devclass2uint(DEV_CLASS dev_class)
@@ -280,6 +282,7 @@
CASE_RETURN_STR(BTA_DM_BLE_AUTH_CMPL_EVT)
CASE_RETURN_STR(BTA_DM_DEV_UNPAIRED_EVT)
CASE_RETURN_STR(BTA_DM_HW_ERROR_EVT)
+ CASE_RETURN_STR(BTA_DM_ENER_INFO_READ)
default:
return "UNKNOWN DM EVENT";
@@ -301,7 +304,9 @@
CASE_RETURN_STR(BTA_AG_MIC_EVT)
CASE_RETURN_STR(BTA_AG_AT_CKPD_EVT)
CASE_RETURN_STR(BTA_AG_DISABLE_EVT)
-
+#if (BTM_WBS_INCLUDED == TRUE )
+ CASE_RETURN_STR(BTA_AG_WBS_EVT)
+#endif
CASE_RETURN_STR(BTA_AG_AT_A_EVT)
CASE_RETURN_STR(BTA_AG_AT_D_EVT)
CASE_RETURN_STR(BTA_AG_AT_CHLD_EVT)
@@ -326,6 +331,38 @@
}
}
+const char* dump_hf_client_event(UINT16 event)
+{
+ switch(event)
+ {
+ CASE_RETURN_STR(BTA_HF_CLIENT_ENABLE_EVT)
+ CASE_RETURN_STR(BTA_HF_CLIENT_REGISTER_EVT)
+ CASE_RETURN_STR(BTA_HF_CLIENT_OPEN_EVT)
+ CASE_RETURN_STR(BTA_HF_CLIENT_CLOSE_EVT)
+ CASE_RETURN_STR(BTA_HF_CLIENT_CONN_EVT)
+ CASE_RETURN_STR(BTA_HF_CLIENT_AUDIO_OPEN_EVT)
+ CASE_RETURN_STR(BTA_HF_CLIENT_AUDIO_MSBC_OPEN_EVT)
+ CASE_RETURN_STR(BTA_HF_CLIENT_AUDIO_CLOSE_EVT)
+ CASE_RETURN_STR(BTA_HF_CLIENT_SPK_EVT)
+ CASE_RETURN_STR(BTA_HF_CLIENT_MIC_EVT)
+ CASE_RETURN_STR(BTA_HF_CLIENT_DISABLE_EVT)
+ CASE_RETURN_STR(BTA_HF_CLIENT_IND_EVT)
+ CASE_RETURN_STR(BTA_HF_CLIENT_VOICE_REC_EVT)
+ CASE_RETURN_STR(BTA_HF_CLIENT_OPERATOR_NAME_EVT)
+ CASE_RETURN_STR(BTA_HF_CLIENT_CLIP_EVT)
+ CASE_RETURN_STR(BTA_HF_CLIENT_CCWA_EVT)
+ CASE_RETURN_STR(BTA_HF_CLIENT_AT_RESULT_EVT)
+ CASE_RETURN_STR(BTA_HF_CLIENT_CLCC_EVT)
+ CASE_RETURN_STR(BTA_HF_CLIENT_CNUM_EVT)
+ CASE_RETURN_STR(BTA_HF_CLIENT_BTRH_EVT)
+ CASE_RETURN_STR(BTA_HF_CLIENT_BSIR_EVT)
+ CASE_RETURN_STR(BTA_HF_CLIENT_BINP_EVT)
+ CASE_RETURN_STR(BTA_HF_CLIENT_RING_INDICATION)
+ default:
+ return "UNKNOWN MSG ID";
+ }
+}
+
const char* dump_hh_event(UINT16 event)
{
switch(event)
diff --git a/conf/bt_did.conf b/conf/bt_did.conf
index b08a938..ea89c06 100644
--- a/conf/bt_did.conf
+++ b/conf/bt_did.conf
@@ -1,8 +1,5 @@
# Device ID (DID) configuration
-[DID]
-
-# Record Number: 1, 2 or 3 - maximum of 3 records
-recordNumber = 1
+[DID1]
# Primary Record - true or false (default)
# There can be only one primary record
@@ -31,10 +28,7 @@
#=================================================================================================#
# Device ID (DID) configuration
-[DID]
-
-# Record number: 1, 2 or 3 - maximum of 3 records
-#recordNumber = 2
+[DID2]
# Primary Record - true or false (default)
# There can be only one primary record
@@ -63,10 +57,7 @@
#=================================================================================================#
# Device ID (DID) configuration
-[DID]
-
-# Record number: 1, 2 or 3 - maximum of 3 records
-#recordNumber = 3
+[DID3]
# Primary Record - true or false (default)
# There can be only one primary record
diff --git a/conf/bt_stack.conf b/conf/bt_stack.conf
index 2ca20ea..711fe51 100644
--- a/conf/bt_stack.conf
+++ b/conf/bt_stack.conf
@@ -5,6 +5,9 @@
# BtSnoop log output file
BtSnoopFileName=/sdcard/btsnoop_hci.log
+# Preserve existing BtSnoop log before overwriting
+BtSnoopSaveLog=false
+
# Enable trace level reconfiguration function
# Must be present before any TRC_ trace level settings
TraceConf=true
diff --git a/doc/btsnoop_net.md b/doc/btsnoop_net.md
new file mode 100644
index 0000000..efd1071
--- /dev/null
+++ b/doc/btsnoop_net.md
@@ -0,0 +1,15 @@
+btsnoop_net
+====
+btsnoop_net exposes Bluetooth snoop logs over a local TCP socket which enables
+real-time debugging of HCI data with hcidump.
+
+This feature is enabled by setting `BtSnoopLogOutput=true` in `bt_stack.conf`.
+Once it has been enabled and the stack restarted, bluedroid will listen for
+incoming TCP connections on port 8872.
+
+To use this feature with hcidump on a Linux host, you can run:
+
+```
+ $ adb forward tcp:8872 tcp:8872
+ $ nc localhost 8872 | hcidump -r /dev/stdin
+```
diff --git a/doc/properties.md b/doc/properties.md
new file mode 100644
index 0000000..b279b01
--- /dev/null
+++ b/doc/properties.md
@@ -0,0 +1,15 @@
+Properties
+===
+This document describes all of the Android properties used by bluedroid.
+
+Please keep the following list in alphabetical order.
+
+### TODO (Broadcom): write descriptions of what each property means and how
+it's used.
+
+* ``` debug.sys.noschedgroups ```
+* ``` persist.service.bdroid.bdaddr ```
+* ``` ro.bluetooth.hfp.ver ```
+* ``` ro.bt.bdaddr_path ```
+* ``` ro.product.model ```
+* ``` service.brcm.bt.oob ```
diff --git a/embdrv/Android.mk b/embdrv/Android.mk
new file mode 100755
index 0000000..6e92be4
--- /dev/null
+++ b/embdrv/Android.mk
@@ -0,0 +1,7 @@
+LOCAL_PATH := $(call my-dir)
+
+include $(call all-subdir-makefiles)
+
+# Cleanup our locals
+#bdroid_C_INCLUDES :=
+#bdroid_CFLaGS :=
diff --git a/embdrv/sbc/Android.mk b/embdrv/sbc/Android.mk
new file mode 100755
index 0000000..6e92be4
--- /dev/null
+++ b/embdrv/sbc/Android.mk
@@ -0,0 +1,7 @@
+LOCAL_PATH := $(call my-dir)
+
+include $(call all-subdir-makefiles)
+
+# Cleanup our locals
+#bdroid_C_INCLUDES :=
+#bdroid_CFLaGS :=
diff --git a/embdrv/sbc/decoder/Android.mk b/embdrv/sbc/decoder/Android.mk
new file mode 100755
index 0000000..68fd143
--- /dev/null
+++ b/embdrv/sbc/decoder/Android.mk
@@ -0,0 +1,28 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# sbc decoder
+LOCAL_SRC_FILES+= \
+ ./srce/alloc.c \
+ ./srce/bitalloc.c \
+ ./srce/bitalloc-sbc.c \
+ ./srce/bitstream-decode.c \
+ ./srce/decoder-oina.c \
+ ./srce/decoder-private.c \
+ ./srce/decoder-sbc.c \
+ ./srce/dequant.c \
+ ./srce/framing.c \
+ ./srce/framing-sbc.c \
+ ./srce/oi_codec_version.c \
+ ./srce/synthesis-sbc.c \
+ ./srce/synthesis-dct8.c \
+ ./srce/synthesis-8-generated.c \
+
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/include
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/srce
+
+LOCAL_MODULE:= libbt-qcom_sbc_decoder
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := STATIC_LIBRARIES
+
+include $(BUILD_STATIC_LIBRARY)
diff --git a/embdrv/sbc/decoder/include/oi_assert.h b/embdrv/sbc/decoder/include/oi_assert.h
new file mode 100644
index 0000000..35d86cf
--- /dev/null
+++ b/embdrv/sbc/decoder/include/oi_assert.h
@@ -0,0 +1,86 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2002 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+#ifndef _OI_ASSERT_H
+#define _OI_ASSERT_H
+/** @file
+ This file provides macros and functions for compile-time and run-time assertions.
+
+ When the OI_DEBUG preprocessor value is defined, the macro OI_ASSERT is compiled into
+ the program, providing for a runtime assertion failure check.
+ C_ASSERT is a macro that can be used to perform compile time checks.
+*/
+/**********************************************************************************
+ $Revision: #1 $
+***********************************************************************************/
+
+
+/** \addtogroup Debugging Debugging APIs */
+/**@{*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#ifdef OI_DEBUG
+
+/** The macro OI_ASSERT takes a condition argument. If the asserted condition
+ does not evaluate to true, the OI_ASSERT macro calls the host-dependent function,
+ OI_AssertFail(), which reports the failure and generates a runtime error.
+*/
+void OI_AssertFail(char* file, int line, char* reason);
+
+
+#define OI_ASSERT(condition) \
+ { if (!(condition)) OI_AssertFail(__FILE__, __LINE__, #condition); }
+
+#define OI_ASSERT_FAIL(msg) \
+ { OI_AssertFail(__FILE__, __LINE__, msg); }
+
+#else
+
+
+#define OI_ASSERT(condition)
+#define OI_ASSERT_FAIL(msg)
+
+#endif
+
+
+/**
+ C_ASSERT() can be used to perform many compile-time assertions: type sizes, field offsets, etc.
+ An assertion failure results in compile time error C2118: negative subscript.
+ Unfortunately, this elegant macro doesn't work with GCC, so it's all commented out
+ for now. Perhaps later.....
+*/
+
+#ifndef C_ASSERT
+// #define C_ASSERT(e) typedef char __C_ASSERT__[(e)?1:-1]
+// #define C_ASSERT(e)
+#endif
+
+
+/*****************************************************************************/
+#ifdef __cplusplus
+}
+#endif
+
+/**@}*/
+
+#endif /* _OI_ASSERT_H */
+
diff --git a/embdrv/sbc/decoder/include/oi_bitstream.h b/embdrv/sbc/decoder/include/oi_bitstream.h
new file mode 100644
index 0000000..df0c10f
--- /dev/null
+++ b/embdrv/sbc/decoder/include/oi_bitstream.h
@@ -0,0 +1,123 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+#ifndef _OI_BITSTREAM_H
+#define _OI_BITSTREAM_H
+
+/**********************************************************************************
+ $Revision: #1 $
+***********************************************************************************/
+
+
+/**
+@file
+Function prototypes and macro definitions for manipulating input and output
+bitstreams.
+
+@ingroup codec_internal
+*/
+
+/**
+@addtogroup codec_internal
+@{
+*/
+
+#include "oi_codec_sbc_private.h"
+#include "oi_stddefs.h"
+
+INLINE void OI_BITSTREAM_ReadInit(OI_BITSTREAM *bs, const OI_BYTE *buffer);
+
+INLINE void OI_BITSTREAM_WriteInit(OI_BITSTREAM *bs, OI_BYTE *buffer);
+
+INLINE OI_UINT32 OI_BITSTREAM_ReadUINT(OI_BITSTREAM *bs, OI_UINT bits);
+
+INLINE OI_UINT8 OI_BITSTREAM_ReadUINT4Aligned(OI_BITSTREAM *bs);
+
+INLINE OI_UINT8 OI_BITSTREAM_ReadUINT8Aligned(OI_BITSTREAM *bs);
+
+INLINE void OI_BITSTREAM_WriteUINT(OI_BITSTREAM *bs,
+ OI_UINT16 value,
+ OI_UINT bits);
+
+/*
+ * Use knowledge that the bitstream is aligned to optimize the write of a byte
+ */
+PRIVATE void OI_BITSTREAM_WriteUINT8Aligned(OI_BITSTREAM *bs,
+ OI_UINT8 datum);
+
+/*
+ * Use knowledge that the bitstream is aligned to optimize the write pair of nibbles
+ */
+PRIVATE void OI_BITSTREAM_Write2xUINT4Aligned(OI_BITSTREAM *bs,
+ OI_UINT8 datum1,
+ OI_UINT8 datum2);
+
+/** Internally the bitstream looks ahead in the stream. When
+ * OI_SBC_ReadScalefactors() goes to temporarily break the abstraction, it will
+ * need to know where the "logical" pointer is in the stream.
+ */
+#define OI_BITSTREAM_GetWritePtr(bs) ((bs)->ptr.w - 3)
+#define OI_BITSTREAM_GetReadPtr(bs) ((bs)->ptr.r - 3)
+
+/** This is declared here as a macro because decoder.c breaks the bitsream
+ * encapsulation for efficiency reasons.
+ */
+#define OI_BITSTREAM_READUINT(result, bits, ptr, value, bitPtr) \
+do { \
+ OI_ASSERT((bits) <= 16); \
+ OI_ASSERT((bitPtr) < 16); \
+ OI_ASSERT((bitPtr) >= 8); \
+ \
+ result = (value) << (bitPtr); \
+ result >>= 32 - (bits); \
+ \
+ bitPtr += (bits); \
+ while (bitPtr >= 16) { \
+ value = ((value) << 8) | *ptr++; \
+ bitPtr -= 8; \
+ } \
+ OI_ASSERT((bits == 0) || (result < (1u << (bits)))); \
+} while (0)
+
+
+#define OI_BITSTREAM_WRITEUINT(ptr, value, bitPtr, datum, bits) \
+do {\
+ bitPtr -= bits;\
+ value |= datum << bitPtr;\
+ \
+ while (bitPtr <= 16) {\
+ bitPtr += 8;\
+ *ptr++ = (OI_UINT8)(value >> 24);\
+ value <<= 8;\
+ }\
+} while (0)
+
+#define OI_BITSTREAM_WRITEFLUSH(ptr, value, bitPtr) \
+do {\
+ while (bitPtr < 32) {\
+ bitPtr += 8;\
+ *ptr++ = (OI_UINT8)(value >> 24);\
+ value <<= 8;\
+ }\
+} while (0)
+
+/**
+@}
+*/
+
+#endif /* _OI_BITSTREAM_H */
diff --git a/embdrv/sbc/decoder/include/oi_bt_spec.h b/embdrv/sbc/decoder/include/oi_bt_spec.h
new file mode 100644
index 0000000..b98a582
--- /dev/null
+++ b/embdrv/sbc/decoder/include/oi_bt_spec.h
@@ -0,0 +1,229 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2002 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+#ifndef _OI_BT_SPEC_H
+#define _OI_BT_SPEC_H
+/**
+ * @file
+ *
+ * This file contains common definitions from the Bluetooth specification.
+ *
+ */
+
+/**********************************************************************************
+ $Revision: #1 $
+***********************************************************************************/
+
+#include "oi_stddefs.h"
+
+/** \addtogroup Misc Miscellaneous APIs */
+/**@{*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** The maximum number of active slaves in a piconet. */
+#define OI_BT_MAX_ACTIVE_SLAVES 7
+
+/** the number of bytes in a Bluetooth device address (BD_ADDR) */
+#define OI_BD_ADDR_BYTE_SIZE 6
+
+/**
+ * 48-bit Bluetooth device address
+ *
+ * Because 48-bit integers may not be supported on all platforms, the
+ * address is defined as an array of bytes. This array is big-endian,
+ * meaning that
+ * - array[0] contains bits 47-40,
+ * - array[1] contains bits 39-32,
+ * - array[2] contains bits 31-24,
+ * - array[3] contains bits 23-16,
+ * - array[4] contains bits 15-8, and
+ * - array[5] contains bits 7-0.
+ */
+typedef struct {
+ OI_UINT8 addr[OI_BD_ADDR_BYTE_SIZE] ; /**< Bluetooth device address represented as an array of 8-bit values */
+} OI_BD_ADDR ;
+
+/**
+ * @name Data types for working with UUIDs
+ * UUIDs are 16 bytes (128 bits).
+ *
+ * To avoid having to pass around 128-bit values all the time, 32-bit and 16-bit
+ * UUIDs are defined, along with a mapping from the shorter versions to the full
+ * version.
+ *
+ * @{
+ */
+
+/**
+ * 16-bit representation of a 128-bit UUID
+ */
+typedef OI_UINT16 OI_UUID16;
+
+/**
+ * 32-bit representation of a 128-bit UUID
+ */
+typedef OI_UINT32 OI_UUID32;
+
+/**
+ * number of bytes in a 128 bit UUID
+ */
+#define OI_BT_UUID128_SIZE 16
+
+/**
+ * number of bytes in IPv6 style addresses
+ */
+#define OI_BT_IPV6ADDR_SIZE 16
+
+/**
+ * type definition for a 128-bit UUID
+ *
+ * To simplify conversion between 128-bit UUIDs and 16-bit and 32-bit UUIDs,
+ * the most significant 32 bits are stored with the same endian-ness as is
+ * native on the target (local) device. The remainder of the 128-bit UUID is
+ * stored as bytes in big-endian order.
+ */
+typedef struct {
+ OI_UINT32 ms32bits; /**< most significant 32 bits of 128-bit UUID */
+ OI_UINT8 base[OI_BT_UUID128_SIZE - sizeof(OI_UINT32)]; /**< remainder of 128-bit UUID, array of 8-bit values */
+} OI_UUID128;
+
+/** @} */
+
+/** number of bytes in a link key */
+#define OI_BT_LINK_KEY_SIZE 16
+
+/**
+ * type definition for a baseband link key
+ *
+ * Because 128-bit integers may not be supported on all platforms, we define
+ * link keys as an array of bytes. Unlike the Bluetooth device address,
+ * the link key is stored in little-endian order, meaning that
+ * - array[0] contains bits 0 - 7,
+ * - array[1] contains bits 8 - 15,
+ * - array[2] contains bits 16 - 23,
+ * - array[3] contains bits 24 - 31,
+ * - array[4] contains bits 32 - 39,
+ * - array[5] contains bits 40 - 47,
+ * - array[6] contains bits 48 - 55,
+ * - array[7] contains bits 56 - 63,
+ * - array[8] contains bits 64 - 71,
+ * - array[9] contains bits 72 - 79,
+ * - array[10] contains bits 80 - 87,
+ * - array[11] contains bits 88 - 95,
+ * - array[12] contains bits 96 - 103,
+ * - array[13] contains bits 104- 111,
+ * - array[14] contains bits 112- 119, and
+ * - array[15] contains bits 120- 127.
+ */
+typedef struct {
+ OI_UINT8 key[OI_BT_LINK_KEY_SIZE] ; /**< link key represented as an array of 8-bit values */
+} OI_LINK_KEY ;
+
+
+/** Out-of-band data size - C and R values are 16-bytes each */
+#define OI_BT_OOB_NUM_BYTES 16
+
+typedef struct {
+ OI_UINT8 value[OI_BT_OOB_NUM_BYTES] ; /**< same struct used for C and R values */
+} OI_OOB_DATA ;
+
+
+/**
+ * link key types
+ */
+typedef enum {
+ OI_LINK_KEY_TYPE_COMBO = 0, /**< combination key */
+ OI_LINK_KEY_TYPE_LOCAL_UNIT = 1, /**< local unit key */
+ OI_LINK_KEY_TYPE_REMOTE_UNIT = 2, /**< remote unit key */
+ OI_LINK_KEY_TYPE_DEBUG_COMBO = 3, /**< debug combination key */
+ OI_LINK_KEY_TYPE_UNAUTHENTICATED = 4, /**< Unauthenticated */
+ OI_LINK_KEY_TYPE_AUTHENTICATED = 5, /**< Authenticated */
+ OI_LINK_KEY_TYPE_CHANGED_COMBO = 6 /**< Changed */
+
+} OI_BT_LINK_KEY_TYPE ;
+
+
+/** amount of space allocated for a PIN (personal indentification number) in bytes */
+#define OI_BT_PIN_CODE_SIZE 16
+
+/** data type for a PIN (PINs are treated as strings, so endianness does not apply.) */
+typedef struct {
+ OI_UINT8 pin[OI_BT_PIN_CODE_SIZE] ; /**< PIN represented as an array of 8-bit values */
+} OI_PIN_CODE ;
+
+/** maximum number of SCO connections per device, which is 3 as of version 2.0+EDR
+ of the Bluetooth specification (see sec 4.3 of vol 2 part B) */
+#define OI_BT_MAX_SCO_CONNECTIONS 3
+
+/** data type for clock offset */
+typedef OI_UINT16 OI_BT_CLOCK_OFFSET ;
+
+/** data type for a LM handle */
+typedef OI_UINT16 OI_HCI_LM_HANDLE;
+
+/** opaque data type for a SCO or ACL connection handle */
+typedef struct _OI_HCI_CONNECTION *OI_HCI_CONNECTION_HANDLE;
+
+/** data type for HCI Error Code, as defined in oi_hcispec.h */
+typedef OI_UINT8 OI_HCI_ERROR_CODE ;
+
+/**
+ * The Bluetooth device type is indicated by a 24-bit bitfield, represented as a
+ * 32-bit number in the stack. The bit layout and values for device class are specified
+ * in the file oi_bt_assigned_nos.h and in the Bluetooth "Assigned Numbers" specification
+ * at http://www.bluetooth.org/assigned-numbers/.
+ */
+typedef OI_UINT32 OI_BT_DEVICE_CLASS ;
+
+#define OI_BT_DEV_CLASS_FORMAT_MASK 0x000003 /**< Bits 0-1 contain format type. */
+#define OI_BT_DEV_CLASS_MINOR_DEVICE_MASK 0x0000FC /**< Bits 2-7 contain minor device class value. */
+#define OI_BT_DEV_CLASS_MAJOR_DEVICE_MASK 0x001F00 /**< Bits 8-12 contain major device class value. */
+#define OI_BT_DEV_CLASS_MAJOR_SERVICE_MASK 0xFFE000 /**< Bits 13-23 contain major service class value. */
+
+/** There is currently only one device class format defined, type 00. */
+#define OI_BT_DEV_CLASS_FORMAT_TYPE 00
+
+/** Bit 13 in device class indicates limited discoverability mode (GAP v2.0+EDR, section 4.1.2.2) */
+#define OI_BT_DEV_CLASS_LIMITED_DISCO_BIT BIT13
+
+/** macro to test validity of the Device Class Format */
+#define OI_BT_VALID_DEVICE_CLASS_FORMAT(class) (OI_BT_DEV_CLASS_FORMAT_TYPE == ((class) & OI_BT_DEV_CLASS_FORMAT_MASK))
+
+/** the time between baseband clock ticks, currently 625 microseconds (one slot) */
+#define OI_BT_TICK 625
+/** some macros to convert to/from baseband clock ticks - use no floating point! */
+#define OI_SECONDS_TO_BT_TICKS(secs) ((secs)*1600)
+#define OI_BT_TICKS_TO_SECONDS(ticks) ((ticks)/1600)
+#define OI_MSECS_TO_BT_TICKS(msecs) (((msecs)*8)/5)
+#define OI_BT_TICKS_TO_MSECS(ticks) (((ticks)*5)/8)
+
+/** EIR byte order */
+#define OI_EIR_BYTE_ORDER OI_LITTLE_ENDIAN_BYTE_ORDER
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/**@}*/
+
+/*****************************************************************************/
+#endif /* _OI_BT_SPEC_H */
diff --git a/embdrv/sbc/decoder/include/oi_codec_sbc.h b/embdrv/sbc/decoder/include/oi_codec_sbc.h
new file mode 100644
index 0000000..ff5e6c1
--- /dev/null
+++ b/embdrv/sbc/decoder/include/oi_codec_sbc.h
@@ -0,0 +1,484 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+/**********************************************************************************
+ $Revision: #1 $
+***********************************************************************************/
+
+#ifndef _OI_CODEC_SBC_CORE_H
+#define _OI_CODEC_SBC_CORE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+@file
+Declarations of codec functions, data types, and macros.
+
+@ingroup codec_lib
+*/
+
+/**
+@addtogroup codec_lib
+@{
+*/
+
+/* Non-BM3 users of of the codec must include oi_codec_sbc_bm3defs.h prior to
+ * including this file, or else these includes will fail because the BM3 SDK is
+ * not in the include path */
+#ifndef _OI_CODEC_SBC_BM3DEFS_H
+#include "oi_stddefs.h"
+#include "oi_status.h"
+#endif
+
+#include <stdint.h>
+
+#define SBC_MAX_CHANNELS 2
+#define SBC_MAX_BANDS 8
+#define SBC_MAX_BLOCKS 16
+#define SBC_MIN_BITPOOL 2 /**< Minimum size of the bit allocation pool used to encode the stream */
+#define SBC_MAX_BITPOOL 250 /**< Maximum size of the bit allocation pool used to encode the stream */
+#define SBC_MAX_ONE_CHANNEL_BPS 320000
+#define SBC_MAX_TWO_CHANNEL_BPS 512000
+
+
+#define SBC_WBS_BITRATE 62000
+#define SBC_WBS_BITPOOL 27
+#define SBC_WBS_NROF_BLOCKS 16
+#define SBC_WBS_FRAME_LEN 62
+#define SBC_WBS_SAMPLES_PER_FRAME 128
+
+
+#define SBC_HEADER_LEN 4
+#define SBC_MAX_FRAME_LEN (SBC_HEADER_LEN + \
+ ((SBC_MAX_BANDS * SBC_MAX_CHANNELS / 2) + \
+ (SBC_MAX_BANDS + SBC_MAX_BLOCKS * SBC_MAX_BITPOOL + 7)/8))
+#define SBC_MAX_SAMPLES_PER_FRAME (SBC_MAX_BANDS * SBC_MAX_BLOCKS)
+
+#define SBC_MAX_SCALEFACTOR_BYTES ((4*(SBC_MAX_CHANNELS * SBC_MAX_BANDS) + 7)/8)
+
+#define OI_SBC_SYNCWORD 0x9c
+#define OI_SBC_ENHANCED_SYNCWORD 0x9d
+
+/**@name Sampling frequencies */
+/**@{*/
+#define SBC_FREQ_16000 0 /**< The sampling frequency is 16 kHz. One possible value for the @a frequency parameter of OI_CODEC_SBC_EncoderConfigure() */
+#define SBC_FREQ_32000 1 /**< The sampling frequency is 32 kHz. One possible value for the @a frequency parameter of OI_CODEC_SBC_EncoderConfigure() */
+#define SBC_FREQ_44100 2 /**< The sampling frequency is 44.1 kHz. One possible value for the @a frequency parameter of OI_CODEC_SBC_EncoderConfigure() */
+#define SBC_FREQ_48000 3 /**< The sampling frequency is 48 kHz. One possible value for the @a frequency parameter of OI_CODEC_SBC_EncoderConfigure() */
+/**@}*/
+
+/**@name Channel modes */
+/**@{*/
+#define SBC_MONO 0 /**< The mode of the encoded channel is mono. One possible value for the @a mode parameter of OI_CODEC_SBC_EncoderConfigure() */
+#define SBC_DUAL_CHANNEL 1 /**< The mode of the encoded channel is dual-channel. One possible value for the @a mode parameter of OI_CODEC_SBC_EncoderConfigure() */
+#define SBC_STEREO 2 /**< The mode of the encoded channel is stereo. One possible value for the @a mode parameter of OI_CODEC_SBC_EncoderConfigure() */
+#define SBC_JOINT_STEREO 3 /**< The mode of the encoded channel is joint stereo. One possible value for the @a mode parameter of OI_CODEC_SBC_EncoderConfigure() */
+/**@}*/
+
+/**@name Subbands */
+/**@{*/
+#define SBC_SUBBANDS_4 0 /**< The encoded stream has 4 subbands. One possible value for the @a subbands parameter of OI_CODEC_SBC_EncoderConfigure()*/
+#define SBC_SUBBANDS_8 1 /**< The encoded stream has 8 subbands. One possible value for the @a subbands parameter of OI_CODEC_SBC_EncoderConfigure() */
+/**@}*/
+
+/**@name Block lengths */
+/**@{*/
+#define SBC_BLOCKS_4 0 /**< A block size of 4 blocks was used to encode the stream. One possible value for the @a blocks parameter of OI_CODEC_SBC_EncoderConfigure() */
+#define SBC_BLOCKS_8 1 /**< A block size of 8 blocks was used to encode the stream is. One possible value for the @a blocks parameter of OI_CODEC_SBC_EncoderConfigure() */
+#define SBC_BLOCKS_12 2 /**< A block size of 12 blocks was used to encode the stream. One possible value for the @a blocks parameter of OI_CODEC_SBC_EncoderConfigure() */
+#define SBC_BLOCKS_16 3 /**< A block size of 16 blocks was used to encode the stream. One possible value for the @a blocks parameter of OI_CODEC_SBC_EncoderConfigure() */
+/**@}*/
+
+/**@name Bit allocation methods */
+/**@{*/
+#define SBC_LOUDNESS 0 /**< The bit allocation method. One possible value for the @a loudness parameter of OI_CODEC_SBC_EncoderConfigure() */
+#define SBC_SNR 1 /**< The bit allocation method. One possible value for the @a loudness parameter of OI_CODEC_SBC_EncoderConfigure() */
+/**@}*/
+
+/**
+@}
+
+@addtogroup codec_internal
+@{
+*/
+
+typedef OI_INT16 SBC_BUFFER_T;
+
+
+/** Used internally. */
+typedef struct {
+ OI_UINT16 frequency; /**< The sampling frequency. Input parameter. */
+ OI_UINT8 freqIndex;
+
+ OI_UINT8 nrof_blocks; /**< The block size used to encode the stream. Input parameter. */
+ OI_UINT8 blocks;
+
+
+ OI_UINT8 nrof_subbands; /**< The number of subbands of the encoded stream. Input parameter. */
+ OI_UINT8 subbands;
+
+ OI_UINT8 mode; /**< The mode of the encoded channel. Input parameter. */
+ OI_UINT8 nrof_channels; /**< The number of channels of the encoded stream. */
+
+ OI_UINT8 alloc; /**< The bit allocation method. Input parameter. */
+ OI_UINT8 bitpool; /**< Size of the bit allocation pool used to encode the stream. Input parameter. */
+ OI_UINT8 crc; /**< Parity check byte used for error detection. */
+ OI_UINT8 join; /**< Whether joint stereo has been used. */
+ OI_UINT8 enhanced;
+ OI_UINT8 min_bitpool; /**< This value is only used when encoding. SBC_MAX_BITPOOL if variable
+ bitpools are disallowed, otherwise the minimum bitpool size that will
+ be used by the bit allocator. */
+
+ OI_UINT8 cachedInfo; /**< Information about the previous frame */
+} OI_CODEC_SBC_FRAME_INFO;
+
+/** Used internally. */
+typedef struct {
+ const OI_CHAR *codecInfo;
+ OI_CODEC_SBC_FRAME_INFO frameInfo;
+ OI_INT8 scale_factor[SBC_MAX_CHANNELS*SBC_MAX_BANDS];
+ OI_UINT32 frameCount;
+ OI_INT32 *subdata;
+
+ SBC_BUFFER_T *filterBuffer[SBC_MAX_CHANNELS];
+ OI_INT32 filterBufferLen;
+ OI_UINT filterBufferOffset;
+
+ union {
+ OI_UINT8 uint8[SBC_MAX_CHANNELS*SBC_MAX_BANDS];
+ OI_UINT32 uint32[SBC_MAX_CHANNELS*SBC_MAX_BANDS/4];
+ } bits;
+ OI_UINT8 maxBitneed; /**< Running maximum bitneed */
+ OI_BYTE formatByte;
+ OI_UINT8 pcmStride;
+ OI_UINT8 maxChannels;
+} OI_CODEC_SBC_COMMON_CONTEXT;
+
+
+/*
+ * A smaller value reduces RAM usage at the expense of increased CPU usage. Values in the range
+ * 27..50 are recommended, beyond 50 there is a diminishing return on reduced CPU usage.
+ */
+#define SBC_CODEC_MIN_FILTER_BUFFERS 16
+#define SBC_CODEC_FAST_FILTER_BUFFERS 27
+
+/* Expands to the number of OI_UINT32s needed to ensure enough memory to encode
+ * or decode streams of numChannels channels, using numBuffers buffers.
+ * Example:
+ * OI_UINT32 decoderData[CODEC_DATA_WORDS(SBC_MAX_CHANNELS, SBC_DECODER_FAST_SYNTHESIS_BUFFERS)];
+ * */
+#define CODEC_DATA_WORDS(numChannels, numBuffers) \
+ ((\
+ (sizeof(OI_INT32) * SBC_MAX_BLOCKS * numChannels * SBC_MAX_BANDS) \
+ + (sizeof(SBC_BUFFER_T) * SBC_MAX_CHANNELS * SBC_MAX_BANDS * numBuffers) \
+ + (sizeof (OI_UINT32) - 1) \
+ ) / sizeof(OI_UINT32))
+
+/** Opaque parameter to decoding functions; maintains decoder context. */
+typedef struct {
+ OI_CODEC_SBC_COMMON_CONTEXT common;
+ OI_UINT8 limitFrameFormat; /* Boolean, set by OI_CODEC_SBC_DecoderLimit() */
+ OI_UINT8 restrictSubbands;
+ OI_UINT8 enhancedEnabled;
+ OI_UINT8 bufferedBlocks;
+} OI_CODEC_SBC_DECODER_CONTEXT;
+
+typedef struct {
+ OI_UINT32 data[CODEC_DATA_WORDS(1, SBC_CODEC_FAST_FILTER_BUFFERS)];
+} OI_CODEC_SBC_CODEC_DATA_MONO;
+
+typedef struct {
+ OI_UINT32 data[CODEC_DATA_WORDS(2, SBC_CODEC_FAST_FILTER_BUFFERS)];
+} OI_CODEC_SBC_CODEC_DATA_STEREO;
+
+/**
+@}
+
+@addtogroup codec_lib
+@{
+*/
+
+/**
+ * This function resets the decoder. The context must be reset when
+ * changing streams, or if the following stream parameters change:
+ * number of subbands, stereo mode, or frequency.
+ *
+ * @param context Pointer to the decoder context structure to be reset.
+ *
+ * @param enhanced If true, enhanced SBC operation is enabled. If enabled,
+ * the codec will recognize the alternative syncword for
+ * decoding an enhanced SBC stream. Enhancements should not
+ * be enabled unless the stream is known to be generated
+ * by an enhanced encoder, or there is a small possibility
+ * for decoding glitches if synchronization were to be lost.
+ */
+OI_STATUS OI_CODEC_SBC_DecoderReset(OI_CODEC_SBC_DECODER_CONTEXT *context,
+ OI_UINT32 *decoderData,
+ OI_UINT32 decoderDataBytes,
+ OI_UINT8 maxChannels,
+ OI_UINT8 pcmStride,
+ OI_BOOL enhanced);
+
+/**
+ * This function restricts the kind of SBC frames that the Decoder will
+ * process. Its use is optional. If used, it must be called after
+ * calling OI_CODEC_SBC_DecoderReset(). After it is called, any calls
+ * to OI_CODEC_SBC_DecodeFrame() with SBC frames that do not conform
+ * to the Subband and Enhanced SBC setting will be rejected with an
+ * OI_STATUS_INVALID_PARAMETERS return.
+ *
+ * @param context Pointer to the decoder context structure to be limited.
+ *
+ * @param enhanced If true, all frames passed to the decoder must be
+ * Enhanced SBC frames. If false, all frames must be
+ * standard SBC frames.
+ *
+ * @param subbands May be set to SBC_SUBBANDS_4 or SBC_SUBBANDS_8. All
+ * frames passed to the decoder must be encoded with
+ * the requested number of subbands.
+ *
+ */
+OI_STATUS OI_CODEC_SBC_DecoderLimit(OI_CODEC_SBC_DECODER_CONTEXT *context,
+ OI_BOOL enhanced,
+ OI_UINT8 subbands);
+
+/**
+ * This function sets the decoder parameters for a raw decode where the decoder parameters are not
+ * available in the sbc data stream. OI_CODEC_SBC_DecoderReset must be called
+ * prior to calling this function.
+ *
+ * @param context Decoder context structure. This must be the context must be
+ * used each time a frame is decoded.
+ *
+ * @param enhanced Set to TRUE to enable Qualcomm proprietary
+ * quality enhancements.
+ *
+ * @param frequency One of SBC_FREQ_16000, SBC_FREQ_32000, SBC_FREQ_44100,
+ * SBC_FREQ_48000
+ *
+ * @param mode One of SBC_MONO, SBC_DUAL_CHANNEL, SBC_STEREO,
+ * SBC_JOINT_STEREO
+ *
+ * @param subbands One of SBC_SUBBANDS_4, SBC_SUBBANDS_8
+ *
+ * @param blocks One of SBC_BLOCKS_4, SBC_BLOCKS_8, SBC_BLOCKS_12,
+ * SBC_BLOCKS_16
+ *
+ * @param alloc One of SBC_LOUDNESS, SBC_SNR
+ *
+ * @param maxBitpool The maximum bitpool size for this context
+ */
+OI_STATUS OI_CODEC_SBC_DecoderConfigureRaw(OI_CODEC_SBC_DECODER_CONTEXT *context,
+ OI_BOOL enhanced,
+ OI_UINT8 frequency,
+ OI_UINT8 mode,
+ OI_UINT8 subbands,
+ OI_UINT8 blocks,
+ OI_UINT8 alloc,
+ OI_UINT8 maxBitpool);
+
+/**
+ * Decode one SBC frame. The frame has no header bytes. The context must have been previously
+ * initialized by calling OI_CODEC_SBC_DecoderConfigureRaw().
+ *
+ * @param context Pointer to a decoder context structure. The same context
+ * must be used each time when decoding from the same stream.
+ *
+ * @param bitpool The actual bitpool size for this frame. Must be <= the maxbitpool specified
+ * in the call to OI_CODEC_SBC_DecoderConfigureRaw(),
+ *
+ * @param frameData Address of a pointer to the SBC data to decode. This
+ * value will be updated to point to the next frame after
+ * successful decoding.
+ *
+ * @param frameBytes Pointer to a UINT32 containing the number of available
+ * bytes of frame data. This value will be updated to reflect
+ * the number of bytes remaining after a decoding operation.
+ *
+ * @param pcmData Address of an array of OI_INT16 pairs, which will be
+ * populated with the decoded audio data. This address
+ * is not updated.
+ *
+ * @param pcmBytes Pointer to a UINT32 in/out parameter. On input, it
+ * should contain the number of bytes available for pcm
+ * data. On output, it will contain the number of bytes
+ * written. Note that this differs from the semantics of
+ * frameBytes.
+ */
+OI_STATUS OI_CODEC_SBC_DecodeRaw(OI_CODEC_SBC_DECODER_CONTEXT *context,
+ OI_UINT8 bitpool,
+ const OI_BYTE **frameData,
+ OI_UINT32 *frameBytes,
+ OI_INT16 *pcmData,
+ OI_UINT32 *pcmBytes);
+
+/**
+ * Decode one SBC frame.
+ *
+ * @param context Pointer to a decoder context structure. The same context
+ * must be used each time when decoding from the same stream.
+ *
+ * @param frameData Address of a pointer to the SBC data to decode. This
+ * value will be updated to point to the next frame after
+ * successful decoding.
+ *
+ * @param frameBytes Pointer to a UINT32 containing the number of available
+ * bytes of frame data. This value will be updated to reflect
+ * the number of bytes remaining after a decoding operation.
+ *
+ * @param pcmData Address of an array of OI_INT16 pairs, which will be
+ * populated with the decoded audio data. This address
+ * is not updated.
+ *
+ * @param pcmBytes Pointer to a UINT32 in/out parameter. On input, it
+ * should contain the number of bytes available for pcm
+ * data. On output, it will contain the number of bytes
+ * written. Note that this differs from the semantics of
+ * frameBytes.
+ */
+OI_STATUS OI_CODEC_SBC_DecodeFrame(OI_CODEC_SBC_DECODER_CONTEXT *context,
+ const OI_BYTE **frameData,
+ OI_UINT32 *frameBytes,
+ OI_INT16 *pcmData,
+ OI_UINT32 *pcmBytes);
+
+/**
+ * Calculate the number of SBC frames but don't decode. CRC's are not checked,
+ * but the Sync word is found prior to count calculation.
+ *
+ * @param frameData Pointer to the SBC data.
+ *
+ * @param frameBytes Number of bytes avaiable in the frameData buffer
+ *
+ */
+OI_UINT8 OI_CODEC_SBC_FrameCount(OI_BYTE *frameData,
+ OI_UINT32 frameBytes);
+
+/**
+ * Analyze an SBC frame but don't do the decode.
+ *
+ * @param context Pointer to a decoder context structure. The same context
+ * must be used each time when decoding from the same stream.
+ *
+ * @param frameData Address of a pointer to the SBC data to decode. This
+ * value will be updated to point to the next frame after
+ * successful decoding.
+ *
+ * @param frameBytes Pointer to a UINT32 containing the number of available
+ * bytes of frame data. This value will be updated to reflect
+ * the number of bytes remaining after a decoding operation.
+ *
+ */
+OI_STATUS OI_CODEC_SBC_SkipFrame(OI_CODEC_SBC_DECODER_CONTEXT *context,
+ const OI_BYTE **frameData,
+ OI_UINT32 *frameBytes);
+
+/* Common functions */
+
+/**
+ Calculate the frame length.
+
+ @param frame The frame whose length to calculate
+
+ @return the length of an individual encoded frame in
+ bytes
+ */
+OI_UINT16 OI_CODEC_SBC_CalculateFramelen(OI_CODEC_SBC_FRAME_INFO *frame);
+
+
+/**
+ * Calculate the maximum bitpool size that fits within a given frame length.
+ *
+ * @param frame The frame to calculate the bitpool size for
+ * @param frameLen The frame length to fit the bitpool to
+ *
+ * @return the maximum bitpool that will fit in the specified frame length
+ */
+OI_UINT16 OI_CODEC_SBC_CalculateBitpool(OI_CODEC_SBC_FRAME_INFO *frame,
+ OI_UINT16 frameLen);
+
+/**
+ Calculate the bit rate.
+
+ @param frame The frame whose bit rate to calculate
+
+ @return the approximate bit rate in bits per second,
+ assuming that stream parameters are constant
+ */
+OI_UINT32 OI_CODEC_SBC_CalculateBitrate(OI_CODEC_SBC_FRAME_INFO *frame);
+
+/**
+ Calculate decoded audio data length for one frame.
+
+ @param frame The frame whose audio data length to calculate
+
+ @return length of decoded audio data for a
+ single frame, in bytes
+ */
+OI_UINT16 OI_CODEC_SBC_CalculatePcmBytes(OI_CODEC_SBC_COMMON_CONTEXT *common);
+
+/**
+ * Get the codec version text.
+ *
+ * @return pointer to text string containing codec version text
+ *
+ */
+OI_CHAR *OI_CODEC_Version(void);
+
+
+/**
+@}
+
+@addtogroup codec_internal
+@{
+*/
+
+extern const OI_CHAR* const OI_CODEC_SBC_FreqText[];
+extern const OI_CHAR* const OI_CODEC_SBC_ModeText[];
+extern const OI_CHAR* const OI_CODEC_SBC_SubbandsText[];
+extern const OI_CHAR* const OI_CODEC_SBC_BlocksText[];
+extern const OI_CHAR* const OI_CODEC_SBC_AllocText[];
+
+/**
+@}
+
+@addtogroup codec_lib
+@{
+*/
+
+#ifdef OI_DEBUG
+void OI_CODEC_SBC_DumpConfig(OI_CODEC_SBC_FRAME_INFO *frameInfo);
+#else
+#define OI_CODEC_SBC_DumpConfig(f)
+#endif
+
+/**
+@}
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _OI_CODEC_SBC_CORE_H */
+
+
diff --git a/embdrv/sbc/decoder/include/oi_codec_sbc_private.h b/embdrv/sbc/decoder/include/oi_codec_sbc_private.h
new file mode 100644
index 0000000..d7489e7
--- /dev/null
+++ b/embdrv/sbc/decoder/include/oi_codec_sbc_private.h
@@ -0,0 +1,229 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+#ifndef _OI_CODEC_SBC_PRIVATE_H
+#define _OI_CODEC_SBC_PRIVATE_H
+
+/**********************************************************************************
+ $Revision: #1 $
+***********************************************************************************/
+
+/**
+@file
+Function prototypes and macro definitions used internally by the codec.
+
+@ingroup codec_internal
+*/
+
+/**
+@addtogroup codec_internal
+@{
+*/
+
+#ifdef USE_RESTRICT_KEYWORD
+#define RESTRICT restrict
+#else
+#define RESTRICT
+#endif
+
+#ifdef CODEC_DEBUG
+#include <stdio.h>
+#define ERROR(x) do { printf x; printf("\n"); } while (0)
+#else
+#define ERROR(x)
+#endif
+
+#ifdef TRACE_EXECUTION
+#define TRACE(x) do { printf x; printf("\n"); } while (0)
+#else
+#define TRACE(x)
+#endif
+
+#ifndef PRIVATE
+#define PRIVATE
+#endif
+
+#ifndef INLINE
+#define INLINE
+#endif
+
+#include "oi_assert.h"
+#include "oi_codec_sbc.h"
+
+#ifndef OI_SBC_SYNCWORD
+#define OI_SBC_SYNCWORD 0x9c
+#endif
+
+#ifndef DIVIDE
+#define DIVIDE(a, b) ((a) / (b))
+#endif
+
+typedef union {
+ OI_UINT8 uint8[SBC_MAX_BANDS];
+ OI_UINT32 uint32[SBC_MAX_BANDS / 4];
+} BITNEED_UNION1;
+
+typedef union {
+ OI_UINT8 uint8[2 * SBC_MAX_BANDS];
+ OI_UINT32 uint32[2 * SBC_MAX_BANDS / 4];
+} BITNEED_UNION2;
+
+static const OI_UINT16 freq_values[] = { 16000, 32000, 44100, 48000 };
+static const OI_UINT8 block_values[] = { 4, 8, 12, 16 };
+static const OI_UINT8 channel_values[] = { 1, 2, 2, 2 };
+static const OI_UINT8 band_values[] = { 4, 8 };
+
+
+#define TEST_MODE_SENTINEL "OINA"
+#define TEST_MODE_SENTINEL_LENGTH 4
+
+/** Used internally. */
+typedef struct {
+ union {
+ const OI_UINT8 *r;
+ OI_UINT8 *w;
+ } ptr;
+ OI_UINT32 value;
+ OI_UINT bitPtr;
+} OI_BITSTREAM;
+
+
+#define VALID_INT16(x) (((x) >= OI_INT16_MIN) && ((x) <= OI_INT16_MAX))
+#define VALID_INT32(x) (((x) >= OI_INT32_MIN) && ((x) <= OI_INT32_MAX))
+
+#define DCTII_8_SHIFT_IN 0
+#define DCTII_8_SHIFT_OUT 16-DCTII_8_SHIFT_IN
+
+#define DCTII_8_SHIFT_0 (DCTII_8_SHIFT_OUT)
+#define DCTII_8_SHIFT_1 (DCTII_8_SHIFT_OUT)
+#define DCTII_8_SHIFT_2 (DCTII_8_SHIFT_OUT)
+#define DCTII_8_SHIFT_3 (DCTII_8_SHIFT_OUT)
+#define DCTII_8_SHIFT_4 (DCTII_8_SHIFT_OUT)
+#define DCTII_8_SHIFT_5 (DCTII_8_SHIFT_OUT)
+#define DCTII_8_SHIFT_6 (DCTII_8_SHIFT_OUT-1)
+#define DCTII_8_SHIFT_7 (DCTII_8_SHIFT_OUT-2)
+
+#define DCT_SHIFT 15
+
+#define DCTIII_4_SHIFT_IN 2
+#define DCTIII_4_SHIFT_OUT 15
+
+#define DCTIII_8_SHIFT_IN 3
+#define DCTIII_8_SHIFT_OUT 14
+
+OI_UINT computeBitneed(OI_CODEC_SBC_COMMON_CONTEXT *common,
+ OI_UINT8 *bitneeds,
+ OI_UINT ch,
+ OI_UINT *preferredBitpool);
+
+void oneChannelBitAllocation(OI_CODEC_SBC_COMMON_CONTEXT *common,
+ BITNEED_UNION1 *bitneeds,
+ OI_UINT ch,
+ OI_UINT bitcount);
+
+
+OI_INT adjustToFitBitpool(const OI_UINT bitpool,
+ OI_UINT32 *bitneeds,
+ const OI_UINT subbands,
+ OI_UINT bitcount,
+ OI_UINT *excess);
+
+INLINE OI_INT allocAdjustedBits(OI_UINT8 *dest,
+ OI_INT bits,
+ OI_INT excess);
+
+INLINE OI_INT allocExcessBits(OI_UINT8 *dest,
+ OI_INT excess);
+
+PRIVATE OI_UINT32 internal_CalculateBitrate(OI_CODEC_SBC_FRAME_INFO *frame);
+
+PRIVATE OI_UINT16 internal_CalculateFramelen(OI_CODEC_SBC_FRAME_INFO *frame);
+
+void monoBitAllocation(OI_CODEC_SBC_COMMON_CONTEXT *common);
+
+typedef void (*BIT_ALLOC)(OI_CODEC_SBC_COMMON_CONTEXT *common);
+
+PRIVATE OI_STATUS internal_DecodeRaw(OI_CODEC_SBC_DECODER_CONTEXT *context,
+ OI_UINT8 bitpool,
+ const OI_BYTE **frameData,
+ OI_UINT32 *frameBytes,
+ OI_INT16 *pcmData,
+ OI_UINT32 *pcmBytes);
+
+INLINE OI_STATUS internal_DecoderReset(OI_CODEC_SBC_DECODER_CONTEXT *context,
+ OI_UINT32 *decoderData,
+ OI_UINT32 decoderDataBytes,
+ OI_BYTE maxChannels,
+ OI_BYTE pcmStride,
+ OI_BOOL enhanced);
+
+INLINE OI_UINT16 OI_SBC_CalculateFrameAndHeaderlen(OI_CODEC_SBC_FRAME_INFO *frame, OI_UINT *headerLen_);
+
+PRIVATE OI_UINT32 OI_SBC_MaxBitpool(OI_CODEC_SBC_FRAME_INFO *frame);
+
+PRIVATE void OI_SBC_ComputeBitAllocation(OI_CODEC_SBC_COMMON_CONTEXT *frame);
+PRIVATE OI_UINT8 OI_SBC_CalculateChecksum(OI_CODEC_SBC_FRAME_INFO *frame, OI_BYTE const *data);
+
+/* Transform functions */
+PRIVATE void shift_buffer(SBC_BUFFER_T *dest, SBC_BUFFER_T *src, OI_UINT wordCount);
+PRIVATE void cosineModulateSynth4(SBC_BUFFER_T * RESTRICT out, OI_INT32 const * RESTRICT in);
+PRIVATE void SynthWindow40_int32_int32_symmetry_with_sum(OI_INT16 *pcm, SBC_BUFFER_T buffer[80], OI_UINT strideShift);
+
+INLINE void dct3_4(OI_INT32 * RESTRICT out, OI_INT32 const * RESTRICT in);
+PRIVATE void analyze4_generated(SBC_BUFFER_T analysisBuffer[RESTRICT 40],
+ OI_INT16 *pcm,
+ OI_UINT strideShift,
+ OI_INT32 subband[4]);
+
+INLINE void dct3_8(OI_INT32 * RESTRICT out, OI_INT32 const * RESTRICT in);
+
+PRIVATE void analyze8_generated(SBC_BUFFER_T analysisBuffer[RESTRICT 80],
+ OI_INT16 *pcm,
+ OI_UINT strideShift,
+ OI_INT32 subband[8]);
+
+#ifdef SBC_ENHANCED
+PRIVATE void analyze8_enhanced_generated(SBC_BUFFER_T analysisBuffer[RESTRICT 112],
+ OI_INT16 *pcm,
+ OI_UINT strideShift,
+ OI_INT32 subband[8]);
+#endif
+
+/* Decoder functions */
+
+INLINE void OI_SBC_ReadHeader(OI_CODEC_SBC_COMMON_CONTEXT *common, const OI_BYTE *data);
+PRIVATE void OI_SBC_ReadScalefactors(OI_CODEC_SBC_COMMON_CONTEXT *common, const OI_BYTE *b, OI_BITSTREAM *bs);
+PRIVATE void OI_SBC_ReadSamples(OI_CODEC_SBC_DECODER_CONTEXT *common, OI_BITSTREAM *ob);
+PRIVATE void OI_SBC_ReadSamplesJoint(OI_CODEC_SBC_DECODER_CONTEXT *common, OI_BITSTREAM *global_bs);
+PRIVATE void OI_SBC_SynthFrame(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_INT16 *pcm, OI_UINT start_block, OI_UINT nrof_blocks);
+INLINE OI_INT32 OI_SBC_Dequant(OI_UINT32 raw, OI_UINT scale_factor, OI_UINT bits);
+PRIVATE OI_BOOL OI_SBC_ExamineCommandPacket(OI_CODEC_SBC_DECODER_CONTEXT *context, const OI_BYTE *data, OI_UINT32 len);
+PRIVATE void OI_SBC_GenerateTestSignal(OI_INT16 pcmData[][2], OI_UINT32 sampleCount);
+
+PRIVATE void OI_SBC_ExpandFrameFields(OI_CODEC_SBC_FRAME_INFO *frame);
+PRIVATE OI_STATUS OI_CODEC_SBC_Alloc(OI_CODEC_SBC_COMMON_CONTEXT *common,
+ OI_UINT32 *codecDataAligned,
+ OI_UINT32 codecDataBytes,
+ OI_UINT8 maxChannels,
+ OI_UINT8 pcmStride);
+/**
+@}
+*/
+
+#endif /* _OI_CODEC_SBC_PRIVATE_H */
+
diff --git a/embdrv/sbc/decoder/include/oi_common.h b/embdrv/sbc/decoder/include/oi_common.h
new file mode 100644
index 0000000..c4169f9
--- /dev/null
+++ b/embdrv/sbc/decoder/include/oi_common.h
@@ -0,0 +1,43 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2002 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+#ifndef _OI_COMMON_H
+#define _OI_COMMON_H
+/**
+ * @file
+ *
+ * This file is used to group commonly used BLUEmagic 3.0 software
+ * header files.
+ *
+ * This file should be included in application source code along with the header
+ * files for the specific modules of the protocol stack being used.
+ */
+
+/**********************************************************************************
+ $Revision: #1 $
+***********************************************************************************/
+
+#include "oi_bt_spec.h"
+#include "oi_stddefs.h"
+#include "oi_status.h"
+#include "oi_time.h"
+#include "oi_osinterface.h"
+
+
+/*****************************************************************************/
+#endif /* _OI_COMMON_H */
diff --git a/embdrv/sbc/decoder/include/oi_cpu_dep.h b/embdrv/sbc/decoder/include/oi_cpu_dep.h
new file mode 100644
index 0000000..da7473a
--- /dev/null
+++ b/embdrv/sbc/decoder/include/oi_cpu_dep.h
@@ -0,0 +1,505 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2002 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+#ifndef _OI_CPU_DEP_H
+#define _OI_CPU_DEP_H
+/**
+ * @file
+ * This file contains definitions for characteristics of the target CPU and
+ * compiler, including primitive data types and endianness.
+ *
+ * This file defines the byte order and primitive data types for various
+ * CPU families. The preprocessor symbol 'CPU' must be defined to be an
+ * appropriate value or this header will generate a compile-time error.
+ *
+ * @note The documentation for this header file uses the x86 family of processors
+ * as an illustrative example for CPU/compiler-dependent data type definitions.
+ * Go to the source code of this header file to see the details of primitive type
+ * definitions for each platform.
+ *
+ * Additional information is available in the @ref data_types_docpage section.
+ */
+
+/**********************************************************************************
+ $Revision: #1 $
+***********************************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** \addtogroup Misc Miscellaneous APIs */
+/**@{*/
+
+/** @name Definitions indicating family of target OI_CPU_TYPE
+ * @{
+ */
+
+#define OI_CPU_X86 1 /**< x86 processor family */
+#define OI_CPU_ARM 2 /**< ARM processor family.
+ @deprecated Use #OI_CPU_ARM7_LEND or
+ #OI_CPU_ARM7_BEND. */
+#define OI_CPU_ARC 3 /**< ARC processor family.
+ @deprecated Use #OI_CPU_ARC_LEND or
+ #OI_CPU_ARC_BEND. */
+#define OI_CPU_SH3 4 /**< Hitachi SH-3 processor family */
+#define OI_CPU_H8 5 /**< Hitachi H8 processor family */
+#define OI_CPU_MIPS 6 /**< MIPS processor family */
+#define OI_CPU_SPARC 7 /**< SPARC processor family */
+#define OI_CPU_M68000 8 /**< Motorola M68000 processor family */
+#define OI_CPU_PPC 9 /**< PowerPC (PPC) processor family */
+#define OI_CPU_SH4_7750 10 /**< Hitachi SH7750 series in SH-4 processor family */
+#define OI_CPU_SH2 11 /**< Hitachi SH-2 processor family */
+#define OI_CPU_ARM7_LEND 12 /**< ARM7, little-endian */
+#define OI_CPU_ARM7_BEND 13 /**< ARM7, big-endian */
+#define OI_CPU_GDM1202 14 /**< GCT GDM1202 */
+#define OI_CPU_ARC_LEND 15 /**< ARC processor family, little-endian */
+#define OI_CPU_ARC_BEND 16 /**< ARC processor family, big-endian */
+#define OI_CPU_M30833F 17 /**< Mitsubishi M308 processor family */
+#define OI_CPU_CR16C 18 /**< National Semiconductor 16 bit processor family */
+#define OI_CPU_M64111 19 /**< Renesas M64111 processor (M32R family) */
+#define OI_CPU_ARMV5_LEND 20 //*< ARM5, little-endian */
+
+#define OI_CPU_TYPE 12
+
+#ifndef OI_CPU_TYPE
+ #error "OI_CPU_TYPE type not defined"
+#endif
+
+/**@}*/
+
+
+/** @name Definitions indicating byte-wise endianness of target CPU
+ * @{
+ */
+
+#define OI_BIG_ENDIAN_BYTE_ORDER 0 /**< Multiple-byte values are stored in memory beginning with the most significant byte at the lowest address. */
+#define OI_LITTLE_ENDIAN_BYTE_ORDER 1 /**< Multiple-byte values are stored in memory beginning with the least significant byte at the lowest address. */
+
+/**@}*/
+
+
+/** @name CPU/compiler-independent primitive data type definitions
+ * @{
+ */
+
+typedef int OI_BOOL; /**< Boolean values use native integer data type for target CPU. */
+typedef int OI_INT; /**< Integer values use native integer data type for target CPU. */
+typedef unsigned int OI_UINT; /**< Unsigned integer values use native unsigned integer data type for target CPU. */
+typedef unsigned char OI_BYTE; /**< Raw bytes type uses native character data type for target CPU. */
+
+/**@}*/
+
+
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_X86
+
+#define OI_CPU_BYTE_ORDER OI_LITTLE_ENDIAN_BYTE_ORDER /**< x86 platform byte ordering is little-endian */
+
+/** @name CPU/compiler-dependent primitive data type definitions for x86 processor family
+ * @{
+ */
+typedef signed char OI_INT8; /**< 8-bit signed integer values use native signed character data type for x86 processor. */
+typedef signed short OI_INT16; /**< 16-bit signed integer values use native signed short integer data type for x86 processor. */
+typedef signed long OI_INT32; /**< 32-bit signed integer values use native signed long integer data type for x86 processor. */
+typedef unsigned char OI_UINT8; /**< 8-bit unsigned integer values use native unsigned character data type for x86 processor. */
+typedef unsigned short OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for x86 processor. */
+typedef unsigned long OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for x86 processor. */
+
+typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */
+
+/**@}*/
+
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_ARM
+/* This CPU type is deprecated (removed from use). Instead, use OI_CPU_ARM7_LEND or OI_CPU_ARM7_BEND for
+ little-endian or big-endian configurations of the ARM7, respectively. */
+#error OI_CPU_ARM is deprecated
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_ARC
+/* This CPU type is deprecated (removed from use). Instead, use OI_CPU_ARC_LEND or OI_CPU_ARC_BEND for
+ little-endian or big-endian configurations of the ARC, respectively. */
+#error OI_CPU_ARC is deprecated
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_SH3
+/* The Hitachi SH C compiler defines _LIT or _BIG, depending on the endianness
+ specified to the compiler on the command line. */
+#if defined(_LIT)
+ #define OI_CPU_BYTE_ORDER OI_LITTLE_ENDIAN_BYTE_ORDER /**< If _LIT is defined, SH-3 platform byte ordering is little-endian. */
+#elif defined(_BIG)
+ #define OI_CPU_BYTE_ORDER OI_BIG_ENDIAN_BYTE_ORDER /**< If _BIG is defined, SH-3 platform byte ordering is big-endian. */
+#else
+ #error SH compiler endianness undefined
+#endif
+
+/** @name CPU/compiler-dependent primitive data type definitions for SH-3 processor family
+ * @{
+ */
+
+typedef signed char OI_INT8; /**< 8-bit signed integer values use native signed character data type for SH-3 processor. */
+typedef signed short OI_INT16; /**< 16-bit signed integer values use native signed short integer data type for SH-3 processor. */
+typedef signed long OI_INT32; /**< 32-bit signed integer values use native signed long integer data type for SH-3 processor. */
+typedef unsigned char OI_UINT8; /**< 8-bit unsigned integer values use native unsigned character data type for SH-3 processor. */
+typedef unsigned short OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for SH-3 processor. */
+typedef unsigned long OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for SH-3 processor. */
+
+typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */
+
+/**@}*/
+
+#endif
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_SH2
+
+#define OI_CPU_BYTE_ORDER OI_BIG_ENDIAN_BYTE_ORDER /**< SH-2 platform byte ordering is big-endian. */
+
+/** @name CPU/compiler-dependent primitive data type definitions for SH-2 processor family
+ * @{
+ */
+
+typedef signed char OI_INT8; /**< 8-bit signed integer values use native signed character data type for SH-2 processor. */
+typedef signed short OI_INT16; /**< 16-bit signed integer values use native signed short integer data type for SH-2 processor. */
+typedef signed long OI_INT32; /**< 32-bit signed integer values use native signed long integer data type for SH-2 processor. */
+typedef unsigned char OI_UINT8; /**< 8-bit unsigned integer values use native unsigned character data type for SH-2 processor. */
+typedef unsigned short OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for SH-2 processor. */
+typedef unsigned long OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for SH-2 processor. */
+
+typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */
+
+/**@}*/
+
+#endif
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_H8
+#define OI_CPU_BYTE_ORDER OI_BIG_ENDIAN_BYTE_ORDER
+#error basic types not defined
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_MIPS
+#define OI_CPU_BYTE_ORDER OI_LITTLE_ENDIAN_BYTE_ORDER
+/** @name CPU/compiler-dependent primitive data type definitions for MIPS processor family
+ * @{
+ */
+typedef signed char OI_INT8; /**< 8-bit signed integer values use native signed character data type for ARM7 processor. */
+typedef signed short OI_INT16; /**< 16-bit signed integer values use native signed short integer data type for ARM7 processor. */
+typedef signed long OI_INT32; /**< 32-bit signed integer values use native signed long integer data type for ARM7 processor. */
+typedef unsigned char OI_UINT8; /**< 8-bit unsigned integer values use native unsigned character data type for ARM7 processor. */
+typedef unsigned short OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for ARM7 processor. */
+typedef unsigned long OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for ARM7 processor. */
+
+typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */
+
+/**@}*/
+
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_SPARC
+#define OI_CPU_BYTE_ORDER OI_LITTLE_ENDIAN_BYTE_ORDER
+#error basic types not defined
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_M68000
+#define OI_CPU_BYTE_ORDER OI_BIG_ENDIAN_BYTE_ORDER /**< M68000 platform byte ordering is big-endian. */
+
+/** @name CPU/compiler-dependent primitive data type definitions for M68000 processor family
+ * @{
+ */
+
+typedef signed char OI_INT8; /**< 8-bit signed integer values use native signed character data type for M68000 processor. */
+typedef signed short OI_INT16; /**< 16-bit signed integer values use native signed short integer data type for M68000 processor. */
+typedef signed long OI_INT32; /**< 32-bit signed integer values use native signed long integer data type for M68000 processor. */
+typedef unsigned char OI_UINT8; /**< 8-bit unsigned integer values use native unsigned character data type for M68000 processor. */
+typedef unsigned short OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for M68000 processor. */
+typedef unsigned long OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for M68000 processor. */
+
+typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */
+
+/**@}*/
+
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_PPC
+#define OI_CPU_BYTE_ORDER OI_BIG_ENDIAN_BYTE_ORDER
+
+
+/** @name CPU/compiler-dependent primitive data type definitions for PPC 8XX processor family
+ * @{
+ */
+
+typedef signed char OI_INT8; /**< 8-bit signed integer values use native signed character data type for PPC8XX processor. */
+typedef signed short OI_INT16; /**< 16-bit signed integer values use native signed short integer data type for PPC8XX processor. */
+typedef signed long OI_INT32; /**< 32-bit signed integer values use native signed long integer data type for PPC8XX processor. */
+typedef unsigned char OI_UINT8; /**< 8-bit unsigned integer values use native unsigned character data type for PPC8XX processor. */
+typedef unsigned short OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for PPC8XX processor. */
+typedef unsigned long OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for PPC8XX processor. */
+
+typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */
+
+/**@}*/
+
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_SH4_7750
+#define OI_CPU_BYTE_ORDER OI_BIG_ENDIAN_BYTE_ORDER /**< SH7750 platform byte ordering is big-endian. */
+
+/** @name CPU/compiler-dependent primitive data type definitions for SH7750 processor series of the SH-4 processor family
+ * @{
+ */
+
+typedef signed char OI_INT8; /**< 8-bit signed integer values use native signed character data type for SH7750 SH-4 processor. */
+typedef signed short OI_INT16; /**< 16-bit signed integer values use native signed short integer data type for SH7750 SH-4 processor. */
+typedef signed long OI_INT32; /**< 32-bit signed integer values use native signed long integer data type for SH7750 SH-4 processor. */
+typedef unsigned char OI_UINT8; /**< 8-bit unsigned integer values use native unsigned character data type for SH7750 SH-4 processor. */
+typedef unsigned short OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for SH7750 SH-4 processor. */
+typedef unsigned long OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for SH7750 SH-4 processor. */
+
+typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */
+
+/**@}*/
+
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_ARM7_LEND
+#define OI_CPU_BYTE_ORDER OI_LITTLE_ENDIAN_BYTE_ORDER
+
+/** @name little-endian CPU/compiler-dependent primitive data type definitions for the ARM7 processor family
+ * @{
+ */
+
+typedef signed char OI_INT8; /**< 8-bit signed integer values use native signed character data type for ARM7 processor. */
+typedef signed short OI_INT16; /**< 16-bit signed integer values use native signed short integer data type for ARM7 processor. */
+typedef signed long OI_INT32; /**< 32-bit signed integer values use native signed long integer data type for ARM7 processor. */
+typedef unsigned char OI_UINT8; /**< 8-bit unsigned integer values use native unsigned character data type for ARM7 processor. */
+typedef unsigned short OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for ARM7 processor. */
+typedef unsigned long OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for ARM7 processor. */
+
+typedef void * OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */
+
+/**@}*/
+
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_ARM7_BEND
+#define OI_CPU_BYTE_ORDER OI_BIG_ENDIAN_BYTE_ORDER
+/** @name big-endian CPU/compiler-dependent primitive data type definitions for the ARM7 processor family
+ * @{
+ */
+typedef signed char OI_INT8; /**< 8-bit signed integer values use native signed character data type for ARM7 processor. */
+typedef signed short OI_INT16; /**< 16-bit signed integer values use native signed short integer data type for ARM7 processor. */
+typedef signed long OI_INT32; /**< 32-bit signed integer values use native signed long integer data type for ARM7 processor. */
+typedef unsigned char OI_UINT8; /**< 8-bit unsigned integer values use native unsigned character data type for ARM7 processor. */
+typedef unsigned short OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for ARM7 processor. */
+typedef unsigned long OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for ARM7 processor. */
+
+typedef void * OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */
+
+/**@}*/
+
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_GDM1202
+#define OI_CPU_BYTE_ORDER OI_BIG_ENDIAN_BYTE_ORDER
+
+typedef signed char OI_INT8; /**< 8-bit signed integer. */
+typedef signed short OI_INT16; /**< 16-bit signed integer. */
+typedef signed long OI_INT32; /**< 32-bit signed integer. */
+typedef unsigned char OI_UINT8; /**< 8-bit unsigned integer. */
+typedef unsigned short OI_UINT16; /**< 16-bit unsigned integer. */
+typedef unsigned long OI_UINT32; /**< 32-bit unsigned integer. */
+
+typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */
+
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_ARC_LEND
+
+#define OI_CPU_BYTE_ORDER OI_LITTLE_ENDIAN_BYTE_ORDER
+
+/** @name CPU/compiler-dependent primitive data type definitions for ARC processor family
+ * @{
+ */
+
+typedef signed char OI_INT8; /**< 8-bit signed integer values use native signed character data type for ARC processor. */
+typedef signed short OI_INT16; /**< 16-bit signed integer values use native signed short integer data type for ARC processor. */
+typedef signed long OI_INT32; /**< 32-bit signed integer values use native signed long integer data type for ARC processor. */
+typedef unsigned char OI_UINT8; /**< 8-bit unsigned integer values use native unsigned character data type for ARC processor. */
+typedef unsigned short OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for ARC processor. */
+typedef unsigned long OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for ARC processor. */
+
+typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */
+
+/**@}*/
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_ARC_BEND
+
+#define OI_CPU_BYTE_ORDER OI_BIG_ENDIAN_BYTE_ORDER
+
+/** @name CPU/compiler-dependent primitive data type definitions for ARC processor family
+ * @{
+ */
+
+typedef signed char OI_INT8; /**< 8-bit signed integer values use native signed character data type for ARC processor. */
+typedef signed short OI_INT16; /**< 16-bit signed integer values use native signed short integer data type for ARC processor. */
+typedef signed long OI_INT32; /**< 32-bit signed integer values use native signed long integer data type for ARC processor. */
+typedef unsigned char OI_UINT8; /**< 8-bit unsigned integer values use native unsigned character data type for ARC processor. */
+typedef unsigned short OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for ARC processor. */
+typedef unsigned long OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for ARC processor. */
+
+typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */
+
+/**@}*/
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_M30833F
+
+#define OI_CPU_BYTE_ORDER OI_LITTLE_ENDIAN_BYTE_ORDER
+
+/** @name CPU/compiler-dependent primitive data type definitions for Mitsubishi M308 processor family
+ * @{
+ */
+
+typedef signed char OI_INT8; /**< 8-bit signed integer values use native signed character data type for M308 processor. */
+typedef signed short OI_INT16; /**< 16-bit signed integer values use native signed short integer data type for M308 processor. */
+typedef signed long OI_INT32; /**< 32-bit signed integer values use native signed long integer data type for M308 processor. */
+typedef unsigned char OI_UINT8; /**< 8-bit unsigned integer values use native unsigned character data type for M308 processor. */
+typedef unsigned short OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for M308 processor. */
+typedef unsigned long OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for M308 processor. */
+
+typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */
+
+/**@}*/
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_CR16C
+
+#define OI_CPU_BYTE_ORDER OI_LITTLE_ENDIAN_BYTE_ORDER
+
+/** @name CPU/compiler-dependent primitive data type definitions for National Semicnductor processor family
+ * @{
+ */
+
+typedef signed char OI_INT8; /**< 8-bit signed integer values use native signed character data type for CR16C processor. */
+typedef signed short OI_INT16; /**< 16-bit signed integer values use native signed short integer data type for CR16C processor. */
+typedef signed long OI_INT32; /**< 32-bit signed integer values use native signed long integer data type for CR16C processor. */
+typedef unsigned char OI_UINT8; /**< 8-bit unsigned integer values use native unsigned character data type for CR16C processor. */
+typedef unsigned short OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for CR16C processor. */
+typedef unsigned long OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for CR16C processor. */
+
+typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */
+
+/**@}*/
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_M64111
+
+#define OI_CPU_BYTE_ORDER OI_BIG_ENDIAN_BYTE_ORDER
+
+/** @name CPU/compiler-dependent primitive data type definitions for Renesas M32R processor family
+ * @{
+ */
+
+typedef signed char OI_INT8; /**< 8-bit signed integer values use native signed character data type for M64111 processor. */
+typedef signed short OI_INT16; /**< 16-bit signed integer values use native signed short integer data type for M64111 processor. */
+typedef signed long OI_INT32; /**< 32-bit signed integer values use native signed long integer data type for M64111 processor. */
+typedef unsigned char OI_UINT8; /**< 8-bit unsigned integer values use native unsigned character data type for M64111 processor. */
+typedef unsigned short OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for M64111 processor. */
+typedef unsigned long OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for M64111 processor. */
+
+typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */
+
+/**@}*/
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_ARMV5_LEND
+#define OI_CPU_BYTE_ORDER OI_LITTLE_ENDIAN_BYTE_ORDER
+
+/** @name little-endian CPU/compiler-dependent primitive data type definitions for the ARM7 processor family
+ * @{
+ */
+
+typedef signed char OI_INT8; /**< 8-bit signed integer values use native signed character data type for ARM7 processor. */
+typedef signed short OI_INT16; /**< 16-bit signed integer values use native signed short integer data type for ARM7 processor. */
+typedef signed long OI_INT32; /**< 32-bit signed integer values use native signed long integer data type for ARM7 processor. */
+typedef unsigned char OI_UINT8; /**< 8-bit unsigned integer values use native unsigned character data type for ARM7 processor. */
+typedef unsigned short OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for ARM7 processor. */
+typedef unsigned long OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for ARM7 processor. */
+
+typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */
+
+/**@}*/
+
+#endif
+
+/*********************************************************************************/
+
+
+#ifndef OI_CPU_BYTE_ORDER
+ #error "Byte order (endian-ness) not defined"
+#endif
+
+
+/**@}*/
+
+#ifdef __cplusplus
+}
+#endif
+
+/*********************************************************************************/
+#endif /* _OI_CPU_DEP_H */
diff --git a/embdrv/sbc/decoder/include/oi_modules.h b/embdrv/sbc/decoder/include/oi_modules.h
new file mode 100644
index 0000000..a0b68dd
--- /dev/null
+++ b/embdrv/sbc/decoder/include/oi_modules.h
@@ -0,0 +1,171 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2002 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+#ifndef _OI_MODULES_H
+#define _OI_MODULES_H
+/**
+ * @file
+ *
+ * Enumeration type defining the inidivual stack components.
+ *
+ */
+
+/**********************************************************************************
+ $Revision: #1 $
+***********************************************************************************/
+
+
+/** \addtogroup Misc Miscellaneous APIs */
+/**@{*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/**
+ * This enumeration lists constants for referencing the components of
+ * the BLUEmagic 3.0 protocol stack, profiles, and other functionalities.
+ *
+ * In order to distinguish types of modules, items are grouped with markers to
+ * delineate start and end of the groups
+ *
+ * The module type is used for various purposes:
+ * identification in debug print statements
+ * access to initialization flags
+ * access to the configuration table
+ */
+
+typedef enum {
+ /* profiles and protocols --> Updates to oi_debug.c and oi_config_table.c */
+
+ /* XX --> Keep Enum values up-to-date! */
+ OI_MODULE_AT, /**< 00 AT command processing */
+ OI_MODULE_A2DP, /**< 01 Advanced Audio Distribution Profile */
+ OI_MODULE_AVCTP, /**< 02 Audio-Visual Control Transport Profile */
+ OI_MODULE_AVDTP, /**< 03 Audio-Visual Distribution Protocol */
+ OI_MODULE_AVRCP, /**< 04 Audio-Visual Remote Control Profile */
+ OI_MODULE_BIP_CLI, /**< 05 Basic Imaging Profile protocol client */
+ OI_MODULE_BIP_SRV, /**< 06 Basic Imaging Profile protocol server */
+ OI_MODULE_BNEP, /**< 07 Bluetooth Network Encapsulation Protocol */
+ OI_MODULE_BPP_SENDER, /**< 08 Basic Printing Profile */
+ OI_MODULE_BPP_PRINTER, /**< 09 Basic Printing Profile */
+ OI_MODULE_CTP, /**< 10 Cordless Telephony Profile */
+ OI_MODULE_DUN, /**< 11 Dial-Up Networking Profile */
+ OI_MODULE_FAX, /**< 12 Fax Profile */
+ OI_MODULE_FTP_CLI, /**< 13 File Transfer Profile protocol client */
+ OI_MODULE_FTP_SRV, /**< 14 File Transfer Profile protocol server */
+ OI_MODULE_HANDSFREE, /**< 15 Hands-Free Profile */
+ OI_MODULE_HANDSFREE_AG, /**< 16 Hands-Free Profile */
+ OI_MODULE_HCRP_CLI, /**< 17 Hardcopy Cable Replacement Profile */
+ OI_MODULE_HCRP_SRV, /**< 18 Hardcopy Cable Replacement Profile */
+ OI_MODULE_HEADSET, /**< 19 Headset Profile */
+ OI_MODULE_HEADSET_AG, /**< 20 Headset Profile */
+ OI_MODULE_HID, /**< 21 Human Interface Device profile */
+ OI_MODULE_INTERCOM, /**< 22 Intercom Profile */
+ OI_MODULE_OBEX_CLI, /**< 23 OBEX protocol client, Generic Object Exchange Profile */
+ OI_MODULE_OBEX_SRV, /**< 24 OBEX protocol server, Generic Object Exchange Profile */
+ OI_MODULE_OPP_CLI, /**< 25 Object Push Profile protocol client */
+ OI_MODULE_OPP_SRV, /**< 26 Object Push Profile protocol server */
+ OI_MODULE_PAN, /**< 27 PAN profile */
+ OI_MODULE_PBAP_CLI, /**< 28 Phonebook Access Profile client */
+ OI_MODULE_PBAP_SRV, /**< 29 Phonebook Access Profile server */
+ OI_MODULE_SAP_CLI, /**< 30 SIM Access Profile */
+ OI_MODULE_SAP_SRV, /**< 31 SIM Access Profile */
+ OI_MODULE_SPP, /**< 32 Serial Port Profile */
+ OI_MODULE_SYNC_CLI, /**< 33 Synchronization Profile */
+ OI_MODULE_SYNC_SRV, /**< 34 Synchronization Profile */
+ OI_MODULE_SYNC_CMD_CLI, /**< 35 Synchronization Profile */
+ OI_MODULE_SYNC_CMD_SRV, /**< 36 Synchronization Profile */
+ OI_MODULE_SYNCML, /**< 37 SyncML Profile */
+ OI_MODULE_TCS, /**< 38 TCS Binary */
+ OI_MODULE_VDP, /**< 39 Video Distribution Profile */
+
+ /* corestack components --> Updates to oi_debug.c and oi_config_table.c */
+
+ OI_MODULE_COMMON_CONFIG, /**< 40 Common configuration, module has no meaning other than for config struct */
+ OI_MODULE_CMDCHAIN, /**< 41 Command chaining utility */
+ OI_MODULE_DISPATCH, /**< 42 Dispatcher */
+ OI_MODULE_DATAELEM, /**< 43 Data Elements, marshaller */
+ OI_MODULE_DEVMGR, /**< 44 Device Manager */
+ OI_MODULE_DEVMGR_MODES, /**< 45 Device Manager connectability/discoverability modes */
+ OI_MODULE_HCI, /**< 46 Host Controller Interface command layer */
+ OI_MODULE_L2CAP, /**< 47 L2CAP */
+ OI_MODULE_MEMMGR, /**< 48 modules that do memory management */
+ OI_MODULE_POLICYMGR, /**< 49 Policy Manager */
+ OI_MODULE_RFCOMM, /**< 50 RFCOMM */
+ OI_MODULE_RFCOMM_SD, /**< 51 RFCOMM Service discovery */
+ OI_MODULE_SDP_CLI, /**< 52 Service Discovery Protocol client */
+ OI_MODULE_SDP_SRV, /**< 53 Service Discovery Protocol server */
+ OI_MODULE_SDPDB, /**< 54 Service Discovery Protocol database */
+ OI_MODULE_SECMGR, /**< 55 Security Manager */
+ OI_MODULE_SNIFFLOG, /**< 56 sniff log */
+ OI_MODULE_SUPPORT, /**< 57 support functions, including CThru Dispatcher, time functions, and stack initialization */
+ OI_MODULE_TRANSPORT, /**< 58 transport layer between HCI command layer and driver */
+ OI_MODULE_TEST, /**< 59 used to debug output from internal test programs */
+ OI_MODULE_XML, /**< 60 XML/CSS parser */
+
+ OI_MODULE_DI, /**< 61 Device Identification Profile */
+
+ // bhapi components --> Updates to oi_debug.c
+
+ OI_MODULE_BHAPI, /**< 62 BLUEmagic Host API generic */
+ OI_MODULE_BHCLI, /**< 63 BLUEmagic Host API client side */
+ OI_MODULE_BHSRV, /**< 64 BLUEmagic Host API server side */
+ OI_MODULE_MSGQ, /**< 65 module that handles message queuing */
+ OI_MODULE_BHAPI_TRANSPORT, /**< 66 module that handles message queuing */
+ OI_MODULE_BLST_SRV, /**< 67 module that provides server side BHAPI Lightweight Serial Transport */
+ OI_MODULE_BLST_CLI, /**< 68 module that provides client side BHAPI Lightweight Serial Transport */
+
+ // OEM files --> Updates to oi_debug.c
+ OI_MODULE_OEM, /**< 69 Application Memory allocation */
+
+ // Application glue --> Updates to oi_debug.c
+ OI_MODULE_APP, /**< 70 Application Memory allocation */
+
+ /* various pieces of code depend on these last 2 elements occuring in a specific order:
+ OI_MODULE_ALL must be the 2nd to last element
+ OI_MODULE_UNKNOWN must be the last element
+ */
+ OI_MODULE_ALL, /**< 71 special value identifying all modules - used for control of debug print statements */
+ OI_MODULE_UNKNOWN /**< 72 special value - used for debug print statements */
+} OI_MODULE;
+
+/**
+ * This constant is the number of actual modules in the list. ALL and UNKNOWN are
+ * special values that are not actually modules.
+ * Used for debug print and memmgr profiling
+ */
+#define OI_NUM_MODULES OI_MODULE_ALL
+
+
+/**
+ * This constant is the number of profile and core components. It is used to size
+ * the initialization and configuration tables.
+ */
+#define OI_NUM_STACK_MODULES OI_MODULE_BHAPI
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/**@}*/
+
+#endif /* _OI_MODULES_H */
+
diff --git a/embdrv/sbc/decoder/include/oi_osinterface.h b/embdrv/sbc/decoder/include/oi_osinterface.h
new file mode 100644
index 0000000..7868041
--- /dev/null
+++ b/embdrv/sbc/decoder/include/oi_osinterface.h
@@ -0,0 +1,197 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2002 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+#ifndef _OI_OSINTERFACE_H
+#define _OI_OSINTERFACE_H
+/**
+ @file
+ * This file provides the platform-independent interface for functions for which
+ * implementation is platform-specific.
+ *
+ * The functions in this header file define the operating system or hardware
+ * services needed by the BLUEmagic 3.0 protocol stack. The
+ * actual implementation of these services is platform-dependent.
+ *
+ */
+
+/**********************************************************************************
+ $Revision: #1 $
+***********************************************************************************/
+
+#include "oi_stddefs.h"
+#include "oi_time.h"
+#include "oi_status.h"
+#include "oi_modules.h"
+
+/** \addtogroup Misc Miscellaneous APIs */
+/**@{*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/**
+ * Terminates execution.
+ *
+ * @param reason Reason for termination
+ */
+void OI_FatalError(OI_STATUS reason);
+
+/**
+ * This function logs an error.
+ *
+ * When built for release mode, BLUEmagic 3 errors are logged to
+ * this function. (in debug mode, errors are logged via
+ * OI_Print()).
+ *
+ * @param module Module in which the error was detected (see
+ * oi_modules.h)
+ * @param lineno Line number of the C file OI_SLOG_ERROR called
+ * @param status Status code associated with the error event
+ */
+void OI_LogError(OI_MODULE module, OI_INT lineno, OI_STATUS status);
+
+/**
+ * This function initializes the debug code handling.
+ *
+ * When built for debug mode, this function performs platform
+ * dependent initialization to handle message codes passed in
+ * via OI_SetMsgCode().
+ */
+void OI_InitDebugCodeHandler(void);
+
+
+/**
+ * This function reads the time from the real time clock.
+ *
+ * All timing in BM3 is relative, typically a granularity
+ * of 5 or 10 msecs is adequate.
+ *
+ * @param[out] now Pointer to the buffer to which the current
+ * time will be returned
+ */
+void OI_Time_Now(OI_TIME *now);
+
+/**
+ * This function causes the current thread to sleep for the
+ * specified amount of time. This function must be called
+ * without the stack access token.
+ *
+ * @note BM3 corestack and profiles never suspend and never call
+ * OI_Sleep. The use of OI_Sleep is limited to applications and
+ * platform-specific code.
+ *
+ * If your port and applications never use OI_Sleep, this function can be left unimplemented.
+ *
+ * @param milliseconds Number of milliseconds to sleep
+ */
+void OI_Sleep(OI_UINT32 milliseconds);
+
+
+/**
+ * Defines for message type codes.
+ */
+#define OI_MSG_CODE_APPLICATION 0 /**< Application output */
+#define OI_MSG_CODE_ERROR 1 /**< Error message output */
+#define OI_MSG_CODE_WARNING 2 /**< Warning message output */
+#define OI_MSG_CODE_TRACE 3 /**< User API function trace output */
+#define OI_MSG_CODE_PRINT1 4 /**< Catagory 1 debug print output */
+#define OI_MSG_CODE_PRINT2 5 /**< Catagory 2 debug print output */
+#define OI_MSG_CODE_HEADER 6 /**< Error/Debug output header */
+
+/**
+ * This function is used to indicate the type of text being output with
+ * OI_Print(). For the Linux and Win32 platforms, it will set
+ * the color of the text. Other possible uses could be to insert
+ * HTML style tags, add some other message type indication, or
+ * be completely ignored altogether.
+ *
+ * @param code OI_MSG_CODE_* indicating setting the message type.
+ */
+void OI_SetMsgCode(OI_UINT8 code);
+
+/**
+ * All output from OI_Printf() and all debug output is sent to OI_Print.
+ * Typically, if the platform has a console, OI_Print() is sent to stdout.
+ * Embedded platforms typically send OI_Print() output to a serial port.
+ *
+ * @param str String to print
+ */
+void OI_Print(OI_CHAR const *str);
+
+/**
+ * In cases where OI_Print() is sending output to a logfile in addition to console,
+ * it is desirable to also put console input into the logfile.
+ * This function can be called by the console input process.
+ *
+ * @note This is an optional API which is strictly
+ * between the platform-specific stack_console and osinterface
+ * modules. This API need only be implemented on those
+ * platforms where is serves a useful purpose, e.g., win32.
+ *
+ * @param str Console input string
+ */
+
+void OI_Print_ConsoleInput(OI_CHAR const *str);
+
+/**
+ * This function computes the CRC16 of the program image.
+ */
+OI_UINT16 OI_ProgramImageCRC16(void);
+
+/**
+ * Writes an integer to stdout in hex. This macro is intended
+ * for selective use when debugging in small memory
+ * configurations or other times when it is not possible to use
+ * OI_DBGPRINT.
+ *
+ * @param n the integer to print
+ */
+
+#define OI_Print_Int(n) \
+{ \
+ static const OI_CHAR _digits[] = "0123456789ABCDEF"; \
+ OI_CHAR _buf[9]; \
+ OI_CHAR *_str = &_buf[8]; \
+ OI_UINT32 _i = n; \
+ *_str = 0; \
+ do { *(--_str) = _digits[(_i & 0xF)]; _i >>= 4; } while (_i); \
+ OI_Print(_str); \
+}
+
+/**
+ * Application Dynamic Memory allocation.
+ *
+ * These APIs are provided for application use on those
+ * platforms which have no dynamic memory support. Memory is
+ * allocated from the pool-based heap managed by the stack's
+ * internal memory manager.
+ */
+void *OI_APP_Malloc(OI_INT32 size);
+void OI_APP_Free(void *ptr);
+
+/*****************************************************************************/
+#ifdef __cplusplus
+}
+#endif
+
+/**@}*/
+
+#endif /* _OI_OSINTERFACE_H */
+
diff --git a/embdrv/sbc/decoder/include/oi_status.h b/embdrv/sbc/decoder/include/oi_status.h
new file mode 100644
index 0000000..868d8dc
--- /dev/null
+++ b/embdrv/sbc/decoder/include/oi_status.h
@@ -0,0 +1,579 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2002 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+#ifndef _OI_STATUS_H
+#define _OI_STATUS_H
+/**
+ * @file
+ * This file contains status codes for BLUEmagic 3.0 software.
+ */
+
+#include "oi_stddefs.h"
+
+/** \addtogroup Misc Miscellaneous APIs */
+/**@{*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+ /** test it **/
+
+/**
+ * OI_STATUS must fit in 16 bits, so status codes can range from 0 to 66535, inclusive.
+ */
+
+typedef enum {
+ OI_STATUS_SUCCESS = 0, /**< function call succeeded alias for #OI_OK */
+ OI_OK = 0, /**< function call succeeded alias for #OI_STATUS_SUCCESS */
+ OI_STATUS_INVALID_PARAMETERS = 101, /**< invalid function input parameters */
+ OI_STATUS_NOT_IMPLEMENTED = 102, /**< attempt to use an unimplemented function */
+ OI_STATUS_NOT_INITIALIZED = 103, /**< data not initialized */
+ OI_STATUS_NO_RESOURCES = 104, /**< generic resource allocation failure status */
+ OI_STATUS_INTERNAL_ERROR = 105, /**< internal inconsistency */
+ OI_STATUS_OUT_OF_MEMORY = 106, /**< generally, OI_Malloc failed */
+ OI_ILLEGAL_REENTRANT_CALL = 107, /**< violation of non-reentrant module policy */
+ OI_STATUS_INITIALIZATION_FAILED = 108, /**< module initialization failed */
+ OI_STATUS_INITIALIZATION_PENDING = 109, /**< inititialization not yet complete */
+ OI_STATUS_NO_SCO_SUPPORT = 110, /**< SCO operation rejected; system not configured for SCO */
+ OI_STATUS_OUT_OF_STATIC_MEMORY = 111, /**< static malloc failed */
+ OI_TIMEOUT = 112, /**< generic timeout */
+ OI_OS_ERROR = 113, /**< some operating system error */
+ OI_FAIL = 114, /**< generic failure */
+ OI_STRING_FORMAT_ERROR = 115, /**< error in VarString formatting string */
+ OI_STATUS_PENDING = 116, /**< The operation is pending. */
+ OI_STATUS_INVALID_COMMAND = 117, /**< The command was invalid. */
+ OI_BUSY_FAIL = 118, /**< command rejected due to busy */
+ OI_STATUS_ALREADY_REGISTERED = 119, /**< The registration has already been performed. */
+ OI_STATUS_NOT_FOUND = 120, /**< The referenced resource was not found. */
+ OI_STATUS_NOT_REGISTERED = 121, /**< not registered */
+ OI_STATUS_NOT_CONNECTED = 122, /**< not connected */
+ OI_CALLBACK_FUNCTION_REQUIRED = 123, /**< A callback function parameter was required. */
+ OI_STATUS_MBUF_OVERFLOW = 124, /**< There is no room to add another buffer to an mbuf. */
+ OI_STATUS_MBUF_UNDERFLOW = 125, /**< There was an attempt to pull too many bytes from an mbuf. */
+ OI_STATUS_CONNECTION_EXISTS = 126, /**< connection exists */
+ OI_STATUS_NOT_CONFIGURED = 127, /**< module not configured */
+ OI_LOWER_STACK_ERROR = 128, /**< An error was reported by lower stack API. This is used for embedded platforms. */
+ OI_STATUS_RESET_IN_PROGRESS = 129, /**< Request failed/rejected because we're busy resetting. */
+ OI_STATUS_ACCESS_DENIED = 130, /**< Generic access denied error. */
+ OI_STATUS_DATA_ERROR = 131, /**< Generic data error. */
+ OI_STATUS_INVALID_ROLE = 132, /**< The requested role was invalid. */
+ OI_STATUS_ALREADY_CONNECTED = 133, /**< The requested connection is already established. */
+ OI_STATUS_PARSE_ERROR = 134, /**< Parse error */
+ OI_STATUS_END_OF_FILE = 135, /**< End of file */
+ OI_STATUS_READ_ERROR = 136, /**< Generic read error */
+ OI_STATUS_WRITE_ERROR = 137, /**< Generic write error */
+ OI_STATUS_NEGOTIATION_FAILURE = 138, /**< Error in negotiation */
+ OI_STATUS_READ_IN_PROGRESS = 139, /**< A read is already in progress */
+ OI_STATUS_ALREADY_INITIALIZED = 140, /**< Initialization has already been done */
+ OI_STATUS_STILL_CONNECTED = 141, /**< The service cannot be shutdown because there are still active connections. */
+ OI_STATUS_MTU_EXCEEDED = 142, /**< The packet is too big */
+ OI_STATUS_LINK_TERMINATED = 143, /**< The link was terminated */
+ OI_STATUS_PIN_CODE_TOO_LONG = 144, /**< Application gave us a pin code that is too long */
+ OI_STATUS_STILL_REGISTERED = 145, /**< The service cannot be shutdown because there are still active registrations. */
+ OI_STATUS_SPEC_VIOLATION = 146, /**< Some application behavior contrary to BT specifications */
+
+
+ OI_STATUS_PSM_ALREADY_REGISTERED = 402, /**< L2CAP: The specified PSM has already been registered. */
+ OI_STATUS_INVALID_CID = 403, /**< L2CAP: CID is invalid or no longer valid (connection terminated) */
+ OI_STATUS_CID_NOT_FOUND = 404, /**< L2CAP: CID does not represent a current connection */
+ OI_STATUS_CHANNEL_NOT_FOUND = 406, /**< L2CAP: CID does not represent a current connection */
+ OI_STATUS_PSM_NOT_FOUND = 407, /**< L2CAP: PSM not found */
+ OI_STATUS_INVALID_STATE = 408, /**< L2CAP: invalid state */
+ OI_STATUS_WRITE_IN_PROGRESS = 410, /**< L2CAP: write in progress */
+ OI_STATUS_INVALID_PACKET = 411, /**< L2CAP: invalid packet */
+ OI_STATUS_SEND_COMPLETE = 412, /**< L2CAP: send is complete */
+ OI_STATUS_INVALID_HANDLE = 414, /**< L2CAP: handle is invalid */
+ OI_STATUS_GROUP_FULL = 418, /**< L2CAP: No more members can be added to the specified group. */
+ OI_STATUS_DEVICE_ALREADY_IN_GROUP = 423, /**< L2CAP: The device already exists in the group. */
+ OI_STATUS_DUPLICATE_GROUP = 425, /**< L2CAP: attempt to add more than one group */
+ OI_STATUS_EMPTY_GROUP = 426, /**< L2CAP: group is empty */
+ OI_STATUS_PACKET_NOT_FOUND = 427, /**< L2CAP: packet not found */
+ OI_STATUS_BUFFER_TOO_SMALL = 428, /**< L2CAP: The buffer size is too small. */
+ OI_STATUS_IDENTIFIER_NOT_FOUND = 429, /**< L2CAP: identifier not found */
+
+ OI_L2CAP_DISCONNECT_LOWER_LAYER = 430, /**< L2CAP: The lower level forced a disconnect. */
+ OI_L2CAP_DISCONNECT_REMOTE_REQUEST = 431, /**< L2CAP: The remote device requested a disconnect. */
+ OI_L2CAP_GROUP_ADD_CONNECT_FAIL = 433, /**< L2CAP: Group add connect faiL */
+ OI_L2CAP_GROUP_REMOVE_FAILURE = 434, /**< L2CAP: Group remove failure */
+ OI_L2CAP_DATA_WRITE_ERROR_LINK_TERM = 435, /**< L2CAP: Data write error LINK_TERM */
+ OI_L2CAP_DISCONNECT_LOCAL_REQUEST = 436, /**< L2CAP: Disconnect local request */
+
+ OI_L2CAP_CONNECT_TIMEOUT = 437, /**< L2CAP: Connect timeout */
+ OI_L2CAP_DISCONNECT_TIMEOUT = 439, /**< L2CAP: Disconnect timeout */
+ OI_L2CAP_PING_TIMEOUT = 440, /**< L2CAP: Ping timeout */
+ OI_L2CAP_GET_INFO_TIMEOUT = 441, /**< L2CAP: Get info timeout */
+ OI_L2CAP_INVALID_ADDRESS = 444, /**< L2CAP: Invalid address */
+ OI_L2CAP_CMD_REJECT_RCVD = 445, /**< L2CAP: remote sent us 'command reject' response */
+
+ OI_L2CAP_CONNECT_BASE = 450, /**< L2CAP: Connect base */
+ OI_L2CAP_CONNECT_PENDING = 451, /**< L2CAP: Connect pending */
+ OI_L2CAP_CONNECT_REFUSED_INVALID_PSM = 452, /**< L2CAP: Connect refused invalid PSM */
+ OI_L2CAP_CONNECT_REFUSED_SECURITY = 453, /**< L2CAP: Connect refused security */
+ OI_L2CAP_CONNECT_REFUSED_NO_RESOURCES = 454, /**< L2CAP: Connect refused no resources */
+
+ OI_L2CAP_CONFIG_BASE = 460, /**< L2CAP: Config base */
+ OI_L2CAP_CONFIG_FAIL_INVALID_PARAMETERS= 461, /**< L2CAP: Config fail invalid parameters */
+ OI_L2CAP_CONFIG_FAIL_NO_REASON = 462, /**< L2CAP: Config fail no reason */
+ OI_L2CAP_CONFIG_FAIL_UNKNOWN_OPTIONS = 463, /**< L2CAP: Config fail unknown options */
+
+ OI_L2CAP_GET_INFO_BASE = 470, /**< L2CAP: Get info base */
+ OI_L2CAP_GET_INFO_NOT_SUPPORTED = 471, /**< L2CAP: Get info not supported */
+ OI_L2CAP_MTU_EXCEEDED = 472, /**< L2CAP: The MTU of the channel was exceeded */
+ OI_L2CAP_INVALID_PSM = 482, /**< L2CAP: Invalid PSM */
+ OI_L2CAP_INVALID_MTU = 483, /**< L2CAP: Invalid MTU */
+ OI_L2CAP_INVALID_FLUSHTO = 484, /**< L2CAP: Invalid flush timeout */
+
+ OI_HCI_NO_SUCH_CONNECTION = 601, /**< HCI: caller specified a non-existent connection handle */
+ OI_HCI_CB_LIST_FULL = 603, /**< HCI: callback list is full, cannot attempt to send command */
+ OI_HCI_EVENT_UNDERRUN = 605, /**< HCI: parsing event packet, premature end-of-parameters */
+ OI_HCI_UNKNOWN_EVENT_CODE = 607, /**< HCI: event received - event code is unknown */
+ OI_HCI_BAD_EVENT_PARM_LEN = 608, /**< HCI: event - parameter length is incorrect */
+ OI_HCI_CMD_QUEUE_FULL = 611, /**< HCI: command queue is full */
+ OI_HCI_SHORT_EVENT = 612, /**< HCI: event received, missing event code and/or parm len */
+ OI_HCI_TRANSMIT_NOT_READY = 613, /**< HCI: ACL/SCO transmit request failed - busy or no buffers available */
+ OI_HCI_ORPHAN_SENT_EVENT = 614, /**< HCI: got spurious 'sent' event from transport layer */
+ OI_HCI_CMD_TABLE_ERROR = 615, /**< HCI: inconsistency in the internal command table */
+ OI_HCI_UNKNOWN_CMD_ID = 616, /**< HCI: HciApi Command - unknown command id */
+ OI_HCI_UNEXPECTED_EVENT = 619, /**< HCI: event received which only occurs in response to our cmd */
+ OI_HCI_EVENT_TABLE_ERROR = 620, /**< HCI: inconsistency in the internal event table */
+ OI_HCI_EXPECTED_EVENT_TIMOUT = 621, /**< HCI: timed out waiting for an expected event */
+ OI_HCI_NO_CMD_DESC_FOR_OPCODE = 622, /**< HCI: event opcode is not known */
+ OI_HCI_INVALID_OPCODE_ERROR = 623, /**< HCI: command opcode is invalid */
+ OI_HCI_FLOW_CONTROL_DISABLED = 624, /**< HCI: can not use host flow control APIs if disabled in configuration */
+ OI_HCI_TX_COMPLETE = 625, /**< HCI: packet delivery to Host Controler complete */
+ OI_HCI_TX_ERROR = 626, /**< HCI: failed to deliver packet to Host Controler */
+ OI_HCI_DEVICE_NOT_INITIALIZED = 627, /**< HCI: commands from upper layers disallowed until device is up and running */
+ OI_HCI_UNSUPPORTED_COMMAND = 628, /**< HCI: command requested is not supported by local device */
+ OI_HCI_PASSTHROUGH_ERROR = 629, /**< HCI: Error processing passthrough command */
+ OI_HCI_PASSTHROUGH_ALREADY_SET = 630, /**< HCI: Passthrough mode already enabled */
+ OI_HCI_RESET_FAILURE = 631, /**< HCI: failed to reset the device/baseband */
+ OI_HCI_TRANSPORT_RESET = 632, /**< HCI: some operation failed because of a reset in the transport */
+ OI_HCIERR_HCIIFC_INIT_FAILURE = 633, /**< HCI: failed to initialize transport layer interface */
+
+ OI_HCIERR_FIRST_ERROR_VALUE = 701, /**< marker for first HCI protocol error */
+ OI_HCIERR_UNKNOWN_HCI_COMMAND = 701, /**< HCI: protocol error 0x01 */
+ OI_HCIERR_NO_CONNECTION = 702, /**< HCI: protocol error 0x02 */
+ OI_HCIERR_HARDWARE_FAILURE = 703, /**< HCI: protocol error 0x03 */
+ OI_HCIERR_PAGE_TIMEOUT = 704, /**< HCI: protocol error 0x04 */
+ OI_HCIERR_AUTHENTICATION_FAILURE = 705, /**< HCI: protocol error 0x05 */
+ OI_HCIERR_KEY_MISSING = 706, /**< HCI: protocol error 0x06 */
+ OI_HCIERR_MEMORY_FULL = 707, /**< HCI: protocol error 0x07 */
+ OI_HCIERR_CONNECTION_TIMEOUT = 708, /**< HCI: protocol error 0x08 */
+ OI_HCIERR_MAX_NUM_OF_CONNECTIONS = 709, /**< HCI: protocol error 0x09 */
+ OI_HCIERR_MAX_NUM_OF_SCO_CONNECTIONS = 710, /**< HCI: protocol error 0x0A */
+ OI_HCIERR_ACL_CONNECTION_ALREADY_EXISTS = 711, /**< HCI: protocol error 0x0B */
+ OI_HCIERR_COMMAND_DISALLOWED = 712, /**< HCI: protocol error 0x0C */
+ OI_HCIERR_HOST_REJECTED_RESOURCES = 713, /**< HCI: protocol error 0x0D */
+ OI_HCIERR_HOST_REJECTED_SECURITY = 714, /**< HCI: protocol error 0x0E */
+ OI_HCIERR_HOST_REJECTED_PERSONAL_DEVICE = 715, /**< HCI: protocol error 0x0F */
+ OI_HCIERR_HOST_TIMEOUT = 716, /**< HCI: protocol error 0x10 */
+ OI_HCIERR_UNSUPPORTED = 717, /**< HCI: protocol error 0x11 */
+ OI_HCIERR_INVALID_PARAMETERS = 718, /**< HCI: protocol error 0x12 */
+ OI_HCIERR_OTHER_END_USER_DISCONNECT = 719, /**< HCI: protocol error 0x13 */
+ OI_HCIERR_OTHER_END_LOW_RESOURCES = 720, /**< HCI: protocol error 0x14 */
+ OI_HCIERR_OTHER_END_POWERING_OFF = 721, /**< HCI: protocol error 0x15 */
+ OI_HCIERR_CONNECTION_TERMINATED_LOCALLY = 722, /**< HCI: protocol error 0x16 */
+ OI_HCIERR_REPEATED_ATTEMPTS = 723, /**< HCI: protocol error 0x17 */
+ OI_HCIERR_PAIRING_NOT_ALLOWED = 724, /**< HCI: protocol error 0x18 */
+ OI_HCIERR_UNKNOWN_LMP_PDU = 725, /**< HCI: protocol error 0x19 */
+ OI_HCIERR_UNSUPPORTED_REMOTE_FEATURE = 726, /**< HCI: protocol error 0x1A */
+ OI_HCIERR_SCO_OFFSET_REJECTED = 727, /**< HCI: protocol error 0x1B */
+ OI_HCIERR_SCO_INTERVAL_REJECTED = 728, /**< HCI: protocol error 0x1C */
+ OI_HCIERR_SCO_AIR_MODE_REJECTED = 729, /**< HCI: protocol error 0x1D */
+ OI_HCIERR_INVALID_LMP_PARMS = 730, /**< HCI: protocol error 0x1E */
+ OI_HCIERR_UNSPECIFIED_ERROR = 731, /**< HCI: protocol error 0x1F */
+ OI_HCIERR_UNSUPPORTED_LMP_PARAMETERS = 732, /**< HCI: protocol error 0x20 */
+ OI_HCIERR_ROLE_CHANGE_NOT_ALLOWED = 733, /**< HCI: protocol error 0x21 */
+ OI_HCIERR_LMP_RESPONSE_TIMEOUT = 734, /**< HCI: protocol error 0x22 */
+ OI_HCIERR_LMP_ERROR_TRANS_COLLISION = 735, /**< HCI: protocol error 0x23 */
+ OI_HCIERR_LMP_PDU_NOT_ALLOWED = 736, /**< HCI: protocol error 0x24 */
+ OI_HCIERR_ENCRYPTION_MODE_NOT_ACCEPTABLE = 737, /**< HCI: protocol error 0x25 */
+ OI_HCIERR_UNIT_KEY_USED = 738, /**< HCI: protocol error 0x26 */
+ OI_HCIERR_QOS_NOT_SUPPORTED = 739, /**< HCI: protocol error 0x27 */
+ OI_HCIERR_INSTANT_PASSED = 740, /**< HCI: protocol error 0x28 */
+ OI_HCIERR_UNIT_KEY_PAIRING_UNSUPPORTED = 741, /**< HCI: protocol error 0x29 */
+ OI_HCIERR_DIFFERENT_TRANS_COLLISION = 742, /**< HCI: protocol error 0x2A */
+ OI_HCIERR_RESERVED_2B = 743, /**< HCI: protocol error 0x2B */
+ OI_HCIERR_QOS_UNACCEPTABLE_PARAMETER = 744, /**< HCI: protocol error 0x2C */
+ OI_HCIERR_QOS_REJECTED = 745, /**< HCI: protocol error 0x2D */
+ OI_HCIERR_CHANNEL_CLASSIFICATION_NS = 746, /**< HCI: protocol error 0x2E */
+ OI_HCIERR_INSUFFICIENT_SECURITY = 747, /**< HCI: protocol error 0x2F */
+ OI_HCIERR_PARM_OUT_OF_MANDATORY_RANGE = 748, /**< HCI: protocol error 0x30 */
+ OI_HCIERR_RESERVED_31 = 749, /**< HCI: protocol error 0x31 */
+ OI_HCIERR_ROLE_SWITCH_PENDING = 750, /**< HCI: protocol error 0x32 */
+ OI_HCIERR_RESERVED_33 = 751, /**< HCI: protocol error 0x33 */
+ OI_HCIERR_RESERVED_SLOT_VIOLATION = 752, /**< HCI: protocol error 0x34 */
+ OI_HCIERR_ROLE_SWITCH_FAILED = 753, /**< HCI: protocol error 0x35 */
+ OI_HCIERR_EIR_TOO_LARGE = 754, /**< HCI: protocol error 0x36 */
+ OI_HCIERR_SSP_NOT_SUPPORTED_BY_HOST = 755, /**< HCI: protocol error 0x37 */
+ OI_HCIERR_HOST_BUSY_PAIRING = 756, /**< HCI: protocol error 0x38 */
+
+ OI_HCIERR_UNKNOWN_ERROR = 757, /**< HCI: unknown error code */
+ OI_HCIERR_LAST_ERROR_VALUE = 757, /**< marker for last HCI protocol error */
+
+ OI_SDP_SPEC_ERROR = 800, /**< SDP: Base error status for mapping OI_STATUS codes to SDP errors */
+ OI_SDP_INVALID_SERVICE_RECORD_HANDLE = (OI_SDP_SPEC_ERROR + 2), /**< SDP: protocol error Invalid Service Record Handle */
+ OI_SDP_INVALID_REQUEST_SYNTAX = (OI_SDP_SPEC_ERROR + 3), /**< SDP: protocol error Invalid Request Syntax */
+ OI_SDP_INVALID_PDU_SIZE = (OI_SDP_SPEC_ERROR + 4), /**< SDP: protocol error Invalid PDU Size */
+ OI_SDP_INVALID_CONTINUATION_STATE = (OI_SDP_SPEC_ERROR + 5), /**< SDP: protocol error Invalid Continuation State */
+ OI_SDP_INSUFFICIENT_RESOURCES = (OI_SDP_SPEC_ERROR + 6), /**< SDP: protocol error Insufficient Resources */
+ OI_SDP_ERROR = 807, /**< SDP: server returned an error code */
+ OI_SDP_CORRUPT_DATA_ELEMENT = 808, /**< SDP: Invalid or corrupt data element representation */
+ OI_SDP_SERVER_NOT_CONNECTED = 810, /**< SDP: Attempt to disconnect from an unconnected server */
+ OI_SDP_ACCESS_DENIED = 811, /**< SDP: Server denied access to server */
+ OI_SDP_ATTRIBUTES_OUT_OF_ORDER = 812, /**< SDP: Attributes in attribute list not in ascending order */
+ OI_SDP_DEVICE_DOES_NOT_SUPPORT_SDP = 813, /**< SDP: Tried to connect to a device that does not support SDP */
+ OI_SDP_NO_MORE_DATA = 815, /**< SDP: Server does not have more continuation data */
+ OI_SDP_REQUEST_PARAMS_TOO_LONG = 816, /**< SDP: Parameters for a request exceed the L2CAP buffer size */
+ OI_SDP_REQUEST_PENDING = 817, /**< SDP: Cannot make a request when another request is being processed */
+ OI_SDP_SERVER_CONNECT_FAILED = 819, /**< SDP: Failed attempt to connect to an SDP server */
+ OI_SDP_SERVER_TOO_MANY_CONNECTIONS = 821, /**< SDP: Exceeded maximum number of simultaneous server connections */
+ OI_SDP_NO_MATCHING_SERVICE_RECORD = 823, /**< SDP: No service record matched the UUID list */
+ OI_SDP_PARTIAL_RESPONSE = 824, /**< SDP: Internal use only */
+ OI_SDP_ILLEGAL_ARGUMENT = 825, /**< SDP: Illegal argument passed to an SDP function */
+ OI_SDP_ATTRIBUTE_NOT_FOUND = 826, /**< SDP: A requested attribute was not found in a service record */
+ OI_SDP_DATABASE_OUT_OF_RESOURCES = 827, /**< SDP: server database is out of memory */
+ OI_SDP_SHORT_PDU = 829, /**< SDP: Not enough bytes in the packet */
+ OI_SDP_TRANSACTION_ID_MISMATCH = 830, /**< SDP: Transaction Id was not as expected */
+ OI_SDP_UNEXPECTED_RESPONSE_PDU_ID = 831, /**< SDP: Did not expect this response PDU */
+ OI_SDP_REQUEST_TIMEOUT = 832, /**< SDP: Did not get a response within the timeout period */
+ OI_SDP_INVALID_RESPONSE_SYNTAX = 833, /**< SDP: Response is not correctly formatted */
+ OI_SDP_CONNECTION_TIMEOUT = 834, /**< SDP: Connection attempt timed out at a lower layer */
+ OI_SDP_RESPONSE_DATA_ERROR = 835, /**< SDP: Response to a service request appears to be corrupt */
+ OI_SDP_TOO_MANY_ATTRIBUTE_BYTES = 836, /**< SDP: Response contained more bytes than requested. */
+ OI_SDP_TOO_MANY_SERVICE_RECORDS = 837, /**< SDP: Response contained more service records than requested. */
+ OI_SDP_INVALID_CONNECTION_ID = 838, /**< SDP: Invalid connection ID in an SDP request */
+ OI_SDP_CANNOT_SET_ATTRIBUTE = 839, /**< SDP: Attempt to set a dynamic attribute value failed */
+ OI_SDP_BADLY_FORMED_ATTRIBUTE_VALUE = 840, /**< SDP: An attribute value has the wrong type or structure */
+ OI_SDP_NO_ATTRIBUTE_LIST_TO_REMOVE = 841, /**< SDP: Attempt to remove a non-existent attribute list from a service record */
+ OI_SDP_ATTRIBUTE_LIST_ALREADY_ADDED = 842, /**< SDP: An attribute list has already been added to the service record */
+ OI_SDP_DATA_ELEMENT_TRUNCATED = 843, /**< SDP: Data element truncated (too few bytes) */
+
+ OI_RFCOMM_WRITE_IN_PROGRESS = 901, /**< RFCOMM: Write in progress */
+ OI_RFCOMM_INVALID_BAUDRATE = 903, /**< RFCOMM: Invalid baudrate */
+ OI_RFCOMM_INVALID_DATABIT = 904, /**< RFCOMM: Invalid databit */
+ OI_RFCOMM_INVALID_STOPBIT = 905, /**< RFCOMM: Invalid stopbit */
+ OI_RFCOMM_INVALID_PARITY = 906, /**< RFCOMM: Invalid parity */
+ OI_RFCOMM_INVALID_PARITYTYPE = 907, /**< RFCOMM: Invalid paritytype */
+ OI_RFCOMM_INVALID_FLOWCONTROL = 908, /**< RFCOMM: Invalid flowcontrol */
+ OI_RFCOMM_SESSION_EXISTS = 909, /**< RFCOMM: Session exists */
+ OI_RFCOMM_INVALID_CHANNEL = 910, /**< RFCOMM: Invalid channel */
+ OI_RFCOMM_DLCI_EXISTS = 911, /**< RFCOMM: DLCI exists */
+ OI_RFCOMM_LINK_NOT_FOUND = 912, /**< RFCOMM: Link not found */
+ OI_RFCOMM_REMOTE_REJECT = 913, /**< RFCOMM: Remote reject */
+ OI_RFCOMM_TEST_IN_PROGRESS = 915, /**< RFCOMM: Test in progress */
+ OI_RFCOMM_SESSION_NOT_FOUND = 916, /**< RFCOMM: Session not found */
+ OI_RFCOMM_INVALID_PACKET = 917, /**< RFCOMM: Invalid packet */
+ OI_RFCOMM_FRAMESIZE_EXCEEDED = 918, /**< RFCOMM: Framesize exceeded */
+ OI_RFCOMM_INVALID_DLCI = 920, /**< RFCOMM: Invalid dlci */
+ OI_RFCOMM_SERVER_NOT_REGISTERED = 921, /**< RFCOMM: Server not registered */
+ OI_RFCOMM_CREDIT_ERROR = 922, /**< RFCOMM: Credit error */
+ OI_RFCOMM_NO_CHANNEL_NUMBER = 923, /**< RFCOMM: No channel number */
+ OI_RFCOMM_QUERY_IN_PROGRESS = 924, /**< RFCOMM: Query in progress */
+ OI_RFCOMM_SESSION_SHUTDOWN = 925, /**< RFCOMM: Session shutdown */
+ OI_RFCOMM_LOCAL_DEVICE_DISCONNECTED = 926, /**< RFCOMM: Local device disconnected */
+ OI_RFCOMM_REMOTE_DEVICE_DISCONNECTED = 927, /**< RFCOMM: Remote device disconnected */
+ OI_RFCOMM_OUT_OF_SERVER_CHANNELS = 928, /**< RFCOMM: Out of server channels */
+
+ OI_DISPATCH_INVALID_CB_HANDLE = 1001, /**< Dispatcher was handed an invalid callback handle */
+ OI_DISPATCH_TABLE_OVERFLOW = 1002, /**< Dispatcher table is full */
+
+ OI_TEST_UNKNOWN_TEST = 1101, /**< TEST: Unknown test */
+ OI_TEST_FAIL = 1102, /**< TEST: Fail */
+
+ OI_HCITRANS_CANNOT_CONNECT_TO_DEVICE = 1201, /**< TRANSPORT: Cannot connect to device */
+ OI_HCITRANS_BUFFER_TOO_SMALL = 1203, /**< TRANSPORT: Buffer too small */
+ OI_HCITRANS_NULL_DEVICE_HANDLE = 1204, /**< TRANSPORT: Null device handle */
+ OI_HCITRANS_IO_ERROR = 1205, /**< TRANSPORT: IO error */
+ OI_HCITRANS_DEVICE_NOT_READY = 1206, /**< TRANSPORT: Device not ready */
+ OI_HCITRANS_FUNCTION_NOT_SUPPORTED = 1207, /**< TRANSPORT: Function not supporteD */
+ OI_HCITRANS_ACCESS_DENIED = 1209, /**< TRANSPORT: win32 */
+ OI_HCITRANS_ACL_DATA_ERROR = 1210, /**< TRANSPORT: ACL data error */
+ OI_HCITRANS_SCO_DATA_ERROR = 1211, /**< TRANSPORT: SCO data error */
+ OI_HCITRANS_EVENT_DATA_ERROR = 1212, /**< TRANSPORT: HCI event data error */
+ OI_HCITRANS_INTERNAL_ERROR = 1214, /**< TRANSPORT: Internal error in the transport */
+ OI_HCITRANS_LINK_NOT_ACTIVE = 1215, /**< TRANSPORT: Link to the device is not currently active */
+ OI_HCITRANS_INITIALIZING = 1216, /**< TRANSPORT: Transport is initializing */
+
+ OI_DEVMGR_NO_CONNECTION = 1301, /**< DEVMGR: No connection */
+ OI_DEVMGR_HARDWARE_ERROR = 1305, /**< DEVMGR: error reported by HCI */
+ OI_DEVMGR_PENDING_CONNECT_LIST_FULL = 1307, /**< DEVMGR: Pending connect list full */
+ OI_DEVMGR_CONNECTION_LIST_FULL = 1309, /**< DEVMGR: Connection list full */
+ OI_DEVMGR_NO_SUCH_CONNECTION = 1310, /**< DEVMGR: No such connection */
+ OI_DEVMGR_INQUIRY_IN_PROGRESS = 1311, /**< DEVMGR: Inquiry in progress */
+ OI_DEVMGR_PERIODIC_INQUIRY_ACTIVE = 1312, /**< DEVMGR: Periodic inquiry active */
+ OI_DEVMGR_NO_INQUIRIES_ACTIVE = 1313, /**< DEVMGR: can not cancel/exit if not active */
+ OI_DEVMGR_DUPLICATE_CONNECTION = 1314, /**< DEVMGR: internal error */
+ OI_DEVMGR_DUPLICATE_EVENT_CALLBACK = 1316, /**< DEVMGR: attempt to register same callback twice */
+ OI_DEVMGR_EVENT_CALLBACK_LIST_FULL = 1317, /**< DEVMGR: can not register event callback, list is full */
+ OI_DEVMGR_EVENT_CALLBACK_NOT_FOUND = 1318, /**< DEVMGR: attempt to unregister callback failed */
+ OI_DEVMGR_BUSY = 1319, /**< DEVMGR: some operations can only execute one at a time */
+ OI_DEVMGR_ENUM_UNEXPECTED_INQ_COMPLETE = 1320, /**< DEVMGR: inquiry complete event in inappropriate enumeration state */
+ OI_DEVMGR_ENUM_UNEXPECTED_INQ_RESULT = 1321, /**< DEVMGR: inquiry result event in inappropriate enumeration state */
+ OI_DEVMGR_ENUM_DATABASE_FULL = 1322, /**< DEVMGR: device enumeration, database is full, couldn't add a new device */
+ OI_DEVMGR_ENUM_INQUIRIES_OVERLAP = 1323, /**< DEVMGR: device enumeration, periodic inquiries occurring too close together */
+ OI_DEVMGR_UNKNOWN_LINK_TYPE = 1324, /**< DEVMGR: HCI connect request with unkown link type */
+ OI_DEVMGR_PARAM_IO_ACTIVE = 1325, /**< DEVMGR: request for parameter read/write while param read/write active */
+ OI_DEVMGR_UNKNOWN_IAC_LAP = 1326, /**< DEVMGR: unrecognized IAC LAP */
+ OI_DEVMGR_SCO_ALREADY_REGISTERED = 1327, /**< DEVMGR: only one application can use SCO */
+ OI_DEVMGR_SCO_NOT_REGISTERED = 1328, /**< DEVMGR: SCO applications must register before using the API */
+ OI_DEVMGR_SCO_WITHOUT_ACL = 1329, /**< DEVMGR: Got SCO connection but there is no underlying ACL connection */
+ OI_DEVMGR_NO_SUPPORT = 1330, /**< DEVMGR: Request is not supported by the device */
+ OI_DEVMGR_WRITE_POLICY_FAILED = 1331, /**< DEVMGR: connection attempt failed - unable to write link policy */
+ OI_DEVMGR_NOT_IN_MASTER_MODE = 1332, /**< DEVMGR: OI_DEVMGR EndMasterMode without prior OI_DEVMGR_BeginMasterMode */
+ OI_DEVMGR_POLICY_VIOLATION = 1333, /**< DEVMGR: low-power request is rejected - link policy does not allow it */
+ OI_DEVMGR_BUSY_TIMEOUT = 1334, /**< DEVMGR: queued operation timed out while in the queue; \n
+ timeout configurable via @ref OI_CONFIG_DEVMGR::connectQueueTimeoutSecs "connectQueueTimeoutSecs" */
+ OI_DEVMGR_REENCRYPT_FAILED = 1335, /**< DEVMGR: failed to re-encrypt link after role switch */
+ OI_DEVMGR_ROLE_POLICY_CONFLICT = 1336, /**< DEVMGR: requested role conflicts with current policy */
+ OI_DEVMGR_BAD_INTERVAL = 1337, /**< DEVMGR: current linkTO outside range of requested min/max interval */
+ OI_DEVMGR_INVALID_SCO_HANDLE = 1338, /**< DEVMGR: HCI SCO event, invalid handle */
+ OI_DEVMGR_CONNECTION_OVERLAP = 1339, /**< DEVMGR: Connection failed due to race condition with remote side */
+ OI_DEVMGR_ORPHAN_SUBRATE_COMPLETE = 1340, /**< DEVMGR: sniff subrate complete, but no callback */
+ OI_DEVMGR_EIR_RESPONSE_2_LARGE = 1341, /**< DEVMGR: eir builder, response length would exceed spec max */
+
+ OI_SECMGR_NO_POLICY = 1401, /**< SECMGR: no security policy has been established */
+ OI_SECMGR_INTERNAL_ERROR = 1402, /**< SECMGR: internal inconsistency */
+ OI_SECMGR_ORPHANED_CALLBACK = 1403, /**< SECMGR: we've been called back, but CB context is gone */
+ OI_SECMGR_BUSY = 1404, /**< SECMGR: configure and access request cannot be concurrent */
+ OI_SECMGR_DEVICE_NOT_TRUSTED = 1405, /**< SECMGR: l2cap access denied - device is not trusted */
+ OI_SECMGR_DEVICE_ENCRYPT_FAIL = 1407, /**< SECMGR: l2cap access denied - failed to start encryption */
+ OI_SECMGR_DISCONNECTED_FAIL = 1408, /**< SECMGR: l2cap access denied - disconnected */
+ OI_SECMGR_ACCESS_PENDING = 1409, /**< SECMGR: l2cap access request is still pending */
+ OI_SECMGR_PIN_CODE_TOO_SHORT = 1410, /**< SECMGR: Higher-layer process gave us a pin code that is too short */
+ OI_SECMGR_UNKNOWN_ENCRYPT_VALUE = 1411, /**< SECMGR: got EncryptionChange event, unknown encryption enable value */
+ OI_SECMGR_INVALID_POLICY = 1412, /**< SECMGR: the specified security policy is not valid for security mode */
+ OI_SECMGR_AUTHORIZATION_FAILED = 1413, /**< SECMGR: device authorization failed */
+ OI_SECMGR_ENCRYPTION_FAILED = 1414, /**< SECMGR: device encryption failed */
+ OI_SECMGR_UNIT_KEY_UNSUPPORTED = 1415, /**< SECMGR: authentication failed due to non-support of unit keys */
+ OI_SECMGR_NOT_REGISTERED = 1416, /**< SECMGR: required registrations have not yet occurred */
+ OI_SECMGR_ILLEGAL_WRITE_SSP_MODE = 1417, /**< SECMGR: 2.1 HCI spec does not allow SSP mode to be disabled */
+ OI_SECMGR_INVALID_SEC_LEVEL = 1418, /**< SECMGR: security level for a service is not a valid value */
+ OI_SECMGR_INSUFFICIENT_LINK_KEY = 1419, /**< SECMGR: link key type is not sufficient to meet service requirements */
+ OI_SECMGR_INVALID_KEY_TYPE = 1420, /**< SECMGR: link key type is not a valid value */
+ OI_SECMGR_SSP_NOT_ENCRYPTED = 1421, /**< SECMGR: ssp required encryption on incoming link */
+ OI_SECMGR_ORPHAN_EVENT = 1422, /**< SECMGR: some HCI security event unrelated to current processes */
+ OI_SECMGR_NOT_BONDABLE = 1423, /**< SECMGR: not in bondable mode */
+
+ OI_TCS_INVALID_ELEMENT_TYPE = 1602, /**< TCS: element type is invalid */
+ OI_TCS_INVALID_PACKET = 1603, /**< TCS: packet is invalide */
+ OI_TCS_CALL_IN_PROGRESS = 1604, /**< TCS: call is in progress */
+ OI_TCS_NO_CALL_IN_PROGRESS = 1605, /**< TCS: no call in progress */
+
+ OI_OBEX_CONTINUE = 1701, /**< OBEX: Continue processing OBEX request */
+ OI_OBEX_COMMAND_ERROR = 1702, /**< OBEX: An unrecognized OBEX command opcode */
+ OI_OBEX_CONNECTION_TIMEOUT = 1703, /**< OBEX: Timeout waiting for a response to a request */
+ OI_OBEX_CONNECT_FAILED = 1704, /**< OBEX: An OBEX connection request did not succeed */
+ OI_OBEX_DISCONNECT_FAILED = 1705, /**< OBEX: A disconnect failed probably because the connection did not exist */
+ OI_OBEX_ERROR = 1706, /**< OBEX: Unspecified OBEX error */
+ OI_OBEX_INCOMPLETE_PACKET = 1707, /**< OBEX: Packet too short or corrupt */
+ OI_OBEX_LENGTH_REQUIRED = 1708, /**< OBEX: Length header required in OBEX command */
+ OI_OBEX_NOT_CONNECTED = 1709, /**< OBEX: No connection to OBEX server */
+ OI_OBEX_NO_MORE_CONNECTIONS = 1710, /**< OBEX: Reached max connections limit */
+ OI_OBEX_OPERATION_IN_PROGRESS = 1711, /**< OBEX: Another operation is still in progress on a connection */
+ OI_OBEX_PUT_RESPONSE_ERROR = 1712, /**< OBEX: An error in the response to a PUT command */
+ OI_OBEX_GET_RESPONSE_ERROR = 1713, /**< OBEX: An error in the response to a GET command */
+ OI_OBEX_REQUIRED_HEADER_NOT_FOUND = 1714, /**< OBEX: packet was missing a required header */
+ OI_OBEX_SERVICE_UNAVAILABLE = 1715, /**< OBEX: Unown OBEX target or required service */
+ OI_OBEX_TOO_MANY_HEADER_BYTES = 1716, /**< OBEX: Headers will not fit in single OBEX packet */
+ OI_OBEX_UNKNOWN_COMMAND = 1717, /**< OBEX: Unrecognized OBEX command */
+ OI_OBEX_UNSUPPORTED_VERSION = 1718, /**< OBEX: Version mismatch */
+ OI_OBEX_CLIENT_ABORTED_COMMAND = 1719, /**< OBEX: server received abort command */
+ OI_OBEX_BAD_PACKET = 1720, /**< OBEX: Any malformed OBEX packet */
+ OI_OBEX_BAD_REQUEST = 1721, /**< OBEX: Maps to OBEX response of the same name */
+ OI_OBEX_OBJECT_OVERFLOW = 1723, /**< OBEX: Too many bytes received. */
+ OI_OBEX_NOT_FOUND = 1724, /**< OBEX: Maps to obex response of same name */
+ OI_OBEX_ACCESS_DENIED = 1735, /**< OBEX: Object could not be read or written. */
+ OI_OBEX_VALUE_NOT_ACCEPTABLE = 1736, /**< OBEX: Value in a command was not in the acceptable range. */
+ OI_OBEX_PACKET_OVERFLOW = 1737, /**< OBEX: Buffer will not fit in a single OBEX packet. */
+ OI_OBEX_NO_SUCH_FOLDER = 1738, /**< OBEX: Error returned by a setpath operation. */
+ OI_OBEX_NAME_REQUIRED = 1739, /**< OBEX: Name must be non-null and non-empty. */
+ OI_OBEX_PASSWORD_TOO_LONG = 1740, /**< OBEX: Password exceeds implementation imposed length limit. */
+ OI_OBEX_PRECONDITION_FAILED = 1741, /**< OBEX: response Precondition Failed */
+ OI_OBEX_UNAUTHORIZED = 1742, /**< OBEX: authentication was not successful. */
+ OI_OBEX_NOT_IMPLEMENTED = 1743, /**< OBEX: Unimplemented feature. */
+ OI_OBEX_INVALID_AUTH_DIGEST = 1744, /**< OBEX: An authentication digest was bad. */
+ OI_OBEX_INVALID_OPERATION = 1745, /**< OBEX: Operation not allowed at this time. */
+ OI_OBEX_DATABASE_FULL = 1746, /**< OBEX: Sync database full. */
+ OI_OBEX_DATABASE_LOCKED = 1747, /**< OBEX: Sync database locked. */
+ OI_OBEX_INTERNAL_SERVER_ERROR = 1748, /**< OBEX: response Internal Server Error */
+ OI_OBEX_UNSUPPORTED_MEDIA_TYPE = 1749, /**< OBEX: response Unsupported Media Type */
+ OI_OBEX_PARTIAL_CONTENT = 1750, /**< OBEX: response Partial Content */
+ OI_OBEX_METHOD_NOT_ALLOWED = 1751, /**< OBEX: response Method Not Allowed */
+ OI_OBEXSRV_INCOMPLETE_GET = 1752, /**< OBEX: Indicates to a GET handler that the request phase is still in progress */
+ OI_OBEX_FOLDER_BROWSING_NOT_ALLOWED = 1753, /**< OBEX: Indicates that an FTP server does not allow folder browsing */
+ OI_OBEX_SERVER_FORCED_DISCONNECT = 1754, /**< OBEX: connection was forcibly terminated by the server */
+ OI_OBEX_OFS_ERROR = 1755, /**< OBEX: OPP object file system error occurred */
+ OI_OBEX_FILEOP_ERROR = 1756, /**< OBEX: FTP/PBAP file operation system error occurred */
+ OI_OBEX_USERID_TOO_LONG = 1757, /**< OBEX: User Id exceeds spec limited length limit. */
+
+ OI_HANDSFREE_EVENT_REPORTING_DISABLED = 1801, /**< HANDSFREE: Event reporting disabled */
+ OI_HANDSFREE_NOT_CONNECTED = 1802, /**< HANDSFREE: Not connected */
+ OI_HANDSFREE_SERVICE_NOT_STARTED = 1803, /**< HANDSFREE: Cannot connect to handsfree AG if handsfree service not started */
+ OI_HANDSFREE_AG_SERVICE_NOT_STARTED = 1804, /**< HANDSFREE: Cannot connect to handsfree device if handsfree AG service not started */
+ OI_HANDSFREE_COMMAND_IN_PROGRESS = 1805, /**< HANDSFREE: Cannot accept a command at this time */
+ OI_HANDSFREE_AUDIO_ALREADY_CONNECTED = 1806, /**< HANDSFREE: Audio is already connected */
+ OI_HANDSFREE_AUDIO_NOT_CONNECTED = 1807, /**< HANDSFREE: Audio is not connected */
+ OI_HANDSFREE_FEATURE_NOT_SUPPORTED = 1808, /**< HANDSFREE: Local or remote feature not supported for requested command */
+
+ OI_HEADSET_SERVICE_NOT_STARTED = 1901, /**< HEADSET: Cannot connect to headset AG if headset service not started */
+ OI_HEADSET_AG_SERVICE_NOT_STARTED = 1902, /**< HEADSET: Cannot connect to headset device if headset AG service not started */
+ OI_HEADSET_COMMAND_IN_PROGRESS = 1903, /**< HEADSET: Cannot accept a command at this time */
+
+ OI_BNEP_INVALID_MTU = 2001, /**< BNEP: The remote device cannot support the minimum BNEP MTU */
+ OI_BNEP_SETUP_TIMEOUT = 2002, /**< BNEP: The setup request timed out. */
+ OI_BNEP_SERVICE_NOT_REGISTERED = 2003, /**< BNEP: The requested service was not found. */
+ OI_BNEP_INVALID_HANDLE = 2004, /**< BNEP: The specified connection handle is not valid. */
+ OI_BNEP_RESPONSE_TIMEOUT = 2005, /**< BNEP: The timer for receiving a response has expired. */
+ OI_BNEP_INVALID_CONNECTION = 2006, /**< BNEP: Invalid connection */
+ OI_BNEP_INVALID_FILTER = 2007, /**< BNEP: The supplied filter was invalid. */
+ OI_BNEP_CONNECTION_EXISTS = 2008, /**< BNEP: An attempt was made to create a duplicate connection. */
+ OI_BNEP_NOT_INITIALIZED = 2009, /**< BNEP: Init has not been called */
+ OI_BNEP_CONNECT_BASE = 2010, /**< BNEP: connection response codes */
+ OI_BNEP_CONNECT_FAILED_INVALID_DEST_UUID = 2011, /**< BNEP: connect response code Invalid Dest UUID */
+ OI_BNEP_CONNECT_FAILED_INVALID_SOURCE_UUID = 2012, /**< BNEP: connect response code Invalid Source UUID */
+ OI_BNEP_CONNECT_FAILED_INVALID_UUID_SIZE = 2013, /**< BNEP: connect response code Invalid UUID Size */
+ OI_BNEP_CONNECT_FAILED_NOT_ALLOWED = 2014, /**< BNEP: connect response code Not Allowed */
+ OI_BNEP_FILTER_NET_BASE = 2020, /**< BNEP: filter response codes */
+ OI_BNEP_FILTER_NET_UNSUPPORTED_REQUEST = 2021, /**< BNEP: filter response code Unsupported Request */
+ OI_BNEP_FILTER_NET_FAILED_INVALID_PROTOCOL_TYPE = 2022, /**< BNEP: filter response code Invalid Protocol Type */
+ OI_BNEP_FILTER_NET_FAILED_MAX_LIMIT_REACHED = 2023, /**< BNEP: filter response code Max Limit Reached */
+ OI_BNEP_FILTER_NET_FAILED_SECURITY = 2024, /**< BNEP: filter response code Security */
+ OI_BNEP_FILTER_MULTI_BASE = 2030, /**< BNEP: multicast response codes */
+ OI_BNEP_FILTER_MULTI_UNSUPPORTED_REQUEST = 2031, /**< BNEP: multicast response code Unsupported Request */
+ OI_BNEP_FILTER_MULTI_FAILED_INVALID_ADDRESS = 2032, /**< BNEP: multicast response code Invalid Address */
+ OI_BNEP_FILTER_MULTI_FAILED_MAX_LIMIT_REACHED = 2033, /**< BNEP: multicast response code Max Limit Reached */
+ OI_BNEP_FILTER_MULTI_FAILED_SECURITY = 2034, /**< BNEP: multicast response code Security */
+ OI_BNEP_LOCAL_DEVICE_MUST_BE_MASTER = 2040, /**< BNEP: Device must be master of the piconet for this function */
+ OI_BNEP_PACKET_FILTERED_OUT = 2041, /**< BNEP: Packet did not pass current filters */
+
+ OI_NETIFC_UP_FAILED = 2101, /**< NETIFC: Could not bring up network interface */
+ OI_NETIFC_COULD_NOT_CREATE_THREAD = 2102, /**< NETIFC: Network interface could not create a read thread */
+ OI_NETIFC_INITIALIZATION_FAILED = 2103, /**< NETIFC: Error in network interface initialization */
+ OI_NETIFC_INTERFACE_ALREADY_UP = 2104, /**< NETIFC: Network interface is already up */
+ OI_NETIFC_INTERFACE_NOT_UP = 2105, /**< NETIFC: Network interface is not up */
+ OI_NETIFC_PACKET_TOO_BIG = 2106, /**< NETIFC: The packet is too big */
+
+ OI_PAN_ROLE_ALREADY_REGISTERED = 2201, /**< PAN: This PAN role was already registered */
+ OI_PAN_ROLE_NOT_ALLOWED = 2202, /**< PAN: The PAN role is not currently allowed */
+ OI_PAN_INCOMPATIBLE_ROLES = 2203, /**< PAN: Only certain local and remote role combinations are permitted */
+ OI_PAN_INVALID_ROLE = 2204, /**< PAN: Role specified is not one the defined PAN roles */
+ OI_PAN_CONNECTION_IN_PROGRESS = 2205, /**< PAN: A PAN connection is currently being established */
+ OI_PAN_USER_ALREADY_CONNECTED = 2206, /**< PAN: PAN user role only allows a single connection */
+ OI_PAN_DEVICE_CONNECTED = 2207, /**< PAN: A PAN connection already exists to specified device */
+
+ OI_CODEC_SBC_NO_SYNCWORD = 2301, /**< CODEC: Couldn't find an SBC SYNCWORD */
+ OI_CODEC_SBC_NOT_ENOUGH_HEADER_DATA = 2302, /**< CODEC: Not enough data provided to decode an SBC header */
+ OI_CODEC_SBC_NOT_ENOUGH_BODY_DATA = 2303, /**< CODEC: Decoded the header, but not enough data to contain the rest of the frame */
+ OI_CODEC_SBC_NOT_ENOUGH_AUDIO_DATA = 2304, /**< CODEC: Not enough audio data for this frame */
+ OI_CODEC_SBC_CHECKSUM_MISMATCH = 2305, /**< CODEC: The frame header didn't match the checksum */
+ OI_CODEC_SBC_PARTIAL_DECODE = 2306, /**< CODEC: Decoding was successful, but frame data still remains. Next call will provide audio without consuming input data. */
+
+ OI_FIFOQ_QUEUE_NOT_ALIGNED = 2401, /**< FIFOQ: queue must be 32-bit aligned */
+ OI_FIFOQ_INVALID_Q = 2402, /**< FIFOQ: queue parameter is not a valid queue */
+ OI_FIFOQ_BUF_TOO_LARGE = 2403, /**< FIFOQ: attempt to queue a buffer which is too large */
+ OI_FIFOQ_FULL = 2404, /**< FIFOQ: enqueue() failed, queue is full */
+ OI_FIFOQ_NOT_ALLOCATED = 2405, /**< FIFOQ: Enqueue QBuf() failed, buffer not allocated */
+ OI_FIFOQ_INVALID_DATA_PTR = 2406, /**< FIFOQ: Enqueue QBuf() failed, data pointer does not match */
+
+ OI_HID_HOST_SERVICE_NOT_STARTED = 2601, /**< HID: Cannot connect to a HID device unless HID host is started */
+ OI_HID_DEVICE_SERVICE_NOT_STARTED = 2602, /**< HID: Cannot connect to a HID host unless HID device is started */
+
+ OI_AT_ERROR = 2701, /**< AT: ERROR response */
+ OI_AT_NO_CARRIER = 2702, /**< AT: NO CARRIER response */
+ OI_AT_BUSY = 2703, /**< AT: BUSY response */
+ OI_AT_NO_ANSWER = 2704, /**< AT: NO ANSWER response */
+ OI_AT_DELAYED = 2705, /**< AT: DELAYED response */
+ OI_AT_BLACKLISTED = 2706, /**< AT: BLACKLISTED response */
+ OI_AT_CME_ERROR = 2707, /**< AT: +CME ERROR response */
+ OI_AT_CMS_ERROR = 2708, /**< AT: +CMS ERROR response */
+
+ OI_BLST_CHARACTER_TIMEOUT = 2801, /**< BLST: Timeout expired while waiting for a character from the client. */
+ OI_BLST_ACKNOWLDGE_TIMEOUT = 2802, /**< BLST: Timeout expired while waiting for event acknowledgment from the client */
+ OI_BLST_TX_NOT_READY = 2803, /**< BLST: BLST is not ready to send a BHAPI message to the client. */
+ OI_BLST_TX_BUSY = 2804, /**< BLST: BLST transmit buffer is in use. */
+
+ OI_AVDTP_CONNECTION_SEQ_ERROR = 2901, /**< AVDTP: sequencing of signalling/media channel connections broken. */
+ OI_AVDTP_OUT_OF_RESOURCES = 2902, /**< AVDTP: Tried to allocate too many endpoints or signalling channels. */
+
+ OI_PBAP_REPOSITORY_NOT_SET = 3001, /**< PBAP: Phonebook repository must be set for operation to complete. */
+ OI_PBAP_PHONEBOOK_NOT_SET = 3002, /**< PBAP: Phonebook be set for operation to complete. */
+
+ OI_AADP_BAD_ENDPOINT = 3101, /**< AADP: Invalid local endpoint specified */
+ OI_AADP_BAD_STATE = 3102, /**< AADP: AADP State is not correct for this operation. */
+
+ OI_UNICODE_INVALID_SOURCE = 3200, /**< Unicode Conversion: Source string has invalid character encoding. */
+ OI_UNICODE_SOURCE_EXHAUSTED = 3201, /**< Unicode Conversion: Incomplete Unicode character at end of source buffer. */
+ OI_UNICODE_DESTINATION_EXHAUSTED = 3202, /**< Unicode Conversion: Destination buffer not large enough to hold resulting Unicode string. */
+
+ OI_AVRCP_TOO_MANY_CONNECTIONS = 3300, /**< AVRCP: Exceeded maximum number of simultaneous AVCTP connections. */
+ OI_AVRCP_NOT_IMPLEMENTED = 3301, /**< AVRCP: The target does not implement the command specified by the opcode and operand. */
+ OI_AVRCP_REJECTED = 3302, /**< AVRCP: The target cannot respond because of invalid operands in command packet. */
+ OI_AVRCP_INVALID_RESPONSE = 3303, /**< AVRCP: The controller received the response with invalid parameters */
+ OI_AVRCP_RESPONSE_PACKET_OVERFLOW = 3304, /**< AVRCP: The response message does not fir in one AVRCP packet (512 bytes), has to be fragmented. */
+ OI_AVRCP_RESPONSE_INVALID_PDU = 3305, /**< AVRCP: Command rejected: target received a PDU that it did not understand. */
+ OI_AVRCP_RESPONSE_INVALID_PARAMETER = 3306, /**< AVRCP: Command rejected: target received a PDU with a parameter ID that it did not understand. */
+ OI_AVRCP_RESPONSE_PARAMETER_NOT_FOUND = 3307, /**< AVRCP: Command rejected: specified parameter not found, sent if the parameter ID is understood, but content is wrong or corrupted.*/
+ OI_AVRCP_RESPONSE_INTERNAL_ERROR = 3308, /**< AVRCP: Command rejected: target detected other error conditions. */
+ OI_MAX_BM3_STATUS_VAL, /* Maximum BM3 status code */
+
+ /* Status code values reserved for BM3 SDK platform-specific implementations */
+ OI_STATUS_RESERVED_FOR_BCOT = 9000,
+
+ /* Status code values reserved for BHAPI products */
+ OI_STATUS_RESERVED_FOR_BHAPI = 9200,
+
+ /* Status code values reserved for Soundabout products */
+ OI_STATUS_RESERVED_FOR_SOUNDABOUT= 9400,
+
+ /*
+ * Status code values greater than or equal to this value are reserved for use by applications.
+ * However, because of differences between compilers, and differences between 16-bit and 32-bit
+ * platforms custom status codes should be in the 16-bit range, so status codes can range from 0
+ * to 65534, inclusive (65535 is reserved)
+ */
+ OI_STATUS_RESERVED_FOR_APPS = 10000,
+
+
+
+ OI_STATUS_NONE = 0xffff /**< Special status code to indicate that there is no status. (Only to be used for special cases involving OI_SLOG_ERROR() and OI_SLOG_WARNING().) */
+
+} OI_STATUS;
+
+
+/* Remeber to update the #define below when new reserved blocks are added to
+ * the list above. */
+#define OI_NUM_RESERVED_STATUS_BLOCKS 4 /**< Number of status code blocks reserved, including user apps */
+
+
+/**
+ * Test for success
+ */
+#define OI_SUCCESS(x) ((x) == OI_OK)
+
+/*****************************************************************************/
+#ifdef __cplusplus
+}
+#endif
+
+/**@}*/
+
+#endif /* _OI_STATUS_H */
+
diff --git a/embdrv/sbc/decoder/include/oi_stddefs.h b/embdrv/sbc/decoder/include/oi_stddefs.h
new file mode 100644
index 0000000..ec8c453
--- /dev/null
+++ b/embdrv/sbc/decoder/include/oi_stddefs.h
@@ -0,0 +1,232 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2002 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+#ifndef OI_STDDEFS_H
+#define OI_STDDEFS_H
+/**
+ * @file
+ * This file contains BM3 standard type definitions.
+ *
+ */
+
+/**********************************************************************************
+ $Revision: #1 $
+***********************************************************************************/
+
+#include "oi_cpu_dep.h"
+
+/** \addtogroup Misc Miscellaneous APIs */
+/**@{*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef FALSE
+#define FALSE 0 /**< This define statement sets FALSE as a preprocessor alias for 0. */
+#endif
+
+#ifndef TRUE
+#define TRUE (!FALSE) /**< This define statement sets TRUE as a preprocessor alias for !FALSE. */
+#endif
+
+#ifdef HEW_TOOLCHAIN
+ #ifdef NULL
+ #undef NULL /**< Override HEW toolchain NULL definition */
+ #endif
+ #define NULL 0 /**< HEW toolchain does not allow us to compare (void*) type to function pointer */
+#else
+ #ifndef NULL
+ #define NULL ((void*)0) /**< This define statement sets NULL as a preprocessor alias for (void*)0 */
+ #endif
+#endif
+
+/**
+ * @name Maximum and minimum values for basic types
+ * @{
+ */
+#define OI_INT8_MIN ((OI_INT8)0x80) /**< decimal value: -128 */
+#define OI_INT8_MAX ((OI_INT8)0x7F) /**< decimal value: 127 */
+#define OI_INT16_MIN ((OI_INT16)0x8000) /**< decimal value: -32768 */
+#define OI_INT16_MAX ((OI_INT16)0x7FFF) /**< decimal value: 32767 */
+#define OI_INT32_MIN ((OI_INT32)0x80000000) /**< decimal value: -2,147,483,648 */
+#define OI_INT32_MAX ((OI_INT32)0x7FFFFFFF) /**< decimal value: 2,147,483,647 */
+#define OI_UINT8_MIN ((OI_UINT8)0) /**< decimal value: 0 */
+#define OI_UINT8_MAX ((OI_UINT8)0xFF) /**< decimal value: 255 */
+#define OI_UINT16_MIN ((OI_UINT16)0) /**< decimal value: 0 */
+#define OI_UINT16_MAX ((OI_UINT16)0xFFFF) /**< decimal value: 65535 */
+#define OI_UINT32_MIN ((OI_UINT32)0) /**< decimal value: 0 */
+#define OI_UINT32_MAX ((OI_UINT32)0xFFFFFFFF) /**< decimal value: 4,294,967,295 */
+
+/**
+ * @}
+ */
+
+/**
+ * @name Integer types required by the Service Discovery Protocol
+ * @{
+ */
+
+/** unsigned 64-bit integer as a structure of two unsigned 32-bit integers */
+typedef struct {
+ OI_UINT32 I1; /**< most significant 32 bits */
+ OI_UINT32 I2; /**< least significant 32 bits */
+} OI_UINT64;
+
+#define OI_UINT64_MIN { (OI_UINT32)0x00000000, (OI_UINT32)0x00000000 }
+#define OI_UINT64_MAX { (OI_UINT32)0XFFFFFFFF, (OI_UINT32)0XFFFFFFFF }
+
+/** signed 64-bit integer as a structure of one unsigned 32-bit integer and one signed 32-bit integer */
+typedef struct {
+ OI_INT32 I1; /**< most significant 32 bits as a signed integer */
+ OI_UINT32 I2; /**< least significant 32 bits as an unsigned integer */
+} OI_INT64;
+
+#define OI_INT64_MIN { (OI_INT32)0x80000000, (OI_UINT32)0x00000000 }
+#define OI_INT64_MAX { (OI_INT32)0X7FFFFFFF, (OI_UINT32)0XFFFFFFFF }
+
+/** unsigned 128-bit integer as a structure of four unsigned 32-bit integers */
+typedef struct {
+ OI_UINT32 I1; /**< most significant 32 bits */
+ OI_UINT32 I2; /**< second-most significant 32 bits */
+ OI_UINT32 I3; /**< third-most significant 32 bits */
+ OI_UINT32 I4; /**< least significant 32 bits */
+} OI_UINT128;
+
+#define OI_UINT128_MIN { (OI_UINT32)0x00000000, (OI_UINT32)0x00000000, (OI_UINT32)0x00000000, (OI_UINT32)0x00000000 }
+#define OI_UINT128_MAX { (OI_UINT32)0XFFFFFFFF, (OI_UINT32)0XFFFFFFFF, (OI_UINT32)0XFFFFFFFF, (OI_UINT32)0XFFFFFFFF }
+
+/** signed 128-bit integer as a structure of three unsigned 32-bit integers and one signed 32-bit integer */
+typedef struct {
+ OI_INT32 I1; /**< most significant 32 bits as a signed integer */
+ OI_UINT32 I2; /**< second-most significant 32 bits as an unsigned integer */
+ OI_UINT32 I3; /**< third-most significant 32 bits as an unsigned integer */
+ OI_UINT32 I4; /**< least significant 32 bits as an unsigned integer */
+} OI_INT128;
+
+#define OI_INT128_MIN { (OI_UINT32)0x80000000, (OI_UINT32)0x00000000, (OI_UINT32)0x00000000, (OI_UINT32)0x00000000 }
+#define OI_INT128_MAX { (OI_UINT32)0X7FFFFFFF, (OI_UINT32)0XFFFFFFFF, (OI_UINT32)0XFFFFFFFF, (OI_UINT32)0XFFFFFFFF }
+
+/**
+ * @}
+ */
+
+
+/**
+ * type for ASCII character data items
+ */
+typedef char OI_CHAR;
+
+/**
+ * type for double-byte character data items
+ */
+typedef OI_UINT16 OI_CHAR16;
+
+/**
+ * types for UTF encoded strings.
+ */
+typedef OI_UINT8 OI_UTF8;
+typedef OI_UINT16 OI_UTF16;
+typedef OI_UINT32 OI_UTF32;
+
+
+/**
+ * @name Single-bit operation macros
+ * @{
+ * In these macros, x is the data item for which a bit is to be tested or set and y specifies which bit
+ * is to be tested or set.
+ */
+
+/** This macro's value is TRUE if the bit specified by y is set in data item x. */
+#define OI_BIT_TEST(x,y) ((x) & (y))
+
+/** This macro's value is TRUE if the bit specified by y is not set in data item x. */
+#define OI_BIT_CLEAR_TEST(x,y) (((x) & (y)) == 0)
+
+/** This macro sets the bit specified by y in data item x. */
+#define OI_BIT_SET(x,y) ((x) |= (y))
+
+/** This macro clears the bit specified by y in data item x. */
+#define OI_BIT_CLEAR(x,y) ((x) &= ~(y))
+
+/** @} */
+
+/**
+ * The OI_ARRAYSIZE macro is set to the number of elements in an array
+ * (instead of the number of bytes, which is returned by sizeof()).
+ */
+
+#ifndef OI_ARRAYSIZE
+#define OI_ARRAYSIZE(a) (sizeof(a)/sizeof(a[0]))
+#endif
+
+/**
+ * @name Preprocessor aliases for individual bit positions
+ * Bits are defined here only if they are not already defined.
+ * @{
+ */
+
+#ifndef BIT0
+
+#define BIT0 0x00000001 /**< preprocessor alias for 32-bit value with bit 0 set, used to specify this single bit */
+#define BIT1 0x00000002 /**< preprocessor alias for 32-bit value with bit 1 set, used to specify this single bit */
+#define BIT2 0x00000004 /**< preprocessor alias for 32-bit value with bit 2 set, used to specify this single bit */
+#define BIT3 0x00000008 /**< preprocessor alias for 32-bit value with bit 3 set, used to specify this single bit */
+#define BIT4 0x00000010 /**< preprocessor alias for 32-bit value with bit 4 set, used to specify this single bit */
+#define BIT5 0x00000020 /**< preprocessor alias for 32-bit value with bit 5 set, used to specify this single bit */
+#define BIT6 0x00000040 /**< preprocessor alias for 32-bit value with bit 6 set, used to specify this single bit */
+#define BIT7 0x00000080 /**< preprocessor alias for 32-bit value with bit 7 set, used to specify this single bit */
+#define BIT8 0x00000100 /**< preprocessor alias for 32-bit value with bit 8 set, used to specify this single bit */
+#define BIT9 0x00000200 /**< preprocessor alias for 32-bit value with bit 9 set, used to specify this single bit */
+#define BIT10 0x00000400 /**< preprocessor alias for 32-bit value with bit 10 set, used to specify this single bit */
+#define BIT11 0x00000800 /**< preprocessor alias for 32-bit value with bit 11 set, used to specify this single bit */
+#define BIT12 0x00001000 /**< preprocessor alias for 32-bit value with bit 12 set, used to specify this single bit */
+#define BIT13 0x00002000 /**< preprocessor alias for 32-bit value with bit 13 set, used to specify this single bit */
+#define BIT14 0x00004000 /**< preprocessor alias for 32-bit value with bit 14 set, used to specify this single bit */
+#define BIT15 0x00008000 /**< preprocessor alias for 32-bit value with bit 15 set, used to specify this single bit */
+#define BIT16 0x00010000 /**< preprocessor alias for 32-bit value with bit 16 set, used to specify this single bit */
+#define BIT17 0x00020000 /**< preprocessor alias for 32-bit value with bit 17 set, used to specify this single bit */
+#define BIT18 0x00040000 /**< preprocessor alias for 32-bit value with bit 18 set, used to specify this single bit */
+#define BIT19 0x00080000 /**< preprocessor alias for 32-bit value with bit 19 set, used to specify this single bit */
+#define BIT20 0x00100000 /**< preprocessor alias for 32-bit value with bit 20 set, used to specify this single bit */
+#define BIT21 0x00200000 /**< preprocessor alias for 32-bit value with bit 21 set, used to specify this single bit */
+#define BIT22 0x00400000 /**< preprocessor alias for 32-bit value with bit 22 set, used to specify this single bit */
+#define BIT23 0x00800000 /**< preprocessor alias for 32-bit value with bit 23 set, used to specify this single bit */
+#define BIT24 0x01000000 /**< preprocessor alias for 32-bit value with bit 24 set, used to specify this single bit */
+#define BIT25 0x02000000 /**< preprocessor alias for 32-bit value with bit 25 set, used to specify this single bit */
+#define BIT26 0x04000000 /**< preprocessor alias for 32-bit value with bit 26 set, used to specify this single bit */
+#define BIT27 0x08000000 /**< preprocessor alias for 32-bit value with bit 27 set, used to specify this single bit */
+#define BIT28 0x10000000 /**< preprocessor alias for 32-bit value with bit 28 set, used to specify this single bit */
+#define BIT29 0x20000000 /**< preprocessor alias for 32-bit value with bit 29 set, used to specify this single bit */
+#define BIT30 0x40000000 /**< preprocessor alias for 32-bit value with bit 30 set, used to specify this single bit */
+#define BIT31 0x80000000 /**< preprocessor alias for 32-bit value with bit 31 set, used to specify this single bit */
+
+#endif /* BIT0 et al */
+
+
+/** @} */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/**@}*/
+
+/*****************************************************************************/
+#endif /* OI_STDDEFS_H */
diff --git a/embdrv/sbc/decoder/include/oi_string.h b/embdrv/sbc/decoder/include/oi_string.h
new file mode 100644
index 0000000..1b12b5a
--- /dev/null
+++ b/embdrv/sbc/decoder/include/oi_string.h
@@ -0,0 +1,208 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2002 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+#ifndef OI_STRING_H
+#define OI_STRING_H
+/**
+ * @file
+ * This file contains BM3 supplied portable string.h functions
+ *
+ */
+
+/**********************************************************************************
+ $Revision: #1 $
+***********************************************************************************/
+
+#include "oi_cpu_dep.h"
+#include "oi_stddefs.h"
+
+#if defined(USE_NATIVE_MEMCPY) || defined(USE_NATIVE_MALLOC)
+#include <string.h>
+#endif
+
+/** \addtogroup Misc Miscellaneous APIs */
+/**@{*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*
+ * If we are using Native malloc(), we must also use
+ * native Ansi string.h functions for memory manipulation.
+ */
+#ifdef USE_NATIVE_MALLOC
+#ifndef USE_NATIVE_MEMCPY
+#define USE_NATIVE_MEMCPY
+#endif
+#endif
+
+#ifdef USE_NATIVE_MEMCPY
+
+#define OI_MemCopy(to, from, size) memcpy((to), (from), (size))
+#define OI_MemSet(block, val, size) memset((block), (val), (size))
+#define OI_MemZero(block, size) memset((block), 0, (size))
+#define OI_MemCmp(s1, s2, n) memcmp((s1), (s2), (n))
+#define OI_Strcpy(dest, src) strcpy((dest),(src))
+#define OI_Strcat(dest, src) strcat((dest),(src))
+#define OI_StrLen(str) strlen((str))
+#define OI_Strcmp(s1, s2) strcmp((s1), (s2))
+#define OI_Strncmp(s1, s2, n) strncmp((s1), (s2), (n))
+
+#else
+
+/*
+ * OI_MemCopy
+ *
+ * Copy an arbitrary number of bytes from one memory address to another.
+ * The underlying implementation is the ANSI memmove() or equivalant, so
+ * overlapping memory copies will work correctly.
+ */
+void OI_MemCopy(void *To, void const *From, OI_UINT32 Size);
+
+
+/*
+ * OI_MemSet
+ *
+ * Sets all bytes in a block of memory to the same value
+ */
+void OI_MemSet(void *Block, OI_UINT8 Val, OI_UINT32 Size);
+
+
+/*
+ * OI_MemZero
+ *
+ * Sets all bytes in a block of memory to zero
+ */
+void OI_MemZero(void *Block, OI_UINT32 Size);
+
+
+/*
+ * OI_MemCmp
+ *
+ * Compare two blocks of memory
+ *
+ * Returns:
+ * 0, if s1 == s2
+ * < 0, if s1 < s2
+ * > 0, if s2 > s2
+ */
+OI_INT OI_MemCmp(void const *s1, void const *s2, OI_UINT32 n);
+
+/*
+ * OI_Strcpy
+ *
+ * Copies the Null terminated string from pStr to pDest, and
+ * returns pDest.
+ */
+
+OI_CHAR* OI_Strcpy(OI_CHAR *pDest,
+ OI_CHAR const *pStr);
+
+/*
+ * OI_Strcat
+ *
+ * Concatonates the pStr string to the end of pDest, and
+ * returns pDest.
+ */
+
+OI_CHAR* OI_Strcat(OI_CHAR *pDest,
+ OI_CHAR const *pStr) ;
+
+/*
+ * OI_StrLen
+ *
+ * Calculates the number of OI_CHARs in pStr (not including
+ * the Null terminator) and returns the value.
+ */
+OI_UINT OI_StrLen(OI_CHAR const *pStr) ;
+
+/*
+ * OI_Strcmp
+ *
+ * Compares two Null terminated strings
+ *
+ * Returns:
+ * 0, if s1 == s2
+ * < 0, if s1 < s2
+ * > 0, if s2 > s2
+ */
+OI_INT OI_Strcmp(OI_CHAR const *s1,
+ OI_CHAR const *s2);
+
+/*
+ * OI_Strncmp
+ *
+ * Compares the first "len" OI_CHARs of strings s1 and s2.
+ *
+ * Returns:
+ * 0, if s1 == s2
+ * < 0, if s1 < s2
+ * > 0, if s2 > s2
+ */
+OI_INT OI_Strncmp(OI_CHAR const *s1,
+ OI_CHAR const *s2,
+ OI_UINT32 len);
+
+
+#endif /* USE_NATIVE_MEMCPY */
+
+/*
+ * OI_StrcmpInsensitive
+ *
+ * Compares two Null terminated strings, treating
+ * the Upper and Lower case of 'A' through 'Z' as
+ * equivilent.
+ *
+ * Returns:
+ * 0, if s1 == s2
+ * < 0, if s1 < s2
+ * > 0, if s2 > s2
+ */
+OI_INT OI_StrcmpInsensitive(OI_CHAR const *s1,
+ OI_CHAR const *s2);
+
+/*
+ * OI_StrncmpInsensitive
+ *
+ * Compares the first "len" OI_CHARs of strings s1 and s2,
+ * treating the Upper and Lower case of 'A' through 'Z' as
+ * equivilent.
+ *
+ *
+ * Returns:
+ * 0, if s1 == s2
+ * < 0, if s1 < s2
+ * > 0, if s2 > s2
+ */
+OI_INT OI_StrncmpInsensitive(OI_CHAR const *s1,
+ OI_CHAR const *s2,
+ OI_UINT len);
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/** @} */
+
+/*****************************************************************************/
+#endif /* OI_STRING_H */
+
diff --git a/embdrv/sbc/decoder/include/oi_time.h b/embdrv/sbc/decoder/include/oi_time.h
new file mode 100644
index 0000000..40b8dfc
--- /dev/null
+++ b/embdrv/sbc/decoder/include/oi_time.h
@@ -0,0 +1,200 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2002 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+#ifndef _OI_TIME_H
+#define _OI_TIME_H
+/** @file
+ *
+ * This file provides time type definitions and interfaces to time-related functions.
+ *
+ * The stack maintains a 64-bit real-time millisecond clock. The choice of
+ * milliseconds is for convenience, not accuracy.
+ *
+ * Timeouts are specified as tenths of seconds in a 32-bit value. Timeout values
+ * specified by the Bluetooth specification are usually muliple seconds, so
+ * accuracy to a tenth of a second is more than adequate.
+ *
+ * This file also contains macros to convert between seconds and the Link
+ * Manager's 1.28-second units.
+ *
+ */
+
+/**********************************************************************************
+ $Revision: #1 $
+***********************************************************************************/
+
+#include "oi_stddefs.h"
+
+
+/** \addtogroup Misc Miscellaneous APIs */
+/**@{*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+
+/**
+ * Within the core stack timeouts are specified in intervals of tenths of seconds
+ */
+
+typedef OI_UINT16 OI_INTERVAL;
+#define OI_INTERVALS_PER_SECOND 10
+#define MSECS_PER_OI_INTERVAL (1000 / OI_INTERVALS_PER_SECOND)
+
+/** maximum interval (54 min 36.7 sec) */
+#define OI_MAX_INTERVAL 0x7fff
+
+
+/**
+ * Macro to convert seconds to OI_INTERVAL time units
+ */
+
+#define OI_SECONDS(n) ((OI_INTERVAL) ((n) * OI_INTERVALS_PER_SECOND))
+
+/**
+ * Macro to convert milliseconds to OI_INTERVAL time units (Rounded Up)
+ */
+
+#define OI_MSECONDS(n) ((OI_INTERVAL) ((n + MSECS_PER_OI_INTERVAL - 1) / MSECS_PER_OI_INTERVAL))
+
+/**
+ * Macro to convert minutes to OI_INTERVAL time units
+ */
+
+#define OI_MINUTES(n) ((OI_INTERVAL) ((n) * OI_SECONDS(60)))
+
+/** Convert an OI_INTERVAL to milliseconds. */
+#define OI_INTERVAL_TO_MILLISECONDS(i) ((i) * MSECS_PER_OI_INTERVAL)
+
+/**
+ * The stack depends on relative not absolute time. Any mapping between the
+ * stack's real-time clock and absolute time and date is implementation-dependent.
+ */
+
+typedef struct {
+ OI_INT32 seconds;
+ OI_INT16 mseconds;
+} OI_TIME;
+
+/**
+ * Convert an OI_TIME to milliseconds.
+ *
+ * @param t the time to convert
+ *
+ * @return the time in milliseconds
+ */
+OI_UINT32 OI_Time_ToMS(OI_TIME *t);
+
+
+/**
+ * This function compares two time values.
+ *
+ * @param T1 first time to compare.
+ *
+ * @param T2 second time to compare.
+ *
+ * @return
+ @verbatim
+ -1 if t1 < t2
+ 0 if t1 = t2
+ +1 if t1 > t2
+ @endverbatim
+ */
+
+OI_INT16 OI_Time_Compare(OI_TIME *T1,
+ OI_TIME *T2);
+
+
+/**
+ * This function returns the interval between two times to a granularity of 0.1 seconds.
+ *
+ * @param Sooner a time value more recent that Later
+ *
+ * @param Later a time value later than Sooner
+ *
+ * @note The result is an OI_INTERVAL value so this function only works for time intervals
+ * that are less than about 71 minutes.
+ *
+ * @return the time interval between the two times = (Later - Sooner)
+ */
+
+OI_INTERVAL OI_Time_Interval(OI_TIME *Sooner,
+ OI_TIME *Later);
+
+
+
+/**
+ * This function returns the interval between two times to a granularity of milliseconds.
+ *
+ * @param Sooner a time value more recent that Later
+ *
+ * @param Later a time value later than Sooner
+ *
+ * @note The result is an OI_UINT32 value so this function only works for time intervals
+ * that are less than about 50 days.
+ *
+ * @return the time interval between the two times = (Later - Sooner)
+ */
+
+OI_UINT32 OI_Time_IntervalMsecs(OI_TIME *Sooner,
+ OI_TIME *Later);
+
+
+
+/**
+ * This function answers the question, Have we reached or gone past the target time?
+ *
+ * @param pTargetTime target time
+ *
+ * @return TRUE means time now is at or past target time
+ * FALSE means target time is still some time in the future
+ */
+
+OI_BOOL OI_Time_NowReachedTime(OI_TIME *pTargetTime);
+
+/**
+ * Convert seconds to the Link Manager 1.28-second units
+ * Approximate by using 1.25 conversion factor.
+ */
+
+#define OI_SECONDS_TO_LM_TIME_UNITS(lmUnits) ((lmUnits)<4?(lmUnits):(lmUnits)-((lmUnits)>>2))
+
+
+/**
+ * Convert Link Manager 1.28-second units to seconds.
+ * Approximate by using 1.25 conversion factor.
+ */
+
+#define OI_LM_TIME_UNITS_TO_SECONDS(lmUnits) ((lmUnits) + ((lmUnits)>>2))
+
+#ifdef __cplusplus
+}
+#endif
+
+/**@}*/
+
+/* Include for OI_Time_Now() prototype
+ * Must be included at end to obtain OI_TIME typedef
+ */
+#include "oi_osinterface.h"
+
+/*****************************************************************************/
+#endif /* _OI_TIME_H */
+
diff --git a/embdrv/sbc/decoder/include/oi_utils.h b/embdrv/sbc/decoder/include/oi_utils.h
new file mode 100644
index 0000000..5272259
--- /dev/null
+++ b/embdrv/sbc/decoder/include/oi_utils.h
@@ -0,0 +1,377 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2002 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+#ifndef _OI_UTILS_H
+#define _OI_UTILS_H
+/**
+ * @file
+ *
+ * This file provides the interface for utility functions.
+ * Among the utilities are strlen (string length), strcmp (string compare), and
+ * other string manipulation functions. These are provided for those plaforms
+ * where this functionality is not available in stdlib.
+ */
+
+/**********************************************************************************
+ $Revision: #1 $
+***********************************************************************************/
+
+#include <stdarg.h>
+#include "oi_common.h"
+#include "oi_string.h"
+#include "oi_bt_spec.h"
+
+/** \addtogroup Misc Miscellaneous APIs */
+/**@{*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Opaque type for a callback function handle. See OI_ScheduleCallbackFunction()
+ */
+typedef OI_UINT32 OI_CALLBACK_HANDLE;
+
+
+/**
+ * Function prototype for a timed procedure callback.
+ *
+ * @param arg Value that was passed into the OI_ScheduleCallback() function
+ *
+ */
+typedef void (*OI_SCHEDULED_CALLBACK)(void *arg);
+
+
+/**
+ * Registers a function to be called when a timeout expires. This API uses BLUEmagic's internal
+ * function dispatch mechanism, so applications that make extensive use of this facility may need to
+ * increase the value of DispatchTableSize in the configuration block for the dispatcher (see
+ * oi_bt_stack_config.h).
+ *
+ * @param callbackFunction The function that will be called when the timeout expires
+ *
+ * @param arg Value that will be returned as the parameter to the callback function.
+ *
+ * @param timeout A timeout expressed in OI_INTERVALs (tenths of seconds). This can be
+ * zero in which case the callback function will be called as soon as
+ * possible.
+ *
+ * @param handle NULL or a pointer receive the callback handle.
+ *
+ * @return OI_OK if the function was reqistered, or an error status.
+ */
+OI_STATUS OI_ScheduleCallbackFunction(OI_SCHEDULED_CALLBACK callbackFunction,
+ void *arg,
+ OI_INTERVAL timeout,
+ OI_CALLBACK_HANDLE *handle);
+
+
+/**
+ * Cancels a function registered with OI_ScheduleCallbackFunction() before its timer expires.
+ *
+ * @param handle handle returned by OI_ScheduleCallbackFunction().
+ *
+ * @return OI_OK if the function was cancelled, or an error status.
+ */
+OI_STATUS OI_CancelCallbackFunction(OI_CALLBACK_HANDLE handle);
+
+
+/**
+ * Registers a function to be called when a timeout expires. This version does not return a handle
+ * so can only be canceled by calling OI_CancelCallback().
+ *
+ * @param callbackFunction The function that will be called when the timeout expires
+ *
+ * @param arg Value that will be returned as the parameter to the callback function.
+ *
+ * @param timeout A timeout expressed in OI_INTERVALs (tenths of seconds). This can be
+ * zero in which case the callback function will be called as soon as
+ * possible.
+ *
+ * @return OI_OK if the function was reqistered, or an error status.
+ */
+#define OI_ScheduleCallback(f, a, t) OI_ScheduleCallbackFunction(f, a, t, NULL);
+
+
+/**
+ * Cancels a function registered with OI_ScheduleCallback() before its timer expires. This
+ * function will cancel the first entry matches the indicated callback function pointer.
+ *
+ * @param callbackFunction The function that was originally registered
+ *
+ * @return OI_OK if the function was cancelled, or an error status.
+ */
+OI_STATUS OI_CancelCallback(OI_SCHEDULED_CALLBACK callbackFunction);
+
+
+/**
+ * Parse a Bluetooth device address from the specified string.
+ *
+ * @param str the string to parse
+ * @param addr the parsed address, if successful
+ *
+ * @return TRUE if an address was successfully parsed, FALSE otherwise
+ */
+
+OI_BOOL OI_ParseBdAddr(const OI_CHAR *str,
+ OI_BD_ADDR *addr) ;
+
+/**
+ * Printf function for platforms which have no stdio or printf available.
+ * OI_Printf supports the basic formatting types, with the exception of
+ * floating point types. Additionally, OI_Printf supports several formats
+ * specific to BLUEmagic 3.0 software:
+ *
+ * \%! prints the string for an #OI_STATUS value.
+ * @code OI_Printf("There was an error %!", status); @endcode
+ *
+ * \%@ prints a hex dump of a buffer.
+ * Requires a pointer to the buffer and a signed integer length
+ * (0 for default length). If the buffer is large, only an excerpt will
+ * be printed.
+ * @code OI_Printf("Contents of buffer %@", buffer, sizeof(buffer)); @endcode
+ *
+ * \%: prints a Bluetooth address in the form "HH:HH:HH:HH:HH:HH".
+ * Requires a pointer to an #OI_BD_ADDR.
+ * @code OI_Printf("Bluetooth address %:", &bdaddr); @endcode
+ *
+ * \%^ decodes and prints a data element as formatted XML.
+ * Requires a pointer to an #OI_DATAELEM.
+ * @code OI_Printf("Service attribute list is:\n%^", &attributes); @endcode
+ *
+ * \%/ prints the base file name of a path, that is, the final substring
+ * following a '/' or '\\' character. Requires a pointer to a null
+ * terminated string.
+ * @code OI_Printf("File %/", "c:\\dir1\\dir2\\file.txt"); @endcode
+ *
+ * \%~ prints a string, escaping characters as needed to display it in
+ * ASCII. Requires a pointer to an #OI_PSTR and an #OI_UNICODE_ENCODING
+ * parameter.
+ * @code OI_Printf("Identifier %~", &id, OI_UNICODE_UTF16_BE); @endcode
+ *
+ * \%[ inserts an ANSI color escape sequence. Requires a single character
+ * identifying the color to select. Colors are red (r/R), green (g/G),
+ * blue (b/B), yellow (y/Y), cyan (c/C), magenta (m/M), white (W),
+ * light-gray (l/L), dark-gray (d/D), and black (0). The lower case is
+ * dim, the upper case is bright (except in the case of light-gray and
+ * dark-gray, where bright and dim are identical). Any other value will
+ * select the default color.
+ * @code OI_Printf("%[red text %[black %[normal\n", 'r', '0', 0); @endcode
+ *
+ * \%a same as \%s, except '\\r' and '\\n' are output as "<cr>" and "<lf>".
+ * \%?a is valid, but \%la is not.
+ *
+ * \%b prints an integer in base 2.
+ * @code OI_Printf("Bits are %b", I); @endcode
+ *
+ * \%lb prints a long integer in base 2.
+ *
+ * \%?b prints the least significant N bits of an integer (or long integer)
+ * in base 2. Requires the integer and a length N.
+ * @code OI_Printf("Bottom 4 bits are: %?b", I, 4); @endcode
+ *
+ * \%B prints an integer as boolean text, "TRUE" or "FALSE".
+ * @code OI_Printf("The value 0 is %B, the value 1 is %B", 0, 1); @endcode
+ *
+ * \%?s prints a substring up to a specified maximum length.
+ * Requires a pointer to a string and a length parameter.
+ * @code OI_Printf("String prefix is %?s", str, 3); @endcode
+ *
+ * \%ls same as \%S.
+ *
+ * \%S prints a UTF16 string as UTF8 (plain ASCII, plus 8-bit char sequences
+ * where needed). Requires a pointer to #OI_CHAR16. \%?S is valid. The
+ * length parameter is in OI_CHAR16 characters.
+ *
+ * \%T prints time, formatted as "secs.msecs".
+ * Requires pointer to #OI_TIME struct, NULL pointer prints current time.
+ * @code OI_Printf("The time now is %T", NULL); @endcode
+ *
+ * @param format The format string
+ *
+ */
+void OI_Printf(const OI_CHAR *format, ...);
+
+
+/**
+ * Var-args version OI_Printf
+ *
+ * @param format Same as for OI_Printf.
+ *
+ * @param argp Var-args list.
+ */
+void OI_VPrintf(const OI_CHAR *format, va_list argp);
+
+
+/**
+ * Writes a formatted string to a buffer. This function supports the same format specifiers as
+ * OI_Printf().
+ *
+ * @param buffer Destination buffer for the formatted string.
+ *
+ * @param bufLen The length of the destination buffer.
+ *
+ * @param format The format string
+ *
+ * @return Number of characters written or -1 in the case of an error.
+ */
+OI_INT32 OI_SNPrintf(OI_CHAR *buffer,
+ OI_UINT16 bufLen,
+ const OI_CHAR* format, ...);
+
+
+/**
+ * Var-args version OI_SNPrintf
+ *
+ * @param buffer Destination buffer for the formatted string.
+ *
+ * @param bufLen The length of the destination buffer.
+ *
+ * @param format The format string
+ *
+ * @param argp Var-args list.
+ *
+ * @return Number of characters written or -1 in the case of an error.
+ */
+OI_INT32 OI_VSNPrintf(OI_CHAR *buffer,
+ OI_UINT16 bufLen,
+ const OI_CHAR *format, va_list argp);
+
+
+/**
+ * Convert a string to an integer.
+ *
+ * @param str the string to parse
+ *
+ * @return the integer value of the string or 0 if the string could not be parsed
+ */
+OI_INT OI_atoi(const OI_CHAR *str);
+
+
+/**
+ * Parse a signed integer in a string.
+ *
+ * Skips leading whitespace (space and tabs only) and parses a decimal or hex string. Hex string
+ * must be prefixed by "0x". Returns pointer to first character following the integer. Returns the
+ * pointer passed in if the string does not describe an integer.
+ *
+ * @param str String to parse.
+ *
+ * @param val Pointer to receive the parsed integer value.
+ *
+ * @return A pointer to the first character following the integer or the pointer passed in.
+ */
+const OI_CHAR* OI_ScanInt(const OI_CHAR *str,
+ OI_INT32 *val);
+
+
+/**
+ * Parse an unsigned integer in a string.
+ *
+ * Skips leading whitespace (space and tabs only) and parses a decimal or hex string. Hex string
+ * must be prefixed by "0x". Returns pointer to first character following the integer. Returns the
+ * pointer passed in if the string does not describe an integer.
+ *
+ * @param str String to parse.
+ *
+ * @param val Pointer to receive the parsed unsigned integer value.
+ *
+ * @return A pointer to the first character following the unsigned integer or the pointer passed in.
+ */
+const OI_CHAR* OI_ScanUInt(const OI_CHAR *str,
+ OI_UINT32 *val);
+
+/**
+ * Parse a whitespace delimited substring out of a string.
+ *
+ * @param str Input string to parse.
+ * @param outStr Buffer to return the substring
+ * @param len Length of outStr
+ *
+ *
+ * @return A pointer to the first character following the substring or the pointer passed in.
+ */
+const OI_CHAR* OI_ScanStr(const OI_CHAR *str,
+ OI_CHAR *outStr,
+ OI_UINT16 len);
+
+
+/**
+ * Parse a string for one of a set of alternative value. Skips leading whitespace (space and tabs
+ * only) and parses text matching one of the alternative strings. Returns pointer to first character
+ * following the matched text.
+ *
+ * @param str String to parse.
+ *
+ * @param alts Alternative matching strings separated by '|'
+ *
+ * @param index Pointer to receive the index of the matching alternative, return value is -1 if
+ * there is no match.
+ *
+ * @return A pointer to the first character following the matched value or the pointer passed in
+ * if there was no matching text.
+ */
+const OI_CHAR* OI_ScanAlt(const OI_CHAR *str,
+ const OI_CHAR *alts,
+ OI_INT *index);
+
+/**
+ * Parse a string for a BD Addr. Skips leading whitespace (space and tabs only) and parses a
+ * Bluetooth device address with nibbles optionally separated by colons. Return pointet to first
+ * character following the BD Addr.
+ *
+ * @param str String to parse.
+ *
+ * @param addr Pointer to receive the Bluetooth device address
+ *
+ * @return A pointer to the first character following the BD Addr or the pointer passed in.
+ */
+const OI_CHAR* OI_ScanBdAddr(const OI_CHAR *str,
+ OI_BD_ADDR *addr);
+
+
+/** Get a character from a digit integer value (0 - 9). */
+#define OI_DigitToChar(d) ((d) + '0')
+
+/**
+ * Determine Maximum and Minimum between two arguments.
+ *
+ * @param a 1st value
+ * @param b 2nd value
+ *
+ * @return the max or min value between a & b
+ */
+#define OI_MAX(a, b) (((a) < (b)) ? (b) : (a) )
+#define OI_MIN(a, b) (((a) > (b)) ? (b) : (a) )
+
+/**
+ * Compare two BD_ADDRs
+ * SAME_BD_ADDR - Boolean: TRUE if they are the same address
+ */
+
+#define SAME_BD_ADDR(x, y) (0 == OI_MemCmp((x),(y),OI_BD_ADDR_BYTE_SIZE) )
+
+#ifdef __cplusplus
+}
+#endif
+
+/**@}*/
+
+#endif /* _OI_UTILS_H */
+
diff --git a/embdrv/sbc/decoder/srce/alloc.c b/embdrv/sbc/decoder/srce/alloc.c
new file mode 100644
index 0000000..f8723f2
--- /dev/null
+++ b/embdrv/sbc/decoder/srce/alloc.c
@@ -0,0 +1,78 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+#include <stdlib.h>
+#include <oi_codec_sbc_private.h>
+
+/**********************************************************************************
+ $Revision: #1 $
+***********************************************************************************/
+
+PRIVATE OI_STATUS OI_CODEC_SBC_Alloc(OI_CODEC_SBC_COMMON_CONTEXT *common,
+ OI_UINT32 *codecDataAligned,
+ OI_UINT32 codecDataBytes,
+ OI_UINT8 maxChannels,
+ OI_UINT8 pcmStride)
+{
+ int i;
+ size_t filterBufferCount;
+ size_t subdataSize;
+ OI_BYTE *codecData = (OI_BYTE*)codecDataAligned;
+
+ if (maxChannels < 1 || maxChannels > 2) {
+ return OI_STATUS_INVALID_PARAMETERS;
+ }
+
+ if (pcmStride < 1 || pcmStride > maxChannels) {
+ return OI_STATUS_INVALID_PARAMETERS;
+ }
+
+ common->maxChannels = maxChannels;
+ common->pcmStride = pcmStride;
+
+ /* Compute sizes needed for the memory regions, and bail if we don't have
+ * enough memory for them. */
+ subdataSize = maxChannels * sizeof(common->subdata[0]) * SBC_MAX_BANDS * SBC_MAX_BLOCKS;
+ if (subdataSize > codecDataBytes) {
+ return OI_STATUS_OUT_OF_MEMORY;
+ }
+
+ filterBufferCount = (codecDataBytes - subdataSize) / (sizeof(common->filterBuffer[0][0]) * SBC_MAX_BANDS * maxChannels);
+ if (filterBufferCount < SBC_CODEC_MIN_FILTER_BUFFERS) {
+ return OI_STATUS_OUT_OF_MEMORY;
+ }
+ common->filterBufferLen = filterBufferCount * SBC_MAX_BANDS;
+
+ /* Allocate memory for the subband data */
+ common->subdata = (OI_INT32*)codecData;
+ codecData += subdataSize;
+ OI_ASSERT(codecDataBytes >= subdataSize);
+ codecDataBytes -= subdataSize;
+
+ /* Allocate memory for the synthesis buffers */
+ for (i = 0; i < maxChannels; ++i) {
+ size_t allocSize = common->filterBufferLen * sizeof(common->filterBuffer[0][0]);
+ common->filterBuffer[i] = (SBC_BUFFER_T*)codecData;
+ OI_ASSERT(codecDataBytes >= allocSize);
+ codecData += allocSize;
+ codecDataBytes -= allocSize;
+ }
+
+ return OI_OK;
+}
diff --git a/embdrv/sbc/decoder/srce/bitalloc-sbc.c b/embdrv/sbc/decoder/srce/bitalloc-sbc.c
new file mode 100644
index 0000000..8120298
--- /dev/null
+++ b/embdrv/sbc/decoder/srce/bitalloc-sbc.c
@@ -0,0 +1,165 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+/**********************************************************************************
+ $Revision: #1 $
+***********************************************************************************/
+
+/** @file
+@ingroup codec_internal
+*/
+
+/**@addgroup codec_internal*/
+/**@{*/
+
+#include <oi_codec_sbc_private.h>
+
+static void dualBitAllocation(OI_CODEC_SBC_COMMON_CONTEXT *common)
+{
+ OI_UINT bitcountL;
+ OI_UINT bitcountR;
+ OI_UINT bitpoolPreferenceL = 0;
+ OI_UINT bitpoolPreferenceR = 0;
+ BITNEED_UNION1 bitneedsL;
+ BITNEED_UNION1 bitneedsR;
+
+ bitcountL = computeBitneed(common, bitneedsL.uint8, 0, &bitpoolPreferenceL);
+ bitcountR = computeBitneed(common, bitneedsR.uint8, 1, &bitpoolPreferenceR);
+
+ oneChannelBitAllocation(common, &bitneedsL, 0, bitcountL);
+ oneChannelBitAllocation(common, &bitneedsR, 1, bitcountR);
+}
+
+static void stereoBitAllocation(OI_CODEC_SBC_COMMON_CONTEXT *common)
+{
+ const OI_UINT nrof_subbands = common->frameInfo.nrof_subbands;
+ BITNEED_UNION2 bitneeds;
+ OI_UINT excess;
+ OI_INT bitadjust;
+ OI_UINT bitcount;
+ OI_UINT sbL;
+ OI_UINT sbR;
+ OI_UINT bitpoolPreference = 0;
+
+ bitcount = computeBitneed(common, &bitneeds.uint8[0], 0, &bitpoolPreference);
+ bitcount += computeBitneed(common, &bitneeds.uint8[nrof_subbands], 1, &bitpoolPreference);
+
+ {
+ OI_UINT ex;
+ bitadjust = adjustToFitBitpool(common->frameInfo.bitpool, bitneeds.uint32, 2 * nrof_subbands, bitcount, &ex);
+ /* We want the compiler to put excess into a register */
+ excess = ex;
+ }
+ sbL = 0;
+ sbR = nrof_subbands;
+ while (sbL < nrof_subbands) {
+ excess = allocAdjustedBits(&common->bits.uint8[sbL], bitneeds.uint8[sbL] + bitadjust, excess);
+ ++sbL;
+ excess = allocAdjustedBits(&common->bits.uint8[sbR], bitneeds.uint8[sbR] + bitadjust, excess);
+ ++sbR;
+ }
+ sbL = 0;
+ sbR = nrof_subbands;
+ while (excess) {
+ excess = allocExcessBits(&common->bits.uint8[sbL], excess);
+ ++sbL;
+ if (!excess) {
+ break;
+ }
+ excess = allocExcessBits(&common->bits.uint8[sbR], excess);
+ ++sbR;
+ }
+
+}
+
+static const BIT_ALLOC balloc[] = {
+ monoBitAllocation, /* SBC_MONO */
+ dualBitAllocation, /* SBC_DUAL_CHANNEL */
+ stereoBitAllocation, /* SBC_STEREO */
+ stereoBitAllocation /* SBC_JOINT_STEREO */
+};
+
+
+PRIVATE void OI_SBC_ComputeBitAllocation(OI_CODEC_SBC_COMMON_CONTEXT *common)
+{
+ OI_ASSERT(common->frameInfo.bitpool <= OI_SBC_MaxBitpool(&common->frameInfo));
+ OI_ASSERT(common->frameInfo.mode < OI_ARRAYSIZE(balloc));
+
+ /*
+ * Using an array of function pointers prevents the compiler from creating a suboptimal
+ * monolithic inlined bit allocation function.
+ */
+ balloc[common->frameInfo.mode](common);
+}
+
+OI_UINT32 OI_CODEC_SBC_CalculateBitrate(OI_CODEC_SBC_FRAME_INFO *frame)
+{
+ return internal_CalculateBitrate(frame);
+}
+
+/*
+ * Return the current maximum bitneed and clear it.
+ */
+OI_UINT8 OI_CODEC_SBC_GetMaxBitneed(OI_CODEC_SBC_COMMON_CONTEXT *common)
+{
+ OI_UINT8 max = common->maxBitneed;
+
+ common->maxBitneed = 0;
+ return max;
+}
+
+/*
+ * Calculates the bitpool size for a given frame length
+ */
+OI_UINT16 OI_CODEC_SBC_CalculateBitpool(OI_CODEC_SBC_FRAME_INFO *frame,
+ OI_UINT16 frameLen)
+{
+ OI_UINT16 nrof_subbands = frame->nrof_subbands;
+ OI_UINT16 nrof_blocks = frame->nrof_blocks;
+ OI_UINT16 hdr;
+ OI_UINT16 bits;
+
+ if (frame->mode == SBC_JOINT_STEREO) {
+ hdr = 9 * nrof_subbands;
+ } else {
+ if (frame->mode == SBC_MONO) {
+ hdr = 4 * nrof_subbands;
+ } else {
+ hdr = 8 * nrof_subbands;
+ }
+ if (frame->mode == SBC_DUAL_CHANNEL) {
+ nrof_blocks *= 2;
+ }
+ }
+ bits = 8 * (frameLen - SBC_HEADER_LEN) - hdr;
+ return DIVIDE(bits, nrof_blocks);
+}
+
+OI_UINT16 OI_CODEC_SBC_CalculatePcmBytes(OI_CODEC_SBC_COMMON_CONTEXT *common)
+{
+ return sizeof(OI_INT16) * common->pcmStride * common->frameInfo.nrof_subbands * common->frameInfo.nrof_blocks;
+}
+
+
+OI_UINT16 OI_CODEC_SBC_CalculateFramelen(OI_CODEC_SBC_FRAME_INFO *frame)
+{
+ return internal_CalculateFramelen(frame);
+}
+
+/**@}*/
diff --git a/embdrv/sbc/decoder/srce/bitalloc.c b/embdrv/sbc/decoder/srce/bitalloc.c
new file mode 100644
index 0000000..544c470
--- /dev/null
+++ b/embdrv/sbc/decoder/srce/bitalloc.c
@@ -0,0 +1,392 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+/**********************************************************************************
+ $Revision: #1 $
+ ***********************************************************************************/
+
+/**
+@file
+
+The functions in this file relate to the allocation of available bits to
+subbands within the SBC/eSBC frame, along with support functions for computing
+frame length and bitrate.
+
+@ingroup codec_internal
+*/
+
+/**
+@addtogroup codec_internal
+@{
+*/
+
+#include "oi_utils.h"
+#include <oi_codec_sbc_private.h>
+
+OI_UINT32 OI_SBC_MaxBitpool(OI_CODEC_SBC_FRAME_INFO *frame)
+{
+ switch (frame->mode) {
+ case SBC_MONO:
+ case SBC_DUAL_CHANNEL:
+ return 16 * frame->nrof_subbands;
+ case SBC_STEREO:
+ case SBC_JOINT_STEREO:
+ return 32 * frame->nrof_subbands;
+ }
+
+ ERROR(("Invalid frame mode %d", frame->mode));
+ OI_ASSERT(FALSE);
+ return 0; /* Should never be reached */
+}
+
+
+PRIVATE OI_UINT16 internal_CalculateFramelen(OI_CODEC_SBC_FRAME_INFO *frame)
+{
+ OI_UINT16 nbits = frame->nrof_blocks * frame->bitpool;
+ OI_UINT16 nrof_subbands = frame->nrof_subbands;
+ OI_UINT16 result = nbits;
+
+ if (frame->mode == SBC_JOINT_STEREO) {
+ result += nrof_subbands + (8 * nrof_subbands);
+ } else {
+ if (frame->mode == SBC_DUAL_CHANNEL) { result += nbits; }
+ if (frame->mode == SBC_MONO) { result += 4*nrof_subbands; } else { result += 8*nrof_subbands; }
+ }
+ return SBC_HEADER_LEN + (result + 7) / 8;
+}
+
+
+PRIVATE OI_UINT32 internal_CalculateBitrate(OI_CODEC_SBC_FRAME_INFO *frame)
+{
+ OI_UINT blocksbands;
+ blocksbands = frame->nrof_subbands * frame->nrof_blocks;
+
+ return DIVIDE(8 * internal_CalculateFramelen(frame) * frame->frequency, blocksbands);
+}
+
+
+INLINE OI_UINT16 OI_SBC_CalculateFrameAndHeaderlen(OI_CODEC_SBC_FRAME_INFO *frame, OI_UINT *headerLen_)
+{
+ OI_UINT headerLen = SBC_HEADER_LEN + frame->nrof_subbands * frame->nrof_channels/2;
+
+ if (frame->mode == SBC_JOINT_STEREO) { headerLen++; }
+
+ *headerLen_ = headerLen;
+ return internal_CalculateFramelen(frame);
+}
+
+
+#define MIN(x, y) ((x) < (y) ? (x) : (y))
+
+
+/*
+ * Computes the bit need for each sample and as also returns a counts of bit needs that are greater
+ * than one. This count is used in the first phase of bit allocation.
+ *
+ * We also compute a preferred bitpool value that this is the minimum bitpool needed to guarantee
+ * lossless representation of the audio data. The preferred bitpool may be larger than the bits
+ * actually required but the only input we have are the scale factors. For example, it takes 2 bits
+ * to represent values in the range -1 .. +1 but the scale factor is 0. To guarantee lossless
+ * representation we add 2 to each scale factor and sum them to come up with the preferred bitpool.
+ * This is not ideal because 0 requires 0 bits but we currently have no way of knowing this.
+ *
+ * @param bitneed Array to return bitneeds for each subband
+ *
+ * @param ch Channel 0 or 1
+ *
+ * @param preferredBitpool Returns the number of reserved bits
+ *
+ * @return The SBC bit need
+ *
+ */
+OI_UINT computeBitneed(OI_CODEC_SBC_COMMON_CONTEXT *common,
+ OI_UINT8 *bitneeds,
+ OI_UINT ch,
+ OI_UINT *preferredBitpool)
+{
+ static const OI_INT8 offset4[4][4] = {
+ { -1, 0, 0, 0 },
+ { -2, 0, 0, 1 },
+ { -2, 0, 0, 1 },
+ { -2, 0, 0, 1 }
+ };
+
+ static const OI_INT8 offset8[4][8] = {
+ { -2, 0, 0, 0, 0, 0, 0, 1 },
+ { -3, 0, 0, 0, 0, 0, 1, 2 },
+ { -4, 0, 0, 0, 0, 0, 1, 2 },
+ { -4, 0, 0, 0, 0, 0, 1, 2 }
+ };
+
+ const OI_UINT nrof_subbands = common->frameInfo.nrof_subbands;
+ OI_UINT sb;
+ OI_INT8 *scale_factor = &common->scale_factor[ch ? nrof_subbands : 0];
+ OI_UINT bitcount = 0;
+ OI_UINT8 maxBits = 0;
+ OI_UINT8 prefBits = 0;
+
+ if (common->frameInfo.alloc == SBC_SNR) {
+ for (sb = 0; sb < nrof_subbands; sb++) {
+ OI_INT bits = scale_factor[sb];
+ if (bits > maxBits) {
+ maxBits = bits;
+ }
+ if ((bitneeds[sb] = bits) > 1) {
+ bitcount += bits;
+ }
+ prefBits += 2 + bits;
+ }
+ } else {
+ const OI_INT8 *offset;
+ if (nrof_subbands == 4) {
+ offset = offset4[common->frameInfo.freqIndex];
+ } else {
+ offset = offset8[common->frameInfo.freqIndex];
+ }
+ for (sb = 0; sb < nrof_subbands; sb++) {
+ OI_INT bits = scale_factor[sb];
+ if (bits > maxBits) {
+ maxBits = bits;
+ }
+ prefBits += 2 + bits;
+ if (bits) {
+ bits -= offset[sb];
+ if (bits > 0) {
+ bits /= 2;
+ }
+ bits += 5;
+ }
+ if ((bitneeds[sb] = bits) > 1) {
+ bitcount += bits;
+ }
+ }
+ }
+ common->maxBitneed = OI_MAX(maxBits, common->maxBitneed);
+ *preferredBitpool += prefBits;
+ return bitcount;
+}
+
+
+/*
+ * Explanation of the adjustToFitBitpool inner loop.
+ *
+ * The inner loop computes the effect of adjusting the bit allocation up or
+ * down. Allocations must be 0 or in the range 2..16. This is accomplished by
+ * the following code:
+ *
+ * for (s = bands - 1; s >= 0; --s) {
+ * OI_INT bits = bitadjust + bitneeds[s];
+ * bits = bits < 2 ? 0 : bits;
+ * bits = bits > 16 ? 16 : bits;
+ * count += bits;
+ * }
+ *
+ * This loop can be optimized to perform 4 operations at a time as follows:
+ *
+ * Adjustment is computed as a 7 bit signed value and added to the bitneed.
+ *
+ * Negative allocations are zeroed by masking. (n & 0x40) >> 6 puts the
+ * sign bit into bit 0, adding this to 0x7F give us a mask of 0x80
+ * for -ve values and 0x7F for +ve values.
+ *
+ * n &= 0x7F + (n & 0x40) >> 6)
+ *
+ * Allocations greater than 16 are truncated to 16. Adjusted allocations are in
+ * the range 0..31 so we know that bit 4 indicates values >= 16. We use this bit
+ * to create a mask that zeroes bits 0 .. 3 if bit 4 is set.
+ *
+ * n &= (15 + (n >> 4))
+ *
+ * Allocations of 1 are disallowed. Add and shift creates a mask that
+ * eliminates the illegal value
+ *
+ * n &= ((n + 14) >> 4) | 0x1E
+ *
+ * These operations can be performed in 8 bits without overflowing so we can
+ * operate on 4 values at once.
+ */
+
+
+/*
+ * Encoder/Decoder
+ *
+ * Computes adjustment +/- of bitneeds to fill bitpool and returns overall
+ * adjustment and excess bits.
+ *
+ * @param bitpool The bitpool we have to work within
+ *
+ * @param bitneeds An array of bit needs (more acturately allocation prioritities) for each
+ * subband across all blocks in the SBC frame
+ *
+ * @param subbands The number of subbands over which the adkustment is calculated. For mono and
+ * dual mode this is 4 or 8, for stereo or joint stereo this is 8 or 16.
+ *
+ * @param bitcount A starting point for the adjustment
+ *
+ * @param excess Returns the excess bits after the adjustment
+ *
+ * @return The adjustment.
+ */
+OI_INT adjustToFitBitpool(const OI_UINT bitpool,
+ OI_UINT32 *bitneeds,
+ const OI_UINT subbands,
+ OI_UINT bitcount,
+ OI_UINT *excess)
+{
+ OI_INT maxBitadjust = 0;
+ OI_INT bitadjust = (bitcount > bitpool) ? -8 : 8;
+ OI_INT chop = 8;
+
+ /*
+ * This is essentially a binary search for the optimal adjustment value.
+ */
+ while ((bitcount != bitpool) && chop) {
+ OI_UINT32 total = 0;
+ OI_UINT count;
+ OI_UINT32 adjust4;
+ OI_INT i;
+
+ adjust4 = bitadjust & 0x7F;
+ adjust4 |= (adjust4 << 8);
+ adjust4 |= (adjust4 << 16);
+
+ for (i = (subbands / 4 - 1); i >= 0; --i) {
+ OI_UINT32 mask;
+ OI_UINT32 n = bitneeds[i] + adjust4;
+ mask = 0x7F7F7F7F + ((n & 0x40404040) >> 6);
+ n &= mask;
+ mask = 0x0F0F0F0F + ((n & 0x10101010) >> 4);
+ n &= mask;
+ mask = (((n + 0x0E0E0E0E) >> 4) | 0x1E1E1E1E);
+ n &= mask;
+ total += n;
+ }
+
+ count = (total & 0xFFFF) + (total >> 16);
+ count = (count & 0xFF) + (count >> 8);
+
+ chop >>= 1;
+ if (count > bitpool) {
+ bitadjust -= chop;
+ } else {
+ maxBitadjust = bitadjust;
+ bitcount = count;
+ bitadjust += chop;
+ }
+ }
+
+ *excess = bitpool - bitcount;
+
+ return maxBitadjust;
+}
+
+
+/*
+ * The bit allocator trys to avoid single bit allocations except as a last resort. So in the case
+ * where a bitneed of 1 was passed over during the adsjustment phase 2 bits are now allocated.
+ */
+INLINE OI_INT allocAdjustedBits(OI_UINT8 *dest,
+ OI_INT bits,
+ OI_INT excess)
+{
+ if (bits < 16) {
+ if (bits > 1) {
+ if (excess) {
+ ++bits;
+ --excess;
+ }
+ } else if ((bits == 1) && (excess > 1)) {
+ bits = 2;
+ excess -= 2;
+ } else {
+ bits = 0;
+ }
+ } else {
+ bits = 16;
+ }
+ *dest = (OI_UINT8)bits;
+ return excess;
+}
+
+
+/*
+ * Excess bits not allocated by allocaAdjustedBits are allocated round-robin.
+ */
+INLINE OI_INT allocExcessBits(OI_UINT8 *dest,
+ OI_INT excess)
+{
+ if (*dest < 16) {
+ *dest += 1;
+ return excess - 1;
+ } else {
+ return excess;
+ }
+}
+
+void oneChannelBitAllocation(OI_CODEC_SBC_COMMON_CONTEXT *common,
+ BITNEED_UNION1 *bitneeds,
+ OI_UINT ch,
+ OI_UINT bitcount)
+{
+ const OI_UINT8 nrof_subbands = common->frameInfo.nrof_subbands;
+ OI_UINT excess;
+ OI_UINT sb;
+ OI_INT bitadjust;
+ OI_UINT8 RESTRICT *allocBits;
+
+
+ {
+ OI_UINT ex;
+ bitadjust = adjustToFitBitpool(common->frameInfo.bitpool, bitneeds->uint32, nrof_subbands, bitcount, &ex);
+ /* We want the compiler to put excess into a register */
+ excess = ex;
+ }
+
+ /*
+ * Allocate adjusted bits
+ */
+ allocBits = &common->bits.uint8[ch ? nrof_subbands : 0];
+
+ sb = 0;
+ while (sb < nrof_subbands) {
+ excess = allocAdjustedBits(&allocBits[sb], bitneeds->uint8[sb] + bitadjust, excess);
+ ++sb;
+ }
+ sb = 0;
+ while (excess) {
+ excess = allocExcessBits(&allocBits[sb], excess);
+ ++sb;
+ }
+}
+
+
+void monoBitAllocation(OI_CODEC_SBC_COMMON_CONTEXT *common)
+{
+ BITNEED_UNION1 bitneeds;
+ OI_UINT bitcount;
+ OI_UINT bitpoolPreference = 0;
+
+ bitcount = computeBitneed(common, bitneeds.uint8, 0, &bitpoolPreference);
+
+ oneChannelBitAllocation(common, &bitneeds, 0, bitcount);
+}
+
+/**
+@}
+*/
diff --git a/embdrv/sbc/decoder/srce/bitstream-decode.c b/embdrv/sbc/decoder/srce/bitstream-decode.c
new file mode 100644
index 0000000..7eb2a90
--- /dev/null
+++ b/embdrv/sbc/decoder/srce/bitstream-decode.c
@@ -0,0 +1,92 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+/**********************************************************************************
+ $Revision: #1 $
+***********************************************************************************/
+
+/**
+@file
+Functions for manipulating input bitstreams.
+
+@ingroup codec_internal
+*/
+
+/**
+@addtogroup codec_internal
+@{
+*/
+
+#include "oi_stddefs.h"
+#include "oi_bitstream.h"
+#include "oi_assert.h"
+
+PRIVATE void OI_BITSTREAM_ReadInit(OI_BITSTREAM *bs,
+ const OI_BYTE *buffer)
+{
+ bs->value = ((OI_INT32)buffer[0] << 16) | ((OI_INT32)buffer[1] << 8) | (buffer[2]);
+ bs->ptr.r = buffer + 3;
+ bs->bitPtr = 8;
+}
+
+PRIVATE OI_UINT32 OI_BITSTREAM_ReadUINT(OI_BITSTREAM *bs, OI_UINT bits)
+{
+ OI_UINT32 result;
+
+ OI_BITSTREAM_READUINT(result, bits, bs->ptr.r, bs->value, bs->bitPtr);
+
+ return result;
+}
+
+PRIVATE OI_UINT8 OI_BITSTREAM_ReadUINT4Aligned(OI_BITSTREAM *bs)
+{
+ OI_UINT32 result;
+
+ OI_ASSERT(bs->bitPtr < 16);
+ OI_ASSERT(bs->bitPtr % 4 == 0);
+
+ if (bs->bitPtr == 8) {
+ result = bs->value << 8;
+ bs->bitPtr = 12;
+ } else {
+ result = bs->value << 12;
+ bs->value = (bs->value << 8) | *bs->ptr.r++;
+ bs->bitPtr = 8;
+ }
+ result >>= 28;
+ OI_ASSERT(result < (1u << 4));
+ return (OI_UINT8)result;
+}
+
+PRIVATE OI_UINT8 OI_BITSTREAM_ReadUINT8Aligned(OI_BITSTREAM *bs)
+{
+ OI_UINT32 result;
+ OI_ASSERT(bs->bitPtr == 8);
+
+ result = bs->value >> 16;
+ bs->value = (bs->value << 8) | *bs->ptr.r++;
+
+ return (OI_UINT8)result;
+}
+
+/**
+@}
+*/
+
+
diff --git a/embdrv/sbc/decoder/srce/decoder-oina.c b/embdrv/sbc/decoder/srce/decoder-oina.c
new file mode 100644
index 0000000..93d05ea
--- /dev/null
+++ b/embdrv/sbc/decoder/srce/decoder-oina.c
@@ -0,0 +1,140 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2006 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+/**********************************************************************************
+ $Revision: #1 $
+ ***********************************************************************************/
+
+/**
+@file
+This file exposes OINA-specific interfaces to decoder functions.
+
+@ingroup codec_internal
+*/
+
+/**
+@addtogroup codec_internal
+@{
+*/
+
+
+#include <oi_codec_sbc_private.h>
+
+OI_STATUS OI_CODEC_SBC_DecoderConfigureRaw(OI_CODEC_SBC_DECODER_CONTEXT *context,
+ OI_BOOL enhanced,
+ OI_UINT8 frequency,
+ OI_UINT8 mode,
+ OI_UINT8 subbands,
+ OI_UINT8 blocks,
+ OI_UINT8 alloc,
+ OI_UINT8 maxBitpool)
+{
+ if (frequency > SBC_FREQ_48000) {
+ return OI_STATUS_INVALID_PARAMETERS;
+ }
+
+ if (enhanced) {
+#ifdef SBC_ENHANCED
+ if (subbands != SBC_SUBBANDS_8) {
+ return OI_STATUS_INVALID_PARAMETERS;
+ }
+#else
+ return OI_STATUS_INVALID_PARAMETERS;
+#endif
+ }
+
+ if (mode > SBC_JOINT_STEREO) {
+ return OI_STATUS_INVALID_PARAMETERS;
+ }
+
+ if (subbands > SBC_SUBBANDS_8) {
+ return OI_STATUS_INVALID_PARAMETERS;
+ }
+
+ if (blocks > SBC_BLOCKS_16) {
+ return OI_STATUS_INVALID_PARAMETERS;
+ }
+
+ if (alloc > SBC_SNR) {
+ return OI_STATUS_INVALID_PARAMETERS;
+ }
+
+#ifdef SBC_ENHANCED
+ context->common.frameInfo.enhanced = enhanced;
+#else
+ context->common.frameInfo.enhanced = FALSE;
+#endif
+ context->common.frameInfo.freqIndex = frequency;
+ context->common.frameInfo.mode = mode;
+ context->common.frameInfo.subbands = subbands;
+ context->common.frameInfo.blocks = blocks;
+ context->common.frameInfo.alloc = alloc;
+ context->common.frameInfo.bitpool = maxBitpool;
+
+ OI_SBC_ExpandFrameFields(&context->common.frameInfo);
+
+ if (context->common.frameInfo.nrof_channels >= context->common.pcmStride) {
+ return OI_STATUS_INVALID_PARAMETERS;
+ }
+
+ return OI_OK;
+}
+
+
+
+OI_STATUS OI_CODEC_SBC_DecodeRaw(OI_CODEC_SBC_DECODER_CONTEXT *context,
+ OI_UINT8 bitpool,
+ const OI_BYTE **frameData,
+ OI_UINT32 *frameBytes,
+ OI_INT16 *pcmData,
+ OI_UINT32 *pcmBytes)
+{
+ return internal_DecodeRaw(context,
+ bitpool,
+ frameData,
+ frameBytes,
+ pcmData,
+ pcmBytes);
+}
+
+OI_STATUS OI_CODEC_SBC_DecoderLimit(OI_CODEC_SBC_DECODER_CONTEXT *context,
+ OI_BOOL enhanced,
+ OI_UINT8 subbands)
+{
+ if (enhanced)
+ {
+#ifdef SBC_ENHANCED
+ context->enhancedEnabled = TRUE;
+#else
+ context->enhancedEnabled = FALSE;
+#endif
+ }
+ else
+ {
+ context->enhancedEnabled = FALSE;
+ }
+ context->restrictSubbands = subbands;
+ context->limitFrameFormat = TRUE;
+ return OI_OK;
+}
+
+
+/**
+@}
+*/
diff --git a/embdrv/sbc/decoder/srce/decoder-private.c b/embdrv/sbc/decoder/srce/decoder-private.c
new file mode 100644
index 0000000..faccbf0
--- /dev/null
+++ b/embdrv/sbc/decoder/srce/decoder-private.c
@@ -0,0 +1,227 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+/**********************************************************************************
+ $Revision: #1 $
+ ***********************************************************************************/
+
+/**
+@file
+This file drives SBC decoding.
+
+@ingroup codec_internal
+*/
+
+/**
+@addtogroup codec_internal
+@{
+*/
+
+#include "oi_codec_sbc_private.h"
+#include "oi_bitstream.h"
+#include <stdio.h>
+
+OI_CHAR * const OI_Codec_Copyright = "Copyright 2002-2007 Open Interface North America, Inc. All rights reserved";
+
+INLINE OI_STATUS internal_DecoderReset(OI_CODEC_SBC_DECODER_CONTEXT *context,
+ OI_UINT32 *decoderData,
+ OI_UINT32 decoderDataBytes,
+ OI_BYTE maxChannels,
+ OI_BYTE pcmStride,
+ OI_BOOL enhanced)
+{
+ OI_UINT i;
+ OI_STATUS status;
+
+ for (i = 0; i < sizeof(*context); i++) {
+ ((char *)context)[i] = 0;
+ }
+
+#ifdef SBC_ENHANCED
+ context->enhancedEnabled = enhanced ? TRUE : FALSE;
+#else
+ context->enhancedEnabled = FALSE;
+ if (enhanced){
+ return OI_STATUS_INVALID_PARAMETERS;
+ }
+#endif
+
+ status = OI_CODEC_SBC_Alloc(&context->common, decoderData, decoderDataBytes, maxChannels, pcmStride);
+
+ if (!OI_SUCCESS(status)) {
+ return status;
+ }
+
+ context->common.codecInfo = OI_Codec_Copyright;
+ context->common.maxBitneed = 0;
+ context->limitFrameFormat = FALSE;
+ OI_SBC_ExpandFrameFields(&context->common.frameInfo);
+
+ /*PLATFORM_DECODER_RESET(context);*/
+
+ return OI_OK;
+}
+
+
+
+
+/**
+ * Read the SBC header up to but not including the joint stereo mask. The syncword has already been
+ * examined, and the enhanced mode flag set, by FindSyncword.
+ */
+INLINE void OI_SBC_ReadHeader(OI_CODEC_SBC_COMMON_CONTEXT *common, const OI_BYTE *data)
+{
+ OI_CODEC_SBC_FRAME_INFO *frame = &common->frameInfo;
+ OI_UINT8 d1;
+
+
+ OI_ASSERT(data[0] == OI_SBC_SYNCWORD || data[0] == OI_SBC_ENHANCED_SYNCWORD);
+
+ /* Avoid filling out all these strucutures if we already remember the values
+ * from last time. Just in case we get a stream corresponding to data[1] ==
+ * 0, DecoderReset is responsible for ensuring the lookup table entries have
+ * already been populated
+ */
+ d1 = data[1];
+ if (d1 != frame->cachedInfo) {
+
+ frame->freqIndex = (d1 & (BIT7 | BIT6)) >> 6;
+ frame->frequency = freq_values[frame->freqIndex];
+
+ frame->blocks = (d1 & (BIT5 | BIT4)) >> 4;
+ frame->nrof_blocks = block_values[frame->blocks];
+
+ frame->mode = (d1 & (BIT3 | BIT2)) >> 2;
+ frame->nrof_channels = channel_values[frame->mode];
+
+ frame->alloc = (d1 & BIT1) >> 1;
+
+ frame->subbands = (d1 & BIT0);
+ frame->nrof_subbands = band_values[frame->subbands];
+
+ frame->cachedInfo = d1;
+ }
+ /*
+ * For decode, the bit allocator needs to know the bitpool value
+ */
+ frame->bitpool = data[2];
+ frame->crc = data[3];
+}
+
+
+#define LOW(x) ((x)& 0xf)
+#define HIGH(x) ((x) >> 4)
+
+/*
+ * Read scalefactor values and prepare the bitstream for OI_SBC_ReadSamples
+ */
+PRIVATE void OI_SBC_ReadScalefactors(OI_CODEC_SBC_COMMON_CONTEXT *common,
+ const OI_BYTE *b,
+ OI_BITSTREAM *bs)
+{
+ OI_UINT i = common->frameInfo.nrof_subbands * common->frameInfo.nrof_channels;
+ OI_INT8 *scale_factor = common->scale_factor;
+ OI_UINT f;
+
+ if (common->frameInfo.nrof_subbands == 8 || common->frameInfo.mode != SBC_JOINT_STEREO) {
+ if (common->frameInfo.mode == SBC_JOINT_STEREO) {
+ common->frameInfo.join = *b++;
+ } else {
+ common->frameInfo.join = 0;
+ }
+ i /= 2;
+ do {
+ *scale_factor++ = HIGH(f = *b++);
+ *scale_factor++ = LOW(f);
+ } while (--i);
+ /*
+ * In this case we know that the scale factors end on a byte boundary so all we need to do
+ * is initialize the bitstream.
+ */
+ OI_BITSTREAM_ReadInit(bs, b);
+ } else {
+ OI_ASSERT(common->frameInfo.nrof_subbands == 4 && common->frameInfo.mode == SBC_JOINT_STEREO);
+ common->frameInfo.join = HIGH(f = *b++);
+ i = (i - 1) / 2;
+ do {
+ *scale_factor++ = LOW(f);
+ *scale_factor++ = HIGH(f = *b++);
+ } while (--i);
+ *scale_factor++ = LOW(f);
+ /*
+ * In 4-subband joint stereo mode, the joint stereo information ends on a half-byte
+ * boundary, so it's necessary to use the bitstream abstraction to read it, since
+ * OI_SBC_ReadSamples will need to pick up in mid-byte.
+ */
+ OI_BITSTREAM_ReadInit(bs, b);
+ *scale_factor++ = OI_BITSTREAM_ReadUINT4Aligned(bs);
+ }
+}
+
+/** Read quantized subband samples from the input bitstream and expand them. */
+PRIVATE void OI_SBC_ReadSamples(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_BITSTREAM *global_bs)
+{
+ OI_CODEC_SBC_COMMON_CONTEXT *common = &context->common;
+ OI_UINT nrof_blocks = common->frameInfo.nrof_blocks;
+ OI_INT32 * RESTRICT s = common->subdata;
+ OI_UINT8 *ptr = global_bs->ptr.w;
+ OI_UINT32 value = global_bs->value;
+ OI_UINT bitPtr = global_bs->bitPtr;
+
+ const OI_UINT iter_count = common->frameInfo.nrof_channels * common->frameInfo.nrof_subbands / 4;
+ do {
+ OI_UINT i;
+ for (i = 0; i < iter_count; ++i) {
+ OI_UINT32 sf_by4 = ((OI_UINT32*)common->scale_factor)[i];
+ OI_UINT32 bits_by4 = common->bits.uint32[i];
+ OI_UINT n;
+ for (n = 0; n < 4; ++n) {
+ OI_INT32 dequant;
+ OI_UINT bits;
+ OI_INT sf;
+
+ if (OI_CPU_BYTE_ORDER == OI_LITTLE_ENDIAN_BYTE_ORDER) {
+ bits = bits_by4 & 0xFF;
+ bits_by4 >>= 8;
+ sf = sf_by4 & 0xFF;
+ sf_by4 >>= 8;
+ } else {
+ bits = (bits_by4 >> 24) & 0xFF;
+ bits_by4 <<= 8;
+ sf = (sf_by4 >> 24) & 0xFF;
+ sf_by4 <<= 8;
+ }
+ if (bits) {
+ OI_UINT32 raw;
+ OI_BITSTREAM_READUINT(raw, bits, ptr, value, bitPtr);
+ dequant = OI_SBC_Dequant(raw, sf, bits);
+ } else {
+ dequant = 0;
+ }
+ *s++ = dequant;
+ }
+ }
+ } while (--nrof_blocks);
+}
+
+
+
+/**
+@}
+*/
diff --git a/embdrv/sbc/decoder/srce/decoder-sbc.c b/embdrv/sbc/decoder/srce/decoder-sbc.c
new file mode 100644
index 0000000..2c3a98d
--- /dev/null
+++ b/embdrv/sbc/decoder/srce/decoder-sbc.c
@@ -0,0 +1,465 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2006 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+/**********************************************************************************
+ $Revision: #1 $
+ ***********************************************************************************/
+
+/** @file
+@ingroup codec_internal
+*/
+
+/**@addtogroup codec_internal */
+/**@{*/
+
+#include "oi_codec_sbc_private.h"
+#include "oi_bitstream.h"
+
+#define SPECIALIZE_READ_SAMPLES_JOINT
+
+/**
+ * Scans through a buffer looking for a codec syncword. If the decoder has been
+ * set for enhanced operation using OI_CODEC_SBC_DecoderReset(), it will search
+ * for both a standard and an enhanced syncword.
+ */
+PRIVATE OI_STATUS FindSyncword(OI_CODEC_SBC_DECODER_CONTEXT *context,
+ const OI_BYTE **frameData,
+ OI_UINT32 *frameBytes)
+{
+#ifdef SBC_ENHANCED
+ OI_BYTE search1 = OI_SBC_SYNCWORD;
+ OI_BYTE search2 = OI_SBC_ENHANCED_SYNCWORD;
+#endif // SBC_ENHANCED
+
+ if (*frameBytes == 0) {
+ return OI_CODEC_SBC_NOT_ENOUGH_HEADER_DATA;
+ }
+
+#ifdef SBC_ENHANCED
+ if (context->limitFrameFormat && context->enhancedEnabled){
+ /* If the context is restricted, only search for specified SYNCWORD */
+ search1 = search2;
+ } else if (context->enhancedEnabled == FALSE) {
+ /* If enhanced is not enabled, only search for classic SBC SYNCWORD*/
+ search2 = search1;
+ }
+ while (*frameBytes && (**frameData != search1) && (**frameData != search2)) {
+ (*frameBytes)--;
+ (*frameData)++;
+ }
+ if (*frameBytes) {
+ /* Syncword found, *frameData points to it, and *frameBytes correctly
+ * reflects the number of bytes available to read, including the
+ * syncword. */
+ context->common.frameInfo.enhanced = (**frameData == OI_SBC_ENHANCED_SYNCWORD);
+ return OI_OK;
+ } else {
+ /* No syncword was found anywhere in the provided input data.
+ * *frameData points past the end of the original input, and
+ * *frameBytes is 0. */
+ return OI_CODEC_SBC_NO_SYNCWORD;
+ }
+#else // SBC_ENHANCED
+ while (*frameBytes && (**frameData != OI_SBC_SYNCWORD)) {
+ (*frameBytes)--;
+ (*frameData)++;
+ }
+ if (*frameBytes) {
+ /* Syncword found, *frameData points to it, and *frameBytes correctly
+ * reflects the number of bytes available to read, including the
+ * syncword. */
+ context->common.frameInfo.enhanced = FALSE;
+ return OI_OK;
+ } else {
+ /* No syncword was found anywhere in the provided input data.
+ * *frameData points past the end of the original input, and
+ * *frameBytes is 0. */
+ return OI_CODEC_SBC_NO_SYNCWORD;
+ }
+#endif // SBC_ENHANCED
+}
+
+static OI_STATUS DecodeBody(OI_CODEC_SBC_DECODER_CONTEXT *context,
+ const OI_BYTE *bodyData,
+ OI_INT16 *pcmData,
+ OI_UINT32 *pcmBytes,
+ OI_BOOL allowPartial)
+{
+ OI_BITSTREAM bs;
+ OI_UINT frameSamples = context->common.frameInfo.nrof_blocks * context->common.frameInfo.nrof_subbands;
+ OI_UINT decode_block_count;
+
+ /*
+ * Based on the header data, make sure that there is enough room to write the output samples.
+ */
+ if (*pcmBytes < (sizeof(OI_INT16) * frameSamples * context->common.pcmStride) && !allowPartial) {
+ /* If we're not allowing partial decodes, we need room for the entire
+ * codec frame */
+ TRACE(("-OI_CODEC_SBC_Decode: OI_CODEC_SBC_NOT_ENOUGH_AUDIO_DATA"));
+ return OI_CODEC_SBC_NOT_ENOUGH_AUDIO_DATA;
+ } else if (*pcmBytes < sizeof (OI_INT16) * context->common.frameInfo.nrof_subbands * context->common.pcmStride) {
+ /* Even if we're allowing partials, we can still only decode on a frame
+ * boundary */
+ return OI_CODEC_SBC_NOT_ENOUGH_AUDIO_DATA;
+ }
+
+ if (context->bufferedBlocks == 0) {
+ TRACE(("Reading scalefactors"));
+ OI_SBC_ReadScalefactors(&context->common, bodyData, &bs);
+
+ TRACE(("Computing bit allocation"));
+ OI_SBC_ComputeBitAllocation(&context->common);
+
+ TRACE(("Reading samples"));
+ if (context->common.frameInfo.mode == SBC_JOINT_STEREO) {
+ OI_SBC_ReadSamplesJoint(context, &bs);
+ } else {
+ OI_SBC_ReadSamples(context, &bs);
+ }
+
+ context->bufferedBlocks = context->common.frameInfo.nrof_blocks;
+ }
+
+ if (allowPartial) {
+ decode_block_count = *pcmBytes / sizeof(OI_INT16) / context->common.pcmStride / context->common.frameInfo.nrof_subbands;
+
+ if (decode_block_count > context->bufferedBlocks) {
+ decode_block_count = context->bufferedBlocks;
+ }
+
+ } else {
+ decode_block_count = context->common.frameInfo.nrof_blocks;
+ }
+
+ TRACE(("Synthesizing frame"));
+ {
+ OI_UINT start_block = context->common.frameInfo.nrof_blocks - context->bufferedBlocks;
+ OI_SBC_SynthFrame(context, pcmData, start_block, decode_block_count);
+ }
+
+ OI_ASSERT(context->bufferedBlocks >= decode_block_count);
+ context->bufferedBlocks -= decode_block_count;
+
+ frameSamples = decode_block_count * context->common.frameInfo.nrof_subbands;
+
+ /*
+ * When decoding mono into a stride-2 array, copy pcm data to second channel
+ */
+ if (context->common.frameInfo.nrof_channels == 1 && context->common.pcmStride == 2) {
+ OI_UINT i;
+ for (i = 0; i < frameSamples; ++i) {
+ pcmData[2*i+1] = pcmData[2*i];
+ }
+ }
+
+ /*
+ * Return number of pcm bytes generated by the decode operation.
+ */
+ *pcmBytes = frameSamples * sizeof(OI_INT16) * context->common.pcmStride;
+ if (context->bufferedBlocks > 0) {
+ return OI_CODEC_SBC_PARTIAL_DECODE;
+ } else {
+ return OI_OK;
+ }
+}
+
+PRIVATE OI_STATUS internal_DecodeRaw(OI_CODEC_SBC_DECODER_CONTEXT *context,
+ OI_UINT8 bitpool,
+ const OI_BYTE **frameData,
+ OI_UINT32 *frameBytes,
+ OI_INT16 *pcmData,
+ OI_UINT32 *pcmBytes)
+{
+ OI_STATUS status;
+ OI_UINT bodyLen;
+
+ TRACE(("+OI_CODEC_SBC_DecodeRaw"));
+
+ if (context->bufferedBlocks == 0) {
+ /*
+ * The bitallocator needs to know the bitpool value.
+ */
+ context->common.frameInfo.bitpool = bitpool;
+ /*
+ * Compute the frame length and check we have enough frame data to proceed
+ */
+ bodyLen = OI_CODEC_SBC_CalculateFramelen(&context->common.frameInfo) - SBC_HEADER_LEN;
+ if (*frameBytes < bodyLen) {
+ TRACE(("-OI_CODEC_SBC_Decode: OI_CODEC_SBC_NOT_ENOUGH_BODY_DATA"));
+ return OI_CODEC_SBC_NOT_ENOUGH_BODY_DATA;
+ }
+ } else {
+ bodyLen = 0;
+ }
+ /*
+ * Decode the SBC data. Pass TRUE to DecodeBody to allow partial decoding of
+ * tones.
+ */
+ status = DecodeBody(context, *frameData, pcmData, pcmBytes, TRUE);
+ if (OI_SUCCESS(status) || status == OI_CODEC_SBC_PARTIAL_DECODE) {
+ *frameData += bodyLen;
+ *frameBytes -= bodyLen;
+ }
+ TRACE(("-OI_CODEC_SBC_DecodeRaw: %d", status));
+ return status;
+}
+
+OI_STATUS OI_CODEC_SBC_DecoderReset(OI_CODEC_SBC_DECODER_CONTEXT *context,
+ OI_UINT32 *decoderData,
+ OI_UINT32 decoderDataBytes,
+ OI_UINT8 maxChannels,
+ OI_UINT8 pcmStride,
+ OI_BOOL enhanced)
+{
+ return internal_DecoderReset(context, decoderData, decoderDataBytes, maxChannels, pcmStride, enhanced);
+}
+
+OI_STATUS OI_CODEC_SBC_DecodeFrame(OI_CODEC_SBC_DECODER_CONTEXT *context,
+ const OI_BYTE **frameData,
+ OI_UINT32 *frameBytes,
+ OI_INT16 *pcmData,
+ OI_UINT32 *pcmBytes)
+{
+ OI_STATUS status;
+ OI_UINT framelen;
+ OI_UINT8 crc;
+
+ TRACE(("+OI_CODEC_SBC_DecodeFrame"));
+
+ TRACE(("Finding syncword"));
+ status = FindSyncword(context, frameData, frameBytes);
+ if (!OI_SUCCESS(status)) {
+ return status;
+ }
+
+ /* Make sure enough data remains to read the header. */
+ if (*frameBytes < SBC_HEADER_LEN) {
+ TRACE(("-OI_CODEC_SBC_DecodeFrame: OI_CODEC_SBC_NOT_ENOUGH_HEADER_DATA"));
+ return OI_CODEC_SBC_NOT_ENOUGH_HEADER_DATA;
+ }
+
+ TRACE(("Reading Header"));
+ OI_SBC_ReadHeader(&context->common, *frameData);
+
+ /*
+ * Some implementations load the decoder into RAM and use overlays for 4 vs 8 subbands. We need
+ * to ensure that the SBC parameters for this frame are compatible with the restrictions imposed
+ * by the loaded overlays.
+ */
+ if (context->limitFrameFormat && (context->common.frameInfo.subbands != context->restrictSubbands)) {
+ ERROR(("SBC parameters incompatible with loaded overlay"));
+ return OI_STATUS_INVALID_PARAMETERS;
+ }
+
+ if (context->common.frameInfo.nrof_channels > context->common.maxChannels) {
+ ERROR(("SBC parameters incompatible with number of channels specified during reset"));
+ return OI_STATUS_INVALID_PARAMETERS;
+ }
+
+ if (context->common.pcmStride < 1 || context->common.pcmStride > 2) {
+ ERROR(("PCM stride not set correctly during reset"));
+ return OI_STATUS_INVALID_PARAMETERS;
+ }
+
+ /*
+ * At this point a header has been read. However, it's possible that we found a false syncword,
+ * so the header data might be invalid. Make sure we have enough bytes to read in the
+ * CRC-protected header, but don't require we have the whole frame. That way, if it turns out
+ * that we're acting on bogus header data, we don't stall the decoding process by waiting for
+ * data that we don't actually need.
+ */
+ framelen = OI_CODEC_SBC_CalculateFramelen(&context->common.frameInfo);
+ if (*frameBytes < framelen) {
+ TRACE(("-OI_CODEC_SBC_DecodeFrame: OI_CODEC_SBC_NOT_ENOUGH_BODY_DATA"));
+ return OI_CODEC_SBC_NOT_ENOUGH_BODY_DATA;
+ }
+
+ TRACE(("Calculating checksum"));
+
+ crc = OI_SBC_CalculateChecksum(&context->common.frameInfo, *frameData);
+ if (crc != context->common.frameInfo.crc) {
+ TRACE(("CRC Mismatch: calc=%02x read=%02x\n", crc, context->common.frameInfo.crc));
+ TRACE(("-OI_CODEC_SBC_DecodeFrame: OI_CODEC_SBC_CHECKSUM_MISMATCH"));
+ return OI_CODEC_SBC_CHECKSUM_MISMATCH;
+ }
+
+#ifdef OI_DEBUG
+ /*
+ * Make sure the bitpool values are sane.
+ */
+ if ((context->common.frameInfo.bitpool < SBC_MIN_BITPOOL) && !context->common.frameInfo.enhanced) {
+ ERROR(("Bitpool too small: %d (must be >= 2)", context->common.frameInfo.bitpool));
+ return OI_STATUS_INVALID_PARAMETERS;
+ }
+ if (context->common.frameInfo.bitpool > OI_SBC_MaxBitpool(&context->common.frameInfo)) {
+ ERROR(("Bitpool too large: %d (must be <= %ld)", context->common.frameInfo.bitpool, OI_SBC_MaxBitpool(&context->common.frameInfo)));
+ return OI_STATUS_INVALID_PARAMETERS;
+ }
+#endif
+
+ /*
+ * Now decode the SBC data. Partial decode is not yet implemented for an SBC
+ * stream, so pass FALSE to decode body to have it enforce the old rule that
+ * you have to decode a whole packet at a time.
+ */
+ status = DecodeBody(context, *frameData + SBC_HEADER_LEN, pcmData, pcmBytes, FALSE);
+ if (OI_SUCCESS(status)) {
+ *frameData += framelen;
+ *frameBytes -= framelen;
+ }
+ TRACE(("-OI_CODEC_SBC_DecodeFrame: %d", status));
+
+ return status;
+}
+
+OI_STATUS OI_CODEC_SBC_SkipFrame(OI_CODEC_SBC_DECODER_CONTEXT *context,
+ const OI_BYTE **frameData,
+ OI_UINT32 *frameBytes)
+{
+ OI_STATUS status;
+ OI_UINT framelen;
+ OI_UINT headerlen;
+ OI_UINT8 crc;
+
+ status = FindSyncword(context, frameData, frameBytes);
+ if (!OI_SUCCESS(status)) {
+ return status;
+ }
+ if (*frameBytes < SBC_HEADER_LEN) {
+ return OI_CODEC_SBC_NOT_ENOUGH_HEADER_DATA;
+ }
+ OI_SBC_ReadHeader(&context->common, *frameData);
+ framelen = OI_SBC_CalculateFrameAndHeaderlen(&context->common.frameInfo, &headerlen);
+ if (*frameBytes < headerlen) {
+ return OI_CODEC_SBC_NOT_ENOUGH_HEADER_DATA;
+ }
+ crc = OI_SBC_CalculateChecksum(&context->common.frameInfo, *frameData);
+ if (crc != context->common.frameInfo.crc) {
+ return OI_CODEC_SBC_CHECKSUM_MISMATCH;
+ }
+ if (*frameBytes < framelen) {
+ return OI_CODEC_SBC_NOT_ENOUGH_BODY_DATA;
+ }
+ context->bufferedBlocks = 0;
+ *frameData += framelen;
+ *frameBytes -= framelen;
+ return OI_OK;
+}
+
+OI_UINT8 OI_CODEC_SBC_FrameCount(OI_BYTE *frameData,
+ OI_UINT32 frameBytes)
+{
+ OI_UINT8 mode;
+ OI_UINT8 blocks;
+ OI_UINT8 subbands;
+ OI_UINT8 frameCount = 0;
+ OI_UINT frameLen;
+
+ while (frameBytes){
+ while (frameBytes && ((frameData[0] & 0xFE) != 0x9C)){
+ frameData++;
+ frameBytes--;
+ }
+
+ if (frameBytes < SBC_HEADER_LEN) {
+ return frameCount;
+ }
+
+ /* Extract and translate required fields from Header */
+ subbands = mode = blocks = frameData[1];;
+ mode = (mode & (BIT3 | BIT2)) >> 2;
+ blocks = block_values[(blocks & (BIT5 | BIT4)) >> 4];
+ subbands = band_values[(subbands & BIT0)];
+
+ /* Inline logic to avoid corrupting context */
+ frameLen = blocks * frameData[2];
+ switch (mode){
+ case SBC_JOINT_STEREO:
+ frameLen += subbands + (8 * subbands);
+ break;
+
+ case SBC_DUAL_CHANNEL:
+ frameLen *= 2;
+ /* fall through */
+
+ default:
+ if (mode == SBC_MONO){
+ frameLen += 4*subbands;
+ } else {
+ frameLen += 8*subbands;
+ }
+ }
+
+ frameCount++;
+ frameLen = SBC_HEADER_LEN + (frameLen + 7) / 8;
+ if (frameBytes > frameLen){
+ frameBytes -= frameLen;
+ frameData += frameLen;
+ } else {
+ frameBytes = 0;
+ }
+ }
+ return frameCount;
+}
+
+/** Read quantized subband samples from the input bitstream and expand them. */
+
+#ifdef SPECIALIZE_READ_SAMPLES_JOINT
+
+PRIVATE void OI_SBC_ReadSamplesJoint4(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_BITSTREAM *global_bs)
+{
+#define NROF_SUBBANDS 4
+#include "readsamplesjoint.inc"
+#undef NROF_SUBBANDS
+}
+
+PRIVATE void OI_SBC_ReadSamplesJoint8(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_BITSTREAM *global_bs)
+{
+#define NROF_SUBBANDS 8
+#include "readsamplesjoint.inc"
+#undef NROF_SUBBANDS
+}
+
+typedef void (*READ_SAMPLES)(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_BITSTREAM *global_bs);
+
+static const READ_SAMPLES SpecializedReadSamples[] = {
+ OI_SBC_ReadSamplesJoint4,
+ OI_SBC_ReadSamplesJoint8
+};
+
+#endif /* SPECIALIZE_READ_SAMPLES_JOINT */
+
+
+PRIVATE void OI_SBC_ReadSamplesJoint(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_BITSTREAM *global_bs)
+{
+ OI_CODEC_SBC_COMMON_CONTEXT *common = &context->common;
+ OI_UINT nrof_subbands = common->frameInfo.nrof_subbands;
+#ifdef SPECIALIZE_READ_SAMPLES_JOINT
+ OI_ASSERT((nrof_subbands >> 3u) <= 1u);
+ SpecializedReadSamples[nrof_subbands >> 3](context, global_bs);
+#else
+
+#define NROF_SUBBANDS nrof_subbands
+#include "readsamplesjoint.inc"
+#undef NROF_SUBBANDS
+#endif /* SPECIALIZE_READ_SAMPLES_JOINT */
+}
+
+/**@}*/
+
diff --git a/embdrv/sbc/decoder/srce/dequant.c b/embdrv/sbc/decoder/srce/dequant.c
new file mode 100644
index 0000000..e06069c
--- /dev/null
+++ b/embdrv/sbc/decoder/srce/dequant.c
@@ -0,0 +1,210 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+/**********************************************************************************
+ $Revision: #1 $
+***********************************************************************************/
+
+/**
+ @file
+
+ Dequantizer for SBC decoder; reconstructs quantized representation of subband samples.
+
+ @ingroup codec_internal
+ */
+
+/**
+@addtogroup codec_internal
+@{
+*/
+
+/**
+ This function is a fixed-point approximation of a modification of the following
+ dequantization operation defined in the spec, as inferred from section 12.6.4:
+
+ @code
+ dequant = 2^(scale_factor+1) * ((raw * 2.0 + 1.0) / ((2^bits) - 1) - 1)
+
+ 2 <= bits <= 16
+ 0 <= raw < (2^bits)-1 (the -1 is because quantized values with all 1's are forbidden)
+
+ -65535 < dequant < 65535
+ @endcode
+
+ The code below computes the dequantized value divided by a scaling constant
+ equal to about 1.38. This constant is chosen to ensure that the entry in the
+ dequant_long_scaled table for 16 bits is as accurate as possible, since it has
+ the least relative precision available to it due to its small magnitude.
+
+ This routine outputs in Q16.15 format.
+
+ The helper array dequant_long is defined as follows:
+
+ @code
+ dequant_long_long[bits] = round(2^31 * 1/((2^bits - 1) / 1.38...) for 2 <= bits <= 16
+ @endcode
+
+
+ Additionally, the table entries have the following property:
+
+ @code
+ dequant_long_scaled[bits] <= 2^31 / ((2^bits - 1)) for 2 <= bits <= 16
+ @endcode
+
+ Therefore
+
+ @code
+ d = 2 * raw + 1 1 <= d <= 2^bits - 2
+
+ d' = d * dequant_long[bits]
+
+ d * dequant_long_scaled[bits] <= (2^bits - 2) * (2^31 / (2^bits - 1))
+ d * dequant_long_scaled[bits] <= 2^31 * (2^bits - 2)/(2^bits - 1) < 2^31
+ @endcode
+
+ Therefore, d' doesn't overflow a signed 32-bit value.
+
+ @code
+
+ d' =~ 2^31 * (raw * 2.0 + 1.0) / (2^bits - 1) / 1.38...
+
+ result = d' - 2^31/1.38... =~ 2^31 * ((raw * 2.0 + 1.0) / (2^bits - 1) - 1) / 1.38...
+
+ result is therefore a scaled approximation to dequant. It remains only to
+ turn 2^31 into 2^(scale_factor+1). Since we're aiming for Q16.15 format,
+ this is achieved by shifting right by (15-scale_factor):
+
+ (2^31 * x) >> (15-scale_factor) =~ 2^(31-15+scale_factor) * x = 2^15 * 2^(1+scale_factor) * x
+ @endcode
+
+ */
+
+#include <oi_codec_sbc_private.h>
+
+#ifndef SBC_DEQUANT_LONG_SCALED_OFFSET
+#define SBC_DEQUANT_LONG_SCALED_OFFSET 1555931970
+#endif
+
+#ifndef SBC_DEQUANT_LONG_UNSCALED_OFFSET
+#define SBC_DEQUANT_LONG_UNSCALED_OFFSET 2147483648
+#endif
+
+#ifndef SBC_DEQUANT_SCALING_FACTOR
+#define SBC_DEQUANT_SCALING_FACTOR 1.38019122262781f
+#endif
+
+const OI_UINT32 dequant_long_scaled[17];
+const OI_UINT32 dequant_long_unscaled[17];
+
+/** Scales x by y bits to the right, adding a rounding factor.
+ */
+#ifndef SCALE
+#define SCALE(x, y) (((x) + (1 <<((y)-1))) >> (y))
+#endif
+
+#ifdef DEBUG_DEQUANTIZATION
+
+#include <math.h>
+
+INLINE float dequant_float(OI_UINT32 raw, OI_UINT scale_factor, OI_UINT bits)
+{
+ float result = (1 << (scale_factor+1)) * ((raw * 2.0f + 1.0f) / ((1 << bits) - 1.0f) - 1.0f);
+
+ result /= SBC_DEQUANT_SCALING_FACTOR;
+
+ /* Unless the encoder screwed up, all correct dequantized values should
+ * satisfy this inequality. Non-compliant encoders which generate quantized
+ * values with all 1-bits set can, theoretically, trigger this assert. This
+ * is unlikely, however, and only an issue in debug mode.
+ */
+ OI_ASSERT(fabs(result) < 32768 * 1.6);
+
+ return result;
+}
+
+#endif
+
+
+INLINE OI_INT32 OI_SBC_Dequant(OI_UINT32 raw, OI_UINT scale_factor, OI_UINT bits)
+{
+ OI_UINT32 d;
+ OI_INT32 result;
+
+ OI_ASSERT(scale_factor <= 15);
+ OI_ASSERT(bits <= 16);
+
+ if (bits <= 1) {
+ return 0;
+ }
+
+ d = (raw * 2) + 1;
+ d *= dequant_long_scaled[bits];
+ result = d - SBC_DEQUANT_LONG_SCALED_OFFSET;
+
+#ifdef DEBUG_DEQUANTIZATION
+ {
+ OI_INT32 integerized_float_result;
+ float float_result;
+
+ float_result = dequant_float(raw, scale_factor, bits);
+ integerized_float_result = (OI_INT32)floor(0.5f+float_result * (1 << 15));
+
+ /* This detects overflow */
+ OI_ASSERT(((result >= 0) && (integerized_float_result >= 0)) ||
+ ((result <= 0) && (integerized_float_result <= 0)));
+ }
+#endif
+ return result >> (15 - scale_factor);
+}
+
+/* This version of Dequant does not incorporate the scaling factor of 1.38. It
+ * is intended for use with implementations of the filterbank which are
+ * hard-coded into a DSP. Output is Q16.4 format, so that after joint stereo
+ * processing (which leaves the most significant bit equal to the sign bit if
+ * the encoder is conformant) the result will fit a 24 bit fixed point signed
+ * value.*/
+
+INLINE OI_INT32 OI_SBC_Dequant_Unscaled(OI_UINT32 raw, OI_UINT scale_factor, OI_UINT bits)
+{
+ OI_UINT32 d;
+ OI_INT32 result;
+
+ OI_ASSERT(scale_factor <= 15);
+ OI_ASSERT(bits <= 16);
+
+
+ if (bits <= 1) {
+ return 0;
+ }
+ if (bits == 16) {
+ result = (raw << 16) + raw - 0x7fff7fff;
+ return SCALE(result, 24 - scale_factor);
+ }
+
+
+ d = (raw * 2) + 1;
+ d *= dequant_long_unscaled[bits];
+ result = d - 0x80000000;
+
+ return SCALE(result, 24 - scale_factor);
+}
+
+/**
+@}
+*/
diff --git a/embdrv/sbc/decoder/srce/framing-sbc.c b/embdrv/sbc/decoder/srce/framing-sbc.c
new file mode 100644
index 0000000..88cb2e2
--- /dev/null
+++ b/embdrv/sbc/decoder/srce/framing-sbc.c
@@ -0,0 +1,54 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+/**********************************************************************************
+ $Revision: #1 $
+***********************************************************************************/
+
+/** @file
+@ingroup codec_internal
+*/
+
+/**@addgroup codec_internal*/
+/**@{*/
+
+#include "oi_codec_sbc_private.h"
+
+const OI_CHAR* const OI_CODEC_SBC_FreqText[] = { "SBC_FREQ_16000", "SBC_FREQ_32000", "SBC_FREQ_44100", "SBC_FREQ_48000" };
+const OI_CHAR* const OI_CODEC_SBC_ModeText[] = { "SBC_MONO", "SBC_DUAL_CHANNEL", "SBC_STEREO", "SBC_JOINT_STEREO" };
+const OI_CHAR* const OI_CODEC_SBC_SubbandsText[] = { "SBC_SUBBANDS_4", "SBC_SUBBANDS_8" };
+const OI_CHAR* const OI_CODEC_SBC_BlocksText[] = { "SBC_BLOCKS_4", "SBC_BLOCKS_8", "SBC_BLOCKS_12", "SBC_BLOCKS_16" };
+const OI_CHAR* const OI_CODEC_SBC_AllocText[] = { "SBC_LOUDNESS", "SBC_SNR" };
+
+#ifdef OI_DEBUG
+void OI_CODEC_SBC_DumpConfig(OI_CODEC_SBC_FRAME_INFO *frameInfo)
+{
+ printf("SBC configuration\n");
+ printf(" enhanced: %s\n", frameInfo->enhanced ? "TRUE" : "FALSE");
+ printf(" frequency: %d\n", frameInfo->frequency);
+ printf(" subbands: %d\n", frameInfo->nrof_subbands);
+ printf(" blocks: %d\n", frameInfo->nrof_blocks);
+ printf(" channels: %d\n", frameInfo->nrof_channels);
+ printf(" mode: %s\n", OI_CODEC_SBC_ModeText[frameInfo->mode]);
+ printf(" alloc: %s\n", OI_CODEC_SBC_AllocText[frameInfo->alloc]);
+ printf(" bitpool: %d\n", frameInfo->bitpool);
+}
+#endif /* OI_DEBUG */
+
+/**@}*/
diff --git a/embdrv/sbc/decoder/srce/framing.c b/embdrv/sbc/decoder/srce/framing.c
new file mode 100644
index 0000000..c94ec90
--- /dev/null
+++ b/embdrv/sbc/decoder/srce/framing.c
@@ -0,0 +1,249 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+/**********************************************************************************
+ $Revision: #1 $
+***********************************************************************************/
+
+/**
+@file
+Checksum and header-related functions.
+
+@ingroup codec_internal
+*/
+
+/**
+@addtogroup codec_internal
+@{
+*/
+
+#include "oi_codec_sbc_private.h"
+#include "oi_assert.h"
+
+
+/* asdasd */
+
+#define USE_NIBBLEWISE_CRC
+
+/* #define PRINT_SAMPLES */
+/* #define PRINT_SCALEFACTORS */
+/* #define DEBUG_CRC */
+
+/*
+ * CRC-8 table for X^8 + X^4 + X^3 + X^2 + 1; byte-wise lookup
+ */
+#ifdef USE_WIDE_CRC
+/* Save space if a char is 16 bits, such as on the C54x */
+const OI_BYTE crc8_wide[128] = {
+ 0x001d, 0x3a27, 0x7469, 0x4e53, 0xe8f5, 0xd2cf, 0x9c81, 0xa6bb, 0xcdd0, 0xf7ea, 0xb9a4, 0x839e, 0x2538, 0x1f02, 0x514c, 0x6b76, 0x879a, 0xbda0, 0xf3ee, 0xc9d4, 0x6f72, 0x5548, 0x1b06, 0x213c, 0x4a57, 0x706d, 0x3e23, 0x0419, 0xa2bf, 0x9885, 0xd6cb, 0xecf1, 0x130e, 0x2934, 0x677a, 0x5d40, 0xfbe6, 0xc1dc, 0x8f92, 0xb5a8, 0xdec3, 0xe4f9, 0xaab7, 0x908d, 0x362b, 0x0c11, 0x425f, 0x7865, 0x9489, 0xaeb3, 0xe0fd, 0xdac7, 0x7c61, 0x465b, 0x0815, 0x322f, 0x5944, 0x637e, 0x2d30, 0x170a, 0xb1ac, 0x8b96, 0xc5d8, 0xffe2, 0x263b, 0x1c01, 0x524f, 0x6875, 0xced3, 0xf4e9, 0xbaa7, 0x809d, 0xebf6, 0xd1cc, 0x9f82, 0xa5b8, 0x031e, 0x3924, 0x776a, 0x4d50, 0xa1bc, 0x9b86, 0xd5c8, 0xeff2, 0x4954, 0x736e, 0x3d20, 0x071a, 0x6c71, 0x564b, 0x1805, 0x223f, 0x8499, 0xbea3, 0xf0ed, 0xcad7, 0x3528, 0x0f12, 0x415c, 0x7b66, 0xddc0, 0xe7fa, 0xa9b4, 0x938e, 0xf8e5, 0xc2df, 0x8c91, 0xb6ab, 0x100d, 0x2a37, 0x6479, 0x5e43, 0xb2af, 0x8895, 0xc6db, 0xfce1, 0x5a47, 0x607d, 0x2e33, 0x1409, 0x7f62, 0x4558, 0x0b16, 0x312c, 0x978a, 0xadb0, 0xe3fe, 0xd9c4,
+};
+#elif defined(USE_NIBBLEWISE_CRC)
+const OI_BYTE crc8_narrow[16] = {
+ 0x00, 0x1d, 0x3a, 0x27, 0x74, 0x69, 0x4e, 0x53, 0xe8, 0xf5, 0xd2, 0xcf, 0x9c, 0x81, 0xa6, 0xbb
+};
+#else
+const OI_BYTE crc8_narrow[256] = {
+ 0x00, 0x1d, 0x3a, 0x27, 0x74, 0x69, 0x4e, 0x53, 0xe8, 0xf5, 0xd2, 0xcf, 0x9c, 0x81, 0xa6, 0xbb, 0xcd, 0xd0, 0xf7, 0xea, 0xb9, 0xa4, 0x83, 0x9e, 0x25, 0x38, 0x1f, 0x02, 0x51, 0x4c, 0x6b, 0x76, 0x87, 0x9a, 0xbd, 0xa0, 0xf3, 0xee, 0xc9, 0xd4, 0x6f, 0x72, 0x55, 0x48, 0x1b, 0x06, 0x21, 0x3c, 0x4a, 0x57, 0x70, 0x6d, 0x3e, 0x23, 0x04, 0x19, 0xa2, 0xbf, 0x98, 0x85, 0xd6, 0xcb, 0xec, 0xf1, 0x13, 0x0e, 0x29, 0x34, 0x67, 0x7a, 0x5d, 0x40, 0xfb, 0xe6, 0xc1, 0xdc, 0x8f, 0x92, 0xb5, 0xa8, 0xde, 0xc3, 0xe4, 0xf9, 0xaa, 0xb7, 0x90, 0x8d, 0x36, 0x2b, 0x0c, 0x11, 0x42, 0x5f, 0x78, 0x65, 0x94, 0x89, 0xae, 0xb3, 0xe0, 0xfd, 0xda, 0xc7, 0x7c, 0x61, 0x46, 0x5b, 0x08, 0x15, 0x32, 0x2f, 0x59, 0x44, 0x63, 0x7e, 0x2d, 0x30, 0x17, 0x0a, 0xb1, 0xac, 0x8b, 0x96, 0xc5, 0xd8, 0xff, 0xe2, 0x26, 0x3b, 0x1c, 0x01, 0x52, 0x4f, 0x68, 0x75, 0xce, 0xd3, 0xf4, 0xe9, 0xba, 0xa7, 0x80, 0x9d, 0xeb, 0xf6, 0xd1, 0xcc, 0x9f, 0x82, 0xa5, 0xb8, 0x03, 0x1e, 0x39, 0x24, 0x77, 0x6a, 0x4d, 0x50, 0xa1, 0xbc, 0x9b, 0x86, 0xd5, 0xc8, 0xef, 0xf2, 0x49, 0x54, 0x73, 0x6e, 0x3d, 0x20, 0x07, 0x1a, 0x6c, 0x71, 0x56, 0x4b, 0x18, 0x05, 0x22, 0x3f, 0x84, 0x99, 0xbe, 0xa3, 0xf0, 0xed, 0xca, 0xd7, 0x35, 0x28, 0x0f, 0x12, 0x41, 0x5c, 0x7b, 0x66, 0xdd, 0xc0, 0xe7, 0xfa, 0xa9, 0xb4, 0x93, 0x8e, 0xf8, 0xe5, 0xc2, 0xdf, 0x8c, 0x91, 0xb6, 0xab, 0x10, 0x0d, 0x2a, 0x37, 0x64, 0x79, 0x5e, 0x43, 0xb2, 0xaf, 0x88, 0x95, 0xc6, 0xdb, 0xfc, 0xe1, 0x5a, 0x47, 0x60, 0x7d, 0x2e, 0x33, 0x14, 0x09, 0x7f, 0x62, 0x45, 0x58, 0x0b, 0x16, 0x31, 0x2c, 0x97, 0x8a, 0xad, 0xb0, 0xe3, 0xfe, 0xd9, 0xc4
+};
+#endif
+const OI_UINT32 dequant_long_scaled[17] = {
+ 0,
+ 0,
+ 0x1ee9e116, /* bits=2 0.24151243 1/3 * (1/1.38019122262781) (0x00000008)*/
+ 0x0d3fa99c, /* bits=3 0.10350533 1/7 * (1/1.38019122262781) (0x00000013)*/
+ 0x062ec69e, /* bits=4 0.04830249 1/15 * (1/1.38019122262781) (0x00000029)*/
+ 0x02fddbfa, /* bits=5 0.02337217 1/31 * (1/1.38019122262781) (0x00000055)*/
+ 0x0178d9f5, /* bits=6 0.01150059 1/63 * (1/1.38019122262781) (0x000000ad)*/
+ 0x00baf129, /* bits=7 0.00570502 1/127 * (1/1.38019122262781) (0x0000015e)*/
+ 0x005d1abe, /* bits=8 0.00284132 1/255 * (1/1.38019122262781) (0x000002bf)*/
+ 0x002e760d, /* bits=9 0.00141788 1/511 * (1/1.38019122262781) (0x00000582)*/
+ 0x00173536, /* bits=10 0.00070825 1/1023 * (1/1.38019122262781) (0x00000b07)*/
+ 0x000b9928, /* bits=11 0.00035395 1/2047 * (1/1.38019122262781) (0x00001612)*/
+ 0x0005cc37, /* bits=12 0.00017693 1/4095 * (1/1.38019122262781) (0x00002c27)*/
+ 0x0002e604, /* bits=13 0.00008846 1/8191 * (1/1.38019122262781) (0x00005852)*/
+ 0x000172fc, /* bits=14 0.00004422 1/16383 * (1/1.38019122262781) (0x0000b0a7)*/
+ 0x0000b97d, /* bits=15 0.00002211 1/32767 * (1/1.38019122262781) (0x00016150)*/
+ 0x00005cbe, /* bits=16 0.00001106 1/65535 * (1/1.38019122262781) (0x0002c2a5)*/
+};
+
+
+const OI_UINT32 dequant_long_unscaled[17] = {
+ 0,
+ 0,
+ 0x2aaaaaab, /* bits=2 0.33333333 1/3 (0x00000005)*/
+ 0x12492492, /* bits=3 0.14285714 1/7 (0x0000000e)*/
+ 0x08888889, /* bits=4 0.06666667 1/15 (0x0000001d)*/
+ 0x04210842, /* bits=5 0.03225806 1/31 (0x0000003e)*/
+ 0x02082082, /* bits=6 0.01587302 1/63 (0x0000007e)*/
+ 0x01020408, /* bits=7 0.00787402 1/127 (0x000000fe)*/
+ 0x00808081, /* bits=8 0.00392157 1/255 (0x000001fd)*/
+ 0x00402010, /* bits=9 0.00195695 1/511 (0x000003fe)*/
+ 0x00200802, /* bits=10 0.00097752 1/1023 (0x000007fe)*/
+ 0x00100200, /* bits=11 0.00048852 1/2047 (0x00000ffe)*/
+ 0x00080080, /* bits=12 0.00024420 1/4095 (0x00001ffe)*/
+ 0x00040020, /* bits=13 0.00012209 1/8191 (0x00003ffe)*/
+ 0x00020008, /* bits=14 0.00006104 1/16383 (0x00007ffe)*/
+ 0x00010002, /* bits=15 0.00003052 1/32767 (0x0000fffe)*/
+ 0x00008001, /* bits=16 0.00001526 1/65535 (0x0001fffc)*/
+};
+
+#if defined(OI_DEBUG) || defined(PRINT_SAMPLES) || defined(PRINT_SCALEFACTORS)
+#include <stdio.h>
+#endif
+
+#ifdef USE_WIDE_CRC
+INLINE OI_CHAR crc_iterate(OI_UINT8 oldcrc, OI_UINT8 next)
+{
+ OI_UINT crc;
+ OI_UINT idx;
+ idx = oldcrc^next;
+ crc = crc8_wide[idx >> 1];
+ if (idx%2) {
+ crc &= 0xff;
+ } else {
+ crc >>= 8;
+ }
+
+ return crc;
+}
+
+INLINE OI_CHAR crc_iterate_top4(OI_UINT8 oldcrc, OI_UINT8 next)
+{
+ OI_UINT crc;
+ OI_UINT idx;
+ idx = (oldcrc ^ next) >> 4;
+ crc = crc8_wide[idx>>1];
+ if (idx%2) {
+ crc &= 0xff;
+ } else {
+ crc >>= 8;
+ }
+
+ return (oldcrc << 4) ^ crc;
+}
+
+#else // USE_WIDE_CRC
+
+INLINE OI_UINT8 crc_iterate_top4(OI_UINT8 oldcrc, OI_UINT8 next)
+{
+ return (oldcrc << 4) ^ crc8_narrow[(oldcrc^next) >> 4];
+}
+
+#ifdef USE_NIBBLEWISE_CRC
+INLINE OI_UINT8 crc_iterate(OI_UINT8 crc, OI_UINT8 next)
+{
+ crc = (crc << 4) ^ crc8_narrow[(crc^next) >> 4];
+ crc = (crc << 4) ^ crc8_narrow[((crc>>4)^next)&0xf];
+
+ return crc;
+}
+
+#else // USE_NIBBLEWISE_CRC
+INLINE OI_UINT8 crc_iterate(OI_UINT8 crc, OI_UINT8 next)
+{
+ return crc8_narrow[crc^next];
+}
+
+#endif // USE_NIBBLEWISE_CRC
+
+#endif // USE_WIDE_CRC
+
+
+PRIVATE OI_UINT8 OI_SBC_CalculateChecksum(OI_CODEC_SBC_FRAME_INFO *frame, OI_BYTE const *data)
+{
+ OI_UINT i;
+ OI_UINT8 crc = 0x0f;
+ /* Count is the number of whole bytes subject to CRC. Actually, it's one
+ * more than this number, because data[3] is the CRC field itself, which is
+ * explicitly skipped. Since crc_iterate (should be) inlined, it's cheaper
+ * spacewise to include the check in the loop. This shouldn't be much of a
+ * bottleneck routine in the first place. */
+ OI_UINT count = (frame->nrof_subbands * frame->nrof_channels / 2u) + 4;
+
+ if (frame->mode == SBC_JOINT_STEREO && frame->nrof_subbands == 8) {
+ count++;
+ }
+
+ for (i = 1; i < count; i++) {
+ if (i != 3) {
+ crc = crc_iterate(crc,data[i]);
+ }
+ }
+
+ if (frame->mode == SBC_JOINT_STEREO && frame->nrof_subbands == 4) {
+ crc = crc_iterate_top4(crc, data[i]);
+ }
+
+ return crc;
+}
+
+void OI_SBC_ExpandFrameFields(OI_CODEC_SBC_FRAME_INFO *frame)
+{
+ frame->nrof_blocks = block_values[frame->blocks];
+ frame->nrof_subbands = band_values[frame->subbands];
+
+ frame->frequency = freq_values[frame->freqIndex];
+ frame->nrof_channels = channel_values[frame->mode];
+}
+
+/**
+ * Unrolled macro to copy 4 32-bit aligned 32-bit values backward in memory
+ */
+#define COPY4WORDS_BACK(_dest, _src) \
+ do { \
+ OI_INT32 _a, _b, _c, _d; \
+ _a = *--_src; \
+ _b = *--_src; \
+ _c = *--_src; \
+ _d = *--_src; \
+ *--_dest = _a; \
+ *--_dest = _b; \
+ *--_dest = _c; \
+ *--_dest = _d; \
+ } while (0)
+
+
+#if defined(USE_PLATFORM_MEMMOVE) || defined(USE_PLATFORM_MEMCPY)
+#include <string.h>
+#endif
+PRIVATE void shift_buffer(SBC_BUFFER_T *dest, SBC_BUFFER_T *src, OI_UINT wordCount)
+{
+#ifdef USE_PLATFORM_MEMMOVE
+ memmove(dest, src, wordCount * sizeof(SBC_BUFFER_T));
+#elif defined(USE_PLATFORM_MEMCPY)
+ OI_ASSERT(((OI_CHAR *)(dest) - (OI_CHAR *)(src)) >= wordCount*sizeof(*dest));
+ memcpy(dest, src, wordCount * sizeof(SBC_BUFFER_T));
+#else
+ OI_UINT n;
+ OI_INT32 *d;
+ OI_INT32 *s;
+ n = wordCount / 4 / (sizeof(OI_INT32)/sizeof(*dest));
+ OI_ASSERT((n * 4 * (sizeof(OI_INT32)/sizeof(*dest))) == wordCount);
+
+ d = (void*)(dest + wordCount);
+ s = (void*)(src + wordCount);
+
+ do {
+ COPY4WORDS_BACK(d, s);
+ } while (--n);
+#endif
+}
+/**
+@}
+*/
diff --git a/embdrv/sbc/decoder/srce/oi_codec_version.c b/embdrv/sbc/decoder/srce/oi_codec_version.c
new file mode 100644
index 0000000..25dc162
--- /dev/null
+++ b/embdrv/sbc/decoder/srce/oi_codec_version.c
@@ -0,0 +1,57 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2002 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+/**
+@file
+This file contains a single function, which returns a string indicating the
+version number of the eSBC codec
+
+@ingroup codec_internal
+*/
+
+/**
+@addtogroup codec_internal
+@{
+*/
+
+/**********************************************************************************
+ $Revision: #1 $
+***********************************************************************************/
+
+#include "oi_stddefs.h"
+#include "oi_codec_sbc_private.h"
+
+/** Version string for the BLUEmagic 3.0 protocol stack and profiles */
+PRIVATE OI_CHAR * const codecVersion = "v1.5"
+#ifdef OI_SBC_EVAL
+" (Evaluation version)"
+#endif
+;
+
+/** This function returns the version string for the BLUEmagic 3.0 protocol stack
+ and profiles */
+OI_CHAR *OI_CODEC_Version(void) {
+ return codecVersion;
+}
+
+/**********************************************************************************/
+
+/**
+@}
+*/
diff --git a/embdrv/sbc/decoder/srce/readsamplesjoint.inc b/embdrv/sbc/decoder/srce/readsamplesjoint.inc
new file mode 100644
index 0000000..875a394
--- /dev/null
+++ b/embdrv/sbc/decoder/srce/readsamplesjoint.inc
@@ -0,0 +1,111 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+/*******************************************************************************
+ * @file readsamplesjoint.inc
+ *
+ * This is the body of the generic version of OI_SBC_ReadSamplesJoint().
+ * It is designed to be \#included into a function as follows:
+ \code
+ void OI_SBC_ReadSamplesJoint4(OI_CODEC_SBC_COMMON_CONTEXT *common, OI_BITSTREAM *global_bs)
+ {
+ #define NROF_SUBBANDS 4
+ #include "readsamplesjoint.inc"
+ #undef NROF_SUBBANDS
+ }
+
+ void OI_SBC_ReadSamplesJoint8(OI_CODEC_SBC_COMMON_CONTEXT *common, OI_BITSTREAM *global_bs)
+ {
+ #define NROF_SUBBANDS 8
+ #include "readsamplesjoint.inc"
+ #undef NROF_SUBBANDS
+ }
+ \endcode
+ * Or to make a generic version:
+ \code
+ void OI_SBC_ReadSamplesJoint(OI_CODEC_SBC_COMMON_CONTEXT *common, OI_BITSTREAM *global_bs)
+ {
+ OI_UINT nrof_subbands = common->frameInfo.nrof_subbands;
+
+ #define NROF_SUBBANDS nrof_subbands
+ #include "readsamplesjoint.inc"
+ #undef NROF_SUBBANDS
+ }
+ \endcode
+ * @ingroup codec_internal
+ *******************************************************************************/
+
+/**********************************************************************************
+ $Revision: #1 $
+***********************************************************************************/
+
+{
+ OI_CODEC_SBC_COMMON_CONTEXT *common = &context->common;
+ OI_UINT bl = common->frameInfo.nrof_blocks;
+ OI_INT32 * RESTRICT s = common->subdata;
+ OI_UINT8 *ptr = global_bs->ptr.w;
+ OI_UINT32 value = global_bs->value;
+ OI_UINT bitPtr = global_bs->bitPtr;
+ OI_UINT8 jmask = common->frameInfo.join << (8 - NROF_SUBBANDS);
+
+ do {
+ OI_INT8 *sf_array = &common->scale_factor[0];
+ OI_UINT8 *bits_array = &common->bits.uint8[0];
+ OI_UINT8 joint = jmask;
+ OI_UINT sb;
+ /*
+ * Left channel
+ */
+ sb = NROF_SUBBANDS;
+ do {
+ OI_UINT32 raw;
+ OI_INT32 dequant;
+ OI_UINT8 bits = *bits_array++;
+ OI_INT sf = *sf_array++;
+
+ OI_BITSTREAM_READUINT(raw, bits, ptr, value, bitPtr);
+ dequant = OI_SBC_Dequant(raw, sf, bits);
+ *s++ = dequant;
+ } while (--sb);
+ /*
+ * Right channel
+ */
+ sb = NROF_SUBBANDS;
+ do {
+ OI_UINT32 raw;
+ OI_INT32 dequant;
+ OI_UINT8 bits = *bits_array++;
+ OI_INT sf = *sf_array++;
+
+ OI_BITSTREAM_READUINT(raw, bits, ptr, value, bitPtr);
+ dequant = OI_SBC_Dequant(raw, sf, bits);
+ /*
+ * Check if we need to do mid/side
+ */
+ if (joint & 0x80) {
+ OI_INT32 mid = *(s - NROF_SUBBANDS);
+ OI_INT32 side = dequant;
+ *(s - NROF_SUBBANDS) = mid + side;
+ dequant = mid - side;
+ }
+ joint <<= 1;
+ *s++ = dequant;
+ } while (--sb);
+ } while (--bl);
+}
diff --git a/embdrv/sbc/decoder/srce/synthesis-8-generated.c b/embdrv/sbc/decoder/srce/synthesis-8-generated.c
new file mode 100644
index 0000000..c33498e
--- /dev/null
+++ b/embdrv/sbc/decoder/srce/synthesis-8-generated.c
@@ -0,0 +1,135 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+/**
+ @file
+
+ DO NOT EDIT THIS FILE DIRECTLY
+
+ This file is automatically generated by the "synthesis-gen.pl" script.
+ Any changes to this generated file will be lost when the script is re-run.
+
+ These functions are called by functions in synthesis.c to perform the synthesis
+ filterbank computations for the SBC decoder.
+
+
+ */
+
+#include <oi_codec_sbc_private.h>
+
+#ifndef CLIP_INT16
+#define CLIP_INT16(x) do { if (x > OI_INT16_MAX) { x = OI_INT16_MAX; } else if (x < OI_INT16_MIN) { x = OI_INT16_MIN; } } while (0)
+#endif
+
+#define MUL_16S_16S(_x, _y) ((_x) * (_y))
+
+PRIVATE void SynthWindow80_generated(OI_INT16 *pcm, SBC_BUFFER_T const * RESTRICT buffer, OI_UINT strideShift)
+{
+ OI_INT32 pcm_a, pcm_b;
+ /* 1 - stage 0 */ pcm_b = 0;
+ /* 1 - stage 0 */ pcm_b +=(MUL_16S_16S(8235, buffer[ 12]))>> 3;
+ /* 1 - stage 0 */ pcm_b +=(MUL_16S_16S(-23167, buffer[ 20]))>> 3;
+ /* 1 - stage 0 */ pcm_b +=(MUL_16S_16S(26479, buffer[ 28]))>> 2;
+ /* 1 - stage 0 */ pcm_b +=(MUL_16S_16S(-17397, buffer[ 36]))<< 1;
+ /* 1 - stage 0 */ pcm_b +=(MUL_16S_16S(9399, buffer[ 44]))<< 3;
+ /* 1 - stage 0 */ pcm_b +=(MUL_16S_16S(17397, buffer[ 52]))<< 1;
+ /* 1 - stage 0 */ pcm_b +=(MUL_16S_16S(26479, buffer[ 60]))>> 2;
+ /* 1 - stage 0 */ pcm_b +=(MUL_16S_16S(23167, buffer[ 68]))>> 3;
+ /* 1 - stage 0 */ pcm_b +=(MUL_16S_16S(8235, buffer[ 76]))>> 3;
+ /* 1 - stage 0 */ pcm_b /= 32768; CLIP_INT16(pcm_b); pcm[0<<strideShift] = (OI_INT16)pcm_b;
+ /* 1 - stage 1 */ pcm_a = 0;
+ /* 1 - stage 1 */ pcm_b = 0;
+ /* 1 - stage 1 */ pcm_a +=(MUL_16S_16S(-3263, buffer[ 5]))>> 5;
+ /* 1 - stage 1 */ pcm_b +=(MUL_16S_16S(9293, buffer[ 5]))>> 3;
+ /* 1 - stage 1 */ pcm_a +=(MUL_16S_16S(29293, buffer[ 11]))>> 5;
+ /* 1 - stage 1 */ pcm_b +=(MUL_16S_16S(-6087, buffer[ 11]))>> 2;
+ /* 1 - stage 1 */ pcm_a +=(MUL_16S_16S(-5229, buffer[ 21]));
+ /* 1 - stage 1 */ pcm_b +=(MUL_16S_16S(1247, buffer[ 21]))<< 3;
+ /* 1 - stage 1 */ pcm_a +=(MUL_16S_16S(30835, buffer[ 27]))>> 3;
+ /* 1 - stage 1 */ pcm_b +=(MUL_16S_16S(-2893, buffer[ 27]))<< 3;
+ /* 1 - stage 1 */ pcm_a +=(MUL_16S_16S(-27021, buffer[ 37]))<< 1;
+ /* 1 - stage 1 */ pcm_b +=(MUL_16S_16S(23671, buffer[ 37]))<< 2;
+ /* 1 - stage 1 */ pcm_a +=(MUL_16S_16S(31633, buffer[ 43]))<< 1;
+ /* 1 - stage 1 */ pcm_b +=(MUL_16S_16S(18055, buffer[ 43]))<< 1;
+ /* 1 - stage 1 */ pcm_a +=(MUL_16S_16S(17319, buffer[ 53]))<< 1;
+ /* 1 - stage 1 */ pcm_b +=(MUL_16S_16S(11537, buffer[ 53]))>> 1;
+ /* 1 - stage 1 */ pcm_a +=(MUL_16S_16S(26663, buffer[ 59]))>> 2;
+ /* 1 - stage 1 */ pcm_b +=(MUL_16S_16S(1747, buffer[ 59]))<< 1;
+ /* 1 - stage 1 */ pcm_a +=(MUL_16S_16S(4555, buffer[ 69]))>> 1;
+ /* 1 - stage 1 */ pcm_b +=(MUL_16S_16S(685, buffer[ 69]))<< 1;
+ /* 1 - stage 1 */ pcm_a +=(MUL_16S_16S(12419, buffer[ 75]))>> 4;
+ /* 1 - stage 1 */ pcm_b +=(MUL_16S_16S(8721, buffer[ 75]))>> 7;
+ /* 1 - stage 1 */ pcm_a /= 32768; CLIP_INT16(pcm_a); pcm[1<<strideShift] = (OI_INT16)pcm_a;
+ /* 1 - stage 1 */ pcm_b /= 32768; CLIP_INT16(pcm_b); pcm[7<<strideShift] = (OI_INT16)pcm_b;
+ /* 1 - stage 2 */ pcm_a = 0;
+ /* 1 - stage 2 */ pcm_b = 0;
+ /* 1 - stage 2 */ pcm_a +=(MUL_16S_16S(-10385, buffer[ 6]))>> 6;
+ /* 1 - stage 2 */ pcm_b +=(MUL_16S_16S(11167, buffer[ 6]))>> 4;
+ /* 1 - stage 2 */ pcm_a +=(MUL_16S_16S(24995, buffer[ 10]))>> 5;
+ /* 1 - stage 2 */ pcm_b +=(MUL_16S_16S(-10337, buffer[ 10]))>> 4;
+ /* 1 - stage 2 */ pcm_a +=(MUL_16S_16S(-309, buffer[ 22]))<< 4;
+ /* 1 - stage 2 */ pcm_b +=(MUL_16S_16S(1917, buffer[ 22]))<< 2;
+ /* 1 - stage 2 */ pcm_a +=(MUL_16S_16S(9161, buffer[ 26]))>> 3;
+ /* 1 - stage 2 */ pcm_b +=(MUL_16S_16S(-30605, buffer[ 26]))>> 1;
+ /* 1 - stage 2 */ pcm_a +=(MUL_16S_16S(-23063, buffer[ 38]))<< 1;
+ /* 1 - stage 2 */ pcm_b +=(MUL_16S_16S(8317, buffer[ 38]))<< 3;
+ /* 1 - stage 2 */ pcm_a +=(MUL_16S_16S(27561, buffer[ 42]))<< 1;
+ /* 1 - stage 2 */ pcm_b +=(MUL_16S_16S(9553, buffer[ 42]))<< 2;
+ /* 1 - stage 2 */ pcm_a +=(MUL_16S_16S(2309, buffer[ 54]))<< 3;
+ /* 1 - stage 2 */ pcm_b +=(MUL_16S_16S(22117, buffer[ 54]))>> 4;
+ /* 1 - stage 2 */ pcm_a +=(MUL_16S_16S(12705, buffer[ 58]))>> 1;
+ /* 1 - stage 2 */ pcm_b +=(MUL_16S_16S(16383, buffer[ 58]))>> 2;
+ /* 1 - stage 2 */ pcm_a +=(MUL_16S_16S(6239, buffer[ 70]))>> 3;
+ /* 1 - stage 2 */ pcm_b +=(MUL_16S_16S(7543, buffer[ 70]))>> 3;
+ /* 1 - stage 2 */ pcm_a +=(MUL_16S_16S(9251, buffer[ 74]))>> 4;
+ /* 1 - stage 2 */ pcm_b +=(MUL_16S_16S(8603, buffer[ 74]))>> 6;
+ /* 1 - stage 2 */ pcm_a /= 32768; CLIP_INT16(pcm_a); pcm[2<<strideShift] = (OI_INT16)pcm_a;
+ /* 1 - stage 2 */ pcm_b /= 32768; CLIP_INT16(pcm_b); pcm[6<<strideShift] = (OI_INT16)pcm_b;
+ /* 1 - stage 3 */ pcm_a = 0;
+ /* 1 - stage 3 */ pcm_b = 0;
+ /* 1 - stage 3 */ pcm_a +=(MUL_16S_16S(-16457, buffer[ 7]))>> 6;
+ /* 1 - stage 3 */ pcm_b +=(MUL_16S_16S(16913, buffer[ 7]))>> 5;
+ /* 1 - stage 3 */ pcm_a +=(MUL_16S_16S(19083, buffer[ 9]))>> 5;
+ /* 1 - stage 3 */ pcm_b +=(MUL_16S_16S(-8443, buffer[ 9]))>> 7;
+ /* 1 - stage 3 */ pcm_a +=(MUL_16S_16S(-23641, buffer[ 23]))>> 2;
+ /* 1 - stage 3 */ pcm_b +=(MUL_16S_16S(3687, buffer[ 23]))<< 1;
+ /* 1 - stage 3 */ pcm_a +=(MUL_16S_16S(-29015, buffer[ 25]))>> 4;
+ /* 1 - stage 3 */ pcm_b +=(MUL_16S_16S(-301, buffer[ 25]))<< 5;
+ /* 1 - stage 3 */ pcm_a +=(MUL_16S_16S(-12889, buffer[ 39]))<< 2;
+ /* 1 - stage 3 */ pcm_b +=(MUL_16S_16S(15447, buffer[ 39]))<< 2;
+ /* 1 - stage 3 */ pcm_a +=(MUL_16S_16S(6145, buffer[ 41]))<< 3;
+ /* 1 - stage 3 */ pcm_b +=(MUL_16S_16S(10255, buffer[ 41]))<< 2;
+ /* 1 - stage 3 */ pcm_a +=(MUL_16S_16S(24211, buffer[ 55]))>> 1;
+ /* 1 - stage 3 */ pcm_b +=(MUL_16S_16S(-18233, buffer[ 55]))>> 3;
+ /* 1 - stage 3 */ pcm_a +=(MUL_16S_16S(23469, buffer[ 57]))>> 2;
+ /* 1 - stage 3 */ pcm_b +=(MUL_16S_16S(9405, buffer[ 57]))>> 1;
+ /* 1 - stage 3 */ pcm_a +=(MUL_16S_16S(21223, buffer[ 71]))>> 8;
+ /* 1 - stage 3 */ pcm_b +=(MUL_16S_16S(1499, buffer[ 71]))>> 1;
+ /* 1 - stage 3 */ pcm_a +=(MUL_16S_16S(26913, buffer[ 73]))>> 6;
+ /* 1 - stage 3 */ pcm_b +=(MUL_16S_16S(26189, buffer[ 73]))>> 7;
+ /* 1 - stage 3 */ pcm_a /= 32768; CLIP_INT16(pcm_a); pcm[3<<strideShift] = (OI_INT16)pcm_a;
+ /* 1 - stage 3 */ pcm_b /= 32768; CLIP_INT16(pcm_b); pcm[5<<strideShift] = (OI_INT16)pcm_b;
+ /* 1 - stage 4 */ pcm_a = 0;
+ /* 1 - stage 4 */ pcm_a +=(MUL_16S_16S(10445, buffer[ 8]))>> 4;
+ /* 1 - stage 4 */ pcm_a +=(MUL_16S_16S(-5297, buffer[ 24]))<< 1;
+ /* 1 - stage 4 */ pcm_a +=(MUL_16S_16S(22299, buffer[ 40]))<< 2;
+ /* 1 - stage 4 */ pcm_a +=(MUL_16S_16S(10603, buffer[ 56]));
+ /* 1 - stage 4 */ pcm_a +=(MUL_16S_16S(9539, buffer[ 72]))>> 4;
+ /* 1 - stage 4 */ pcm_a /= 32768; CLIP_INT16(pcm_a); pcm[4<<strideShift] = (OI_INT16)pcm_a;
+}
diff --git a/embdrv/sbc/decoder/srce/synthesis-dct8.c b/embdrv/sbc/decoder/srce/synthesis-dct8.c
new file mode 100644
index 0000000..4280758
--- /dev/null
+++ b/embdrv/sbc/decoder/srce/synthesis-dct8.c
@@ -0,0 +1,305 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+/**********************************************************************************
+ $Revision: #1 $
+***********************************************************************************/
+
+/** @file
+@ingroup codec_internal
+*/
+
+/**@addgroup codec_internal*/
+/**@{*/
+
+/*
+ * Performs an 8-point Type-II scaled DCT using the Arai-Agui-Nakajima
+ * factorization. The scaling factors are folded into the windowing
+ * constants. 29 adds and 5 16x32 multiplies per 8 samples.
+ */
+
+#include "oi_codec_sbc_private.h"
+
+#define AAN_C4_FIX (759250125)/* S1.30 759250125 0.707107*/
+
+#define AAN_C6_FIX (410903207)/* S1.30 410903207 0.382683*/
+
+#define AAN_Q0_FIX (581104888)/* S1.30 581104888 0.541196*/
+
+#define AAN_Q1_FIX (1402911301)/* S1.30 1402911301 1.306563*/
+
+/** Scales x by y bits to the right, adding a rounding factor.
+ */
+#ifndef SCALE
+#define SCALE(x, y) (((x) + (1 <<((y)-1))) >> (y))
+#endif
+
+/**
+ * Default C language implementation of a 32x32->32 multiply. This function may
+ * be replaced by a platform-specific version for speed.
+ *
+ * @param u A signed 32-bit multiplicand
+ * @param v A signed 32-bit multiplier
+
+ * @return A signed 32-bit value corresponding to the 32 most significant bits
+ * of the 64-bit product of u and v.
+ */
+INLINE OI_INT32 default_mul_32s_32s_hi(OI_INT32 u, OI_INT32 v)
+{
+ OI_UINT32 u0, v0;
+ OI_INT32 u1, v1, w1, w2, t;
+
+ u0 = u & 0xFFFF; u1 = u >> 16;
+ v0 = v & 0xFFFF; v1 = v >> 16;
+ t = u0*v0;
+ t = u1*v0 + ((OI_UINT32)t >> 16);
+ w1 = t & 0xFFFF;
+ w2 = t >> 16;
+ w1 = u0*v1 + w1;
+ return u1*v1 + w2 + (w1 >> 16);
+}
+
+#define MUL_32S_32S_HI(_x, _y) default_mul_32s_32s_hi(_x, _y)
+
+
+#ifdef DEBUG_DCT
+PRIVATE void float_dct2_8(float * RESTRICT out, OI_INT32 const *RESTRICT in)
+{
+#define FIX(x,bits) (((int)floor(0.5f+((x)*((float)(1<<bits)))))/((float)(1<<bits)))
+#define FLOAT_BUTTERFLY(x,y) x += y; y = x - (y*2); OI_ASSERT(VALID_INT32(x)); OI_ASSERT(VALID_INT32(y));
+#define FLOAT_MULT_DCT(K, sample) (FIX(K,20) * sample)
+#define FLOAT_SCALE(x, y) (((x) / (double)(1 << (y))))
+
+ double L00,L01,L02,L03,L04,L05,L06,L07;
+ double L25;
+
+ double in0,in1,in2,in3;
+ double in4,in5,in6,in7;
+
+ in0 = FLOAT_SCALE(in[0], DCTII_8_SHIFT_IN); OI_ASSERT(VALID_INT32(in0));
+ in1 = FLOAT_SCALE(in[1], DCTII_8_SHIFT_IN); OI_ASSERT(VALID_INT32(in1));
+ in2 = FLOAT_SCALE(in[2], DCTII_8_SHIFT_IN); OI_ASSERT(VALID_INT32(in2));
+ in3 = FLOAT_SCALE(in[3], DCTII_8_SHIFT_IN); OI_ASSERT(VALID_INT32(in3));
+ in4 = FLOAT_SCALE(in[4], DCTII_8_SHIFT_IN); OI_ASSERT(VALID_INT32(in4));
+ in5 = FLOAT_SCALE(in[5], DCTII_8_SHIFT_IN); OI_ASSERT(VALID_INT32(in5));
+ in6 = FLOAT_SCALE(in[6], DCTII_8_SHIFT_IN); OI_ASSERT(VALID_INT32(in6));
+ in7 = FLOAT_SCALE(in[7], DCTII_8_SHIFT_IN); OI_ASSERT(VALID_INT32(in7));
+
+ L00 = (in0 + in7); OI_ASSERT(VALID_INT32(L00));
+ L01 = (in1 + in6); OI_ASSERT(VALID_INT32(L01));
+ L02 = (in2 + in5); OI_ASSERT(VALID_INT32(L02));
+ L03 = (in3 + in4); OI_ASSERT(VALID_INT32(L03));
+
+ L04 = (in3 - in4); OI_ASSERT(VALID_INT32(L04));
+ L05 = (in2 - in5); OI_ASSERT(VALID_INT32(L05));
+ L06 = (in1 - in6); OI_ASSERT(VALID_INT32(L06));
+ L07 = (in0 - in7); OI_ASSERT(VALID_INT32(L07));
+
+ FLOAT_BUTTERFLY(L00, L03);
+ FLOAT_BUTTERFLY(L01, L02);
+
+ L02 += L03; OI_ASSERT(VALID_INT32(L02));
+
+ L02 = FLOAT_MULT_DCT(AAN_C4_FLOAT, L02); OI_ASSERT(VALID_INT32(L02));
+
+ FLOAT_BUTTERFLY(L00, L01);
+
+ out[0] = (float)FLOAT_SCALE(L00, DCTII_8_SHIFT_0); OI_ASSERT(VALID_INT16(out[0]));
+ out[4] = (float)FLOAT_SCALE(L01, DCTII_8_SHIFT_4); OI_ASSERT(VALID_INT16(out[4]));
+
+ FLOAT_BUTTERFLY(L03, L02);
+ out[6] = (float)FLOAT_SCALE(L02, DCTII_8_SHIFT_6); OI_ASSERT(VALID_INT16(out[6]));
+ out[2] = (float)FLOAT_SCALE(L03, DCTII_8_SHIFT_2); OI_ASSERT(VALID_INT16(out[2]));
+
+ L04 += L05; OI_ASSERT(VALID_INT32(L04));
+ L05 += L06; OI_ASSERT(VALID_INT32(L05));
+ L06 += L07; OI_ASSERT(VALID_INT32(L06));
+
+ L04/=2;
+ L05/=2;
+ L06/=2;
+ L07/=2;
+
+ L05 = FLOAT_MULT_DCT(AAN_C4_FLOAT, L05); OI_ASSERT(VALID_INT32(L05));
+
+ L25 = L06 - L04; OI_ASSERT(VALID_INT32(L25));
+ L25 = FLOAT_MULT_DCT(AAN_C6_FLOAT, L25); OI_ASSERT(VALID_INT32(L25));
+
+ L04 = FLOAT_MULT_DCT(AAN_Q0_FLOAT, L04); OI_ASSERT(VALID_INT32(L04));
+ L04 -= L25; OI_ASSERT(VALID_INT32(L04));
+
+ L06 = FLOAT_MULT_DCT(AAN_Q1_FLOAT, L06); OI_ASSERT(VALID_INT32(L06));
+ L06 -= L25; OI_ASSERT(VALID_INT32(L25));
+
+ FLOAT_BUTTERFLY(L07, L05);
+
+ FLOAT_BUTTERFLY(L05, L04);
+ out[3] = (float)(FLOAT_SCALE(L04, DCTII_8_SHIFT_3-1)); OI_ASSERT(VALID_INT16(out[3]));
+ out[5] = (float)(FLOAT_SCALE(L05, DCTII_8_SHIFT_5-1)); OI_ASSERT(VALID_INT16(out[5]));
+
+ FLOAT_BUTTERFLY(L07, L06);
+ out[7] = (float)(FLOAT_SCALE(L06, DCTII_8_SHIFT_7-1)); OI_ASSERT(VALID_INT16(out[7]));
+ out[1] = (float)(FLOAT_SCALE(L07, DCTII_8_SHIFT_1-1)); OI_ASSERT(VALID_INT16(out[1]));
+}
+#undef BUTTERFLY
+#endif
+
+
+/*
+ * This function calculates the AAN DCT. Its inputs are in S16.15 format, as
+ * returned by OI_SBC_Dequant. In practice, abs(in[x]) < 52429.0 / 1.38
+ * (1244918057 integer). The function it computes is an approximation to the array defined
+ * by:
+ *
+ * diag(aan_s) * AAN= C2
+ *
+ * or
+ *
+ * AAN = diag(1/aan_s) * C2
+ *
+ * where C2 is as it is defined in the comment at the head of this file, and
+ *
+ * aan_s[i] = aan_s = 1/(2*cos(i*pi/16)) with i = 1..7, aan_s[0] = 1;
+ *
+ * aan_s[i] = [ 1.000 0.510 0.541 0.601 0.707 0.900 1.307 2.563 ]
+ *
+ * The output ranges are shown as follows:
+ *
+ * Let Y[0..7] = AAN * X[0..7]
+ *
+ * Without loss of generality, assume the input vector X consists of elements
+ * between -1 and 1. The maximum possible value of a given output element occurs
+ * with some particular combination of input vector elements each of which is -1
+ * or 1. Consider the computation of Y[i]. Y[i] = sum t=0..7 of AAN[t,i]*X[i]. Y is
+ * maximized if the sign of X[i] matches the sign of AAN[t,i], ensuring a
+ * positive contribution to the sum. Equivalently, one may simply sum
+ * abs(AAN)[t,i] over t to get the maximum possible value of Y[i].
+ *
+ * This yields approximately [8.00 10.05 9.66 8.52 8.00 5.70 4.00 2.00]
+ *
+ * Given the maximum magnitude sensible input value of +/-37992, this yields the
+ * following vector of maximum output magnitudes:
+ *
+ * [ 303936 381820 367003 323692 303936 216555 151968 75984 ]
+ *
+ * Ultimately, these values must fit into 16 bit signed integers, so they must
+ * be scaled. A non-uniform scaling helps maximize the kept precision. The
+ * relative number of extra bits of precision maintainable with respect to the
+ * largest value is given here:
+ *
+ * [ 0 0 0 0 0 0 1 2 ]
+ *
+ */
+PRIVATE void dct2_8(SBC_BUFFER_T * RESTRICT out, OI_INT32 const *RESTRICT in)
+{
+#define BUTTERFLY(x,y) x += y; y = x - (y<<1);
+#define FIX_MULT_DCT(K, x) (MUL_32S_32S_HI(K,x)<<2)
+
+ OI_INT32 L00,L01,L02,L03,L04,L05,L06,L07;
+ OI_INT32 L25;
+
+ OI_INT32 in0,in1,in2,in3;
+ OI_INT32 in4,in5,in6,in7;
+
+#if DCTII_8_SHIFT_IN != 0
+ in0 = SCALE(in[0], DCTII_8_SHIFT_IN);
+ in1 = SCALE(in[1], DCTII_8_SHIFT_IN);
+ in2 = SCALE(in[2], DCTII_8_SHIFT_IN);
+ in3 = SCALE(in[3], DCTII_8_SHIFT_IN);
+ in4 = SCALE(in[4], DCTII_8_SHIFT_IN);
+ in5 = SCALE(in[5], DCTII_8_SHIFT_IN);
+ in6 = SCALE(in[6], DCTII_8_SHIFT_IN);
+ in7 = SCALE(in[7], DCTII_8_SHIFT_IN);
+#else
+ in0 = in[0];
+ in1 = in[1];
+ in2 = in[2];
+ in3 = in[3];
+ in4 = in[4];
+ in5 = in[5];
+ in6 = in[6];
+ in7 = in[7];
+#endif
+
+ L00 = in0 + in7;
+ L01 = in1 + in6;
+ L02 = in2 + in5;
+ L03 = in3 + in4;
+
+ L04 = in3 - in4;
+ L05 = in2 - in5;
+ L06 = in1 - in6;
+ L07 = in0 - in7;
+
+ BUTTERFLY(L00, L03);
+ BUTTERFLY(L01, L02);
+
+ L02 += L03;
+
+ L02 = FIX_MULT_DCT(AAN_C4_FIX, L02);
+
+ BUTTERFLY(L00, L01);
+
+ out[0] = (OI_INT16)SCALE(L00, DCTII_8_SHIFT_0);
+ out[4] = (OI_INT16)SCALE(L01, DCTII_8_SHIFT_4);
+
+ BUTTERFLY(L03, L02);
+ out[6] = (OI_INT16)SCALE(L02, DCTII_8_SHIFT_6);
+ out[2] = (OI_INT16)SCALE(L03, DCTII_8_SHIFT_2);
+
+ L04 += L05;
+ L05 += L06;
+ L06 += L07;
+
+ L04/=2;
+ L05/=2;
+ L06/=2;
+ L07/=2;
+
+ L05 = FIX_MULT_DCT(AAN_C4_FIX, L05);
+
+ L25 = L06 - L04;
+ L25 = FIX_MULT_DCT(AAN_C6_FIX, L25);
+
+ L04 = FIX_MULT_DCT(AAN_Q0_FIX, L04);
+ L04 -= L25;
+
+ L06 = FIX_MULT_DCT(AAN_Q1_FIX, L06);
+ L06 -= L25;
+
+ BUTTERFLY(L07, L05);
+
+ BUTTERFLY(L05, L04);
+ out[3] = (OI_INT16)SCALE(L04, DCTII_8_SHIFT_3-1);
+ out[5] = (OI_INT16)SCALE(L05, DCTII_8_SHIFT_5-1);
+
+ BUTTERFLY(L07, L06);
+ out[7] = (OI_INT16)SCALE(L06, DCTII_8_SHIFT_7-1);
+ out[1] = (OI_INT16)SCALE(L07, DCTII_8_SHIFT_1-1);
+#undef BUTTERFLY
+
+#ifdef DEBUG_DCT
+ {
+ float float_out[8];
+ float_dct2_8(float_out, in);
+ }
+#endif
+}
+
+/**@}*/
diff --git a/embdrv/sbc/decoder/srce/synthesis-sbc.c b/embdrv/sbc/decoder/srce/synthesis-sbc.c
new file mode 100644
index 0000000..38c6f17
--- /dev/null
+++ b/embdrv/sbc/decoder/srce/synthesis-sbc.c
@@ -0,0 +1,510 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+/**********************************************************************************
+ $Revision: #1 $
+***********************************************************************************/
+
+/** @file
+
+This file, along with synthesis-generated.c, contains the synthesis
+filterbank routines. The operations performed correspond to the
+operations described in A2DP Appendix B, Figure 12.3. Several
+mathematical optimizations are performed, particularly for the
+8-subband case.
+
+One important optimization is to note that the "matrixing" operation
+can be decomposed into the product of a type II discrete cosine kernel
+and another, sparse matrix.
+
+According to Fig 12.3, in the 8-subband case,
+@code
+ N[k][i] = cos((i+0.5)*(k+4)*pi/8), k = 0..15 and i = 0..7
+@endcode
+
+N can be factored as R * C2, where C2 is an 8-point type II discrete
+cosine kernel given by
+@code
+ C2[k][i] = cos((i+0.5)*k*pi/8)), k = 0..7 and i = 0..7
+@endcode
+
+R turns out to be a sparse 16x8 matrix with the following non-zero
+entries:
+@code
+ R[k][k+4] = 1, k = 0..3
+ R[k][abs(12-k)] = -1, k = 5..15
+@endcode
+
+The spec describes computing V[0..15] as N * R.
+@code
+ V[0..15] = N * R = (R * C2) * R = R * (C2 * R)
+@endcode
+
+C2 * R corresponds to computing the discrete cosine transform of R, so
+V[0..15] can be computed by taking the DCT of R followed by assignment
+and selective negation of the DCT result into V.
+
+ Although this was derived empirically using GNU Octave, it is
+ formally demonstrated in, e.g., Liu, Chi-Min and Lee,
+ Wen-Chieh. "A Unified Fast Algorithm for Cosine Modulated
+ Filter Banks in Current Audio Coding Standards." Journal of
+ the AES 47 (December 1999): 1061.
+
+Given the shift operation performed prior to computing V[0..15], it is
+clear that V[0..159] represents a rolling history of the 10 most
+recent groups of blocks input to the synthesis operation. Interpreting
+the matrix N in light of its factorization into C2 and R, R's
+sparseness has implications for interpreting the values in V. In
+particular, there is considerable redundancy in the values stored in
+V. Furthermore, since R[4][0..7] are all zeros, one out of every 16
+values in V will be zero regardless of the input data. Within each
+block of 16 values in V, fully half of them are redundant or
+irrelevant:
+
+@code
+ V[ 0] = DCT[4]
+ V[ 1] = DCT[5]
+ V[ 2] = DCT[6]
+ V[ 3] = DCT[7]
+ V[ 4] = 0
+ V[ 5] = -DCT[7] = -V[3] (redundant)
+ V[ 6] = -DCT[6] = -V[2] (redundant)
+ V[ 7] = -DCT[5] = -V[1] (redundant)
+ V[ 8] = -DCT[4] = -V[0] (redundant)
+ V[ 9] = -DCT[3]
+ V[10] = -DCT[2]
+ V[11] = -DCT[1]
+ V[12] = -DCT[0]
+ V[13] = -DCT[1] = V[11] (redundant)
+ V[14] = -DCT[2] = V[10] (redundant)
+ V[15] = -DCT[3] = V[ 9] (redundant)
+@endcode
+
+Since the elements of V beyond 15 were originally computed the same
+way during a previous run, what holds true for V[x] also holds true
+for V[x+16]. Thus, so long as care is taken to maintain the mapping,
+we need only actually store the unique values, which correspond to the
+output of the DCT, in some cases inverted. In fact, instead of storing
+V[0..159], we could store DCT[0..79] which would contain a history of
+DCT results. More on this in a bit.
+
+Going back to figure 12.3 in the spec, it should be clear that the
+vector U need not actually be explicitly constructed, but that with
+suitable indexing into V during the window operation, the same end can
+be accomplished. In the same spirit of the pseudocode shown in the
+figure, the following is the construction of W without using U:
+
+@code
+ for i=0 to 79 do
+ W[i] = D[i]*VSIGN(i)*V[remap_V(i)] where remap_V(i) = 32*(int(i/16)) + (i % 16) + (i % 16 >= 8 ? 16 : 0)
+ and VSIGN(i) maps i%16 into {1, 1, 1, 1, 0, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1 }
+ These values correspond to the
+ signs of the redundant values as
+ shown in the explanation three
+ paragraphs above.
+@endcode
+
+We saw above how V[4..8,13..15] (and by extension
+V[(4..8,13..15)+16*n]) can be defined in terms of other elements
+within the subblock of V. V[0..3,9..12] correspond to DCT elements.
+
+@code
+ for i=0 to 79 do
+ W[i] = D[i]*DSIGN(i)*DCT[remap_DCT(i)]
+@endcode
+
+The DCT is calculated using the Arai-Agui-Nakajima factorization,
+which saves some computation by producing output that needs to be
+multiplied by scaling factors before being used.
+
+@code
+ for i=0 to 79 do
+ W[i] = D[i]*SCALE[i%8]*AAN_DCT[remap_DCT(i)]
+@endcode
+
+D can be premultiplied with the DCT scaling factors to yield
+
+@code
+ for i=0 to 79 do
+ W[i] = DSCALED[i]*AAN_DCT[remap_DCT(i)] where DSCALED[i] = D[i]*SCALE[i%8]
+@endcode
+
+The output samples X[0..7] are defined as sums of W:
+
+@code
+ X[j] = sum{i=0..9}(W[j+8*i])
+@endcode
+
+@ingroup codec_internal
+*/
+
+/**
+@addtogroup codec_internal
+@{
+*/
+
+#include "oi_codec_sbc_private.h"
+
+const OI_INT32 dec_window_4[21] = {
+ 0, /* +0.00000000E+00 */
+ 97, /* +5.36548976E-04 */
+ 270, /* +1.49188357E-03 */
+ 495, /* +2.73370904E-03 */
+ 694, /* +3.83720193E-03 */
+ 704, /* +3.89205149E-03 */
+ 338, /* +1.86581691E-03 */
+ -554, /* -3.06012286E-03 */
+ 1974, /* +1.09137620E-02 */
+ 3697, /* +2.04385087E-02 */
+ 5224, /* +2.88757392E-02 */
+ 5824, /* +3.21939290E-02 */
+ 4681, /* +2.58767811E-02 */
+ 1109, /* +6.13245186E-03 */
+ -5214, /* -2.88217274E-02 */
+ -14047, /* -7.76463494E-02 */
+ 24529, /* +1.35593274E-01 */
+ 35274, /* +1.94987841E-01 */
+ 44618, /* +2.46636662E-01 */
+ 50984, /* +2.81828203E-01 */
+ 53243, /* +2.94315332E-01 */
+};
+
+#define DCTII_4_K06_FIX ( 11585)/* S1.14 11585 0.707107*/
+
+#define DCTII_4_K08_FIX ( 21407)/* S1.14 21407 1.306563*/
+
+#define DCTII_4_K09_FIX (-15137)/* S1.14 -15137 -0.923880*/
+
+#define DCTII_4_K10_FIX ( -8867)/* S1.14 -8867 -0.541196*/
+
+/** Scales x by y bits to the right, adding a rounding factor.
+ */
+#ifndef SCALE
+#define SCALE(x, y) (((x) + (1 <<((y)-1))) >> (y))
+#endif
+
+#ifndef CLIP_INT16
+#define CLIP_INT16(x) do { if (x > OI_INT16_MAX) { x = OI_INT16_MAX; } else if (x < OI_INT16_MIN) { x = OI_INT16_MIN; } } while (0)
+#endif
+
+/**
+ * Default C language implementation of a 16x32->32 multiply. This function may
+ * be replaced by a platform-specific version for speed.
+ *
+ * @param u A signed 16-bit multiplicand
+ * @param v A signed 32-bit multiplier
+
+ * @return A signed 32-bit value corresponding to the 32 most significant bits
+ * of the 48-bit product of u and v.
+ */
+INLINE OI_INT32 default_mul_16s_32s_hi(OI_INT16 u, OI_INT32 v)
+{
+ OI_UINT16 v0;
+ OI_INT16 v1;
+
+ OI_INT32 w,x;
+
+ v0 = (OI_UINT16)(v & 0xffff);
+ v1 = (OI_INT16) (v >> 16);
+
+ w = v1 * u;
+ x = u * v0;
+
+ return w + (x >> 16);
+}
+
+#define MUL_16S_32S_HI(_x, _y) default_mul_16s_32s_hi(_x, _y)
+
+#define LONG_MULT_DCT(K, sample) (MUL_16S_32S_HI(K, sample)<<2)
+
+PRIVATE void SynthWindow80_generated(OI_INT16 *pcm, SBC_BUFFER_T const * RESTRICT buffer, OI_UINT strideShift);
+PRIVATE void SynthWindow112_generated(OI_INT16 *pcm, SBC_BUFFER_T const * RESTRICT buffer, OI_UINT strideShift);
+PRIVATE void dct2_8(SBC_BUFFER_T * RESTRICT out, OI_INT32 const * RESTRICT x);
+
+typedef void (*SYNTH_FRAME)(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_INT16 *pcm, OI_UINT blkstart, OI_UINT blkcount);
+
+#ifndef COPY_BACKWARD_32BIT_ALIGNED_72_HALFWORDS
+#define COPY_BACKWARD_32BIT_ALIGNED_72_HALFWORDS(dest, src) do { shift_buffer(dest, src, 72); } while (0)
+#endif
+
+#ifndef DCT2_8
+#define DCT2_8(dst, src) dct2_8(dst, src)
+#endif
+
+#ifndef SYNTH80
+#define SYNTH80 SynthWindow80_generated
+#endif
+
+#ifndef SYNTH112
+#define SYNTH112 SynthWindow112_generated
+#endif
+
+PRIVATE void OI_SBC_SynthFrame_80(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_INT16 *pcm, OI_UINT blkstart, OI_UINT blkcount)
+{
+ OI_UINT blk;
+ OI_UINT ch;
+ OI_UINT nrof_channels = context->common.frameInfo.nrof_channels;
+ OI_UINT pcmStrideShift = context->common.pcmStride == 1 ? 0 : 1;
+ OI_UINT offset = context->common.filterBufferOffset;
+ OI_INT32 *s = context->common.subdata + 8 * nrof_channels * blkstart;
+ OI_UINT blkstop = blkstart + blkcount;
+
+ for (blk = blkstart; blk < blkstop; blk++) {
+ if (offset == 0) {
+ COPY_BACKWARD_32BIT_ALIGNED_72_HALFWORDS(context->common.filterBuffer[0] + context->common.filterBufferLen - 72, context->common.filterBuffer[0]);
+ if (nrof_channels == 2) {
+ COPY_BACKWARD_32BIT_ALIGNED_72_HALFWORDS(context->common.filterBuffer[1] + context->common.filterBufferLen - 72, context->common.filterBuffer[1]);
+ }
+ offset = context->common.filterBufferLen - 80;
+ } else {
+ offset -= 1*8;
+ }
+
+ for (ch = 0; ch < nrof_channels; ch++) {
+ DCT2_8(context->common.filterBuffer[ch] + offset, s);
+ SYNTH80(pcm + ch, context->common.filterBuffer[ch] + offset, pcmStrideShift);
+ s += 8;
+ }
+ pcm += (8 << pcmStrideShift);
+ }
+ context->common.filterBufferOffset = offset;
+}
+
+PRIVATE void OI_SBC_SynthFrame_4SB(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_INT16 *pcm, OI_UINT blkstart, OI_UINT blkcount)
+{
+ OI_UINT blk;
+ OI_UINT ch;
+ OI_UINT nrof_channels = context->common.frameInfo.nrof_channels;
+ OI_UINT pcmStrideShift = context->common.pcmStride == 1 ? 0 : 1;
+ OI_UINT offset = context->common.filterBufferOffset;
+ OI_INT32 *s = context->common.subdata + 8 * nrof_channels * blkstart;
+ OI_UINT blkstop = blkstart + blkcount;
+
+ for (blk = blkstart; blk < blkstop; blk++) {
+ if (offset == 0) {
+ COPY_BACKWARD_32BIT_ALIGNED_72_HALFWORDS(context->common.filterBuffer[0] + context->common.filterBufferLen - 72,context->common.filterBuffer[0]);
+ if (nrof_channels == 2) {
+ COPY_BACKWARD_32BIT_ALIGNED_72_HALFWORDS(context->common.filterBuffer[1] + context->common.filterBufferLen - 72,context->common.filterBuffer[1]);
+ }
+ offset =context->common.filterBufferLen - 80;
+ } else {
+ offset -= 8;
+ }
+ for (ch = 0; ch < nrof_channels; ch++) {
+ cosineModulateSynth4(context->common.filterBuffer[ch] + offset, s);
+ SynthWindow40_int32_int32_symmetry_with_sum(pcm + ch,
+ context->common.filterBuffer[ch] + offset,
+ pcmStrideShift);
+ s += 4;
+ }
+ pcm += (4 << pcmStrideShift);
+ }
+ context->common.filterBufferOffset = offset;
+}
+
+#ifdef SBC_ENHANCED
+
+PRIVATE void OI_SBC_SynthFrame_Enhanced(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_INT16 *pcm, OI_UINT blkstart, OI_UINT blkcount)
+{
+ OI_UINT blk;
+ OI_UINT ch;
+ OI_UINT nrof_channels = context->common.frameInfo.nrof_channels;
+ OI_UINT pcmStrideShift = context->common.pcmStride == 1 ? 0 : 1;
+ OI_UINT offset = context->common.filterBufferOffset;
+ OI_INT32 *s = context->common.subdata + 8 * nrof_channels * blkstart;
+ OI_UINT blkstop = blkstart + blkcount;
+
+ for (blk = blkstart; blk < blkstop; blk++) {
+ if (offset == 0) {
+ COPY_BACKWARD_32BIT_ALIGNED_104_HALFWORDS(context->common.filterBuffer[0] +context->common.filterBufferLen - 104, context->common.filterBuffer[0]);
+ if (nrof_channels == 2) {
+ COPY_BACKWARD_32BIT_ALIGNED_104_HALFWORDS(context->common.filterBuffer[1] + context->common.filterBufferLen - 104, context->common.filterBuffer[1]);
+ }
+ offset = context->common.filterBufferLen - 112;
+ } else {
+ offset -= 8;
+ }
+ for (ch = 0; ch < nrof_channels; ++ch) {
+ DCT2_8(context->common.filterBuffer[ch] + offset, s);
+ SYNTH112(pcm + ch, context->common.filterBuffer[ch] + offset, pcmStrideShift);
+ s += 8;
+ }
+ pcm += (8 << pcmStrideShift);
+ }
+ context->common.filterBufferOffset = offset;
+}
+
+static const SYNTH_FRAME SynthFrameEnhanced[] = {
+ NULL, /* invalid */
+ OI_SBC_SynthFrame_Enhanced, /* mono */
+ OI_SBC_SynthFrame_Enhanced /* stereo */
+};
+
+#endif
+
+static const SYNTH_FRAME SynthFrame8SB[] = {
+ NULL, /* invalid */
+ OI_SBC_SynthFrame_80, /* mono */
+ OI_SBC_SynthFrame_80 /* stereo */
+};
+
+
+static const SYNTH_FRAME SynthFrame4SB[] = {
+ NULL, /* invalid */
+ OI_SBC_SynthFrame_4SB, /* mono */
+ OI_SBC_SynthFrame_4SB /* stereo */
+};
+
+PRIVATE void OI_SBC_SynthFrame(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_INT16 *pcm, OI_UINT start_block, OI_UINT nrof_blocks)
+{
+ OI_UINT nrof_subbands = context->common.frameInfo.nrof_subbands;
+ OI_UINT nrof_channels = context->common.frameInfo.nrof_channels;
+
+ OI_ASSERT(nrof_subbands == 4 || nrof_subbands == 8);
+ if (nrof_subbands == 4) {
+ SynthFrame4SB[nrof_channels](context, pcm, start_block, nrof_blocks);
+#ifdef SBC_ENHANCED
+ } else if (context->common.frameInfo.enhanced) {
+ SynthFrameEnhanced[nrof_channels](context, pcm, start_block, nrof_blocks);
+#endif /* SBC_ENHANCED */
+ } else {
+ SynthFrame8SB[nrof_channels](context, pcm, start_block, nrof_blocks);
+ }
+}
+
+
+void SynthWindow40_int32_int32_symmetry_with_sum(OI_INT16 *pcm, SBC_BUFFER_T buffer[80], OI_UINT strideShift)
+{
+ OI_INT32 pa;
+ OI_INT32 pb;
+
+ /* These values should be zero, since out[2] of the 4-band cosine modulation
+ * is always zero. */
+ OI_ASSERT(buffer[ 2] == 0);
+ OI_ASSERT(buffer[10] == 0);
+ OI_ASSERT(buffer[18] == 0);
+ OI_ASSERT(buffer[26] == 0);
+ OI_ASSERT(buffer[34] == 0);
+ OI_ASSERT(buffer[42] == 0);
+ OI_ASSERT(buffer[50] == 0);
+ OI_ASSERT(buffer[58] == 0);
+ OI_ASSERT(buffer[66] == 0);
+ OI_ASSERT(buffer[74] == 0);
+
+
+ pa = dec_window_4[ 4] * (buffer[12] + buffer[76]);
+ pa += dec_window_4[ 8] * (buffer[16] - buffer[64]);
+ pa += dec_window_4[12] * (buffer[28] + buffer[60]);
+ pa += dec_window_4[16] * (buffer[32] - buffer[48]);
+ pa += dec_window_4[20] * buffer[44];
+ pa = SCALE(-pa, 15);
+ CLIP_INT16(pa);
+ pcm[0 << strideShift] = (OI_INT16)pa;
+
+
+ pa = dec_window_4[ 1] * buffer[ 1]; pb = dec_window_4[ 1] * buffer[79];
+ pb += dec_window_4[ 3] * buffer[ 3]; pa += dec_window_4[ 3] * buffer[77];
+ pa += dec_window_4[ 5] * buffer[13]; pb += dec_window_4[ 5] * buffer[67];
+ pb += dec_window_4[ 7] * buffer[15]; pa += dec_window_4[ 7] * buffer[65];
+ pa += dec_window_4[ 9] * buffer[17]; pb += dec_window_4[ 9] * buffer[63];
+ pb += dec_window_4[11] * buffer[19]; pa += dec_window_4[11] * buffer[61];
+ pa += dec_window_4[13] * buffer[29]; pb += dec_window_4[13] * buffer[51];
+ pb += dec_window_4[15] * buffer[31]; pa += dec_window_4[15] * buffer[49];
+ pa += dec_window_4[17] * buffer[33]; pb += dec_window_4[17] * buffer[47];
+ pb += dec_window_4[19] * buffer[35]; pa += dec_window_4[19] * buffer[45];
+ pa = SCALE(-pa, 15);
+ CLIP_INT16(pa);
+ pcm[1 << strideShift] = (OI_INT16)(pa);
+ pb = SCALE(-pb, 15);
+ CLIP_INT16(pb);
+ pcm[3 << strideShift] = (OI_INT16)(pb);
+
+
+ pa = dec_window_4[2] * (/*buffer[ 2] + */ buffer[78]); /* buffer[ 2] is always zero */
+ pa += dec_window_4[6] * (buffer[14] /* + buffer[66]*/); /* buffer[66] is always zero */
+ pa += dec_window_4[10] * (/*buffer[18] + */ buffer[62]); /* buffer[18] is always zero */
+ pa += dec_window_4[14] * (buffer[30] /* + buffer[50]*/); /* buffer[50] is always zero */
+ pa += dec_window_4[18] * (/*buffer[34] + */ buffer[46]); /* buffer[34] is always zero */
+ pa = SCALE(-pa, 15);
+ CLIP_INT16(pa);
+ pcm[2 << strideShift] = (OI_INT16)(pa);
+}
+
+
+/**
+ This routine implements the cosine modulation matrix for 4-subband
+ synthesis. This is called "matrixing" in the SBC specification. This
+ matrix, M4, can be factored into an 8-point Type II Discrete Cosine
+ Transform, DCTII_4 and a matrix S4, given here:
+
+ @code
+ __ __
+ | 0 0 1 0 |
+ | 0 0 0 1 |
+ | 0 0 0 0 |
+ | 0 0 0 -1 |
+ S4 = | 0 0 -1 0 |
+ | 0 -1 0 0 |
+ | -1 0 0 0 |
+ |__ 0 -1 0 0 __|
+
+ M4 * in = S4 * (DCTII_4 * in)
+ @endcode
+
+ (DCTII_4 * in) is computed using a Fast Cosine Transform. The algorithm
+ here is based on an implementation computed by the SPIRAL computer
+ algebra system, manually converted to fixed-point arithmetic. S4 can be
+ implemented using only assignment and negation.
+ */
+PRIVATE void cosineModulateSynth4(SBC_BUFFER_T * RESTRICT out, OI_INT32 const * RESTRICT in)
+{
+ OI_INT32 f0, f1, f2, f3, f4, f7, f8, f9, f10;
+ OI_INT32 y0, y1, y2, y3;
+
+ f0 = (in[0] - in[3]);
+ f1 = (in[0] + in[3]);
+ f2 = (in[1] - in[2]);
+ f3 = (in[1] + in[2]);
+
+ f4 = f1 - f3;
+
+ y0 = -SCALE(f1 + f3, DCT_SHIFT);
+ y2 = -SCALE(LONG_MULT_DCT(DCTII_4_K06_FIX, f4), DCT_SHIFT);
+ f7 = f0 + f2;
+ f8 = LONG_MULT_DCT(DCTII_4_K08_FIX, f0);
+ f9 = LONG_MULT_DCT(DCTII_4_K09_FIX, f7);
+ f10 = LONG_MULT_DCT(DCTII_4_K10_FIX, f2);
+ y3 = -SCALE(f8 + f9, DCT_SHIFT);
+ y1 = -SCALE(f10 - f9, DCT_SHIFT);
+
+ out[0] = (OI_INT16)-y2;
+ out[1] = (OI_INT16)-y3;
+ out[2] = (OI_INT16)0;
+ out[3] = (OI_INT16)y3;
+ out[4] = (OI_INT16)y2;
+ out[5] = (OI_INT16)y1;
+ out[6] = (OI_INT16)y0;
+ out[7] = (OI_INT16)y1;
+}
+
+
+
+/**
+@}
+*/
diff --git a/embdrv/sbc/encoder/srce/sbc_encoder.c b/embdrv/sbc/encoder/srce/sbc_encoder.c
index f111ed0..c58f3fc 100644
--- a/embdrv/sbc/encoder/srce/sbc_encoder.c
+++ b/embdrv/sbc/encoder/srce/sbc_encoder.c
@@ -391,7 +391,7 @@
EncMaxShiftCounter=((ENC_VX_BUFFER_SIZE-8*10*2)>>4)<<3;
}
- APPL_TRACE_EVENT2("SBC_Encoder_Init : bitrate %d, bitpool %d",
+ APPL_TRACE_EVENT("SBC_Encoder_Init : bitrate %d, bitpool %d",
pstrEncParams->u16BitRate, pstrEncParams->s16BitPool);
SbcAnalysisInit();
diff --git a/gki/Android.mk b/gki/Android.mk
index ed9f904..b85e344 100644
--- a/gki/Android.mk
+++ b/gki/Android.mk
@@ -1,35 +1,32 @@
-ifneq ($(TARGET_SIMULATOR),true)
-
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
-LOCAL_C_INCLUDES:= $(LOCAL_PATH)/common \
- $(LOCAL_PATH)/ulinux \
- $(LOCAL_PATH)/../include \
- $(LOCAL_PATH)/../stack/include \
- $(LOCAL_PATH)/../utils/include \
- $(bdroid_C_INCLUDES) \
+LOCAL_C_INCLUDES := \
+ $(LOCAL_PATH)/common \
+ $(LOCAL_PATH)/ulinux \
+ $(LOCAL_PATH)/../include \
+ $(LOCAL_PATH)/../stack/include \
+ $(LOCAL_PATH)/../utils/include \
+ $(bdroid_C_INCLUDES)
-LOCAL_CFLAGS += -Werror -Wno-error=unused-parameter $(bdroid_CFLAGS)
+LOCAL_CFLAGS += -Wno-error=unused-parameter $(bdroid_CFLAGS) -std=c99
ifeq ($(BOARD_HAVE_BLUETOOTH_BCM),true)
LOCAL_CFLAGS += \
-DBOARD_HAVE_BLUETOOTH_BCM
endif
-LOCAL_PRELINK_MODULE:=false
-LOCAL_SRC_FILES:= \
- ./ulinux/gki_ulinux.c \
- ./common/gki_debug.c \
- ./common/gki_time.c \
- ./common/gki_buffer.c
+LOCAL_PRELINK_MODULE := false
+LOCAL_SRC_FILES := \
+ ./common/gki_buffer.c \
+ ./common/gki_debug.c \
+ ./common/gki_time.c \
+ ./ulinux/gki_ulinux.c
LOCAL_MODULE := libbt-brcm_gki
LOCAL_MODULE_TAGS := optional
-LOCAL_SHARED_LIBRARIES := libcutils libc
LOCAL_MODULE_CLASS := STATIC_LIBRARIES
+LOCAL_MULTILIB := 32
include $(BUILD_STATIC_LIBRARY)
-
-endif # TARGET_SIMULATOR != true
diff --git a/gki/common/gki.h b/gki/common/gki.h
index 5180dcd..8bbcd10 100644
--- a/gki/common/gki.h
+++ b/gki/common/gki.h
@@ -19,16 +19,7 @@
#define GKI_H
-/* Include platform-specific over-rides */
-#if (defined(NFC_STANDALONE) && (NFC_STANDALONE == TRUE))
- #include "gki_target.h"
-#else
- /* For non-nfc_standalone, include Bluetooth definitions */
- #include "bt_target.h"
-#endif
-
-
-
+#include "bt_target.h"
#include "bt_types.h"
/* Error codes */
@@ -85,236 +76,12 @@
#define EVENT_MASK(evt) ((UINT16)(0x0001 << (evt)))
-/************************************************************************
-** Max Time Queue
-**/
-#ifndef GKI_MAX_TIMER_QUEUES
-#define GKI_MAX_TIMER_QUEUES 3
-#endif
-
-/************************************************************************
-** Macro to determine the pool buffer size based on the GKI POOL ID at compile time.
-** Pool IDs index from 0 to GKI_NUM_FIXED_BUF_POOLS - 1
-*/
-
-#if (GKI_NUM_FIXED_BUF_POOLS < 1)
-
-#ifndef GKI_POOL_ID_0
-#define GKI_POOL_ID_0 0
-#endif /* ifndef GKI_POOL_ID_0 */
-
-#ifndef GKI_BUF0_SIZE
-#define GKI_BUF0_SIZE 0
-#endif /* ifndef GKI_BUF0_SIZE */
-
-#endif /* GKI_NUM_FIXED_BUF_POOLS < 1 */
-
-
-#if (GKI_NUM_FIXED_BUF_POOLS < 2)
-
-#ifndef GKI_POOL_ID_1
-#define GKI_POOL_ID_1 0
-#endif /* ifndef GKI_POOL_ID_1 */
-
-#ifndef GKI_BUF1_SIZE
-#define GKI_BUF1_SIZE 0
-#endif /* ifndef GKI_BUF1_SIZE */
-
-#endif /* GKI_NUM_FIXED_BUF_POOLS < 2 */
-
-
-#if (GKI_NUM_FIXED_BUF_POOLS < 3)
-
-#ifndef GKI_POOL_ID_2
-#define GKI_POOL_ID_2 0
-#endif /* ifndef GKI_POOL_ID_2 */
-
-#ifndef GKI_BUF2_SIZE
-#define GKI_BUF2_SIZE 0
-#endif /* ifndef GKI_BUF2_SIZE */
-
-#endif /* GKI_NUM_FIXED_BUF_POOLS < 3 */
-
-
-#if (GKI_NUM_FIXED_BUF_POOLS < 4)
-
-#ifndef GKI_POOL_ID_3
-#define GKI_POOL_ID_3 0
-#endif /* ifndef GKI_POOL_ID_4 */
-
-#ifndef GKI_BUF3_SIZE
-#define GKI_BUF3_SIZE 0
-#endif /* ifndef GKI_BUF3_SIZE */
-
-#endif /* GKI_NUM_FIXED_BUF_POOLS < 4 */
-
-
-#if (GKI_NUM_FIXED_BUF_POOLS < 5)
-
-#ifndef GKI_POOL_ID_4
-#define GKI_POOL_ID_4 0
-#endif /* ifndef GKI_POOL_ID_4 */
-
-#ifndef GKI_BUF4_SIZE
-#define GKI_BUF4_SIZE 0
-#endif /* ifndef GKI_BUF4_SIZE */
-
-#endif /* GKI_NUM_FIXED_BUF_POOLS < 5 */
-
-
-#if (GKI_NUM_FIXED_BUF_POOLS < 6)
-
-#ifndef GKI_POOL_ID_5
-#define GKI_POOL_ID_5 0
-#endif /* ifndef GKI_POOL_ID_5 */
-
-#ifndef GKI_BUF5_SIZE
-#define GKI_BUF5_SIZE 0
-#endif /* ifndef GKI_BUF5_SIZE */
-
-#endif /* GKI_NUM_FIXED_BUF_POOLS < 6 */
-
-
-#if (GKI_NUM_FIXED_BUF_POOLS < 7)
-
-#ifndef GKI_POOL_ID_6
-#define GKI_POOL_ID_6 0
-#endif /* ifndef GKI_POOL_ID_6 */
-
-#ifndef GKI_BUF6_SIZE
-#define GKI_BUF6_SIZE 0
-#endif /* ifndef GKI_BUF6_SIZE */
-
-#endif /* GKI_NUM_FIXED_BUF_POOLS < 7 */
-
-
-#if (GKI_NUM_FIXED_BUF_POOLS < 8)
-
-#ifndef GKI_POOL_ID_7
-#define GKI_POOL_ID_7 0
-#endif /* ifndef GKI_POOL_ID_7 */
-
-#ifndef GKI_BUF7_SIZE
-#define GKI_BUF7_SIZE 0
-#endif /* ifndef GKI_BUF7_SIZE */
-
-#endif /* GKI_NUM_FIXED_BUF_POOLS < 8 */
-
-
-#if (GKI_NUM_FIXED_BUF_POOLS < 9)
-
-#ifndef GKI_POOL_ID_8
-#define GKI_POOL_ID_8 0
-#endif /* ifndef GKI_POOL_ID_8 */
-
-#ifndef GKI_BUF8_SIZE
-#define GKI_BUF8_SIZE 0
-#endif /* ifndef GKI_BUF8_SIZE */
-
-#endif /* GKI_NUM_FIXED_BUF_POOLS < 9 */
-
-
-#if (GKI_NUM_FIXED_BUF_POOLS < 10)
-
-#ifndef GKI_POOL_ID_9
-#define GKI_POOL_ID_9 0
-#endif /* ifndef GKI_POOL_ID_9 */
-
-#ifndef GKI_BUF9_SIZE
-#define GKI_BUF9_SIZE 0
-#endif /* ifndef GKI_BUF9_SIZE */
-
-#endif /* GKI_NUM_FIXED_BUF_POOLS < 10 */
-
-
-#if (GKI_NUM_FIXED_BUF_POOLS < 11)
-
-#ifndef GKI_POOL_ID_10
-#define GKI_POOL_ID_10 0
-#endif /* ifndef GKI_POOL_ID_10 */
-
-#ifndef GKI_BUF10_SIZE
-#define GKI_BUF10_SIZE 0
-#endif /* ifndef GKI_BUF10_SIZE */
-
-#endif /* GKI_NUM_FIXED_BUF_POOLS < 11 */
-
-
-#if (GKI_NUM_FIXED_BUF_POOLS < 12)
-
-#ifndef GKI_POOL_ID_11
-#define GKI_POOL_ID_11 0
-#endif /* ifndef GKI_POOL_ID_11 */
-
-#ifndef GKI_BUF11_SIZE
-#define GKI_BUF11_SIZE 0
-#endif /* ifndef GKI_BUF11_SIZE */
-
-#endif /* GKI_NUM_FIXED_BUF_POOLS < 12 */
-
-
-#if (GKI_NUM_FIXED_BUF_POOLS < 13)
-
-#ifndef GKI_POOL_ID_12
-#define GKI_POOL_ID_12 0
-#endif /* ifndef GKI_POOL_ID_12 */
-
-#ifndef GKI_BUF12_SIZE
-#define GKI_BUF12_SIZE 0
-#endif /* ifndef GKI_BUF12_SIZE */
-
-#endif /* GKI_NUM_FIXED_BUF_POOLS < 13 */
-
-
-#if (GKI_NUM_FIXED_BUF_POOLS < 14)
-
-#ifndef GKI_POOL_ID_13
-#define GKI_POOL_ID_13 0
-#endif /* ifndef GKI_POOL_ID_13 */
-
-#ifndef GKI_BUF13_SIZE
-#define GKI_BUF13_SIZE 0
-#endif /* ifndef GKI_BUF13_SIZE */
-
-#endif /* GKI_NUM_FIXED_BUF_POOLS < 14 */
-
-
-#if (GKI_NUM_FIXED_BUF_POOLS < 15)
-
-#ifndef GKI_POOL_ID_14
-#define GKI_POOL_ID_14 0
-#endif /* ifndef GKI_POOL_ID_14 */
-
-#ifndef GKI_BUF14_SIZE
-#define GKI_BUF14_SIZE 0
-#endif /* ifndef GKI_BUF14_SIZE */
-
-#endif /* GKI_NUM_FIXED_BUF_POOLS < 15 */
-
-
-#if (GKI_NUM_FIXED_BUF_POOLS < 16)
-
-#ifndef GKI_POOL_ID_15
-#define GKI_POOL_ID_15 0
-#endif /* ifndef GKI_POOL_ID_15 */
-
-#ifndef GKI_BUF15_SIZE
-#define GKI_BUF15_SIZE 0
-#endif /* ifndef GKI_BUF15_SIZE */
-
-#endif /* GKI_NUM_FIXED_BUF_POOLS < 16 */
-
-
/* Timer list entry callback type
*/
typedef void (TIMER_CBACK)(void *p_tle);
#ifndef TIMER_PARAM_TYPE
-#ifdef WIN2000
-#define TIMER_PARAM_TYPE void *
-#else
#define TIMER_PARAM_TYPE UINT32
#endif
-#endif
/* Define a timer list entry
*/
typedef struct _tle
@@ -323,7 +90,9 @@
struct _tle *p_prev;
TIMER_CBACK *p_cback;
INT32 ticks;
+ INT32 ticks_initial;
TIMER_PARAM_TYPE param;
+ TIMER_PARAM_TYPE data;
UINT16 event;
UINT8 in_use;
} TIMER_LIST_ENT;
@@ -334,7 +103,6 @@
{
TIMER_LIST_ENT *p_first;
TIMER_LIST_ENT *p_last;
- INT32 last_ticks;
} TIMER_LIST_Q;
@@ -378,22 +146,11 @@
GKI_API extern void GKI_init(void);
GKI_API extern void GKI_shutdown(void);
GKI_API extern INT8 *GKI_map_taskname(UINT8);
-GKI_API extern UINT8 GKI_resume_task(UINT8);
-GKI_API extern void GKI_run(void *);
-GKI_API extern void GKI_freeze(void);
+GKI_API extern void GKI_run(void);
GKI_API extern void GKI_stop(void);
-GKI_API extern UINT8 GKI_suspend_task(UINT8);
-GKI_API extern UINT8 GKI_is_task_running(UINT8);
-
-/* memory management
-*/
-GKI_API extern void GKI_shiftdown (UINT8 *p_mem, UINT32 len, UINT32 shift_amount);
-GKI_API extern void GKI_shiftup (UINT8 *p_dest, UINT8 *p_src, UINT32 len);
/* To send buffers and events between tasks
*/
-GKI_API extern UINT8 GKI_isend_event (UINT8, UINT16);
-GKI_API extern void GKI_isend_msg (UINT8, UINT8, void *);
GKI_API extern void *GKI_read_mbox (UINT8);
GKI_API extern void GKI_send_msg (UINT8, UINT8, void *);
GKI_API extern UINT8 GKI_send_event (UINT8, UINT16);
@@ -401,10 +158,6 @@
/* To get and release buffers, change owner and get size
*/
-GKI_API extern void GKI_change_buf_owner (void *, UINT8);
-GKI_API extern UINT8 GKI_create_pool (UINT16, UINT16, UINT8, void *);
-GKI_API extern void GKI_delete_pool (UINT8);
-GKI_API extern void *GKI_find_buf_start (void *);
GKI_API extern void GKI_freebuf (void *);
GKI_API extern void *GKI_getbuf (UINT16);
GKI_API extern UINT16 GKI_get_buf_size (void *);
@@ -412,8 +165,6 @@
GKI_API extern UINT16 GKI_poolcount (UINT8);
GKI_API extern UINT16 GKI_poolfreecount (UINT8);
GKI_API extern UINT16 GKI_poolutilization (UINT8);
-GKI_API extern void GKI_register_mempool (void *p_mem);
-GKI_API extern UINT8 GKI_set_pool_permission(UINT8, UINT8);
/* User buffer queue management
@@ -434,35 +185,23 @@
GKI_API extern void GKI_add_to_timer_list (TIMER_LIST_Q *, TIMER_LIST_ENT *);
GKI_API extern void GKI_delay(UINT32);
GKI_API extern UINT32 GKI_get_tick_count(void);
-GKI_API extern INT8 *GKI_get_time_stamp(INT8 *);
GKI_API extern void GKI_init_timer_list (TIMER_LIST_Q *);
-GKI_API extern void GKI_init_timer_list_entry (TIMER_LIST_ENT *);
GKI_API extern INT32 GKI_ready_to_sleep (void);
-GKI_API extern void GKI_remove_from_timer_list (TIMER_LIST_Q *, TIMER_LIST_ENT *);
+GKI_API extern BOOLEAN GKI_remove_from_timer_list (TIMER_LIST_Q *, TIMER_LIST_ENT *);
GKI_API extern void GKI_start_timer(UINT8, INT32, BOOLEAN);
GKI_API extern void GKI_stop_timer (UINT8);
GKI_API extern void GKI_timer_update(INT32);
GKI_API extern UINT16 GKI_update_timer_list (TIMER_LIST_Q *, INT32);
GKI_API extern UINT32 GKI_get_remaining_ticks (TIMER_LIST_Q *, TIMER_LIST_ENT *);
GKI_API extern UINT16 GKI_wait(UINT16, UINT32);
-
-/* Start and Stop system time tick callback
- * true for start system tick if time queue is not empty
- * false to stop system tick if time queue is empty
-*/
-typedef void (SYSTEM_TICK_CBACK)(BOOLEAN);
-
-/* Time queue management for system ticks
-*/
-GKI_API extern BOOLEAN GKI_timer_queue_empty (void);
-GKI_API extern void GKI_timer_queue_register_callback(SYSTEM_TICK_CBACK *);
+GKI_API extern BOOLEAN GKI_timer_queue_is_empty(const TIMER_LIST_Q *timer_q);
+GKI_API extern TIMER_LIST_ENT *GKI_timer_getfirst(const TIMER_LIST_Q *timer_q);
+GKI_API extern INT32 GKI_timer_ticks_getinitial(const TIMER_LIST_ENT *tle);
/* Disable Interrupts, Enable Interrupts
*/
GKI_API extern void GKI_enable(void);
GKI_API extern void GKI_disable(void);
-GKI_API extern void GKI_sched_lock(void);
-GKI_API extern void GKI_sched_unlock(void);
/* Allocate (Free) memory from an OS
*/
@@ -491,4 +230,3 @@
#endif
-
diff --git a/gki/common/gki_buffer.c b/gki/common/gki_buffer.c
index bcf6f06..03b330c 100644
--- a/gki/common/gki_buffer.c
+++ b/gki/common/gki_buffer.c
@@ -401,8 +401,11 @@
/* Only look at PUBLIC buffer pools (bypass RESTRICTED pools) */
if (((UINT16)1 << p_cb->pool_list[i]) & p_cb->pool_access_mask)
continue;
+ if ( size <= p_cb->freeq[p_cb->pool_list[i]].size )
+ Q = &p_cb->freeq[p_cb->pool_list[i]];
+ else
+ continue;
- Q = &p_cb->freeq[p_cb->pool_list[i]];
if(Q->cur_cnt < Q->total)
{
// btla-specific ++
@@ -1015,81 +1018,6 @@
/*******************************************************************************
**
-** Function GKI_find_buf_start
-**
-** Description This function is called with an address inside a buffer,
-** and returns the start address ofthe buffer.
-**
-** The buffer should be one allocated from one of GKI's pools.
-**
-** Parameters: p_user_area - (input) address of anywhere in a GKI buffer.
-**
-** Returns void * - Address of the beginning of the specified buffer if successful,
-** otherwise NULL if unsuccessful
-**
-*******************************************************************************/
-void *GKI_find_buf_start (void *p_user_area)
-{
- UINT16 xx, size;
- UINT32 yy;
- tGKI_COM_CB *p_cb = &gki_cb.com;
- UINT8 *p_ua = (UINT8 *)p_user_area;
-
- for (xx = 0; xx < GKI_NUM_TOTAL_BUF_POOLS; xx++)
- {
- if ((p_ua > p_cb->pool_start[xx]) && (p_ua < p_cb->pool_end[xx]))
- {
- yy = (UINT32)(p_ua - p_cb->pool_start[xx]);
-
- size = p_cb->pool_size[xx];
-
- yy = (yy / size) * size;
-
- return ((void *) (p_cb->pool_start[xx] + yy + sizeof(BUFFER_HDR_T)) );
- }
- }
-
- /* If here, invalid address - not in one of our buffers */
- GKI_exception (GKI_ERROR_BUF_SIZE_ZERO, "GKI_get_buf_start:: bad addr");
-
- return (NULL);
-}
-
-
-/*******************************************************************************
-**
-** Function GKI_set_pool_permission
-**
-** Description This function is called to set or change the permissions for
-** the specified pool ID.
-**
-** Parameters pool_id - (input) pool ID to be set or changed
-** permission - (input) GKI_PUBLIC_POOL or GKI_RESTRICTED_POOL
-**
-** Returns GKI_SUCCESS if successful
-** GKI_INVALID_POOL if unsuccessful
-**
-*******************************************************************************/
-UINT8 GKI_set_pool_permission(UINT8 pool_id, UINT8 permission)
-{
- tGKI_COM_CB *p_cb = &gki_cb.com;
-
- if (pool_id < GKI_NUM_TOTAL_BUF_POOLS)
- {
- if (permission == GKI_RESTRICTED_POOL)
- p_cb->pool_access_mask = (UINT16)(p_cb->pool_access_mask | (1 << pool_id));
-
- else /* mark the pool as public */
- p_cb->pool_access_mask = (UINT16)(p_cb->pool_access_mask & ~(1 << pool_id));
-
- return (GKI_SUCCESS);
- }
- else
- return (GKI_INVALID_POOL);
-}
-
-/*******************************************************************************
-**
** Function gki_add_to_pool_list
**
** Description Adds pool to the pool list which is arranged in the
@@ -1243,202 +1171,6 @@
/*******************************************************************************
**
-** Function GKI_change_buf_owner
-**
-** Description Called to change the task ownership of a buffer.
-**
-** Parameters: p_buf - (input) pointer to the buffer
-** task_id - (input) task id to change ownership to
-**
-** Returns void
-**
-*******************************************************************************/
-void GKI_change_buf_owner (void *p_buf, UINT8 task_id)
-{
- BUFFER_HDR_T *p_hdr = (BUFFER_HDR_T *) ((UINT8 *) p_buf - BUFFER_HDR_SIZE);
-
- p_hdr->task_id = task_id;
-
- return;
-}
-
-#if (defined(GKI_SEND_MSG_FROM_ISR) && GKI_SEND_MSG_FROM_ISR == TRUE)
-/*******************************************************************************
-**
-** Function GKI_isend_msg
-**
-** Description Called from interrupt context to send a buffer to a task
-**
-** Returns Nothing
-**
-*******************************************************************************/
-void GKI_isend_msg (UINT8 task_id, UINT8 mbox, void *msg)
-{
- BUFFER_HDR_T *p_hdr;
- tGKI_COM_CB *p_cb = &gki_cb.com;
-
- /* If task non-existant or not started, drop buffer */
- if ((task_id >= GKI_MAX_TASKS) || (mbox >= NUM_TASK_MBOX) || (p_cb->OSRdyTbl[task_id] == TASK_DEAD))
- {
- GKI_exception(GKI_ERROR_SEND_MSG_BAD_DEST, "Sending to unknown dest");
- GKI_freebuf (msg);
- return;
- }
-
-#if (GKI_ENABLE_BUF_CORRUPTION_CHECK == TRUE)
- if (gki_chk_buf_damage(msg))
- {
- GKI_exception(GKI_ERROR_BUF_CORRUPTED, "Send - Buffer corrupted");
- return;
- }
-#endif
-
-#if (GKI_ENABLE_OWNER_CHECK == TRUE)
- if (gki_chk_buf_owner(msg))
- {
- GKI_exception(GKI_ERROR_NOT_BUF_OWNER, "Send by non-owner");
- return;
- }
-#endif
-
- p_hdr = (BUFFER_HDR_T *) ((UINT8 *) msg - BUFFER_HDR_SIZE);
-
- if (p_hdr->status != BUF_STATUS_UNLINKED)
- {
- GKI_exception(GKI_ERROR_SEND_MSG_BUF_LINKED, "Send - buffer linked");
- return;
- }
-
- if (p_cb->OSTaskQFirst[task_id][mbox])
- p_cb->OSTaskQLast[task_id][mbox]->p_next = p_hdr;
- else
- p_cb->OSTaskQFirst[task_id][mbox] = p_hdr;
-
- p_cb->OSTaskQLast[task_id][mbox] = p_hdr;
-
- p_hdr->p_next = NULL;
- p_hdr->status = BUF_STATUS_QUEUED;
- p_hdr->task_id = task_id;
-
- GKI_isend_event(task_id, (UINT16)EVENT_MASK(mbox));
-
- return;
-}
-#endif
-
-/*******************************************************************************
-**
-** Function GKI_create_pool
-**
-** Description Called by applications to create a buffer pool.
-**
-** Parameters: size - (input) length (in bytes) of each buffer in the pool
-** count - (input) number of buffers to allocate for the pool
-** permission - (input) restricted or public access?
-** (GKI_PUBLIC_POOL or GKI_RESTRICTED_POOL)
-** p_mem_pool - (input) pointer to an OS memory pool, NULL if not provided
-**
-** Returns the buffer pool ID, which should be used in calls to
-** GKI_getpoolbuf(). If a pool could not be created, this
-** function returns 0xff.
-**
-*******************************************************************************/
-UINT8 GKI_create_pool (UINT16 size, UINT16 count, UINT8 permission, void *p_mem_pool)
-{
- UINT8 xx;
- UINT32 mem_needed;
- INT32 tempsize = size;
- tGKI_COM_CB *p_cb = &gki_cb.com;
-
- /* First make sure the size of each pool has a valid size with room for the header info */
- if (size > MAX_USER_BUF_SIZE)
- return (GKI_INVALID_POOL);
-
- /* First, look for an unused pool */
- for (xx = 0; xx < GKI_NUM_TOTAL_BUF_POOLS; xx++)
- {
- if (!p_cb->pool_start[xx])
- break;
- }
-
- if (xx == GKI_NUM_TOTAL_BUF_POOLS)
- return (GKI_INVALID_POOL);
-
- /* Ensure an even number of longwords */
- tempsize = (INT32)ALIGN_POOL(size);
-
- mem_needed = (tempsize + BUFFER_PADDING_SIZE) * count;
-
- if (!p_mem_pool)
- p_mem_pool = GKI_os_malloc(mem_needed);
-
- if (p_mem_pool)
- {
- /* Initialize the new pool */
- gki_init_free_queue (xx, size, count, p_mem_pool);
- gki_add_to_pool_list(xx);
- (void) GKI_set_pool_permission (xx, permission);
- p_cb->curr_total_no_of_pools++;
-
- return (xx);
- }
- else
- return (GKI_INVALID_POOL);
-}
-
-/*******************************************************************************
-**
-** Function GKI_delete_pool
-**
-** Description Called by applications to delete a buffer pool. The function
-** calls the operating specific function to free the actual memory.
-** An exception is generated if an error is detected.
-**
-** Parameters: pool_id - (input) Id of the poll being deleted.
-**
-** Returns void
-**
-*******************************************************************************/
-void GKI_delete_pool (UINT8 pool_id)
-{
- FREE_QUEUE_T *Q;
- tGKI_COM_CB *p_cb = &gki_cb.com;
-
- if ((pool_id >= GKI_NUM_TOTAL_BUF_POOLS) || (!p_cb->pool_start[pool_id]))
- return;
-
- GKI_disable();
- Q = &p_cb->freeq[pool_id];
-
- if (!Q->cur_cnt)
- {
- Q->size = 0;
- Q->total = 0;
- Q->cur_cnt = 0;
- Q->max_cnt = 0;
- Q->p_first = NULL;
- Q->p_last = NULL;
-
- GKI_os_free (p_cb->pool_start[pool_id]);
-
- p_cb->pool_start[pool_id] = NULL;
- p_cb->pool_end[pool_id] = NULL;
- p_cb->pool_size[pool_id] = 0;
-
- gki_remove_from_pool_list(pool_id);
- p_cb->curr_total_no_of_pools--;
- }
- else
- GKI_exception(GKI_ERROR_DELETE_POOL_BAD_QID, "Deleting bad pool");
-
- GKI_enable();
-
- return;
-}
-
-
-/*******************************************************************************
-**
** Function GKI_get_pool_bufsize
**
** Description Called by an application to get the size of buffers in a pool
diff --git a/gki/common/gki_common.h b/gki/common/gki_common.h
index ff5a675..042024e1 100644
--- a/gki/common/gki_common.h
+++ b/gki/common/gki_common.h
@@ -45,15 +45,13 @@
#define GKI_ERROR_ADDR_NOT_IN_BUF 0xFFF5
#define GKI_ERROR_OUT_OF_BUFFERS 0xFFF4
#define GKI_ERROR_GETPOOLBUF_BAD_QID 0xFFF3
+#define GKI_ERROR_TIMER_LIST_CORRUPTED 0xFFF2
/********************************************************************
** Misc constants
*********************************************************************/
-#define GKI_MAX_INT32 (0x7fffffffL)
-#define GKI_MAX_TIMESTAMP (0xffffffffL)
-
/********************************************************************
** Buffer Management Data Structures
*********************************************************************/
@@ -63,14 +61,14 @@
struct _buffer_hdr *p_next; /* next buffer in the queue */
UINT8 q_id; /* id of the queue */
UINT8 task_id; /* task which allocated the buffer*/
- UINT8 status; /* FREE, UNLINKED or QUEUED */
+ UINT8 status; /* FREE, UNLINKED or QUEUED */
UINT8 Type;
} BUFFER_HDR_T;
typedef struct _free_queue
{
BUFFER_HDR_T *p_first; /* first buffer in the queue */
- BUFFER_HDR_T *p_last; /* last buffer in the queue */
+ BUFFER_HDR_T *p_last; /* last buffer in the queue */
UINT16 size; /* size of the buffers in the pool */
UINT16 total; /* toatal number of buffers */
UINT16 cur_cnt; /* number of buffers currently allocated */
@@ -269,9 +267,6 @@
/* Timer related variables
*/
INT32 OSTicksTilExp; /* Number of ticks till next timer expires */
-#if (defined(GKI_DELAY_STOP_SYS_TICK) && (GKI_DELAY_STOP_SYS_TICK > 0))
- UINT32 OSTicksTilStop; /* inactivity delay timer; OS Ticks till stopping system tick */
-#endif
INT32 OSNumOrigTicks; /* Number of ticks between last timer expiration to the next one */
INT32 OSWaitTmr [GKI_MAX_TASKS]; /* ticks the task has to wait, for specific events */
@@ -326,12 +321,6 @@
BOOLEAN timer_nesting; /* flag to prevent timer interrupt nesting */
- /* Time queue arrays */
- TIMER_LIST_Q *timer_queues[GKI_MAX_TIMER_QUEUES];
- /* System tick callback */
- SYSTEM_TICK_CBACK *p_tick_cb;
- BOOLEAN system_tick_running; /* TRUE if system tick is running. Valid only if p_tick_cb is not NULL */
-
#if (GKI_DEBUG == TRUE)
UINT16 ExceptionCnt; /* number of GKI exceptions that have happened */
EXCEPTION_T Exception[GKI_MAX_EXCEPTION];
@@ -356,13 +345,6 @@
extern void gki_dealloc_free_queue(void);
#endif
-extern void OSStartRdy(void);
-extern void OSCtxSw(void);
-extern void OSIntCtxSw(void);
-extern void OSSched(void);
-extern void OSIntEnter(void);
-extern void OSIntExit(void);
-
/* Debug aids
*/
diff --git a/gki/common/gki_debug.c b/gki/common/gki_debug.c
index 46d7e38..adb9c46 100644
--- a/gki/common/gki_debug.c
+++ b/gki/common/gki_debug.c
@@ -50,22 +50,22 @@
UINT8 num = gki_cb.com.curr_total_no_of_pools;
UINT16 cur[GKI_NUM_TOTAL_BUF_POOLS];
- GKI_TRACE_0("");
- GKI_TRACE_0("--- GKI Buffer Pool Summary (R - restricted, P - public) ---");
+ GKI_TRACE("");
+ GKI_TRACE("--- GKI Buffer Pool Summary (R - restricted, P - public) ---");
- GKI_TRACE_0("POOL SIZE USED MAXU TOTAL");
- GKI_TRACE_0("------------------------------");
+ GKI_TRACE("POOL SIZE USED MAXU TOTAL");
+ GKI_TRACE("------------------------------");
for (i = 0; i < gki_cb.com.curr_total_no_of_pools; i++)
{
p = &gki_cb.com.freeq[i];
if ((1 << i) & gki_cb.com.pool_access_mask)
{
- GKI_TRACE_5("%02d: (R), %4d, %3d, %3d, %3d",
+ GKI_TRACE("%02d: (R), %4d, %3d, %3d, %3d",
i, p->size, p->cur_cnt, p->max_cnt, p->total);
}
else
{
- GKI_TRACE_5("%02d: (P), %4d, %3d, %3d, %3d",
+ GKI_TRACE("%02d: (P), %4d, %3d, %3d, %3d",
i, p->size, p->cur_cnt, p->max_cnt, p->total);
}
cur[i] = p->cur_cnt;
@@ -90,7 +90,7 @@
UINT16 i;
for(i=0; i<GKI_NUM_TOTAL_BUF_POOLS; i++)
{
- GKI_TRACE_5("pool:%4u free %4u cur %3u max %3u total%3u", i, gki_cb.com.freeq[i].size,
+ GKI_TRACE("pool:%4u free %4u cur %3u max %3u total%3u", i, gki_cb.com.freeq[i].size,
gki_cb.com.freeq[i].cur_cnt, gki_cb.com.freeq[i].max_cnt, gki_cb.com.freeq[i].total);
}
}
@@ -136,16 +136,16 @@
void GKI_print_task(void)
{
#ifdef _BT_WIN32
- GKI_TRACE_0("Service not available under insight");
+ GKI_TRACE("Service not available under insight");
#else
UINT8 TaskId;
- GKI_TRACE_0("TID TASKNAME STATE FREE_STACK STACK");
+ GKI_TRACE("TID TASKNAME STATE FREE_STACK STACK");
for(TaskId=0; TaskId < GKI_MAX_TASKS; TaskId++)
{
if (gki_cb.com.OSRdyTbl[TaskId] != TASK_DEAD)
{
- GKI_TRACE_5("%2u %-8s %-5s 0x%04X 0x%04X Bytes",
+ GKI_TRACE("%2u %-8s %-5s 0x%04X 0x%04X Bytes",
(UINT16)TaskId, gki_cb.com.OSTName[TaskId],
OSTaskStates[gki_cb.com.OSRdyTbl[TaskId]],
gki_calc_stack(TaskId), gki_cb.com.OSStackSize[TaskId]);
diff --git a/gki/common/gki_inet.h b/gki/common/gki_inet.h
deleted file mode 100644
index 6640931..0000000
--- a/gki/common/gki_inet.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/******************************************************************************
- *
- * Copyright (C) 2002-2012 Broadcom Corporation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- ******************************************************************************/
-#ifndef GKI_INET_H
-#define GKI_INET_H
-
-#include "data_types.h"
-
-#define htons ntohs
-#define htonl ntohl
-
-#define htonets nettohs
-#define htonetl nettohl
-
-#if BIG_ENDIAN == TRUE
-#define ntohs(n) (n)
-#define ntohl(n) (n)
-#define ntoh6(n) (n)
-
-#define nettohs(n) (n)
-#define nettohl(n) (n)
-#else
-extern UINT16 ntohs(UINT16 n);
-extern UINT32 ntohl(UINT32 n);
-extern UINT8 *ntoh6(UINT8 *p);
-
-#define nettohs(n) ((UINT16)((((n) << 8) & 0xff00) | (((n) >> 8) & 0x00ff)))
-#define nettohl(n) ((((n) & 0x000000ff) << 24) | (((n) << 8) & 0x00ff0000) | \
- (((n) >> 8) & 0x0000ff00) | (((n) >> 24) & 0x000000ff))
-#endif
-
-#endif /* GKI_INET_H */
-
diff --git a/gki/common/gki_time.c b/gki/common/gki_time.c
index a9af8fa..aa95195 100644
--- a/gki/common/gki_time.c
+++ b/gki/common/gki_time.c
@@ -16,13 +16,10 @@
*
******************************************************************************/
-
+#include <assert.h>
+#include <utils/Log.h>
#include "gki_int.h"
-#ifndef BT_ERROR_TRACE_0
-#define BT_ERROR_TRACE_0(l,m)
-#endif
-
/* Make sure that this has been defined in target.h */
#ifndef GKI_NUM_TIMERS
#error NO TIMERS: Must define at least 1 timer in the system!
@@ -30,8 +27,9 @@
#define GKI_NO_NEW_TMRS_STARTED (0x7fffffffL) /* Largest signed positive timer count */
-#define GKI_UNUSED_LIST_ENTRY (0x80000000L) /* Marks an unused timer list entry (initial value) */
-#define GKI_MAX_INT32 (0x7fffffffL)
+
+// Used for controlling alarms from AlarmService.
+extern void alarm_service_reschedule(void);
/*******************************************************************************
**
@@ -49,9 +47,6 @@
gki_cb.com.OSTicksTilExp = 0; /* Remaining time (of OSTimeCurTimeout) before next timer expires */
gki_cb.com.OSNumOrigTicks = 0;
-#if (defined(GKI_DELAY_STOP_SYS_TICK) && (GKI_DELAY_STOP_SYS_TICK > 0))
- gki_cb.com.OSTicksTilStop = 0; /* clear inactivity delay timer */
-#endif
for (tt = 0; tt < GKI_MAX_TASKS; tt++)
{
@@ -78,14 +73,6 @@
#endif
}
- for (tt = 0; tt < GKI_MAX_TIMER_QUEUES; tt++)
- {
- gki_cb.com.timer_queues[tt] = NULL;
- }
-
- gki_cb.com.p_tick_cb = NULL;
- gki_cb.com.system_tick_running = FALSE;
-
return;
}
@@ -216,38 +203,16 @@
GKI_disable();
- if(gki_timers_is_timer_running() == FALSE)
- {
-#if (defined(GKI_DELAY_STOP_SYS_TICK) && (GKI_DELAY_STOP_SYS_TICK > 0))
- /* if inactivity delay timer is not running, start system tick */
- if(gki_cb.com.OSTicksTilStop == 0)
- {
-#endif
- if(gki_cb.com.p_tick_cb)
- {
- /* start system tick */
- gki_cb.com.system_tick_running = TRUE;
- (gki_cb.com.p_tick_cb) (TRUE);
- }
-#if (defined(GKI_DELAY_STOP_SYS_TICK) && (GKI_DELAY_STOP_SYS_TICK > 0))
- }
- else
- {
- /* clear inactivity delay timer */
- gki_cb.com.OSTicksTilStop = 0;
- }
-#endif
- }
/* Add the time since the last task timer update.
** Note that this works when no timers are active since
** both OSNumOrigTicks and OSTicksTilExp are 0.
*/
- if (GKI_MAX_INT32 - (gki_cb.com.OSNumOrigTicks - gki_cb.com.OSTicksTilExp) > ticks)
+ if (INT32_MAX - (gki_cb.com.OSNumOrigTicks - gki_cb.com.OSTicksTilExp) > ticks)
{
ticks += gki_cb.com.OSNumOrigTicks - gki_cb.com.OSTicksTilExp;
}
else
- ticks = GKI_MAX_INT32;
+ ticks = INT32_MAX;
switch (tnum)
{
@@ -340,31 +305,6 @@
break;
#endif
}
-
- GKI_disable();
-
- if (gki_timers_is_timer_running() == FALSE)
- {
- if (gki_cb.com.p_tick_cb)
- {
-#if (defined(GKI_DELAY_STOP_SYS_TICK) && (GKI_DELAY_STOP_SYS_TICK > 0))
- /* if inactivity delay timer is not running */
- if ((gki_cb.com.system_tick_running)&&(gki_cb.com.OSTicksTilStop == 0))
- {
- /* set inactivity delay timer */
- /* when timer expires, system tick will be stopped */
- gki_cb.com.OSTicksTilStop = GKI_DELAY_STOP_SYS_TICK;
- }
-#else
- gki_cb.com.system_tick_running = FALSE;
- gki_cb.com.p_tick_cb(FALSE); /* stop system tick */
-#endif
- }
- }
-
- GKI_enable();
-
-
}
@@ -405,29 +345,12 @@
gki_cb.com.timer_nesting = 1;
-#if (defined(GKI_DELAY_STOP_SYS_TICK) && (GKI_DELAY_STOP_SYS_TICK > 0))
- /* if inactivity delay timer is set and expired */
- if (gki_cb.com.OSTicksTilStop)
- {
- if( gki_cb.com.OSTicksTilStop <= (UINT32)ticks_since_last_update )
- {
- if(gki_cb.com.p_tick_cb)
- {
- gki_cb.com.system_tick_running = FALSE;
- (gki_cb.com.p_tick_cb) (FALSE); /* stop system tick */
- }
- gki_cb.com.OSTicksTilStop = 0; /* clear inactivity delay timer */
- gki_cb.com.timer_nesting = 0;
- return;
- }
- else
- gki_cb.com.OSTicksTilStop -= ticks_since_last_update;
- }
-#endif
-
/* No need to update the ticks if no timeout has occurred */
if (gki_cb.com.OSTicksTilExp > 0)
{
+ // When using alarms from AlarmService we should
+ // always have work to be done here.
+ ALOGE("%s no work to be done when expected work", __func__);
gki_cb.com.timer_nesting = 0;
return;
}
@@ -441,15 +364,12 @@
*/
gki_cb.com.OSNumOrigTicks -= gki_cb.com.OSTicksTilExp;
-#if GKI_TIMER_LIST_NOPREEMPT == TRUE
/* Protect this section because if a GKI_timer_stop happens between:
* - gki_cb.com.OSTaskTmr0[task_id] -= gki_cb.com.OSNumOrigTicks;
* - gki_cb.com.OSTaskTmr0[task_id] = gki_cb.com.OSTaskTmr0R[task_id];
* then the timer may appear stopped while it is about to be reloaded.
- * Note: Not needed if this function cannot be preempted (typical).
*/
GKI_disable();
-#endif
/* Check for OS Task Timers */
for (task_id = 0; task_id < GKI_MAX_TASKS; task_id++)
@@ -474,12 +394,7 @@
{
/* Reload timer and set Timer 0 Expired event mask */
gki_cb.com.OSTaskTmr0[task_id] = gki_cb.com.OSTaskTmr0R[task_id];
-
-#if (defined(GKI_TIMER_UPDATES_FROM_ISR) && GKI_TIMER_UPDATES_FROM_ISR == TRUE)
- GKI_isend_event (task_id, TIMER_0_EVT_MASK);
-#else
GKI_send_event (task_id, TIMER_0_EVT_MASK);
-#endif
}
}
@@ -498,12 +413,7 @@
{
/* Reload timer and set Timer 1 Expired event mask */
gki_cb.com.OSTaskTmr1[task_id] = gki_cb.com.OSTaskTmr1R[task_id];
-
-#if (defined(GKI_TIMER_UPDATES_FROM_ISR) && GKI_TIMER_UPDATES_FROM_ISR == TRUE)
- GKI_isend_event (task_id, TIMER_1_EVT_MASK);
-#else
GKI_send_event (task_id, TIMER_1_EVT_MASK);
-#endif
}
}
@@ -522,12 +432,7 @@
{
/* Reload timer and set Timer 2 Expired event mask */
gki_cb.com.OSTaskTmr2[task_id] = gki_cb.com.OSTaskTmr2R[task_id];
-
-#if (defined(GKI_TIMER_UPDATES_FROM_ISR) && GKI_TIMER_UPDATES_FROM_ISR == TRUE)
- GKI_isend_event (task_id, TIMER_2_EVT_MASK);
-#else
GKI_send_event (task_id, TIMER_2_EVT_MASK);
-#endif
}
}
@@ -546,12 +451,7 @@
{
/* Reload timer and set Timer 3 Expired event mask */
gki_cb.com.OSTaskTmr3[task_id] = gki_cb.com.OSTaskTmr3R[task_id];
-
-#if (defined(GKI_TIMER_UPDATES_FROM_ISR) && GKI_TIMER_UPDATES_FROM_ISR == TRUE)
- GKI_isend_event (task_id, TIMER_3_EVT_MASK);
-#else
GKI_send_event (task_id, TIMER_3_EVT_MASK);
-#endif
}
}
@@ -561,12 +461,6 @@
#endif
}
-
-#if GKI_TIMER_LIST_NOPREEMPT == TRUE
- /* End the critical section */
- GKI_enable();
-#endif
-
/* Set the next timer experation value if there is one to start */
if (next_expiration < GKI_NO_NEW_TMRS_STARTED)
{
@@ -577,57 +471,16 @@
gki_cb.com.OSTicksTilExp = gki_cb.com.OSNumOrigTicks = 0;
}
+ // Set alarm service for next alarm.
+ alarm_service_reschedule();
+
+ GKI_enable();
+
gki_cb.com.timer_nesting = 0;
return;
}
-
-/*******************************************************************************
-**
-** Function GKI_timer_queue_empty
-**
-** Description This function is called by applications to see whether the timer
-** queue is empty
-**
-** Parameters
-**
-** Returns BOOLEAN
-**
-*******************************************************************************/
-BOOLEAN GKI_timer_queue_empty (void)
-{
- UINT8 tt;
-
- for (tt = 0; tt < GKI_MAX_TIMER_QUEUES; tt++)
- {
- if (gki_cb.com.timer_queues[tt])
- return FALSE;
- }
-
- return TRUE;
-}
-
-/*******************************************************************************
-**
-** Function GKI_timer_queue_register_callback
-**
-** Description This function is called by applications to register system tick
-** start/stop callback for time queues
-**
-**
-** Parameters p_callback - (input) pointer to the system tick callback
-**
-** Returns BOOLEAN
-**
-*******************************************************************************/
-void GKI_timer_queue_register_callback (SYSTEM_TICK_CBACK *p_callback)
-{
- gki_cb.com.p_tick_cb = p_callback;
-
- return;
-}
-
/*******************************************************************************
**
** Function GKI_init_timer_list
@@ -640,36 +493,26 @@
** Returns void
**
*******************************************************************************/
-void GKI_init_timer_list (TIMER_LIST_Q *p_timer_listq)
-{
- p_timer_listq->p_first = NULL;
- p_timer_listq->p_last = NULL;
- p_timer_listq->last_ticks = 0;
-
- return;
+void GKI_init_timer_list(TIMER_LIST_Q *timer_q) {
+ timer_q->p_first = NULL;
+ timer_q->p_last = NULL;
}
-/*******************************************************************************
-**
-** Function GKI_init_timer_list_entry
-**
-** Description This function is called by the applications when they
-** want to initialize a timer list entry. This must be
-** done prior to first use of the entry.
-**
-** Parameters p_tle - (input) pointer to a timer list queue entry
-**
-** Returns void
-**
-*******************************************************************************/
-void GKI_init_timer_list_entry (TIMER_LIST_ENT *p_tle)
-{
- p_tle->p_next = NULL;
- p_tle->p_prev = NULL;
- p_tle->ticks = GKI_UNUSED_LIST_ENTRY;
- p_tle->in_use = FALSE;
+bool GKI_timer_queue_is_empty(const TIMER_LIST_Q *timer_q) {
+ assert(timer_q != NULL);
+ return (timer_q->p_first == NULL);
}
+TIMER_LIST_ENT *GKI_timer_getfirst(const TIMER_LIST_Q *timer_q) {
+ assert(timer_q != NULL);
+ return timer_q->p_first;
+}
+
+/* Returns the initial number of ticks for this timer entry. */
+INT32 GKI_timer_ticks_getinitial(const TIMER_LIST_ENT *tle) {
+ assert(tle != NULL);
+ return tle->ticks_initial;
+}
/*******************************************************************************
**
@@ -729,17 +572,6 @@
p_tle = p_tle->p_next;
}
- if (p_timer_listq->last_ticks > 0)
- {
- p_timer_listq->last_ticks -= num_units_since_last_update;
-
- /* If the last timer has expired set last_ticks to 0 so that other list update
- * functions will calculate correctly
- */
- if (p_timer_listq->last_ticks < 0)
- p_timer_listq->last_ticks = 0;
- }
-
return (num_time_out);
}
@@ -780,14 +612,9 @@
}
else
{
- BT_ERROR_TRACE_0(TRACE_LAYER_GKI, "GKI_get_remaining_ticks: No timer entry in the list");
return(0);
}
}
- else
- {
- BT_ERROR_TRACE_0(TRACE_LAYER_GKI, "GKI_get_remaining_ticks: timer entry is not active");
- }
return (rem_ticks);
}
@@ -810,86 +637,49 @@
*******************************************************************************/
void GKI_add_to_timer_list (TIMER_LIST_Q *p_timer_listq, TIMER_LIST_ENT *p_tle)
{
- UINT32 nr_ticks_total;
- UINT8 tt;
- TIMER_LIST_ENT *p_temp;
+ /* Only process valid tick values. */
+ if (p_tle->ticks < 0)
+ return;
- /* Only process valid tick values */
- if (p_tle->ticks >= 0)
+ p_tle->p_prev = NULL;
+ p_tle->p_next = NULL;
+ p_tle->in_use = true;
+
+ /* Insert at head. */
+ if (p_timer_listq->p_first == NULL)
{
- /* If this entry is the last in the list */
- if (p_tle->ticks >= p_timer_listq->last_ticks)
- {
- /* If this entry is the only entry in the list */
- if (p_timer_listq->p_first == NULL)
- p_timer_listq->p_first = p_tle;
- else
- {
- /* Insert the entry onto the end of the list */
- if (p_timer_listq->p_last != NULL)
- p_timer_listq->p_last->p_next = p_tle;
-
- p_tle->p_prev = p_timer_listq->p_last;
- }
-
- p_tle->p_next = NULL;
- p_timer_listq->p_last = p_tle;
- nr_ticks_total = p_tle->ticks;
- p_tle->ticks -= p_timer_listq->last_ticks;
-
- p_timer_listq->last_ticks = nr_ticks_total;
- }
- else /* This entry needs to be inserted before the last entry */
- {
- /* Find the entry that the new one needs to be inserted in front of */
- p_temp = p_timer_listq->p_first;
- while (p_tle->ticks > p_temp->ticks)
- {
- /* Update the tick value if looking at an unexpired entry */
- if (p_temp->ticks > 0)
- p_tle->ticks -= p_temp->ticks;
-
- p_temp = p_temp->p_next;
- }
-
- /* The new entry is the first in the list */
- if (p_temp == p_timer_listq->p_first)
- {
- p_tle->p_next = p_timer_listq->p_first;
- p_timer_listq->p_first->p_prev = p_tle;
- p_timer_listq->p_first = p_tle;
- }
- else
- {
- p_temp->p_prev->p_next = p_tle;
- p_tle->p_prev = p_temp->p_prev;
- p_temp->p_prev = p_tle;
- p_tle->p_next = p_temp;
- }
- p_temp->ticks -= p_tle->ticks;
- }
-
- p_tle->in_use = TRUE;
-
- /* if we already add this timer queue to the array */
- for (tt = 0; tt < GKI_MAX_TIMER_QUEUES; tt++)
- {
- if (gki_cb.com.timer_queues[tt] == p_timer_listq)
- return;
- }
- /* add this timer queue to the array */
- for (tt = 0; tt < GKI_MAX_TIMER_QUEUES; tt++)
- {
- if (gki_cb.com.timer_queues[tt] == NULL)
- break;
- }
- if (tt < GKI_MAX_TIMER_QUEUES)
- {
- gki_cb.com.timer_queues[tt] = p_timer_listq;
- }
+ p_timer_listq->p_first = p_tle;
+ p_timer_listq->p_last = p_tle;
+ return;
}
- return;
+ /* Find the node before which we need to insert p_tle. */
+ TIMER_LIST_ENT *i = p_timer_listq->p_first;
+ while (i && p_tle->ticks > i->ticks)
+ {
+ if (i->ticks > 0)
+ p_tle->ticks -= i->ticks;
+ i = i->p_next;
+ }
+
+ /* Insert at tail. */
+ if (!i)
+ {
+ p_timer_listq->p_last->p_next = p_tle;
+ p_tle->p_prev = p_timer_listq->p_last;
+ p_timer_listq->p_last = p_tle;
+ return;
+ }
+
+ p_tle->p_prev = i->p_prev;
+ if (p_tle->p_prev)
+ p_tle->p_prev->p_next = p_tle;
+ p_tle->p_next = i;
+ i->p_prev = p_tle;
+ i->ticks -= p_tle->ticks;
+
+ if (p_timer_listq->p_first == i)
+ p_timer_listq->p_first = p_tle;
}
@@ -903,18 +693,16 @@
** Parameters p_timer_listq - (input) pointer to the timer list queue object
** p_tle - (input) pointer to a timer list queue entry
**
-** Returns void
+** Returns TRUE if the entry has been unlinked successfully
**
*******************************************************************************/
-void GKI_remove_from_timer_list (TIMER_LIST_Q *p_timer_listq, TIMER_LIST_ENT *p_tle)
+BOOLEAN GKI_remove_from_timer_list (TIMER_LIST_Q *p_timer_listq, TIMER_LIST_ENT *p_tle)
{
UINT8 tt;
/* Verify that the entry is valid */
- if (p_tle == NULL || p_tle->in_use == FALSE || p_timer_listq->p_first == NULL)
- {
- return;
- }
+ if (p_tle == NULL || p_timer_listq->p_first == NULL)
+ return FALSE;
/* Add the ticks remaining in this timer (if any) to the next guy in the list.
** Note: Expired timers have a tick value of '0'.
@@ -923,10 +711,9 @@
{
p_tle->p_next->ticks += p_tle->ticks;
}
- else
- {
- p_timer_listq->last_ticks -= p_tle->ticks;
- }
+
+ p_tle->ticks = 0;
+ p_tle->in_use = FALSE;
/* Unlink timer from the list.
*/
@@ -954,39 +741,17 @@
if (p_tle->p_next != NULL && p_tle->p_next->p_prev == p_tle)
p_tle->p_next->p_prev = p_tle->p_prev;
else
- {
- /* Error case - chain messed up ?? */
- return;
- }
+ return FALSE; // Timer list broken?!
if (p_tle->p_prev != NULL && p_tle->p_prev->p_next == p_tle)
p_tle->p_prev->p_next = p_tle->p_next;
else
- {
- /* Error case - chain messed up ?? */
- return;
- }
+ return FALSE; // Timer list broken?!
}
}
p_tle->p_next = p_tle->p_prev = NULL;
- p_tle->ticks = GKI_UNUSED_LIST_ENTRY;
- p_tle->in_use = FALSE;
-
- /* if timer queue is empty */
- if (p_timer_listq->p_first == NULL && p_timer_listq->p_last == NULL)
- {
- for (tt = 0; tt < GKI_MAX_TIMER_QUEUES; tt++)
- {
- if (gki_cb.com.timer_queues[tt] == p_timer_listq)
- {
- gki_cb.com.timer_queues[tt] = NULL;
- break;
- }
- }
- }
-
- return;
+ return TRUE;
}
@@ -1016,6 +781,7 @@
{
gki_cb.com.OSNumOrigTicks = (gki_cb.com.OSNumOrigTicks - gki_cb.com.OSTicksTilExp) + ticks;
gki_cb.com.OSTicksTilExp = ticks;
+ alarm_service_reschedule();
}
}
diff --git a/gki/ulinux/data_types.h b/gki/ulinux/data_types.h
index 33b8bb7..14b5899 100644
--- a/gki/ulinux/data_types.h
+++ b/gki/ulinux/data_types.h
@@ -19,55 +19,38 @@
#ifndef DATA_TYPES_H
#define DATA_TYPES_H
-#ifndef NULL
-#define NULL 0
-#endif
+#include <stdint.h>
+#include <stdbool.h>
#ifndef FALSE
-#define FALSE 0
+# define FALSE false
#endif
-typedef unsigned char UINT8;
-typedef unsigned short UINT16;
-typedef unsigned long UINT32;
-typedef unsigned long long UINT64;
+#ifndef TRUE
+# define TRUE true
+#endif
-typedef signed long INT32;
-typedef signed char INT8;
-typedef signed short INT16;
-typedef unsigned char BOOLEAN;
+typedef uint8_t UINT8;
+typedef uint16_t UINT16;
+typedef uint32_t UINT32;
+typedef uint64_t UINT64;
+typedef int8_t INT8;
+typedef int16_t INT16;
+typedef int32_t INT32;
+typedef bool BOOLEAN;
typedef UINT32 TIME_STAMP;
-#ifndef TRUE
-#define TRUE (!FALSE)
-#endif
-
-typedef unsigned char UBYTE;
-
#ifdef __arm
-#define PACKED __packed
-#define INLINE __inline
+# define PACKED __packed
+# define INLINE __inline
#else
-#define PACKED
-#define INLINE
+# define PACKED
+# define INLINE
#endif
-#ifndef BIG_ENDIAN
-#define BIG_ENDIAN FALSE
-#endif
-
-#define UINT16_LOW_BYTE(x) ((x) & 0xff)
-#define UINT16_HI_BYTE(x) ((x) >> 8)
-
-
-#define BCM_STRCAT_S(x1,x2,x3) strcat((x1),(x3))
-#define BCM_STRNCAT_S(x1,x2,x3,x4) strncat((x1),(x3),(x4))
#define BCM_STRCPY_S(x1,x2,x3) strcpy((x1),(x3))
#define BCM_STRNCPY_S(x1,x2,x3,x4) strncpy((x1),(x3),(x4))
-
-
#endif
-
diff --git a/gki/ulinux/gki_int.h b/gki/ulinux/gki_int.h
index d1cc68c..ec9b1cb 100644
--- a/gki/ulinux/gki_int.h
+++ b/gki/ulinux/gki_int.h
@@ -53,21 +53,6 @@
#define GKI_LINUX_TIMER_TICK_PRIORITY GKI_LINUX_BASE_PRIORITY+2
#endif
-/* the AV timer should preferably run above the gki timer tick to ensure precise AV timing
- * If you observe AV jitter under have load you may increase this one */
-#ifndef GKI_LINUX_AV_TIMER_PRIORITY
-#define GKI_LINUX_AV_TIMER_PRIORITY GKI_LINUX_BASE_PRIORITY+3
-#endif
-
-/* defines by how much the nice value of the PROCESS should be changed. Values allowed:
- * -19 to +19. a negative value give higher priority to btld compared to the default nice value
- * of 20. in case of SCHED_NORMAL, a level of -5 should give a good btld/bt performance.
- * In case of real time scheduling, leave default value.
- */
-#ifndef GKI_LINUX_DEFAULT_NICE_INC
-#define GKI_LINUX_DEFAULT_NICE_INC -7
-#endif
-
typedef struct
{
pthread_mutex_t GKI_mutex;
@@ -76,18 +61,11 @@
pthread_cond_t thread_evt_cond[GKI_MAX_TASKS];
pthread_mutex_t thread_timeout_mutex[GKI_MAX_TASKS];
pthread_cond_t thread_timeout_cond[GKI_MAX_TASKS];
- int no_timer_suspend; /* 1: no suspend, 0 stop calling GKI_timer_update() */
- pthread_mutex_t gki_timer_mutex;
- pthread_cond_t gki_timer_cond;
#if (GKI_DEBUG == TRUE)
pthread_mutex_t GKI_trace_mutex;
#endif
} tGKI_OS;
-/* condition to exit or continue GKI_run() timer loop */
-#define GKI_TIMER_TICK_RUN_COND 1
-#define GKI_TIMER_TICK_STOP_COND 0
-
extern void gki_system_tick_start_stop_cback(BOOLEAN start);
/* Contains common control block as well as OS specific variables */
@@ -114,4 +92,3 @@
#endif
#endif
-
diff --git a/gki/ulinux/gki_ulinux.c b/gki/ulinux/gki_ulinux.c
old mode 100755
new mode 100644
index a66a32f..0c22d23
--- a/gki/ulinux/gki_ulinux.c
+++ b/gki/ulinux/gki_ulinux.c
@@ -25,79 +25,45 @@
**
*****************************************************************************/
-#include <stdio.h>
-#include <stdarg.h>
-#include <errno.h>
+#include <assert.h>
#include <sys/times.h>
-#include <hardware/bluetooth.h>
-#include <pthread.h> /* must be 1st header defined */
-#include <time.h>
#include "gki_int.h"
#include "bt_utils.h"
#define LOG_TAG "GKI_LINUX"
#include <utils/Log.h>
+#include <hardware/bluetooth.h>
/*****************************************************************************
** Constants & Macros
******************************************************************************/
-#ifndef GKI_TICK_TIMER_DEBUG
-#define GKI_TICK_TIMER_DEBUG FALSE
-#endif
-
-#define GKI_INFO(fmt, ...) ALOGI ("%s: " fmt, __FUNCTION__, ## __VA_ARGS__)
-
-/* always log errors */
-#define GKI_ERROR_LOG(fmt, ...) ALOGE ("##### ERROR : %s: " fmt "#####", __FUNCTION__, ## __VA_ARGS__)
-
-#if defined (GKI_TICK_TIMER_DEBUG) && (GKI_TICK_TIMER_DEBUG == TRUE)
-#define GKI_TIMER_TRACE(fmt, ...) ALOGI ("%s: " fmt, __FUNCTION__, ## __VA_ARGS__)
-#else
-#define GKI_TIMER_TRACE(fmt, ...)
-#endif
-
-
#define SCHED_NORMAL 0
#define SCHED_FIFO 1
#define SCHED_RR 2
#define SCHED_BATCH 3
-#define NANOSEC_PER_MILLISEC (1000000)
-#define NSEC_PER_SEC (1000*NANOSEC_PER_MILLISEC)
+#define NANOSEC_PER_MILLISEC 1000000
+#define NSEC_PER_SEC (1000 * NANOSEC_PER_MILLISEC)
+#define USEC_PER_SEC 1000000
+#define NSEC_PER_USEC 1000
-/* works only for 1ms to 1000ms heart beat ranges */
-#define LINUX_SEC (1000/TICKS_PER_SEC)
-
-#define LOCK(m) pthread_mutex_lock(&m)
-#define UNLOCK(m) pthread_mutex_unlock(&m)
-#define INIT(m) pthread_mutex_init(&m, NULL)
-
+#define WAKE_LOCK_ID "bluedroid_timer"
#if GKI_DYNAMIC_MEMORY == FALSE
tGKI_CB gki_cb;
#endif
-#ifdef NO_GKI_RUN_RETURN
-static pthread_t timer_thread_id = 0;
-static int shutdown_timer = 0;
-#endif
-
#ifndef GKI_SHUTDOWN_EVT
#define GKI_SHUTDOWN_EVT APPL_EVT_7
#endif
-#define __likely(cond) __builtin_expect(!!(cond), 1)
-#define __unlikely(cond) __builtin_expect(!!(cond), 0)
-
/*****************************************************************************
** Local type definitions
******************************************************************************/
-#define pthread_cond_timedwait_monotonic pthread_cond_timedwait
-
typedef struct
{
UINT8 task_id; /* GKI task id */
@@ -105,48 +71,172 @@
UINT32 params; /* Extra params to pass to task entry function */
} gki_pthread_info_t;
+// Alarm service structure used to pass up via JNI to the bluetooth
+// app in order to create a wakeable Alarm.
+typedef struct
+{
+ UINT32 ticks_scheduled;
+ UINT64 timer_started_us;
+ UINT64 timer_last_expired_us;
+ bool wakelock;
+} alarm_service_t;
/*****************************************************************************
** Static variables
******************************************************************************/
-int g_GkiTimerWakeLockOn = 0;
gki_pthread_info_t gki_pthread_info[GKI_MAX_TASKS];
-bt_wakelock_callback config_wakelock_callback = NULL;
-/*****************************************************************************
-** Static functions
-******************************************************************************/
+// Only a single alarm is used to wake bluedroid.
+// NOTE: Must be manipulated with the GKI_disable() lock held.
+static alarm_service_t alarm_service;
+
+static timer_t posix_timer;
+static bool timer_created;
+
+
+// If the next wakeup time is less than this threshold, we should acquire
+// a wakelock instead of setting a wake alarm so we're not bouncing in
+// and out of suspend frequently.
+static const uint32_t TIMER_INTERVAL_FOR_WAKELOCK_IN_MS = 3000;
/*****************************************************************************
** Externs
******************************************************************************/
-
+extern bt_os_callouts_t *bt_os_callouts;
/*****************************************************************************
** Functions
******************************************************************************/
-/* send a given byte into the wakelock pipe */
-static void wakelock_op_gki(unsigned char op)
+static UINT64 now_us()
{
- if (!config_wakelock_callback)
- GKI_ERROR_LOG("Cannot perform wakelock operation with no callback\n");
+ struct timespec ts_now;
+ clock_gettime(CLOCK_BOOTTIME, &ts_now);
+ return ((UINT64)ts_now.tv_sec * USEC_PER_SEC) + ((UINT64)ts_now.tv_nsec / NSEC_PER_USEC);
+}
+
+static bool set_nonwake_alarm(UINT64 delay_millis)
+{
+ if (!timer_created)
+ {
+ ALOGE("%s timer is not available, not setting timer for %llums", __func__, delay_millis);
+ return false;
+ }
+
+ const UINT64 now = now_us();
+ alarm_service.timer_started_us = now;
+
+ UINT64 prev_timer_delay = 0;
+ if (alarm_service.timer_last_expired_us)
+ prev_timer_delay = now - alarm_service.timer_last_expired_us;
+
+ UINT64 delay_micros = delay_millis * 1000;
+ if (delay_micros > prev_timer_delay)
+ delay_micros -= prev_timer_delay;
else
- config_wakelock_callback(op);
+ delay_micros = 1;
+
+ struct itimerspec new_value;
+ memset(&new_value, 0, sizeof(new_value));
+ new_value.it_value.tv_sec = (delay_micros / USEC_PER_SEC);
+ new_value.it_value.tv_nsec = (delay_micros % USEC_PER_SEC) * NSEC_PER_USEC;
+ if (timer_settime(posix_timer, 0, &new_value, NULL) == -1)
+ {
+ ALOGE("%s unable to set timer: %s", __func__, strerror(errno));
+ return false;
+ }
+ return true;
}
-/* release a wakelock by sending a zero down the pipe */
-static void release_wake_lock_gki(void)
+/** Callback from Java thread after alarm from AlarmService fires. */
+static void bt_alarm_cb(void *data)
{
- wakelock_op_gki(0);
+ alarm_service.timer_last_expired_us = now_us();
+ UINT32 ticks_taken = GKI_MS_TO_TICKS((alarm_service.timer_last_expired_us
+ - alarm_service.timer_started_us) / 1000);
+
+ GKI_timer_update(ticks_taken > alarm_service.ticks_scheduled
+ ? ticks_taken : alarm_service.ticks_scheduled);
}
-/* acquire a wakelock by sending a one down the pipe */
-static void acquire_wake_lock_gki(void)
+/** NOTE: This is only called on init and may be called without the GKI_disable()
+ * lock held.
+ */
+static void alarm_service_init()
{
- wakelock_op_gki(1);
+ alarm_service.ticks_scheduled = 0;
+ alarm_service.timer_started_us = 0;
+ alarm_service.timer_last_expired_us = 0;
+ alarm_service.wakelock = FALSE;
+ raise_priority_a2dp(TASK_JAVA_ALARM);
+}
+
+/** Requests an alarm from AlarmService to fire when the next
+ * timer in the timer queue is set to expire. Only takes a wakelock
+ * if the timer tick expiration is a short interval in the future
+ * and releases the wakelock if the timer is a longer interval
+ * or if there are no more timers in the queue.
+ *
+ * NOTE: Must be called with GKI_disable() lock held.
+ */
+void alarm_service_reschedule()
+{
+ int32_t ticks_till_next_exp = GKI_ready_to_sleep();
+
+ assert(ticks_till_next_exp >= 0);
+ alarm_service.ticks_scheduled = ticks_till_next_exp;
+
+ // No more timers remaining. Release wakelock if we're holding one.
+ if (ticks_till_next_exp == 0)
+ {
+ alarm_service.timer_last_expired_us = 0;
+ alarm_service.timer_started_us = 0;
+ if (alarm_service.wakelock)
+ {
+ ALOGV("%s releasing wake lock.", __func__);
+ alarm_service.wakelock = false;
+ int rc = bt_os_callouts->release_wake_lock(WAKE_LOCK_ID);
+ if (rc != BT_STATUS_SUCCESS)
+ {
+ ALOGE("%s unable to release wake lock with no timers: %d", __func__, rc);
+ }
+ }
+ ALOGV("%s no more alarms.", __func__);
+ return;
+ }
+
+ UINT64 ticks_in_millis = GKI_TICKS_TO_MS(ticks_till_next_exp);
+ if (ticks_in_millis <= TIMER_INTERVAL_FOR_WAKELOCK_IN_MS)
+ {
+ // The next deadline is close, just take a wakelock and set a regular (non-wake) timer.
+ int rc = bt_os_callouts->acquire_wake_lock(WAKE_LOCK_ID);
+ if (rc != BT_STATUS_SUCCESS)
+ {
+ ALOGE("%s unable to acquire wake lock: %d", __func__, rc);
+ return;
+ }
+ alarm_service.wakelock = true;
+ ALOGV("%s acquired wake lock, setting short alarm (%lldms).", __func__, ticks_in_millis);
+
+ if (!set_nonwake_alarm(ticks_in_millis))
+ {
+ ALOGE("%s unable to set short alarm.", __func__);
+ }
+ } else {
+ // The deadline is far away, set a wake alarm and release wakelock if we're holding it.
+ alarm_service.timer_started_us = now_us();
+ alarm_service.timer_last_expired_us = 0;
+ if (!bt_os_callouts->set_wake_alarm(ticks_in_millis, true, bt_alarm_cb, &alarm_service))
+ {
+ ALOGE("%s unable to set long alarm, releasing wake lock anyway.", __func__);
+ } else {
+ ALOGV("%s set long alarm (%lldms), releasing wake lock.", __func__, ticks_in_millis);
+ }
+ alarm_service.wakelock = false;
+ bt_os_callouts->release_wake_lock(WAKE_LOCK_ID);
+ }
}
@@ -159,26 +249,24 @@
** Returns void
**
*******************************************************************************/
-
-void gki_task_entry(UINT32 params)
+static void gki_task_entry(UINT32 params)
{
gki_pthread_info_t *p_pthread_info = (gki_pthread_info_t *)params;
gki_cb.os.thread_id[p_pthread_info->task_id] = pthread_self();
prctl(PR_SET_NAME, (unsigned long)gki_cb.com.OSTName[p_pthread_info->task_id], 0, 0, 0);
- GKI_INFO("gki_task_entry task_id=%i [%s] starting\n", p_pthread_info->task_id,
+ ALOGI("gki_task_entry task_id=%i [%s] starting\n", p_pthread_info->task_id,
gki_cb.com.OSTName[p_pthread_info->task_id]);
/* Call the actual thread entry point */
(p_pthread_info->task_entry)(p_pthread_info->params);
- GKI_INFO("gki_task task_id=%i [%s] terminating\n", p_pthread_info->task_id,
+ ALOGI("gki_task task_id=%i [%s] terminating\n", p_pthread_info->task_id,
gki_cb.com.OSTName[p_pthread_info->task_id]);
pthread_exit(0); /* GKI tasks have no return value */
}
-/* end android */
/*******************************************************************************
**
@@ -200,6 +288,8 @@
gki_buffer_init();
gki_timers_init();
+ alarm_service_init();
+
gki_cb.com.OSTicks = (UINT32) times(0);
pthread_mutexattr_init(&attr);
@@ -216,13 +306,17 @@
/* pthread_mutex_init(&thread_delay_mutex, NULL); */ /* used in GKI_delay */
/* pthread_cond_init (&thread_delay_cond, NULL); */
- /* Initialiase GKI_timer_update suspend variables & mutexes to be in running state.
- * this works too even if GKI_NO_TICK_STOP is defined in btld.txt */
- p_os->no_timer_suspend = GKI_TIMER_TICK_RUN_COND;
- pthread_mutex_init(&p_os->gki_timer_mutex, NULL);
-#ifndef NO_GKI_RUN_RETURN
- pthread_cond_init(&p_os->gki_timer_cond, NULL);
-#endif
+ struct sigevent sigevent;
+ memset(&sigevent, 0, sizeof(sigevent));
+ sigevent.sigev_notify = SIGEV_THREAD;
+ sigevent.sigev_notify_function = (void (*)(union sigval))bt_alarm_cb;
+ sigevent.sigev_value.sival_ptr = NULL;
+ if (timer_create(CLOCK_REALTIME, &sigevent, &posix_timer) == -1) {
+ ALOGE("%s unable to create POSIX timer: %s", __func__, strerror(errno));
+ timer_created = false;
+ } else {
+ timer_created = true;
+ }
}
@@ -237,8 +331,7 @@
*******************************************************************************/
UINT32 GKI_get_os_tick_count(void)
{
- /* TODO - add any OS specific code here */
- return (gki_cb.com.OSTicks);
+ return gki_cb.com.OSTicks;
}
/*******************************************************************************
@@ -275,7 +368,7 @@
if (task_id >= GKI_MAX_TASKS)
{
- GKI_ERROR_LOG("Error! task ID > max task allowed");
+ ALOGE("Error! task ID > max task allowed");
return (GKI_FAILURE);
}
@@ -286,8 +379,12 @@
gki_cb.com.OSWaitEvt[task_id] = 0;
/* Initialize mutex and condition variable objects for events and timeouts */
+ pthread_condattr_t cond_attr;
+ pthread_condattr_init(&cond_attr);
+ pthread_condattr_setclock(&cond_attr, CLOCK_MONOTONIC);
+
pthread_mutex_init(&gki_cb.os.thread_evt_mutex[task_id], NULL);
- pthread_cond_init (&gki_cb.os.thread_evt_cond[task_id], NULL);
+ pthread_cond_init (&gki_cb.os.thread_evt_cond[task_id], &cond_attr);
pthread_mutex_init(&gki_cb.os.thread_timeout_mutex[task_id], NULL);
pthread_cond_init (&gki_cb.os.thread_timeout_cond[task_id], NULL);
@@ -314,7 +411,7 @@
if (ret != 0)
{
- GKI_ERROR_LOG("pthread_create failed(%d), %s!\n\r", ret, taskname);
+ ALOGE("pthread_create failed(%d), %s!", ret, taskname);
return GKI_FAILURE;
}
@@ -399,11 +496,11 @@
result = pthread_join( gki_cb.os.thread_id[task_id], NULL );
if ( result < 0 )
{
- GKI_ERROR_LOG( "pthread_join() FAILED: result: %d", result );
+ ALOGE( "pthread_join() FAILED: result: %d", result );
}
#endif
GKI_exit_task(task_id);
- GKI_INFO( "GKI_shutdown(): task [%s] terminated\n", gki_cb.com.OSTName[task_id]);
+ ALOGI( "GKI_shutdown(): task [%s] terminated\n", gki_cb.com.OSTName[task_id]);
}
}
@@ -431,7 +528,7 @@
if (task_id != my_task_id)
{
- GKI_ERROR_LOG("%s: Wrong context - current task %d is not the given task id %d",\
+ ALOGE("%s: Wrong context - current task %d is not the given task id %d",\
__FUNCTION__, my_task_id, task_id);
return;
}
@@ -524,7 +621,6 @@
ALOGE( "pthread_join() FAILED: result: %d", result );
}
#endif
- // GKI_ERROR_LOG( "GKI_shutdown(): task %s dead\n", gki_cb.com.OSTName[task_id]);
GKI_exit_task(task_id - 1);
}
}
@@ -542,203 +638,12 @@
i = 0;
#endif
-#ifdef NO_GKI_RUN_RETURN
- shutdown_timer = 1;
-#endif
- if (g_GkiTimerWakeLockOn)
- {
- GKI_TRACE("GKI_shutdown : release_wake_lock_gki()");
- release_wake_lock_gki();
- g_GkiTimerWakeLockOn = 0;
+ if (timer_created) {
+ timer_delete(posix_timer);
+ timer_created = false;
}
}
-/*******************************************************************************
- **
- ** Function gki_system_tick_start_stop_cback
- **
- ** Description This function runs a task
- **
- ** Parameters: start: TRUE start system tick (again), FALSE stop
- **
- ** Returns void
- **
- *********************************************************************************/
-
-void gki_system_tick_start_stop_cback(BOOLEAN start)
-{
- tGKI_OS *p_os = &gki_cb.os;
- int *p_run_cond = &p_os->no_timer_suspend;
- static int wake_lock_count;
-
- if ( FALSE == start )
- {
- /* gki_system_tick_start_stop_cback() maybe called even so it was already stopped! */
- if (GKI_TIMER_TICK_RUN_COND == *p_run_cond)
- {
-#ifdef NO_GKI_RUN_RETURN
- /* take free mutex to block timer thread */
- pthread_mutex_lock(&p_os->gki_timer_mutex);
-#endif
- /* this can lead to a race condition. however as we only read this variable in the
- * timer loop we should be fine with this approach. otherwise uncomment below mutexes.
- */
- /* GKI_disable(); */
- *p_run_cond = GKI_TIMER_TICK_STOP_COND;
- /* GKI_enable(); */
-
- GKI_TIMER_TRACE(">>> STOP GKI_timer_update(), wake_lock_count:%d", --wake_lock_count);
-
- release_wake_lock_gki();
- g_GkiTimerWakeLockOn = 0;
- }
- }
- else
- {
- /* restart GKI_timer_update() loop */
- acquire_wake_lock_gki();
-
- g_GkiTimerWakeLockOn = 1;
- *p_run_cond = GKI_TIMER_TICK_RUN_COND;
-
-#ifdef NO_GKI_RUN_RETURN
- pthread_mutex_unlock( &p_os->gki_timer_mutex );
-#else
- pthread_mutex_lock( &p_os->gki_timer_mutex );
- pthread_cond_signal( &p_os->gki_timer_cond );
- pthread_mutex_unlock( &p_os->gki_timer_mutex );
-#endif
-
- GKI_TIMER_TRACE(">>> START GKI_timer_update(), wake_lock_count:%d", ++wake_lock_count );
- }
-}
-
-
-/*******************************************************************************
-**
-** Function GKI_run
-**
-** Description This function runs a task
-****
-** Returns void
-**
-** NOTE This function is only needed for operating systems where
-** starting a task is a 2-step process. Most OS's do it in
-** one step, If your OS does it in one step, this function
-** should be empty.
-*********************************************************************************/
-#ifdef NO_GKI_RUN_RETURN
-void* timer_thread(void *arg)
-{
- int timeout_ns=0;
- struct timespec timeout;
- struct timespec previous = {0,0};
- struct timespec current;
- int err;
- int delta_ns;
- int restart;
- tGKI_OS *p_os = &gki_cb.os;
- int *p_run_cond = &p_os->no_timer_suspend;
- (void)arg;
-
- /* Indicate that tick is just starting */
- restart = 1;
-
- prctl(PR_SET_NAME, (unsigned long)"gki timer", 0, 0, 0);
-
- raise_priority_a2dp(TASK_HIGH_GKI_TIMER);
-
- while(!shutdown_timer)
- {
- /* If the timer has been stopped (no SW timer running) */
- if (*p_run_cond == GKI_TIMER_TICK_STOP_COND)
- {
- /*
- * We will lock/wait on GKI_timer_mutex.
- * This mutex will be unlocked when timer is re-started
- */
- GKI_TRACE("GKI_run lock mutex");
- pthread_mutex_lock(&p_os->gki_timer_mutex);
-
- /* We are here because the mutex has been released by timer cback */
- /* Let's release it for future use */
- GKI_TRACE("GKI_run unlock mutex");
- pthread_mutex_unlock(&p_os->gki_timer_mutex);
-
- /* Indicate that tick is just starting */
- restart = 1;
- }
-
- /* Get time */
- clock_gettime(CLOCK_MONOTONIC, ¤t);
-
- /* Check if tick was just restarted, indicating to the compiler that this is
- * unlikely to happen (to help branch prediction) */
- if (__unlikely(restart))
- {
- /* Clear the restart indication */
- restart = 0;
-
- timeout_ns = (GKI_TICKS_TO_MS(1) * 1000000);
- }
- else
- {
- /* Compute time elapsed since last sleep start */
- delta_ns = current.tv_nsec - previous.tv_nsec;
- delta_ns += (current.tv_sec - previous.tv_sec) * 1000000000;
-
- /* Compute next timeout:
- * timeout = (next theoretical expiration) - current time
- * timeout = (previous time + timeout + delay) - current time
- * timeout = timeout + delay - (current time - previous time)
- * timeout += delay - delta */
- timeout_ns += (GKI_TICKS_TO_MS(1) * 1000000) - delta_ns;
- }
- /* Save the current time for next iteration */
- previous = current;
-
- timeout.tv_sec = 0;
-
- /* Sleep until next theoretical tick time. In case of excessive
- elapsed time since last theoretical tick expiration, it is
- possible that the timeout value is negative. To protect
- against this error, we set minimum sleep time to 10% of the
- tick period. We indicate to compiler that this is unlikely to
- happen (to help branch prediction) */
-
- if (__unlikely(timeout_ns < ((GKI_TICKS_TO_MS(1) * 1000000) * 0.1)))
- {
- timeout.tv_nsec = (GKI_TICKS_TO_MS(1) * 1000000) * 0.1;
-
- /* Print error message if tick really got delayed
- (more than 5 ticks) */
- if (timeout_ns < GKI_TICKS_TO_MS(-5) * 1000000)
- {
- GKI_ERROR_LOG("tick delayed > 5 slots (%d,%d) -- cpu overload ? ",
- timeout_ns, GKI_TICKS_TO_MS(-5) * 1000000);
- }
- }
- else
- {
- timeout.tv_nsec = timeout_ns;
- }
-
- do
- {
- /* [u]sleep can't be used because it uses SIGALRM */
- err = nanosleep(&timeout, &timeout);
- } while (err < 0 && errno == EINTR);
-
- /* Increment the GKI time value by one tick and update internal timers */
- GKI_timer_update(1);
- }
- GKI_TRACE("gki_ulinux: Exiting timer_thread");
- pthread_exit(NULL);
- return NULL;
-}
-#endif
-
-
/*****************************************************************************
**
** Function gki_set_timer_scheduling
@@ -778,26 +683,6 @@
/*****************************************************************************
**
-** Function GKI_freeze
-**
-** Description Freeze GKI. Relevant only when NO_GKI_RUN_RETURN is defined
-**
-** Returns
-**
-*******************************************************************************/
-
-void GKI_freeze()
-{
-#ifdef NO_GKI_RUN_RETURN
- shutdown_timer = 1;
- pthread_mutex_unlock( &gki_cb.os.gki_timer_mutex );
- /* Ensure that the timer thread exits */
- pthread_join(timer_thread_id, NULL);
-#endif
-}
-
-/*****************************************************************************
-**
** Function GKI_run
**
** Description Main GKI loop
@@ -806,78 +691,11 @@
**
*******************************************************************************/
-void GKI_run (void * p_task_id)
+void GKI_run(void)
{
- struct timespec delay;
- int err;
- volatile int * p_run_cond = &gki_cb.os.no_timer_suspend;
- UNUSED(p_task_id);
-
-#ifndef GKI_NO_TICK_STOP
/* adjust btld scheduling scheme now */
gki_set_timer_scheduling();
-
- /* register start stop function which disable timer loop in GKI_run() when no timers are
- * in any GKI/BTA/BTU this should save power when BTLD is idle! */
- GKI_timer_queue_register_callback( gki_system_tick_start_stop_cback );
GKI_TRACE( "GKI_run(): Start/Stop GKI_timer_update_registered!" );
-#endif
-
-#ifdef NO_GKI_RUN_RETURN
- pthread_attr_t timer_attr;
-
- shutdown_timer = 0;
-
- pthread_attr_init(&timer_attr);
- if (pthread_create( &timer_thread_id,
- &timer_attr,
- timer_thread,
- NULL) != 0 )
- {
- GKI_ERROR_LOG("pthread_create failed to create timer_thread!\n\r");
- return;
- }
-
-#else
- GKI_TRACE("GKI_run ");
- for (;;)
- {
- do
- {
- /* adjust hear bit tick in btld by changning TICKS_PER_SEC!!!!! this formula works only for
- * 1-1000ms heart beat units! */
- delay.tv_sec = LINUX_SEC / 1000;
- delay.tv_nsec = 1000 * 1000 * (LINUX_SEC % 1000);
-
- /* [u]sleep can't be used because it uses SIGALRM */
- do
- {
- err = nanosleep(&delay, &delay);
- } while (err < 0 && errno == EINTR);
-
- /* the unit should be alsways 1 (1 tick). only if you vary for some reason heart beat tick
- * e.g. power saving you may want to provide more ticks
- */
- GKI_timer_update( 1 );
- /* BT_TRACE_2( TRACE_LAYER_HCI, TRACE_TYPE_DEBUG, "update: tv_sec: %d, tv_nsec: %d", delay.tv_sec, delay.tv_nsec ); */
- } while ( GKI_TIMER_TICK_RUN_COND == *p_run_cond );
-
- /* currently on reason to exit above loop is no_timer_suspend == GKI_TIMER_TICK_STOP_COND
- * block timer main thread till re-armed by */
-
- GKI_TIMER_TRACE(">>> SUSPENDED GKI_timer_update()" );
-
- pthread_mutex_lock( &gki_cb.os.gki_timer_mutex );
- pthread_cond_wait( &gki_cb.os.gki_timer_cond, &gki_cb.os.gki_timer_mutex );
- pthread_mutex_unlock( &gki_cb.os.gki_timer_mutex );
-
- /* potentially we need to adjust os gki_cb.com.OSTicks */
- GKI_TIMER_TRACE(">>> RESTARTED GKI_timer_update(): run_cond: %d",
- *p_run_cond );
-
- }
-#endif
- return;
}
@@ -964,9 +782,8 @@
}
abstime.tv_sec += sec;
- pthread_cond_timedwait_monotonic(&gki_cb.os.thread_evt_cond[rtask],
+ pthread_cond_timedwait(&gki_cb.os.thread_evt_cond[rtask],
&gki_cb.os.thread_evt_mutex[rtask], &abstime);
-
}
else
{
@@ -1080,7 +897,6 @@
{
GKI_TRACE("GKI_send_event %d %x", task_id, event);
- /* use efficient coding to avoid pipeline stalls */
if (task_id < GKI_MAX_TASKS)
{
/* protect OSWaitEvt[task_id] from manipulation in GKI_wait() */
@@ -1103,33 +919,6 @@
/*******************************************************************************
**
-** Function GKI_isend_event
-**
-** Description This function is called from ISRs to send events to other
-** tasks. The only difference between this function and GKI_send_event
-** is that this function assumes interrupts are already disabled.
-**
-** Parameters: task_id - (input) The destination task Id for the event.
-** event - (input) The event flag
-**
-** Returns GKI_SUCCESS if all OK, else GKI_FAILURE
-**
-** NOTE This function is NOT called by the Broadcom stack and
-** profiles. If you want to use it in your own implementation,
-** put your code here, otherwise you can delete the entire
-** body of the function.
-**
-*******************************************************************************/
-UINT8 GKI_isend_event (UINT8 task_id, UINT16 event)
-{
- GKI_TRACE("GKI_isend_event %d %x", task_id, event);
- GKI_TRACE("GKI_isend_event %d %x done", task_id, event);
- return GKI_send_event(task_id, event);
-}
-
-
-/*******************************************************************************
-**
** Function GKI_get_taskid
**
** Description This function gets the currently running task ID.
@@ -1212,10 +1001,7 @@
*******************************************************************************/
void GKI_enable (void)
{
- //GKI_TRACE("GKI_enable");
pthread_mutex_unlock(&gki_cb.os.GKI_mutex);
- //GKI_TRACE("Leaving GKI_enable");
- return;
}
@@ -1231,12 +1017,7 @@
void GKI_disable (void)
{
- //GKI_TRACE("GKI_disable");
-
pthread_mutex_lock(&gki_cb.os.GKI_mutex);
-
- //GKI_TRACE("Leaving GKI_disable");
- return;
}
@@ -1259,20 +1040,20 @@
UINT8 task_id;
int i = 0;
- GKI_ERROR_LOG( "GKI_exception(): Task State Table\n");
+ ALOGE( "GKI_exception(): Task State Table");
for(task_id = 0; task_id < GKI_MAX_TASKS; task_id++)
{
- GKI_ERROR_LOG( "TASK ID [%d] task name [%s] state [%d]\n",
+ ALOGE( "TASK ID [%d] task name [%s] state [%d]",
task_id,
gki_cb.com.OSTName[task_id],
gki_cb.com.OSRdyTbl[task_id]);
}
- GKI_ERROR_LOG("GKI_exception %d %s", code, msg);
- GKI_ERROR_LOG( "\n********************************************************************\n");
- GKI_ERROR_LOG( "* GKI_exception(): %d %s\n", code, msg);
- GKI_ERROR_LOG( "********************************************************************\n");
+ ALOGE("GKI_exception %d %s", code, msg);
+ ALOGE( "********************************************************************");
+ ALOGE( "* GKI_exception(): %d %s", code, msg);
+ ALOGE( "********************************************************************");
#if 0//(GKI_DEBUG == TRUE)
GKI_disable();
@@ -1294,80 +1075,6 @@
return;
}
-
-/*******************************************************************************
-**
-** Function GKI_get_time_stamp
-**
-** Description This function formats the time into a user area
-**
-** Parameters: tbuf - (output) the address to the memory containing the
-** formatted time
-**
-** Returns the address of the user area containing the formatted time
-** The format of the time is ????
-**
-** NOTE This function is only called by OBEX.
-**
-*******************************************************************************/
-INT8 *GKI_get_time_stamp (INT8 *tbuf)
-{
- UINT32 ms_time;
- UINT32 s_time;
- UINT32 m_time;
- UINT32 h_time;
- INT8 *p_out = tbuf;
-
- gki_cb.com.OSTicks = times(0);
- ms_time = GKI_TICKS_TO_MS(gki_cb.com.OSTicks);
- s_time = ms_time/100; /* 100 Ticks per second */
- m_time = s_time/60;
- h_time = m_time/60;
-
- ms_time -= s_time*100;
- s_time -= m_time*60;
- m_time -= h_time*60;
-
- *p_out++ = (INT8)((h_time / 10) + '0');
- *p_out++ = (INT8)((h_time % 10) + '0');
- *p_out++ = ':';
- *p_out++ = (INT8)((m_time / 10) + '0');
- *p_out++ = (INT8)((m_time % 10) + '0');
- *p_out++ = ':';
- *p_out++ = (INT8)((s_time / 10) + '0');
- *p_out++ = (INT8)((s_time % 10) + '0');
- *p_out++ = ':';
- *p_out++ = (INT8)((ms_time / 10) + '0');
- *p_out++ = (INT8)((ms_time % 10) + '0');
- *p_out++ = ':';
- *p_out = 0;
-
- return (tbuf);
-}
-
-
-/*******************************************************************************
-**
-** Function GKI_register_mempool
-**
-** Description This function registers a specific memory pool.
-**
-** Parameters: p_mem - (input) pointer to the memory pool
-**
-** Returns void
-**
-** NOTE This function is NOT called by the Broadcom stack and
-** profiles. If your OS has different memory pools, you
-** can tell GKI the pool to use by calling this function.
-**
-*******************************************************************************/
-void GKI_register_mempool (void *p_mem)
-{
- gki_cb.com.p_user_mempool = p_mem;
-
- return;
-}
-
/*******************************************************************************
**
** Function GKI_os_malloc
@@ -1385,7 +1092,7 @@
*******************************************************************************/
void *GKI_os_malloc (UINT32 size)
{
- return (malloc(size));
+ return malloc(size);
}
/*******************************************************************************
@@ -1405,61 +1112,7 @@
*******************************************************************************/
void GKI_os_free (void *p_mem)
{
- if(p_mem != NULL)
- free(p_mem);
- return;
-}
-
-
-/*******************************************************************************
-**
-** Function GKI_suspend_task()
-**
-** Description This function suspends the task specified in the argument.
-**
-** Parameters: task_id - (input) the id of the task that has to suspended
-**
-** Returns GKI_SUCCESS if all OK, else GKI_FAILURE
-**
-** NOTE This function is NOT called by the Broadcom stack and
-** profiles. If you want to implement task suspension capability,
-** put specific code here.
-**
-*******************************************************************************/
-UINT8 GKI_suspend_task (UINT8 task_id)
-{
- UNUSED(task_id);
- GKI_TRACE("GKI_suspend_task %d - NOT implemented", task_id);
-
- GKI_TRACE("GKI_suspend_task %d done", task_id);
-
- return (GKI_SUCCESS);
-}
-
-
-/*******************************************************************************
-**
-** Function GKI_resume_task()
-**
-** Description This function resumes the task specified in the argument.
-**
-** Parameters: task_id - (input) the id of the task that has to resumed
-**
-** Returns GKI_SUCCESS if all OK
-**
-** NOTE This function is NOT called by the Broadcom stack and
-** profiles. If you want to implement task suspension capability,
-** put specific code here.
-**
-*******************************************************************************/
-UINT8 GKI_resume_task (UINT8 task_id)
-{
- UNUSED(task_id);
- GKI_TRACE("GKI_resume_task %d - NOT implemented", task_id);
-
- GKI_TRACE("GKI_resume_task %d done", task_id);
-
- return (GKI_SUCCESS);
+ free(p_mem);
}
@@ -1491,50 +1144,6 @@
GKI_enable();
- //GKI_send_event(task_id, EVENT_MASK(GKI_SHUTDOWN_EVT));
-
- GKI_INFO("GKI_exit_task %d done", task_id);
+ ALOGI("GKI_exit_task %d done", task_id);
return;
}
-
-
-/*******************************************************************************
-**
-** Function GKI_sched_lock
-**
-** Description This function is called by tasks to disable scheduler
-** task context switching.
-**
-** Returns void
-**
-** NOTE This function is NOT called by the Broadcom stack and
-** profiles. If you want to use it in your own implementation,
-** put code here to tell the OS to disable context switching.
-**
-*******************************************************************************/
-void GKI_sched_lock(void)
-{
- GKI_TRACE("GKI_sched_lock");
- return;
-}
-
-
-/*******************************************************************************
-**
-** Function GKI_sched_unlock
-**
-** Description This function is called by tasks to enable scheduler switching.
-**
-** Returns void
-**
-** NOTE This function is NOT called by the Broadcom stack and
-** profiles. If you want to use it in your own implementation,
-** put code here to tell the OS to re-enable context switching.
-**
-*******************************************************************************/
-void GKI_sched_unlock(void)
-{
- GKI_TRACE("GKI_sched_unlock");
-}
-
-
diff --git a/hci/Android.mk b/hci/Android.mk
index 24fec19..f93e658 100644
--- a/hci/Android.mk
+++ b/hci/Android.mk
@@ -5,41 +5,39 @@
LOCAL_CFLAGS += $(bdroid_CFLAGS)
LOCAL_SRC_FILES := \
- src/bt_hci_bdroid.c \
- src/lpm.c \
- src/bt_hw.c \
- src/btsnoop.c \
- src/utils.c
+ src/bt_hci_bdroid.c \
+ src/btsnoop.c \
+ src/btsnoop_net.c \
+ src/lpm.c \
+ src/utils.c \
+ src/vendor.c
+
+LOCAL_CFLAGS := -Wno-unused-parameter
ifeq ($(BLUETOOTH_HCI_USE_MCT),true)
LOCAL_CFLAGS += -DHCI_USE_MCT
LOCAL_SRC_FILES += \
- src/hci_mct.c \
- src/userial_mct.c
+ src/hci_mct.c \
+ src/userial_mct.c
else
-
LOCAL_SRC_FILES += \
- src/hci_h4.c \
- src/userial.c
-
+ src/hci_h4.c \
+ src/userial.c
endif
-LOCAL_C_INCLUDES += \
- $(LOCAL_PATH)/include \
- $(LOCAL_PATH)/../utils/include \
- $(bdroid_C_INCLUDES)
+LOCAL_CFLAGS += -std=c99
-LOCAL_SHARED_LIBRARIES := \
- libcutils \
- liblog \
- libdl \
- libbt-utils
+LOCAL_C_INCLUDES += \
+ $(LOCAL_PATH)/include \
+ $(LOCAL_PATH)/../osi/include \
+ $(LOCAL_PATH)/../utils/include \
+ $(bdroid_C_INCLUDES)
LOCAL_MODULE := libbt-hci
LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_CLASS := SHARED_LIBRARIES
+LOCAL_MODULE_CLASS := STATIC_LIBRARIES
-include $(BUILD_SHARED_LIBRARY)
+include $(BUILD_STATIC_LIBRARY)
diff --git a/hci/include/bt_hci_bdroid.h b/hci/include/bt_hci_bdroid.h
index 904c698..220946b 100644
--- a/hci/include/bt_hci_bdroid.h
+++ b/hci/include/bt_hci_bdroid.h
@@ -27,8 +27,7 @@
*
******************************************************************************/
-#ifndef BT_HCI_BDROID_H
-#define BT_HCI_BDROID_H
+#pragma once
#include "bt_hci_lib.h"
@@ -40,57 +39,32 @@
** Constants & Macros
******************************************************************************/
-#ifndef FALSE
-#define FALSE 0
+#if __STDC_VERSION__ < 199901L
+# ifndef FALSE
+# define FALSE 0
+# endif
+# ifndef TRUE
+# define TRUE (!FALSE)
+# endif
+#else
+# include <stdbool.h>
+# ifndef FALSE
+# define FALSE false
+# endif
+# ifndef TRUE
+# define TRUE true
+# endif
#endif
-#ifndef TRUE
-#define TRUE (!FALSE)
-#endif
-
-#ifndef BTHC_LINUX_BASE_POLICY
-#define BTHC_LINUX_BASE_POLICY SCHED_NORMAL
-#endif
-
-#if (BTHC_LINUX_BASE_POLICY != SCHED_NORMAL)
-#ifndef BTHC_LINUX_BASE_PRIORITY
-#define BTHC_LINUX_BASE_PRIORITY 30
-#endif
-
-#ifndef BTHC_USERIAL_READ_THREAD_PRIORITY
-#define BTHC_USERIAL_READ_THREAD_PRIORITY (BTHC_LINUX_BASE_PRIORITY)
-#endif
-
-#ifndef BTHC_MAIN_THREAD_PRIORITY
-#define BTHC_MAIN_THREAD_PRIORITY (BTHC_LINUX_BASE_PRIORITY-1)
-#endif
-#endif // (BTHC_LINUX_BASE_POLICY != SCHED_NORMAL)
-
-#ifndef BTHC_USERIAL_READ_MEM_SIZE
-#define BTHC_USERIAL_READ_MEM_SIZE (1024)
-#endif
-
-#ifndef BTSNOOPDISP_INCLUDED
-#define BTSNOOPDISP_INCLUDED TRUE
-#endif
-
-/* Disable external parser for production */
-#ifndef BTSNOOP_EXT_PARSER_INCLUDED
-#define BTSNOOP_EXT_PARSER_INCLUDED FALSE
-#endif
+#define HCI_ACL_MAX_SIZE 1024
+#define HCI_MAX_FRAME_SIZE (HCI_ACL_MAX_SIZE + 4)
/* Host/Controller lib internal event ID */
-#define HC_EVENT_PRELOAD 0x0001
-#define HC_EVENT_POSTLOAD 0x0002
-#define HC_EVENT_RX 0x0004
-#define HC_EVENT_TX 0x0008
-#define HC_EVENT_LPM_ENABLE 0x0010
-#define HC_EVENT_LPM_DISABLE 0x0020
-#define HC_EVENT_LPM_WAKE_DEVICE 0x0040
-#define HC_EVENT_LPM_ALLOW_SLEEP 0x0080
-#define HC_EVENT_LPM_IDLE_TIMEOUT 0x0100
-#define HC_EVENT_EXIT 0x0200
-#define HC_EVENT_EPILOG 0x0400
+typedef enum {
+ HC_EVENT_LPM_IDLE_TIMEOUT,
+} bthc_event_t;
+
+#define MSG_CTRL_TO_HC_CMD 0x0100 /* evt mask used by HC_EVENT_TX_CMD */
/* Message event mask across Host/Controller lib and stack */
#define MSG_EVT_MASK 0xFF00 /* eq. BT_EVT_MASK */
@@ -111,6 +85,13 @@
/* Local Bluetooth Controller ID for BR/EDR */
#define LOCAL_BR_EDR_CONTROLLER_ID 0
+/* Definitions of audio codec type
+ * inherited from AG callout function "codec" parameter
+ */
+#define SCO_CODEC_NONE 0x0000 /* BTA_AG_CODEC_NONE/BTM_SCO_CODEC_NONE */
+#define SCO_CODEC_CVSD 0x0001 /* BTA_AG_CODEC_CVSD/BTM_SCO_CODEC_CVSD */
+#define SCO_CODEC_MSBC 0x0002 /* BTA_AG_CODEC_MSBC/BTM_SCO_CODEC_MSBC */
+
/******************************************************************************
** Type definitions and return values
******************************************************************************/
@@ -121,11 +102,11 @@
uint16_t len;
uint16_t offset;
uint16_t layer_specific;
+ uint8_t data[];
} HC_BT_HDR;
#define BT_HC_HDR_SIZE (sizeof(HC_BT_HDR))
-
typedef struct _hc_buffer_hdr
{
struct _hc_buffer_hdr *p_next; /* next buffer in the queue */
@@ -147,15 +128,8 @@
** Functions
******************************************************************************/
-/*******************************************************************************
-**
-** Function bthc_signal_event
-**
-** Description Perform context switch to bt_hc main thread
-**
-** Returns None
-**
-*******************************************************************************/
-extern void bthc_signal_event(uint16_t event);
-
-#endif /* BT_HCI_BDROID_H */
+// Called when a buffer has been produced by the serial layer and should be
+// processed by the HCI layer.
+void bthc_rx_ready(void);
+void bthc_tx(HC_BT_HDR *buf);
+void bthc_idle_timeout(void);
diff --git a/hci/include/bt_hci_lib.h b/hci/include/bt_hci_lib.h
index 468e513..c9f8cd7 100644
--- a/hci/include/bt_hci_lib.h
+++ b/hci/include/bt_hci_lib.h
@@ -20,6 +20,7 @@
#define BT_HCI_LIB_H
#include <stdint.h>
+#include <stdbool.h>
#include <sys/cdefs.h>
#include <sys/types.h>
@@ -57,6 +58,11 @@
BT_HC_LOGGING_ON,
} bt_hc_logging_state_t;
+/* commands to be used in LSB with MSG_CTRL_TO_HC_CMD */
+typedef enum {
+ BT_HC_AUDIO_STATE = 0,
+ BT_HC_CMD_MAX
+} bt_hc_tx_cmd_t;
/** Result of write request */
typedef enum {
BT_HC_TX_SUCCESS, /* a buffer is fully processed and can be released */
@@ -115,7 +121,7 @@
typedef char* (*alloc_mem_cb)(int size);
/* datapath buffer deallocation callback (callout) */
-typedef int (*dealloc_mem_cb)(TRANSAC transac, char *p_buf);
+typedef void (*dealloc_mem_cb)(TRANSAC transac);
/* transmit result callback */
typedef int (*tx_result_cb)(TRANSAC transac, char *p_buf, bt_hc_transmit_result_t result);
@@ -181,14 +187,14 @@
/** Transmit buffer */
int (*transmit_buf)(TRANSAC transac, char *p_buf, int len);
- /** Controls receive flow */
- int (*set_rxflow)(bt_rx_flow_state_t state);
-
/** Controls HCI logging on/off */
- int (*logging)(bt_hc_logging_state_t state, char *p_path);
+ int (*logging)(bt_hc_logging_state_t state, char *p_path, bool save_existing);
/** Closes the interface */
void (*cleanup)( void );
+
+ /** sends commands to hc layer (e.g. SCO state) */
+ int (*tx_cmd)(TRANSAC transac, char *p_buf, int len);
} bt_hc_interface_t;
diff --git a/hci/include/bt_vendor_lib.h b/hci/include/bt_vendor_lib.h
index f774a14..65d448b 100644
--- a/hci/include/bt_vendor_lib.h
+++ b/hci/include/bt_vendor_lib.h
@@ -143,6 +143,18 @@
BT_VND_OP_LPM_WAKE_SET_STATE,
/* [operation]
+ * Perform any vendor specific commands related to audio state changes.
+ * [input param]
+ * a pointer to bt_vendor_op_audio_state_t indicating what audio state is
+ * set.
+ * [return]
+ * 0 - default, don't care.
+ * [callback]
+ * None.
+ */
+ BT_VND_OP_SET_AUDIO_STATE,
+
+/* [operation]
* The epilog call to the vendor module so that it can perform any
* vendor-specific processes (e.g. send a HCI_RESET to BT Controller)
* before the caller calls for cleanup().
@@ -193,6 +205,13 @@
BT_VND_OP_RESULT_FAIL,
} bt_vendor_op_result_t;
+/** audio (SCO) state changes triggering VS commands for configuration */
+typedef struct {
+ uint16_t handle;
+ uint16_t peer_codec;
+ uint16_t state;
+} bt_vendor_op_audio_state_t;
+
/*
* Bluetooth Host/Controller Vendor callback structure.
*/
@@ -286,6 +305,9 @@
/* notifies caller result of lpm enable/disable */
cfg_result_cb lpm_cb;
+ /* notifies the result of codec setting */
+ cfg_result_cb audio_state_cb;
+
/* buffer allocation request */
malloc_cb alloc;
diff --git a/hci/include/btsnoop.h b/hci/include/btsnoop.h
new file mode 100644
index 0000000..83c8107
--- /dev/null
+++ b/hci/include/btsnoop.h
@@ -0,0 +1,10 @@
+#pragma once
+
+#include <stdbool.h>
+
+#include "bt_hci_bdroid.h"
+
+void btsnoop_open(const char *p_path, const bool save_existing);
+void btsnoop_close(void);
+
+void btsnoop_capture(const HC_BT_HDR *p_buf, bool is_rcvd);
diff --git a/hci/include/userial.h b/hci/include/userial.h
index d3a5480..1988c5c 100644
--- a/hci/include/userial.h
+++ b/hci/include/userial.h
@@ -16,126 +16,56 @@
*
******************************************************************************/
-/******************************************************************************
- *
- * Filename: userial.h
- *
- * Description: Contains definitions used for serial port controls
- *
- ******************************************************************************/
+// This module manages the serial port over which HCI commands
+// and data are sent/received.
-#ifndef USERIAL_H
-#define USERIAL_H
+#pragma once
-/******************************************************************************
-** Constants & Macros
-******************************************************************************/
-
-/**** port IDs ****/
-#define USERIAL_PORT_1 0
-#define USERIAL_PORT_2 1
-#define USERIAL_PORT_3 2
-#define USERIAL_PORT_4 3
-#define USERIAL_PORT_5 4
-#define USERIAL_PORT_6 5
-#define USERIAL_PORT_7 6
-#define USERIAL_PORT_8 7
-#define USERIAL_PORT_9 8
-#define USERIAL_PORT_10 9
-#define USERIAL_PORT_11 10
-#define USERIAL_PORT_12 11
-#define USERIAL_PORT_13 12
-#define USERIAL_PORT_14 13
-#define USERIAL_PORT_15 14
-#define USERIAL_PORT_16 15
-#define USERIAL_PORT_17 16
-#define USERIAL_PORT_18 17
+#include <stdbool.h>
+#include <stdint.h>
typedef enum {
- USERIAL_OP_INIT,
- USERIAL_OP_RXFLOW_ON,
- USERIAL_OP_RXFLOW_OFF,
-} userial_ioctl_op_t;
+ USERIAL_PORT_1,
+ USERIAL_PORT_2,
+ USERIAL_PORT_3,
+ USERIAL_PORT_4,
+ USERIAL_PORT_5,
+ USERIAL_PORT_6,
+ USERIAL_PORT_7,
+ USERIAL_PORT_8,
+ USERIAL_PORT_9,
+ USERIAL_PORT_10,
+ USERIAL_PORT_11,
+ USERIAL_PORT_12,
+ USERIAL_PORT_13,
+ USERIAL_PORT_14,
+ USERIAL_PORT_15,
+ USERIAL_PORT_16,
+ USERIAL_PORT_17,
+ USERIAL_PORT_18,
+} userial_port_t;
-/******************************************************************************
-** Type definitions
-******************************************************************************/
+// Initializes the userial module. This function should only ever be called once.
+// It returns true if the module could be initialized, false if there was an error.
+bool userial_init(void);
-/******************************************************************************
-** Extern variables and functions
-******************************************************************************/
-
-/******************************************************************************
-** Functions
-******************************************************************************/
-
-/*******************************************************************************
-**
-** Function userial_init
-**
-** Description Initializes the userial driver
-**
-** Returns TRUE/FALSE
-**
-*******************************************************************************/
-uint8_t userial_init(void);
-
-/*******************************************************************************
-**
-** Function userial_open
-**
-** Description Open Bluetooth device with the port ID
-**
-** Returns TRUE/FALSE
-**
-*******************************************************************************/
-uint8_t userial_open(uint8_t port);
-
-/*******************************************************************************
-**
-** Function userial_read
-**
-** Description Read data from the userial port
-**
-** Returns Number of bytes actually read from the userial port and
-** copied into p_data. This may be less than len.
-**
-*******************************************************************************/
-uint16_t userial_read(uint16_t msg_id, uint8_t *p_buffer, uint16_t len);
-
-/*******************************************************************************
-**
-** Function userial_write
-**
-** Description Write data to the userial port
-**
-** Returns Number of bytes actually written to the userial port. This
-** may be less than len.
-**
-*******************************************************************************/
-uint16_t userial_write(uint16_t msg_id, uint8_t *p_data, uint16_t len);
-
-/*******************************************************************************
-**
-** Function userial_close
-**
-** Description Close the userial port
-**
-** Returns None
-**
-*******************************************************************************/
+// Opens the given serial port. Returns true if successful, false otherwise.
+// Once this function is called, the userial module will begin producing
+// buffers from data read off the serial port. If you wish to pause the
+// production of buffers, call |userial_pause_reading|. You can then resume
+// by calling |userial_resume_reading|. This function returns true if the
+// serial port was successfully opened and buffer production has started. It
+// returns false if there was an error.
+bool userial_open(userial_port_t port);
void userial_close(void);
+void userial_close_reader(void);
-/*******************************************************************************
-**
-** Function userial_ioctl
-**
-** Description ioctl inteface
-**
-** Returns None
-**
-*******************************************************************************/
-void userial_ioctl(userial_ioctl_op_t op, void *p_data);
+// Reads a maximum of |len| bytes from the serial port into |p_buffer|.
+// This function returns the number of bytes actually read, which may be
+// less than |len|. This function will not block.
+uint16_t userial_read(uint16_t msg_id, uint8_t *p_buffer, uint16_t len);
-#endif /* USERIAL_H */
-
+// Writes a maximum of |len| bytes from |p_data| to the serial port.
+// This function returns the number of bytes actually written, which may be
+// less than |len|. This function may block.
+uint16_t userial_write(uint16_t msg_id, const uint8_t *p_data, uint16_t len);
diff --git a/hci/include/vendor.h b/hci/include/vendor.h
new file mode 100644
index 0000000..6c13c9c
--- /dev/null
+++ b/hci/include/vendor.h
@@ -0,0 +1,35 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 Google, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+#pragma once
+
+#include <stdbool.h>
+#include <stdint.h>
+
+#include "bt_vendor_lib.h"
+
+// Opens the vendor-specific library and sets the Bluetooth
+// address of the adapter to |local_bdaddr|.
+bool vendor_open(const uint8_t *local_bdaddr);
+
+// Closes the vendor-specific library and frees all associated resources.
+// Only |vendor_open| may be called after |vendor_close|.
+void vendor_close(void);
+
+// Sends a vendor-specific command to the library.
+int vendor_send_command(bt_vendor_opcode_t opcode, void *param);
diff --git a/hci/src/bt_hci_bdroid.c b/hci/src/bt_hci_bdroid.c
index ed98b37..74a315b 100644
--- a/hci/src/bt_hci_bdroid.c
+++ b/hci/src/bt_hci_bdroid.c
@@ -27,15 +27,19 @@
#define LOG_TAG "bt_hci_bdroid"
+#include <assert.h>
#include <utils/Log.h>
-#include <pthread.h>
+
+#include "btsnoop.h"
#include "bt_hci_bdroid.h"
-#include "bt_vendor_lib.h"
-#include "utils.h"
-#include "hci.h"
-#include "userial.h"
#include "bt_utils.h"
-#include <sys/prctl.h>
+#include "bt_vendor_lib.h"
+#include "hci.h"
+#include "osi.h"
+#include "thread.h"
+#include "userial.h"
+#include "utils.h"
+#include "vendor.h"
#ifndef BTHC_DBG
#define BTHC_DBG FALSE
@@ -48,15 +52,12 @@
#endif
/* Vendor epilog process timeout period */
-#ifndef EPILOG_TIMEOUT_MS
-#define EPILOG_TIMEOUT_MS 3000 // 3 seconds
-#endif
+static const uint32_t EPILOG_TIMEOUT_MS = 3000;
/******************************************************************************
** Externs
******************************************************************************/
-extern bt_vendor_interface_t *bt_vnd_if;
extern int num_hci_cmd_pkts;
void lpm_init(void);
void lpm_cleanup(void);
@@ -65,17 +66,16 @@
void lpm_allow_bt_device_sleep(void);
void lpm_wake_assert(void);
void init_vnd_if(unsigned char *local_bdaddr);
-void btsnoop_open(char *p_path);
-void btsnoop_close(void);
/******************************************************************************
** Variables
******************************************************************************/
bt_hc_callbacks_t *bt_hc_cbacks = NULL;
-BUFFER_Q tx_q;
tHCI_IF *p_hci_if;
-volatile uint8_t fwcfg_acked;
+volatile bool fwcfg_acked;
+// Cleanup state indication.
+volatile bool has_cleaned_up = false;
/******************************************************************************
** Local type definitions
@@ -84,10 +84,9 @@
/* Host/Controller lib thread control block */
typedef struct
{
- pthread_t worker_thread;
- pthread_mutex_t mutex;
- pthread_cond_t cond;
- uint8_t epilog_timer_created;
+ thread_t *worker_thread;
+ pthread_mutex_t worker_thread_lock;
+ bool epilog_timer_created;
timer_t epilog_timer_id;
} bt_hc_cb_t;
@@ -96,22 +95,154 @@
******************************************************************************/
static bt_hc_cb_t hc_cb;
-static volatile uint8_t lib_running = 0;
-static volatile uint16_t ready_events = 0;
-static volatile uint8_t tx_cmd_pkts_pending = FALSE;
+static bool tx_cmd_pkts_pending = false;
+static BUFFER_Q tx_q;
/******************************************************************************
** Functions
******************************************************************************/
-static void *bt_hc_worker_thread(void *arg);
+static void event_preload(UNUSED_ATTR void *context) {
+ userial_open(USERIAL_PORT_1);
+ vendor_send_command(BT_VND_OP_FW_CFG, NULL);
+}
-void bthc_signal_event(uint16_t event)
-{
- pthread_mutex_lock(&hc_cb.mutex);
- ready_events |= event;
- pthread_cond_signal(&hc_cb.cond);
- pthread_mutex_unlock(&hc_cb.mutex);
+static void event_postload(UNUSED_ATTR void *context) {
+ /* Start from SCO related H/W configuration, if SCO configuration
+ * is required. Then, follow with reading requests of getting
+ * ACL data length for both BR/EDR and LE.
+ */
+ int result = vendor_send_command(BT_VND_OP_SCO_CFG, NULL);
+ if (result == -1)
+ p_hci_if->get_acl_max_len();
+}
+
+static void event_tx(UNUSED_ATTR void *context) {
+ /*
+ * We will go through every packets in the tx queue.
+ * Fine to clear tx_cmd_pkts_pending.
+ */
+ tx_cmd_pkts_pending = false;
+ HC_BT_HDR *sending_msg_que[64];
+ size_t sending_msg_count = 0;
+ int sending_hci_cmd_pkts_count = 0;
+ utils_lock();
+ HC_BT_HDR *p_next_msg = tx_q.p_first;
+ while (p_next_msg && sending_msg_count < ARRAY_SIZE(sending_msg_que))
+ {
+ if ((p_next_msg->event & MSG_EVT_MASK)==MSG_STACK_TO_HC_HCI_CMD)
+ {
+ /*
+ * if we have used up controller's outstanding HCI command
+ * credits (normally is 1), skip all HCI command packets in
+ * the queue.
+ * The pending command packets will be sent once controller
+ * gives back us credits through CommandCompleteEvent or
+ * CommandStatusEvent.
+ */
+ if (tx_cmd_pkts_pending ||
+ (sending_hci_cmd_pkts_count >= num_hci_cmd_pkts))
+ {
+ tx_cmd_pkts_pending = true;
+ p_next_msg = utils_getnext(p_next_msg);
+ continue;
+ }
+ sending_hci_cmd_pkts_count++;
+ }
+
+ HC_BT_HDR *p_msg = p_next_msg;
+ p_next_msg = utils_getnext(p_msg);
+ utils_remove_from_queue_unlocked(&tx_q, p_msg);
+ sending_msg_que[sending_msg_count++] = p_msg;
+ }
+ utils_unlock();
+ for(size_t i = 0; i < sending_msg_count; i++)
+ p_hci_if->send(sending_msg_que[i]);
+ if (tx_cmd_pkts_pending)
+ BTHCDBG("Used up Tx Cmd credits");
+}
+
+static void event_rx(UNUSED_ATTR void *context) {
+#ifndef HCI_USE_MCT
+ p_hci_if->rcv();
+
+ if (tx_cmd_pkts_pending && num_hci_cmd_pkts > 0) {
+ // Got HCI Cmd credits from controller. Send whatever data
+ // we have in our tx queue. We can call |event_tx| directly
+ // here since we're already on the worker thread.
+ event_tx(NULL);
+ }
+#endif
+}
+
+static void event_lpm_enable(UNUSED_ATTR void *context) {
+ lpm_enable(true);
+}
+
+static void event_lpm_disable(UNUSED_ATTR void *context) {
+ lpm_enable(false);
+}
+
+static void event_lpm_wake_device(UNUSED_ATTR void *context) {
+ lpm_wake_assert();
+}
+
+static void event_lpm_allow_sleep(UNUSED_ATTR void *context) {
+ lpm_allow_bt_device_sleep();
+}
+
+static void event_lpm_idle_timeout(UNUSED_ATTR void *context) {
+ lpm_wake_deassert();
+}
+
+static void event_epilog(UNUSED_ATTR void *context) {
+ vendor_send_command(BT_VND_OP_EPILOG, NULL);
+}
+
+static void event_tx_cmd(void *msg) {
+ HC_BT_HDR *p_msg = (HC_BT_HDR *)msg;
+
+ BTHCDBG("%s: p_msg: %p, event: 0x%x", __func__, p_msg, p_msg->event);
+
+ int event = p_msg->event & MSG_EVT_MASK;
+ int sub_event = p_msg->event & MSG_SUB_EVT_MASK;
+ if (event == MSG_CTRL_TO_HC_CMD && sub_event == BT_HC_AUDIO_STATE) {
+ vendor_send_command(BT_VND_OP_SET_AUDIO_STATE, p_msg->data);
+ } else {
+ ALOGW("%s (event: 0x%x, sub_event: 0x%x) not supported", __func__, event, sub_event);
+ }
+
+ bt_hc_cbacks->dealloc(msg);
+}
+
+void bthc_rx_ready(void) {
+ pthread_mutex_lock(&hc_cb.worker_thread_lock);
+
+ if (hc_cb.worker_thread)
+ thread_post(hc_cb.worker_thread, event_rx, NULL);
+
+ pthread_mutex_unlock(&hc_cb.worker_thread_lock);
+}
+
+void bthc_tx(HC_BT_HDR *buf) {
+ pthread_mutex_lock(&hc_cb.worker_thread_lock);
+
+ if (hc_cb.worker_thread) {
+ if (buf)
+ utils_enqueue(&tx_q, buf);
+ thread_post(hc_cb.worker_thread, event_tx, NULL);
+ }
+
+ pthread_mutex_unlock(&hc_cb.worker_thread_lock);
+}
+
+void bthc_idle_timeout(void) {
+ pthread_mutex_lock(&hc_cb.worker_thread_lock);
+
+ if (hc_cb.worker_thread)
+ thread_post(hc_cb.worker_thread, event_lpm_idle_timeout, NULL);
+
+ pthread_mutex_unlock(&hc_cb.worker_thread_lock);
}
/*******************************************************************************
@@ -123,11 +254,15 @@
** Returns None
**
*******************************************************************************/
-static void epilog_wait_timeout(union sigval arg)
+static void epilog_wait_timeout(UNUSED_ATTR union sigval arg)
{
- UNUSED(arg);
ALOGI("...epilog_wait_timeout...");
- bthc_signal_event(HC_EVENT_EXIT);
+
+ thread_free(hc_cb.worker_thread);
+
+ pthread_mutex_lock(&hc_cb.worker_thread_lock);
+ hc_cb.worker_thread = NULL;
+ pthread_mutex_unlock(&hc_cb.worker_thread_lock);
}
/*******************************************************************************
@@ -155,7 +290,7 @@
if (status == 0)
{
- hc_cb.epilog_timer_created = 1;
+ hc_cb.epilog_timer_created = true;
ts.it_value.tv_sec = timeout_ms/1000;
ts.it_value.tv_nsec = 1000000*(timeout_ms%1000);
ts.it_interval.tv_sec = 0;
@@ -168,7 +303,7 @@
else
{
ALOGE("Failed to create epilog watchdog timer");
- hc_cb.epilog_timer_created = 0;
+ hc_cb.epilog_timer_created = false;
}
}
@@ -180,9 +315,7 @@
static int init(const bt_hc_callbacks_t* p_cb, unsigned char *local_bdaddr)
{
- pthread_attr_t thread_attr;
- struct sched_param param;
- int policy, result;
+ int result;
ALOGI("init");
@@ -192,13 +325,16 @@
return BT_HC_STATUS_FAIL;
}
- hc_cb.epilog_timer_created = 0;
- fwcfg_acked = FALSE;
+ hc_cb.epilog_timer_created = false;
+ fwcfg_acked = false;
+ has_cleaned_up = false;
+
+ pthread_mutex_init(&hc_cb.worker_thread_lock, NULL);
/* store reference to user callbacks */
bt_hc_cbacks = (bt_hc_callbacks_t *) p_cb;
- init_vnd_if(local_bdaddr);
+ vendor_open(local_bdaddr);
utils_init();
#ifdef HCI_USE_MCT
@@ -216,41 +352,22 @@
utils_queue_init(&tx_q);
- if (lib_running)
+ if (hc_cb.worker_thread)
{
ALOGW("init has been called repeatedly without calling cleanup ?");
}
- lib_running = 1;
- ready_events = 0;
- pthread_mutex_init(&hc_cb.mutex, NULL);
- pthread_cond_init(&hc_cb.cond, NULL);
- pthread_attr_init(&thread_attr);
+ // Set prio here and let hci worker thread inherit prio
+ // remove once new thread api (thread_set_priority() ?)
+ // can switch prio
+ raise_priority_a2dp(TASK_HIGH_HCI_WORKER);
- if (pthread_create(&hc_cb.worker_thread, &thread_attr, \
- bt_hc_worker_thread, NULL) != 0)
- {
- ALOGE("pthread_create failed!");
- lib_running = 0;
+ hc_cb.worker_thread = thread_new("bt_hc_worker");
+ if (!hc_cb.worker_thread) {
+ ALOGE("%s unable to create worker thread.", __func__);
return BT_HC_STATUS_FAIL;
}
- if(pthread_getschedparam(hc_cb.worker_thread, &policy, ¶m)==0)
- {
- policy = BTHC_LINUX_BASE_POLICY;
-#if (BTHC_LINUX_BASE_POLICY != SCHED_NORMAL)
- param.sched_priority = BTHC_MAIN_THREAD_PRIORITY;
-#else
- param.sched_priority = 0;
-#endif
- result = pthread_setschedparam(hc_cb.worker_thread, policy, ¶m);
- if (result != 0)
- {
- ALOGW("libbt-hci init: pthread_setschedparam failed (%s)", \
- strerror(result));
- }
- }
-
return BT_HC_STATUS_SUCCESS;
}
@@ -265,146 +382,126 @@
/* Calling vendor-specific part */
pwr_state = (state == BT_HC_CHIP_PWR_ON) ? BT_VND_PWR_ON : BT_VND_PWR_OFF;
- if (bt_vnd_if)
- bt_vnd_if->op(BT_VND_OP_POWER_CTRL, &pwr_state);
- else
- ALOGE("vendor lib is missing!");
+ vendor_send_command(BT_VND_OP_POWER_CTRL, &pwr_state);
}
/** Configure low power mode wake state */
static int lpm(bt_hc_low_power_event_t event)
{
- uint8_t status = TRUE;
-
switch (event)
{
case BT_HC_LPM_DISABLE:
- bthc_signal_event(HC_EVENT_LPM_DISABLE);
+ thread_post(hc_cb.worker_thread, event_lpm_disable, NULL);
break;
case BT_HC_LPM_ENABLE:
- bthc_signal_event(HC_EVENT_LPM_ENABLE);
+ thread_post(hc_cb.worker_thread, event_lpm_enable, NULL);
break;
case BT_HC_LPM_WAKE_ASSERT:
- bthc_signal_event(HC_EVENT_LPM_WAKE_DEVICE);
+ thread_post(hc_cb.worker_thread, event_lpm_wake_device, NULL);
break;
case BT_HC_LPM_WAKE_DEASSERT:
- bthc_signal_event(HC_EVENT_LPM_ALLOW_SLEEP);
+ thread_post(hc_cb.worker_thread, event_lpm_allow_sleep, NULL);
break;
}
-
- return(status == TRUE) ? BT_HC_STATUS_SUCCESS : BT_HC_STATUS_FAIL;
+ return BT_HC_STATUS_SUCCESS;
}
/** Called prior to stack initialization */
-static void preload(TRANSAC transac)
-{
- UNUSED(transac);
- BTHCDBG("preload");
- bthc_signal_event(HC_EVENT_PRELOAD);
+static void preload(UNUSED_ATTR TRANSAC transac) {
+ BTHCDBG("preload");
+ thread_post(hc_cb.worker_thread, event_preload, NULL);
}
-
/** Called post stack initialization */
-static void postload(TRANSAC transac)
-{
- UNUSED(transac);
- BTHCDBG("postload");
- bthc_signal_event(HC_EVENT_POSTLOAD);
+static void postload(UNUSED_ATTR TRANSAC transac) {
+ BTHCDBG("postload");
+ thread_post(hc_cb.worker_thread, event_postload, NULL);
}
-
/** Transmit frame */
-static int transmit_buf(TRANSAC transac, char * p_buf, int len)
-{
- UNUSED(p_buf);
- UNUSED(len);
- utils_enqueue(&tx_q, (void *) transac);
-
- bthc_signal_event(HC_EVENT_TX);
-
- return BT_HC_STATUS_SUCCESS;
+static int transmit_buf(TRANSAC transac, UNUSED_ATTR char *p_buf, UNUSED_ATTR int len) {
+ bthc_tx((HC_BT_HDR *)transac);
+ return BT_HC_STATUS_SUCCESS;
}
-
-/** Controls receive flow */
-static int set_rxflow(bt_rx_flow_state_t state)
-{
- BTHCDBG("set_rxflow %d", state);
-
- userial_ioctl(\
- ((state == BT_RXFLOW_ON) ? USERIAL_OP_RXFLOW_ON : USERIAL_OP_RXFLOW_OFF), \
- NULL);
-
- return BT_HC_STATUS_SUCCESS;
-}
-
-
/** Controls HCI logging on/off */
-static int logging(bt_hc_logging_state_t state, char *p_path)
-{
- BTHCDBG("logging %d", state);
+static int logging(bt_hc_logging_state_t state, char *p_path, bool save_existing) {
+ BTHCDBG("logging %d", state);
- if (state == BT_HC_LOGGING_ON)
- {
- if (p_path != NULL)
- btsnoop_open(p_path);
- }
- else
- {
- btsnoop_close();
- }
+ if (state != BT_HC_LOGGING_ON)
+ btsnoop_close();
+ else if (p_path != NULL)
+ btsnoop_open(p_path, save_existing);
- return BT_HC_STATUS_SUCCESS;
+ return BT_HC_STATUS_SUCCESS;
}
+/** sends command HC controller to configure platform specific behaviour */
+static int tx_hc_cmd(TRANSAC transac, char *p_buf, int len) {
+ BTHCDBG("tx_hc_cmd: transac %p", transac);
-/** Closes the interface */
-static void cleanup( void )
+ if (!transac)
+ return BT_HC_STATUS_FAIL;
+
+ thread_post(hc_cb.worker_thread, event_tx_cmd, transac);
+ return BT_HC_STATUS_SUCCESS;
+}
+
+// Closes the interface.
+// This routine is not thread safe.
+static void cleanup(void)
{
- BTHCDBG("cleanup");
-
- if (lib_running)
- {
- if (fwcfg_acked == TRUE)
- {
- epilog_wait_timer();
- bthc_signal_event(HC_EVENT_EPILOG);
- }
- else
- {
- bthc_signal_event(HC_EVENT_EXIT);
- }
-
- pthread_join(hc_cb.worker_thread, NULL);
-
- if (hc_cb.epilog_timer_created == 1)
- {
- timer_delete(hc_cb.epilog_timer_id);
- hc_cb.epilog_timer_created = 0;
- }
+ if (has_cleaned_up) {
+ ALOGW("%s Already cleaned up for this session\n", __func__);
+ return;
}
- lib_running = 0;
+ BTHCDBG("cleanup");
+
+ if (hc_cb.worker_thread)
+ {
+ if (fwcfg_acked)
+ {
+ epilog_wait_timer();
+ // Stop reading thread
+ userial_close_reader();
+
+ thread_post(hc_cb.worker_thread, event_epilog, NULL);
+ }
+ thread_free(hc_cb.worker_thread);
+
+ pthread_mutex_lock(&hc_cb.worker_thread_lock);
+ hc_cb.worker_thread = NULL;
+ pthread_mutex_unlock(&hc_cb.worker_thread_lock);
+
+ if (hc_cb.epilog_timer_created)
+ {
+ timer_delete(hc_cb.epilog_timer_id);
+ hc_cb.epilog_timer_created = false;
+ }
+ }
+ BTHCDBG("%s Finalizing cleanup\n", __func__);
lpm_cleanup();
userial_close();
p_hci_if->cleanup();
utils_cleanup();
- /* Calling vendor-specific part */
- if (bt_vnd_if)
- bt_vnd_if->cleanup();
+ set_power(BT_VND_PWR_OFF);
+ vendor_close();
- fwcfg_acked = FALSE;
+ pthread_mutex_destroy(&hc_cb.worker_thread_lock);
+
+ fwcfg_acked = false;
bt_hc_cbacks = NULL;
+ has_cleaned_up = true;
}
-
static const bt_hc_interface_t bluetoothHCLibInterface = {
sizeof(bt_hc_interface_t),
init,
@@ -413,188 +510,11 @@
preload,
postload,
transmit_buf,
- set_rxflow,
logging,
- cleanup
+ cleanup,
+ tx_hc_cmd,
};
-
-/*******************************************************************************
-**
-** Function bt_hc_worker_thread
-**
-** Description Mian worker thread
-**
-** Returns void *
-**
-*******************************************************************************/
-static void *bt_hc_worker_thread(void *arg)
-{
- uint16_t events;
- HC_BT_HDR *p_msg, *p_next_msg;
- UNUSED(arg);
-
- ALOGI("bt_hc_worker_thread started");
- prctl(PR_SET_NAME, (unsigned long)"bt_hc_worker", 0, 0, 0);
- tx_cmd_pkts_pending = FALSE;
-
- raise_priority_a2dp(TASK_HIGH_HCI_WORKER);
-
- while (lib_running)
- {
- pthread_mutex_lock(&hc_cb.mutex);
- while (ready_events == 0)
- {
- pthread_cond_wait(&hc_cb.cond, &hc_cb.mutex);
- }
- events = ready_events;
- ready_events = 0;
- pthread_mutex_unlock(&hc_cb.mutex);
-
-#ifndef HCI_USE_MCT
- if (events & HC_EVENT_RX)
- {
- p_hci_if->rcv();
-
- if ((tx_cmd_pkts_pending == TRUE) && (num_hci_cmd_pkts > 0))
- {
- /* Got HCI Cmd Credits from Controller.
- * Prepare to send prior pending Cmd packets in the
- * following HC_EVENT_TX session.
- */
- events |= HC_EVENT_TX;
- }
- }
-#endif
-
- if (events & HC_EVENT_PRELOAD)
- {
- userial_open(USERIAL_PORT_1);
-
- /* Calling vendor-specific part */
- if (bt_vnd_if)
- {
- bt_vnd_if->op(BT_VND_OP_FW_CFG, NULL);
- }
- else
- {
- if (bt_hc_cbacks)
- bt_hc_cbacks->preload_cb(NULL, BT_HC_PRELOAD_FAIL);
- }
- }
-
- if (events & HC_EVENT_POSTLOAD)
- {
- /* Start from SCO related H/W configuration, if SCO configuration
- * is required. Then, follow with reading requests of getting
- * ACL data length for both BR/EDR and LE.
- */
- int result = -1;
-
- /* Calling vendor-specific part */
- if (bt_vnd_if)
- result = bt_vnd_if->op(BT_VND_OP_SCO_CFG, NULL);
-
- if (result == -1)
- p_hci_if->get_acl_max_len();
- }
-
- if (events & HC_EVENT_TX)
- {
- /*
- * We will go through every packets in the tx queue.
- * Fine to clear tx_cmd_pkts_pending.
- */
- tx_cmd_pkts_pending = FALSE;
- HC_BT_HDR * sending_msg_que[64];
- int sending_msg_count = 0;
- int sending_hci_cmd_pkts_count = 0;
- utils_lock();
- p_next_msg = tx_q.p_first;
- while (p_next_msg && sending_msg_count <
- (int)(sizeof(sending_msg_que)/sizeof(sending_msg_que[0])))
- {
- if ((p_next_msg->event & MSG_EVT_MASK)==MSG_STACK_TO_HC_HCI_CMD)
- {
- /*
- * if we have used up controller's outstanding HCI command
- * credits (normally is 1), skip all HCI command packets in
- * the queue.
- * The pending command packets will be sent once controller
- * gives back us credits through CommandCompleteEvent or
- * CommandStatusEvent.
- */
- if ((tx_cmd_pkts_pending == TRUE) ||
- (sending_hci_cmd_pkts_count >= num_hci_cmd_pkts))
- {
- tx_cmd_pkts_pending = TRUE;
- p_next_msg = utils_getnext(p_next_msg);
- continue;
- }
- sending_hci_cmd_pkts_count++;
- }
-
- p_msg = p_next_msg;
- p_next_msg = utils_getnext(p_msg);
- utils_remove_from_queue_unlocked(&tx_q, p_msg);
- sending_msg_que[sending_msg_count++] = p_msg;
- }
- utils_unlock();
- int i;
- for(i = 0; i < sending_msg_count; i++)
- p_hci_if->send(sending_msg_que[i]);
- if (tx_cmd_pkts_pending == TRUE)
- BTHCDBG("Used up Tx Cmd credits");
-
- }
-
- if (events & HC_EVENT_LPM_ENABLE)
- {
- lpm_enable(TRUE);
- }
-
- if (events & HC_EVENT_LPM_DISABLE)
- {
- lpm_enable(FALSE);
- }
-
- if (events & HC_EVENT_LPM_IDLE_TIMEOUT)
- {
- lpm_wake_deassert();
- }
-
- if (events & HC_EVENT_LPM_ALLOW_SLEEP)
- {
- lpm_allow_bt_device_sleep();
- }
-
- if (events & HC_EVENT_LPM_WAKE_DEVICE)
- {
- lpm_wake_assert();
- }
-
- if (events & HC_EVENT_EPILOG)
- {
- /* Calling vendor-specific part */
- if (bt_vnd_if)
- bt_vnd_if->op(BT_VND_OP_EPILOG, NULL);
- else
- break; // equivalent to HC_EVENT_EXIT
- }
-
- if (events & HC_EVENT_EXIT)
- break;
- }
-
- ALOGI("bt_hc_worker_thread exiting");
- lib_running = 0;
-
- pthread_exit(NULL);
-
- return NULL; // compiler friendly
-}
-
-
/*******************************************************************************
**
** Function bt_hc_get_interface
@@ -608,4 +528,3 @@
{
return &bluetoothHCLibInterface;
}
-
diff --git a/hci/src/bt_hw.c b/hci/src/bt_hw.c
deleted file mode 100644
index 898a6ed..0000000
--- a/hci/src/bt_hw.c
+++ /dev/null
@@ -1,230 +0,0 @@
-/******************************************************************************
- *
- * Copyright (C) 2009-2012 Broadcom Corporation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- ******************************************************************************/
-
-/******************************************************************************
- *
- * Filename: bt_hw.c
- *
- * Description: Bluedroid libbt-vendor callback functions
- *
- ******************************************************************************/
-
-#define LOG_TAG "bt_hw"
-
-#include <dlfcn.h>
-#include <utils/Log.h>
-#include <pthread.h>
-#include "bt_vendor_lib.h"
-#include "bt_hci_bdroid.h"
-#include "hci.h"
-#include "userial.h"
-#include "bt_utils.h"
-
-/******************************************************************************
-** Externs
-******************************************************************************/
-
-extern tHCI_IF *p_hci_if;
-extern uint8_t fwcfg_acked;
-void lpm_vnd_cback(uint8_t vnd_result);
-
-/******************************************************************************
-** Variables
-******************************************************************************/
-
-bt_vendor_interface_t *bt_vnd_if=NULL;
-
-/******************************************************************************
-** Functions
-******************************************************************************/
-
-/******************************************************************************
-**
-** Function fwcfg_cb
-**
-** Description HOST/CONTROLLER VENDOR LIB CALLBACK API - This function is
-** called when the libbt-vendor completed firmware
-** configuration process
-**
-** Returns None
-**
-******************************************************************************/
-static void fwcfg_cb(bt_vendor_op_result_t result)
-{
- bt_hc_postload_result_t status = (result == BT_VND_OP_RESULT_SUCCESS) ? \
- BT_HC_PRELOAD_SUCCESS : BT_HC_PRELOAD_FAIL;
-
- fwcfg_acked = TRUE;
-
- if (bt_hc_cbacks)
- bt_hc_cbacks->preload_cb(NULL, status);
-}
-
-/******************************************************************************
-**
-** Function scocfg_cb
-**
-** Description HOST/CONTROLLER VENDOR LIB CALLBACK API - This function is
-** called when the libbt-vendor completed vendor specific SCO
-** configuration process
-**
-** Returns None
-**
-******************************************************************************/
-static void scocfg_cb(bt_vendor_op_result_t result)
-{
- UNUSED(result);
- /* Continue rest of postload process*/
- p_hci_if->get_acl_max_len();
-}
-
-/******************************************************************************
-**
-** Function lpm_vnd_cb
-**
-** Description HOST/CONTROLLER VENDOR LIB CALLBACK API - This function is
-** called back from the libbt-vendor to indicate the result of
-** previous LPM enable/disable request
-**
-** Returns None
-**
-******************************************************************************/
-static void lpm_vnd_cb(bt_vendor_op_result_t result)
-{
- uint8_t status = (result == BT_VND_OP_RESULT_SUCCESS) ? 0 : 1;
-
- lpm_vnd_cback(status);
-}
-
-/******************************************************************************
-**
-** Function alloc
-**
-** Description HOST/CONTROLLER VENDOR LIB CALLOUT API - This function is
-** called from the libbt-vendor to request for data buffer
-** allocation
-**
-** Returns NULL / pointer to allocated buffer
-**
-******************************************************************************/
-static void *alloc(int size)
-{
- HC_BT_HDR *p_hdr = NULL;
-
- if (bt_hc_cbacks)
- p_hdr = (HC_BT_HDR *) bt_hc_cbacks->alloc(size);
-
- return (p_hdr);
-}
-
-/******************************************************************************
-**
-** Function dealloc
-**
-** Description HOST/CONTROLLER VENDOR LIB CALLOUT API - This function is
-** called from the libbt-vendor to release the data buffer
-** allocated through the alloc call earlier
-**
-** Returns None
-**
-******************************************************************************/
-static void dealloc(void *p_buf)
-{
- HC_BT_HDR *p_hdr = (HC_BT_HDR *) p_buf;
-
- if (bt_hc_cbacks)
- bt_hc_cbacks->dealloc((TRANSAC) p_buf, (char *) (p_hdr+1));
-}
-
-/******************************************************************************
-**
-** Function xmit_cb
-**
-** Description HOST/CONTROLLER VEDNOR LIB CALLOUT API - This function is
-** called from the libbt-vendor in order to send a prepared
-** HCI command packet through HCI transport TX function.
-**
-** Returns TRUE/FALSE
-**
-******************************************************************************/
-static uint8_t xmit_cb(uint16_t opcode, void *p_buf, tINT_CMD_CBACK p_cback)
-{
- return p_hci_if->send_int_cmd(opcode, (HC_BT_HDR *)p_buf, p_cback);
-}
-
-/******************************************************************************
-**
-** Function epilog_cb
-**
-** Description HOST/CONTROLLER VENDOR LIB CALLBACK API - This function is
-** called back from the libbt-vendor to indicate the result of
-** previous epilog call.
-**
-** Returns None
-**
-******************************************************************************/
-static void epilog_cb(bt_vendor_op_result_t result)
-{
- UNUSED(result);
- bthc_signal_event(HC_EVENT_EXIT);
-}
-
-/*****************************************************************************
-** The libbt-vendor Callback Functions Table
-*****************************************************************************/
-static const bt_vendor_callbacks_t vnd_callbacks = {
- sizeof(bt_vendor_callbacks_t),
- fwcfg_cb,
- scocfg_cb,
- lpm_vnd_cb,
- alloc,
- dealloc,
- xmit_cb,
- epilog_cb
-};
-
-/******************************************************************************
-**
-** Function init_vnd_if
-**
-** Description Initialize vendor lib interface
-**
-** Returns None
-**
-******************************************************************************/
-void init_vnd_if(unsigned char *local_bdaddr)
-{
- void *dlhandle;
-
- dlhandle = dlopen("libbt-vendor.so", RTLD_NOW);
- if (!dlhandle)
- {
- ALOGE("!!! Failed to load libbt-vendor.so !!!");
- return;
- }
-
- bt_vnd_if = (bt_vendor_interface_t *) dlsym(dlhandle, "BLUETOOTH_VENDOR_LIB_INTERFACE");
- if (!bt_vnd_if)
- {
- ALOGE("!!! Failed to get bt vendor interface !!!");
- return;
- }
-
- bt_vnd_if->init(&vnd_callbacks, local_bdaddr);
-}
-
diff --git a/hci/src/btsnoop.c b/hci/src/btsnoop.c
old mode 100755
new mode 100644
index c6556d6..e31af35
--- a/hci/src/btsnoop.c
+++ b/hci/src/btsnoop.c
@@ -16,613 +16,169 @@
*
******************************************************************************/
-/****************************************************************************
- *
- * Name: btsnoopdisp.c
- *
- * Function: this file contains functions to generate a BTSNOOP file
- *
- *
- ****************************************************************************/
-#include <stdio.h>
-#include <dlfcn.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <string.h>
-#include <pthread.h>
-#include <sys/prctl.h>
-#include <unistd.h>
-#include <ctype.h>
-#include <fcntl.h>
+#define LOG_TAG "btsnoop"
#include <arpa/inet.h>
-#include <netinet/in.h>
-#include <netdb.h>
-
-/* for gettimeofday */
-#include <sys/time.h>
-/* for the S_* open parameters */
-#include <sys/stat.h>
-/* for write */
-#include <unistd.h>
-/* for O_* open parameters */
-#include <fcntl.h>
-/* defines the O_* open parameters */
-#include <fcntl.h>
-
-#define LOG_TAG "BTSNOOP-DISP"
+#include <assert.h>
+#include <ctype.h>
#include <cutils/log.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <unistd.h>
#include "bt_hci_bdroid.h"
-#include "utils.h"
#include "bt_utils.h"
+#include "utils.h"
-#ifndef BTSNOOP_DBG
-#define BTSNOOP_DBG FALSE
-#endif
+typedef enum {
+ kCommandPacket = 1,
+ kAclPacket = 2,
+ kScoPacket = 3,
+ kEventPacket = 4
+} packet_type_t;
-#if (BTSNOOP_DBG == TRUE)
-#define SNOOPDBG(param, ...) {ALOGD(param, ## __VA_ARGS__);}
-#else
-#define SNOOPDBG(param, ...) {}
-#endif
+// Epoch in microseconds since 01/01/0000.
+static const uint64_t BTSNOOP_EPOCH_DELTA = 0x00dcddb30f2f8000ULL;
-#define HCIT_TYPE_COMMAND 1
-#define HCIT_TYPE_ACL_DATA 2
-#define HCIT_TYPE_SCO_DATA 3
-#define HCIT_TYPE_EVENT 4
+// File descriptor for btsnoop file.
+static int hci_btsnoop_fd = -1;
-/* file descriptor of the BT snoop file (by default, -1 means disabled) */
-int hci_btsnoop_fd = -1;
+void btsnoop_net_open();
+void btsnoop_net_close();
+void btsnoop_net_write(const void *data, size_t length);
-/* Macro to perform a multiplication of 2 unsigned 32bit values and store the result
- * in an unsigned 64 bit value (as two 32 bit variables):
- * u64 = u32In1 * u32In2
- * u32OutLow = u64[31:0]
- * u32OutHi = u64[63:32]
- * basically the algorithm:
- * (hi1*2^16 + lo1)*(hi2*2^16 + lo2) = lo1*lo2 + (hi1*hi2)*2^32 + (hi1*lo2 + hi2*lo1)*2^16
- * and the carry is propagated 16 bit by 16 bit:
- * result[15:0] = lo1*lo2 & 0xFFFF
- * result[31:16] = ((lo1*lo2) >> 16) + (hi1*lo2 + hi2*lo1)
- * and so on
- */
-#define HCIDISP_MULT_64(u32In1, u32In2, u32OutLo, u32OutHi) \
-do { \
- uint32_t u32In1Tmp = u32In1; \
- uint32_t u32In2Tmp = u32In2; \
- uint32_t u32Tmp, u32Carry; \
- u32OutLo = (u32In1Tmp & 0xFFFF) * (u32In2Tmp & 0xFFFF); /*lo1*lo2*/ \
- u32OutHi = ((u32In1Tmp >> 16) & 0xFFFF) * ((u32In2Tmp >> 16) & 0xFFFF); /*hi1*hi2*/ \
- u32Tmp = (u32In1Tmp & 0xFFFF) * ((u32In2Tmp >> 16) & 0xFFFF); /*lo1*hi2*/ \
- u32Carry = (uint32_t)((u32OutLo>>16)&0xFFFF); \
- u32Carry += (u32Tmp&0xFFFF); \
- u32OutLo += (u32Tmp << 16) ; \
- u32OutHi += (u32Tmp >> 16); \
- u32Tmp = ((u32In1Tmp >> 16) & 0xFFFF) * (u32In2Tmp & 0xFFFF); \
- u32Carry += (u32Tmp)&0xFFFF; \
- u32Carry>>=16; \
- u32OutLo += (u32Tmp << 16); \
- u32OutHi += (u32Tmp >> 16); \
- u32OutHi += u32Carry; \
-} while (0)
+static uint64_t btsnoop_timestamp(void) {
+ struct timeval tv;
+ gettimeofday(&tv, NULL);
-/* Macro to make an addition of 2 64 bit values:
- * result = (u32OutHi & u32OutLo) + (u32InHi & u32InLo)
- * u32OutHi = result[63:32]
- * u32OutLo = result[31:0]
- */
-#define HCIDISP_ADD_64(u32InLo, u32InHi, u32OutLo, u32OutHi) \
-do { \
- (u32OutLo) += (u32InLo); \
- if ((u32OutLo) < (u32InLo)) (u32OutHi)++; \
- (u32OutHi) += (u32InHi); \
-} while (0)
-
-/* EPOCH in microseconds since 01/01/0000 : 0x00dcddb3.0f2f8000 */
-#define BTSNOOP_EPOCH_HI 0x00dcddb3U
-#define BTSNOOP_EPOCH_LO 0x0f2f8000U
-
-
-/*******************************************************************************
- **
- ** Function tv_to_btsnoop_ts
- **
- ** Description This function generate a BT Snoop timestamp.
- **
- ** Returns void
- **
- ** NOTE
- ** The return value is 64 bit as 2 32 bit variables out_lo and * out_hi.
- ** A BT Snoop timestamp is the number of microseconds since 01/01/0000.
- ** The timeval structure contains the number of microseconds since EPOCH
- ** (01/01/1970) encoded as: tv.tv_sec, number of seconds since EPOCH and
- ** tv_usec, number of microseconds in current second
- **
- ** Therefore the algorithm is:
- ** result = tv.tv_sec * 1000000
- ** result += tv.tv_usec
- ** result += EPOCH_OFFSET
- *******************************************************************************/
-static void tv_to_btsnoop_ts(uint32_t *out_lo, uint32_t *out_hi, struct timeval *tv)
-{
- /* multiply the seconds by 1000000 */
- HCIDISP_MULT_64(tv->tv_sec, 0xf4240, *out_lo, *out_hi);
-
- /* add the microseconds */
- HCIDISP_ADD_64((uint32_t)tv->tv_usec, 0, *out_lo, *out_hi);
-
- /* add the epoch */
- HCIDISP_ADD_64(BTSNOOP_EPOCH_LO, BTSNOOP_EPOCH_HI, *out_lo, *out_hi);
+ // Timestamp is in microseconds.
+ uint64_t timestamp = tv.tv_sec * 1000 * 1000LL;
+ timestamp += tv.tv_usec;
+ timestamp += BTSNOOP_EPOCH_DELTA;
+ return timestamp;
}
-/*******************************************************************************
- **
- ** Function l_to_be
- **
- ** Description Function to convert a 32 bit value into big endian format
- **
- ** Returns 32 bit value in big endian format
-*******************************************************************************/
-static uint32_t l_to_be(uint32_t x)
-{
- #if __BIG_ENDIAN != TRUE
- x = (x >> 24) |
- ((x >> 8) & 0xFF00) |
- ((x << 8) & 0xFF0000) |
- (x << 24);
- #endif
- return x;
+static void btsnoop_write(const void *data, size_t length) {
+ if (hci_btsnoop_fd != -1)
+ write(hci_btsnoop_fd, data, length);
+
+ btsnoop_net_write(data, length);
}
-/*******************************************************************************
- **
- ** Function btsnoop_is_open
- **
- ** Description Function to check if BTSNOOP is open
- **
- ** Returns 1 if open otherwise 0
-*******************************************************************************/
-int btsnoop_is_open(void)
-{
-#if defined(BTSNOOPDISP_INCLUDED) && (BTSNOOPDISP_INCLUDED == TRUE)
- SNOOPDBG("btsnoop_is_open: snoop fd = %d\n", hci_btsnoop_fd);
+static void btsnoop_write_packet(packet_type_t type, const uint8_t *packet, bool is_received) {
+ int length_he = 0;
+ int length;
+ int flags;
+ int drops = 0;
+ switch (type) {
+ case kCommandPacket:
+ length_he = packet[2] + 4;
+ flags = 2;
+ break;
+ case kAclPacket:
+ length_he = (packet[3] << 8) + packet[2] + 5;
+ flags = is_received;
+ break;
+ case kScoPacket:
+ length_he = packet[2] + 4;
+ flags = is_received;
+ break;
+ case kEventPacket:
+ length_he = packet[1] + 3;
+ flags = 3;
+ break;
+ }
- if (hci_btsnoop_fd != -1)
- {
- return 1;
- }
- return 0;
-#else
- return 2; /* Snoop not available */
-#endif
+ uint64_t timestamp = btsnoop_timestamp();
+ uint32_t time_hi = timestamp >> 32;
+ uint32_t time_lo = timestamp & 0xFFFFFFFF;
+
+ length = htonl(length_he);
+ flags = htonl(flags);
+ drops = htonl(drops);
+ time_hi = htonl(time_hi);
+ time_lo = htonl(time_lo);
+
+ // This function is called from different contexts.
+ utils_lock();
+
+ btsnoop_write(&length, 4);
+ btsnoop_write(&length, 4);
+ btsnoop_write(&flags, 4);
+ btsnoop_write(&drops, 4);
+ btsnoop_write(&time_hi, 4);
+ btsnoop_write(&time_lo, 4);
+ btsnoop_write(&type, 1);
+ btsnoop_write(packet, length_he - 1);
+
+ utils_unlock();
}
-/*******************************************************************************
- **
- ** Function btsnoop_log_open
- **
- ** Description Function to open the BTSNOOP file
- **
- ** Returns None
-*******************************************************************************/
-static int btsnoop_log_open(char *btsnoop_logfile)
-{
-#if defined(BTSNOOPDISP_INCLUDED) && (BTSNOOPDISP_INCLUDED == TRUE)
- hci_btsnoop_fd = -1;
+void btsnoop_open(const char *p_path, const bool save_existing) {
+ assert(p_path != NULL);
+ assert(*p_path != '\0');
- SNOOPDBG("btsnoop_log_open: snoop log file = %s\n", btsnoop_logfile);
+ btsnoop_net_open();
- /* write the BT snoop header */
- if ((btsnoop_logfile != NULL) && (strlen(btsnoop_logfile) != 0))
- {
- hci_btsnoop_fd = open(btsnoop_logfile, \
- O_WRONLY|O_CREAT|O_TRUNC, \
- S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH);
- if (hci_btsnoop_fd == -1)
- {
- perror("open");
- SNOOPDBG("btsnoop_log_open: Unable to open snoop log file\n");
- hci_btsnoop_fd = -1;
- return 0;
- }
- write(hci_btsnoop_fd, "btsnoop\0\0\0\0\1\0\0\x3\xea", 16);
- return 1;
- }
-#endif
- return 2; /* Snoop not available */
+ if (hci_btsnoop_fd != -1) {
+ ALOGE("%s btsnoop log file is already open.", __func__);
+ return;
+ }
+
+ if (save_existing)
+ {
+ char fname_backup[266] = {0};
+ strncat(fname_backup, p_path, 255);
+ strcat(fname_backup, ".last");
+ rename(p_path, fname_backup);
+ }
+
+ hci_btsnoop_fd = open(p_path,
+ O_WRONLY | O_CREAT | O_TRUNC,
+ S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH);
+
+ if (hci_btsnoop_fd == -1) {
+ ALOGE("%s unable to open '%s': %s", __func__, p_path, strerror(errno));
+ return;
+ }
+
+ write(hci_btsnoop_fd, "btsnoop\0\0\0\0\1\0\0\x3\xea", 16);
}
-/*******************************************************************************
- **
- ** Function btsnoop_log_close
- **
- ** Description Function to close the BTSNOOP file
- **
- ** Returns None
-*******************************************************************************/
-static int btsnoop_log_close(void)
-{
-#if defined(BTSNOOPDISP_INCLUDED) && (BTSNOOPDISP_INCLUDED == TRUE)
- /* write the BT snoop header */
- if (hci_btsnoop_fd != -1)
- {
- SNOOPDBG("btsnoop_log_close: Closing snoop log file\n");
- close(hci_btsnoop_fd);
- hci_btsnoop_fd = -1;
- return 1;
- }
- return 0;
-#else
- return 2; /* Snoop not available */
-#endif
+void btsnoop_close(void) {
+ if (hci_btsnoop_fd != -1)
+ close(hci_btsnoop_fd);
+ hci_btsnoop_fd = -1;
+
+ btsnoop_net_close();
}
-/*******************************************************************************
- ** Function btsnoop_write
- **
- ** Description Function used to write the actual data to the log
- **
- ** Returns none
-*******************************************************************************/
+void btsnoop_capture(const HC_BT_HDR *p_buf, bool is_rcvd) {
+ const uint8_t *p = (const uint8_t *)(p_buf + 1) + p_buf->offset;
-void btsnoop_write(uint8_t *p, uint32_t flags, const uint8_t *ptype, uint32_t len)
-{
- uint32_t value, value_hi;
- struct timeval tv;
- struct iovec io[3];
- uint32_t header[6];
+ if (hci_btsnoop_fd == -1)
+ return;
- /* store the length in both original and included fields */
- header[0] = l_to_be(len + 1);
- header[1] = header[0];
- /* flags: data can be sent or received */
- header[2] = l_to_be(flags);
- /* drops: none */
- header[3] = 0;
- /* time */
- gettimeofday(&tv, NULL);
- tv_to_btsnoop_ts(&header[5], &header[4], &tv);
- header[4] = l_to_be(header[4]);
- header[5] = l_to_be(header[5]);
-
- io[0].iov_base = header;
- io[0].iov_len = sizeof(header);
-
- io[1].iov_base = (void*)ptype;
- io[1].iov_len = 1;
-
- io[2].iov_base = p;
- io[2].iov_len = len;
-
- (void) writev(hci_btsnoop_fd, io, 3);
+ switch (p_buf->event & MSG_EVT_MASK) {
+ case MSG_HC_TO_STACK_HCI_EVT:
+ btsnoop_write_packet(kEventPacket, p, false);
+ break;
+ case MSG_HC_TO_STACK_HCI_ACL:
+ case MSG_STACK_TO_HC_HCI_ACL:
+ btsnoop_write_packet(kAclPacket, p, is_rcvd);
+ break;
+ case MSG_HC_TO_STACK_HCI_SCO:
+ case MSG_STACK_TO_HC_HCI_SCO:
+ btsnoop_write_packet(kScoPacket, p, is_rcvd);
+ break;
+ case MSG_STACK_TO_HC_HCI_CMD:
+ btsnoop_write_packet(kCommandPacket, p, true);
+ break;
+ }
}
-
-/*******************************************************************************
- **
- ** Function btsnoop_hci_cmd
- **
- ** Description Function to add a command in the BTSNOOP file
- **
- ** Returns None
-*******************************************************************************/
-void btsnoop_hci_cmd(uint8_t *p)
-{
- const uint8_t cmd = HCIT_TYPE_COMMAND;
- int plen;
- SNOOPDBG("btsnoop_hci_cmd: fd = %d", hci_btsnoop_fd);
- plen = (int) p[2] + 3;
- btsnoop_write(p, 2, &cmd, plen);
-}
-
-
-/*******************************************************************************
- **
- ** Function btsnoop_hci_evt
- **
- ** Description Function to add a event in the BTSNOOP file
- **
- ** Returns None
-*******************************************************************************/
-void btsnoop_hci_evt(uint8_t *p)
-{
- const uint8_t evt = HCIT_TYPE_EVENT;
- int plen;
- SNOOPDBG("btsnoop_hci_evt: fd = %d", hci_btsnoop_fd);
- plen = (int) p[1] + 2;
-
- btsnoop_write(p, 3, &evt, plen);
-}
-
-/*******************************************************************************
- **
- ** Function btsnoop_sco_data
- **
- ** Description Function to add a SCO data packet in the BTSNOOP file
- **
- ** Returns None
-*******************************************************************************/
-void btsnoop_sco_data(uint8_t *p, uint8_t is_rcvd)
-{
- const uint8_t sco = HCIT_TYPE_SCO_DATA;
- int plen;
- SNOOPDBG("btsnoop_sco_data: fd = %d", hci_btsnoop_fd);
- plen = (int) p[2] + 3;
-
- btsnoop_write(p, is_rcvd, &sco, plen);
-}
-
-/*******************************************************************************
- **
- ** Function btsnoop_acl_data
- **
- ** Description Function to add an ACL data packet in the BTSNOOP file
- **
- ** Returns None
-*******************************************************************************/
-void btsnoop_acl_data(uint8_t *p, uint8_t is_rcvd)
-{
- const uint8_t acl = HCIT_TYPE_ACL_DATA;
- int plen;
-
- SNOOPDBG("btsnoop_acl_data: fd = %d", hci_btsnoop_fd);
-
- plen = (((int) p[3]) << 8) + ((int) p[2]) +4;
-
- btsnoop_write(p, is_rcvd, &acl, plen);
-}
-
-/********************************************************************************
- ** API allow external realtime parsing of output using e.g hcidump
- *********************************************************************************/
-
-#define EXT_PARSER_PORT 4330
-
-static pthread_t thread_id;
-static int s_listen = -1;
-static int ext_parser_fd = -1;
-
-static void ext_parser_detached(void);
-
-static int ext_parser_accept(int port)
-{
- socklen_t clilen;
- struct sockaddr_in cliaddr, servaddr;
- int s, srvlen;
- int n = 1;
- int size_n;
- int result = 0;
-
- ALOGD("waiting for connection on port %d", port);
-
- s_listen = socket(AF_INET, SOCK_STREAM, 0);
-
- if (s_listen < 0)
- {
- ALOGE("listener not created: listen fd %d", s_listen);
- return -1;
- }
-
- bzero(&servaddr, sizeof(servaddr));
- servaddr.sin_family = AF_INET;
- servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
- servaddr.sin_port = htons(port);
-
- srvlen = sizeof(servaddr);
-
- /* allow reuse of sock addr upon bind */
- result = setsockopt(s_listen, SOL_SOCKET, SO_REUSEADDR, &n, sizeof(n));
-
- if (result<0)
- {
- perror("setsockopt");
- }
-
- result = bind(s_listen, (struct sockaddr *) &servaddr, srvlen);
-
- if (result < 0)
- perror("bind");
-
- result = listen(s_listen, 1);
-
- if (result < 0)
- perror("listen");
-
- clilen = sizeof(struct sockaddr_in);
-
- s = accept(s_listen, (struct sockaddr *) &cliaddr, &clilen);
-
- if (s < 0)
-{
- perror("accept");
- return -1;
- }
-
- ALOGD("connected (%d)", s);
-
- return s;
-}
-
-static int send_ext_parser(char *p, int len)
-{
- int n;
-
- /* check if io socket is connected */
- if (ext_parser_fd == -1)
- return 0;
-
- SNOOPDBG("write %d to snoop socket\n", len);
-
- n = write(ext_parser_fd, p, len);
-
- if (n<=0)
- {
- ext_parser_detached();
- }
-
- return n;
-}
-
-static void ext_parser_detached(void)
-{
- ALOGD("ext parser detached");
-
- if (ext_parser_fd>0)
- close(ext_parser_fd);
-
- if (s_listen > 0)
- close(s_listen);
-
- ext_parser_fd = -1;
- s_listen = -1;
-}
-
-static void interruptFn (int sig)
-{
- UNUSED(sig);
- ALOGD("interruptFn");
- pthread_exit(0);
-}
-
-static void ext_parser_thread(void* param)
-{
- int fd;
- int sig = SIGUSR2;
- sigset_t sigSet;
- sigemptyset (&sigSet);
- sigaddset (&sigSet, sig);
- UNUSED(param);
-
- ALOGD("ext_parser_thread");
-
- prctl(PR_SET_NAME, (unsigned long)"BtsnoopExtParser", 0, 0, 0);
-
- pthread_sigmask (SIG_UNBLOCK, &sigSet, NULL);
-
- struct sigaction act;
- act.sa_handler = interruptFn;
- sigaction (sig, &act, NULL );
-
- do
- {
- fd = ext_parser_accept(EXT_PARSER_PORT);
-
- ext_parser_fd = fd;
-
- ALOGD("ext parser attached on fd %d\n", ext_parser_fd);
- } while (1);
-}
-
-void btsnoop_stop_listener(void)
-{
- ALOGD("btsnoop_init");
- ext_parser_detached();
-}
-
-void btsnoop_init(void)
-{
-#if defined(BTSNOOP_EXT_PARSER_INCLUDED) && (BTSNOOP_EXT_PARSER_INCLUDED == TRUE)
- ALOGD("btsnoop_init");
-
- /* always setup ext listener port */
- if (pthread_create(&thread_id, NULL,
- (void*)ext_parser_thread,NULL)!=0)
- perror("pthread_create");
-#endif
-}
-
-void btsnoop_open(char *p_path)
-{
-#if defined(BTSNOOPDISP_INCLUDED) && (BTSNOOPDISP_INCLUDED == TRUE)
- ALOGD("btsnoop_open");
- btsnoop_log_open(p_path);
-#endif // BTSNOOPDISP_INCLUDED
-}
-
-void btsnoop_close(void)
-{
-#if defined(BTSNOOPDISP_INCLUDED) && (BTSNOOPDISP_INCLUDED == TRUE)
- ALOGD("btsnoop_close");
- btsnoop_log_close();
-#endif
-}
-
-void btsnoop_cleanup (void)
-{
-#if defined(BTSNOOP_EXT_PARSER_INCLUDED) && (BTSNOOP_EXT_PARSER_INCLUDED == TRUE)
- ALOGD("btsnoop_cleanup");
- pthread_kill(thread_id, SIGUSR2);
- pthread_join(thread_id, NULL);
- ext_parser_detached();
-#endif
-}
-
-
-void btsnoop_capture(HC_BT_HDR *p_buf, uint8_t is_rcvd)
-{
- uint8_t *p = (uint8_t *)(p_buf + 1) + p_buf->offset;
-
- SNOOPDBG("btsnoop_capture: fd = %d, type %x, rcvd %d, ext %d", \
- hci_btsnoop_fd, p_buf->event, is_rcvd, ext_parser_fd);
-
-#if defined(BTSNOOP_EXT_PARSER_INCLUDED) && (BTSNOOP_EXT_PARSER_INCLUDED == TRUE)
- if (ext_parser_fd > 0)
- {
- uint8_t tmp = *p;
-
- /* borrow one byte for H4 packet type indicator */
- p--;
-
- switch (p_buf->event & MSG_EVT_MASK)
- {
- case MSG_HC_TO_STACK_HCI_EVT:
- *p = HCIT_TYPE_EVENT;
- break;
- case MSG_HC_TO_STACK_HCI_ACL:
- case MSG_STACK_TO_HC_HCI_ACL:
- *p = HCIT_TYPE_ACL_DATA;
- break;
- case MSG_HC_TO_STACK_HCI_SCO:
- case MSG_STACK_TO_HC_HCI_SCO:
- *p = HCIT_TYPE_SCO_DATA;
- break;
- case MSG_STACK_TO_HC_HCI_CMD:
- *p = HCIT_TYPE_COMMAND;
- break;
- }
-
- send_ext_parser((char*)p, p_buf->len+1);
- *(++p) = tmp;
- return;
- }
-#endif
-
-#if defined(BTSNOOPDISP_INCLUDED) && (BTSNOOPDISP_INCLUDED == TRUE)
- if (hci_btsnoop_fd == -1)
- return;
-
- switch (p_buf->event & MSG_EVT_MASK)
- {
- case MSG_HC_TO_STACK_HCI_EVT:
- SNOOPDBG("TYPE : EVT");
- btsnoop_hci_evt(p);
- break;
- case MSG_HC_TO_STACK_HCI_ACL:
- case MSG_STACK_TO_HC_HCI_ACL:
- SNOOPDBG("TYPE : ACL");
- btsnoop_acl_data(p, is_rcvd);
- break;
- case MSG_HC_TO_STACK_HCI_SCO:
- case MSG_STACK_TO_HC_HCI_SCO:
- SNOOPDBG("TYPE : SCO");
- btsnoop_sco_data(p, is_rcvd);
- break;
- case MSG_STACK_TO_HC_HCI_CMD:
- SNOOPDBG("TYPE : CMD");
- btsnoop_hci_cmd(p);
- break;
- }
-#endif // BTSNOOPDISP_INCLUDED
-}
-
-
diff --git a/hci/src/btsnoop_net.c b/hci/src/btsnoop_net.c
new file mode 100644
index 0000000..adaddcd
--- /dev/null
+++ b/hci/src/btsnoop_net.c
@@ -0,0 +1,137 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2013 Google, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+#define LOG_TAG "btsnoop_net"
+
+#include <assert.h>
+#include <cutils/log.h>
+#include <errno.h>
+#include <netinet/in.h>
+#include <pthread.h>
+#include <stdbool.h>
+#include <string.h>
+#include <sys/prctl.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+
+#include "osi.h"
+
+static void safe_close_(int *fd);
+static void *listen_fn_(void *context);
+
+static const char *LISTEN_THREAD_NAME_ = "btsnoop_net_listen";
+static const int LOCALHOST_ = 0x7F000001;
+static const int LISTEN_PORT_ = 8872;
+
+static pthread_t listen_thread_;
+static bool listen_thread_valid_ = false;
+static pthread_mutex_t client_socket_lock_ = PTHREAD_MUTEX_INITIALIZER;
+static int listen_socket_ = -1;
+static int client_socket_ = -1;
+
+void btsnoop_net_open() {
+ listen_thread_valid_ = (pthread_create(&listen_thread_, NULL, listen_fn_, NULL) == 0);
+ if (!listen_thread_valid_) {
+ ALOGE("%s pthread_create failed: %s", __func__, strerror(errno));
+ } else {
+ ALOGD("initialized");
+ }
+}
+
+void btsnoop_net_close() {
+ if (listen_thread_valid_) {
+ shutdown(listen_socket_, SHUT_RDWR);
+ pthread_join(listen_thread_, NULL);
+ safe_close_(&client_socket_);
+ listen_thread_valid_ = false;
+ }
+}
+
+void btsnoop_net_write(const void *data, size_t length) {
+ pthread_mutex_lock(&client_socket_lock_);
+ if (client_socket_ != -1) {
+ if (send(client_socket_, data, length, 0) == -1 && errno == ECONNRESET) {
+ safe_close_(&client_socket_);
+ }
+ }
+ pthread_mutex_unlock(&client_socket_lock_);
+}
+
+static void *listen_fn_(UNUSED_ATTR void *context) {
+
+ prctl(PR_SET_NAME, (unsigned long)LISTEN_THREAD_NAME_, 0, 0, 0);
+
+ listen_socket_ = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+ if (listen_socket_ == -1) {
+ ALOGE("%s socket creation failed: %s", __func__, strerror(errno));
+ goto cleanup;
+ }
+
+ int enable = 1;
+ if (setsockopt(listen_socket_, SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(enable)) == -1) {
+ ALOGE("%s unable to set SO_REUSEADDR: %s", __func__, strerror(errno));
+ goto cleanup;
+ }
+
+ struct sockaddr_in addr;
+ addr.sin_family = AF_INET;
+ addr.sin_addr.s_addr = htonl(LOCALHOST_);
+ addr.sin_port = htons(LISTEN_PORT_);
+ if (bind(listen_socket_, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
+ ALOGE("%s unable to bind listen socket: %s", __func__, strerror(errno));
+ goto cleanup;
+ }
+
+ if (listen(listen_socket_, 10) == -1) {
+ ALOGE("%s unable to listen: %s", __func__, strerror(errno));
+ goto cleanup;
+ }
+
+ for (;;) {
+ ALOGD("waiting for client connection");
+ int client_socket = accept(listen_socket_, NULL, NULL);
+ if (client_socket == -1) {
+ if (errno == EINVAL || errno == EBADF) {
+ break;
+ }
+ ALOGW("%s error accepting socket: %s", __func__, strerror(errno));
+ continue;
+ }
+
+ /* When a new client connects, we have to send the btsnoop file header. This allows
+ a decoder to treat the session as a new, valid btsnoop file. */
+ ALOGI("client connected");
+ pthread_mutex_lock(&client_socket_lock_);
+ safe_close_(&client_socket_);
+ client_socket_ = client_socket;
+ send(client_socket_, "btsnoop\0\0\0\0\1\0\0\x3\xea", 16, 0);
+ pthread_mutex_unlock(&client_socket_lock_);
+ }
+
+cleanup:
+ safe_close_(&listen_socket_);
+ return NULL;
+}
+
+static void safe_close_(int *fd) {
+ assert(fd != NULL);
+ if (*fd != -1) {
+ close(*fd);
+ *fd = -1;
+ }
+}
diff --git a/hci/src/hci_h4.c b/hci/src/hci_h4.c
index ba15426..ba6e2a2 100644
--- a/hci/src/hci_h4.c
+++ b/hci/src/hci_h4.c
@@ -29,7 +29,9 @@
#include <utils/Log.h>
#include <stdlib.h>
#include <fcntl.h>
+
#include "bt_hci_bdroid.h"
+#include "btsnoop.h"
#include "hci.h"
#include "userial.h"
#include "utils.h"
@@ -150,12 +152,6 @@
** Externs
******************************************************************************/
-extern BUFFER_Q tx_q;
-
-void btsnoop_init(void);
-void btsnoop_close(void);
-void btsnoop_cleanup (void);
-void btsnoop_capture(HC_BT_HDR *p_buf, uint8_t is_rcvd);
uint8_t hci_h4_send_int_cmd(uint16_t opcode, HC_BT_HDR *p_buf, \
tINT_CMD_CBACK p_cback);
void lpm_wake_assert(void);
@@ -219,7 +215,7 @@
if ((status = hci_h4_send_int_cmd(HCI_LE_READ_BUFFER_SIZE, p_buf, \
get_acl_data_length_cback)) == FALSE)
{
- bt_hc_cbacks->dealloc((TRANSAC) p_buf, (char *) (p_buf + 1));
+ bt_hc_cbacks->dealloc(p_buf);
bt_hc_cbacks->postload_cb(NULL, BT_HC_POSTLOAD_SUCCESS);
}
}
@@ -230,7 +226,7 @@
if (bt_hc_cbacks)
{
- bt_hc_cbacks->dealloc((TRANSAC) p_buf, (char *) (p_buf + 1));
+ bt_hc_cbacks->dealloc(p_buf);
ALOGE("vendor lib postload completed");
bt_hc_cbacks->postload_cb(NULL, BT_HC_POSTLOAD_SUCCESS);
}
@@ -286,8 +282,7 @@
// Release the p_rcv_msg buffer.
if (bt_hc_cbacks)
{
- bt_hc_cbacks->dealloc((TRANSAC) p_cb->p_rcv_msg, \
- (char *) (p_cb->p_rcv_msg + 1));
+ bt_hc_cbacks->dealloc(p_cb->p_rcv_msg);
}
}
p_cb->int_cmd_rd_idx = ((p_cb->int_cmd_rd_idx+1) & \
@@ -380,8 +375,7 @@
if (bt_hc_cbacks)
{
- bt_hc_cbacks->dealloc((TRANSAC) p_return_buf, \
- (char *) (p_return_buf + 1));
+ bt_hc_cbacks->dealloc(p_return_buf);
}
p_return_buf = NULL;
}
@@ -509,7 +503,7 @@
p_buf->offset = p_buf->offset - HCI_ACL_PREAMBLE_SIZE;
p_buf->len = p_buf->len - p_buf->offset;
- btsnoop_capture(p_buf, TRUE);
+ btsnoop_capture(p_buf, true);
/* restore contents */
memcpy(p, p_cb->preload_buffer, HCI_ACL_PREAMBLE_SIZE);
@@ -520,7 +514,7 @@
else
{
/* START PACKET */
- btsnoop_capture(p_buf, TRUE);
+ btsnoop_capture(p_buf, true);
}
if (frame_end == TRUE)
@@ -559,8 +553,6 @@
*/
h4_cb.hc_acl_data_size = 1021;
h4_cb.hc_ble_acl_data_size = 27;
-
- btsnoop_init();
}
/*******************************************************************************
@@ -575,9 +567,6 @@
void hci_h4_cleanup(void)
{
HCIDBG("hci_h4_cleanup");
-
- btsnoop_close();
- btsnoop_cleanup();
}
/*******************************************************************************
@@ -645,7 +634,7 @@
bytes_sent = userial_write(event,(uint8_t *) p,bytes_to_send);
/* generate snoop trace message */
- btsnoop_capture(p_msg, FALSE);
+ btsnoop_capture(p_msg, false);
p_msg->layer_specific = lay_spec;
/* Adjust offset and length for what we just sent */
@@ -713,7 +702,7 @@
}
/* generate snoop trace message */
- btsnoop_capture(p_msg, FALSE);
+ btsnoop_capture(p_msg, false);
if (bt_hc_cbacks)
{
@@ -722,7 +711,7 @@
(p_msg->layer_specific == lay_spec))
{
/* dealloc buffer of internal command */
- bt_hc_cbacks->dealloc((TRANSAC) p_msg, (char *) (p_msg + 1));
+ bt_hc_cbacks->dealloc(p_msg);
}
else
{
@@ -955,7 +944,7 @@
/* generate snoop trace message */
/* ACL packet tracing had done in acl_rx_frame_end_chk() */
if (p_cb->p_rcv_msg->event != MSG_HC_TO_STACK_HCI_ACL)
- btsnoop_capture(p_cb->p_rcv_msg, TRUE);
+ btsnoop_capture(p_cb->p_rcv_msg, true);
if (p_cb->p_rcv_msg->event == MSG_HC_TO_STACK_HCI_EVT)
intercepted = internal_event_intercept();
@@ -1003,9 +992,7 @@
/* stamp signature to indicate an internal command */
p_buf->layer_specific = opcode;
- utils_enqueue(&tx_q, (void *) p_buf);
- bthc_signal_event(HC_EVENT_TX);
-
+ bthc_tx(p_buf);
return TRUE;
}
@@ -1045,7 +1032,7 @@
if ((ret = hci_h4_send_int_cmd(HCI_READ_BUFFER_SIZE, p_buf, \
get_acl_data_length_cback)) == FALSE)
{
- bt_hc_cbacks->dealloc((TRANSAC) p_buf, (char *) (p_buf + 1));
+ bt_hc_cbacks->dealloc(p_buf);
}
else
return;
diff --git a/hci/src/hci_mct.c b/hci/src/hci_mct.c
old mode 100755
new mode 100644
index 4e70063..5316326
--- a/hci/src/hci_mct.c
+++ b/hci/src/hci_mct.c
@@ -30,10 +30,13 @@
#include <utils/Log.h>
#include <stdlib.h>
#include <fcntl.h>
+
#include "bt_hci_bdroid.h"
+#include "btsnoop.h"
#include "hci.h"
#include "userial.h"
#include "utils.h"
+#include "vendor.h"
/******************************************************************************
** Constants & Macros
@@ -133,12 +136,6 @@
** Externs
******************************************************************************/
-extern BUFFER_Q tx_q;
-
-void btsnoop_init(void);
-void btsnoop_close(void);
-void btsnoop_cleanup (void);
-void btsnoop_capture(HC_BT_HDR *p_buf, uint8_t is_rcvd);
uint8_t hci_mct_send_int_cmd(uint16_t opcode, HC_BT_HDR *p_buf, \
tINT_CMD_CBACK p_cback);
void lpm_wake_assert(void);
@@ -202,7 +199,7 @@
if ((status = hci_mct_send_int_cmd(HCI_LE_READ_BUFFER_SIZE, p_buf, \
get_acl_data_length_cback)) == FALSE)
{
- bt_hc_cbacks->dealloc((TRANSAC) p_buf, (char *) (p_buf + 1));
+ bt_hc_cbacks->dealloc(p_buf);
bt_hc_cbacks->postload_cb(NULL, BT_HC_POSTLOAD_SUCCESS);
}
}
@@ -213,7 +210,7 @@
if (bt_hc_cbacks)
{
- bt_hc_cbacks->dealloc((TRANSAC) p_buf, (char *) (p_buf + 1));
+ bt_hc_cbacks->dealloc(p_buf);
ALOGE("hci lib postload completed");
bt_hc_cbacks->postload_cb(NULL, BT_HC_POSTLOAD_SUCCESS);
}
@@ -254,7 +251,7 @@
// Signal TX event so the worker thread can check if it has anything
// to send
- bthc_signal_event(HC_EVENT_TX);
+ bthc_tx(NULL);
if (p_cb->int_cmd_rsp_pending > 0)
{
@@ -275,8 +272,7 @@
// Release the p_rcv_msg buffer.
if (bt_hc_cbacks)
{
- bt_hc_cbacks->dealloc((TRANSAC) p_cb->rcv_evt.p_rcv_msg, \
- (char *) (p_cb->rcv_evt.p_rcv_msg + 1));
+ bt_hc_cbacks->dealloc(p_cb->rcv_evt.p_rcv_msg);
}
}
p_cb->int_cmd_rd_idx = ((p_cb->int_cmd_rd_idx+1) & \
@@ -294,7 +290,7 @@
// Signal TX event so the worker thread can check if it has anything
// to send
- bthc_signal_event(HC_EVENT_TX);
+ bthc_tx(NULL);
}
return FALSE;
@@ -375,8 +371,7 @@
if (bt_hc_cbacks)
{
- bt_hc_cbacks->dealloc((TRANSAC) p_return_buf, \
- (char *) (p_return_buf + 1));
+ bt_hc_cbacks->dealloc(p_return_buf);
}
p_return_buf = NULL;
}
@@ -504,7 +499,7 @@
p_buf->offset = p_buf->offset - HCI_ACL_PREAMBLE_SIZE;
p_buf->len = p_buf->len - p_buf->offset;
- btsnoop_capture(p_buf, TRUE);
+ btsnoop_capture(p_buf, true);
/* restore contents */
memcpy(p, p_cb->rcv_acl.preload_buffer, HCI_ACL_PREAMBLE_SIZE);
@@ -515,7 +510,7 @@
else
{
/* START PACKET */
- btsnoop_capture(p_buf, TRUE);
+ btsnoop_capture(p_buf, true);
}
if (frame_end == TRUE)
@@ -554,8 +549,6 @@
*/
mct_cb.hc_acl_data_size = 1021;
mct_cb.hc_ble_acl_data_size = 27;
-
- btsnoop_init();
}
/*******************************************************************************
@@ -570,9 +563,6 @@
void hci_mct_cleanup(void)
{
HCIDBG("hci_mct_cleanup");
-
- btsnoop_close();
- btsnoop_cleanup();
}
/*******************************************************************************
@@ -625,7 +615,7 @@
userial_write(event, (uint8_t *) p, acl_pkt_size);
/* generate snoop trace message */
- btsnoop_capture(p_msg, FALSE);
+ btsnoop_capture(p_msg, false);
/* Adjust offset and length for what we just sent */
p_msg->offset += acl_data_size;
@@ -687,7 +677,7 @@
/* generate snoop trace message */
- btsnoop_capture(p_msg, FALSE);
+ btsnoop_capture(p_msg, false);
if (bt_hc_cbacks)
{
@@ -696,7 +686,7 @@
(p_msg->layer_specific == lay_spec))
{
/* dealloc buffer of internal command */
- bt_hc_cbacks->dealloc((TRANSAC) p_msg, (char *) (p_msg + 1));
+ bt_hc_cbacks->dealloc(p_msg);
}
else
{
@@ -873,7 +863,7 @@
uint8_t intercepted = FALSE;
/* generate snoop trace message */
- btsnoop_capture(p_cb->p_rcv_msg, TRUE);
+ btsnoop_capture(p_cb->p_rcv_msg, true);
intercepted = internal_event_intercept();
@@ -1105,9 +1095,7 @@
/* stamp signature to indicate an internal command */
p_buf->layer_specific = opcode;
- utils_enqueue(&tx_q, (void *) p_buf);
- bthc_signal_event(HC_EVENT_TX);
-
+ bthc_tx(p_buf);
return TRUE;
}
@@ -1147,7 +1135,7 @@
if ((ret = hci_mct_send_int_cmd(HCI_READ_BUFFER_SIZE, p_buf, \
get_acl_data_length_cback)) == FALSE)
{
- bt_hc_cbacks->dealloc((TRANSAC) p_buf, (char *) (p_buf + 1));
+ bt_hc_cbacks->dealloc(p_buf);
}
else
return;
diff --git a/hci/src/lpm.c b/hci/src/lpm.c
index 946b193..71023ba 100644
--- a/hci/src/lpm.c
+++ b/hci/src/lpm.c
@@ -32,6 +32,7 @@
#include "bt_hci_bdroid.h"
#include "bt_vendor_lib.h"
#include "bt_utils.h"
+#include "vendor.h"
/******************************************************************************
** Constants & Macros
@@ -55,8 +56,6 @@
** Externs
******************************************************************************/
-extern bt_vendor_interface_t *bt_vnd_if;
-
/******************************************************************************
** Local type definitions
******************************************************************************/
@@ -116,7 +115,7 @@
if ((bt_lpm_cb.state == LPM_ENABLED) && \
(bt_lpm_cb.wake_state == LPM_WAKE_W4_TIMEOUT))
{
- bthc_signal_event(HC_EVENT_LPM_IDLE_TIMEOUT);
+ bthc_idle_timeout();
}
}
@@ -251,12 +250,7 @@
void lpm_init(void)
{
memset(&bt_lpm_cb, 0, sizeof(bt_lpm_cb_t));
-
- /* Calling vendor-specific part */
- if (bt_vnd_if)
- bt_vnd_if->op(BT_VND_OP_GET_LPM_IDLE_TIMEOUT, &(bt_lpm_cb.timeout_ms));
- else
- bt_lpm_cb.timeout_ms = DEFAULT_LPM_IDLE_TIMEOUT;
+ vendor_send_command(BT_VND_OP_GET_LPM_IDLE_TIMEOUT, &bt_lpm_cb.timeout_ms);
}
/*******************************************************************************
@@ -306,13 +300,9 @@
bt_hc_cbacks->lpm_cb(BT_HC_LPM_DISABLED);
}
- /* Calling vendor-specific part */
- if (bt_vnd_if)
- {
- uint8_t lpm_cmd = (turn_on) ? BT_VND_LPM_ENABLE : BT_VND_LPM_DISABLE;
- bt_lpm_cb.state = (turn_on) ? LPM_ENABLING : LPM_DISABLING;
- bt_vnd_if->op(BT_VND_OP_LPM_SET_MODE, &lpm_cmd);
- }
+ uint8_t lpm_cmd = (turn_on) ? BT_VND_LPM_ENABLE : BT_VND_LPM_DISABLE;
+ bt_lpm_cb.state = (turn_on) ? LPM_ENABLING : LPM_DISABLING;
+ vendor_send_command(BT_VND_OP_LPM_SET_MODE, &lpm_cmd);
}
/*******************************************************************************
@@ -359,11 +349,8 @@
BTLPMDBG("LPM WAKE assert");
/* Calling vendor-specific part */
- if (bt_vnd_if)
- {
- uint8_t state = BT_VND_LPM_WAKE_ASSERT;
- bt_vnd_if->op(BT_VND_OP_LPM_WAKE_SET_STATE, &state);
- }
+ uint8_t state = BT_VND_LPM_WAKE_ASSERT;
+ vendor_send_command(BT_VND_OP_LPM_WAKE_SET_STATE, &state);
lpm_stop_transport_idle_timer();
@@ -414,14 +401,8 @@
{
BTLPMDBG("LPM WAKE deassert");
- /* Calling vendor-specific part */
- if (bt_vnd_if)
- {
- uint8_t state = BT_VND_LPM_WAKE_DEASSERT;
- bt_vnd_if->op(BT_VND_OP_LPM_WAKE_SET_STATE, &state);
- }
-
+ uint8_t state = BT_VND_LPM_WAKE_DEASSERT;
+ vendor_send_command(BT_VND_OP_LPM_WAKE_SET_STATE, &state);
bt_lpm_cb.wake_state = LPM_WAKE_DEASSERTED;
}
}
-
diff --git a/hci/src/userial.c b/hci/src/userial.c
index 5dc4f84..e3f3557 100644
--- a/hci/src/userial.c
+++ b/hci/src/userial.c
@@ -26,25 +26,29 @@
#define LOG_TAG "bt_userial"
-#include <utils/Log.h>
-#include <pthread.h>
-#include <fcntl.h>
+#include <assert.h>
#include <errno.h>
+#include <fcntl.h>
+#include <pthread.h>
#include <stdio.h>
+#include <sys/eventfd.h>
+#include <sys/prctl.h>
#include <sys/socket.h>
+#include <utils/Log.h>
+
#include "bt_hci_bdroid.h"
+#include "bt_utils.h"
+#include "bt_vendor_lib.h"
#include "userial.h"
#include "utils.h"
-#include "bt_vendor_lib.h"
-#include <sys/prctl.h>
-#include "bt_utils.h"
+#include "vendor.h"
/******************************************************************************
** Constants & Macros
******************************************************************************/
#ifndef USERIAL_DBG
-#define USERIAL_DBG FALSE
+#define USERIAL_DBG TRUE
#endif
#if (USERIAL_DBG == TRUE)
@@ -53,25 +57,19 @@
#define USERIALDBG(param, ...) {}
#endif
-#ifndef ENABLE_USERIAL_TIMING_LOGS
-#define ENABLE_USERIAL_TIMING_LOGS FALSE
-#endif
-
#define MAX_SERIAL_PORT (USERIAL_PORT_3 + 1)
-#define READ_LIMIT (BTHC_USERIAL_READ_MEM_SIZE - BT_HC_HDR_SIZE)
+// The set of events one can send to the userial read thread.
+// Note that the values must be >= 0x8000000000000000 to guarantee delivery
+// of the message (see eventfd(2) for details on blocking behaviour).
enum {
- USERIAL_RX_EXIT,
- USERIAL_RX_FLOW_OFF,
- USERIAL_RX_FLOW_ON
+ USERIAL_RX_EXIT = 0x8000000000000000ULL
};
/******************************************************************************
** Externs
******************************************************************************/
-extern bt_vendor_interface_t *bt_vnd_if;
-
/******************************************************************************
** Local type definitions
******************************************************************************/
@@ -92,33 +90,6 @@
static tUSERIAL_CB userial_cb;
static volatile uint8_t userial_running = 0;
-/******************************************************************************
-** Static functions
-******************************************************************************/
-
-#if defined(ENABLE_USERIAL_TIMING_LOGS) && (ENABLE_USERIAL_TIMING_LOGS==TRUE)
-
-static void log_userial_tx_timing(int len)
-{
- #define USEC_PER_SEC 1000000L
- static struct timespec prev = {0, 0};
- struct timespec now, diff;
- unsigned int diff_us = 0;
- unsigned int now_us = 0;
-
- clock_gettime(CLOCK_MONOTONIC, &now);
- now_us = now.tv_sec*USEC_PER_SEC + now.tv_nsec/1000;
- diff_us = (now.tv_sec - prev.tv_sec) * USEC_PER_SEC + (now.tv_nsec - prev.tv_nsec)/1000;
-
- ALOGW("[userial] ts %08d diff : %08d len %d", now_us, diff_us,
- len);
-
- prev = now;
-}
-
-#endif
-
-
/*****************************************************************************
** Socket signal functions to wake up userial_read_thread for termination
**
@@ -126,33 +97,38 @@
** - signal_fds[0]: join fd_set in select call of userial_read_thread
** - signal_fds[1]: trigger from userial_close
*****************************************************************************/
-static int signal_fds[2]={0,1};
-static uint8_t rx_flow_on = TRUE;
-static inline int create_signal_fds(fd_set* set)
-{
- if(signal_fds[0]==0 && socketpair(AF_UNIX, SOCK_STREAM, 0, signal_fds)<0)
- {
- ALOGE("create_signal_sockets:socketpair failed, errno: %d", errno);
- return -1;
+static int event_fd = -1;
+
+static inline int add_event_fd(fd_set *set) {
+ if (event_fd == -1) {
+ event_fd = eventfd(0, 0);
+ if (event_fd == -1) {
+ ALOGE("%s unable to create event fd: %s", __func__, strerror(errno));
+ return -1;
+ }
}
- FD_SET(signal_fds[0], set);
- return signal_fds[0];
-}
-static inline int send_wakeup_signal(char sig_cmd)
-{
- return send(signal_fds[1], &sig_cmd, sizeof(sig_cmd), 0);
-}
-static inline char reset_signal()
-{
- char sig_recv = -1;
- recv(signal_fds[0], &sig_recv, sizeof(sig_recv), MSG_WAITALL);
- return sig_recv;
-}
-static inline int is_signaled(fd_set* set)
-{
- return FD_ISSET(signal_fds[0], set);
+
+ FD_SET(event_fd, set);
+ return event_fd;
}
+static inline void send_event(uint64_t event_id) {
+ assert(event_fd != -1);
+ eventfd_write(event_fd, event_id);
+}
+
+static inline uint64_t read_event() {
+ assert(event_fd != -1);
+
+ uint64_t value = 0;
+ eventfd_read(event_fd, &value);
+ return value;
+}
+
+static inline bool is_event_available(fd_set *set) {
+ assert(event_fd != -1);
+ return !!FD_ISSET(event_fd, set);
+}
/*******************************************************************************
**
@@ -170,38 +146,24 @@
{
fd_set input;
int n = 0, ret = -1;
- char reason = 0;
while (userial_running)
{
/* Initialize the input fd set */
FD_ZERO(&input);
- if (rx_flow_on == TRUE)
- {
- FD_SET(fd, &input);
- }
- int fd_max = create_signal_fds(&input);
+ FD_SET(fd, &input);
+ int fd_max = add_event_fd(&input);
fd_max = fd_max > fd ? fd_max : fd;
/* Do the select */
n = select(fd_max+1, &input, NULL, NULL, NULL);
- if(is_signaled(&input))
+ if(is_event_available(&input))
{
- reason = reset_signal();
- if (reason == USERIAL_RX_EXIT)
- {
- USERIALDBG("RX termination");
- return -1;
- }
- else if (reason == USERIAL_RX_FLOW_OFF)
- {
- USERIALDBG("RX flow OFF");
- rx_flow_on = FALSE;
- }
- else if (reason == USERIAL_RX_FLOW_ON)
- {
- USERIALDBG("RX flow ON");
- rx_flow_on = TRUE;
+ uint64_t event = read_event();
+ switch (event) {
+ case USERIAL_RX_EXIT:
+ USERIALDBG("RX termination");
+ return -1;
}
}
@@ -227,15 +189,6 @@
return ret;
}
-/*******************************************************************************
-**
-** Function userial_read_thread
-**
-** Description
-**
-** Returns void *
-**
-*******************************************************************************/
static void *userial_read_thread(void *arg)
{
int rx_length = 0;
@@ -246,7 +199,6 @@
USERIALDBG("Entering userial_read_thread()");
prctl(PR_SET_NAME, (unsigned long)"userial_read", 0, 0, 0);
- rx_flow_on = TRUE;
userial_running = 1;
raise_priority_a2dp(TASK_HIGH_USERIAL_READ);
@@ -255,8 +207,8 @@
{
if (bt_hc_cbacks)
{
- p_buf = (HC_BT_HDR *) bt_hc_cbacks->alloc( \
- BTHC_USERIAL_READ_MEM_SIZE);
+ p_buf = (HC_BT_HDR *) bt_hc_cbacks->alloc(
+ BT_HC_HDR_SIZE + HCI_MAX_FRAME_SIZE + 1); /* H4 HDR = 1 */
}
else
p_buf = NULL;
@@ -267,7 +219,11 @@
p_buf->layer_specific = 0;
p = (uint8_t *) (p_buf + 1);
- rx_length = select_read(userial_cb.fd, p, READ_LIMIT);
+ int userial_fd = userial_cb.fd;
+ if (userial_fd != -1)
+ rx_length = select_read(userial_fd, p, HCI_MAX_FRAME_SIZE + 1);
+ else
+ rx_length = 0;
}
else
{
@@ -282,14 +238,14 @@
{
p_buf->len = (uint16_t)rx_length;
utils_enqueue(&(userial_cb.rx_q), p_buf);
- bthc_signal_event(HC_EVENT_RX);
+ bthc_rx_ready();
}
else /* either 0 or < 0 */
{
ALOGW("select_read return size <=0:%d, exiting userial_read_thread",\
rx_length);
/* if we get here, we should have a buffer */
- bt_hc_cbacks->dealloc((TRANSAC) p_buf, (char *) (p_buf + 1));
+ bt_hc_cbacks->dealloc(p_buf);
/* negative value means exit thread */
break;
}
@@ -307,128 +263,59 @@
** Userial API Functions
*****************************************************************************/
-/*******************************************************************************
-**
-** Function userial_init
-**
-** Description Initializes the userial driver
-**
-** Returns TRUE/FALSE
-**
-*******************************************************************************/
-uint8_t userial_init(void)
+bool userial_init(void)
{
USERIALDBG("userial_init");
memset(&userial_cb, 0, sizeof(tUSERIAL_CB));
userial_cb.fd = -1;
- utils_queue_init(&(userial_cb.rx_q));
- return TRUE;
+ utils_queue_init(&userial_cb.rx_q);
+ return true;
}
+bool userial_open(userial_port_t port) {
+ if (port >= MAX_SERIAL_PORT) {
+ ALOGE("%s serial port %d > %d (max).", __func__, port, MAX_SERIAL_PORT);
+ return false;
+ }
-/*******************************************************************************
-**
-** Function userial_open
-**
-** Description Open Bluetooth device with the port ID
-**
-** Returns TRUE/FALSE
-**
-*******************************************************************************/
-uint8_t userial_open(uint8_t port)
-{
- struct sched_param param;
- int policy, result;
- pthread_attr_t thread_attr;
- int fd_array[CH_MAX];
-
- USERIALDBG("userial_open(port:%d)", port);
-
- if (userial_running)
- {
- /* Userial is open; close it first */
+ if (userial_running) {
userial_close();
utils_delay(50);
}
- if (port >= MAX_SERIAL_PORT)
- {
- ALOGE("Port > MAX_SERIAL_PORT");
- return FALSE;
+ // Call in to the vendor-specific library to open the serial port.
+ int fd_array[CH_MAX];
+ for (int i = 0; i < CH_MAX; i++)
+ fd_array[i] = -1;
+
+ int num_ports = vendor_send_command(BT_VND_OP_USERIAL_OPEN, &fd_array);
+
+ if (num_ports != 1) {
+ ALOGE("%s opened wrong number of ports: got %d, expected 1.", __func__, num_ports);
+ goto error;
}
- /* Calling vendor-specific part */
- if (bt_vnd_if)
- {
- result = bt_vnd_if->op(BT_VND_OP_USERIAL_OPEN, &fd_array);
-
- if (result != 1)
- {
- ALOGE("userial_open: wrong numbers of open fd in vendor lib [%d]!",
- result);
- ALOGE("userial_open: HCI UART expects only one open fd");
- bt_vnd_if->op(BT_VND_OP_USERIAL_CLOSE, NULL);
- return FALSE;
- }
-
- userial_cb.fd = fd_array[0];
+ userial_cb.fd = fd_array[0];
+ if (userial_cb.fd == -1) {
+ ALOGE("%s unable to open serial port.", __func__);
+ goto error;
}
- else
- {
- ALOGE("userial_open: missing vendor lib interface !!!");
- ALOGE("userial_open: unable to open UART port");
- return FALSE;
- }
-
- if (userial_cb.fd == -1)
- {
- ALOGE("userial_open: failed to open UART port");
- return FALSE;
- }
-
- USERIALDBG( "fd = %d", userial_cb.fd);
userial_cb.port = port;
- pthread_attr_init(&thread_attr);
-
- if (pthread_create(&(userial_cb.read_thread), &thread_attr, \
- userial_read_thread, NULL) != 0 )
- {
- ALOGE("pthread_create failed!");
- return FALSE;
+ if (pthread_create(&userial_cb.read_thread, NULL, userial_read_thread, NULL)) {
+ ALOGE("%s unable to spawn read thread.", __func__);
+ goto error;
}
- if(pthread_getschedparam(userial_cb.read_thread, &policy, ¶m)==0)
- {
- policy = BTHC_LINUX_BASE_POLICY;
-#if (BTHC_LINUX_BASE_POLICY != SCHED_NORMAL)
- param.sched_priority = BTHC_USERIAL_READ_THREAD_PRIORITY;
-#else
- param.sched_priority = 0;
-#endif
- result = pthread_setschedparam(userial_cb.read_thread, policy, ¶m);
- if (result != 0)
- {
- ALOGW("userial_open: pthread_setschedparam failed (%s)", \
- strerror(result));
- }
- }
+ return true;
- return TRUE;
+error:
+ vendor_send_command(BT_VND_OP_USERIAL_CLOSE, NULL);
+ return false;
}
-/*******************************************************************************
-**
-** Function userial_read
-**
-** Description Read data from the userial port
-**
-** Returns Number of bytes actually read from the userial port and
-** copied into p_data. This may be less than len.
-**
-*******************************************************************************/
-uint16_t userial_read(uint16_t msg_id, uint8_t *p_buffer, uint16_t len)
+uint16_t userial_read(uint16_t msg_id, uint8_t *p_buffer, uint16_t len)
{
uint16_t total_len = 0;
uint16_t copy_len = 0;
@@ -457,8 +344,7 @@
if(userial_cb.p_rx_hdr->len == 0)
{
if (bt_hc_cbacks)
- bt_hc_cbacks->dealloc((TRANSAC) userial_cb.p_rx_hdr, \
- (char *) (userial_cb.p_rx_hdr+1));
+ bt_hc_cbacks->dealloc(userial_cb.p_rx_hdr);
userial_cb.p_rx_hdr = NULL;
}
@@ -473,99 +359,60 @@
return total_len;
}
-/*******************************************************************************
-**
-** Function userial_write
-**
-** Description Write data to the userial port
-**
-** Returns Number of bytes actually written to the userial port. This
-** may be less than len.
-**
-*******************************************************************************/
-uint16_t userial_write(uint16_t msg_id, uint8_t *p_data, uint16_t len)
-{
- int ret, total = 0;
+uint16_t userial_write(uint16_t msg_id, const uint8_t *p_data, uint16_t len) {
UNUSED(msg_id);
- while(len != 0)
- {
-#if defined(ENABLE_USERIAL_TIMING_LOGS) && (ENABLE_USERIAL_TIMING_LOGS==TRUE)
- log_userial_tx_timing(len);
-#endif
- ret = write(userial_cb.fd, p_data+total, len);
- total += ret;
- len -= ret;
- }
-
- return ((uint16_t)total);
-}
-
-/*******************************************************************************
-**
-** Function userial_close
-**
-** Description Close the userial port
-**
-** Returns None
-**
-*******************************************************************************/
-void userial_close(void)
-{
- int result;
- TRANSAC p_buf;
-
- USERIALDBG("userial_close(fd:%d)", userial_cb.fd);
-
- if (userial_running)
- send_wakeup_signal(USERIAL_RX_EXIT);
-
- if ((result=pthread_join(userial_cb.read_thread, NULL)) < 0)
- ALOGE( "pthread_join() FAILED result:%d", result);
-
- /* Calling vendor-specific part */
- if (bt_vnd_if)
- bt_vnd_if->op(BT_VND_OP_USERIAL_CLOSE, NULL);
-
- userial_cb.fd = -1;
-
- if (bt_hc_cbacks)
- {
- while ((p_buf = utils_dequeue (&(userial_cb.rx_q))) != NULL)
- {
- bt_hc_cbacks->dealloc(p_buf, (char *) ((HC_BT_HDR *)p_buf+1));
+ uint16_t total = 0;
+ while (len) {
+ ssize_t ret = write(userial_cb.fd, p_data + total, len);
+ switch (ret) {
+ case -1:
+ ALOGE("%s error writing to serial port: %s", __func__, strerror(errno));
+ return total;
+ case 0: // don't loop forever in case write returns 0.
+ return total;
+ default:
+ total += ret;
+ len -= ret;
+ break;
}
}
+
+ return total;
}
-/*******************************************************************************
-**
-** Function userial_ioctl
-**
-** Description ioctl inteface
-**
-** Returns None
-**
-*******************************************************************************/
-void userial_ioctl(userial_ioctl_op_t op, void *p_data)
-{
- UNUSED(p_data);
-
- switch(op)
- {
- case USERIAL_OP_RXFLOW_ON:
- if (userial_running)
- send_wakeup_signal(USERIAL_RX_FLOW_ON);
- break;
-
- case USERIAL_OP_RXFLOW_OFF:
- if (userial_running)
- send_wakeup_signal(USERIAL_RX_FLOW_OFF);
- break;
-
- case USERIAL_OP_INIT:
- default:
- break;
+void userial_close_reader(void) {
+ // Join the reader thread if it is still running.
+ if (userial_running) {
+ send_event(USERIAL_RX_EXIT);
+ int result = pthread_join(userial_cb.read_thread, NULL);
+ USERIALDBG("%s Joined userial reader thread: %d", __func__, result);
+ if (result)
+ ALOGE("%s failed to join reader thread: %d", __func__, result);
+ return;
}
+ ALOGW("%s Already closed userial reader thread", __func__);
}
+void userial_close(void) {
+ assert(bt_hc_cbacks != NULL);
+
+ // Join the reader thread if it's still running.
+ if (userial_running) {
+ send_event(USERIAL_RX_EXIT);
+ int result = pthread_join(userial_cb.read_thread, NULL);
+ if (result)
+ ALOGE("%s failed to join reader thread: %d", __func__, result);
+ }
+
+ // Ask the vendor-specific library to close the serial port.
+ vendor_send_command(BT_VND_OP_USERIAL_CLOSE, NULL);
+
+ // Free all buffers still waiting in the RX queue.
+ // TODO: use list data structure and clean this up.
+ void *buf;
+ while ((buf = utils_dequeue(&userial_cb.rx_q)) != NULL)
+ bt_hc_cbacks->dealloc(buf);
+
+ userial_cb.fd = -1;
+}
diff --git a/hci/src/userial_mct.c b/hci/src/userial_mct.c
index d7554cc..53f954e 100644
--- a/hci/src/userial_mct.c
+++ b/hci/src/userial_mct.c
@@ -35,6 +35,7 @@
#include "bt_hci_bdroid.h"
#include "userial.h"
#include "utils.h"
+#include "vendor.h"
#include "bt_vendor_lib.h"
#include "bt_utils.h"
@@ -58,15 +59,11 @@
enum {
USERIAL_RX_EXIT,
- USERIAL_RX_FLOW_OFF,
- USERIAL_RX_FLOW_ON
};
/******************************************************************************
** Externs
******************************************************************************/
-
-extern bt_vendor_interface_t *bt_vnd_if;
uint16_t hci_mct_receive_evt_msg(void);
uint16_t hci_mct_receive_acl_msg(void);
@@ -103,7 +100,6 @@
** - signal_fds[1]: trigger from userial_close
*****************************************************************************/
static int signal_fds[2]={0,1};
-static uint8_t rx_flow_on = TRUE;
static inline int create_signal_fds(fd_set* set)
{
if(signal_fds[0]==0 && socketpair(AF_UNIX, SOCK_STREAM, 0, signal_fds)<0)
@@ -140,13 +136,14 @@
*******************************************************************************/
static void *userial_read_thread(void *arg)
{
+ UNUSED(arg);
+
fd_set input;
int n;
char reason = 0;
USERIALDBG("Entering userial_read_thread()");
- rx_flow_on = TRUE;
userial_running = 1;
raise_priority_a2dp(TASK_HIGH_USERIAL_READ);
@@ -155,11 +152,8 @@
{
/* Initialize the input fd set */
FD_ZERO(&input);
- if (rx_flow_on == TRUE)
- {
- FD_SET(userial_cb.fd[CH_EVT], &input);
- FD_SET(userial_cb.fd[CH_ACL_IN], &input);
- }
+ FD_SET(userial_cb.fd[CH_EVT], &input);
+ FD_SET(userial_cb.fd[CH_ACL_IN], &input);
int fd_max = create_signal_fds(&input);
fd_max = (fd_max>userial_cb.fd[CH_EVT]) ? fd_max : userial_cb.fd[CH_EVT];
@@ -177,16 +171,6 @@
userial_running = 0;
break;
}
- else if (reason == USERIAL_RX_FLOW_OFF)
- {
- USERIALDBG("RX flow OFF");
- rx_flow_on = FALSE;
- }
- else if (reason == USERIAL_RX_FLOW_ON)
- {
- USERIALDBG("RX flow ON");
- rx_flow_on = TRUE;
- }
}
if (n > 0)
@@ -226,10 +210,8 @@
**
** Description Initializes the userial driver
**
-** Returns TRUE/FALSE
-**
*******************************************************************************/
-uint8_t userial_init(void)
+bool userial_init(void)
{
int idx;
@@ -238,7 +220,7 @@
for (idx=0; idx < CH_MAX; idx++)
userial_cb.fd[idx] = -1;
utils_queue_init(&(userial_cb.rx_q));
- return TRUE;
+ return true;
}
@@ -248,14 +230,10 @@
**
** Description Open Bluetooth device with the port ID
**
-** Returns TRUE/FALSE
-**
*******************************************************************************/
-uint8_t userial_open(uint8_t port)
+bool userial_open(userial_port_t port)
{
- struct sched_param param;
- int policy, result;
- pthread_attr_t thread_attr;
+ int result;
USERIALDBG("userial_open(port:%d)", port);
@@ -269,28 +247,17 @@
if (port >= MAX_SERIAL_PORT)
{
ALOGE("Port > MAX_SERIAL_PORT");
- return FALSE;
+ return false;
}
- /* Calling vendor-specific part */
- if (bt_vnd_if)
+ result = vendor_send_command(BT_VND_OP_USERIAL_OPEN, &userial_cb.fd);
+ if ((result != 2) && (result != 4))
{
- result = bt_vnd_if->op(BT_VND_OP_USERIAL_OPEN, &userial_cb.fd);
-
- if ((result != 2) && (result != 4))
- {
- ALOGE("userial_open: wrong numbers of open fd in vendor lib [%d]!",
- result);
- ALOGE("userial_open: HCI MCT expects 2 or 4 open file descriptors");
- bt_vnd_if->op(BT_VND_OP_USERIAL_CLOSE, NULL);
- return FALSE;
- }
- }
- else
- {
- ALOGE("userial_open: missing vendor lib interface !!!");
- ALOGE("userial_open: unable to open BT transport");
- return FALSE;
+ ALOGE("userial_open: wrong numbers of open fd in vendor lib [%d]!",
+ result);
+ ALOGE("userial_open: HCI MCT expects 2 or 4 open file descriptors");
+ vendor_send_command(BT_VND_OP_USERIAL_CLOSE, NULL);
+ return false;
}
ALOGI("CMD=%d, EVT=%d, ACL_Out=%d, ACL_In=%d", \
@@ -301,40 +268,21 @@
(userial_cb.fd[CH_ACL_OUT] == -1) || (userial_cb.fd[CH_ACL_IN] == -1))
{
ALOGE("userial_open: failed to open BT transport");
- bt_vnd_if->op(BT_VND_OP_USERIAL_CLOSE, NULL);
- return FALSE;
+ vendor_send_command(BT_VND_OP_USERIAL_CLOSE, NULL);
+ return false;
}
userial_cb.port = port;
/* Start listening thread */
- pthread_attr_init(&thread_attr);
-
- if (pthread_create(&(userial_cb.read_thread), &thread_attr, \
- userial_read_thread, NULL) != 0 )
+ if (pthread_create(&userial_cb.read_thread, NULL, userial_read_thread, NULL) != 0)
{
ALOGE("pthread_create failed!");
- bt_vnd_if->op(BT_VND_OP_USERIAL_CLOSE, NULL);
- return FALSE;
+ vendor_send_command(BT_VND_OP_USERIAL_CLOSE, NULL);
+ return false;
}
- if(pthread_getschedparam(userial_cb.read_thread, &policy, ¶m)==0)
- {
- policy = BTHC_LINUX_BASE_POLICY;
-#if (BTHC_LINUX_BASE_POLICY != SCHED_NORMAL)
- param.sched_priority = BTHC_USERIAL_READ_THREAD_PRIORITY;
-#else
- param.sched_priority = 0;
-#endif
- result = pthread_setschedparam(userial_cb.read_thread, policy, ¶m);
- if (result != 0)
- {
- ALOGW("userial_open: pthread_setschedparam failed (%s)", \
- strerror(result));
- }
- }
-
- return TRUE;
+ return true;
}
/*******************************************************************************
@@ -347,7 +295,7 @@
** copied into p_data. This may be less than len.
**
*******************************************************************************/
-uint16_t userial_read(uint16_t msg_id, uint8_t *p_buffer, uint16_t len)
+uint16_t userial_read(uint16_t msg_id, uint8_t *p_buffer, uint16_t len)
{
int ret = -1;
int ch_idx = (msg_id == MSG_HC_TO_STACK_HCI_EVT) ? CH_EVT : CH_ACL_IN;
@@ -369,7 +317,7 @@
** may be less than len.
**
*******************************************************************************/
-uint16_t userial_write(uint16_t msg_id, uint8_t *p_data, uint16_t len)
+uint16_t userial_write(uint16_t msg_id, const uint8_t *p_data, uint16_t len)
{
int ret, total = 0;
int ch_idx = (msg_id == MSG_STACK_TO_HC_HCI_CMD) ? CH_CMD : CH_ACL_OUT;
@@ -384,14 +332,25 @@
return ((uint16_t)total);
}
+void userial_close_reader(void) {
+ // Join the reader thread if it is still running.
+ if (userial_running) {
+ send_wakeup_signal(USERIAL_RX_EXIT);
+ int result = pthread_join(userial_cb.read_thread, NULL);
+ USERIALDBG("%s Joined userial reader thread: %d", __func__, result);
+ if (result)
+ ALOGE("%s failed to join reader thread: %d", __func__, result);
+ return;
+ }
+ ALOGW("%s Already closed userial reader thread", __func__);
+}
+
/*******************************************************************************
**
** Function userial_close
**
** Description Close the userial port
**
-** Returns None
-**
*******************************************************************************/
void userial_close(void)
{
@@ -405,40 +364,8 @@
if ((result=pthread_join(userial_cb.read_thread, NULL)) < 0)
ALOGE( "pthread_join() FAILED result:%d", result);
- /* Calling vendor-specific part */
- if (bt_vnd_if)
- bt_vnd_if->op(BT_VND_OP_USERIAL_CLOSE, NULL);
+ vendor_send_command(BT_VND_OP_USERIAL_CLOSE, NULL);
for (idx=0; idx < CH_MAX; idx++)
userial_cb.fd[idx] = -1;
}
-
-/*******************************************************************************
-**
-** Function userial_ioctl
-**
-** Description ioctl inteface
-**
-** Returns None
-**
-*******************************************************************************/
-void userial_ioctl(userial_ioctl_op_t op, void *p_data)
-{
- switch(op)
- {
- case USERIAL_OP_RXFLOW_ON:
- if (userial_running)
- send_wakeup_signal(USERIAL_RX_FLOW_ON);
- break;
-
- case USERIAL_OP_RXFLOW_OFF:
- if (userial_running)
- send_wakeup_signal(USERIAL_RX_FLOW_OFF);
- break;
-
- case USERIAL_OP_INIT:
- default:
- break;
- }
-}
-
diff --git a/hci/src/utils.c b/hci/src/utils.c
index bfcf724..85304fa 100644
--- a/hci/src/utils.c
+++ b/hci/src/utils.c
@@ -65,6 +65,7 @@
*******************************************************************************/
void utils_cleanup (void)
{
+ pthread_mutex_destroy(&utils_mutex);
}
/*******************************************************************************
diff --git a/hci/src/vendor.c b/hci/src/vendor.c
new file mode 100644
index 0000000..4bad100
--- /dev/null
+++ b/hci/src/vendor.c
@@ -0,0 +1,180 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 Google, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+#define LOG_TAG "bt_vendor"
+
+#include <assert.h>
+#include <dlfcn.h>
+#include <utils/Log.h>
+
+#include "bt_hci_bdroid.h"
+#include "bt_vendor_lib.h"
+#include "hci.h"
+#include "osi.h"
+
+// TODO: eliminate these three.
+extern tHCI_IF *p_hci_if;
+extern bool fwcfg_acked;
+void lpm_vnd_cback(uint8_t vnd_result);
+
+static const char *VENDOR_LIBRARY_NAME = "libbt-vendor.so";
+static const char *VENDOR_LIBRARY_SYMBOL_NAME = "BLUETOOTH_VENDOR_LIB_INTERFACE";
+
+static void *lib_handle;
+static bt_vendor_interface_t *vendor_interface;
+
+static void firmware_config_cb(bt_vendor_op_result_t result);
+static void sco_config_cb(bt_vendor_op_result_t result);
+static void low_power_mode_cb(bt_vendor_op_result_t result);
+static void sco_audiostate_cb(bt_vendor_op_result_t result);
+static void *buffer_alloc(int size);
+static void buffer_free(void *buffer);
+static uint8_t transmit_cb(uint16_t opcode, void *buffer, tINT_CMD_CBACK callback);
+static void epilog_cb(bt_vendor_op_result_t result);
+
+static const bt_vendor_callbacks_t vendor_callbacks = {
+ sizeof(vendor_callbacks),
+ firmware_config_cb,
+ sco_config_cb,
+ low_power_mode_cb,
+ sco_audiostate_cb,
+ buffer_alloc,
+ buffer_free,
+ transmit_cb,
+ epilog_cb
+};
+
+bool vendor_open(const uint8_t *local_bdaddr) {
+ assert(lib_handle == NULL);
+
+ lib_handle = dlopen(VENDOR_LIBRARY_NAME, RTLD_NOW);
+ if (!lib_handle) {
+ ALOGE("%s unable to open %s: %s", __func__, VENDOR_LIBRARY_NAME, dlerror());
+ goto error;
+ }
+
+ vendor_interface = (bt_vendor_interface_t *)dlsym(lib_handle, VENDOR_LIBRARY_SYMBOL_NAME);
+ if (!vendor_interface) {
+ ALOGE("%s unable to find symbol %s in %s: %s", __func__, VENDOR_LIBRARY_SYMBOL_NAME, VENDOR_LIBRARY_NAME, dlerror());
+ goto error;
+ }
+
+ int status = vendor_interface->init(&vendor_callbacks, (unsigned char *)local_bdaddr);
+ if (status) {
+ ALOGE("%s unable to initialize vendor library: %d", __func__, status);
+ goto error;
+ }
+
+ return true;
+
+error:;
+ vendor_interface = NULL;
+ if (lib_handle)
+ dlclose(lib_handle);
+ lib_handle = NULL;
+ return false;
+}
+
+void vendor_close(void) {
+ if (vendor_interface)
+ vendor_interface->cleanup();
+
+ if (lib_handle)
+ dlclose(lib_handle);
+
+ vendor_interface = NULL;
+ lib_handle = NULL;
+}
+
+int vendor_send_command(bt_vendor_opcode_t opcode, void *param) {
+ assert(vendor_interface != NULL);
+
+ return vendor_interface->op(opcode, param);
+}
+
+// Called back from vendor library when the firmware configuration
+// completes.
+static void firmware_config_cb(bt_vendor_op_result_t result) {
+ assert(bt_hc_cbacks != NULL);
+
+ fwcfg_acked = true;
+
+ bt_hc_postload_result_t status = (result == BT_VND_OP_RESULT_SUCCESS)
+ ? BT_HC_PRELOAD_SUCCESS
+ : BT_HC_PRELOAD_FAIL;
+ bt_hc_cbacks->preload_cb(NULL, status);
+}
+
+// Called back from vendor library to indicate status of previous
+// SCO configuration request. This should only happen during the
+// postload process.
+static void sco_config_cb(UNUSED_ATTR bt_vendor_op_result_t result) {
+ assert(p_hci_if != NULL);
+
+ // Continue the rest of the postload process.
+ p_hci_if->get_acl_max_len();
+}
+
+// Called back from vendor library to indicate status of previous
+// LPM enable/disable request.
+static void low_power_mode_cb(bt_vendor_op_result_t result) {
+ lpm_vnd_cback(result != BT_VND_OP_RESULT_SUCCESS);
+}
+
+/******************************************************************************
+**
+** Function sco_audiostate_cb
+**
+** Description HOST/CONTROLLER VENDOR LIB CALLBACK API - This function is
+** called when the libbt-vendor completed vendor specific codec
+** setup request
+**
+** Returns None
+**
+******************************************************************************/
+static void sco_audiostate_cb(bt_vendor_op_result_t result)
+{
+ uint8_t status = (result == BT_VND_OP_RESULT_SUCCESS) ? 0 : 1;
+
+ ALOGI("sco_audiostate_cb(status: %d)",status);
+}
+
+// Called by vendor library when it needs an HCI buffer.
+static void *buffer_alloc(int size) {
+ assert(bt_hc_cbacks != NULL);
+ return bt_hc_cbacks->alloc(size);
+}
+
+// Called by vendor library when it needs to free a buffer allocated with
+// |buffer_alloc|.
+static void buffer_free(void *buffer) {
+ assert(bt_hc_cbacks != NULL);
+ bt_hc_cbacks->dealloc(buffer);
+}
+
+// Called back from vendor library when it wants to send an HCI command.
+static uint8_t transmit_cb(uint16_t opcode, void *buffer, tINT_CMD_CBACK callback) {
+ assert(p_hci_if != NULL);
+ return p_hci_if->send_int_cmd(opcode, (HC_BT_HDR *)buffer, callback);
+}
+
+// Called back from vendor library when the epilog procedure has
+// completed. It is safe to call vendor_interface->cleanup() after
+// this callback has been received.
+static void epilog_cb(UNUSED_ATTR bt_vendor_op_result_t result) {
+}
diff --git a/include/bt_target.h b/include/bt_target.h
index 7e77164..a34169a 100644
--- a/include/bt_target.h
+++ b/include/bt_target.h
@@ -1,5 +1,6 @@
/******************************************************************************
*
+ * Copyright (c) 2014 The Android Open Source Project
* Copyright (C) 1999-2012 Broadcom Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -33,6 +34,9 @@
#define BTIF_HFAG_SERVICE_NAME ("Handsfree Gateway")
#endif
+#ifndef BTIF_HF_CLIENT_SERVICE_NAME
+#define BTIF_HF_CLIENT_SERVICE_NAME ("Handsfree")
+#endif
#ifdef BUILDCFG
@@ -102,10 +106,6 @@
#define SMP_HOST_ENCRYPT_INCLUDED FALSE
#endif
-#ifndef SAP_INCLUDED
-#define SAP_INCLUDED FALSE
-#endif
-
#ifndef SBC_NO_PCM_CPY_OPTION
#define SBC_NO_PCM_CPY_OPTION FALSE
#endif
@@ -118,34 +118,6 @@
#define BTA_AG_INCLUDED TRUE
#endif
-#ifndef BTA_CT_INCLUDED
-#define BTA_CT_INCLUDED FALSE
-#endif
-
-#ifndef BTA_CG_INCLUDED
-#define BTA_CG_INCLUDED FALSE
-#endif
-
-#ifndef BTA_DG_INCLUDED
-#define BTA_DG_INCLUDED FALSE
-#endif
-
-#ifndef BTA_FT_INCLUDED
-#define BTA_FT_INCLUDED FALSE
-#endif
-
-#ifndef BTA_OP_INCLUDED
-#define BTA_OP_INCLUDED FALSE
-#endif
-
-#ifndef BTA_PR_INCLUDED
-#define BTA_PR_INCLUDED FALSE
-#endif
-
-#ifndef BTA_SS_INCLUDED
-#define BTA_SS_INCLUDED FALSE
-#endif
-
#ifndef BTA_DM_INCLUDED
#define BTA_DM_INCLUDED TRUE
#endif
@@ -171,14 +143,6 @@
#define BTA_FS_INCLUDED TRUE
#endif
-#ifndef BTA_AC_INCLUDED
-#define BTA_AC_INCLUDED FALSE
-#endif
-
-#ifndef BTA_HD_INCLUDED
-#define BTA_HD_INCLUDED FALSE
-#endif
-
#ifndef BTA_HH_INCLUDED
#define BTA_HH_INCLUDED TRUE
#endif
@@ -199,68 +163,12 @@
#define BTA_AV_INCLUDED TRUE
#endif
-#ifndef BTA_AV_VDP_INCLUDED
-#define BTA_AV_VDP_INCLUDED FALSE
+#ifndef BTA_GATT_INCLUDED
+#define BTA_GATT_INCLUDED TRUE
#endif
-#ifndef BTA_AVK_INCLUDED
-#define BTA_AVK_INCLUDED FALSE
-#endif
-
-#ifndef BTA_PBS_INCLUDED
-#define BTA_PBS_INCLUDED FALSE
-#endif
-
-#ifndef BTA_PBC_INCLUDED
-#define BTA_PBC_INCLUDED FALSE
-#endif
-
-#ifndef BTA_FM_INCLUDED
-#define BTA_FM_INCLUDED FALSE
-#endif
-
-#ifndef BTA_FM_DEBUG
-#define BTA_FM_DEBUG FALSE
-#endif
-
-#ifndef BTA_FMTX_INCLUDED
-#define BTA_FMTX_INCLUDED FALSE
-#endif
-
-#ifndef BTA_FMTX_DEBUG
-#define BTA_FMTX_DEBUG FALSE
-#endif
-
-#ifndef BTA_FMTX_FMRX_SWITCH_WORKAROUND
-#define BTA_FMTX_FMRX_SWITCH_WORKAROUND FALSE
-#endif
-
-#ifndef BTA_FMTX_US_FCC_RULES
-#define BTA_FMTX_US_FCC_RULES FALSE
-#endif
-
-#ifndef BTA_HS_INCLUDED
-#define BTA_HS_INCLUDED FALSE
-#endif
-
-#ifndef BTA_MSE_INCLUDED
-#define BTA_MSE_INCLUDED FALSE
-#endif
-
-#ifndef BTA_MCE_INCLUDED
-#define BTA_MCE_INCLUDED FALSE
-#endif
-
-#ifndef BTA_PLAYBACK_INCLUDED
-#define BTA_PLAYBACK_INCLUDED FALSE
-#endif
-
-#ifndef BTA_SSR_INCLUDED
-#define BTA_SSR_INCLUDED FALSE
-#endif
-
-#ifndef BTA_JV_INCLUDED
-#define BTA_JV_INCLUDED FALSE
+#ifndef BTA_AV_SINK_INCLUDED
+#define BTA_AV_SINK_INCLUDED FALSE
#endif
#ifndef BTA_DISABLE_DELAY
@@ -352,11 +260,6 @@
#define BTA_HOST_INTERLEAVE_SEARCH FALSE
#endif
-/* This feature is used to skip query of ble read remote features*/
-#ifndef BTA_SKIP_BLE_READ_REMOTE_FEAT
-#define BTA_SKIP_BLE_READ_REMOTE_FEAT FALSE
-#endif
-
#ifndef BT_TRACE_PROTOCOL
#define BT_TRACE_PROTOCOL TRUE
#endif
@@ -397,18 +300,10 @@
#define BTA_DM_SDP_DB_SIZE 8000
#endif
-#ifndef FTS_REJECT_INVALID_OBEX_SET_PATH_REQ
-#define FTS_REJECT_INVALID_OBEX_SET_PATH_REQ FALSE
-#endif
-
#ifndef HL_INCLUDED
#define HL_INCLUDED TRUE
#endif
-#ifndef NO_GKI_RUN_RETURN
-#define NO_GKI_RUN_RETURN TRUE
-#endif
-
#ifndef AG_VOICE_SETTINGS
#define AG_VOICE_SETTINGS HCI_DEFAULT_VOICE_SETTINGS
#endif
@@ -417,12 +312,16 @@
#define BTIF_DM_OOB_TEST TRUE
#endif
+// How long to wait before activating sniff mode after entering the
+// idle state for FTS, OPS connections
+#ifndef BTA_FTS_OPS_IDLE_TO_SNIFF_DELAY_MS
+#define BTA_FTS_OPS_IDLE_TO_SNIFF_DELAY_MS 7000
+#endif
+
//------------------End added from bdroid_buildcfg.h---------------------
-/* #define BYPASS_AVDATATRACE */
-
/******************************************************************************
**
** Platform-Specific
@@ -635,6 +534,8 @@
#ifndef PAN_POOL_ID
#define PAN_POOL_ID GKI_POOL_ID_3
+/* Maximum amount of the shared buffer to allocate for PAN */
+#define PAN_POOL_MAX (GKI_BUF3_MAX / 4)
#endif
/* UNV pool for read/write serialization */
@@ -695,6 +596,11 @@
#define GATT_DB_POOL_ID GKI_POOL_ID_8
#endif
+/* GATT Data sending buffer pool ID, use default ACL pool for fix channel data */
+#ifndef GATT_BUF_POOL_ID
+#define GATT_BUF_POOL_ID HCI_ACL_POOL_ID
+#endif
+
/******************************************************************************
**
** Lower Layer Interface
@@ -1026,7 +932,7 @@
/* The number of SCO links. */
#ifndef BTM_MAX_SCO_LINKS
-#define BTM_MAX_SCO_LINKS 2
+#define BTM_MAX_SCO_LINKS 3
#endif
/* The preferred type of SCO links (2-eSCO, 0-SCO). */
@@ -1130,16 +1036,6 @@
#define BTM_MAX_VSE_CALLBACKS 3
#endif
-/* Number of streams for dual stack */
-#ifndef BTM_SYNC_INFO_NUM_STR
-#define BTM_SYNC_INFO_NUM_STR 2
-#endif
-
-/* Number of streams for dual stack in BT Controller */
-#ifndef BTM_SYNC_INFO_NUM_STR_BTC
-#define BTM_SYNC_INFO_NUM_STR_BTC 2
-#endif
-
/******************************************
** Lisbon Features
*******************************************/
@@ -1403,12 +1299,29 @@
#define BLE_INCLUDED TRUE
#endif
+#ifndef BLE_ANDROID_CONTROLLER_SCAN_FILTER
+#define BLE_ANDROID_CONTROLLER_SCAN_FILTER TRUE
+#endif
+
#ifndef LOCAL_BLE_CONTROLLER_ID
#define LOCAL_BLE_CONTROLLER_ID (1)
#endif
-#ifndef BTM_BLE_PRIVACY_SPT
-#define BTM_BLE_PRIVACY_SPT TRUE
+#ifndef BLE_PRIVACY_SPT
+#define BLE_PRIVACY_SPT TRUE
+#endif
+
+#ifndef BLE_VND_INCLUDED
+#define BLE_VND_INCLUDED FALSE
+#endif
+
+#ifndef BTM_BLE_ADV_TX_POWER
+#define BTM_BLE_ADV_TX_POWER {-21, -15, -7, 1, 9}
+#endif
+
+
+#ifndef BLE_BATCH_SCAN_INCLUDED
+#define BLE_BATCH_SCAN_INCLUDED TRUE
#endif
/******************************************************************************
@@ -1428,6 +1341,12 @@
#error "can't have GATT without BLE"
#endif
+#ifndef BLE_LLT_INCLUDED
+#define BLE_LLT_INCLUDED TRUE
+#endif
+#ifndef BTM_DUMO_ADDR_CENTRAL_ENABLED
+#define BTM_DUMO_ADDR_CENTRAL_ENABLED FALSE
+#endif
#ifndef ATT_INCLUDED
#define ATT_INCLUDED TRUE
#endif
@@ -1445,11 +1364,7 @@
#endif
#ifndef BLE_PERIPHERAL_MODE_SUPPORT
-#define BLE_PERIPHERAL_MODE_SUPPORT FALSE
-#endif
-
-#ifndef BLE_PERIPHERAL_DISPLAYONLY
-#define BLE_PERIPHERAL_DISPLAYONLY FALSE
+#define BLE_PERIPHERAL_MODE_SUPPORT TRUE
#endif
#ifndef BLE_PERIPHERAL_ADV_NAME
@@ -1475,7 +1390,7 @@
#endif
#ifndef GATT_MAX_APPS
-#define GATT_MAX_APPS 10 /* note: 2 apps used internally GATT and GAP */
+#define GATT_MAX_APPS 32 /* note: 2 apps used internally GATT and GAP */
#endif
#ifndef GATT_MAX_CL_PROFILES
@@ -1611,7 +1526,7 @@
/* The MTU size for the L2CAP configuration. */
#ifndef SDP_MTU_SIZE
-#define SDP_MTU_SIZE 256
+#define SDP_MTU_SIZE 672
#endif
/* The flush timeout for the L2CAP configuration. */
@@ -3409,7 +3324,6 @@
#define SAP_SERVER_INCLUDED FALSE
#endif
-
/*************************************************************************
* A2DP Definitions
*/
@@ -3541,6 +3455,10 @@
#define AVRC_ADV_CTRL_INCLUDED TRUE
#endif
+#ifndef AVRC_CTLR_INCLUDED
+#define AVRC_CTLR_INCLUDED TRUE
+#endif
+
/******************************************************************************
**
** MCAP
@@ -3862,4 +3780,3 @@
#include "bt_trace.h"
#endif /* BT_TARGET_H */
-
diff --git a/include/bt_trace.h b/include/bt_trace.h
index ae1b1ae..703b582 100644
--- a/include/bt_trace.h
+++ b/include/bt_trace.h
@@ -197,17 +197,6 @@
/* Prototype for message logging function. */
EXPORT_API extern void LogMsg (UINT32 trace_set_mask, const char *fmt_str, ...);
-extern void LogMsg_0 (UINT32 trace_set_mask, const char *p_str);
-extern void LogMsg_1 (UINT32 trace_set_mask, const char *fmt_str, UINT32 p1);
-extern void LogMsg_2 (UINT32 trace_set_mask, const char *fmt_str, UINT32 p1, UINT32 p2);
-extern void LogMsg_3 (UINT32 trace_set_mask, const char *fmt_str, UINT32 p1, UINT32 p2,
- UINT32 p3);
-extern void LogMsg_4 (UINT32 trace_set_mask, const char *fmt_str, UINT32 p1, UINT32 p2,
- UINT32 p3, UINT32 p4);
-extern void LogMsg_5 (UINT32 trace_set_mask, const char *fmt_str, UINT32 p1, UINT32 p2,
- UINT32 p3, UINT32 p4, UINT32 p5);
-extern void LogMsg_6 (UINT32 trace_set_mask, const char *fmt_str, UINT32 p1, UINT32 p2,
- UINT32 p3, UINT32 p4, UINT32 p5, UINT32 p6);
/* Prototype for stack tracing function. */
EXPORT_API extern void BTTRC_StackTrace0(tBTTRC_LAYER_ID layer_id,
@@ -306,75 +295,18 @@
#define L2CAP_INITIAL_TRACE_LEVEL BT_TRACE_LEVEL_WARNING
#endif
-#ifndef LLCP_INITIAL_TRACE_LEVEL
-#define LLCP_INITIAL_TRACE_LEVEL BT_TRACE_LEVEL_WARNING
-#endif
-
-#ifndef AMP_INITIAL_TRACE_LEVEL
-#define AMP_INITIAL_TRACE_LEVEL BT_TRACE_LEVEL_WARNING
-#endif
-
#ifndef RFCOMM_INITIAL_TRACE_LEVEL
#define RFCOMM_INITIAL_TRACE_LEVEL BT_TRACE_LEVEL_WARNING
#endif
-#ifndef OBX_INITIAL_TRACE_LEVEL
-#define OBX_INITIAL_TRACE_LEVEL BT_TRACE_LEVEL_WARNING
-#endif
-
#ifndef SDP_INITIAL_TRACE_LEVEL
#define SDP_INITIAL_TRACE_LEVEL BT_TRACE_LEVEL_WARNING
#endif
-#ifndef TCS_INITIAL_TRACE_LEVEL
-#define TCS_INITIAL_TRACE_LEVEL BT_TRACE_LEVEL_WARNING
-#endif
-
-/* Profile default trace levels */
-#ifndef DUN_INITIAL_TRACE_LEVEL
-#define DUN_INITIAL_TRACE_LEVEL BT_TRACE_LEVEL_WARNING
-#endif
-
#ifndef GAP_INITIAL_TRACE_LEVEL
#define GAP_INITIAL_TRACE_LEVEL BT_TRACE_LEVEL_WARNING
#endif
-#ifndef GOEP_INITIAL_TRACE_LEVEL
-#define GOEP_INITIAL_TRACE_LEVEL BT_TRACE_LEVEL_WARNING
-#endif
-
-#ifndef HSP2_INITIAL_TRACE_LEVEL
-#define HSP2_INITIAL_TRACE_LEVEL BT_TRACE_LEVEL_WARNING
-#endif
-
-#ifndef SPP_INITIAL_TRACE_LEVEL
-#define SPP_INITIAL_TRACE_LEVEL BT_TRACE_LEVEL_WARNING
-#endif
-
-#ifndef ICP_INITIAL_TRACE_LEVEL
-#define ICP_INITIAL_TRACE_LEVEL BT_TRACE_LEVEL_WARNING
-#endif
-
-#ifndef CTP_INITIAL_TRACE_LEVEL
-#define CTP_INITIAL_TRACE_LEVEL BT_TRACE_LEVEL_WARNING
-#endif
-
-#ifndef HCRP_INITIAL_TRACE_LEVEL
-#define HCRP_INITIAL_TRACE_LEVEL BT_TRACE_LEVEL_WARNING
-#endif
-
-#ifndef HCRPM_INITIAL_TRACE_LEVEL
-#define HCRPM_INITIAL_TRACE_LEVEL BT_TRACE_LEVEL_WARNING
-#endif
-
-#ifndef BPP_INITIAL_TRACE_LEVEL
-#define BPP_INITIAL_TRACE_LEVEL BT_TRACE_LEVEL_WARNING
-#endif
-
-#ifndef BIP_INITIAL_TRACE_LEVEL
-#define BIP_INITIAL_TRACE_LEVEL BT_TRACE_LEVEL_WARNING
-#endif
-
#ifndef BNEP_INITIAL_TRACE_LEVEL
#define BNEP_INITIAL_TRACE_LEVEL BT_TRACE_LEVEL_WARNING
#endif
@@ -383,34 +315,10 @@
#define PAN_INITIAL_TRACE_LEVEL BT_TRACE_LEVEL_WARNING
#endif
-#ifndef SAP_INITIAL_TRACE_LEVEL
-#define SAP_INITIAL_TRACE_LEVEL BT_TRACE_LEVEL_WARNING
-#endif
-
-#ifndef FTP_INITIAL_TRACE_LEVEL
-#define FTP_INITIAL_TRACE_LEVEL BT_TRACE_LEVEL_WARNING
-#endif
-
-#ifndef OPP_INITIAL_TRACE_LEVEL
-#define OPP_INITIAL_TRACE_LEVEL BT_TRACE_LEVEL_WARNING
-#endif
-
-#ifndef HFP_INITIAL_TRACE_LEVEL
-#define HFP_INITIAL_TRACE_LEVEL BT_TRACE_LEVEL_WARNING
-#endif
-
-#ifndef PAP_INITIAL_TRACE_LEVEL
-#define PAP_INITIAL_TRACE_LEVEL BT_TRACE_LEVEL_WARNING
-#endif
-
#ifndef A2D_INITIAL_TRACE_LEVEL
#define A2D_INITIAL_TRACE_LEVEL BT_TRACE_LEVEL_WARNING
#endif
-#ifndef VDP_INITIAL_TRACE_LEVEL
-#define VDP_INITIAL_TRACE_LEVEL BT_TRACE_LEVEL_WARNING
-#endif
-
#ifndef AVDT_INITIAL_TRACE_LEVEL
#define AVDT_INITIAL_TRACE_LEVEL BT_TRACE_LEVEL_WARNING
#endif
@@ -431,11 +339,6 @@
#define HID_INITIAL_TRACE_LEVEL BT_TRACE_LEVEL_WARNING
#endif
-/* Application and other default trace levels */
-#ifndef RPC_INITIAL_TRACE_LEVEL
-#define RPC_INITIAL_TRACE_LEVEL BT_TRACE_LEVEL_WARNING
-#endif
-
#ifndef APPL_INITIAL_TRACE_LEVEL
#define APPL_INITIAL_TRACE_LEVEL BT_TRACE_LEVEL_WARNING
#endif
@@ -444,10 +347,6 @@
#define BT_TRACE_APPL BT_USE_TRACES
#endif
-#ifndef NFC_INITIAL_TRACE_LEVEL
-#define NFC_INITIAL_TRACE_LEVEL BT_TRACE_LEVEL_WARNING
-#endif
-
#ifndef GATT_INITIAL_TRACE_LEVEL
#define GATT_INITIAL_TRACE_LEVEL BT_TRACE_LEVEL_WARNING
#endif
@@ -627,3820 +526,267 @@
#if (BT_USE_TRACES == TRUE)
-#define BT_TRACE_0(l,t,m) LogMsg_0((TRACE_CTRL_GENERAL | (l) | TRACE_ORG_STACK | (t)),(m))
-#define BT_TRACE_1(l,t,m,p1) LogMsg_1(TRACE_CTRL_GENERAL | (l) | TRACE_ORG_STACK | (t),(m),(UINT32)(p1))
-#define BT_TRACE_2(l,t,m,p1,p2) LogMsg_2(TRACE_CTRL_GENERAL | (l) | TRACE_ORG_STACK | (t),(m),(UINT32)(p1), \
- (UINT32)(p2))
-#define BT_TRACE_3(l,t,m,p1,p2,p3) LogMsg_3(TRACE_CTRL_GENERAL | (l) | TRACE_ORG_STACK | (t),(m),(UINT32)(p1), \
- (UINT32)(p2),(UINT32)(p3))
-#define BT_TRACE_4(l,t,m,p1,p2,p3,p4) LogMsg_4(TRACE_CTRL_GENERAL | (l) | TRACE_ORG_STACK | (t),(m),(UINT32)(p1), \
- (UINT32)(p2),(UINT32)(p3),(UINT32)(p4))
-#define BT_TRACE_5(l,t,m,p1,p2,p3,p4,p5) LogMsg_5(TRACE_CTRL_GENERAL | (l) | TRACE_ORG_STACK | (t),(m),(UINT32)(p1), \
- (UINT32)(p2),(UINT32)(p3),(UINT32)(p4), \
- (UINT32)(p5))
-#define BT_TRACE_6(l,t,m,p1,p2,p3,p4,p5,p6) LogMsg_6(TRACE_CTRL_GENERAL | (l) | TRACE_ORG_STACK | (t),(m),(UINT32)(p1), \
- (UINT32)(p2),(UINT32)(p3),(UINT32)(p4), \
- (UINT32)(p5),(UINT32)(p6))
-
-#define BT_ERROR_TRACE_0(l,m) LogMsg_0(TRACE_CTRL_GENERAL | (l) | TRACE_ORG_STACK | TRACE_TYPE_ERROR,(m))
-#define BT_ERROR_TRACE_1(l,m,p1) LogMsg_1(TRACE_CTRL_GENERAL | (l) | TRACE_ORG_STACK | TRACE_TYPE_ERROR,(m),(UINT32)(p1))
-#define BT_ERROR_TRACE_2(l,m,p1,p2) LogMsg_2(TRACE_CTRL_GENERAL | (l) | TRACE_ORG_STACK | TRACE_TYPE_ERROR,(m),(UINT32)(p1),(UINT32)(p2))
-#define BT_ERROR_TRACE_3(l,m,p1,p2,p3) LogMsg_3(TRACE_CTRL_GENERAL | (l) | TRACE_ORG_STACK | TRACE_TYPE_ERROR,(m),(UINT32)(p1),(UINT32)(p2),(UINT32)(p3))
+#define BT_TRACE(l,t,...) LogMsg((TRACE_CTRL_GENERAL | (l) | TRACE_ORG_STACK | (t)), ##__VA_ARGS__)
+#define BT_ERROR_TRACE(l,...) LogMsg(TRACE_CTRL_GENERAL | (l) | TRACE_ORG_STACK | TRACE_TYPE_ERROR, ##__VA_ARGS__)
/* Define tracing for the HCI unit
*/
-#define HCI_TRACE_ERROR0(m) {if (btu_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_HCI, TRACE_TYPE_ERROR, m);}
-#define HCI_TRACE_ERROR1(m,p1) {if (btu_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_HCI, TRACE_TYPE_ERROR, m,p1);}
-#define HCI_TRACE_ERROR2(m,p1,p2) {if (btu_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_HCI, TRACE_TYPE_ERROR, m,p1,p2);}
-#define HCI_TRACE_ERROR3(m,p1,p2,p3) {if (btu_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_HCI, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define HCI_TRACE_ERROR4(m,p1,p2,p3,p4) {if (btu_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_HCI, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define HCI_TRACE_ERROR5(m,p1,p2,p3,p4,p5) {if (btu_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_HCI, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define HCI_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6) {if (btu_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_HCI, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-#define HCI_TRACE_WARNING0(m) {if (btu_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_HCI, TRACE_TYPE_WARNING, m);}
-#define HCI_TRACE_WARNING1(m,p1) {if (btu_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_HCI, TRACE_TYPE_WARNING, m,p1);}
-#define HCI_TRACE_WARNING2(m,p1,p2) {if (btu_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_HCI, TRACE_TYPE_WARNING, m,p1,p2);}
-#define HCI_TRACE_WARNING3(m,p1,p2,p3) {if (btu_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_HCI, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define HCI_TRACE_WARNING4(m,p1,p2,p3,p4) {if (btu_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_HCI, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define HCI_TRACE_WARNING5(m,p1,p2,p3,p4,p5) {if (btu_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_HCI, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define HCI_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (btu_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_HCI, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define HCI_TRACE_EVENT0(m) {if (btu_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_HCI, TRACE_TYPE_EVENT, m);}
-#define HCI_TRACE_EVENT1(m,p1) {if (btu_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_HCI, TRACE_TYPE_EVENT, m, p1);}
-#define HCI_TRACE_EVENT2(m,p1,p2) {if (btu_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_HCI, TRACE_TYPE_EVENT, m,p1,p2);}
-#define HCI_TRACE_EVENT3(m,p1,p2,p3) {if (btu_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_HCI, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define HCI_TRACE_EVENT4(m,p1,p2,p3,p4) {if (btu_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_HCI, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define HCI_TRACE_EVENT5(m,p1,p2,p3,p4,p5) {if (btu_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_HCI, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define HCI_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6) {if (btu_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_HCI, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define HCI_TRACE_DEBUG0(m) {if (btu_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_HCI, TRACE_TYPE_DEBUG, m);}
-#define HCI_TRACE_DEBUG1(m,p1) {if (btu_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_HCI, TRACE_TYPE_DEBUG, m,p1);}
-#define HCI_TRACE_DEBUG2(m,p1,p2) {if (btu_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_HCI, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define HCI_TRACE_DEBUG3(m,p1,p2,p3) {if (btu_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_HCI, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define HCI_TRACE_DEBUG4(m,p1,p2,p3,p4) {if (btu_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_HCI, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define HCI_TRACE_DEBUG5(m,p1,p2,p3,p4,p5) {if (btu_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_HCI, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define HCI_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6) {if (btu_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_HCI, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
+#define HCI_TRACE_ERROR(...) {if (btu_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_HCI, TRACE_TYPE_ERROR, ##__VA_ARGS__);}
+#define HCI_TRACE_WARNING(...) {if (btu_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_HCI, TRACE_TYPE_WARNING, ##__VA_ARGS__);}
+#define HCI_TRACE_EVENT(...) {if (btu_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_HCI, TRACE_TYPE_EVENT, ##__VA_ARGS__);}
+#define HCI_TRACE_DEBUG(...) {if (btu_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_HCI, TRACE_TYPE_DEBUG, ##__VA_ARGS__);}
/* Define tracing for BTM
*/
-#define BTM_TRACE_ERROR0(m) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_BTM, TRACE_TYPE_ERROR, m);}
-#define BTM_TRACE_ERROR1(m,p1) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_BTM, TRACE_TYPE_ERROR, m,p1);}
-#define BTM_TRACE_ERROR2(m,p1,p2) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_BTM, TRACE_TYPE_ERROR, m,p1,p2);}
-#define BTM_TRACE_ERROR3(m,p1,p2,p3) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_BTM, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define BTM_TRACE_ERROR4(m,p1,p2,p3,p4) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_BTM, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define BTM_TRACE_ERROR5(m,p1,p2,p3,p4,p5) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_BTM, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define BTM_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_BTM, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define BTM_TRACE_WARNING0(m) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_BTM, TRACE_TYPE_WARNING, m);}
-#define BTM_TRACE_WARNING1(m,p1) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_BTM, TRACE_TYPE_WARNING, m,p1);}
-#define BTM_TRACE_WARNING2(m,p1,p2) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_BTM, TRACE_TYPE_WARNING, m,p1,p2);}
-#define BTM_TRACE_WARNING3(m,p1,p2,p3) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_BTM, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define BTM_TRACE_WARNING4(m,p1,p2,p3,p4) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_BTM, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define BTM_TRACE_WARNING5(m,p1,p2,p3,p4,p5) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_BTM, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define BTM_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_BTM, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define BTM_TRACE_API0(m) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_BTM, TRACE_TYPE_API, m);}
-#define BTM_TRACE_API1(m,p1) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_BTM, TRACE_TYPE_API, m, p1);}
-#define BTM_TRACE_API2(m,p1,p2) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_BTM, TRACE_TYPE_API, m,p1,p2);}
-#define BTM_TRACE_API3(m,p1,p2,p3) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_BTM, TRACE_TYPE_API, m,p1,p2,p3);}
-#define BTM_TRACE_API4(m,p1,p2,p3,p4) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_BTM, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define BTM_TRACE_API5(m,p1,p2,p3,p4,p5) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_BTM, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define BTM_TRACE_API6(m,p1,p2,p3,p4,p5,p6) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_BTM, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-#define BTM_TRACE_EVENT0(m) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_BTM, TRACE_TYPE_EVENT, m);}
-#define BTM_TRACE_EVENT1(m,p1) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_BTM, TRACE_TYPE_EVENT, m, p1);}
-#define BTM_TRACE_EVENT2(m,p1,p2) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_BTM, TRACE_TYPE_EVENT, m,p1,p2);}
-#define BTM_TRACE_EVENT3(m,p1,p2,p3) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_BTM, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define BTM_TRACE_EVENT4(m,p1,p2,p3,p4) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_BTM, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define BTM_TRACE_EVENT5(m,p1,p2,p3,p4,p5) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_BTM, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define BTM_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_BTM, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define BTM_TRACE_DEBUG0(m) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_BTM, TRACE_TYPE_DEBUG, m);}
-#define BTM_TRACE_DEBUG1(m,p1) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_BTM, TRACE_TYPE_DEBUG, m,p1);}
-#define BTM_TRACE_DEBUG2(m,p1,p2) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_BTM, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define BTM_TRACE_DEBUG3(m,p1,p2,p3) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_BTM, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define BTM_TRACE_DEBUG4(m,p1,p2,p3,p4) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_BTM, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define BTM_TRACE_DEBUG5(m,p1,p2,p3,p4,p5) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_BTM, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define BTM_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_BTM, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
+#define BTM_TRACE_ERROR(...) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_BTM, TRACE_TYPE_ERROR, ##__VA_ARGS__);}
+#define BTM_TRACE_WARNING(...) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_BTM, TRACE_TYPE_WARNING, ##__VA_ARGS__);}
+#define BTM_TRACE_API(...) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_BTM, TRACE_TYPE_API, ##__VA_ARGS__);}
+#define BTM_TRACE_EVENT(...) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_BTM, TRACE_TYPE_EVENT, ##__VA_ARGS__);}
+#define BTM_TRACE_DEBUG(...) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_BTM, TRACE_TYPE_DEBUG, ##__VA_ARGS__);}
/* Define tracing for the L2CAP unit
*/
-#define L2CAP_TRACE_ERROR0(m) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_L2CAP, TRACE_TYPE_ERROR, m);}
-#define L2CAP_TRACE_ERROR1(m,p1) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_L2CAP, TRACE_TYPE_ERROR, m,p1);}
-#define L2CAP_TRACE_ERROR2(m,p1,p2) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_L2CAP, TRACE_TYPE_ERROR, m,p1,p2);}
-#define L2CAP_TRACE_ERROR3(m,p1,p2,p3) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_L2CAP, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define L2CAP_TRACE_ERROR4(m,p1,p2,p3,p4) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_L2CAP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define L2CAP_TRACE_ERROR5(m,p1,p2,p3,p4,p5) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_L2CAP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define L2CAP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_L2CAP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define L2CAP_TRACE_WARNING0(m) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_L2CAP, TRACE_TYPE_WARNING, m);}
-#define L2CAP_TRACE_WARNING1(m,p1) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_L2CAP, TRACE_TYPE_WARNING, m,p1);}
-#define L2CAP_TRACE_WARNING2(m,p1,p2) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_L2CAP, TRACE_TYPE_WARNING, m,p1,p2);}
-#define L2CAP_TRACE_WARNING3(m,p1,p2,p3) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_L2CAP, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define L2CAP_TRACE_WARNING4(m,p1,p2,p3,p4) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_L2CAP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define L2CAP_TRACE_WARNING5(m,p1,p2,p3,p4,p5) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_L2CAP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define L2CAP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_L2CAP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define L2CAP_TRACE_API0(m) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_L2CAP, TRACE_TYPE_API, m);}
-#define L2CAP_TRACE_API1(m,p1) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_L2CAP, TRACE_TYPE_API, m,p1);}
-#define L2CAP_TRACE_API2(m,p1,p2) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_L2CAP, TRACE_TYPE_API, m,p1,p2);}
-#define L2CAP_TRACE_API3(m,p1,p2,p3) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_L2CAP, TRACE_TYPE_API, m,p1,p2,p3);}
-#define L2CAP_TRACE_API4(m,p1,p2,p3,p4) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_L2CAP, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define L2CAP_TRACE_API5(m,p1,p2,p3,p4,p5) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_L2CAP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define L2CAP_TRACE_API6(m,p1,p2,p3,p4,p5,p6) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_L2CAP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-#define L2CAP_TRACE_EVENT0(m) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_L2CAP, TRACE_TYPE_EVENT, m);}
-#define L2CAP_TRACE_EVENT1(m,p1) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_L2CAP, TRACE_TYPE_EVENT, m, p1);}
-#define L2CAP_TRACE_EVENT2(m,p1,p2) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_L2CAP, TRACE_TYPE_EVENT, m,p1,p2);}
-#define L2CAP_TRACE_EVENT3(m,p1,p2,p3) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_L2CAP, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define L2CAP_TRACE_EVENT4(m,p1,p2,p3,p4) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_L2CAP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define L2CAP_TRACE_EVENT5(m,p1,p2,p3,p4,p5) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_L2CAP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define L2CAP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_L2CAP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define L2CAP_TRACE_DEBUG0(m) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_L2CAP, TRACE_TYPE_DEBUG, m);}
-#define L2CAP_TRACE_DEBUG1(m,p1) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_L2CAP, TRACE_TYPE_DEBUG, m,p1);}
-#define L2CAP_TRACE_DEBUG2(m,p1,p2) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_L2CAP, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define L2CAP_TRACE_DEBUG3(m,p1,p2,p3) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_L2CAP, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define L2CAP_TRACE_DEBUG4(m,p1,p2,p3,p4) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_L2CAP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define L2CAP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_L2CAP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define L2CAP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_L2CAP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-/* Define tracing for the LLCP unit
-*/
-#define LLCP_TRACE_ERROR0(m) {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_LLCP, TRACE_TYPE_ERROR, m);}
-#define LLCP_TRACE_ERROR1(m,p1) {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_LLCP, TRACE_TYPE_ERROR, m,p1);}
-#define LLCP_TRACE_ERROR2(m,p1,p2) {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_LLCP, TRACE_TYPE_ERROR, m,p1,p2);}
-#define LLCP_TRACE_ERROR3(m,p1,p2,p3) {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_LLCP, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define LLCP_TRACE_ERROR4(m,p1,p2,p3,p4) {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_LLCP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define LLCP_TRACE_ERROR5(m,p1,p2,p3,p4,p5) {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_LLCP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define LLCP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6) {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_LLCP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define LLCP_TRACE_WARNING0(m) {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_LLCP, TRACE_TYPE_WARNING, m);}
-#define LLCP_TRACE_WARNING1(m,p1) {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_LLCP, TRACE_TYPE_WARNING, m,p1);}
-#define LLCP_TRACE_WARNING2(m,p1,p2) {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_LLCP, TRACE_TYPE_WARNING, m,p1,p2);}
-#define LLCP_TRACE_WARNING3(m,p1,p2,p3) {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_LLCP, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define LLCP_TRACE_WARNING4(m,p1,p2,p3,p4) {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_LLCP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define LLCP_TRACE_WARNING5(m,p1,p2,p3,p4,p5) {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_LLCP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define LLCP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_LLCP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define LLCP_TRACE_API0(m) {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_LLCP, TRACE_TYPE_API, m);}
-#define LLCP_TRACE_API1(m,p1) {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_LLCP, TRACE_TYPE_API, m,p1);}
-#define LLCP_TRACE_API2(m,p1,p2) {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_LLCP, TRACE_TYPE_API, m,p1,p2);}
-#define LLCP_TRACE_API3(m,p1,p2,p3) {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_LLCP, TRACE_TYPE_API, m,p1,p2,p3);}
-#define LLCP_TRACE_API4(m,p1,p2,p3,p4) {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_LLCP, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define LLCP_TRACE_API5(m,p1,p2,p3,p4,p5) {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_LLCP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define LLCP_TRACE_API6(m,p1,p2,p3,p4,p5,p6) {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_LLCP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-#define LLCP_TRACE_EVENT0(m) {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_LLCP, TRACE_TYPE_EVENT, m);}
-#define LLCP_TRACE_EVENT1(m,p1) {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_LLCP, TRACE_TYPE_EVENT, m, p1);}
-#define LLCP_TRACE_EVENT2(m,p1,p2) {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_LLCP, TRACE_TYPE_EVENT, m,p1,p2);}
-#define LLCP_TRACE_EVENT3(m,p1,p2,p3) {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_LLCP, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define LLCP_TRACE_EVENT4(m,p1,p2,p3,p4) {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_LLCP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define LLCP_TRACE_EVENT5(m,p1,p2,p3,p4,p5) {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_LLCP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define LLCP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6) {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_LLCP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define LLCP_TRACE_DEBUG0(m) {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_LLCP, TRACE_TYPE_DEBUG, m);}
-#define LLCP_TRACE_DEBUG1(m,p1) {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_LLCP, TRACE_TYPE_DEBUG, m,p1);}
-#define LLCP_TRACE_DEBUG2(m,p1,p2) {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_LLCP, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define LLCP_TRACE_DEBUG3(m,p1,p2,p3) {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_LLCP, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define LLCP_TRACE_DEBUG4(m,p1,p2,p3,p4) {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_LLCP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define LLCP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5) {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_LLCP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define LLCP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6) {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_LLCP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
+#define L2CAP_TRACE_ERROR(...) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_L2CAP, TRACE_TYPE_ERROR, ##__VA_ARGS__);}
+#define L2CAP_TRACE_WARNING(...) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_L2CAP, TRACE_TYPE_WARNING, ##__VA_ARGS__);}
+#define L2CAP_TRACE_API(...) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_L2CAP, TRACE_TYPE_API, ##__VA_ARGS__);}
+#define L2CAP_TRACE_EVENT(...) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_L2CAP, TRACE_TYPE_EVENT, ##__VA_ARGS__);}
+#define L2CAP_TRACE_DEBUG(...) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_L2CAP, TRACE_TYPE_DEBUG, ##__VA_ARGS__);}
/* Define tracing for the SDP unit
*/
-#define SDP_TRACE_ERROR0(m) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_SDP, TRACE_TYPE_ERROR, m);}
-#define SDP_TRACE_ERROR1(m,p1) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_SDP, TRACE_TYPE_ERROR, m,p1);}
-#define SDP_TRACE_ERROR2(m,p1,p2) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_SDP, TRACE_TYPE_ERROR, m,p1,p2);}
-#define SDP_TRACE_ERROR3(m,p1,p2,p3) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_SDP, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define SDP_TRACE_ERROR4(m,p1,p2,p3,p4) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_SDP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define SDP_TRACE_ERROR5(m,p1,p2,p3,p4,p5) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_SDP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define SDP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_SDP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define SDP_TRACE_WARNING0(m) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_SDP, TRACE_TYPE_WARNING, m);}
-#define SDP_TRACE_WARNING1(m,p1) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_SDP, TRACE_TYPE_WARNING, m,p1);}
-#define SDP_TRACE_WARNING2(m,p1,p2) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_SDP, TRACE_TYPE_WARNING, m,p1,p2);}
-#define SDP_TRACE_WARNING3(m,p1,p2,p3) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_SDP, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define SDP_TRACE_WARNING4(m,p1,p2,p3,p4) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_SDP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define SDP_TRACE_WARNING5(m,p1,p2,p3,p4,p5) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_SDP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define SDP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_SDP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define SDP_TRACE_API0(m) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_SDP, TRACE_TYPE_API, m);}
-#define SDP_TRACE_API1(m,p1) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_SDP, TRACE_TYPE_API, m,p1);}
-#define SDP_TRACE_API2(m,p1,p2) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_SDP, TRACE_TYPE_API, m,p1,p2);}
-#define SDP_TRACE_API3(m,p1,p2,p3) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_SDP, TRACE_TYPE_API, m,p1,p2,p3);}
-#define SDP_TRACE_API4(m,p1,p2,p3,p4) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_SDP, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define SDP_TRACE_API5(m,p1,p2,p3,p4,p5) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_SDP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define SDP_TRACE_API6(m,p1,p2,p3,p4,p5,p6) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_SDP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-#define SDP_TRACE_EVENT0(m) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_SDP, TRACE_TYPE_EVENT, m);}
-#define SDP_TRACE_EVENT1(m,p1) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_SDP, TRACE_TYPE_EVENT, m, p1);}
-#define SDP_TRACE_EVENT2(m,p1,p2) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_SDP, TRACE_TYPE_EVENT, m,p1,p2);}
-#define SDP_TRACE_EVENT3(m,p1,p2,p3) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_SDP, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define SDP_TRACE_EVENT4(m,p1,p2,p3,p4) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_SDP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define SDP_TRACE_EVENT5(m,p1,p2,p3,p4,p5) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_SDP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define SDP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_SDP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define SDP_TRACE_DEBUG0(m) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_SDP, TRACE_TYPE_DEBUG, m);}
-#define SDP_TRACE_DEBUG1(m,p1) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_SDP, TRACE_TYPE_DEBUG, m,p1);}
-#define SDP_TRACE_DEBUG2(m,p1,p2) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_SDP, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define SDP_TRACE_DEBUG3(m,p1,p2,p3) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_SDP, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define SDP_TRACE_DEBUG4(m,p1,p2,p3,p4) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_SDP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define SDP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_SDP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define SDP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_SDP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
+#define SDP_TRACE_ERROR(...) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_SDP, TRACE_TYPE_ERROR, ##__VA_ARGS__);}
+#define SDP_TRACE_WARNING(...) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_SDP, TRACE_TYPE_WARNING, ##__VA_ARGS__);}
+#define SDP_TRACE_API(...) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_SDP, TRACE_TYPE_API, ##__VA_ARGS__);}
+#define SDP_TRACE_EVENT(...) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_SDP, TRACE_TYPE_EVENT, ##__VA_ARGS__);}
+#define SDP_TRACE_DEBUG(...) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_SDP, TRACE_TYPE_DEBUG, ##__VA_ARGS__);}
/* Define tracing for the RFCOMM unit
*/
-#define RFCOMM_TRACE_ERROR0(m) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_RFCOMM, TRACE_TYPE_ERROR, m);}
-#define RFCOMM_TRACE_ERROR1(m,p1) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_RFCOMM, TRACE_TYPE_ERROR, m,p1);}
-#define RFCOMM_TRACE_ERROR2(m,p1,p2) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_RFCOMM, TRACE_TYPE_ERROR, m,p1,p2);}
-#define RFCOMM_TRACE_ERROR3(m,p1,p2,p3) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_RFCOMM, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define RFCOMM_TRACE_ERROR4(m,p1,p2,p3,p4) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_RFCOMM, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define RFCOMM_TRACE_ERROR5(m,p1,p2,p3,p4,p5) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_RFCOMM, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define RFCOMM_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_RFCOMM, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define RFCOMM_TRACE_WARNING0(m) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_RFCOMM, TRACE_TYPE_WARNING, m);}
-#define RFCOMM_TRACE_WARNING1(m,p1) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_RFCOMM, TRACE_TYPE_WARNING, m,p1);}
-#define RFCOMM_TRACE_WARNING2(m,p1,p2) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_RFCOMM, TRACE_TYPE_WARNING, m,p1,p2);}
-#define RFCOMM_TRACE_WARNING3(m,p1,p2,p3) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_RFCOMM, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define RFCOMM_TRACE_WARNING4(m,p1,p2,p3,p4) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_RFCOMM, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define RFCOMM_TRACE_WARNING5(m,p1,p2,p3,p4,p5) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_RFCOMM, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define RFCOMM_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_RFCOMM, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define RFCOMM_TRACE_API0(m) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_RFCOMM, TRACE_TYPE_API, m);}
-#define RFCOMM_TRACE_API1(m,p1) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_RFCOMM, TRACE_TYPE_API, m,p1);}
-#define RFCOMM_TRACE_API2(m,p1,p2) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_RFCOMM, TRACE_TYPE_API, m,p1,p2);}
-#define RFCOMM_TRACE_API3(m,p1,p2,p3) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_RFCOMM, TRACE_TYPE_API, m,p1,p2,p3);}
-#define RFCOMM_TRACE_API4(m,p1,p2,p3,p4) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_RFCOMM, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define RFCOMM_TRACE_API5(m,p1,p2,p3,p4,p5) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_RFCOMM, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define RFCOMM_TRACE_API6(m,p1,p2,p3,p4,p5,p6) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_RFCOMM, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-#define RFCOMM_TRACE_EVENT0(m) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_RFCOMM, TRACE_TYPE_EVENT, m);}
-#define RFCOMM_TRACE_EVENT1(m,p1) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_RFCOMM, TRACE_TYPE_EVENT, m, p1);}
-#define RFCOMM_TRACE_EVENT2(m,p1,p2) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_RFCOMM, TRACE_TYPE_EVENT, m,p1,p2);}
-#define RFCOMM_TRACE_EVENT3(m,p1,p2,p3) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_RFCOMM, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define RFCOMM_TRACE_EVENT4(m,p1,p2,p3,p4) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_RFCOMM, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define RFCOMM_TRACE_EVENT5(m,p1,p2,p3,p4,p5) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_RFCOMM, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define RFCOMM_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_RFCOMM, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define RFCOMM_TRACE_DEBUG0(m) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_RFCOMM, TRACE_TYPE_DEBUG, m);}
-#define RFCOMM_TRACE_DEBUG1(m,p1) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_RFCOMM, TRACE_TYPE_DEBUG, m,p1);}
-#define RFCOMM_TRACE_DEBUG2(m,p1,p2) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_RFCOMM, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define RFCOMM_TRACE_DEBUG3(m,p1,p2,p3) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_RFCOMM, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define RFCOMM_TRACE_DEBUG4(m,p1,p2,p3,p4) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_RFCOMM, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define RFCOMM_TRACE_DEBUG5(m,p1,p2,p3,p4,p5) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_RFCOMM, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define RFCOMM_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_RFCOMM, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-/* Define tracing for Serial Port Profile
-*/
-#define SPP_TRACE_ERROR0(m) {if (spp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_SPP, TRACE_TYPE_ERROR, m);}
-#define SPP_TRACE_ERROR1(m,p1) {if (spp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_SPP, TRACE_TYPE_ERROR, m,p1);}
-#define SPP_TRACE_ERROR2(m,p1,p2) {if (spp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_SPP, TRACE_TYPE_ERROR, m,p1,p2);}
-#define SPP_TRACE_ERROR3(m,p1,p2,p3) {if (spp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_SPP, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define SPP_TRACE_ERROR4(m,p1,p2,p3,p4) {if (spp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_SPP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define SPP_TRACE_ERROR5(m,p1,p2,p3,p4,p5) {if (spp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_SPP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define SPP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6) {if (spp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_SPP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define SPP_TRACE_WARNING0(m) {if (spp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_SPP, TRACE_TYPE_WARNING, m);}
-#define SPP_TRACE_WARNING1(m,p1) {if (spp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_SPP, TRACE_TYPE_WARNING, m,p1);}
-#define SPP_TRACE_WARNING2(m,p1,p2) {if (spp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_SPP, TRACE_TYPE_WARNING, m,p1,p2);}
-#define SPP_TRACE_WARNING3(m,p1,p2,p3) {if (spp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_SPP, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define SPP_TRACE_WARNING4(m,p1,p2,p3,p4) {if (spp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_SPP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define SPP_TRACE_WARNING5(m,p1,p2,p3,p4,p5) {if (spp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_SPP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define SPP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (spp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_SPP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define SPP_TRACE_EVENT0(m) {if (spp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_SPP, TRACE_TYPE_EVENT, m);}
-#define SPP_TRACE_EVENT1(m,p1) {if (spp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_SPP, TRACE_TYPE_EVENT, m, p1);}
-#define SPP_TRACE_EVENT2(m,p1,p2) {if (spp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_SPP, TRACE_TYPE_EVENT, m,p1,p2);}
-#define SPP_TRACE_EVENT3(m,p1,p2,p3) {if (spp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_SPP, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define SPP_TRACE_EVENT4(m,p1,p2,p3,p4) {if (spp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_SPP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define SPP_TRACE_EVENT5(m,p1,p2,p3,p4,p5) {if (spp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_SPP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define SPP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6) {if (spp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_SPP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define SPP_TRACE_API0(m) {if (spp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_SPP, TRACE_TYPE_API, m);}
-#define SPP_TRACE_API1(m,p1) {if (spp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_SPP, TRACE_TYPE_API, m, p1);}
-#define SPP_TRACE_API2(m,p1,p2) {if (spp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_SPP, TRACE_TYPE_API, m,p1,p2);}
-#define SPP_TRACE_API3(m,p1,p2,p3) {if (spp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_SPP, TRACE_TYPE_API, m,p1,p2,p3);}
-#define SPP_TRACE_API4(m,p1,p2,p3,p4) {if (spp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_SPP, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define SPP_TRACE_API5(m,p1,p2,p3,p4,p5) {if (spp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_SPP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define SPP_TRACE_API6(m,p1,p2,p3,p4,p5,p6) {if (spp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_SPP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-#define SPP_TRACE_DEBUG0(m) {if (spp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_SPP, TRACE_TYPE_DEBUG, m);}
-#define SPP_TRACE_DEBUG1(m,p1) {if (spp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_SPP, TRACE_TYPE_DEBUG, m,p1);}
-#define SPP_TRACE_DEBUG2(m,p1,p2) {if (spp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_SPP, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define SPP_TRACE_DEBUG3(m,p1,p2,p3) {if (spp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_SPP, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define SPP_TRACE_DEBUG4(m,p1,p2,p3,p4) {if (spp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_SPP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define SPP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5) {if (spp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_SPP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define SPP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6) {if (spp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_SPP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
+#define RFCOMM_TRACE_ERROR(...) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_RFCOMM, TRACE_TYPE_ERROR, ##__VA_ARGS__);}
+#define RFCOMM_TRACE_WARNING(...) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_RFCOMM, TRACE_TYPE_WARNING, ##__VA_ARGS__);}
+#define RFCOMM_TRACE_API(...) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_RFCOMM, TRACE_TYPE_API, ##__VA_ARGS__);}
+#define RFCOMM_TRACE_EVENT(...) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_RFCOMM, TRACE_TYPE_EVENT, ##__VA_ARGS__);}
+#define RFCOMM_TRACE_DEBUG(...) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_RFCOMM, TRACE_TYPE_DEBUG, ##__VA_ARGS__);}
/* Generic Access Profile traces */
-#define GAP_TRACE_ERROR0(m) {if (gap_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_GAP, TRACE_TYPE_ERROR, m);}
-#define GAP_TRACE_ERROR1(m,p1) {if (gap_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_GAP, TRACE_TYPE_ERROR, m, p1);}
-#define GAP_TRACE_ERROR2(m,p1,p2) {if (gap_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_GAP, TRACE_TYPE_ERROR, m,p1,p2);}
-#define GAP_TRACE_ERROR3(m,p1,p2,p3) {if (gap_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_GAP, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define GAP_TRACE_ERROR4(m,p1,p2,p3,p4) {if (gap_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_GAP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define GAP_TRACE_ERROR5(m,p1,p2,p3,p4,p5) {if (gap_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_GAP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define GAP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6) {if (gap_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_GAP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define GAP_TRACE_EVENT0(m) {if (gap_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_GAP, TRACE_TYPE_EVENT, m);}
-#define GAP_TRACE_EVENT1(m,p1) {if (gap_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_GAP, TRACE_TYPE_EVENT, m, p1);}
-#define GAP_TRACE_EVENT2(m,p1,p2) {if (gap_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_GAP, TRACE_TYPE_EVENT, m,p1,p2);}
-#define GAP_TRACE_EVENT3(m,p1,p2,p3) {if (gap_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_GAP, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define GAP_TRACE_EVENT4(m,p1,p2,p3,p4) {if (gap_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_GAP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define GAP_TRACE_EVENT5(m,p1,p2,p3,p4,p5) {if (gap_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_GAP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define GAP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6) {if (gap_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_GAP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define GAP_TRACE_API0(m) {if (gap_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_GAP, TRACE_TYPE_API, m);}
-#define GAP_TRACE_API1(m,p1) {if (gap_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_GAP, TRACE_TYPE_API, m, p1);}
-#define GAP_TRACE_API2(m,p1,p2) {if (gap_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_GAP, TRACE_TYPE_API, m,p1,p2);}
-#define GAP_TRACE_API3(m,p1,p2,p3) {if (gap_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_GAP, TRACE_TYPE_API, m,p1,p2,p3);}
-#define GAP_TRACE_API4(m,p1,p2,p3,p4) {if (gap_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_GAP, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define GAP_TRACE_API5(m,p1,p2,p3,p4,p5) {if (gap_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_GAP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define GAP_TRACE_API6(m,p1,p2,p3,p4,p5,p6) {if (gap_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_GAP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-#define GAP_TRACE_WARNING0(m) {if (gap_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_GAP, TRACE_TYPE_WARNING, m);}
-#define GAP_TRACE_WARNING1(m,p1) {if (gap_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_GAP, TRACE_TYPE_WARNING, m, p1);}
-#define GAP_TRACE_WARNING2(m,p1,p2) {if (gap_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_GAP, TRACE_TYPE_WARNING, m,p1,p2);}
-#define GAP_TRACE_WARNING3(m,p1,p2,p3) {if (gap_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_GAP, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define GAP_TRACE_WARNING4(m,p1,p2,p3,p4) {if (gap_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_GAP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define GAP_TRACE_WARNING5(m,p1,p2,p3,p4,p5) {if (gap_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_GAP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define GAP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (gap_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_GAP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-
-/* Define tracing for OBX
-*/
-#define OBX_TRACE_ERROR0(m) {if (obx_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_OBEX, TRACE_TYPE_ERROR, m);}
-#define OBX_TRACE_ERROR1(m,p1) {if (obx_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_OBEX, TRACE_TYPE_ERROR, m,p1);}
-#define OBX_TRACE_ERROR2(m,p1,p2) {if (obx_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_OBEX, TRACE_TYPE_ERROR, m,p1,p2);}
-#define OBX_TRACE_ERROR3(m,p1,p2,p3) {if (obx_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_OBEX, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define OBX_TRACE_ERROR4(m,p1,p2,p3,p4) {if (obx_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_OBEX, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define OBX_TRACE_ERROR5(m,p1,p2,p3,p4,p5) {if (obx_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_OBEX, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define OBX_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6) {if (obx_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_OBEX, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define OBX_TRACE_WARNING0(m) {if (obx_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_OBEX, TRACE_TYPE_WARNING, m);}
-#define OBX_TRACE_WARNING1(m,p1) {if (obx_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_OBEX, TRACE_TYPE_WARNING, m,p1);}
-#define OBX_TRACE_WARNING2(m,p1,p2) {if (obx_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_OBEX, TRACE_TYPE_WARNING, m,p1,p2);}
-#define OBX_TRACE_WARNING3(m,p1,p2,p3) {if (obx_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_OBEX, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define OBX_TRACE_WARNING4(m,p1,p2,p3,p4) {if (obx_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_OBEX, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define OBX_TRACE_WARNING5(m,p1,p2,p3,p4,p5) {if (obx_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_OBEX, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define OBX_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (obx_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_OBEX, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define OBX_TRACE_EVENT0(m) {if (obx_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_OBEX, TRACE_TYPE_EVENT, m);}
-#define OBX_TRACE_EVENT1(m,p1) {if (obx_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_OBEX, TRACE_TYPE_EVENT, m, p1);}
-#define OBX_TRACE_EVENT2(m,p1,p2) {if (obx_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_OBEX, TRACE_TYPE_EVENT, m,p1,p2);}
-#define OBX_TRACE_EVENT3(m,p1,p2,p3) {if (obx_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_OBEX, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define OBX_TRACE_EVENT4(m,p1,p2,p3,p4) {if (obx_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_OBEX, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define OBX_TRACE_EVENT5(m,p1,p2,p3,p4,p5) {if (obx_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_OBEX, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define OBX_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6) {if (obx_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_OBEX, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define OBX_TRACE_DEBUG0(m) {if (obx_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_OBEX, TRACE_TYPE_DEBUG, m);}
-#define OBX_TRACE_DEBUG1(m,p1) {if (obx_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_OBEX, TRACE_TYPE_DEBUG, m,p1);}
-#define OBX_TRACE_DEBUG2(m,p1,p2) {if (obx_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_OBEX, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define OBX_TRACE_DEBUG3(m,p1,p2,p3) {if (obx_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_OBEX, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define OBX_TRACE_DEBUG4(m,p1,p2,p3,p4) {if (obx_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_OBEX, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define OBX_TRACE_DEBUG5(m,p1,p2,p3,p4,p5) {if (obx_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_OBEX, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define OBX_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6) {if (obx_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_OBEX, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-#define OBX_TRACE_API0(m) {if (obx_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_OBEX, TRACE_TYPE_API, m);}
-#define OBX_TRACE_API1(m,p1) {if (obx_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_OBEX, TRACE_TYPE_API, m, p1);}
-#define OBX_TRACE_API2(m,p1,p2) {if (obx_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_OBEX, TRACE_TYPE_API, m,p1,p2);}
-#define OBX_TRACE_API3(m,p1,p2,p3) {if (obx_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_OBEX, TRACE_TYPE_API, m,p1,p2,p3);}
-#define OBX_TRACE_API4(m,p1,p2,p3,p4) {if (obx_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_OBEX, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define OBX_TRACE_API5(m,p1,p2,p3,p4,p5) {if (obx_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_OBEX, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define OBX_TRACE_API6(m,p1,p2,p3,p4,p5,p6) {if (obx_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_OBEX, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-/* Define tracing for OBEX application profiles
-*/
-#define GOEP_TRACE_ERROR0(m) {if (goep_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_GOEP, TRACE_TYPE_ERROR, m);}
-#define GOEP_TRACE_ERROR1(m,p1) {if (goep_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_GOEP, TRACE_TYPE_ERROR, m,p1);}
-#define GOEP_TRACE_ERROR2(m,p1,p2) {if (goep_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_GOEP, TRACE_TYPE_ERROR, m,p1,p2);}
-#define GOEP_TRACE_ERROR3(m,p1,p2,p3) {if (goep_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_GOEP, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define GOEP_TRACE_ERROR4(m,p1,p2,p3,p4) {if (goep_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_GOEP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define GOEP_TRACE_ERROR5(m,p1,p2,p3,p4,p5) {if (goep_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_GOEP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define GOEP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6) {if (goep_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_GOEP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define GOEP_TRACE_WARNING0(m) {if (goep_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_GOEP, TRACE_TYPE_WARNING, m);}
-#define GOEP_TRACE_WARNING1(m,p1) {if (goep_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_GOEP, TRACE_TYPE_WARNING, m,p1);}
-#define GOEP_TRACE_WARNING2(m,p1,p2) {if (goep_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_GOEP, TRACE_TYPE_WARNING, m,p1,p2);}
-#define GOEP_TRACE_WARNING3(m,p1,p2,p3) {if (goep_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_GOEP, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define GOEP_TRACE_WARNING4(m,p1,p2,p3,p4) {if (goep_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_GOEP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define GOEP_TRACE_WARNING5(m,p1,p2,p3,p4,p5) {if (goep_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_GOEP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define GOEP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (goep_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_GOEP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define GOEP_TRACE_EVENT0(m) {if (goep_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_GOEP, TRACE_TYPE_EVENT, m);}
-#define GOEP_TRACE_EVENT1(m,p1) {if (goep_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_GOEP, TRACE_TYPE_EVENT, m, p1);}
-#define GOEP_TRACE_EVENT2(m,p1,p2) {if (goep_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_GOEP, TRACE_TYPE_EVENT, m,p1,p2);}
-#define GOEP_TRACE_EVENT3(m,p1,p2,p3) {if (goep_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_GOEP, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define GOEP_TRACE_EVENT4(m,p1,p2,p3,p4) {if (goep_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_GOEP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define GOEP_TRACE_EVENT5(m,p1,p2,p3,p4,p5) {if (goep_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_GOEP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define GOEP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6) {if (goep_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_GOEP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define GOEP_TRACE_DEBUG0(m) {if (goep_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_GOEP, TRACE_TYPE_DEBUG, m);}
-#define GOEP_TRACE_DEBUG1(m,p1) {if (goep_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_GOEP, TRACE_TYPE_DEBUG, m,p1);}
-#define GOEP_TRACE_DEBUG2(m,p1,p2) {if (goep_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_GOEP, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define GOEP_TRACE_DEBUG3(m,p1,p2,p3) {if (goep_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_GOEP, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define GOEP_TRACE_DEBUG4(m,p1,p2,p3,p4) {if (goep_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_GOEP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define GOEP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5) {if (goep_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_GOEP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define GOEP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6) {if (goep_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_GOEP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-#define GOEP_TRACE_API0(m) {if (goep_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_GOEP, TRACE_TYPE_API, m);}
-#define GOEP_TRACE_API1(m,p1) {if (goep_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_GOEP, TRACE_TYPE_API, m, p1);}
-#define GOEP_TRACE_API2(m,p1,p2) {if (goep_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_GOEP, TRACE_TYPE_API, m,p1,p2);}
-#define GOEP_TRACE_API3(m,p1,p2,p3) {if (goep_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_GOEP, TRACE_TYPE_API, m,p1,p2,p3);}
-#define GOEP_TRACE_API4(m,p1,p2,p3,p4) {if (goep_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_GOEP, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define GOEP_TRACE_API5(m,p1,p2,p3,p4,p5) {if (goep_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_GOEP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define GOEP_TRACE_API6(m,p1,p2,p3,p4,p5,p6) {if (goep_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_GOEP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-/* Define tracing for the BPP profile
-*/
-#define BPP_TRACE_ERROR0(m) {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_BPP, TRACE_TYPE_ERROR, m);}
-#define BPP_TRACE_ERROR1(m,p1) {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_BPP, TRACE_TYPE_ERROR, m,p1);}
-#define BPP_TRACE_ERROR2(m,p1,p2) {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_BPP, TRACE_TYPE_ERROR, m,p1,p2);}
-#define BPP_TRACE_ERROR3(m,p1,p2,p3) {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_BPP, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define BPP_TRACE_ERROR4(m,p1,p2,p3,p4) {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_BPP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define BPP_TRACE_ERROR5(m,p1,p2,p3,p4,p5) {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_BPP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define BPP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6) {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_BPP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define BPP_TRACE_WARNING0(m) {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_BPP, TRACE_TYPE_WARNING, m);}
-#define BPP_TRACE_WARNING1(m,p1) {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_BPP, TRACE_TYPE_WARNING, m,p1);}
-#define BPP_TRACE_WARNING2(m,p1,p2) {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_BPP, TRACE_TYPE_WARNING, m,p1,p2);}
-#define BPP_TRACE_WARNING3(m,p1,p2,p3) {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_BPP, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define BPP_TRACE_WARNING4(m,p1,p2,p3,p4) {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_BPP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define BPP_TRACE_WARNING5(m,p1,p2,p3,p4,p5) {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_BPP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define BPP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_BPP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define BPP_TRACE_EVENT0(m) {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_BPP, TRACE_TYPE_EVENT, m);}
-#define BPP_TRACE_EVENT1(m,p1) {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_BPP, TRACE_TYPE_EVENT, m, p1);}
-#define BPP_TRACE_EVENT2(m,p1,p2) {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_BPP, TRACE_TYPE_EVENT, m,p1,p2);}
-#define BPP_TRACE_EVENT3(m,p1,p2,p3) {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_BPP, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define BPP_TRACE_EVENT4(m,p1,p2,p3,p4) {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_BPP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define BPP_TRACE_EVENT5(m,p1,p2,p3,p4,p5) {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_BPP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define BPP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6) {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_BPP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define BPP_TRACE_DEBUG0(m) {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_BPP, TRACE_TYPE_DEBUG, m);}
-#define BPP_TRACE_DEBUG1(m,p1) {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_BPP, TRACE_TYPE_DEBUG, m,p1);}
-#define BPP_TRACE_DEBUG2(m,p1,p2) {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_BPP, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define BPP_TRACE_DEBUG3(m,p1,p2,p3) {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_BPP, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define BPP_TRACE_DEBUG4(m,p1,p2,p3,p4) {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_BPP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define BPP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5) {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_BPP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define BPP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6) {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_BPP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-#define BPP_TRACE_API0(m) {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_BPP, TRACE_TYPE_API, m);}
-#define BPP_TRACE_API1(m,p1) {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_BPP, TRACE_TYPE_API, m, p1);}
-#define BPP_TRACE_API2(m,p1,p2) {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_BPP, TRACE_TYPE_API, m,p1,p2);}
-#define BPP_TRACE_API3(m,p1,p2,p3) {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_BPP, TRACE_TYPE_API, m,p1,p2,p3);}
-#define BPP_TRACE_API4(m,p1,p2,p3,p4) {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_BPP, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define BPP_TRACE_API5(m,p1,p2,p3,p4,p5) {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_BPP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define BPP_TRACE_API6(m,p1,p2,p3,p4,p5,p6) {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_BPP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-/* Define tracing for the BIP profile
-*/
-#define BIP_TRACE_ERROR0(m) {if (bip_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_BIP, TRACE_TYPE_ERROR, m);}
-#define BIP_TRACE_ERROR1(m,p1) {if (bip_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_BIP, TRACE_TYPE_ERROR, m,p1);}
-#define BIP_TRACE_ERROR2(m,p1,p2) {if (bip_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_BIP, TRACE_TYPE_ERROR, m,p1,p2);}
-#define BIP_TRACE_ERROR3(m,p1,p2,p3) {if (bip_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_BIP, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define BIP_TRACE_ERROR4(m,p1,p2,p3,p4) {if (bip_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_BIP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define BIP_TRACE_ERROR5(m,p1,p2,p3,p4,p5) {if (bip_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_BIP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define BIP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6) {if (bip_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_BIP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define BIP_TRACE_WARNING0(m) {if (bip_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_BIP, TRACE_TYPE_WARNING, m);}
-#define BIP_TRACE_WARNING1(m,p1) {if (bip_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_BIP, TRACE_TYPE_WARNING, m,p1);}
-#define BIP_TRACE_WARNING2(m,p1,p2) {if (bip_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_BIP, TRACE_TYPE_WARNING, m,p1,p2);}
-#define BIP_TRACE_WARNING3(m,p1,p2,p3) {if (bip_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_BIP, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define BIP_TRACE_WARNING4(m,p1,p2,p3,p4) {if (bip_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_BIP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define BIP_TRACE_WARNING5(m,p1,p2,p3,p4,p5) {if (bip_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_BIP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define BIP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (bip_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_BIP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define BIP_TRACE_EVENT0(m) {if (bip_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_BIP, TRACE_TYPE_EVENT, m);}
-#define BIP_TRACE_EVENT1(m,p1) {if (bip_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_BIP, TRACE_TYPE_EVENT, m, p1);}
-#define BIP_TRACE_EVENT2(m,p1,p2) {if (bip_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_BIP, TRACE_TYPE_EVENT, m,p1,p2);}
-#define BIP_TRACE_EVENT3(m,p1,p2,p3) {if (bip_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_BIP, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define BIP_TRACE_EVENT4(m,p1,p2,p3,p4) {if (bip_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_BIP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define BIP_TRACE_EVENT5(m,p1,p2,p3,p4,p5) {if (bip_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_BIP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define BIP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6) {if (bip_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_BIP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define BIP_TRACE_DEBUG0(m) {if (bip_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_BIP, TRACE_TYPE_DEBUG, m);}
-#define BIP_TRACE_DEBUG1(m,p1) {if (bip_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_BIP, TRACE_TYPE_DEBUG, m,p1);}
-#define BIP_TRACE_DEBUG2(m,p1,p2) {if (bip_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_BIP, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define BIP_TRACE_DEBUG3(m,p1,p2,p3) {if (bip_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_BIP, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define BIP_TRACE_DEBUG4(m,p1,p2,p3,p4) {if (bip_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_BIP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define BIP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5) {if (bip_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_BIP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define BIP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6) {if (bip_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_BIP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-#define BIP_TRACE_API0(m) {if (bip_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_BIP, TRACE_TYPE_API, m);}
-#define BIP_TRACE_API1(m,p1) {if (bip_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_BIP, TRACE_TYPE_API, m, p1);}
-#define BIP_TRACE_API2(m,p1,p2) {if (bip_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_BIP, TRACE_TYPE_API, m,p1,p2);}
-#define BIP_TRACE_API3(m,p1,p2,p3) {if (bip_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_BIP, TRACE_TYPE_API, m,p1,p2,p3);}
-#define BIP_TRACE_API4(m,p1,p2,p3,p4) {if (bip_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_BIP, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define BIP_TRACE_API5(m,p1,p2,p3,p4,p5) {if (bip_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_BIP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define BIP_TRACE_API6(m,p1,p2,p3,p4,p5,p6) {if (bip_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_BIP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-/* Define tracing for TCS
-*/
-#define TCS_TRACE_ERROR0(m) {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_TCS, TRACE_TYPE_ERROR, m);}
-#define TCS_TRACE_ERROR1(m,p1) {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_TCS, TRACE_TYPE_ERROR, m,p1);}
-#define TCS_TRACE_ERROR2(m,p1,p2) {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_TCS, TRACE_TYPE_ERROR, m,p1,p2);}
-#define TCS_TRACE_ERROR3(m,p1,p2,p3) {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_TCS, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define TCS_TRACE_ERROR4(m,p1,p2,p3,p4) {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_TCS, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define TCS_TRACE_ERROR5(m,p1,p2,p3,p4,p5) {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_TCS, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define TCS_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6) {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_TCS, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define TCS_TRACE_WARNING0(m) {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_TCS, TRACE_TYPE_WARNING, m);}
-#define TCS_TRACE_WARNING1(m,p1) {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_TCS, TRACE_TYPE_WARNING, m,p1);}
-#define TCS_TRACE_WARNING2(m,p1,p2) {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_TCS, TRACE_TYPE_WARNING, m,p1,p2);}
-#define TCS_TRACE_WARNING3(m,p1,p2,p3) {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_TCS, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define TCS_TRACE_WARNING4(m,p1,p2,p3,p4) {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_TCS, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define TCS_TRACE_WARNING5(m,p1,p2,p3,p4,p5) {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_TCS, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define TCS_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_TCS, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define TCS_TRACE_EVENT0(m) {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_TCS, TRACE_TYPE_EVENT, m);}
-#define TCS_TRACE_EVENT1(m,p1) {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_TCS, TRACE_TYPE_EVENT, m, p1);}
-#define TCS_TRACE_EVENT2(m,p1,p2) {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_TCS, TRACE_TYPE_EVENT, m,p1,p2);}
-#define TCS_TRACE_EVENT3(m,p1,p2,p3) {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_TCS, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define TCS_TRACE_EVENT4(m,p1,p2,p3,p4) {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_TCS, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define TCS_TRACE_EVENT5(m,p1,p2,p3,p4,p5) {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_TCS, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define TCS_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6) {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_TCS, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define TCS_TRACE_DEBUG0(m) {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_TCS, TRACE_TYPE_DEBUG, m);}
-#define TCS_TRACE_DEBUG1(m,p1) {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_TCS, TRACE_TYPE_DEBUG, m,p1);}
-#define TCS_TRACE_DEBUG2(m,p1,p2) {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_TCS, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define TCS_TRACE_DEBUG3(m,p1,p2,p3) {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_TCS, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define TCS_TRACE_DEBUG4(m,p1,p2,p3,p4) {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_TCS, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define TCS_TRACE_DEBUG5(m,p1,p2,p3,p4,p5) {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_TCS, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define TCS_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6) {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_TCS, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-#define TCS_TRACE_API0(m) {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_TCS, TRACE_TYPE_API, m);}
-#define TCS_TRACE_API1(m,p1) {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_TCS, TRACE_TYPE_API, m, p1);}
-#define TCS_TRACE_API2(m,p1,p2) {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_TCS, TRACE_TYPE_API, m,p1,p2);}
-#define TCS_TRACE_API3(m,p1,p2,p3) {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_TCS, TRACE_TYPE_API, m,p1,p2,p3);}
-#define TCS_TRACE_API4(m,p1,p2,p3,p4) {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_TCS, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define TCS_TRACE_API5(m,p1,p2,p3,p4,p5) {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_TCS, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define TCS_TRACE_API6(m,p1,p2,p3,p4,p5,p6) {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_TCS, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-/* Define tracing for ICP
-*/
-#define ICP_TRACE_ERROR0(m) {if (icp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_ICP, TRACE_TYPE_ERROR, m);}
-#define ICP_TRACE_ERROR1(m,p1) {if (icp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_ICP, TRACE_TYPE_ERROR, m,p1);}
-#define ICP_TRACE_ERROR2(m,p1,p2) {if (icp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_ICP, TRACE_TYPE_ERROR, m,p1,p2);}
-#define ICP_TRACE_ERROR3(m,p1,p2,p3) {if (icp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_ICP, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define ICP_TRACE_ERROR4(m,p1,p2,p3,p4) {if (icp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_ICP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define ICP_TRACE_ERROR5(m,p1,p2,p3,p4,p5) {if (icp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_ICP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define ICP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6) {if (icp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_ICP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define ICP_TRACE_WARNING0(m) {if (icp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_ICP, TRACE_TYPE_WARNING, m);}
-#define ICP_TRACE_WARNING1(m,p1) {if (icp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_ICP, TRACE_TYPE_WARNING, m,p1);}
-#define ICP_TRACE_WARNING2(m,p1,p2) {if (icp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_ICP, TRACE_TYPE_WARNING, m,p1,p2);}
-#define ICP_TRACE_WARNING3(m,p1,p2,p3) {if (icp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_ICP, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define ICP_TRACE_WARNING4(m,p1,p2,p3,p4) {if (icp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_ICP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define ICP_TRACE_WARNING5(m,p1,p2,p3,p4,p5) {if (icp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_ICP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define ICP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (icp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_ICP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define ICP_TRACE_EVENT0(m) {if (icp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_ICP, TRACE_TYPE_EVENT, m);}
-#define ICP_TRACE_EVENT1(m,p1) {if (icp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_ICP, TRACE_TYPE_EVENT, m, p1);}
-#define ICP_TRACE_EVENT2(m,p1,p2) {if (icp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_ICP, TRACE_TYPE_EVENT, m,p1,p2);}
-#define ICP_TRACE_EVENT3(m,p1,p2,p3) {if (icp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_ICP, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define ICP_TRACE_EVENT4(m,p1,p2,p3,p4) {if (icp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_ICP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define ICP_TRACE_EVENT5(m,p1,p2,p3,p4,p5) {if (icp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_ICP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define ICP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6) {if (icp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_ICP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define ICP_TRACE_DEBUG0(m) {if (icp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_ICP, TRACE_TYPE_DEBUG, m);}
-#define ICP_TRACE_DEBUG1(m,p1) {if (icp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_ICP, TRACE_TYPE_DEBUG, m,p1);}
-#define ICP_TRACE_DEBUG2(m,p1,p2) {if (icp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_ICP, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define ICP_TRACE_DEBUG3(m,p1,p2,p3) {if (icp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_ICP, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define ICP_TRACE_DEBUG4(m,p1,p2,p3,p4) {if (icp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_ICP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define ICP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5) {if (icp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_ICP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define ICP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6) {if (icp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_ICP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-#define ICP_TRACE_API0(m) {if (icp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_ICP, TRACE_TYPE_API, m);}
-#define ICP_TRACE_API1(m,p1) {if (icp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_ICP, TRACE_TYPE_API, m, p1);}
-#define ICP_TRACE_API2(m,p1,p2) {if (icp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_ICP, TRACE_TYPE_API, m,p1,p2);}
-#define ICP_TRACE_API3(m,p1,p2,p3) {if (icp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_ICP, TRACE_TYPE_API, m,p1,p2,p3);}
-#define ICP_TRACE_API4(m,p1,p2,p3,p4) {if (icp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_ICP, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define ICP_TRACE_API5(m,p1,p2,p3,p4,p5) {if (icp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_ICP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define ICP_TRACE_API6(m,p1,p2,p3,p4,p5,p6) {if (icp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_ICP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-/* CTP */
-#define CTP_TRACE_ERROR0(m) {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_CTP, TRACE_TYPE_ERROR, m);}
-#define CTP_TRACE_ERROR1(m,p1) {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_CTP, TRACE_TYPE_ERROR, m,p1);}
-#define CTP_TRACE_ERROR2(m,p1,p2) {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_CTP, TRACE_TYPE_ERROR, m,p1,p2);}
-#define CTP_TRACE_ERROR3(m,p1,p2,p3) {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_CTP, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define CTP_TRACE_ERROR4(m,p1,p2,p3,p4) {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_CTP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define CTP_TRACE_ERROR5(m,p1,p2,p3,p4,p5) {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_CTP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define CTP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6) {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_CTP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define CTP_TRACE_WARNING0(m) {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_CTP, TRACE_TYPE_WARNING, m);}
-#define CTP_TRACE_WARNING1(m,p1) {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_CTP, TRACE_TYPE_WARNING, m,p1);}
-#define CTP_TRACE_WARNING2(m,p1,p2) {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_CTP, TRACE_TYPE_WARNING, m,p1,p2);}
-#define CTP_TRACE_WARNING3(m,p1,p2,p3) {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_CTP, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define CTP_TRACE_WARNING4(m,p1,p2,p3,p4) {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_CTP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define CTP_TRACE_WARNING5(m,p1,p2,p3,p4,p5) {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_CTP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define CTP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_CTP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define CTP_TRACE_EVENT0(m) {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_CTP, TRACE_TYPE_EVENT, m);}
-#define CTP_TRACE_EVENT1(m,p1) {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_CTP, TRACE_TYPE_EVENT, m, p1);}
-#define CTP_TRACE_EVENT2(m,p1,p2) {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_CTP, TRACE_TYPE_EVENT, m,p1,p2);}
-#define CTP_TRACE_EVENT3(m,p1,p2,p3) {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_CTP, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define CTP_TRACE_EVENT4(m,p1,p2,p3,p4) {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_CTP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define CTP_TRACE_EVENT5(m,p1,p2,p3,p4,p5) {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_CTP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define CTP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6) {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_CTP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define CTP_TRACE_DEBUG0(m) {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_CTP, TRACE_TYPE_DEBUG, m);}
-#define CTP_TRACE_DEBUG1(m,p1) {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_CTP, TRACE_TYPE_DEBUG, m,p1);}
-#define CTP_TRACE_DEBUG2(m,p1,p2) {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_CTP, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define CTP_TRACE_DEBUG3(m,p1,p2,p3) {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_CTP, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define CTP_TRACE_DEBUG4(m,p1,p2,p3,p4) {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_CTP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define CTP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5) {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_CTP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define CTP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6) {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_CTP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
+#define GAP_TRACE_ERROR(...) {if (gap_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_GAP, TRACE_TYPE_ERROR, ##__VA_ARGS__);}
+#define GAP_TRACE_EVENT(...) {if (gap_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_GAP, TRACE_TYPE_EVENT, ##__VA_ARGS__);}
+#define GAP_TRACE_API(...) {if (gap_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_GAP, TRACE_TYPE_API, ##__VA_ARGS__);}
+#define GAP_TRACE_WARNING(...) {if (gap_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_GAP, TRACE_TYPE_WARNING, ##__VA_ARGS__);}
/* define traces for HID Host */
-#define HIDH_TRACE_ERROR0(m) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_HID, TRACE_TYPE_ERROR, m);}
-#define HIDH_TRACE_ERROR1(m,p1) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_HID, TRACE_TYPE_ERROR, m, p1);}
-#define HIDH_TRACE_ERROR2(m,p1,p2) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_HID, TRACE_TYPE_ERROR, m,p1,p2);}
-#define HIDH_TRACE_ERROR3(m,p1,p2,p3) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_HID, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define HIDH_TRACE_ERROR4(m,p1,p2,p3,p4) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_HID, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define HIDH_TRACE_ERROR5(m,p1,p2,p3,p4,p5) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_HID, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define HIDH_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_HID, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define HIDH_TRACE_WARNING0(m) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_HID, TRACE_TYPE_WARNING, m);}
-#define HIDH_TRACE_WARNING1(m,p1) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_HID, TRACE_TYPE_WARNING, m,p1);}
-#define HIDH_TRACE_WARNING2(m,p1,p2) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_HID, TRACE_TYPE_WARNING, m,p1,p2);}
-#define HIDH_TRACE_WARNING3(m,p1,p2,p3) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_HID, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define HIDH_TRACE_WARNING4(m,p1,p2,p3,p4) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_HID, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define HIDH_TRACE_WARNING5(m,p1,p2,p3,p4,p5) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_HID, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define HIDH_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_HID, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define HIDH_TRACE_API0(m) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_HID, TRACE_TYPE_API, m);}
-#define HIDH_TRACE_API1(m,p1) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_HID, TRACE_TYPE_API, m, p1);}
-#define HIDH_TRACE_API2(m,p1,p2) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_HID, TRACE_TYPE_API, m,p1,p2);}
-#define HIDH_TRACE_API3(m,p1,p2,p3) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_HID, TRACE_TYPE_API, m,p1,p2,p3);}
-#define HIDH_TRACE_API4(m,p1,p2,p3,p4) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_HID, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define HIDH_TRACE_API5(m,p1,p2,p3,p4,p5) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_HID, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define HIDH_TRACE_API6(m,p1,p2,p3,p4,p5,p6) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_HID, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-#define HIDH_TRACE_EVENT0(m) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_HID, TRACE_TYPE_EVENT, m);}
-#define HIDH_TRACE_EVENT1(m,p1) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_HID, TRACE_TYPE_EVENT, m, p1);}
-#define HIDH_TRACE_EVENT2(m,p1,p2) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_HID, TRACE_TYPE_EVENT, m,p1,p2);}
-#define HIDH_TRACE_EVENT3(m,p1,p2,p3) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_HID, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define HIDH_TRACE_EVENT4(m,p1,p2,p3,p4) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_HID, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define HIDH_TRACE_EVENT5(m,p1,p2,p3,p4,p5) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_HID, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define HIDH_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_HID, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define HIDH_TRACE_DEBUG0(m) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_HID, TRACE_TYPE_DEBUG, m);}
-#define HIDH_TRACE_DEBUG1(m,p1) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_HID, TRACE_TYPE_DEBUG, m,p1);}
-#define HIDH_TRACE_DEBUG2(m,p1,p2) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_HID, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define HIDH_TRACE_DEBUG3(m,p1,p2,p3) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_HID, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define HIDH_TRACE_DEBUG4(m,p1,p2,p3,p4) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_HID, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define HIDH_TRACE_DEBUG5(m,p1,p2,p3,p4,p5) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_HID, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define HIDH_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_HID, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-/* define traces for HID Device */
-#define HIDD_TRACE_ERROR0(m) {if (hd_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_HID, TRACE_TYPE_ERROR, m);}
-#define HIDD_TRACE_ERROR1(m,p1) {if (hd_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_HID, TRACE_TYPE_ERROR, m, p1);}
-#define HIDD_TRACE_ERROR2(m,p1,p2) {if (hd_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_HID, TRACE_TYPE_ERROR, m,p1,p2);}
-#define HIDD_TRACE_ERROR3(m,p1,p2,p3) {if (hd_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_HID, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define HIDD_TRACE_ERROR4(m,p1,p2,p3,p4) {if (hd_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_HID, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define HIDD_TRACE_ERROR5(m,p1,p2,p3,p4,p5) {if (hd_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_HID, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define HIDD_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6) {if (hd_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_HID, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define HIDD_TRACE_WARNING0(m) {if (hd_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_HID, TRACE_TYPE_WARNING, m);}
-#define HIDD_TRACE_WARNING1(m,p1) {if (hd_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_HID, TRACE_TYPE_WARNING, m,p1);}
-#define HIDD_TRACE_WARNING2(m,p1,p2) {if (hd_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_HID, TRACE_TYPE_WARNING, m,p1,p2);}
-#define HIDD_TRACE_WARNING3(m,p1,p2,p3) {if (hd_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_HID, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define HIDD_TRACE_WARNING4(m,p1,p2,p3,p4) {if (hd_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_HID, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define HIDD_TRACE_WARNING5(m,p1,p2,p3,p4,p5) {if (hd_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_HID, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define HIDD_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (hd_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_HID, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define HIDD_TRACE_API0(m) {if (hd_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_HID, TRACE_TYPE_API, m);}
-#define HIDD_TRACE_API1(m,p1) {if (hd_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_HID, TRACE_TYPE_API, m, p1);}
-#define HIDD_TRACE_API2(m,p1,p2) {if (hd_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_HID, TRACE_TYPE_API, m,p1,p2);}
-#define HIDD_TRACE_API3(m,p1,p2,p3) {if (hd_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_HID, TRACE_TYPE_API, m,p1,p2,p3);}
-#define HIDD_TRACE_API4(m,p1,p2,p3,p4) {if (hd_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_HID, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define HIDD_TRACE_API5(m,p1,p2,p3,p4,p5) {if (hd_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_HID, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define HIDD_TRACE_API6(m,p1,p2,p3,p4,p5,p6) {if (hd_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_HID, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-#define HIDD_TRACE_EVENT0(m) {if (hd_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_HID, TRACE_TYPE_EVENT, m);}
-#define HIDD_TRACE_EVENT1(m,p1) {if (hd_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_HID, TRACE_TYPE_EVENT, m, p1);}
-#define HIDD_TRACE_EVENT2(m,p1,p2) {if (hd_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_HID, TRACE_TYPE_EVENT, m,p1,p2);}
-#define HIDD_TRACE_EVENT3(m,p1,p2,p3) {if (hd_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_HID, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define HIDD_TRACE_EVENT4(m,p1,p2,p3,p4) {if (hd_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_HID, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define HIDD_TRACE_EVENT5(m,p1,p2,p3,p4,p5) {if (hd_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_HID, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define HIDD_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6) {if (hd_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_HID, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define HIDD_TRACE_DEBUG0(m) {if (hd_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_HID, TRACE_TYPE_DEBUG, m);}
-#define HIDD_TRACE_DEBUG1(m,p1) {if (hd_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_HID, TRACE_TYPE_DEBUG, m,p1);}
-#define HIDD_TRACE_DEBUG2(m,p1,p2) {if (hd_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_HID, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define HIDD_TRACE_DEBUG3(m,p1,p2,p3) {if (hd_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_HID, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define HIDD_TRACE_DEBUG4(m,p1,p2,p3,p4) {if (hd_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_HID, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define HIDD_TRACE_DEBUG5(m,p1,p2,p3,p4,p5) {if (hd_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_HID, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define HIDD_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6) {if (hd_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_HID, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-/* define traces for headset profile */
-#define HSP2_TRACE_ERROR0(pcb,m) {if (pcb->trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_HSP2, TRACE_TYPE_ERROR, m);}
-#define HSP2_TRACE_ERROR1(pcb,m,p1) {if (pcb->trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_HSP2, TRACE_TYPE_ERROR, m, p1);}
-#define HSP2_TRACE_ERROR2(pcb,m,p1,p2) {if (pcb->trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_HSP2, TRACE_TYPE_ERROR, m,p1,p2);}
-#define HSP2_TRACE_ERROR3(pcb,m,p1,p2,p3) {if (pcb->trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_HSP2, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define HSP2_TRACE_ERROR4(pcb,m,p1,p2,p3,p4) {if (pcb->trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_HSP2, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define HSP2_TRACE_ERROR5(pcb,m,p1,p2,p3,p4,p5) {if (pcb->trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_HSP2, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define HSP2_TRACE_ERROR6(pcb,m,p1,p2,p3,p4,p5,p6) {if (pcb->trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_HSP2, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define HSP2_TRACE_WARNING0(pcb,m) {if (pcb->trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_HSP2, TRACE_TYPE_WARNING, m);}
-#define HSP2_TRACE_WARNING1(pcb,m,p1) {if (pcb->trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_HSP2, TRACE_TYPE_WARNING, m,p1);}
-#define HSP2_TRACE_WARNING2(pcb,m,p1,p2) {if (pcb->trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_HSP2, TRACE_TYPE_WARNING, m,p1,p2);}
-#define HSP2_TRACE_WARNING3(pcb,m,p1,p2,p3) {if (pcb->trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_HSP2, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define HSP2_TRACE_WARNING4(pcb,m,p1,p2,p3,p4) {if (pcb->trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_HSP2, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define HSP2_TRACE_WARNING5(pcb,m,p1,p2,p3,p4,p5) {if (pcb->trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_HSP2, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define HSP2_TRACE_WARNING6(pcb,m,p1,p2,p3,p4,p5,p6) {if (pcb->trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_HSP2, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define HSP2_TRACE_API0(pcb,m) {if (pcb->trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_HSP2, TRACE_TYPE_API, m);}
-#define HSP2_TRACE_API1(pcb,m,p1) {if (pcb->trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_HSP2, TRACE_TYPE_API, m, p1);}
-#define HSP2_TRACE_API2(pcb,m,p1,p2) {if (pcb->trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_HSP2, TRACE_TYPE_API, m,p1,p2);}
-#define HSP2_TRACE_API3(pcb,m,p1,p2,p3) {if (pcb->trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_HSP2, TRACE_TYPE_API, m,p1,p2,p3);}
-#define HSP2_TRACE_API4(pcb,m,p1,p2,p3,p4) {if (pcb->trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_HSP2, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define HSP2_TRACE_API5(pcb,m,p1,p2,p3,p4,p5) {if (pcb->trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_HSP2, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define HSP2_TRACE_API6(pcb,m,p1,p2,p3,p4,p5,p6) {if (pcb->trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_HSP2, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-#define HSP2_TRACE_EVENT0(pcb,m) {if (pcb->trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_HSP2, TRACE_TYPE_EVENT, m);}
-#define HSP2_TRACE_EVENT1(pcb,m,p1) {if (pcb->trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_HSP2, TRACE_TYPE_EVENT, m, p1);}
-#define HSP2_TRACE_EVENT2(pcb,m,p1,p2) {if (pcb->trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_HSP2, TRACE_TYPE_EVENT, m,p1,p2);}
-#define HSP2_TRACE_EVENT3(pcb,m,p1,p2,p3) {if (pcb->trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_HSP2, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define HSP2_TRACE_EVENT4(pcb,m,p1,p2,p3,p4) {if (pcb->trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_HSP2, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define HSP2_TRACE_EVENT5(pcb,m,p1,p2,p3,p4,p5) {if (pcb->trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_HSP2, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define HSP2_TRACE_EVENT6(pcb,m,p1,p2,p3,p4,p5,p6) {if (pcb->trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_HSP2, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define HSP2_TRACE_DEBUG0(pcb,m) {if (pcb->trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_HSP2, TRACE_TYPE_DEBUG, m);}
-#define HSP2_TRACE_DEBUG1(pcb,m,p1) {if (pcb->trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_HSP2, TRACE_TYPE_DEBUG, m,p1);}
-#define HSP2_TRACE_DEBUG2(pcb,m,p1,p2) {if (pcb->trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_HSP2, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define HSP2_TRACE_DEBUG3(pcb,m,p1,p2,p3) {if (pcb->trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_HSP2, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define HSP2_TRACE_DEBUG4(pcb,m,p1,p2,p3,p4) {if (pcb->trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_HSP2, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define HSP2_TRACE_DEBUG5(pcb,m,p1,p2,p3,p4,p5) {if (pcb->trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_HSP2, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define HSP2_TRACE_DEBUG6(pcb,m,p1,p2,p3,p4,p5,p6) {if (pcb->trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_HSP2, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-/* Define tracing for the NFC unit
-*/
-#define NFC_TRACE_ERROR0(m) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_NFC, TRACE_TYPE_ERROR, m);}
-#define NFC_TRACE_ERROR1(m,p1) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_NFC, TRACE_TYPE_ERROR, m,p1);}
-#define NFC_TRACE_ERROR2(m,p1,p2) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_NFC, TRACE_TYPE_ERROR, m,p1,p2);}
-#define NFC_TRACE_ERROR3(m,p1,p2,p3) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_NFC, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define NFC_TRACE_ERROR4(m,p1,p2,p3,p4) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_NFC, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define NFC_TRACE_ERROR5(m,p1,p2,p3,p4,p5) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_NFC, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define NFC_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_NFC, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define NFC_TRACE_WARNING0(m) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_NFC, TRACE_TYPE_WARNING, m);}
-#define NFC_TRACE_WARNING1(m,p1) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_NFC, TRACE_TYPE_WARNING, m,p1);}
-#define NFC_TRACE_WARNING2(m,p1,p2) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_NFC, TRACE_TYPE_WARNING, m,p1,p2);}
-#define NFC_TRACE_WARNING3(m,p1,p2,p3) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_NFC, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define NFC_TRACE_WARNING4(m,p1,p2,p3,p4) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_NFC, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define NFC_TRACE_WARNING5(m,p1,p2,p3,p4,p5) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_NFC, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define NFC_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_NFC, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define NFC_TRACE_API0(m) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_NFC, TRACE_TYPE_API, m);}
-#define NFC_TRACE_API1(m,p1) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_NFC, TRACE_TYPE_API, m,p1);}
-#define NFC_TRACE_API2(m,p1,p2) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_NFC, TRACE_TYPE_API, m,p1,p2);}
-#define NFC_TRACE_API3(m,p1,p2,p3) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_NFC, TRACE_TYPE_API, m,p1,p2,p3);}
-#define NFC_TRACE_API4(m,p1,p2,p3,p4) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_NFC, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define NFC_TRACE_API5(m,p1,p2,p3,p4,p5) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_NFC, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define NFC_TRACE_API6(m,p1,p2,p3,p4,p5,p6) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_NFC, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-#define NFC_TRACE_EVENT0(m) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_NFC, TRACE_TYPE_EVENT, m);}
-#define NFC_TRACE_EVENT1(m,p1) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_NFC, TRACE_TYPE_EVENT, m, p1);}
-#define NFC_TRACE_EVENT2(m,p1,p2) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_NFC, TRACE_TYPE_EVENT, m,p1,p2);}
-#define NFC_TRACE_EVENT3(m,p1,p2,p3) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_NFC, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define NFC_TRACE_EVENT4(m,p1,p2,p3,p4) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_NFC, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define NFC_TRACE_EVENT5(m,p1,p2,p3,p4,p5) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_NFC, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define NFC_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_NFC, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define NFC_TRACE_DEBUG0(m) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_NFC, TRACE_TYPE_DEBUG, m);}
-#define NFC_TRACE_DEBUG1(m,p1) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_NFC, TRACE_TYPE_DEBUG, m,p1);}
-#define NFC_TRACE_DEBUG2(m,p1,p2) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_NFC, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define NFC_TRACE_DEBUG3(m,p1,p2,p3) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_NFC, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define NFC_TRACE_DEBUG4(m,p1,p2,p3,p4) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_NFC, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define NFC_TRACE_DEBUG5(m,p1,p2,p3,p4,p5) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_NFC, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define NFC_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_NFC, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-#define NCI_TRACE_ERROR0(m) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_NCI, TRACE_TYPE_ERROR, m);}
-#define NCI_TRACE_ERROR1(m,p1) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_NCI, TRACE_TYPE_ERROR, m,p1);}
-#define NCI_TRACE_ERROR2(m,p1,p2) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_NCI, TRACE_TYPE_ERROR, m,p1,p2);}
-#define NCI_TRACE_ERROR3(m,p1,p2,p3) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_NCI, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define NCI_TRACE_ERROR4(m,p1,p2,p3,p4) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_NCI, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define NCI_TRACE_ERROR5(m,p1,p2,p3,p4,p5) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_NCI, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define NCI_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_NCI, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define NCI_TRACE_WARNING0(m) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_NCI, TRACE_TYPE_WARNING, m);}
-#define NCI_TRACE_WARNING1(m,p1) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_NCI, TRACE_TYPE_WARNING, m,p1);}
-#define NCI_TRACE_WARNING2(m,p1,p2) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_NCI, TRACE_TYPE_WARNING, m,p1,p2);}
-#define NCI_TRACE_WARNING3(m,p1,p2,p3) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_NCI, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define NCI_TRACE_WARNING4(m,p1,p2,p3,p4) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_NCI, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define NCI_TRACE_WARNING5(m,p1,p2,p3,p4,p5) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_NCI, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define NCI_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_NCI, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define NCI_TRACE_API0(m) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_NCI, TRACE_TYPE_API, m);}
-#define NCI_TRACE_API1(m,p1) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_NCI, TRACE_TYPE_API, m,p1);}
-#define NCI_TRACE_API2(m,p1,p2) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_NCI, TRACE_TYPE_API, m,p1,p2);}
-#define NCI_TRACE_API3(m,p1,p2,p3) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_NCI, TRACE_TYPE_API, m,p1,p2,p3);}
-#define NCI_TRACE_API4(m,p1,p2,p3,p4) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_NCI, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define NCI_TRACE_API5(m,p1,p2,p3,p4,p5) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_NCI, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define NCI_TRACE_API6(m,p1,p2,p3,p4,p5,p6) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_NCI, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-#define NCI_TRACE_EVENT0(m) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_NCI, TRACE_TYPE_EVENT, m);}
-#define NCI_TRACE_EVENT1(m,p1) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_NCI, TRACE_TYPE_EVENT, m, p1);}
-#define NCI_TRACE_EVENT2(m,p1,p2) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_NCI, TRACE_TYPE_EVENT, m,p1,p2);}
-#define NCI_TRACE_EVENT3(m,p1,p2,p3) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_NCI, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define NCI_TRACE_EVENT4(m,p1,p2,p3,p4) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_NCI, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define NCI_TRACE_EVENT5(m,p1,p2,p3,p4,p5) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_NCI, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define NCI_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_NCI, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define NCI_TRACE_DEBUG0(m) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_NCI, TRACE_TYPE_DEBUG, m);}
-#define NCI_TRACE_DEBUG1(m,p1) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_NCI, TRACE_TYPE_DEBUG, m,p1);}
-#define NCI_TRACE_DEBUG2(m,p1,p2) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_NCI, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define NCI_TRACE_DEBUG3(m,p1,p2,p3) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_NCI, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define NCI_TRACE_DEBUG4(m,p1,p2,p3,p4) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_NCI, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define NCI_TRACE_DEBUG5(m,p1,p2,p3,p4,p5) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_NCI, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define NCI_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_NCI, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-#define RW_TRACE_ERROR0(m) {if (rw_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_RW, TRACE_TYPE_ERROR, m);}
-#define RW_TRACE_ERROR1(m,p1) {if (rw_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_RW, TRACE_TYPE_ERROR, m,p1);}
-#define RW_TRACE_ERROR2(m,p1,p2) {if (rw_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_RW, TRACE_TYPE_ERROR, m,p1,p2);}
-#define RW_TRACE_ERROR3(m,p1,p2,p3) {if (rw_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_RW, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define RW_TRACE_ERROR4(m,p1,p2,p3,p4) {if (rw_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_RW, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define RW_TRACE_ERROR5(m,p1,p2,p3,p4,p5) {if (rw_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_RW, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define RW_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6) {if (rw_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_RW, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define RW_TRACE_WARNING0(m) {if (rw_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_RW, TRACE_TYPE_WARNING, m);}
-#define RW_TRACE_WARNING1(m,p1) {if (rw_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_RW, TRACE_TYPE_WARNING, m,p1);}
-#define RW_TRACE_WARNING2(m,p1,p2) {if (rw_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_RW, TRACE_TYPE_WARNING, m,p1,p2);}
-#define RW_TRACE_WARNING3(m,p1,p2,p3) {if (rw_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_RW, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define RW_TRACE_WARNING4(m,p1,p2,p3,p4) {if (rw_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_RW, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define RW_TRACE_WARNING5(m,p1,p2,p3,p4,p5) {if (rw_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_RW, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define RW_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (rw_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_RW, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define RW_TRACE_API0(m) {if (rw_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_RW, TRACE_TYPE_API, m);}
-#define RW_TRACE_API1(m,p1) {if (rw_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_RW, TRACE_TYPE_API, m,p1);}
-#define RW_TRACE_API2(m,p1,p2) {if (rw_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_RW, TRACE_TYPE_API, m,p1,p2);}
-#define RW_TRACE_API3(m,p1,p2,p3) {if (rw_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_RW, TRACE_TYPE_API, m,p1,p2,p3);}
-#define RW_TRACE_API4(m,p1,p2,p3,p4) {if (rw_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_RW, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define RW_TRACE_API5(m,p1,p2,p3,p4,p5) {if (rw_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_RW, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define RW_TRACE_API6(m,p1,p2,p3,p4,p5,p6) {if (rw_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_RW, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-#define RW_TRACE_EVENT0(m) {if (rw_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_RW, TRACE_TYPE_EVENT, m);}
-#define RW_TRACE_EVENT1(m,p1) {if (rw_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_RW, TRACE_TYPE_EVENT, m, p1);}
-#define RW_TRACE_EVENT2(m,p1,p2) {if (rw_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_RW, TRACE_TYPE_EVENT, m,p1,p2);}
-#define RW_TRACE_EVENT3(m,p1,p2,p3) {if (rw_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_RW, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define RW_TRACE_EVENT4(m,p1,p2,p3,p4) {if (rw_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_RW, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define RW_TRACE_EVENT5(m,p1,p2,p3,p4,p5) {if (rw_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_RW, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define RW_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6) {if (rw_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_RW, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define RW_TRACE_DEBUG0(m) {if (rw_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_RW, TRACE_TYPE_DEBUG, m);}
-#define RW_TRACE_DEBUG1(m,p1) {if (rw_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_RW, TRACE_TYPE_DEBUG, m,p1);}
-#define RW_TRACE_DEBUG2(m,p1,p2) {if (rw_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_RW, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define RW_TRACE_DEBUG3(m,p1,p2,p3) {if (rw_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_RW, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define RW_TRACE_DEBUG4(m,p1,p2,p3,p4) {if (rw_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_RW, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define RW_TRACE_DEBUG5(m,p1,p2,p3,p4,p5) {if (rw_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_RW, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define RW_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6) {if (rw_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_RW, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-#define CE_TRACE_ERROR0(m) {if (ce_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_CE, TRACE_TYPE_ERROR, m);}
-#define CE_TRACE_ERROR1(m,p1) {if (ce_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_CE, TRACE_TYPE_ERROR, m,p1);}
-#define CE_TRACE_ERROR2(m,p1,p2) {if (ce_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_CE, TRACE_TYPE_ERROR, m,p1,p2);}
-#define CE_TRACE_ERROR3(m,p1,p2,p3) {if (ce_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_CE, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define CE_TRACE_ERROR4(m,p1,p2,p3,p4) {if (ce_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_CE, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define CE_TRACE_ERROR5(m,p1,p2,p3,p4,p5) {if (ce_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_CE, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define CE_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6) {if (ce_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_CE, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define CE_TRACE_WARNING0(m) {if (ce_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_CE, TRACE_TYPE_WARNING, m);}
-#define CE_TRACE_WARNING1(m,p1) {if (ce_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_CE, TRACE_TYPE_WARNING, m,p1);}
-#define CE_TRACE_WARNING2(m,p1,p2) {if (ce_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_CE, TRACE_TYPE_WARNING, m,p1,p2);}
-#define CE_TRACE_WARNING3(m,p1,p2,p3) {if (ce_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_CE, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define CE_TRACE_WARNING4(m,p1,p2,p3,p4) {if (ce_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_CE, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define CE_TRACE_WARNING5(m,p1,p2,p3,p4,p5) {if (ce_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_CE, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define CE_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (ce_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_CE, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define CE_TRACE_API0(m) {if (ce_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_CE, TRACE_TYPE_API, m);}
-#define CE_TRACE_API1(m,p1) {if (ce_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_CE, TRACE_TYPE_API, m,p1);}
-#define CE_TRACE_API2(m,p1,p2) {if (ce_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_CE, TRACE_TYPE_API, m,p1,p2);}
-#define CE_TRACE_API3(m,p1,p2,p3) {if (ce_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_CE, TRACE_TYPE_API, m,p1,p2,p3);}
-#define CE_TRACE_API4(m,p1,p2,p3,p4) {if (ce_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_CE, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define CE_TRACE_API5(m,p1,p2,p3,p4,p5) {if (ce_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_CE, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define CE_TRACE_API6(m,p1,p2,p3,p4,p5,p6) {if (ce_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_CE, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-#define CE_TRACE_EVENT0(m) {if (ce_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_CE, TRACE_TYPE_EVENT, m);}
-#define CE_TRACE_EVENT1(m,p1) {if (ce_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_CE, TRACE_TYPE_EVENT, m, p1);}
-#define CE_TRACE_EVENT2(m,p1,p2) {if (ce_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_CE, TRACE_TYPE_EVENT, m,p1,p2);}
-#define CE_TRACE_EVENT3(m,p1,p2,p3) {if (ce_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_CE, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define CE_TRACE_EVENT4(m,p1,p2,p3,p4) {if (ce_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_CE, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define CE_TRACE_EVENT5(m,p1,p2,p3,p4,p5) {if (ce_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_CE, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define CE_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6) {if (ce_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_CE, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define CE_TRACE_DEBUG0(m) {if (ce_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_CE, TRACE_TYPE_DEBUG, m);}
-#define CE_TRACE_DEBUG1(m,p1) {if (ce_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_CE, TRACE_TYPE_DEBUG, m,p1);}
-#define CE_TRACE_DEBUG2(m,p1,p2) {if (ce_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_CE, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define CE_TRACE_DEBUG3(m,p1,p2,p3) {if (ce_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_CE, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define CE_TRACE_DEBUG4(m,p1,p2,p3,p4) {if (ce_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_CE, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define CE_TRACE_DEBUG5(m,p1,p2,p3,p4,p5) {if (ce_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_CE, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define CE_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6) {if (ce_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_CE, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-#define NDEF_TRACE_ERROR0(m) {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_NDEF, TRACE_TYPE_ERROR, m);}
-#define NDEF_TRACE_ERROR1(m,p1) {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_NDEF, TRACE_TYPE_ERROR, m,p1);}
-#define NDEF_TRACE_ERROR2(m,p1,p2) {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_NDEF, TRACE_TYPE_ERROR, m,p1,p2);}
-#define NDEF_TRACE_ERROR3(m,p1,p2,p3) {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_NDEF, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define NDEF_TRACE_ERROR4(m,p1,p2,p3,p4) {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_NDEF, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define NDEF_TRACE_ERROR5(m,p1,p2,p3,p4,p5) {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_NDEF, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define NDEF_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6) {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_NDEF, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define NDEF_TRACE_WARNING0(m) {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_NDEF, TRACE_TYPE_WARNING, m);}
-#define NDEF_TRACE_WARNING1(m,p1) {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_NDEF, TRACE_TYPE_WARNING, m,p1);}
-#define NDEF_TRACE_WARNING2(m,p1,p2) {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_NDEF, TRACE_TYPE_WARNING, m,p1,p2);}
-#define NDEF_TRACE_WARNING3(m,p1,p2,p3) {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_NDEF, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define NDEF_TRACE_WARNING4(m,p1,p2,p3,p4) {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_NDEF, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define NDEF_TRACE_WARNING5(m,p1,p2,p3,p4,p5) {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_NDEF, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define NDEF_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_NDEF, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define NDEF_TRACE_API0(m) {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_NDEF, TRACE_TYPE_API, m);}
-#define NDEF_TRACE_API1(m,p1) {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_NDEF, TRACE_TYPE_API, m,p1);}
-#define NDEF_TRACE_API2(m,p1,p2) {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_NDEF, TRACE_TYPE_API, m,p1,p2);}
-#define NDEF_TRACE_API3(m,p1,p2,p3) {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_NDEF, TRACE_TYPE_API, m,p1,p2,p3);}
-#define NDEF_TRACE_API4(m,p1,p2,p3,p4) {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_NDEF, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define NDEF_TRACE_API5(m,p1,p2,p3,p4,p5) {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_NDEF, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define NDEF_TRACE_API6(m,p1,p2,p3,p4,p5,p6) {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_NDEF, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-#define NDEF_TRACE_EVENT0(m) {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_NDEF, TRACE_TYPE_EVENT, m);}
-#define NDEF_TRACE_EVENT1(m,p1) {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_NDEF, TRACE_TYPE_EVENT, m, p1);}
-#define NDEF_TRACE_EVENT2(m,p1,p2) {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_NDEF, TRACE_TYPE_EVENT, m,p1,p2);}
-#define NDEF_TRACE_EVENT3(m,p1,p2,p3) {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_NDEF, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define NDEF_TRACE_EVENT4(m,p1,p2,p3,p4) {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_NDEF, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define NDEF_TRACE_EVENT5(m,p1,p2,p3,p4,p5) {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_NDEF, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define NDEF_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6) {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_NDEF, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define NDEF_TRACE_DEBUG0(m) {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_NDEF, TRACE_TYPE_DEBUG, m);}
-#define NDEF_TRACE_DEBUG1(m,p1) {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_NDEF, TRACE_TYPE_DEBUG, m,p1);}
-#define NDEF_TRACE_DEBUG2(m,p1,p2) {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_NDEF, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define NDEF_TRACE_DEBUG3(m,p1,p2,p3) {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_NDEF, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define NDEF_TRACE_DEBUG4(m,p1,p2,p3,p4) {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_NDEF, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define NDEF_TRACE_DEBUG5(m,p1,p2,p3,p4,p5) {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_NDEF, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define NDEF_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6) {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_NDEF, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-/* Define tracing for the NFA unit
-*/
-#define NFA_TRACE_ERROR0(m) {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_NFA, TRACE_TYPE_ERROR, m);}
-#define NFA_TRACE_ERROR1(m,p1) {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_NFA, TRACE_TYPE_ERROR, m,p1);}
-#define NFA_TRACE_ERROR2(m,p1,p2) {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_NFA, TRACE_TYPE_ERROR, m,p1,p2);}
-#define NFA_TRACE_ERROR3(m,p1,p2,p3) {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_NFA, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define NFA_TRACE_ERROR4(m,p1,p2,p3,p4) {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_NFA, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define NFA_TRACE_ERROR5(m,p1,p2,p3,p4,p5) {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_NFA, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define NFA_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6) {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_NFA, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define NFA_TRACE_WARNING0(m) {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_NFA, TRACE_TYPE_WARNING, m);}
-#define NFA_TRACE_WARNING1(m,p1) {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_NFA, TRACE_TYPE_WARNING, m,p1);}
-#define NFA_TRACE_WARNING2(m,p1,p2) {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_NFA, TRACE_TYPE_WARNING, m,p1,p2);}
-#define NFA_TRACE_WARNING3(m,p1,p2,p3) {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_NFA, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define NFA_TRACE_WARNING4(m,p1,p2,p3,p4) {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_NFA, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define NFA_TRACE_WARNING5(m,p1,p2,p3,p4,p5) {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_NFA, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define NFA_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_NFA, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define NFA_TRACE_API0(m) {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_NFA, TRACE_TYPE_API, m);}
-#define NFA_TRACE_API1(m,p1) {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_NFA, TRACE_TYPE_API, m,p1);}
-#define NFA_TRACE_API2(m,p1,p2) {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_NFA, TRACE_TYPE_API, m,p1,p2);}
-#define NFA_TRACE_API3(m,p1,p2,p3) {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_NFA, TRACE_TYPE_API, m,p1,p2,p3);}
-#define NFA_TRACE_API4(m,p1,p2,p3,p4) {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_NFA, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define NFA_TRACE_API5(m,p1,p2,p3,p4,p5) {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_NFA, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define NFA_TRACE_API6(m,p1,p2,p3,p4,p5,p6) {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_NFA, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-#define NFA_TRACE_EVENT0(m) {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_NFA, TRACE_TYPE_EVENT, m);}
-#define NFA_TRACE_EVENT1(m,p1) {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_NFA, TRACE_TYPE_EVENT, m, p1);}
-#define NFA_TRACE_EVENT2(m,p1,p2) {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_NFA, TRACE_TYPE_EVENT, m,p1,p2);}
-#define NFA_TRACE_EVENT3(m,p1,p2,p3) {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_NFA, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define NFA_TRACE_EVENT4(m,p1,p2,p3,p4) {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_NFA, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define NFA_TRACE_EVENT5(m,p1,p2,p3,p4,p5) {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_NFA, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define NFA_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6) {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_NFA, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define NFA_TRACE_DEBUG0(m) {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_NFA, TRACE_TYPE_DEBUG, m);}
-#define NFA_TRACE_DEBUG1(m,p1) {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_NFA, TRACE_TYPE_DEBUG, m,p1);}
-#define NFA_TRACE_DEBUG2(m,p1,p2) {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_NFA, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define NFA_TRACE_DEBUG3(m,p1,p2,p3) {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_NFA, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define NFA_TRACE_DEBUG4(m,p1,p2,p3,p4) {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_NFA, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define NFA_TRACE_DEBUG5(m,p1,p2,p3,p4,p5) {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_NFA, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define NFA_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6) {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_NFA, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-#define MMI_TRACE_0(m)
-#define MMI_TRACE_1(m,p1)
-#define MMI_TRACE_2(m,p1,p2)
-#define MMI_TRACE_3(m,p1,p2,p3)
-#define MMI_TRACE_4(m,p1,p2,p3,p4)
-#define MMI_TRACE_5(m,p1,p2,p3,p4,p5)
-#define MMI_TRACE_6(m,p1,p2,p3,p4,p5,p6)
-
-#define MMI_DEBUG_0(m) BT_TRACE_0(TRACE_LAYER_HID, TRACE_TYPE_DEBUG, m)
-#define MMI_DEBUG_1(m,p1) BT_TRACE_1(TRACE_LAYER_HID, TRACE_TYPE_DEBUG, m,p1)
-#define MMI_DEBUG_2(m,p1,p2) BT_TRACE_2(TRACE_LAYER_HID, TRACE_TYPE_DEBUG, m,p1,p2)
-#define MMI_DEBUG_3(m,p1,p2,p3) BT_TRACE_3(TRACE_LAYER_HID, TRACE_TYPE_DEBUG, m,p1,p2,p3)
-#define MMI_DEBUG_4(m,p1,p2,p3,p4) BT_TRACE_4(TRACE_LAYER_HID, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4)
-#define MMI_DEBUG_5(m,p1,p2,p3,p4,p5) BT_TRACE_5(TRACE_LAYER_HID, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5)
-#define MMI_DEBUG_6(m,p1,p2,p3,p4,p5,p6) BT_TRACE_6(TRACE_LAYER_HID, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6)
-
-#define MMI_WARNING_0(m) BT_TRACE_0(TRACE_LAYER_HID, TRACE_TYPE_WARNING, m)
-#define MMI_WARNING_1(m,p1) BT_TRACE_1(TRACE_LAYER_HID, TRACE_TYPE_WARNING, m,p1)
-#define MMI_WARNING_2(m,p1,p2) BT_TRACE_2(TRACE_LAYER_HID, TRACE_TYPE_WARNING, m,p1,p2)
-#define MMI_WARNING_3(m,p1,p2,p3) BT_TRACE_3(TRACE_LAYER_HID, TRACE_TYPE_WARNING, m,p1,p2,p3)
-#define MMI_WARNING_4(m,p1,p2,p3,p4) BT_TRACE_4(TRACE_LAYER_HID, TRACE_TYPE_WARNING, m,p1,p2,p3,p4)
-#define MMI_WARNING_5(m,p1,p2,p3,p4,p5) BT_TRACE_5(TRACE_LAYER_HID, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5)
-#define MMI_WARNING_6(m,p1,p2,p3,p4,p5,p6) BT_TRACE_6(TRACE_LAYER_HID, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6)
-
-#define MMI_ERROR_0(m) BT_TRACE_0(TRACE_LAYER_HID, TRACE_TYPE_ERROR, m)
-#define MMI_ERROR_1(m,p1) BT_TRACE_1(TRACE_LAYER_HID, TRACE_TYPE_ERROR, m,p1)
-#define MMI_ERROR_2(m,p1,p2) BT_TRACE_2(TRACE_LAYER_HID, TRACE_TYPE_ERROR, m,p1,p2)
-#define MMI_ERROR_3(m,p1,p2,p3) BT_TRACE_3(TRACE_LAYER_HID, TRACE_TYPE_ERROR, m,p1,p2,p3)
-#define MMI_ERROR_4(m,p1,p2,p3,p4) BT_TRACE_4(TRACE_LAYER_HID, TRACE_TYPE_ERROR, m,p1,p2,p3,p4)
-#define MMI_ERROR_5(m,p1,p2,p3,p4,p5) BT_TRACE_5(TRACE_LAYER_HID, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5)
-#define MMI_ERROR_6(m,p1,p2,p3,p4,p5,p6) BT_TRACE_6(TRACE_LAYER_HID, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6)
-
-#define TAK_TRACE_0(m) MMI_Echo(m)
-
-/* hid mouse module traces */
-
-#define MSKB_TRACE_0(m) MMI_Echo(m)
-#define MSKB_TRACE_1(m,p1) MMI_Echo(m,p1)
-#define MSKB_TRACE_2(m,p1,p2) MMI_Echo(m,p1,p2)
-#define MSKB_TRACE_3(m,p1,p2,p3) MMI_Echo(m,p1,p2,p3)
-#define MSKB_TRACE_4(m,p1,p2,p3,p4) MMI_Echo(m,p1,p2,p3,p4)
-#define MSKB_TRACE_5(m,p1,p2,p3,p4,p5) MMI_Echo(m,p1,p2,p3,p4,p5)
-#define MSKB_TRACE_6(m,p1,p2,p3,p4,p5,p6) MMI_Echo(m,p1,p2,p3,p4,p5,p6)
-
-#define MSKB_DEBUG_0(m) MMI_Echo(m)
-#define MSKB_DEBUG_1(m,p1) MMI_Echo(m,p1)
-#define MSKB_DEBUG_2(m,p1,p2) MMI_Echo(m,p1,p2)
-#define MSKB_DEBUG_3(m,p1,p2,p3) MMI_Echo(m,p1,p2,p3)
-#define MSKB_DEBUG_4(m,p1,p2,p3,p4) MMI_Echo(m,p1,p2,p3,p4)
-#define MSKB_DEBUG_5(m,p1,p2,p3,p4,p5) MMI_Echo(m,p1,p2,p3,p4,p5)
-#define MSKB_DEBUG_6(m,p1,p2,p3,p4,p5,p6) MMI_Echo(m,p1,p2,p3,p4,p5,p6)
-
-#define MSKB_ERROR_0(m) MMI_Echo(m)
-#define MSKB_ERROR_1(m,p1) MMI_Echo(m,p1)
-#define MSKB_ERROR_2(m,p1,p2) MMI_Echo(m,p1,p2)
-#define MSKB_ERROR_3(m,p1,p2,p3) MMI_Echo(m,p1,p2,p3)
-#define MSKB_ERROR_4(m,p1,p2,p3,p4) MMI_Echo(m,p1,p2,p3,p4)
-#define MSKB_ERROR_5(m,p1,p2,p3,p4,p5) MMI_Echo(m,p1,p2,p3,p4,p5)
-#define MSKB_ERROR_6(m,p1,p2,p3,p4,p5,p6) MMI_Echo(m,p1,p2,p3,p4,p5,p6)
-
-/* define traces for DUN */
-
-#define DUN_TRACE_ERROR0(m) {if (dun_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_DUN, TRACE_TYPE_ERROR, m);}
-#define DUN_TRACE_ERROR1(m,p1) {if (dun_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_DUN, TRACE_TYPE_ERROR, m, p1);}
-#define DUN_TRACE_ERROR2(m,p1,p2) {if (dun_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_DUN, TRACE_TYPE_ERROR, m,p1,p2);}
-#define DUN_TRACE_ERROR3(m,p1,p2,p3) {if (dun_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_DUN, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define DUN_TRACE_ERROR4(m,p1,p2,p3,p4) {if (dun_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_DUN, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define DUN_TRACE_ERROR5(m,p1,p2,p3,p4,p5) {if (dun_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_DUN, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define DUN_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6) {if (dun_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_DUN, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define DUN_TRACE_WARNING0(m) {if (dun_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_DUN, TRACE_TYPE_WARNING, m);}
-#define DUN_TRACE_WARNING1(m,p1) {if (dun_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_DUN, TRACE_TYPE_WARNING, m,p1);}
-#define DUN_TRACE_WARNING2(m,p1,p2) {if (dun_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_DUN, TRACE_TYPE_WARNING, m,p1,p2);}
-#define DUN_TRACE_WARNING3(m,p1,p2,p3) {if (dun_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_DUN, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define DUN_TRACE_WARNING4(m,p1,p2,p3,p4) {if (dun_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_DUN, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define DUN_TRACE_WARNING5(m,p1,p2,p3,p4,p5) {if (dun_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_DUN, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define DUN_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (dun_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_DUN, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define DUN_TRACE_API0(m) {if (dun_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_DUN, TRACE_TYPE_API, m);}
-#define DUN_TRACE_API1(m,p1) {if (dun_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_DUN, TRACE_TYPE_API, m, p1);}
-#define DUN_TRACE_API2(m,p1,p2) {if (dun_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_DUN, TRACE_TYPE_API, m,p1,p2);}
-#define DUN_TRACE_API3(m,p1,p2,p3) {if (dun_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_DUN, TRACE_TYPE_API, m,p1,p2,p3);}
-#define DUN_TRACE_API4(m,p1,p2,p3,p4) {if (dun_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_DUN, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define DUN_TRACE_API5(m,p1,p2,p3,p4,p5) {if (dun_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_DUN, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define DUN_TRACE_API6(m,p1,p2,p3,p4,p5,p6) {if (dun_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_DUN, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-#define DUN_TRACE_EVENT0(m) {if (dun_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_DUN, TRACE_TYPE_EVENT, m);}
-#define DUN_TRACE_EVENT1(m,p1) {if (dun_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_DUN, TRACE_TYPE_EVENT, m, p1);}
-#define DUN_TRACE_EVENT2(m,p1,p2) {if (dun_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_DUN, TRACE_TYPE_EVENT, m,p1,p2);}
-#define DUN_TRACE_EVENT3(m,p1,p2,p3) {if (dun_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_DUN, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define DUN_TRACE_EVENT4(m,p1,p2,p3,p4) {if (dun_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_DUN, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define DUN_TRACE_EVENT5(m,p1,p2,p3,p4,p5) {if (dun_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_DUN, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define DUN_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6) {if (dun_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_DUN, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define DUN_TRACE_DEBUG0(m) {if (dun_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_DUN, TRACE_TYPE_DEBUG, m);}
-#define DUN_TRACE_DEBUG1(m,p1) {if (dun_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_DUN, TRACE_TYPE_DEBUG, m,p1);}
-#define DUN_TRACE_DEBUG2(m,p1,p2) {if (dun_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_DUN, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define DUN_TRACE_DEBUG3(m,p1,p2,p3) {if (dun_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_DUN, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define DUN_TRACE_DEBUG4(m,p1,p2,p3,p4) {if (dun_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_DUN, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define DUN_TRACE_DEBUG5(m,p1,p2,p3,p4,p5) {if (dun_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_DUN, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define DUN_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6) {if (dun_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_DUN, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-/* define traces for hardcopy cable replacement profile */
-
-#define HCRP_TRACE_ERROR0(m) {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_HCRP, TRACE_TYPE_ERROR, m);}
-#define HCRP_TRACE_ERROR1(m,p1) {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_HCRP, TRACE_TYPE_ERROR, m, p1);}
-#define HCRP_TRACE_ERROR2(m,p1,p2) {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_HCRP, TRACE_TYPE_ERROR, m,p1,p2);}
-#define HCRP_TRACE_ERROR3(m,p1,p2,p3) {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_HCRP, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define HCRP_TRACE_ERROR4(m,p1,p2,p3,p4) {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_HCRP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define HCRP_TRACE_ERROR5(m,p1,p2,p3,p4,p5) {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_HCRP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define HCRP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6) {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_HCRP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define HCRP_TRACE_WARNING0(m) {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_HCRP, TRACE_TYPE_WARNING, m);}
-#define HCRP_TRACE_WARNING1(m,p1) {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_HCRP, TRACE_TYPE_WARNING, m,p1);}
-#define HCRP_TRACE_WARNING2(m,p1,p2) {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_HCRP, TRACE_TYPE_WARNING, m,p1,p2);}
-#define HCRP_TRACE_WARNING3(m,p1,p2,p3) {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_HCRP, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define HCRP_TRACE_WARNING4(m,p1,p2,p3,p4) {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_HCRP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define HCRP_TRACE_WARNING5(m,p1,p2,p3,p4,p5) {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_HCRP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define HCRP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_HCRP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define HCRP_TRACE_API0(m) {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_HCRP, TRACE_TYPE_API, m);}
-#define HCRP_TRACE_API1(m,p1) {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_HCRP, TRACE_TYPE_API, m, p1);}
-#define HCRP_TRACE_API2(m,p1,p2) {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_HCRP, TRACE_TYPE_API, m,p1,p2);}
-#define HCRP_TRACE_API3(m,p1,p2,p3) {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_HCRP, TRACE_TYPE_API, m,p1,p2,p3);}
-#define HCRP_TRACE_API4(m,p1,p2,p3,p4) {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_HCRP, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define HCRP_TRACE_API5(m,p1,p2,p3,p4,p5) {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_HCRP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define HCRP_TRACE_API6(m,p1,p2,p3,p4,p5,p6) {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_HCRP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-#define HCRP_TRACE_EVENT0(m) {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_HCRP, TRACE_TYPE_EVENT, m);}
-#define HCRP_TRACE_EVENT1(m,p1) {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_HCRP, TRACE_TYPE_EVENT, m, p1);}
-#define HCRP_TRACE_EVENT2(m,p1,p2) {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_HCRP, TRACE_TYPE_EVENT, m,p1,p2);}
-#define HCRP_TRACE_EVENT3(m,p1,p2,p3) {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_HCRP, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define HCRP_TRACE_EVENT4(m,p1,p2,p3,p4) {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_HCRP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define HCRP_TRACE_EVENT5(m,p1,p2,p3,p4,p5) {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_HCRP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define HCRP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6) {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_HCRP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define HCRP_TRACE_DEBUG0(m) {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_HCRP, TRACE_TYPE_DEBUG, m);}
-#define HCRP_TRACE_DEBUG1(m,p1) {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_HCRP, TRACE_TYPE_DEBUG, m,p1);}
-#define HCRP_TRACE_DEBUG2(m,p1,p2) {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_HCRP, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define HCRP_TRACE_DEBUG3(m,p1,p2,p3) {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_HCRP, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define HCRP_TRACE_DEBUG4(m,p1,p2,p3,p4) {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_HCRP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define HCRP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5) {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_HCRP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define HCRP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6) {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_HCRP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-/* define traces for multi-client server hardcopy cable replacement profile */
-
-#define HCRPM_TRACE_ERROR0(m) {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_HCRP, TRACE_TYPE_ERROR, m);}
-#define HCRPM_TRACE_ERROR1(m,p1) {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_HCRP, TRACE_TYPE_ERROR, m, p1);}
-#define HCRPM_TRACE_ERROR2(m,p1,p2) {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_HCRP, TRACE_TYPE_ERROR, m,p1,p2);}
-#define HCRPM_TRACE_ERROR3(m,p1,p2,p3) {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_HCRP, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define HCRPM_TRACE_ERROR4(m,p1,p2,p3,p4) {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_HCRP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define HCRPM_TRACE_ERROR5(m,p1,p2,p3,p4,p5) {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_HCRP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define HCRPM_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6) {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_HCRP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define HCRPM_TRACE_WARNING0(m) {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_HCRP, TRACE_TYPE_WARNING, m);}
-#define HCRPM_TRACE_WARNING1(m,p1) {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_HCRP, TRACE_TYPE_WARNING, m,p1);}
-#define HCRPM_TRACE_WARNING2(m,p1,p2) {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_HCRP, TRACE_TYPE_WARNING, m,p1,p2);}
-#define HCRPM_TRACE_WARNING3(m,p1,p2,p3) {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_HCRP, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define HCRPM_TRACE_WARNING4(m,p1,p2,p3,p4) {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_HCRP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define HCRPM_TRACE_WARNING5(m,p1,p2,p3,p4,p5) {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_HCRP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define HCRPM_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_HCRP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define HCRPM_TRACE_API0(m) {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_HCRP, TRACE_TYPE_API, m);}
-#define HCRPM_TRACE_API1(m,p1) {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_HCRP, TRACE_TYPE_API, m, p1);}
-#define HCRPM_TRACE_API2(m,p1,p2) {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_HCRP, TRACE_TYPE_API, m,p1,p2);}
-#define HCRPM_TRACE_API3(m,p1,p2,p3) {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_HCRP, TRACE_TYPE_API, m,p1,p2,p3);}
-#define HCRPM_TRACE_API4(m,p1,p2,p3,p4) {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_HCRP, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define HCRPM_TRACE_API5(m,p1,p2,p3,p4,p5) {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_HCRP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define HCRPM_TRACE_API6(m,p1,p2,p3,p4,p5,p6) {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_HCRP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-#define HCRPM_TRACE_EVENT0(m) {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_HCRP, TRACE_TYPE_EVENT, m);}
-#define HCRPM_TRACE_EVENT1(m,p1) {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_HCRP, TRACE_TYPE_EVENT, m, p1);}
-#define HCRPM_TRACE_EVENT2(m,p1,p2) {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_HCRP, TRACE_TYPE_EVENT, m,p1,p2);}
-#define HCRPM_TRACE_EVENT3(m,p1,p2,p3) {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_HCRP, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define HCRPM_TRACE_EVENT4(m,p1,p2,p3,p4) {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_HCRP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define HCRPM_TRACE_EVENT5(m,p1,p2,p3,p4,p5) {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_HCRP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define HCRPM_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6) {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_HCRP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define HCRPM_TRACE_DEBUG0(m) {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_HCRP, TRACE_TYPE_DEBUG, m);}
-#define HCRPM_TRACE_DEBUG1(m,p1) {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_HCRP, TRACE_TYPE_DEBUG, m,p1);}
-#define HCRPM_TRACE_DEBUG2(m,p1,p2) {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_HCRP, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define HCRPM_TRACE_DEBUG3(m,p1,p2,p3) {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_HCRP, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define HCRPM_TRACE_DEBUG4(m,p1,p2,p3,p4) {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_HCRP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define HCRPM_TRACE_DEBUG5(m,p1,p2,p3,p4,p5) {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_HCRP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define HCRPM_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6) {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_HCRP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-/* define traces for RPC */
-
-#define RPC_TRACE_ERROR0(m) {if (rpc_trace_level >= BT_TRACE_LEVEL_ERROR) LogMsg_0(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_ERROR, (m));}
-#define RPC_TRACE_ERROR1(m,p1) {if (rpc_trace_level >= BT_TRACE_LEVEL_ERROR) LogMsg_1(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_ERROR, \
- (m), (UINT32)(p1));}
-#define RPC_TRACE_ERROR2(m,p1,p2) {if (rpc_trace_level >= BT_TRACE_LEVEL_ERROR) LogMsg_2(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_ERROR, \
- (m), (UINT32)(p1), (UINT32)(p2));}
-#define RPC_TRACE_ERROR3(m,p1,p2,p3) {if (rpc_trace_level >= BT_TRACE_LEVEL_ERROR) LogMsg_3(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_ERROR, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3));}
-#define RPC_TRACE_ERROR4(m,p1,p2,p3,p4) {if (rpc_trace_level >= BT_TRACE_LEVEL_ERROR) LogMsg_4(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_ERROR, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4));}
-#define RPC_TRACE_ERROR5(m,p1,p2,p3,p4,p5) {if (rpc_trace_level >= BT_TRACE_LEVEL_ERROR) LogMsg_5(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_ERROR, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5));}
-#define RPC_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6) {if (rpc_trace_level >= BT_TRACE_LEVEL_ERROR) LogMsg_6(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_ERROR, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5), (UINT32)(p6));}
-
-#define RPC_TRACE_WARNING0(m) {if (rpc_trace_level >= BT_TRACE_LEVEL_WARNING) LogMsg_0(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_WARNING, (m));}
-#define RPC_TRACE_WARNING1(m,p1) {if (rpc_trace_level >= BT_TRACE_LEVEL_WARNING) LogMsg_1(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_WARNING, \
- (m), (UINT32)(p1));}
-#define RPC_TRACE_WARNING2(m,p1,p2) {if (rpc_trace_level >= BT_TRACE_LEVEL_WARNING) LogMsg_2(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_WARNING, \
- (m), (UINT32)(p1), (UINT32)(p2));}
-#define RPC_TRACE_WARNING3(m,p1,p2,p3) {if (rpc_trace_level >= BT_TRACE_LEVEL_WARNING) LogMsg_3(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_WARNING, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3));}
-#define RPC_TRACE_WARNING4(m,p1,p2,p3,p4) {if (rpc_trace_level >= BT_TRACE_LEVEL_WARNING) LogMsg_4(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_WARNING, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4));}
-#define RPC_TRACE_WARNING5(m,p1,p2,p3,p4,p5) {if (rpc_trace_level >= BT_TRACE_LEVEL_WARNING) LogMsg_5(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_WARNING, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5));}
-#define RPC_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (rpc_trace_level >= BT_TRACE_LEVEL_WARNING) LogMsg_6(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_WARNING, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5), (UINT32)(p6));}
-
-#define RPC_TRACE_API0(m) {if (rpc_trace_level >= BT_TRACE_LEVEL_API) LogMsg_0(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_API, (m));}
-#define RPC_TRACE_API1(m,p1) {if (rpc_trace_level >= BT_TRACE_LEVEL_API) LogMsg_1(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_API, \
- (m), (UINT32)(p1));}
-#define RPC_TRACE_API2(m,p1,p2) {if (rpc_trace_level >= BT_TRACE_LEVEL_API) LogMsg_2(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_API, \
- (m), (UINT32)(p1), (UINT32)(p2));}
-#define RPC_TRACE_API3(m,p1,p2,p3) {if (rpc_trace_level >= BT_TRACE_LEVEL_API) LogMsg_3(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_API, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3));}
-#define RPC_TRACE_API4(m,p1,p2,p3,p4) {if (rpc_trace_level >= BT_TRACE_LEVEL_API) LogMsg_4(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_API, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4));}
-#define RPC_TRACE_API5(m,p1,p2,p3,p4,p5) {if (rpc_trace_level >= BT_TRACE_LEVEL_API) LogMsg_5(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_API, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5));}
-#define RPC_TRACE_API6(m,p1,p2,p3,p4,p5,p6) {if (rpc_trace_level >= BT_TRACE_LEVEL_API) LogMsg_6(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_API, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5), (UINT32)(p6));}
-
-#define RPC_TRACE_EVENT0(m) {if (rpc_trace_level >= BT_TRACE_LEVEL_EVENT) LogMsg_0(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_EVENT, (m));}
-#define RPC_TRACE_EVENT1(m,p1) {if (rpc_trace_level >= BT_TRACE_LEVEL_EVENT) LogMsg_1(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_EVENT, \
- (m), (UINT32)(p1));}
-#define RPC_TRACE_EVENT2(m,p1,p2) {if (rpc_trace_level >= BT_TRACE_LEVEL_EVENT) LogMsg_2(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_EVENT, \
- (m), (UINT32)(p1), (UINT32)(p2));}
-#define RPC_TRACE_EVENT3(m,p1,p2,p3) {if (rpc_trace_level >= BT_TRACE_LEVEL_EVENT) LogMsg_3(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_EVENT, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3));}
-#define RPC_TRACE_EVENT4(m,p1,p2,p3,p4) {if (rpc_trace_level >= BT_TRACE_LEVEL_EVENT) LogMsg_4(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_EVENT, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4));}
-#define RPC_TRACE_EVENT5(m,p1,p2,p3,p4,p5) {if (rpc_trace_level >= BT_TRACE_LEVEL_EVENT) LogMsg_5(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_EVENT, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5));}
-#define RPC_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6) {if (rpc_trace_level >= BT_TRACE_LEVEL_EVENT) LogMsg_6(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_EVENT, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5), (UINT32)(p6));}
-
-#define RPC_TRACE_DEBUG0(m) {if (rpc_trace_level >= BT_TRACE_LEVEL_DEBUG) LogMsg_0(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_DEBUG, (m));}
-#define RPC_TRACE_DEBUG1(m,p1) {if (rpc_trace_level >= BT_TRACE_LEVEL_DEBUG) LogMsg_1(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_DEBUG, \
- (m), (UINT32)(p1));}
-#define RPC_TRACE_DEBUG2(m,p1,p2) {if (rpc_trace_level >= BT_TRACE_LEVEL_DEBUG) LogMsg_2(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_DEBUG, \
- (m), (UINT32)(p1), (UINT32)(p2));}
-#define RPC_TRACE_DEBUG3(m,p1,p2,p3) {if (rpc_trace_level >= BT_TRACE_LEVEL_DEBUG) LogMsg_3(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_DEBUG, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3));}
-#define RPC_TRACE_DEBUG4(m,p1,p2,p3,p4) {if (rpc_trace_level >= BT_TRACE_LEVEL_DEBUG) LogMsg_4(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_DEBUG, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4));}
-#define RPC_TRACE_DEBUG5(m,p1,p2,p3,p4,p5) {if (rpc_trace_level >= BT_TRACE_LEVEL_DEBUG) LogMsg_5(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_DEBUG, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5));}
-#define RPC_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6) {if (rpc_trace_level >= BT_TRACE_LEVEL_DEBUG) LogMsg_6(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_DEBUG, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5), (UINT32)(p6));}
+#define HIDH_TRACE_ERROR(...) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_HID, TRACE_TYPE_ERROR, ##__VA_ARGS__);}
+#define HIDH_TRACE_WARNING(...) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_HID, TRACE_TYPE_WARNING, ##__VA_ARGS__);}
+#define HIDH_TRACE_API(...) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_HID, TRACE_TYPE_API, ##__VA_ARGS__);}
+#define HIDH_TRACE_EVENT(...) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_HID, TRACE_TYPE_EVENT, ##__VA_ARGS__);}
+#define HIDH_TRACE_DEBUG(...) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_HID, TRACE_TYPE_DEBUG, ##__VA_ARGS__);}
/* define traces for BNEP */
-#define BNEP_TRACE_ERROR0(m) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_BNEP, TRACE_TYPE_ERROR, m);}
-#define BNEP_TRACE_ERROR1(m,p1) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_BNEP, TRACE_TYPE_ERROR, m, p1);}
-#define BNEP_TRACE_ERROR2(m,p1,p2) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_BNEP, TRACE_TYPE_ERROR, m,p1,p2);}
-#define BNEP_TRACE_ERROR3(m,p1,p2,p3) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_BNEP, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define BNEP_TRACE_ERROR4(m,p1,p2,p3,p4) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_BNEP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define BNEP_TRACE_ERROR5(m,p1,p2,p3,p4,p5) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_BNEP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define BNEP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_BNEP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define BNEP_TRACE_WARNING0(m) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_BNEP, TRACE_TYPE_WARNING, m);}
-#define BNEP_TRACE_WARNING1(m,p1) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_BNEP, TRACE_TYPE_WARNING, m,p1);}
-#define BNEP_TRACE_WARNING2(m,p1,p2) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_BNEP, TRACE_TYPE_WARNING, m,p1,p2);}
-#define BNEP_TRACE_WARNING3(m,p1,p2,p3) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_BNEP, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define BNEP_TRACE_WARNING4(m,p1,p2,p3,p4) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_BNEP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define BNEP_TRACE_WARNING5(m,p1,p2,p3,p4,p5) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_BNEP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define BNEP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_BNEP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define BNEP_TRACE_API0(m) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_BNEP, TRACE_TYPE_API, m);}
-#define BNEP_TRACE_API1(m,p1) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_BNEP, TRACE_TYPE_API, m, p1);}
-#define BNEP_TRACE_API2(m,p1,p2) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_BNEP, TRACE_TYPE_API, m,p1,p2);}
-#define BNEP_TRACE_API3(m,p1,p2,p3) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_BNEP, TRACE_TYPE_API, m,p1,p2,p3);}
-#define BNEP_TRACE_API4(m,p1,p2,p3,p4) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_BNEP, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define BNEP_TRACE_API5(m,p1,p2,p3,p4,p5) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_BNEP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define BNEP_TRACE_API6(m,p1,p2,p3,p4,p5,p6) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_BNEP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-#define BNEP_TRACE_EVENT0(m) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_BNEP, TRACE_TYPE_EVENT, m);}
-#define BNEP_TRACE_EVENT1(m,p1) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_BNEP, TRACE_TYPE_EVENT, m, p1);}
-#define BNEP_TRACE_EVENT2(m,p1,p2) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_BNEP, TRACE_TYPE_EVENT, m,p1,p2);}
-#define BNEP_TRACE_EVENT3(m,p1,p2,p3) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_BNEP, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define BNEP_TRACE_EVENT4(m,p1,p2,p3,p4) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_BNEP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define BNEP_TRACE_EVENT5(m,p1,p2,p3,p4,p5) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_BNEP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define BNEP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_BNEP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define BNEP_TRACE_DEBUG0(m) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_BNEP, TRACE_TYPE_DEBUG, m);}
-#define BNEP_TRACE_DEBUG1(m,p1) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_BNEP, TRACE_TYPE_DEBUG, m,p1);}
-#define BNEP_TRACE_DEBUG2(m,p1,p2) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_BNEP, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define BNEP_TRACE_DEBUG3(m,p1,p2,p3) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_BNEP, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define BNEP_TRACE_DEBUG4(m,p1,p2,p3,p4) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_BNEP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define BNEP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_BNEP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define BNEP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_BNEP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
+#define BNEP_TRACE_ERROR(...) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_BNEP, TRACE_TYPE_ERROR, ##__VA_ARGS__);}
+#define BNEP_TRACE_WARNING(...) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_BNEP, TRACE_TYPE_WARNING, ##__VA_ARGS__);}
+#define BNEP_TRACE_API(...) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_BNEP, TRACE_TYPE_API, ##__VA_ARGS__);}
+#define BNEP_TRACE_EVENT(...) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_BNEP, TRACE_TYPE_EVENT, ##__VA_ARGS__);}
+#define BNEP_TRACE_DEBUG(...) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_BNEP, TRACE_TYPE_DEBUG, ##__VA_ARGS__);}
/* define traces for PAN */
-#define PAN_TRACE_ERROR0(m) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_PAN, TRACE_TYPE_ERROR, m);}
-#define PAN_TRACE_ERROR1(m,p1) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_PAN, TRACE_TYPE_ERROR, m, p1);}
-#define PAN_TRACE_ERROR2(m,p1,p2) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_PAN, TRACE_TYPE_ERROR, m,p1,p2);}
-#define PAN_TRACE_ERROR3(m,p1,p2,p3) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_PAN, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define PAN_TRACE_ERROR4(m,p1,p2,p3,p4) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_PAN, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define PAN_TRACE_ERROR5(m,p1,p2,p3,p4,p5) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_PAN, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define PAN_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_PAN, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define PAN_TRACE_WARNING0(m) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_PAN, TRACE_TYPE_WARNING, m);}
-#define PAN_TRACE_WARNING1(m,p1) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_PAN, TRACE_TYPE_WARNING, m,p1);}
-#define PAN_TRACE_WARNING2(m,p1,p2) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_PAN, TRACE_TYPE_WARNING, m,p1,p2);}
-#define PAN_TRACE_WARNING3(m,p1,p2,p3) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_PAN, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define PAN_TRACE_WARNING4(m,p1,p2,p3,p4) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_PAN, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define PAN_TRACE_WARNING5(m,p1,p2,p3,p4,p5) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_PAN, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define PAN_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_PAN, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define PAN_TRACE_API0(m) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_PAN, TRACE_TYPE_API, m);}
-#define PAN_TRACE_API1(m,p1) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_PAN, TRACE_TYPE_API, m, p1);}
-#define PAN_TRACE_API2(m,p1,p2) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_PAN, TRACE_TYPE_API, m,p1,p2);}
-#define PAN_TRACE_API3(m,p1,p2,p3) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_PAN, TRACE_TYPE_API, m,p1,p2,p3);}
-#define PAN_TRACE_API4(m,p1,p2,p3,p4) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_PAN, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define PAN_TRACE_API5(m,p1,p2,p3,p4,p5) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_PAN, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define PAN_TRACE_API6(m,p1,p2,p3,p4,p5,p6) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_PAN, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-#define PAN_TRACE_EVENT0(m) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_PAN, TRACE_TYPE_EVENT, m);}
-#define PAN_TRACE_EVENT1(m,p1) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_PAN, TRACE_TYPE_EVENT, m, p1);}
-#define PAN_TRACE_EVENT2(m,p1,p2) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_PAN, TRACE_TYPE_EVENT, m,p1,p2);}
-#define PAN_TRACE_EVENT3(m,p1,p2,p3) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_PAN, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define PAN_TRACE_EVENT4(m,p1,p2,p3,p4) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_PAN, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define PAN_TRACE_EVENT5(m,p1,p2,p3,p4,p5) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_PAN, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define PAN_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_PAN, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define PAN_TRACE_DEBUG0(m) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_PAN, TRACE_TYPE_DEBUG, m);}
-#define PAN_TRACE_DEBUG1(m,p1) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_PAN, TRACE_TYPE_DEBUG, m,p1);}
-#define PAN_TRACE_DEBUG2(m,p1,p2) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_PAN, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define PAN_TRACE_DEBUG3(m,p1,p2,p3) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_PAN, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define PAN_TRACE_DEBUG4(m,p1,p2,p3,p4) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_PAN, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define PAN_TRACE_DEBUG5(m,p1,p2,p3,p4,p5) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_PAN, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define PAN_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_PAN, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-/* define traces for SIM */
-
-#define SAP_TRACE_ERROR0(m) {if (sap_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_SAP, TRACE_TYPE_ERROR, m);}
-#define SAP_TRACE_ERROR1(m,p1) {if (sap_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_SAP, TRACE_TYPE_ERROR, m, p1);}
-#define SAP_TRACE_ERROR2(m,p1,p2) {if (sap_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_SAP, TRACE_TYPE_ERROR, m,p1,p2);}
-#define SAP_TRACE_ERROR3(m,p1,p2,p3) {if (sap_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_SAP, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define SAP_TRACE_ERROR4(m,p1,p2,p3,p4) {if (sap_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_SAP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define SAP_TRACE_ERROR5(m,p1,p2,p3,p4,p5) {if (sap_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_SAP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define SAP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6) {if (sap_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_SAP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define SAP_TRACE_WARNING0(m) {if (sap_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_SAP, TRACE_TYPE_WARNING, m);}
-#define SAP_TRACE_WARNING1(m,p1) {if (sap_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_SAP, TRACE_TYPE_WARNING, m,p1);}
-#define SAP_TRACE_WARNING2(m,p1,p2) {if (sap_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_SAP, TRACE_TYPE_WARNING, m,p1,p2);}
-#define SAP_TRACE_WARNING3(m,p1,p2,p3) {if (sap_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_SAP, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define SAP_TRACE_WARNING4(m,p1,p2,p3,p4) {if (sap_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_SAP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define SAP_TRACE_WARNING5(m,p1,p2,p3,p4,p5) {if (sap_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_SAP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define SAP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (sap_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_SAP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define SAP_TRACE_API0(m) {if (sap_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_SAP, TRACE_TYPE_API, m);}
-#define SAP_TRACE_API1(m,p1) {if (sap_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_SAP, TRACE_TYPE_API, m, p1);}
-#define SAP_TRACE_API2(m,p1,p2) {if (sap_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_SAP, TRACE_TYPE_API, m,p1,p2);}
-#define SAP_TRACE_API3(m,p1,p2,p3) {if (sap_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_SAP, TRACE_TYPE_API, m,p1,p2,p3);}
-#define SAP_TRACE_API4(m,p1,p2,p3,p4) {if (sap_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_SAP, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define SAP_TRACE_API5(m,p1,p2,p3,p4,p5) {if (sap_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_SAP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define SAP_TRACE_API6(m,p1,p2,p3,p4,p5,p6) {if (sap_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_SAP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-#define SAP_TRACE_EVENT0(m) {if (sap_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_SAP, TRACE_TYPE_EVENT, m);}
-#define SAP_TRACE_EVENT1(m,p1) {if (sap_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_SAP, TRACE_TYPE_EVENT, m, p1);}
-#define SAP_TRACE_EVENT2(m,p1,p2) {if (sap_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_SAP, TRACE_TYPE_EVENT, m,p1,p2);}
-#define SAP_TRACE_EVENT3(m,p1,p2,p3) {if (sap_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_SAP, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define SAP_TRACE_EVENT4(m,p1,p2,p3,p4) {if (sap_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_SAP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define SAP_TRACE_EVENT5(m,p1,p2,p3,p4,p5) {if (sap_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_SAP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define SAP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6) {if (sap_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_SAP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define SAP_TRACE_DEBUG0(m) {if (sap_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_SAP, TRACE_TYPE_DEBUG, m);}
-#define SAP_TRACE_DEBUG1(m,p1) {if (sap_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_SAP, TRACE_TYPE_DEBUG, m,p1);}
-#define SAP_TRACE_DEBUG2(m,p1,p2) {if (sap_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_SAP, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define SAP_TRACE_DEBUG3(m,p1,p2,p3) {if (sap_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_SAP, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define SAP_TRACE_DEBUG4(m,p1,p2,p3,p4) {if (sap_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_SAP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define SAP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5) {if (sap_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_SAP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define SAP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6) {if (sap_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_SAP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-/* Define tracing for OPP profile
-*/
-#define OPP_TRACE_ERROR0(m) {if (opp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_OPP, TRACE_TYPE_ERROR, m);}
-#define OPP_TRACE_ERROR1(m,p1) {if (opp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_OPP, TRACE_TYPE_ERROR, m,p1);}
-#define OPP_TRACE_ERROR2(m,p1,p2) {if (opp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_OPP, TRACE_TYPE_ERROR, m,p1,p2);}
-#define OPP_TRACE_ERROR3(m,p1,p2,p3) {if (opp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_OPP, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define OPP_TRACE_ERROR4(m,p1,p2,p3,p4) {if (opp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_OPP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define OPP_TRACE_ERROR5(m,p1,p2,p3,p4,p5) {if (opp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_OPP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define OPP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6) {if (opp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_OPP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define OPP_TRACE_WARNING0(m) {if (opp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_OPP, TRACE_TYPE_WARNING, m);}
-#define OPP_TRACE_WARNING1(m,p1) {if (opp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_OPP, TRACE_TYPE_WARNING, m,p1);}
-#define OPP_TRACE_WARNING2(m,p1,p2) {if (opp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_OPP, TRACE_TYPE_WARNING, m,p1,p2);}
-#define OPP_TRACE_WARNING3(m,p1,p2,p3) {if (opp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_OPP, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define OPP_TRACE_WARNING4(m,p1,p2,p3,p4) {if (opp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_OPP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define OPP_TRACE_WARNING5(m,p1,p2,p3,p4,p5) {if (opp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_OPP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define OPP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (opp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_OPP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define OPP_TRACE_EVENT0(m) {if (opp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_OPP, TRACE_TYPE_EVENT, m);}
-#define OPP_TRACE_EVENT1(m,p1) {if (opp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_OPP, TRACE_TYPE_EVENT, m, p1);}
-#define OPP_TRACE_EVENT2(m,p1,p2) {if (opp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_OPP, TRACE_TYPE_EVENT, m,p1,p2);}
-#define OPP_TRACE_EVENT3(m,p1,p2,p3) {if (opp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_OPP, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define OPP_TRACE_EVENT4(m,p1,p2,p3,p4) {if (opp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_OPP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define OPP_TRACE_EVENT5(m,p1,p2,p3,p4,p5) {if (opp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_OPP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define OPP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6) {if (opp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_OPP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define OPP_TRACE_DEBUG0(m) {if (opp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_OPP, TRACE_TYPE_DEBUG, m);}
-#define OPP_TRACE_DEBUG1(m,p1) {if (opp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_OPP, TRACE_TYPE_DEBUG, m,p1);}
-#define OPP_TRACE_DEBUG2(m,p1,p2) {if (opp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_OPP, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define OPP_TRACE_DEBUG3(m,p1,p2,p3) {if (opp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_OPP, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define OPP_TRACE_DEBUG4(m,p1,p2,p3,p4) {if (opp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_OPP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define OPP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5) {if (opp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_OPP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define OPP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6) {if (opp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_OPP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-/* Define tracing for FTP profile
-*/
-#define FTP_TRACE_ERROR0(m) {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_FTP, TRACE_TYPE_ERROR, m);}
-#define FTP_TRACE_ERROR1(m,p1) {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_FTP, TRACE_TYPE_ERROR, m,p1);}
-#define FTP_TRACE_ERROR2(m,p1,p2) {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_FTP, TRACE_TYPE_ERROR, m,p1,p2);}
-#define FTP_TRACE_ERROR3(m,p1,p2,p3) {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_FTP, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define FTP_TRACE_ERROR4(m,p1,p2,p3,p4) {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_FTP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define FTP_TRACE_ERROR5(m,p1,p2,p3,p4,p5) {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_FTP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define FTP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6) {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_FTP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define FTP_TRACE_WARNING0(m) {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_FTP, TRACE_TYPE_WARNING, m);}
-#define FTP_TRACE_WARNING1(m,p1) {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_FTP, TRACE_TYPE_WARNING, m,p1);}
-#define FTP_TRACE_WARNING2(m,p1,p2) {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_FTP, TRACE_TYPE_WARNING, m,p1,p2);}
-#define FTP_TRACE_WARNING3(m,p1,p2,p3) {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_FTP, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define FTP_TRACE_WARNING4(m,p1,p2,p3,p4) {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_FTP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define FTP_TRACE_WARNING5(m,p1,p2,p3,p4,p5) {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_FTP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define FTP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_FTP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define FTP_TRACE_EVENT0(m) {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_FTP, TRACE_TYPE_EVENT, m);}
-#define FTP_TRACE_EVENT1(m,p1) {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_FTP, TRACE_TYPE_EVENT, m, p1);}
-#define FTP_TRACE_EVENT2(m,p1,p2) {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_FTP, TRACE_TYPE_EVENT, m,p1,p2);}
-#define FTP_TRACE_EVENT3(m,p1,p2,p3) {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_FTP, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define FTP_TRACE_EVENT4(m,p1,p2,p3,p4) {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_FTP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define FTP_TRACE_EVENT5(m,p1,p2,p3,p4,p5) {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_FTP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define FTP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6) {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_FTP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define FTP_TRACE_DEBUG0(m) {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_FTP, TRACE_TYPE_DEBUG, m);}
-#define FTP_TRACE_DEBUG1(m,p1) {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_FTP, TRACE_TYPE_DEBUG, m,p1);}
-#define FTP_TRACE_DEBUG2(m,p1,p2) {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_FTP, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define FTP_TRACE_DEBUG3(m,p1,p2,p3) {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_FTP, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define FTP_TRACE_DEBUG4(m,p1,p2,p3,p4) {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_FTP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define FTP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5) {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_FTP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define FTP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6) {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_FTP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
+#define PAN_TRACE_ERROR(...) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_PAN, TRACE_TYPE_ERROR, ##__VA_ARGS__);}
+#define PAN_TRACE_WARNING(...) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_PAN, TRACE_TYPE_WARNING, ##__VA_ARGS__);}
+#define PAN_TRACE_API(...) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_PAN, TRACE_TYPE_API, ##__VA_ARGS__);}
+#define PAN_TRACE_EVENT(...) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_PAN, TRACE_TYPE_EVENT, ##__VA_ARGS__);}
+#define PAN_TRACE_DEBUG(...) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_PAN, TRACE_TYPE_DEBUG, ##__VA_ARGS__);}
/* Define tracing for the A2DP profile
*/
-#define A2D_TRACE_ERROR0(m) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_A2D, TRACE_TYPE_ERROR,m);}
-#define A2D_TRACE_ERROR1(m,p1) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_A2D, TRACE_TYPE_ERROR,m,p1);}
-#define A2D_TRACE_ERROR2(m,p1,p2) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_A2D, TRACE_TYPE_ERROR,m,p1,p2);}
-#define A2D_TRACE_ERROR3(m,p1,p2,p3) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_A2D, TRACE_TYPE_ERROR,m,p1,p2,p3);}
-#define A2D_TRACE_ERROR4(m,p1,p2,p3,p4) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_A2D, TRACE_TYPE_ERROR,m,p1,p2,p3,p4);}
-#define A2D_TRACE_ERROR5(m,p1,p2,p3,p4,p5) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_A2D, TRACE_TYPE_ERROR,m,p1,p2,p3,p4,p5);}
-#define A2D_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_A2D, TRACE_TYPE_ERROR,m,p1,p2,p3,p4,p5,p6);}
-
-#define A2D_TRACE_WARNING0(m) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_A2D, TRACE_TYPE_WARNING,m);}
-#define A2D_TRACE_WARNING1(m,p1) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_A2D, TRACE_TYPE_WARNING,m,p1);}
-#define A2D_TRACE_WARNING2(m,p1,p2) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_A2D, TRACE_TYPE_WARNING,m,p1,p2);}
-#define A2D_TRACE_WARNING3(m,p1,p2,p3) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_A2D, TRACE_TYPE_WARNING,m,p1,p2,p3);}
-#define A2D_TRACE_WARNING4(m,p1,p2,p3,p4) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_A2D, TRACE_TYPE_WARNING,m,p1,p2,p3,p4);}
-#define A2D_TRACE_WARNING5(m,p1,p2,p3,p4,p5) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_A2D, TRACE_TYPE_WARNING,m,p1,p2,p3,p4,p5);}
-#define A2D_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_A2D, TRACE_TYPE_WARNING,m,p1,p2,p3,p4,p5,p6);}
-
-#define A2D_TRACE_EVENT0(m) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_A2D, TRACE_TYPE_EVENT,m);}
-#define A2D_TRACE_EVENT1(m,p1) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_A2D, TRACE_TYPE_EVENT,m, p1);}
-#define A2D_TRACE_EVENT2(m,p1,p2) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_A2D, TRACE_TYPE_EVENT,m,p1,p2);}
-#define A2D_TRACE_EVENT3(m,p1,p2,p3) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_A2D, TRACE_TYPE_EVENT,m,p1,p2,p3);}
-#define A2D_TRACE_EVENT4(m,p1,p2,p3,p4) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_A2D, TRACE_TYPE_EVENT,m,p1,p2,p3,p4);}
-#define A2D_TRACE_EVENT5(m,p1,p2,p3,p4,p5) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_A2D, TRACE_TYPE_EVENT,m,p1,p2,p3,p4,p5);}
-#define A2D_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_A2D, TRACE_TYPE_EVENT,m,p1,p2,p3,p4,p5,p6);}
-
-#define A2D_TRACE_DEBUG0(m) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_A2D, TRACE_TYPE_DEBUG,m);}
-#define A2D_TRACE_DEBUG1(m,p1) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_A2D, TRACE_TYPE_DEBUG,m,p1);}
-#define A2D_TRACE_DEBUG2(m,p1,p2) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_A2D, TRACE_TYPE_DEBUG,m,p1,p2);}
-#define A2D_TRACE_DEBUG3(m,p1,p2,p3) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_A2D, TRACE_TYPE_DEBUG,m,p1,p2,p3);}
-#define A2D_TRACE_DEBUG4(m,p1,p2,p3,p4) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_A2D, TRACE_TYPE_DEBUG,m,p1,p2,p3,p4);}
-#define A2D_TRACE_DEBUG5(m,p1,p2,p3,p4,p5) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_A2D, TRACE_TYPE_DEBUG,m,p1,p2,p3,p4,p5);}
-#define A2D_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_A2D, TRACE_TYPE_DEBUG,m,p1,p2,p3,p4,p5,p6);}
-
-#define A2D_TRACE_API0(m) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_A2D, TRACE_TYPE_API,m);}
-#define A2D_TRACE_API1(m,p1) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_A2D, TRACE_TYPE_API,m, p1);}
-#define A2D_TRACE_API2(m,p1,p2) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_A2D, TRACE_TYPE_API,m,p1,p2);}
-#define A2D_TRACE_API3(m,p1,p2,p3) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_A2D, TRACE_TYPE_API,m,p1,p2,p3);}
-#define A2D_TRACE_API4(m,p1,p2,p3,p4) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_A2D, TRACE_TYPE_API,m,p1,p2,p3,p4);}
-#define A2D_TRACE_API5(m,p1,p2,p3,p4,p5) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_A2D, TRACE_TYPE_API,m,p1,p2,p3,p4,p5);}
-#define A2D_TRACE_API6(m,p1,p2,p3,p4,p5,p6) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_A2D, TRACE_TYPE_API,m,p1,p2,p3,p4,p5,p6);}
-
-/* Define tracing for the VDP profile
-*/
-#define VDP_TRACE_ERROR0(m) {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_AVP, TRACE_TYPE_ERROR,m);}
-#define VDP_TRACE_ERROR1(m,p1) {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_AVP, TRACE_TYPE_ERROR,m,p1);}
-#define VDP_TRACE_ERROR2(m,p1,p2) {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_AVP, TRACE_TYPE_ERROR,m,p1,p2);}
-#define VDP_TRACE_ERROR3(m,p1,p2,p3) {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_AVP, TRACE_TYPE_ERROR,m,p1,p2,p3);}
-#define VDP_TRACE_ERROR4(m,p1,p2,p3,p4) {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_AVP, TRACE_TYPE_ERROR,m,p1,p2,p3,p4);}
-#define VDP_TRACE_ERROR5(m,p1,p2,p3,p4,p5) {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_AVP, TRACE_TYPE_ERROR,m,p1,p2,p3,p4,p5);}
-#define VDP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6) {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_AVP, TRACE_TYPE_ERROR,m,p1,p2,p3,p4,p5,p6);}
-
-#define VDP_TRACE_WARNING0(m) {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_AVP, TRACE_TYPE_WARNING,m);}
-#define VDP_TRACE_WARNING1(m,p1) {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_AVP, TRACE_TYPE_WARNING,m,p1);}
-#define VDP_TRACE_WARNING2(m,p1,p2) {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_AVP, TRACE_TYPE_WARNING,m,p1,p2);}
-#define VDP_TRACE_WARNING3(m,p1,p2,p3) {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_AVP, TRACE_TYPE_WARNING,m,p1,p2,p3);}
-#define VDP_TRACE_WARNING4(m,p1,p2,p3,p4) {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_AVP, TRACE_TYPE_WARNING,m,p1,p2,p3,p4);}
-#define VDP_TRACE_WARNING5(m,p1,p2,p3,p4,p5) {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_AVP, TRACE_TYPE_WARNING,m,p1,p2,p3,p4,p5);}
-#define VDP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_AVP, TRACE_TYPE_WARNING,m,p1,p2,p3,p4,p5,p6);}
-
-#define VDP_TRACE_EVENT0(m) {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_AVP, TRACE_TYPE_EVENT,m);}
-#define VDP_TRACE_EVENT1(m,p1) {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_AVP, TRACE_TYPE_EVENT,m, p1);}
-#define VDP_TRACE_EVENT2(m,p1,p2) {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_AVP, TRACE_TYPE_EVENT,m,p1,p2);}
-#define VDP_TRACE_EVENT3(m,p1,p2,p3) {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_AVP, TRACE_TYPE_EVENT,m,p1,p2,p3);}
-#define VDP_TRACE_EVENT4(m,p1,p2,p3,p4) {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_AVP, TRACE_TYPE_EVENT,m,p1,p2,p3,p4);}
-#define VDP_TRACE_EVENT5(m,p1,p2,p3,p4,p5) {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_AVP, TRACE_TYPE_EVENT,m,p1,p2,p3,p4,p5);}
-#define VDP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6) {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_AVP, TRACE_TYPE_EVENT,m,p1,p2,p3,p4,p5,p6);}
-
-#define VDP_TRACE_DEBUG0(m) {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG,m);}
-#define VDP_TRACE_DEBUG1(m,p1) {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG,m,p1);}
-#define VDP_TRACE_DEBUG2(m,p1,p2) {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG,m,p1,p2);}
-#define VDP_TRACE_DEBUG3(m,p1,p2,p3) {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG,m,p1,p2,p3);}
-#define VDP_TRACE_DEBUG4(m,p1,p2,p3,p4) {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG,m,p1,p2,p3,p4);}
-#define VDP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5) {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG,m,p1,p2,p3,p4,p5);}
-#define VDP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6) {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG,m,p1,p2,p3,p4,p5,p6);}
-
-#define VDP_TRACE_API0(m) {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_AVP, TRACE_TYPE_API,m);}
-#define VDP_TRACE_API1(m,p1) {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_AVP, TRACE_TYPE_API,m, p1);}
-#define VDP_TRACE_API2(m,p1,p2) {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_AVP, TRACE_TYPE_API,m,p1,p2);}
-#define VDP_TRACE_API3(m,p1,p2,p3) {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_AVP, TRACE_TYPE_API,m,p1,p2,p3);}
-#define VDP_TRACE_API4(m,p1,p2,p3,p4) {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_AVP, TRACE_TYPE_API,m,p1,p2,p3,p4);}
-#define VDP_TRACE_API5(m,p1,p2,p3,p4,p5) {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_AVP, TRACE_TYPE_API,m,p1,p2,p3,p4,p5);}
-#define VDP_TRACE_API6(m,p1,p2,p3,p4,p5,p6) {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_AVP, TRACE_TYPE_API,m,p1,p2,p3,p4,p5,p6);}
-
-
-/* Define tracing for the LM unit
-*/
-#define LMP_TRACE_ERROR0(m) {if (lmp_trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_LM, TRACE_TYPE_ERROR, m);}
-#define LMP_TRACE_ERROR1(m,p1) {if (lmp_trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_LM, TRACE_TYPE_ERROR, m,p1);}
-#define LMP_TRACE_ERROR2(m,p1,p2) {if (lmp_trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_LM, TRACE_TYPE_ERROR, m,p1,p2);}
-#define LMP_TRACE_ERROR3(m,p1,p2,p3) {if (lmp_trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_LM, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define LMP_TRACE_ERROR4(m,p1,p2,p3,p4) {if (lmp_trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_LM, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define LMP_TRACE_ERROR5(m,p1,p2,p3,p4,p5) {if (lmp_trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_LM, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define LMP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6) {if (lmp_trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_LM, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define LMP_TRACE_WARNING0(m) {if (lmp_trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_LM, TRACE_TYPE_WARNING, m);}
-#define LMP_TRACE_WARNING1(m,p1) {if (lmp_trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_LM, TRACE_TYPE_WARNING, m,p1);}
-#define LMP_TRACE_WARNING2(m,p1,p2) {if (lmp_trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_LM, TRACE_TYPE_WARNING, m,p1,p2);}
-#define LMP_TRACE_WARNING3(m,p1,p2,p3) {if (lmp_trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_LM, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define LMP_TRACE_WARNING4(m,p1,p2,p3,p4) {if (lmp_trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_LM, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define LMP_TRACE_WARNING5(m,p1,p2,p3,p4,p5) {if (lmp_trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_LM, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define LMP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (lmp_trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_LM, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define LMP_TRACE_EVENT0(m) {if (lmp_trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_LM, TRACE_TYPE_EVENT, m);}
-#define LMP_TRACE_EVENT1(m,p1) {if (lmp_trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_LM, TRACE_TYPE_EVENT, m, p1);}
-#define LMP_TRACE_EVENT2(m,p1,p2) {if (lmp_trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_LM, TRACE_TYPE_EVENT, m,p1,p2);}
-#define LMP_TRACE_EVENT3(m,p1,p2,p3) {if (lmp_trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_LM, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define LMP_TRACE_EVENT4(m,p1,p2,p3,p4) {if (lmp_trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_LM, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define LMP_TRACE_EVENT5(m,p1,p2,p3,p4,p5) {if (lmp_trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_LM, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define LMP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6) {if (lmp_trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_LM, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define LMP_TRACE_DEBUG0(m) {if (lmp_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_LM, TRACE_TYPE_DEBUG, m);}
-#define LMP_TRACE_DEBUG1(m,p1) {if (lmp_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_LM, TRACE_TYPE_DEBUG, m,p1);}
-#define LMP_TRACE_DEBUG2(m,p1,p2) {if (lmp_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_LM, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define LMP_TRACE_DEBUG3(m,p1,p2,p3) {if (lmp_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_LM, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define LMP_TRACE_DEBUG4(m,p1,p2,p3,p4) {if (lmp_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_LM, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define LMP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5) {if (lmp_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_LM, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define LMP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6) {if (lmp_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_LM, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-/* Define tracing for the LC unit
-*/
-#define LC_TRACE_ERROR0(m) {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_ERROR]) BT_TRACE_0(TRACE_LAYER_LC, TRACE_TYPE_ERROR, m);}
-#define LC_TRACE_ERROR1(m,p1) {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_ERROR]) BT_TRACE_1(TRACE_LAYER_LC, TRACE_TYPE_ERROR, m,p1);}
-#define LC_TRACE_ERROR2(m,p1,p2) {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_ERROR]) BT_TRACE_2(TRACE_LAYER_LC, TRACE_TYPE_ERROR, m,p1,p2);}
-#define LC_TRACE_ERROR3(m,p1,p2,p3) {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_ERROR]) BT_TRACE_3(TRACE_LAYER_LC, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define LC_TRACE_ERROR4(m,p1,p2,p3,p4) {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_ERROR]) BT_TRACE_4(TRACE_LAYER_LC, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define LC_TRACE_ERROR5(m,p1,p2,p3,p4,p5) {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_ERROR]) BT_TRACE_5(TRACE_LAYER_LC, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define LC_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6) {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_ERROR]) BT_TRACE_6(TRACE_LAYER_LC, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define LC_TRACE_WARNING0(m) {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_WARNING]) BT_TRACE_0(TRACE_LAYER_LC, TRACE_TYPE_WARNING, m);}
-#define LC_TRACE_WARNING1(m,p1) {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_WARNING]) BT_TRACE_1(TRACE_LAYER_LC, TRACE_TYPE_WARNING, m,p1);}
-#define LC_TRACE_WARNING2(m,p1,p2) {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_WARNING]) BT_TRACE_2(TRACE_LAYER_LC, TRACE_TYPE_WARNING, m,p1,p2);}
-#define LC_TRACE_WARNING3(m,p1,p2,p3) {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_WARNING]) BT_TRACE_3(TRACE_LAYER_LC, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define LC_TRACE_WARNING4(m,p1,p2,p3,p4) {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_WARNING]) BT_TRACE_4(TRACE_LAYER_LC, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define LC_TRACE_WARNING5(m,p1,p2,p3,p4,p5) {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_WARNING]) BT_TRACE_5(TRACE_LAYER_LC, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define LC_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_WARNING]) BT_TRACE_6(TRACE_LAYER_LC, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define LC_TRACE_EVENT0(m) {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_EVENT]) BT_TRACE_0(TRACE_LAYER_LC, TRACE_TYPE_EVENT, m);}
-#define LC_TRACE_EVENT1(m,p1) {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_EVENT]) BT_TRACE_1(TRACE_LAYER_LC, TRACE_TYPE_EVENT, m, p1);}
-#define LC_TRACE_EVENT2(m,p1,p2) {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_EVENT]) BT_TRACE_2(TRACE_LAYER_LC, TRACE_TYPE_EVENT, m,p1,p2);}
-#define LC_TRACE_EVENT3(m,p1,p2,p3) {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_EVENT]) BT_TRACE_3(TRACE_LAYER_LC, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define LC_TRACE_EVENT4(m,p1,p2,p3,p4) {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_EVENT]) BT_TRACE_4(TRACE_LAYER_LC, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define LC_TRACE_EVENT5(m,p1,p2,p3,p4,p5) {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_EVENT]) BT_TRACE_5(TRACE_LAYER_LC, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define LC_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6) {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_EVENT]) BT_TRACE_6(TRACE_LAYER_LC, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define LC_TRACE_DEBUG0(m) {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_DEBUG]) BT_TRACE_0(TRACE_LAYER_LC, TRACE_TYPE_DEBUG, m);}
-#define LC_TRACE_DEBUG1(m,p1) {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_DEBUG]) BT_TRACE_1(TRACE_LAYER_LC, TRACE_TYPE_DEBUG, m,p1);}
-#define LC_TRACE_DEBUG2(m,p1,p2) {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_DEBUG]) BT_TRACE_2(TRACE_LAYER_LC, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define LC_TRACE_DEBUG3(m,p1,p2,p3) {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_DEBUG]) BT_TRACE_3(TRACE_LAYER_LC, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define LC_TRACE_DEBUG4(m,p1,p2,p3,p4) {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_DEBUG]) BT_TRACE_5(TRACE_LAYER_LC, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define LC_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6) {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_DEBUG]) BT_TRACE_6(TRACE_LAYER_LC, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-/* Define tracing for the Serial Dongle Application SDA
-*/
-#define SDA_TRACE_ERROR0(m) {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(m);}
-#define SDA_TRACE_ERROR1(m,p1) {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(m,p1);}
-#define SDA_TRACE_ERROR2(m,p1,p2) {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(m,p1,p2);}
-#define SDA_TRACE_ERROR3(m,p1,p2,p3) {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(m,p1,p2,p3);}
-#define SDA_TRACE_ERROR4(m,p1,p2,p3,p4) {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(m,p1,p2,p3,p4);}
-#define SDA_TRACE_ERROR5(m,p1,p2,p3,p4,p5) {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(m,p1,p2,p3,p4,p5);}
-#define SDA_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6) {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(m,p1,p2,p3,p4,p5,p6);}
-
-#define SDA_TRACE_WARNING0(m) {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(m);}
-#define SDA_TRACE_WARNING1(m,p1) {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(m,p1);}
-#define SDA_TRACE_WARNING2(m,p1,p2) {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(m,p1,p2);}
-#define SDA_TRACE_WARNING3(m,p1,p2,p3) {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(m,p1,p2,p3);}
-#define SDA_TRACE_WARNING4(m,p1,p2,p3,p4) {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(m,p1,p2,p3,p4);}
-#define SDA_TRACE_WARNING5(m,p1,p2,p3,p4,p5) {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(m,p1,p2,p3,p4,p5);}
-#define SDA_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(m,p1,p2,p3,p4,p5,p6);}
-
-#define SDA_TRACE_EVENT0(m) {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(m);}
-#define SDA_TRACE_EVENT1(m,p1) {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(m, p1);}
-#define SDA_TRACE_EVENT2(m,p1,p2) {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(m,p1,p2);}
-#define SDA_TRACE_EVENT3(m,p1,p2,p3) {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(m,p1,p2,p3);}
-#define SDA_TRACE_EVENT4(m,p1,p2,p3,p4) {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(m,p1,p2,p3,p4);}
-#define SDA_TRACE_EVENT5(m,p1,p2,p3,p4,p5) {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(m,p1,p2,p3,p4,p5);}
-#define SDA_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6) {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(m,p1,p2,p3,p4,p5,p6);}
-
-#define SDA_TRACE_DEBUG0(m) {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(m);}
-#define SDA_TRACE_DEBUG1(m,p1) {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(m,p1);}
-#define SDA_TRACE_DEBUG2(m,p1,p2) {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(m,p1,p2);}
-#define SDA_TRACE_DEBUG3(m,p1,p2,p3) {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(m,p1,p2,p3);}
-#define SDA_TRACE_DEBUG4(m,p1,p2,p3,p4) {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(m,p1,p2,p3,p4);}
-#define SDA_TRACE_DEBUG5(m,p1,p2,p3,p4,p5) {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(m,p1,p2,p3,p4,p5);}
-#define SDA_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6) {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(m,p1,p2,p3,p4,p5,p6);}
+#define A2D_TRACE_ERROR(...) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_A2D, TRACE_TYPE_ERROR,##__VA_ARGS__);}
+#define A2D_TRACE_WARNING(...) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_A2D, TRACE_TYPE_WARNING,##__VA_ARGS__);}
+#define A2D_TRACE_EVENT(...) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_A2D, TRACE_TYPE_EVENT,##__VA_ARGS__);}
+#define A2D_TRACE_DEBUG(...) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_A2D, TRACE_TYPE_DEBUG,##__VA_ARGS__);}
+#define A2D_TRACE_API(...) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_A2D, TRACE_TYPE_API,##__VA_ARGS__);}
/* AVDTP
*/
-#define AVDT_TRACE_ERROR0(m) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_AVP, TRACE_TYPE_ERROR, m);}
-#define AVDT_TRACE_ERROR1(m,p1) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_AVP, TRACE_TYPE_ERROR, m,p1);}
-#define AVDT_TRACE_ERROR2(m,p1,p2) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_AVP, TRACE_TYPE_ERROR, m,p1,p2);}
-#define AVDT_TRACE_ERROR3(m,p1,p2,p3) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_AVP, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define AVDT_TRACE_ERROR4(m,p1,p2,p3,p4) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_AVP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define AVDT_TRACE_ERROR5(m,p1,p2,p3,p4,p5) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_AVP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define AVDT_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_AVP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define AVDT_TRACE_WARNING0(m) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_AVP, TRACE_TYPE_WARNING, m);}
-#define AVDT_TRACE_WARNING1(m,p1) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_AVP, TRACE_TYPE_WARNING, m,p1);}
-#define AVDT_TRACE_WARNING2(m,p1,p2) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_AVP, TRACE_TYPE_WARNING, m,p1,p2);}
-#define AVDT_TRACE_WARNING3(m,p1,p2,p3) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_AVP, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define AVDT_TRACE_WARNING4(m,p1,p2,p3,p4) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_AVP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define AVDT_TRACE_WARNING5(m,p1,p2,p3,p4,p5) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_AVP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define AVDT_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_AVP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define AVDT_TRACE_EVENT0(m) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_AVP, TRACE_TYPE_EVENT, m);}
-#define AVDT_TRACE_EVENT1(m,p1) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_AVP, TRACE_TYPE_EVENT, m, p1);}
-#define AVDT_TRACE_EVENT2(m,p1,p2) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_AVP, TRACE_TYPE_EVENT, m,p1,p2);}
-#define AVDT_TRACE_EVENT3(m,p1,p2,p3) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_AVP, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define AVDT_TRACE_EVENT4(m,p1,p2,p3,p4) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_AVP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define AVDT_TRACE_EVENT5(m,p1,p2,p3,p4,p5) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_AVP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define AVDT_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_AVP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define AVDT_TRACE_DEBUG0(m) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG, m);}
-#define AVDT_TRACE_DEBUG1(m,p1) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG, m,p1);}
-#define AVDT_TRACE_DEBUG2(m,p1,p2) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define AVDT_TRACE_DEBUG3(m,p1,p2,p3) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define AVDT_TRACE_DEBUG4(m,p1,p2,p3,p4) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define AVDT_TRACE_DEBUG5(m,p1,p2,p3,p4,p5) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define AVDT_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-#define AVDT_TRACE_API0(m) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_AVP, TRACE_TYPE_API, m);}
-#define AVDT_TRACE_API1(m,p1) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_AVP, TRACE_TYPE_API, m,p1);}
-#define AVDT_TRACE_API2(m,p1,p2) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_AVP, TRACE_TYPE_API, m,p1,p2);}
-#define AVDT_TRACE_API3(m,p1,p2,p3) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_AVP, TRACE_TYPE_API, m,p1,p2,p3);}
-#define AVDT_TRACE_API4(m,p1,p2,p3,p4) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_AVP, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define AVDT_TRACE_API5(m,p1,p2,p3,p4,p5) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_AVP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define AVDT_TRACE_API6(m,p1,p2,p3,p4,p5,p6) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_AVP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
+#define AVDT_TRACE_ERROR(...) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_ERROR, ##__VA_ARGS__);}
+#define AVDT_TRACE_WARNING(...) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_WARNING, ##__VA_ARGS__);}
+#define AVDT_TRACE_EVENT(...) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_EVENT, ##__VA_ARGS__);}
+#define AVDT_TRACE_DEBUG(...) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG, ##__VA_ARGS__);}
+#define AVDT_TRACE_API(...) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_API, ##__VA_ARGS__);}
/* Define tracing for the AVCTP protocol
*/
-#define AVCT_TRACE_ERROR0(m) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_AVP, TRACE_TYPE_ERROR, m);}
-#define AVCT_TRACE_ERROR1(m,p1) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_AVP, TRACE_TYPE_ERROR, m,p1);}
-#define AVCT_TRACE_ERROR2(m,p1,p2) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_AVP, TRACE_TYPE_ERROR, m,p1,p2);}
-#define AVCT_TRACE_ERROR3(m,p1,p2,p3) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_AVP, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define AVCT_TRACE_ERROR4(m,p1,p2,p3,p4) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_AVP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define AVCT_TRACE_ERROR5(m,p1,p2,p3,p4,p5) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_AVP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define AVCT_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_AVP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define AVCT_TRACE_WARNING0(m) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_AVP, TRACE_TYPE_WARNING, m);}
-#define AVCT_TRACE_WARNING1(m,p1) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_AVP, TRACE_TYPE_WARNING, m,p1);}
-#define AVCT_TRACE_WARNING2(m,p1,p2) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_AVP, TRACE_TYPE_WARNING, m,p1,p2);}
-#define AVCT_TRACE_WARNING3(m,p1,p2,p3) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_AVP, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define AVCT_TRACE_WARNING4(m,p1,p2,p3,p4) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_AVP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define AVCT_TRACE_WARNING5(m,p1,p2,p3,p4,p5) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_AVP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define AVCT_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_AVP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define AVCT_TRACE_EVENT0(m) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_AVP, TRACE_TYPE_EVENT, m);}
-#define AVCT_TRACE_EVENT1(m,p1) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_AVP, TRACE_TYPE_EVENT, m, p1);}
-#define AVCT_TRACE_EVENT2(m,p1,p2) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_AVP, TRACE_TYPE_EVENT, m,p1,p2);}
-#define AVCT_TRACE_EVENT3(m,p1,p2,p3) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_AVP, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define AVCT_TRACE_EVENT4(m,p1,p2,p3,p4) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_AVP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define AVCT_TRACE_EVENT5(m,p1,p2,p3,p4,p5) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_AVP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define AVCT_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_AVP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define AVCT_TRACE_DEBUG0(m) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG, m);}
-#define AVCT_TRACE_DEBUG1(m,p1) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG, m,p1);}
-#define AVCT_TRACE_DEBUG2(m,p1,p2) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define AVCT_TRACE_DEBUG3(m,p1,p2,p3) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define AVCT_TRACE_DEBUG4(m,p1,p2,p3,p4) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define AVCT_TRACE_DEBUG5(m,p1,p2,p3,p4,p5) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define AVCT_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-#define AVCT_TRACE_API0(m) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_AVP, TRACE_TYPE_API, m);}
-#define AVCT_TRACE_API1(m,p1) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_AVP, TRACE_TYPE_API, m,p1);}
-#define AVCT_TRACE_API2(m,p1,p2) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_AVP, TRACE_TYPE_API, m,p1,p2);}
-#define AVCT_TRACE_API3(m,p1,p2,p3) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_AVP, TRACE_TYPE_API, m,p1,p2,p3);}
-#define AVCT_TRACE_API4(m,p1,p2,p3,p4) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_AVP, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define AVCT_TRACE_API5(m,p1,p2,p3,p4,p5) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_AVP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define AVCT_TRACE_API6(m,p1,p2,p3,p4,p5,p6) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_AVP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
+#define AVCT_TRACE_ERROR(...) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_ERROR, ##__VA_ARGS__);}
+#define AVCT_TRACE_WARNING(...) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_WARNING, ##__VA_ARGS__);}
+#define AVCT_TRACE_EVENT(...) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_EVENT, ##__VA_ARGS__);}
+#define AVCT_TRACE_DEBUG(...) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG, ##__VA_ARGS__);}
+#define AVCT_TRACE_API(...) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_API, ##__VA_ARGS__);}
/* Define tracing for the AVRCP profile
*/
-#define AVRC_TRACE_ERROR0(m) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_AVP, TRACE_TYPE_ERROR,m);}
-#define AVRC_TRACE_ERROR1(m,p1) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_AVP, TRACE_TYPE_ERROR,m,p1);}
-#define AVRC_TRACE_ERROR2(m,p1,p2) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_AVP, TRACE_TYPE_ERROR,m,p1,p2);}
-#define AVRC_TRACE_ERROR3(m,p1,p2,p3) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_AVP, TRACE_TYPE_ERROR,m,p1,p2,p3);}
-#define AVRC_TRACE_ERROR4(m,p1,p2,p3,p4) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_AVP, TRACE_TYPE_ERROR,m,p1,p2,p3,p4);}
-#define AVRC_TRACE_ERROR5(m,p1,p2,p3,p4,p5) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_AVP, TRACE_TYPE_ERROR,m,p1,p2,p3,p4,p5);}
-#define AVRC_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_AVP, TRACE_TYPE_ERROR,m,p1,p2,p3,p4,p5,p6);}
-
-#define AVRC_TRACE_WARNING0(m) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_AVP, TRACE_TYPE_WARNING,m);}
-#define AVRC_TRACE_WARNING1(m,p1) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_AVP, TRACE_TYPE_WARNING,m,p1);}
-#define AVRC_TRACE_WARNING2(m,p1,p2) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_AVP, TRACE_TYPE_WARNING,m,p1,p2);}
-#define AVRC_TRACE_WARNING3(m,p1,p2,p3) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_AVP, TRACE_TYPE_WARNING,m,p1,p2,p3);}
-#define AVRC_TRACE_WARNING4(m,p1,p2,p3,p4) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_AVP, TRACE_TYPE_WARNING,m,p1,p2,p3,p4);}
-#define AVRC_TRACE_WARNING5(m,p1,p2,p3,p4,p5) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_AVP, TRACE_TYPE_WARNING,m,p1,p2,p3,p4,p5);}
-#define AVRC_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_AVP, TRACE_TYPE_WARNING,m,p1,p2,p3,p4,p5,p6);}
-
-#define AVRC_TRACE_EVENT0(m) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_AVP, TRACE_TYPE_EVENT,m);}
-#define AVRC_TRACE_EVENT1(m,p1) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_AVP, TRACE_TYPE_EVENT,m, p1);}
-#define AVRC_TRACE_EVENT2(m,p1,p2) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_AVP, TRACE_TYPE_EVENT,m,p1,p2);}
-#define AVRC_TRACE_EVENT3(m,p1,p2,p3) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_AVP, TRACE_TYPE_EVENT,m,p1,p2,p3);}
-#define AVRC_TRACE_EVENT4(m,p1,p2,p3,p4) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_AVP, TRACE_TYPE_EVENT,m,p1,p2,p3,p4);}
-#define AVRC_TRACE_EVENT5(m,p1,p2,p3,p4,p5) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_AVP, TRACE_TYPE_EVENT,m,p1,p2,p3,p4,p5);}
-#define AVRC_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_AVP, TRACE_TYPE_EVENT,m,p1,p2,p3,p4,p5,p6);}
-
-#define AVRC_TRACE_DEBUG0(m) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG,m);}
-#define AVRC_TRACE_DEBUG1(m,p1) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG,m,p1);}
-#define AVRC_TRACE_DEBUG2(m,p1,p2) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG,m,p1,p2);}
-#define AVRC_TRACE_DEBUG3(m,p1,p2,p3) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG,m,p1,p2,p3);}
-#define AVRC_TRACE_DEBUG4(m,p1,p2,p3,p4) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG,m,p1,p2,p3,p4);}
-#define AVRC_TRACE_DEBUG5(m,p1,p2,p3,p4,p5) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG,m,p1,p2,p3,p4,p5);}
-#define AVRC_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG,m,p1,p2,p3,p4,p5,p6);}
-
-#define AVRC_TRACE_API0(m) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_AVP, TRACE_TYPE_API,m);}
-#define AVRC_TRACE_API1(m,p1) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_AVP, TRACE_TYPE_API,m, p1);}
-#define AVRC_TRACE_API2(m,p1,p2) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_AVP, TRACE_TYPE_API,m,p1,p2);}
-#define AVRC_TRACE_API3(m,p1,p2,p3) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_AVP, TRACE_TYPE_API,m,p1,p2,p3);}
-#define AVRC_TRACE_API4(m,p1,p2,p3,p4) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_AVP, TRACE_TYPE_API,m,p1,p2,p3,p4);}
-#define AVRC_TRACE_API5(m,p1,p2,p3,p4,p5) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_AVP, TRACE_TYPE_API,m,p1,p2,p3,p4,p5);}
-#define AVRC_TRACE_API6(m,p1,p2,p3,p4,p5,p6) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_AVP, TRACE_TYPE_API,m,p1,p2,p3,p4,p5,p6);}
+#define AVRC_TRACE_ERROR(...) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_ERROR, ##__VA_ARGS__);}
+#define AVRC_TRACE_WARNING(...) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_WARNING, ##__VA_ARGS__);}
+#define AVRC_TRACE_EVENT(...) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_EVENT, ##__VA_ARGS__);}
+#define AVRC_TRACE_DEBUG(...) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG, ##__VA_ARGS__);}
+#define AVRC_TRACE_API(...) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_API, ##__VA_ARGS__);}
/* MCAP
*/
-#define MCA_TRACE_ERROR0(m) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_MCA, TRACE_TYPE_ERROR, m);}
-#define MCA_TRACE_ERROR1(m,p1) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_MCA, TRACE_TYPE_ERROR, m,p1);}
-#define MCA_TRACE_ERROR2(m,p1,p2) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_MCA, TRACE_TYPE_ERROR, m,p1,p2);}
-#define MCA_TRACE_ERROR3(m,p1,p2,p3) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_MCA, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define MCA_TRACE_ERROR4(m,p1,p2,p3,p4) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_MCA, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define MCA_TRACE_ERROR5(m,p1,p2,p3,p4,p5) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_MCA, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define MCA_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_MCA, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define MCA_TRACE_WARNING0(m) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_MCA, TRACE_TYPE_WARNING, m);}
-#define MCA_TRACE_WARNING1(m,p1) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_MCA, TRACE_TYPE_WARNING, m,p1);}
-#define MCA_TRACE_WARNING2(m,p1,p2) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_MCA, TRACE_TYPE_WARNING, m,p1,p2);}
-#define MCA_TRACE_WARNING3(m,p1,p2,p3) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_MCA, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define MCA_TRACE_WARNING4(m,p1,p2,p3,p4) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_MCA, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define MCA_TRACE_WARNING5(m,p1,p2,p3,p4,p5) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_MCA, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define MCA_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_MCA, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define MCA_TRACE_EVENT0(m) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_MCA, TRACE_TYPE_EVENT, m);}
-#define MCA_TRACE_EVENT1(m,p1) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_MCA, TRACE_TYPE_EVENT, m, p1);}
-#define MCA_TRACE_EVENT2(m,p1,p2) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_MCA, TRACE_TYPE_EVENT, m,p1,p2);}
-#define MCA_TRACE_EVENT3(m,p1,p2,p3) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_MCA, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define MCA_TRACE_EVENT4(m,p1,p2,p3,p4) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_MCA, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define MCA_TRACE_EVENT5(m,p1,p2,p3,p4,p5) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_MCA, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define MCA_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_MCA, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define MCA_TRACE_DEBUG0(m) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_MCA, TRACE_TYPE_DEBUG, m);}
-#define MCA_TRACE_DEBUG1(m,p1) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_MCA, TRACE_TYPE_DEBUG, m,p1);}
-#define MCA_TRACE_DEBUG2(m,p1,p2) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_MCA, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define MCA_TRACE_DEBUG3(m,p1,p2,p3) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_MCA, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define MCA_TRACE_DEBUG4(m,p1,p2,p3,p4) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_MCA, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define MCA_TRACE_DEBUG5(m,p1,p2,p3,p4,p5) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_MCA, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define MCA_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_MCA, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-#define MCA_TRACE_API0(m) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_MCA, TRACE_TYPE_API, m);}
-#define MCA_TRACE_API1(m,p1) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_MCA, TRACE_TYPE_API, m,p1);}
-#define MCA_TRACE_API2(m,p1,p2) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_MCA, TRACE_TYPE_API, m,p1,p2);}
-#define MCA_TRACE_API3(m,p1,p2,p3) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_MCA, TRACE_TYPE_API, m,p1,p2,p3);}
-#define MCA_TRACE_API4(m,p1,p2,p3,p4) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_MCA, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define MCA_TRACE_API5(m,p1,p2,p3,p4,p5) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_MCA, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define MCA_TRACE_API6(m,p1,p2,p3,p4,p5,p6) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_MCA, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-/* Define tracing for the AMP unit
-*/
-#define AMP_TRACE_ERROR0(m) {if (amp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_AMP, TRACE_TYPE_ERROR, m);}
-#define AMP_TRACE_ERROR1(m,p1) {if (amp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_AMP, TRACE_TYPE_ERROR, m,p1);}
-#define AMP_TRACE_ERROR2(m,p1,p2) {if (amp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_AMP, TRACE_TYPE_ERROR, m,p1,p2);}
-#define AMP_TRACE_ERROR3(m,p1,p2,p3) {if (amp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_AMP, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define AMP_TRACE_ERROR4(m,p1,p2,p3,p4) {if (amp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_AMP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define AMP_TRACE_ERROR5(m,p1,p2,p3,p4,p5) {if (amp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_AMP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define AMP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6) {if (amp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_AMP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define AMP_TRACE_WARNING0(m) {if (amp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_AMP, TRACE_TYPE_WARNING, m);}
-#define AMP_TRACE_WARNING1(m,p1) {if (amp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_AMP, TRACE_TYPE_WARNING, m,p1);}
-#define AMP_TRACE_WARNING2(m,p1,p2) {if (amp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_AMP, TRACE_TYPE_WARNING, m,p1,p2);}
-#define AMP_TRACE_WARNING3(m,p1,p2,p3) {if (amp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_AMP, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define AMP_TRACE_WARNING4(m,p1,p2,p3,p4) {if (amp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_AMP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define AMP_TRACE_WARNING5(m,p1,p2,p3,p4,p5) {if (amp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_AMP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define AMP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (amp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_AMP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define AMP_TRACE_API0(m) {if (amp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_AMP, TRACE_TYPE_API, m);}
-#define AMP_TRACE_API1(m,p1) {if (amp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_AMP, TRACE_TYPE_API, m,p1);}
-#define AMP_TRACE_API2(m,p1,p2) {if (amp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_AMP, TRACE_TYPE_API, m,p1,p2);}
-#define AMP_TRACE_API3(m,p1,p2,p3) {if (amp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_AMP, TRACE_TYPE_API, m,p1,p2,p3);}
-#define AMP_TRACE_API4(m,p1,p2,p3,p4) {if (amp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_AMP, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define AMP_TRACE_API5(m,p1,p2,p3,p4,p5) {if (amp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_AMP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define AMP_TRACE_API6(m,p1,p2,p3,p4,p5,p6) {if (amp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_AMP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-#define AMP_TRACE_EVENT0(m) {if (amp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_AMP, TRACE_TYPE_EVENT, m);}
-#define AMP_TRACE_EVENT1(m,p1) {if (amp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_AMP, TRACE_TYPE_EVENT, m, p1);}
-#define AMP_TRACE_EVENT2(m,p1,p2) {if (amp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_AMP, TRACE_TYPE_EVENT, m,p1,p2);}
-#define AMP_TRACE_EVENT3(m,p1,p2,p3) {if (amp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_AMP, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define AMP_TRACE_EVENT4(m,p1,p2,p3,p4) {if (amp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_AMP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define AMP_TRACE_EVENT5(m,p1,p2,p3,p4,p5) {if (amp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_AMP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define AMP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6) {if (amp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_AMP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define AMP_TRACE_DEBUG0(m) {if (amp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_AMP, TRACE_TYPE_DEBUG, m);}
-#define AMP_TRACE_DEBUG1(m,p1) {if (amp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_AMP, TRACE_TYPE_DEBUG, m,p1);}
-#define AMP_TRACE_DEBUG2(m,p1,p2) {if (amp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_AMP, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define AMP_TRACE_DEBUG3(m,p1,p2,p3) {if (amp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_AMP, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define AMP_TRACE_DEBUG4(m,p1,p2,p3,p4) {if (amp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_AMP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define AMP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5) {if (amp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_AMP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define AMP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6) {if (amp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_AMP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
+#define MCA_TRACE_ERROR(...) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_MCA, TRACE_TYPE_ERROR, ##__VA_ARGS__);}
+#define MCA_TRACE_WARNING(...) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_MCA, TRACE_TYPE_WARNING, ##__VA_ARGS__);}
+#define MCA_TRACE_EVENT(...) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_MCA, TRACE_TYPE_EVENT, ##__VA_ARGS__);}
+#define MCA_TRACE_DEBUG(...) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_MCA, TRACE_TYPE_DEBUG, ##__VA_ARGS__);}
+#define MCA_TRACE_API(...) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_MCA, TRACE_TYPE_API, ##__VA_ARGS__);}
/* Define tracing for the ATT/GATT unit
*/
-#define GATT_TRACE_ERROR0(m) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_ATT, TRACE_TYPE_ERROR, m);}
-#define GATT_TRACE_ERROR1(m,p1) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_ATT, TRACE_TYPE_ERROR, m,p1);}
-#define GATT_TRACE_ERROR2(m,p1,p2) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_ATT, TRACE_TYPE_ERROR, m,p1,p2);}
-#define GATT_TRACE_ERROR3(m,p1,p2,p3) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_ATT, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define GATT_TRACE_ERROR4(m,p1,p2,p3,p4) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_ATT, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define GATT_TRACE_ERROR5(m,p1,p2,p3,p4,p5) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_ATT, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define GATT_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_ATT, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define GATT_TRACE_WARNING0(m) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_ATT, TRACE_TYPE_WARNING, m);}
-#define GATT_TRACE_WARNING1(m,p1) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_ATT, TRACE_TYPE_WARNING, m,p1);}
-#define GATT_TRACE_WARNING2(m,p1,p2) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_ATT, TRACE_TYPE_WARNING, m,p1,p2);}
-#define GATT_TRACE_WARNING3(m,p1,p2,p3) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_ATT, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define GATT_TRACE_WARNING4(m,p1,p2,p3,p4) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_ATT, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define GATT_TRACE_WARNING5(m,p1,p2,p3,p4,p5) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_ATT, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define GATT_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_ATT, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define GATT_TRACE_API0(m) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_ATT, TRACE_TYPE_API, m);}
-#define GATT_TRACE_API1(m,p1) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_ATT, TRACE_TYPE_API, m,p1);}
-#define GATT_TRACE_API2(m,p1,p2) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_ATT, TRACE_TYPE_API, m,p1,p2);}
-#define GATT_TRACE_API3(m,p1,p2,p3) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_ATT, TRACE_TYPE_API, m,p1,p2,p3);}
-#define GATT_TRACE_API4(m,p1,p2,p3,p4) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_ATT, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define GATT_TRACE_API5(m,p1,p2,p3,p4,p5) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_ATT, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define GATT_TRACE_API6(m,p1,p2,p3,p4,p5,p6) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_ATT, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-#define GATT_TRACE_EVENT0(m) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_ATT, TRACE_TYPE_EVENT, m);}
-#define GATT_TRACE_EVENT1(m,p1) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_ATT, TRACE_TYPE_EVENT, m, p1);}
-#define GATT_TRACE_EVENT2(m,p1,p2) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_ATT, TRACE_TYPE_EVENT, m,p1,p2);}
-#define GATT_TRACE_EVENT3(m,p1,p2,p3) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_ATT, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define GATT_TRACE_EVENT4(m,p1,p2,p3,p4) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_ATT, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define GATT_TRACE_EVENT5(m,p1,p2,p3,p4,p5) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_ATT, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define GATT_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_ATT, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define GATT_TRACE_DEBUG0(m) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_ATT, TRACE_TYPE_DEBUG, m);}
-#define GATT_TRACE_DEBUG1(m,p1) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_ATT, TRACE_TYPE_DEBUG, m,p1);}
-#define GATT_TRACE_DEBUG2(m,p1,p2) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_ATT, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define GATT_TRACE_DEBUG3(m,p1,p2,p3) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_ATT, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define GATT_TRACE_DEBUG4(m,p1,p2,p3,p4) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_ATT, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define GATT_TRACE_DEBUG5(m,p1,p2,p3,p4,p5) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_ATT, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define GATT_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_ATT, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
+#define GATT_TRACE_ERROR(...) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_ATT, TRACE_TYPE_ERROR, ##__VA_ARGS__);}
+#define GATT_TRACE_WARNING(...) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_ATT, TRACE_TYPE_WARNING, ##__VA_ARGS__);}
+#define GATT_TRACE_API(...) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_ATT, TRACE_TYPE_API, ##__VA_ARGS__);}
+#define GATT_TRACE_EVENT(...) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_ATT, TRACE_TYPE_EVENT, ##__VA_ARGS__);}
+#define GATT_TRACE_DEBUG(...) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_ATT, TRACE_TYPE_DEBUG, ##__VA_ARGS__);}
/* Define tracing for the SMP unit
*/
-#define SMP_TRACE_ERROR0(m) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_SMP, TRACE_TYPE_ERROR, m);}
-#define SMP_TRACE_ERROR1(m,p1) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_SMP, TRACE_TYPE_ERROR, m,p1);}
-#define SMP_TRACE_ERROR2(m,p1,p2) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_SMP, TRACE_TYPE_ERROR, m,p1,p2);}
-#define SMP_TRACE_ERROR3(m,p1,p2,p3) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_SMP, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define SMP_TRACE_ERROR4(m,p1,p2,p3,p4) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_SMP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define SMP_TRACE_ERROR5(m,p1,p2,p3,p4,p5) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_SMP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define SMP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_SMP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define SMP_TRACE_WARNING0(m) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_SMP, TRACE_TYPE_WARNING, m);}
-#define SMP_TRACE_WARNING1(m,p1) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_SMP, TRACE_TYPE_WARNING, m,p1);}
-#define SMP_TRACE_WARNING2(m,p1,p2) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_SMP, TRACE_TYPE_WARNING, m,p1,p2);}
-#define SMP_TRACE_WARNING3(m,p1,p2,p3) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_SMP, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define SMP_TRACE_WARNING4(m,p1,p2,p3,p4) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_SMP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define SMP_TRACE_WARNING5(m,p1,p2,p3,p4,p5) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_SMP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define SMP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_SMP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define SMP_TRACE_API0(m) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_SMP, TRACE_TYPE_API, m);}
-#define SMP_TRACE_API1(m,p1) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_SMP, TRACE_TYPE_API, m,p1);}
-#define SMP_TRACE_API2(m,p1,p2) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_SMP, TRACE_TYPE_API, m,p1,p2);}
-#define SMP_TRACE_API3(m,p1,p2,p3) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_SMP, TRACE_TYPE_API, m,p1,p2,p3);}
-#define SMP_TRACE_API4(m,p1,p2,p3,p4) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_SMP, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define SMP_TRACE_API5(m,p1,p2,p3,p4,p5) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_SMP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define SMP_TRACE_API6(m,p1,p2,p3,p4,p5,p6) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_SMP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-#define SMP_TRACE_EVENT0(m) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_SMP, TRACE_TYPE_EVENT, m);}
-#define SMP_TRACE_EVENT1(m,p1) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_SMP, TRACE_TYPE_EVENT, m, p1);}
-#define SMP_TRACE_EVENT2(m,p1,p2) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_SMP, TRACE_TYPE_EVENT, m,p1,p2);}
-#define SMP_TRACE_EVENT3(m,p1,p2,p3) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_SMP, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define SMP_TRACE_EVENT4(m,p1,p2,p3,p4) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_SMP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define SMP_TRACE_EVENT5(m,p1,p2,p3,p4,p5) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_SMP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define SMP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_SMP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define SMP_TRACE_DEBUG0(m) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_SMP, TRACE_TYPE_DEBUG, m);}
-#define SMP_TRACE_DEBUG1(m,p1) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_SMP, TRACE_TYPE_DEBUG, m,p1);}
-#define SMP_TRACE_DEBUG2(m,p1,p2) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_SMP, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define SMP_TRACE_DEBUG3(m,p1,p2,p3) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_SMP, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define SMP_TRACE_DEBUG4(m,p1,p2,p3,p4) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_SMP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define SMP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_SMP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define SMP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_SMP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
+#define SMP_TRACE_ERROR(...) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_SMP, TRACE_TYPE_ERROR, ##__VA_ARGS__);}
+#define SMP_TRACE_WARNING(...) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_SMP, TRACE_TYPE_WARNING, ##__VA_ARGS__);}
+#define SMP_TRACE_API(...) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_SMP, TRACE_TYPE_API, ##__VA_ARGS__);}
+#define SMP_TRACE_EVENT(...) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_SMP, TRACE_TYPE_EVENT, ##__VA_ARGS__);}
+#define SMP_TRACE_DEBUG(...) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_SMP, TRACE_TYPE_DEBUG, ##__VA_ARGS__);}
/* END OF USE TRACES */
#else
-#define BT_TRACE_0(l,t,m)
-#define BT_TRACE_1(l,t,m,p1)
-#define BT_TRACE_2(l,t,m,p1,p2)
-#define BT_TRACE_3(l,t,m,p1,p2,p3)
-#define BT_TRACE_4(l,t,m,p1,p2,p3,p4)
-#define BT_TRACE_5(l,t,m,p1,p2,p3,p4,p5)
-#define BT_TRACE_6(l,t,m,p1,p2,p3,p4,p5,p6)
-
-#define BT_ERROR_TRACE_0(l,m)
-#define BT_ERROR_TRACE_1(l,m,p1)
-#define BT_ERROR_TRACE_2(l,m,p1,p2)
-#define BT_ERROR_TRACE_3(l,m,p1,p2,p3)
+#define BT_TRACE(l,t,...)
+#define BT_BT_ERROR_TRACE(l,...)
/* Define tracing for the HCI unit
*/
-#define HCI_TRACE_ERROR0(m)
-#define HCI_TRACE_ERROR1(m,p1)
-#define HCI_TRACE_ERROR2(m,p1,p2)
-#define HCI_TRACE_ERROR3(m,p1,p2,p3)
-#define HCI_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define HCI_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define HCI_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define HCI_TRACE_WARNING0(m)
-#define HCI_TRACE_WARNING1(m,p1)
-#define HCI_TRACE_WARNING2(m,p1,p2)
-#define HCI_TRACE_WARNING3(m,p1,p2,p3)
-#define HCI_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define HCI_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define HCI_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define HCI_TRACE_EVENT0(m)
-#define HCI_TRACE_EVENT1(m,p1)
-#define HCI_TRACE_EVENT2(m,p1,p2)
-#define HCI_TRACE_EVENT3(m,p1,p2,p3)
-#define HCI_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define HCI_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define HCI_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define HCI_TRACE_DEBUG0(m)
-#define HCI_TRACE_DEBUG1(m,p1)
-#define HCI_TRACE_DEBUG2(m,p1,p2)
-#define HCI_TRACE_DEBUG3(m,p1,p2,p3)
-#define HCI_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define HCI_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define HCI_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
+#define HCI_TRACE_ERROR(...)
+#define HCI_TRACE_WARNING(...)
+#define HCI_TRACE_EVENT(...)
+#define HCI_TRACE_DEBUG(...)
/* Define tracing for BTM
*/
-#define BTM_TRACE_ERROR0(m)
-#define BTM_TRACE_ERROR1(m,p1)
-#define BTM_TRACE_ERROR2(m,p1,p2)
-#define BTM_TRACE_ERROR3(m,p1,p2,p3)
-#define BTM_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define BTM_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define BTM_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define BTM_TRACE_WARNING0(m)
-#define BTM_TRACE_WARNING1(m,p1)
-#define BTM_TRACE_WARNING2(m,p1,p2)
-#define BTM_TRACE_WARNING3(m,p1,p2,p3)
-#define BTM_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define BTM_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define BTM_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define BTM_TRACE_API0(m)
-#define BTM_TRACE_API1(m,p1)
-#define BTM_TRACE_API2(m,p1,p2)
-#define BTM_TRACE_API3(m,p1,p2,p3)
-#define BTM_TRACE_API4(m,p1,p2,p3,p4)
-#define BTM_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define BTM_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define BTM_TRACE_EVENT0(m)
-#define BTM_TRACE_EVENT1(m,p1)
-#define BTM_TRACE_EVENT2(m,p1,p2)
-#define BTM_TRACE_EVENT3(m,p1,p2,p3)
-#define BTM_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define BTM_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define BTM_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define BTM_TRACE_DEBUG0(m)
-#define BTM_TRACE_DEBUG1(m,p1)
-#define BTM_TRACE_DEBUG2(m,p1,p2)
-#define BTM_TRACE_DEBUG3(m,p1,p2,p3)
-#define BTM_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define BTM_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define BTM_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
+#define BTM_TRACE_ERROR(...)
+#define BTM_TRACE_WARNING(...)
+#define BTM_TRACE_API(...)
+#define BTM_TRACE_EVENT(...)
+#define BTM_TRACE_DEBUG(...)
/* Define tracing for the L2CAP unit
*/
-#define L2CAP_TRACE_ERROR0(m)
-#define L2CAP_TRACE_ERROR1(m,p1)
-#define L2CAP_TRACE_ERROR2(m,p1,p2)
-#define L2CAP_TRACE_ERROR3(m,p1,p2,p3)
-#define L2CAP_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define L2CAP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define L2CAP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define L2CAP_TRACE_WARNING0(m)
-#define L2CAP_TRACE_WARNING1(m,p1)
-#define L2CAP_TRACE_WARNING2(m,p1,p2)
-#define L2CAP_TRACE_WARNING3(m,p1,p2,p3)
-#define L2CAP_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define L2CAP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define L2CAP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define L2CAP_TRACE_API0(m)
-#define L2CAP_TRACE_API1(m,p1)
-#define L2CAP_TRACE_API2(m,p1,p2)
-#define L2CAP_TRACE_API3(m,p1,p2,p3)
-#define L2CAP_TRACE_API4(m,p1,p2,p3,p4)
-#define L2CAP_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define L2CAP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define L2CAP_TRACE_EVENT0(m)
-#define L2CAP_TRACE_EVENT1(m,p1)
-#define L2CAP_TRACE_EVENT2(m,p1,p2)
-#define L2CAP_TRACE_EVENT3(m,p1,p2,p3)
-#define L2CAP_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define L2CAP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define L2CAP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define L2CAP_TRACE_DEBUG0(m)
-#define L2CAP_TRACE_DEBUG1(m,p1)
-#define L2CAP_TRACE_DEBUG2(m,p1,p2)
-#define L2CAP_TRACE_DEBUG3(m,p1,p2,p3)
-#define L2CAP_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define L2CAP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define L2CAP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-/* Define tracing for the LLCP unit
-*/
-#define LLCP_TRACE_ERROR0(m)
-#define LLCP_TRACE_ERROR1(m,p1)
-#define LLCP_TRACE_ERROR2(m,p1,p2)
-#define LLCP_TRACE_ERROR3(m,p1,p2,p3)
-#define LLCP_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define LLCP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define LLCP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define LLCP_TRACE_WARNING0(m)
-#define LLCP_TRACE_WARNING1(m,p1)
-#define LLCP_TRACE_WARNING2(m,p1,p2)
-#define LLCP_TRACE_WARNING3(m,p1,p2,p3)
-#define LLCP_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define LLCP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define LLCP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define LLCP_TRACE_API0(m)
-#define LLCP_TRACE_API1(m,p1)
-#define LLCP_TRACE_API2(m,p1,p2)
-#define LLCP_TRACE_API3(m,p1,p2,p3)
-#define LLCP_TRACE_API4(m,p1,p2,p3,p4)
-#define LLCP_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define LLCP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define LLCP_TRACE_EVENT0(m)
-#define LLCP_TRACE_EVENT1(m,p1)
-#define LLCP_TRACE_EVENT2(m,p1,p2)
-#define LLCP_TRACE_EVENT3(m,p1,p2,p3)
-#define LLCP_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define LLCP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define LLCP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define LLCP_TRACE_DEBUG0(m)
-#define LLCP_TRACE_DEBUG1(m,p1)
-#define LLCP_TRACE_DEBUG2(m,p1,p2)
-#define LLCP_TRACE_DEBUG3(m,p1,p2,p3)
-#define LLCP_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define LLCP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define LLCP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
+#define L2CAP_TRACE_ERROR(...)
+#define L2CAP_TRACE_WARNING(...)
+#define L2CAP_TRACE_API(...)
+#define L2CAP_TRACE_EVENT(...)
+#define L2CAP_TRACE_DEBUG(...)
/* Define tracing for the SDP unit
*/
-#define SDP_TRACE_ERROR0(m)
-#define SDP_TRACE_ERROR1(m,p1)
-#define SDP_TRACE_ERROR2(m,p1,p2)
-#define SDP_TRACE_ERROR3(m,p1,p2,p3)
-#define SDP_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define SDP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define SDP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define SDP_TRACE_WARNING0(m)
-#define SDP_TRACE_WARNING1(m,p1)
-#define SDP_TRACE_WARNING2(m,p1,p2)
-#define SDP_TRACE_WARNING3(m,p1,p2,p3)
-#define SDP_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define SDP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define SDP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define SDP_TRACE_API0(m)
-#define SDP_TRACE_API1(m,p1)
-#define SDP_TRACE_API2(m,p1,p2)
-#define SDP_TRACE_API3(m,p1,p2,p3)
-#define SDP_TRACE_API4(m,p1,p2,p3,p4)
-#define SDP_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define SDP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define SDP_TRACE_EVENT0(m)
-#define SDP_TRACE_EVENT1(m,p1)
-#define SDP_TRACE_EVENT2(m,p1,p2)
-#define SDP_TRACE_EVENT3(m,p1,p2,p3)
-#define SDP_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define SDP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define SDP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define SDP_TRACE_DEBUG0(m)
-#define SDP_TRACE_DEBUG1(m,p1)
-#define SDP_TRACE_DEBUG2(m,p1,p2)
-#define SDP_TRACE_DEBUG3(m,p1,p2,p3)
-#define SDP_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define SDP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define SDP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
+#define SDP_TRACE_ERROR(...)
+#define SDP_TRACE_WARNING(...)
+#define SDP_TRACE_API(...)
+#define SDP_TRACE_EVENT(...)
+#define SDP_TRACE_DEBUG(...)
/* Define tracing for the RFCOMM unit
*/
-#define RFCOMM_TRACE_ERROR0(m)
-#define RFCOMM_TRACE_ERROR1(m,p1)
-#define RFCOMM_TRACE_ERROR2(m,p1,p2)
-#define RFCOMM_TRACE_ERROR3(m,p1,p2,p3)
-#define RFCOMM_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define RFCOMM_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define RFCOMM_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define RFCOMM_TRACE_WARNING0(m)
-#define RFCOMM_TRACE_WARNING1(m,p1)
-#define RFCOMM_TRACE_WARNING2(m,p1,p2)
-#define RFCOMM_TRACE_WARNING3(m,p1,p2,p3)
-#define RFCOMM_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define RFCOMM_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define RFCOMM_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define RFCOMM_TRACE_API0(m)
-#define RFCOMM_TRACE_API1(m,p1)
-#define RFCOMM_TRACE_API2(m,p1,p2)
-#define RFCOMM_TRACE_API3(m,p1,p2,p3)
-#define RFCOMM_TRACE_API4(m,p1,p2,p3,p4)
-#define RFCOMM_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define RFCOMM_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define RFCOMM_TRACE_EVENT0(m)
-#define RFCOMM_TRACE_EVENT1(m,p1)
-#define RFCOMM_TRACE_EVENT2(m,p1,p2)
-#define RFCOMM_TRACE_EVENT3(m,p1,p2,p3)
-#define RFCOMM_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define RFCOMM_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define RFCOMM_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define RFCOMM_TRACE_DEBUG0(m)
-#define RFCOMM_TRACE_DEBUG1(m,p1)
-#define RFCOMM_TRACE_DEBUG2(m,p1,p2)
-#define RFCOMM_TRACE_DEBUG3(m,p1,p2,p3)
-#define RFCOMM_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define RFCOMM_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define RFCOMM_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-/* Define tracing for Serial Port Profile
-*/
-#define SPP_TRACE_ERROR0(m)
-#define SPP_TRACE_ERROR1(m,p1)
-#define SPP_TRACE_ERROR2(m,p1,p2)
-#define SPP_TRACE_ERROR3(m,p1,p2,p3)
-#define SPP_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define SPP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define SPP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define SPP_TRACE_WARNING0(m)
-#define SPP_TRACE_WARNING1(m,p1)
-#define SPP_TRACE_WARNING2(m,p1,p2)
-#define SPP_TRACE_WARNING3(m,p1,p2,p3)
-#define SPP_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define SPP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define SPP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define SPP_TRACE_EVENT0(m)
-#define SPP_TRACE_EVENT1(m,p1)
-#define SPP_TRACE_EVENT2(m,p1,p2)
-#define SPP_TRACE_EVENT3(m,p1,p2,p3)
-#define SPP_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define SPP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define SPP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define SPP_TRACE_API0(m)
-#define SPP_TRACE_API1(m,p1)
-#define SPP_TRACE_API2(m,p1,p2)
-#define SPP_TRACE_API3(m,p1,p2,p3)
-#define SPP_TRACE_API4(m,p1,p2,p3,p4)
-#define SPP_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define SPP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define SPP_TRACE_DEBUG0(m)
-#define SPP_TRACE_DEBUG1(m,p1)
-#define SPP_TRACE_DEBUG2(m,p1,p2)
-#define SPP_TRACE_DEBUG3(m,p1,p2,p3)
-#define SPP_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define SPP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define SPP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
+#define RFCOMM_TRACE_ERROR(...)
+#define RFCOMM_TRACE_WARNING(...)
+#define RFCOMM_TRACE_API(...)
+#define RFCOMM_TRACE_EVENT(...)
+#define RFCOMM_TRACE_DEBUG(...)
/* Generic Access Profile traces */
-#define GAP_TRACE_ERROR0(m)
-#define GAP_TRACE_ERROR1(m,p1)
-#define GAP_TRACE_ERROR2(m,p1,p2)
-#define GAP_TRACE_ERROR3(m,p1,p2,p3)
-#define GAP_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define GAP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define GAP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define GAP_TRACE_EVENT0(m)
-#define GAP_TRACE_EVENT1(m,p1)
-#define GAP_TRACE_EVENT2(m,p1,p2)
-#define GAP_TRACE_EVENT3(m,p1,p2,p3)
-#define GAP_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define GAP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define GAP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define GAP_TRACE_API0(m)
-#define GAP_TRACE_API1(m,p1)
-#define GAP_TRACE_API2(m,p1,p2)
-#define GAP_TRACE_API3(m,p1,p2,p3)
-#define GAP_TRACE_API4(m,p1,p2,p3,p4)
-#define GAP_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define GAP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define GAP_TRACE_WARNING0(m)
-#define GAP_TRACE_WARNING1(m,p1)
-#define GAP_TRACE_WARNING2(m,p1,p2)
-#define GAP_TRACE_WARNING3(m,p1,p2,p3)
-#define GAP_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define GAP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define GAP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-
-/* Define tracing for OBX
-*/
-#define OBX_TRACE_ERROR0(m)
-#define OBX_TRACE_ERROR1(m,p1)
-#define OBX_TRACE_ERROR2(m,p1,p2)
-#define OBX_TRACE_ERROR3(m,p1,p2,p3)
-#define OBX_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define OBX_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define OBX_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define OBX_TRACE_WARNING0(m)
-#define OBX_TRACE_WARNING1(m,p1)
-#define OBX_TRACE_WARNING2(m,p1,p2)
-#define OBX_TRACE_WARNING3(m,p1,p2,p3)
-#define OBX_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define OBX_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define OBX_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define OBX_TRACE_EVENT0(m)
-#define OBX_TRACE_EVENT1(m,p1)
-#define OBX_TRACE_EVENT2(m,p1,p2)
-#define OBX_TRACE_EVENT3(m,p1,p2,p3)
-#define OBX_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define OBX_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define OBX_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define OBX_TRACE_DEBUG0(m)
-#define OBX_TRACE_DEBUG1(m,p1)
-#define OBX_TRACE_DEBUG2(m,p1,p2)
-#define OBX_TRACE_DEBUG3(m,p1,p2,p3)
-#define OBX_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define OBX_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define OBX_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-#define OBX_TRACE_API0(m)
-#define OBX_TRACE_API1(m,p1)
-#define OBX_TRACE_API2(m,p1,p2)
-#define OBX_TRACE_API3(m,p1,p2,p3)
-#define OBX_TRACE_API4(m,p1,p2,p3,p4)
-#define OBX_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define OBX_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-/* Define tracing for GOEP application profiles
-*/
-#define GOEP_TRACE_ERROR0(m)
-#define GOEP_TRACE_ERROR1(m,p1)
-#define GOEP_TRACE_ERROR2(m,p1,p2)
-#define GOEP_TRACE_ERROR3(m,p1,p2,p3)
-#define GOEP_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define GOEP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define GOEP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define GOEP_TRACE_WARNING0(m)
-#define GOEP_TRACE_WARNING1(m,p1)
-#define GOEP_TRACE_WARNING2(m,p1,p2)
-#define GOEP_TRACE_WARNING3(m,p1,p2,p3)
-#define GOEP_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define GOEP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define GOEP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define GOEP_TRACE_EVENT0(m)
-#define GOEP_TRACE_EVENT1(m,p1)
-#define GOEP_TRACE_EVENT2(m,p1,p2)
-#define GOEP_TRACE_EVENT3(m,p1,p2,p3)
-#define GOEP_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define GOEP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define GOEP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define GOEP_TRACE_DEBUG0(m)
-#define GOEP_TRACE_DEBUG1(m,p1)
-#define GOEP_TRACE_DEBUG2(m,p1,p2)
-#define GOEP_TRACE_DEBUG3(m,p1,p2,p3)
-#define GOEP_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define GOEP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-#define GOEP_TRACE_API0(m)
-#define GOEP_TRACE_API1(m,p1)
-#define GOEP_TRACE_API2(m,p1,p2)
-#define GOEP_TRACE_API3(m,p1,p2,p3)
-#define GOEP_TRACE_API4(m,p1,p2,p3,p4)
-#define GOEP_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define GOEP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-/* Define tracing for the BPP profile
-*/
-#define BPP_TRACE_ERROR0(m)
-#define BPP_TRACE_ERROR1(m,p1)
-#define BPP_TRACE_ERROR2(m,p1,p2)
-#define BPP_TRACE_ERROR3(m,p1,p2,p3)
-#define BPP_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define BPP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define BPP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define BPP_TRACE_WARNING0(m)
-#define BPP_TRACE_WARNING1(m,p1)
-#define BPP_TRACE_WARNING2(m,p1,p2)
-#define BPP_TRACE_WARNING3(m,p1,p2,p3)
-#define BPP_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define BPP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define BPP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define BPP_TRACE_EVENT0(m)
-#define BPP_TRACE_EVENT1(m,p1)
-#define BPP_TRACE_EVENT2(m,p1,p2)
-#define BPP_TRACE_EVENT3(m,p1,p2,p3)
-#define BPP_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define BPP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define BPP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define BPP_TRACE_DEBUG0(m)
-#define BPP_TRACE_DEBUG1(m,p1)
-#define BPP_TRACE_DEBUG2(m,p1,p2)
-#define BPP_TRACE_DEBUG3(m,p1,p2,p3)
-#define BPP_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define BPP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define BPP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-#define BPP_TRACE_API0(m)
-#define BPP_TRACE_API1(m,p1)
-#define BPP_TRACE_API2(m,p1,p2)
-#define BPP_TRACE_API3(m,p1,p2,p3)
-#define BPP_TRACE_API4(m,p1,p2,p3,p4)
-#define BPP_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define BPP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-/* Define tracing for the BIP profile
-*/
-#define BIP_TRACE_ERROR0(m)
-#define BIP_TRACE_ERROR1(m,p1)
-#define BIP_TRACE_ERROR2(m,p1,p2)
-#define BIP_TRACE_ERROR3(m,p1,p2,p3)
-#define BIP_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define BIP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define BIP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define BIP_TRACE_WARNING0(m)
-#define BIP_TRACE_WARNING1(m,p1)
-#define BIP_TRACE_WARNING2(m,p1,p2)
-#define BIP_TRACE_WARNING3(m,p1,p2,p3)
-#define BIP_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define BIP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define BIP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define BIP_TRACE_EVENT0(m)
-#define BIP_TRACE_EVENT1(m,p1)
-#define BIP_TRACE_EVENT2(m,p1,p2)
-#define BIP_TRACE_EVENT3(m,p1,p2,p3)
-#define BIP_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define BIP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define BIP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define BIP_TRACE_DEBUG0(m)
-#define BIP_TRACE_DEBUG1(m,p1)
-#define BIP_TRACE_DEBUG2(m,p1,p2)
-#define BIP_TRACE_DEBUG3(m,p1,p2,p3)
-#define BIP_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define BIP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define BIP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-#define BIP_TRACE_API0(m)
-#define BIP_TRACE_API1(m,p1)
-#define BIP_TRACE_API2(m,p1,p2)
-#define BIP_TRACE_API3(m,p1,p2,p3)
-#define BIP_TRACE_API4(m,p1,p2,p3,p4)
-#define BIP_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define BIP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-/* Define tracing for TCS
-*/
-#define TCS_TRACE_ERROR0(m)
-#define TCS_TRACE_ERROR1(m,p1)
-#define TCS_TRACE_ERROR2(m,p1,p2)
-#define TCS_TRACE_ERROR3(m,p1,p2,p3)
-#define TCS_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define TCS_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define TCS_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define TCS_TRACE_WARNING0(m)
-#define TCS_TRACE_WARNING1(m,p1)
-#define TCS_TRACE_WARNING2(m,p1,p2)
-#define TCS_TRACE_WARNING3(m,p1,p2,p3)
-#define TCS_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define TCS_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define TCS_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define TCS_TRACE_EVENT0(m)
-#define TCS_TRACE_EVENT1(m,p1)
-#define TCS_TRACE_EVENT2(m,p1,p2)
-#define TCS_TRACE_EVENT3(m,p1,p2,p3)
-#define TCS_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define TCS_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define TCS_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define TCS_TRACE_DEBUG0(m)
-#define TCS_TRACE_DEBUG1(m,p1)
-#define TCS_TRACE_DEBUG2(m,p1,p2)
-#define TCS_TRACE_DEBUG3(m,p1,p2,p3)
-#define TCS_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define TCS_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define TCS_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-#define TCS_TRACE_API0(m)
-#define TCS_TRACE_API1(m,p1)
-#define TCS_TRACE_API2(m,p1,p2)
-#define TCS_TRACE_API3(m,p1,p2,p3)
-#define TCS_TRACE_API4(m,p1,p2,p3,p4)
-#define TCS_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define TCS_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-/* Define tracing for ICP
-*/
-#define ICP_TRACE_ERROR0(m)
-#define ICP_TRACE_ERROR1(m,p1)
-#define ICP_TRACE_ERROR2(m,p1,p2)
-#define ICP_TRACE_ERROR3(m,p1,p2,p3)
-#define ICP_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define ICP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define ICP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define ICP_TRACE_WARNING0(m)
-#define ICP_TRACE_WARNING1(m,p1)
-#define ICP_TRACE_WARNING2(m,p1,p2)
-#define ICP_TRACE_WARNING3(m,p1,p2,p3)
-#define ICP_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define ICP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define ICP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define ICP_TRACE_EVENT0(m)
-#define ICP_TRACE_EVENT1(m,p1)
-#define ICP_TRACE_EVENT2(m,p1,p2)
-#define ICP_TRACE_EVENT3(m,p1,p2,p3)
-#define ICP_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define ICP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define ICP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define ICP_TRACE_DEBUG0(m)
-#define ICP_TRACE_DEBUG1(m,p1)
-#define ICP_TRACE_DEBUG2(m,p1,p2)
-#define ICP_TRACE_DEBUG3(m,p1,p2,p3)
-#define ICP_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define ICP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define ICP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-#define ICP_TRACE_API0(m)
-#define ICP_TRACE_API1(m,p1)
-#define ICP_TRACE_API2(m,p1,p2)
-#define ICP_TRACE_API3(m,p1,p2,p3)
-#define ICP_TRACE_API4(m,p1,p2,p3,p4)
-#define ICP_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define ICP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-/* Define tracing for CTP
-*/
-#define CTP_TRACE_ERROR0(m)
-#define CTP_TRACE_ERROR1(m,p1)
-#define CTP_TRACE_ERROR2(m,p1,p2)
-#define CTP_TRACE_ERROR3(m,p1,p2,p3)
-#define CTP_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define CTP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define CTP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define CTP_TRACE_WARNING0(m)
-#define CTP_TRACE_WARNING1(m,p1)
-#define CTP_TRACE_WARNING2(m,p1,p2)
-#define CTP_TRACE_WARNING3(m,p1,p2,p3)
-#define CTP_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define CTP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define CTP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define CTP_TRACE_EVENT0(m)
-#define CTP_TRACE_EVENT1(m,p1)
-#define CTP_TRACE_EVENT2(m,p1,p2)
-#define CTP_TRACE_EVENT3(m,p1,p2,p3)
-#define CTP_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define CTP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define CTP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define CTP_TRACE_DEBUG0(m)
-#define CTP_TRACE_DEBUG1(m,p1)
-#define CTP_TRACE_DEBUG2(m,p1,p2)
-#define CTP_TRACE_DEBUG3(m,p1,p2,p3)
-#define CTP_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define CTP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define CTP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-#define CTP_TRACE_API0(m)
-#define CTP_TRACE_API1(m,p1)
-#define CTP_TRACE_API2(m,p1,p2)
-#define CTP_TRACE_API3(m,p1,p2,p3)
-#define CTP_TRACE_API4(m,p1,p2,p3,p4)
-#define CTP_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define CTP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-/* define traces for headset profile */
-
-#define HSP2_TRACE_ERROR0(pcb,m)
-#define HSP2_TRACE_ERROR1(pcb,m,p1)
-#define HSP2_TRACE_ERROR2(pcb,m,p1,p2)
-#define HSP2_TRACE_ERROR3(pcb,m,p1,p2,p3)
-#define HSP2_TRACE_ERROR4(pcb,m,p1,p2,p3,p4)
-#define HSP2_TRACE_ERROR5(pcb,m,p1,p2,p3,p4,p5)
-#define HSP2_TRACE_ERROR6(pcb,m,p1,p2,p3,p4,p5,p6)
-
-#define HSP2_TRACE_WARNING0(pcb,m)
-#define HSP2_TRACE_WARNING1(pcb,m,p1)
-#define HSP2_TRACE_WARNING2(pcb,m,p1,p2)
-#define HSP2_TRACE_WARNING3(pcb,m,p1,p2,p3)
-#define HSP2_TRACE_WARNING4(pcb,m,p1,p2,p3,p4)
-#define HSP2_TRACE_WARNING5(pcb,m,p1,p2,p3,p4,p5)
-#define HSP2_TRACE_WARNING6(pcb,m,p1,p2,p3,p4,p5,p6)
-
-#define HSP2_TRACE_API0(pcb,m)
-#define HSP2_TRACE_API1(pcb,m,p1)
-#define HSP2_TRACE_API2(pcb,m,p1,p2)
-#define HSP2_TRACE_API3(pcb,m,p1,p2,p3)
-#define HSP2_TRACE_API4(pcb,m,p1,p2,p3,p4)
-#define HSP2_TRACE_API5(pcb,m,p1,p2,p3,p4,p5)
-#define HSP2_TRACE_API6(pcb,m,p1,p2,p3,p4,p5,p6)
-
-#define HSP2_TRACE_EVENT0(pcb,m)
-#define HSP2_TRACE_EVENT1(pcb,m,p1)
-#define HSP2_TRACE_EVENT2(pcb,m,p1,p2)
-#define HSP2_TRACE_EVENT3(pcb,m,p1,p2,p3)
-#define HSP2_TRACE_EVENT4(pcb,m,p1,p2,p3,p4)
-#define HSP2_TRACE_EVENT5(pcb,m,p1,p2,p3,p4,p5)
-#define HSP2_TRACE_EVENT6(pcb,m,p1,p2,p3,p4,p5,p6)
-
-#define HSP2_TRACE_DEBUG0(pcb,m)
-#define HSP2_TRACE_DEBUG1(pcb,m,p1)
-#define HSP2_TRACE_DEBUG2(pcb,m,p1,p2)
-#define HSP2_TRACE_DEBUG3(pcb,m,p1,p2,p3)
-#define HSP2_TRACE_DEBUG4(pcb,m,p1,p2,p3,p4)
-#define HSP2_TRACE_DEBUG5(pcb,m,p1,p2,p3,p4,p5)
-#define HSP2_TRACE_DEBUG6(pcb,m,p1,p2,p3,p4,p5,p6)
-
-/* Define tracing for the NFC unit
-*/
-#define NFC_TRACE_ERROR0(m)
-#define NFC_TRACE_ERROR1(m,p1)
-#define NFC_TRACE_ERROR2(m,p1,p2)
-#define NFC_TRACE_ERROR3(m,p1,p2,p3)
-#define NFC_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define NFC_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define NFC_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define NFC_TRACE_WARNING0(m)
-#define NFC_TRACE_WARNING1(m,p1)
-#define NFC_TRACE_WARNING2(m,p1,p2)
-#define NFC_TRACE_WARNING3(m,p1,p2,p3)
-#define NFC_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define NFC_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define NFC_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define NFC_TRACE_API0(m)
-#define NFC_TRACE_API1(m,p1)
-#define NFC_TRACE_API2(m,p1,p2)
-#define NFC_TRACE_API3(m,p1,p2,p3)
-#define NFC_TRACE_API4(m,p1,p2,p3,p4)
-#define NFC_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define NFC_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define NFC_TRACE_EVENT0(m)
-#define NFC_TRACE_EVENT1(m,p1)
-#define NFC_TRACE_EVENT2(m,p1,p2)
-#define NFC_TRACE_EVENT3(m,p1,p2,p3)
-#define NFC_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define NFC_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define NFC_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define NFC_TRACE_DEBUG0(m)
-#define NFC_TRACE_DEBUG1(m,p1)
-#define NFC_TRACE_DEBUG2(m,p1,p2)
-#define NFC_TRACE_DEBUG3(m,p1,p2,p3)
-#define NFC_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define NFC_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define NFC_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-#define NCI_TRACE_ERROR0(m)
-#define NCI_TRACE_ERROR1(m,p1)
-#define NCI_TRACE_ERROR2(m,p1,p2)
-#define NCI_TRACE_ERROR3(m,p1,p2,p3)
-#define NCI_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define NCI_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define NCI_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define NCI_TRACE_WARNING0(m)
-#define NCI_TRACE_WARNING1(m,p1)
-#define NCI_TRACE_WARNING2(m,p1,p2)
-#define NCI_TRACE_WARNING3(m,p1,p2,p3)
-#define NCI_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define NCI_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define NCI_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define NCI_TRACE_API0(m)
-#define NCI_TRACE_API1(m,p1)
-#define NCI_TRACE_API2(m,p1,p2)
-#define NCI_TRACE_API3(m,p1,p2,p3)
-#define NCI_TRACE_API4(m,p1,p2,p3,p4)
-#define NCI_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define NCI_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define NCI_TRACE_EVENT0(m)
-#define NCI_TRACE_EVENT1(m,p1)
-#define NCI_TRACE_EVENT2(m,p1,p2)
-#define NCI_TRACE_EVENT3(m,p1,p2,p3)
-#define NCI_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define NCI_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define NCI_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define NCI_TRACE_DEBUG0(m)
-#define NCI_TRACE_DEBUG1(m,p1)
-#define NCI_TRACE_DEBUG2(m,p1,p2)
-#define NCI_TRACE_DEBUG3(m,p1,p2,p3)
-#define NCI_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define NCI_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define NCI_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-#define RW_TRACE_ERROR0(m)
-#define RW_TRACE_ERROR1(m,p1)
-#define RW_TRACE_ERROR2(m,p1,p2)
-#define RW_TRACE_ERROR3(m,p1,p2,p3)
-#define RW_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define RW_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define RW_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define RW_TRACE_WARNING0(m)
-#define RW_TRACE_WARNING1(m,p1)
-#define RW_TRACE_WARNING2(m,p1,p2)
-#define RW_TRACE_WARNING3(m,p1,p2,p3)
-#define RW_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define RW_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define RW_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) }
-
-#define RW_TRACE_API0(m)
-#define RW_TRACE_API1(m,p1)
-#define RW_TRACE_API2(m,p1,p2)
-#define RW_TRACE_API3(m,p1,p2,p3)
-#define RW_TRACE_API4(m,p1,p2,p3,p4)
-#define RW_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define RW_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define RW_TRACE_EVENT0(m)
-#define RW_TRACE_EVENT1(m,p1)
-#define RW_TRACE_EVENT2(m,p1,p2)
-#define RW_TRACE_EVENT3(m,p1,p2,p3)
-#define RW_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define RW_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define RW_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define RW_TRACE_DEBUG0(m)
-#define RW_TRACE_DEBUG1(m,p1)
-#define RW_TRACE_DEBUG2(m,p1,p2)
-#define RW_TRACE_DEBUG3(m,p1,p2,p3)
-#define RW_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define RW_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define RW_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-#define CE_TRACE_ERROR0(m)
-#define CE_TRACE_ERROR1(m,p1)
-#define CE_TRACE_ERROR2(m,p1,p2)
-#define CE_TRACE_ERROR3(m,p1,p2,p3)
-#define CE_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define CE_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define CE_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define CE_TRACE_WARNING0(m)
-#define CE_TRACE_WARNING1(m,p1)
-#define CE_TRACE_WARNING2(m,p1,p2)
-#define CE_TRACE_WARNING3(m,p1,p2,p3)
-#define CE_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define CE_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define CE_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define CE_TRACE_API0(m)
-#define CE_TRACE_API1(m,p1)
-#define CE_TRACE_API2(m,p1,p2)
-#define CE_TRACE_API3(m,p1,p2,p3)
-#define CE_TRACE_API4(m,p1,p2,p3,p4)
-#define CE_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define CE_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define CE_TRACE_EVENT0(m)
-#define CE_TRACE_EVENT1(m,p1)
-#define CE_TRACE_EVENT2(m,p1,p2)
-#define CE_TRACE_EVENT3(m,p1,p2,p3)
-#define CE_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define CE_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define CE_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define CE_TRACE_DEBUG0(m)
-#define CE_TRACE_DEBUG1(m,p1)
-#define CE_TRACE_DEBUG2(m,p1,p2)
-#define CE_TRACE_DEBUG3(m,p1,p2,p3)
-#define CE_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define CE_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define CE_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-#define NDEF_TRACE_ERROR0(m)
-#define NDEF_TRACE_ERROR1(m,p1)
-#define NDEF_TRACE_ERROR2(m,p1,p2)
-#define NDEF_TRACE_ERROR3(m,p1,p2,p3)
-#define NDEF_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define NDEF_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define NDEF_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define NDEF_TRACE_WARNING0(m)
-#define NDEF_TRACE_WARNING1(m,p1)
-#define NDEF_TRACE_WARNING2(m,p1,p2)
-#define NDEF_TRACE_WARNING3(m,p1,p2,p3)
-#define NDEF_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define NDEF_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define NDEF_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define NDEF_TRACE_API0(m)
-#define NDEF_TRACE_API1(m,p1)
-#define NDEF_TRACE_API2(m,p1,p2)
-#define NDEF_TRACE_API3(m,p1,p2,p3)
-#define NDEF_TRACE_API4(m,p1,p2,p3,p4)
-#define NDEF_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define NDEF_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define NDEF_TRACE_EVENT0(m)
-#define NDEF_TRACE_EVENT1(m,p1)
-#define NDEF_TRACE_EVENT2(m,p1,p2)
-#define NDEF_TRACE_EVENT3(m,p1,p2,p3)
-#define NDEF_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define NDEF_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define NDEF_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define NDEF_TRACE_DEBUG0(m)
-#define NDEF_TRACE_DEBUG1(m,p1)
-#define NDEF_TRACE_DEBUG2(m,p1,p2)
-#define NDEF_TRACE_DEBUG3(m,p1,p2,p3)
-#define NDEF_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define NDEF_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define NDEF_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-/* Define tracing for the NFA unit
-*/
-#define NFA_TRACE_ERROR0(m)
-#define NFA_TRACE_ERROR1(m,p1)
-#define NFA_TRACE_ERROR2(m,p1,p2)
-#define NFA_TRACE_ERROR3(m,p1,p2,p3)
-#define NFA_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define NFA_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define NFA_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define NFA_TRACE_WARNING0(m)
-#define NFA_TRACE_WARNING1(m,p1)
-#define NFA_TRACE_WARNING2(m,p1,p2)
-#define NFA_TRACE_WARNING3(m,p1,p2,p3)
-#define NFA_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define NFA_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define NFA_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define NFA_TRACE_API0(m)
-#define NFA_TRACE_API1(m,p1)
-#define NFA_TRACE_API2(m,p1,p2)
-#define NFA_TRACE_API3(m,p1,p2,p3)
-#define NFA_TRACE_API4(m,p1,p2,p3,p4)
-#define NFA_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define NFA_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define NFA_TRACE_EVENT0(m)
-#define NFA_TRACE_EVENT1(m,p1)
-#define NFA_TRACE_EVENT2(m,p1,p2)
-#define NFA_TRACE_EVENT3(m,p1,p2,p3)
-#define NFA_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define NFA_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define NFA_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define NFA_TRACE_DEBUG0(m)
-#define NFA_TRACE_DEBUG1(m,p1)
-#define NFA_TRACE_DEBUG2(m,p1,p2)
-#define NFA_TRACE_DEBUG3(m,p1,p2,p3)
-#define NFA_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define NFA_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define NFA_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
+#define GAP_TRACE_ERROR(...)
+#define GAP_TRACE_EVENT(...)
+#define GAP_TRACE_API(...)
+#define GAP_TRACE_WARNING(...)
/* define traces for HID Host */
-#define HIDH_TRACE_ERROR0(m)
-#define HIDH_TRACE_ERROR1(m,p1)
-#define HIDH_TRACE_ERROR2(m,p1,p2)
-#define HIDH_TRACE_ERROR3(m,p1,p2,p3)
-#define HIDH_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define HIDH_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define HIDH_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define HIDH_TRACE_WARNING0(m)
-#define HIDH_TRACE_WARNING1(m,p1)
-#define HIDH_TRACE_WARNING2(m,p1,p2)
-#define HIDH_TRACE_WARNING3(m,p1,p2,p3)
-#define HIDH_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define HIDH_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define HIDH_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define HIDH_TRACE_API0(m)
-#define HIDH_TRACE_API1(m,p1)
-#define HIDH_TRACE_API2(m,p1,p2)
-#define HIDH_TRACE_API3(m,p1,p2,p3)
-#define HIDH_TRACE_API4(m,p1,p2,p3,p4)
-#define HIDH_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define HIDH_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define HIDH_TRACE_EVENT0(m)
-#define HIDH_TRACE_EVENT1(m,p1)
-#define HIDH_TRACE_EVENT2(m,p1,p2)
-#define HIDH_TRACE_EVENT3(m,p1,p2,p3)
-#define HIDH_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define HIDH_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define HIDH_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define HIDH_TRACE_DEBUG0(m)
-#define HIDH_TRACE_DEBUG1(m,p1)
-#define HIDH_TRACE_DEBUG2(m,p1,p2)
-#define HIDH_TRACE_DEBUG3(m,p1,p2,p3)
-#define HIDH_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define HIDH_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define HIDH_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-/* define traces for HID Device */
-#define HIDD_TRACE_ERROR0(m)
-#define HIDD_TRACE_ERROR1(m,p1)
-#define HIDD_TRACE_ERROR2(m,p1,p2)
-#define HIDD_TRACE_ERROR3(m,p1,p2,p3)
-#define HIDD_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define HIDD_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define HIDD_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define HIDD_TRACE_WARNING0(m)
-#define HIDD_TRACE_WARNING1(m,p1)
-#define HIDD_TRACE_WARNING2(m,p1,p2)
-#define HIDD_TRACE_WARNING3(m,p1,p2,p3)
-#define HIDD_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define HIDD_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define HIDD_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define HIDD_TRACE_API0(m)
-#define HIDD_TRACE_API1(m,p1)
-#define HIDD_TRACE_API2(m,p1,p2)
-#define HIDD_TRACE_API3(m,p1,p2,p3)
-#define HIDD_TRACE_API4(m,p1,p2,p3,p4)
-#define HIDD_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define HIDD_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define HIDD_TRACE_EVENT0(m)
-#define HIDD_TRACE_EVENT1(m,p1)
-#define HIDD_TRACE_EVENT2(m,p1,p2)
-#define HIDD_TRACE_EVENT3(m,p1,p2,p3)
-#define HIDD_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define HIDD_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define HIDD_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define HIDD_TRACE_DEBUG0(m)
-#define HIDD_TRACE_DEBUG1(m,p1)
-#define HIDD_TRACE_DEBUG2(m,p1,p2)
-#define HIDD_TRACE_DEBUG3(m,p1,p2,p3)
-#define HIDD_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define HIDD_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define HIDD_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-/* define traces for DUN */
-
-#define DUN_TRACE_ERROR0(m)
-#define DUN_TRACE_ERROR1(m,p1)
-#define DUN_TRACE_ERROR2(m,p1,p2)
-#define DUN_TRACE_ERROR3(m,p1,p2,p3)
-#define DUN_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define DUN_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define DUN_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define DUN_TRACE_WARNING0(m)
-#define DUN_TRACE_WARNING1(m,p1)
-#define DUN_TRACE_WARNING2(m,p1,p2)
-#define DUN_TRACE_WARNING3(m,p1,p2,p3)
-#define DUN_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define DUN_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define DUN_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define DUN_TRACE_API0(m)
-#define DUN_TRACE_API1(m,p1)
-#define DUN_TRACE_API2(m,p1,p2)
-#define DUN_TRACE_API3(m,p1,p2,p3)
-#define DUN_TRACE_API4(m,p1,p2,p3,p4)
-#define DUN_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define DUN_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define DUN_TRACE_EVENT0(m)
-#define DUN_TRACE_EVENT1(m,p1)
-#define DUN_TRACE_EVENT2(m,p1,p2)
-#define DUN_TRACE_EVENT3(m,p1,p2,p3)
-#define DUN_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define DUN_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define DUN_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define DUN_TRACE_DEBUG0(m)
-#define DUN_TRACE_DEBUG1(m,p1)
-#define DUN_TRACE_DEBUG2(m,p1,p2)
-#define DUN_TRACE_DEBUG3(m,p1,p2,p3)
-#define DUN_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define DUN_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define DUN_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-/* define traces for HCRP */
-
-#define HCRP_TRACE_ERROR0(m)
-#define HCRP_TRACE_ERROR1(m,p1)
-#define HCRP_TRACE_ERROR2(m,p1,p2)
-#define HCRP_TRACE_ERROR3(m,p1,p2,p3)
-#define HCRP_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define HCRP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define HCRP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define HCRP_TRACE_WARNING0(m)
-#define HCRP_TRACE_WARNING1(m,p1)
-#define HCRP_TRACE_WARNING2(m,p1,p2)
-#define HCRP_TRACE_WARNING3(m,p1,p2,p3)
-#define HCRP_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define HCRP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define HCRP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define HCRP_TRACE_API0(m)
-#define HCRP_TRACE_API1(m,p1)
-#define HCRP_TRACE_API2(m,p1,p2)
-#define HCRP_TRACE_API3(m,p1,p2,p3)
-#define HCRP_TRACE_API4(m,p1,p2,p3,p4)
-#define HCRP_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define HCRP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define HCRP_TRACE_EVENT0(m)
-#define HCRP_TRACE_EVENT1(m,p1)
-#define HCRP_TRACE_EVENT2(m,p1,p2)
-#define HCRP_TRACE_EVENT3(m,p1,p2,p3)
-#define HCRP_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define HCRP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define HCRP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define HCRP_TRACE_DEBUG0(m)
-#define HCRP_TRACE_DEBUG1(m,p1)
-#define HCRP_TRACE_DEBUG2(m,p1,p2)
-#define HCRP_TRACE_DEBUG3(m,p1,p2,p3)
-#define HCRP_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define HCRP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define HCRP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-
-/* define traces for HCRP */
-
-#define HCRPM_TRACE_ERROR0(m)
-#define HCRPM_TRACE_ERROR1(m,p1)
-#define HCRPM_TRACE_ERROR2(m,p1,p2)
-#define HCRPM_TRACE_ERROR3(m,p1,p2,p3)
-#define HCRPM_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define HCRPM_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define HCRPM_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define HCRPM_TRACE_WARNING0(m)
-#define HCRPM_TRACE_WARNING1(m,p1)
-#define HCRPM_TRACE_WARNING2(m,p1,p2)
-#define HCRPM_TRACE_WARNING3(m,p1,p2,p3)
-#define HCRPM_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define HCRPM_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define HCRPM_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define HCRPM_TRACE_API0(m)
-#define HCRPM_TRACE_API1(m,p1)
-#define HCRPM_TRACE_API2(m,p1,p2)
-#define HCRPM_TRACE_API3(m,p1,p2,p3)
-#define HCRPM_TRACE_API4(m,p1,p2,p3,p4)
-#define HCRPM_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define HCRPM_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define HCRPM_TRACE_EVENT0(m)
-#define HCRPM_TRACE_EVENT1(m,p1)
-#define HCRPM_TRACE_EVENT2(m,p1,p2)
-#define HCRPM_TRACE_EVENT3(m,p1,p2,p3)
-#define HCRPM_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define HCRPM_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define HCRPM_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define HCRPM_TRACE_DEBUG0(m)
-#define HCRPM_TRACE_DEBUG1(m,p1)
-#define HCRPM_TRACE_DEBUG2(m,p1,p2)
-#define HCRPM_TRACE_DEBUG3(m,p1,p2,p3)
-#define HCRPM_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define HCRPM_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define HCRPM_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-/* define traces for RPC */
-
-#define RPC_TRACE_ERROR0(m)
-#define RPC_TRACE_ERROR1(m,p1)
-#define RPC_TRACE_ERROR2(m,p1,p2)
-#define RPC_TRACE_ERROR3(m,p1,p2,p3)
-#define RPC_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define RPC_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define RPC_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define RPC_TRACE_WARNING0(m)
-#define RPC_TRACE_WARNING1(m,p1)
-#define RPC_TRACE_WARNING2(m,p1,p2)
-#define RPC_TRACE_WARNING3(m,p1,p2,p3)
-#define RPC_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define RPC_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define RPC_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define RPC_TRACE_API0(m)
-#define RPC_TRACE_API1(m,p1)
-#define RPC_TRACE_API2(m,p1,p2)
-#define RPC_TRACE_API3(m,p1,p2,p3)
-#define RPC_TRACE_API4(m,p1,p2,p3,p4)
-#define RPC_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define RPC_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define RPC_TRACE_EVENT0(m)
-#define RPC_TRACE_EVENT1(m,p1)
-#define RPC_TRACE_EVENT2(m,p1,p2)
-#define RPC_TRACE_EVENT3(m,p1,p2,p3)
-#define RPC_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define RPC_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define RPC_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define RPC_TRACE_DEBUG0(m)
-#define RPC_TRACE_DEBUG1(m,p1)
-#define RPC_TRACE_DEBUG2(m,p1,p2)
-#define RPC_TRACE_DEBUG3(m,p1,p2,p3)
-#define RPC_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define RPC_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define RPC_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
+#define HIDH_TRACE_ERROR(...)
+#define HIDH_TRACE_WARNING(...)
+#define HIDH_TRACE_API(...)
+#define HIDH_TRACE_EVENT(...)
+#define HIDH_TRACE_DEBUG(...)
/* define traces for BNEP */
-#define BNEP_TRACE_ERROR0(m)
-#define BNEP_TRACE_ERROR1(m,p1)
-#define BNEP_TRACE_ERROR2(m,p1,p2)
-#define BNEP_TRACE_ERROR3(m,p1,p2,p3)
-#define BNEP_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define BNEP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define BNEP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define BNEP_TRACE_WARNING0(m)
-#define BNEP_TRACE_WARNING1(m,p1)
-#define BNEP_TRACE_WARNING2(m,p1,p2)
-#define BNEP_TRACE_WARNING3(m,p1,p2,p3)
-#define BNEP_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define BNEP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define BNEP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define BNEP_TRACE_API0(m)
-#define BNEP_TRACE_API1(m,p1)
-#define BNEP_TRACE_API2(m,p1,p2)
-#define BNEP_TRACE_API3(m,p1,p2,p3)
-#define BNEP_TRACE_API4(m,p1,p2,p3,p4)
-#define BNEP_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define BNEP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define BNEP_TRACE_EVENT0(m)
-#define BNEP_TRACE_EVENT1(m,p1)
-#define BNEP_TRACE_EVENT2(m,p1,p2)
-#define BNEP_TRACE_EVENT3(m,p1,p2,p3)
-#define BNEP_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define BNEP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define BNEP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define BNEP_TRACE_DEBUG0(m)
-#define BNEP_TRACE_DEBUG1(m,p1)
-#define BNEP_TRACE_DEBUG2(m,p1,p2)
-#define BNEP_TRACE_DEBUG3(m,p1,p2,p3)
-#define BNEP_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define BNEP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define BNEP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-/* hid module traces */
-
-#define MSKB_TRACE_0(m)
-#define MSKB_TRACE_1(m,p1)
-#define MSKB_TRACE_2(m,p1,p2)
-#define MSKB_TRACE_3(m,p1,p2,p3)
-#define MSKB_TRACE_4(m,p1,p2,p3,p4)
-#define MSKB_TRACE_5(m,p1,p2,p3,p4,p5)
-#define MSKB_TRACE_6(m,p1,p2,p3,p4,p5,p6)
-
-#define MSKB_DEBUG_0(m)
-#define MSKB_DEBUG_1(m,p1)
-#define MSKB_DEBUG_2(m,p1,p2)
-#define MSKB_DEBUG_3(m,p1,p2,p3)
-#define MSKB_DEBUG_4(m,p1,p2,p3,p4)
-#define MSKB_DEBUG_5(m,p1,p2,p3,p4,p5)
-#define MSKB_DEBUG_6(m,p1,p2,p3,p4,p5,p6)
-
-#define MSKB_ERROR_0(m)
-#define MSKB_ERROR_1(m,p1)
-#define MSKB_ERROR_2(m,p1,p2)
-#define MSKB_ERROR_3(m,p1,p2,p3)
-#define MSKB_ERROR_4(m,p1,p2,p3,p4)
-#define MSKB_ERROR_5(m,p1,p2,p3,p4,p5)
-#define MSKB_ERROR_6(m,p1,p2,p3,p4,p5,p6)
+#define BNEP_TRACE_ERROR(...)
+#define BNEP_TRACE_WARNING(...)
+#define BNEP_TRACE_API(...)
+#define BNEP_TRACE_EVENT(...)
+#define BNEP_TRACE_DEBUG(...)
/* define traces for PAN */
-#define PAN_TRACE_ERROR0(m)
-#define PAN_TRACE_ERROR1(m,p1)
-#define PAN_TRACE_ERROR2(m,p1,p2)
-#define PAN_TRACE_ERROR3(m,p1,p2,p3)
-#define PAN_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define PAN_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define PAN_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define PAN_TRACE_WARNING0(m)
-#define PAN_TRACE_WARNING1(m,p1)
-#define PAN_TRACE_WARNING2(m,p1,p2)
-#define PAN_TRACE_WARNING3(m,p1,p2,p3)
-#define PAN_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define PAN_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define PAN_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define PAN_TRACE_API0(m)
-#define PAN_TRACE_API1(m,p1)
-#define PAN_TRACE_API2(m,p1,p2)
-#define PAN_TRACE_API3(m,p1,p2,p3)
-#define PAN_TRACE_API4(m,p1,p2,p3,p4)
-#define PAN_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define PAN_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define PAN_TRACE_EVENT0(m)
-#define PAN_TRACE_EVENT1(m,p1)
-#define PAN_TRACE_EVENT2(m,p1,p2)
-#define PAN_TRACE_EVENT3(m,p1,p2,p3)
-#define PAN_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define PAN_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define PAN_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define PAN_TRACE_DEBUG0(m)
-#define PAN_TRACE_DEBUG1(m,p1)
-#define PAN_TRACE_DEBUG2(m,p1,p2)
-#define PAN_TRACE_DEBUG3(m,p1,p2,p3)
-#define PAN_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define PAN_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define PAN_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-/* define traces for SIM */
-
-#define SAP_TRACE_ERROR0(m)
-#define SAP_TRACE_ERROR1(m,p1)
-#define SAP_TRACE_ERROR2(m,p1,p2)
-#define SAP_TRACE_ERROR3(m,p1,p2,p3)
-#define SAP_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define SAP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define SAP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define SAP_TRACE_WARNING0(m)
-#define SAP_TRACE_WARNING1(m,p1)
-#define SAP_TRACE_WARNING2(m,p1,p2)
-#define SAP_TRACE_WARNING3(m,p1,p2,p3)
-#define SAP_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define SAP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define SAP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define SAP_TRACE_API0(m)
-#define SAP_TRACE_API1(m,p1)
-#define SAP_TRACE_API2(m,p1,p2)
-#define SAP_TRACE_API3(m,p1,p2,p3)
-#define SAP_TRACE_API4(m,p1,p2,p3,p4)
-#define SAP_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define SAP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define SAP_TRACE_EVENT0(m)
-#define SAP_TRACE_EVENT1(m,p1)
-#define SAP_TRACE_EVENT2(m,p1,p2)
-#define SAP_TRACE_EVENT3(m,p1,p2,p3)
-#define SAP_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define SAP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define SAP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define SAP_TRACE_DEBUG0(m)
-#define SAP_TRACE_DEBUG1(m,p1)
-#define SAP_TRACE_DEBUG2(m,p1,p2)
-#define SAP_TRACE_DEBUG3(m,p1,p2,p3)
-#define SAP_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define SAP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define SAP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-/* Define tracing for the OPP profile
-*/
-#define OPP_TRACE_ERROR0(m)
-#define OPP_TRACE_ERROR1(m,p1)
-#define OPP_TRACE_ERROR2(m,p1,p2)
-#define OPP_TRACE_ERROR3(m,p1,p2,p3)
-#define OPP_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define OPP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define OPP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define OPP_TRACE_WARNING0(m)
-#define OPP_TRACE_WARNING1(m,p1)
-#define OPP_TRACE_WARNING2(m,p1,p2)
-#define OPP_TRACE_WARNING3(m,p1,p2,p3)
-#define OPP_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define OPP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define OPP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define OPP_TRACE_EVENT0(m)
-#define OPP_TRACE_EVENT1(m,p1)
-#define OPP_TRACE_EVENT2(m,p1,p2)
-#define OPP_TRACE_EVENT3(m,p1,p2,p3)
-#define OPP_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define OPP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define OPP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define OPP_TRACE_DEBUG0(m)
-#define OPP_TRACE_DEBUG1(m,p1)
-#define OPP_TRACE_DEBUG2(m,p1,p2)
-#define OPP_TRACE_DEBUG3(m,p1,p2,p3)
-#define OPP_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define OPP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define OPP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-#define OPP_TRACE_API0(m)
-#define OPP_TRACE_API1(m,p1)
-#define OPP_TRACE_API2(m,p1,p2)
-#define OPP_TRACE_API3(m,p1,p2,p3)
-#define OPP_TRACE_API4(m,p1,p2,p3,p4)
-#define OPP_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define OPP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-/* Define tracing for the FTP profile
-*/
-#define FTP_TRACE_ERROR0(m)
-#define FTP_TRACE_ERROR1(m,p1)
-#define FTP_TRACE_ERROR2(m,p1,p2)
-#define FTP_TRACE_ERROR3(m,p1,p2,p3)
-#define FTP_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define FTP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define FTP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define FTP_TRACE_WARNING0(m)
-#define FTP_TRACE_WARNING1(m,p1)
-#define FTP_TRACE_WARNING2(m,p1,p2)
-#define FTP_TRACE_WARNING3(m,p1,p2,p3)
-#define FTP_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define FTP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define FTP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define FTP_TRACE_EVENT0(m)
-#define FTP_TRACE_EVENT1(m,p1)
-#define FTP_TRACE_EVENT2(m,p1,p2)
-#define FTP_TRACE_EVENT3(m,p1,p2,p3)
-#define FTP_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define FTP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define FTP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define FTP_TRACE_DEBUG0(m)
-#define FTP_TRACE_DEBUG1(m,p1)
-#define FTP_TRACE_DEBUG2(m,p1,p2)
-#define FTP_TRACE_DEBUG3(m,p1,p2,p3)
-#define FTP_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define FTP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define FTP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-#define FTP_TRACE_API0(m)
-#define FTP_TRACE_API1(m,p1)
-#define FTP_TRACE_API2(m,p1,p2)
-#define FTP_TRACE_API3(m,p1,p2,p3)
-#define FTP_TRACE_API4(m,p1,p2,p3,p4)
-#define FTP_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define FTP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
+#define PAN_TRACE_ERROR(...)
+#define PAN_TRACE_WARNING(...)
+#define PAN_TRACE_API(...)
+#define PAN_TRACE_EVENT(...)
+#define PAN_TRACE_DEBUG(...)
/* Define tracing for the A2DP profile
*/
-#define A2D_TRACE_ERROR0(m)
-#define A2D_TRACE_ERROR1(m,p1)
-#define A2D_TRACE_ERROR2(m,p1,p2)
-#define A2D_TRACE_ERROR3(m,p1,p2,p3)
-#define A2D_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define A2D_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define A2D_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define A2D_TRACE_WARNING0(m)
-#define A2D_TRACE_WARNING1(m,p1)
-#define A2D_TRACE_WARNING2(m,p1,p2)
-#define A2D_TRACE_WARNING3(m,p1,p2,p3)
-#define A2D_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define A2D_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define A2D_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define A2D_TRACE_EVENT0(m)
-#define A2D_TRACE_EVENT1(m,p1)
-#define A2D_TRACE_EVENT2(m,p1,p2)
-#define A2D_TRACE_EVENT3(m,p1,p2,p3)
-#define A2D_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define A2D_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define A2D_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define A2D_TRACE_DEBUG0(m)
-#define A2D_TRACE_DEBUG1(m,p1)
-#define A2D_TRACE_DEBUG2(m,p1,p2)
-#define A2D_TRACE_DEBUG3(m,p1,p2,p3)
-#define A2D_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define A2D_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define A2D_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-#define A2D_TRACE_API0(m)
-#define A2D_TRACE_API1(m,p1)
-#define A2D_TRACE_API2(m,p1,p2)
-#define A2D_TRACE_API3(m,p1,p2,p3)
-#define A2D_TRACE_API4(m,p1,p2,p3,p4)
-#define A2D_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define A2D_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-/* Define tracing for the VDP profile
-*/
-#define VDP_TRACE_ERROR0(m)
-#define VDP_TRACE_ERROR1(m,p1)
-#define VDP_TRACE_ERROR2(m,p1,p2)
-#define VDP_TRACE_ERROR3(m,p1,p2,p3)
-#define VDP_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define VDP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define VDP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define VDP_TRACE_WARNING0(m)
-#define VDP_TRACE_WARNING1(m,p1)
-#define VDP_TRACE_WARNING2(m,p1,p2)
-#define VDP_TRACE_WARNING3(m,p1,p2,p3)
-#define VDP_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define VDP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define VDP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define VDP_TRACE_EVENT0(m)
-#define VDP_TRACE_EVENT1(m,p1)
-#define VDP_TRACE_EVENT2(m,p1,p2)
-#define VDP_TRACE_EVENT3(m,p1,p2,p3)
-#define VDP_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define VDP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define VDP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define VDP_TRACE_DEBUG0(m)
-#define VDP_TRACE_DEBUG1(m,p1)
-#define VDP_TRACE_DEBUG2(m,p1,p2)
-#define VDP_TRACE_DEBUG3(m,p1,p2,p3)
-#define VDP_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define VDP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define VDP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-#define VDP_TRACE_API0(m)
-#define VDP_TRACE_API1(m,p1)
-#define VDP_TRACE_API2(m,p1,p2)
-#define VDP_TRACE_API3(m,p1,p2,p3)
-#define VDP_TRACE_API4(m,p1,p2,p3,p4)
-#define VDP_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define VDP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-
-/* Define tracing for the LM unit
-*/
-#define LMP_TRACE_ERROR0(m)
-#define LMP_TRACE_ERROR1(m,p1)
-#define LMP_TRACE_ERROR2(m,p1,p2)
-#define LMP_TRACE_ERROR3(m,p1,p2,p3)
-#define LMP_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define LMP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define LMP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define LMP_TRACE_WARNING0(m)
-#define LMP_TRACE_WARNING1(m,p1)
-#define LMP_TRACE_WARNING2(m,p1,p2)
-#define LMP_TRACE_WARNING3(m,p1,p2,p3)
-#define LMP_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define LMP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define LMP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define LMP_TRACE_EVENT0(m)
-#define LMP_TRACE_EVENT1(m,p1)
-#define LMP_TRACE_EVENT2(m,p1,p2)
-#define LMP_TRACE_EVENT3(m,p1,p2,p3)
-#define LMP_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define LMP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define LMP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define LMP_TRACE_DEBUG0(m)
-#define LMP_TRACE_DEBUG1(m,p1)
-#define LMP_TRACE_DEBUG2(m,p1,p2)
-#define LMP_TRACE_DEBUG3(m,p1,p2,p3)
-#define LMP_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define LMP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define LMP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-/* Define tracing for the LC unit
-*/
-#define LC_TRACE_ERROR0(m)
-#define LC_TRACE_ERROR1(m,p1)
-#define LC_TRACE_ERROR2(m,p1,p2)
-#define LC_TRACE_ERROR3(m,p1,p2,p3)
-#define LC_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define LC_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define LC_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define LC_TRACE_WARNING0(m)
-#define LC_TRACE_WARNING1(m,p1)
-#define LC_TRACE_WARNING2(m,p1,p2)
-#define LC_TRACE_WARNING3(m,p1,p2,p3)
-#define LC_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define LC_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define LC_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define LC_TRACE_EVENT0(m)
-#define LC_TRACE_EVENT1(m,p1)
-#define LC_TRACE_EVENT2(m,p1,p2)
-#define LC_TRACE_EVENT3(m,p1,p2,p3)
-#define LC_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define LC_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define LC_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define LC_TRACE_DEBUG0(m)
-#define LC_TRACE_DEBUG1(m,p1)
-#define LC_TRACE_DEBUG2(m,p1,p2)
-#define LC_TRACE_DEBUG3(m,p1,p2,p3)
-#define LC_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define LC_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define LC_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-#define SDA_TRACE_ERROR0(m)
-#define SDA_TRACE_ERROR1(m,p1)
-#define SDA_TRACE_ERROR2(m,p1,p2)
-#define SDA_TRACE_ERROR3(m,p1,p2,p3)
-#define SDA_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define SDA_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define SDA_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define SDA_TRACE_WARNING0(m)
-#define SDA_TRACE_WARNING1(m,p1)
-#define SDA_TRACE_WARNING2(m,p1,p2)
-#define SDA_TRACE_WARNING3(m,p1,p2,p3)
-#define SDA_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define SDA_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define SDA_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define SDA_TRACE_EVENT0(m)
-#define SDA_TRACE_EVENT1(m,p1)
-#define SDA_TRACE_EVENT2(m,p1,p2)
-#define SDA_TRACE_EVENT3(m,p1,p2,p3)
-#define SDA_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define SDA_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define SDA_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define SDA_TRACE_DEBUG0(m)
-#define SDA_TRACE_DEBUG1(m,p1)
-#define SDA_TRACE_DEBUG2(m,p1,p2)
-#define SDA_TRACE_DEBUG3(m,p1,p2,p3)
-#define SDA_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define SDA_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define SDA_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
+#define A2D_TRACE_ERROR(...)
+#define A2D_TRACE_WARNING(...)
+#define A2D_TRACE_EVENT(...)
+#define A2D_TRACE_DEBUG(...)
+#define A2D_TRACE_API(...)
/* AVDTP
*/
-#define AVDT_TRACE_ERROR0(m)
-#define AVDT_TRACE_ERROR1(m,p1)
-#define AVDT_TRACE_ERROR2(m,p1,p2)
-#define AVDT_TRACE_ERROR3(m,p1,p2,p3)
-#define AVDT_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define AVDT_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define AVDT_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define AVDT_TRACE_WARNING0(m)
-#define AVDT_TRACE_WARNING1(m,p1)
-#define AVDT_TRACE_WARNING2(m,p1,p2)
-#define AVDT_TRACE_WARNING3(m,p1,p2,p3)
-#define AVDT_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define AVDT_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define AVDT_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define AVDT_TRACE_EVENT0(m)
-#define AVDT_TRACE_EVENT1(m,p1)
-#define AVDT_TRACE_EVENT2(m,p1,p2)
-#define AVDT_TRACE_EVENT3(m,p1,p2,p3)
-#define AVDT_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define AVDT_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define AVDT_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define AVDT_TRACE_DEBUG0(m)
-#define AVDT_TRACE_DEBUG1(m,p1)
-#define AVDT_TRACE_DEBUG2(m,p1,p2)
-#define AVDT_TRACE_DEBUG3(m,p1,p2,p3)
-#define AVDT_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define AVDT_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define AVDT_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-#define AVDT_TRACE_API0(m)
-#define AVDT_TRACE_API1(m,p1)
-#define AVDT_TRACE_API2(m,p1,p2)
-#define AVDT_TRACE_API3(m,p1,p2,p3)
-#define AVDT_TRACE_API4(m,p1,p2,p3,p4)
-#define AVDT_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define AVDT_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
+#define AVDT_TRACE_ERROR(...)
+#define AVDT_TRACE_WARNING(...)
+#define AVDT_TRACE_EVENT(...)
+#define AVDT_TRACE_DEBUG(...)
+#define AVDT_TRACE_API(...)
/* Define tracing for the AVCTP protocol
*/
-#define AVCT_TRACE_ERROR0(m)
-#define AVCT_TRACE_ERROR1(m,p1)
-#define AVCT_TRACE_ERROR2(m,p1,p2)
-#define AVCT_TRACE_ERROR3(m,p1,p2,p3)
-#define AVCT_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define AVCT_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define AVCT_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define AVCT_TRACE_WARNING0(m)
-#define AVCT_TRACE_WARNING1(m,p1)
-#define AVCT_TRACE_WARNING2(m,p1,p2)
-#define AVCT_TRACE_WARNING3(m,p1,p2,p3)
-#define AVCT_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define AVCT_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define AVCT_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define AVCT_TRACE_EVENT0(m)
-#define AVCT_TRACE_EVENT1(m,p1)
-#define AVCT_TRACE_EVENT2(m,p1,p2)
-#define AVCT_TRACE_EVENT3(m,p1,p2,p3)
-#define AVCT_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define AVCT_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define AVCT_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define AVCT_TRACE_DEBUG0(m)
-#define AVCT_TRACE_DEBUG1(m,p1)
-#define AVCT_TRACE_DEBUG2(m,p1,p2)
-#define AVCT_TRACE_DEBUG3(m,p1,p2,p3)
-#define AVCT_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define AVCT_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define AVCT_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-#define AVCT_TRACE_API0(m)
-#define AVCT_TRACE_API1(m,p1)
-#define AVCT_TRACE_API2(m,p1,p2)
-#define AVCT_TRACE_API3(m,p1,p2,p3)
-#define AVCT_TRACE_API4(m,p1,p2,p3,p4)
-#define AVCT_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define AVCT_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
+#define AVCT_TRACE_ERROR(...)
+#define AVCT_TRACE_WARNING(...)
+#define AVCT_TRACE_EVENT(...)
+#define AVCT_TRACE_DEBUG(...)
+#define AVCT_TRACE_API(...)
/* Define tracing for the AVRCP profile
*/
-#define AVRC_TRACE_ERROR0(m)
-#define AVRC_TRACE_ERROR1(m,p1)
-#define AVRC_TRACE_ERROR2(m,p1,p2)
-#define AVRC_TRACE_ERROR3(m,p1,p2,p3)
-#define AVRC_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define AVRC_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define AVRC_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define AVRC_TRACE_WARNING0(m)
-#define AVRC_TRACE_WARNING1(m,p1)
-#define AVRC_TRACE_WARNING2(m,p1,p2)
-#define AVRC_TRACE_WARNING3(m,p1,p2,p3)
-#define AVRC_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define AVRC_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define AVRC_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define AVRC_TRACE_EVENT0(m)
-#define AVRC_TRACE_EVENT1(m,p1)
-#define AVRC_TRACE_EVENT2(m,p1,p2)
-#define AVRC_TRACE_EVENT3(m,p1,p2,p3)
-#define AVRC_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define AVRC_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define AVRC_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define AVRC_TRACE_DEBUG0(m)
-#define AVRC_TRACE_DEBUG1(m,p1)
-#define AVRC_TRACE_DEBUG2(m,p1,p2)
-#define AVRC_TRACE_DEBUG3(m,p1,p2,p3)
-#define AVRC_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define AVRC_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define AVRC_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-#define AVRC_TRACE_API0(m)
-#define AVRC_TRACE_API1(m,p1)
-#define AVRC_TRACE_API2(m,p1,p2)
-#define AVRC_TRACE_API3(m,p1,p2,p3)
-#define AVRC_TRACE_API4(m,p1,p2,p3,p4)
-#define AVRC_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define AVRC_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
+#define AVRC_TRACE_ERROR(...)
+#define AVRC_TRACE_WARNING(...)
+#define AVRC_TRACE_EVENT(...)
+#define AVRC_TRACE_DEBUG(...)
+#define AVRC_TRACE_API(...)
/* MCAP
*/
-#define MCA_TRACE_ERROR0(m)
-#define MCA_TRACE_ERROR1(m,p1)
-#define MCA_TRACE_ERROR2(m,p1,p2)
-#define MCA_TRACE_ERROR3(m,p1,p2,p3)
-#define MCA_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define MCA_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define MCA_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define MCA_TRACE_WARNING0(m)
-#define MCA_TRACE_WARNING1(m,p1)
-#define MCA_TRACE_WARNING2(m,p1,p2)
-#define MCA_TRACE_WARNING3(m,p1,p2,p3)
-#define MCA_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define MCA_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define MCA_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define MCA_TRACE_EVENT0(m)
-#define MCA_TRACE_EVENT1(m,p1)
-#define MCA_TRACE_EVENT2(m,p1,p2)
-#define MCA_TRACE_EVENT3(m,p1,p2,p3)
-#define MCA_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define MCA_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define MCA_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define MCA_TRACE_DEBUG0(m)
-#define MCA_TRACE_DEBUG1(m,p1)
-#define MCA_TRACE_DEBUG2(m,p1,p2)
-#define MCA_TRACE_DEBUG3(m,p1,p2,p3)
-#define MCA_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define MCA_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define MCA_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-#define MCA_TRACE_API0(m)
-#define MCA_TRACE_API1(m,p1)
-#define MCA_TRACE_API2(m,p1,p2)
-#define MCA_TRACE_API3(m,p1,p2,p3)
-#define MCA_TRACE_API4(m,p1,p2,p3,p4)
-#define MCA_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define MCA_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-/* Define tracing for the AMP unit
-*/
-#define AMP_TRACE_ERROR0(m)
-#define AMP_TRACE_ERROR1(m,p1)
-#define AMP_TRACE_ERROR2(m,p1,p2)
-#define AMP_TRACE_ERROR3(m,p1,p2,p3)
-#define AMP_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define AMP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define AMP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define AMP_TRACE_WARNING0(m)
-#define AMP_TRACE_WARNING1(m,p1)
-#define AMP_TRACE_WARNING2(m,p1,p2)
-#define AMP_TRACE_WARNING3(m,p1,p2,p3)
-#define AMP_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define AMP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define AMP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define AMP_TRACE_API0(m)
-#define AMP_TRACE_API1(m,p1)
-#define AMP_TRACE_API2(m,p1,p2)
-#define AMP_TRACE_API3(m,p1,p2,p3)
-#define AMP_TRACE_API4(m,p1,p2,p3,p4)
-#define AMP_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define AMP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define AMP_TRACE_EVENT0(m)
-#define AMP_TRACE_EVENT1(m,p1)
-#define AMP_TRACE_EVENT2(m,p1,p2)
-#define AMP_TRACE_EVENT3(m,p1,p2,p3)
-#define AMP_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define AMP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define AMP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define AMP_TRACE_DEBUG0(m)
-#define AMP_TRACE_DEBUG1(m,p1)
-#define AMP_TRACE_DEBUG2(m,p1,p2)
-#define AMP_TRACE_DEBUG3(m,p1,p2,p3)
-#define AMP_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define AMP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define AMP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
+#define MCA_TRACE_ERROR(...)
+#define MCA_TRACE_WARNING(...)
+#define MCA_TRACE_EVENT(...)
+#define MCA_TRACE_DEBUG(...)
+#define MCA_TRACE_API(...)
/* Define tracing for the GATT
*/
-#define GATT_TRACE_ERROR0(m)
-#define GATT_TRACE_ERROR1(m,p1)
-#define GATT_TRACE_ERROR2(m,p1,p2)
-#define GATT_TRACE_ERROR3(m,p1,p2,p3)
-#define GATT_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define GATT_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define GATT_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define GATT_TRACE_WARNING0(m)
-#define GATT_TRACE_WARNING1(m,p1)
-#define GATT_TRACE_WARNING2(m,p1,p2)
-#define GATT_TRACE_WARNING3(m,p1,p2,p3)
-#define GATT_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define GATT_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define GATT_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define GATT_TRACE_API0(m)
-#define GATT_TRACE_API1(m,p1)
-#define GATT_TRACE_API2(m,p1,p2)
-#define GATT_TRACE_API3(m,p1,p2,p3)
-#define GATT_TRACE_API4(m,p1,p2,p3,p4)
-#define GATT_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define GATT_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define GATT_TRACE_EVENT0(m)
-#define GATT_TRACE_EVENT1(m,p1)
-#define GATT_TRACE_EVENT2(m,p1,p2)
-#define GATT_TRACE_EVENT3(m,p1,p2,p3)
-#define GATT_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define GATT_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define GATT_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define GATT_TRACE_DEBUG0(m)
-#define GATT_TRACE_DEBUG1(m,p1)
-#define GATT_TRACE_DEBUG2(m,p1,p2)
-#define GATT_TRACE_DEBUG3(m,p1,p2,p3)
-#define GATT_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define GATT_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define GATT_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
+#define GATT_TRACE_ERROR(...)
+#define GATT_TRACE_WARNING(...)
+#define GATT_TRACE_API(...)
+#define GATT_TRACE_EVENT(...)
+#define GATT_TRACE_DEBUG(...)
/* Define tracing for the SMP unit
*/
-#define SMP_TRACE_ERROR0(m)
-#define SMP_TRACE_ERROR1(m,p1)
-#define SMP_TRACE_ERROR2(m,p1,p2)
-#define SMP_TRACE_ERROR3(m,p1,p2,p3)
-#define SMP_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define SMP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define SMP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define SMP_TRACE_WARNING0(m)
-#define SMP_TRACE_WARNING1(m,p1)
-#define SMP_TRACE_WARNING2(m,p1,p2)
-#define SMP_TRACE_WARNING3(m,p1,p2,p3)
-#define SMP_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define SMP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define SMP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define SMP_TRACE_API0(m)
-#define SMP_TRACE_API1(m,p1)
-#define SMP_TRACE_API2(m,p1,p2)
-#define SMP_TRACE_API3(m,p1,p2,p3)
-#define SMP_TRACE_API4(m,p1,p2,p3,p4)
-#define SMP_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define SMP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define SMP_TRACE_EVENT0(m)
-#define SMP_TRACE_EVENT1(m,p1)
-#define SMP_TRACE_EVENT2(m,p1,p2)
-#define SMP_TRACE_EVENT3(m,p1,p2,p3)
-#define SMP_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define SMP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define SMP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define SMP_TRACE_DEBUG0(m)
-#define SMP_TRACE_DEBUG1(m,p1)
-#define SMP_TRACE_DEBUG2(m,p1,p2)
-#define SMP_TRACE_DEBUG3(m,p1,p2,p3)
-#define SMP_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define SMP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define SMP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
+#define SMP_TRACE_ERROR(...)
+#define SMP_TRACE_WARNING(...)
+#define SMP_TRACE_API(...)
+#define SMP_TRACE_EVENT(...)
+#define SMP_TRACE_DEBUG(...)
#endif
@@ -4449,149 +795,22 @@
extern UINT8 btif_trace_level;
/* define traces for application */
-#define BTIF_TRACE_ERROR0(m) {if (btif_trace_level >= BT_TRACE_LEVEL_ERROR) LogMsg_0(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_ERROR, (m));}
-#define BTIF_TRACE_ERROR1(m,p1) {if (btif_trace_level >= BT_TRACE_LEVEL_ERROR) LogMsg_1(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_ERROR, \
- (m), (UINT32)(p1));}
-#define BTIF_TRACE_ERROR2(m,p1,p2) {if (btif_trace_level >= BT_TRACE_LEVEL_ERROR) LogMsg_2(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_ERROR, \
- (m), (UINT32)(p1), (UINT32)(p2));}
-#define BTIF_TRACE_ERROR3(m,p1,p2,p3) {if (btif_trace_level >= BT_TRACE_LEVEL_ERROR) LogMsg_3(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_ERROR, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3));}
-#define BTIF_TRACE_ERROR4(m,p1,p2,p3,p4) {if (btif_trace_level >= BT_TRACE_LEVEL_ERROR) LogMsg_4(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_ERROR, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4));}
-#define BTIF_TRACE_ERROR5(m,p1,p2,p3,p4,p5) {if (btif_trace_level >= BT_TRACE_LEVEL_ERROR) LogMsg_5(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_ERROR, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5));}
-#define BTIF_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6) {if (btif_trace_level >= BT_TRACE_LEVEL_ERROR) LogMsg_6(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_ERROR, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5), (UINT32)(p6));}
-
-#define BTIF_TRACE_WARNING0(m) {if (btif_trace_level >= BT_TRACE_LEVEL_WARNING) LogMsg_0(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_WARNING, (m));}
-#define BTIF_TRACE_WARNING1(m,p1) {if (btif_trace_level >= BT_TRACE_LEVEL_WARNING) LogMsg_1(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_WARNING, \
- (m), (UINT32)(p1));}
-#define BTIF_TRACE_WARNING2(m,p1,p2) {if (btif_trace_level >= BT_TRACE_LEVEL_WARNING) LogMsg_2(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_WARNING, \
- (m), (UINT32)(p1), (UINT32)(p2));}
-#define BTIF_TRACE_WARNING3(m,p1,p2,p3) {if (btif_trace_level >= BT_TRACE_LEVEL_WARNING) LogMsg_3(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_WARNING, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3));}
-#define BTIF_TRACE_WARNING4(m,p1,p2,p3,p4) {if (btif_trace_level >= BT_TRACE_LEVEL_WARNING) LogMsg_4(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_WARNING, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4));}
-#define BTIF_TRACE_WARNING5(m,p1,p2,p3,p4,p5) {if (btif_trace_level >= BT_TRACE_LEVEL_WARNING) LogMsg_5(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_WARNING, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5));}
-#define BTIF_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (btif_trace_level >= BT_TRACE_LEVEL_WARNING) LogMsg_6(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_WARNING, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5), (UINT32)(p6));}
-
-#define BTIF_TRACE_API0(m) {if (btif_trace_level >= BT_TRACE_LEVEL_API) LogMsg_0(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_API, (m));}
-#define BTIF_TRACE_API1(m,p1) {if (btif_trace_level >= BT_TRACE_LEVEL_API) LogMsg_1(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_API, \
- (m), (UINT32)(p1));}
-#define BTIF_TRACE_API2(m,p1,p2) {if (btif_trace_level >= BT_TRACE_LEVEL_API) LogMsg_2(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_API, \
- (m), (UINT32)(p1), (UINT32)(p2));}
-#define BTIF_TRACE_API3(m,p1,p2,p3) {if (btif_trace_level >= BT_TRACE_LEVEL_API) LogMsg_3(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_API, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3));}
-#define BTIF_TRACE_API4(m,p1,p2,p3,p4) {if (btif_trace_level >= BT_TRACE_LEVEL_API) LogMsg_4(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_API, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4));}
-#define BTIF_TRACE_API5(m,p1,p2,p3,p4,p5) {if (btif_trace_level >= BT_TRACE_LEVEL_API) LogMsg_5(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_API, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5));}
-#define BTIF_TRACE_API6(m,p1,p2,p3,p4,p5,p6) {if (btif_trace_level >= BT_TRACE_LEVEL_API) LogMsg_6(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_API, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5), (UINT32)(p6));}
-
-#define BTIF_TRACE_EVENT0(m) {if (btif_trace_level >= BT_TRACE_LEVEL_EVENT) LogMsg_0(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_EVENT, (m));}
-#define BTIF_TRACE_EVENT1(m,p1) {if (btif_trace_level >= BT_TRACE_LEVEL_EVENT) LogMsg_1(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_EVENT, \
- (m), (UINT32)(p1));}
-#define BTIF_TRACE_EVENT2(m,p1,p2) {if (btif_trace_level >= BT_TRACE_LEVEL_EVENT) LogMsg_2(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_EVENT, \
- (m), (UINT32)(p1), (UINT32)(p2));}
-#define BTIF_TRACE_EVENT3(m,p1,p2,p3) {if (btif_trace_level >= BT_TRACE_LEVEL_EVENT) LogMsg_3(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_EVENT, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3));}
-#define BTIF_TRACE_EVENT4(m,p1,p2,p3,p4) {if (btif_trace_level >= BT_TRACE_LEVEL_EVENT) LogMsg_4(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_EVENT, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4));}
-#define BTIF_TRACE_EVENT5(m,p1,p2,p3,p4,p5) {if (btif_trace_level >= BT_TRACE_LEVEL_EVENT) LogMsg_5(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_EVENT, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5));}
-#define BTIF_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6) {if (btif_trace_level >= BT_TRACE_LEVEL_EVENT) LogMsg_6(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_EVENT, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5), (UINT32)(p6));}
-
-#define BTIF_TRACE_DEBUG0(m) {if (btif_trace_level >= BT_TRACE_LEVEL_DEBUG) LogMsg_0(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, (m));}
-#define BTIF_TRACE_DEBUG1(m,p1) {if (btif_trace_level >= BT_TRACE_LEVEL_DEBUG) LogMsg_1(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, \
- (m), (UINT32)(p1));}
-#define BTIF_TRACE_DEBUG2(m,p1,p2) {if (btif_trace_level >= BT_TRACE_LEVEL_DEBUG) LogMsg_2(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, \
- (m), (UINT32)(p1), (UINT32)(p2));}
-#define BTIF_TRACE_DEBUG3(m,p1,p2,p3) {if (btif_trace_level >= BT_TRACE_LEVEL_DEBUG) LogMsg_3(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3));}
-#define BTIF_TRACE_DEBUG4(m,p1,p2,p3,p4) {if (btif_trace_level >= BT_TRACE_LEVEL_DEBUG) LogMsg_4(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4));}
-#define BTIF_TRACE_DEBUG5(m,p1,p2,p3,p4,p5) {if (btif_trace_level >= BT_TRACE_LEVEL_DEBUG) LogMsg_5(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5));}
-#define BTIF_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6) {if (btif_trace_level >= BT_TRACE_LEVEL_DEBUG) LogMsg_6(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5), (UINT32)(p6));}
-
-#define BTIF_TRACE_VERBOSE0(m) {if (btif_trace_level >= BT_TRACE_LEVEL_VERBOSE) LogMsg_0(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, (m));}
-#define BTIF_TRACE_VERBOSE1(m,p1) {if (btif_trace_level >= BT_TRACE_LEVEL_VERBOSE) LogMsg_1(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, \
- (m), (UINT32)(p1));}
-#define BTIF_TRACE_VERBOSE2(m,p1,p2) {if (btif_trace_level >= BT_TRACE_LEVEL_VERBOSE) LogMsg_2(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, \
- (m), (UINT32)(p1), (UINT32)(p2));}
-#define BTIF_TRACE_VERBOSE3(m,p1,p2,p3) {if (btif_trace_level >= BT_TRACE_LEVEL_VERBOSE) LogMsg_3(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3));}
-#define BTIF_TRACE_VERBOSE4(m,p1,p2,p3,p4) {if (btif_trace_level >= BT_TRACE_LEVEL_VERBOSE) LogMsg_4(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4));}
-#define BTIF_TRACE_VERBOSE5(m,p1,p2,p3,p4,p5) {if (btif_trace_level >= BT_TRACE_LEVEL_VERBOSE) LogMsg_5(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5));}
-#define BTIF_TRACE_VERBOSE6(m,p1,p2,p3,p4,p5,p6) {if (btif_trace_level >= BT_TRACE_LEVEL_VERBOSE) LogMsg_6(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5), (UINT32)(p6));}
+#define BTIF_TRACE_ERROR(...) {if (btif_trace_level >= BT_TRACE_LEVEL_ERROR) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_ERROR, ##__VA_ARGS__);}
+#define BTIF_TRACE_WARNING(...) {if (btif_trace_level >= BT_TRACE_LEVEL_WARNING) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_WARNING, ##__VA_ARGS__);}
+#define BTIF_TRACE_API(...) {if (btif_trace_level >= BT_TRACE_LEVEL_API) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_API, ##__VA_ARGS__);}
+#define BTIF_TRACE_EVENT(...) {if (btif_trace_level >= BT_TRACE_LEVEL_EVENT) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_EVENT, ##__VA_ARGS__);}
+#define BTIF_TRACE_DEBUG(...) {if (btif_trace_level >= BT_TRACE_LEVEL_DEBUG) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, ##__VA_ARGS__);}
+#define BTIF_TRACE_VERBOSE(...) {if (btif_trace_level >= BT_TRACE_LEVEL_VERBOSE) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, ##__VA_ARGS__);}
#else
/* define traces for Application */
-#define BTIF_TRACE_ERROR0(m)
-#define BTIF_TRACE_ERROR1(m,p1)
-#define BTIF_TRACE_ERROR2(m,p1,p2)
-#define BTIF_TRACE_ERROR3(m,p1,p2,p3)
-#define BTIF_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define BTIF_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define BTIF_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-#define BTIF_TRACE_ERROR7(m,p1,p2,p3,p4,p5,p6,p7)
-
-
-#define BTIF_TRACE_WARNING0(m)
-#define BTIF_TRACE_WARNING1(m,p1)
-#define BTIF_TRACE_WARNING2(m,p1,p2)
-#define BTIF_TRACE_WARNING3(m,p1,p2,p3)
-#define BTIF_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define BTIF_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define BTIF_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-#define BTIF_TRACE_WARNING7(m,p1,p2,p3,p4,p5,p6,p7)
-
-
-#define BTIF_TRACE_API0(m)
-#define BTIF_TRACE_API1(m,p1)
-#define BTIF_TRACE_API2(m,p1,p2)
-#define BTIF_TRACE_API3(m,p1,p2,p3)
-#define BTIF_TRACE_API4(m,p1,p2,p3,p4)
-#define BTIF_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define BTIF_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define BTIF_TRACE_EVENT0(m)
-#define BTIF_TRACE_EVENT1(m,p1)
-#define BTIF_TRACE_EVENT2(m,p1,p2)
-#define BTIF_TRACE_EVENT3(m,p1,p2,p3)
-#define BTIF_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define BTIF_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define BTIF_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define BTIF_TRACE_DEBUG0(m)
-#define BTIF_TRACE_DEBUG1(m,p1)
-#define BTIF_TRACE_DEBUG2(m,p1,p2)
-#define BTIF_TRACE_DEBUG3(m,p1,p2,p3)
-#define BTIF_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define BTIF_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define BTIF_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-#define BTIF_TRACE_DEBUG7(m,p1,p2,p3,p4,p5,p6,p7)
-#define BTIF_TRACE_DEBUG8(m,p1,p2,p3,p4,p5,p6,p7,p8)
-
-
-
-
-#define BTIF_TRACE_VERBOSE0(m)
-#define BTIF_TRACE_VERBOSE1(m,p1)
-#define BTIF_TRACE_VERBOSE2(m,p1,p2)
-#define BTIF_TRACE_VERBOSE3(m,p1,p2,p3)
-#define BTIF_TRACE_VERBOSE4(m,p1,p2,p3,p4)
-#define BTIF_TRACE_VERBOSE5(m,p1,p2,p3,p4,p5)
-#define BTIF_TRACE_VERBOSE6(m,p1,p2,p3,p4,p5,p6)
+#define BTIF_TRACE_ERROR(...)
+#define BTIF_TRACE_WARNING(...)
+#define BTIF_TRACE_API(...)
+#define BTIF_TRACE_EVENT(...)
+#define BTIF_TRACE_DEBUG(...)
+#define BTIF_TRACE_VERBOSE(...)
#endif
@@ -4599,209 +818,25 @@
#if (BT_USE_TRACES == TRUE || BT_TRACE_APPL == TRUE)
/* define traces for application */
-#define APPL_TRACE_ERROR0(m) {if (appl_trace_level >= BT_TRACE_LEVEL_ERROR) LogMsg_0(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_ERROR, (m));}
-#define APPL_TRACE_ERROR1(m,p1) {if (appl_trace_level >= BT_TRACE_LEVEL_ERROR) LogMsg_1(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_ERROR, \
- (m), (UINT32)(p1));}
-#define APPL_TRACE_ERROR2(m,p1,p2) {if (appl_trace_level >= BT_TRACE_LEVEL_ERROR) LogMsg_2(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_ERROR, \
- (m), (UINT32)(p1), (UINT32)(p2));}
-#define APPL_TRACE_ERROR3(m,p1,p2,p3) {if (appl_trace_level >= BT_TRACE_LEVEL_ERROR) LogMsg_3(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_ERROR, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3));}
-#define APPL_TRACE_ERROR4(m,p1,p2,p3,p4) {if (appl_trace_level >= BT_TRACE_LEVEL_ERROR) LogMsg_4(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_ERROR, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4));}
-#define APPL_TRACE_ERROR5(m,p1,p2,p3,p4,p5) {if (appl_trace_level >= BT_TRACE_LEVEL_ERROR) LogMsg_5(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_ERROR, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5));}
-#define APPL_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6) {if (appl_trace_level >= BT_TRACE_LEVEL_ERROR) LogMsg_6(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_ERROR, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5), (UINT32)(p6));}
-
-#define APPL_TRACE_WARNING0(m) {if (appl_trace_level >= BT_TRACE_LEVEL_WARNING) LogMsg_0(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_WARNING, (m));}
-#define APPL_TRACE_WARNING1(m,p1) {if (appl_trace_level >= BT_TRACE_LEVEL_WARNING) LogMsg_1(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_WARNING, \
- (m), (UINT32)(p1));}
-#define APPL_TRACE_WARNING2(m,p1,p2) {if (appl_trace_level >= BT_TRACE_LEVEL_WARNING) LogMsg_2(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_WARNING, \
- (m), (UINT32)(p1), (UINT32)(p2));}
-#define APPL_TRACE_WARNING3(m,p1,p2,p3) {if (appl_trace_level >= BT_TRACE_LEVEL_WARNING) LogMsg_3(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_WARNING, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3));}
-#define APPL_TRACE_WARNING4(m,p1,p2,p3,p4) {if (appl_trace_level >= BT_TRACE_LEVEL_WARNING) LogMsg_4(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_WARNING, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4));}
-#define APPL_TRACE_WARNING5(m,p1,p2,p3,p4,p5) {if (appl_trace_level >= BT_TRACE_LEVEL_WARNING) LogMsg_5(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_WARNING, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5));}
-#define APPL_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (appl_trace_level >= BT_TRACE_LEVEL_WARNING) LogMsg_6(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_WARNING, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5), (UINT32)(p6));}
-
-#define APPL_TRACE_API0(m) {if (appl_trace_level >= BT_TRACE_LEVEL_API) LogMsg_0(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_API, (m));}
-#define APPL_TRACE_API1(m,p1) {if (appl_trace_level >= BT_TRACE_LEVEL_API) LogMsg_1(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_API, \
- (m), (UINT32)(p1));}
-#define APPL_TRACE_API2(m,p1,p2) {if (appl_trace_level >= BT_TRACE_LEVEL_API) LogMsg_2(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_API, \
- (m), (UINT32)(p1), (UINT32)(p2));}
-#define APPL_TRACE_API3(m,p1,p2,p3) {if (appl_trace_level >= BT_TRACE_LEVEL_API) LogMsg_3(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_API, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3));}
-#define APPL_TRACE_API4(m,p1,p2,p3,p4) {if (appl_trace_level >= BT_TRACE_LEVEL_API) LogMsg_4(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_API, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4));}
-#define APPL_TRACE_API5(m,p1,p2,p3,p4,p5) {if (appl_trace_level >= BT_TRACE_LEVEL_API) LogMsg_5(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_API, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5));}
-#define APPL_TRACE_API6(m,p1,p2,p3,p4,p5,p6) {if (appl_trace_level >= BT_TRACE_LEVEL_API) LogMsg_6(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_API, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5), (UINT32)(p6));}
-
-#define APPL_TRACE_EVENT0(m) {if (appl_trace_level >= BT_TRACE_LEVEL_EVENT) LogMsg_0(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_EVENT, (m));}
-#define APPL_TRACE_EVENT1(m,p1) {if (appl_trace_level >= BT_TRACE_LEVEL_EVENT) LogMsg_1(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_EVENT, \
- (m), (UINT32)(p1));}
-#define APPL_TRACE_EVENT2(m,p1,p2) {if (appl_trace_level >= BT_TRACE_LEVEL_EVENT) LogMsg_2(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_EVENT, \
- (m), (UINT32)(p1), (UINT32)(p2));}
-#define APPL_TRACE_EVENT3(m,p1,p2,p3) {if (appl_trace_level >= BT_TRACE_LEVEL_EVENT) LogMsg_3(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_EVENT, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3));}
-#define APPL_TRACE_EVENT4(m,p1,p2,p3,p4) {if (appl_trace_level >= BT_TRACE_LEVEL_EVENT) LogMsg_4(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_EVENT, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4));}
-#define APPL_TRACE_EVENT5(m,p1,p2,p3,p4,p5) {if (appl_trace_level >= BT_TRACE_LEVEL_EVENT) LogMsg_5(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_EVENT, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5));}
-#define APPL_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6) {if (appl_trace_level >= BT_TRACE_LEVEL_EVENT) LogMsg_6(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_EVENT, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5), (UINT32)(p6));}
-
-#define APPL_TRACE_DEBUG0(m) {if (appl_trace_level >= BT_TRACE_LEVEL_DEBUG) LogMsg_0(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, (m));}
-#define APPL_TRACE_DEBUG1(m,p1) {if (appl_trace_level >= BT_TRACE_LEVEL_DEBUG) LogMsg_1(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, \
- (m), (UINT32)(p1));}
-#define APPL_TRACE_DEBUG2(m,p1,p2) {if (appl_trace_level >= BT_TRACE_LEVEL_DEBUG) LogMsg_2(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, \
- (m), (UINT32)(p1), (UINT32)(p2));}
-#define APPL_TRACE_DEBUG3(m,p1,p2,p3) {if (appl_trace_level >= BT_TRACE_LEVEL_DEBUG) LogMsg_3(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3));}
-#define APPL_TRACE_DEBUG4(m,p1,p2,p3,p4) {if (appl_trace_level >= BT_TRACE_LEVEL_DEBUG) LogMsg_4(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4));}
-#define APPL_TRACE_DEBUG5(m,p1,p2,p3,p4,p5) {if (appl_trace_level >= BT_TRACE_LEVEL_DEBUG) LogMsg_5(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5));}
-#define APPL_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6) {if (appl_trace_level >= BT_TRACE_LEVEL_DEBUG) LogMsg_6(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, \
- (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5), (UINT32)(p6));}
-
-#define APPL_TRACE_VERBOSE0(m) {if (appl_trace_level >= BT_TRACE_LEVEL_VERBOSE)\
- LogMsg_0(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, (m));}
-#define APPL_TRACE_VERBOSE1(m,p1) {if (appl_trace_level >= BT_TRACE_LEVEL_VERBOSE)\
- LogMsg_1(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, (m), \
- (UINT32)(p1));}
-#define APPL_TRACE_VERBOSE2(m,p1,p2) {if (appl_trace_level >= BT_TRACE_LEVEL_VERBOSE)\
- LogMsg_2(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, (m), \
- (UINT32)(p1), (UINT32)(p2));}
-#define APPL_TRACE_VERBOSE3(m,p1,p2,p3) {if (appl_trace_level >= BT_TRACE_LEVEL_VERBOSE)\
- LogMsg_3(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, (m), \
- (UINT32)(p1), (UINT32)(p2), (UINT32)(p3));}
-#define APPL_TRACE_VERBOSE4(m,p1,p2,p3,p4) {if (appl_trace_level >= BT_TRACE_LEVEL_VERBOSE)\
- LogMsg_4(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, (m), \
- (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4));}
-#define APPL_TRACE_VERBOSE5(m,p1,p2,p3,p4,p5) {if (appl_trace_level >= BT_TRACE_LEVEL_VERBOSE)\
- LogMsg_5(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, (m), \
- (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5));}
-#define APPL_TRACE_VERBOSE6(m,p1,p2,p3,p4,p5,p6) {if (appl_trace_level >= BT_TRACE_LEVEL_VERBOSE)\
- LogMsg_6(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, (m), \
- (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5), (UINT32)(p6));}
+#define APPL_TRACE_ERROR(...) {if (appl_trace_level >= BT_TRACE_LEVEL_ERROR) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_ERROR, ##__VA_ARGS__);}
+#define APPL_TRACE_WARNING(...) {if (appl_trace_level >= BT_TRACE_LEVEL_WARNING) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_WARNING, ##__VA_ARGS__);}
+#define APPL_TRACE_API(...) {if (appl_trace_level >= BT_TRACE_LEVEL_API) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_API, ##__VA_ARGS__);}
+#define APPL_TRACE_EVENT(...) {if (appl_trace_level >= BT_TRACE_LEVEL_EVENT) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_EVENT, ##__VA_ARGS__);}
+#define APPL_TRACE_DEBUG(...) {if (appl_trace_level >= BT_TRACE_LEVEL_DEBUG) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, ##__VA_ARGS__);}
+#define APPL_TRACE_VERBOSE(...) {if (appl_trace_level >= BT_TRACE_LEVEL_VERBOSE) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, ##__VA_ARGS__);}
#else
/* define traces for Application */
-#define APPL_TRACE_ERROR0(m)
-#define APPL_TRACE_ERROR1(m,p1)
-#define APPL_TRACE_ERROR2(m,p1,p2)
-#define APPL_TRACE_ERROR3(m,p1,p2,p3)
-#define APPL_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define APPL_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define APPL_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define APPL_TRACE_WARNING0(m)
-#define APPL_TRACE_WARNING1(m,p1)
-#define APPL_TRACE_WARNING2(m,p1,p2)
-#define APPL_TRACE_WARNING3(m,p1,p2,p3)
-#define APPL_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define APPL_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define APPL_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define APPL_TRACE_API0(m)
-#define APPL_TRACE_API1(m,p1)
-#define APPL_TRACE_API2(m,p1,p2)
-#define APPL_TRACE_API3(m,p1,p2,p3)
-#define APPL_TRACE_API4(m,p1,p2,p3,p4)
-#define APPL_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define APPL_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define APPL_TRACE_EVENT0(m)
-#define APPL_TRACE_EVENT1(m,p1)
-#define APPL_TRACE_EVENT2(m,p1,p2)
-#define APPL_TRACE_EVENT3(m,p1,p2,p3)
-#define APPL_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define APPL_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define APPL_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define APPL_TRACE_DEBUG0(m)
-#define APPL_TRACE_DEBUG1(m,p1)
-#define APPL_TRACE_DEBUG2(m,p1,p2)
-#define APPL_TRACE_DEBUG3(m,p1,p2,p3)
-#define APPL_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define APPL_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define APPL_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-#define APPL_TRACE_VERBOSE0(m)
-#define APPL_TRACE_VERBOSE1(m,p1)
-#define APPL_TRACE_VERBOSE2(m,p1,p2)
-#define APPL_TRACE_VERBOSE3(m,p1,p2,p3)
-#define APPL_TRACE_VERBOSE4(m,p1,p2,p3,p4)
-#define APPL_TRACE_VERBOSE5(m,p1,p2,p3,p4,p5)
-#define APPL_TRACE_VERBOSE6(m,p1,p2,p3,p4,p5,p6)
+#define APPL_TRACE_ERROR(...)
+#define APPL_TRACE_WARNING(...)
+#define APPL_TRACE_API(...)
+#define APPL_TRACE_EVENT(...)
+#define APPL_TRACE_DEBUG(...)
+#define APPL_TRACE_VERBOSE(...)
#endif
-#if ((MMI_INCLUDED == TRUE) && (!defined(HID_MSKB_INCLUDED) || (HID_MSKB_INCLUDED == FALSE)))
-/* UI for sample applications */
-#define SAP_TRACE_0(m) MMI_Echo(m)
-#define SAP_TRACE_1(m,p1) MMI_Echo(m,p1)
-#define SAP_TRACE_2(m,p1,p2) MMI_Echo(m,p1,p2)
-#define SAP_TRACE_3(m,p1,p2,p3) MMI_Echo(m,p1,p2,p3)
-#define SAP_TRACE_4(m,p1,p2,p3,p4) MMI_Echo(m,p1,p2,p3,p4)
-#define SAP_TRACE_5(m,p1,p2,p3,p4,p5) MMI_Echo(m,p1,p2,p3,p4,p5)
-#define SAP_TRACE_6(m,p1,p2,p3,p4,p5,p6) MMI_Echo(m,p1,p2,p3,p4,p5,p6)
-#else
-#define SAP_TRACE_0(m)
-#define SAP_TRACE_1(m,p1)
-#define SAP_TRACE_2(m,p1,p2)
-#define SAP_TRACE_3(m,p1,p2,p3)
-#define SAP_TRACE_4(m,p1,p2,p3,p4)
-#define SAP_TRACE_5(m,p1,p2,p3,p4,p5)
-#define SAP_TRACE_6(m,p1,p2,p3,p4,p5,p6)
-
-#endif /* End of MMI_INCLUDED */
-#if defined(DRV_DEBUG_MSG) && (DRV_DEBUG_MSG == TRUE)
-/* Driver Trace macros
-*/
-#define DRV_TRACE_WARNING0(m) APPL_TRACE_WARNING0(m)
-#define DRV_TRACE_WARNING1(m,p1) APPL_TRACE_WARNING1(m,p1)
-#define DRV_TRACE_WARNING2(m,p1,p2) APPL_TRACE_WARNING2(m,p1,p2)
-#define DRV_TRACE_WARNING3(m,p1,p2,p3) APPL_TRACE_WARNING3(m,p1,p2,p3)
-#define DRV_TRACE_WARNING4(m,p1,p2,p3,p4) APPL_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define DRV_TRACE_WARNING5(m,p1,p2,p3,p4,p5) APPL_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define DRV_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) APPL_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-#else
-/* Driver Trace macros
-*/
-#define DRV_TRACE_WARNING0(m)
-#define DRV_TRACE_WARNING1(m,p1)
-#define DRV_TRACE_WARNING2(m,p1,p2)
-#define DRV_TRACE_WARNING3(m,p1,p2,p3)
-#define DRV_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define DRV_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define DRV_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-#endif
-
-#define DRV_TRACE_ERROR0(m) APPL_TRACE_ERROR0(m)
-#define DRV_TRACE_ERROR1(m,p1) APPL_TRACE_ERROR1(m,p1)
-#define DRV_TRACE_ERROR2(m,p1,p2) APPL_TRACE_ERROR2(m,p1,p2)
-#define DRV_TRACE_ERROR3(m,p1,p2,p3) APPL_TRACE_ERROR3(m,p1,p2,p3)
-#define DRV_TRACE_ERROR4(m,p1,p2,p3,p4) APPL_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define DRV_TRACE_ERROR5(m,p1,p2,p3,p4,p5) APPL_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define DRV_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6) APPL_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-/* Driver Trace macros
-*/
-#define DRV_TRACE_DEBUG0(m) APPL_TRACE_DEBUG0(m)
-#define DRV_TRACE_DEBUG1(m,p1) APPL_TRACE_DEBUG1(m,p1)
-#define DRV_TRACE_DEBUG2(m,p1,p2) APPL_TRACE_DEBUG2(m,p1,p2)
-#define DRV_TRACE_DEBUG3(m,p1,p2,p3) APPL_TRACE_DEBUG3(m,p1,p2,p3)
-#define DRV_TRACE_DEBUG4(m,p1,p2,p3,p4) APPL_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define DRV_TRACE_DEBUG5(m,p1,p2,p3,p4,p5) APPL_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define DRV_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6) APPL_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
/* Simplified Trace Helper Macro
*/
#if (BT_USE_TRACES == TRUE)
@@ -4835,5 +870,3 @@
#define bdla(assert_if) ((void)0)
#endif
#endif /* BT_TRACE_H */
-
-
diff --git a/include/bte.h b/include/bte.h
index 968b68a..eebabd4 100644
--- a/include/bte.h
+++ b/include/bte.h
@@ -100,12 +100,6 @@
/* Protocol trace mask */
extern UINT32 bte_proto_trace_mask;
-/* BTE version string */
-extern const UINT8 bte_version_string[];
-
-/* BTIF version string */
-extern const UINT8 btif_version_string[];
-
typedef struct tBAUD_REG_tag {
UINT8 DHBR;
UINT8 DLBR;
diff --git a/include/gki_target.h b/include/gki_target.h
index cdd7726..d71c268 100644
--- a/include/gki_target.h
+++ b/include/gki_target.h
@@ -82,7 +82,7 @@
/* The number of GKI timers in the software system. */
#ifndef GKI_NUM_TIMERS
-#define GKI_NUM_TIMERS 3
+#define GKI_NUM_TIMERS 4
#endif
/* A conversion value for translating ticks to calculate GKI timer. */
@@ -129,17 +129,6 @@
#define GKI_OS_TICKS_TO_SECS(x) ((x) / OS_TICKS_PER_SEC))
#endif
-
-/* delay in ticks before stopping system tick. */
-#ifndef GKI_DELAY_STOP_SYS_TICK
-#define GKI_DELAY_STOP_SYS_TICK 10
-#endif
-
-/* Option to guarantee no preemption during timer expiration (most system don't need this) */
-#ifndef GKI_TIMER_LIST_NOPREEMPT
-#define GKI_TIMER_LIST_NOPREEMPT FALSE
-#endif
-
/******************************************************************************
**
** Buffer configuration
@@ -316,11 +305,6 @@
#define GKI_MAX_EXCEPTION_MSGLEN 64
#endif
-#ifndef GKI_SEND_MSG_FROM_ISR
-#define GKI_SEND_MSG_FROM_ISR FALSE
-#endif
-
-
/* The following is intended to be a reserved pool for SCO
over HCI data and intentionally kept out of order */
@@ -402,23 +386,6 @@
#endif
// btla-specific --
-/* GKI Trace Macros */
-#define GKI_TRACE_0(m) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI | TRACE_TYPE_GENERIC,m)
-#define GKI_TRACE_1(m,p1) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI | TRACE_TYPE_GENERIC,m,p1)
-#define GKI_TRACE_2(m,p1,p2) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI | TRACE_TYPE_GENERIC,m,p1,p2)
-#define GKI_TRACE_3(m,p1,p2,p3) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI | TRACE_TYPE_GENERIC,m,p1,p2,p3)
-#define GKI_TRACE_4(m,p1,p2,p3,p4) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI | TRACE_TYPE_GENERIC,m,p1,p2,p3,p4)
-#define GKI_TRACE_5(m,p1,p2,p3,p4,p5) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI | TRACE_TYPE_GENERIC,m,p1,p2,p3,p4,p5)
-#define GKI_TRACE_6(m,p1,p2,p3,p4,p5,p6) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI | TRACE_TYPE_GENERIC,m,p1,p2,p3,p4,p5,p6)
-
-#define GKI_TRACE_ERROR_0(m) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI | TRACE_TYPE_ERROR,m)
-#define GKI_TRACE_ERROR_1(m,p1) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI | TRACE_TYPE_ERROR,m,p1)
-#define GKI_TRACE_ERROR_2(m,p1,p2) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI | TRACE_TYPE_ERROR,m,p1,p2)
-#define GKI_TRACE_ERROR_3(m,p1,p2,p3) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI | TRACE_TYPE_ERROR,m,p1,p2,p3)
-#define GKI_TRACE_ERROR_4(m,p1,p2,p3,p4) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI | TRACE_TYPE_ERROR,m,p1,p2,p3,p4)
-#define GKI_TRACE_ERROR_5(m,p1,p2,p3,p4,p5) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI | TRACE_TYPE_ERROR,m,p1,p2,p3,p4,p5)
-#define GKI_TRACE_ERROR_6(m,p1,p2,p3,p4,p5,p6) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI | TRACE_TYPE_ERROR,m,p1,p2,p3,p4,p5,p6)
-
#ifdef __cplusplus
extern "C"
{
diff --git a/main/Android.mk b/main/Android.mk
index 5230b32..21dfa1c 100644
--- a/main/Android.mk
+++ b/main/Android.mk
@@ -1,4 +1,4 @@
-LOCAL_PATH:= $(call my-dir)
+LOCAL_PATH := $(call my-dir)
#
# Bluetooth HW module
@@ -11,56 +11,58 @@
../btif/src/bluetooth.c
# platform specific
-LOCAL_SRC_FILES+= \
- bte_main.c \
+LOCAL_SRC_FILES += \
+ bte_conf.c \
bte_init.c \
- bte_version.c \
bte_logmsg.c \
- bte_conf.c
+ bte_main.c
# BTIF
LOCAL_SRC_FILES += \
- ../btif/src/btif_core.c \
- ../btif/src/btif_dm.c \
- ../btif/src/btif_storage.c \
- ../btif/src/btif_util.c \
- ../btif/src/btif_sm.c \
- ../btif/src/btif_hf.c \
- ../btif/src/btif_av.c \
- ../btif/src/btif_rc.c \
- ../btif/src/btif_media_task.c \
- ../btif/src/btif_hh.c \
- ../btif/src/btif_hl.c \
- ../btif/src/btif_sock.c \
- ../btif/src/btif_sock_rfc.c \
- ../btif/src/btif_sock_thread.c \
- ../btif/src/btif_sock_sdp.c \
- ../btif/src/btif_sock_util.c \
- ../btif/src/btif_pan.c \
- ../btif/src/btif_gatt.c \
- ../btif/src/btif_gatt_client.c \
- ../btif/src/btif_gatt_server.c \
- ../btif/src/btif_gatt_util.c \
- ../btif/src/btif_gatt_test.c \
- ../btif/src/btif_config.c \
- ../btif/src/btif_config_util.cpp \
- ../btif/src/btif_profile_queue.c
+ ../btif/src/btif_av.c \
+ ../btif/src/btif_config.c \
+ ../btif/src/btif_config_util.cpp \
+ ../btif/src/btif_core.c \
+ ../btif/src/btif_dm.c \
+ ../btif/src/btif_gatt.c \
+ ../btif/src/btif_gatt_client.c \
+ ../btif/src/btif_gatt_multi_adv_util.c \
+ ../btif/src/btif_gatt_server.c \
+ ../btif/src/btif_gatt_test.c \
+ ../btif/src/btif_gatt_util.c \
+ ../btif/src/btif_hf.c \
+ ../btif/src/btif_hf_client.c \
+ ../btif/src/btif_hh.c \
+ ../btif/src/btif_hl.c \
+ ../btif/src/btif_mce.c \
+ ../btif/src/btif_media_task.c \
+ ../btif/src/btif_pan.c \
+ ../btif/src/btif_profile_queue.c \
+ ../btif/src/btif_rc.c \
+ ../btif/src/btif_sm.c \
+ ../btif/src/btif_sock.c \
+ ../btif/src/btif_sock_rfc.c \
+ ../btif/src/btif_sock_sdp.c \
+ ../btif/src/btif_sock_thread.c \
+ ../btif/src/btif_sock_util.c \
+ ../btif/src/btif_storage.c \
+ ../btif/src/btif_util.c
# callouts
-LOCAL_SRC_FILES+= \
- ../btif/co/bta_sys_co.c \
- ../btif/co/bta_fs_co.c \
- ../btif/co/bta_ag_co.c \
- ../btif/co/bta_dm_co.c \
- ../btif/co/bta_av_co.c \
- ../btif/co/bta_hh_co.c \
- ../btif/co/bta_hl_co.c \
- ../btif/co/bta_pan_co.c \
- ../btif/co/bta_gattc_co.c \
- ../btif/co/bta_gatts_co.c \
+LOCAL_SRC_FILES += \
+ ../btif/co/bta_ag_co.c \
+ ../btif/co/bta_av_co.c \
+ ../btif/co/bta_dm_co.c \
+ ../btif/co/bta_fs_co.c \
+ ../btif/co/bta_gattc_co.c \
+ ../btif/co/bta_gatts_co.c \
+ ../btif/co/bta_hh_co.c \
+ ../btif/co/bta_hl_co.c \
+ ../btif/co/bta_pan_co.c \
+ ../btif/co/bta_sys_co.c
# sbc encoder
-LOCAL_SRC_FILES+= \
+LOCAL_SRC_FILES += \
../embdrv/sbc/encoder/srce/sbc_analysis.c \
../embdrv/sbc/encoder/srce/sbc_dct.c \
../embdrv/sbc/encoder/srce/sbc_dct_coeffs.c \
@@ -70,13 +72,14 @@
../embdrv/sbc/encoder/srce/sbc_encoder.c \
../embdrv/sbc/encoder/srce/sbc_packing.c \
-LOCAL_SRC_FILES+= \
+LOCAL_SRC_FILES += \
../udrv/ulinux/uipc.c
-LOCAL_C_INCLUDES+= . \
+LOCAL_C_INCLUDES += . \
$(LOCAL_PATH)/../bta/include \
$(LOCAL_PATH)/../bta/sys \
$(LOCAL_PATH)/../bta/dm \
+ $(LOCAL_PATH)/../osi/include \
$(LOCAL_PATH)/../gki/common \
$(LOCAL_PATH)/../gki/ulinux \
$(LOCAL_PATH)/../include \
@@ -92,46 +95,53 @@
$(LOCAL_PATH)/../btif/include \
$(LOCAL_PATH)/../btif/co \
$(LOCAL_PATH)/../hci/include\
- $(LOCAL_PATH)/../brcm/include \
+ $(LOCAL_PATH)/../vnd/include \
$(LOCAL_PATH)/../embdrv/sbc/encoder/include \
+ $(LOCAL_PATH)/../embdrv/sbc/decoder/include \
$(LOCAL_PATH)/../audio_a2dp_hw \
$(LOCAL_PATH)/../utils/include \
$(bdroid_C_INCLUDES) \
external/tinyxml2
-LOCAL_CFLAGS += -DBUILDCFG $(bdroid_CFLAGS) -Werror -Wno-error=maybe-uninitialized -Wno-error=uninitialized -Wno-error=unused-parameter
+LOCAL_CFLAGS += -DBUILDCFG $(bdroid_CFLAGS) -Wno-error=maybe-uninitialized -Wno-error=uninitialized -Wno-error=unused-parameter
+LOCAL_CONLYFLAGS := -std=c99
ifeq ($(TARGET_PRODUCT), full_crespo)
- LOCAL_CFLAGS += -DTARGET_CRESPO
+ LOCAL_CFLAGS += -DTARGET_CRESPO
endif
ifeq ($(TARGET_PRODUCT), full_crespo4g)
- LOCAL_CFLAGS += -DTARGET_CRESPO
+ LOCAL_CFLAGS += -DTARGET_CRESPO
endif
ifeq ($(TARGET_PRODUCT), full_maguro)
- LOCAL_CFLAGS += -DTARGET_MAGURO
+ LOCAL_CFLAGS += -DTARGET_MAGURO
endif
-# Fix this
-#ifeq ($(TARGET_VARIANT), eng)
-# LOCAL_CFLAGS += -O2 # and other production release flags
-#else
-# LOCAL_CFLAGS +=
-#endif
-
LOCAL_SHARED_LIBRARIES := \
- libcutils \
- liblog \
- libpower \
- libbt-hci \
- libbt-utils
+ libcutils \
+ libdl \
+ liblog \
+ libpower
-#LOCAL_WHOLE_STATIC_LIBRARIES := libbt-brcm_gki libbt-brcm_stack libbt-brcm_bta
-LOCAL_STATIC_LIBRARIES := libbt-brcm_gki libbt-brcm_bta libbt-brcm_stack libtinyxml2
+LOCAL_STATIC_LIBRARIES := \
+ libbt-brcm_bta \
+ libbt-brcm_gki \
+ libbt-brcm_stack \
+ libbt-hci \
+ libbt-utils \
+ libbt-qcom_sbc_decoder \
+ libosi \
+ libtinyxml2 \
+ libbt-qcom_sbc_decoder
LOCAL_MODULE := bluetooth.default
LOCAL_MODULE_RELATIVE_PATH := hw
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
-LOCAL_REQUIRED_MODULES := libbt-hci libbt-vendor bt_stack.conf bt_did.conf auto_pair_devlist.conf
+LOCAL_REQUIRED_MODULES := \
+ auto_pair_devlist.conf \
+ bt_did.conf \
+ bt_stack.conf \
+ libbt-vendor
+LOCAL_MULTILIB := 32
include $(BUILD_SHARED_LIBRARY)
diff --git a/main/bte_conf.c b/main/bte_conf.c
index ddad0c7..63ace86 100644
--- a/main/bte_conf.c
+++ b/main/bte_conf.c
@@ -16,440 +16,122 @@
*
******************************************************************************/
-/******************************************************************************
- *
- * Filename: bte_conf.c
- *
- * Description: Contains functions to conduct run-time module configuration
- * based on entries present in the .conf file
- *
- ******************************************************************************/
-
#define LOG_TAG "bte_conf"
-#include <utils/Log.h>
+#include <assert.h>
#include <stdio.h>
#include <string.h>
-#include <stdlib.h>
-#include <ctype.h>
+#include <utils/Log.h>
-#include "bt_target.h"
#include "bta_api.h"
-#include "bt_utils.h"
+#include "config.h"
-/******************************************************************************
-** Externs
-******************************************************************************/
-extern BOOLEAN hci_logging_enabled;
+// TODO: eliminate these global variables.
extern char hci_logfile[256];
+extern BOOLEAN hci_logging_enabled;
+extern BOOLEAN hci_save_log;
extern BOOLEAN trace_conf_enabled;
-void bte_trace_conf(char *p_name, char *p_conf_value);
-int device_name_cfg(char *p_conf_name, char *p_conf_value);
-int device_class_cfg(char *p_conf_name, char *p_conf_value);
-int logging_cfg_onoff(char *p_conf_name, char *p_conf_value);
-int logging_set_filepath(char *p_conf_name, char *p_conf_value);
-int trace_cfg_onoff(char *p_conf_name, char *p_conf_value);
+void bte_trace_conf_config(const config_t *config);
-BD_NAME local_device_default_name = BTM_DEF_LOCAL_NAME;
-DEV_CLASS local_device_default_class = {0x40, 0x02, 0x0C};
+// Reads the stack configuration file and populates global variables with
+// the contents of the file.
+void bte_load_conf(const char *path) {
+ assert(path != NULL);
-/******************************************************************************
-** Local type definitions
-******************************************************************************/
-#define CONF_DBG 0
-#define info(format, ...) ALOGI (format, ## __VA_ARGS__)
-#define debug(format, ...) if (CONF_DBG) ALOGD (format, ## __VA_ARGS__)
-#define error(format, ...) ALOGE (format, ## __VA_ARGS__)
+ ALOGI("%s attempt to load stack conf from %s", __func__, path);
-#define CONF_KEY_LEN 32
-#define CONF_VALUE_LEN 96
+ config_t *config = config_new(path);
+ if (!config) {
+ ALOGI("%s file >%s< not found", __func__, path);
+ return;
+ }
-#define CONF_COMMENT '#'
-#define CONF_DELIMITERS " =\n\r\t"
-#define CONF_VALUES_DELIMITERS "\"=\n\r\t"
-#define CONF_COD_DELIMITERS " {,}\t"
-#define CONF_MAX_LINE_LEN 255
+ strlcpy(hci_logfile, config_get_string(config, CONFIG_DEFAULT_SECTION, "BtSnoopFileName", ""), sizeof(hci_logfile));
+ hci_logging_enabled = config_get_bool(config, CONFIG_DEFAULT_SECTION, "BtSnoopLogOutput", false);
+ hci_save_log = config_get_bool(config, CONFIG_DEFAULT_SECTION, "BtSnoopSaveLog", false);
+ trace_conf_enabled = config_get_bool(config, CONFIG_DEFAULT_SECTION, "TraceConf", false);
-typedef int (conf_action_t)(char *p_conf_name, char *p_conf_value);
-
-typedef struct {
- const char *conf_entry;
- conf_action_t *p_action;
-} conf_entry_t;
-
-typedef struct {
- char key[CONF_KEY_LEN];
- char value[CONF_VALUE_LEN];
-} tKEY_VALUE_PAIRS;
-
-enum {
- CONF_DID,
- CONF_DID_RECORD_NUM,
- CONF_DID_PRIMARY_RECORD,
- CONF_DID_VENDOR_ID,
- CONF_DID_VENDOR_ID_SOURCE,
- CONF_DID_PRODUCT_ID,
- CONF_DID_VERSION,
- CONF_DID_CLIENT_EXECUTABLE_URL,
- CONF_DID_SERVICE_DESCRIPTION,
- CONF_DID_DOCUMENTATION_URL,
- CONF_DID_MAX
-};
-typedef UINT8 tCONF_DID;
-/******************************************************************************
-** Static variables
-******************************************************************************/
-
-/*
- * Current supported entries and corresponding action functions
- */
-/* TODO: Name and Class are duplicated with NVRAM adapter_info. Need to be sorted out */
-static const conf_entry_t conf_table[] = {
- /*{"Name", device_name_cfg},
- {"Class", device_class_cfg},*/
- {"BtSnoopLogOutput", logging_cfg_onoff},
- {"BtSnoopFileName", logging_set_filepath},
- {"TraceConf", trace_cfg_onoff},
- {(const char *) NULL, NULL}
-};
-
-static tKEY_VALUE_PAIRS did_conf_pairs[CONF_DID_MAX] = {
- { "[DID]", "" },
- { "recordNumber", "" },
- { "primaryRecord", "" },
- { "vendorId", "" },
- { "vendorIdSource", "" },
- { "productId", "" },
- { "version", "" },
- { "clientExecutableURL", "" },
- { "serviceDescription", "" },
- { "documentationURL", "" },
-};
-/*****************************************************************************
-** FUNCTIONS
-*****************************************************************************/
-
-int device_name_cfg(char *p_conf_name, char *p_conf_value)
-{
- UNUSED(p_conf_name);
- strcpy((char *)local_device_default_name, p_conf_value);
- return 0;
+ bte_trace_conf_config(config);
+ config_free(config);
}
-int device_class_cfg(char *p_conf_name, char *p_conf_value)
+#if (defined(BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
+extern int btm_ble_tx_power[BTM_BLE_ADV_TX_POWER_MAX + 1];
+void bte_load_ble_conf(const char* path)
{
- char *p_token;
- unsigned int x;
- UNUSED(p_conf_name);
+ assert(path != NULL);
- p_token = strtok(p_conf_value, CONF_COD_DELIMITERS);
- sscanf(p_token, "%x", &x);
- local_device_default_class[0] = (UINT8) x;
- p_token = strtok(NULL, CONF_COD_DELIMITERS);
- sscanf(p_token, "%x", &x);
- local_device_default_class[1] = (UINT8) x;
- p_token = strtok(NULL, CONF_COD_DELIMITERS);
- sscanf(p_token, "%x", &x);
- local_device_default_class[2] = (UINT8) x;
+ ALOGI("%s attempt to load ble stack conf from %s", __func__, path);
- return 0;
+ config_t *config = config_new(path);
+ if (!config) {
+ ALOGI("%s file >%s< not found", __func__, path);
+ return;
+ }
+
+ const char* ble_adv_tx_power = config_get_string(config, CONFIG_DEFAULT_SECTION, "BLE_ADV_TX_POWER", "");
+ if(*ble_adv_tx_power) {
+ sscanf(ble_adv_tx_power, "%d,%d,%d,%d,%d", btm_ble_tx_power, btm_ble_tx_power + 1, btm_ble_tx_power + 2,
+ btm_ble_tx_power + 3, btm_ble_tx_power + 4);
+ ALOGI("loaded btm_ble_tx_power: %d, %d, %d, %d, %d", (char)btm_ble_tx_power[0], (char)btm_ble_tx_power[1],
+ btm_ble_tx_power[2], btm_ble_tx_power[3], btm_ble_tx_power[4]);
+ }
+ config_free(config);
}
+#endif
-int logging_cfg_onoff(char *p_conf_name, char *p_conf_value)
-{
- UNUSED(p_conf_name);
- if (strcmp(p_conf_value, "true") == 0)
- hci_logging_enabled = TRUE;
- else
- hci_logging_enabled = FALSE;
- return 0;
-}
+// Parses the specified Device ID configuration file and registers the
+// Device ID records with SDP.
+void bte_load_did_conf(const char *p_path) {
+ assert(p_path != NULL);
-int logging_set_filepath(char *p_conf_name, char *p_conf_value)
-{
- UNUSED(p_conf_name);
- strcpy(hci_logfile, p_conf_value);
- return 0;
-}
-
-int trace_cfg_onoff(char *p_conf_name, char *p_conf_value)
-{
- UNUSED(p_conf_name);
- trace_conf_enabled = (strcmp(p_conf_value, "true") == 0) ? TRUE : FALSE;
- return 0;
-}
-
-/*****************************************************************************
-** CONF INTERFACE FUNCTIONS
-*****************************************************************************/
-
-/*******************************************************************************
-**
-** Function bte_load_conf
-**
-** Description Read conf entry from p_path file one by one and call
-** the corresponding config function
-**
-** Returns None
-**
-*******************************************************************************/
-void bte_load_conf(const char *p_path)
-{
- FILE *p_file;
- char *p_name;
- char *p_value;
- conf_entry_t *p_entry;
- char line[CONF_MAX_LINE_LEN+1]; /* add 1 for \0 char */
- BOOLEAN name_matched;
-
- ALOGI("Attempt to load stack conf from %s", p_path);
-
- if ((p_file = fopen(p_path, "r")) != NULL)
- {
- /* read line by line */
- while (fgets(line, CONF_MAX_LINE_LEN+1, p_file) != NULL)
- {
- if (line[0] == CONF_COMMENT)
- continue;
-
- p_name = strtok(line, CONF_DELIMITERS);
-
- if (NULL == p_name)
- {
- continue;
- }
-
- p_value = strtok(NULL, CONF_VALUES_DELIMITERS);
-
- if (NULL == p_value)
- {
- ALOGW("bte_load_conf: missing value for name: %s", p_name);
- continue;
- }
-
- name_matched = FALSE;
- p_entry = (conf_entry_t *)conf_table;
-
- while (p_entry->conf_entry != NULL)
- {
- if (strcmp(p_entry->conf_entry, (const char *)p_name) == 0)
- {
- name_matched = TRUE;
- if (p_entry->p_action != NULL)
- p_entry->p_action(p_name, p_value);
- break;
- }
-
- p_entry++;
- }
-
- if ((name_matched == FALSE) && (trace_conf_enabled == TRUE))
- {
- /* Check if this is a TRC config item */
- bte_trace_conf(p_name, p_value);
- }
- }
-
- fclose(p_file);
+ config_t *config = config_new(p_path);
+ if (!config) {
+ ALOGE("%s unable to load DID config '%s'.", __func__, p_path);
+ return;
}
- else
- {
- ALOGI( "bte_load_conf file >%s< not found", p_path);
- }
-}
-/*******************************************************************************
-**
-** Function bte_parse_did_conf
-**
-** Description Read conf entry from p_path file one by one and get
-** the corresponding config value
-**
-** Returns TRUE if success, else FALSE
-**
-*******************************************************************************/
-static BOOLEAN bte_parse_did_conf (const char *p_path, UINT32 num,
- tKEY_VALUE_PAIRS *conf_pairs, UINT32 conf_pairs_num)
-{
- UINT32 i, param_num=0, count=0, start_count=0, end_count=0, conf_num=0;
- BOOLEAN key=TRUE, conf_found=FALSE;
+ for (int i = 1; i <= BTA_DI_NUM_MAX; ++i) {
+ char section_name[16] = { 0 };
+ snprintf(section_name, sizeof(section_name), "DID%d", i);
- FILE *p_file;
- char *p;
- char line[CONF_MAX_LINE_LEN+1]; /* add 1 for \0 char */
-
- ALOGI("Attempt to load did conf from %s", p_path);
-
- if ((p_file = fopen(p_path, "r")) != NULL)
- {
- /* read line by line */
- while (fgets(line, CONF_MAX_LINE_LEN+1, p_file) != NULL)
- {
- count++;
- if (line[0] == CONF_COMMENT)
- continue;
-
- if (conf_found && (conf_num == num) && (*line == '[')) {
- conf_found = FALSE;
- end_count = count-1;
- break;
- }
-
- p = strtok(line, CONF_DELIMITERS);
- while (p != NULL) {
- if (conf_num <= num) {
- if (key) {
- if (!strcmp(p, conf_pairs[0].key)) {
- if (++conf_num == num) {
- conf_found = TRUE;
- start_count = count;
- strncpy(conf_pairs[0].value, "1", CONF_VALUE_LEN);
- }
- } else {
- if (conf_num == num) {
- for (i=1; i<conf_pairs_num; i++) {
- if (!strcmp(p, conf_pairs[i].key)) {
- param_num = i;
- break;
- }
- }
- if (i == conf_pairs_num) {
- error("Attribute %s does not belong to %s configuration",
- p, conf_pairs[0].key);
- fclose(p_file);
- return FALSE;
- }
- }
- key = FALSE;
- }
- } else {
- if ((conf_num == num) && param_num) {
- strncpy(conf_pairs[param_num].value, p, CONF_VALUE_LEN-1);
- param_num = 0;
- }
- key = TRUE;
- }
- }
- p = strtok(NULL, CONF_DELIMITERS);
- }
+ if (!config_has_section(config, section_name)) {
+ ALOGD("%s no section named %s.", __func__, section_name);
+ break;
}
- fclose(p_file);
- }
- else
- {
- ALOGI( "bte_parse_did_conf file >%s< not found", p_path);
- }
- if (!end_count)
- end_count = count;
+ tBTA_DI_RECORD record;
+ record.vendor = config_get_int(config, section_name, "vendorId", LMP_COMPID_BROADCOM);
+ record.vendor_id_source = config_get_int(config, section_name, "vendorIdSource", DI_VENDOR_ID_SOURCE_BTSIG);
+ record.product = config_get_int(config, section_name, "productId", 0);
+ record.version = config_get_int(config, section_name, "version", 0);
+ record.primary_record = config_get_bool(config, section_name, "primaryRecord", false);
+ strlcpy(record.client_executable_url, config_get_string(config, section_name, "clientExecutableURL", ""), sizeof(record.client_executable_url));
+ strlcpy(record.service_description, config_get_string(config, section_name, "serviceDescription", ""), sizeof(record.service_description));
+ strlcpy(record.documentation_url, config_get_string(config, section_name, "documentationURL", ""), sizeof(record.documentation_url));
- if (start_count) {
- debug("Read %s configuration #%u from lines %u to %u in file %s",
- conf_pairs[0].key, (unsigned int)num, (unsigned int)start_count,
- (unsigned int)end_count, p_path);
- return TRUE;
- }
-
- error("%s configuration not found in file %s", conf_pairs[0].key, p_path);
- return FALSE;
-}
-
-/*******************************************************************************
-**
-** Function bte_load_did_conf
-**
-** Description Set local Device ID records, reading from configuration files
-**
-** Returns None
-**
-*******************************************************************************/
-
-void bte_load_did_conf (const char *p_path)
-{
- tBTA_DI_RECORD rec;
- UINT32 rec_num, i, j;
-
- for (i=1; i<=BTA_DI_NUM_MAX; i++) {
- for (j=0; j<CONF_DID_MAX; j++) {
- *did_conf_pairs[j].value = 0;
+ if (record.vendor_id_source != DI_VENDOR_ID_SOURCE_BTSIG &&
+ record.vendor_id_source != DI_VENDOR_ID_SOURCE_USBIF) {
+ ALOGE("%s invalid vendor id source %d; ignoring DID record %d.", __func__, record.vendor_id_source, i);
+ continue;
}
- if (bte_parse_did_conf(p_path, i, did_conf_pairs, CONF_DID_MAX)) {
- memset(&rec, 0, sizeof(rec));
+ ALOGD("Device ID record %d : %s", i, (record.primary_record ? "primary" : "not primary"));
+ ALOGD(" vendorId = %04x", record.vendor);
+ ALOGD(" vendorIdSource = %04x", record.vendor_id_source);
+ ALOGD(" product = %04x", record.product);
+ ALOGD(" version = %04x", record.version);
+ ALOGD(" clientExecutableURL = %s", record.client_executable_url);
+ ALOGD(" serviceDescription = %s", record.service_description);
+ ALOGD(" documentationURL = %s", record.documentation_url);
- if (*did_conf_pairs[CONF_DID_RECORD_NUM].value) {
- rec_num = (UINT32)(strtoul(did_conf_pairs[CONF_DID_RECORD_NUM].value, NULL, 0)-1);
- } else {
- debug("[%d] Unknown %s", (unsigned int)i, did_conf_pairs[CONF_DID_RECORD_NUM].key);
- continue;
- }
-
- if (*did_conf_pairs[CONF_DID_VENDOR_ID].value) {
- rec.vendor = (UINT16)strtoul(did_conf_pairs[CONF_DID_VENDOR_ID].value, NULL, 0);
- } else {
- rec.vendor = LMP_COMPID_BROADCOM;
- }
-
- if (*did_conf_pairs[CONF_DID_VENDOR_ID_SOURCE].value) {
- rec.vendor_id_source = (UINT16)strtoul(did_conf_pairs[CONF_DID_VENDOR_ID_SOURCE].value, NULL, 0);
- } else {
- rec.vendor_id_source = DI_VENDOR_ID_SOURCE_BTSIG;
- }
-
- if ((*did_conf_pairs[CONF_DID].value == 0) ||
- (rec_num >= BTA_DI_NUM_MAX) ||
- (!((rec.vendor_id_source >= DI_VENDOR_ID_SOURCE_BTSIG) &&
- (rec.vendor_id_source <= DI_VENDOR_ID_SOURCE_USBIF))) ||
- (rec.vendor == DI_VENDOR_ID_DEFAULT)) {
-
- error("DID record #%u not set", (unsigned int)i);
- for (j=0; j<CONF_DID_MAX; j++) {
- error("%s:%s", did_conf_pairs[j].key, did_conf_pairs[j].value);
- }
- continue;
- }
-
- rec.product = (UINT16)strtoul(did_conf_pairs[CONF_DID_PRODUCT_ID].value, NULL, 0);
- rec.version = (UINT16)strtoul(did_conf_pairs[CONF_DID_VERSION].value, NULL, 0);
-
- strncpy(rec.client_executable_url,
- did_conf_pairs[CONF_DID_CLIENT_EXECUTABLE_URL].value,
- SDP_MAX_ATTR_LEN);
- strncpy(rec.service_description,
- did_conf_pairs[CONF_DID_SERVICE_DESCRIPTION].value,
- SDP_MAX_ATTR_LEN);
- strncpy(rec.documentation_url,
- did_conf_pairs[CONF_DID_DOCUMENTATION_URL].value,
- SDP_MAX_ATTR_LEN);
-
- for (j=0; j<strlen(did_conf_pairs[CONF_DID_PRIMARY_RECORD].value); j++) {
- did_conf_pairs[CONF_DID_PRIMARY_RECORD].value[j] =
- tolower(did_conf_pairs[CONF_DID_PRIMARY_RECORD].value[j]);
- }
- if ((!strcmp(did_conf_pairs[CONF_DID_PRIMARY_RECORD].value, "true")) ||
- (!strcmp(did_conf_pairs[CONF_DID_PRIMARY_RECORD].value, "1"))) {
- rec.primary_record = TRUE;
- } else {
- rec.primary_record = FALSE;
- }
-
- info("[%u] primary_record=%d vendor_id=0x%04X vendor_id_source=0x%04X product_id=0x%04X version=0x%04X",
- (unsigned int)rec_num+1, rec.primary_record, rec.vendor,
- rec.vendor_id_source, rec.product, rec.version);
- if (*rec.client_executable_url) {
- info(" client_executable_url=%s", rec.client_executable_url);
- }
- if (*rec.service_description) {
- info(" service_description=%s", rec.service_description);
- }
- if (*rec.documentation_url) {
- info(" documentation_url=%s", rec.documentation_url);
- }
-
- if (BTA_DmSetLocalDiRecord(&rec, &rec_num) != BTA_SUCCESS) {
- error("SetLocalDiInfo failed for #%u!", (unsigned int)i);
- }
+ uint32_t record_handle;
+ tBTA_STATUS status = BTA_DmSetLocalDiRecord(&record, &record_handle);
+ if (status != BTA_SUCCESS) {
+ ALOGE("%s unable to set device ID record %d: error %d.", __func__, i, status);
}
}
+
+ config_free(config);
}
diff --git a/main/bte_init.c b/main/bte_init.c
index b189281..3e3c1ad 100644
--- a/main/bte_init.c
+++ b/main/bte_init.c
@@ -18,7 +18,7 @@
/******************************************************************************
*
- * This module contains the routines that initialize the stack components.
+ * This module contains the routines that initialize the stack components.
* It must be called before the BTU task is started.
*
******************************************************************************/
diff --git a/main/bte_logmsg.c b/main/bte_logmsg.c
index 6c9a5eb..c9fc17e 100644
--- a/main/bte_logmsg.c
+++ b/main/bte_logmsg.c
@@ -23,11 +23,13 @@
*
******************************************************************************/
+#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
+#include "config.h"
#include "gki.h"
#include "bte.h"
@@ -206,13 +208,13 @@
//#define DBG_TRACE
#if defined( DBG_TRACE )
-#define DBG_TRACE_API0( m ) BT_TRACE_0( TRACE_LAYER_HCI, TRACE_TYPE_API, m )
-#define DBG_TRACE_WARNING2( m, p0, p1 ) BT_TRACE_2( TRACE_LAYER_BTM, (TRACE_ORG_APPL|TRACE_TYPE_WARNING), m, p0, p1 )
+#define DBG_TRACE_API0( m ) BT_TRACE( TRACE_LAYER_HCI, TRACE_TYPE_API, m )
+#define DBG_TRACE_WARNING2( m, p0, p1 ) BT_TRACE( TRACE_LAYER_BTM, (TRACE_ORG_APPL|TRACE_TYPE_WARNING), m, p0, p1 )
#else
#define DBG_TRACE_API0( m )
#define DBG_TRACE_WARNING2( m, p0, p1 )
#endif
-#define DBG_TRACE_DEBUG2( m, p0, p1 ) BT_TRACE_2( TRACE_LAYER_BTM, (TRACE_ORG_APPL|TRACE_TYPE_DEBUG), m, p0, p1 )
+#define DBG_TRACE_DEBUG2( m, p0, p1 ) BT_TRACE( TRACE_LAYER_BTM, (TRACE_ORG_APPL|TRACE_TYPE_DEBUG), m, p0, p1 )
void
LogMsg(UINT32 trace_set_mask, const char *fmt_str, ...)
@@ -329,7 +331,7 @@
BOOLEAN trace_conf_enabled = FALSE;
-void bte_trace_conf(char *p_conf_name, char *p_conf_value)
+void bte_trace_conf(const char *p_conf_name, const char *p_conf_value)
{
tBTTRC_FUNC_MAP *p_f_map = (tBTTRC_FUNC_MAP *) &bttrc_set_level_map[0];
@@ -344,6 +346,16 @@
}
}
+void bte_trace_conf_config(const config_t *config) {
+ assert(config != NULL);
+
+ for (tBTTRC_FUNC_MAP *functions = &bttrc_set_level_map[0]; functions->trc_name; ++functions) {
+ int value = config_get_int(config, CONFIG_DEFAULT_SECTION, functions->trc_name, -1);
+ if (value != -1)
+ functions->trace_level = value;
+ }
+}
+
/********************************************************************************
**
** Function Name: BTA_SysSetTraceLevel
@@ -526,121 +538,3 @@
}
#endif
}
-
-
-/********************************************************************************
- **
- ** Function Name: LogMsg_0
- **
- ** Purpose: Encodes a trace message that has no parameter arguments
- **
- ** Input Parameters: trace_set_mask: tester trace type.
- ** fmt_str: displayable string.
- ** Returns:
- ** Nothing.
- **
- *********************************************************************************/
-void LogMsg_0(UINT32 trace_set_mask, const char *fmt_str) {
- LogMsg(trace_set_mask, fmt_str);
-}
-
-/********************************************************************************
- **
- ** Function Name: LogMsg_1
- **
- ** Purpose: Encodes a trace message that has one parameter argument
- **
- ** Input Parameters: trace_set_mask: tester trace type.
- ** fmt_str: displayable string.
- ** Returns:
- ** Nothing.
- **
- *********************************************************************************/
-void LogMsg_1(UINT32 trace_set_mask, const char *fmt_str, UINT32 p1) {
-
- LogMsg(trace_set_mask, fmt_str, p1);
-}
-
-/********************************************************************************
- **
- ** Function Name: LogMsg_2
- **
- ** Purpose: Encodes a trace message that has two parameter arguments
- **
- ** Input Parameters: trace_set_mask: tester trace type.
- ** fmt_str: displayable string.
- ** Returns:
- ** Nothing.
- **
- *********************************************************************************/
-void LogMsg_2(UINT32 trace_set_mask, const char *fmt_str, UINT32 p1, UINT32 p2) {
- LogMsg(trace_set_mask, fmt_str, p1, p2);
-}
-
-/********************************************************************************
- **
- ** Function Name: LogMsg_3
- **
- ** Purpose: Encodes a trace message that has three parameter arguments
- **
- ** Input Parameters: trace_set_mask: tester trace type.
- ** fmt_str: displayable string.
- ** Returns:
- ** Nothing.
- **
- *********************************************************************************/
-void LogMsg_3(UINT32 trace_set_mask, const char *fmt_str, UINT32 p1, UINT32 p2,
- UINT32 p3) {
- LogMsg(trace_set_mask, fmt_str, p1, p2, p3);
-}
-
-/********************************************************************************
- **
- ** Function Name: LogMsg_4
- **
- ** Purpose: Encodes a trace message that has four parameter arguments
- **
- ** Input Parameters: trace_set_mask: tester trace type.
- ** fmt_str: displayable string.
- ** Returns:
- ** Nothing.
- **
- *********************************************************************************/
-void LogMsg_4(UINT32 trace_set_mask, const char *fmt_str, UINT32 p1, UINT32 p2,
- UINT32 p3, UINT32 p4) {
- LogMsg(trace_set_mask, fmt_str, p1, p2, p3, p4);
-}
-
-/********************************************************************************
- **
- ** Function Name: LogMsg_5
- **
- ** Purpose: Encodes a trace message that has five parameter arguments
- **
- ** Input Parameters: trace_set_mask: tester trace type.
- ** fmt_str: displayable string.
- ** Returns:
- ** Nothing.
- **
- *********************************************************************************/
-void LogMsg_5(UINT32 trace_set_mask, const char *fmt_str, UINT32 p1, UINT32 p2,
- UINT32 p3, UINT32 p4, UINT32 p5) {
- LogMsg(trace_set_mask, fmt_str, p1, p2, p3, p4, p5);
-}
-
-/********************************************************************************
- **
- ** Function Name: LogMsg_6
- **
- ** Purpose: Encodes a trace message that has six parameter arguments
- **
- ** Input Parameters: trace_set_mask: tester trace type.
- ** fmt_str: displayable string.
- ** Returns:
- ** Nothing.
- **
- *********************************************************************************/
-void LogMsg_6(UINT32 trace_set_mask, const char *fmt_str, UINT32 p1, UINT32 p2,
- UINT32 p3, UINT32 p4, UINT32 p5, UINT32 p6) {
- LogMsg(trace_set_mask, fmt_str, p1, p2, p3, p4, p5, p6);
-}
diff --git a/main/bte_main.c b/main/bte_main.c
old mode 100644
new mode 100755
index cf21456..75cc440
--- a/main/bte_main.c
+++ b/main/bte_main.c
@@ -35,8 +35,8 @@
#include "btu.h"
#include "bte.h"
#include "bta_api.h"
-#include "bt_hci_lib.h"
#include "bt_utils.h"
+#include "bt_hci_bdroid.h"
/*******************************************************************************
** Constants & Macros
@@ -46,6 +46,10 @@
#ifndef BTE_STACK_CONF_FILE
#define BTE_STACK_CONF_FILE "/etc/bluetooth/bt_stack.conf"
#endif
+/* Run-time configuration file for BLE*/
+#ifndef BTE_BLE_STACK_CONF_FILE
+#define BTE_BLE_STACK_CONF_FILE "/etc/bluetooth/ble_stack.conf"
+#endif
/* if not specified in .txt file then use this as default */
#ifndef HCI_LOGGING_FILENAME
@@ -78,9 +82,9 @@
******************************************************************************/
BOOLEAN hci_logging_enabled = FALSE; /* by default, turn hci log off */
BOOLEAN hci_logging_config = FALSE; /* configured from bluetooth framework */
+BOOLEAN hci_save_log = FALSE; /* save a copy of the log before starting again */
char hci_logfile[256] = HCI_LOGGING_FILENAME;
-
/*******************************************************************************
** Static variables
*******************************************************************************/
@@ -88,6 +92,8 @@
static const bt_hc_callbacks_t hc_callbacks;
static BOOLEAN lpm_enabled = FALSE;
static bt_preload_retry_cb_t preload_retry_cb;
+// Lock to serialize cleanup requests from upper layer.
+static pthread_mutex_t cleanup_lock;
/*******************************************************************************
** Static functions
@@ -107,6 +113,7 @@
BT_API void BTE_UnloadStack(void);
extern void scru_flip_bda (BD_ADDR dst, const BD_ADDR src);
extern void bte_load_conf(const char *p_path);
+extern void bte_load_ble_conf(const char *p_path);
extern bt_bdaddr_t btif_local_bd_addr;
@@ -135,7 +142,7 @@
if ( (bt_hc_if = (bt_hc_interface_t *) bt_hc_get_interface()) \
== NULL)
{
- APPL_TRACE_ERROR0("!!! Failed to get BtHostControllerInterface !!!");
+ APPL_TRACE_ERROR("!!! Failed to get BtHostControllerInterface !!!");
}
memset(&preload_retry_cb, 0, sizeof(bt_preload_retry_cb_t));
@@ -158,11 +165,17 @@
bte_main_in_hw_init();
bte_load_conf(BTE_STACK_CONF_FILE);
+#if (defined(BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
+ bte_load_ble_conf(BTE_BLE_STACK_CONF_FILE);
+#endif
#if (BTTRC_INCLUDED == TRUE)
/* Initialize trace feature */
BTTRC_TraceInit(MAX_TRACE_RAM_SIZE, &BTE_TraceLogBuf[0], BTTRC_METHOD_RAM);
#endif
+
+ pthread_mutex_init(&cleanup_lock, NULL);
+
}
/******************************************************************************
@@ -176,6 +189,8 @@
******************************************************************************/
void bte_main_shutdown()
{
+ pthread_mutex_destroy(&cleanup_lock);
+
GKI_shutdown();
}
@@ -191,20 +206,20 @@
******************************************************************************/
void bte_main_enable()
{
- APPL_TRACE_DEBUG1("%s", __FUNCTION__);
+ APPL_TRACE_DEBUG("%s", __FUNCTION__);
/* Initialize BTE control block */
BTE_Init();
lpm_enabled = FALSE;
- bte_hci_enable();
-
GKI_create_task((TASKPTR)btu_task, BTU_TASK, BTE_BTU_TASK_STR,
(UINT16 *) ((UINT8 *)bte_btu_stack + BTE_BTU_STACK_SIZE),
sizeof(bte_btu_stack));
- GKI_run(0);
+ bte_hci_enable();
+
+ GKI_run();
}
/******************************************************************************
@@ -219,12 +234,11 @@
******************************************************************************/
void bte_main_disable(void)
{
- APPL_TRACE_DEBUG1("%s", __FUNCTION__);
+ APPL_TRACE_DEBUG("%s", __FUNCTION__);
preload_stop_wait_timer();
bte_hci_disable();
GKI_destroy_task(BTU_TASK);
- GKI_freeze();
}
/******************************************************************************
@@ -253,7 +267,7 @@
return;
}
- bt_hc_if->logging(new ? BT_HC_LOGGING_ON : BT_HC_LOGGING_OFF, hci_logfile);
+ bt_hc_if->logging(new ? BT_HC_LOGGING_ON : BT_HC_LOGGING_OFF, hci_logfile, hci_save_log);
}
/******************************************************************************
@@ -267,22 +281,22 @@
******************************************************************************/
static void bte_hci_enable(void)
{
- APPL_TRACE_DEBUG1("%s", __FUNCTION__);
+ APPL_TRACE_DEBUG("%s", __FUNCTION__);
preload_start_wait_timer();
if (bt_hc_if)
{
int result = bt_hc_if->init(&hc_callbacks, btif_local_bd_addr.address);
- APPL_TRACE_EVENT1("libbt-hci init returns %d", result);
+ APPL_TRACE_EVENT("libbt-hci init returns %d", result);
assert(result == BT_HC_STATUS_SUCCESS);
if (hci_logging_enabled == TRUE || hci_logging_config == TRUE)
- bt_hc_if->logging(BT_HC_LOGGING_ON, hci_logfile);
+ bt_hc_if->logging(BT_HC_LOGGING_ON, hci_logfile, hci_save_log);
#if (defined (BT_CLEAN_TURN_ON_DISABLED) && BT_CLEAN_TURN_ON_DISABLED == TRUE)
- APPL_TRACE_DEBUG1("%s Not Turninig Off the BT before Turninig ON", __FUNCTION__);
+ APPL_TRACE_DEBUG("%s Not Turninig Off the BT before Turninig ON", __FUNCTION__);
/* Do not power off the chip before powering on if BT_CLEAN_TURN_ON_DISABLED flag
is defined and set to TRUE to avoid below mentioned issue.
@@ -316,15 +330,19 @@
******************************************************************************/
static void bte_hci_disable(void)
{
- APPL_TRACE_DEBUG1("%s", __FUNCTION__);
+ APPL_TRACE_DEBUG("%s", __FUNCTION__);
- if (bt_hc_if)
- {
- bt_hc_if->cleanup();
- bt_hc_if->set_power(BT_HC_CHIP_PWR_OFF);
- if (hci_logging_enabled == TRUE || hci_logging_config == TRUE)
- bt_hc_if->logging(BT_HC_LOGGING_OFF, hci_logfile);
- }
+ if (!bt_hc_if)
+ return;
+
+ // Cleanup is not thread safe and must be protected.
+ pthread_mutex_lock(&cleanup_lock);
+
+ if (hci_logging_enabled == TRUE || hci_logging_config == TRUE)
+ bt_hc_if->logging(BT_HC_LOGGING_OFF, hci_logfile, hci_save_log);
+ bt_hc_if->cleanup();
+
+ pthread_mutex_unlock(&cleanup_lock);
}
/*******************************************************************************
@@ -340,7 +358,7 @@
{
UNUSED(arg);
- APPL_TRACE_ERROR2("...preload_wait_timeout (retried:%d/max-retry:%d)...",
+ APPL_TRACE_ERROR("...preload_wait_timeout (retried:%d/max-retry:%d)...",
preload_retry_cb.retry_counts,
PRELOAD_MAX_RETRY_ATTEMPTS);
@@ -395,7 +413,7 @@
status = timer_settime(preload_retry_cb.timer_id, 0, &ts, 0);
if (status == -1)
- APPL_TRACE_ERROR0("Failed to fire preload watchdog timer");
+ APPL_TRACE_ERROR("Failed to fire preload watchdog timer");
}
}
@@ -451,7 +469,7 @@
(enable == TRUE) ? BT_HC_LPM_ENABLE : BT_HC_LPM_DISABLE \
);
- APPL_TRACE_EVENT2("HC lib lpm enable=%d return %d", enable, result);
+ APPL_TRACE_EVENT("HC lib lpm enable=%d return %d", enable, result);
}
/******************************************************************************
@@ -470,7 +488,7 @@
if ((bt_hc_if) && (lpm_enabled == TRUE))
result = bt_hc_if->lpm(BT_HC_LPM_WAKE_DEASSERT);
- APPL_TRACE_DEBUG1("HC lib lpm deassertion return %d", result);
+ APPL_TRACE_DEBUG("HC lib lpm deassertion return %d", result);
}
/******************************************************************************
@@ -489,10 +507,70 @@
if ((bt_hc_if) && (lpm_enabled == TRUE))
result = bt_hc_if->lpm(BT_HC_LPM_WAKE_ASSERT);
- APPL_TRACE_DEBUG1("HC lib lpm assertion return %d", result);
+ APPL_TRACE_DEBUG("HC lib lpm assertion return %d", result);
}
#endif // HCILP_INCLUDED
+
+/* NOTICE:
+ * Definitions for audio state structure, this type needs to match to
+ * the bt_vendor_op_audio_state_t type defined in bt_vendor_lib.h
+ */
+typedef struct {
+ UINT16 handle;
+ UINT16 peer_codec;
+ UINT16 state;
+} bt_hc_audio_state_t;
+
+struct bt_audio_state_tag {
+ BT_HDR hdr;
+ bt_hc_audio_state_t audio;
+};
+
+/******************************************************************************
+**
+** Function set_audio_state
+**
+** Description Sets audio state on controller state for SCO (PCM, WBS, FM)
+**
+** Parameters handle: codec related handle for SCO: sco cb idx, unused for
+** codec: BTA_AG_CODEC_MSBC, BTA_AG_CODEC_CSVD or FM codec
+** state: codec state, eg. BTA_AG_CO_AUD_STATE_SETUP
+** param: future extensions, e.g. call-in structure/event.
+**
+** Returns None
+**
+******************************************************************************/
+int set_audio_state(UINT16 handle, UINT16 codec, UINT8 state, void *param)
+{
+ struct bt_audio_state_tag *p_msg;
+ int result = -1;
+
+ APPL_TRACE_API("set_audio_state(handle: %d, codec: 0x%x, state: %d)", handle,
+ codec, state);
+ if (NULL != param)
+ APPL_TRACE_WARNING("set_audio_state() non-null param not supported");
+ p_msg = (struct bt_audio_state_tag *)GKI_getbuf(sizeof(*p_msg));
+ if (!p_msg)
+ return result;
+ p_msg->audio.handle = handle;
+ p_msg->audio.peer_codec = codec;
+ p_msg->audio.state = state;
+
+ p_msg->hdr.event = MSG_CTRL_TO_HC_CMD | (MSG_SUB_EVT_MASK & BT_HC_AUDIO_STATE);
+ p_msg->hdr.len = sizeof(p_msg->audio);
+ p_msg->hdr.offset = 0;
+ /* layer_specific shall contain return path event! for BTA events!
+ * 0 means no return message is expected. */
+ p_msg->hdr.layer_specific = 0;
+ if (bt_hc_if)
+ {
+ bt_hc_if->tx_cmd((TRANSAC)p_msg, (char *)(&p_msg->audio), sizeof(*p_msg));
+ }
+ return result;
+}
+
+
/******************************************************************************
**
** Function bte_main_hci_send
@@ -524,7 +602,7 @@
}
else
{
- APPL_TRACE_ERROR0("Invalid Controller ID. Discarding message.");
+ APPL_TRACE_ERROR("Invalid Controller ID. Discarding message.");
GKI_freebuf(p_msg);
}
}
@@ -564,7 +642,7 @@
{
UNUSED(transac);
- APPL_TRACE_EVENT1("HC preload_cb %d [0:SUCCESS 1:FAIL]", result);
+ APPL_TRACE_EVENT("HC preload_cb %d [0:SUCCESS 1:FAIL]", result);
if (result == BT_HC_PRELOAD_SUCCESS)
{
@@ -589,7 +667,7 @@
{
UNUSED(transac);
- APPL_TRACE_EVENT1("HC postload_cb %d", result);
+ APPL_TRACE_EVENT("HC postload_cb %d", result);
}
/******************************************************************************
@@ -604,7 +682,7 @@
******************************************************************************/
static void lpm_cb(bt_hc_lpm_request_result_t result)
{
- APPL_TRACE_EVENT1("HC lpm_result_cb %d", result);
+ APPL_TRACE_EVENT("HC lpm_result_cb %d", result);
lpm_enabled = (result == BT_HC_LPM_ENABLED) ? TRUE : FALSE;
}
@@ -620,7 +698,7 @@
******************************************************************************/
static void hostwake_ind(bt_hc_low_power_event_t event)
{
- APPL_TRACE_EVENT1("HC hostwake_ind %d", event);
+ APPL_TRACE_EVENT("HC hostwake_ind %d", event);
}
/******************************************************************************
@@ -638,14 +716,22 @@
BT_HDR *p_hdr = NULL;
/*
- APPL_TRACE_DEBUG1("HC alloc size=%d", size);
+ APPL_TRACE_DEBUG("HC alloc size=%d", size);
*/
+ /* Requested buffer size cannot exceed GKI_MAX_BUF_SIZE. */
+ if (size > GKI_MAX_BUF_SIZE)
+ {
+ APPL_TRACE_ERROR("HCI DATA SIZE %d greater than MAX %d",
+ size, GKI_MAX_BUF_SIZE);
+ return NULL;
+ }
+
p_hdr = (BT_HDR *) GKI_getbuf ((UINT16) size);
if (p_hdr == NULL)
{
- APPL_TRACE_WARNING0("alloc returns NO BUFFER!");
+ APPL_TRACE_WARNING("alloc returns NO BUFFER! (sz %d)", size);
}
return ((char *) p_hdr);
@@ -661,18 +747,12 @@
**
** Bluedroid libbt-hci library uses 'transac' parameter to
** pass data-path buffer/packet across bt_hci_lib interface
-** boundary. The 'p_buf' is not intended to be used here
-** but might point to data portion of data-path buffer.
-**
-** Returns bt_hc_status_t
+** boundary.
**
******************************************************************************/
-static int dealloc(TRANSAC transac, char *p_buf)
+static void dealloc(TRANSAC transac)
{
- UNUSED(p_buf);
-
GKI_freebuf(transac);
- return BT_HC_STATUS_SUCCESS;
}
/******************************************************************************
@@ -702,7 +782,7 @@
UNUSED(len);
/*
- APPL_TRACE_DEBUG2("HC data_ind event=0x%04X (len=%d)", p_msg->event, len);
+ APPL_TRACE_DEBUG("HC data_ind event=0x%04X (len=%d)", p_msg->event, len);
*/
GKI_send_msg (BTU_TASK, BTU_HCI_RCV_MBOX, transac);
@@ -733,7 +813,7 @@
{
UNUSED(p_buf);
/*
- APPL_TRACE_DEBUG2("HC tx_result %d (event=%04X)", result, \
+ APPL_TRACE_DEBUG("HC tx_result %d (event=%04X)", result, \
((BT_HDR *)transac)->event);
*/
diff --git a/osi/Android.mk b/osi/Android.mk
new file mode 100644
index 0000000..91f76ef
--- /dev/null
+++ b/osi/Android.mk
@@ -0,0 +1,45 @@
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_C_INCLUDES := \
+ $(LOCAL_PATH)/include
+
+LOCAL_SRC_FILES := \
+ ./src/alarm.c \
+ ./src/config.c \
+ ./src/fixed_queue.c \
+ ./src/list.c \
+ ./src/reactor.c \
+ ./src/semaphore.c \
+ ./src/thread.c
+
+LOCAL_CFLAGS := -std=c99 -Wall -Werror
+LOCAL_MODULE := libosi
+LOCAL_MODULE_TAGS := optional
+LOCAL_SHARED_LIBRARIES := libc liblog
+LOCAL_MODULE_CLASS := STATIC_LIBRARIES
+
+include $(BUILD_STATIC_LIBRARY)
+
+#####################################################
+
+include $(CLEAR_VARS)
+
+LOCAL_C_INCLUDES := \
+ $(LOCAL_PATH)/include
+
+LOCAL_SRC_FILES := \
+ ./test/alarm_test.cpp \
+ ./test/config_test.cpp \
+ ./test/list_test.cpp \
+ ./test/reactor_test.cpp \
+ ./test/thread_test.cpp
+
+LOCAL_CFLAGS := -Wall -Werror
+LOCAL_MODULE := ositests
+LOCAL_MODULE_TAGS := tests
+LOCAL_SHARED_LIBRARIES := liblog
+LOCAL_STATIC_LIBRARIES := libosi
+
+include $(BUILD_NATIVE_TEST)
diff --git a/osi/include/alarm.h b/osi/include/alarm.h
new file mode 100644
index 0000000..7e687ba
--- /dev/null
+++ b/osi/include/alarm.h
@@ -0,0 +1,47 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 Google, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+#pragma once
+
+typedef struct alarm_t alarm_t;
+typedef uint64_t period_ms_t;
+
+// Prototype for the callback function.
+typedef void (*alarm_callback_t)(void *data);
+
+// Creates a new alarm object. The returned object must be freed by calling
+// |alarm_free|. Returns NULL on failure.
+alarm_t *alarm_new(void);
+
+// Frees an alarm object created by |alarm_new|. |alarm| may be NULL. If the
+// alarm is pending, it will be cancelled. It is not safe to call |alarm_free|
+// from inside the callback of |alarm|.
+void alarm_free(alarm_t *alarm);
+
+// Sets an alarm to fire |cb| after the given |deadline|. Note that |deadline| is the
+// number of milliseconds relative to the current time. |data| is a context variable
+// for the callback and may be NULL. |cb| will be called back in the context of an
+// unspecified thread (i.e. it will not be called back in the same thread as the caller).
+// |alarm| and |cb| may not be NULL.
+void alarm_set(alarm_t *alarm, period_ms_t deadline, alarm_callback_t cb, void *data);
+
+// This function cancels the |alarm| if it was previously set. When this call
+// returns, the caller has a guarantee that the callback is not in progress and
+// will not be called if it hasn't already been called. This function is idempotent.
+// |alarm| may not be NULL.
+void alarm_cancel(alarm_t *alarm);
diff --git a/osi/include/config.h b/osi/include/config.h
new file mode 100644
index 0000000..5e45003
--- /dev/null
+++ b/osi/include/config.h
@@ -0,0 +1,78 @@
+#pragma once
+
+// This module implements a configuration parser. Clients can query the
+// contents of a configuration file through the interface provided here.
+// The current implementation is read-only; mutations are only kept in
+// memory. This parser supports the INI file format.
+
+// Implementation notes:
+// - Key/value pairs that are not within a section are assumed to be under
+// the |CONFIG_DEFAULT_SECTION| section.
+// - Multiple sections with the same name will be merged as if they were in
+// a single section.
+// - Empty sections with no key/value pairs will be treated as if they do
+// not exist. In other words, |config_has_section| will return false for
+// empty sections.
+// - Duplicate keys in a section will overwrite previous values.
+
+#include <stdbool.h>
+
+// The default section name to use if a key/value pair is not defined within
+// a section.
+#define CONFIG_DEFAULT_SECTION "Global"
+
+struct config_t;
+typedef struct config_t config_t;
+
+// Loads the specified file and returns a handle to the config file. If there
+// was a problem loading the file or allocating memory, this function returns
+// NULL. Clients must call |config_free| on the returned handle when it is no
+// longer required. |filename| must not be NULL and must point to a readable
+// file on the filesystem.
+config_t *config_new(const char *filename);
+
+// Frees resources associated with the config file. No further operations may
+// be performed on the |config| object after calling this function. |config|
+// may be NULL.
+void config_free(config_t *config);
+
+// Returns true if the config file contains a section named |section|. If
+// the section has no key/value pairs in it, this function will return false.
+// |config| and |section| must not be NULL.
+bool config_has_section(const config_t *config, const char *section);
+
+// Returns true if the config file has a key named |key| under |section|.
+// Returns false otherwise. |config|, |section|, and |key| must not be NULL.
+bool config_has_key(const config_t *config, const char *section, const char *key);
+
+// Returns the integral value for a given |key| in |section|. If |section|
+// or |key| do not exist, or the value cannot be fully converted to an integer,
+// this function returns |def_value|. |config|, |section|, and |key| must not
+// be NULL.
+int config_get_int(const config_t *config, const char *section, const char *key, int def_value);
+
+// Returns the boolean value for a given |key| in |section|. If |section|
+// or |key| do not exist, or the value cannot be converted to a boolean, this
+// function returns |def_value|. |config|, |section|, and |key| must not be NULL.
+bool config_get_bool(const config_t *config, const char *section, const char *key, bool def_value);
+
+// Returns the string value for a given |key| in |section|. If |section| or
+// |key| do not exist, this function returns |def_value|. The returned string
+// is owned by the config module and must not be freed. |config|, |section|,
+// and |key| must not be NULL. |def_value| may be NULL.
+const char *config_get_string(const config_t *config, const char *section, const char *key, const char *def_value);
+
+// Sets an integral value for the |key| in |section|. If |key| or |section| do
+// not already exist, this function creates them. |config|, |section|, and |key|
+// must not be NULL.
+void config_set_int(config_t *config, const char *section, const char *key, int value);
+
+// Sets a boolean value for the |key| in |section|. If |key| or |section| do
+// not already exist, this function creates them. |config|, |section|, and |key|
+// must not be NULL.
+void config_set_bool(config_t *config, const char *section, const char *key, bool value);
+
+// Sets a string value for the |key| in |section|. If |key| or |section| do
+// not already exist, this function creates them. |config|, |section|, |key|, and
+// |value| must not be NULL.
+void config_set_string(config_t *config, const char *section, const char *key, const char *value);
diff --git a/osi/include/fixed_queue.h b/osi/include/fixed_queue.h
new file mode 100644
index 0000000..a3b896c
--- /dev/null
+++ b/osi/include/fixed_queue.h
@@ -0,0 +1,72 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 Google, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+#pragma once
+
+#include <stdbool.h>
+
+struct fixed_queue_t;
+typedef struct fixed_queue_t fixed_queue_t;
+
+typedef void (*fixed_queue_free_cb)(void *data);
+
+// Creates a new fixed queue with the given |capacity|. If more elements than
+// |capacity| are added to the queue, the caller is blocked until space is
+// made available in the queue. Returns NULL on failure. The caller must free
+// the returned queue with |fixed_queue_free|.
+fixed_queue_t *fixed_queue_new(size_t capacity);
+
+// Freeing a queue that is currently in use (i.e. has waiters
+// blocked on it) results in undefined behaviour.
+void fixed_queue_free(fixed_queue_t *queue, fixed_queue_free_cb free_cb);
+
+// Enqueues the given |data| into the |queue|. The caller will be blocked
+// if nore more space is available in the queue. Neither |queue| nor |data|
+// may be NULL.
+void fixed_queue_enqueue(fixed_queue_t *queue, void *data);
+
+// Dequeues the next element from |queue|. If the queue is currently empty,
+// this function will block the caller until an item is enqueued. This
+// function will never return NULL. |queue| may not be NULL.
+void *fixed_queue_dequeue(fixed_queue_t *queue);
+
+// Tries to enqueue |data| into the |queue|. This function will never block
+// the caller. If the queue capacity would be exceeded by adding one more
+// element, this function returns false immediately. Otherwise, this function
+// returns true. Neither |queue| nor |data| may be NULL.
+bool fixed_queue_try_enqueue(fixed_queue_t *queue, void *data);
+
+// Tries to dequeue an element from |queue|. This function will never block
+// the caller. If the queue is empty, this function returns NULL immediately.
+// Otherwise, the next element in the queue is returned. |queue| may not be
+// NULL.
+void *fixed_queue_try_dequeue(fixed_queue_t *queue);
+
+// This function returns a valid file descriptor. Callers may perform one
+// operation on the fd: select(2). If |select| indicates that the file
+// descriptor is readable, the caller may call |fixed_queue_enqueue| without
+// blocking. The caller must not close the returned file descriptor. |queue|
+// may not be NULL.
+int fixed_queue_get_enqueue_fd(const fixed_queue_t *queue);
+
+// This function returns a valid file descriptor. Callers may perform one
+// operation on the fd: select(2). If |select| indicates that the file
+// descriptor is readable, the caller may call |fixed_queue_dequeue| without
+// blocking. The caller must not close the returned file descriptor. |queue|
+// may not be NULL.
+int fixed_queue_get_dequeue_fd(const fixed_queue_t *queue);
diff --git a/osi/include/list.h b/osi/include/list.h
new file mode 100644
index 0000000..56cb739
--- /dev/null
+++ b/osi/include/list.h
@@ -0,0 +1,38 @@
+#pragma once
+
+#include <stdbool.h>
+#include <stdlib.h>
+
+struct list_node_t;
+typedef struct list_node_t list_node_t;
+
+struct list_t;
+typedef struct list_t list_t;
+
+typedef void (*list_free_cb)(void *data);
+typedef bool (*list_iter_cb)(void *data);
+
+// Lifecycle.
+list_t *list_new(list_free_cb callback);
+void list_free(list_t *list);
+
+// Accessors.
+bool list_is_empty(const list_t *list);
+size_t list_length(const list_t *list);
+void *list_front(const list_t *list);
+void *list_back(const list_t *list);
+
+// Mutators.
+bool list_insert_after(list_t *list, list_node_t *prev_node, void *data);
+bool list_prepend(list_t *list, void *data);
+bool list_append(list_t *list, void *data);
+bool list_remove(list_t *list, void *data);
+void list_clear(list_t *list);
+
+// Iteration.
+void list_foreach(const list_t *list, list_iter_cb callback);
+
+list_node_t *list_begin(const list_t *list);
+list_node_t *list_end(const list_t *list);
+list_node_t *list_next(const list_node_t *node);
+void *list_node(const list_node_t *node);
diff --git a/osi/include/osi.h b/osi/include/osi.h
new file mode 100644
index 0000000..6b38e9b
--- /dev/null
+++ b/osi/include/osi.h
@@ -0,0 +1,9 @@
+#pragma once
+
+#include <stdbool.h>
+#include <stdint.h>
+
+#define UNUSED_ATTR __attribute__((unused))
+#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
+
+typedef uint32_t timeout_t;
diff --git a/osi/include/reactor.h b/osi/include/reactor.h
new file mode 100644
index 0000000..eeb538d
--- /dev/null
+++ b/osi/include/reactor.h
@@ -0,0 +1,89 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 Google, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+#pragma once
+
+#include <stdbool.h>
+#include <stdint.h>
+
+#include "osi.h"
+
+// This module implements the Reactor pattern.
+// See http://en.wikipedia.org/wiki/Reactor_pattern for details.
+
+struct reactor_t;
+typedef struct reactor_t reactor_t;
+
+struct reactor_object_t;
+typedef struct reactor_object_t reactor_object_t;
+
+// Enumerates the types of events a reactor object is interested
+// in responding to.
+typedef enum {
+ REACTOR_INTEREST_READ = 1,
+ REACTOR_INTEREST_WRITE = 2,
+ REACTOR_INTEREST_READ_WRITE = 3,
+} reactor_interest_t;
+
+// Enumerates the reasons a reactor has stopped.
+typedef enum {
+ REACTOR_STATUS_STOP, // |reactor_stop| was called.
+ REACTOR_STATUS_TIMEOUT, // a timeout was specified and the reactor timed out.
+ REACTOR_STATUS_ERROR, // there was an error during the operation.
+ REACTOR_STATUS_DONE, // the reactor completed its work (for the _run_once* variants).
+} reactor_status_t;
+
+struct reactor_object_t {
+ void *context; // a context that's passed back to the *_ready functions.
+ int fd; // the file descriptor to monitor for events.
+ reactor_interest_t interest; // the event types to monitor the file descriptor for.
+
+ void (*read_ready)(void *context); // function to call when the file descriptor becomes readable.
+ void (*write_ready)(void *context); // function to call when the file descriptor becomes writeable.
+};
+
+// Creates a new reactor object. Returns NULL on failure. The returned object
+// must be freed by calling |reactor_free|.
+reactor_t *reactor_new(void);
+
+// Frees a reactor object created with |reactor_new|. |reactor| may be NULL.
+void reactor_free(reactor_t *reactor);
+
+// Starts the reactor. This function blocks the caller until |reactor_stop| is called
+// from another thread or in a callback. |reactor| may not be NULL.
+reactor_status_t reactor_start(reactor_t *reactor);
+
+// Runs one iteration of the reactor. This function blocks until at least one registered object
+// becomes ready. |reactor| may not be NULL.
+reactor_status_t reactor_run_once(reactor_t *reactor);
+
+// Same as |reactor_run_once| with a bounded wait time in case no object becomes ready.
+reactor_status_t reactor_run_once_timeout(reactor_t *reactor, timeout_t timeout_ms);
+
+// Immediately unblocks the reactor. This function is safe to call from any thread.
+// |reactor| may not be NULL.
+void reactor_stop(reactor_t *reactor);
+
+// Registers an object with the reactor. |obj| is neither copied nor is its ownership transferred
+// so the pointer must remain valid until it is unregistered with |reactor_unregister|. Neither
+// |reactor| nor |obj| may be NULL.
+void reactor_register(reactor_t *reactor, reactor_object_t *obj);
+
+// Unregisters a previously registered object with the |reactor|. Neither |reactor| nor |obj|
+// may be NULL.
+void reactor_unregister(reactor_t *reactor, reactor_object_t *obj);
diff --git a/osi/include/semaphore.h b/osi/include/semaphore.h
new file mode 100644
index 0000000..20932b2
--- /dev/null
+++ b/osi/include/semaphore.h
@@ -0,0 +1,57 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 Google, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+#pragma once
+
+#include <stdbool.h>
+
+struct semaphore_t;
+typedef struct semaphore_t semaphore_t;
+
+// Creates a new semaphore with an initial value of |value|.
+// Returns NULL on failure. The returned object must be released
+// with |semaphore_free|.
+semaphore_t *semaphore_new(unsigned int value);
+
+// Frees a semaphore allocated with |semaphore_new|. |semaphore| may
+// be NULL.
+void semaphore_free(semaphore_t *semaphore);
+
+// Decrements the value of |semaphore|. If it is 0, this call blocks until
+// it becomes non-zero. |semaphore| may not be NULL.
+void semaphore_wait(semaphore_t *semaphore);
+
+// Tries to decrement the value of |semaphore|. Returns true if the value was
+// decremented, false if the value was 0. This function never blocks. |semaphore|
+// may not be NULL.
+bool semaphore_try_wait(semaphore_t *semaphore);
+
+// Increments the value of |semaphore|. |semaphore| may not be NULL.
+void semaphore_post(semaphore_t *semaphore);
+
+// Returns a file descriptor representing this semaphore. The caller may
+// only perform one operation on the file descriptor: select(2). If |select|
+// indicates the fd is readable, the caller may call |semaphore_wait|
+// without blocking. If select indicates the fd is writable, the caller may
+// call |semaphore_post| without blocking. Note that there may be a race
+// condition between calling |select| and |semaphore_wait| or |semaphore_post|
+// which results in blocking behaviour.
+//
+// The caller must not close the returned file descriptor. |semaphore| may not
+// be NULL.
+int semaphore_get_fd(const semaphore_t *semaphore);
diff --git a/osi/include/thread.h b/osi/include/thread.h
new file mode 100644
index 0000000..c78c5e3
--- /dev/null
+++ b/osi/include/thread.h
@@ -0,0 +1,50 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 Google, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+#pragma once
+
+#define THREAD_NAME_MAX 16
+
+typedef struct thread_t thread_t;
+typedef void (*thread_fn)(void *context);
+
+// Creates and starts a new thread with the given name. Only THREAD_NAME_MAX
+// bytes from |name| will be assigned to the newly-created thread. Returns a
+// thread object if the thread was successfully started, NULL otherwise. The
+// returned thread object must be freed with |thread_free|. |name| may not
+// be NULL.
+thread_t *thread_new(const char *name);
+
+// Frees the given |thread|. If the thread is still running, it is stopped
+// and the calling thread will block until |thread| terminates. |thread|
+// may be NULL.
+void thread_free(thread_t *thread);
+
+// Call |func| with the argument |context| on |thread|. This function typically
+// does not block unless there are an excessive number of functions posted to
+// |thread| that have not been dispatched yet. Neither |thread| nor |func| may
+// be NULL. |context| may be NULL.
+bool thread_post(thread_t *thread, thread_fn func, void *context);
+
+// Requests |thread| to stop. Only |thread_free| and |thread_name| may be called
+// after calling |thread_stop|. This function is guaranteed to not block.
+// |thread| may not be NULL.
+void thread_stop(thread_t *thread);
+
+// Returns the name of the given |thread|. |thread| may not be NULL.
+const char *thread_name(const thread_t *thread);
diff --git a/osi/src/alarm.c b/osi/src/alarm.c
new file mode 100644
index 0000000..d2ae461
--- /dev/null
+++ b/osi/src/alarm.c
@@ -0,0 +1,283 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 Google, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+#define LOG_TAG "bt_osi_alarm"
+
+#include <assert.h>
+#include <errno.h>
+#include <hardware/bluetooth.h>
+#include <inttypes.h>
+#include <time.h>
+#include <utils/Log.h>
+
+#include "alarm.h"
+#include "list.h"
+#include "osi.h"
+
+struct alarm_t {
+ // The lock is held while the callback for this alarm is being executed.
+ // It allows us to release the coarse-grained monitor lock while a potentially
+ // long-running callback is executing. |alarm_cancel| uses this lock to provide
+ // a guarantee to its caller that the callback will not be in progress when it
+ // returns.
+ pthread_mutex_t callback_lock;
+ period_ms_t deadline;
+ alarm_callback_t callback;
+ void *data;
+};
+
+extern bt_os_callouts_t *bt_os_callouts;
+
+// If the next wakeup time is less than this threshold, we should acquire
+// a wakelock instead of setting a wake alarm so we're not bouncing in
+// and out of suspend frequently. This value is externally visible to allow
+// unit tests to run faster. It should not be modified by production code.
+int64_t TIMER_INTERVAL_FOR_WAKELOCK_IN_MS = 3000;
+static const clockid_t CLOCK_ID = CLOCK_BOOTTIME;
+static const char *WAKE_LOCK_ID = "bluedroid_timer";
+
+// This mutex ensures that the |alarm_set|, |alarm_cancel|, and alarm callback
+// functions execute serially and not concurrently. As a result, this mutex also
+// protects the |alarms| list.
+static pthread_mutex_t monitor;
+static list_t *alarms;
+static timer_t timer;
+static bool timer_set;
+
+static bool lazy_initialize(void);
+static period_ms_t now(void);
+static void timer_callback(void *data);
+static void reschedule(void);
+
+alarm_t *alarm_new(void) {
+ // Make sure we have a list we can insert alarms into.
+ if (!alarms && !lazy_initialize())
+ return NULL;
+
+ pthread_mutexattr_t attr;
+ pthread_mutexattr_init(&attr);
+
+ alarm_t *ret = calloc(1, sizeof(alarm_t));
+ if (!ret) {
+ ALOGE("%s unable to allocate memory for alarm.", __func__);
+ goto error;
+ }
+
+ // Make this a recursive mutex to make it safe to call |alarm_cancel| from
+ // within the callback function of the alarm.
+ int error = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
+ if (error) {
+ ALOGE("%s unable to create a recursive mutex: %s", __func__, strerror(error));
+ goto error;
+ }
+
+ error = pthread_mutex_init(&ret->callback_lock, &attr);
+ if (error) {
+ ALOGE("%s unable to initialize mutex: %s", __func__, strerror(error));
+ goto error;
+ }
+
+ pthread_mutexattr_destroy(&attr);
+ return ret;
+
+error:;
+ pthread_mutexattr_destroy(&attr);
+ free(ret);
+ return NULL;
+}
+
+void alarm_free(alarm_t *alarm) {
+ if (!alarm)
+ return;
+
+ alarm_cancel(alarm);
+ pthread_mutex_destroy(&alarm->callback_lock);
+ free(alarm);
+}
+
+// Runs in exclusion with alarm_cancel and timer_callback.
+void alarm_set(alarm_t *alarm, period_ms_t deadline, alarm_callback_t cb, void *data) {
+ assert(alarms != NULL);
+ assert(alarm != NULL);
+ assert(cb != NULL);
+
+ pthread_mutex_lock(&monitor);
+
+ // If the alarm is currently set and it's at the start of the list,
+ // we'll need to re-schedule since we've adjusted the earliest deadline.
+ bool needs_reschedule = (!list_is_empty(alarms) && list_front(alarms) == alarm);
+ if (alarm->callback)
+ list_remove(alarms, alarm);
+
+ alarm->deadline = now() + deadline;
+ alarm->callback = cb;
+ alarm->data = data;
+
+ // Add it into the timer list sorted by deadline (earliest deadline first).
+ if (list_is_empty(alarms))
+ list_prepend(alarms, alarm);
+ else
+ for (list_node_t *node = list_begin(alarms); node != list_end(alarms); node = list_next(node)) {
+ list_node_t *next = list_next(node);
+ if (next == list_end(alarms) || ((alarm_t *)list_node(next))->deadline >= alarm->deadline) {
+ list_insert_after(alarms, node, alarm);
+ break;
+ }
+ }
+
+ // If the new alarm has the earliest deadline, we need to re-evaluate our schedule.
+ if (needs_reschedule || (!list_is_empty(alarms) && list_front(alarms) == alarm))
+ reschedule();
+
+ pthread_mutex_unlock(&monitor);
+}
+
+void alarm_cancel(alarm_t *alarm) {
+ assert(alarms != NULL);
+ assert(alarm != NULL);
+
+ pthread_mutex_lock(&monitor);
+
+ bool needs_reschedule = (!list_is_empty(alarms) && list_front(alarms) == alarm);
+
+ list_remove(alarms, alarm);
+ alarm->deadline = 0;
+ alarm->callback = NULL;
+ alarm->data = NULL;
+
+ if (needs_reschedule)
+ reschedule();
+
+ pthread_mutex_unlock(&monitor);
+
+ // If the callback for |alarm| is in progress, wait here until it completes.
+ pthread_mutex_lock(&alarm->callback_lock);
+ pthread_mutex_unlock(&alarm->callback_lock);
+}
+
+static bool lazy_initialize(void) {
+ assert(alarms == NULL);
+
+ pthread_mutex_init(&monitor, NULL);
+
+ alarms = list_new(NULL);
+ if (!alarms) {
+ ALOGE("%s unable to allocate alarm list.", __func__);
+ return false;
+ }
+
+ return true;
+}
+
+static period_ms_t now(void) {
+ assert(alarms != NULL);
+
+ struct timespec ts;
+ if (clock_gettime(CLOCK_ID, &ts) == -1) {
+ ALOGE("%s unable to get current time: %s", __func__, strerror(errno));
+ return 0;
+ }
+
+ return (ts.tv_sec * 1000LL) + (ts.tv_nsec / 1000000LL);
+}
+
+// Warning: this function is called in the context of an unknown thread.
+// As a result, it must be thread-safe relative to other operations on
+// the alarm list.
+static void timer_callback(void *ptr) {
+ alarm_t *alarm = (alarm_t *)ptr;
+ assert(alarm != NULL);
+
+ pthread_mutex_lock(&monitor);
+
+ bool alarm_valid = list_remove(alarms, alarm);
+ alarm_callback_t callback = alarm->callback;
+ void *data = alarm->data;
+
+ alarm->deadline = 0;
+ alarm->callback = NULL;
+ alarm->data = NULL;
+
+ reschedule();
+
+ // The alarm was cancelled before we got to it. Release the monitor
+ // lock and exit right away since there's nothing left to do.
+ if (!alarm_valid) {
+ pthread_mutex_unlock(&monitor);
+ return;
+ }
+
+ // Downgrade lock.
+ pthread_mutex_lock(&alarm->callback_lock);
+ pthread_mutex_unlock(&monitor);
+
+ callback(data);
+
+ pthread_mutex_unlock(&alarm->callback_lock);
+}
+
+// NOTE: must be called with monitor lock.
+static void reschedule(void) {
+ assert(alarms != NULL);
+
+ if (timer_set) {
+ timer_delete(timer);
+ timer_set = false;
+ }
+
+ if (list_is_empty(alarms)) {
+ bt_os_callouts->release_wake_lock(WAKE_LOCK_ID);
+ return;
+ }
+
+ alarm_t *next = list_front(alarms);
+ int64_t next_exp = next->deadline - now();
+ if (next_exp < TIMER_INTERVAL_FOR_WAKELOCK_IN_MS) {
+ int status = bt_os_callouts->acquire_wake_lock(WAKE_LOCK_ID);
+ if (status != BT_STATUS_SUCCESS) {
+ ALOGE("%s unable to acquire wake lock: %d", __func__, status);
+ return;
+ }
+
+ struct sigevent sigevent;
+ memset(&sigevent, 0, sizeof(sigevent));
+ sigevent.sigev_notify = SIGEV_THREAD;
+ sigevent.sigev_notify_function = (void (*)(union sigval))timer_callback;
+ sigevent.sigev_value.sival_ptr = next;
+ if (timer_create(CLOCK_ID, &sigevent, &timer) == -1) {
+ ALOGE("%s unable to create timer: %s", __func__, strerror(errno));
+ return;
+ }
+
+ struct itimerspec wakeup_time;
+ memset(&wakeup_time, 0, sizeof(wakeup_time));
+ wakeup_time.it_value.tv_sec = (next->deadline / 1000);
+ wakeup_time.it_value.tv_nsec = (next->deadline % 1000) * 1000000LL;
+ if (timer_settime(timer, TIMER_ABSTIME, &wakeup_time, NULL) == -1) {
+ ALOGE("%s unable to set timer: %s", __func__, strerror(errno));
+ timer_delete(timer);
+ return;
+ }
+ timer_set = true;
+ } else {
+ if (!bt_os_callouts->set_wake_alarm(next_exp, true, timer_callback, next))
+ ALOGE("%s unable to set wake alarm for %" PRId64 "ms.", __func__, next_exp);
+
+ bt_os_callouts->release_wake_lock(WAKE_LOCK_ID);
+ }
+}
diff --git a/osi/src/config.c b/osi/src/config.c
new file mode 100644
index 0000000..f38c7f0
--- /dev/null
+++ b/osi/src/config.c
@@ -0,0 +1,278 @@
+#define LOG_TAG "bt_osi_config"
+
+#include <assert.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <utils/Log.h>
+
+#include "config.h"
+#include "list.h"
+
+typedef struct {
+ char *key;
+ char *value;
+} entry_t;
+
+typedef struct {
+ char *name;
+ list_t *entries;
+} section_t;
+
+struct config_t {
+ list_t *sections;
+};
+
+static void config_parse(FILE *fp, config_t *config);
+
+static section_t *section_new(const char *name);
+static void section_free(void *ptr);
+static section_t *section_find(const config_t *config, const char *section);
+
+static entry_t *entry_new(const char *key, const char *value);
+static void entry_free(void *ptr);
+static entry_t *entry_find(const config_t *config, const char *section, const char *key);
+
+config_t *config_new(const char *filename) {
+ assert(filename != NULL);
+
+ FILE *fp = fopen(filename, "rt");
+ if (!fp) {
+ ALOGE("%s unable to open file '%s': %s", __func__, filename, strerror(errno));
+ return NULL;
+ }
+
+ config_t *config = calloc(1, sizeof(config_t));
+ if (!config) {
+ ALOGE("%s unable to allocate memory for config_t.", __func__);
+ fclose(fp);
+ return NULL;
+ }
+
+ config->sections = list_new(section_free);
+ config_parse(fp, config);
+
+ fclose(fp);
+
+ return config;
+}
+
+void config_free(config_t *config) {
+ if (!config)
+ return;
+
+ list_free(config->sections);
+ free(config);
+}
+
+bool config_has_section(const config_t *config, const char *section) {
+ assert(config != NULL);
+ assert(section != NULL);
+
+ return (section_find(config, section) != NULL);
+}
+
+bool config_has_key(const config_t *config, const char *section, const char *key) {
+ assert(config != NULL);
+ assert(section != NULL);
+ assert(key != NULL);
+
+ return (entry_find(config, section, key) != NULL);
+}
+
+int config_get_int(const config_t *config, const char *section, const char *key, int def_value) {
+ assert(config != NULL);
+ assert(section != NULL);
+ assert(key != NULL);
+
+ entry_t *entry = entry_find(config, section, key);
+ if (!entry)
+ return def_value;
+
+ char *endptr;
+ int ret = strtol(entry->value, &endptr, 0);
+ return (*endptr == '\0') ? ret : def_value;
+}
+
+bool config_get_bool(const config_t *config, const char *section, const char *key, bool def_value) {
+ assert(config != NULL);
+ assert(section != NULL);
+ assert(key != NULL);
+
+ entry_t *entry = entry_find(config, section, key);
+ if (!entry)
+ return def_value;
+
+ if (!strcmp(entry->value, "true"))
+ return true;
+ if (!strcmp(entry->value, "false"))
+ return false;
+
+ return def_value;
+}
+
+const char *config_get_string(const config_t *config, const char *section, const char *key, const char *def_value) {
+ assert(config != NULL);
+ assert(section != NULL);
+ assert(key != NULL);
+
+ entry_t *entry = entry_find(config, section, key);
+ if (!entry)
+ return def_value;
+
+ return entry->value;
+}
+
+void config_set_int(config_t *config, const char *section, const char *key, int value) {
+ assert(config != NULL);
+ assert(section != NULL);
+ assert(key != NULL);
+
+ char value_str[32] = { 0 };
+ sprintf(value_str, "%d", value);
+ config_set_string(config, section, key, value_str);
+}
+
+void config_set_bool(config_t *config, const char *section, const char *key, bool value) {
+ assert(config != NULL);
+ assert(section != NULL);
+ assert(key != NULL);
+
+ config_set_string(config, section, key, value ? "true" : "false");
+}
+
+void config_set_string(config_t *config, const char *section, const char *key, const char *value) {
+ section_t *sec = section_find(config, section);
+ if (!sec) {
+ sec = section_new(section);
+ list_append(config->sections, sec);
+ }
+
+ for (const list_node_t *node = list_begin(sec->entries); node != list_end(sec->entries); node = list_next(node)) {
+ entry_t *entry = list_node(node);
+ if (!strcmp(entry->key, key)) {
+ free(entry->value);
+ entry->value = strdup(value);
+ return;
+ }
+ }
+
+ entry_t *entry = entry_new(key, value);
+ list_append(sec->entries, entry);
+}
+
+static char *trim(char *str) {
+ while (isspace(*str))
+ ++str;
+
+ if (!*str)
+ return str;
+
+ char *end_str = str + strlen(str) - 1;
+ while (end_str > str && isspace(*end_str))
+ --end_str;
+
+ end_str[1] = '\0';
+ return str;
+}
+
+static void config_parse(FILE *fp, config_t *config) {
+ assert(fp != NULL);
+ assert(config != NULL);
+
+ int line_num = 0;
+ char line[1024];
+ char section[1024];
+ strcpy(section, CONFIG_DEFAULT_SECTION);
+
+ while (fgets(line, sizeof(line), fp)) {
+ char *line_ptr = trim(line);
+ ++line_num;
+
+ // Skip blank and comment lines.
+ if (*line_ptr == '\0' || *line_ptr == '#')
+ continue;
+
+ if (*line_ptr == '[') {
+ size_t len = strlen(line_ptr);
+ if (line_ptr[len - 1] != ']') {
+ ALOGD("%s unterminated section name on line %d.", __func__, line_num);
+ continue;
+ }
+ strncpy(section, line_ptr + 1, len - 2);
+ section[len - 2] = '\0';
+ } else {
+ char *split = strchr(line_ptr, '=');
+ if (!split) {
+ ALOGD("%s no key/value separator found on line %d.", __func__, line_num);
+ continue;
+ }
+
+ *split = '\0';
+ config_set_string(config, section, trim(line_ptr), trim(split + 1));
+ }
+ }
+}
+
+static section_t *section_new(const char *name) {
+ section_t *section = calloc(1, sizeof(section_t));
+ if (!section)
+ return NULL;
+
+ section->name = strdup(name);
+ section->entries = list_new(entry_free);
+ return section;
+}
+
+static void section_free(void *ptr) {
+ if (!ptr)
+ return;
+
+ section_t *section = ptr;
+ free(section->name);
+ list_free(section->entries);
+}
+
+static section_t *section_find(const config_t *config, const char *section) {
+ for (const list_node_t *node = list_begin(config->sections); node != list_end(config->sections); node = list_next(node)) {
+ section_t *sec = list_node(node);
+ if (!strcmp(sec->name, section))
+ return sec;
+ }
+
+ return NULL;
+}
+
+static entry_t *entry_new(const char *key, const char *value) {
+ entry_t *entry = calloc(1, sizeof(entry_t));
+ if (!entry)
+ return NULL;
+
+ entry->key = strdup(key);
+ entry->value = strdup(value);
+ return entry;
+}
+
+static void entry_free(void *ptr) {
+ if (!ptr)
+ return;
+
+ entry_t *entry = ptr;
+ free(entry->key);
+ free(entry->value);
+}
+
+static entry_t *entry_find(const config_t *config, const char *section, const char *key) {
+ section_t *sec = section_find(config, section);
+ if (!sec)
+ return NULL;
+
+ for (const list_node_t *node = list_begin(sec->entries); node != list_end(sec->entries); node = list_next(node)) {
+ entry_t *entry = list_node(node);
+ if (!strcmp(entry->key, key))
+ return entry;
+ }
+
+ return NULL;
+}
diff --git a/osi/src/fixed_queue.c b/osi/src/fixed_queue.c
new file mode 100644
index 0000000..2d64367
--- /dev/null
+++ b/osi/src/fixed_queue.c
@@ -0,0 +1,151 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 Google, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+#include <assert.h>
+#include <pthread.h>
+#include <stdlib.h>
+
+#include "fixed_queue.h"
+#include "list.h"
+#include "osi.h"
+#include "semaphore.h"
+
+typedef struct fixed_queue_t {
+ list_t *list;
+ semaphore_t *enqueue_sem;
+ semaphore_t *dequeue_sem;
+ pthread_mutex_t lock;
+ size_t capacity;
+} fixed_queue_t;
+
+fixed_queue_t *fixed_queue_new(size_t capacity) {
+ fixed_queue_t *ret = calloc(1, sizeof(fixed_queue_t));
+ if (!ret)
+ goto error;
+
+ ret->list = list_new(NULL);
+ if (!ret->list)
+ goto error;
+
+ ret->enqueue_sem = semaphore_new(capacity);
+ if (!ret->enqueue_sem)
+ goto error;
+
+ ret->dequeue_sem = semaphore_new(0);
+ if (!ret->dequeue_sem)
+ goto error;
+
+ pthread_mutex_init(&ret->lock, NULL);
+ ret->capacity = capacity;
+
+ return ret;
+
+error:;
+ if (ret) {
+ list_free(ret->list);
+ semaphore_free(ret->enqueue_sem);
+ semaphore_free(ret->dequeue_sem);
+ }
+
+ free(ret);
+ return NULL;
+}
+
+void fixed_queue_free(fixed_queue_t *queue, fixed_queue_free_cb free_cb) {
+ if (!queue)
+ return;
+
+ if (free_cb)
+ for (const list_node_t *node = list_begin(queue->list); node != list_end(queue->list); node = list_next(node))
+ free_cb(list_node(node));
+
+ list_free(queue->list);
+ semaphore_free(queue->enqueue_sem);
+ semaphore_free(queue->dequeue_sem);
+ pthread_mutex_destroy(&queue->lock);
+ free(queue);
+}
+
+void fixed_queue_enqueue(fixed_queue_t *queue, void *data) {
+ assert(queue != NULL);
+ assert(data != NULL);
+
+ semaphore_wait(queue->enqueue_sem);
+
+ pthread_mutex_lock(&queue->lock);
+ list_append(queue->list, data);
+ pthread_mutex_unlock(&queue->lock);
+
+ semaphore_post(queue->dequeue_sem);
+}
+
+void *fixed_queue_dequeue(fixed_queue_t *queue) {
+ assert(queue != NULL);
+
+ semaphore_wait(queue->dequeue_sem);
+
+ pthread_mutex_lock(&queue->lock);
+ void *ret = list_front(queue->list);
+ list_remove(queue->list, ret);
+ pthread_mutex_unlock(&queue->lock);
+
+ semaphore_post(queue->enqueue_sem);
+
+ return ret;
+}
+
+bool fixed_queue_try_enqueue(fixed_queue_t *queue, void *data) {
+ assert(queue != NULL);
+ assert(data != NULL);
+
+ if (!semaphore_try_wait(queue->enqueue_sem))
+ return false;
+
+ pthread_mutex_lock(&queue->lock);
+ list_append(queue->list, data);
+ pthread_mutex_unlock(&queue->lock);
+
+ semaphore_post(queue->dequeue_sem);
+ return true;
+}
+
+void *fixed_queue_try_dequeue(fixed_queue_t *queue) {
+ assert(queue != NULL);
+
+ if (!semaphore_try_wait(queue->dequeue_sem))
+ return NULL;
+
+ pthread_mutex_lock(&queue->lock);
+ void *ret = list_front(queue->list);
+ list_remove(queue->list, ret);
+ pthread_mutex_unlock(&queue->lock);
+
+ semaphore_post(queue->enqueue_sem);
+
+ return ret;
+}
+
+int fixed_queue_get_dequeue_fd(const fixed_queue_t *queue) {
+ assert(queue != NULL);
+ return semaphore_get_fd(queue->dequeue_sem);
+}
+
+int fixed_queue_get_enqueue_fd(const fixed_queue_t *queue) {
+ assert(queue != NULL);
+ return semaphore_get_fd(queue->enqueue_sem);
+}
diff --git a/osi/src/list.c b/osi/src/list.c
new file mode 100644
index 0000000..691f039
--- /dev/null
+++ b/osi/src/list.c
@@ -0,0 +1,239 @@
+#include <assert.h>
+
+#include "list.h"
+#include "osi.h"
+
+typedef struct list_node_t {
+ struct list_node_t *next;
+ void *data;
+} list_node_t;
+
+typedef struct list_t {
+ list_node_t *head;
+ list_node_t *tail;
+ size_t length;
+ list_free_cb free_cb;
+} list_t;
+
+static list_node_t *list_free_node_(list_t *list, list_node_t *node);
+
+// Returns a new, empty list. Returns NULL if not enough memory could be allocated
+// for the list structure. The returned list must be freed with |list_free|. The
+// |callback| specifies a function to be called whenever a list element is removed
+// from the list. It can be used to release resources held by the list element, e.g.
+// memory or file descriptor. |callback| may be NULL if no cleanup is necessary on
+// element removal.
+list_t *list_new(list_free_cb callback) {
+ list_t *list = (list_t *)calloc(sizeof(list_t), 1);
+ if (list)
+ list->free_cb = callback;
+ return list;
+}
+
+// Frees the list. This function accepts NULL as an argument, in which case it
+// behaves like a no-op.
+void list_free(list_t *list) {
+ if (list != NULL)
+ list_clear(list);
+
+ free(list);
+}
+
+// Returns true if the list is empty (has no elements), false otherwise.
+// Note that a NULL list is not the same as an empty list. This function
+// does not accept a NULL list.
+bool list_is_empty(const list_t *list) {
+ assert(list != NULL);
+ return (list->length == 0);
+}
+
+// Returns the length of the list. This function does not accept a NULL list.
+size_t list_length(const list_t *list) {
+ assert(list != NULL);
+ return list->length;
+}
+
+// Returns the first element in the list without removing it. |list| may not
+// be NULL or empty.
+void *list_front(const list_t *list) {
+ assert(list != NULL);
+ assert(!list_is_empty(list));
+
+ return list->head->data;
+}
+
+// Returns the last element in the list without removing it. |list| may not
+// be NULL or empty.
+void *list_back(const list_t *list) {
+ assert(list != NULL);
+ assert(!list_is_empty(list));
+
+ return list->tail->data;
+}
+
+bool list_insert_after(list_t *list, list_node_t *prev_node, void *data) {
+ assert(list != NULL);
+ assert(node != NULL);
+ assert(data != NULL);
+
+ list_node_t *node = (list_node_t *)malloc(sizeof(list_node_t));
+ if (!node)
+ return false;
+
+ node->next = prev_node->next;
+ node->data = data;
+ prev_node->next = node;
+ if (list->tail == prev_node)
+ list->tail = node;
+ ++list->length;
+ return true;
+}
+
+// Inserts |data| at the beginning of |list|. Neither |data| nor |list| may be NULL.
+// This function does not make a copy of |data| so the pointer must remain valid
+// at least until the element is removed from the list or the list is freed.
+// Returns true if |data| could be inserted, false otherwise (e.g. out of memory).
+bool list_prepend(list_t *list, void *data) {
+ assert(list != NULL);
+ assert(data != NULL);
+
+ list_node_t *node = (list_node_t *)malloc(sizeof(list_node_t));
+ if (!node)
+ return false;
+ node->next = list->head;
+ node->data = data;
+ list->head = node;
+ if (list->tail == NULL)
+ list->tail = list->head;
+ ++list->length;
+ return true;
+}
+
+// Inserts |data| at the end of |list|. Neither |data| nor |list| may be NULL.
+// This function does not make a copy of |data| so the pointer must remain valid
+// at least until the element is removed from the list or the list is freed.
+// Returns true if |data| could be inserted, false otherwise (e.g. out of memory).
+bool list_append(list_t *list, void *data) {
+ assert(list != NULL);
+ assert(data != NULL);
+
+ list_node_t *node = (list_node_t *)malloc(sizeof(list_node_t));
+ if (!node)
+ return false;
+ node->next = NULL;
+ node->data = data;
+ if (list->tail == NULL) {
+ list->head = node;
+ list->tail = node;
+ } else {
+ list->tail->next = node;
+ list->tail = node;
+ }
+ ++list->length;
+ return true;
+}
+
+// Removes |data| from the list. Neither |list| nor |data| may be NULL. If |data|
+// is inserted multiple times in the list, this function will only remove the first
+// instance. If a free function was specified in |list_new|, it will be called back
+// with |data|. This function returns true if |data| was found in the list and removed,
+// false otherwise.
+bool list_remove(list_t *list, void *data) {
+ assert(list != NULL);
+ assert(data != NULL);
+
+ if (list_is_empty(list))
+ return false;
+
+ if (list->head->data == data) {
+ list_node_t *next = list_free_node_(list, list->head);
+ if (list->tail == list->head)
+ list->tail = next;
+ list->head = next;
+ return true;
+ }
+
+ for (list_node_t *prev = list->head, *node = list->head->next; node; prev = node, node = node->next)
+ if (node->data == data) {
+ prev->next = list_free_node_(list, node);
+ if (list->tail == node)
+ list->tail = prev;
+ return true;
+ }
+
+ return false;
+}
+
+// Removes all elements in the list. Calling this function will return the list to the
+// same state it was in after |list_new|. |list| may not be NULL.
+void list_clear(list_t *list) {
+ assert(list != NULL);
+ for (list_node_t *node = list->head; node; )
+ node = list_free_node_(list, node);
+ list->head = NULL;
+ list->tail = NULL;
+ list->length = 0;
+}
+
+// Iterates through the entire |list| and calls |callback| for each data element.
+// If the list is empty, |callback| will never be called. It is safe to mutate the
+// list inside the callback. If an element is added before the node being visited,
+// there will be no callback for the newly-inserted node. Neither |list| nor
+// |callback| may be NULL.
+void list_foreach(const list_t *list, list_iter_cb callback) {
+ assert(list != NULL);
+ assert(callback != NULL);
+
+ for (list_node_t *node = list->head; node; ) {
+ list_node_t *next = node->next;
+ callback(node->data);
+ node = next;
+ }
+}
+
+// Returns an iterator to the first element in |list|. |list| may not be NULL.
+// The returned iterator is valid as long as it does not equal the value returned
+// by |list_end|.
+list_node_t *list_begin(const list_t *list) {
+ assert(list != NULL);
+ return list->head;
+}
+
+// Returns an iterator that points past the end of the list. In other words,
+// this function returns the value of an invalid iterator for the given list.
+// When an iterator has the same value as what's returned by this function, you
+// may no longer call |list_next| with the iterator. |list| may not be NULL.
+list_node_t *list_end(UNUSED_ATTR const list_t *list) {
+ assert(list != NULL);
+ return NULL;
+}
+
+// Given a valid iterator |node|, this function returns the next value for the
+// iterator. If the returned value equals the value returned by |list_end|, the
+// iterator has reached the end of the list and may no longer be used for any
+// purpose.
+list_node_t *list_next(const list_node_t *node) {
+ assert(node != NULL);
+ return node->next;
+}
+
+// Returns the value stored at the location pointed to by the iterator |node|.
+// |node| must not equal the value returned by |list_end|.
+void *list_node(const list_node_t *node) {
+ assert(node != NULL);
+ return node->data;
+}
+
+static list_node_t *list_free_node_(list_t *list, list_node_t *node) {
+ assert(list != NULL);
+ assert(node != NULL);
+
+ list_node_t *next = node->next;
+
+ if (list->free_cb)
+ list->free_cb(node->data);
+ free(node);
+ --list->length;
+
+ return next;
+}
diff --git a/osi/src/reactor.c b/osi/src/reactor.c
new file mode 100644
index 0000000..d3d7767
--- /dev/null
+++ b/osi/src/reactor.c
@@ -0,0 +1,174 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 Google, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+#define LOG_TAG "bt_osi_reactor"
+
+#include <assert.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <sys/eventfd.h>
+#include <sys/select.h>
+#include <utils/Log.h>
+
+#include "list.h"
+#include "reactor.h"
+
+#if !defined(EFD_SEMAPHORE)
+# define EFD_SEMAPHORE (1 << 0)
+#endif
+
+struct reactor_t {
+ int event_fd;
+ list_t *objects;
+};
+
+static reactor_status_t run_reactor(reactor_t *reactor, int iterations, struct timeval *tv);
+
+reactor_t *reactor_new(void) {
+ reactor_t *ret = (reactor_t *)calloc(1, sizeof(reactor_t));
+ if (!ret)
+ return NULL;
+
+ ret->event_fd = eventfd(0, EFD_SEMAPHORE);
+ if (ret->event_fd == -1) {
+ ALOGE("%s unable to create eventfd: %s", __func__, strerror(errno));
+ goto error;
+ }
+
+ ret->objects = list_new(NULL);
+ if (!ret->objects)
+ goto error;
+
+ return ret;
+
+error:;
+ list_free(ret->objects);
+ close(ret->event_fd);
+ free(ret);
+ return NULL;
+}
+
+void reactor_free(reactor_t *reactor) {
+ if (!reactor)
+ return;
+
+ list_free(reactor->objects);
+ close(reactor->event_fd);
+ free(reactor);
+}
+
+reactor_status_t reactor_start(reactor_t *reactor) {
+ assert(reactor != NULL);
+ return run_reactor(reactor, 0, NULL);
+}
+
+reactor_status_t reactor_run_once(reactor_t *reactor) {
+ assert(reactor != NULL);
+ return run_reactor(reactor, 1, NULL);
+}
+
+reactor_status_t reactor_run_once_timeout(reactor_t *reactor, timeout_t timeout_ms) {
+ assert(reactor != NULL);
+
+ struct timeval tv;
+ tv.tv_sec = timeout_ms / 1000;
+ tv.tv_usec = (timeout_ms % 1000) * 1000;
+ return run_reactor(reactor, 1, &tv);
+}
+
+void reactor_stop(reactor_t *reactor) {
+ assert(reactor != NULL);
+
+ eventfd_write(reactor->event_fd, 1);
+}
+
+void reactor_register(reactor_t *reactor, reactor_object_t *obj) {
+ assert(reactor != NULL);
+ assert(obj != NULL);
+
+ list_append(reactor->objects, obj);
+}
+
+void reactor_unregister(reactor_t *reactor, reactor_object_t *obj) {
+ assert(reactor != NULL);
+ assert(obj != NULL);
+
+ list_remove(reactor->objects, obj);
+}
+
+// Runs the reactor loop for a maximum of |iterations| with the given timeout, |tv|.
+// 0 |iterations| means loop forever.
+// NULL |tv| means no timeout (block until an event occurs).
+// |reactor| may not be NULL.
+static reactor_status_t run_reactor(reactor_t *reactor, int iterations, struct timeval *tv) {
+ assert(reactor != NULL);
+
+ for (int i = 0; iterations == 0 || i < iterations; ++i) {
+ fd_set read_set;
+ fd_set write_set;
+ FD_ZERO(&read_set);
+ FD_ZERO(&write_set);
+ FD_SET(reactor->event_fd, &read_set);
+
+ int max_fd = reactor->event_fd;
+ for (const list_node_t *iter = list_begin(reactor->objects); iter != list_end(reactor->objects); iter = list_next(iter)) {
+ reactor_object_t *object = (reactor_object_t *)list_node(iter);
+ int fd = object->fd;
+ reactor_interest_t interest = object->interest;
+ if (interest & REACTOR_INTEREST_READ)
+ FD_SET(fd, &read_set);
+ if (interest & REACTOR_INTEREST_WRITE)
+ FD_SET(fd, &write_set);
+ if (fd > max_fd)
+ max_fd = fd;
+ }
+
+ int ret;
+ do {
+ ret = select(max_fd + 1, &read_set, &write_set, NULL, tv);
+ } while (ret == -1 && errno == EINTR);
+
+ if (ret == -1) {
+ ALOGE("%s error in select: %s", __func__, strerror(errno));
+ return REACTOR_STATUS_ERROR;
+ }
+
+ if (ret == 0)
+ return REACTOR_STATUS_TIMEOUT;
+
+ if (FD_ISSET(reactor->event_fd, &read_set)) {
+ eventfd_t value;
+ eventfd_read(reactor->event_fd, &value);
+ return REACTOR_STATUS_STOP;
+ }
+
+ for (const list_node_t *iter = list_begin(reactor->objects); ret > 0 && iter != list_end(reactor->objects); iter = list_next(iter)) {
+ reactor_object_t *object = (reactor_object_t *)list_node(iter);
+ int fd = object->fd;
+ if (FD_ISSET(fd, &read_set)) {
+ object->read_ready(object->context);
+ --ret;
+ }
+ if (FD_ISSET(fd, &write_set)) {
+ object->write_ready(object->context);
+ --ret;
+ }
+ }
+ }
+ return REACTOR_STATUS_DONE;
+}
diff --git a/osi/src/semaphore.c b/osi/src/semaphore.c
new file mode 100644
index 0000000..c1d038a
--- /dev/null
+++ b/osi/src/semaphore.c
@@ -0,0 +1,101 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 Google, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+#define LOG_TAG "osi_semaphore"
+
+#include <assert.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <string.h>
+#include <sys/eventfd.h>
+#include <utils/Log.h>
+
+#include "semaphore.h"
+
+#if !defined(EFD_SEMAPHORE)
+# define EFD_SEMAPHORE (1 << 0)
+#endif
+
+struct semaphore_t {
+ int fd;
+};
+
+semaphore_t *semaphore_new(unsigned int value) {
+ semaphore_t *ret = malloc(sizeof(semaphore_t));
+ if (ret) {
+ ret->fd = eventfd(value, EFD_SEMAPHORE);
+ if (ret->fd == -1) {
+ ALOGE("%s unable to allocate semaphore: %s", __func__, strerror(errno));
+ free(ret);
+ ret = NULL;
+ }
+ }
+ return ret;
+}
+
+void semaphore_free(semaphore_t *semaphore) {
+ if (semaphore->fd != -1)
+ close(semaphore->fd);
+ free(semaphore);
+}
+
+void semaphore_wait(semaphore_t *semaphore) {
+ assert(semaphore != NULL);
+ assert(semaphore->fd != -1);
+
+ uint64_t value;
+ if (eventfd_read(semaphore->fd, &value) == -1)
+ ALOGE("%s unable to wait on semaphore: %s", __func__, strerror(errno));
+}
+
+bool semaphore_try_wait(semaphore_t *semaphore) {
+ assert(semaphore != NULL);
+ assert(semaphore->fd != -1);
+
+ int flags = fcntl(semaphore->fd, F_GETFL);
+ if (flags == -1) {
+ ALOGE("%s unable to get flags for semaphore fd: %s", __func__, strerror(errno));
+ return false;
+ }
+ if (fcntl(semaphore->fd, F_SETFL, flags | O_NONBLOCK) == -1) {
+ ALOGE("%s unable to set O_NONBLOCK for semaphore fd: %s", __func__, strerror(errno));
+ return false;
+ }
+
+ eventfd_t value;
+ if (eventfd_read(semaphore->fd, &value) == -1)
+ return false;
+
+ if (fcntl(semaphore->fd, F_SETFL, flags) == -1)
+ ALOGE("%s unable to resetore flags for semaphore fd: %s", __func__, strerror(errno));
+ return true;
+}
+
+void semaphore_post(semaphore_t *semaphore) {
+ assert(semaphore != NULL);
+ assert(semaphore->fd != -1);
+
+ if (eventfd_write(semaphore->fd, 1ULL) == -1)
+ ALOGE("%s unable to post to semaphore: %s", __func__, strerror(errno));
+}
+
+int semaphore_get_fd(const semaphore_t *semaphore) {
+ assert(semaphore != NULL);
+ assert(semaphore->fd != -1);
+ return semaphore->fd;
+}
diff --git a/osi/src/thread.c b/osi/src/thread.c
new file mode 100644
index 0000000..cb644d3
--- /dev/null
+++ b/osi/src/thread.c
@@ -0,0 +1,192 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 Google, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+#define LOG_TAG "osi_thread"
+
+#include <assert.h>
+#include <errno.h>
+#include <pthread.h>
+#include <string.h>
+#include <sys/prctl.h>
+#include <sys/types.h>
+#include <utils/Log.h>
+
+#include "fixed_queue.h"
+#include "reactor.h"
+#include "semaphore.h"
+#include "thread.h"
+
+struct thread_t {
+ pthread_t pthread;
+ pid_t tid;
+ char name[THREAD_NAME_MAX + 1];
+ reactor_t *reactor;
+ fixed_queue_t *work_queue;
+};
+
+struct start_arg {
+ thread_t *thread;
+ semaphore_t *start_sem;
+ int error;
+};
+
+typedef struct {
+ thread_fn func;
+ void *context;
+} work_item_t;
+
+static void *run_thread(void *start_arg);
+static void work_queue_read_cb(void *context);
+
+static const size_t WORK_QUEUE_CAPACITY = 128;
+
+thread_t *thread_new(const char *name) {
+ assert(name != NULL);
+
+ // Start is on the stack, but we use a semaphore, so it's safe
+ thread_t *ret = calloc(1, sizeof(thread_t));
+ if (!ret)
+ goto error;
+
+ ret->reactor = reactor_new();
+ if (!ret->reactor)
+ goto error;
+
+ ret->work_queue = fixed_queue_new(WORK_QUEUE_CAPACITY);
+ if (!ret->work_queue)
+ goto error;
+
+ struct start_arg start;
+ start.start_sem = semaphore_new(0);
+ if (!start.start_sem)
+ goto error;
+
+ strncpy(ret->name, name, THREAD_NAME_MAX);
+ start.thread = ret;
+ start.error = 0;
+ pthread_create(&ret->pthread, NULL, run_thread, &start);
+ semaphore_wait(start.start_sem);
+ semaphore_free(start.start_sem);
+ if (start.error)
+ goto error;
+ return ret;
+
+error:;
+ if (ret) {
+ fixed_queue_free(ret->work_queue, free);
+ reactor_free(ret->reactor);
+ }
+ free(ret);
+ return NULL;
+}
+
+void thread_free(thread_t *thread) {
+ if (!thread)
+ return;
+
+ thread_stop(thread);
+ pthread_join(thread->pthread, NULL);
+ fixed_queue_free(thread->work_queue, free);
+ reactor_free(thread->reactor);
+ free(thread);
+}
+
+bool thread_post(thread_t *thread, thread_fn func, void *context) {
+ assert(thread != NULL);
+ assert(func != NULL);
+
+ // TODO(sharvil): if the current thread == |thread| and we've run out
+ // of queue space, we should abort this operation, otherwise we'll
+ // deadlock.
+
+ // Queue item is freed either when the queue itself is destroyed
+ // or when the item is removed from the queue for dispatch.
+ work_item_t *item = (work_item_t *)malloc(sizeof(work_item_t));
+ if (!item) {
+ ALOGE("%s unable to allocate memory: %s", __func__, strerror(errno));
+ return false;
+ }
+ item->func = func;
+ item->context = context;
+ fixed_queue_enqueue(thread->work_queue, item);
+ return true;
+}
+
+void thread_stop(thread_t *thread) {
+ assert(thread != NULL);
+ reactor_stop(thread->reactor);
+}
+
+const char *thread_name(const thread_t *thread) {
+ assert(thread != NULL);
+ return thread->name;
+}
+
+static void *run_thread(void *start_arg) {
+ assert(start_arg != NULL);
+
+ struct start_arg *start = start_arg;
+ thread_t *thread = start->thread;
+
+ assert(thread != NULL);
+
+ if (prctl(PR_SET_NAME, (unsigned long)thread->name) == -1) {
+ ALOGE("%s unable to set thread name: %s", __func__, strerror(errno));
+ start->error = errno;
+ semaphore_post(start->start_sem);
+ return NULL;
+ }
+ thread->tid = gettid();
+
+ semaphore_post(start->start_sem);
+
+ reactor_object_t work_queue_object;
+ work_queue_object.context = thread->work_queue;
+ work_queue_object.fd = fixed_queue_get_dequeue_fd(thread->work_queue);
+ work_queue_object.interest = REACTOR_INTEREST_READ;
+ work_queue_object.read_ready = work_queue_read_cb;
+
+ reactor_register(thread->reactor, &work_queue_object);
+ reactor_start(thread->reactor);
+
+ // Make sure we dispatch all queued work items before exiting the thread.
+ // This allows a caller to safely tear down by enqueuing a teardown
+ // work item and then joining the thread.
+ size_t count = 0;
+ work_item_t *item = fixed_queue_try_dequeue(thread->work_queue);
+ while (item && count <= WORK_QUEUE_CAPACITY) {
+ item->func(item->context);
+ free(item);
+ item = fixed_queue_try_dequeue(thread->work_queue);
+ ++count;
+ }
+
+ if (count > WORK_QUEUE_CAPACITY)
+ ALOGD("%s growing event queue on shutdown.", __func__);
+
+ return NULL;
+}
+
+static void work_queue_read_cb(void *context) {
+ assert(context != NULL);
+
+ fixed_queue_t *queue = (fixed_queue_t *)context;
+ work_item_t *item = fixed_queue_dequeue(queue);
+ item->func(item->context);
+ free(item);
+}
diff --git a/osi/test/alarm_test.cpp b/osi/test/alarm_test.cpp
new file mode 100644
index 0000000..d08cf6d
--- /dev/null
+++ b/osi/test/alarm_test.cpp
@@ -0,0 +1,246 @@
+#include <gtest/gtest.h>
+#include <hardware/bluetooth.h>
+#include <unistd.h>
+
+extern "C" {
+#include "alarm.h"
+#include "osi.h"
+#include "semaphore.h"
+}
+
+extern int64_t TIMER_INTERVAL_FOR_WAKELOCK_IN_MS;
+
+static semaphore_t *semaphore;
+static int cb_counter;
+static int lock_count;
+static timer_t timer;
+static alarm_cb saved_callback;
+static void *saved_data;
+
+static const uint64_t EPSILON_MS = 5;
+
+static void msleep(uint64_t ms) {
+ usleep(ms * 1000);
+}
+
+static void timer_callback(void *) {
+ saved_callback(saved_data);
+}
+
+class AlarmTest : public ::testing::Test {
+ protected:
+ virtual void SetUp() {
+ TIMER_INTERVAL_FOR_WAKELOCK_IN_MS = 100;
+ cb_counter = 0;
+ lock_count = 0;
+
+ semaphore = semaphore_new(0);
+
+ struct sigevent sigevent;
+ memset(&sigevent, 0, sizeof(sigevent));
+ sigevent.sigev_notify = SIGEV_THREAD;
+ sigevent.sigev_notify_function = (void (*)(union sigval))timer_callback;
+ sigevent.sigev_value.sival_ptr = NULL;
+ timer_create(CLOCK_BOOTTIME, &sigevent, &timer);
+ }
+
+ virtual void TearDown() {
+ timer_delete(timer);
+ }
+};
+
+static void cb(UNUSED_ATTR void *data) {
+ ++cb_counter;
+ semaphore_post(semaphore);
+}
+
+static bool set_wake_alarm(uint64_t delay_millis, bool, alarm_cb cb, void *data) {
+ saved_callback = cb;
+ saved_data = data;
+
+ struct itimerspec wakeup_time;
+ memset(&wakeup_time, 0, sizeof(wakeup_time));
+ wakeup_time.it_value.tv_sec = (delay_millis / 1000);
+ wakeup_time.it_value.tv_nsec = (delay_millis % 1000) * 1000000LL;
+ timer_settime(timer, 0, &wakeup_time, NULL);
+ return true;
+}
+
+static int acquire_wake_lock(const char *) {
+ if (!lock_count)
+ lock_count = 1;
+ return BT_STATUS_SUCCESS;
+}
+
+static int release_wake_lock(const char *) {
+ if (lock_count)
+ lock_count = 0;
+ return BT_STATUS_SUCCESS;
+}
+
+static bt_os_callouts_t stub = {
+ sizeof(bt_os_callouts_t),
+ set_wake_alarm,
+ acquire_wake_lock,
+ release_wake_lock,
+};
+
+bt_os_callouts_t *bt_os_callouts = &stub;
+
+TEST_F(AlarmTest, test_new_simple) {
+ alarm_t *alarm = alarm_new();
+ ASSERT_TRUE(alarm != NULL);
+}
+
+TEST_F(AlarmTest, test_free_simple) {
+ alarm_t *alarm = alarm_new();
+ alarm_free(alarm);
+}
+
+TEST_F(AlarmTest, test_free_null) {
+ alarm_free(NULL);
+}
+
+TEST_F(AlarmTest, test_simple_cancel) {
+ alarm_t *alarm = alarm_new();
+ alarm_cancel(alarm);
+ alarm_free(alarm);
+}
+
+TEST_F(AlarmTest, test_cancel) {
+ alarm_t *alarm = alarm_new();
+ alarm_set(alarm, 10, cb, NULL);
+ alarm_cancel(alarm);
+
+ msleep(10 + EPSILON_MS);
+
+ EXPECT_EQ(cb_counter, 0);
+ EXPECT_EQ(lock_count, 0);
+ alarm_free(alarm);
+}
+
+TEST_F(AlarmTest, test_cancel_idempotent) {
+ alarm_t *alarm = alarm_new();
+ alarm_set(alarm, 10, cb, NULL);
+ alarm_cancel(alarm);
+ alarm_cancel(alarm);
+ alarm_cancel(alarm);
+ alarm_free(alarm);
+}
+
+TEST_F(AlarmTest, test_set_short) {
+ alarm_t *alarm = alarm_new();
+ alarm_set(alarm, 10, cb, NULL);
+
+ EXPECT_EQ(cb_counter, 0);
+ EXPECT_EQ(lock_count, 1);
+
+ semaphore_wait(semaphore);
+
+ EXPECT_EQ(cb_counter, 1);
+ EXPECT_EQ(lock_count, 0);
+
+ alarm_free(alarm);
+}
+
+TEST_F(AlarmTest, test_set_long) {
+ alarm_t *alarm = alarm_new();
+ alarm_set(alarm, TIMER_INTERVAL_FOR_WAKELOCK_IN_MS, cb, NULL);
+
+ EXPECT_EQ(cb_counter, 0);
+ EXPECT_EQ(lock_count, 0);
+
+ semaphore_wait(semaphore);
+
+ EXPECT_EQ(cb_counter, 1);
+ EXPECT_EQ(lock_count, 0);
+
+ alarm_free(alarm);
+}
+
+TEST_F(AlarmTest, test_set_short_short) {
+ alarm_t *alarm[2] = {
+ alarm_new(),
+ alarm_new()
+ };
+
+ alarm_set(alarm[0], 10, cb, NULL);
+ alarm_set(alarm[1], 20, cb, NULL);
+
+ EXPECT_EQ(cb_counter, 0);
+ EXPECT_EQ(lock_count, 1);
+
+ semaphore_wait(semaphore);
+
+ EXPECT_EQ(cb_counter, 1);
+ EXPECT_EQ(lock_count, 1);
+
+ semaphore_wait(semaphore);
+
+ EXPECT_EQ(cb_counter, 2);
+ EXPECT_EQ(lock_count, 0);
+
+ alarm_free(alarm[0]);
+ alarm_free(alarm[1]);
+}
+
+TEST_F(AlarmTest, test_set_short_long) {
+ alarm_t *alarm[2] = {
+ alarm_new(),
+ alarm_new()
+ };
+
+ alarm_set(alarm[0], 10, cb, NULL);
+ alarm_set(alarm[1], 10 + TIMER_INTERVAL_FOR_WAKELOCK_IN_MS + EPSILON_MS, cb, NULL);
+
+ EXPECT_EQ(cb_counter, 0);
+ EXPECT_EQ(lock_count, 1);
+
+ semaphore_wait(semaphore);
+
+ EXPECT_EQ(cb_counter, 1);
+ EXPECT_EQ(lock_count, 0);
+
+ semaphore_wait(semaphore);
+
+ EXPECT_EQ(cb_counter, 2);
+ EXPECT_EQ(lock_count, 0);
+
+ alarm_free(alarm[0]);
+ alarm_free(alarm[1]);
+}
+
+TEST_F(AlarmTest, test_set_long_long) {
+ alarm_t *alarm[2] = {
+ alarm_new(),
+ alarm_new()
+ };
+
+ alarm_set(alarm[0], TIMER_INTERVAL_FOR_WAKELOCK_IN_MS, cb, NULL);
+ alarm_set(alarm[1], 2 * TIMER_INTERVAL_FOR_WAKELOCK_IN_MS + EPSILON_MS, cb, NULL);
+
+ EXPECT_EQ(cb_counter, 0);
+ EXPECT_EQ(lock_count, 0);
+
+ semaphore_wait(semaphore);
+
+ EXPECT_EQ(cb_counter, 1);
+ EXPECT_EQ(lock_count, 0);
+
+ semaphore_wait(semaphore);
+
+ EXPECT_EQ(cb_counter, 2);
+ EXPECT_EQ(lock_count, 0);
+
+ alarm_free(alarm[0]);
+ alarm_free(alarm[1]);
+}
+
+// Try to catch any race conditions between the timer callback and |alarm_free|.
+TEST_F(AlarmTest, test_callback_free_race) {
+ for (int i = 0; i < 1000; ++i) {
+ alarm_t *alarm = alarm_new();
+ alarm_set(alarm, 0, cb, NULL);
+ alarm_free(alarm);
+ }
+}
diff --git a/osi/test/config_test.cpp b/osi/test/config_test.cpp
new file mode 100644
index 0000000..1ce199d
--- /dev/null
+++ b/osi/test/config_test.cpp
@@ -0,0 +1,113 @@
+#include <gtest/gtest.h>
+
+extern "C" {
+#include "config.h"
+}
+
+static const char CONFIG_FILE[] = "/data/local/tmp/config_test.conf";
+static const char CONFIG_FILE_CONTENT[] =
+" \n\
+first_key=value \n\
+ \n\
+# Device ID (DID) configuration \n\
+[DID] \n\
+ \n\
+# Record Number: 1, 2 or 3 - maximum of 3 records \n\
+recordNumber = 1 \n\
+ \n\
+# Primary Record - true or false (default) \n\
+# There can be only one primary record \n\
+primaryRecord = true \n\
+ \n\
+# Vendor ID '0xFFFF' indicates no Device ID Service Record is present in the device \n\
+# 0x000F = Broadcom Corporation (default) \n\
+#vendorId = 0x000F \n\
+ \n\
+# Vendor ID Source \n\
+# 0x0001 = Bluetooth SIG assigned Device ID Vendor ID value (default) \n\
+# 0x0002 = USB Implementer's Forum assigned Device ID Vendor ID value \n\
+#vendorIdSource = 0x0001 \n\
+ \n\
+# Product ID & Product Version \n\
+# Per spec DID v1.3 0xJJMN for version is interpreted as JJ.M.N \n\
+# JJ: major version number, M: minor version number, N: sub-minor version number \n\
+# For example: 1200, v14.3.6 \n\
+productId = 0x1200 \n\
+version = 0x1111 \n\
+ \n\
+# Optional attributes \n\
+#clientExecutableURL = \n\
+#serviceDescription = \n\
+#documentationURL = \n\
+ \n\
+# Additional optional DID records. Bluedroid supports up to 3 records. \n\
+[DID] \n\
+[DID] \n\
+version = 0x1436 \n\
+";
+
+class ConfigTest : public ::testing::Test {
+ protected:
+ virtual void SetUp() {
+ FILE *fp = fopen(CONFIG_FILE, "wt");
+ fwrite(CONFIG_FILE_CONTENT, 1, sizeof(CONFIG_FILE_CONTENT), fp);
+ fclose(fp);
+ }
+};
+
+TEST_F(ConfigTest, config_new_no_file) {
+ config_t *config = config_new("/meow");
+ EXPECT_TRUE(config == NULL);
+}
+
+TEST_F(ConfigTest, config_new) {
+ config_t *config = config_new(CONFIG_FILE);
+ EXPECT_TRUE(config != NULL);
+ config_free(config);
+}
+
+TEST_F(ConfigTest, config_free_null) {
+ config_free(NULL);
+}
+
+TEST_F(ConfigTest, config_has_section) {
+ config_t *config = config_new(CONFIG_FILE);
+ EXPECT_TRUE(config_has_section(config, "DID"));
+ config_free(config);
+}
+
+TEST_F(ConfigTest, config_has_key_in_default_section) {
+ config_t *config = config_new(CONFIG_FILE);
+ EXPECT_TRUE(config_has_key(config, CONFIG_DEFAULT_SECTION, "first_key"));
+ EXPECT_STREQ(config_get_string(config, CONFIG_DEFAULT_SECTION, "first_key", "meow"), "value");
+ config_free(config);
+}
+
+TEST_F(ConfigTest, config_has_keys) {
+ config_t *config = config_new(CONFIG_FILE);
+ EXPECT_TRUE(config_has_key(config, "DID", "recordNumber"));
+ EXPECT_TRUE(config_has_key(config, "DID", "primaryRecord"));
+ EXPECT_TRUE(config_has_key(config, "DID", "productId"));
+ EXPECT_TRUE(config_has_key(config, "DID", "version"));
+ config_free(config);
+}
+
+TEST_F(ConfigTest, config_no_bad_keys) {
+ config_t *config = config_new(CONFIG_FILE);
+ EXPECT_FALSE(config_has_key(config, "DID_BAD", "primaryRecord"));
+ EXPECT_FALSE(config_has_key(config, "DID", "primaryRecord_BAD"));
+ EXPECT_FALSE(config_has_key(config, CONFIG_DEFAULT_SECTION, "primaryRecord"));
+ config_free(config);
+}
+
+TEST_F(ConfigTest, config_get_int_version) {
+ config_t *config = config_new(CONFIG_FILE);
+ EXPECT_EQ(config_get_int(config, "DID", "version", 0), 0x1436);
+ config_free(config);
+}
+
+TEST_F(ConfigTest, config_get_int_default) {
+ config_t *config = config_new(CONFIG_FILE);
+ EXPECT_EQ(config_get_int(config, "DID", "primaryRecord", 123), 123);
+ config_free(config);
+}
diff --git a/osi/test/list_test.cpp b/osi/test/list_test.cpp
new file mode 100644
index 0000000..d874b4b
--- /dev/null
+++ b/osi/test/list_test.cpp
@@ -0,0 +1,149 @@
+#include <gtest/gtest.h>
+
+extern "C" {
+#include "list.h"
+#include "osi.h"
+}
+
+TEST(ListTest, test_new_simple) {
+ list_t *list = list_new(NULL);
+ ASSERT_TRUE(list != NULL);
+}
+
+TEST(ListTest, test_free_simple) {
+ // In this test we just verify that list_free is callable with a valid list.
+ list_t *list = list_new(NULL);
+ list_free(list);
+}
+
+TEST(ListTest, test_free_null) {
+ // In this test we just verify that list_free is callable with NULL.
+ list_free(NULL);
+}
+
+TEST(ListTest, test_empty_list_is_empty) {
+ list_t *list = list_new(NULL);
+ EXPECT_TRUE(list_is_empty(list));
+ list_free(list);
+}
+
+TEST(ListTest, test_empty_list_has_no_length) {
+ list_t *list = list_new(NULL);
+ EXPECT_EQ(list_length(list), 0U);
+ list_free(list);
+}
+
+TEST(ListTest, test_simple_list_prepend) {
+ list_t *list = list_new(NULL);
+ EXPECT_TRUE(list_prepend(list, &list));
+ EXPECT_FALSE(list_is_empty(list));
+ EXPECT_EQ(list_length(list), 1U);
+ list_free(list);
+}
+
+TEST(ListTest, test_simple_list_append) {
+ list_t *list = list_new(NULL);
+ EXPECT_TRUE(list_append(list, &list));
+ EXPECT_FALSE(list_is_empty(list));
+ EXPECT_EQ(list_length(list), 1U);
+ list_free(list);
+}
+
+TEST(ListTest, test_list_remove_found) {
+ list_t *list = list_new(NULL);
+ list_append(list, &list);
+ EXPECT_TRUE(list_remove(list, &list));
+ EXPECT_TRUE(list_is_empty(list));
+ EXPECT_EQ(list_length(list), 0U);
+ list_free(list);
+}
+
+TEST(ListTest, test_list_remove_not_found) {
+ int x;
+ list_t *list = list_new(NULL);
+ list_append(list, &list);
+ EXPECT_FALSE(list_remove(list, &x));
+ EXPECT_FALSE(list_is_empty(list));
+ EXPECT_EQ(list_length(list), 1U);
+ list_free(list);
+}
+
+TEST(ListTest, test_list_front) {
+ int x[] = { 1, 2, 3, 4, 5 };
+ list_t *list = list_new(NULL);
+
+ for (size_t i = 0; i < ARRAY_SIZE(x); ++i)
+ list_append(list, &x[i]);
+
+ EXPECT_EQ(list_front(list), &x[0]);
+
+ list_free(list);
+}
+
+TEST(ListTest, test_list_back) {
+ int x[] = { 1, 2, 3, 4, 5 };
+ list_t *list = list_new(NULL);
+
+ for (size_t i = 0; i < ARRAY_SIZE(x); ++i)
+ list_append(list, &x[i]);
+
+ EXPECT_EQ(list_back(list), &x[ARRAY_SIZE(x) - 1]);
+
+ list_free(list);
+}
+
+TEST(ListTest, test_list_clear) {
+ int x[] = { 1, 2, 3, 4, 5 };
+ list_t *list = list_new(NULL);
+
+ for (size_t i = 0; i < ARRAY_SIZE(x); ++i)
+ list_append(list, &x[i]);
+
+ list_clear(list);
+ EXPECT_TRUE(list_is_empty(list));
+ EXPECT_EQ(list_length(list), 0U);
+
+ list_free(list);
+}
+
+TEST(ListTest, test_list_append_multiple) {
+ int x[] = { 1, 2, 3, 4, 5 };
+ list_t *list = list_new(NULL);
+
+ for (size_t i = 0; i < ARRAY_SIZE(x); ++i)
+ list_append(list, &x[i]);
+
+ int i = 0;
+ for (const list_node_t *node = list_begin(list); node != list_end(list); node = list_next(node), ++i)
+ EXPECT_EQ(list_node(node), &x[i]);
+
+ list_free(list);
+}
+
+TEST(ListTest, test_list_prepend_multiple) {
+ int x[] = { 1, 2, 3, 4, 5 };
+ list_t *list = list_new(NULL);
+
+ for (size_t i = 0; i < ARRAY_SIZE(x); ++i)
+ list_prepend(list, &x[i]);
+
+ int i = ARRAY_SIZE(x) - 1;
+ for (const list_node_t *node = list_begin(list); node != list_end(list); node = list_next(node), --i)
+ EXPECT_EQ(list_node(node), &x[i]);
+
+ list_free(list);
+}
+
+TEST(ListTest, test_list_begin_empty_list) {
+ list_t *list = list_new(NULL);
+ EXPECT_EQ(list_begin(list), list_end(list));
+ list_free(list);
+}
+
+TEST(ListTest, test_list_next) {
+ list_t *list = list_new(NULL);
+ list_append(list, &list);
+ EXPECT_NE(list_begin(list), list_end(list));
+ EXPECT_EQ(list_next(list_begin(list)), list_end(list));
+ list_free(list);
+}
diff --git a/osi/test/reactor_test.cpp b/osi/test/reactor_test.cpp
new file mode 100644
index 0000000..4a9fb21
--- /dev/null
+++ b/osi/test/reactor_test.cpp
@@ -0,0 +1,101 @@
+#include <gtest/gtest.h>
+#include <pthread.h>
+#include <sys/time.h>
+#include <unistd.h>
+
+extern "C" {
+#include "reactor.h"
+}
+
+static pthread_t thread;
+static volatile bool thread_running;
+
+static void *reactor_thread(void *ptr) {
+ reactor_t *reactor = (reactor_t *)ptr;
+
+ thread_running = true;
+ reactor_start(reactor);
+ thread_running = false;
+
+ return NULL;
+}
+
+static void spawn_reactor_thread(reactor_t *reactor) {
+ int ret = pthread_create(&thread, NULL, reactor_thread, reactor);
+ EXPECT_EQ(ret, 0);
+}
+
+static void join_reactor_thread() {
+ pthread_join(thread, NULL);
+}
+
+static uint64_t get_timestamp(void) {
+ struct timeval tv;
+ gettimeofday(&tv, NULL);
+ return tv.tv_sec * 1000 + tv.tv_usec / 1000;
+}
+
+TEST(ReactorTest, reactor_new) {
+ reactor_t *reactor = reactor_new();
+ EXPECT_TRUE(reactor != NULL);
+ reactor_free(reactor);
+}
+
+TEST(ReactorTest, reactor_free_null) {
+ reactor_free(NULL);
+}
+
+TEST(ReactorTest, reactor_stop_start) {
+ reactor_t *reactor = reactor_new();
+ reactor_stop(reactor);
+ reactor_start(reactor);
+ reactor_free(reactor);
+}
+
+TEST(ReactorTest, reactor_repeated_stop_start) {
+ reactor_t *reactor = reactor_new();
+ for (int i = 0; i < 10; ++i) {
+ reactor_stop(reactor);
+ reactor_start(reactor);
+ }
+ reactor_free(reactor);
+}
+
+TEST(ReactorTest, reactor_multi_stop_start) {
+ reactor_t *reactor = reactor_new();
+
+ reactor_stop(reactor);
+ reactor_stop(reactor);
+ reactor_stop(reactor);
+
+ reactor_start(reactor);
+ reactor_start(reactor);
+ reactor_start(reactor);
+
+ reactor_free(reactor);
+}
+
+TEST(ReactorTest, reactor_start_wait_stop) {
+ reactor_t *reactor = reactor_new();
+
+ spawn_reactor_thread(reactor);
+ usleep(50 * 1000);
+ EXPECT_TRUE(thread_running);
+
+ reactor_stop(reactor);
+ join_reactor_thread();
+ EXPECT_FALSE(thread_running);
+
+ reactor_free(reactor);
+}
+
+TEST(ReactorTest, reactor_run_once_timeout) {
+ reactor_t *reactor = reactor_new();
+
+ uint64_t start = get_timestamp();
+ reactor_status_t status = reactor_run_once_timeout(reactor, 50);
+ EXPECT_GE(get_timestamp() - start, static_cast<uint64_t>(50));
+ EXPECT_EQ(status, REACTOR_STATUS_TIMEOUT);
+
+ reactor_free(reactor);
+}
diff --git a/osi/test/thread_test.cpp b/osi/test/thread_test.cpp
new file mode 100644
index 0000000..edbc005
--- /dev/null
+++ b/osi/test/thread_test.cpp
@@ -0,0 +1,35 @@
+#include <gtest/gtest.h>
+
+extern "C" {
+#include "thread.h"
+#include "osi.h"
+}
+
+TEST(ThreadTest, test_new_simple) {
+ thread_t *thread = thread_new("test_thread");
+ ASSERT_TRUE(thread != NULL);
+ thread_free(thread);
+}
+
+TEST(ThreadTest, test_free_simple) {
+ thread_t *thread = thread_new("test_thread");
+ thread_free(thread);
+}
+
+TEST(ThreadTest, test_name) {
+ thread_t *thread = thread_new("test_name");
+ ASSERT_STREQ(thread_name(thread), "test_name");
+ thread_free(thread);
+}
+
+TEST(ThreadTest, test_long_name) {
+ thread_t *thread = thread_new("0123456789abcdef");
+ ASSERT_STREQ("0123456789abcdef", thread_name(thread));
+ thread_free(thread);
+}
+
+TEST(ThreadTest, test_very_long_name) {
+ thread_t *thread = thread_new("0123456789abcdefg");
+ ASSERT_STREQ("0123456789abcdef", thread_name(thread));
+ thread_free(thread);
+}
diff --git a/stack/Android.mk b/stack/Android.mk
old mode 100755
new mode 100644
index 92ce253..f1159a6
--- a/stack/Android.mk
+++ b/stack/Android.mk
@@ -1,5 +1,3 @@
-ifneq ($(TARGET_SIMULATOR),true)
-
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
@@ -19,6 +17,8 @@
$(LOCAL_PATH)/sdp \
$(LOCAL_PATH)/smp \
$(LOCAL_PATH)/srvc \
+ $(LOCAL_PATH)/../vnd/include \
+ $(LOCAL_PATH)/../vnd/ble \
$(LOCAL_PATH)/../include \
$(LOCAL_PATH)/../gki/common \
$(LOCAL_PATH)/../gki/ulinux \
@@ -28,11 +28,10 @@
$(LOCAL_PATH)/../ctrlr/include \
$(LOCAL_PATH)/../bta/include \
$(LOCAL_PATH)/../bta/sys \
- $(LOCAL_PATH)/../brcm/include \
$(LOCAL_PATH)/../utils/include \
$(bdroid_C_INCLUDES) \
-LOCAL_CFLAGS += $(bdroid_CFLAGS)
+LOCAL_CFLAGS += $(bdroid_CFLAGS) -std=c99
ifeq ($(BOARD_HAVE_BLUETOOTH_BCM),true)
LOCAL_CFLAGS += \
@@ -66,6 +65,10 @@
./btm/btm_main.c \
./btm/btm_dev.c \
./btm/btm_ble_gap.c \
+ ./btm/btm_ble_adv_filter.c \
+ ./btm/btm_ble_multi_adv.c \
+ ./btm/btm_ble_batchscan.c \
+ ./btm/btm_ble_cont_energy.c \
./btm/btm_acl.c \
./btm/btm_sco.c \
./btm/btm_pm.c \
@@ -145,13 +148,13 @@
./gap/gap_api.c \
./gap/gap_ble.c \
./gap/gap_conn.c \
- ./gap/gap_utils.c
+ ./gap/gap_utils.c \
+ ../vnd/ble/vendor_ble.c
LOCAL_MODULE := libbt-brcm_stack
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := STATIC_LIBRARIES
LOCAL_SHARED_LIBRARIES := libcutils libc
+LOCAL_MULTILIB := 32
include $(BUILD_STATIC_LIBRARY)
-
-endif # TARGET_SIMULATOR != true
diff --git a/stack/a2dp/a2d_api.c b/stack/a2dp/a2d_api.c
index 71dcc13..f0f4a83 100644
--- a/stack/a2dp/a2d_api.c
+++ b/stack/a2dp/a2d_api.c
@@ -59,7 +59,7 @@
tA2D_Service a2d_svc;
tSDP_PROTOCOL_ELEM elem;
- A2D_TRACE_API1("a2d_sdp_cback status: %d", status);
+ A2D_TRACE_API("a2d_sdp_cback status: %d", status);
if (status == SDP_SUCCESS)
{
@@ -101,7 +101,7 @@
if (SDP_FindProtocolListElemInRec(p_rec, UUID_PROTOCOL_AVDTP, &elem))
{
a2d_svc.avdt_version = elem.params[0];
- A2D_TRACE_DEBUG1("avdt_version: 0x%x", a2d_svc.avdt_version);
+ A2D_TRACE_DEBUG("avdt_version: 0x%x", a2d_svc.avdt_version);
}
/* we've got everything, we're done */
@@ -175,7 +175,7 @@
UINT8 *p;
tSDP_PROTOCOL_ELEM proto_list [A2D_NUM_PROTO_ELEMS];
- A2D_TRACE_API1("A2D_AddRecord uuid: %x", service_uuid);
+ A2D_TRACE_API("A2D_AddRecord uuid: %x", service_uuid);
if( (sdp_handle == 0) ||
(service_uuid != UUID_SERVCLASS_AUDIO_SOURCE && service_uuid != UUID_SERVCLASS_AUDIO_SINK) )
@@ -277,7 +277,7 @@
ATTR_ID_PROTOCOL_DESC_LIST,
ATTR_ID_PROVIDER_NAME};
- A2D_TRACE_API1("A2D_FindService uuid: %x", service_uuid);
+ A2D_TRACE_API("A2D_FindService uuid: %x", service_uuid);
if( (service_uuid != UUID_SERVCLASS_AUDIO_SOURCE && service_uuid != UUID_SERVCLASS_AUDIO_SINK) ||
p_db == NULL || p_db->p_db == NULL || p_cback == NULL)
return A2D_INVALID_PARAMS;
diff --git a/stack/avct/avct_api.c b/stack/avct/avct_api.c
index d590cb5..5b27cc8 100644
--- a/stack/avct/avct_api.c
+++ b/stack/avct/avct_api.c
@@ -56,7 +56,7 @@
{
UNUSED(mtu_br);
- AVCT_TRACE_API0("AVCT_Register");
+ AVCT_TRACE_API("AVCT_Register");
/* register PSM with L2CAP */
L2CA_Register(AVCT_PSM, (tL2CAP_APPL_INFO *) &avct_l2c_appl);
@@ -108,7 +108,7 @@
*******************************************************************************/
void AVCT_Deregister(void)
{
- AVCT_TRACE_API0("AVCT_Deregister");
+ AVCT_TRACE_API("AVCT_Deregister");
/* deregister PSM with L2CAP */
L2CA_Deregister(AVCT_PSM);
@@ -136,7 +136,7 @@
tAVCT_CCB *p_ccb;
tAVCT_LCB *p_lcb;
- AVCT_TRACE_API2("AVCT_CreateConn: %d, control:%d", p_cc->role, p_cc->control);
+ AVCT_TRACE_API("AVCT_CreateConn: %d, control:%d", p_cc->role, p_cc->control);
/* Allocate ccb; if no ccbs, return failure */
if ((p_ccb = avct_ccb_alloc(p_cc)) == NULL)
@@ -172,7 +172,7 @@
{
/* bind lcb to ccb */
p_ccb->p_lcb = p_lcb;
- AVCT_TRACE_DEBUG1("ch_state: %d", p_lcb->ch_state);
+ AVCT_TRACE_DEBUG("ch_state: %d", p_lcb->ch_state);
avct_lcb_event(p_lcb, AVCT_LCB_UL_BIND_EVT, (tAVCT_LCB_EVT *) &p_ccb);
}
}
@@ -198,7 +198,7 @@
UINT16 result = AVCT_SUCCESS;
tAVCT_CCB *p_ccb;
- AVCT_TRACE_API0("AVCT_RemoveConn");
+ AVCT_TRACE_API("AVCT_RemoveConn");
/* map handle to ccb */
if ((p_ccb = avct_ccb_by_idx(handle)) == NULL)
@@ -242,7 +242,7 @@
tAVCT_BCB *p_bcb;
int index;
- AVCT_TRACE_API1("AVCT_CreateBrowse: %d", role);
+ AVCT_TRACE_API("AVCT_CreateBrowse: %d", role);
/* map handle to ccb */
if ((p_ccb = avct_ccb_by_idx(handle)) == NULL)
@@ -285,7 +285,7 @@
{
/* bind bcb to ccb */
p_ccb->p_bcb = p_bcb;
- AVCT_TRACE_DEBUG1("ch_state: %d", p_bcb->ch_state);
+ AVCT_TRACE_DEBUG("ch_state: %d", p_bcb->ch_state);
avct_bcb_event(p_bcb, AVCT_LCB_UL_BIND_EVT, (tAVCT_LCB_EVT *) &p_ccb);
}
}
@@ -317,7 +317,7 @@
UINT16 result = AVCT_SUCCESS;
tAVCT_CCB *p_ccb;
- AVCT_TRACE_API0("AVCT_RemoveBrowse");
+ AVCT_TRACE_API("AVCT_RemoveBrowse");
/* map handle to ccb */
if ((p_ccb = avct_ccb_by_idx(handle)) == NULL)
@@ -416,14 +416,14 @@
tAVCT_CCB *p_ccb;
tAVCT_UL_MSG ul_msg;
- AVCT_TRACE_API0("AVCT_MsgReq");
+ AVCT_TRACE_API("AVCT_MsgReq");
/* verify p_msg parameter */
if (p_msg == NULL)
{
return AVCT_NO_RESOURCES;
}
- AVCT_TRACE_API1("len: %d", p_msg->len);
+ AVCT_TRACE_API("len: %d", p_msg->len);
/* map handle to ccb */
if ((p_ccb = avct_ccb_by_idx(handle)) == NULL)
diff --git a/stack/avct/avct_ccb.c b/stack/avct/avct_ccb.c
index 09051b1..f2c821c 100644
--- a/stack/avct/avct_ccb.c
+++ b/stack/avct/avct_ccb.c
@@ -50,7 +50,7 @@
{
p_ccb->allocated = AVCT_ALOC_LCB;
memcpy(&p_ccb->cc, p_cc, sizeof(tAVCT_CC));
- AVCT_TRACE_DEBUG1("avct_ccb_alloc %d", i);
+ AVCT_TRACE_DEBUG("avct_ccb_alloc %d", i);
break;
}
}
@@ -59,7 +59,7 @@
{
/* out of ccbs */
p_ccb = NULL;
- AVCT_TRACE_WARNING0("Out of ccbs");
+ AVCT_TRACE_WARNING("Out of ccbs");
}
return p_ccb;
}
@@ -79,7 +79,7 @@
{
tAVCT_CTRL_CBACK *p_cback = p_ccb->cc.p_ctrl_cback;
- AVCT_TRACE_DEBUG1("avct_ccb_dealloc %d", avct_ccb_to_idx(p_ccb));
+ AVCT_TRACE_DEBUG("avct_ccb_dealloc %d", avct_ccb_to_idx(p_ccb));
#if (AVCT_BROWSE_INCLUDED == TRUE)
if(p_ccb->p_bcb == NULL)
memset(p_ccb, 0, sizeof(tAVCT_CCB));
@@ -138,13 +138,13 @@
if (!p_ccb->allocated)
{
p_ccb = NULL;
- AVCT_TRACE_WARNING1("ccb %d not allocated", idx);
+ AVCT_TRACE_WARNING("ccb %d not allocated", idx);
}
}
else
{
p_ccb = NULL;
- AVCT_TRACE_WARNING1("No ccb for idx %d", idx);
+ AVCT_TRACE_WARNING("No ccb for idx %d", idx);
}
return p_ccb;
}
diff --git a/stack/avct/avct_l2c.c b/stack/avct/avct_l2c.c
index aabcd0e..bb01e89 100644
--- a/stack/avct/avct_l2c.c
+++ b/stack/avct/avct_l2c.c
@@ -80,7 +80,7 @@
{
if (p_ccb->allocated && (p_ccb->p_lcb == p_lcb))
{
- AVCT_TRACE_DEBUG1("avct_l2c_is_ct control:x%x", p_ccb->cc.control);
+ AVCT_TRACE_DEBUG("avct_l2c_is_ct control:x%x", p_ccb->cc.control);
if (p_ccb->cc.control & AVCT_PASSIVE)
{
is_passive = TRUE;
@@ -130,13 +130,13 @@
{
/* TG role only - accept the connection from CT. move the channel ID to the conflict list */
p_lcb->conflict_lcid = p_lcb->ch_lcid;
- AVCT_TRACE_DEBUG1("avct_l2c_connect_ind_cback conflict_lcid:0x%x", p_lcb->conflict_lcid);
+ AVCT_TRACE_DEBUG("avct_l2c_connect_ind_cback conflict_lcid:0x%x", p_lcb->conflict_lcid);
}
}
if(p_lcb)
{
- AVCT_TRACE_DEBUG3("avct_l2c_connect_ind_cback: 0x%x, res: %d, ch_state: %d",
+ AVCT_TRACE_DEBUG("avct_l2c_connect_ind_cback: 0x%x, res: %d, ch_state: %d",
lcid, result, p_lcb->ch_state);
}
/* Send L2CAP connect rsp */
@@ -156,12 +156,12 @@
cfg.mtu_present = TRUE;
cfg.mtu = avct_cb.mtu;
L2CA_ConfigReq(lcid, &cfg);
- AVCT_TRACE_DEBUG0("avct_l2c snd Cfg Req");
+ AVCT_TRACE_DEBUG("avct_l2c snd Cfg Req");
}
#if (BT_USE_TRACES == TRUE)
if(p_lcb)
- AVCT_TRACE_DEBUG1("ch_state cni: %d ", p_lcb->ch_state);
+ AVCT_TRACE_DEBUG("ch_state cni: %d ", p_lcb->ch_state);
#endif
}
@@ -183,7 +183,7 @@
/* look up lcb for this channel */
if ((p_lcb = avct_lcb_by_lcid(lcid)) != NULL)
{
- AVCT_TRACE_DEBUG4("avct_l2c_connect_cfm_cback lcid:0x%x result: %d ch_state: %d, conflict_lcid:0x%x",
+ AVCT_TRACE_DEBUG("avct_l2c_connect_cfm_cback lcid:0x%x result: %d ch_state: %d, conflict_lcid:0x%x",
lcid, result, p_lcb->ch_state, p_lcb->conflict_lcid);
/* if in correct state */
if (p_lcb->ch_state == AVCT_CH_CONN)
@@ -199,12 +199,12 @@
cfg.mtu_present = TRUE;
cfg.mtu = avct_cb.mtu;
L2CA_ConfigReq(lcid, &cfg);
- AVCT_TRACE_DEBUG0("avct_l2c snd Cfg Req");
+ AVCT_TRACE_DEBUG("avct_l2c snd Cfg Req");
}
/* else failure */
else
{
- AVCT_TRACE_DEBUG1("avct_l2c_connect_cfm_cback conflict_lcid:0x%x", p_lcb->conflict_lcid);
+ AVCT_TRACE_DEBUG("avct_l2c_connect_cfm_cback conflict_lcid:0x%x", p_lcb->conflict_lcid);
if (p_lcb->conflict_lcid == lcid)
p_lcb->conflict_lcid = 0;
else
@@ -214,7 +214,7 @@
else if (p_lcb->conflict_lcid == lcid)
{
/* we must be in AVCT_CH_CFG state for the ch_lcid channel */
- AVCT_TRACE_DEBUG2("avct_l2c_connect_cfm_cback ch_state: %d, conflict_lcid:0x%x", p_lcb->ch_state, p_lcb->conflict_lcid);
+ AVCT_TRACE_DEBUG("avct_l2c_connect_cfm_cback ch_state: %d, conflict_lcid:0x%x", p_lcb->ch_state, p_lcb->conflict_lcid);
if (result == L2CAP_CONN_OK)
{
/* just in case the peer also accepts our connection - Send L2CAP disconnect req */
@@ -222,7 +222,7 @@
}
p_lcb->conflict_lcid = 0;
}
- AVCT_TRACE_DEBUG1("ch_state cnc: %d ", p_lcb->ch_state);
+ AVCT_TRACE_DEBUG("ch_state cnc: %d ", p_lcb->ch_state);
}
}
@@ -243,7 +243,7 @@
/* look up lcb for this channel */
if ((p_lcb = avct_lcb_by_lcid(lcid)) != NULL)
{
- AVCT_TRACE_DEBUG3("avct_l2c_config_cfm_cback: 0x%x, ch_state: %d, res: %d",
+ AVCT_TRACE_DEBUG("avct_l2c_config_cfm_cback: 0x%x, ch_state: %d, res: %d",
lcid, p_lcb->ch_state, p_cfg->result);
/* if in correct state */
if (p_lcb->ch_state == AVCT_CH_CFG)
@@ -264,7 +264,7 @@
/* else failure */
else
{
- AVCT_TRACE_DEBUG1("ERROR avct_l2c_config_cfm_cback L2CA_DisconnectReq %d ", p_lcb->ch_state);
+ AVCT_TRACE_DEBUG("ERROR avct_l2c_config_cfm_cback L2CA_DisconnectReq %d ", p_lcb->ch_state);
/* store result value */
p_lcb->ch_result = p_cfg->result;
@@ -272,7 +272,7 @@
L2CA_DisconnectReq(lcid);
}
}
- AVCT_TRACE_DEBUG1("ch_state cfc: %d ", p_lcb->ch_state);
+ AVCT_TRACE_DEBUG("ch_state cfc: %d ", p_lcb->ch_state);
}
}
@@ -293,7 +293,7 @@
/* look up lcb for this channel */
if ((p_lcb = avct_lcb_by_lcid(lcid)) != NULL)
{
- AVCT_TRACE_DEBUG2("avct_l2c_config_ind_cback: 0x%x, ch_state: %d", lcid, p_lcb->ch_state);
+ AVCT_TRACE_DEBUG("avct_l2c_config_ind_cback: 0x%x, ch_state: %d", lcid, p_lcb->ch_state);
/* store the mtu in tbl */
if (p_cfg->mtu_present)
{
@@ -322,7 +322,7 @@
avct_lcb_event(p_lcb, AVCT_LCB_LL_OPEN_EVT, NULL);
}
}
- AVCT_TRACE_DEBUG1("ch_state cfi: %d ", p_lcb->ch_state);
+ AVCT_TRACE_DEBUG("ch_state cfi: %d ", p_lcb->ch_state);
}
}
@@ -344,7 +344,7 @@
/* look up lcb for this channel */
if ((p_lcb = avct_lcb_by_lcid(lcid)) != NULL)
{
- AVCT_TRACE_DEBUG2("avct_l2c_disconnect_ind_cback: 0x%x, ch_state: %d", lcid, p_lcb->ch_state);
+ AVCT_TRACE_DEBUG("avct_l2c_disconnect_ind_cback: 0x%x, ch_state: %d", lcid, p_lcb->ch_state);
if (ack_needed)
{
/* send L2CAP disconnect response */
@@ -352,7 +352,7 @@
}
avct_lcb_event(p_lcb, AVCT_LCB_LL_CLOSE_EVT, (tAVCT_LCB_EVT *) &result);
- AVCT_TRACE_DEBUG1("ch_state di: %d ", p_lcb->ch_state);
+ AVCT_TRACE_DEBUG("ch_state di: %d ", p_lcb->ch_state);
}
}
@@ -374,14 +374,14 @@
/* look up lcb for this channel */
if ((p_lcb = avct_lcb_by_lcid(lcid)) != NULL)
{
- AVCT_TRACE_DEBUG3("avct_l2c_disconnect_cfm_cback: 0x%x, ch_state: %d, res: %d",
+ AVCT_TRACE_DEBUG("avct_l2c_disconnect_cfm_cback: 0x%x, ch_state: %d, res: %d",
lcid, p_lcb->ch_state, result);
/* result value may be previously stored */
res = (p_lcb->ch_result != 0) ? p_lcb->ch_result : result;
p_lcb->ch_result = 0;
avct_lcb_event(p_lcb, AVCT_LCB_LL_CLOSE_EVT, (tAVCT_LCB_EVT *) &res);
- AVCT_TRACE_DEBUG1("ch_state dc: %d ", p_lcb->ch_state);
+ AVCT_TRACE_DEBUG("ch_state dc: %d ", p_lcb->ch_state);
}
}
@@ -399,7 +399,7 @@
{
tAVCT_LCB *p_lcb;
- AVCT_TRACE_DEBUG1("avct_l2c_congestion_ind_cback: 0x%x", lcid);
+ AVCT_TRACE_DEBUG("avct_l2c_congestion_ind_cback: 0x%x", lcid);
/* look up lcb for this channel */
if ((p_lcb = avct_lcb_by_lcid(lcid)) != NULL)
{
@@ -421,7 +421,7 @@
{
tAVCT_LCB *p_lcb;
- AVCT_TRACE_DEBUG1("avct_l2c_data_ind_cback: 0x%x", lcid);
+ AVCT_TRACE_DEBUG("avct_l2c_data_ind_cback: 0x%x", lcid);
/* look up lcb for this channel */
if ((p_lcb = avct_lcb_by_lcid(lcid)) != NULL)
{
@@ -429,7 +429,7 @@
}
else /* prevent buffer leak */
{
- AVCT_TRACE_WARNING0("ERROR -> avct_l2c_data_ind_cback drop buffer");
+ AVCT_TRACE_WARNING("ERROR -> avct_l2c_data_ind_cback drop buffer");
GKI_freebuf(p_buf);
}
}
diff --git a/stack/avct/avct_lcb.c b/stack/avct/avct_lcb.c
index 6bc7e51..6c8fd2e 100644
--- a/stack/avct/avct_lcb.c
+++ b/stack/avct/avct_lcb.c
@@ -198,9 +198,9 @@
int i;
#if BT_TRACE_VERBOSE == TRUE
- AVCT_TRACE_EVENT3("LCB lcb=%d event=%s state=%s", p_lcb->allocated, avct_lcb_evt_str[event], avct_lcb_st_str[p_lcb->state]);
+ AVCT_TRACE_EVENT("LCB lcb=%d event=%s state=%s", p_lcb->allocated, avct_lcb_evt_str[event], avct_lcb_st_str[p_lcb->state]);
#else
- AVCT_TRACE_EVENT3("LCB lcb=%d event=%d state=%d", p_lcb->allocated, event, p_lcb->state);
+ AVCT_TRACE_EVENT("LCB lcb=%d event=%d state=%d", p_lcb->allocated, event, p_lcb->state);
#endif
/* look up the state table for the current state */
@@ -241,9 +241,9 @@
int i;
#if BT_TRACE_VERBOSE == TRUE
- AVCT_TRACE_EVENT3("BCB lcb=%d event=%s state=%s", p_bcb->allocated, avct_lcb_evt_str[event], avct_lcb_st_str[p_bcb->state]);
+ AVCT_TRACE_EVENT("BCB lcb=%d event=%s state=%s", p_bcb->allocated, avct_lcb_evt_str[event], avct_lcb_st_str[p_bcb->state]);
#else
- AVCT_TRACE_EVENT3("BCB lcb=%d event=%d state=%d", p_bcb->allocated, event, p_bcb->state);
+ AVCT_TRACE_EVENT("BCB lcb=%d event=%d state=%d", p_bcb->allocated, event, p_bcb->state);
#endif
/* look up the state table for the current state */
@@ -296,7 +296,7 @@
/* if no lcb found */
p_lcb = NULL;
- AVCT_TRACE_DEBUG6("No lcb for addr %02x-%02x-%02x-%02x-%02x-%02x",
+ AVCT_TRACE_DEBUG("No lcb for addr %02x-%02x-%02x-%02x-%02x-%02x",
bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]);
}
return p_lcb;
@@ -323,7 +323,7 @@
{
p_lcb->allocated = (UINT8)(i + 1);
memcpy(p_lcb->peer_addr, bd_addr, BD_ADDR_LEN);
- AVCT_TRACE_DEBUG1("avct_lcb_alloc %d", p_lcb->allocated);
+ AVCT_TRACE_DEBUG("avct_lcb_alloc %d", p_lcb->allocated);
break;
}
}
@@ -332,7 +332,7 @@
{
/* out of lcbs */
p_lcb = NULL;
- AVCT_TRACE_WARNING0("Out of lcbs");
+ AVCT_TRACE_WARNING("Out of lcbs");
}
return p_lcb;
}
@@ -354,7 +354,7 @@
int i;
UNUSED(p_data);
- AVCT_TRACE_DEBUG1("avct_lcb_dealloc %d", p_lcb->allocated);
+ AVCT_TRACE_DEBUG("avct_lcb_dealloc %d", p_lcb->allocated);
for (i = 0; i < AVCT_NUM_CONN; i++, p_ccb++)
{
@@ -363,7 +363,7 @@
{
if (p_ccb->p_lcb == p_lcb)
{
- AVCT_TRACE_DEBUG1("avct_lcb_dealloc used by ccb: %d", i);
+ AVCT_TRACE_DEBUG("avct_lcb_dealloc used by ccb: %d", i);
found = TRUE;
break;
}
@@ -372,7 +372,7 @@
if (!found)
{
- AVCT_TRACE_DEBUG0("avct_lcb_dealloc now");
+ AVCT_TRACE_DEBUG("avct_lcb_dealloc now");
/* clear reassembled msg buffer if in use */
if (p_lcb->p_rx_msg != NULL)
@@ -410,7 +410,7 @@
{
/* out of lcbs */
p_lcb = NULL;
- AVCT_TRACE_WARNING1("No lcb for lcid %x", lcid);
+ AVCT_TRACE_WARNING("No lcb for lcid %x", lcid);
}
return p_lcb;
@@ -456,10 +456,10 @@
tAVCT_CCB *p_ccb = &avct_cb.ccb[0];
int i;
- AVCT_TRACE_WARNING0("avct_lcb_last_ccb");
+ AVCT_TRACE_WARNING("avct_lcb_last_ccb");
for (i = 0; i < AVCT_NUM_CONN; i++, p_ccb++)
{
- AVCT_TRACE_WARNING6("%x: aloc:%d, lcb:0x%x/0x%x, ccb:0x%x/0x%x",
+ AVCT_TRACE_WARNING("%x: aloc:%d, lcb:0x%x/0x%x, ccb:0x%x/0x%x",
i, p_ccb->allocated, p_ccb->p_lcb, p_lcb, p_ccb, p_ccb_last);
if (p_ccb->allocated && (p_ccb->p_lcb == p_lcb) && (p_ccb != p_ccb_last))
{
diff --git a/stack/avct/avct_lcb_act.c b/stack/avct/avct_lcb_act.c
index 23ad332..17d5d3d 100644
--- a/stack/avct/avct_lcb_act.c
+++ b/stack/avct/avct_lcb_act.c
@@ -65,7 +65,7 @@
if (p_buf->len < avct_lcb_pkt_type_len[pkt_type])
{
GKI_freebuf(p_buf);
- AVCT_TRACE_WARNING0("Bad length during reassembly");
+ AVCT_TRACE_WARNING("Bad length during reassembly");
p_ret = NULL;
}
/* single packet */
@@ -76,7 +76,7 @@
{
GKI_freebuf(p_lcb->p_rx_msg);
p_lcb->p_rx_msg = NULL;
- AVCT_TRACE_WARNING0("Got single during reassembly");
+ AVCT_TRACE_WARNING("Got single during reassembly");
}
p_ret = p_buf;
}
@@ -87,37 +87,19 @@
if (p_lcb->p_rx_msg != NULL)
{
GKI_freebuf(p_lcb->p_rx_msg);
- AVCT_TRACE_WARNING0("Got start during reassembly");
+ AVCT_TRACE_WARNING("Got start during reassembly");
}
- /* Allocate bigger buffer for reassembly. As lower layers are
- * not aware of possible packet size after reassembly they
- * would have allocated smaller buffer.
- */
- p_lcb->p_rx_msg = (BT_HDR*)GKI_getbuf(GKI_MAX_BUF_SIZE);
- if (p_lcb->p_rx_msg == NULL)
- {
- AVCT_TRACE_ERROR0 ("Cannot alloc buffer for reassembly !!");
- GKI_freebuf(p_buf);
- }
- else
- {
- memcpy (p_lcb->p_rx_msg, p_buf,
- sizeof(BT_HDR) + p_buf->offset + p_buf->len);
- /* Free original buffer */
- GKI_freebuf(p_buf);
+ p_lcb->p_rx_msg = p_buf;
- /* update p to point to new buffer */
- p = (UINT8 *)(p_lcb->p_rx_msg + 1) + p_lcb->p_rx_msg->offset;
+ /* copy first header byte over nosp */
+ *(p + 1) = *p;
- /* copy first header byte over nosp */
- *(p + 1) = *p;
+ /* set offset to point to where to copy next */
+ p_lcb->p_rx_msg->offset += p_lcb->p_rx_msg->len;
- /* set offset to point to where to copy next */
- p_lcb->p_rx_msg->offset += p_lcb->p_rx_msg->len;
+ /* adjust length for packet header */
+ p_lcb->p_rx_msg->len -= 1;
- /* adjust length for packet header */
- p_lcb->p_rx_msg->len -= 1;
- }
p_ret = NULL;
}
/* continue or end */
@@ -127,7 +109,7 @@
if (p_lcb->p_rx_msg == NULL)
{
GKI_freebuf(p_buf);
- AVCT_TRACE_WARNING1("Pkt type=%d out of order", pkt_type);
+ AVCT_TRACE_WARNING("Pkt type=%d out of order", pkt_type);
p_ret = NULL;
}
else
@@ -147,7 +129,7 @@
p_lcb->p_rx_msg = NULL;
GKI_freebuf(p_buf);
p_ret = NULL;
- AVCT_TRACE_WARNING0("Fragmented message to big!");
+ AVCT_TRACE_WARNING("Fragmented message to big!");
}
else
{
@@ -410,19 +392,19 @@
*******************************************************************************/
void avct_lcb_chk_disc(tAVCT_LCB *p_lcb, tAVCT_LCB_EVT *p_data)
{
- AVCT_TRACE_WARNING0("avct_lcb_chk_disc");
+ AVCT_TRACE_WARNING("avct_lcb_chk_disc");
#if (AVCT_BROWSE_INCLUDED == TRUE)
avct_close_bcb(p_lcb, p_data);
#endif
if (avct_lcb_last_ccb(p_lcb, p_data->p_ccb))
{
- AVCT_TRACE_WARNING0("closing");
+ AVCT_TRACE_WARNING("closing");
p_data->p_ccb->ch_close = TRUE;
avct_lcb_event(p_lcb, AVCT_LCB_INT_CLOSE_EVT, p_data);
}
else
{
- AVCT_TRACE_WARNING0("dealloc ccb");
+ AVCT_TRACE_WARNING("dealloc ccb");
avct_lcb_unbind_disc(p_lcb, p_data);
}
}
@@ -517,7 +499,7 @@
{
UNUSED(p_lcb);
- AVCT_TRACE_WARNING0("Dropping msg");
+ AVCT_TRACE_WARNING("Dropping msg");
GKI_freebuf(p_data->ul_msg.p_buf);
}
@@ -574,7 +556,7 @@
if ((p_buf = (BT_HDR *) GKI_getbuf(buf_size)) == NULL)
{
/* whoops; free original msg buf and bail */
- AVCT_TRACE_ERROR0 ("avct_lcb_send_msg cannot alloc buffer!!");
+ AVCT_TRACE_ERROR ("avct_lcb_send_msg cannot alloc buffer!!");
GKI_freebuf(p_data->ul_msg.p_buf);
break;
}
@@ -636,7 +618,7 @@
pkt_type = AVCT_PKT_TYPE_END;
}
}
- AVCT_TRACE_DEBUG1 ("avct_lcb_send_msg tx_q_count:%d", p_lcb->tx_q.count);
+ AVCT_TRACE_DEBUG ("avct_lcb_send_msg tx_q_count:%d", p_lcb->tx_q.count);
return;
}
@@ -696,7 +678,7 @@
/* check for invalid cr_ipid */
if (cr_ipid == AVCT_CR_IPID_INVALID)
{
- AVCT_TRACE_WARNING1("Invalid cr_ipid", cr_ipid);
+ AVCT_TRACE_WARNING("Invalid cr_ipid", cr_ipid);
GKI_freebuf(p_data->p_buf);
return;
}
@@ -713,7 +695,7 @@
else
{
/* PID not found; drop message */
- AVCT_TRACE_WARNING1("No ccb for PID=%x", pid);
+ AVCT_TRACE_WARNING("No ccb for PID=%x", pid);
GKI_freebuf(p_data->p_buf);
/* if command send reject */
diff --git a/stack/avdt/avdt_ad.c b/stack/avdt/avdt_ad.c
index 7fe665c..4686887 100644
--- a/stack/avdt/avdt_ad.c
+++ b/stack/avdt/avdt_ad.c
@@ -56,7 +56,7 @@
{
scb_idx = avdt_scb_to_hdl(p_scb) - 1;
/*
- AVDT_TRACE_DEBUG2("type: %d, tcid: %d", type, ((scb_idx * (AVDT_CHAN_NUM_TYPES - 1)) + type));
+ AVDT_TRACE_DEBUG("type: %d, tcid: %d", type, ((scb_idx * (AVDT_CHAN_NUM_TYPES - 1)) + type));
*/
return ((scb_idx * (AVDT_CHAN_NUM_TYPES - 1)) + type);
}
@@ -89,7 +89,7 @@
*/
type = ((tcid + AVDT_CHAN_NUM_TYPES - 2) % (AVDT_CHAN_NUM_TYPES - 1)) + 1;
}
- AVDT_TRACE_DEBUG2("tcid: %d, type: %d", tcid, type);
+ AVDT_TRACE_DEBUG("tcid: %d, type: %d", tcid, type);
return type;
}
@@ -299,7 +299,7 @@
*******************************************************************************/
UINT8 avdt_ad_tc_tbl_to_idx(tAVDT_TC_TBL *p_tbl)
{
- AVDT_TRACE_DEBUG1("avdt_ad_tc_tbl_to_idx: %d", (p_tbl - avdt_cb.ad.tc_tbl));
+ AVDT_TRACE_DEBUG("avdt_ad_tc_tbl_to_idx: %d", (p_tbl - avdt_cb.ad.tc_tbl));
/* use array arithmetic to determine index */
return (UINT8) (p_tbl - avdt_cb.ad.tc_tbl);
}
@@ -331,7 +331,7 @@
p_tbl->cfg_flags = 0;
p_tbl->peer_mtu = L2CAP_DEFAULT_MTU;
- AVDT_TRACE_DEBUG2("avdt_ad_tc_close_ind tcid: %d, old: %d",
+ AVDT_TRACE_DEBUG("avdt_ad_tc_close_ind tcid: %d, old: %d",
p_tbl->tcid, close.old_tc_state);
/* if signaling channel, notify ccb that channel open */
if (p_tbl->tcid == 0)
@@ -482,7 +482,10 @@
avdt_scb_event(p_scb, AVDT_SCB_TC_DATA_EVT, (tAVDT_SCB_EVT *) &p_buf);
}
else
+ {
GKI_freebuf(p_buf);
+ AVDT_TRACE_ERROR(" avdt_ad_tc_data_ind buffer freed");
+ }
}
}
@@ -537,7 +540,7 @@
p_tbl = avdt_ad_tc_tbl_alloc(p_ccb);
p_tbl->tcid = avdt_ad_type_to_tcid(type, p_scb);
- AVDT_TRACE_DEBUG3("avdt_ad_open_req: type: %d, role: %d, tcid:%d",
+ AVDT_TRACE_DEBUG("avdt_ad_open_req: type: %d, role: %d, tcid:%d",
type, role, p_tbl->tcid);
if (type == AVDT_CHAN_SIG)
@@ -554,7 +557,7 @@
/* also set scb_hdl in rt_tbl */
avdt_cb.ad.rt_tbl[avdt_ccb_to_idx(p_ccb)][p_tbl->tcid].scb_hdl = avdt_scb_to_hdl(p_scb);
- AVDT_TRACE_DEBUG3("avdt_cb.ad.rt_tbl[%d][%d].scb_hdl = %d",
+ AVDT_TRACE_DEBUG("avdt_cb.ad.rt_tbl[%d][%d].scb_hdl = %d",
avdt_ccb_to_idx(p_ccb), p_tbl->tcid,
avdt_scb_to_hdl(p_scb));
}
@@ -574,11 +577,11 @@
{
/* if connect req ok, store tcid in lcid table */
avdt_cb.ad.lcid_tbl[lcid - L2CAP_BASE_APPL_CID] = avdt_ad_tc_tbl_to_idx(p_tbl);
- AVDT_TRACE_DEBUG2("avdt_cb.ad.lcid_tbl[%d] = %d",
+ AVDT_TRACE_DEBUG("avdt_cb.ad.lcid_tbl[%d] = %d",
(lcid - L2CAP_BASE_APPL_CID), avdt_ad_tc_tbl_to_idx(p_tbl));
avdt_cb.ad.rt_tbl[avdt_ccb_to_idx(p_ccb)][p_tbl->tcid].lcid = lcid;
- AVDT_TRACE_DEBUG3("avdt_cb.ad.rt_tbl[%d][%d].lcid = 0x%x",
+ AVDT_TRACE_DEBUG("avdt_cb.ad.rt_tbl[%d][%d].lcid = 0x%x",
avdt_ccb_to_idx(p_ccb), p_tbl->tcid,
lcid);
}
@@ -608,7 +611,7 @@
tAVDT_TC_TBL *p_tbl;
p_tbl = avdt_ad_tc_tbl_by_type(type, p_ccb, p_scb);
- AVDT_TRACE_DEBUG1("avdt_ad_close_req state: %d", p_tbl->state);
+ AVDT_TRACE_DEBUG("avdt_ad_close_req state: %d", p_tbl->state);
switch(p_tbl->state)
{
diff --git a/stack/avdt/avdt_api.c b/stack/avdt/avdt_api.c
index 855f17e..f18c556 100644
--- a/stack/avdt/avdt_api.c
+++ b/stack/avdt/avdt_api.c
@@ -176,6 +176,68 @@
/*******************************************************************************
**
+** Function AVDT_SINK_Activate
+**
+** Description Activate SEP of A2DP Sink. In Use parameter is adjusted.
+** In Use will be made false in case of activation. A2DP SRC
+** will receive in_use as false and can open A2DP Sink
+** connection
+**
+** Returns void.
+**
+*******************************************************************************/
+void AVDT_SINK_Activate()
+{
+ tAVDT_SCB *p_scb = &avdt_cb.scb[0];
+ int i;
+ AVDT_TRACE_DEBUG("AVDT_SINK_Activate");
+ /* for all allocated scbs */
+ for (i = 0; i < AVDT_NUM_SEPS; i++, p_scb++)
+ {
+ if ((p_scb->allocated) && (p_scb->cs.tsep == AVDT_TSEP_SNK))
+ {
+ AVDT_TRACE_DEBUG("AVDT_SINK_Activate found scb");
+ p_scb->sink_activated = TRUE;
+ /* update in_use */
+ p_scb->in_use = FALSE;
+ break;
+ }
+ }
+}
+
+/*******************************************************************************
+**
+** Function AVDT_SINK_Deactivate
+**
+** Description Deactivate SEP of A2DP Sink. In Use parameter is adjusted.
+** In Use will be made TRUE in case of activation. A2DP SRC
+** will receive in_use as true and will not open A2DP Sink
+** connection
+**
+** Returns void.
+**
+*******************************************************************************/
+void AVDT_SINK_Deactivate()
+{
+ tAVDT_SCB *p_scb = &avdt_cb.scb[0];
+ int i;
+ AVDT_TRACE_DEBUG("AVDT_SINK_Deactivate");
+ /* for all allocated scbs */
+ for (i = 0; i < AVDT_NUM_SEPS; i++, p_scb++)
+ {
+ if ((p_scb->allocated) && (p_scb->cs.tsep == AVDT_TSEP_SNK))
+ {
+ AVDT_TRACE_DEBUG("AVDT_SINK_Deactivate, found scb");
+ p_scb->sink_activated = FALSE;
+ /* update in_use */
+ p_scb->in_use = TRUE;
+ break;
+ }
+ }
+}
+
+/*******************************************************************************
+**
** Function AVDT_CreateStream
**
** Description Create a stream endpoint. After a stream endpoint is
@@ -329,7 +391,7 @@
/* verify SEID */
if ((p_evt->single.seid < AVDT_SEID_MIN) || (p_evt->single.seid > AVDT_SEID_MAX))
{
- AVDT_TRACE_ERROR1("seid: %d", p_evt->single.seid);
+ AVDT_TRACE_ERROR("seid: %d", p_evt->single.seid);
result = AVDT_BAD_PARAMS;
}
/* find channel control block for this bd addr; if none, allocate one */
@@ -1017,7 +1079,7 @@
}
else if (p_ccb->ll_opened == FALSE)
{
- AVDT_TRACE_WARNING0("AVDT_ConnectReq: CCB LL is in the middle of opening");
+ AVDT_TRACE_WARNING("AVDT_ConnectReq: CCB LL is in the middle of opening");
/* ccb was already allocated for the incoming signalling. */
result = AVDT_BUSY;
@@ -1178,7 +1240,7 @@
result = AVDT_BAD_HANDLE;
break;
}
- AVDT_TRACE_WARNING1("mux_tsid_media:%d", p_scb->curr_cfg.mux_tsid_media);
+ AVDT_TRACE_WARNING("mux_tsid_media:%d", p_scb->curr_cfg.mux_tsid_media);
if (p_scb->p_pkt != NULL
|| p_scb->p_ccb == NULL
@@ -1187,7 +1249,7 @@
|| p_scb->curr_cfg.mux_tsid_media == 0)
{
result = AVDT_ERR_BAD_STATE;
- AVDT_TRACE_WARNING4("p_scb->p_pkt=%x, p_scb->p_ccb=%x, IsQueueEmpty=%x, p_scb->frag_off=%x",
+ AVDT_TRACE_WARNING("p_scb->p_pkt=%x, p_scb->p_ccb=%x, IsQueueEmpty=%x, p_scb->frag_off=%x",
p_scb->p_pkt, p_scb->p_ccb, GKI_queue_is_empty(&p_scb->frag_q), p_scb->frag_off);
break;
}
@@ -1200,7 +1262,7 @@
if(GKI_queue_is_empty(&evt.apiwrite.frag_q))
{
- AVDT_TRACE_WARNING0("AVDT_WriteDataReq out of GKI buffers");
+ AVDT_TRACE_WARNING("AVDT_WriteDataReq out of GKI buffers");
result = AVDT_ERR_RESOURCE;
break;
}
@@ -1216,7 +1278,7 @@
#if (BT_USE_TRACES == TRUE)
if(result != AVDT_SUCCESS)
{
- AVDT_TRACE_WARNING1("*** AVDT_WriteDataReq failed result=%d",result);
+ AVDT_TRACE_WARNING("*** AVDT_WriteDataReq failed result=%d",result);
}
#endif
return result;
@@ -1343,9 +1405,9 @@
case AVDT_RTCP_PT_RR: /* Receiver Report */
*p++ = p_data->rr.frag_lost;
- AVDT_TRACE_API1("packet_lost: %d", p_data->rr.packet_lost);
+ AVDT_TRACE_API("packet_lost: %d", p_data->rr.packet_lost);
p_data->rr.packet_lost &= 0xFFFFFF;
- AVDT_TRACE_API1("packet_lost: %d", p_data->rr.packet_lost);
+ AVDT_TRACE_API("packet_lost: %d", p_data->rr.packet_lost);
UINT24_TO_BE_STREAM(p, p_data->rr.packet_lost);
UINT32_TO_BE_STREAM(p, p_data->rr.seq_num_rcvd);
UINT32_TO_BE_STREAM(p, p_data->rr.jitter);
diff --git a/stack/avdt/avdt_ccb.c b/stack/avdt/avdt_ccb.c
index c2ef2f4..2a10ef8 100644
--- a/stack/avdt/avdt_ccb.c
+++ b/stack/avdt/avdt_ccb.c
@@ -302,7 +302,7 @@
int i;
#if AVDT_DEBUG == TRUE
- AVDT_TRACE_EVENT3("CCB ccb=%d event=%s state=%s", avdt_ccb_to_idx(p_ccb), avdt_ccb_evt_str[event], avdt_ccb_st_str[p_ccb->state]);
+ AVDT_TRACE_EVENT("CCB ccb=%d event=%s state=%s", avdt_ccb_to_idx(p_ccb), avdt_ccb_evt_str[event], avdt_ccb_st_str[p_ccb->state]);
#endif
BTTRC_AVDT_CCB_EVENT(event, p_ccb->state);
@@ -360,7 +360,7 @@
/* if no ccb found */
p_ccb = NULL;
- AVDT_TRACE_DEBUG6("No ccb for addr %02x-%02x-%02x-%02x-%02x-%02x",
+ AVDT_TRACE_DEBUG("No ccb for addr %02x-%02x-%02x-%02x-%02x-%02x",
bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]);
}
return p_ccb;
@@ -390,7 +390,7 @@
GKI_init_q(&p_ccb->cmd_q);
GKI_init_q(&p_ccb->rsp_q);
p_ccb->timer_entry.param = (UINT32) p_ccb;
- AVDT_TRACE_DEBUG1("avdt_ccb_alloc %d", i);
+ AVDT_TRACE_DEBUG("avdt_ccb_alloc %d", i);
break;
}
}
@@ -399,7 +399,7 @@
{
/* out of ccbs */
p_ccb = NULL;
- AVDT_TRACE_WARNING0("Out of ccbs");
+ AVDT_TRACE_WARNING("Out of ccbs");
}
return p_ccb;
}
@@ -418,7 +418,7 @@
{
UNUSED(p_data);
- AVDT_TRACE_DEBUG1("avdt_ccb_dealloc %d", avdt_ccb_to_idx(p_ccb));
+ AVDT_TRACE_DEBUG("avdt_ccb_dealloc %d", avdt_ccb_to_idx(p_ccb));
btu_stop_timer(&p_ccb->timer_entry);
memset(p_ccb, 0, sizeof(tAVDT_CCB));
}
@@ -461,7 +461,7 @@
else
{
p_ccb = NULL;
- AVDT_TRACE_WARNING1("No ccb for idx %d", idx);
+ AVDT_TRACE_WARNING("No ccb for idx %d", idx);
}
return p_ccb;
}
diff --git a/stack/avdt/avdt_ccb_act.c b/stack/avdt/avdt_ccb_act.c
index 1249c63..d87dbb1 100644
--- a/stack/avdt/avdt_ccb_act.c
+++ b/stack/avdt/avdt_ccb_act.c
@@ -1034,7 +1034,7 @@
void avdt_ccb_set_disconn(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data)
{
/*
- AVDT_TRACE_EVENT2("avdt_ccb_set_disconn:conn:x%x, api:x%x",
+ AVDT_TRACE_EVENT("avdt_ccb_set_disconn:conn:x%x, api:x%x",
p_ccb->p_conn_cback, p_data->disconnect.p_cback);
*/
/* save callback */
diff --git a/stack/avdt/avdt_int.h b/stack/avdt/avdt_int.h
index 04968a6..e9752c2 100644
--- a/stack/avdt/avdt_int.h
+++ b/stack/avdt/avdt_int.h
@@ -491,6 +491,7 @@
UINT16 media_seq; /* media packet sequence number */
BOOLEAN allocated; /* whether scb is allocated or unused */
BOOLEAN in_use; /* whether stream being used by peer */
+ BOOLEAN sink_activated; /* A2DP Sink activated/de-activated from Application */
UINT8 role; /* initiator/acceptor role in current procedure */
BOOLEAN remove; /* whether CB is marked for removal */
UINT8 state; /* state machine state */
diff --git a/stack/avdt/avdt_l2c.c b/stack/avdt/avdt_l2c.c
index 2256a90..c13b5b4 100644
--- a/stack/avdt/avdt_l2c.c
+++ b/stack/avdt/avdt_l2c.c
@@ -70,17 +70,18 @@
** Returns void
**
*******************************************************************************/
-static void avdt_sec_check_complete_term (BD_ADDR bd_addr, void *p_ref_data, UINT8 res)
+static void avdt_sec_check_complete_term (BD_ADDR bd_addr, tBT_TRANSPORT transport,
+ void *p_ref_data, UINT8 res)
{
tAVDT_CCB *p_ccb = NULL;
tL2CAP_CFG_INFO cfg;
tAVDT_TC_TBL *p_tbl;
UNUSED(p_ref_data);
- AVDT_TRACE_DEBUG1("avdt_sec_check_complete_term res: %d", res);
+ AVDT_TRACE_DEBUG("avdt_sec_check_complete_term res: %d", res);
if (!bd_addr)
{
- AVDT_TRACE_WARNING0("avdt_sec_check_complete_term: NULL BD_ADDR");
+ AVDT_TRACE_WARNING("avdt_sec_check_complete_term: NULL BD_ADDR");
return;
}
@@ -92,7 +93,7 @@
if (res == BTM_SUCCESS)
{
- /* Send response to the L2CAP layer. */
+ /* Send response to the L2CAP layer. */
L2CA_ConnectRsp (bd_addr, p_tbl->id, p_tbl->lcid, L2CAP_CONN_OK, L2CAP_CONN_OK);
/* store idx in LCID table, store LCID in routing table */
@@ -127,14 +128,15 @@
** Returns void
**
*******************************************************************************/
-static void avdt_sec_check_complete_orig (BD_ADDR bd_addr, void *p_ref_data, UINT8 res)
+static void avdt_sec_check_complete_orig (BD_ADDR bd_addr, tBT_TRANSPORT trasnport,
+ void *p_ref_data, UINT8 res)
{
tAVDT_CCB *p_ccb = NULL;
tL2CAP_CFG_INFO cfg;
tAVDT_TC_TBL *p_tbl;
UNUSED(p_ref_data);
- AVDT_TRACE_DEBUG1("avdt_sec_check_complete_orig res: %d", res);
+ AVDT_TRACE_DEBUG("avdt_sec_check_complete_orig res: %d", res);
if (bd_addr)
p_ccb = avdt_ccb_by_bd(bd_addr);
p_tbl = avdt_ad_tc_tbl_by_st(AVDT_CHAN_SIG, p_ccb, AVDT_AD_ST_SEC_INT);
@@ -281,7 +283,7 @@
tL2CAP_CFG_INFO cfg;
tAVDT_CCB *p_ccb;
- AVDT_TRACE_DEBUG2("avdt_l2c_connect_cfm_cback lcid: %d, result: %d",
+ AVDT_TRACE_DEBUG("avdt_l2c_connect_cfm_cback lcid: %d, result: %d",
lcid, result);
/* look up info for this channel */
if ((p_tbl = avdt_ad_tc_tbl_by_lcid(lcid)) != NULL)
@@ -405,7 +407,7 @@
{
p_tbl->peer_mtu = L2CAP_DEFAULT_MTU;
}
- AVDT_TRACE_DEBUG2("peer_mtu: %d, lcid: x%x",p_tbl->peer_mtu, lcid);
+ AVDT_TRACE_DEBUG("peer_mtu: %d, lcid: x%x",p_tbl->peer_mtu, lcid);
/* send L2CAP configure response */
memset(p_cfg, 0, sizeof(tL2CAP_CFG_INFO));
@@ -441,7 +443,7 @@
{
tAVDT_TC_TBL *p_tbl;
- AVDT_TRACE_DEBUG2("avdt_l2c_disconnect_ind_cback lcid: %d, ack_needed: %d",
+ AVDT_TRACE_DEBUG("avdt_l2c_disconnect_ind_cback lcid: %d, ack_needed: %d",
lcid, ack_needed);
/* look up info for this channel */
if ((p_tbl = avdt_ad_tc_tbl_by_lcid(lcid)) != NULL)
@@ -470,7 +472,7 @@
{
tAVDT_TC_TBL *p_tbl;
- AVDT_TRACE_DEBUG2("avdt_l2c_disconnect_cfm_cback lcid: %d, result: %d",
+ AVDT_TRACE_DEBUG("avdt_l2c_disconnect_cfm_cback lcid: %d, result: %d",
lcid, result);
/* look up info for this channel */
if ((p_tbl = avdt_ad_tc_tbl_by_lcid(lcid)) != NULL)
diff --git a/stack/avdt/avdt_msg.c b/stack/avdt/avdt_msg.c
index a1c57b3..2f38c3a 100644
--- a/stack/avdt/avdt_msg.c
+++ b/stack/avdt/avdt_msg.c
@@ -589,7 +589,7 @@
if (!p_cfg)
{
- AVDT_TRACE_ERROR0 ("not expecting this cfg");
+ AVDT_TRACE_ERROR ("not expecting this cfg");
return AVDT_ERR_BAD_STATE;
}
@@ -633,7 +633,7 @@
{
/* Skip unknown categories. */
p += elem_len;
- AVDT_TRACE_DEBUG2("skipping unknown service category=%d len: %d", elem, elem_len);
+ AVDT_TRACE_DEBUG("skipping unknown service category=%d len: %d", elem, elem_len);
continue;
}
}
@@ -647,7 +647,7 @@
/* add element to psc mask, but mask out codec or protect */
p_cfg->psc_mask |= (1 << elem);
- AVDT_TRACE_DEBUG3("elem=%d elem_len: %d psc_mask=0x%x", elem, elem_len, p_cfg->psc_mask);
+ AVDT_TRACE_DEBUG("elem=%d elem_len: %d psc_mask=0x%x", elem, elem_len, p_cfg->psc_mask);
/* parse individual information elements with additional parameters */
switch (elem)
@@ -689,7 +689,7 @@
#if AVDT_MULTIPLEXING == TRUE
case AVDT_CAT_MUX:
/* verify length */
- AVDT_TRACE_WARNING2("psc_mask=0x%x elem_len=%d", p_cfg->psc_mask, elem_len);
+ AVDT_TRACE_WARNING("psc_mask=0x%x elem_len=%d", p_cfg->psc_mask, elem_len);
if( ((0 == (p_cfg->psc_mask & (AVDT_PSC_RECOV|AVDT_PSC_REPORT))) && (elem_len != 3))
|| (((p_cfg->psc_mask & AVDT_PSC_REPORT) && !(p_cfg->psc_mask & AVDT_PSC_RECOV))
&& (elem_len != 5))
@@ -760,7 +760,7 @@
} /* switch */
} /* while ! err, !end*/
*p_elem = elem;
- AVDT_TRACE_DEBUG3("err=0x%x, elem:0x%x psc_mask=0x%x", err, elem, p_cfg->psc_mask);
+ AVDT_TRACE_DEBUG("err=0x%x, elem:0x%x psc_mask=0x%x", err, elem, p_cfg->psc_mask);
return err;
}
@@ -914,7 +914,7 @@
/* verify no protocol service capabilities in parameters */
if (!err)
{
- AVDT_TRACE_DEBUG2("avdt_msg_prs_reconfig_cmd psc_mask=0x%x/0x%x", p_msg->config_cmd.p_cfg->psc_mask, AVDT_MSG_PSC_MASK);
+ AVDT_TRACE_DEBUG("avdt_msg_prs_reconfig_cmd psc_mask=0x%x/0x%x", p_msg->config_cmd.p_cfg->psc_mask, AVDT_MSG_PSC_MASK);
if ((p_msg->config_cmd.p_cfg->psc_mask != 0) ||
(p_msg->config_cmd.p_cfg->num_codec == 0 && p_msg->config_cmd.p_cfg->num_protect == 0))
{
@@ -1161,7 +1161,7 @@
/* verify len */
if (len != AVDT_LEN_DELAY_RPT)
{
- AVDT_TRACE_WARNING2("avdt_msg_prs_delay_rpt expected len: %u got: %u", AVDT_LEN_DELAY_RPT, len);
+ AVDT_TRACE_WARNING("avdt_msg_prs_delay_rpt expected len: %u got: %u", AVDT_LEN_DELAY_RPT, len);
err = AVDT_ERR_LENGTH;
}
else
@@ -1176,7 +1176,7 @@
else
{
BE_STREAM_TO_UINT16 (p_msg->delay_rpt_cmd.delay, p);
- AVDT_TRACE_DEBUG1("avdt_msg_prs_delay_rpt delay: %u", p_msg->delay_rpt_cmd.delay);
+ AVDT_TRACE_DEBUG("avdt_msg_prs_delay_rpt delay: %u", p_msg->delay_rpt_cmd.delay);
}
}
return err;
@@ -1289,7 +1289,7 @@
label = AVDT_LAYERSPEC_LABEL(p_ccb->p_curr_msg->layer_specific);
msg = AVDT_LAYERSPEC_MSG(p_ccb->p_curr_msg->layer_specific);
sig = (UINT8) p_ccb->p_curr_msg->event;
- AVDT_TRACE_DEBUG3("avdt_msg_send label:%d, msg:%d, sig:%d", label, msg, sig);
+ AVDT_TRACE_DEBUG("avdt_msg_send label:%d, msg:%d, sig:%d", label, msg, sig);
/* keep track of how much of msg we've sent */
curr_msg_len -= p_buf->len;
@@ -1368,7 +1368,7 @@
if (p_buf->len < avdt_msg_pkt_type_len[pkt_type])
{
GKI_freebuf(p_buf);
- AVDT_TRACE_WARNING0("Bad length during reassembly");
+ AVDT_TRACE_WARNING("Bad length during reassembly");
p_ret = NULL;
}
/* single packet */
@@ -1379,7 +1379,7 @@
{
GKI_freebuf(p_ccb->p_rx_msg);
p_ccb->p_rx_msg = NULL;
- AVDT_TRACE_WARNING0("Got single during reassembly");
+ AVDT_TRACE_WARNING("Got single during reassembly");
}
p_ret = p_buf;
}
@@ -1390,7 +1390,7 @@
if (p_ccb->p_rx_msg != NULL)
{
GKI_freebuf(p_ccb->p_rx_msg);
- AVDT_TRACE_WARNING0("Got start during reassembly");
+ AVDT_TRACE_WARNING("Got start during reassembly");
}
p_ccb->p_rx_msg = p_buf;
@@ -1412,7 +1412,7 @@
if (p_ccb->p_rx_msg == NULL)
{
GKI_freebuf(p_buf);
- AVDT_TRACE_WARNING1("Pkt type=%d out of order", pkt_type);
+ AVDT_TRACE_WARNING("Pkt type=%d out of order", pkt_type);
p_ret = NULL;
}
else
@@ -1484,7 +1484,7 @@
p_buf = (BT_HDR *) GKI_getpoolbuf(AVDT_CMD_POOL_ID);
if (p_buf == NULL)
{
- AVDT_TRACE_ERROR0("avdt_msg_send_cmd out of buffer!!");
+ AVDT_TRACE_ERROR("avdt_msg_send_cmd out of buffer!!");
return;
}
@@ -1620,7 +1620,7 @@
/* add the error code */
AVDT_MSG_BLD_ERR(p, p_params->hdr.err_code);
}
- AVDT_TRACE_DEBUG0("avdt_msg_send_rej");
+ AVDT_TRACE_DEBUG("avdt_msg_send_rej");
/* calculate length */
p_buf->len = (UINT16) (p - p_start);
@@ -1654,7 +1654,6 @@
BT_HDR *p_buf;
UINT8 *p;
UINT8 *p_start;
- UNUSED(sig_id);
/* get a buffer */
p_buf = (BT_HDR *) GKI_getpoolbuf(AVDT_CMD_POOL_ID);
@@ -1667,10 +1666,12 @@
/* calculate length */
p_buf->len = (UINT16) (p - p_start);
- /* stash label, and message type in buf */
+ /* stash sig, label, and message type in buf */
+ p_buf->event = sig_id;
AVDT_BLD_LAYERSPEC(p_buf->layer_specific, AVDT_MSG_TYPE_GRJ, p_params->hdr.label);
- p_buf->event = 0;
- AVDT_TRACE_DEBUG0("avdt_msg_send_grej");
+ //p_buf->event = 0;
+ //AVDT_BLD_LAYERSPEC(p_buf->layer_specific, 0, p_params->hdr.label);
+ AVDT_TRACE_DEBUG("avdt_msg_send_grej");
/* queue message and trigger ccb to send it */
GKI_enqueue(&p_ccb->rsp_q, p_buf);
@@ -1718,7 +1719,7 @@
/* parse the message header */
AVDT_MSG_PRS_HDR(p, label, pkt_type, msg_type);
- /* AVDT_TRACE_DEBUG1("msg_type=%d", msg_type); */
+ /* AVDT_TRACE_DEBUG("msg_type=%d", msg_type); */
/* set up label and ccb_idx in message hdr */
msg.hdr.label = label;
msg.hdr.ccb_idx = avdt_ccb_to_idx(p_ccb);
@@ -1726,7 +1727,7 @@
/* verify msg type */
if (msg_type == AVDT_MSG_TYPE_GRJ)
{
- AVDT_TRACE_WARNING1("Dropping msg msg_type=%d", msg_type);
+ AVDT_TRACE_WARNING("Dropping msg msg_type=%d", msg_type);
ok = FALSE;
}
/* check for general reject */
@@ -1748,7 +1749,7 @@
msg.hdr.sig_id = sig;
if ((sig == 0) || (sig > AVDT_SIG_MAX))
{
- AVDT_TRACE_WARNING2("Dropping msg sig=%d msg_type:%d", sig, msg_type);
+ AVDT_TRACE_WARNING("Dropping msg sig=%d msg_type:%d", sig, msg_type);
ok = FALSE;
/* send a general reject */
@@ -1813,7 +1814,7 @@
/* if parsing failed */
if (err != 0)
{
- AVDT_TRACE_WARNING2("Parsing failed sig=%d err=0x%x", sig, err);
+ AVDT_TRACE_WARNING("Parsing failed sig=%d err=0x%x", sig, err);
/* if its a rsp or rej, drop it; if its a cmd, send a rej;
** note special case for abort; never send abort reject
@@ -1850,7 +1851,7 @@
else
{
ok = FALSE;
- AVDT_TRACE_WARNING2("Cmd not found for rsp sig=%d label=%d", sig, label);
+ AVDT_TRACE_WARNING("Cmd not found for rsp sig=%d label=%d", sig, label);
}
}
}
diff --git a/stack/avdt/avdt_scb.c b/stack/avdt/avdt_scb.c
index d0c9e0f..8eb5cc2 100644
--- a/stack/avdt/avdt_scb.c
+++ b/stack/avdt/avdt_scb.c
@@ -529,7 +529,7 @@
int i;
#if AVDT_DEBUG == TRUE
- AVDT_TRACE_EVENT4("SCB hdl=%d event=%d/%s state=%s", avdt_scb_to_hdl(p_scb), event, avdt_scb_evt_str[event], avdt_scb_st_str[p_scb->state]);
+ AVDT_TRACE_EVENT("SCB hdl=%d event=%d/%s state=%s", avdt_scb_to_hdl(p_scb), event, avdt_scb_evt_str[event], avdt_scb_st_str[p_scb->state]);
#endif
BTTRC_AVDT_SCB_EVENT(event, p_scb->state);
@@ -601,6 +601,13 @@
memset(p_scb,0,sizeof(tAVDT_SCB));
p_scb->allocated = TRUE;
p_scb->p_ccb = NULL;
+
+ /* initialize sink as activated */
+ if (p_cs->tsep == AVDT_TSEP_SNK)
+ {
+ p_scb->sink_activated = TRUE;
+ }
+
memcpy(&p_scb->cs, p_cs, sizeof(tAVDT_CS));
#if AVDT_MULTIPLEXING == TRUE
/* initialize fragments gueue */
@@ -618,7 +625,7 @@
}
#endif
p_scb->timer_entry.param = (UINT32) p_scb;
- AVDT_TRACE_DEBUG2("avdt_scb_alloc hdl=%d, psc_mask:0x%x", i+1, p_cs->cfg.psc_mask);
+ AVDT_TRACE_DEBUG("avdt_scb_alloc hdl=%d, psc_mask:0x%x", i+1, p_cs->cfg.psc_mask);
break;
}
}
@@ -627,7 +634,7 @@
{
/* out of ccbs */
p_scb = NULL;
- AVDT_TRACE_WARNING0("Out of scbs");
+ AVDT_TRACE_WARNING("Out of scbs");
}
return p_scb;
@@ -650,7 +657,7 @@
#endif
UNUSED(p_data);
- AVDT_TRACE_DEBUG1("avdt_scb_dealloc hdl=%d", avdt_scb_to_hdl(p_scb));
+ AVDT_TRACE_DEBUG("avdt_scb_dealloc hdl=%d", avdt_scb_to_hdl(p_scb));
btu_stop_timer(&p_scb->timer_entry);
#if AVDT_MULTIPLEXING == TRUE
@@ -701,13 +708,13 @@
if (!p_scb->allocated)
{
p_scb = NULL;
- AVDT_TRACE_WARNING1("scb hdl %d not allocated", hdl);
+ AVDT_TRACE_WARNING("scb hdl %d not allocated", hdl);
}
}
else
{
p_scb = NULL;
- AVDT_TRACE_WARNING1("scb hdl %d out of range", hdl);
+ AVDT_TRACE_WARNING("scb hdl %d out of range", hdl);
}
return p_scb;
}
@@ -730,7 +737,7 @@
UINT8 chk_state;
UINT8 ret = 0;
- AVDT_TRACE_DEBUG1("avdt_scb_verify state %d", state);
+ AVDT_TRACE_DEBUG("avdt_scb_verify state %d", state);
/* set nonsupported command mask */
/* translate public state into private state */
nsc_mask = 0;
@@ -770,7 +777,7 @@
{
ret = p_seid[i];
}
- AVDT_TRACE_DEBUG3("avdt_scb_verify state %d, nsc_mask0x%x, ret: %d",
+ AVDT_TRACE_DEBUG("avdt_scb_verify state %d, nsc_mask0x%x, ret: %d",
chk_state, nsc_mask, ret);
return ret;
}
diff --git a/stack/avdt/avdt_scb_act.c b/stack/avdt/avdt_scb_act.c
index 75242ac..72dd3cd 100644
--- a/stack/avdt/avdt_scb_act.c
+++ b/stack/avdt/avdt_scb_act.c
@@ -285,7 +285,7 @@
/* do sanity check */
if ((offset > p_data->p_pkt->len) || ((pad_len + offset) > p_data->p_pkt->len))
{
- AVDT_TRACE_WARNING0("Got bad media packet");
+ AVDT_TRACE_WARNING("Got bad media packet");
GKI_freebuf(p_data->p_pkt);
}
/* adjust offset and length and send it up */
@@ -340,7 +340,7 @@
AVDT_REPORT_TYPE pt;
tAVDT_REPORT_DATA report, *p_rpt;
- AVDT_TRACE_DEBUG0( "avdt_scb_hdl_report");
+ AVDT_TRACE_DEBUG( "avdt_scb_hdl_report");
if(p_scb->cs.p_report_cback)
{
p_rpt = &report;
@@ -377,14 +377,14 @@
}
else
{
- AVDT_TRACE_WARNING5( " - SDES SSRC=0x%08x sc=%d %d len=%d %s",
+ AVDT_TRACE_WARNING( " - SDES SSRC=0x%08x sc=%d %d len=%d %s",
ssrc, o_cc, *p, *(p+1), p+2);
result = AVDT_BUSY;
}
break;
default:
- AVDT_TRACE_ERROR1( "Bad Report pkt - packet type: %d", pt);
+ AVDT_TRACE_ERROR( "Bad Report pkt - packet type: %d", pt);
result = AVDT_BAD_PARAMS;
}
@@ -435,7 +435,7 @@
{
if (p_end - p < 4) /* length check. maximum length of AL header = 4 */
{
- AVDT_TRACE_WARNING2("p_end: 0x%x - p:0x%x < 4", p_end, p);
+ AVDT_TRACE_WARNING("p_end: 0x%x - p:0x%x < 4", p_end, p);
break;
}
@@ -485,14 +485,14 @@
else
#endif
{
- AVDT_TRACE_WARNING2("bad tsid: %d, mux_tsid_media:%d", al_tsid, p_scb->curr_cfg.mux_tsid_media);
+ AVDT_TRACE_WARNING("bad tsid: %d, mux_tsid_media:%d", al_tsid, p_scb->curr_cfg.mux_tsid_media);
break;
}
}
/* check are buffer for assembling and related callback set */
else if ((p_scb->p_media_buf == NULL) || (p_scb->cs.p_media_cback == NULL))
{
- AVDT_TRACE_WARNING0("NULL p_media_buf or p_media_cback");
+ AVDT_TRACE_WARNING("NULL p_media_buf or p_media_cback");
break;
}
@@ -500,7 +500,7 @@
/* it is media fragment beginning */
if(!al_frag) /* is it first fragment of original media packet */
{
- AVDT_TRACE_DEBUG2("al:%d media:%d",
+ AVDT_TRACE_DEBUG("al:%d media:%d",
al_len, p_scb->media_buf_len);
p_scb->frag_off = 0;
@@ -508,31 +508,31 @@
/* length check: minimum length of media header is 12 */
if (p_scb->frag_org_len < 12)
{
- AVDT_TRACE_WARNING1("bad al_len: %d(<12)", al_len);
+ AVDT_TRACE_WARNING("bad al_len: %d(<12)", al_len);
break;
}
/* check that data fit into buffer */
if (al_len > p_scb->media_buf_len)
{
- AVDT_TRACE_WARNING2("bad al_len: %d(>%d)", al_len, p_scb->media_buf_len);
+ AVDT_TRACE_WARNING("bad al_len: %d(>%d)", al_len, p_scb->media_buf_len);
break;
}
/* make sure it is the last fragment in l2cap packet */
if (p + al_len < p_end)
{
- AVDT_TRACE_WARNING2("bad al_len: %d(>%d)", al_len, p_scb->media_buf_len);
+ AVDT_TRACE_WARNING("bad al_len: %d(>%d)", al_len, p_scb->media_buf_len);
break;
}
}
else
{
- AVDT_TRACE_DEBUG4("al:%d media:%d frag_org_len:%d frag_off:%d",
+ AVDT_TRACE_DEBUG("al:%d media:%d frag_org_len:%d frag_off:%d",
al_len, p_scb->media_buf_len, p_scb->frag_org_len, p_scb->frag_off);
/* check that remaining length from AL header equals to original len - length of already received fragments */
if(al_len != p_scb->frag_org_len - p_scb->frag_off)
{
- AVDT_TRACE_WARNING4("al_len:%d != (frag_org_len:%d - frag_off:%d) %d",
+ AVDT_TRACE_WARNING("al_len:%d != (frag_org_len:%d - frag_off:%d) %d",
al_len, p_scb->frag_org_len, p_scb->frag_off,
(p_scb->frag_org_len- p_scb->frag_off));
break;
@@ -541,19 +541,19 @@
/* do sanity check */
if (p_scb->frag_off == 0)
{
- AVDT_TRACE_WARNING0("frag_off=0");
+ AVDT_TRACE_WARNING("frag_off=0");
break;
}
}
/* do common sanity check */
if((p_scb->frag_org_len <= p_scb->frag_off) || (p_scb->frag_org_len >= p_scb->media_buf_len))
{
- AVDT_TRACE_WARNING3("common sanity frag_off:%d frag_org_len:%d media_buf_len:%d",
+ AVDT_TRACE_WARNING("common sanity frag_off:%d frag_org_len:%d media_buf_len:%d",
p_scb->frag_off, p_scb->frag_org_len, p_scb->media_buf_len);
break;
}
- AVDT_TRACE_DEBUG4("Received fragment org_len=%d off=%d al_len=%d frag_len=%d",
+ AVDT_TRACE_DEBUG("Received fragment org_len=%d off=%d al_len=%d frag_len=%d",
p_scb->frag_org_len, p_scb->frag_off, al_len, frag_len);
/* copy fragment into buffer */
@@ -581,7 +581,7 @@
{
if(p_scb->p_media_buf + p_scb->frag_off - p_payload < 4)
{
- AVDT_TRACE_WARNING3("length check frag_off:%d p_media_buf:%d p_payload:%d",
+ AVDT_TRACE_WARNING("length check frag_off:%d p_media_buf:%d p_payload:%d",
p_scb->frag_off, p_scb->p_media_buf, p_payload);
break;/* length check */
}
@@ -592,7 +592,7 @@
if(p_payload >= p_scb->p_media_buf + p_scb->frag_off)
{
- AVDT_TRACE_WARNING3("length check2 frag_off:%d p_media_buf:%d p_payload:%d",
+ AVDT_TRACE_WARNING("length check2 frag_off:%d p_media_buf:%d p_payload:%d",
p_scb->frag_off, p_scb->p_media_buf, p_payload);
break;/* length check */
}
@@ -608,7 +608,7 @@
/* payload length */
payload_len = (UINT32)(p_scb->p_media_buf + p_scb->frag_off - pad_len - p_payload);
- AVDT_TRACE_DEBUG2("Received last fragment header=%d len=%d",
+ AVDT_TRACE_DEBUG("Received last fragment header=%d len=%d",
p_payload - p_scb->p_media_buf,payload_len);
/* send total media packet up */
@@ -622,7 +622,7 @@
if(p < p_end)
{
- AVDT_TRACE_WARNING0("*** Got bad media packet");
+ AVDT_TRACE_WARNING("*** Got bad media packet");
}
GKI_freebuf(p_data->p_pkt);
}
@@ -678,7 +678,7 @@
UNUSED(p_scb);
GKI_freebuf(p_data->p_pkt);
- AVDT_TRACE_WARNING0("Dropped incoming media packet");
+ AVDT_TRACE_ERROR(" avdt_scb_drop_pkt Dropped incoming media packet");
}
/*******************************************************************************
@@ -826,7 +826,7 @@
p_scb->peer_seid = p_data->msg.config_cmd.int_seid;
memcpy(&p_scb->req_cfg, p_cfg, sizeof(tAVDT_CFG));
/* call app callback */
- (*p_scb->cs.p_ctrl_cback)(avdt_scb_to_hdl(p_scb),
+ (*p_scb->cs.p_ctrl_cback)(avdt_scb_to_hdl(p_scb), /* handle of scb- which is same as sep handle of bta_av_cb.p_scb*/
p_scb->p_ccb ? p_scb->p_ccb->peer_addr : NULL,
AVDT_CONFIG_IND_EVT,
(tAVDT_CTRL *) &p_data->msg.config_cmd);
@@ -1153,7 +1153,7 @@
event = (p_scb->role == AVDT_OPEN_INT) ? AVDT_OPEN_CFM_EVT : AVDT_OPEN_IND_EVT;
p_data->open.hdr.err_code = 0;
- AVDT_TRACE_DEBUG3("psc_mask: cfg: 0x%x, req:0x%x, cur: 0x%x",
+ AVDT_TRACE_DEBUG("psc_mask: cfg: 0x%x, req:0x%x, cur: 0x%x",
p_scb->cs.cfg.psc_mask, p_scb->req_cfg.psc_mask, p_scb->curr_cfg.psc_mask);
#if AVDT_REPORTING == TRUE
if(p_scb->curr_cfg.psc_mask & AVDT_PSC_REPORT)
@@ -1223,7 +1223,7 @@
GKI_freebuf(p_scb->p_pkt);
/* this shouldn't be happening */
- AVDT_TRACE_WARNING0("Dropped media packet; congested");
+ AVDT_TRACE_WARNING("Dropped media packet; congested");
}
/* build a media packet */
@@ -1272,7 +1272,7 @@
GKI_freebuf(p_frag);
/* this shouldn't be happening */
- AVDT_TRACE_WARNING0("*** Dropped media packet; congested");
+ AVDT_TRACE_WARNING("*** Dropped media packet; congested");
}
/* build a media fragments */
@@ -1420,7 +1420,7 @@
#if AVDT_MULTIPLEXING == TRUE
BT_HDR *p_frag;
- AVDT_TRACE_WARNING2("avdt_scb_snd_stream_close c:%d, off:%d",
+ AVDT_TRACE_WARNING("avdt_scb_snd_stream_close c:%d, off:%d",
p_scb->frag_q.count, p_scb->frag_off);
/* clean fragments queue */
while((p_frag = (BT_HDR*)GKI_dequeue (&p_scb->frag_q)) != NULL)
@@ -1870,7 +1870,7 @@
GKI_freebuf(p_frag);
#endif
- AVDT_TRACE_WARNING0("Dropped media packet");
+ AVDT_TRACE_WARNING("Dropped media packet");
/* we need to call callback to keep data flow going */
(*p_scb->cs.p_ctrl_cback)(avdt_scb_to_hdl(p_scb), NULL, AVDT_WRITE_CFM_EVT,
@@ -1915,7 +1915,7 @@
GKI_freebuf(p_scb->p_pkt);
p_scb->p_pkt = NULL;
- AVDT_TRACE_DEBUG0("Dropped stored media packet");
+ AVDT_TRACE_DEBUG("Dropped stored media packet");
/* we need to call callback to keep data flow going */
(*p_scb->cs.p_ctrl_cback)(avdt_scb_to_hdl(p_scb), NULL, AVDT_WRITE_CFM_EVT,
@@ -1924,7 +1924,7 @@
#if AVDT_MULTIPLEXING == TRUE
else if(!GKI_queue_is_empty (&p_scb->frag_q))
{
- AVDT_TRACE_DEBUG0("Dropped fragments queue");
+ AVDT_TRACE_DEBUG("Dropped fragments queue");
/* clean fragments queue */
while((p_frag = (BT_HDR*)GKI_dequeue (&p_scb->frag_q)) != NULL)
GKI_freebuf(p_frag);
@@ -1978,24 +1978,24 @@
else
{
#if 0
- AVDT_TRACE_DEBUG1("num_q=%d",
+ AVDT_TRACE_DEBUG("num_q=%d",
L2CA_FlushChannel(avdt_cb.ad.rt_tbl[avdt_ccb_to_idx(p_scb->p_ccb)][avdt_ad_type_to_tcid(AVDT_CHAN_MEDIA, p_scb)].lcid),
L2CAP_FLUSH_CHANS_GET);
#endif
while((p_pkt = (BT_HDR*)GKI_dequeue (&p_scb->frag_q)) != NULL)
{
sent = TRUE;
- AVDT_TRACE_DEBUG1("Send fragment len=%d",p_pkt->len);
+ AVDT_TRACE_DEBUG("Send fragment len=%d",p_pkt->len);
/* fragments queue contains fragment to send */
res = avdt_ad_write_req(AVDT_CHAN_MEDIA, p_scb->p_ccb, p_scb, p_pkt);
if(AVDT_AD_CONGESTED == res)
{
p_scb->cong = TRUE;
- AVDT_TRACE_DEBUG0("avdt/l2c congested!!");
+ AVDT_TRACE_DEBUG("avdt/l2c congested!!");
break;/* exit loop if channel became congested */
}
}
- AVDT_TRACE_DEBUG2("res=%d left=%d",res, p_scb->frag_off);
+ AVDT_TRACE_DEBUG("res=%d left=%d",res, p_scb->frag_off);
if(p_scb->frag_off)
{
@@ -2052,7 +2052,14 @@
{
UNUSED(p_data);
- p_scb->in_use = FALSE;
+ if ((p_scb->cs.tsep == AVDT_TSEP_SNK) && (!p_scb->sink_activated))
+ {
+ p_scb->in_use = TRUE;
+ }
+ else
+ {
+ p_scb->in_use = FALSE;
+ }
p_scb->p_ccb = NULL;
p_scb->peer_seid = 0;
}
@@ -2097,7 +2104,7 @@
else
{
num_frag = L2CA_FlushChannel(lcid, L2CAP_FLUSH_CHANS_GET);
- AVDT_TRACE_DEBUG2("num_q=%d lcid=%d", num_frag, lcid);
+ AVDT_TRACE_DEBUG("num_q=%d lcid=%d", num_frag, lcid);
if(num_frag >= AVDT_MAX_FRAG_COUNT)
{
num_frag = 0;
@@ -2111,7 +2118,7 @@
/* look up transport channel table entry to get peer mtu */
p_tbl = avdt_ad_tc_tbl_by_type(AVDT_CHAN_MEDIA, p_scb->p_ccb, p_scb);
buf_size = p_tbl->peer_mtu + BT_HDR_SIZE;
- AVDT_TRACE_DEBUG3("peer_mtu: %d, buf_size: %d num_frag=%d",
+ AVDT_TRACE_DEBUG("peer_mtu: %d, buf_size: %d num_frag=%d",
p_tbl->peer_mtu, buf_size, num_frag);
if(buf_size > AVDT_DATA_POOL_SIZE)
@@ -2124,7 +2131,7 @@
/* allocate buffer for fragment */
if(NULL == (p_frag = (BT_HDR*)GKI_getbuf(buf_size)))
{
- AVDT_TRACE_WARNING1("avdt_scb_queue_frags len=%d(out of GKI buffers)",*p_data_len);
+ AVDT_TRACE_WARNING("avdt_scb_queue_frags len=%d(out of GKI buffers)",*p_data_len);
break;
}
/* fill fragment by chunk of media payload */
@@ -2139,7 +2146,7 @@
memcpy((UINT8*)(p_frag+1) + p_frag->offset, *pp_data, p_frag->len);
*pp_data += p_frag->len;
*p_data_len -= p_frag->len;
- AVDT_TRACE_DEBUG1("Prepared fragment len=%d", p_frag->len);
+ AVDT_TRACE_DEBUG("Prepared fragment len=%d", p_frag->len);
if(al_hdr)
{
diff --git a/stack/avrc/avrc_api.c b/stack/avrc/avrc_api.c
old mode 100755
new mode 100644
index c572f94..04f59a0
--- a/stack/avrc/avrc_api.c
+++ b/stack/avrc/avrc_api.c
@@ -128,7 +128,7 @@
UINT8 *p_data, *p_orig_data;
UINT8 rsp_type;
- AVRC_TRACE_DEBUG0 ("avrc_prep_end_frag" );
+ AVRC_TRACE_DEBUG ("avrc_prep_end_frag" );
p_fcb = &avrc_cb.fcb[handle];
/* The response type of the end fragment should be the same as the the PDU of "End Fragment
@@ -172,7 +172,7 @@
p_fcb = &avrc_cb.fcb[handle];
p_pkt = p_fcb->p_fmsg;
- AVRC_TRACE_DEBUG1 ("avrc_send_continue_frag len(%d) / AVRC_MAX_CTRL_DATA_LEN", p_pkt->len );
+ AVRC_TRACE_DEBUG ("avrc_send_continue_frag len(%d) / AVRC_MAX_CTRL_DATA_LEN", p_pkt->len );
if (p_pkt->len > AVRC_MAX_CTRL_DATA_LEN)
{
p_pkt_old = p_fcb->p_fmsg;
@@ -202,7 +202,7 @@
p_pkt = p_fcb->p_fmsg;
p_fcb->p_fmsg = NULL;
p_fcb->frag_enabled = FALSE;
- AVRC_TRACE_ERROR0 ("AVRC_MsgReq no buffers for fragmentation - send internal error" );
+ AVRC_TRACE_ERROR ("AVRC_MsgReq no buffers for fragmentation - send internal error" );
p_data = (UINT8 *)(p_pkt+1) + p_pkt->offset;
*p_data++ = AVRC_PDU_REQUEST_CONTINUATION_RSP;
*p_data++ = 0;
@@ -250,7 +250,7 @@
if (pkt_type != AVRC_PKT_SINGLE)
{
/* reject - commands can only be in single packets at AVRCP level */
- AVRC_TRACE_ERROR1 ("commands must be in single packet pdu:0x%x", *p_data );
+ AVRC_TRACE_ERROR ("commands must be in single packet pdu:0x%x", *p_data );
/* use the current GKI buffer to send the reject */
status = AVRC_STS_BAD_CMD;
}
@@ -291,7 +291,7 @@
else
{
/* the pdu id does not match - reject the command using the current GKI buffer */
- AVRC_TRACE_ERROR2("avrc_proc_vendor_command continue pdu: 0x%x does not match \
+ AVRC_TRACE_ERROR("avrc_proc_vendor_command continue pdu: 0x%x does not match \
current re-assembly pdu: 0x%x",
*(p_data + 4), p_fcb->frag_pdu);
status = AVRC_STS_BAD_PARAM;
@@ -366,7 +366,7 @@
p_data += AVRC_VENDOR_HDR_SIZE;
pkt_type = *(p_data + 1) & AVRC_PKT_TYPE_MASK;
- AVRC_TRACE_DEBUG1 ("pkt_type %d", pkt_type );
+ AVRC_TRACE_DEBUG ("pkt_type %d", pkt_type );
p_rcb = &avrc_cb.rcb[handle];
if (p_msg->company_id == AVRC_CO_METADATA)
{
@@ -409,7 +409,7 @@
{
/* Unable to allocate buffer for fragmented avrc message. Reuse START
buffer for reassembly (re-assembled message may fit into ACL buf) */
- AVRC_TRACE_DEBUG0 ("Unable to allocate buffer for fragmented avrc message, \
+ AVRC_TRACE_DEBUG ("Unable to allocate buffer for fragmented avrc message, \
reusing START buffer for reassembly");
p_rcb->rasm_offset = p_pkt->offset;
p_rcb->p_rmsg = p_pkt;
@@ -423,7 +423,7 @@
{
/* Received a CONTINUE/END, but no corresponding START
(or previous fragmented response was dropped) */
- AVRC_TRACE_DEBUG0 ("Received a CONTINUE/END without no corresponding START \
+ AVRC_TRACE_DEBUG ("Received a CONTINUE/END without no corresponding START \
(or previous fragmented response was dropped)");
drop = 5;
GKI_freebuf(p_pkt);
@@ -439,7 +439,7 @@
/* verify length */
if ((p_rcb->p_rmsg->offset + p_pkt->len) > buf_len)
{
- AVRC_TRACE_WARNING0("Fragmented message too big! - report the partial message");
+ AVRC_TRACE_WARNING("Fragmented message too big! - report the partial message");
p_pkt->len = buf_len - p_rcb->p_rmsg->offset;
pkt_type = AVRC_PKT_END;
}
@@ -463,7 +463,7 @@
p_data = p_msg->p_vendor_data + 1; /* skip pdu */
*p_data++ = AVRC_PKT_SINGLE;
UINT16_TO_BE_STREAM(p_data, (p_msg->vendor_len - AVRC_MIN_META_HDR_SIZE));
- AVRC_TRACE_DEBUG3("end frag:%d, total len:%d, offset:%d", p_pkt->len,
+ AVRC_TRACE_DEBUG("end frag:%d, total len:%d, offset:%d", p_pkt->len,
p_pkt_new->len, p_pkt_new->offset);
}
else
@@ -528,7 +528,7 @@
tAVRC_MSG msg;
UINT8 *p_data;
UINT8 *p_begin;
- BOOLEAN drop = FALSE;
+ UINT8 drop = 0;
BOOLEAN free = TRUE;
BT_HDR *p_rsp = NULL;
UINT8 *p_rsp_data;
@@ -563,7 +563,7 @@
memset(&msg, 0, sizeof(tAVRC_MSG) );
{
msg.hdr.ctype = p_data[0] & AVRC_CTYPE_MASK;
- AVRC_TRACE_DEBUG4("avrc_msg_cback handle:%d, ctype:%d, offset:%d, len: %d",
+ AVRC_TRACE_DEBUG("avrc_msg_cback handle:%d, ctype:%d, offset:%d, len: %d",
handle, msg.hdr.ctype, p_pkt->offset, p_pkt->len);
msg.hdr.subunit_type = (p_data[1] & AVRC_SUBTYPE_MASK) >> AVRC_SUBTYPE_SHIFT;
msg.hdr.subunit_id = p_data[1] & AVRC_SUBID_MASK;
@@ -770,7 +770,7 @@
#if (BT_USE_TRACES == TRUE)
else
{
- AVRC_TRACE_WARNING5("avrc_msg_cback %s msg handle:%d, control:%d, cr:%d, opcode:x%x",
+ AVRC_TRACE_WARNING("avrc_msg_cback %s msg handle:%d, control:%d, cr:%d, opcode:x%x",
p_drop_msg,
handle, avrc_cb.ccb[handle].control, cr, opcode);
}
@@ -905,7 +905,7 @@
memset(&avrc_cb.rcb[*p_handle], 0, sizeof(tAVRC_RASM_CB));
#endif
}
- AVRC_TRACE_DEBUG4("AVRC_Open role: %d, control:%d status:%d, handle:%d", cc.role, cc.control,
+ AVRC_TRACE_DEBUG("AVRC_Open role: %d, control:%d status:%d, handle:%d", cc.role, cc.control,
status, *p_handle);
return status;
@@ -931,7 +931,7 @@
******************************************************************************/
UINT16 AVRC_Close(UINT8 handle)
{
- AVRC_TRACE_DEBUG1("AVRC_Close handle:%d", handle);
+ AVRC_TRACE_DEBUG("AVRC_Close handle:%d", handle);
return AVCT_RemoveConn(handle);
}
@@ -1013,7 +1013,7 @@
{
if (p_pkt->len > AVRC_MAX_CTRL_DATA_LEN)
{
- AVRC_TRACE_DEBUG1 ("p_pkt->len(%d) > AVRC_MAX_CTRL_DATA_LEN", p_pkt->len );
+ AVRC_TRACE_DEBUG ("p_pkt->len(%d) > AVRC_MAX_CTRL_DATA_LEN", p_pkt->len );
p_pkt_new = (BT_HDR *)GKI_getbuf((UINT16)(AVRC_PACKET_LEN + AVCT_MSG_OFFSET
+ BT_HDR_SIZE));
if (p_pkt_new)
@@ -1040,11 +1040,11 @@
/* prepare the left over for as an end fragment */
avrc_prep_end_frag (handle);
- AVRC_TRACE_DEBUG3 ("p_pkt len:%d/%d, next len:%d", p_pkt->len, len, p_fcb->p_fmsg->len );
+ AVRC_TRACE_DEBUG ("p_pkt len:%d/%d, next len:%d", p_pkt->len, len, p_fcb->p_fmsg->len );
}
else
{
- AVRC_TRACE_ERROR0 ("AVRC_MsgReq no buffers for fragmentation" );
+ AVRC_TRACE_ERROR ("AVRC_MsgReq no buffers for fragmentation" );
GKI_freebuf(p_pkt);
return AVRC_NO_RESOURCES;
}
diff --git a/stack/avrc/avrc_bld_ct.c b/stack/avrc/avrc_bld_ct.c
index 039eab8..7e23967 100644
--- a/stack/avrc/avrc_bld_ct.c
+++ b/stack/avrc/avrc_bld_ct.c
@@ -42,7 +42,7 @@
{
UINT8 *p_data, *p_start;
- AVRC_TRACE_API0("avrc_bld_next_cmd");
+ AVRC_TRACE_API("avrc_bld_next_cmd");
/* get the existing length, if any, and also the num attributes */
p_start = (UINT8 *)(p_pkt + 1) + p_pkt->offset;
@@ -75,7 +75,7 @@
{
UINT8 *p_data, *p_start;
- AVRC_TRACE_API0("avrc_bld_set_abs_volume_cmd");
+ AVRC_TRACE_API("avrc_bld_set_abs_volume_cmd");
/* get the existing length, if any, and also the num attributes */
p_start = (UINT8 *)(p_pkt + 1) + p_pkt->offset;
p_data = p_start + 2; /* pdu + rsvd */
@@ -100,7 +100,7 @@
{
UINT8 *p_data, *p_start;
- AVRC_TRACE_API0("avrc_bld_vol_change");
+ AVRC_TRACE_API("avrc_bld_vol_change");
/* get the existing length, if any, and also the num attributes */
// Set the notify value
p_start = (UINT8 *)(p_pkt + 1) + p_pkt->offset;
@@ -131,7 +131,7 @@
UINT8 opcode;
opcode = avrc_opcode_from_pdu(p_cmd->pdu);
- AVRC_TRACE_API2("avrc_bld_init_cmd_buffer: pdu=%x, opcode=%x", p_cmd->pdu, opcode);
+ AVRC_TRACE_API("avrc_bld_init_cmd_buffer: pdu=%x, opcode=%x", p_cmd->pdu, opcode);
switch (opcode)
{
@@ -194,10 +194,10 @@
BT_HDR *p_pkt;
BOOLEAN alloc = FALSE;
- AVRC_TRACE_API2("AVRC_BldCommand: pdu=%x status=%x", p_cmd->cmd.pdu, p_cmd->cmd.status);
+ AVRC_TRACE_API("AVRC_BldCommand: pdu=%x status=%x", p_cmd->cmd.pdu, p_cmd->cmd.status);
if (!p_cmd || !pp_pkt)
{
- AVRC_TRACE_API2("AVRC_BldCommand. Invalid parameters passed. p_cmd=%p, pp_pkt=%p",
+ AVRC_TRACE_API("AVRC_BldCommand. Invalid parameters passed. p_cmd=%p, pp_pkt=%p",
p_cmd, pp_pkt);
return AVRC_STS_BAD_PARAM;
}
@@ -206,7 +206,7 @@
{
if ((*pp_pkt = avrc_bld_init_cmd_buffer(p_cmd)) == NULL)
{
- AVRC_TRACE_API0("AVRC_BldCommand: Failed to initialize command buffer");
+ AVRC_TRACE_API("AVRC_BldCommand: Failed to initialize command buffer");
return AVRC_STS_INTERNAL_ERR;
}
alloc = TRUE;
@@ -243,7 +243,7 @@
GKI_freebuf(p_pkt);
*pp_pkt = NULL;
}
- AVRC_TRACE_API1("AVRC_BldCommand: returning %d", status);
+ AVRC_TRACE_API("AVRC_BldCommand: returning %d", status);
return status;
}
#endif /* (AVRC_METADATA_INCLUDED == TRUE) */
diff --git a/stack/avrc/avrc_bld_tg.c b/stack/avrc/avrc_bld_tg.c
old mode 100755
new mode 100644
index 6fe645a..a9b1a2a
--- a/stack/avrc/avrc_bld_tg.c
+++ b/stack/avrc/avrc_bld_tg.c
@@ -49,12 +49,12 @@
if (!(AVRC_IS_VALID_CAP_ID(p_rsp->capability_id)))
{
- AVRC_TRACE_ERROR1("avrc_bld_get_capability_rsp bad parameter. p_rsp: %x", p_rsp);
+ AVRC_TRACE_ERROR("avrc_bld_get_capability_rsp bad parameter. p_rsp: %x", p_rsp);
status = AVRC_STS_BAD_PARAM;
return status;
}
- AVRC_TRACE_API0("avrc_bld_get_capability_rsp");
+ AVRC_TRACE_API("avrc_bld_get_capability_rsp");
/* get the existing length, if any, and also the num attributes */
p_start = (UINT8 *)(p_pkt + 1) + p_pkt->offset;
p_data = p_len = p_start + 2; /* pdu + rsvd */
@@ -122,7 +122,7 @@
UINT16 len = 0;
UINT8 xx;
- AVRC_TRACE_API0("avrc_bld_list_app_settings_attr_rsp");
+ AVRC_TRACE_API("avrc_bld_list_app_settings_attr_rsp");
/* get the existing length, if any, and also the num attributes */
p_start = (UINT8 *)(p_pkt + 1) + p_pkt->offset;
p_data = p_len = p_start + 2; /* pdu + rsvd */
@@ -174,7 +174,7 @@
UINT8 xx;
UINT16 len;
- AVRC_TRACE_API0("avrc_bld_list_app_settings_values_rsp");
+ AVRC_TRACE_API("avrc_bld_list_app_settings_values_rsp");
p_start = (UINT8 *)(p_pkt + 1) + p_pkt->offset;
p_data = p_len = p_start + 2; /* pdu + rsvd */
@@ -226,11 +226,11 @@
if (!p_rsp->p_vals)
{
- AVRC_TRACE_ERROR0("avrc_bld_get_cur_app_setting_value_rsp NULL parameter");
+ AVRC_TRACE_ERROR("avrc_bld_get_cur_app_setting_value_rsp NULL parameter");
return AVRC_STS_BAD_PARAM;
}
- AVRC_TRACE_API0("avrc_bld_get_cur_app_setting_value_rsp");
+ AVRC_TRACE_API("avrc_bld_get_cur_app_setting_value_rsp");
/* get the existing length, if any, and also the num attributes */
p_start = (UINT8 *)(p_pkt + 1) + p_pkt->offset;
p_data = p_len = p_start + 2; /* pdu + rsvd */
@@ -281,7 +281,7 @@
UNUSED(p_pkt);
/* nothing to be added. */
- AVRC_TRACE_API0("avrc_bld_set_app_setting_value_rsp");
+ AVRC_TRACE_API("avrc_bld_set_app_setting_value_rsp");
return AVRC_STS_NO_ERROR;
}
@@ -306,7 +306,7 @@
if (!p_rsp->p_attrs)
{
- AVRC_TRACE_ERROR0("avrc_bld_app_setting_text_rsp NULL parameter");
+ AVRC_TRACE_ERROR("avrc_bld_app_setting_text_rsp NULL parameter");
return AVRC_STS_BAD_PARAM;
}
/* get the existing length, if any, and also the num attributes */
@@ -331,7 +331,7 @@
{
if (len_left < (p_rsp->p_attrs[xx].str_len + 4))
{
- AVRC_TRACE_ERROR3("avrc_bld_app_setting_text_rsp out of room (str_len:%d, left:%d)",
+ AVRC_TRACE_ERROR("avrc_bld_app_setting_text_rsp out of room (str_len:%d, left:%d)",
xx, p_rsp->p_attrs[xx].str_len, len_left);
p_rsp->num_attr = num_added;
sts = AVRC_STS_INTERNAL_ERR;
@@ -339,7 +339,7 @@
}
if ( !p_rsp->p_attrs[xx].str_len || !p_rsp->p_attrs[xx].p_str )
{
- AVRC_TRACE_ERROR1("avrc_bld_app_setting_text_rsp NULL attr text[%d]", xx);
+ AVRC_TRACE_ERROR("avrc_bld_app_setting_text_rsp NULL attr text[%d]", xx);
continue;
}
UINT8_TO_BE_STREAM(p_data, p_rsp->p_attrs[xx].attr_id);
@@ -370,7 +370,7 @@
static tAVRC_STS avrc_bld_get_app_setting_attr_text_rsp (tAVRC_GET_APP_ATTR_TXT_RSP *p_rsp,
BT_HDR *p_pkt)
{
- AVRC_TRACE_API0("avrc_bld_get_app_setting_attr_text_rsp");
+ AVRC_TRACE_API("avrc_bld_get_app_setting_attr_text_rsp");
return avrc_bld_app_setting_text_rsp(p_rsp, p_pkt);
}
@@ -388,7 +388,7 @@
static tAVRC_STS avrc_bld_get_app_setting_value_text_rsp (tAVRC_GET_APP_ATTR_TXT_RSP *p_rsp,
BT_HDR *p_pkt)
{
- AVRC_TRACE_API0("avrc_bld_get_app_setting_value_text_rsp");
+ AVRC_TRACE_API("avrc_bld_get_app_setting_value_text_rsp");
return avrc_bld_app_setting_text_rsp(p_rsp, p_pkt);
}
@@ -409,7 +409,7 @@
UNUSED(p_pkt);
/* nothing to be added. */
- AVRC_TRACE_API0("avrc_bld_inform_charset_rsp");
+ AVRC_TRACE_API("avrc_bld_inform_charset_rsp");
return AVRC_STS_NO_ERROR;
}
@@ -430,7 +430,7 @@
UNUSED(p_pkt);
/* nothing to be added. */
- AVRC_TRACE_API0("avrc_bld_inform_battery_status_rsp");
+ AVRC_TRACE_API("avrc_bld_inform_battery_status_rsp");
return AVRC_STS_NO_ERROR;
}
@@ -451,10 +451,10 @@
UINT16 len;
UINT8 xx;
- AVRC_TRACE_API0("avrc_bld_get_elem_attrs_rsp");
+ AVRC_TRACE_API("avrc_bld_get_elem_attrs_rsp");
if (!p_rsp->p_attrs)
{
- AVRC_TRACE_ERROR0("avrc_bld_get_elem_attrs_rsp NULL parameter");
+ AVRC_TRACE_ERROR("avrc_bld_get_elem_attrs_rsp NULL parameter");
return AVRC_STS_BAD_PARAM;
}
@@ -479,7 +479,7 @@
{
if (!AVRC_IS_VALID_MEDIA_ATTRIBUTE(p_rsp->p_attrs[xx].attr_id))
{
- AVRC_TRACE_ERROR2("avrc_bld_get_elem_attrs_rsp invalid attr id[%d]: %d", xx, p_rsp->p_attrs[xx].attr_id);
+ AVRC_TRACE_ERROR("avrc_bld_get_elem_attrs_rsp invalid attr id[%d]: %d", xx, p_rsp->p_attrs[xx].attr_id);
continue;
}
if ( !p_rsp->p_attrs[xx].name.p_str )
@@ -513,7 +513,7 @@
{
UINT8 *p_data, *p_start;
- AVRC_TRACE_API0("avrc_bld_get_play_status_rsp");
+ AVRC_TRACE_API("avrc_bld_get_play_status_rsp");
p_start = (UINT8 *)(p_pkt + 1) + p_pkt->offset;
p_data = p_start + 2;
@@ -545,7 +545,7 @@
UINT8 xx;
tAVRC_STS status = AVRC_STS_NO_ERROR;
- AVRC_TRACE_API0("avrc_bld_notify_rsp");
+ AVRC_TRACE_API("avrc_bld_notify_rsp");
p_start = (UINT8 *)(p_pkt + 1) + p_pkt->offset;
p_data = p_len = p_start + 2; /* pdu + rsvd */
@@ -564,7 +564,7 @@
}
else
{
- AVRC_TRACE_ERROR0("bad play state");
+ AVRC_TRACE_ERROR("bad play state");
status = AVRC_STS_BAD_PARAM;
}
break;
@@ -592,7 +592,7 @@
}
else
{
- AVRC_TRACE_ERROR0("bad battery status");
+ AVRC_TRACE_ERROR("bad battery status");
status = AVRC_STS_BAD_PARAM;
}
break;
@@ -605,7 +605,7 @@
}
else
{
- AVRC_TRACE_ERROR0("bad system status");
+ AVRC_TRACE_ERROR("bad system status");
status = AVRC_STS_BAD_PARAM;
}
break;
@@ -628,7 +628,7 @@
}
else
{
- AVRC_TRACE_ERROR0("bad player app seeting attribute or value");
+ AVRC_TRACE_ERROR("bad player app seeting attribute or value");
status = AVRC_STS_BAD_PARAM;
break;
}
@@ -641,7 +641,7 @@
default:
status = AVRC_STS_BAD_PARAM;
- AVRC_TRACE_ERROR0("unknown event_id");
+ AVRC_TRACE_ERROR("unknown event_id");
}
UINT16_TO_BE_STREAM(p_len, len);
@@ -667,7 +667,7 @@
UNUSED(p_pkt);
/* nothing to be added. */
- AVRC_TRACE_API0("avrc_bld_next_rsp");
+ AVRC_TRACE_API("avrc_bld_next_rsp");
return AVRC_STS_NO_ERROR;
}
@@ -688,11 +688,11 @@
if (!AVRC_IS_VALID_GROUP(navi_id))
{
- AVRC_TRACE_ERROR1("avrc_bld_group_navigation_rsp bad navigation op id: %d", navi_id);
+ AVRC_TRACE_ERROR("avrc_bld_group_navigation_rsp bad navigation op id: %d", navi_id);
return AVRC_STS_BAD_PARAM;
}
- AVRC_TRACE_API0("avrc_bld_group_navigation_rsp");
+ AVRC_TRACE_API("avrc_bld_group_navigation_rsp");
p_data = (UINT8 *)(p_pkt+1) + p_pkt->offset;
UINT16_TO_BE_STREAM(p_data, navi_id);
p_pkt->len = 2;
@@ -713,11 +713,11 @@
{
UINT8 *p_data, *p_start;
- AVRC_TRACE_API2("avrc_bld_rejected_rsp: status=%d, pdu:x%x", p_rsp->status, p_rsp->pdu);
+ AVRC_TRACE_API("avrc_bld_rejected_rsp: status=%d, pdu:x%x", p_rsp->status, p_rsp->pdu);
p_start = (UINT8 *)(p_pkt + 1) + p_pkt->offset;
p_data = p_start + 2;
- AVRC_TRACE_DEBUG1("pdu:x%x", *p_start);
+ AVRC_TRACE_DEBUG("pdu:x%x", *p_start);
UINT16_TO_BE_STREAM(p_data, 1);
UINT8_TO_BE_STREAM(p_data, p_rsp->status);
@@ -742,13 +742,13 @@
BT_HDR *p_pkt=NULL;
UINT8 opcode = avrc_opcode_from_pdu(p_rsp->pdu);
- AVRC_TRACE_API3("avrc_bld_init_rsp_buffer: pdu=%x, opcode=%x/%x", p_rsp->pdu, opcode,
+ AVRC_TRACE_API("avrc_bld_init_rsp_buffer: pdu=%x, opcode=%x/%x", p_rsp->pdu, opcode,
p_rsp->rsp.opcode);
if (opcode != p_rsp->rsp.opcode && p_rsp->rsp.status != AVRC_STS_NO_ERROR &&
avrc_is_valid_opcode(p_rsp->rsp.opcode))
{
opcode = p_rsp->rsp.opcode;
- AVRC_TRACE_API1("opcode=%x", opcode);
+ AVRC_TRACE_API("opcode=%x", opcode);
}
switch (opcode)
@@ -817,7 +817,7 @@
if (!p_rsp || !pp_pkt)
{
- AVRC_TRACE_API2("AVRC_BldResponse. Invalid parameters passed. p_rsp=%p, pp_pkt=%p",
+ AVRC_TRACE_API("AVRC_BldResponse. Invalid parameters passed. p_rsp=%p, pp_pkt=%p",
p_rsp, pp_pkt);
return AVRC_STS_BAD_PARAM;
}
@@ -826,7 +826,7 @@
{
if ((*pp_pkt = avrc_bld_init_rsp_buffer(p_rsp)) == NULL)
{
- AVRC_TRACE_API0("AVRC_BldResponse: Failed to initialize response buffer");
+ AVRC_TRACE_API("AVRC_BldResponse: Failed to initialize response buffer");
return AVRC_STS_INTERNAL_ERR;
}
alloc = TRUE;
@@ -834,7 +834,7 @@
status = AVRC_STS_NO_ERROR;
p_pkt = *pp_pkt;
- AVRC_TRACE_API2("AVRC_BldResponse: pdu=%x status=%x", p_rsp->rsp.pdu, p_rsp->rsp.status);
+ AVRC_TRACE_API("AVRC_BldResponse: pdu=%x status=%x", p_rsp->rsp.pdu, p_rsp->rsp.status);
if (p_rsp->rsp.status != AVRC_STS_NO_ERROR)
{
return( avrc_bld_rejected_rsp(&p_rsp->rsp, p_pkt) );
@@ -909,7 +909,7 @@
GKI_freebuf(p_pkt);
*pp_pkt = NULL;
}
- AVRC_TRACE_API1("AVRC_BldResponse: returning %d", status);
+ AVRC_TRACE_API("AVRC_BldResponse: returning %d", status);
return status;
}
diff --git a/stack/avrc/avrc_int.h b/stack/avrc/avrc_int.h
old mode 100755
new mode 100644
diff --git a/stack/avrc/avrc_opt.c b/stack/avrc/avrc_opt.c
old mode 100755
new mode 100644
diff --git a/stack/avrc/avrc_pars_ct.c b/stack/avrc/avrc_pars_ct.c
old mode 100755
new mode 100644
index f3b4af5..143ce81
--- a/stack/avrc/avrc_pars_ct.c
+++ b/stack/avrc/avrc_pars_ct.c
@@ -58,7 +58,7 @@
BE_STREAM_TO_UINT8 (p_result->pdu, p);
p++; /* skip the reserved/packe_type byte */
BE_STREAM_TO_UINT16 (len, p);
- AVRC_TRACE_DEBUG4("avrc_pars_vendor_rsp() ctype:0x%x pdu:0x%x, len:%d/0x%x", p_msg->hdr.ctype, p_result->pdu, len, len);
+ AVRC_TRACE_DEBUG("avrc_pars_vendor_rsp() ctype:0x%x pdu:0x%x, len:%d/0x%x", p_msg->hdr.ctype, p_result->pdu, len, len);
if (p_msg->hdr.ctype == AVRC_RSP_REJ)
{
p_result->rsp.status = *p;
@@ -92,7 +92,7 @@
p_result->reg_notif.event_id=eventid;
BE_STREAM_TO_UINT8 (p_result->reg_notif.param.volume, p);
}
- AVRC_TRACE_DEBUG2("avrc_pars_vendor_rsp PDU reg notif response:event %x, volume %x",eventid,
+ AVRC_TRACE_DEBUG("avrc_pars_vendor_rsp PDU reg notif response:event %x, volume %x",eventid,
p_result->reg_notif.param.volume);
#endif /* (AVRC_ADV_CTRL_INCLUDED == TRUE) */
break;
@@ -138,7 +138,7 @@
break;
default:
- AVRC_TRACE_ERROR1("AVRC_ParsResponse() unknown opcode:0x%x", p_msg->hdr.opcode);
+ AVRC_TRACE_ERROR("AVRC_ParsResponse() unknown opcode:0x%x", p_msg->hdr.opcode);
break;
}
p_result->rsp.opcode = p_msg->hdr.opcode;
diff --git a/stack/avrc/avrc_pars_tg.c b/stack/avrc/avrc_pars_tg.c
old mode 100755
new mode 100644
index d3d5262..4a603d3
--- a/stack/avrc/avrc_pars_tg.c
+++ b/stack/avrc/avrc_pars_tg.c
@@ -52,10 +52,10 @@
UINT16 size_needed;
p_result->pdu = *p++;
- AVRC_TRACE_DEBUG1("avrc_pars_vendor_cmd() pdu:0x%x", p_result->pdu);
+ AVRC_TRACE_DEBUG("avrc_pars_vendor_cmd() pdu:0x%x", p_result->pdu);
if (!AVRC_IsValidAvcType (p_result->pdu, p_msg->hdr.ctype))
{
- AVRC_TRACE_DEBUG0("avrc_pars_vendor_cmd() detects wrong AV/C type!");
+ AVRC_TRACE_DEBUG("avrc_pars_vendor_cmd() detects wrong AV/C type!");
status = AVRC_STS_BAD_CMD;
}
@@ -132,14 +132,14 @@
}
if (xx != p_result->set_app_val.num_val)
{
- AVRC_TRACE_ERROR2("AVRC_PDU_SET_PLAYER_APP_VALUE not enough room:%d orig num_val:%d",
+ AVRC_TRACE_ERROR("AVRC_PDU_SET_PLAYER_APP_VALUE not enough room:%d orig num_val:%d",
xx, p_result->set_app_val.num_val);
p_result->set_app_val.num_val = xx;
}
}
else
{
- AVRC_TRACE_ERROR0("AVRC_PDU_SET_PLAYER_APP_VALUE NULL decode buffer or bad len");
+ AVRC_TRACE_ERROR("AVRC_PDU_SET_PLAYER_APP_VALUE NULL decode buffer or bad len");
status = AVRC_STS_INTERNAL_ERR;
}
break;
@@ -301,13 +301,13 @@
break;
default:
- AVRC_TRACE_ERROR1("AVRC_ParsCommand() unknown opcode:0x%x", p_msg->hdr.opcode);
+ AVRC_TRACE_ERROR("AVRC_ParsCommand() unknown opcode:0x%x", p_msg->hdr.opcode);
break;
}
p_result->cmd.opcode = p_msg->hdr.opcode;
p_result->cmd.status = status;
}
- AVRC_TRACE_DEBUG1("AVRC_ParsCommand() return status:0x%x", status);
+ AVRC_TRACE_DEBUG("AVRC_ParsCommand() return status:0x%x", status);
return status;
}
diff --git a/stack/avrc/avrc_sdp.c b/stack/avrc/avrc_sdp.c
old mode 100755
new mode 100644
index a6325e1..f08b7c9
--- a/stack/avrc/avrc_sdp.c
+++ b/stack/avrc/avrc_sdp.c
@@ -81,7 +81,7 @@
******************************************************************************/
static void avrc_sdp_cback(UINT16 status)
{
- AVRC_TRACE_API1("avrc_sdp_cback status: %d", status);
+ AVRC_TRACE_API("avrc_sdp_cback status: %d", status);
/* reset service_uuid, so can start another find service */
avrc_cb.service_uuid = 0;
@@ -141,7 +141,7 @@
ATTR_ID_SUPPORTED_FEATURES,
ATTR_ID_PROVIDER_NAME};
- AVRC_TRACE_API1("AVRC_FindService uuid: %x", service_uuid);
+ AVRC_TRACE_API("AVRC_FindService uuid: %x", service_uuid);
if( (service_uuid != UUID_SERVCLASS_AV_REM_CTRL_TARGET && service_uuid != UUID_SERVCLASS_AV_REMOTE_CONTROL) ||
p_db == NULL || p_db->p_db == NULL || p_cback == NULL)
return AVRC_BAD_PARAM;
@@ -220,7 +220,7 @@
UINT16 class_list[2];
- AVRC_TRACE_API1("AVRC_AddRecord uuid: %x", service_uuid);
+ AVRC_TRACE_API("AVRC_AddRecord uuid: %x", service_uuid);
if( service_uuid != UUID_SERVCLASS_AV_REM_CTRL_TARGET && service_uuid != UUID_SERVCLASS_AV_REMOTE_CONTROL )
return AVRC_BAD_PARAM;
diff --git a/stack/avrc/avrc_utils.c b/stack/avrc/avrc_utils.c
old mode 100755
new mode 100644
index 01254fa..432ecc0
--- a/stack/avrc/avrc_utils.c
+++ b/stack/avrc/avrc_utils.c
@@ -118,7 +118,7 @@
result = TRUE;
if (!result)
- AVRC_TRACE_ERROR2(
+ AVRC_TRACE_ERROR(
"avrc_is_valid_player_attrib_value() found not matching attrib(x%x)-value(x%x) pair!",
attrib, value);
diff --git a/stack/bnep/bnep_api.c b/stack/bnep/bnep_api.c
index fbbf179..b1d8c7c 100644
--- a/stack/bnep/bnep_api.c
+++ b/stack/bnep/bnep_api.c
@@ -140,7 +140,7 @@
UINT16 cid;
tBNEP_CONN *p_bcb = bnepu_find_bcb_by_bd_addr (p_rem_bda);
- BNEP_TRACE_API6 ("BNEP_Connect() BDA: %02x-%02x-%02x-%02x-%02x-%02x",
+ BNEP_TRACE_API ("BNEP_Connect() BDA: %02x-%02x-%02x-%02x-%02x-%02x",
p_rem_bda[0], p_rem_bda[1], p_rem_bda[2],
p_rem_bda[3], p_rem_bda[4], p_rem_bda[5]);
@@ -181,7 +181,7 @@
/* Transition to the next appropriate state, waiting for connection confirm. */
p_bcb->con_state = BNEP_STATE_SEC_CHECKING;
- BNEP_TRACE_API1 ("BNEP initiating security procedures for src uuid 0x%x",
+ BNEP_TRACE_API ("BNEP initiating security procedures for src uuid 0x%x",
p_bcb->src_uuid.uu.uuid16);
#if (defined (BNEP_DO_AUTH_FOR_ROLE_SWITCH) && BNEP_DO_AUTH_FOR_ROLE_SWITCH == TRUE)
@@ -206,7 +206,7 @@
}
else
{
- BNEP_TRACE_ERROR0 ("BNEP - Originate failed");
+ BNEP_TRACE_ERROR ("BNEP - Originate failed");
if (bnep_cb.p_conn_state_cb)
(*bnep_cb.p_conn_state_cb) (p_bcb->handle, p_bcb->rem_bda, BNEP_CONN_FAILED, FALSE);
bnepu_release_bcb (p_bcb);
@@ -251,7 +251,7 @@
(!(p_bcb->con_flags & BNEP_FLAGS_SETUP_RCVD)))
return (BNEP_WRONG_STATE);
- BNEP_TRACE_API2 ("BNEP_ConnectResp() for handle %d, responce %d", handle, resp);
+ BNEP_TRACE_API ("BNEP_ConnectResp() for handle %d, responce %d", handle, resp);
/* Form appropriate responce based on profile responce */
if (resp == BNEP_CONN_FAILED_SRC_UUID) resp_code = BNEP_SETUP_INVALID_SRC_UUID;
@@ -327,7 +327,7 @@
if (p_bcb->con_state == BNEP_STATE_IDLE)
return (BNEP_WRONG_HANDLE);
- BNEP_TRACE_API1 ("BNEP_Disconnect() for handle %d", handle);
+ BNEP_TRACE_API ("BNEP_Disconnect() for handle %d", handle);
L2CA_DisconnectReq (p_bcb->l2cap_cid);
@@ -378,7 +378,7 @@
/* Check MTU size */
if (p_buf->len > BNEP_MTU_SIZE)
{
- BNEP_TRACE_ERROR2 ("BNEP_Write() length %d exceeded MTU %d", p_buf->len, BNEP_MTU_SIZE);
+ BNEP_TRACE_ERROR ("BNEP_Write() length %d exceeded MTU %d", p_buf->len, BNEP_MTU_SIZE);
GKI_freebuf (p_buf);
return (BNEP_MTU_EXCEDED);
}
@@ -485,7 +485,7 @@
/* Check MTU size. Consider the possibility of having extension headers */
if (len > BNEP_MTU_SIZE)
{
- BNEP_TRACE_ERROR2 ("BNEP_Write() length %d exceeded MTU %d", len, BNEP_MTU_SIZE);
+ BNEP_TRACE_ERROR ("BNEP_Write() length %d exceeded MTU %d", len, BNEP_MTU_SIZE);
return (BNEP_MTU_EXCEDED);
}
@@ -544,7 +544,7 @@
/* Get a buffer to copy teh data into */
if ((p_buf = (BT_HDR *)GKI_getpoolbuf (BNEP_POOL_ID)) == NULL)
{
- BNEP_TRACE_ERROR0 ("BNEP_Write() not able to get buffer");
+ BNEP_TRACE_ERROR ("BNEP_Write() not able to get buffer");
return (BNEP_NO_RESOURCES);
}
diff --git a/stack/bnep/bnep_int.h b/stack/bnep/bnep_int.h
index 528c809..0c435ef 100644
--- a/stack/bnep/bnep_int.h
+++ b/stack/bnep/bnep_int.h
@@ -234,9 +234,12 @@
extern void bnep_send_conn_responce (tBNEP_CONN *p_bcb, UINT16 resp_code);
extern void bnep_process_setup_conn_req (tBNEP_CONN *p_bcb, UINT8 *p_setup, UINT8 len);
extern void bnep_process_setup_conn_responce (tBNEP_CONN *p_bcb, UINT8 *p_setup);
-extern UINT8 *bnep_process_control_packet (tBNEP_CONN *p_bcb, UINT8 *p, UINT16 *len, BOOLEAN is_ext);
-extern void bnep_sec_check_complete (BD_ADDR bd_addr, void *p_ref_data, UINT8 result);
-extern tBNEP_RESULT bnep_is_packet_allowed (tBNEP_CONN *p_bcb, BD_ADDR p_dest_addr, UINT16 protocol, BOOLEAN fw_ext_present, UINT8 *p_data);
+extern UINT8 *bnep_process_control_packet (tBNEP_CONN *p_bcb, UINT8 *p, UINT16 *len,
+ BOOLEAN is_ext);
+extern void bnep_sec_check_complete (BD_ADDR bd_addr, tBT_TRANSPORT trasnport,
+ void *p_ref_data, UINT8 result);
+extern tBNEP_RESULT bnep_is_packet_allowed (tBNEP_CONN *p_bcb, BD_ADDR p_dest_addr, UINT16 protocol,
+ BOOLEAN fw_ext_present, UINT8 *p_data);
extern UINT32 bnep_get_uuid32 (tBT_UUID *src_uuid);
extern void bnep_dump_status (void);
diff --git a/stack/bnep/bnep_main.c b/stack/bnep/bnep_main.c
index 45d3b14..62fa316 100644
--- a/stack/bnep/bnep_main.c
+++ b/stack/bnep/bnep_main.c
@@ -99,7 +99,7 @@
/* Now, register with L2CAP */
if (!L2CA_Register (BT_PSM_BNEP, &bnep_cb.reg_info))
{
- BNEP_TRACE_ERROR0 ("BNEP - Registration failed");
+ BNEP_TRACE_ERROR ("BNEP - Registration failed");
return BNEP_SECURITY_FAIL;
}
@@ -147,7 +147,7 @@
/* Start timer waiting for config setup */
btu_start_timer (&p_bcb->conn_tle, BTU_TTYPE_BNEP, BNEP_CONN_TIMEOUT);
- BNEP_TRACE_EVENT1("BNEP - Rcvd L2CAP conn ind, CID: 0x%x", p_bcb->l2cap_cid);
+ BNEP_TRACE_EVENT("BNEP - Rcvd L2CAP conn ind, CID: 0x%x", p_bcb->l2cap_cid);
}
@@ -170,7 +170,7 @@
/* Find CCB based on CID */
if ((bcb = bnepu_find_bcb_by_cid (l2cap_cid)) == NULL)
{
- BNEP_TRACE_WARNING1 ("BNEP - Rcvd conn cnf for unknown CID 0x%x", l2cap_cid);
+ BNEP_TRACE_WARNING ("BNEP - Rcvd conn cnf for unknown CID 0x%x", l2cap_cid);
return;
}
@@ -186,11 +186,11 @@
/* Start timer waiting for config results */
btu_start_timer (&bcb->conn_tle, BTU_TTYPE_BNEP, BNEP_CONN_TIMEOUT);
- BNEP_TRACE_EVENT1 ("BNEP - got conn cnf, sent cfg req, CID: 0x%x", bcb->l2cap_cid);
+ BNEP_TRACE_EVENT ("BNEP - got conn cnf, sent cfg req, CID: 0x%x", bcb->l2cap_cid);
}
else
{
- BNEP_TRACE_WARNING2 ("BNEP - Rcvd conn cnf with error: 0x%x CID 0x%x", result, bcb->l2cap_cid);
+ BNEP_TRACE_WARNING ("BNEP - Rcvd conn cnf with error: 0x%x CID 0x%x", result, bcb->l2cap_cid);
/* Tell the upper layer, if he has a callback */
if (bnep_cb.p_conn_state_cb &&
@@ -221,11 +221,11 @@
/* Find CCB based on CID */
if ((p_bcb = bnepu_find_bcb_by_cid (l2cap_cid)) == NULL)
{
- BNEP_TRACE_WARNING1 ("BNEP - Rcvd L2CAP cfg ind, unknown CID: 0x%x", l2cap_cid);
+ BNEP_TRACE_WARNING ("BNEP - Rcvd L2CAP cfg ind, unknown CID: 0x%x", l2cap_cid);
return;
}
- BNEP_TRACE_EVENT1 ("BNEP - Rcvd cfg ind, CID: 0x%x", l2cap_cid);
+ BNEP_TRACE_EVENT ("BNEP - Rcvd cfg ind, CID: 0x%x", l2cap_cid);
/* Remember the remote MTU size */
if ((!p_cfg->mtu_present) || (p_cfg->mtu < BNEP_MIN_MTU_SIZE))
@@ -253,7 +253,7 @@
if (result != L2CAP_CFG_OK)
{
- BNEP_TRACE_EVENT2 ("BNEP - Rcvd cfg ind with bad MTU %d, CID: 0x%x", mtu, l2cap_cid);
+ BNEP_TRACE_EVENT ("BNEP - Rcvd cfg ind with bad MTU %d, CID: 0x%x", mtu, l2cap_cid);
return;
}
@@ -291,12 +291,12 @@
{
tBNEP_CONN *p_bcb;
- BNEP_TRACE_EVENT2 ("BNEP - Rcvd cfg cfm, CID: 0x%x Result: %d", l2cap_cid, p_cfg->result);
+ BNEP_TRACE_EVENT ("BNEP - Rcvd cfg cfm, CID: 0x%x Result: %d", l2cap_cid, p_cfg->result);
/* Find CCB based on CID */
if ((p_bcb = bnepu_find_bcb_by_cid (l2cap_cid)) == NULL)
{
- BNEP_TRACE_WARNING1 ("BNEP - Rcvd L2CAP cfg ind, unknown CID: 0x%x", l2cap_cid);
+ BNEP_TRACE_WARNING ("BNEP - Rcvd L2CAP cfg ind, unknown CID: 0x%x", l2cap_cid);
return;
}
@@ -356,11 +356,11 @@
/* Find CCB based on CID */
if ((p_bcb = bnepu_find_bcb_by_cid (l2cap_cid)) == NULL)
{
- BNEP_TRACE_WARNING1 ("BNEP - Rcvd L2CAP disc, unknown CID: 0x%x", l2cap_cid);
+ BNEP_TRACE_WARNING ("BNEP - Rcvd L2CAP disc, unknown CID: 0x%x", l2cap_cid);
return;
}
- BNEP_TRACE_EVENT1 ("BNEP - Rcvd L2CAP disc, CID: 0x%x", l2cap_cid);
+ BNEP_TRACE_EVENT ("BNEP - Rcvd L2CAP disc, CID: 0x%x", l2cap_cid);
/* Tell the user if he has a callback */
if (p_bcb->con_state == BNEP_STATE_CONNECTED)
@@ -391,7 +391,7 @@
*******************************************************************************/
static void bnep_disconnect_cfm (UINT16 l2cap_cid, UINT16 result)
{
- BNEP_TRACE_EVENT2 ("BNEP - Rcvd L2CAP disc cfm, CID: 0x%x, Result 0x%x", l2cap_cid, result);
+ BNEP_TRACE_EVENT ("BNEP - Rcvd L2CAP disc cfm, CID: 0x%x, Result 0x%x", l2cap_cid, result);
}
@@ -411,7 +411,7 @@
/* Find BCB based on CID */
if ((p_bcb = bnepu_find_bcb_by_cid (l2cap_cid)) == NULL)
{
- BNEP_TRACE_WARNING1 ("BNEP - Rcvd L2CAP cong, unknown CID: 0x%x", l2cap_cid);
+ BNEP_TRACE_WARNING ("BNEP - Rcvd L2CAP cong, unknown CID: 0x%x", l2cap_cid);
return;
}
@@ -476,7 +476,7 @@
/* Find CCB based on CID */
if ((p_bcb = bnepu_find_bcb_by_cid (l2cap_cid)) == NULL)
{
- BNEP_TRACE_WARNING1 ("BNEP - Rcvd L2CAP data, unknown CID: 0x%x", l2cap_cid);
+ BNEP_TRACE_WARNING ("BNEP - Rcvd L2CAP data, unknown CID: 0x%x", l2cap_cid);
GKI_freebuf (p_buf);
return;
}
@@ -487,7 +487,7 @@
type &= 0x7f;
if ((rem_len <= bnep_frame_hdr_sizes[type]) || (rem_len > BNEP_MTU_SIZE))
{
- BNEP_TRACE_EVENT2 ("BNEP - rcvd frame, bad len: %d type: 0x%02x", p_buf->len, type);
+ BNEP_TRACE_EVENT ("BNEP - rcvd frame, bad len: %d type: 0x%02x", p_buf->len, type);
GKI_freebuf (p_buf);
return;
}
@@ -498,7 +498,7 @@
(!(p_bcb->con_flags & BNEP_FLAGS_CONN_COMPLETED)) &&
(type != BNEP_FRAME_CONTROL))
{
- BNEP_TRACE_WARNING2 ("BNEP - Ignored L2CAP data while in state: %d, CID: 0x%x",
+ BNEP_TRACE_WARNING ("BNEP - Ignored L2CAP data while in state: %d, CID: 0x%x",
p_bcb->con_state, l2cap_cid);
if (extension_present)
@@ -537,12 +537,12 @@
if (type > BNEP_FRAME_COMPRESSED_ETHERNET_DEST_ONLY)
{
- BNEP_TRACE_EVENT1 ("BNEP - rcvd frame, unknown type: 0x%02x", type);
+ BNEP_TRACE_EVENT ("BNEP - rcvd frame, unknown type: 0x%02x", type);
GKI_freebuf (p_buf);
return;
}
- BNEP_TRACE_DEBUG3 ("BNEP - rcv frame, type: %d len: %d Ext: %d", type, p_buf->len, extension_present);
+ BNEP_TRACE_DEBUG ("BNEP - rcv frame, type: %d len: %d Ext: %d", type, p_buf->len, extension_present);
/* Initialize addresses to 'not supplied' */
p_src_addr = p_dst_addr = NULL;
@@ -622,7 +622,7 @@
/* if unknown extension present stop processing */
if (ext_type)
{
- BNEP_TRACE_EVENT1 ("Data extension type 0x%x found", ext_type);
+ BNEP_TRACE_EVENT ("Data extension type 0x%x found", ext_type);
break;
}
@@ -689,12 +689,12 @@
p_bcb = (tBNEP_CONN *)p_tle->param;
- BNEP_TRACE_EVENT4 ("BNEP - CCB timeout in state: %d CID: 0x%x flags %x, re_transmit %d",
+ BNEP_TRACE_EVENT ("BNEP - CCB timeout in state: %d CID: 0x%x flags %x, re_transmit %d",
p_bcb->con_state, p_bcb->l2cap_cid, p_bcb->con_flags, p_bcb->re_transmits);
if (p_bcb->con_state == BNEP_STATE_CONN_SETUP)
{
- BNEP_TRACE_EVENT2 ("BNEP - CCB timeout in state: %d CID: 0x%x",
+ BNEP_TRACE_EVENT ("BNEP - CCB timeout in state: %d CID: 0x%x",
p_bcb->con_state, p_bcb->l2cap_cid);
if (!(p_bcb->con_flags & BNEP_FLAGS_IS_ORIG))
@@ -723,7 +723,7 @@
}
else if (p_bcb->con_state != BNEP_STATE_CONNECTED)
{
- BNEP_TRACE_EVENT2 ("BNEP - CCB timeout in state: %d CID: 0x%x",
+ BNEP_TRACE_EVENT ("BNEP - CCB timeout in state: %d CID: 0x%x",
p_bcb->con_state, p_bcb->l2cap_cid);
L2CA_DisconnectReq (p_bcb->l2cap_cid);
diff --git a/stack/bnep/bnep_utils.c b/stack/bnep/bnep_utils.c
index 0a8fd6d..92061d0 100644
--- a/stack/bnep/bnep_utils.c
+++ b/stack/bnep/bnep_utils.c
@@ -173,10 +173,10 @@
BT_HDR *p_buf;
UINT8 *p, *p_start;
- BNEP_TRACE_DEBUG1 ("BNEP sending setup req with dst uuid %x", p_bcb->dst_uuid.uu.uuid16);
+ BNEP_TRACE_DEBUG ("BNEP sending setup req with dst uuid %x", p_bcb->dst_uuid.uu.uuid16);
if ((p_buf = (BT_HDR *)GKI_getpoolbuf (BNEP_POOL_ID)) == NULL)
{
- BNEP_TRACE_ERROR0 ("BNEP - not able to send connection request");
+ BNEP_TRACE_ERROR ("BNEP - not able to send connection request");
return;
}
@@ -231,10 +231,10 @@
BT_HDR *p_buf;
UINT8 *p;
- BNEP_TRACE_EVENT1 ("BNEP - bnep_send_conn_responce for CID: 0x%x", p_bcb->l2cap_cid);
+ BNEP_TRACE_EVENT ("BNEP - bnep_send_conn_responce for CID: 0x%x", p_bcb->l2cap_cid);
if ((p_buf = (BT_HDR *)GKI_getpoolbuf (BNEP_POOL_ID)) == NULL)
{
- BNEP_TRACE_ERROR0 ("BNEP - not able to send connection response");
+ BNEP_TRACE_ERROR ("BNEP - not able to send connection response");
return;
}
@@ -272,11 +272,11 @@
UINT8 *p;
UINT16 xx;
- BNEP_TRACE_DEBUG0 ("BNEP sending peer our filters");
+ BNEP_TRACE_DEBUG ("BNEP sending peer our filters");
if ((p_buf = (BT_HDR *)GKI_getpoolbuf (BNEP_POOL_ID)) == NULL)
{
- BNEP_TRACE_ERROR0 ("BNEP - no buffer send filters");
+ BNEP_TRACE_ERROR ("BNEP - no buffer send filters");
return;
}
@@ -324,11 +324,11 @@
UINT8 *p;
UINT16 xx;
- BNEP_TRACE_DEBUG0 ("BNEP sending peer our multicast filters");
+ BNEP_TRACE_DEBUG ("BNEP sending peer our multicast filters");
if ((p_buf = (BT_HDR *)GKI_getpoolbuf (BNEP_POOL_ID)) == NULL)
{
- BNEP_TRACE_ERROR0 ("BNEP - no buffer to send multicast filters");
+ BNEP_TRACE_ERROR ("BNEP - no buffer to send multicast filters");
return;
}
@@ -376,10 +376,10 @@
BT_HDR *p_buf;
UINT8 *p;
- BNEP_TRACE_DEBUG0 ("BNEP sending filter response");
+ BNEP_TRACE_DEBUG ("BNEP sending filter response");
if ((p_buf = (BT_HDR *)GKI_getpoolbuf (BNEP_POOL_ID)) == NULL)
{
- BNEP_TRACE_ERROR0 ("BNEP - no buffer filter rsp");
+ BNEP_TRACE_ERROR ("BNEP - no buffer filter rsp");
return;
}
@@ -414,10 +414,10 @@
BT_HDR *p_buf;
UINT8 *p;
- BNEP_TRACE_EVENT2 ("BNEP - bnep_send_command_not_understood for CID: 0x%x, cmd 0x%x", p_bcb->l2cap_cid, cmd_code);
+ BNEP_TRACE_EVENT ("BNEP - bnep_send_command_not_understood for CID: 0x%x, cmd 0x%x", p_bcb->l2cap_cid, cmd_code);
if ((p_buf = (BT_HDR *)GKI_getpoolbuf (BNEP_POOL_ID)) == NULL)
{
- BNEP_TRACE_ERROR0 ("BNEP - not able to send connection response");
+ BNEP_TRACE_ERROR ("BNEP - not able to send connection response");
return;
}
@@ -452,12 +452,12 @@
*******************************************************************************/
void bnepu_check_send_packet (tBNEP_CONN *p_bcb, BT_HDR *p_buf)
{
- BNEP_TRACE_EVENT1 ("BNEP - bnepu_check_send_packet for CID: 0x%x", p_bcb->l2cap_cid);
+ BNEP_TRACE_EVENT ("BNEP - bnepu_check_send_packet for CID: 0x%x", p_bcb->l2cap_cid);
if (p_bcb->con_flags & BNEP_FLAGS_L2CAP_CONGESTED)
{
if (p_bcb->xmit_q.count >= BNEP_MAX_XMITQ_DEPTH)
{
- BNEP_TRACE_EVENT1 ("BNEP - congested, dropping buf, CID: 0x%x", p_bcb->l2cap_cid);
+ BNEP_TRACE_EVENT ("BNEP - congested, dropping buf, CID: 0x%x", p_bcb->l2cap_cid);
GKI_freebuf (p_buf);
}
@@ -584,13 +584,13 @@
*******************************************************************************/
void bnep_process_setup_conn_req (tBNEP_CONN *p_bcb, UINT8 *p_setup, UINT8 len)
{
- BNEP_TRACE_EVENT1 ("BNEP - bnep_process_setup_conn_req for CID: 0x%x", p_bcb->l2cap_cid);
+ BNEP_TRACE_EVENT ("BNEP - bnep_process_setup_conn_req for CID: 0x%x", p_bcb->l2cap_cid);
if (p_bcb->con_state != BNEP_STATE_CONN_SETUP &&
p_bcb->con_state != BNEP_STATE_SEC_CHECKING &&
p_bcb->con_state != BNEP_STATE_CONNECTED)
{
- BNEP_TRACE_ERROR1 ("BNEP - setup request in bad state %d", p_bcb->con_state);
+ BNEP_TRACE_ERROR ("BNEP - setup request in bad state %d", p_bcb->con_state);
bnep_send_conn_responce (p_bcb, BNEP_SETUP_CONN_NOT_ALLOWED);
return;
}
@@ -598,7 +598,7 @@
/* Check if we already initiated security check or if waiting for user responce */
if (p_bcb->con_flags & BNEP_FLAGS_SETUP_RCVD)
{
- BNEP_TRACE_EVENT0 ("BNEP - Duplicate Setup message received while doing security check");
+ BNEP_TRACE_EVENT ("BNEP - Duplicate Setup message received while doing security check");
return;
}
@@ -607,7 +607,7 @@
(!(p_bcb->con_flags & BNEP_FLAGS_SETUP_RCVD)) &&
(p_bcb->con_flags & BNEP_FLAGS_IS_ORIG))
{
- BNEP_TRACE_ERROR1 ("BNEP - setup request when we are originator", p_bcb->con_state);
+ BNEP_TRACE_ERROR ("BNEP - setup request when we are originator", p_bcb->con_state);
bnep_send_conn_responce (p_bcb, BNEP_SETUP_CONN_NOT_ALLOWED);
return;
}
@@ -651,7 +651,7 @@
#endif
else
{
- BNEP_TRACE_ERROR1 ("BNEP - Bad UID len %d in ConnReq", p_bcb->dst_uuid.len);
+ BNEP_TRACE_ERROR ("BNEP - Bad UID len %d in ConnReq", p_bcb->dst_uuid.len);
bnep_send_conn_responce (p_bcb, BNEP_SETUP_INVALID_UUID_SIZE);
return;
}
@@ -659,7 +659,7 @@
p_bcb->con_state = BNEP_STATE_SEC_CHECKING;
p_bcb->con_flags |= BNEP_FLAGS_SETUP_RCVD;
- BNEP_TRACE_EVENT1 ("BNEP initiating security check for incoming call for uuid 0x%x", p_bcb->src_uuid.uu.uuid16);
+ BNEP_TRACE_EVENT ("BNEP initiating security check for incoming call for uuid 0x%x", p_bcb->src_uuid.uu.uuid16);
#if (!defined (BNEP_DO_AUTH_FOR_ROLE_SWITCH) || BNEP_DO_AUTH_FOR_ROLE_SWITCH == FALSE)
if (p_bcb->con_flags & BNEP_FLAGS_CONN_COMPLETED)
bnep_sec_check_complete (p_bcb->rem_bda, p_bcb, BTM_SUCCESS);
@@ -689,19 +689,19 @@
tBNEP_RESULT resp;
UINT16 resp_code;
- BNEP_TRACE_DEBUG0 ("BNEP received setup responce");
+ BNEP_TRACE_DEBUG ("BNEP received setup responce");
/* The state should be either SETUP or CONNECTED */
if (p_bcb->con_state != BNEP_STATE_CONN_SETUP)
{
/* Should we disconnect ? */
- BNEP_TRACE_ERROR1 ("BNEP - setup response in bad state %d", p_bcb->con_state);
+ BNEP_TRACE_ERROR ("BNEP - setup response in bad state %d", p_bcb->con_state);
return;
}
/* Check if we are the originator */
if (!(p_bcb->con_flags & BNEP_FLAGS_IS_ORIG))
{
- BNEP_TRACE_ERROR1 ("BNEP - setup response when we are not originator", p_bcb->con_state);
+ BNEP_TRACE_ERROR ("BNEP - setup response when we are not originator", p_bcb->con_state);
return;
}
@@ -732,7 +732,7 @@
{
if (p_bcb->con_flags & BNEP_FLAGS_CONN_COMPLETED)
{
- BNEP_TRACE_EVENT1 ("BNEP - role change response is %d", resp_code);
+ BNEP_TRACE_EVENT ("BNEP - role change response is %d", resp_code);
/* Restore the earlier BNEP status */
p_bcb->con_state = BNEP_STATE_CONNECTED;
@@ -752,7 +752,7 @@
}
else
{
- BNEP_TRACE_ERROR1 ("BNEP - setup response %d is not OK", resp_code);
+ BNEP_TRACE_ERROR ("BNEP - setup response %d is not OK", resp_code);
L2CA_DisconnectReq (p_bcb->l2cap_cid);
@@ -796,12 +796,12 @@
control_type = *p++;
*rem_len = *rem_len - 1;
- BNEP_TRACE_EVENT3 ("BNEP processing control packet rem_len %d, is_ext %d, ctrl_type %d", *rem_len, is_ext, control_type);
+ BNEP_TRACE_EVENT ("BNEP processing control packet rem_len %d, is_ext %d, ctrl_type %d", *rem_len, is_ext, control_type);
switch (control_type)
{
case BNEP_CONTROL_COMMAND_NOT_UNDERSTOOD:
- BNEP_TRACE_ERROR1 ("BNEP Received Cmd not understood for ctl pkt type: %d", *p);
+ BNEP_TRACE_ERROR ("BNEP Received Cmd not understood for ctl pkt type: %d", *p);
p++;
*rem_len = *rem_len - 1;
break;
@@ -811,7 +811,7 @@
if (*rem_len < ((2 * len) + 1))
{
bad_pkt = TRUE;
- BNEP_TRACE_ERROR0 ("BNEP Received Setup message with bad length");
+ BNEP_TRACE_ERROR ("BNEP Received Setup message with bad length");
break;
}
if (!is_ext)
@@ -832,7 +832,7 @@
if (*rem_len < (len + 2))
{
bad_pkt = TRUE;
- BNEP_TRACE_ERROR0 ("BNEP Received Filter set message with bad length");
+ BNEP_TRACE_ERROR ("BNEP Received Filter set message with bad length");
break;
}
bnepu_process_peer_filter_set (p_bcb, p, len);
@@ -851,7 +851,7 @@
if (*rem_len < (len + 2))
{
bad_pkt = TRUE;
- BNEP_TRACE_ERROR0 ("BNEP Received Multicast Filter Set message with bad length");
+ BNEP_TRACE_ERROR ("BNEP Received Multicast Filter Set message with bad length");
break;
}
bnepu_process_peer_multicast_filter_set (p_bcb, p, len);
@@ -866,7 +866,7 @@
break;
default :
- BNEP_TRACE_ERROR1 ("BNEP - bad ctl pkt type: %d", control_type);
+ BNEP_TRACE_ERROR ("BNEP - bad ctl pkt type: %d", control_type);
bnep_send_command_not_understood (p_bcb, control_type);
if (is_ext)
{
@@ -878,7 +878,7 @@
if (bad_pkt)
{
- BNEP_TRACE_ERROR1 ("BNEP - bad ctl pkt length: %d", *rem_len);
+ BNEP_TRACE_ERROR ("BNEP - bad ctl pkt length: %d", *rem_len);
*rem_len = 0;
return NULL;
}
@@ -909,15 +909,15 @@
if ((p_bcb->con_state != BNEP_STATE_CONNECTED) &&
(!(p_bcb->con_flags & BNEP_FLAGS_CONN_COMPLETED)))
{
- BNEP_TRACE_DEBUG0 ("BNEP received filter set from peer when there is no connection");
+ BNEP_TRACE_DEBUG ("BNEP received filter set from peer when there is no connection");
return;
}
- BNEP_TRACE_DEBUG0 ("BNEP received filter set from peer");
+ BNEP_TRACE_DEBUG ("BNEP received filter set from peer");
/* Check for length not a multiple of 4 */
if (len & 3)
{
- BNEP_TRACE_EVENT1 ("BNEP - bad filter len: %d", len);
+ BNEP_TRACE_EVENT ("BNEP - bad filter len: %d", len);
bnepu_send_peer_filter_rsp (p_bcb, BNEP_FILTER_CRL_BAD_RANGE);
return;
}
@@ -986,19 +986,19 @@
UINT16 resp_code;
tBNEP_RESULT result;
- BNEP_TRACE_DEBUG0 ("BNEP received filter responce");
+ BNEP_TRACE_DEBUG ("BNEP received filter responce");
/* The state should be CONNECTED */
if ((p_bcb->con_state != BNEP_STATE_CONNECTED) &&
(!(p_bcb->con_flags & BNEP_FLAGS_CONN_COMPLETED)))
{
- BNEP_TRACE_ERROR1 ("BNEP - filter response in bad state %d", p_bcb->con_state);
+ BNEP_TRACE_ERROR ("BNEP - filter response in bad state %d", p_bcb->con_state);
return;
}
/* Check if we are the originator */
if (!(p_bcb->con_flags & BNEP_FLAGS_FILTER_RESP_PEND))
{
- BNEP_TRACE_ERROR0 ("BNEP - filter response when not expecting");
+ BNEP_TRACE_ERROR ("BNEP - filter response when not expecting");
return;
}
@@ -1038,19 +1038,19 @@
UINT16 resp_code;
tBNEP_RESULT result;
- BNEP_TRACE_DEBUG0 ("BNEP received multicast filter responce");
+ BNEP_TRACE_DEBUG ("BNEP received multicast filter responce");
/* The state should be CONNECTED */
if ((p_bcb->con_state != BNEP_STATE_CONNECTED) &&
(!(p_bcb->con_flags & BNEP_FLAGS_CONN_COMPLETED)))
{
- BNEP_TRACE_ERROR1 ("BNEP - multicast filter response in bad state %d", p_bcb->con_state);
+ BNEP_TRACE_ERROR ("BNEP - multicast filter response in bad state %d", p_bcb->con_state);
return;
}
/* Check if we are the originator */
if (!(p_bcb->con_flags & BNEP_FLAGS_MULTI_RESP_PEND))
{
- BNEP_TRACE_ERROR0 ("BNEP - multicast filter response when not expecting");
+ BNEP_TRACE_ERROR ("BNEP - multicast filter response when not expecting");
return;
}
@@ -1095,20 +1095,20 @@
if ((p_bcb->con_state != BNEP_STATE_CONNECTED) &&
(!(p_bcb->con_flags & BNEP_FLAGS_CONN_COMPLETED)))
{
- BNEP_TRACE_DEBUG0 ("BNEP received multicast filter set from peer when there is no connection");
+ BNEP_TRACE_DEBUG ("BNEP received multicast filter set from peer when there is no connection");
return;
}
if (len % 12)
{
- BNEP_TRACE_EVENT1 ("BNEP - bad filter len: %d", len);
+ BNEP_TRACE_EVENT ("BNEP - bad filter len: %d", len);
bnepu_send_peer_multicast_filter_rsp (p_bcb, BNEP_FILTER_CRL_BAD_RANGE);
return;
}
if (len > (BNEP_MAX_MULTI_FILTERS * 2 * BD_ADDR_LEN))
{
- BNEP_TRACE_EVENT0 ("BNEP - Too many filters");
+ BNEP_TRACE_EVENT ("BNEP - Too many filters");
bnepu_send_peer_multicast_filter_rsp (p_bcb, BNEP_FILTER_CRL_MAX_REACHED);
return;
}
@@ -1149,7 +1149,7 @@
}
}
- BNEP_TRACE_EVENT1 ("BNEP multicast filters %d", p_bcb->rcvd_mcast_filters);
+ BNEP_TRACE_EVENT ("BNEP multicast filters %d", p_bcb->rcvd_mcast_filters);
bnepu_send_peer_multicast_filter_rsp (p_bcb, resp_code);
if (bnep_cb.p_mfilter_ind_cb)
@@ -1174,10 +1174,10 @@
BT_HDR *p_buf;
UINT8 *p;
- BNEP_TRACE_DEBUG1 ("BNEP sending multicast filter response %d", response_code);
+ BNEP_TRACE_DEBUG ("BNEP sending multicast filter response %d", response_code);
if ((p_buf = (BT_HDR *)GKI_getpoolbuf (BNEP_POOL_ID)) == NULL)
{
- BNEP_TRACE_ERROR0 ("BNEP - no buffer filter rsp");
+ BNEP_TRACE_ERROR ("BNEP - no buffer filter rsp");
return;
}
@@ -1209,14 +1209,16 @@
** Returns void
**
*******************************************************************************/
-void bnep_sec_check_complete (BD_ADDR bd_addr, void *p_ref_data, UINT8 result)
+void bnep_sec_check_complete (BD_ADDR bd_addr, tBT_TRANSPORT trasnport,
+ void *p_ref_data, UINT8 result)
{
tBNEP_CONN *p_bcb = (tBNEP_CONN *)p_ref_data;
UINT16 resp_code = BNEP_SETUP_CONN_OK;
BOOLEAN is_role_change;
UNUSED(bd_addr);
+ UNUSED(trasnport);
- BNEP_TRACE_EVENT1 ("BNEP security callback returned result %d", result);
+ BNEP_TRACE_EVENT ("BNEP security callback returned result %d", result);
if (p_bcb->con_flags & BNEP_FLAGS_CONN_COMPLETED)
is_role_change = TRUE;
else
@@ -1225,7 +1227,7 @@
/* check if the port is still waiting for security to complete */
if (p_bcb->con_state != BNEP_STATE_SEC_CHECKING)
{
- BNEP_TRACE_ERROR1 ("BNEP Connection in wrong state %d when security is completed", p_bcb->con_state);
+ BNEP_TRACE_ERROR ("BNEP Connection in wrong state %d when security is completed", p_bcb->con_state);
return;
}
@@ -1351,7 +1353,7 @@
if (i == p_bcb->rcvd_num_filters)
{
- BNEP_TRACE_DEBUG1 ("Ignoring protocol 0x%x in BNEP data write", proto);
+ BNEP_TRACE_DEBUG ("Ignoring protocol 0x%x in BNEP data write", proto);
return BNEP_IGNORE_CMD;
}
}
@@ -1382,7 +1384,7 @@
*/
if ((p_bcb->rcvd_mcast_filters == 0xFFFF) || (i == p_bcb->rcvd_mcast_filters))
{
- BNEP_TRACE_DEBUG6 ("Ignoring multicast address %x.%x.%x.%x.%x.%x in BNEP data write",
+ BNEP_TRACE_DEBUG ("Ignoring multicast address %x.%x.%x.%x.%x.%x in BNEP data write",
p_dest_addr[0], p_dest_addr[1], p_dest_addr[2],
p_dest_addr[3], p_dest_addr[4], p_dest_addr[5]);
return BNEP_IGNORE_CMD;
@@ -1442,10 +1444,10 @@
char buff[200];
tBNEP_CONN *p_bcb;
- BNEP_TRACE_DEBUG6 ("BNEP my BD Addr %x.%x.%x.%x.%x.%x",
+ BNEP_TRACE_DEBUG ("BNEP my BD Addr %x.%x.%x.%x.%x.%x",
bnep_cb.my_bda[0], bnep_cb.my_bda[1], bnep_cb.my_bda[2],
bnep_cb.my_bda[3], bnep_cb.my_bda[4], bnep_cb.my_bda[5]);
- BNEP_TRACE_DEBUG3 ("profile registered %d, trace %d, got_my_bd_addr %d",
+ BNEP_TRACE_DEBUG ("profile registered %d, trace %d, got_my_bd_addr %d",
bnep_cb.profile_registered, bnep_cb.trace_level, bnep_cb.got_my_bd_addr);
for (i = 0, p_bcb = bnep_cb.bcb; i < BNEP_MAX_CONNECTIONS; i++, p_bcb++)
@@ -1457,7 +1459,7 @@
p_bcb->rem_bda[0], p_bcb->rem_bda[1], p_bcb->rem_bda[2],
p_bcb->rem_bda[3], p_bcb->rem_bda[4], p_bcb->rem_bda[5]);
- BNEP_TRACE_DEBUG0 (buff);
+ BNEP_TRACE_DEBUG (buff);
}
#endif
}
diff --git a/stack/btm/btm_acl.c b/stack/btm/btm_acl.c
index 49ace6e..fa742e5 100644
--- a/stack/btm/btm_acl.c
+++ b/stack/btm/btm_acl.c
@@ -40,7 +40,6 @@
#include "bd.h"
#include "bt_utils.h"
-static void btm_establish_continue (tACL_CONN *p_acl_cb);
static void btm_read_remote_features (UINT16 handle);
static void btm_read_remote_ext_features (UINT16 handle, UINT8 page_number);
static void btm_process_remote_ext_features_page (tACL_CONN *p_acl_cb, tBTM_SEC_DEV_REC *p_dev_rec,
@@ -51,52 +50,6 @@
/*******************************************************************************
**
-** Function btm_save_remote_device_role
-**
-** Description This function is to save remote device role
-**
-** Returns void
-**
-*******************************************************************************/
-static void btm_save_remote_device_role(BD_ADDR bd_addr, UINT8 role)
-{
- UINT8 i, j;
- if (role == BTM_ROLE_UNDEFINED) return;
-
- for (i = 0; i < BTM_ROLE_DEVICE_NUM; i++) {
- if ((btm_cb.previous_connected_role[i] != BTM_ROLE_UNDEFINED) &&
- (!bdcmp(bd_addr, btm_cb.previous_connected_remote_addr[i]))) {
- break;
- }
- }
-
- if (i < BTM_ROLE_DEVICE_NUM) {
- UINT8 end;
- if (i < btm_cb.front) {
- for (j = i; j > 0; j--) {
- bdcpy(btm_cb.previous_connected_remote_addr[j],
- btm_cb.previous_connected_remote_addr[j-1]);
- }
- bdcpy(btm_cb.previous_connected_remote_addr[0],
- btm_cb.previous_connected_remote_addr[BTM_ROLE_DEVICE_NUM-1]);
- end = BTM_ROLE_DEVICE_NUM-1;
- } else {
- end = i;
- }
-
- for (j = end; j > btm_cb.front; j--) {
- bdcpy(btm_cb.previous_connected_remote_addr[j],
- btm_cb.previous_connected_remote_addr[j-1]);
- }
- }
-
- bdcpy(btm_cb.previous_connected_remote_addr[btm_cb.front], bd_addr);
- btm_cb.previous_connected_role[btm_cb.front] = role;
- btm_cb.front = (btm_cb.front + 1) % BTM_ROLE_DEVICE_NUM;
-}
-
-/*******************************************************************************
-**
** Function btm_acl_init
**
** Description This function is called at BTM startup to initialize
@@ -106,7 +59,7 @@
*******************************************************************************/
void btm_acl_init (void)
{
- BTM_TRACE_DEBUG0 ("btm_acl_init");
+ BTM_TRACE_DEBUG ("btm_acl_init");
#if 0 /* cleared in btm_init; put back in if called from anywhere else! */
memset (&btm_cb.acl_db, 0, sizeof (btm_cb.acl_db));
#if RFCOMM_INCLUDED == TRUE
@@ -131,11 +84,14 @@
**
** Description This function returns the FIRST acl_db entry for the passed BDA.
**
+** Parameters bda : BD address of the remote device
+** transport : Physical transport used for ACL connection (BR/EDR or LE)
+**
** Returns Returns pointer to the ACL DB for the requested BDA if found.
** NULL if not found.
**
*******************************************************************************/
-tACL_CONN *btm_bda_to_acl (BD_ADDR bda)
+tACL_CONN *btm_bda_to_acl (BD_ADDR bda, tBT_TRANSPORT transport)
{
tACL_CONN *p = &btm_cb.acl_db[0];
UINT16 xx;
@@ -143,9 +99,13 @@
{
for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p++)
{
- if ((p->in_use) && (!memcmp (p->remote_addr, bda, BD_ADDR_LEN)))
+ if ((p->in_use) && (!memcmp (p->remote_addr, bda, BD_ADDR_LEN))
+#if BLE_INCLUDED == TRUE
+ && p->transport == transport
+#endif
+ )
{
- BTM_TRACE_DEBUG0 ("btm_bda_to_acl found");
+ BTM_TRACE_DEBUG ("btm_bda_to_acl found");
return(p);
}
}
@@ -168,7 +128,7 @@
{
tACL_CONN *p = &btm_cb.acl_db[0];
UINT8 xx;
- BTM_TRACE_DEBUG0 ("btm_handle_to_acl_index");
+ BTM_TRACE_DEBUG ("btm_handle_to_acl_index");
for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p++)
{
if ((p->in_use) && (p->hci_handle == hci_handle))
@@ -181,7 +141,7 @@
return(xx);
}
-#if BTM_BLE_PRIVACY_SPT == TRUE
+#if BLE_PRIVACY_SPT == TRUE
/*******************************************************************************
**
** Function btm_ble_get_acl_remote_addr
@@ -200,7 +160,7 @@
if (p_dev_rec == NULL)
{
- BTM_TRACE_ERROR0("btm_ble_get_acl_remote_addr can not find device with matching address");
+ BTM_TRACE_ERROR("btm_ble_get_acl_remote_addr can not find device with matching address");
return FALSE;
}
@@ -222,7 +182,7 @@
break;
default:
- BTM_TRACE_ERROR1("Unknown active address: %d", p_dev_rec->ble.active_addr_type);
+ BTM_TRACE_ERROR("Unknown active address: %d", p_dev_rec->ble.active_addr_type);
st = FALSE;
break;
}
@@ -247,26 +207,25 @@
**
*******************************************************************************/
void btm_acl_created (BD_ADDR bda, DEV_CLASS dc, BD_NAME bdn,
- UINT16 hci_handle, UINT8 link_role, UINT8 is_le_link)
+ UINT16 hci_handle, UINT8 link_role, tBT_TRANSPORT transport)
{
tBTM_SEC_DEV_REC *p_dev_rec = NULL;
UINT8 yy;
tACL_CONN *p;
UINT8 xx;
- BTM_TRACE_DEBUG3 ("btm_acl_created hci_handle=%d link_role=%d is_le_link=%d",
- hci_handle,link_role, is_le_link);
+ BTM_TRACE_DEBUG ("btm_acl_created hci_handle=%d link_role=%d transport=%d",
+ hci_handle,link_role, transport);
/* Ensure we don't have duplicates */
- p = btm_bda_to_acl(bda);
+ p = btm_bda_to_acl(bda, transport);
if (p != (tACL_CONN *)NULL)
{
p->hci_handle = hci_handle;
p->link_role = link_role;
- btm_save_remote_device_role(bda, link_role);
#if BLE_INCLUDED == TRUE
- p->is_le_link = is_le_link;
+ p->transport = transport;
#endif
- BTM_TRACE_DEBUG6 ("Duplicate btm_acl_created: RemBdAddr: %02x%02x%02x%02x%02x%02x",
+ BTM_TRACE_DEBUG ("Duplicate btm_acl_created: RemBdAddr: %02x%02x%02x%02x%02x%02x",
bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]);
BTM_SetLinkPolicy(p->remote_addr, &btm_cb.btm_def_link_policy);
return;
@@ -280,18 +239,25 @@
p->in_use = TRUE;
p->hci_handle = hci_handle;
p->link_role = link_role;
- btm_save_remote_device_role(bda, link_role);
p->link_up_issued = FALSE;
#if BLE_INCLUDED == TRUE
- p->is_le_link = is_le_link;
-
- if (is_le_link)
+ p->transport = transport;
+ if (transport == BT_TRANSPORT_LE)
{
- p->conn_addr_type = BLE_ADDR_PUBLIC;
- BTM_GetLocalDeviceAddr(p->conn_addr);
+#if BLE_PRIVACY_SPT == TRUE
+ if (btm_cb.ble_ctr_cb.privacy)
+ {
+ p->conn_addr_type = btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type;
+ memcpy(p->conn_addr, btm_cb.ble_ctr_cb.addr_mgnt_cb.private_addr, BD_ADDR_LEN);
+ }
+ else
+#endif
+ {
+ p->conn_addr_type = BLE_ADDR_PUBLIC;
+ BTM_GetLocalDeviceAddr(p->conn_addr);
+ }
}
-
#endif
p->restore_pkt_types = 0; /* Only exists while SCO is active */
p->switch_role_state = BTM_ACL_SWKEY_STATE_IDLE;
@@ -311,7 +277,7 @@
memcpy (p->remote_name, bdn, BTM_MAX_REM_BD_NAME_LEN);
/* if BR/EDR do something more */
- if (!is_le_link)
+ if (transport == BT_TRANSPORT_BR_EDR)
{
btsnd_hcic_read_rmt_clk_offset (p->hci_handle);
btsnd_hcic_rmt_ver_req (p->hci_handle);
@@ -321,11 +287,11 @@
#if (BLE_INCLUDED == TRUE)
if (p_dev_rec )
{
- BTM_TRACE_DEBUG1 ("device_type=0x%x", p_dev_rec->device_type);
+ BTM_TRACE_DEBUG ("device_type=0x%x", p_dev_rec->device_type);
}
#endif
- if (p_dev_rec && !is_le_link)
+ if (p_dev_rec && !(transport == BT_TRANSPORT_LE))
{
/* If remote features already known, copy them and continue connection setup */
if ((p_dev_rec->num_read_pages) &&
@@ -353,20 +319,22 @@
#if (BLE_INCLUDED == TRUE)
/* If here, features are not known yet */
- if (p_dev_rec && is_le_link)
+ if (p_dev_rec && transport == BT_TRANSPORT_LE)
{
-#if BTM_BLE_PRIVACY_SPT == TRUE
+#if BLE_PRIVACY_SPT == TRUE
btm_ble_get_acl_remote_addr (p_dev_rec, p->active_remote_addr,
&p->active_remote_addr_type);
#endif
- btm_establish_continue(p);
-#if (!defined(BTA_SKIP_BLE_READ_REMOTE_FEAT) || BTA_SKIP_BLE_READ_REMOTE_FEAT == FALSE)
- if (link_role == HCI_ROLE_MASTER)
+ if (HCI_LE_SLAVE_INIT_FEAT_EXC_SUPPORTED(btm_cb.devcb.local_le_features)
+ || link_role == HCI_ROLE_MASTER)
{
btsnd_hcic_ble_read_remote_feat(p->hci_handle);
}
-#endif
+ else
+ {
+ btm_establish_continue(p);
+ }
}
else
#endif
@@ -394,7 +362,7 @@
void btm_acl_report_role_change (UINT8 hci_status, BD_ADDR bda)
{
tBTM_ROLE_SWITCH_CMPL ref_data;
- BTM_TRACE_DEBUG0 ("btm_acl_report_role_change");
+ BTM_TRACE_DEBUG ("btm_acl_report_role_change");
if (btm_cb.devcb.p_switch_role_cb
&& (bda && (0 == memcmp(btm_cb.devcb.switch_role_ref_data.remote_bd_addr, bda, BD_ADDR_LEN))))
{
@@ -417,7 +385,7 @@
** Returns void
**
*******************************************************************************/
-void btm_acl_removed (BD_ADDR bda)
+void btm_acl_removed (BD_ADDR bda, tBT_TRANSPORT transport)
{
tACL_CONN *p;
#if (defined(BTM_BUSY_LEVEL_CHANGE_INCLUDED) && BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE)
@@ -427,8 +395,8 @@
tBTM_SEC_DEV_REC *p_dev_rec=NULL;
#endif
- BTM_TRACE_DEBUG0 ("btm_acl_removed");
- p = btm_bda_to_acl(bda);
+ BTM_TRACE_DEBUG ("btm_acl_removed");
+ p = btm_bda_to_acl(bda, transport);
if (p != (tACL_CONN *)NULL)
{
p->in_use = FALSE;
@@ -447,54 +415,61 @@
{
evt_data.event = BTM_BL_DISCN_EVT;
evt_data.discn.p_bda = bda;
-
+#if BLE_INCLUDED == TRUE
+ evt_data.discn.handle = p->hci_handle;
+ evt_data.discn.transport = p->transport;
+#endif
(*btm_cb.p_bl_changed_cb)(&evt_data);
}
btm_acl_update_busy_level (BTM_BLI_ACL_DOWN_EVT);
#else
if (btm_cb.p_acl_changed_cb)
+#if BLE_INCLUDED == TRUE
+ (*btm_cb.p_acl_changed_cb) (bda, NULL, NULL, NULL, FALSE, p->hci_handle, p->transport);
+#else
(*btm_cb.p_acl_changed_cb) (bda, NULL, NULL, NULL, FALSE);
#endif
+#endif
}
#if (defined BLE_INCLUDED && BLE_INCLUDED == TRUE)
- BTM_TRACE_DEBUG4 ("acl hci_handle=%d is_le_link=%d connectable_mode=0x%0x link_role=%d",
+ BTM_TRACE_DEBUG ("acl hci_handle=%d transport=%d connectable_mode=0x%0x link_role=%d",
p->hci_handle,
- p->is_le_link,
+ p->transport,
btm_cb.ble_ctr_cb.inq_var.connectable_mode,
p->link_role);
p_dev_rec = btm_find_dev(bda);
if ( p_dev_rec)
{
- BTM_TRACE_DEBUG1("before update p_dev_rec->sec_flags=0x%x", p_dev_rec->sec_flags);
- if (p->is_le_link)
+ BTM_TRACE_DEBUG("before update p_dev_rec->sec_flags=0x%x", p_dev_rec->sec_flags);
+ if (p->transport == BT_TRANSPORT_LE)
{
- BTM_TRACE_DEBUG0("LE link down");
- p_dev_rec->sec_flags &= ~(BTM_SEC_ENCRYPTED | BTM_SEC_ROLE_SWITCHED);
- if ( (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) == 0)
+ BTM_TRACE_DEBUG("LE link down");
+ p_dev_rec->sec_flags &= ~(BTM_SEC_LE_ENCRYPTED | BTM_SEC_ROLE_SWITCHED);
+ if ( (p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_KNOWN) == 0)
{
- BTM_TRACE_DEBUG0("Not Bonded");
- p_dev_rec->sec_flags &= ~(BTM_SEC_AUTHENTICATED | BTM_SEC_LINK_KEY_AUTHED);
+ BTM_TRACE_DEBUG("Not Bonded");
+ p_dev_rec->sec_flags &= ~(BTM_SEC_LE_LINK_KEY_AUTHED | BTM_SEC_LE_AUTHENTICATED);
}
else
{
- BTM_TRACE_DEBUG0("Bonded");
+ BTM_TRACE_DEBUG("Bonded");
}
}
else
{
- BTM_TRACE_DEBUG0("Bletooth link down");
+ BTM_TRACE_DEBUG("Bletooth link down");
p_dev_rec->sec_flags &= ~(BTM_SEC_AUTHORIZED | BTM_SEC_AUTHENTICATED
| BTM_SEC_ENCRYPTED | BTM_SEC_ROLE_SWITCHED);
}
- BTM_TRACE_DEBUG1("after update p_dev_rec->sec_flags=0x%x", p_dev_rec->sec_flags);
+ BTM_TRACE_DEBUG("after update p_dev_rec->sec_flags=0x%x", p_dev_rec->sec_flags);
}
else
{
- BTM_TRACE_ERROR0("Device not found");
+ BTM_TRACE_ERROR("Device not found");
}
#endif
@@ -518,12 +493,12 @@
{
tACL_CONN *p = &btm_cb.acl_db[0];
UINT16 xx;
- BTM_TRACE_DEBUG0 ("btm_acl_device_down");
+ BTM_TRACE_DEBUG ("btm_acl_device_down");
for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p++)
{
if (p->in_use)
{
- BTM_TRACE_DEBUG1 ("hci_handle=%d HCI_ERR_HW_FAILURE ",p->hci_handle );
+ BTM_TRACE_DEBUG ("hci_handle=%d HCI_ERR_HW_FAILURE ",p->hci_handle );
l2c_link_hci_disc_comp (p->hci_handle, HCI_ERR_HW_FAILURE);
}
}
@@ -544,46 +519,47 @@
{
tBTM_BL_UPDATE_DATA evt;
UINT8 busy_level;
- BTM_TRACE_DEBUG0 ("btm_acl_update_busy_level");
+ BTM_TRACE_DEBUG ("btm_acl_update_busy_level");
+ BOOLEAN old_inquiry_state = btm_cb.is_inquiry;
switch (event)
{
case BTM_BLI_ACL_UP_EVT:
- BTM_TRACE_DEBUG0 ("BTM_BLI_ACL_UP_EVT");
+ BTM_TRACE_DEBUG ("BTM_BLI_ACL_UP_EVT");
btm_cb.num_acl++;
break;
case BTM_BLI_ACL_DOWN_EVT:
if (btm_cb.num_acl)
{
btm_cb.num_acl--;
- BTM_TRACE_DEBUG1 ("BTM_BLI_ACL_DOWN_EVT", btm_cb.num_acl);
+ BTM_TRACE_DEBUG ("BTM_BLI_ACL_DOWN_EVT", btm_cb.num_acl);
}
else
{
- BTM_TRACE_ERROR0 ("BTM_BLI_ACL_DOWN_EVT issued, but num_acl already zero !!!");
+ BTM_TRACE_ERROR ("BTM_BLI_ACL_DOWN_EVT issued, but num_acl already zero !!!");
}
break;
case BTM_BLI_PAGE_EVT:
- BTM_TRACE_DEBUG0 ("BTM_BLI_PAGE_EVT");
+ BTM_TRACE_DEBUG ("BTM_BLI_PAGE_EVT");
btm_cb.is_paging = TRUE;
evt.busy_level_flags= BTM_BL_PAGING_STARTED;
break;
case BTM_BLI_PAGE_DONE_EVT:
- BTM_TRACE_DEBUG0 ("BTM_BLI_PAGE_DONE_EVT");
+ BTM_TRACE_DEBUG ("BTM_BLI_PAGE_DONE_EVT");
btm_cb.is_paging = FALSE;
evt.busy_level_flags = BTM_BL_PAGING_COMPLETE;
break;
case BTM_BLI_INQ_EVT:
- BTM_TRACE_DEBUG0 ("BTM_BLI_INQ_EVT");
+ BTM_TRACE_DEBUG ("BTM_BLI_INQ_EVT");
btm_cb.is_inquiry = TRUE;
evt.busy_level_flags = BTM_BL_INQUIRY_STARTED;
break;
case BTM_BLI_INQ_CANCEL_EVT:
- BTM_TRACE_DEBUG0 ("BTM_BLI_INQ_CANCEL_EVT");
+ BTM_TRACE_DEBUG ("BTM_BLI_INQ_CANCEL_EVT");
btm_cb.is_inquiry = FALSE;
evt.busy_level_flags = BTM_BL_INQUIRY_CANCELLED;
break;
case BTM_BLI_INQ_DONE_EVT:
- BTM_TRACE_DEBUG0 ("BTM_BLI_INQ_DONE_EVT");
+ BTM_TRACE_DEBUG ("BTM_BLI_INQ_DONE_EVT");
btm_cb.is_inquiry = FALSE;
evt.busy_level_flags = BTM_BL_INQUIRY_COMPLETE;
break;
@@ -594,7 +570,7 @@
else
busy_level = (UINT8)btm_cb.num_acl;
- if (busy_level != btm_cb.busy_level)
+ if ((busy_level != btm_cb.busy_level) ||(old_inquiry_state != btm_cb.is_inquiry))
{
evt.event = BTM_BL_UPDATE_EVT;
evt.busy_level = busy_level;
@@ -622,8 +598,8 @@
tBTM_STATUS BTM_GetRole (BD_ADDR remote_bd_addr, UINT8 *p_role)
{
tACL_CONN *p;
- BTM_TRACE_DEBUG0 ("BTM_GetRole");
- if ((p = btm_bda_to_acl(remote_bd_addr)) == NULL)
+ BTM_TRACE_DEBUG ("BTM_GetRole");
+ if ((p = btm_bda_to_acl(remote_bd_addr, BT_TRANSPORT_BR_EDR)) == NULL)
{
*p_role = BTM_ROLE_UNDEFINED;
return(BTM_UNKNOWN_ADDR);
@@ -667,7 +643,7 @@
#if (BT_USE_TRACES == TRUE)
BD_ADDR_PTR p_bda;
#endif
- BTM_TRACE_API6 ("BTM_SwitchRole BDA: %02x-%02x-%02x-%02x-%02x-%02x",
+ BTM_TRACE_API ("BTM_SwitchRole BDA: %02x-%02x-%02x-%02x-%02x-%02x",
remote_bd_addr[0], remote_bd_addr[1], remote_bd_addr[2],
remote_bd_addr[3], remote_bd_addr[4], remote_bd_addr[5]);
@@ -679,14 +655,14 @@
{
#if (BT_USE_TRACES == TRUE)
p_bda = btm_cb.devcb.switch_role_ref_data.remote_bd_addr;
- BTM_TRACE_DEBUG6 ("Role switch on other device is in progress 0x%02x%02x%02x%02x%02x%02x",
+ BTM_TRACE_DEBUG ("Role switch on other device is in progress 0x%02x%02x%02x%02x%02x%02x",
p_bda[0], p_bda[1], p_bda[2],
p_bda[3], p_bda[4], p_bda[5]);
#endif
return(BTM_BUSY);
}
- if ((p = btm_bda_to_acl(remote_bd_addr)) == NULL)
+ if ((p = btm_bda_to_acl(remote_bd_addr, BT_TRANSPORT_BR_EDR)) == NULL)
return(BTM_UNKNOWN_ADDR);
/* Finished if already in desired role */
@@ -704,7 +680,7 @@
/* Ignore role switch request if the previous request was not completed */
if (p->switch_role_state != BTM_ACL_SWKEY_STATE_IDLE)
{
- BTM_TRACE_DEBUG1 ("BTM_SwitchRole busy: %d",
+ BTM_TRACE_DEBUG ("BTM_SwitchRole busy: %d",
p->switch_role_state);
return(BTM_BUSY);
}
@@ -810,14 +786,14 @@
tBTM_PM_MODE pwr_mode;
tBTM_PM_PWR_MD settings;
#endif
- BTM_TRACE_DEBUG0 ("BTM_ChangeLinkKey");
- if ((p = btm_bda_to_acl(remote_bd_addr)) == NULL)
+ BTM_TRACE_DEBUG ("BTM_ChangeLinkKey");
+ if ((p = btm_bda_to_acl(remote_bd_addr, BT_TRANSPORT_BR_EDR)) == NULL)
return(BTM_UNKNOWN_ADDR);
/* Ignore change link key request if the previsous request has not completed */
if (p->change_key_state != BTM_ACL_SWKEY_STATE_IDLE)
{
- BTM_TRACE_DEBUG0 ("Link key change request declined since the previous request"
+ BTM_TRACE_DEBUG ("Link key change request declined since the previous request"
" for this device has not completed ");
return(BTM_BUSY);
}
@@ -894,7 +870,7 @@
tBTM_CHANGE_KEY_CMPL *p_data;
tACL_CONN *p;
UINT8 xx;
- BTM_TRACE_DEBUG0 ("btm_acl_link_key_change");
+ BTM_TRACE_DEBUG ("btm_acl_link_key_change");
/* Look up the connection by handle and set the current mode */
xx = btm_handle_to_acl_index(handle);
@@ -941,7 +917,7 @@
btm_cb.devcb.p_chg_link_key_cb = NULL;
}
- BTM_TRACE_ERROR2("Change Link Key Complete Event: Handle 0x%02x, HCI Status 0x%02x",
+ BTM_TRACE_ERROR("Change Link Key Complete Event: Handle 0x%02x, HCI Status 0x%02x",
handle, p_data->hci_status);
}
@@ -966,7 +942,7 @@
tBTM_BL_ROLE_CHG_DATA evt;
#endif
- BTM_TRACE_DEBUG3 ("btm_acl_encrypt_change handle=%d status=%d encr_enabl=%d",
+ BTM_TRACE_DEBUG ("btm_acl_encrypt_change handle=%d status=%d encr_enabl=%d",
handle, status, encr_enable);
xx = btm_handle_to_acl_index(handle);
/* don't assume that we can never get a bad hci_handle */
@@ -1022,7 +998,7 @@
evt.hci_status = btm_cb.devcb.switch_role_ref_data.hci_status;
(*btm_cb.p_bl_changed_cb)((tBTM_BL_EVENT_DATA *)&evt);
- BTM_TRACE_DEBUG3("Role Switch Event: new_role 0x%02x, HCI Status 0x%02x, rs_st:%d",
+ BTM_TRACE_DEBUG("Role Switch Event: new_role 0x%02x, HCI Status 0x%02x, rs_st:%d",
evt.new_role, evt.hci_status, p->switch_role_state);
}
#endif
@@ -1033,10 +1009,10 @@
{
if (p_dev_rec->rs_disc_pending == BTM_SEC_DISC_PENDING)
{
- BTM_TRACE_WARNING0("btm_acl_encrypt_change -> Issuing delayed HCI_Disconnect!!!");
+ BTM_TRACE_WARNING("btm_acl_encrypt_change -> Issuing delayed HCI_Disconnect!!!");
btsnd_hcic_disconnect(p_dev_rec->hci_handle, HCI_ERR_PEER_USER);
}
- BTM_TRACE_ERROR2("btm_acl_encrypt_change: tBTM_SEC_DEV:0x%x rs_disc_pending=%d",
+ BTM_TRACE_ERROR("btm_acl_encrypt_change: tBTM_SEC_DEV:0x%x rs_disc_pending=%d",
(UINT32)p_dev_rec, p_dev_rec->rs_disc_pending);
p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING; /* reset flag */
}
@@ -1095,8 +1071,8 @@
{
tACL_CONN *p;
UINT8 *localFeatures = BTM_ReadLocalFeatures();
- BTM_TRACE_DEBUG0 ("BTM_SetLinkPolicy");
-/* BTM_TRACE_API1 ("BTM_SetLinkPolicy: requested settings: 0x%04x", *settings ); */
+ BTM_TRACE_DEBUG ("BTM_SetLinkPolicy");
+/* BTM_TRACE_API ("BTM_SetLinkPolicy: requested settings: 0x%04x", *settings ); */
/* First, check if hold mode is supported */
if (*settings != HCI_DISABLE_ALL_LM_MODES)
@@ -1104,28 +1080,27 @@
if ( (*settings & HCI_ENABLE_MASTER_SLAVE_SWITCH) && (!HCI_SWITCH_SUPPORTED(localFeatures)) )
{
*settings &= (~HCI_ENABLE_MASTER_SLAVE_SWITCH);
- BTM_TRACE_API1 ("BTM_SetLinkPolicy switch not supported (settings: 0x%04x)", *settings );
+ BTM_TRACE_API ("BTM_SetLinkPolicy switch not supported (settings: 0x%04x)", *settings );
}
if ( (*settings & HCI_ENABLE_HOLD_MODE) && (!HCI_HOLD_MODE_SUPPORTED(localFeatures)) )
{
*settings &= (~HCI_ENABLE_HOLD_MODE);
- BTM_TRACE_API1 ("BTM_SetLinkPolicy hold not supported (settings: 0x%04x)", *settings );
+ BTM_TRACE_API ("BTM_SetLinkPolicy hold not supported (settings: 0x%04x)", *settings );
}
if ( (*settings & HCI_ENABLE_SNIFF_MODE) && (!HCI_SNIFF_MODE_SUPPORTED(localFeatures)) )
{
*settings &= (~HCI_ENABLE_SNIFF_MODE);
- BTM_TRACE_API1 ("BTM_SetLinkPolicy sniff not supported (settings: 0x%04x)", *settings );
+ BTM_TRACE_API ("BTM_SetLinkPolicy sniff not supported (settings: 0x%04x)", *settings );
}
if ( (*settings & HCI_ENABLE_PARK_MODE) && (!HCI_PARK_MODE_SUPPORTED(localFeatures)) )
{
*settings &= (~HCI_ENABLE_PARK_MODE);
- BTM_TRACE_API1 ("BTM_SetLinkPolicy park not supported (settings: 0x%04x)", *settings );
+ BTM_TRACE_API ("BTM_SetLinkPolicy park not supported (settings: 0x%04x)", *settings );
}
}
- if ((p = btm_bda_to_acl(remote_bda)) != NULL)
- return(btsnd_hcic_write_policy_set (p->hci_handle, *settings) ?
- BTM_CMD_STARTED : BTM_NO_RESOURCES);
+ if ((p = btm_bda_to_acl(remote_bda, BT_TRANSPORT_BR_EDR)) != NULL)
+ return(btsnd_hcic_write_policy_set (p->hci_handle, *settings) ? BTM_CMD_STARTED : BTM_NO_RESOURCES);
/* If here, no BD Addr found */
return(BTM_UNKNOWN_ADDR);
@@ -1145,29 +1120,29 @@
{
UINT8 *localFeatures = BTM_ReadLocalFeatures();
- BTM_TRACE_DEBUG1("BTM_SetDefaultLinkPolicy setting:0x%04x", settings);
+ BTM_TRACE_DEBUG("BTM_SetDefaultLinkPolicy setting:0x%04x", settings);
if((settings & HCI_ENABLE_MASTER_SLAVE_SWITCH) && (!HCI_SWITCH_SUPPORTED(localFeatures)))
{
settings &= ~HCI_ENABLE_MASTER_SLAVE_SWITCH;
- BTM_TRACE_DEBUG1("BTM_SetDefaultLinkPolicy switch not supported (settings: 0x%04x)", settings);
+ BTM_TRACE_DEBUG("BTM_SetDefaultLinkPolicy switch not supported (settings: 0x%04x)", settings);
}
if ((settings & HCI_ENABLE_HOLD_MODE) && (!HCI_HOLD_MODE_SUPPORTED(localFeatures)))
{
settings &= ~HCI_ENABLE_HOLD_MODE;
- BTM_TRACE_DEBUG1("BTM_SetDefaultLinkPolicy hold not supported (settings: 0x%04x)", settings);
+ BTM_TRACE_DEBUG("BTM_SetDefaultLinkPolicy hold not supported (settings: 0x%04x)", settings);
}
if ((settings & HCI_ENABLE_SNIFF_MODE) && (!HCI_SNIFF_MODE_SUPPORTED(localFeatures)))
{
settings &= ~HCI_ENABLE_SNIFF_MODE;
- BTM_TRACE_DEBUG1("BTM_SetDefaultLinkPolicy sniff not supported (settings: 0x%04x)", settings);
+ BTM_TRACE_DEBUG("BTM_SetDefaultLinkPolicy sniff not supported (settings: 0x%04x)", settings);
}
if ((settings & HCI_ENABLE_PARK_MODE) && (!HCI_PARK_MODE_SUPPORTED(localFeatures)))
{
settings &= ~HCI_ENABLE_PARK_MODE;
- BTM_TRACE_DEBUG1("BTM_SetDefaultLinkPolicy park not supported (settings: 0x%04x)", settings);
+ BTM_TRACE_DEBUG("BTM_SetDefaultLinkPolicy park not supported (settings: 0x%04x)", settings);
}
- BTM_TRACE_DEBUG1("Set DefaultLinkPolicy:0x%04x", settings);
+ BTM_TRACE_DEBUG("Set DefaultLinkPolicy:0x%04x", settings);
btm_cb.btm_def_link_policy = settings;
@@ -1191,7 +1166,7 @@
{
tACL_CONN *p;
- BTM_TRACE_API6 ("BTM_ReadLinkPolicy: RemBdAddr: %02x%02x%02x%02x%02x%02x",
+ BTM_TRACE_API ("BTM_ReadLinkPolicy: RemBdAddr: %02x%02x%02x%02x%02x%02x",
remote_bda[0], remote_bda[1], remote_bda[2],
remote_bda[3], remote_bda[4], remote_bda[5]);
@@ -1199,7 +1174,7 @@
if (btm_cb.devcb.p_rlinkp_cmpl_cb)
return(BTM_BUSY);
- p = btm_bda_to_acl(remote_bda);
+ p = btm_bda_to_acl(remote_bda, BT_TRANSPORT_BR_EDR);
if (p != (tACL_CONN *)NULL)
{
btu_start_timer (&btm_cb.devcb.rlinkp_timer, BTU_TTYPE_BTM_ACL, BTM_DEV_REPLY_TIMEOUT);
@@ -1237,7 +1212,7 @@
UINT16 handle;
tACL_CONN *p_acl_cb = &btm_cb.acl_db[0];
UINT16 index;
- BTM_TRACE_DEBUG0 ("btm_read_link_policy_complete");
+ BTM_TRACE_DEBUG ("btm_read_link_policy_complete");
btu_stop_timer (&btm_cb.devcb.rlinkp_timer);
/* If there was a callback address for read local version, call it */
@@ -1289,7 +1264,7 @@
UINT8 status;
UINT16 handle;
int xx;
- BTM_TRACE_DEBUG0 ("btm_read_remote_version_complete");
+ BTM_TRACE_DEBUG ("btm_read_remote_version_complete");
STREAM_TO_UINT8 (status, p);
if (status == HCI_SUCCESS)
{
@@ -1326,7 +1301,7 @@
tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev_by_handle (handle);
UINT8 page_idx;
- BTM_TRACE_DEBUG0 ("btm_process_remote_ext_features");
+ BTM_TRACE_DEBUG ("btm_process_remote_ext_features");
/* Make sure we have the record to save remote features information */
if (p_dev_rec == NULL)
@@ -1400,7 +1375,7 @@
p_dev_rec->sm4 = BTM_SM4_KNOWN;
}
- BTM_TRACE_API4 ("ext_features_complt page_num:%d f[0]:x%02x, sm4:%x, pend:%d",
+ BTM_TRACE_API ("ext_features_complt page_num:%d f[0]:x%02x, sm4:%x, pend:%d",
HCI_EXT_FEATURES_PAGE_1, *(p_dev_rec->features[HCI_EXT_FEATURES_PAGE_1]),
p_dev_rec->sm4, req_pend);
@@ -1415,7 +1390,7 @@
break;
default:
- BTM_TRACE_ERROR1("btm_process_remote_ext_features_page page=%d unexpected", page_idx);
+ BTM_TRACE_ERROR("btm_process_remote_ext_features_page page=%d unexpected", page_idx);
break;
}
}
@@ -1436,11 +1411,11 @@
UINT8 acl_idx;
tACL_CONN *p_acl_cb;
- BTM_TRACE_DEBUG1("btm_read_remote_features() handle: %d", handle);
+ BTM_TRACE_DEBUG("btm_read_remote_features() handle: %d", handle);
if ((acl_idx = btm_handle_to_acl_index(handle)) >= MAX_L2CAP_LINKS)
{
- BTM_TRACE_ERROR1("btm_read_remote_features handle=%d invalid", handle);
+ BTM_TRACE_ERROR("btm_read_remote_features handle=%d invalid", handle);
return;
}
@@ -1465,7 +1440,7 @@
*******************************************************************************/
void btm_read_remote_ext_features (UINT16 handle, UINT8 page_number)
{
- BTM_TRACE_DEBUG2("btm_read_remote_ext_features() handle: %d page: %d", handle, page_number);
+ BTM_TRACE_DEBUG("btm_read_remote_ext_features() handle: %d page: %d", handle, page_number);
btsnd_hcic_rmt_ext_features(handle, page_number);
}
@@ -1488,12 +1463,12 @@
UINT16 handle;
UINT8 acl_idx;
- BTM_TRACE_DEBUG0 ("btm_read_remote_features_complete");
+ BTM_TRACE_DEBUG ("btm_read_remote_features_complete");
STREAM_TO_UINT8 (status, p);
if (status != HCI_SUCCESS)
{
- BTM_TRACE_ERROR1 ("btm_read_remote_features_complete failed (status 0x%02x)", status);
+ BTM_TRACE_ERROR ("btm_read_remote_features_complete failed (status 0x%02x)", status);
return;
}
@@ -1501,7 +1476,7 @@
if ((acl_idx = btm_handle_to_acl_index(handle)) >= MAX_L2CAP_LINKS)
{
- BTM_TRACE_ERROR1("btm_read_remote_features_complete handle=%d invalid", handle);
+ BTM_TRACE_ERROR("btm_read_remote_features_complete handle=%d invalid", handle);
return;
}
@@ -1517,7 +1492,7 @@
/* if the remote controller has extended features and local controller supports
** HCI_Read_Remote_Extended_Features command then start reading these feature starting
** with extended features page 1 */
- BTM_TRACE_DEBUG0 ("Start reading remote extended features");
+ BTM_TRACE_DEBUG ("Start reading remote extended features");
btm_read_remote_ext_features(handle, HCI_EXT_FEATURES_PAGE_1);
return;
}
@@ -1547,7 +1522,7 @@
UINT16 handle;
UINT8 acl_idx;
- BTM_TRACE_DEBUG0 ("btm_read_remote_ext_features_complete");
+ BTM_TRACE_DEBUG ("btm_read_remote_ext_features_complete");
STREAM_TO_UINT8 (status, p);
STREAM_TO_UINT16 (handle, p);
@@ -1557,13 +1532,13 @@
/* Validate parameters */
if ((acl_idx = btm_handle_to_acl_index(handle)) >= MAX_L2CAP_LINKS)
{
- BTM_TRACE_ERROR1("btm_read_remote_ext_features_complete handle=%d invalid", handle);
+ BTM_TRACE_ERROR("btm_read_remote_ext_features_complete handle=%d invalid", handle);
return;
}
if (max_page > HCI_EXT_FEATURES_PAGE_MAX)
{
- BTM_TRACE_ERROR1("btm_read_remote_ext_features_complete page=%d unknown", max_page);
+ BTM_TRACE_ERROR("btm_read_remote_ext_features_complete page=%d unknown", max_page);
return;
}
@@ -1577,13 +1552,13 @@
if ((page_num < max_page) && (page_num < HCI_EXT_FEATURES_PAGE_MAX))
{
page_num++;
- BTM_TRACE_DEBUG1("BTM reads next remote extended features page (%d)", page_num);
+ BTM_TRACE_DEBUG("BTM reads next remote extended features page (%d)", page_num);
btm_read_remote_ext_features (handle, page_num);
return;
}
/* Reading of remote feature pages is complete */
- BTM_TRACE_DEBUG1("BTM reached last remote extended features page (%d)", page_num);
+ BTM_TRACE_DEBUG("BTM reached last remote extended features page (%d)", page_num);
/* Process the pages */
btm_process_remote_ext_features (p_acl_cb, (UINT8) (page_num + 1));
@@ -1607,12 +1582,12 @@
tACL_CONN *p_acl_cb;
UINT8 acl_idx;
- BTM_TRACE_WARNING2 ("btm_read_remote_ext_features_failed (status 0x%02x) for handle %d",
+ BTM_TRACE_WARNING ("btm_read_remote_ext_features_failed (status 0x%02x) for handle %d",
status, handle);
if ((acl_idx = btm_handle_to_acl_index(handle)) >= MAX_L2CAP_LINKS)
{
- BTM_TRACE_ERROR1("btm_read_remote_ext_features_failed handle=%d invalid", handle);
+ BTM_TRACE_ERROR("btm_read_remote_ext_features_failed handle=%d invalid", handle);
return;
}
@@ -1635,50 +1610,65 @@
** Returns void
**
*******************************************************************************/
-static void btm_establish_continue (tACL_CONN *p_acl_cb)
+void btm_establish_continue (tACL_CONN *p_acl_cb)
{
#if (defined(BTM_BUSY_LEVEL_CHANGE_INCLUDED) && BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE)
- tBTM_BL_EVENT_DATA evt_data;
+ tBTM_BL_EVENT_DATA evt_data;
#endif
- BTM_TRACE_DEBUG0 ("btm_establish_continue");
+ BTM_TRACE_DEBUG ("btm_establish_continue");
#if (!defined(BTM_BYPASS_EXTRA_ACL_SETUP) || BTM_BYPASS_EXTRA_ACL_SETUP == FALSE)
#if (defined BLE_INCLUDED && BLE_INCLUDED == TRUE)
- if (!p_acl_cb->is_le_link)
+ if (p_acl_cb->transport == BT_TRANSPORT_BR_EDR)
#endif
- {
- /* For now there are a some devices that do not like sending */
- /* commands events and data at the same time. */
- /* Set the packet types to the default allowed by the device */
- btm_set_packet_types (p_acl_cb, btm_cb.btm_acl_pkt_types_supported);
+ {
+ /* For now there are a some devices that do not like sending */
+ /* commands events and data at the same time. */
+ /* Set the packet types to the default allowed by the device */
+ btm_set_packet_types (p_acl_cb, btm_cb.btm_acl_pkt_types_supported);
- if (btm_cb.btm_def_link_policy)
- BTM_SetLinkPolicy (p_acl_cb->remote_addr, &btm_cb.btm_def_link_policy);
- }
+ if (btm_cb.btm_def_link_policy)
+ BTM_SetLinkPolicy (p_acl_cb->remote_addr, &btm_cb.btm_def_link_policy);
+ }
#endif
- p_acl_cb->link_up_issued = TRUE;
+ p_acl_cb->link_up_issued = TRUE;
- /* If anyone cares, tell him database changed */
+ /* If anyone cares, tell him database changed */
#if (defined(BTM_BUSY_LEVEL_CHANGE_INCLUDED) && BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE)
- if (btm_cb.p_bl_changed_cb)
- {
- evt_data.event = BTM_BL_CONN_EVT;
- evt_data.conn.p_bda = p_acl_cb->remote_addr;
- evt_data.conn.p_bdn = p_acl_cb->remote_name;
- evt_data.conn.p_dc = p_acl_cb->remote_dc;
- evt_data.conn.p_features = p_acl_cb->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0];
-
-
- (*btm_cb.p_bl_changed_cb)(&evt_data);
- }
- btm_acl_update_busy_level (BTM_BLI_ACL_UP_EVT);
-#else
- if (btm_cb.p_acl_changed_cb)
- (*btm_cb.p_acl_changed_cb) (p_acl_cb->remote_addr,
- p_acl_cb->remote_dc,
- p_acl_cb->remote_name,
- p_acl_cb->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0],
- TRUE);
+ if (btm_cb.p_bl_changed_cb)
+ {
+ evt_data.event = BTM_BL_CONN_EVT;
+ evt_data.conn.p_bda = p_acl_cb->remote_addr;
+ evt_data.conn.p_bdn = p_acl_cb->remote_name;
+ evt_data.conn.p_dc = p_acl_cb->remote_dc;
+ evt_data.conn.p_features = p_acl_cb->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0];
+#if BLE_INCLUDED == TRUE
+ evt_data.conn.handle = p_acl_cb->hci_handle;
+ evt_data.conn.transport = p_acl_cb->transport;
#endif
+
+ (*btm_cb.p_bl_changed_cb)(&evt_data);
+ }
+ btm_acl_update_busy_level (BTM_BLI_ACL_UP_EVT);
+#else
+ if (btm_cb.p_acl_changed_cb)
+#if BLE_INCLUDED == TRUE
+ (*btm_cb.p_acl_changed_cb) (p_acl_cb->remote_addr,
+ p_acl_cb->remote_dc,
+ p_acl_cb->remote_name,
+ p_acl_cb->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0],
+ TRUE,
+ p_acl_cb->hci_handle,
+ p_acl_cb->transport);
+#else
+ (*btm_cb.p_acl_changed_cb) (p_acl_cb->remote_addr,
+ p_acl_cb->remote_dc,
+ p_acl_cb->remote_name,
+ p_acl_cb->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0],
+ TRUE);
+#endif
+
+#endif
+
}
@@ -1694,7 +1684,7 @@
*******************************************************************************/
void BTM_SetDefaultLinkSuperTout (UINT16 timeout)
{
- BTM_TRACE_DEBUG0 ("BTM_SetDefaultLinkSuperTout");
+ BTM_TRACE_DEBUG ("BTM_SetDefaultLinkSuperTout");
btm_cb.btm_def_link_super_tout = timeout;
}
@@ -1709,9 +1699,9 @@
*******************************************************************************/
tBTM_STATUS BTM_GetLinkSuperTout (BD_ADDR remote_bda, UINT16 *p_timeout)
{
- tACL_CONN *p = btm_bda_to_acl(remote_bda);
+ tACL_CONN *p = btm_bda_to_acl(remote_bda, BT_TRANSPORT_BR_EDR);
- BTM_TRACE_DEBUG0 ("BTM_GetLinkSuperTout");
+ BTM_TRACE_DEBUG ("BTM_GetLinkSuperTout");
if (p != (tACL_CONN *)NULL)
{
*p_timeout = p->link_super_tout;
@@ -1733,9 +1723,9 @@
*******************************************************************************/
tBTM_STATUS BTM_SetLinkSuperTout (BD_ADDR remote_bda, UINT16 timeout)
{
- tACL_CONN *p = btm_bda_to_acl(remote_bda);
+ tACL_CONN *p = btm_bda_to_acl(remote_bda, BT_TRANSPORT_BR_EDR);
- BTM_TRACE_DEBUG0 ("BTM_SetLinkSuperTout");
+ BTM_TRACE_DEBUG ("BTM_SetLinkSuperTout");
if (p != (tACL_CONN *)NULL)
{
p->link_super_tout = timeout;
@@ -1768,7 +1758,7 @@
*******************************************************************************/
void BTM_RegForLstoEvt (tBTM_LSTO_CBACK *p_cback)
{
- BTM_TRACE_DEBUG0 ("BTM_RegForLstoEvt");
+ BTM_TRACE_DEBUG ("BTM_RegForLstoEvt");
btm_cb.p_lsto_cback = p_cback;
}
@@ -1785,7 +1775,7 @@
{
UINT8 xx;
- BTM_TRACE_DEBUG0 ("btm_proc_lsto_evt");
+ BTM_TRACE_DEBUG ("btm_proc_lsto_evt");
if (btm_cb.p_lsto_cback)
{
/* Look up the connection by handle and set the current mode */
@@ -1815,12 +1805,12 @@
{
tACL_CONN *p;
- BTM_TRACE_DEBUG0 ("BTM_SetHoldMode");
+ BTM_TRACE_DEBUG ("BTM_SetHoldMode");
/* First, check if hold mode is supported */
if (!HCI_HOLD_MODE_SUPPORTED(BTM_ReadLocalFeatures()))
return(BTM_MODE_UNSUPPORTED);
- p = btm_bda_to_acl(remote_bda);
+ p = btm_bda_to_acl(remote_bda, BT_TRANSPORT_BR_EDR);
if (p != (tACL_CONN *)NULL)
{
/* If the connection is in park or sniff mode, forget about holding it */
@@ -1853,12 +1843,12 @@
UINT16 attempt, UINT16 timeout)
{
tACL_CONN *p;
- BTM_TRACE_DEBUG0 ("BTM_SetSniffMode");
+ BTM_TRACE_DEBUG ("BTM_SetSniffMode");
/* First, check if sniff mode is supported */
if (!HCI_SNIFF_MODE_SUPPORTED(BTM_ReadLocalFeatures()))
return(BTM_MODE_UNSUPPORTED);
- p = btm_bda_to_acl(remote_bda);
+ p = btm_bda_to_acl(remote_bda, BT_TRANSPORT_BR_EDR);
if (p != (tACL_CONN *)NULL)
{
/* If the connection is in park mode, forget about sniffing it */
@@ -1892,8 +1882,8 @@
*******************************************************************************/
tBTM_STATUS BTM_CancelSniffMode (BD_ADDR remote_bda)
{
- tACL_CONN *p = btm_bda_to_acl(remote_bda);
- BTM_TRACE_DEBUG0 ("BTM_CancelSniffMode ");
+ tACL_CONN *p = btm_bda_to_acl(remote_bda, BT_TRANSPORT_BR_EDR);
+ BTM_TRACE_DEBUG ("BTM_CancelSniffMode ");
if (p == (tACL_CONN *)NULL)
return(BTM_UNKNOWN_ADDR);
@@ -1923,12 +1913,12 @@
{
tACL_CONN *p;
- BTM_TRACE_DEBUG0 ("BTM_SetParkMode");
+ BTM_TRACE_DEBUG ("BTM_SetParkMode");
/* First, check if park mode is supported */
if (!HCI_PARK_MODE_SUPPORTED(BTM_ReadLocalFeatures()))
return(BTM_MODE_UNSUPPORTED);
- p = btm_bda_to_acl(remote_bda);
+ p = btm_bda_to_acl(remote_bda, BT_TRANSPORT_BR_EDR);
if (p != (tACL_CONN *)NULL)
{
/* If the connection is in sniff mode, forget about parking it */
@@ -1965,8 +1955,8 @@
{
tACL_CONN *p;
- BTM_TRACE_DEBUG0 ("BTM_CancelParkMode");
- p = btm_bda_to_acl(remote_bda);
+ BTM_TRACE_DEBUG ("BTM_CancelParkMode");
+ p = btm_bda_to_acl(remote_bda, BT_TRANSPORT_BR_EDR);
if (p != (tACL_CONN *)NULL)
{
/* If the connection is not in park mode, cannot cancel */
@@ -1998,9 +1988,9 @@
tBTM_STATUS BTM_SetPacketTypes (BD_ADDR remote_bda, UINT16 pkt_types)
{
tACL_CONN *p;
- BTM_TRACE_DEBUG0 ("BTM_SetPacketTypes");
+ BTM_TRACE_DEBUG ("BTM_SetPacketTypes");
- if ((p = btm_bda_to_acl(remote_bda)) != NULL)
+ if ((p = btm_bda_to_acl(remote_bda, BT_TRANSPORT_BR_EDR)) != NULL)
return(btm_set_packet_types (p, pkt_types));
/* If here, no BD Addr found */
@@ -2022,8 +2012,8 @@
{
tACL_CONN *p;
- BTM_TRACE_DEBUG0 ("BTM_ReadPacketTypes");
- p = btm_bda_to_acl(remote_bda);
+ BTM_TRACE_DEBUG ("BTM_ReadPacketTypes");
+ p = btm_bda_to_acl(remote_bda, BT_TRANSPORT_BR_EDR);
if (p != (tACL_CONN *)NULL)
{
return(p->pkt_types_mask);
@@ -2059,11 +2049,11 @@
{
tACL_CONN *p;
- BTM_TRACE_API6 ("BTM_ReadAclMode: RemBdAddr: %02x%02x%02x%02x%02x%02x",
+ BTM_TRACE_API ("BTM_ReadAclMode: RemBdAddr: %02x%02x%02x%02x%02x%02x",
remote_bda[0], remote_bda[1], remote_bda[2],
remote_bda[3], remote_bda[4], remote_bda[5]);
- p = btm_bda_to_acl(remote_bda);
+ p = btm_bda_to_acl(remote_bda, BT_TRANSPORT_BR_EDR);
if (p != (tACL_CONN *)NULL)
{
*p_mode = p->mode;
@@ -2091,11 +2081,11 @@
{
tACL_CONN *p;
- BTM_TRACE_API6 ("BTM_ReadClockOffset: RemBdAddr: %02x%02x%02x%02x%02x%02x",
+ BTM_TRACE_API ("BTM_ReadClockOffset: RemBdAddr: %02x%02x%02x%02x%02x%02x",
remote_bda[0], remote_bda[1], remote_bda[2],
remote_bda[3], remote_bda[4], remote_bda[5]);
- if ( (p = btm_bda_to_acl(remote_bda)) != NULL)
+ if ( (p = btm_bda_to_acl(remote_bda, BT_TRANSPORT_BR_EDR)) != NULL)
return(p->clock_offset);
/* If here, no BD Addr found */
@@ -2112,15 +2102,15 @@
** Returns TRUE if connection is up, else FALSE.
**
*******************************************************************************/
-BOOLEAN BTM_IsAclConnectionUp (BD_ADDR remote_bda)
+BOOLEAN BTM_IsAclConnectionUp (BD_ADDR remote_bda, tBT_TRANSPORT transport)
{
tACL_CONN *p;
- BTM_TRACE_API6 ("BTM_IsAclConnectionUp: RemBdAddr: %02x%02x%02x%02x%02x%02x",
+ BTM_TRACE_API ("BTM_IsAclConnectionUp: RemBdAddr: %02x%02x%02x%02x%02x%02x",
remote_bda[0], remote_bda[1], remote_bda[2],
remote_bda[3], remote_bda[4], remote_bda[5]);
- p = btm_bda_to_acl(remote_bda);
+ p = btm_bda_to_acl(remote_bda, transport);
if (p != (tACL_CONN *)NULL)
{
return(TRUE);
@@ -2147,7 +2137,7 @@
#else
tACL_CONN *p = &btm_cb.acl_db[0];
UINT16 xx, yy;
- BTM_TRACE_DEBUG0 ("BTM_GetNumAclLinks");
+ BTM_TRACE_DEBUG ("BTM_GetNumAclLinks");
for (xx = yy = 0; xx < MAX_L2CAP_LINKS; xx++, p++)
{
if (p->in_use)
@@ -2160,6 +2150,34 @@
/*******************************************************************************
**
+** Function BTM_GetNumLeLinks
+**
+** Description This function is called to count the number of
+** LE ACL links that are active.
+**
+** Returns UINT16 Number of active LE links
+**
+*******************************************************************************/
+UINT16 BTM_GetNumLeLinks (void)
+{
+ UINT16 yy = 0;
+
+#if BLE_INCLUDED == TRUE
+ tACL_CONN *p = &btm_cb.acl_db[0];
+ UINT16 xx;
+ BTM_TRACE_DEBUG ("BTM_GetNumLeLinks");
+ for (xx = yy = 0; xx < MAX_L2CAP_LINKS; xx++, p++)
+ {
+ if ((p->in_use) &&(p->transport == BT_TRANSPORT_LE))
+ yy++;
+ }
+#endif
+
+ return(yy);
+}
+
+/*******************************************************************************
+**
** Function btm_get_acl_disc_reason_code
**
** Description This function is called to get the disconnection reason code
@@ -2171,7 +2189,7 @@
UINT16 btm_get_acl_disc_reason_code (void)
{
UINT8 res = btm_cb.acl_disc_reason;
- BTM_TRACE_DEBUG0 ("btm_get_acl_disc_reason_code");
+ BTM_TRACE_DEBUG ("btm_get_acl_disc_reason_code");
return(res);
}
@@ -2186,11 +2204,11 @@
** Returns the handle of the connection, or 0xFFFF if none.
**
*******************************************************************************/
-UINT16 BTM_GetHCIConnHandle (BD_ADDR remote_bda)
+UINT16 BTM_GetHCIConnHandle (BD_ADDR remote_bda, tBT_TRANSPORT transport)
{
tACL_CONN *p;
- BTM_TRACE_DEBUG0 ("BTM_GetHCIConnHandle");
- p = btm_bda_to_acl(remote_bda);
+ BTM_TRACE_DEBUG ("BTM_GetHCIConnHandle");
+ p = btm_bda_to_acl(remote_bda, transport);
if (p != (tACL_CONN *)NULL)
{
return(p->hci_handle);
@@ -2219,10 +2237,10 @@
{
tACL_CONN *p;
UINT8 xx;
- BTM_TRACE_DEBUG0 ("btm_process_mode_change");
+ BTM_TRACE_DEBUG ("btm_process_mode_change");
if (hci_status != HCI_SUCCESS)
{
- BTM_TRACE_WARNING1 ("BTM: HCI Mode Change Error Status: 0x%02x", hci_status);
+ BTM_TRACE_WARNING ("BTM: HCI Mode Change Error Status: 0x%02x", hci_status);
}
/* Look up the connection by handle and set the current mode */
@@ -2258,7 +2276,7 @@
void btm_process_clk_off_comp_evt (UINT16 hci_handle, UINT16 clock_offset)
{
UINT8 xx;
- BTM_TRACE_DEBUG0 ("btm_process_clk_off_comp_evt");
+ BTM_TRACE_DEBUG ("btm_process_clk_off_comp_evt");
/* Look up the connection by handle and set the current mode */
if ((xx = btm_handle_to_acl_index(hci_handle)) < MAX_L2CAP_LINKS)
btm_cb.acl_db[xx].clock_offset = clock_offset;
@@ -2280,14 +2298,14 @@
{
UINT8 *p_bda = (bd_addr) ? bd_addr :
btm_cb.devcb.switch_role_ref_data.remote_bd_addr;
- tACL_CONN *p = btm_bda_to_acl(p_bda);
+ tACL_CONN *p = btm_bda_to_acl(p_bda, BT_TRANSPORT_BR_EDR);
tBTM_ROLE_SWITCH_CMPL *p_data = &btm_cb.devcb.switch_role_ref_data;
tBTM_SEC_DEV_REC *p_dev_rec;
#if (defined(BTM_BUSY_LEVEL_CHANGE_INCLUDED) && BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE)
tBTM_BL_ROLE_CHG_DATA evt;
#endif
- BTM_TRACE_DEBUG0 ("btm_acl_role_changed");
+ BTM_TRACE_DEBUG ("btm_acl_role_changed");
/* Ignore any stray events */
if (p == NULL)
{
@@ -2306,7 +2324,7 @@
/* Update cached value */
p->link_role = new_role;
- btm_save_remote_device_role(p_bda, new_role);
+
/* Reload LSTO: link supervision timeout is reset in the LM after a role switch */
if (new_role == BTM_ROLE_MASTER)
{
@@ -2365,7 +2383,7 @@
(*btm_cb.p_bl_changed_cb)((tBTM_BL_EVENT_DATA *)&evt);
}
- BTM_TRACE_DEBUG3("Role Switch Event: new_role 0x%02x, HCI Status 0x%02x, rs_st:%d",
+ BTM_TRACE_DEBUG("Role Switch Event: new_role 0x%02x, HCI Status 0x%02x, rs_st:%d",
p_data->role, p_data->hci_status, p->switch_role_state);
#endif
@@ -2375,10 +2393,10 @@
{
if (p_dev_rec->rs_disc_pending == BTM_SEC_DISC_PENDING)
{
- BTM_TRACE_WARNING0("btm_acl_role_changed -> Issuing delayed HCI_Disconnect!!!");
+ BTM_TRACE_WARNING("btm_acl_role_changed -> Issuing delayed HCI_Disconnect!!!");
btsnd_hcic_disconnect(p_dev_rec->hci_handle, HCI_ERR_PEER_USER);
}
- BTM_TRACE_ERROR2("tBTM_SEC_DEV:0x%x rs_disc_pending=%d",
+ BTM_TRACE_ERROR("tBTM_SEC_DEV:0x%x rs_disc_pending=%d",
(UINT32)p_dev_rec, p_dev_rec->rs_disc_pending);
p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING; /* reset flag */
}
@@ -2401,7 +2419,7 @@
UINT8 BTM_AllocateSCN(void)
{
UINT8 x;
- BTM_TRACE_DEBUG0 ("BTM_AllocateSCN");
+ BTM_TRACE_DEBUG ("BTM_AllocateSCN");
// stack reserves scn 1 for HFP, HSP we still do the correct way
for (x = 1; x < BTM_MAX_SCN; x++)
@@ -2457,7 +2475,7 @@
*******************************************************************************/
BOOLEAN BTM_FreeSCN(UINT8 scn)
{
- BTM_TRACE_DEBUG0 ("BTM_FreeSCN ");
+ BTM_TRACE_DEBUG ("BTM_FreeSCN ");
if (scn <= BTM_MAX_SCN)
{
btm_cb.btm_scn[scn-1] = FALSE;
@@ -2496,7 +2514,7 @@
{
UINT32 timer_type = p_tle->param;
- BTM_TRACE_DEBUG0 ("btm_acl_timeout");
+ BTM_TRACE_DEBUG ("btm_acl_timeout");
if (timer_type == TT_DEV_RLNKP)
{
tBTM_CMPL_CB *p_cb = btm_cb.devcb.p_rlinkp_cmpl_cb;
@@ -2526,7 +2544,7 @@
tBTM_STATUS btm_set_packet_types (tACL_CONN *p, UINT16 pkt_types)
{
UINT16 temp_pkt_types;
- BTM_TRACE_DEBUG0 ("btm_set_packet_types");
+ BTM_TRACE_DEBUG ("btm_set_packet_types");
/* Save in the ACL control blocks, types that we support */
temp_pkt_types = (pkt_types & BTM_ACL_SUPPORTED_PKTS_MASK &
btm_cb.btm_acl_pkt_types_supported);
@@ -2545,7 +2563,7 @@
/* Exclude packet types not supported by the peer */
btm_acl_chk_peer_pkt_type_support (p, &temp_pkt_types);
- BTM_TRACE_DEBUG1 ("SetPacketType Mask -> 0x%04x", temp_pkt_types);
+ BTM_TRACE_DEBUG ("SetPacketType Mask -> 0x%04x", temp_pkt_types);
if (!btsnd_hcic_change_conn_type (p->hci_handle, temp_pkt_types))
{
@@ -2567,10 +2585,10 @@
*******************************************************************************/
UINT16 btm_get_max_packet_size (BD_ADDR addr)
{
- tACL_CONN *p = btm_bda_to_acl(addr);
+ tACL_CONN *p = btm_bda_to_acl(addr, BT_TRANSPORT_BR_EDR);
UINT16 pkt_types = 0;
UINT16 pkt_size = 0;
- BTM_TRACE_DEBUG0 ("btm_get_max_packet_size");
+ BTM_TRACE_DEBUG ("btm_get_max_packet_size");
if (p != NULL)
{
pkt_types = p->pkt_types_mask;
@@ -2625,8 +2643,8 @@
tBTM_STATUS BTM_ReadRemoteVersion (BD_ADDR addr, UINT8 *lmp_version,
UINT16 *manufacturer, UINT16 *lmp_sub_version)
{
- tACL_CONN *p = btm_bda_to_acl(addr);
- BTM_TRACE_DEBUG0 ("BTM_ReadRemoteVersion");
+ tACL_CONN *p = btm_bda_to_acl(addr, BT_TRANSPORT_BR_EDR);
+ BTM_TRACE_DEBUG ("BTM_ReadRemoteVersion");
if (p == NULL)
return(BTM_UNKNOWN_ADDR);
@@ -2651,8 +2669,8 @@
*******************************************************************************/
UINT8 *BTM_ReadRemoteFeatures (BD_ADDR addr)
{
- tACL_CONN *p = btm_bda_to_acl(addr);
- BTM_TRACE_DEBUG0 ("BTM_ReadRemoteFeatures");
+ tACL_CONN *p = btm_bda_to_acl(addr, BT_TRANSPORT_BR_EDR);
+ BTM_TRACE_DEBUG ("BTM_ReadRemoteFeatures");
if (p == NULL)
{
return(NULL);
@@ -2671,8 +2689,8 @@
*******************************************************************************/
UINT8 *BTM_ReadRemoteExtendedFeatures (BD_ADDR addr, UINT8 page_number)
{
- tACL_CONN *p = btm_bda_to_acl(addr);
- BTM_TRACE_DEBUG0 ("BTM_ReadRemoteExtendedFeatures");
+ tACL_CONN *p = btm_bda_to_acl(addr, BT_TRANSPORT_BR_EDR);
+ BTM_TRACE_DEBUG ("BTM_ReadRemoteExtendedFeatures");
if (p == NULL)
{
return(NULL);
@@ -2680,7 +2698,7 @@
if (page_number > HCI_EXT_FEATURES_PAGE_MAX)
{
- BTM_TRACE_ERROR1("Warning: BTM_ReadRemoteExtendedFeatures page %d unknown", page_number);
+ BTM_TRACE_ERROR("Warning: BTM_ReadRemoteExtendedFeatures page %d unknown", page_number);
return NULL;
}
@@ -2696,8 +2714,8 @@
*******************************************************************************/
UINT8 BTM_ReadNumberRemoteFeaturesPages (BD_ADDR addr)
{
- tACL_CONN *p = btm_bda_to_acl(addr);
- BTM_TRACE_DEBUG0 ("BTM_ReadNumberRemoteFeaturesPages");
+ tACL_CONN *p = btm_bda_to_acl(addr, BT_TRANSPORT_BR_EDR);
+ BTM_TRACE_DEBUG ("BTM_ReadNumberRemoteFeaturesPages");
if (p == NULL)
{
return(0);
@@ -2715,8 +2733,8 @@
*******************************************************************************/
UINT8 *BTM_ReadAllRemoteFeatures (BD_ADDR addr)
{
- tACL_CONN *p = btm_bda_to_acl(addr);
- BTM_TRACE_DEBUG0 ("BTM_ReadAllRemoteFeatures");
+ tACL_CONN *p = btm_bda_to_acl(addr, BT_TRANSPORT_BR_EDR);
+ BTM_TRACE_DEBUG ("BTM_ReadAllRemoteFeatures");
if (p == NULL)
{
return(NULL);
@@ -2739,7 +2757,7 @@
tBTM_STATUS BTM_RegBusyLevelNotif (tBTM_BL_CHANGE_CB *p_cb, UINT8 *p_level,
tBTM_BL_EVENT_MASK evt_mask)
{
- BTM_TRACE_DEBUG0 ("BTM_RegBusyLevelNotif");
+ BTM_TRACE_DEBUG ("BTM_RegBusyLevelNotif");
if (p_level)
*p_level = btm_cb.busy_level;
@@ -2765,7 +2783,7 @@
*******************************************************************************/
tBTM_STATUS BTM_AclRegisterForChanges (tBTM_ACL_DB_CHANGE_CB *p_cb)
{
- BTM_TRACE_DEBUG0 ("BTM_AclRegisterForChanges");
+ BTM_TRACE_DEBUG ("BTM_AclRegisterForChanges");
if (!p_cb)
btm_cb.p_acl_changed_cb = NULL;
else if (btm_cb.p_acl_changed_cb)
@@ -2790,7 +2808,7 @@
{
tACL_CONN *p = &btm_cb.acl_db[0];
- BTM_TRACE_API6 ("BTM_SetQoS: BdAddr: %02x%02x%02x%02x%02x%02x",
+ BTM_TRACE_API ("BTM_SetQoS: BdAddr: %02x%02x%02x%02x%02x%02x",
bd[0], bd[1], bd[2],
bd[3], bd[4], bd[5]);
@@ -2798,7 +2816,7 @@
if (btm_cb.devcb.p_qossu_cmpl_cb)
return(BTM_BUSY);
- if ( (p = btm_bda_to_acl(bd)) != NULL)
+ if ( (p = btm_bda_to_acl(bd, BT_TRANSPORT_BR_EDR)) != NULL)
{
btu_start_timer (&btm_cb.devcb.qossu_timer, BTU_TTYPE_BTM_ACL, BTM_DEV_REPLY_TIMEOUT);
btm_cb.devcb.p_qossu_cmpl_cb = p_cb;
@@ -2833,7 +2851,7 @@
{
tBTM_CMPL_CB *p_cb = btm_cb.devcb.p_qossu_cmpl_cb;
tBTM_QOS_SETUP_CMPL qossu;
- BTM_TRACE_DEBUG0 ("btm_qos_setup_complete");
+ BTM_TRACE_DEBUG ("btm_qos_setup_complete");
btu_stop_timer (&btm_cb.devcb.qossu_timer);
btm_cb.devcb.p_qossu_cmpl_cb = NULL;
@@ -2852,7 +2870,7 @@
qossu.flow.latency = p_flow->latency;
qossu.flow.delay_variation = p_flow->delay_variation;
}
- BTM_TRACE_DEBUG1 ("BTM: p_flow->delay_variation: 0x%02x",
+ BTM_TRACE_DEBUG ("BTM: p_flow->delay_variation: 0x%02x",
qossu.flow.delay_variation);
(*p_cb)(&qossu);
}
@@ -2873,8 +2891,12 @@
tBTM_STATUS BTM_ReadRSSI (BD_ADDR remote_bda, tBTM_CMPL_CB *p_cb)
{
tACL_CONN *p;
-
- BTM_TRACE_API6 ("BTM_ReadRSSI: RemBdAddr: %02x%02x%02x%02x%02x%02x",
+ tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR;
+#if BLE_INCLUDED == TRUE
+ tBT_DEVICE_TYPE dev_type;
+ tBLE_ADDR_TYPE addr_type;
+#endif
+ BTM_TRACE_API ("BTM_ReadRSSI: RemBdAddr: %02x%02x%02x%02x%02x%02x",
remote_bda[0], remote_bda[1], remote_bda[2],
remote_bda[3], remote_bda[4], remote_bda[5]);
@@ -2882,7 +2904,13 @@
if (btm_cb.devcb.p_rssi_cmpl_cb)
return(BTM_BUSY);
- p = btm_bda_to_acl(remote_bda);
+#if BLE_INCLUDED == TRUE
+ BTM_ReadDevInfo(remote_bda, &dev_type, &addr_type);
+ if (dev_type == BT_DEVICE_TYPE_BLE)
+ transport = BT_TRANSPORT_LE;
+#endif
+
+ p = btm_bda_to_acl(remote_bda, transport);
if (p != (tACL_CONN *)NULL)
{
btu_start_timer (&btm_cb.devcb.rssi_timer, BTU_TTYPE_BTM_ACL,
@@ -2919,7 +2947,7 @@
{
tACL_CONN *p;
- BTM_TRACE_API6 ("BTM_ReadLinkQuality: RemBdAddr: %02x%02x%02x%02x%02x%02x",
+ BTM_TRACE_API ("BTM_ReadLinkQuality: RemBdAddr: %02x%02x%02x%02x%02x%02x",
remote_bda[0], remote_bda[1], remote_bda[2],
remote_bda[3], remote_bda[4], remote_bda[5]);
@@ -2927,7 +2955,7 @@
if (btm_cb.devcb.p_lnk_qual_cmpl_cb)
return(BTM_BUSY);
- p = btm_bda_to_acl(remote_bda);
+ p = btm_bda_to_acl(remote_bda, BT_TRANSPORT_BR_EDR);
if (p != (tACL_CONN *)NULL)
{
btu_start_timer (&btm_cb.devcb.lnk_quality_timer, BTU_TTYPE_BTM_ACL,
@@ -2960,14 +2988,14 @@
** Returns BTM_CMD_STARTED if successfully initiated or error code
**
*******************************************************************************/
-tBTM_STATUS BTM_ReadTxPower (BD_ADDR remote_bda, tBTM_CMPL_CB *p_cb)
+tBTM_STATUS BTM_ReadTxPower (BD_ADDR remote_bda, tBT_TRANSPORT transport, tBTM_CMPL_CB *p_cb)
{
tACL_CONN *p;
BOOLEAN ret;
#define BTM_READ_RSSI_TYPE_CUR 0x00
#define BTM_READ_RSSI_TYPE_MAX 0X01
- BTM_TRACE_API6 ("BTM_ReadTxPower: RemBdAddr: %02x%02x%02x%02x%02x%02x",
+ BTM_TRACE_API ("BTM_ReadTxPower: RemBdAddr: %02x%02x%02x%02x%02x%02x",
remote_bda[0], remote_bda[1], remote_bda[2],
remote_bda[3], remote_bda[4], remote_bda[5]);
@@ -2975,7 +3003,7 @@
if (btm_cb.devcb.p_tx_power_cmpl_cb)
return(BTM_BUSY);
- p = btm_bda_to_acl(remote_bda);
+ p = btm_bda_to_acl(remote_bda, transport);
if (p != (tACL_CONN *)NULL)
{
btu_start_timer (&btm_cb.devcb.tx_power_timer, BTU_TTYPE_BTM_ACL,
@@ -2984,7 +3012,7 @@
btm_cb.devcb.p_tx_power_cmpl_cb = p_cb;
#if BLE_INCLUDED == TRUE
- if (p->is_le_link)
+ if (p->transport == BT_TRANSPORT_LE)
{
memcpy(btm_cb.devcb.read_tx_pwr_addr, remote_bda, BD_ADDR_LEN);
ret = btsnd_hcic_ble_read_adv_chnl_tx_power();
@@ -3024,7 +3052,7 @@
UINT16 handle;
tACL_CONN *p_acl_cb = &btm_cb.acl_db[0];
UINT16 index;
- BTM_TRACE_DEBUG0 ("btm_read_tx_power_complete");
+ BTM_TRACE_DEBUG ("btm_read_tx_power_complete");
btu_stop_timer (&btm_cb.devcb.tx_power_timer);
/* If there was a callback registered for read rssi, call it */
@@ -3060,7 +3088,7 @@
memcpy(results.rem_bda, btm_cb.devcb.read_tx_pwr_addr, BD_ADDR_LEN);
}
#endif
- BTM_TRACE_DEBUG2 ("BTM TX power Complete: tx_power %d, hci status 0x%02x",
+ BTM_TRACE_DEBUG ("BTM TX power Complete: tx_power %d, hci status 0x%02x",
results.tx_power, results.hci_status);
}
else
@@ -3087,7 +3115,7 @@
UINT16 handle;
tACL_CONN *p_acl_cb = &btm_cb.acl_db[0];
UINT16 index;
- BTM_TRACE_DEBUG0 ("btm_read_rssi_complete");
+ BTM_TRACE_DEBUG ("btm_read_rssi_complete");
btu_stop_timer (&btm_cb.devcb.rssi_timer);
/* If there was a callback registered for read rssi, call it */
@@ -3104,7 +3132,7 @@
STREAM_TO_UINT16 (handle, p);
STREAM_TO_UINT8 (results.rssi, p);
- BTM_TRACE_DEBUG2 ("BTM RSSI Complete: rssi %d, hci status 0x%02x",
+ BTM_TRACE_DEBUG ("BTM RSSI Complete: rssi %d, hci status 0x%02x",
results.rssi, results.hci_status);
/* Search through the list of active channels for the correct BD Addr */
@@ -3141,7 +3169,7 @@
UINT16 handle;
tACL_CONN *p_acl_cb = &btm_cb.acl_db[0];
UINT16 index;
- BTM_TRACE_DEBUG0 ("btm_read_link_quality_complete");
+ BTM_TRACE_DEBUG ("btm_read_link_quality_complete");
btu_stop_timer (&btm_cb.devcb.lnk_quality_timer);
/* If there was a callback registered for read rssi, call it */
@@ -3158,7 +3186,7 @@
STREAM_TO_UINT16 (handle, p);
STREAM_TO_UINT8 (results.link_quality, p);
- BTM_TRACE_DEBUG2 ("BTM Link Quality Complete: Link Quality %d, hci status 0x%02x",
+ BTM_TRACE_DEBUG ("BTM Link Quality Complete: Link Quality %d, hci status 0x%02x",
results.link_quality, results.hci_status);
/* Search through the list of active channels for the correct BD Addr */
@@ -3187,12 +3215,12 @@
** Returns BTM_SUCCESS if successfully initiated, otherwise BTM_NO_RESOURCES.
**
*******************************************************************************/
-tBTM_STATUS btm_remove_acl (BD_ADDR bd_addr)
+tBTM_STATUS btm_remove_acl (BD_ADDR bd_addr, tBT_TRANSPORT transport)
{
- UINT16 hci_handle = BTM_GetHCIConnHandle(bd_addr);
+ UINT16 hci_handle = BTM_GetHCIConnHandle(bd_addr, transport);
tBTM_STATUS status = BTM_SUCCESS;
- BTM_TRACE_DEBUG0 ("btm_remove_acl");
+ BTM_TRACE_DEBUG ("btm_remove_acl");
#if BTM_DISC_DURING_RS == TRUE
tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr);
@@ -3204,7 +3232,8 @@
else /* otherwise can disconnect right away */
#endif
{
- if (hci_handle != 0xFFFF)
+ if (hci_handle != 0xFFFF && p_dev_rec &&
+ p_dev_rec->sec_state!= BTM_SEC_STATE_DISCONNECTING)
{
if (!btsnd_hcic_disconnect (hci_handle, HCI_ERR_PEER_USER))
status = BTM_NO_RESOURCES;
@@ -3229,7 +3258,7 @@
*******************************************************************************/
UINT8 BTM_SetTraceLevel (UINT8 new_level)
{
- BTM_TRACE_DEBUG0 ("BTM_SetTraceLevel");
+ BTM_TRACE_DEBUG ("BTM_SetTraceLevel");
if (new_level != 0xFF)
btm_cb.trace_level = new_level;
@@ -3252,7 +3281,7 @@
{
BOOLEAN sw_ok = TRUE;
BOOLEAN chlk_ok = TRUE;
- BTM_TRACE_DEBUG0 ("btm_cont_rswitch_or_chglinkkey ");
+ BTM_TRACE_DEBUG ("btm_cont_rswitch_or_chglinkkey ");
/* Check to see if encryption needs to be turned off if pending
change of link key or role switch */
if (p->switch_role_state == BTM_ACL_SWKEY_STATE_MODE_CHANGE ||
@@ -3334,7 +3363,7 @@
BT_HDR *p_buf;
UINT8 *pp;
BD_ADDR bda;
- BTM_TRACE_DEBUG0 ("btm_acl_resubmit_page");
+ BTM_TRACE_DEBUG ("btm_acl_resubmit_page");
/* If there were other page request schedule can start the next one */
if ((p_buf = (BT_HDR *)GKI_dequeue (&btm_cb.page_queue)) != NULL)
{
@@ -3365,7 +3394,7 @@
void btm_acl_reset_paging (void)
{
BT_HDR *p;
- BTM_TRACE_DEBUG0 ("btm_acl_reset_paging");
+ BTM_TRACE_DEBUG ("btm_acl_reset_paging");
/* If we sent reset we are definitely not paging any more */
while ((p = (BT_HDR *)GKI_dequeue(&btm_cb.page_queue)) != NULL)
GKI_freebuf (p);
@@ -3382,7 +3411,7 @@
*******************************************************************************/
void btm_acl_set_discing (BOOLEAN discing)
{
- BTM_TRACE_DEBUG0 ("btm_acl_set_discing");
+ BTM_TRACE_DEBUG ("btm_acl_set_discing");
btm_cb.discing = discing;
}
@@ -3397,7 +3426,7 @@
{
tBTM_SEC_DEV_REC *p_dev_rec;
- BTM_TRACE_DEBUG4 ("btm_acl_paging discing:%d, paging:%d BDA: %06x%06x",
+ BTM_TRACE_DEBUG ("btm_acl_paging discing:%d, paging:%d BDA: %06x%06x",
btm_cb.discing, btm_cb.paging,
(bda[0]<<16) + (bda[1]<<8) + bda[2], (bda[3]<<16) + (bda[4] << 8) + bda[5]);
if (btm_cb.discing)
@@ -3409,7 +3438,7 @@
{
if (!BTM_ACL_IS_CONNECTED (bda))
{
- BTM_TRACE_DEBUG2 ("connecting_bda: %06x%06x",
+ BTM_TRACE_DEBUG ("connecting_bda: %06x%06x",
(btm_cb.connecting_bda[0]<<16) + (btm_cb.connecting_bda[1]<<8) +
btm_cb.connecting_bda[2],
(btm_cb.connecting_bda[3]<<16) + (btm_cb.connecting_bda[4] << 8) +
@@ -3458,11 +3487,16 @@
/* Report possible collision to the upper layer. */
if (btm_cb.p_bl_changed_cb)
{
- BTM_TRACE_DEBUG6 ("btm_acl_notif_conn_collision: RemBdAddr: %02x%02x%02x%02x%02x%02x",
+ BTM_TRACE_DEBUG ("btm_acl_notif_conn_collision: RemBdAddr: %02x%02x%02x%02x%02x%02x",
bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]);
evt_data.event = BTM_BL_COLLISION_EVT;
evt_data.conn.p_bda = bda;
+
+#if BLE_INCLUDED == TRUE
+ evt_data.conn.transport = BT_TRANSPORT_BR_EDR;
+ evt_data.conn.handle = BTM_INVALID_HCI_HANDLE;
+#endif
(*btm_cb.p_bl_changed_cb)(&evt_data);
return TRUE;
}
diff --git a/stack/btm/btm_ble.c b/stack/btm/btm_ble.c
index 5b61b76..58d3971 100644
--- a/stack/btm/btm_ble.c
+++ b/stack/btm/btm_ble.c
@@ -35,19 +35,17 @@
#include "btm_ble_api.h"
#include "smp_api.h"
#include "l2c_int.h"
-#if (defined BLE_BRCM_INCLUDED && BLE_BRCM_INCLUDED == TRUE)
-#include "brcm_ble.h"
-#endif
#include "gap_api.h"
#include "bt_utils.h"
+#include "vendor_ble.h"
+
#if SMP_INCLUDED == TRUE
extern BOOLEAN AES_CMAC ( BT_OCTET16 key, UINT8 *input, UINT16 length, UINT16 tlen, UINT8 *p_signature);
extern void smp_link_encrypted(BD_ADDR bda, UINT8 encr_enable);
extern BOOLEAN smp_proc_ltk_request(BD_ADDR bda);
#endif
extern void gatt_notify_enc_cmpl(BD_ADDR bd_addr);
-
/*******************************************************************************/
/* External Function to be called by other modules */
/*******************************************************************************/
@@ -74,12 +72,12 @@
UINT8 i = 0;
tBTM_INQ_INFO *p_info=NULL;
- BTM_TRACE_DEBUG1 ("BTM_SecAddBleDevice dev_type=0x%x", dev_type);
+ BTM_TRACE_DEBUG ("BTM_SecAddBleDevice dev_type=0x%x", dev_type);
p_dev_rec = btm_find_dev (bd_addr);
if (!p_dev_rec)
{
- BTM_TRACE_DEBUG0("Add a new device");
+ BTM_TRACE_DEBUG("Add a new device");
/* There is no device record, allocate one.
* If we can not find an empty spot for this one, let it fail. */
@@ -87,14 +85,15 @@
{
if (!(btm_cb.sec_dev_rec[i].sec_flags & BTM_SEC_IN_USE))
{
- BTM_TRACE_DEBUG1 ("allocate a new dev rec idx=0x%x ", i );
+ BTM_TRACE_DEBUG ("allocate a new dev rec idx=0x%x ", i );
p_dev_rec = &btm_cb.sec_dev_rec[i];
/* Mark this record as in use and initialize */
memset (p_dev_rec, 0, sizeof (tBTM_SEC_DEV_REC));
p_dev_rec->sec_flags = BTM_SEC_IN_USE;
memcpy (p_dev_rec->bd_addr, bd_addr, BD_ADDR_LEN);
- p_dev_rec->hci_handle = BTM_GetHCIConnHandle (bd_addr);
+ p_dev_rec->hci_handle = BTM_GetHCIConnHandle (bd_addr, BT_TRANSPORT_BR_EDR);
+ p_dev_rec->ble_hci_handle = BTM_GetHCIConnHandle (bd_addr, BT_TRANSPORT_LE);
/* update conn params, use default value for background connection params */
p_dev_rec->conn_params.min_conn_int =
@@ -102,7 +101,7 @@
p_dev_rec->conn_params.supervision_tout =
p_dev_rec->conn_params.slave_latency = BTM_BLE_CONN_PARAM_UNDEF;
- BTM_TRACE_DEBUG1 ("hci_handl=0x%x ", p_dev_rec->hci_handle );
+ BTM_TRACE_DEBUG ("hci_handl=0x%x ", p_dev_rec->ble_hci_handle );
break;
}
}
@@ -112,7 +111,7 @@
}
else
{
- BTM_TRACE_DEBUG0("Device already exist");
+ BTM_TRACE_DEBUG("Device already exist");
}
memset(p_dev_rec->sec_bd_name, 0, sizeof(tBTM_BD_NAME));
@@ -125,7 +124,7 @@
}
p_dev_rec->device_type = dev_type;
p_dev_rec->ble.ble_addr_type = addr_type;
- BTM_TRACE_DEBUG3 ("p_dev_rec->device_type =0x%x addr_type=0x%x sec_flags=0x%x",
+ BTM_TRACE_DEBUG ("p_dev_rec->device_type =0x%x addr_type=0x%x sec_flags=0x%x",
dev_type, addr_type, p_dev_rec->sec_flags);
/* sync up with the Inq Data base*/
@@ -134,7 +133,7 @@
{
p_info->results.ble_addr_type = p_dev_rec->ble.ble_addr_type ;
p_info->results.device_type = p_dev_rec->device_type;
- BTM_TRACE_DEBUG2 ("InqDb device_type =0x%x addr_type=0x%x",
+ BTM_TRACE_DEBUG ("InqDb device_type =0x%x addr_type=0x%x",
p_info->results.device_type, p_info->results.ble_addr_type);
}
@@ -160,21 +159,21 @@
{
#if SMP_INCLUDED == TRUE
tBTM_SEC_DEV_REC *p_dev_rec;
- BTM_TRACE_DEBUG0 ("BTM_SecAddBleKey");
+ BTM_TRACE_DEBUG ("BTM_SecAddBleKey");
p_dev_rec = btm_find_dev (bd_addr);
if (!p_dev_rec || !p_le_key ||
(key_type != BTM_LE_KEY_PENC && key_type != BTM_LE_KEY_PID &&
key_type != BTM_LE_KEY_PCSRK && key_type != BTM_LE_KEY_LENC &&
key_type != BTM_LE_KEY_LCSRK))
{
- BTM_TRACE_WARNING3 ("BTM_SecAddBleKey() Wrong Type, or No Device record \
+ BTM_TRACE_WARNING ("BTM_SecAddBleKey() Wrong Type, or No Device record \
for bdaddr: %08x%04x, Type: %d",
(bd_addr[0]<<24)+(bd_addr[1]<<16)+(bd_addr[2]<<8)+bd_addr[3],
(bd_addr[4]<<8)+bd_addr[5], key_type);
return(FALSE);
}
- BTM_TRACE_DEBUG3 ("BTM_SecAddLeKey() BDA: %08x%04x, Type: 0x%02x",
+ BTM_TRACE_DEBUG ("BTM_SecAddLeKey() BDA: %08x%04x, Type: 0x%02x",
(bd_addr[0]<<24)+(bd_addr[1]<<16)+(bd_addr[2]<<8)+bd_addr[3],
(bd_addr[4]<<8)+bd_addr[5], key_type);
@@ -206,7 +205,7 @@
void BTM_BleLoadLocalKeys(UINT8 key_type, tBTM_BLE_LOCAL_KEYS *p_key)
{
tBTM_DEVCB *p_devcb = &btm_cb.devcb;
- BTM_TRACE_DEBUG0 ("BTM_BleLoadLocalKeys");
+ BTM_TRACE_DEBUG ("BTM_BleLoadLocalKeys");
if (p_key != NULL)
{
switch (key_type)
@@ -220,7 +219,7 @@
break;
default:
- BTM_TRACE_ERROR1("unknow local key type: %d", key_type);
+ BTM_TRACE_ERROR("unknow local key type: %d", key_type);
break;
}
}
@@ -239,7 +238,7 @@
*******************************************************************************/
void BTM_GetDeviceEncRoot (BT_OCTET16 er)
{
- BTM_TRACE_DEBUG0 ("BTM_GetDeviceEncRoot");
+ BTM_TRACE_DEBUG ("BTM_GetDeviceEncRoot");
memcpy (er, btm_cb.devcb.er, BT_OCTET16_LEN);
}
@@ -257,7 +256,7 @@
*******************************************************************************/
void BTM_GetDeviceIDRoot (BT_OCTET16 irk)
{
- BTM_TRACE_DEBUG0 ("BTM_GetDeviceIDRoot ");
+ BTM_TRACE_DEBUG ("BTM_GetDeviceIDRoot ");
memcpy (irk, btm_cb.devcb.id_keys.irk, BT_OCTET16_LEN);
}
@@ -274,7 +273,7 @@
*******************************************************************************/
void BTM_GetDeviceDHK (BT_OCTET16 dhk)
{
- BTM_TRACE_DEBUG0 ("BTM_GetDeviceDHK");
+ BTM_TRACE_DEBUG ("BTM_GetDeviceDHK");
memcpy (dhk, btm_cb.devcb.id_keys.dhk, BT_OCTET16_LEN);
}
@@ -290,17 +289,17 @@
*******************************************************************************/
void BTM_ReadConnectionAddr (BD_ADDR remote_bda, BD_ADDR local_conn_addr, tBLE_ADDR_TYPE *p_addr_type)
{
- tACL_CONN *p_acl = btm_bda_to_acl(remote_bda);
+ tACL_CONN *p_acl = btm_bda_to_acl(remote_bda, BT_TRANSPORT_LE);
if (p_acl == NULL)
{
- BTM_TRACE_ERROR0("No connection exist!");
+ BTM_TRACE_ERROR("No connection exist!");
return;
}
memcpy(local_conn_addr, p_acl->conn_addr, BD_ADDR_LEN);
* p_addr_type = p_acl->conn_addr_type;
- BTM_TRACE_DEBUG2 ("BTM_ReadConnectionAddr address type: %d addr: 0x%02x",
+ BTM_TRACE_DEBUG ("BTM_ReadConnectionAddr address type: %d addr: 0x%02x",
p_acl->conn_addr_type, p_acl->conn_addr[0]);
}
@@ -316,10 +315,11 @@
*******************************************************************************/
BOOLEAN BTM_IsBleConnection (UINT16 conn_handle)
{
+#if (BLE_INCLUDED == TRUE)
UINT8 xx;
tACL_CONN *p;
- BTM_TRACE_API1 ("BTM_IsBleConnection: conn_handle: %d", conn_handle);
+ BTM_TRACE_API ("BTM_IsBleConnection: conn_handle: %d", conn_handle);
xx = btm_handle_to_acl_index (conn_handle);
if (xx >= MAX_L2CAP_LINKS)
@@ -327,7 +327,10 @@
p = &btm_cb.acl_db[xx];
- return(p->is_le_link);
+ return (p->transport == BT_TRANSPORT_LE);
+#else
+ return FALSE;
+#endif
}
/*******************************************************************************
@@ -335,27 +338,33 @@
** Function BTM_ReadRemoteConnectionAddr
**
** Description This function is read the remote device address currently used
-** .
**
-** Returns void
+** Parameters pseudo_addr: pseudo random address available
+** conn_addr:connection address used
+** p_addr_type : BD Address type, Public or Random of the address used
+**
+** Returns BOOLEAN , TRUE if connection to remote device exists, else FALSE
**
*******************************************************************************/
-BOOLEAN BTM_ReadRemoteConnectionAddr(BD_ADDR pseudo_addr, BD_ADDR conn_addr, tBLE_ADDR_TYPE *p_addr_type)
+BOOLEAN BTM_ReadRemoteConnectionAddr(BD_ADDR pseudo_addr, BD_ADDR conn_addr,
+ tBLE_ADDR_TYPE *p_addr_type)
{
- BOOLEAN st = TRUE;
- tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev(pseudo_addr);
-#if BTM_BLE_PRIVACY_SPT == TRUE
- tACL_CONN *p = btm_bda_to_acl (pseudo_addr);
+ BOOLEAN st = TRUE;
+#if (BLE_PRIVACY_SPT == TRUE)
+ tACL_CONN *p = btm_bda_to_acl (pseudo_addr, BT_TRANSPORT_LE);
if (p == NULL)
{
- BTM_TRACE_ERROR0("BTM_ReadRemoteConnectionAddr can not find matching address");
+ BTM_TRACE_ERROR("BTM_ReadRemoteConnectionAddr can not find connection"
+ " with matching address");
return FALSE;
}
memcpy(conn_addr, p->active_remote_addr, BD_ADDR_LEN);
*p_addr_type = p->active_remote_addr_type;
#else
+ tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev(pseudo_addr);
+
memcpy(conn_addr, pseudo_addr, BD_ADDR_LEN);
if (p_dev_rec != NULL)
{
@@ -363,6 +372,7 @@
}
#endif
return st;
+
}
/*******************************************************************************
**
@@ -381,7 +391,7 @@
{
#if SMP_INCLUDED == TRUE
tSMP_STATUS res_smp = (res == BTM_SUCCESS) ? SMP_SUCCESS : SMP_REPEATED_ATTEMPTS;
- BTM_TRACE_DEBUG0 ("BTM_SecurityGrant");
+ BTM_TRACE_DEBUG ("BTM_SecurityGrant");
SMP_SecurityGrant(bd_addr, res_smp);
#endif
}
@@ -408,12 +418,12 @@
if (p_dev_rec == NULL)
{
- BTM_TRACE_ERROR0("Passkey reply to Unknown device");
+ BTM_TRACE_ERROR("Passkey reply to Unknown device");
return;
}
- p_dev_rec->sec_flags |= BTM_SEC_LINK_KEY_AUTHED;
- BTM_TRACE_DEBUG0 ("BTM_BlePasskeyReply");
+ p_dev_rec->sec_flags |= BTM_SEC_LE_LINK_KEY_AUTHED;
+ BTM_TRACE_DEBUG ("BTM_BlePasskeyReply");
SMP_PasskeyReply(bd_addr, res_smp, passkey);
#endif
}
@@ -436,15 +446,15 @@
tSMP_STATUS res_smp = (res == BTM_SUCCESS) ? SMP_SUCCESS : SMP_OOB_FAIL;
tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr);
- BTM_TRACE_DEBUG0 ("BTM_BleOobDataReply");
+ BTM_TRACE_DEBUG ("BTM_BleOobDataReply");
if (p_dev_rec == NULL)
{
- BTM_TRACE_ERROR0("BTM_BleOobDataReply() to Unknown device");
+ BTM_TRACE_ERROR("BTM_BleOobDataReply() to Unknown device");
return;
}
- p_dev_rec->sec_flags |= BTM_SEC_LINK_KEY_AUTHED;
+ p_dev_rec->sec_flags |= BTM_SEC_LE_LINK_KEY_AUTHED;
SMP_OobDataReply(bd_addr, res_smp, len, p_data);
#endif
}
@@ -491,7 +501,7 @@
}
else
{
- BTM_TRACE_ERROR0("Illegal Connection Scan Parameters");
+ BTM_TRACE_ERROR("Illegal Connection Scan Parameters");
}
#endif
}
@@ -519,7 +529,7 @@
{
tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr);
- BTM_TRACE_API4 ("BTM_BleSetPrefConnParams min: %u max: %u latency: %u \
+ BTM_TRACE_API ("BTM_BleSetPrefConnParams min: %u max: %u latency: %u \
tout: %u",
min_conn_int, max_conn_int, slave_latency, supervision_tout);
@@ -551,19 +561,19 @@
if (supervision_tout != BTM_BLE_CONN_PARAM_UNDEF)
p_dev_rec->conn_params.supervision_tout = supervision_tout;
else
- p_dev_rec->conn_params.slave_latency = BTM_BLE_CONN_TIMEOUT_DEF;
+ p_dev_rec->conn_params.supervision_tout = BTM_BLE_CONN_TIMEOUT_DEF;
}
}
else
{
- BTM_TRACE_ERROR0("Unknown Device, setting rejected");
+ BTM_TRACE_ERROR("Unknown Device, setting rejected");
}
}
else
{
- BTM_TRACE_ERROR0("Illegal Connection Parameters");
+ BTM_TRACE_ERROR("Illegal Connection Parameters");
}
}
@@ -596,7 +606,7 @@
*p_addr_type = p_inq_info->results.ble_addr_type;
} else {
/* unknown device, assume BR/EDR */
- BTM_TRACE_DEBUG0 ("btm_find_dev_type - unknown device, BR/EDR assumed");
+ BTM_TRACE_DEBUG ("btm_find_dev_type - unknown device, BR/EDR assumed");
}
}
else /* there is a security device record exisitng */
@@ -612,7 +622,7 @@
}
- BTM_TRACE_DEBUG2 ("btm_find_dev_type - device_type = %d addr_type = %d", *p_dev_type , *p_addr_type);
+ BTM_TRACE_DEBUG ("btm_find_dev_type - device_type = %d addr_type = %d", *p_dev_type , *p_addr_type);
}
/*******************************************************************************
@@ -631,7 +641,7 @@
if (btsnd_hcic_ble_receiver_test(rx_freq) == FALSE)
{
- BTM_TRACE_ERROR1("%s: Unable to Trigger LE receiver test", __FUNCTION__);
+ BTM_TRACE_ERROR("%s: Unable to Trigger LE receiver test", __FUNCTION__);
}
}
@@ -653,7 +663,7 @@
btm_cb.devcb.p_le_test_cmd_cmpl_cb = p_cmd_cmpl_cback;
if (btsnd_hcic_ble_transmitter_test(tx_freq, test_data_len, packet_payload) == FALSE)
{
- BTM_TRACE_ERROR1("%s: Unable to Trigger LE transmitter test", __FUNCTION__);
+ BTM_TRACE_ERROR("%s: Unable to Trigger LE transmitter test", __FUNCTION__);
}
}
@@ -672,7 +682,7 @@
if (btsnd_hcic_ble_test_end() == FALSE)
{
- BTM_TRACE_ERROR1("%s: Unable to End the LE TX/RX test", __FUNCTION__);
+ BTM_TRACE_ERROR("%s: Unable to End the LE TX/RX test", __FUNCTION__);
}
}
@@ -694,24 +704,6 @@
/*******************************************************************************
**
-** Function BTM_IsBleLink
-**
-** Description This function is to check the link type is BLE or BR/EDR.
-**
-** Returns TRUE if BLE link; FALSE if BR/EDR.
-**
-*******************************************************************************/
-BOOLEAN BTM_IsBleLink (BD_ADDR bd_addr)
-{
- tACL_CONN *p;
- BTM_TRACE_DEBUG0 ("BTM_IsBleLink");
- if ((p = btm_bda_to_acl(bd_addr)) != NULL)
- return p->is_le_link;
- else
- return FALSE;
-}
-/*******************************************************************************
-**
** Function BTM_UseLeLink
**
** Description This function is to select the underneath physical link to use.
@@ -726,9 +718,13 @@
tBLE_ADDR_TYPE addr_type;
BOOLEAN use_le = FALSE;
- if ((p = btm_bda_to_acl(bd_addr)) != NULL)
+ if ((p = btm_bda_to_acl(bd_addr, BT_TRANSPORT_BR_EDR)) != NULL)
{
- use_le = (p->is_le_link);
+ return use_le;
+ }
+ else if ((p = btm_bda_to_acl(bd_addr, BT_TRANSPORT_LE)) != NULL)
+ {
+ use_le = TRUE;
}
else
{
@@ -753,7 +749,7 @@
tBTM_RAND_ENC params;
UINT8 *p_dest = params.param_buf;
- BTM_TRACE_DEBUG0 ("btm_ble_rand_enc_complete");
+ BTM_TRACE_DEBUG ("btm_ble_rand_enc_complete");
memset(¶ms, 0, sizeof(tBTM_RAND_ENC));
@@ -794,7 +790,7 @@
{
tBTM_SEC_DEV_REC *p_dev_rec;
- BTM_TRACE_DEBUG1 ("btm_ble_increment_sign_ctr is_local=%d", is_local);
+ BTM_TRACE_DEBUG ("btm_ble_increment_sign_ctr is_local=%d", is_local);
if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL)
{
@@ -802,7 +798,7 @@
p_dev_rec->ble.keys.local_counter++;
else
p_dev_rec->ble.keys.counter++;
- BTM_TRACE_DEBUG3 ("is_local=%d local sign counter=%d peer sign counter=%d",
+ BTM_TRACE_DEBUG ("is_local=%d local sign counter=%d peer sign counter=%d",
is_local,
p_dev_rec->ble.keys.local_counter,
p_dev_rec->ble.keys.counter);
@@ -823,7 +819,7 @@
{
tBTM_SEC_DEV_REC *p_dev_rec;
- BTM_TRACE_DEBUG0 ("btm_ble_get_enc_key_type");
+ BTM_TRACE_DEBUG ("btm_ble_get_enc_key_type");
if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL)
{
@@ -845,13 +841,14 @@
{
tBTM_SEC_DEV_REC *p_dev_rec;
BOOLEAN status = FALSE;
- BTM_TRACE_DEBUG0 ("btm_get_local_div");
+ BTM_TRACE_DEBUG ("btm_get_local_div");
- BTM_TRACE_DEBUG6("bd_addr:%02x-%02x-%02x-%02x-%02x-%02x",
+ BTM_TRACE_DEBUG("bd_addr:%02x-%02x-%02x-%02x-%02x-%02x",
bd_addr[0],bd_addr[1],
bd_addr[2],bd_addr[3],
bd_addr[4],bd_addr[5]);
+ *p_div = 0;
p_dev_rec = btm_find_dev (bd_addr);
if (p_dev_rec && p_dev_rec->ble.keys.div)
@@ -859,7 +856,7 @@
status = TRUE;
*p_div = p_dev_rec->ble.keys.div;
}
- BTM_TRACE_DEBUG2 ("btm_get_local_div status=%d (1-OK) DIV=0x%x", status, *p_div);
+ BTM_TRACE_DEBUG ("btm_get_local_div status=%d (1-OK) DIV=0x%x", status, *p_div);
return status;
}
@@ -883,10 +880,10 @@
tBTM_LE_EVT_DATA cb_data;
UINT8 i;
- BTM_TRACE_DEBUG2 ("btm_sec_save_le_key key_type=0x%x pass_to_application=%d",key_type, pass_to_application);
+ BTM_TRACE_DEBUG ("btm_sec_save_le_key key_type=0x%x pass_to_application=%d",key_type, pass_to_application);
/* Store the updated key in the device database */
- BTM_TRACE_DEBUG6("bd_addr:%02x-%02x-%02x-%02x-%02x-%02x",
+ BTM_TRACE_DEBUG("bd_addr:%02x-%02x-%02x-%02x-%02x-%02x",
bd_addr[0],bd_addr[1],
bd_addr[2],bd_addr[3],
bd_addr[4],bd_addr[5]);
@@ -902,12 +899,12 @@
p_rec->ble.keys.ediv = p_keys->penc_key.ediv;
p_rec->ble.keys.key_size = p_keys->penc_key.key_size;
p_rec->ble.key_type |= BTM_LE_KEY_PENC;
- p_rec->sec_flags |= BTM_SEC_LINK_KEY_KNOWN;
+ p_rec->sec_flags |= BTM_SEC_LE_LINK_KEY_KNOWN;
if (p_keys->penc_key.sec_level == SMP_SEC_AUTHENTICATED)
- p_rec->sec_flags |= BTM_SEC_LINK_KEY_AUTHED;
+ p_rec->sec_flags |= BTM_SEC_LE_LINK_KEY_AUTHED;
else
- p_rec->sec_flags &= ~BTM_SEC_LINK_KEY_AUTHED;
- BTM_TRACE_DEBUG3("BTM_LE_KEY_PENC key_type=0x%x sec_flags=0x%x sec_leve=0x%x",
+ p_rec->sec_flags &= ~BTM_SEC_LE_LINK_KEY_AUTHED;
+ BTM_TRACE_DEBUG("BTM_LE_KEY_PENC key_type=0x%x sec_flags=0x%x sec_leve=0x%x",
p_rec->ble.key_type,
p_rec->sec_flags,
p_rec->ble.keys.sec_level);
@@ -923,7 +920,7 @@
memcpy(p_rec->ble.static_addr, p_keys->pid_key.static_addr, BD_ADDR_LEN);
p_rec->ble.static_addr_type = p_keys->pid_key.addr_type;
p_rec->ble.key_type |= BTM_LE_KEY_PID;
- BTM_TRACE_DEBUG1("BTM_LE_KEY_PID key_type=0x%x save peer IRK", p_rec->ble.key_type);
+ BTM_TRACE_DEBUG("BTM_LE_KEY_PID key_type=0x%x save peer IRK", p_rec->ble.key_type);
break;
case BTM_LE_KEY_PCSRK:
@@ -931,13 +928,13 @@
p_rec->ble.keys.srk_sec_level = p_keys->pcsrk_key.sec_level;
p_rec->ble.keys.counter = p_keys->pcsrk_key.counter;
p_rec->ble.key_type |= BTM_LE_KEY_PCSRK;
- p_rec->sec_flags |= BTM_SEC_LINK_KEY_KNOWN;
+ p_rec->sec_flags |= BTM_SEC_LE_LINK_KEY_KNOWN;
if ( p_keys->pcsrk_key.sec_level== SMP_SEC_AUTHENTICATED)
- p_rec->sec_flags |= BTM_SEC_LINK_KEY_AUTHED;
+ p_rec->sec_flags |= BTM_SEC_LE_LINK_KEY_AUTHED;
else
- p_rec->sec_flags &= ~BTM_SEC_LINK_KEY_AUTHED;
+ p_rec->sec_flags &= ~BTM_SEC_LE_LINK_KEY_AUTHED;
- BTM_TRACE_DEBUG4("BTM_LE_KEY_PCSRK key_type=0x%x sec_flags=0x%x sec_level=0x%x peer_counter=%d",
+ BTM_TRACE_DEBUG("BTM_LE_KEY_PCSRK key_type=0x%x sec_flags=0x%x sec_level=0x%x peer_counter=%d",
p_rec->ble.key_type,
p_rec->sec_flags,
p_rec->ble.keys.srk_sec_level,
@@ -950,7 +947,7 @@
p_rec->ble.keys.key_size = p_keys->lenc_key.key_size;
p_rec->ble.key_type |= BTM_LE_KEY_LENC;
- BTM_TRACE_DEBUG4("BTM_LE_KEY_LENC key_type=0x%x DIV=0x%x key_size=0x%x sec_level=0x%x",
+ BTM_TRACE_DEBUG("BTM_LE_KEY_LENC key_type=0x%x DIV=0x%x key_size=0x%x sec_level=0x%x",
p_rec->ble.key_type,
p_rec->ble.keys.div,
p_rec->ble.keys.key_size,
@@ -962,7 +959,7 @@
p_rec->ble.keys.local_csrk_sec_level = p_keys->lcsrk_key.sec_level;
p_rec->ble.keys.local_counter = p_keys->lcsrk_key.counter;
p_rec->ble.key_type |= BTM_LE_KEY_LCSRK;
- BTM_TRACE_DEBUG4("BTM_LE_KEY_LCSRK key_type=0x%x DIV=0x%x scrk_sec_level=0x%x local_counter=%d",
+ BTM_TRACE_DEBUG("BTM_LE_KEY_LCSRK key_type=0x%x DIV=0x%x scrk_sec_level=0x%x local_counter=%d",
p_rec->ble.key_type,
p_rec->ble.keys.div,
p_rec->ble.keys.local_csrk_sec_level,
@@ -970,11 +967,11 @@
break;
default:
- BTM_TRACE_WARNING1("btm_sec_save_le_key (Bad key_type 0x%02x)", key_type);
+ BTM_TRACE_WARNING("btm_sec_save_le_key (Bad key_type 0x%02x)", key_type);
return;
}
- BTM_TRACE_DEBUG3 ("BLE key type 0x%02x updated for BDA: %08x%04x (btm_sec_save_le_key)", key_type,
+ BTM_TRACE_DEBUG ("BLE key type 0x%02x updated for BDA: %08x%04x (btm_sec_save_le_key)", key_type,
(bd_addr[0]<<24)+(bd_addr[1]<<16)+(bd_addr[2]<<8)+bd_addr[3],
(bd_addr[4]<<8)+bd_addr[5]);
@@ -989,13 +986,13 @@
return;
}
- BTM_TRACE_WARNING3 ("BLE key type 0x%02x called for Unknown BDA or type: %08x%04x !! (btm_sec_save_le_key)", key_type,
+ BTM_TRACE_WARNING ("BLE key type 0x%02x called for Unknown BDA or type: %08x%04x !! (btm_sec_save_le_key)", key_type,
(bd_addr[0]<<24)+(bd_addr[1]<<16)+(bd_addr[2]<<8)+bd_addr[3],
(bd_addr[4]<<8)+bd_addr[5]);
if (p_rec)
{
- BTM_TRACE_DEBUG1 ("sec_flags=0x%x", p_rec->sec_flags);
+ BTM_TRACE_DEBUG ("sec_flags=0x%x", p_rec->sec_flags);
}
}
@@ -1012,7 +1009,7 @@
{
tBTM_SEC_DEV_REC *p_rec;
- BTM_TRACE_DEBUG1("btm_ble_update_sec_key_size enc_key_size = %d", enc_key_size);
+ BTM_TRACE_DEBUG("btm_ble_update_sec_key_size enc_key_size = %d", enc_key_size);
if ((p_rec = btm_find_dev (bd_addr)) != NULL )
{
@@ -1055,11 +1052,11 @@
tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr);
UINT8 req_sec_level = BTM_LE_SEC_NONE, cur_sec_level = BTM_LE_SEC_NONE;
- BTM_TRACE_DEBUG1 ("btm_ble_link_sec_check auth_req =0x%x", auth_req);
+ BTM_TRACE_DEBUG ("btm_ble_link_sec_check auth_req =0x%x", auth_req);
if (p_dev_rec == NULL)
{
- BTM_TRACE_ERROR0 ("btm_ble_link_sec_check received for unknown device");
+ BTM_TRACE_ERROR ("btm_ble_link_sec_check received for unknown device");
return;
}
@@ -1078,12 +1075,12 @@
req_sec_level = BTM_LE_SEC_AUTHENTICATED;
}
- BTM_TRACE_DEBUG1 ("dev_rec sec_flags=0x%x", p_dev_rec->sec_flags);
+ BTM_TRACE_DEBUG ("dev_rec sec_flags=0x%x", p_dev_rec->sec_flags);
/* currently encrpted */
- if (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED)
+ if (p_dev_rec->sec_flags & BTM_SEC_LE_ENCRYPTED)
{
- if (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED)
+ if (p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_AUTHED)
cur_sec_level = BTM_LE_SEC_AUTHENTICATED;
else
cur_sec_level = BTM_LE_SEC_UNAUTHENTICATE;
@@ -1120,7 +1117,7 @@
}
}
- BTM_TRACE_DEBUG3("cur_sec_level=%d req_sec_level=%d sec_req_act=%d",
+ BTM_TRACE_DEBUG("cur_sec_level=%d req_sec_level=%d sec_req_act=%d",
cur_sec_level,
req_sec_level,
*p_sec_req_act);
@@ -1148,11 +1145,11 @@
if (p_rec == NULL)
{
- BTM_TRACE_WARNING1 ("btm_ble_set_encryption (NULL device record!! sec_act=0x%x", sec_act);
+ BTM_TRACE_WARNING ("btm_ble_set_encryption (NULL device record!! sec_act=0x%x", sec_act);
return(BTM_WRONG_MODE);
}
- BTM_TRACE_DEBUG2 ("btm_ble_set_encryption sec_act=0x%x role_master=%d", sec_act, p_rec->role_master);
+ BTM_TRACE_DEBUG ("btm_ble_set_encryption sec_act=0x%x role_master=%d", sec_act, p_rec->role_master);
if (sec_act == BTM_BLE_SEC_ENCRYPT_MITM)
{
@@ -1165,7 +1162,7 @@
if (link_role == BTM_ROLE_MASTER)
{
if(p_rec->sec_state == BTM_SEC_STATE_ENCRYPTING) {
- BTM_TRACE_DEBUG0 ("State is already encrypting::");
+ BTM_TRACE_DEBUG ("State is already encrypting::");
cmd = BTM_CMD_STARTED;
}
else {
@@ -1191,7 +1188,7 @@
break;
default:
- cmd = BTM_SUCCESS;
+ cmd = BTM_WRONG_MODE;
break;
}
return cmd;
@@ -1214,7 +1211,7 @@
tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev_by_handle (handle);
BT_OCTET8 dummy_stk = {0};
- BTM_TRACE_DEBUG0 ("btm_ble_ltk_request");
+ BTM_TRACE_DEBUG ("btm_ble_ltk_request");
p_cb->ediv = ediv;
@@ -1235,40 +1232,48 @@
** Description This function is called to start LE encryption.
**
**
-** Returns void
+** Returns BTM_SUCCESS if encryption was started successfully
**
*******************************************************************************/
-BOOLEAN btm_ble_start_encrypt(BD_ADDR bda, BOOLEAN use_stk, BT_OCTET16 stk)
+tBTM_STATUS btm_ble_start_encrypt(BD_ADDR bda, BOOLEAN use_stk, BT_OCTET16 stk)
{
tBTM_CB *p_cb = &btm_cb;
tBTM_SEC_DEV_REC *p_rec = btm_find_dev (bda);
BT_OCTET8 dummy_rand = {0};
- BOOLEAN rt = FALSE;
+ tBTM_STATUS rt = BTM_NO_RESOURCES;
- BTM_TRACE_DEBUG0 ("btm_ble_start_encrypt");
+ BTM_TRACE_DEBUG ("btm_ble_start_encrypt");
- if (!p_rec ||
- (p_rec && p_rec->sec_state == BTM_SEC_STATE_ENCRYPTING))
- return FALSE;
+ if (!p_rec )
+ {
+ BTM_TRACE_ERROR("Link is not active, can not encrypt!");
+ return BTM_WRONG_MODE;
+ }
- p_cb->enc_handle = p_rec->hci_handle;
+ if (p_rec->sec_state == BTM_SEC_STATE_ENCRYPTING)
+ {
+ BTM_TRACE_WARNING("Link Encryption is active, Busy!");
+ return BTM_BUSY;
+ }
+
+ p_cb->enc_handle = p_rec->ble_hci_handle;
if (use_stk)
{
- if (btsnd_hcic_ble_start_enc(p_rec->hci_handle, dummy_rand, 0, stk))
- rt = TRUE;
+ if (btsnd_hcic_ble_start_enc(p_rec->ble_hci_handle, dummy_rand, 0, stk))
+ rt = BTM_CMD_STARTED;
}
else if (p_rec->ble.key_type & BTM_LE_KEY_PENC)
{
- if (btsnd_hcic_ble_start_enc(p_rec->hci_handle, p_rec->ble.keys.rand,
+ if (btsnd_hcic_ble_start_enc(p_rec->ble_hci_handle, p_rec->ble.keys.rand,
p_rec->ble.keys.ediv, p_rec->ble.keys.ltk))
- rt = TRUE;
+ rt = BTM_CMD_STARTED;
}
else
{
- BTM_TRACE_ERROR0("No key available to encrypt the link");
+ BTM_TRACE_ERROR("No key available to encrypt the link");
}
- if (rt)
+ if (rt == BTM_CMD_STARTED)
{
if (p_rec->sec_state == BTM_SEC_STATE_IDLE)
p_rec->sec_state = BTM_SEC_STATE_ENCRYPTING;
@@ -1293,17 +1298,17 @@
if (!p_dev_rec)
{
- BTM_TRACE_WARNING1 ("btm_ble_link_encrypted (No Device Found!) encr_enable=%d", encr_enable);
+ BTM_TRACE_WARNING ("btm_ble_link_encrypted (No Device Found!) encr_enable=%d", encr_enable);
return;
}
- BTM_TRACE_DEBUG1 ("btm_ble_link_encrypted encr_enable=%d", encr_enable);
+ BTM_TRACE_DEBUG ("btm_ble_link_encrypted encr_enable=%d", encr_enable);
enc_cback = (p_dev_rec->sec_state == BTM_SEC_STATE_ENCRYPTING);
smp_link_encrypted(bd_addr, encr_enable);
- BTM_TRACE_DEBUG1(" p_dev_rec->sec_flags=0x%x", p_dev_rec->sec_flags);
+ BTM_TRACE_DEBUG(" p_dev_rec->sec_flags=0x%x", p_dev_rec->sec_flags);
if (encr_enable && p_dev_rec->enc_key_size == 0)
p_dev_rec->enc_key_size = p_dev_rec->ble.keys.key_size;
@@ -1312,9 +1317,9 @@
if (p_dev_rec->p_callback && enc_cback)
{
if (encr_enable)
- btm_sec_dev_rec_cback_event(p_dev_rec, BTM_SUCCESS);
+ btm_sec_dev_rec_cback_event(p_dev_rec, BTM_SUCCESS, TRUE);
else if (p_dev_rec->role_master)
- btm_sec_dev_rec_cback_event(p_dev_rec, BTM_ERR_PROCESSING);
+ btm_sec_dev_rec_cback_event(p_dev_rec, BTM_ERR_PROCESSING, TRUE);
}
/* to notify GATT to send data if any request is pending */
@@ -1328,7 +1333,7 @@
static void btm_enc_proc_ltk(tSMP_ENC *p)
{
UINT8 i;
- BTM_TRACE_DEBUG0 ("btm_enc_proc_ltk");
+ BTM_TRACE_DEBUG ("btm_enc_proc_ltk");
if (p && p->param_len == BT_OCTET16_LEN)
{
for (i = 0; i < (BT_OCTET16_LEN - btm_cb.key_size); i ++)
@@ -1349,7 +1354,7 @@
tSMP_ENC output;
tBTM_SEC_DEV_REC *p_dev_rec;
- BTM_TRACE_DEBUG0 ("btm_enc_proc_slave_y");
+ BTM_TRACE_DEBUG ("btm_enc_proc_slave_y");
if (p != NULL)
{
STREAM_TO_UINT16(y, pp);
@@ -1360,14 +1365,14 @@
if ( p_dev_rec &&
p_dev_rec->ble.keys.div == div )
{
- BTM_TRACE_DEBUG0 ("LTK request OK");
+ BTM_TRACE_DEBUG ("LTK request OK");
/* calculating LTK , LTK = E er(div) */
SMP_Encrypt(p_cb->devcb.er, BT_OCTET16_LEN, (UINT8 *)&div, 2, &output);
btm_enc_proc_ltk(&output);
}
else
{
- BTM_TRACE_DEBUG0 ("LTK request failed - send negative reply");
+ BTM_TRACE_DEBUG ("LTK request failed - send negative reply");
btsnd_hcic_ble_ltk_req_neg_reply(p_cb->enc_handle);
if (p_dev_rec)
btm_ble_link_encrypted(p_dev_rec->bd_addr, 0);
@@ -1394,15 +1399,15 @@
if (p_rec == NULL)
{
- BTM_TRACE_ERROR0("btm_ble_ltk_request_reply received for unknown device");
+ BTM_TRACE_ERROR("btm_ble_ltk_request_reply received for unknown device");
return;
}
- BTM_TRACE_DEBUG0 ("btm_ble_ltk_request_reply");
- p_cb->enc_handle = p_rec->hci_handle;
+ BTM_TRACE_DEBUG ("btm_ble_ltk_request_reply");
+ p_cb->enc_handle = p_rec->ble_hci_handle;
p_cb->key_size = p_rec->ble.keys.key_size;
- BTM_TRACE_ERROR1("key size = %d", p_rec->ble.keys.key_size);
+ BTM_TRACE_ERROR("key size = %d", p_rec->ble.keys.key_size);
if (use_stk)
{
btsnd_hcic_ble_ltk_req_reply(btm_cb.enc_handle, stk);
@@ -1428,7 +1433,7 @@
UINT8 btm_ble_io_capabilities_req(tBTM_SEC_DEV_REC *p_dev_rec, tBTM_LE_IO_REQ *p_data)
{
UINT8 callback_rc = BTM_SUCCESS;
- BTM_TRACE_DEBUG0 ("btm_ble_io_capabilities_req");
+ BTM_TRACE_DEBUG ("btm_ble_io_capabilities_req");
if (btm_cb.api.p_le_callback)
{
/* the callback function implementation may change the IO capability... */
@@ -1440,11 +1445,25 @@
if (callback_rc == BTM_SUCCESS)
#endif
{
+#if BTM_BLE_CONFORMANCE_TESTING == TRUE
+ if (btm_cb.devcb.keep_rfu_in_auth_req)
+ {
+ BTM_TRACE_DEBUG ("btm_ble_io_capabilities_req keep_rfu_in_auth_req = %u",
+ btm_cb.devcb.keep_rfu_in_auth_req);
+ p_data->auth_req &= BTM_LE_AUTH_REQ_MASK_KEEP_RFU;
+ btm_cb.devcb.keep_rfu_in_auth_req = FALSE;
+ }
+ else
+ { /* default */
+ p_data->auth_req &= BTM_LE_AUTH_REQ_MASK;
+ }
+#else
p_data->auth_req &= BTM_LE_AUTH_REQ_MASK;
+#endif
- BTM_TRACE_DEBUG2 ("btm_ble_io_capabilities_req 1: p_dev_rec->security_required = %d auth_req:%d",
+ BTM_TRACE_DEBUG ("btm_ble_io_capabilities_req 1: p_dev_rec->security_required = %d auth_req:%d",
p_dev_rec->security_required, p_data->auth_req);
- BTM_TRACE_DEBUG2 ("btm_ble_io_capabilities_req 2: i_keys=0x%x r_keys=0x%x (bit 0-LTK 1-IRK 2-CSRK)",
+ BTM_TRACE_DEBUG ("btm_ble_io_capabilities_req 2: i_keys=0x%x r_keys=0x%x (bit 0-LTK 1-IRK 2-CSRK)",
p_data->init_keys,
p_data->resp_keys);
@@ -1454,30 +1473,30 @@
if (!(p_data->auth_req & SMP_AUTH_BOND))
{
- BTM_TRACE_DEBUG0("Non bonding: No keys should be exchanged");
+ BTM_TRACE_DEBUG("Non bonding: No keys should be exchanged");
p_data->init_keys = 0;
p_data->resp_keys = 0;
}
- BTM_TRACE_DEBUG1 ("btm_ble_io_capabilities_req 3: auth_req:%d", p_data->auth_req);
- BTM_TRACE_DEBUG2 ("btm_ble_io_capabilities_req 4: i_keys=0x%x r_keys=0x%x",
+ BTM_TRACE_DEBUG ("btm_ble_io_capabilities_req 3: auth_req:%d", p_data->auth_req);
+ BTM_TRACE_DEBUG ("btm_ble_io_capabilities_req 4: i_keys=0x%x r_keys=0x%x",
p_data->init_keys,
p_data->resp_keys);
- BTM_TRACE_DEBUG2 ("btm_ble_io_capabilities_req 5: p_data->io_cap = %d auth_req:%d",
+ BTM_TRACE_DEBUG ("btm_ble_io_capabilities_req 5: p_data->io_cap = %d auth_req:%d",
p_data->io_cap, p_data->auth_req);
/* remove MITM protection requirement if IO cap does not allow it */
if ((p_data->io_cap == BTM_IO_CAP_NONE) && p_data->oob_data == SMP_OOB_NONE)
p_data->auth_req &= ~BTM_LE_AUTH_REQ_MITM;
- BTM_TRACE_DEBUG3 ("btm_ble_io_capabilities_req 6: IO_CAP:%d oob_data:%d auth_req:%d",
+ BTM_TRACE_DEBUG ("btm_ble_io_capabilities_req 6: IO_CAP:%d oob_data:%d auth_req:%d",
p_data->io_cap, p_data->oob_data, p_data->auth_req);
}
return callback_rc;
}
-#if (BTM_BLE_PRIVACY_SPT == TRUE )
+#if (BLE_PRIVACY_SPT == TRUE )
/*******************************************************************************
**
** Function btm_ble_resolve_random_addr_on_conn_cmpl
@@ -1508,11 +1527,11 @@
handle = HCID_GET_HANDLE (handle);
- BTM_TRACE_EVENT0 ("btm_ble_resolve_random_addr_master_cmpl");
+ BTM_TRACE_EVENT ("btm_ble_resolve_random_addr_master_cmpl");
if (match_rec)
{
- BTM_TRACE_ERROR0("Random match");
+ BTM_TRACE_ERROR("Random match");
match = TRUE;
match_rec->ble.active_addr_type = BTM_BLE_ADDR_RRA;
memcpy(match_rec->ble.cur_rand_addr, bda, BD_ADDR_LEN);
@@ -1520,7 +1539,7 @@
}
else
{
- BTM_TRACE_ERROR0("Random unmatch");
+ BTM_TRACE_ERROR("Random unmatch");
}
btm_ble_connected(bda, handle, HCI_ENCRYPT_MODE_DISABLED, role, bda_type, match);
@@ -1549,23 +1568,23 @@
tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
UNUSED(addr_matched);
- BTM_TRACE_EVENT0 ("btm_ble_connected");
+ BTM_TRACE_EVENT ("btm_ble_connected");
/* Commenting out trace due to obf/compilation problems.
*/
#if (BT_USE_TRACES == TRUE)
if (p_dev_rec)
{
- BTM_TRACE_EVENT4 ("Security Manager: btm_sec_connected : handle:%d enc_mode:%d bda:%x RName:%s",
+ BTM_TRACE_EVENT ("Security Manager: btm_ble_connected : handle:%d enc_mode:%d bda:%x RName:%s",
handle, enc_mode,
(bda[2]<<24)+(bda[3]<<16)+(bda[4]<<8)+bda[5],
p_dev_rec->sec_bd_name);
- BTM_TRACE_DEBUG1 ("btm_ble_connected sec_flags=0x%x",p_dev_rec->sec_flags);
+ BTM_TRACE_DEBUG ("btm_ble_connected sec_flags=0x%x",p_dev_rec->sec_flags);
}
else
{
- BTM_TRACE_EVENT3 ("Security Manager: btm_sec_connected: handle:%d enc_mode:%d bda:%x ",
+ BTM_TRACE_EVENT ("Security Manager: btm_ble_connected: handle:%d enc_mode:%d bda:%x ",
handle, enc_mode,
(bda[2]<<24)+(bda[3]<<16)+(bda[4]<<8)+bda[5]);
}
@@ -1583,14 +1602,14 @@
/* update device information */
p_dev_rec->device_type |= BT_DEVICE_TYPE_BLE;
- p_dev_rec->hci_handle = handle;
+ p_dev_rec->ble_hci_handle = handle;
p_dev_rec->ble.ble_addr_type = addr_type;
p_dev_rec->role_master = FALSE;
if (role == HCI_ROLE_MASTER)
p_dev_rec->role_master = TRUE;
-#if (defined BTM_BLE_PRIVACY_SPT && BTM_BLE_PRIVACY_SPT == TRUE)
+#if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
if (!addr_matched)
p_dev_rec->ble.active_addr_type = BTM_BLE_ADDR_PSEUDO;
@@ -1613,12 +1632,12 @@
******************************************************************************/
void btm_ble_conn_complete(UINT8 *p, UINT16 evt_len)
{
-#if (BTM_BLE_PRIVACY_SPT == TRUE )
+#if (BLE_PRIVACY_SPT == TRUE )
UINT8 *p_data = p;
#endif
UINT8 role, status, bda_type;
UINT16 handle;
- BD_ADDR bda;
+ BD_ADDR bda = {0};
UINT16 conn_interval, conn_latency, conn_timeout;
BOOLEAN match = FALSE;
UNUSED(evt_len);
@@ -1631,10 +1650,14 @@
if (status == 0)
{
-#if (BTM_BLE_PRIVACY_SPT == TRUE )
+#if (BLE_PRIVACY_SPT == TRUE )
+
+ if (btm_cb.cmn_ble_vsc_cb.rpa_offloading == TRUE)
+ match = btm_public_addr_to_random_pseudo (bda, &bda_type);
+
/* possiblly receive connection complete with resolvable random on
slave role while the device has been paired */
- if (!match && BTM_BLE_IS_RESOLVE_BDA(bda))
+ if (!match && /*role == HCI_ROLE_SLAVE && */BTM_BLE_IS_RESOLVE_BDA(bda))
{
btm_ble_resolve_random_addr(bda, btm_ble_resolve_random_addr_on_conn_cmpl, p_data);
}
@@ -1655,9 +1678,9 @@
{
role = HCI_ROLE_UNKNOWN;
- if (status == HCI_ERR_DIRECTED_ADVERTISING_TIMEOUT)
+ if (status != HCI_ERR_DIRECTED_ADVERTISING_TIMEOUT)
{
- btm_ble_dir_adv_tout();
+ btm_ble_set_conn_st(BLE_CONN_IDLE);
}
/* this is to work around broadcom firmware problem to handle
* unsolicited command complete event for HCI_LE_Create_Connection_Cancel
@@ -1679,13 +1702,25 @@
}
}
}
-
btm_ble_set_conn_st(BLE_CONN_IDLE);
-
- btm_ble_update_mode_operation(role, bda, TRUE);
+ btm_ble_update_mode_operation(role, bda, status);
}
/*****************************************************************************
+** Function btm_ble_create_ll_conn_complete
+**
+** Description LE connection complete.
+**
+******************************************************************************/
+void btm_ble_create_ll_conn_complete (UINT8 status)
+{
+ if (status != 0)
+ {
+ btm_ble_set_conn_st(BLE_CONN_IDLE);
+ btm_ble_update_mode_operation(HCI_ROLE_UNKNOWN, NULL, status);
+ }
+}
+/*****************************************************************************
** Function btm_proc_smp_cback
**
** Description This function is the SMP callback handler.
@@ -1696,7 +1731,7 @@
tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr);
UINT8 res = 0;
- BTM_TRACE_DEBUG1 ("btm_proc_smp_cback event = %d", event);
+ BTM_TRACE_DEBUG ("btm_proc_smp_cback event = %d", event);
if (p_dev_rec != NULL)
{
@@ -1709,33 +1744,35 @@
case SMP_PASSKEY_REQ_EVT:
case SMP_PASSKEY_NOTIF_EVT:
case SMP_OOB_REQ_EVT:
- p_dev_rec->sec_flags |= BTM_SEC_LINK_KEY_AUTHED;
+ p_dev_rec->sec_flags |= BTM_SEC_LE_AUTHENTICATED;
+
case SMP_SEC_REQUEST_EVT:
memcpy (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN);
p_dev_rec->sec_state = BTM_SEC_STATE_AUTHENTICATING;
+ btm_cb.pairing_flags |= BTM_PAIR_FLAGS_LE_ACTIVE;
/* fall through */
case SMP_COMPLT_EVT:
if (btm_cb.api.p_le_callback)
{
/* the callback function implementation may change the IO capability... */
- BTM_TRACE_DEBUG1 ("btm_cb.api.p_le_callback=0x%x", btm_cb.api.p_le_callback );
+ BTM_TRACE_DEBUG ("btm_cb.api.p_le_callback=0x%x", btm_cb.api.p_le_callback );
(*btm_cb.api.p_le_callback) (event, bd_addr, (tBTM_LE_EVT_DATA *)p_data);
}
if (event == SMP_COMPLT_EVT)
{
- BTM_TRACE_DEBUG2 ("evt=SMP_COMPLT_EVT before update sec_level=0x%x sec_flags=0x%x", p_data->cmplt.sec_level , p_dev_rec->sec_flags );
+ BTM_TRACE_DEBUG ("evt=SMP_COMPLT_EVT before update sec_level=0x%x sec_flags=0x%x", p_data->cmplt.sec_level , p_dev_rec->sec_flags );
res = (p_data->cmplt.reason == SMP_SUCCESS) ? BTM_SUCCESS : BTM_ERR_PROCESSING;
- BTM_TRACE_DEBUG3 ("after update result=%d sec_level=0x%x sec_flags=0x%x",
+ BTM_TRACE_DEBUG ("after update result=%d sec_level=0x%x sec_flags=0x%x",
res, p_data->cmplt.sec_level , p_dev_rec->sec_flags );
- btm_sec_dev_rec_cback_event(p_dev_rec, res);
+ btm_sec_dev_rec_cback_event(p_dev_rec, res, TRUE);
if (p_data->cmplt.is_pair_cancel && btm_cb.api.p_bond_cancel_cmpl_callback )
{
- BTM_TRACE_DEBUG0 ("Pairing Cancel completed");
+ BTM_TRACE_DEBUG ("Pairing Cancel completed");
(*btm_cb.api.p_bond_cancel_cmpl_callback)(BTM_SUCCESS);
}
#if BTM_BLE_CONFORMANCE_TESTING == TRUE
@@ -1743,25 +1780,25 @@
{
if (!btm_cb.devcb.no_disc_if_pair_fail && p_data->cmplt.reason != SMP_CONN_TOUT)
{
- BTM_TRACE_DEBUG0 ("Pairing failed - Remove ACL");
- btm_remove_acl(bd_addr);
+ BTM_TRACE_DEBUG ("Pairing failed - Remove ACL");
+ btm_remove_acl(bd_addr, BT_TRANSPORT_LE);
}
else
{
- BTM_TRACE_DEBUG0 ("Pairing failed - Not Removing ACL");
+ BTM_TRACE_DEBUG ("Pairing failed - Not Removing ACL");
p_dev_rec->sec_state = BTM_SEC_STATE_IDLE;
}
}
#else
if (res != BTM_SUCCESS && p_data->cmplt.reason != SMP_CONN_TOUT)
- btm_remove_acl(bd_addr);
+ btm_remove_acl(bd_addr, BT_TRANSPORT_LE);
#endif
- BTM_TRACE_DEBUG3 ("btm_cb pairing_state=%x pairing_flags=%x pin_code_len=%x",
+ BTM_TRACE_DEBUG ("btm_cb pairing_state=%x pairing_flags=%x pin_code_len=%x",
btm_cb.pairing_state,
btm_cb.pairing_flags,
btm_cb.pin_code_len );
- BTM_TRACE_DEBUG6 ("btm_cb.pairing_bda %02x:%02x:%02x:%02x:%02x:%02x",
+ BTM_TRACE_DEBUG ("btm_cb.pairing_bda %02x:%02x:%02x:%02x:%02x:%02x",
btm_cb.pairing_bda[0], btm_cb.pairing_bda[1], btm_cb.pairing_bda[2],
btm_cb.pairing_bda[3], btm_cb.pairing_bda[4], btm_cb.pairing_bda[5]);
@@ -1772,7 +1809,7 @@
break;
default:
- BTM_TRACE_DEBUG1 ("unknown event = %d", event);
+ BTM_TRACE_DEBUG ("unknown event = %d", event);
break;
@@ -1780,7 +1817,7 @@
}
else
{
- BTM_TRACE_ERROR0("btm_proc_smp_cback received for unknown device");
+ BTM_TRACE_ERROR("btm_proc_smp_cback received for unknown device");
}
return 0;
@@ -1820,16 +1857,16 @@
tSMP_ENC output;
BT_OCTET16 local_csrk;
- BTM_TRACE_DEBUG0 ("BTM_BleDataSignature");
+ BTM_TRACE_DEBUG ("BTM_BleDataSignature");
if (p_rec == NULL)
{
- BTM_TRACE_ERROR0("data signing can not be done from unknow device");
+ BTM_TRACE_ERROR("data signing can not be done from unknow device");
}
else
{
if ((p_buf = (UINT8 *)GKI_getbuf((UINT16)(len + 4))) != NULL)
{
- BTM_TRACE_DEBUG0("Start to generate Local CSRK");
+ BTM_TRACE_DEBUG("Start to generate Local CSRK");
pp = p_buf;
/* prepare plain text */
if (p_text)
@@ -1841,7 +1878,7 @@
#if BTM_BLE_CONFORMANCE_TESTING == TRUE
if ( btm_cb.devcb.enable_test_local_sign_cntr)
{
- BTM_TRACE_DEBUG1 ("Use Test local counter value from script counter_val=%d", btm_cb.devcb.test_local_sign_cntr);
+ BTM_TRACE_DEBUG ("Use Test local counter value from script counter_val=%d", btm_cb.devcb.test_local_sign_cntr);
UINT32_TO_STREAM(pp, btm_cb.devcb.test_local_sign_cntr);
}
else
@@ -1854,7 +1891,7 @@
/* compute local csrk */
if (btm_get_local_div(bd_addr, &div))
{
- BTM_TRACE_DEBUG1 ("compute_csrk div=%x", div);
+ BTM_TRACE_DEBUG ("compute_csrk div=%x", div);
BTM_GetDeviceEncRoot(er);
/* CSRK = d1(ER, DIV, 1) */
@@ -1863,11 +1900,11 @@
if (!SMP_Encrypt(er, BT_OCTET16_LEN, temp, 4, &output))
{
- BTM_TRACE_ERROR0("Local CSRK generation failed ");
+ BTM_TRACE_ERROR("Local CSRK generation failed ");
}
else
{
- BTM_TRACE_DEBUG0("local CSRK generation success");
+ BTM_TRACE_DEBUG("local CSRK generation success");
memcpy((void *)local_csrk, output.param_buf, BT_OCTET16_LEN);
@@ -1891,15 +1928,15 @@
#if BTM_BLE_CONFORMANCE_TESTING == TRUE
if ( btm_cb.devcb.enable_test_mac_val)
{
- BTM_TRACE_DEBUG0 ("Use MAC value from script");
+ BTM_TRACE_DEBUG ("Use MAC value from script");
memcpy(p_mac, btm_cb.devcb.test_mac, BTM_CMAC_TLEN_SIZE);
}
#endif
}
- BTM_TRACE_DEBUG1("BTM_BleDataSignature p_mac = %d", p_mac);
- BTM_TRACE_DEBUG4("p_mac[0] = 0x%02x p_mac[1] = 0x%02x p_mac[2] = 0x%02x p_mac[3] = 0x%02x",
+ BTM_TRACE_DEBUG("BTM_BleDataSignature p_mac = %d", p_mac);
+ BTM_TRACE_DEBUG("p_mac[0] = 0x%02x p_mac[1] = 0x%02x p_mac[2] = 0x%02x p_mac[3] = 0x%02x",
*p_mac, *(p_mac + 1), *(p_mac + 2), *(p_mac + 3));
- BTM_TRACE_DEBUG4("p_mac[4] = 0x%02x p_mac[5] = 0x%02x p_mac[6] = 0x%02x p_mac[7] = 0x%02x",
+ BTM_TRACE_DEBUG("p_mac[4] = 0x%02x p_mac[5] = 0x%02x p_mac[6] = 0x%02x p_mac[7] = 0x%02x",
*(p_mac + 4), *(p_mac + 5), *(p_mac + 6), *(p_mac + 7));
GKI_freebuf(p_buf);
@@ -1936,19 +1973,19 @@
if (p_rec == NULL || (p_rec && !(p_rec->ble.key_type & BTM_LE_KEY_PCSRK)))
{
- BTM_TRACE_ERROR0("can not verify signature for unknown device");
+ BTM_TRACE_ERROR("can not verify signature for unknown device");
}
else if (counter < p_rec->ble.keys.counter)
{
- BTM_TRACE_ERROR0("signature received with out dated sign counter");
+ BTM_TRACE_ERROR("signature received with out dated sign counter");
}
else if (p_orig == NULL)
{
- BTM_TRACE_ERROR0("No signature to verify");
+ BTM_TRACE_ERROR("No signature to verify");
}
else
{
- BTM_TRACE_DEBUG2 ("BTM_BleVerifySignature rcv_cnt=%d >= expected_cnt=%d", counter, p_rec->ble.keys.counter);
+ BTM_TRACE_DEBUG ("BTM_BleVerifySignature rcv_cnt=%d >= expected_cnt=%d", counter, p_rec->ble.keys.counter);
if (AES_CMAC(p_rec->ble.keys.csrk, p_orig, len, BTM_CMAC_TLEN_SIZE, p_mac))
{
@@ -1980,24 +2017,24 @@
{
tBTM_BLE_LOCAL_KEYS *p_locak_keys = NULL;
- BTM_TRACE_DEBUG1 ("btm_notify_new_key key_type=%d", key_type);
+ BTM_TRACE_DEBUG ("btm_notify_new_key key_type=%d", key_type);
if (btm_cb.api.p_le_key_callback)
{
switch (key_type)
{
case BTM_BLE_KEY_TYPE_ID:
- BTM_TRACE_DEBUG0 ("BTM_BLE_KEY_TYPE_ID");
+ BTM_TRACE_DEBUG ("BTM_BLE_KEY_TYPE_ID");
p_locak_keys = (tBTM_BLE_LOCAL_KEYS *)&btm_cb.devcb.id_keys;
break;
case BTM_BLE_KEY_TYPE_ER:
- BTM_TRACE_DEBUG0 ("BTM_BLE_KEY_TYPE_ER");
+ BTM_TRACE_DEBUG ("BTM_BLE_KEY_TYPE_ER");
p_locak_keys = (tBTM_BLE_LOCAL_KEYS *)&btm_cb.devcb.er;
break;
default:
- BTM_TRACE_ERROR1("unknown key type: %d", key_type);
+ BTM_TRACE_ERROR("unknown key type: %d", key_type);
break;
}
if (p_locak_keys != NULL)
@@ -2017,7 +2054,7 @@
*******************************************************************************/
static void btm_ble_process_er2(tBTM_RAND_ENC *p)
{
- BTM_TRACE_DEBUG0 ("btm_ble_process_er2");
+ BTM_TRACE_DEBUG ("btm_ble_process_er2");
if (p &&p->opcode == HCI_BLE_RAND)
{
@@ -2026,7 +2063,7 @@
}
else
{
- BTM_TRACE_ERROR0("Generating ER2 exception.");
+ BTM_TRACE_ERROR("Generating ER2 exception.");
memset(&btm_cb.devcb.er, 0, sizeof(BT_OCTET16));
}
}
@@ -2043,7 +2080,7 @@
*******************************************************************************/
static void btm_ble_process_er(tBTM_RAND_ENC *p)
{
- BTM_TRACE_DEBUG0 ("btm_ble_process_er");
+ BTM_TRACE_DEBUG ("btm_ble_process_er");
if (p &&p->opcode == HCI_BLE_RAND)
{
@@ -2052,12 +2089,12 @@
if (!btsnd_hcic_ble_rand((void *)btm_ble_process_er2))
{
memset(&btm_cb.devcb.er, 0, sizeof(BT_OCTET16));
- BTM_TRACE_ERROR0("Generating ER2 failed.");
+ BTM_TRACE_ERROR("Generating ER2 failed.");
}
}
else
{
- BTM_TRACE_ERROR0("Generating ER1 exception.");
+ BTM_TRACE_ERROR("Generating ER1 exception.");
}
}
@@ -2073,7 +2110,7 @@
*******************************************************************************/
static void btm_ble_process_irk(tSMP_ENC *p)
{
- BTM_TRACE_DEBUG0 ("btm_ble_process_irk");
+ BTM_TRACE_DEBUG ("btm_ble_process_irk");
if (p &&p->opcode == HCI_BLE_ENCRYPT)
{
memcpy(btm_cb.devcb.id_keys.irk, p->param_buf, BT_OCTET16_LEN);
@@ -2081,13 +2118,13 @@
}
else
{
- BTM_TRACE_ERROR0("Generating IRK exception.");
+ BTM_TRACE_ERROR("Generating IRK exception.");
}
/* proceed generate ER */
if (!btsnd_hcic_ble_rand((void *)btm_ble_process_er))
{
- BTM_TRACE_ERROR0("Generating ER failed.");
+ BTM_TRACE_ERROR("Generating ER failed.");
}
}
@@ -2108,12 +2145,12 @@
UINT8 btm_ble_irk_pt = 0x01;
tSMP_ENC output;
- BTM_TRACE_DEBUG0 ("btm_ble_process_dhk");
+ BTM_TRACE_DEBUG ("btm_ble_process_dhk");
if (p && p->opcode == HCI_BLE_ENCRYPT)
{
memcpy(btm_cb.devcb.id_keys.dhk, p->param_buf, BT_OCTET16_LEN);
- BTM_TRACE_DEBUG0("BLE DHK generated.");
+ BTM_TRACE_DEBUG("BLE DHK generated.");
/* IRK = D1(IR, 1) */
if (!SMP_Encrypt(btm_cb.devcb.id_keys.ir, BT_OCTET16_LEN, &btm_ble_irk_pt,
@@ -2152,7 +2189,7 @@
UINT8 btm_ble_dhk_pt = 0x03;
tSMP_ENC output;
- BTM_TRACE_DEBUG0 ("btm_ble_process_ir2");
+ BTM_TRACE_DEBUG ("btm_ble_process_ir2");
if (p && p->opcode == HCI_BLE_RAND)
{
@@ -2165,7 +2202,7 @@
1, &output);
btm_ble_process_dhk(&output);
- BTM_TRACE_DEBUG0("BLE IR generated.");
+ BTM_TRACE_DEBUG("BLE IR generated.");
}
else
{
@@ -2187,7 +2224,7 @@
*******************************************************************************/
static void btm_ble_process_ir(tBTM_RAND_ENC *p)
{
- BTM_TRACE_DEBUG0 ("btm_ble_process_ir");
+ BTM_TRACE_DEBUG ("btm_ble_process_ir");
if (p && p->opcode == HCI_BLE_RAND)
{
@@ -2196,7 +2233,7 @@
if (!btsnd_hcic_ble_rand((void *)btm_ble_process_ir2))
{
- BTM_TRACE_ERROR0("Generating IR2 failed.");
+ BTM_TRACE_ERROR("Generating IR2 failed.");
memset(&btm_cb.devcb.id_keys, 0, sizeof(tBTM_BLE_LOCAL_ID_KEYS));
}
}
@@ -2213,12 +2250,12 @@
*******************************************************************************/
void btm_ble_reset_id( void )
{
- BTM_TRACE_DEBUG0 ("btm_ble_reset_id");
+ BTM_TRACE_DEBUG ("btm_ble_reset_id");
/* regenrate Identity Root*/
if (!btsnd_hcic_ble_rand((void *)btm_ble_process_ir))
{
- BTM_TRACE_DEBUG0("Generating IR failed.");
+ BTM_TRACE_DEBUG("Generating IR failed.");
}
}
@@ -2235,7 +2272,7 @@
*******************************************************************************/
void btm_ble_set_no_disc_if_pair_fail(BOOLEAN disable_disc )
{
- BTM_TRACE_DEBUG1 ("btm_ble_set_disc_enable_if_pair_fail disable_disc=%d", disable_disc);
+ BTM_TRACE_DEBUG ("btm_ble_set_disc_enable_if_pair_fail disable_disc=%d", disable_disc);
btm_cb.devcb.no_disc_if_pair_fail = disable_disc;
}
@@ -2250,7 +2287,7 @@
*******************************************************************************/
void btm_ble_set_test_mac_value(BOOLEAN enable, UINT8 *p_test_mac_val )
{
- BTM_TRACE_DEBUG1 ("btm_ble_set_test_mac_value enable=%d", enable);
+ BTM_TRACE_DEBUG ("btm_ble_set_test_mac_value enable=%d", enable);
btm_cb.devcb.enable_test_mac_val = enable;
memcpy(btm_cb.devcb.test_mac, p_test_mac_val, BT_OCTET8_LEN);
}
@@ -2266,7 +2303,7 @@
*******************************************************************************/
void btm_ble_set_test_local_sign_cntr_value(BOOLEAN enable, UINT32 test_local_sign_cntr )
{
- BTM_TRACE_DEBUG2 ("btm_ble_set_test_local_sign_cntr_value enable=%d local_sign_cntr=%d",
+ BTM_TRACE_DEBUG ("btm_ble_set_test_local_sign_cntr_value enable=%d local_sign_cntr=%d",
enable, test_local_sign_cntr);
btm_cb.devcb.enable_test_local_sign_cntr = enable;
btm_cb.devcb.test_local_sign_cntr = test_local_sign_cntr;
@@ -2286,7 +2323,7 @@
tBTM_LE_RANDOM_CB *p_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
BOOLEAN adv_mode = btm_cb.ble_ctr_cb.inq_var.adv_mode ;
- BTM_TRACE_DEBUG0 ("btm_set_random_address");
+ BTM_TRACE_DEBUG ("btm_set_random_address");
if (adv_mode == BTM_BLE_ADV_ENABLE)
btsnd_hcic_ble_set_adv_enable (BTM_BLE_ADV_DISABLE);
@@ -2299,6 +2336,23 @@
}
+
+/*******************************************************************************
+**
+** Function btm_ble_set_keep_rfu_in_auth_req
+**
+** Description This function indicates if RFU bits have to be kept as is
+** (by default they have to be set to 0 by the sender).
+**
+** Returns void
+**
+*******************************************************************************/
+void btm_ble_set_keep_rfu_in_auth_req(BOOLEAN keep_rfu)
+{
+ BTM_TRACE_DEBUG ("btm_ble_set_keep_rfu_in_auth_req keep_rfus=%d", keep_rfu);
+ btm_cb.devcb.keep_rfu_in_auth_req = keep_rfu;
+}
+
#endif /* BTM_BLE_CONFORMANCE_TESTING */
#endif /* BLE_INCLUDED */
diff --git a/stack/btm/btm_ble_addr.c b/stack/btm/btm_ble_addr.c
index 3c646e9..e560ee7 100644
--- a/stack/btm/btm_ble_addr.c
+++ b/stack/btm/btm_ble_addr.c
@@ -33,8 +33,8 @@
#if (defined BLE_INCLUDED && BLE_INCLUDED == TRUE)
#include "btm_ble_int.h"
#include "smp_api.h"
-#define BTM_BLE_PRIVATE_ADDR_INT 900 /* 15 minutes minimum for
- random address refreshing */
+
+#include "vendor_ble.h"
/*******************************************************************************
**
@@ -49,7 +49,7 @@
static void btm_gen_resolve_paddr_cmpl(tSMP_ENC *p)
{
tBTM_LE_RANDOM_CB *p_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
- BTM_TRACE_EVENT0 ("btm_gen_resolve_paddr_cmpl");
+ BTM_TRACE_EVENT ("btm_gen_resolve_paddr_cmpl");
if (p)
{
@@ -63,15 +63,19 @@
p_cb->own_addr_type = BLE_ADDR_RANDOM;
/* start a periodical timer to refresh random addr */
- btu_stop_timer(&p_cb->raddr_timer_ent);
- btu_start_timer (&p_cb->raddr_timer_ent, BTU_TTYPE_BLE_RANDOM_ADDR,
+ btu_stop_timer_oneshot(&p_cb->raddr_timer_ent);
+#if (BTM_BLE_CONFORMANCE_TESTING == TRUE)
+ btu_start_timer_oneshot(&p_cb->raddr_timer_ent, BTU_TTYPE_BLE_RANDOM_ADDR,
+ btm_cb.ble_ctr_cb.rpa_tout);
+#else
+ btu_start_timer_oneshot(&p_cb->raddr_timer_ent, BTU_TTYPE_BLE_RANDOM_ADDR,
BTM_BLE_PRIVATE_ADDR_INT);
-
+#endif
}
else
{
/* random address set failure */
- BTM_TRACE_DEBUG0("set random address failed");
+ BTM_TRACE_DEBUG("set random address failed");
}
}
/*******************************************************************************
@@ -84,13 +88,13 @@
** Returns void
**
*******************************************************************************/
-static void btm_gen_resolve_paddr_low(tBTM_RAND_ENC *p)
+void btm_gen_resolve_paddr_low(tBTM_RAND_ENC *p)
{
#if (BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE)
tBTM_LE_RANDOM_CB *p_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
tSMP_ENC output;
- BTM_TRACE_EVENT0 ("btm_gen_resolve_paddr_low");
+ BTM_TRACE_EVENT ("btm_gen_resolve_paddr_low");
if (p)
{
p->param_buf[2] &= (~BLE_RESOLVE_ADDR_MASK);
@@ -121,11 +125,11 @@
** Returns void
**
*******************************************************************************/
-void btm_gen_resolvable_private_addr (void)
+void btm_gen_resolvable_private_addr (void *p_cmd_cplt_cback)
{
- BTM_TRACE_EVENT0 ("btm_gen_resolvable_private_addr");
+ BTM_TRACE_EVENT ("btm_gen_resolvable_private_addr");
/* generate 3B rand as BD LSB, SRK with it, get BD MSB */
- if (!btsnd_hcic_ble_rand((void *)btm_gen_resolve_paddr_low))
+ if (!btsnd_hcic_ble_rand((void *)p_cmd_cplt_cback))
btm_gen_resolve_paddr_cmpl(NULL);
}
/*******************************************************************************
@@ -146,7 +150,7 @@
UINT8 *pp;
BD_ADDR static_random;
- BTM_TRACE_EVENT0 ("btm_gen_non_resolve_paddr_cmpl");
+ BTM_TRACE_EVENT ("btm_gen_non_resolve_paddr_cmpl");
p_cb->p_generate_cback = NULL;
if (p)
@@ -163,7 +167,7 @@
}
else
{
- BTM_TRACE_DEBUG0("btm_gen_non_resolvable_private_addr failed");
+ BTM_TRACE_DEBUG("btm_gen_non_resolvable_private_addr failed");
if (p_cback)
(* p_cback)(NULL, p_data);
}
@@ -182,7 +186,7 @@
{
tBTM_LE_RANDOM_CB *p_mgnt_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
- BTM_TRACE_EVENT0 ("btm_gen_non_resolvable_private_addr");
+ BTM_TRACE_EVENT ("btm_gen_non_resolvable_private_addr");
if (p_mgnt_cb->p_generate_cback != NULL)
return;
@@ -214,7 +218,7 @@
tBTM_LE_RANDOM_CB *p_mgnt_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
tBTM_SEC_DEV_REC *p_dev_rec = NULL;
- BTM_TRACE_EVENT1 ("btm_ble_resolve_address_cmpl p_mgnt_cb->index = %d", p_mgnt_cb->index);
+ BTM_TRACE_EVENT ("btm_ble_resolve_address_cmpl p_mgnt_cb->index = %d", p_mgnt_cb->index);
if (p_mgnt_cb->index < BTM_SEC_MAX_DEVICE_RECORDS)
{
@@ -239,7 +243,7 @@
{
tBTM_LE_RANDOM_CB *p_mgnt_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
UINT8 comp[3];
- BTM_TRACE_EVENT0 ("btm_ble_proc_resolve_x");
+ BTM_TRACE_EVENT ("btm_ble_proc_resolve_x");
/* compare the hash with 3 LSB of bd address */
comp[0] = p_mgnt_cb->random_bda[5];
comp[1] = p_mgnt_cb->random_bda[4];
@@ -250,7 +254,7 @@
if (!memcmp(p->param_buf, &comp[0], 3))
{
/* match is found */
- BTM_TRACE_EVENT0 ("match is found");
+ BTM_TRACE_EVENT ("match is found");
btm_ble_resolve_address_cmpl();
return TRUE;
}
@@ -281,15 +285,15 @@
rand[1] = p_mgnt_cb->random_bda[1];
rand[2] = p_mgnt_cb->random_bda[0];
- BTM_TRACE_EVENT1("btm_ble_match_random_bda rec_index = %d", rec_index);
+ BTM_TRACE_EVENT("btm_ble_match_random_bda rec_index = %d", rec_index);
if (rec_index < BTM_SEC_MAX_DEVICE_RECORDS)
{
p_dev_rec = &btm_cb.sec_dev_rec[rec_index];
- BTM_TRACE_DEBUG2("sec_flags = %02x device_type = %d", p_dev_rec->sec_flags, p_dev_rec->device_type);
+ BTM_TRACE_DEBUG("sec_flags = %02x device_type = %d", p_dev_rec->sec_flags, p_dev_rec->device_type);
- if ((p_dev_rec->device_type == BT_DEVICE_TYPE_BLE) &&
+ if ((p_dev_rec->device_type & BT_DEVICE_TYPE_BLE) &&
(p_dev_rec->ble.key_type & BTM_LE_KEY_PID))
{
/* generate X = E irk(R0, R1, R2) and R is random address 3 LSO */
@@ -325,7 +329,7 @@
{
tBTM_LE_RANDOM_CB *p_mgnt_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
- BTM_TRACE_EVENT0 ("btm_ble_resolve_random_addr");
+ BTM_TRACE_EVENT ("btm_ble_resolve_random_addr");
if ( !p_mgnt_cb->busy)
{
p_mgnt_cb->p = p;
@@ -342,7 +346,7 @@
/* atch found or went through the list */
break;
}
- p_mgnt_cb->index ++;
+ p_mgnt_cb->index ++;
}
}
else
@@ -362,7 +366,7 @@
tBLE_ADDR_TYPE btm_ble_map_bda_to_conn_bda(BD_ADDR bd_addr)
{
tBTM_SEC_DEV_REC *p_dev_rec = NULL;
- BTM_TRACE_EVENT0 ("btm_ble_map_bda_to_conn_bda");
+ BTM_TRACE_EVENT ("btm_ble_map_bda_to_conn_bda");
if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL &&
p_dev_rec->device_type == BT_DEVICE_TYPE_BLE)
{
@@ -376,6 +380,148 @@
return BLE_ADDR_PUBLIC;
}
+/*******************************************************************************
+**
+** Function btm_find_dev_by_public_static_addr
+**
+** Description find the security record whose LE static address is matching
+**
+*******************************************************************************/
+tBTM_SEC_DEV_REC* btm_find_dev_by_public_static_addr(BD_ADDR bd_addr)
+{
+ UINT8 i;
+ tBTM_SEC_DEV_REC *p_dev_rec = &btm_cb.sec_dev_rec[0];
+#if BLE_PRIVACY_SPT == TRUE
+ for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i ++, p_dev_rec ++)
+ {
+ if (p_dev_rec->ble.ble_addr_type == BLE_ADDR_RANDOM &&
+ BTM_BLE_IS_RESOLVE_BDA(p_dev_rec->bd_addr))
+ {
+ if ( memcmp(p_dev_rec->ble.static_addr, bd_addr, BD_ADDR_LEN) == 0)
+ {
+ p_dev_rec->ble.active_addr_type = BTM_BLE_ADDR_RRA;
+ /* found the match */
+ return p_dev_rec;
+ }
+ }
+ }
+#endif
+ return NULL;
+}
+
+/*******************************************************************************
+**
+** Function btm_public_addr_to_random_pseudo
+**
+** Description This function map a static BD address to a pseudo random address
+** in security database.
+**
+*******************************************************************************/
+BOOLEAN btm_public_addr_to_random_pseudo(BD_ADDR bd_addr, UINT8 *p_addr_type)
+{
+#if BLE_PRIVACY_SPT == TRUE
+ tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev_by_public_static_addr(bd_addr);
+
+ BTM_TRACE_EVENT ("btm_public_addr_to_random_pseudo");
+
+ /* evt reported on static address, map static address to random pseudo */
+ if (p_dev_rec != NULL &&
+ /* static address is not static address */
+ memcmp(p_dev_rec->bd_addr, bd_addr, BD_ADDR_LEN) != 0)
+ /* update current random */
+ btm_ble_read_irk_entry(p_dev_rec->ble.static_addr);
+ if (p_dev_rec != NULL)
+ {
+ /* assign the orginal random to be the current report address */
+ memcpy(bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN);
+ /* always be a resolvable random if a match is found */
+ *p_addr_type = BLE_ADDR_RANDOM;
+
+ BTM_TRACE_ERROR("matched a public/reconnect address and map to random pseudo");
+
+ return TRUE;
+ }
+#endif
+ return FALSE;
+}
+
+/*******************************************************************************
+**
+** Function btm_random_pseudo_to_public
+**
+** Description This function map a random pseudo address to a public address
+** random_pseudo is input and output parameter
+**
+*******************************************************************************/
+BOOLEAN btm_random_pseudo_to_public(BD_ADDR random_pseudo, UINT8 *p_static_addr_type)
+{
+#if BLE_PRIVACY_SPT == TRUE
+ tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (random_pseudo);
+
+ if (p_dev_rec != NULL)
+ {
+ if (p_dev_rec->ble.ble_addr_type == BLE_ADDR_RANDOM &&
+ BTM_BLE_IS_RESOLVE_BDA(p_dev_rec->bd_addr) &&
+ (p_dev_rec->ble.key_type & BTM_LE_KEY_PID) != 0)
+ {
+ BTM_TRACE_EVENT ("btm_random_pseudo_to_public found the puclic static address!");
+ * p_static_addr_type = p_dev_rec->ble.static_addr_type;
+ memcpy(random_pseudo, p_dev_rec->ble.static_addr, BD_ADDR_LEN);
+ return TRUE;
+ }
+ }
+#endif
+ return FALSE;
+}
+
+/*******************************************************************************
+**
+** Function btm_ble_refresh_rra
+**
+** Description This function refresh the currently used RRA into security
+** database and set active connection address.
+**
+*******************************************************************************/
+void btm_ble_refresh_rra(BD_ADDR static_bda, BD_ADDR rra)
+{
+#if BLE_PRIVACY_SPT == TRUE
+ tBTM_SEC_DEV_REC *p_sec_rec = btm_find_dev_by_public_static_addr(static_bda);
+ tACL_CONN *p_acl = btm_bda_to_acl (p_sec_rec->bd_addr, BT_TRANSPORT_LE);
+ UINT8 rra_dummy = FALSE;
+ BD_ADDR dummy_bda = {0};
+
+ BTM_TRACE_ERROR("btm_ble_refresh_rra");
+
+ if (memcmp(dummy_bda, rra, BD_ADDR_LEN) == 0)
+ rra_dummy = TRUE;
+
+ /* connection refresh RRA */
+ if (p_acl != NULL /* && memcmp(p_acl->active_remote_addr, dummy_bda, BD_ADDR_LEN) == 0 */)
+ {
+ /* use static address, rra is empty */
+ if (rra_dummy)
+ {
+ p_acl->active_remote_addr_type = p_sec_rec->ble.static_addr_type;
+ memcpy(p_acl->active_remote_addr, p_sec_rec->ble.static_addr, BD_ADDR_LEN);
+ }
+ else
+ {
+ p_acl->active_remote_addr_type = BLE_ADDR_RANDOM;
+ memcpy(p_acl->active_remote_addr, rra, BD_ADDR_LEN);
+ }
+ }
+ /* update security record here, in adv event or connection complete process */
+ if (p_sec_rec != NULL)
+ {
+ memcpy(p_sec_rec->ble.cur_rand_addr, rra, BD_ADDR_LEN);
+ p_sec_rec->ble.active_addr_type = rra_dummy ? BTM_BLE_ADDR_STATIC: BTM_BLE_ADDR_RRA;
+ }
+ else
+ {
+ BTM_TRACE_ERROR("No matching known device in record");
+ }
+#endif
+}
#endif
diff --git a/stack/btm/btm_ble_adv_filter.c b/stack/btm/btm_ble_adv_filter.c
new file mode 100644
index 0000000..0784b02
--- /dev/null
+++ b/stack/btm/btm_ble_adv_filter.c
@@ -0,0 +1,1326 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 Broadcom Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+#include <string.h>
+#include "bt_target.h"
+
+#if (BLE_INCLUDED == TRUE)
+#include "bt_types.h"
+#include "hcimsgs.h"
+#include "btu.h"
+#include "btm_int.h"
+#include "bt_utils.h"
+#include "hcidefs.h"
+#include "btm_ble_api.h"
+#include "vendor_ble.h"
+
+#define BTM_BLE_ADV_FILT_META_HDR_LENGTH 3
+#define BTM_BLE_ADV_FILT_FEAT_SELN_LEN 13
+
+#define BTM_BLE_PF_BIT_TO_MASK(x) (UINT16)(1 << (x))
+
+
+tBTM_BLE_ADV_FILTER_CB btm_ble_adv_filt_cb;
+tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
+static const BD_ADDR na_bda= {0};
+
+static UINT8 btm_ble_cs_update_pf_counter(tBTM_BLE_SCAN_COND_OP action,
+ UINT8 cond_type, tBLE_BD_ADDR *p_bd_addr, UINT8 num_available);
+
+#define BTM_BLE_SET_SCAN_PF_OPCODE(x, y) (((x)<<4)|y)
+#define BTM_BLE_GET_SCAN_PF_SUBCODE(x) ((x) >> 4)
+#define BTM_BLE_GET_SCAN_PF_ACTION(x) ((x) & 0x0f)
+#define BTM_BLE_INVALID_COUNTER 0xff
+
+
+/* length of each multi adv sub command */
+#define BTM_BLE_ADV_FILTER_ENB_LEN 3
+
+/* length of each batch scan command */
+#define BTM_BLE_ADV_FILTER_CLEAR_LEN 3
+#define BTM_BLE_ADV_FILTER_LEN 2
+
+#define BTM_BLE_ADV_FILT_CB_EVT_MASK 0xF0
+#define BTM_BLE_ADV_FILT_SUBCODE_MASK 0x0F
+
+/*******************************************************************************
+**
+** Function btm_ble_obtain_vsc_details
+**
+** Description This function obtains the VSC details
+**
+** Parameters
+**
+** Returns status
+**
+*******************************************************************************/
+tBTM_STATUS btm_ble_obtain_vsc_details()
+{
+ tBTM_STATUS st = BTM_SUCCESS;
+
+#if BLE_VND_INCLUDED == TRUE
+ BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
+ if (0 == cmn_ble_vsc_cb.max_filter)
+ {
+ st = BTM_MODE_UNSUPPORTED;
+ return st;
+ }
+#else
+ cmn_ble_vsc_cb.max_filter = BTM_BLE_MAX_FILTER_COUNTER;
+#endif
+ return st;
+}
+
+/*******************************************************************************
+**
+** Function btm_ble_advfilt_enq_op_q
+**
+** Description enqueue an adv filter operation in q to check command complete
+** status
+**
+** Returns void
+**
+*******************************************************************************/
+void btm_ble_advfilt_enq_op_q(UINT8 action, UINT8 ocf, tBTM_BLE_FILT_CB_EVT cb_evt,
+ tBTM_BLE_REF_VALUE ref, tBTM_BLE_PF_CFG_CBACK *p_cmpl_cback,
+ tBTM_BLE_PF_PARAM_CBACK *p_filt_param_cback)
+{
+ btm_ble_adv_filt_cb.op_q.action_ocf[btm_ble_adv_filt_cb.op_q.next_idx] = (action |(ocf << 4));
+ btm_ble_adv_filt_cb.op_q.ref_value[btm_ble_adv_filt_cb.op_q.next_idx] = ref;
+ btm_ble_adv_filt_cb.op_q.cb_evt[btm_ble_adv_filt_cb.op_q.next_idx] = cb_evt;
+ btm_ble_adv_filt_cb.op_q.p_scan_cfg_cback[btm_ble_adv_filt_cb.op_q.next_idx] = p_cmpl_cback;
+ btm_ble_adv_filt_cb.op_q.p_filt_param_cback[btm_ble_adv_filt_cb.op_q.next_idx]
+ = p_filt_param_cback;
+ BTM_TRACE_DEBUG("btm_ble_advfilt_enq_op_q: act_ocf:%d, action:%d, ocf:%d,cb_evt;%d, cback:%x",
+ btm_ble_adv_filt_cb.op_q.action_ocf[btm_ble_adv_filt_cb.op_q.next_idx], action,
+ ocf, cb_evt, p_cmpl_cback);
+ btm_ble_adv_filt_cb.op_q.next_idx = (btm_ble_adv_filt_cb.op_q.next_idx + 1)
+ % BTM_BLE_PF_TYPE_MAX;
+}
+
+/*******************************************************************************
+**
+** Function btm_ble_advfilt_deq_op_q
+**
+** Description dequeue an adv filter operation from q when command complete
+** is received
+**
+** Returns void
+**
+*******************************************************************************/
+void btm_ble_advfilt_deq_op_q(UINT8 *p_action,UINT8 *p_ocf, tBTM_BLE_FILT_CB_EVT *p_cb_evt,
+ tBTM_BLE_REF_VALUE *p_ref, tBTM_BLE_PF_CFG_CBACK ** p_cmpl_cback,
+ tBTM_BLE_PF_PARAM_CBACK **p_filt_param_cback)
+{
+ *p_ocf = (btm_ble_adv_filt_cb.op_q.action_ocf[btm_ble_adv_filt_cb.op_q.pending_idx] >> 4);
+ *p_action = (btm_ble_adv_filt_cb.op_q.action_ocf[btm_ble_adv_filt_cb.op_q.pending_idx]
+ & BTM_BLE_ADV_FILT_SUBCODE_MASK);
+ *p_ref = btm_ble_adv_filt_cb.op_q.ref_value[btm_ble_adv_filt_cb.op_q.pending_idx];
+ *p_cb_evt = btm_ble_adv_filt_cb.op_q.cb_evt[btm_ble_adv_filt_cb.op_q.pending_idx];
+ *p_cmpl_cback = btm_ble_adv_filt_cb.op_q.p_scan_cfg_cback[btm_ble_adv_filt_cb.op_q.pending_idx];
+ *p_filt_param_cback =
+ btm_ble_adv_filt_cb.op_q.p_filt_param_cback[btm_ble_adv_filt_cb.op_q.pending_idx];
+
+ btm_ble_adv_filt_cb.op_q.pending_idx = (btm_ble_adv_filt_cb.op_q.pending_idx + 1)
+ % BTM_BLE_PF_TYPE_MAX;
+ BTM_TRACE_DEBUG("btm_ble_advfilt_deq_op_q: ocf:%d, action:%d, ref_value:%d, cb_evt:%x",
+ *p_ocf,*p_action, *p_ref, *p_cb_evt);
+}
+
+/*******************************************************************************
+**
+** Function btm_ble_condtype_to_ocf
+**
+** Description Convert cond_type to OCF
+**
+** Returns Returns ocf value
+**
+*******************************************************************************/
+UINT8 btm_ble_condtype_to_ocf(UINT8 cond_type)
+{
+ UINT8 ocf = 0;
+
+ switch(cond_type)
+ {
+ case BTM_BLE_PF_ADDR_FILTER:
+ ocf = BTM_BLE_META_PF_ADDR;
+ break;
+ case BTM_BLE_PF_SRVC_UUID:
+ ocf = BTM_BLE_META_PF_UUID;
+ break;
+ case BTM_BLE_PF_SRVC_SOL_UUID:
+ ocf = BTM_BLE_META_PF_SOL_UUID;
+ break;
+ case BTM_BLE_PF_LOCAL_NAME:
+ ocf = BTM_BLE_META_PF_LOCAL_NAME;
+ break;
+ case BTM_BLE_PF_MANU_DATA:
+ ocf = BTM_BLE_META_PF_MANU_DATA;
+ break;
+ case BTM_BLE_PF_SRVC_DATA_PATTERN:
+ ocf = BTM_BLE_META_PF_SRVC_DATA;
+ break;
+ case BTM_BLE_PF_TYPE_ALL:
+ ocf = BTM_BLE_META_PF_ALL;
+ break;
+ default:
+ ocf = BTM_BLE_PF_TYPE_MAX;
+ break;
+ }
+ return ocf;
+}
+
+/*******************************************************************************
+**
+** Function btm_ble_ocf_to_condtype
+**
+** Description Convert OCF to cond type
+**
+** Returns Returns condtype value
+**
+*******************************************************************************/
+UINT8 btm_ble_ocf_to_condtype(UINT8 ocf)
+{
+ UINT8 cond_type = 0;
+
+ switch(ocf)
+ {
+ case BTM_BLE_META_PF_FEAT_SEL:
+ cond_type = BTM_BLE_META_PF_FEAT_SEL;
+ break;
+ case BTM_BLE_META_PF_ADDR:
+ cond_type = BTM_BLE_PF_ADDR_FILTER;
+ break;
+ case BTM_BLE_META_PF_UUID:
+ cond_type = BTM_BLE_PF_SRVC_UUID;
+ break;
+ case BTM_BLE_META_PF_SOL_UUID:
+ cond_type = BTM_BLE_PF_SRVC_SOL_UUID;
+ break;
+ case BTM_BLE_META_PF_LOCAL_NAME:
+ cond_type = BTM_BLE_PF_LOCAL_NAME;
+ break;
+ case BTM_BLE_META_PF_MANU_DATA:
+ cond_type = BTM_BLE_PF_MANU_DATA;
+ break;
+ case BTM_BLE_META_PF_SRVC_DATA:
+ cond_type = BTM_BLE_PF_SRVC_DATA_PATTERN;
+ break;
+ case BTM_BLE_META_PF_ALL:
+ cond_type = BTM_BLE_PF_TYPE_ALL;
+ break;
+ default:
+ cond_type = BTM_BLE_PF_TYPE_MAX;
+ break;
+ }
+ return cond_type;
+}
+
+/*******************************************************************************
+**
+** Function btm_ble_scan_pf_cmpl_cback
+**
+** Description the BTM BLE customer feature VSC complete callback for ADV PF filtering
+**
+** Returns pointer to the counter if found; NULL otherwise.
+**
+*******************************************************************************/
+void btm_ble_scan_pf_cmpl_cback(tBTM_VSC_CMPL *p_params)
+{
+ UINT8 status = 0;
+ UINT8 *p = p_params->p_param_buf, op_subcode = 0, action = 0xff;
+ UINT16 evt_len = p_params->param_len;
+ UINT8 ocf = BTM_BLE_META_PF_ALL, cond_type = 0;
+ UINT8 num_avail = 0, cb_evt = 0;
+ tBTM_BLE_REF_VALUE ref_value = 0;
+ tBTM_BLE_PF_CFG_CBACK *p_scan_cfg_cback = NULL;
+ tBTM_BLE_PF_PARAM_CBACK *p_filt_param_cback = NULL;
+
+ if (evt_len < 3 || evt_len > 4)
+ {
+ BTM_TRACE_ERROR("cannot interpret APCF callback status = %d, length = %d", status, evt_len);
+ btm_ble_advfilt_deq_op_q(&action, &ocf, &cb_evt, &ref_value, &p_scan_cfg_cback,
+ &p_filt_param_cback);
+ return;
+ }
+
+ btm_ble_advfilt_deq_op_q(&action, &ocf, &cb_evt, &ref_value, &p_scan_cfg_cback,
+ &p_filt_param_cback);
+
+ STREAM_TO_UINT8(status, p);
+ STREAM_TO_UINT8(op_subcode, p);
+ STREAM_TO_UINT8(action, p);
+
+ /* Ignore the event, if it is not the same one expected */
+ if (3 == evt_len)
+ {
+ if(ocf != op_subcode)
+ {
+ BTM_TRACE_ERROR("btm_ble_scan_pf_cmpl_cback:3-Incorrect opcode :%d, %d, %d, %d, %d, %d",
+ ocf, op_subcode, action, evt_len, ref_value, status);
+ return;
+ }
+ else
+ {
+ if(NULL != btm_ble_adv_filt_cb.p_filt_stat_cback)
+ btm_ble_adv_filt_cb.p_filt_stat_cback(action, status, ref_value);
+ BTM_TRACE_DEBUG("btm_ble_scan_pf_cmpl_cback enabled/disabled, %d, %d, %d, %d",
+ ocf, action, status, ref_value);
+ return;
+ }
+ }
+
+ if (4 == evt_len && ocf != op_subcode)
+ {
+ BTM_TRACE_ERROR("btm_ble_scan_pf_cmpl_cback:4-Incorrect opcode: %d, %d, %d, %d, %d",
+ ocf, op_subcode, action, status, ref_value);
+ return;
+ }
+
+ STREAM_TO_UINT8(num_avail, p);
+ switch (op_subcode)
+ {
+ case BTM_BLE_META_PF_ADDR:
+ case BTM_BLE_META_PF_UUID:
+ case BTM_BLE_META_PF_SOL_UUID:
+ case BTM_BLE_META_PF_LOCAL_NAME:
+ case BTM_BLE_META_PF_MANU_DATA:
+ case BTM_BLE_META_PF_SRVC_DATA:
+ cond_type = btm_ble_ocf_to_condtype(ocf);
+ BTM_TRACE_DEBUG("btm_ble_scan_pf_cmpl_cback Recd: %d, %d, %d, %d, %d, %d", op_subcode,
+ ocf, action, status, ref_value, num_avail);
+ if (HCI_SUCCESS == status)
+ {
+ if (memcmp(&btm_ble_adv_filt_cb.cur_filter_target.bda, &na_bda, BD_ADDR_LEN) == 0)
+ btm_ble_cs_update_pf_counter(action, cond_type, NULL, num_avail);
+ else
+ btm_ble_cs_update_pf_counter(action, cond_type,
+ &btm_ble_adv_filt_cb.cur_filter_target, num_avail);
+ }
+
+ /* send ADV PF operation complete */
+ btm_ble_adv_filt_cb.op_type = 0;
+ break;
+
+ case BTM_BLE_META_PF_FEAT_SEL:
+ BTM_TRACE_DEBUG("btm_ble_scan_pf_cmpl_cback-Feat sel event: %d, %d, %d, %d",
+ action, status, ref_value, num_avail);
+ break;
+
+ default:
+ BTM_TRACE_ERROR("btm_ble_scan_pf_cmpl_cback: unknown operation: %d", op_subcode);
+ break;
+ }
+
+ switch(cb_evt)
+ {
+ BTM_TRACE_DEBUG("btm_ble_scan_pf_cmpl_cback: calling the cback: %d", cb_evt);
+ case BTM_BLE_FILT_CFG:
+ if(NULL != p_scan_cfg_cback)
+ p_scan_cfg_cback(action, cond_type, num_avail, status, ref_value);
+ break;
+ case BTM_BLE_FILT_ADV_PARAM:
+ if(NULL != p_filt_param_cback)
+ p_filt_param_cback(action, num_avail, ref_value, status);
+ break;
+ default:
+ break;
+ }
+}
+
+/*******************************************************************************
+**
+** Function btm_ble_find_addr_filter_counter
+**
+** Description find the per bd address ADV payload filter counter by BD_ADDR.
+**
+** Returns pointer to the counter if found; NULL otherwise.
+**
+*******************************************************************************/
+tBTM_BLE_PF_COUNT* btm_ble_find_addr_filter_counter(tBLE_BD_ADDR *p_le_bda)
+{
+ UINT8 i;
+ tBTM_BLE_PF_COUNT *p_addr_filter = &btm_ble_adv_filt_cb.p_addr_filter_count[1];
+
+ if (p_le_bda == NULL)
+ return &btm_ble_adv_filt_cb.p_addr_filter_count[0];
+
+ for (i = 0; i < cmn_ble_vsc_cb.max_filter; i ++, p_addr_filter ++)
+ {
+ if (p_addr_filter->in_use &&
+ memcmp(p_le_bda->bda, p_addr_filter->bd_addr, BD_ADDR_LEN) == 0)
+ {
+ return p_addr_filter;
+ }
+ }
+ return NULL;
+}
+
+/*******************************************************************************
+**
+** Function btm_ble_alloc_addr_filter_counter
+**
+** Description allocate the per device adv payload filter counter.
+**
+** Returns pointer to the counter if allocation succeed; NULL otherwise.
+**
+*******************************************************************************/
+tBTM_BLE_PF_COUNT * btm_ble_alloc_addr_filter_counter(BD_ADDR bd_addr)
+{
+ UINT8 i;
+ tBTM_BLE_PF_COUNT *p_addr_filter = &btm_ble_adv_filt_cb.p_addr_filter_count[1];
+
+ for (i = 0; i < cmn_ble_vsc_cb.max_filter; i ++, p_addr_filter ++)
+ {
+ if (memcmp(na_bda, p_addr_filter->bd_addr, BD_ADDR_LEN) == 0)
+ {
+ memcpy(p_addr_filter->bd_addr, bd_addr, BD_ADDR_LEN);
+ p_addr_filter->in_use = TRUE;
+ return p_addr_filter;
+ }
+ }
+ return NULL;
+}
+/*******************************************************************************
+**
+** Function btm_ble_dealloc_addr_filter_counter
+**
+** Description de-allocate the per device adv payload filter counter.
+**
+** Returns TRUE if deallocation succeed; FALSE otherwise.
+**
+*******************************************************************************/
+BOOLEAN btm_ble_dealloc_addr_filter_counter(tBLE_BD_ADDR *p_bd_addr, UINT8 filter_type)
+{
+ UINT8 i;
+ tBTM_BLE_PF_COUNT *p_addr_filter = &btm_ble_adv_filt_cb.p_addr_filter_count[1];
+ BOOLEAN found = FALSE;
+
+ if (BTM_BLE_PF_TYPE_ALL == filter_type && NULL == p_bd_addr)
+ memset(&btm_ble_adv_filt_cb.p_addr_filter_count[0], 0, sizeof(tBTM_BLE_PF_COUNT));
+
+ for (i = 0; i < cmn_ble_vsc_cb.max_filter; i ++, p_addr_filter ++)
+ {
+ if ((p_addr_filter->in_use) && (NULL == p_bd_addr ||
+ (NULL != p_bd_addr &&
+ memcmp(p_bd_addr->bda, p_addr_filter->bd_addr, BD_ADDR_LEN) == 0)))
+ {
+ found = TRUE;
+ memset(p_addr_filter, 0, sizeof(tBTM_BLE_PF_COUNT));
+
+ if (NULL != p_bd_addr) break;
+ }
+ }
+ return found;
+}
+
+/*******************************************************************************
+**
+** Function btm_ble_update_pf_local_name
+**
+** Description this function update(add,delete or clear) the adv lcoal name filtering condition.
+**
+**
+** Returns BTM_SUCCESS if sucessful,
+** BTM_ILLEGAL_VALUE if paramter is not valid.
+**
+*******************************************************************************/
+tBTM_STATUS btm_ble_update_pf_local_name(tBTM_BLE_SCAN_COND_OP action,
+ tBTM_BLE_PF_FILT_INDEX filt_index,
+ tBTM_BLE_PF_COND_PARAM *p_cond)
+{
+ tBTM_BLE_PF_LOCAL_NAME_COND *p_local_name = (p_cond == NULL) ? NULL : &p_cond->local_name;
+ UINT8 param[BTM_BLE_PF_STR_LEN_MAX + BTM_BLE_ADV_FILT_META_HDR_LENGTH],
+ *p = param,
+ len = BTM_BLE_ADV_FILT_META_HDR_LENGTH;
+ tBTM_STATUS st = BTM_ILLEGAL_VALUE;
+
+ memset(param, 0, BTM_BLE_PF_STR_LEN_MAX + BTM_BLE_ADV_FILT_META_HDR_LENGTH);
+
+ UINT8_TO_STREAM(p, BTM_BLE_META_PF_LOCAL_NAME);
+ UINT8_TO_STREAM(p, action);
+
+ /* Filter index */
+ UINT8_TO_STREAM(p, filt_index);
+
+ if (BTM_BLE_SCAN_COND_ADD == action ||
+ BTM_BLE_SCAN_COND_DELETE == action)
+ {
+ if (NULL == p_local_name)
+ return st;
+
+ if (p_local_name->data_len > BTM_BLE_PF_STR_LEN_MAX)
+ p_local_name->data_len = BTM_BLE_PF_STR_LEN_MAX;
+
+ ARRAY_TO_STREAM(p, p_local_name->p_data, p_local_name->data_len);
+ len += p_local_name->data_len;
+ }
+
+ /* send local name filter */
+ if ((st = BTM_VendorSpecificCommand (HCI_BLE_ADV_FILTER_OCF,
+ len,
+ param,
+ btm_ble_scan_pf_cmpl_cback))
+ != BTM_NO_RESOURCES)
+ {
+ memset(&btm_ble_adv_filt_cb.cur_filter_target, 0, sizeof(tBLE_BD_ADDR));
+ }
+ else
+ {
+ BTM_TRACE_ERROR("Local Name PF filter update failed");
+ }
+
+ return st;
+}
+
+
+/*******************************************************************************
+**
+** Function btm_ble_update_srvc_data_change
+**
+** Description this function update(add/remove) service data change filter.
+**
+**
+** Returns BTM_SUCCESS if sucessful,
+** BTM_ILLEGAL_VALUE if paramter is not valid.
+**
+*******************************************************************************/
+tBTM_STATUS btm_ble_update_srvc_data_change(tBTM_BLE_SCAN_COND_OP action,
+ tBTM_BLE_PF_FILT_INDEX filt_index,
+ tBTM_BLE_PF_COND_PARAM *p_cond)
+{
+ tBTM_STATUS st = BTM_ILLEGAL_VALUE;
+ tBLE_BD_ADDR *p_bd_addr = p_cond ? &p_cond->target_addr : NULL;
+ UINT8 num_avail = (action == BTM_BLE_SCAN_COND_ADD) ? 0 : 1;
+
+ if (btm_ble_cs_update_pf_counter (action, BTM_BLE_PF_SRVC_DATA, p_bd_addr, num_avail)
+ != BTM_BLE_INVALID_COUNTER)
+ st = BTM_SUCCESS;
+
+ return st;
+}
+
+/*******************************************************************************
+**
+** Function btm_ble_update_pf_manu_data
+**
+** Description this function update(add,delete or clear) the adv manufacturer
+** data filtering condition.
+**
+**
+** Returns BTM_SUCCESS if sucessful,
+** BTM_ILLEGAL_VALUE if paramter is not valid.
+**
+*******************************************************************************/
+tBTM_STATUS btm_ble_update_pf_manu_data(tBTM_BLE_SCAN_COND_OP action,
+ tBTM_BLE_PF_FILT_INDEX filt_index,
+ tBTM_BLE_PF_COND_PARAM *p_data,
+ tBTM_BLE_PF_COND_TYPE cond_type,
+ tBTM_BLE_FILT_CB_EVT cb_evt,
+ tBTM_BLE_REF_VALUE ref_value)
+{
+ tBTM_BLE_PF_MANU_COND *p_manu_data = (p_data == NULL) ? NULL : &p_data->manu_data;
+ tBTM_BLE_PF_SRVC_PATTERN_COND *p_srvc_data = (p_data == NULL) ? NULL : &p_data->srvc_data;
+
+ UINT8 param[BTM_BLE_PF_STR_LEN_MAX + BTM_BLE_PF_STR_LEN_MAX + BTM_BLE_ADV_FILT_META_HDR_LENGTH],
+ *p = param,
+ len = BTM_BLE_ADV_FILT_META_HDR_LENGTH;
+ tBTM_STATUS st = BTM_ILLEGAL_VALUE;
+
+ if (NULL == p_data)
+ return st;
+
+ memset(param, 0, BTM_BLE_PF_STR_LEN_MAX + BTM_BLE_PF_STR_LEN_MAX
+ + BTM_BLE_ADV_FILT_META_HDR_LENGTH);
+
+ if (BTM_BLE_PF_SRVC_DATA_PATTERN == cond_type)
+ {
+ UINT8_TO_STREAM(p, BTM_BLE_META_PF_SRVC_DATA);
+ }
+ else
+ {
+ UINT8_TO_STREAM(p, BTM_BLE_META_PF_MANU_DATA);
+ }
+
+ UINT8_TO_STREAM(p, action);
+
+ /* Filter index */
+ UINT8_TO_STREAM(p, filt_index);
+
+ if (BTM_BLE_SCAN_COND_ADD == action || BTM_BLE_SCAN_COND_DELETE == action)
+ {
+ if (BTM_BLE_PF_SRVC_DATA_PATTERN == cond_type)
+ {
+ if (NULL == p_srvc_data)
+ return st;
+ if (p_srvc_data->data_len > (BTM_BLE_PF_STR_LEN_MAX - 2))
+ p_srvc_data->data_len = (BTM_BLE_PF_STR_LEN_MAX - 2);
+
+ if (p_srvc_data->data_len > 0)
+ {
+ ARRAY_TO_STREAM(p, p_srvc_data->p_pattern, p_srvc_data->data_len);
+ len += (p_srvc_data->data_len);
+ ARRAY_TO_STREAM(p, p_srvc_data->p_pattern_mask, p_srvc_data->data_len);
+ }
+
+ len += (p_srvc_data->data_len);
+ BTM_TRACE_DEBUG("Service data length: %d", len);
+ }
+ else
+ {
+ if (NULL == p_manu_data)
+ {
+ BTM_TRACE_ERROR("btm_ble_update_pf_manu_data - No manuf data");
+ return st;
+ }
+ BTM_TRACE_EVENT("btm_ble_update_pf_manu_data length: %d",
+ p_manu_data->data_len);
+ if (p_manu_data->data_len > (BTM_BLE_PF_STR_LEN_MAX - 2))
+ p_manu_data->data_len = (BTM_BLE_PF_STR_LEN_MAX - 2);
+
+ UINT16_TO_STREAM(p, p_manu_data->company_id);
+ if (p_manu_data->data_len > 0 && p_manu_data->p_pattern_mask != NULL)
+ {
+ ARRAY_TO_STREAM(p, p_manu_data->p_pattern, p_manu_data->data_len);
+ len += (p_manu_data->data_len + 2);
+ }
+ else
+ len += 2;
+
+ if (p_manu_data->company_id_mask != 0)
+ {
+ UINT16_TO_STREAM (p, p_manu_data->company_id_mask);
+ }
+ else
+ {
+ memset(p, 0xff, 2);
+ p += 2;
+ }
+ len += 2;
+
+ if (p_manu_data->data_len > 0 && p_manu_data->p_pattern_mask != NULL)
+ {
+ ARRAY_TO_STREAM(p, p_manu_data->p_pattern_mask, p_manu_data->data_len);
+ len += (p_manu_data->data_len);
+ }
+
+ BTM_TRACE_DEBUG("Manuf data length: %d", len);
+ }
+ }
+
+ /* send manufacturer*/
+ if ((st = BTM_VendorSpecificCommand (HCI_BLE_ADV_FILTER_OCF,
+ len,
+ param,
+ btm_ble_scan_pf_cmpl_cback)) != BTM_NO_RESOURCES)
+ {
+ memset(&btm_ble_adv_filt_cb.cur_filter_target, 0, sizeof(tBLE_BD_ADDR));
+ }
+ else
+ {
+ BTM_TRACE_ERROR("manufacturer data PF filter update failed");
+ }
+
+ return st;
+}
+
+/*******************************************************************************
+**
+** Function btm_ble_cs_update_pf_counter
+**
+** Description this function is to update the adv data payload filter counter
+**
+** Returns current number of the counter; BTM_BLE_INVALID_COUNTER if
+** counter update failed.
+**
+*******************************************************************************/
+UINT8 btm_ble_cs_update_pf_counter(tBTM_BLE_SCAN_COND_OP action,
+ UINT8 cond_type, tBLE_BD_ADDR *p_bd_addr,
+ UINT8 num_available)
+{
+ tBTM_BLE_PF_COUNT *p_addr_filter = NULL;
+ UINT8 *p_counter = NULL;
+
+ btm_ble_obtain_vsc_details();
+
+ if (cond_type > BTM_BLE_PF_TYPE_ALL)
+ {
+ BTM_TRACE_ERROR("unknown PF filter condition type %d", cond_type);
+ return BTM_BLE_INVALID_COUNTER;
+ }
+
+ /* for these three types of filter, always generic */
+ if (BTM_BLE_PF_ADDR_FILTER == cond_type ||
+ BTM_BLE_PF_MANU_DATA == cond_type ||
+ BTM_BLE_PF_LOCAL_NAME == cond_type ||
+ BTM_BLE_PF_SRVC_DATA_PATTERN == cond_type)
+ p_bd_addr = NULL;
+
+ if ((p_addr_filter = btm_ble_find_addr_filter_counter(p_bd_addr)) == NULL &&
+ BTM_BLE_SCAN_COND_ADD == action)
+ {
+ p_addr_filter = btm_ble_alloc_addr_filter_counter(p_bd_addr->bda);
+ }
+
+ if (NULL != p_addr_filter)
+ {
+ /* all filter just cleared */
+ if ((BTM_BLE_PF_TYPE_ALL == cond_type && BTM_BLE_SCAN_COND_CLEAR == action) ||
+ /* or bd address filter been deleted */
+ (BTM_BLE_PF_ADDR_FILTER == cond_type &&
+ (BTM_BLE_SCAN_COND_DELETE == action || BTM_BLE_SCAN_COND_CLEAR == action)))
+ {
+ btm_ble_dealloc_addr_filter_counter(p_bd_addr, cond_type);
+ }
+ /* if not feature selection, update new addition/reduction of the filter counter */
+ else if (cond_type != BTM_BLE_PF_TYPE_ALL)
+ {
+ p_counter = p_addr_filter->pf_counter;
+ if (num_available > 0)
+ p_counter[cond_type] += 1;
+
+ BTM_TRACE_DEBUG("counter = %d, maxfilt = %d, num_avbl=%d",
+ p_counter[cond_type], cmn_ble_vsc_cb.max_filter, num_available);
+ return p_counter[cond_type];
+ }
+ }
+ else
+ {
+ BTM_TRACE_ERROR("no matching filter counter found");
+ }
+ /* no matching filter located and updated */
+ return BTM_BLE_INVALID_COUNTER;
+}
+
+
+/*******************************************************************************
+**
+** Function btm_ble_update_addr_filter
+**
+** Description this function update(add,delete or clear) the address filter of adv.
+**
+**
+** Returns BTM_SUCCESS if sucessful,
+** BTM_ILLEGAL_VALUE if paramter is not valid.
+**
+*******************************************************************************/
+tBTM_STATUS btm_ble_update_addr_filter(tBTM_BLE_SCAN_COND_OP action,
+ tBTM_BLE_PF_FILT_INDEX filt_index,
+ tBTM_BLE_PF_COND_PARAM *p_cond)
+{
+ UINT8 param[BTM_BLE_META_ADDR_LEN + BTM_BLE_ADV_FILT_META_HDR_LENGTH],
+ * p= param;
+ tBTM_STATUS st = BTM_ILLEGAL_VALUE;
+ tBLE_BD_ADDR *p_addr = (p_cond == NULL) ? NULL : &p_cond->target_addr;
+
+ memset(param, 0, BTM_BLE_META_ADDR_LEN + BTM_BLE_ADV_FILT_META_HDR_LENGTH);
+
+ UINT8_TO_STREAM(p, BTM_BLE_META_PF_ADDR);
+ UINT8_TO_STREAM(p, action);
+
+ /* Filter index */
+ UINT8_TO_STREAM(p, filt_index);
+
+ if (BTM_BLE_SCAN_COND_ADD == action ||
+ BTM_BLE_SCAN_COND_DELETE == action)
+ {
+ if (NULL == p_addr)
+ return st;
+
+ BDADDR_TO_STREAM(p, p_addr->bda);
+ UINT8_TO_STREAM(p, p_addr->type);
+ }
+ /* send address filter */
+ if ((st = BTM_VendorSpecificCommand (HCI_BLE_ADV_FILTER_OCF,
+ (UINT8)(BTM_BLE_ADV_FILT_META_HDR_LENGTH + BTM_BLE_META_ADDR_LEN),
+ param,
+ btm_ble_scan_pf_cmpl_cback)) != BTM_NO_RESOURCES)
+ {
+ memset(&btm_ble_adv_filt_cb.cur_filter_target, 0, sizeof(tBLE_BD_ADDR));
+ }
+ else
+ {
+ BTM_TRACE_ERROR("Broadcaster Address Filter Update failed");
+ }
+ return st;
+}
+
+/*******************************************************************************
+**
+** Function btm_ble_update_uuid_filter
+**
+** Description this function update(add,delete or clear) service UUID filter.
+**
+**
+** Returns BTM_SUCCESS if sucessful,
+** BTM_ILLEGAL_VALUE if paramter is not valid.
+**
+*******************************************************************************/
+tBTM_STATUS btm_ble_update_uuid_filter(tBTM_BLE_SCAN_COND_OP action,
+ tBTM_BLE_PF_FILT_INDEX filt_index,
+ tBTM_BLE_PF_COND_TYPE filter_type,
+ tBTM_BLE_PF_COND_PARAM *p_cond,
+ tBTM_BLE_FILT_CB_EVT cb_evt,
+ tBTM_BLE_REF_VALUE ref_value)
+{
+ UINT8 param[BTM_BLE_META_UUID_LEN + BTM_BLE_ADV_FILT_META_HDR_LENGTH],
+ * p= param,
+ len = BTM_BLE_ADV_FILT_META_HDR_LENGTH;
+ tBTM_STATUS st = BTM_ILLEGAL_VALUE;
+ tBTM_BLE_PF_UUID_COND *p_uuid_cond;
+ UINT8 evt_type;
+
+ memset(param, 0, BTM_BLE_META_UUID_LEN + BTM_BLE_ADV_FILT_META_HDR_LENGTH);
+
+ if (BTM_BLE_PF_SRVC_UUID == filter_type)
+ {
+ evt_type = BTM_BLE_META_PF_UUID;
+ p_uuid_cond = p_cond ? &p_cond->srvc_uuid : NULL;
+ }
+ else
+ {
+ evt_type = BTM_BLE_META_PF_SOL_UUID;
+ p_uuid_cond = p_cond ? &p_cond->solicitate_uuid : NULL;
+ }
+
+ if (NULL == p_uuid_cond && action != BTM_BLE_SCAN_COND_CLEAR)
+ {
+ BTM_TRACE_ERROR("Illegal param for add/delete UUID filter");
+ return st;
+ }
+
+ /* need to add address filter first, if adding per bda UUID filter without address filter */
+ if (BTM_BLE_SCAN_COND_ADD == action && NULL != p_uuid_cond &&
+ p_uuid_cond->p_target_addr &&
+ btm_ble_find_addr_filter_counter(p_uuid_cond->p_target_addr) == NULL)
+ {
+ UINT8_TO_STREAM(p, BTM_BLE_META_PF_ADDR);
+ UINT8_TO_STREAM(p, action);
+
+ /* Filter index */
+ UINT8_TO_STREAM(p, filt_index);
+
+ BDADDR_TO_STREAM(p, p_uuid_cond->p_target_addr->bda);
+ UINT8_TO_STREAM(p, p_uuid_cond->p_target_addr->type);
+
+ /* send address filter */
+ if ((st = BTM_VendorSpecificCommand (HCI_BLE_ADV_FILTER_OCF,
+ (UINT8)(BTM_BLE_ADV_FILT_META_HDR_LENGTH + BTM_BLE_META_ADDR_LEN),
+ param,
+ btm_ble_scan_pf_cmpl_cback)) == BTM_NO_RESOURCES)
+ {
+ BTM_TRACE_ERROR("Update Address filter into controller failed.");
+ return st;
+ }
+
+ btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_ADDR, cb_evt, ref_value, NULL, NULL);
+ BTM_TRACE_DEBUG("Updated Address filter");
+ }
+
+ p = param;
+ UINT8_TO_STREAM(p, evt_type);
+ UINT8_TO_STREAM(p, action);
+
+ /* Filter index */
+ UINT8_TO_STREAM(p, filt_index);
+
+ if ((BTM_BLE_SCAN_COND_ADD == action ||
+ BTM_BLE_SCAN_COND_DELETE == action) &&
+ NULL != p_uuid_cond)
+ {
+ if (p_uuid_cond->uuid.len == LEN_UUID_16)
+ {
+ UINT16_TO_STREAM(p, p_uuid_cond->uuid.uu.uuid16);
+ len += LEN_UUID_16;
+ }
+ else if (p_uuid_cond->uuid.len == LEN_UUID_32)/*4 bytes */
+ {
+ UINT32_TO_STREAM(p, p_uuid_cond->uuid.uu.uuid32);
+ len += LEN_UUID_32;
+ }
+ else if (p_uuid_cond->uuid.len == LEN_UUID_128)
+ {
+ ARRAY_TO_STREAM (p, p_uuid_cond->uuid.uu.uuid128, LEN_UUID_128);
+ len += LEN_UUID_128;
+ }
+ else
+ {
+ BTM_TRACE_ERROR("illegal UUID length: %d", p_uuid_cond->uuid.len);
+ return BTM_ILLEGAL_VALUE;
+ }
+
+ if (NULL != p_uuid_cond->p_uuid_mask)
+ {
+ if (p_uuid_cond->uuid.len == LEN_UUID_16)
+ {
+ UINT16_TO_STREAM(p, p_uuid_cond->p_uuid_mask->uuid16_mask);
+ len += LEN_UUID_16;
+ }
+ else if (p_uuid_cond->uuid.len == LEN_UUID_32)/*4 bytes */
+ {
+ UINT32_TO_STREAM(p, p_uuid_cond->p_uuid_mask->uuid32_mask);
+ len += LEN_UUID_32;
+ }
+ else if (p_uuid_cond->uuid.len == LEN_UUID_128)
+ {
+ ARRAY_TO_STREAM (p, p_uuid_cond->p_uuid_mask->uuid128_mask, LEN_UUID_128);
+ len += LEN_UUID_128;
+ }
+ }
+ else
+ {
+ memset(p, 0xff, p_uuid_cond->uuid.len);
+ len += p_uuid_cond->uuid.len;
+ }
+ BTM_TRACE_DEBUG("btm_ble_update_uuid_filter : %d, %d, %d, %d", filter_type, evt_type,
+ p_uuid_cond->uuid.len, len);
+ }
+
+ /* send UUID filter update */
+ if ((st = BTM_VendorSpecificCommand (HCI_BLE_ADV_FILTER_OCF,
+ len,
+ param,
+ btm_ble_scan_pf_cmpl_cback)) != BTM_NO_RESOURCES)
+ {
+ if (p_uuid_cond && p_uuid_cond->p_target_addr)
+ memcpy(&btm_ble_adv_filt_cb.cur_filter_target, p_uuid_cond->p_target_addr,
+ sizeof(tBLE_BD_ADDR));
+ else
+ memset(&btm_ble_adv_filt_cb.cur_filter_target, 0, sizeof(tBLE_BD_ADDR));
+ }
+ else
+ {
+ BTM_TRACE_ERROR("UUID filter udpating failed");
+ }
+
+ return st;
+}
+
+
+/*******************************************************************************
+**
+** Function btm_ble_clear_scan_pf_filter
+**
+** Description clear all adv payload filter by de-select all the adv pf feature bits
+**
+**
+** Returns BTM_SUCCESS if sucessful,
+** BTM_ILLEGAL_VALUE if paramter is not valid.
+**
+*******************************************************************************/
+tBTM_STATUS btm_ble_clear_scan_pf_filter(tBTM_BLE_SCAN_COND_OP action,
+ tBTM_BLE_PF_FILT_INDEX filt_index,
+ tBTM_BLE_PF_COND_PARAM *p_cond,
+ tBTM_BLE_PF_CFG_CBACK *p_cmpl_cback,
+ tBTM_BLE_FILT_CB_EVT cb_evt,
+ tBTM_BLE_REF_VALUE ref_value)
+{
+ tBLE_BD_ADDR *p_target = (p_cond == NULL)? NULL : &p_cond->target_addr;
+ tBTM_BLE_PF_COUNT *p_bda_filter;
+ tBTM_STATUS st = BTM_WRONG_MODE;
+ UINT8 param[20], *p;
+
+ if (BTM_BLE_SCAN_COND_CLEAR != action)
+ {
+ BTM_TRACE_ERROR("unable to perform action:%d for generic adv filter type", action);
+ return BTM_ILLEGAL_VALUE;
+ }
+
+ p = param;
+ memset(param, 0, 20);
+
+ p_bda_filter = btm_ble_find_addr_filter_counter(p_target);
+
+ if (NULL == p_bda_filter ||
+ /* not a generic filter */
+ (p_target != NULL && p_bda_filter))
+ {
+ BTM_TRACE_ERROR("Error: Can not clear filter, No PF filter has been configured!");
+ return st;
+ }
+
+ /* clear the general filter entry */
+ if (NULL == p_target)
+ {
+ /* clear manufactuer data filter */
+ st = btm_ble_update_pf_manu_data(BTM_BLE_SCAN_COND_CLEAR, filt_index, NULL,
+ BTM_BLE_PF_MANU_DATA, cb_evt, ref_value);
+ if(BTM_CMD_STARTED == st)
+ btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_MANU_DATA, cb_evt,
+ ref_value, NULL, NULL);
+
+ /* clear local name filter */
+ st = btm_ble_update_pf_local_name(BTM_BLE_SCAN_COND_CLEAR, filt_index, NULL);
+ if(BTM_CMD_STARTED == st)
+ btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_LOCAL_NAME, cb_evt,
+ ref_value, NULL, NULL);
+
+ /* update the counter for service data */
+ st = btm_ble_update_srvc_data_change(BTM_BLE_SCAN_COND_CLEAR, filt_index, NULL);
+
+ /* clear UUID filter */
+ st = btm_ble_update_uuid_filter(BTM_BLE_SCAN_COND_CLEAR, filt_index,
+ BTM_BLE_PF_SRVC_UUID, NULL, cb_evt, ref_value);
+ if(BTM_CMD_STARTED == st)
+ btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_UUID, cb_evt, ref_value, NULL, NULL);
+
+ st = btm_ble_update_uuid_filter(BTM_BLE_SCAN_COND_CLEAR, filt_index,
+ BTM_BLE_PF_SRVC_SOL_UUID, NULL, cb_evt, ref_value);
+ if(BTM_CMD_STARTED == st)
+ btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_SOL_UUID, cb_evt,
+ ref_value, NULL, NULL);
+
+ /* clear service data filter */
+ st = btm_ble_update_pf_manu_data(BTM_BLE_SCAN_COND_CLEAR, filt_index, NULL,
+ BTM_BLE_PF_SRVC_DATA_PATTERN, cb_evt, ref_value);
+ if(BTM_CMD_STARTED == st)
+ btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_SRVC_DATA, cb_evt,
+ ref_value, NULL, NULL);
+ }
+
+ /* select feature based on control block settings */
+ UINT8_TO_STREAM(p, BTM_BLE_META_PF_FEAT_SEL);
+ UINT8_TO_STREAM(p, BTM_BLE_SCAN_COND_CLEAR);
+
+ /* Filter index */
+ UINT8_TO_STREAM(p, filt_index);
+
+ /* set PCF selection */
+ UINT32_TO_STREAM(p, BTM_BLE_PF_SELECT_NONE);
+ /* set logic condition as OR as default */
+ UINT8_TO_STREAM(p, BTM_BLE_PF_LOGIC_OR);
+
+ if ((st = BTM_VendorSpecificCommand (HCI_BLE_ADV_FILTER_OCF,
+ (UINT8)(BTM_BLE_ADV_FILT_META_HDR_LENGTH + BTM_BLE_PF_FEAT_SEL_LEN),
+ param,
+ btm_ble_scan_pf_cmpl_cback))
+ != BTM_NO_RESOURCES)
+ {
+ if (p_target)
+ memcpy(&btm_ble_adv_filt_cb.cur_filter_target, p_target, sizeof(tBLE_BD_ADDR));
+ else
+ memset(&btm_ble_adv_filt_cb.cur_filter_target, 0, sizeof(tBLE_BD_ADDR));
+ }
+ return st;
+}
+
+/*******************************************************************************
+**
+** Function BTM_BleAdvFilterParamSetup
+**
+** Description This function is called to setup the adv data payload filter
+** condition.
+**
+** Parameters action - Type of action to be performed
+** filt_index - Filter index
+** p_filt_params - Filter parameters
+** p_target - Target device
+** p_cmpl_back - Callback pointer
+** ref_value - reference value
+**
+** Returns void
+**
+*******************************************************************************/
+tBTM_STATUS BTM_BleAdvFilterParamSetup(int action, tBTM_BLE_PF_FILT_INDEX filt_index,
+ tBTM_BLE_PF_FILT_PARAMS *p_filt_params,
+ tBLE_BD_ADDR *p_target, tBTM_BLE_PF_PARAM_CBACK *p_cmpl_cback,
+ tBTM_BLE_REF_VALUE ref_value)
+{
+ UINT8 param[20], *p;
+ tBTM_STATUS st = BTM_WRONG_MODE;
+ tBTM_BLE_PF_COUNT *p_bda_filter = NULL;
+ UINT8 len =0;
+
+ if (BTM_SUCCESS != btm_ble_obtain_vsc_details())
+ return st;
+
+ p = param;
+ memset(param, 0, 20);
+ BTM_TRACE_EVENT (" BTM_BleAdvFilterParamSetup");
+
+ if (BTM_BLE_SCAN_COND_ADD == action)
+ {
+ p_bda_filter = btm_ble_find_addr_filter_counter(p_target);
+ if (NULL == p_bda_filter)
+ {
+ BTM_TRACE_ERROR("BD Address not found!");
+ return st;
+ }
+
+ BTM_TRACE_DEBUG("BTM_BleAdvFilterParamSetup : Feat mask:%d", p_filt_params->feat_seln);
+ /* select feature based on control block settings */
+ UINT8_TO_STREAM(p, BTM_BLE_META_PF_FEAT_SEL);
+ UINT8_TO_STREAM(p, BTM_BLE_SCAN_COND_ADD);
+
+ /* Filter index */
+ UINT8_TO_STREAM(p, filt_index);
+
+ /* set PCF selection */
+ UINT16_TO_STREAM(p, p_filt_params->feat_seln);
+ /* set logic type */
+ UINT16_TO_STREAM(p, p_filt_params->logic_type);
+ /* set logic condition */
+ UINT8_TO_STREAM(p, p_filt_params->filt_logic_type);
+ /* set RSSI high threshold */
+ UINT8_TO_STREAM(p, p_filt_params->rssi_high_thres);
+ /* set delivery mode */
+ UINT8_TO_STREAM(p, p_filt_params->dely_mode);
+
+ if (0x01 == p_filt_params->dely_mode)
+ {
+ /* set onfound timeout */
+ UINT16_TO_STREAM(p, p_filt_params->found_timeout);
+ /* set onfound timeout count*/
+ UINT8_TO_STREAM(p, p_filt_params->found_timeout_cnt);
+ /* set RSSI low threshold */
+ UINT8_TO_STREAM(p, p_filt_params->rssi_low_thres);
+ /* set onlost timeout */
+ UINT16_TO_STREAM(p, p_filt_params->lost_timeout);
+ }
+
+ len = BTM_BLE_ADV_FILT_META_HDR_LENGTH + BTM_BLE_ADV_FILT_FEAT_SELN_LEN;
+
+ if ((st = BTM_VendorSpecificCommand (HCI_BLE_ADV_FILTER_OCF,
+ (UINT8)len,
+ param,
+ btm_ble_scan_pf_cmpl_cback))
+ == BTM_NO_RESOURCES)
+ {
+ return st;
+ }
+ btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_FEAT_SEL, BTM_BLE_FILT_ADV_PARAM,
+ ref_value, NULL, p_cmpl_cback);
+ }
+ else
+ if (BTM_BLE_SCAN_COND_DELETE == action)
+ {
+ /* select feature based on control block settings */
+ UINT8_TO_STREAM(p, BTM_BLE_META_PF_FEAT_SEL);
+ UINT8_TO_STREAM(p, BTM_BLE_SCAN_COND_DELETE);
+ /* Filter index */
+ UINT8_TO_STREAM(p, filt_index);
+
+ if ((st = BTM_VendorSpecificCommand (HCI_BLE_ADV_FILTER_OCF,
+ (UINT8)(BTM_BLE_ADV_FILT_META_HDR_LENGTH),
+ param,
+ btm_ble_scan_pf_cmpl_cback))
+ == BTM_NO_RESOURCES)
+ {
+ return st;
+ }
+ btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_FEAT_SEL, BTM_BLE_FILT_ADV_PARAM,
+ ref_value, NULL, p_cmpl_cback);
+ }
+ else
+ if (BTM_BLE_SCAN_COND_CLEAR == action)
+ {
+ /* Deallocate all filters here */
+ btm_ble_dealloc_addr_filter_counter(NULL, BTM_BLE_PF_TYPE_ALL);
+
+ /* select feature based on control block settings */
+ UINT8_TO_STREAM(p, BTM_BLE_META_PF_FEAT_SEL);
+ UINT8_TO_STREAM(p, BTM_BLE_SCAN_COND_CLEAR);
+
+ if ((st = BTM_VendorSpecificCommand (HCI_BLE_ADV_FILTER_OCF,
+ (UINT8)(BTM_BLE_ADV_FILT_META_HDR_LENGTH-1),
+ param,
+ btm_ble_scan_pf_cmpl_cback))
+ == BTM_NO_RESOURCES)
+ {
+ return st;
+ }
+ btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_FEAT_SEL, BTM_BLE_FILT_ADV_PARAM,
+ ref_value, NULL, p_cmpl_cback);
+ }
+
+ return st;
+}
+
+/*******************************************************************************
+**
+** Function BTM_BleEnableDisableFilterFeature
+**
+** Description This function is called to enable / disable the APCF feature
+**
+** Parameters enable the generic scan condition.
+** enable: enable or disable the filter condition
+** p_stat_cback - Status callback pointer
+** ref_value - Ref value
+** Returns void
+**
+*******************************************************************************/
+tBTM_STATUS BTM_BleEnableDisableFilterFeature(UINT8 enable,
+ tBTM_BLE_PF_STATUS_CBACK *p_stat_cback,
+ tBTM_BLE_REF_VALUE ref_value)
+{
+ UINT8 param[20], *p;
+ tBTM_STATUS st = BTM_WRONG_MODE;
+
+ if (BTM_SUCCESS != btm_ble_obtain_vsc_details())
+ return st;
+
+ p = param;
+ memset(param, 0, 20);
+
+ /* enable the content filter in controller */
+ p = param;
+ UINT8_TO_STREAM(p, BTM_BLE_META_PF_ENABLE);
+ /* enable adv data payload filtering */
+ UINT8_TO_STREAM(p, enable);
+
+ if ((st = BTM_VendorSpecificCommand (HCI_BLE_ADV_FILTER_OCF,
+ BTM_BLE_PCF_ENABLE_LEN, param,
+ btm_ble_scan_pf_cmpl_cback)) == BTM_CMD_STARTED)
+ {
+ btm_ble_adv_filt_cb.p_filt_stat_cback = p_stat_cback;
+ btm_ble_advfilt_enq_op_q(enable, BTM_BLE_META_PF_ENABLE, BTM_BLE_FILT_ENABLE_DISABLE,
+ ref_value, NULL, NULL);
+ }
+ return st;
+}
+
+/*******************************************************************************
+**
+** Function BTM_BleCfgFilterCondition
+**
+** Description This function is called to configure the adv data payload filter
+** condition.
+**
+** Parameters action: to read/write/clear
+** cond_type: filter condition type.
+** filt_index - Filter index
+** p_cond: filter condition parameter
+** p_cmpl_cback - Config callback pointer
+** ref_value - Reference value
+**
+** Returns void
+**
+*******************************************************************************/
+tBTM_STATUS BTM_BleCfgFilterCondition(tBTM_BLE_SCAN_COND_OP action,
+ tBTM_BLE_PF_COND_TYPE cond_type,
+ tBTM_BLE_PF_FILT_INDEX filt_index,
+ tBTM_BLE_PF_COND_PARAM *p_cond,
+ tBTM_BLE_PF_CFG_CBACK *p_cmpl_cback,
+ tBTM_BLE_REF_VALUE ref_value)
+{
+ tBTM_STATUS st = BTM_ILLEGAL_VALUE;
+ UINT8 ocf = 0;
+ BTM_TRACE_EVENT (" BTM_BleCfgFilterCondition action:%d, cond_type:%d, index:%d", action,
+ cond_type, filt_index);
+
+ if (BTM_SUCCESS != btm_ble_obtain_vsc_details())
+ return st;
+
+ switch (cond_type)
+ {
+ /* write service data filter */
+ case BTM_BLE_PF_SRVC_DATA_PATTERN:
+ /* write manufacturer data filter */
+ case BTM_BLE_PF_MANU_DATA:
+ st = btm_ble_update_pf_manu_data(action, filt_index, p_cond, cond_type, 0, ref_value);
+ break;
+
+ /* write local name filter */
+ case BTM_BLE_PF_LOCAL_NAME:
+ st = btm_ble_update_pf_local_name(action, filt_index, p_cond);
+ break;
+
+ /* filter on advertiser address */
+ case BTM_BLE_PF_ADDR_FILTER:
+ st = btm_ble_update_addr_filter(action, filt_index, p_cond);
+ break;
+
+ /* filter on service/solicitated UUID */
+ case BTM_BLE_PF_SRVC_UUID:
+ case BTM_BLE_PF_SRVC_SOL_UUID:
+ st = btm_ble_update_uuid_filter(action, filt_index, cond_type, p_cond, 0, ref_value);
+ break;
+
+ case BTM_BLE_PF_SRVC_DATA:
+ st = btm_ble_update_srvc_data_change(action, filt_index, p_cond);
+ break;
+
+ case BTM_BLE_PF_TYPE_ALL: /* only used to clear filter */
+ st = btm_ble_clear_scan_pf_filter(action, filt_index, p_cond, p_cmpl_cback,
+ 0, ref_value);
+ break;
+
+ default:
+ BTM_TRACE_WARNING("condition type [%d] not supported currently.", cond_type);
+ break;
+ }
+
+ if(BTM_CMD_STARTED == st && cond_type != BTM_BLE_PF_TYPE_ALL)
+ {
+ ocf = btm_ble_condtype_to_ocf(cond_type);
+ btm_ble_advfilt_enq_op_q(action, ocf, BTM_BLE_FILT_CFG, ref_value, p_cmpl_cback, NULL);
+ }
+ else
+ if(BTM_CMD_STARTED == st && BTM_BLE_PF_TYPE_ALL == cond_type)
+ {
+ btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_FEAT_SEL, BTM_BLE_FILT_CFG,
+ ref_value, p_cmpl_cback, NULL);
+ }
+ return st;
+}
+
+/*******************************************************************************
+**
+** Function btm_ble_adv_filter_init
+**
+** Description This function initializes the adv filter control block
+**
+** Parameters
+**
+** Returns status
+**
+*******************************************************************************/
+void btm_ble_adv_filter_init(void)
+{
+ memset(&btm_ble_adv_filt_cb, 0, sizeof(tBTM_BLE_MULTI_ADV_CB));
+ if (BTM_SUCCESS != btm_ble_obtain_vsc_details())
+ return;
+
+ if (cmn_ble_vsc_cb.max_filter > 0)
+ {
+ btm_ble_adv_filt_cb.p_addr_filter_count =
+ (tBTM_BLE_PF_COUNT*) GKI_getbuf( sizeof(tBTM_BLE_PF_COUNT) * cmn_ble_vsc_cb.max_filter);
+ }
+
+ if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
+ return;
+}
+
+/*******************************************************************************
+**
+** Function btm_ble_adv_filter_cleanup
+**
+** Description This function de-initializes the adv filter control block
+**
+** Parameters
+**
+** Returns status
+**
+*******************************************************************************/
+void btm_ble_adv_filter_cleanup(void)
+{
+ if (btm_ble_adv_filt_cb.p_addr_filter_count)
+ GKI_freebuf (btm_ble_adv_filt_cb.p_addr_filter_count);
+}
+
+#endif
diff --git a/stack/btm/btm_ble_batchscan.c b/stack/btm/btm_ble_batchscan.c
new file mode 100644
index 0000000..7ae4b1e
--- /dev/null
+++ b/stack/btm/btm_ble_batchscan.c
@@ -0,0 +1,929 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 Broadcom Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+#include <string.h>
+#include <stdio.h>
+#include <stddef.h>
+#include "bt_target.h"
+
+#include "btm_ble_api.h"
+#include "bt_types.h"
+#include "bt_utils.h"
+#include "btu.h"
+#include "btm_int.h"
+#include "hcimsgs.h"
+
+#if (BLE_INCLUDED == TRUE)
+
+tBTM_BLE_BATCH_SCAN_CB ble_batchscan_cb;
+tBTM_BLE_ADV_TRACK_CB ble_advtrack_cb;
+
+
+/* length of each batch scan command */
+#define BTM_BLE_BATCH_SCAN_STORAGE_CFG_LEN 4
+#define BTM_BLE_BATCH_SCAN_PARAM_CONFIG_LEN 12
+#define BTM_BLE_BATCH_SCAN_ENB_DISB_LEN 2
+#define BTM_BLE_BATCH_SCAN_READ_RESULTS_LEN 2
+
+#define BTM_BLE_BATCH_SCAN_CB_EVT_MASK 0xF0
+#define BTM_BLE_BATCH_SCAN_SUBCODE_MASK 0x0F
+
+#define BTM_BLE_TRACK_ADV_CMD_LEN 9
+
+/*******************************************************************************
+** Local functions
+*******************************************************************************/
+void btm_ble_batchscan_vsc_cmpl_cback (tBTM_VSC_CMPL *p_params);
+void btm_ble_batchscan_cleanup(void);
+
+/*******************************************************************************
+**
+** Function btm_ble_batchscan_filter_track_adv_vse_cback
+**
+** Description VSE callback for batch scan, filter, and tracking events.
+**
+** Returns None
+**
+*******************************************************************************/
+void btm_ble_batchscan_filter_track_adv_vse_cback(UINT8 len, UINT8 *p)
+{
+ UINT8 sub_event = 0, filt_index = 0, addr_type = 0, adv_state = 0;
+ BD_ADDR bd_addr;
+ STREAM_TO_UINT8(sub_event, p);
+
+ BTM_TRACE_EVENT("btm_ble_batchscan_filter_track_adv_vse_cback called with event:%x", sub_event);
+ if (HCI_VSE_SUBCODE_BLE_THRESHOLD_SUB_EVT == sub_event &&
+ NULL != ble_batchscan_cb.p_thres_cback)
+ {
+ ble_batchscan_cb.p_thres_cback(ble_batchscan_cb.ref_value);
+ return;
+ }
+
+ if (HCI_VSE_SUBCODE_BLE_TRACKING_SUB_EVT == sub_event && NULL != ble_advtrack_cb.p_track_cback)
+ {
+ if (len < 10)
+ return;
+ STREAM_TO_UINT8(filt_index, p);
+ STREAM_TO_UINT8(addr_type, p);
+ STREAM_TO_BDADDR(bd_addr, p);
+ STREAM_TO_UINT8(adv_state, p);
+ BTM_TRACE_EVENT("track_adv_vse_cback called: %d, %d, %d", filt_index, addr_type, adv_state);
+ ble_advtrack_cb.p_track_cback(filt_index, addr_type, bd_addr, adv_state,
+ ble_advtrack_cb.ref_value);
+ return;
+ }
+}
+
+/*******************************************************************************
+**
+** Function btm_ble_batchscan_enq_op_q
+**
+** Description enqueue a batchscan operation in q to check command complete
+** status
+**
+** Returns void
+**
+*******************************************************************************/
+void btm_ble_batchscan_enq_op_q(UINT8 opcode, tBTM_BLE_BATCH_SCAN_STATE cur_state,
+ UINT8 cb_evt, tBTM_BLE_REF_VALUE ref_value)
+{
+ ble_batchscan_cb.op_q.sub_code[ble_batchscan_cb.op_q.next_idx] = (opcode |(cb_evt << 4));
+ ble_batchscan_cb.op_q.cur_state[ble_batchscan_cb.op_q.next_idx] = cur_state;
+ ble_batchscan_cb.op_q.ref_value[ble_batchscan_cb.op_q.next_idx] = ref_value;
+ BTM_TRACE_DEBUG("btm_ble_batchscan_enq_op_q: subcode:%d, Cur_state:%d, ref_value:%d",
+ ble_batchscan_cb.op_q.sub_code[ble_batchscan_cb.op_q.next_idx],
+ ble_batchscan_cb.op_q.cur_state[ble_batchscan_cb.op_q.next_idx],
+ ble_batchscan_cb.op_q.ref_value[ble_batchscan_cb.op_q.next_idx]);
+ ble_batchscan_cb.op_q.next_idx = (ble_batchscan_cb.op_q.next_idx + 1)
+ % BTM_BLE_BATCH_SCAN_MAX;
+}
+
+/*******************************************************************************
+**
+** Function btm_ble_batchscan_enq_rep_q
+**
+** Description enqueue a batchscan report operation in q to check command complete
+** status
+**
+** Returns void
+**
+*******************************************************************************/
+tBTM_STATUS btm_ble_batchscan_enq_rep_q(UINT8 report_format, tBTM_BLE_REF_VALUE ref_value)
+{
+ int i = 0;
+ for (i = 0; i < BTM_BLE_BATCH_REP_MAIN_Q_SIZE; i++)
+ {
+ if (report_format == ble_batchscan_cb.main_rep_q.rep_mode[i])
+ return BTM_ILLEGAL_VALUE;
+ }
+
+ ble_batchscan_cb.main_rep_q.rep_mode[ble_batchscan_cb.main_rep_q.next_idx] = report_format;
+ ble_batchscan_cb.main_rep_q.ref_value[ble_batchscan_cb.main_rep_q.next_idx] = ref_value;
+ ble_batchscan_cb.main_rep_q.num_records[ble_batchscan_cb.main_rep_q.next_idx] = 0;
+ ble_batchscan_cb.main_rep_q.data_len[ble_batchscan_cb.main_rep_q.next_idx] = 0;
+ ble_batchscan_cb.main_rep_q.p_data[ble_batchscan_cb.main_rep_q.next_idx] = NULL;
+ BTM_TRACE_DEBUG("btm_ble_batchscan_enq_rep_q: index:%d, rep %d, ref %d",
+ ble_batchscan_cb.main_rep_q.next_idx, report_format, ref_value);
+
+ ble_batchscan_cb.main_rep_q.next_idx = (ble_batchscan_cb.main_rep_q.next_idx + 1)
+ % BTM_BLE_BATCH_REP_MAIN_Q_SIZE;
+ return BTM_SUCCESS;
+}
+
+/*******************************************************************************
+**
+** Function btm_ble_batchscan_enq_rep_data
+**
+** Description setup the data in the main report queue
+**
+** Returns void
+**
+*******************************************************************************/
+void btm_ble_batchscan_enq_rep_data(UINT8 report_format, UINT8 num_records, UINT8 *p_data,
+ UINT8 data_len)
+{
+ int index = 0, len = 0;
+ UINT8 *p_orig_data = NULL, *p_app_data = NULL;
+
+ for (index = 0; index < BTM_BLE_BATCH_REP_MAIN_Q_SIZE; index++)
+ {
+ if (report_format == ble_batchscan_cb.main_rep_q.rep_mode[index])
+ break;
+ }
+
+ BTM_TRACE_DEBUG("btm_ble_batchscan_enq_rep_data: index:%d, rep %d, num %d len : %d",
+ index, report_format, num_records, data_len);
+
+ if (index < BTM_BLE_BATCH_REP_MAIN_Q_SIZE && data_len > 0 && num_records > 0)
+ {
+ len = ble_batchscan_cb.main_rep_q.data_len[index];
+ p_orig_data = ble_batchscan_cb.main_rep_q.p_data[index];
+ if (NULL != p_orig_data)
+ {
+ p_app_data = GKI_getbuf(len + data_len);
+ memcpy(p_app_data, p_orig_data, len);
+ memcpy(p_app_data+len, p_data, data_len);
+ GKI_freebuf(p_orig_data);
+ ble_batchscan_cb.main_rep_q.p_data[index] = p_app_data;
+ ble_batchscan_cb.main_rep_q.num_records[index] += num_records;
+ ble_batchscan_cb.main_rep_q.data_len[index] += data_len;
+ }
+ else
+ {
+ p_app_data = GKI_getbuf(data_len);
+ memcpy(p_app_data, p_data, data_len);
+ ble_batchscan_cb.main_rep_q.p_data[index] = p_app_data;
+ ble_batchscan_cb.main_rep_q.num_records[index] = num_records;
+ ble_batchscan_cb.main_rep_q.data_len[index] = data_len;
+ }
+ }
+}
+
+/*******************************************************************************
+**
+** Function btm_ble_batchscan_deq_rep_q
+**
+** Description dequeue a batchscan report in q when command complete
+** is received
+**
+** Returns void
+**
+*******************************************************************************/
+void btm_ble_batchscan_deq_rep_data(UINT8 report_format, tBTM_BLE_REF_VALUE *p_ref_value,
+ UINT8 *p_num_records, UINT8 **p_data, UINT16 *p_data_len)
+{
+ int index = 0;
+
+ for (index = 0; index < BTM_BLE_BATCH_REP_MAIN_Q_SIZE; index++)
+ {
+ if (report_format == ble_batchscan_cb.main_rep_q.rep_mode[index])
+ break;
+ }
+
+ if (BTM_BLE_BATCH_REP_MAIN_Q_SIZE == index)
+ {
+ BTM_TRACE_ERROR("btm_ble_batchscan_deq_rep_data: rep_format:%d not found", report_format);
+ return;
+ }
+
+ *p_num_records = ble_batchscan_cb.main_rep_q.num_records[index];
+ *p_ref_value = ble_batchscan_cb.main_rep_q.ref_value[index];
+ *p_data = ble_batchscan_cb.main_rep_q.p_data[index];
+ *p_data_len = ble_batchscan_cb.main_rep_q.data_len[index];
+
+ ble_batchscan_cb.main_rep_q.p_data[index] = NULL;
+ ble_batchscan_cb.main_rep_q.data_len[index] = 0;
+ ble_batchscan_cb.main_rep_q.rep_mode[index] = 0;
+ ble_batchscan_cb.main_rep_q.ref_value[index] = 0;
+ ble_batchscan_cb.main_rep_q.num_records[index] = 0;
+
+ BTM_TRACE_DEBUG("btm_ble_batchscan_deq_rep_data: index:%d, rep %d, num %d, data_len %d",
+ index, report_format, *p_num_records, *p_data_len);
+
+ ble_batchscan_cb.main_rep_q.pending_idx = (ble_batchscan_cb.main_rep_q.pending_idx + 1)
+ % BTM_BLE_BATCH_SCAN_MAX;
+}
+
+/*******************************************************************************
+**
+** Function btm_ble_batchscan_deq_op_q
+**
+** Description dequeue a batch scan operation from q when command complete
+** is received
+**
+** Returns void
+**
+*******************************************************************************/
+void btm_ble_batchscan_deq_op_q(UINT8 *p_opcode,tBTM_BLE_BATCH_SCAN_STATE *cur_state,
+ UINT8 *p_cb_evt, tBTM_BLE_REF_VALUE *p_ref)
+{
+ *p_cb_evt = (ble_batchscan_cb.op_q.sub_code[ble_batchscan_cb.op_q.pending_idx] >> 4);
+ *p_opcode = (ble_batchscan_cb.op_q.sub_code[ble_batchscan_cb.op_q.pending_idx]
+ & BTM_BLE_BATCH_SCAN_SUBCODE_MASK);
+ *p_ref = ble_batchscan_cb.op_q.ref_value[ble_batchscan_cb.op_q.pending_idx];
+ *cur_state = (ble_batchscan_cb.op_q.cur_state[ble_batchscan_cb.op_q.pending_idx]);
+ ble_batchscan_cb.op_q.pending_idx = (ble_batchscan_cb.op_q.pending_idx + 1)
+ % BTM_BLE_BATCH_SCAN_MAX;
+}
+
+/*******************************************************************************
+**
+** Function btm_ble_read_batchscan_reports
+**
+** Description This function reads the reports from controller
+**
+** Parameters scan_mode - The mode for which the reports are to be read out from the controller
+** ref_value - Reference value
+**
+** Returns status
+**
+*******************************************************************************/
+tBTM_STATUS btm_ble_read_batchscan_reports(tBTM_BLE_BATCH_SCAN_MODE scan_mode,
+ tBTM_BLE_REF_VALUE ref_value)
+{
+ tBTM_STATUS status = BTM_NO_RESOURCES;
+ UINT8 param[BTM_BLE_BATCH_SCAN_READ_RESULTS_LEN], *pp;
+ pp = param;
+
+ memset(param, 0, BTM_BLE_BATCH_SCAN_READ_RESULTS_LEN);
+
+ UINT8_TO_STREAM (pp, BTM_BLE_BATCH_SCAN_READ_RESULTS);
+ UINT8_TO_STREAM (pp, scan_mode);
+
+ if ((status = BTM_VendorSpecificCommand (HCI_BLE_BATCH_SCAN_OCF,
+ BTM_BLE_BATCH_SCAN_READ_RESULTS_LEN, param, btm_ble_batchscan_vsc_cmpl_cback))
+ != BTM_CMD_STARTED)
+ {
+ BTM_TRACE_ERROR("btm_ble_read_batchscan_reports %d", status);
+ return BTM_ILLEGAL_VALUE;
+ }
+
+ if (BTM_CMD_STARTED == status)
+ {
+ /* The user needs to be provided scan read reports event */
+ btm_ble_batchscan_enq_op_q(BTM_BLE_BATCH_SCAN_READ_RESULTS, ble_batchscan_cb.cur_state,
+ BTM_BLE_BATCH_SCAN_READ_REPTS_EVT, ref_value);
+ }
+
+ return status;
+}
+
+/*******************************************************************************
+**
+** Function btm_ble_batchscan_vsc_cmpl_cback
+**
+** Description Batch scan VSC complete callback
+**
+** Parameters p_params - VSC completed callback parameters
+**
+** Returns void
+**
+*******************************************************************************/
+void btm_ble_batchscan_vsc_cmpl_cback (tBTM_VSC_CMPL *p_params)
+{
+ UINT8 *p = p_params->p_param_buf;
+ UINT16 len = p_params->param_len;
+ tBTM_BLE_REF_VALUE ref_value = 0;
+ int index = 0;
+
+ UINT8 status = 0, subcode = 0, opcode = 0;
+ UINT8 report_format = 0, num_records = 0, cb_evt = 0;
+ UINT16 data_len = 0;
+ tBTM_BLE_BATCH_SCAN_STATE cur_state = 0;
+ tBTM_STATUS btm_status = 0;
+ UINT8 *p_data = NULL;
+
+ if (len < 2)
+ {
+ BTM_TRACE_ERROR("wrong length for btm_ble_batch_scan_vsc_cmpl_cback");
+ btm_ble_batchscan_deq_op_q(&opcode, &cur_state, &cb_evt, &ref_value);
+ return;
+ }
+
+ STREAM_TO_UINT8(status, p);
+ STREAM_TO_UINT8(subcode, p);
+
+ btm_ble_batchscan_deq_op_q(&opcode, &cur_state, &cb_evt, &ref_value);
+
+ BTM_TRACE_DEBUG("btm_ble_batchscan op_code = %02x state = %02x cb_evt = %02x,ref_value=%d",
+ opcode, cur_state, cb_evt, ref_value);
+
+ if (opcode != subcode)
+ {
+ BTM_TRACE_ERROR("Got unexpected VSC cmpl, expected: %d got: %d",subcode,opcode);
+ return;
+ }
+
+ switch (subcode)
+ {
+ case BTM_BLE_BATCH_SCAN_ENB_DISAB_CUST_FEATURE:
+ {
+ if (BTM_SUCCESS == status && BTM_BLE_SCAN_ENABLE_CALLED == cur_state)
+ ble_batchscan_cb.cur_state = BTM_BLE_SCAN_ENABLED_STATE;
+ else
+ if (BTM_BLE_SCAN_ENABLE_CALLED == cur_state)
+ {
+ BTM_TRACE_ERROR("SCAN_ENB_DISAB_CUST_FEATURE - Invalid state after enb");
+ ble_batchscan_cb.cur_state = BTM_BLE_SCAN_INVALID_STATE;
+ }
+
+ BTM_TRACE_DEBUG("BTM_BLE_BATCH_SCAN_ENB_DISAB_CUST_FEAT status = %d, state: %d,evt=%d",
+ status, ble_batchscan_cb.cur_state, cb_evt);
+
+ if (cb_evt != 0 && NULL != ble_batchscan_cb.p_setup_cback)
+ ble_batchscan_cb.p_setup_cback(cb_evt, ref_value, status);
+ break;
+ }
+
+ case BTM_BLE_BATCH_SCAN_SET_STORAGE_PARAM:
+ {
+ BTM_TRACE_DEBUG("BTM_BLE_BATCH_SCAN_SET_STORAGE_PARAM status = %d, evt=%d",
+ status, cb_evt);
+ if (cb_evt != 0 && NULL != ble_batchscan_cb.p_setup_cback)
+ ble_batchscan_cb.p_setup_cback(cb_evt, ref_value, status);
+ break;
+ }
+
+ case BTM_BLE_BATCH_SCAN_SET_PARAMS:
+ {
+ BTM_TRACE_DEBUG("BTM_BLE_BATCH_SCAN_SET_PARAMS status = %d,evt=%d", status, cb_evt);
+
+ if (BTM_BLE_SCAN_DISABLE_CALLED == cur_state)
+ {
+ if (BTM_SUCCESS == status)
+ {
+ ble_batchscan_cb.cur_state = BTM_BLE_SCAN_DISABLED_STATE;
+ }
+ else
+ {
+ BTM_TRACE_ERROR("BTM_BLE_BATCH_SCAN_SET_PARAMS - Invalid state after disabled");
+ ble_batchscan_cb.cur_state = BTM_BLE_SCAN_INVALID_STATE;
+ }
+ }
+
+ if (cb_evt != 0 && NULL != ble_batchscan_cb.p_setup_cback)
+ ble_batchscan_cb.p_setup_cback(cb_evt, ref_value, status);
+ break;
+ }
+
+ case BTM_BLE_BATCH_SCAN_READ_RESULTS:
+ {
+ if (cb_evt != 0 && NULL != ble_batchscan_cb.p_scan_rep_cback)
+ {
+ STREAM_TO_UINT8(report_format,p);
+ STREAM_TO_UINT8(num_records, p);
+ p = (uint8_t *)(p_params->p_param_buf + 4);
+ BTM_TRACE_DEBUG("BTM_BLE_BATCH_SCAN_READ_RESULTS status=%d,len=%d,rec=%d",
+ status, len-4, num_records);
+
+ if (0 == num_records)
+ {
+ btm_ble_batchscan_deq_rep_data(report_format, &ref_value, &num_records,
+ &p_data, &data_len);
+ if (NULL != ble_batchscan_cb.p_scan_rep_cback)
+ ble_batchscan_cb.p_scan_rep_cback(ref_value,report_format, num_records,
+ data_len, p_data, status);
+ }
+ else
+ {
+ if ((len-4) > 0)
+ {
+ btm_ble_batchscan_enq_rep_data(report_format, num_records, p, len-4);
+ /* More records could be in the buffer and needs to be pulled out */
+ btm_status = btm_ble_read_batchscan_reports(report_format, ref_value);
+ if (BTM_CMD_STARTED != btm_status)
+ {
+ btm_ble_batchscan_deq_rep_data(report_format, &ref_value, &num_records,
+ &p_data, &data_len);
+ /* Send whatever is available, in case of a command failure */
+ if (NULL != ble_batchscan_cb.p_scan_rep_cback && NULL != p_data)
+ ble_batchscan_cb.p_scan_rep_cback(ref_value,report_format,
+ num_records, data_len, p_data, status);
+ }
+ }
+ }
+ }
+ break;
+ }
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+/*******************************************************************************
+**
+** Function btm_ble_set_storage_config
+**
+** Description This function writes the storage configuration in controller
+**
+** Parameters batch_scan_full_max -Max storage space (in %) allocated to full scanning
+** batch_scan_trunc_max -Max storage space (in %) allocated to truncated scanning
+** batch_scan_notify_threshold - Setup notification level based on total space
+**
+** Returns status
+**
+*******************************************************************************/
+tBTM_STATUS btm_ble_set_storage_config(UINT8 batch_scan_full_max, UINT8 batch_scan_trunc_max,
+ UINT8 batch_scan_notify_threshold)
+{
+ tBTM_STATUS status = BTM_NO_RESOURCES;
+ UINT8 param[BTM_BLE_BATCH_SCAN_STORAGE_CFG_LEN], *pp;
+
+ pp = param;
+ memset(param, 0, BTM_BLE_BATCH_SCAN_STORAGE_CFG_LEN);
+
+ UINT8_TO_STREAM (pp, BTM_BLE_BATCH_SCAN_SET_STORAGE_PARAM);
+ UINT8_TO_STREAM (pp, batch_scan_full_max);
+ UINT8_TO_STREAM (pp, batch_scan_trunc_max);
+ UINT8_TO_STREAM (pp, batch_scan_notify_threshold);
+
+ if ((status = BTM_VendorSpecificCommand (HCI_BLE_BATCH_SCAN_OCF,
+ BTM_BLE_BATCH_SCAN_STORAGE_CFG_LEN, param,
+ btm_ble_batchscan_vsc_cmpl_cback))!= BTM_CMD_STARTED)
+ {
+ BTM_TRACE_ERROR("btm_ble_set_storage_config %d", status);
+ return BTM_ILLEGAL_VALUE;
+ }
+
+ return status;
+}
+
+/*******************************************************************************
+**
+** Function btm_ble_set_batchscan_param
+**
+** Description This function writes the batch scan params in controller
+**
+** Parameters scan_mode -Batch scan mode
+** scan_interval - Scan interval
+** scan_window - Scan window
+** discard_rule -Discard rules
+** addr_type - Address type
+**
+** Returns status
+**
+*******************************************************************************/
+tBTM_STATUS btm_ble_set_batchscan_param(tBTM_BLE_BATCH_SCAN_MODE scan_mode,
+ UINT32 scan_interval, UINT32 scan_window, tBLE_ADDR_TYPE addr_type,
+ tBTM_BLE_DISCARD_RULE discard_rule)
+{
+ tBTM_STATUS status = BTM_NO_RESOURCES;
+ UINT8 scan_param[BTM_BLE_BATCH_SCAN_PARAM_CONFIG_LEN], *pp_scan;
+
+ pp_scan = scan_param;
+ memset(scan_param, 0, BTM_BLE_BATCH_SCAN_PARAM_CONFIG_LEN);
+
+ UINT8_TO_STREAM (pp_scan, BTM_BLE_BATCH_SCAN_SET_PARAMS);
+ UINT8_TO_STREAM (pp_scan, scan_mode);
+ UINT32_TO_STREAM (pp_scan, scan_window);
+ UINT32_TO_STREAM (pp_scan, scan_interval);
+ UINT8_TO_STREAM (pp_scan, addr_type);
+ UINT8_TO_STREAM (pp_scan, discard_rule);
+
+ if ((status = BTM_VendorSpecificCommand (HCI_BLE_BATCH_SCAN_OCF,
+ BTM_BLE_BATCH_SCAN_PARAM_CONFIG_LEN,
+ scan_param, btm_ble_batchscan_vsc_cmpl_cback))!= BTM_CMD_STARTED)
+ {
+ BTM_TRACE_ERROR("btm_ble_set_batchscan_param %d", status);
+ return BTM_ILLEGAL_VALUE;
+ }
+
+ return status;
+}
+
+/*******************************************************************************
+**
+** Function btm_ble_enable_disable_batchscan
+**
+** Description This function enables the customer specific feature in controller
+**
+** Parameters enable_disable: true - enable, false - disable
+**
+** Returns status
+**
+*******************************************************************************/
+tBTM_STATUS btm_ble_enable_disable_batchscan(BOOLEAN should_enable)
+{
+ tBTM_STATUS status = BTM_NO_RESOURCES;
+ UINT8 shld_enable = 0x01;
+ UINT8 enable_param[BTM_BLE_BATCH_SCAN_ENB_DISB_LEN], *pp_enable;
+
+ if (!should_enable)
+ shld_enable = 0x00;
+
+ if (should_enable)
+ {
+ pp_enable = enable_param;
+ memset(enable_param, 0, BTM_BLE_BATCH_SCAN_ENB_DISB_LEN);
+
+ UINT8_TO_STREAM (pp_enable, BTM_BLE_BATCH_SCAN_ENB_DISAB_CUST_FEATURE);
+ UINT8_TO_STREAM (pp_enable, shld_enable);
+
+ if ((status = BTM_VendorSpecificCommand(HCI_BLE_BATCH_SCAN_OCF,
+ BTM_BLE_BATCH_SCAN_ENB_DISB_LEN, enable_param,
+ btm_ble_batchscan_vsc_cmpl_cback)) != BTM_CMD_STARTED)
+ {
+ status = BTM_MODE_UNSUPPORTED;
+ BTM_TRACE_ERROR("btm_ble_enable_disable_batchscan %d", status);
+ return BTM_ILLEGAL_VALUE;
+ }
+ }
+ else
+ if ((status = btm_ble_set_batchscan_param(BTM_BLE_BATCH_SCAN_MODE_DISABLE,
+ ble_batchscan_cb.scan_interval, ble_batchscan_cb.scan_window,
+ ble_batchscan_cb.addr_type, ble_batchscan_cb.discard_rule)) != BTM_CMD_STARTED)
+ {
+ status = BTM_MODE_UNSUPPORTED;
+ BTM_TRACE_ERROR("btm_ble_enable_disable_batchscan %d", status);
+ return BTM_ILLEGAL_VALUE;
+ }
+
+ if (should_enable)
+ ble_batchscan_cb.cur_state = BTM_BLE_SCAN_ENABLE_CALLED;
+ else
+ ble_batchscan_cb.cur_state = BTM_BLE_SCAN_DISABLE_CALLED;
+ return status;
+}
+
+/*******************************************************************************
+**
+** Function BTM_BleSetStorageConfig
+**
+** Description This function is called to write storage config params.
+**
+** Parameters: batch_scan_full_max - Max storage space (in %) allocated to full style
+** batch_scan_trunc_max - Max storage space (in %) allocated to trunc style
+** batch_scan_notify_threshold - Setup notification level based on total space
+** p_setup_cback - Setup callback pointer
+** p_thres_cback - Threshold callback pointer
+** p_rep_cback - Reports callback pointer
+** ref_value - Reference value
+**
+** Returns tBTM_STATUS
+**
+*******************************************************************************/
+tBTM_STATUS BTM_BleSetStorageConfig(UINT8 batch_scan_full_max, UINT8 batch_scan_trunc_max,
+ UINT8 batch_scan_notify_threshold,
+ tBTM_BLE_SCAN_SETUP_CBACK *p_setup_cback,
+ tBTM_BLE_SCAN_THRESHOLD_CBACK *p_thres_cback,
+ tBTM_BLE_SCAN_REP_CBACK* p_rep_cback,
+ tBTM_BLE_REF_VALUE ref_value)
+{
+ tBTM_STATUS status = BTM_NO_RESOURCES;
+ tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
+
+ BTM_TRACE_EVENT (" BTM_BleSetStorageConfig: %d, %d, %d, %d, %d",
+ ble_batchscan_cb.cur_state, ref_value, batch_scan_full_max, batch_scan_trunc_max,
+ batch_scan_notify_threshold);
+
+ if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
+ return BTM_ILLEGAL_VALUE;
+
+ BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
+
+ if (0 == cmn_ble_vsc_cb.tot_scan_results_strg)
+ {
+ BTM_TRACE_ERROR("Controller does not support batch scan");
+ return BTM_ERR_PROCESSING;
+ }
+
+ ble_batchscan_cb.p_setup_cback = p_setup_cback;
+ ble_batchscan_cb.p_thres_cback = p_thres_cback;
+ ble_batchscan_cb.p_scan_rep_cback = p_rep_cback;
+ ble_batchscan_cb.ref_value = ref_value;
+
+ if (batch_scan_full_max > BTM_BLE_ADV_SCAN_FULL_MAX ||
+ batch_scan_trunc_max > BTM_BLE_ADV_SCAN_TRUNC_MAX ||
+ batch_scan_notify_threshold > BTM_BLE_ADV_SCAN_THR_MAX)
+ {
+ BTM_TRACE_ERROR("Illegal set storage config params");
+ return BTM_ILLEGAL_VALUE;
+ }
+
+ if (BTM_BLE_SCAN_INVALID_STATE == ble_batchscan_cb.cur_state ||
+ BTM_BLE_SCAN_DISABLED_STATE == ble_batchscan_cb.cur_state ||
+ BTM_BLE_SCAN_DISABLE_CALLED == ble_batchscan_cb.cur_state)
+ {
+ status = btm_ble_enable_disable_batchscan(TRUE);
+ if (BTM_CMD_STARTED != status)
+ return status;
+
+ ble_batchscan_cb.cur_state = BTM_BLE_SCAN_ENABLE_CALLED;
+ btm_ble_batchscan_enq_op_q(BTM_BLE_BATCH_SCAN_ENB_DISAB_CUST_FEATURE,
+ BTM_BLE_SCAN_ENABLE_CALLED, 0, ref_value);
+ }
+
+ status = btm_ble_set_storage_config(batch_scan_full_max, batch_scan_trunc_max,
+ batch_scan_notify_threshold);
+ if (BTM_CMD_STARTED != status)
+ return status;
+ /* The user needs to be provided scan config storage event */
+ btm_ble_batchscan_enq_op_q(BTM_BLE_BATCH_SCAN_SET_STORAGE_PARAM, ble_batchscan_cb.cur_state,
+ BTM_BLE_BATCH_SCAN_CFG_STRG_EVT, ref_value);
+
+ return status;
+}
+
+
+/*******************************************************************************
+**
+** Function BTM_BleEnableBatchScan
+**
+** Description This function is called to configure and enable batch scanning
+**
+** Parameters: scan_mode -Batch scan mode
+** scan_interval - Scan interval value
+** scan_window - Scan window value
+** discard_rule - Data discard rule
+** ref_value - Reference value
+**
+** Returns tBTM_STATUS
+**
+*******************************************************************************/
+tBTM_STATUS BTM_BleEnableBatchScan(tBTM_BLE_BATCH_SCAN_MODE scan_mode,
+ UINT32 scan_interval, UINT32 scan_window, tBLE_ADDR_TYPE addr_type,
+ tBTM_BLE_DISCARD_RULE discard_rule, tBTM_BLE_REF_VALUE ref_value)
+{
+ tBTM_STATUS status = BTM_NO_RESOURCES;
+ tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
+ BTM_TRACE_EVENT (" BTM_BleEnableBatchScan: %d, %d, %d, %d, %d, %d",
+ scan_mode, scan_interval, scan_window, addr_type, discard_rule, ref_value);
+
+ if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
+ return BTM_ILLEGAL_VALUE;
+
+ BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
+
+ if (0 == cmn_ble_vsc_cb.tot_scan_results_strg)
+ {
+ BTM_TRACE_ERROR("Controller does not support batch scan");
+ return BTM_ERR_PROCESSING;
+ }
+
+ BTM_TRACE_DEBUG("BTM_BleEnableBatchScan: %d, %x, %x, %d, %d", scan_mode, scan_interval,
+ scan_window, discard_rule, ble_batchscan_cb.cur_state);
+
+ /* Only 16 bits will be used for scan interval and scan window as per agreement with Google */
+ /* So the standard LE range would suffice for scan interval and scan window */
+ if ((BTM_BLE_VALID_PRAM(scan_interval, BTM_BLE_SCAN_INT_MIN, BTM_BLE_SCAN_INT_MAX) ||
+ BTM_BLE_VALID_PRAM(scan_window, BTM_BLE_SCAN_WIN_MIN, BTM_BLE_SCAN_WIN_MAX))
+ && (BTM_BLE_BATCH_SCAN_MODE_PASS == scan_mode || BTM_BLE_BATCH_SCAN_MODE_ACTI == scan_mode
+ || BTM_BLE_BATCH_SCAN_MODE_PASS_ACTI == scan_mode)
+ && (BTM_BLE_DISCARD_OLD_ITEMS == discard_rule ||
+ BTM_BLE_DISCARD_LOWER_RSSI_ITEMS == discard_rule))
+ {
+ if (BTM_BLE_SCAN_INVALID_STATE == ble_batchscan_cb.cur_state ||
+ BTM_BLE_SCAN_DISABLED_STATE == ble_batchscan_cb.cur_state ||
+ BTM_BLE_SCAN_DISABLE_CALLED == ble_batchscan_cb.cur_state)
+ {
+ status = btm_ble_enable_disable_batchscan(TRUE);
+ if (BTM_CMD_STARTED != status)
+ return status;
+ btm_ble_batchscan_enq_op_q(BTM_BLE_BATCH_SCAN_ENB_DISAB_CUST_FEATURE,
+ BTM_BLE_SCAN_ENABLE_CALLED, 0, ref_value);
+ }
+
+ ble_batchscan_cb.scan_mode = scan_mode;
+ ble_batchscan_cb.scan_interval = scan_interval;
+ ble_batchscan_cb.scan_window = scan_window;
+ ble_batchscan_cb.addr_type = addr_type;
+ ble_batchscan_cb.discard_rule = discard_rule;
+ /* This command starts batch scanning, if enabled */
+ status = btm_ble_set_batchscan_param(scan_mode, scan_interval, scan_window, addr_type,
+ discard_rule);
+ if (BTM_CMD_STARTED != status)
+ return status;
+
+ /* The user needs to be provided scan enable event */
+ btm_ble_batchscan_enq_op_q(BTM_BLE_BATCH_SCAN_SET_PARAMS, ble_batchscan_cb.cur_state,
+ BTM_BLE_BATCH_SCAN_ENABLE_EVT, ref_value);
+ }
+ else
+ {
+ BTM_TRACE_ERROR("Illegal enable scan params");
+ return BTM_ILLEGAL_VALUE;
+ }
+ return status;
+}
+
+/*******************************************************************************
+**
+** Function BTM_BleDisableBatchScan
+**
+** Description This function is called to disable batch scanning
+**
+** Parameters: ref_value - Reference value
+**
+** Returns tBTM_STATUS
+**
+*******************************************************************************/
+tBTM_STATUS BTM_BleDisableBatchScan(tBTM_BLE_REF_VALUE ref_value)
+{
+ tBTM_STATUS status = BTM_NO_RESOURCES;
+ tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
+ BTM_TRACE_EVENT (" BTM_BleDisableBatchScan");
+
+ if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
+ return BTM_ILLEGAL_VALUE;
+
+ BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
+
+ if (0 == cmn_ble_vsc_cb.tot_scan_results_strg)
+ {
+ BTM_TRACE_ERROR("Controller does not support batch scan");
+ return BTM_ERR_PROCESSING;
+ }
+
+ status = btm_ble_enable_disable_batchscan(FALSE);
+ if (BTM_CMD_STARTED == status)
+ {
+ /* The user needs to be provided scan disable event */
+ btm_ble_batchscan_enq_op_q(BTM_BLE_BATCH_SCAN_SET_PARAMS,
+ BTM_BLE_SCAN_DISABLE_CALLED, BTM_BLE_BATCH_SCAN_DISABLE_EVT,
+ ref_value);
+ }
+
+ return status;
+}
+
+/*******************************************************************************
+**
+** Function BTM_BleReadScanReports
+**
+** Description This function is called to start reading batch scan reports
+**
+** Parameters: scan_mode - Batch scan mode
+** ref_value - Reference value
+**
+** Returns tBTM_STATUS
+**
+*******************************************************************************/
+tBTM_STATUS BTM_BleReadScanReports(tBTM_BLE_BATCH_SCAN_MODE scan_mode,
+ tBTM_BLE_REF_VALUE ref_value)
+{
+ tBTM_STATUS status = BTM_NO_RESOURCES;
+ tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
+ UINT8 read_scan_mode = 0;
+ UINT8 *p_data = NULL, report_format = 0, num_records = 0;
+ UINT16 data_len = 0;
+
+ BTM_TRACE_EVENT (" BTM_BleReadScanReports; %d, %d", scan_mode, ref_value);
+
+ if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
+ return BTM_ILLEGAL_VALUE;
+
+ BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
+
+ if (0 == cmn_ble_vsc_cb.tot_scan_results_strg)
+ {
+ BTM_TRACE_ERROR("Controller does not support batch scan");
+ return BTM_ERR_PROCESSING;
+ }
+
+ /* Check if the requested scan mode has already been setup by the user */
+ read_scan_mode = ble_batchscan_cb.scan_mode & BTM_BLE_BATCH_SCAN_MODE_ACTI;
+ if (0 == read_scan_mode)
+ read_scan_mode = ble_batchscan_cb.scan_mode & BTM_BLE_BATCH_SCAN_MODE_PASS;
+
+ /* Check only for modes, as scan reports can be called after disabling batch scan */
+ if (read_scan_mode > 0 && (BTM_BLE_BATCH_SCAN_MODE_PASS == scan_mode ||
+ BTM_BLE_BATCH_SCAN_MODE_ACTI == scan_mode))
+ {
+ status = btm_ble_batchscan_enq_rep_q(scan_mode, ref_value);
+ if (BTM_SUCCESS == status)
+ {
+ status = btm_ble_read_batchscan_reports(scan_mode, ref_value);
+ if (BTM_CMD_STARTED != status)
+ {
+ btm_ble_batchscan_deq_rep_data(scan_mode, &ref_value,
+ &num_records, &p_data, &data_len);
+ }
+ }
+ }
+ else
+ {
+ BTM_TRACE_ERROR("Illegal read scan params: %d, %d, %d", read_scan_mode, scan_mode,
+ ble_batchscan_cb.cur_state);
+ return BTM_ILLEGAL_VALUE;
+ }
+ return status;
+}
+
+
+/*******************************************************************************
+**
+** Function BTM_BleTrackAdvertiser
+**
+** Description This function is called to setup the callback for tracking advertisers
+**
+** Parameters: p_track_cback - Tracking callback pointer
+** ref_value - Reference value
+**
+** Returns tBTM_STATUS
+**
+*******************************************************************************/
+tBTM_STATUS BTM_BleTrackAdvertiser(tBTM_BLE_TRACK_ADV_CBACK *p_track_cback,
+ tBTM_BLE_REF_VALUE ref_value)
+{
+ tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
+ BTM_TRACE_EVENT (" BTM_BleTrackAdvertiser");
+ if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
+ return BTM_ILLEGAL_VALUE;
+
+ BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
+
+ if (0 == cmn_ble_vsc_cb.tot_scan_results_strg)
+ {
+ BTM_TRACE_ERROR("Controller does not support scan storage");
+ return BTM_ERR_PROCESSING;
+ }
+
+ ble_advtrack_cb.p_track_cback = p_track_cback;
+ ble_advtrack_cb.ref_value = ref_value;
+ return BTM_SUCCESS;
+}
+
+/*******************************************************************************
+**
+** Function btm_ble_batchscan_init
+**
+** Description This function initialize the batch scan control block.
+**
+** Parameters None
+**
+** Returns status
+**
+*******************************************************************************/
+void btm_ble_batchscan_init(void)
+{
+ BTM_TRACE_EVENT (" btm_ble_batchscan_init");
+ memset(&ble_batchscan_cb, 0, sizeof(tBTM_BLE_BATCH_SCAN_CB));
+ memset(&ble_advtrack_cb, 0, sizeof(tBTM_BLE_ADV_TRACK_CB));
+ BTM_RegisterForVSEvents(btm_ble_batchscan_filter_track_adv_vse_cback, TRUE);
+}
+
+/*******************************************************************************
+**
+** Function btm_ble_batchscan_cleanup
+**
+** Description This function cleans the batch scan control block.
+**
+** Parameters None
+**
+** Returns void
+**
+*******************************************************************************/
+void btm_ble_batchscan_cleanup(void)
+{
+ int index = 0;
+ BTM_TRACE_EVENT (" btm_ble_batchscan_cleanup");
+
+ for (index = 0; index < BTM_BLE_BATCH_REP_MAIN_Q_SIZE; index++)
+ {
+ if (NULL != ble_batchscan_cb.main_rep_q.p_data[index])
+ GKI_freebuf(ble_batchscan_cb.main_rep_q.p_data[index]);
+ ble_batchscan_cb.main_rep_q.p_data[index] = NULL;
+ }
+
+ memset(&ble_batchscan_cb, 0, sizeof(tBTM_BLE_BATCH_SCAN_CB));
+ memset(&ble_advtrack_cb, 0, sizeof(tBTM_BLE_ADV_TRACK_CB));
+}
+
+#endif
diff --git a/stack/btm/btm_ble_bgconn.c b/stack/btm/btm_ble_bgconn.c
index 96d35c4..b33aa2e 100644
--- a/stack/btm/btm_ble_bgconn.c
+++ b/stack/btm/btm_ble_bgconn.c
@@ -30,6 +30,7 @@
#include "l2c_int.h"
#include "hcimsgs.h"
#include "bt_utils.h"
+#include "vendor_ble.h"
#ifndef BTM_BLE_SCAN_PARAM_TOUT
#define BTM_BLE_SCAN_PARAM_TOUT 50 /* 50 seconds */
@@ -49,7 +50,7 @@
void btm_update_scanner_filter_policy(tBTM_BLE_SFP scan_policy)
{
tBTM_BLE_INQ_CB *p_inq = &btm_cb.ble_ctr_cb.inq_var;
- BTM_TRACE_EVENT0 ("btm_update_scanner_filter_policy");
+ BTM_TRACE_EVENT ("btm_update_scanner_filter_policy");
p_inq->sfp = scan_policy;
p_inq->scan_type = (p_inq->scan_type == BTM_BLE_SCAN_MODE_NONE) ? BTM_BLE_SCAN_MODE_ACTI: p_inq->scan_type;
@@ -57,7 +58,7 @@
btsnd_hcic_ble_set_scan_params (p_inq->scan_type,
(UINT16)(!p_inq->scan_interval ? BTM_BLE_GAP_DISC_SCAN_INT : p_inq->scan_interval),
(UINT16)(!p_inq->scan_window ? BTM_BLE_GAP_DISC_SCAN_WIN : p_inq->scan_window),
- BLE_ADDR_PUBLIC,
+ btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type,
scan_policy);
}
/*******************************************************************************
@@ -66,34 +67,38 @@
**
** Description This function load the device into controller white list
*******************************************************************************/
-BOOLEAN btm_add_dev_to_controller (BOOLEAN to_add, BD_ADDR bd_addr, UINT8 attr)
+BOOLEAN btm_add_dev_to_controller (BOOLEAN to_add, BD_ADDR bd_addr)
{
tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr);
tBLE_ADDR_TYPE addr_type = BLE_ADDR_PUBLIC;
BOOLEAN started = FALSE;
BD_ADDR dummy_bda = {0};
tBT_DEVICE_TYPE dev_type;
- UNUSED(attr);
if (p_dev_rec != NULL &&
- p_dev_rec->device_type == BT_DEVICE_TYPE_BLE)
+ p_dev_rec->device_type & BT_DEVICE_TYPE_BLE)
{
if (to_add)
{
if (p_dev_rec->ble.ble_addr_type == BLE_ADDR_PUBLIC || !BTM_BLE_IS_RESOLVE_BDA(bd_addr))
{
+#if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
+ /* add device into IRK list */
+ btm_ble_vendor_irk_list_load_dev(p_dev_rec);
+#endif
started = btsnd_hcic_ble_add_white_list (p_dev_rec->ble.ble_addr_type, bd_addr);
}
if (memcmp(p_dev_rec->ble.static_addr, bd_addr, BD_ADDR_LEN) != 0 &&
memcmp(p_dev_rec->ble.static_addr, dummy_bda, BD_ADDR_LEN) != 0)
{
- started = btsnd_hcic_ble_add_white_list (p_dev_rec->ble.static_addr_type, p_dev_rec->ble.static_addr);
+ started = btsnd_hcic_ble_add_white_list (p_dev_rec->ble.static_addr_type,
+ p_dev_rec->ble.static_addr);
}
}
else
{
- if (!BTM_BLE_IS_RESOLVE_BDA(bd_addr))
+ if (p_dev_rec->ble.ble_addr_type == BLE_ADDR_PUBLIC || !BTM_BLE_IS_RESOLVE_BDA(bd_addr))
{
started = btsnd_hcic_ble_remove_from_white_list (p_dev_rec->ble.ble_addr_type, bd_addr);
}
@@ -133,7 +138,7 @@
{
if (p_dev_op->in_use)
{
- rt = btm_add_dev_to_controller(p_dev_op->to_add, p_dev_op->bd_addr, p_dev_op->attr);
+ rt = btm_add_dev_to_controller(p_dev_op->to_add, p_dev_op->bd_addr);
memset(p_dev_op, 0, sizeof(tBTM_BLE_WL_OP));
}
else
@@ -147,7 +152,7 @@
**
** Description enqueue the pending whitelist device operation(loading or removing).
*******************************************************************************/
-void btm_enq_wl_dev_operation(BOOLEAN to_add, BD_ADDR bd_addr, UINT8 attr)
+void btm_enq_wl_dev_operation(BOOLEAN to_add, BD_ADDR bd_addr)
{
tBTM_BLE_WL_OP *p_dev_op = btm_cb.ble_ctr_cb.wl_op_q;
UINT8 i = 0;
@@ -157,7 +162,6 @@
if (p_dev_op->in_use && !memcmp(p_dev_op->bd_addr, bd_addr, BD_ADDR_LEN))
{
p_dev_op->to_add = to_add;
- p_dev_op->attr = attr;
return;
}
else if (!p_dev_op->in_use)
@@ -167,12 +171,11 @@
{
p_dev_op->in_use = TRUE;
p_dev_op->to_add = to_add;
- p_dev_op->attr = attr;
memcpy(p_dev_op->bd_addr, bd_addr, BD_ADDR_LEN);
}
else
{
- BTM_TRACE_ERROR0("max pending WL operation reached, discard");
+ BTM_TRACE_ERROR("max pending WL operation reached, discard");
}
return;
}
@@ -182,29 +185,28 @@
**
** Description This function adds a device into white list.
*******************************************************************************/
-BOOLEAN btm_update_dev_to_white_list(BOOLEAN to_add, BD_ADDR bd_addr, UINT8 attr)
+BOOLEAN btm_update_dev_to_white_list(BOOLEAN to_add, BD_ADDR bd_addr)
{
/* look up the sec device record, and find the address */
tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
- BOOLEAN started = FALSE;
UINT8 wl_state = p_cb->wl_state;
if ((to_add && p_cb->num_empty_filter == 0) ||
(!to_add && p_cb->num_empty_filter == p_cb->max_filter_entries))
{
- BTM_TRACE_ERROR1("WL full or empty, unable to update to WL. num_entry available: %d",
+ BTM_TRACE_ERROR("WL full or empty, unable to update to WL. num_entry available: %d",
p_cb->num_empty_filter);
- return started;
+ return FALSE;
}
btm_suspend_wl_activity(wl_state);
/* enq pending WL device operation */
- btm_enq_wl_dev_operation(to_add, bd_addr, attr);
+ btm_enq_wl_dev_operation(to_add, bd_addr);
btm_resume_wl_activity(wl_state);
- return started;
+ return TRUE;
}
/*******************************************************************************
**
@@ -214,8 +216,9 @@
*******************************************************************************/
void btm_ble_clear_white_list (void)
{
- BTM_TRACE_EVENT0 ("btm_ble_clear_white_list");
+ BTM_TRACE_EVENT ("btm_ble_clear_white_list");
btsnd_hcic_ble_clear_white_list();
+ memset(&btm_cb.ble_ctr_cb.bg_dev_list, 0, (sizeof(tBTM_LE_BG_CONN_DEV)*BTM_BLE_MAX_BG_CONN_DEV_NUM));
}
/*******************************************************************************
@@ -230,7 +233,7 @@
UINT8 status;
UNUSED(evt_len);
- BTM_TRACE_EVENT0 ("btm_ble_clear_white_list_complete");
+ BTM_TRACE_EVENT ("btm_ble_clear_white_list_complete");
STREAM_TO_UINT8 (status, p_data);
if (status == HCI_SUCCESS)
@@ -246,7 +249,7 @@
void btm_ble_add_2_white_list_complete(UINT8 status)
{
tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
- BTM_TRACE_EVENT0 ("btm_ble_add_2_white_list_complete");
+ BTM_TRACE_EVENT ("btm_ble_add_2_white_list_complete");
if (status == HCI_SUCCESS)
{
@@ -255,16 +258,16 @@
}
/*******************************************************************************
**
-** Function btm_ble_add_2_white_list_complete
+** Function btm_ble_remove_from_white_list_complete
**
-** Description This function read the current white list size.
+** Description This function remove the white list element complete.
*******************************************************************************/
void btm_ble_remove_from_white_list_complete(UINT8 *p, UINT16 evt_len)
{
tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
UNUSED(evt_len);
- BTM_TRACE_EVENT0 ("btm_ble_remove_from_white_list_complete");
+ BTM_TRACE_EVENT ("btm_ble_remove_from_white_list_complete");
if (*p == HCI_SUCCESS)
{
p_cb->num_empty_filter ++;
@@ -284,7 +287,7 @@
for (i = 0; i < BTM_BLE_MAX_BG_CONN_DEV_NUM; i ++)
{
if (p_cb->bg_dev_list[i].in_use &&
- !BTM_IsAclConnectionUp(p_cb->bg_dev_list[i].bd_addr))
+ !BTM_IsAclConnectionUp(p_cb->bg_dev_list[i].bd_addr, BT_TRANSPORT_LE))
{
count ++;
}
@@ -298,19 +301,18 @@
**
** Description This function update the local background connection device list.
*******************************************************************************/
-BOOLEAN btm_update_bg_conn_list(BOOLEAN to_add, BD_ADDR bd_addr, UINT8 *p_attr_tag)
+BOOLEAN btm_update_bg_conn_list(BOOLEAN to_add, BD_ADDR bd_addr)
{
tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
tBTM_LE_BG_CONN_DEV *p_bg_dev = &p_cb->bg_dev_list[0], *p_next, *p_cur;
UINT8 i, j;
BOOLEAN ret = FALSE;
- UNUSED(p_attr_tag);
- BTM_TRACE_EVENT0 ("btm_update_bg_conn_list");
+ BTM_TRACE_EVENT ("btm_update_bg_conn_list");
if ((to_add && (p_cb->bg_dev_num == BTM_BLE_MAX_BG_CONN_DEV_NUM || p_cb->num_empty_filter == 0)))
{
- BTM_TRACE_DEBUG1("num_empty_filter = %d", p_cb->num_empty_filter);
+ BTM_TRACE_DEBUG("num_empty_filter = %d", p_cb->num_empty_filter);
return ret;
}
@@ -324,15 +326,19 @@
p_cb->bg_dev_num --;
p_cur = p_bg_dev;
p_next = p_bg_dev + 1;
- for (j = i + 1 ;j < BTM_BLE_MAX_BG_CONN_DEV_NUM && p_next->in_use ; j ++, p_cur ++, p_next ++ )
+ for (j = i + 1; j < BTM_BLE_MAX_BG_CONN_DEV_NUM && p_next->in_use;
+ j ++, p_cur ++, p_next ++)
+ {
memcpy(p_cur, p_next, sizeof(tBTM_LE_BG_CONN_DEV));
+ memset(p_next, 0, sizeof(tBTM_LE_BG_CONN_DEV));
+ }
}
ret = TRUE;
break;
}
else if (!p_bg_dev->in_use && to_add)
{
- BTM_TRACE_DEBUG0("add new WL entry in bg_dev_list");
+ BTM_TRACE_DEBUG("add new WL entry in bg_dev_list");
memcpy(p_bg_dev->bd_addr, bd_addr, BD_ADDR_LEN);
p_bg_dev->in_use = TRUE;
@@ -363,15 +369,17 @@
tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
BD_ADDR dummy_bda = {0};
BOOLEAN exec = TRUE;
- UINT8 own_addr_type = BLE_ADDR_PUBLIC;
UINT16 scan_int, scan_win;
if (start)
{
- if (p_cb->conn_state == BLE_CONN_IDLE && btm_ble_count_unconn_dev_in_whitelist() > 0)
+ if ( p_cb->conn_state == BLE_CONN_IDLE )
{
- btm_execute_wl_dev_operation();
-
+ exec = btm_execute_wl_dev_operation();
+ }
+ if ((p_cb->conn_state == BLE_CONN_IDLE && btm_ble_count_unconn_dev_in_whitelist() > 0)
+ && btm_ble_topology_check(BTM_BLE_STATE_INIT))
+ {
scan_int = (p_cb->scan_int == BTM_BLE_CONN_PARAM_UNDEF) ? BTM_BLE_SCAN_SLOW_INT_1 : p_cb->scan_int;
scan_win = (p_cb->scan_win == BTM_BLE_CONN_PARAM_UNDEF) ? BTM_BLE_SCAN_SLOW_WIN_1 : p_cb->scan_win;
@@ -380,7 +388,9 @@
0x01, /* UINT8 white_list */
BLE_ADDR_PUBLIC, /* UINT8 addr_type_peer */
dummy_bda, /* BD_ADDR bda_peer */
- own_addr_type, /* UINT8 addr_type_own, not allow random address for central */
+ p_cb->addr_mgnt_cb.own_addr_type,
+ /* UINT8 addr_type_own,
+ not allow random address for central */
BTM_BLE_CONN_INT_MIN_DEF, /* UINT16 conn_int_min */
BTM_BLE_CONN_INT_MAX_DEF, /* UINT16 conn_int_max */
BTM_BLE_CONN_SLAVE_LATENCY_DEF, /* UINT16 conn_latency */
@@ -394,7 +404,7 @@
else
{
btm_ble_set_conn_st (BLE_BG_CONN);
-
+ p_cb->wl_state |= BTM_BLE_WL_INIT;
}
}
else
@@ -407,13 +417,18 @@
if (p_cb->conn_state == BLE_BG_CONN)
{
btsnd_hcic_ble_create_conn_cancel();
- btm_ble_set_conn_st (BLE_CONN_CANCEL);
+ btm_ble_set_conn_st (BLE_CONN_CANCEL);
+ p_cb->wl_state |= BTM_BLE_WL_INIT;
+#if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
+ if (btm_cb.cmn_ble_vsc_cb.rpa_offloading == TRUE)
+ btm_ble_vendor_disable_irk_list();
+#endif
}
else
{
#if 0
- BTM_TRACE_ERROR1("conn_st = %d, not in auto conn state, can not stop.", p_cb->conn_state);
+ BTM_TRACE_ERROR("conn_st = %d, not in auto conn state, can not stop.", p_cb->conn_state);
exec = FALSE;
#endif
}
@@ -439,33 +454,34 @@
tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
UINT16 scan_int, scan_win;
- BTM_TRACE_EVENT0 ("btm_ble_start_select_conn");
+ BTM_TRACE_EVENT ("btm_ble_start_select_conn");
scan_int = (p_cb->scan_int == BTM_BLE_CONN_PARAM_UNDEF) ? BTM_BLE_SCAN_FAST_INT : p_cb->scan_int;
scan_win = (p_cb->scan_win == BTM_BLE_CONN_PARAM_UNDEF) ? BTM_BLE_SCAN_FAST_WIN : p_cb->scan_win;
if (start)
{
- if (btm_cb.btm_inq_vars.inq_active == BTM_INQUIRY_INACTIVE)
+ if (!BTM_BLE_IS_SCAN_ACTIVE(p_cb->scan_activity))
{
if (p_select_cback != NULL)
btm_cb.ble_ctr_cb.p_select_cback = p_select_cback;
+ btm_execute_wl_dev_operation();
+
btm_update_scanner_filter_policy(SP_ADV_WL);
btm_cb.ble_ctr_cb.inq_var.scan_type = BTM_BLE_SCAN_MODE_PASS;
if (!btsnd_hcic_ble_set_scan_params(BTM_BLE_SCAN_MODE_PASS, /* use passive scan by default */
scan_int, /* scan interval */
scan_win, /* scan window */
- BLE_ADDR_PUBLIC, /* own device, DUMO always use public */
+ p_cb->addr_mgnt_cb.own_addr_type,
SP_ADV_WL) /* process advertising packets only from devices in the White List */
)
return FALSE;
- if (p_cb->inq_var.adv_mode == BTM_BLE_ADV_ENABLE
- )
+ if (!btm_ble_topology_check(BTM_BLE_STATE_PASSIVE_SCAN))
{
- BTM_TRACE_ERROR0("peripheral device cannot initiate a selective connection");
+ BTM_TRACE_ERROR("peripheral device cannot initiate passive scan for a selective connection");
return FALSE;
}
else if (p_cb->bg_dev_num > 0 && btm_ble_count_unconn_dev_in_whitelist() > 0 )
@@ -475,26 +491,30 @@
return FALSE;
/* mark up inquiry status flag */
- btm_cb.btm_inq_vars.inq_active |= BTM_LE_SELECT_CONN_ACTIVE;
- p_cb->inq_var.proc_mode = BTM_BLE_SELECT_SCAN;
- p_cb->conn_state = BLE_BG_CONN;
+ p_cb->scan_activity |= BTM_LE_SELECT_CONN_ACTIVE;
+ p_cb->wl_state |= BTM_BLE_WL_SCAN;
}
}
else
{
- BTM_TRACE_ERROR0("scan active, can not start selective connection procedure");
+ BTM_TRACE_ERROR("scan active, can not start selective connection procedure");
return FALSE;
}
}
else /* disable selective connection mode */
{
- btm_cb.btm_inq_vars.inq_active &= ~BTM_LE_SELECT_CONN_ACTIVE;
- btm_cb.ble_ctr_cb.inq_var.proc_mode = BTM_BLE_INQUIRY_NONE;
+ p_cb->scan_activity &= ~BTM_LE_SELECT_CONN_ACTIVE;
+ p_cb->p_select_cback = NULL;
- btm_update_scanner_filter_policy(SP_ADV_ALL);
+#if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
+ if (btm_cb.cmn_ble_vsc_cb.rpa_offloading == TRUE)
+ btm_ble_vendor_disable_irk_list();
+#endif
+ p_cb->wl_state |= BTM_BLE_WL_SCAN;
+
/* stop scanning */
- if (!btsnd_hcic_ble_set_scan_enable(FALSE, TRUE)) /* duplicate filtering enabled */
- return FALSE;
+ if (!BTM_BLE_IS_SCAN_ACTIVE(p_cb->scan_activity))
+ btm_ble_stop_scan(); /* duplicate filtering enabled */
btm_update_scanner_filter_policy(SP_ADV_ALL);
}
return TRUE;
@@ -514,12 +534,12 @@
*******************************************************************************/
void btm_ble_initiate_select_conn(BD_ADDR bda)
{
- BTM_TRACE_EVENT0 ("btm_ble_initiate_select_conn");
+ BTM_TRACE_EVENT ("btm_ble_initiate_select_conn");
/* use direct connection procedure to initiate connection */
if (!L2CA_ConnectFixedChnl(L2CAP_ATT_CID, bda))
{
- BTM_TRACE_ERROR0("btm_ble_initiate_select_conn failed");
+ BTM_TRACE_ERROR("btm_ble_initiate_select_conn failed");
}
}
/*******************************************************************************
@@ -537,7 +557,7 @@
void btm_ble_suspend_bg_conn(void)
{
tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
- BTM_TRACE_EVENT0 ("btm_ble_suspend_bg_conn");
+ BTM_TRACE_EVENT ("btm_ble_suspend_bg_conn");
if (p_cb->bg_conn_type == BTM_BLE_CONN_AUTO)
{
@@ -569,7 +589,7 @@
}
if (wl_state & BTM_BLE_WL_ADV)
{
- btsnd_hcic_ble_set_adv_enable(BTM_BLE_ADV_DISABLE);
+ btm_ble_stop_adv();
}
}
@@ -588,7 +608,7 @@
if (wl_state & BTM_BLE_WL_ADV)
{
- btsnd_hcic_ble_set_adv_enable(BTM_BLE_ADV_ENABLE);
+ btm_ble_start_adv();
}
}
@@ -645,6 +665,13 @@
void btm_ble_set_conn_st(tBTM_BLE_CONN_ST new_st)
{
btm_cb.ble_ctr_cb.conn_state = new_st;
+ if (new_st == BLE_BG_CONN || new_st == BLE_DIR_CONN) {
+ btm_cb.ble_ctr_cb.wl_state |= BTM_BLE_WL_INIT;
+ btm_ble_set_topology_mask(BTM_BLE_STATE_INIT_BIT);
+ } else {
+ btm_cb.ble_ctr_cb.wl_state &= ~BTM_BLE_WL_INIT;
+ btm_ble_clear_topology_mask(BTM_BLE_STATE_INIT_BIT);
+ }
}
/*******************************************************************************
@@ -689,6 +716,7 @@
return rt;
}
+
#endif
diff --git a/stack/btm/btm_ble_cont_energy.c b/stack/btm/btm_ble_cont_energy.c
new file mode 100644
index 0000000..0da6cf0
--- /dev/null
+++ b/stack/btm/btm_ble_cont_energy.c
@@ -0,0 +1,111 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 Broadcom Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+#include <string.h>
+#include "bt_target.h"
+
+#if (BLE_INCLUDED == TRUE)
+#include "bt_types.h"
+#include "hcimsgs.h"
+#include "btu.h"
+#include "btm_int.h"
+#include "bt_utils.h"
+#include "hcidefs.h"
+#include "btm_ble_api.h"
+
+tBTM_BLE_ENERGY_INFO_CB ble_energy_info_cb;
+
+/*******************************************************************************
+**
+** Function btm_ble_cont_energy_cmpl_cback
+**
+** Description Controller VSC complete callback
+**
+** Parameters
+**
+** Returns void
+**
+*******************************************************************************/
+void btm_ble_cont_energy_cmpl_cback (tBTM_VSC_CMPL *p_params)
+{
+ UINT8 *p = p_params->p_param_buf;
+ UINT16 len = p_params->param_len;
+ UINT8 status = 0;
+ UINT32 total_tx_time = 0, total_rx_time = 0, total_idle_time = 0, total_energy_used = 0;
+
+ if (len < 17)
+ {
+ BTM_TRACE_ERROR("wrong length for btm_ble_cont_energy_cmpl_cback");
+ return;
+ }
+
+ STREAM_TO_UINT8(status, p);
+ STREAM_TO_UINT32(total_tx_time, p);
+ STREAM_TO_UINT32(total_rx_time, p);
+ STREAM_TO_UINT32(total_idle_time, p);
+ STREAM_TO_UINT32(total_energy_used, p);
+
+ BTM_TRACE_DEBUG("energy_info status=%d,tx_t=%ld, rx_t=%ld, ener_used=%ld, idle_t=%ld",
+ status, total_tx_time, total_rx_time, total_energy_used, total_idle_time);
+
+ if (NULL != ble_energy_info_cb.p_ener_cback)
+ ble_energy_info_cb.p_ener_cback(total_tx_time, total_rx_time, total_idle_time,
+ total_energy_used, status);
+
+ return;
+}
+
+/*******************************************************************************
+**
+** Function BTM_BleGetEnergyInfo
+**
+** Description This function obtains the energy info
+**
+** Parameters p_ener_cback - Callback pointer
+**
+** Returns status
+**
+*******************************************************************************/
+tBTM_STATUS BTM_BleGetEnergyInfo(tBTM_BLE_ENERGY_INFO_CBACK *p_ener_cback)
+{
+ tBTM_STATUS status = BTM_ILLEGAL_VALUE;
+ tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
+
+ BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
+
+ BTM_TRACE_EVENT("BTM_BleGetEnergyInfo");
+
+ if (0 == cmn_ble_vsc_cb.energy_support)
+ {
+ BTM_TRACE_ERROR("Controller does not support get energy info");
+ return BTM_ERR_PROCESSING;
+ }
+
+ ble_energy_info_cb.p_ener_cback = p_ener_cback;
+ if ((status = BTM_VendorSpecificCommand (HCI_BLE_ENERGY_INFO_OCF, 0, NULL,
+ btm_ble_cont_energy_cmpl_cback)) != BTM_CMD_STARTED)
+ {
+ BTM_TRACE_ERROR("BTM_BleGetEnergyInfo status: %d", status);
+ return BTM_ILLEGAL_VALUE;
+ }
+
+ return status;
+}
+
+#endif
+
diff --git a/stack/btm/btm_ble_gap.c b/stack/btm/btm_ble_gap.c
index 54f1b55..a6f095f 100644
--- a/stack/btm/btm_ble_gap.c
+++ b/stack/btm/btm_ble_gap.c
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 2008-2012 Broadcom Corporation
+ * Copyright (C) 2008-2014 Broadcom Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -28,14 +28,22 @@
#include "bt_types.h"
#include "bt_utils.h"
-#include "btu.h"
#include "btm_int.h"
+#include "btm_ble_api.h"
+#include "btu.h"
#include "hcimsgs.h"
#if (GAP_INCLUDED == TRUE)
#include "gap_api.h"
#endif
-#if (BLE_INCLUDED == TRUE)
+
+#if BLE_INCLUDED == TRUE
+#include "l2c_int.h"
+#include "vendor_ble.h"
+
#include "gattdefs.h"
+#include "gatt_int.h"
+
+#include "btm_ble_int.h"
#define BTM_BLE_NAME_SHORT 0x01
#define BTM_BLE_NAME_CMPL 0x02
@@ -44,37 +52,172 @@
#define BTM_BLE_POLICY_UNKNOWN 0xff
#define BTM_EXT_BLE_RMT_NAME_TIMEOUT 30
+#define MIN_ADV_LENGTH 2
+
+static tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
+static tBTM_BLE_CTRL_FEATURES_CBACK *p_ctrl_le_feature_rd_cmpl_cback = NULL;
/*******************************************************************************
** Local functions
*******************************************************************************/
static void btm_ble_update_adv_flag(UINT8 flag);
static void btm_ble_process_adv_pkt_cont(BD_ADDR bda, UINT8 addr_type, UINT8 evt_type, UINT8 *p);
-static UINT8 *btm_ble_build_adv_data(tBTM_BLE_AD_MASK *p_data_mask, UINT8 **p_dst, tBTM_BLE_ADV_DATA *p_data);
+UINT8 *btm_ble_build_adv_data(tBTM_BLE_AD_MASK *p_data_mask, UINT8 **p_dst,
+ tBTM_BLE_ADV_DATA *p_data);
static UINT8 btm_set_conn_mode_adv_init_addr(tBTM_BLE_INQ_CB *p_cb,
BD_ADDR_PTR p_addr_ptr,
tBLE_ADDR_TYPE *p_init_addr_type,
tBLE_ADDR_TYPE *p_own_addr_type);
-static BOOLEAN btm_ble_start_adv(void);
-static tBTM_STATUS btm_ble_stop_adv(void);
+static void btm_ble_stop_observe(void);
+#define BTM_BLE_INQ_RESULT 0x01
+#define BTM_BLE_OBS_RESULT 0x02
+#define BTM_BLE_SEL_CONN_RESULT 0x04
-
-/*******************************************************************************
-**
-** Function BTM_BleReset
-**
-** Description This function is called to reset ULP controller.
-**
-** Parameters None.
-**
-** Returns void
-**
-*******************************************************************************/
-void BTM_BleReset(void)
+/* LE states combo bit to check */
+const UINT8 btm_le_state_combo_tbl[BTM_BLE_STATE_MAX][BTM_BLE_STATE_MAX][2] =
{
- btsnd_hcic_ble_reset();
-}
+ {/* single state support */
+ {HCI_SUPP_LE_STATES_CONN_ADV_MASK, HCI_SUPP_LE_STATES_CONN_ADV_OFF}, /* conn_adv */
+ {HCI_SUPP_LE_STATES_INIT_MASK, HCI_SUPP_LE_STATES_INIT_OFF}, /* init */
+ {HCI_SUPP_LE_STATES_INIT_MASK, HCI_SUPP_LE_STATES_INIT_OFF}, /* master */
+ {HCI_SUPP_LE_STATES_SLAVE_MASK, HCI_SUPP_LE_STATES_SLAVE_OFF}, /* slave */
+ {0, 0}, /* todo: lo du dir adv, not covered ? */
+ {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_OFF}, /* hi duty dir adv */
+ {HCI_SUPP_LE_STATES_NON_CONN_ADV_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_OFF}, /* non connectable adv */
+ {HCI_SUPP_LE_STATES_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_PASS_SCAN_OFF}, /* passive scan */
+ {HCI_SUPP_LE_STATES_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_ACTIVE_SCAN_OFF}, /* active scan */
+ {HCI_SUPP_LE_STATES_SCAN_ADV_MASK, HCI_SUPP_LE_STATESSCAN_ADV_OFF} /* scanable adv */
+ },
+ { /* conn_adv =0 */
+ {0, 0}, /* conn_adv */
+ {HCI_SUPP_LE_STATES_CONN_ADV_INIT_MASK, HCI_SUPP_LE_STATES_CONN_ADV_INIT_OFF}, /* init: 32 */
+ {HCI_SUPP_LE_STATES_CONN_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_CONN_ADV_MASTER_OFF}, /* master: 35 */
+ {HCI_SUPP_LE_STATES_CONN_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_CONN_ADV_SLAVE_OFF}, /* slave: 38,*/
+ {0, 0}, /* lo du dir adv */
+ {0, 0}, /* hi duty dir adv */
+ {0, 0}, /* non connectable adv */
+ {HCI_SUPP_LE_STATES_CONN_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_CONN_ADV_PASS_SCAN_OFF}, /* passive scan */
+ {HCI_SUPP_LE_STATES_CONN_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_CONN_ADV_ACTIVE_SCAN_OFF}, /* active scan */
+ {0, 0} /* scanable adv */
+ },
+ { /* init */
+ {HCI_SUPP_LE_STATES_CONN_ADV_INIT_MASK, HCI_SUPP_LE_STATES_CONN_ADV_INIT_OFF}, /* conn_adv: 32 */
+ {0, 0}, /* init */
+ {HCI_SUPP_LE_STATES_INIT_MASTER_MASK, HCI_SUPP_LE_STATES_INIT_MASTER_OFF}, /* master 28 */
+ {HCI_SUPP_LE_STATES_INIT_MASTER_SLAVE_MASK, HCI_SUPP_LE_STATES_INIT_MASTER_SLAVE_OFF}, /* slave 41 */
+ {HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_INIT_MASK, HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_INIT_OFF} ,/* lo du dir adv 34 */
+ {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_INIT_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_INIT_OFF}, /* hi duty dir adv 33 */
+ {HCI_SUPP_LE_STATES_NON_CONN_INIT_MASK, HCI_SUPP_LE_STATES_NON_CONN_INIT_OFF}, /* non connectable adv */
+ {HCI_SUPP_LE_STATES_PASS_SCAN_INIT_MASK, HCI_SUPP_LE_STATES_PASS_SCAN_INIT_OFF}, /* passive scan */
+ {HCI_SUPP_LE_STATES_ACTIVE_SCAN_INIT_MASK, HCI_SUPP_LE_STATES_ACTIVE_SCAN_INIT_OFF}, /* active scan */
+ {HCI_SUPP_LE_STATES_SCAN_ADV_INIT_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_INIT_OFF} /* scanable adv */
+
+ },
+ { /* master */
+ {HCI_SUPP_LE_STATES_CONN_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_CONN_ADV_MASTER_OFF}, /* conn_adv: 35 */
+ {HCI_SUPP_LE_STATES_INIT_MASTER_MASK, HCI_SUPP_LE_STATES_INIT_MASTER_OFF}, /* init 28 */
+ {HCI_SUPP_LE_STATES_INIT_MASTER_MASK, HCI_SUPP_LE_STATES_INIT_MASTER_OFF}, /* master 28 */
+ {HCI_SUPP_LE_STATES_CONN_ADV_INIT_MASK, HCI_SUPP_LE_STATES_CONN_ADV_INIT_OFF}, /* slave: 32 */
+ {HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_MASTER_OFF}, /* lo duty cycle adv 37 */
+ {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_MASTER_OFF}, /* hi duty cycle adv 36 */
+ {HCI_SUPP_LE_STATES_NON_CONN_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_MASTER_OFF}, /* non connectable adv */
+ {HCI_SUPP_LE_STATES_PASS_SCAN_MASTER_MASK, HCI_SUPP_LE_STATES_PASS_SCAN_MASTER_OFF}, /* passive scan */
+ {HCI_SUPP_LE_STATES_ACTIVE_SCAN_MASTER_MASK, HCI_SUPP_LE_STATES_ACTIVE_SCAN_MASTER_OFF}, /* active scan */
+ {HCI_SUPP_LE_STATES_SCAN_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_MASTER_OFF} /* scanable adv */
+
+ },
+ { /* slave */
+ {HCI_SUPP_LE_STATES_CONN_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_CONN_ADV_SLAVE_OFF}, /* conn_adv: 38,*/
+ {HCI_SUPP_LE_STATES_INIT_MASTER_SLAVE_MASK, HCI_SUPP_LE_STATES_INIT_MASTER_SLAVE_OFF}, /* init 41 */
+ {HCI_SUPP_LE_STATES_INIT_MASTER_SLAVE_MASK, HCI_SUPP_LE_STATES_INIT_MASTER_SLAVE_OFF}, /* master 41 */
+ {HCI_SUPP_LE_STATES_CONN_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_CONN_ADV_SLAVE_OFF}, /* slave: 38,*/
+ {HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_SLAVE_OFF}, /* lo duty cycle adv 40 */
+ {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_SLAVE_OFF}, /* hi duty cycle adv 39 */
+ {HCI_SUPP_LE_STATES_NON_CONN_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_SLAVE_OFF}, /* non connectable adv */
+ {HCI_SUPP_LE_STATES_PASS_SCAN_SLAVE_MASK, HCI_SUPP_LE_STATES_PASS_SCAN_SLAVE_OFF}, /* passive scan */
+ {HCI_SUPP_LE_STATES_ACTIVE_SCAN_SLAVE_MASK, HCI_SUPP_LE_STATES_ACTIVE_SCAN_SLAVE_OFF}, /* active scan */
+ {HCI_SUPP_LE_STATES_SCAN_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_SLAVE_OFF} /* scanable adv */
+
+ },
+ { /* lo duty cycle adv */
+ {0, 0}, /* conn_adv: 38,*/
+ {HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_INIT_MASK, HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_INIT_OFF} ,/* init 34 */
+ {HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_MASTER_OFF}, /* master 37 */
+ {HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_SLAVE_OFF}, /* slave: 40 */
+ {0, 0}, /* lo duty cycle adv 40 */
+ {0, 0}, /* hi duty cycle adv 39 */
+ {0, 0}, /* non connectable adv */
+ {0, 0}, /* TODO: passive scan, not covered? */
+ {0, 0}, /* TODO: active scan, not covered? */
+ {0, 0} /* scanable adv */
+ },
+ { /* hi duty cycle adv */
+ {0, 0}, /* conn_adv: 38,*/
+ {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_INIT_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_INIT_OFF}, /* init 33 */
+ {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_MASTER_OFF}, /* master 36 */
+ {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_SLAVE_OFF}, /* slave: 39*/
+ {0, 0}, /* lo duty cycle adv 40 */
+ {0, 0}, /* hi duty cycle adv 39 */
+ {0, 0}, /* non connectable adv */
+ {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_PASS_SCAN_OFF}, /* passive scan */
+ {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_ACTIVE_SCAN_OFF}, /* active scan */
+ {0, 0} /* scanable adv */
+ },
+ { /* non connectable adv */
+ {0, 0}, /* conn_adv: */
+ {HCI_SUPP_LE_STATES_NON_CONN_INIT_MASK, HCI_SUPP_LE_STATES_NON_CONN_INIT_OFF}, /* init */
+ {HCI_SUPP_LE_STATES_NON_CONN_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_MASTER_OFF}, /* master */
+ {HCI_SUPP_LE_STATES_NON_CONN_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_SLAVE_OFF}, /* slave: */
+ {0, 0}, /* lo duty cycle adv */
+ {0, 0}, /* hi duty cycle adv */
+ {0, 0}, /* non connectable adv */
+ {HCI_SUPP_LE_STATES_NON_CONN_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_PASS_SCAN_OFF}, /* passive scan */
+ {HCI_SUPP_LE_STATES_NON_CONN_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_ACTIVE_SCAN_OFF}, /* active scan */
+ {0, 0} /* scanable adv */
+ },
+ { /* passive scan */
+ {HCI_SUPP_LE_STATES_CONN_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_CONN_ADV_PASS_SCAN_OFF}, /* conn_adv: */
+ {HCI_SUPP_LE_STATES_PASS_SCAN_INIT_MASK, HCI_SUPP_LE_STATES_PASS_SCAN_INIT_OFF}, /* init */
+ {HCI_SUPP_LE_STATES_PASS_SCAN_MASTER_MASK, HCI_SUPP_LE_STATES_PASS_SCAN_MASTER_OFF}, /* master */
+ {HCI_SUPP_LE_STATES_PASS_SCAN_SLAVE_MASK, HCI_SUPP_LE_STATES_PASS_SCAN_SLAVE_OFF}, /* slave: */
+ {0, 0}, /* lo duty cycle adv */
+ {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_PASS_SCAN_OFF}, /* hi duty cycle adv */
+ {HCI_SUPP_LE_STATES_NON_CONN_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_PASS_SCAN_OFF}, /* non connectable adv */
+ {0, 0}, /* passive scan */
+ {0, 0}, /* active scan */
+ {HCI_SUPP_LE_STATES_SCAN_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_PASS_SCAN_OFF} /* scanable adv */
+ },
+ { /* active scan */
+ {HCI_SUPP_LE_STATES_CONN_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_CONN_ADV_ACTIVE_SCAN_OFF}, /* conn_adv: */
+ {HCI_SUPP_LE_STATES_ACTIVE_SCAN_INIT_MASK, HCI_SUPP_LE_STATES_ACTIVE_SCAN_INIT_OFF}, /* init */
+ {HCI_SUPP_LE_STATES_ACTIVE_SCAN_MASTER_MASK, HCI_SUPP_LE_STATES_ACTIVE_SCAN_MASTER_OFF}, /* master */
+ {HCI_SUPP_LE_STATES_ACTIVE_SCAN_SLAVE_MASK, HCI_SUPP_LE_STATES_ACTIVE_SCAN_SLAVE_OFF}, /* slave: */
+ {0, 0}, /* lo duty cycle adv */
+ {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_ACTIVE_SCAN_OFF}, /* hi duty cycle adv */
+ {HCI_SUPP_LE_STATES_NON_CONN_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_ACTIVE_SCAN_OFF}, /* non connectable adv */
+ {0, 0}, /* TODO: passive scan */
+ {0, 0}, /* TODO: active scan */
+ {HCI_SUPP_LE_STATES_SCAN_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_ACTIVE_SCAN_OFF} /* scanable adv */
+ },
+ { /* scanable adv */
+ {0, 0}, /* conn_adv: */
+ {HCI_SUPP_LE_STATES_SCAN_ADV_INIT_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_INIT_OFF}, /* init */
+ {HCI_SUPP_LE_STATES_SCAN_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_MASTER_OFF}, /* master */
+ {HCI_SUPP_LE_STATES_SCAN_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_SLAVE_OFF}, /* slave: */
+ {0, 0}, /* lo duty cycle adv */
+ {0, 0}, /* hi duty cycle adv */
+ {0, 0}, /* non connectable adv */
+ {HCI_SUPP_LE_STATES_SCAN_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_PASS_SCAN_OFF}, /* passive scan */
+ {HCI_SUPP_LE_STATES_SCAN_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_ACTIVE_SCAN_OFF}, /* active scan */
+ {0, 0} /* scanable adv */
+ }
+
+};
+/* check LE combo state supported */
+#define BTM_LE_STATES_SUPPORTED(x, y, z) ((x)[(z)] & (y))
+
+
/*******************************************************************************
**
** Function BTM_BleUpdateAdvWhitelist
@@ -109,7 +252,7 @@
BD_ADDR p_addr_ptr= {0};
UINT8 adv_mode = p_cb->adv_mode;
- BTM_TRACE_EVENT0 ("BTM_BleUpdateAdvFilterPolicy");
+ BTM_TRACE_EVENT ("BTM_BleUpdateAdvFilterPolicy");
if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
return;
@@ -122,10 +265,13 @@
btm_ble_stop_adv ();
if (p_cb->connectable_mode & BTM_BLE_CONNECTABLE)
- p_cb->evt_type = btm_set_conn_mode_adv_init_addr(p_cb, p_addr_ptr, &init_addr_type, &p_cb->adv_addr_type);
+ p_cb->evt_type = btm_set_conn_mode_adv_init_addr(p_cb, p_addr_ptr, &init_addr_type,
+ &p_cb->adv_addr_type);
- btsnd_hcic_ble_write_adv_params (p_cb->adv_interval_min,
- p_cb->adv_interval_max,
+ btsnd_hcic_ble_write_adv_params ((UINT16)(p_cb->adv_interval_min ? p_cb->adv_interval_min :
+ BTM_BLE_GAP_ADV_SLOW_INT),
+ (UINT16)(p_cb->adv_interval_max ? p_cb->adv_interval_max :
+ BTM_BLE_GAP_ADV_SLOW_INT),
p_cb->evt_type,
p_cb->adv_addr_type,
init_addr_type,
@@ -155,9 +301,9 @@
tBTM_INQ_RESULTS_CB *p_results_cb, tBTM_CMPL_CB *p_cmpl_cb)
{
tBTM_BLE_INQ_CB *p_inq = &btm_cb.ble_ctr_cb.inq_var;
- tBTM_STATUS status = BTM_NO_RESOURCES;
+ tBTM_STATUS status = BTM_WRONG_MODE;
- BTM_TRACE_EVENT1 ("BTM_BleObserve : scan_type:%d",btm_cb.btm_inq_vars.scan_type);
+ BTM_TRACE_EVENT ("BTM_BleObserve : scan_type:%d",btm_cb.btm_inq_vars.scan_type);
if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
return BTM_ILLEGAL_VALUE;
@@ -165,63 +311,54 @@
if (start)
{
/* shared inquiry database, do not allow observe if any inquiry is active */
- if (btm_cb.btm_inq_vars.inq_active || p_inq->proc_mode != BTM_BLE_INQUIRY_NONE)
+ if (BTM_BLE_IS_OBS_ACTIVE(btm_cb.ble_ctr_cb.scan_activity))
{
- /*check if an interleave scan is already in progress*/
- if(btm_cb.btm_inq_vars.scan_type == INQ_GENERAL
- && btm_cb.btm_inq_vars.p_inq_results_cb != NULL)
- {
- BTM_TRACE_EVENT0 ("BTM_BleObserve general inq in progress, redirecting the results");
- btm_cb.btm_inq_vars.p_inq_ble_results_cb = p_results_cb;
- btm_cb.btm_inq_vars.p_inq_ble_cmpl_cb = p_cmpl_cb;
- return BTM_SUCCESS;
- }
- else
- return BTM_BUSY;
+ BTM_TRACE_ERROR("Observe Already Active");
+ return status;
}
- btm_cb.btm_inq_vars.scan_type = INQ_LE_OBSERVE;
- btm_cb.btm_inq_vars.p_inq_ble_results_cb = p_results_cb;
- btm_cb.btm_inq_vars.p_inq_ble_cmpl_cb = p_cmpl_cb;
- p_inq->scan_type = (p_inq->scan_type == BTM_BLE_SCAN_MODE_NONE) ? BTM_BLE_SCAN_MODE_ACTI: p_inq->scan_type;
- /* allow config scanning type */
- if (btsnd_hcic_ble_set_scan_params (p_inq->scan_type,
+ btm_cb.ble_ctr_cb.p_obs_results_cb = p_results_cb;
+ btm_cb.ble_ctr_cb.p_obs_cmpl_cb = p_cmpl_cb;
+ status = BTM_CMD_STARTED;
+
+ /* scan is not started */
+ if (!BTM_BLE_IS_SCAN_ACTIVE(btm_cb.ble_ctr_cb.scan_activity))
+ {
+ p_inq->scan_type = (p_inq->scan_type == BTM_BLE_SCAN_MODE_NONE) ? BTM_BLE_SCAN_MODE_ACTI: p_inq->scan_type;
+ /* allow config scanning type */
+ btsnd_hcic_ble_set_scan_params (p_inq->scan_type,
(UINT16)(!p_inq->scan_interval ? BTM_BLE_GAP_DISC_SCAN_INT : p_inq->scan_interval),
(UINT16)(!p_inq->scan_window ? BTM_BLE_GAP_DISC_SCAN_WIN : p_inq->scan_window),
- BLE_ADDR_PUBLIC,
- BTM_BLE_DEFAULT_SFP)) /* assume observe always not using white list */
- {
- /* start scan, disable duplicate filtering */
- if (btsnd_hcic_ble_set_scan_enable (BTM_BLE_SCAN_ENABLE, BTM_BLE_DUPLICATE_DISABLE))
- {
- status = BTM_SUCCESS;
- p_inq->proc_mode = BTM_BLE_OBSERVE;
- btm_cb.btm_inq_vars.inq_active |= BTM_LE_OBSERVE_ACTIVE;
+ btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type,
+ BTM_BLE_DEFAULT_SFP); /* assume observe always not using white list */
- if (duration != 0)
- {
- /* start inquiry timer */
- btu_start_timer (&p_inq->inq_timer_ent, BTU_TTYPE_BLE_INQUIRY, duration);
- }
- }
+#if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
+ /* enable IRK list */
+ btm_ble_vendor_irk_list_known_dev (TRUE);
+#endif
+ status = btm_ble_start_scan(BTM_BLE_DUPLICATE_DISABLE);
+ }
+ if (status == BTM_CMD_STARTED)
+ {
+ btm_cb.ble_ctr_cb.scan_activity |= BTM_LE_OBSERVE_ACTIVE;
+
+ if (duration != 0)
+ /* start observer timer */
+ btu_start_timer (&btm_cb.ble_ctr_cb.obs_timer_ent, BTU_TTYPE_BLE_OBSERVE, duration);
}
}
- else/*start = 0*/
+ else if (BTM_BLE_IS_OBS_ACTIVE(btm_cb.ble_ctr_cb.scan_activity))
{
- if(btm_cb.btm_inq_vars.scan_type == INQ_GENERAL)
- {
- //Dont stop the scan. Just nullify the cbs
- btm_cb.btm_inq_vars.p_inq_ble_results_cb = NULL;
- btm_cb.btm_inq_vars.p_inq_ble_cmpl_cb = NULL;
- }
- else if (p_inq->proc_mode == BTM_BLE_OBSERVE)
- {
- btm_cb.btm_inq_vars.inq_active &= ~BTM_LE_OBSERVE_ACTIVE;
- btm_ble_stop_scan();
- }
+ status = BTM_CMD_STARTED;
+ btm_ble_stop_observe();
+ }
+ else
+ {
+ BTM_TRACE_ERROR("Observe not active");
}
return status;
+
}
/*******************************************************************************
@@ -255,8 +392,10 @@
if (start && p_cb->adv_mode == BTM_BLE_ADV_DISABLE)
{
/* update adv params */
- if (!btsnd_hcic_ble_write_adv_params ((UINT16)(p_cb->adv_interval_min ? p_cb->adv_interval_min : BTM_BLE_GAP_ADV_INT),
- (UINT16)(p_cb->adv_interval_max ? p_cb->adv_interval_max : BTM_BLE_GAP_ADV_INT),
+ if (!btsnd_hcic_ble_write_adv_params ((UINT16)(p_cb->adv_interval_min ? p_cb->adv_interval_min :
+ BTM_BLE_GAP_ADV_INT),
+ (UINT16)(p_cb->adv_interval_max ? p_cb->adv_interval_max :
+ BTM_BLE_GAP_ADV_INT),
evt_type,
p_addr_cb->own_addr_type,
p_cb->direct_bda.type,
@@ -270,21 +409,139 @@
status = btm_ble_start_adv ();
}
- else if (!start && p_cb->adv_mode == BTM_BLE_ADV_ENABLE)
+ else if (!start)
{
status = btm_ble_stop_adv();
}
else
{
status = BTM_WRONG_MODE;
- BTM_TRACE_ERROR2("Can not %s Broadcast, device %s in Broadcast mode",
- (start ? "Start" : "Stop"), (start ? "alerady" :"not"));
+ BTM_TRACE_ERROR("Can not %s Broadcast, device %s in Broadcast mode",
+ (start ? "Start" : "Stop"), (start ? "already" :"not"));
}
return status;
}
/*******************************************************************************
**
+** Function btm_vsc_brcm_features_complete
+**
+** Description Command Complete callback for HCI_BLE_VENDOR_CAP_OCF
+**
+** Returns void
+**
+*******************************************************************************/
+static void btm_ble_vendor_capability_vsc_cmpl_cback (tBTM_VSC_CMPL *p_vcs_cplt_params)
+{
+#if BLE_VND_INCLUDED == TRUE
+ UINT8 status = 0xFF, *p;
+
+ BTM_TRACE_DEBUG("btm_ble_vendor_capability_vsc_cmpl_cback");
+
+ /* Check status of command complete event */
+ if ((p_vcs_cplt_params->opcode == HCI_BLE_VENDOR_CAP_OCF) &&(p_vcs_cplt_params->param_len > 0))
+ {
+ p = p_vcs_cplt_params->p_param_buf;
+ STREAM_TO_UINT8 (status, p);
+ }
+
+ if (status == HCI_SUCCESS)
+ {
+ STREAM_TO_UINT8 (btm_cb.cmn_ble_vsc_cb.adv_inst_max, p);
+ STREAM_TO_UINT8 (btm_cb.cmn_ble_vsc_cb.rpa_offloading, p);
+ STREAM_TO_UINT16 (btm_cb.cmn_ble_vsc_cb.tot_scan_results_strg, p);
+ STREAM_TO_UINT8 (btm_cb.cmn_ble_vsc_cb.max_irk_list_sz, p);
+ STREAM_TO_UINT8 (btm_cb.cmn_ble_vsc_cb.filter_support, p);
+ STREAM_TO_UINT8 (btm_cb.cmn_ble_vsc_cb.max_filter, p);
+ STREAM_TO_UINT8 (btm_cb.cmn_ble_vsc_cb.energy_support, p);
+ btm_cb.cmn_ble_vsc_cb.values_read = TRUE;
+ }
+
+ BTM_TRACE_DEBUG("btm_ble_vnd_cap_vsc_cmpl_cback: stat=%d, irk=%d, ADV ins:%d, rpa=%d, ener=%d",
+ status, btm_ble_vendor_cb.irk_avail_size, btm_cb.cmn_ble_vsc_cb.adv_inst_max,
+ btm_cb.cmn_ble_vsc_cb.rpa_offloading, btm_cb.cmn_ble_vsc_cb.energy_support);
+
+ if (BTM_BleMaxMultiAdvInstanceCount() > 0)
+ btm_ble_multi_adv_init();
+
+ if (btm_cb.cmn_ble_vsc_cb.max_filter > 0)
+ {
+ btm_ble_adv_filter_init();
+ }
+
+ if (btm_cb.cmn_ble_vsc_cb.max_irk_list_sz > 0)
+ {
+ btm_ble_vendor_init(btm_cb.cmn_ble_vsc_cb.max_irk_list_sz);
+ }
+
+ if (btm_cb.cmn_ble_vsc_cb.tot_scan_results_strg > 0)
+ btm_ble_batchscan_init();
+
+ if (p_ctrl_le_feature_rd_cmpl_cback != NULL)
+ p_ctrl_le_feature_rd_cmpl_cback(status);
+
+#else
+ UNUSED(p_vcs_cplt_params);
+#endif
+}
+
+/*******************************************************************************
+**
+** Function BTM_BleGetVendorCapabilities
+**
+** Description This function reads local LE features
+**
+** Parameters p_cmn_vsc_cb : Locala LE capability structure
+**
+** Returns void
+**
+*******************************************************************************/
+BTM_API extern void BTM_BleGetVendorCapabilities(tBTM_BLE_VSC_CB *p_cmn_vsc_cb)
+{
+ BTM_TRACE_DEBUG("BTM_BleGetVendorCapabilities");
+
+ if (NULL != p_cmn_vsc_cb)
+ {
+ *p_cmn_vsc_cb = btm_cb.cmn_ble_vsc_cb;
+ }
+}
+
+/******************************************************************************
+**
+** Function BTM_BleReadControllerFeatures
+**
+** Description Reads BLE specific controller features
+**
+** Parameters: tBTM_BLE_CTRL_FEATURES_CBACK : Callback to notify when features are read
+**
+** Returns void
+**
+*******************************************************************************/
+BTM_API extern void BTM_BleReadControllerFeatures(tBTM_BLE_CTRL_FEATURES_CBACK *p_vsc_cback)
+{
+ if (TRUE == btm_cb.cmn_ble_vsc_cb.values_read)
+ return;
+
+#if BLE_VND_INCLUDED == TRUE
+ BTM_TRACE_DEBUG("BTM_BleReadControllerFeatures");
+
+ p_ctrl_le_feature_rd_cmpl_cback = p_vsc_cback;
+ if ( BTM_VendorSpecificCommand (HCI_BLE_VENDOR_CAP_OCF,
+ 0,
+ NULL,
+ btm_ble_vendor_capability_vsc_cmpl_cback)
+ != BTM_CMD_STARTED)
+ {
+ BTM_TRACE_ERROR("LE Get_Vendor Capabilities Command Failed.");
+ }
+#else
+ UNUSED(p_vsc_cback);
+#endif
+ return ;
+}
+
+/*******************************************************************************
+**
** Function BTM_RegisterScanReqEvt
**
** Description This function is called to register a scan request callback
@@ -309,7 +566,59 @@
#endif
}
-#if BTM_BLE_PRIVACY_SPT == TRUE
+/*******************************************************************************
+**
+** Function BTM_BleConfigPrivacy
+**
+** Description This function is called to enable or disable the privacy in
+** LE channel of the local device.
+**
+** Parameters enable: TRUE to enable it; FALSE to disable it.
+**
+** Returns void
+**
+*******************************************************************************/
+void BTM_BleConfigPrivacy(BOOLEAN enable)
+{
+ tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
+
+ BTM_TRACE_EVENT (" BTM_BleConfigPrivacy");
+
+ if (p_cb->privacy != enable)
+ {
+ p_cb->privacy = enable;
+
+ if (p_cb->privacy)
+ {
+ /* generate resolvable private address */
+ btm_gen_resolvable_private_addr((void*)btm_gen_resolve_paddr_low);
+ }
+ else /* if privacy disabled, always use public address */
+ {
+ p_cb->addr_mgnt_cb.own_addr_type = BLE_ADDR_PUBLIC;
+ }
+
+ if (BTM_BleMaxMultiAdvInstanceCount() > 0)
+ btm_ble_multi_adv_enb_privacy(p_cb->privacy);
+ }
+}
+
+/*******************************************************************************
+**
+** Function BTM_BleMaxMultiAdvInstanceCount
+**
+** Description Returns max number of multi adv instances supported by controller
+**
+** Returns Max multi adv instance count
+**
+*******************************************************************************/
+BTM_API extern UINT8 BTM_BleMaxMultiAdvInstanceCount()
+{
+ return btm_cb.cmn_ble_vsc_cb.adv_inst_max < BTM_BLE_MULTI_ADV_MAX ?
+ btm_cb.cmn_ble_vsc_cb.adv_inst_max : BTM_BLE_MULTI_ADV_MAX;
+}
+
+#if BLE_PRIVACY_SPT == TRUE
/*******************************************************************************
**
** Function btm_ble_resolve_random_addr_on_adv
@@ -327,7 +636,7 @@
UINT8 *pp = (UINT8 *)p + 1;
UINT8 evt_type;
- BTM_TRACE_EVENT0 ("btm_ble_resolve_random_addr_on_adv ");
+ BTM_TRACE_EVENT ("btm_ble_resolve_random_addr_on_adv ");
STREAM_TO_UINT8 (evt_type, pp);
STREAM_TO_UINT8 (addr_type, pp);
@@ -335,7 +644,7 @@
if (match_rec)
{
- BTM_TRACE_ERROR0("Random match");
+ BTM_TRACE_ERROR("Random match");
match_rec->ble.active_addr_type = BTM_BLE_ADDR_RRA;
memcpy(match_rec->ble.cur_rand_addr, bda, BD_ADDR_LEN);
memcpy(bda, match_rec->bd_addr, BD_ADDR_LEN);
@@ -343,7 +652,7 @@
}
else
{
- BTM_TRACE_ERROR0("Random unmatch");
+ BTM_TRACE_ERROR("Random unmatch");
}
btm_ble_process_adv_pkt_cont(bda, addr_type, evt_type, pp);
@@ -354,6 +663,24 @@
/*******************************************************************************
**
+** Function BTM_BleLocalPrivacyEnabled
+**
+** Description Checks if local device supports private address
+**
+** Returns Return TRUE if local privacy is enabled else FALSE
+**
+*******************************************************************************/
+BOOLEAN BTM_BleLocalPrivacyEnabled()
+{
+#if BLE_PRIVACY_SPT == TRUE
+ return btm_cb.ble_ctr_cb.privacy;
+#else
+ return false;
+#endif
+}
+
+/*******************************************************************************
+**
** Function BTM_BleSetBgConnType
**
** Description This function is called to set BLE connectable mode for a
@@ -371,7 +698,7 @@
{
BOOLEAN started = TRUE;
- BTM_TRACE_EVENT0 ("BTM_BleSetBgConnType ");
+ BTM_TRACE_EVENT ("BTM_BleSetBgConnType ");
if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
return FALSE;
@@ -404,7 +731,7 @@
break;
default:
- BTM_TRACE_ERROR1("invalid bg connection type : %d ", bg_conn_type);
+ BTM_TRACE_ERROR("invalid bg connection type : %d ", bg_conn_type);
started = FALSE;
break;
}
@@ -417,6 +744,26 @@
/*******************************************************************************
**
+** Function BTM_BleClearBgConnDev
+**
+** Description This function is called to clear the whitelist,
+** end any pending whitelist connections,
+* and reset the local bg device list.
+**
+** Parameters void
+**
+** Returns void
+**
+*******************************************************************************/
+void BTM_BleClearBgConnDev(void)
+{
+ btm_ble_start_auto_conn(FALSE);
+ btm_ble_clear_white_list();
+ gatt_reset_bgdev_list();
+}
+
+/*******************************************************************************
+**
** Function BTM_BleUpdateBgConnDev
**
** Description This function is called to add or remove a device into/from
@@ -433,13 +780,12 @@
BOOLEAN BTM_BleUpdateBgConnDev(BOOLEAN add_remove, BD_ADDR remote_bda)
{
BOOLEAN ret = TRUE;
- UINT8 dev_wl_type = 0;
- BTM_TRACE_EVENT0 (" BTM_BleUpdateBgConnDev");
+ BTM_TRACE_EVENT (" BTM_BleUpdateBgConnDev");
/* update white list */
- ret = btm_update_bg_conn_list(add_remove, remote_bda, &dev_wl_type);
+ ret = btm_update_bg_conn_list(add_remove, remote_bda);
- btm_update_dev_to_white_list(add_remove, remote_bda, dev_wl_type);
+ btm_update_dev_to_white_list(add_remove, remote_bda);
return ret;
}
@@ -461,7 +807,7 @@
{
tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
- BTM_TRACE_EVENT1 ("BTM_BleSetConnMode is_directed = %d ", is_directed);
+ BTM_TRACE_EVENT ("BTM_BleSetConnMode is_directed = %d ", is_directed);
if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
return BTM_ILLEGAL_VALUE;
@@ -486,11 +832,13 @@
{
UINT8 evt_type;
+ UNUSED(p_own_addr_type);
+
if ( p_cb->directed_conn)
{
/* direct adv mode does not have privacy if privacy
- is not enabled or no reconn addr config */
- *p_own_addr_type = BLE_ADDR_PUBLIC;
+ is not enabled or no reconn addr config */
+
*p_init_addr_type = p_cb->direct_bda.type;
memcpy(p_addr_ptr, p_cb->direct_bda.bda, BD_ADDR_LEN);
evt_type = BTM_BLE_CONNECT_DIR_EVT;
@@ -498,6 +846,14 @@
else /* undirect adv mode */
{
evt_type = BTM_BLE_CONNECT_EVT;
+
+ /* may need to reset random address if privacy is enabled */
+ if (btm_cb.ble_ctr_cb.privacy && /* own addr_type is random */
+ !BTM_BLE_IS_RESOLVE_BDA(btm_cb.ble_ctr_cb.addr_mgnt_cb.private_addr))
+ {
+ /* need to generate RRA and update random addresss in controller */
+ btm_gen_resolvable_private_addr((void *)btm_gen_resolve_paddr_low);
+ }
}
return evt_type;
@@ -530,7 +886,7 @@
tBLE_ADDR_TYPE own_addr_type = p_addr_cb->own_addr_type;
UINT8 adv_mode = p_cb->adv_mode;
- BTM_TRACE_EVENT0 ("BTM_BleSetAdvParams");
+ BTM_TRACE_EVENT ("BTM_BleSetAdvParams");
if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
return BTM_ILLEGAL_VALUE;
@@ -550,7 +906,7 @@
memcpy(&p_cb->direct_bda, p_dir_bda, sizeof(tBLE_BD_ADDR));
}
- BTM_TRACE_EVENT0 ("update params for an active adv");
+ BTM_TRACE_EVENT ("update params for an active adv");
btm_ble_stop_adv();
@@ -592,7 +948,7 @@
{
tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
- BTM_TRACE_EVENT0 ("BTM_BleReadAdvParams ");
+ BTM_TRACE_EVENT ("BTM_BleReadAdvParams ");
if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
return ;
@@ -625,7 +981,7 @@
{
tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
- BTM_TRACE_EVENT0 (" BTM_BleSetScanParams");
+ BTM_TRACE_EVENT (" BTM_BleSetScanParams");
if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
return ;
@@ -643,7 +999,7 @@
}
else
{
- BTM_TRACE_ERROR2("Illegal params: scan_interval = %d scan_window = %d",
+ BTM_TRACE_ERROR("Illegal params: scan_interval = %d scan_window = %d",
scan_interval, scan_window);
}
@@ -666,7 +1022,7 @@
UINT8 rsp_data[BTM_BLE_AD_DATA_LEN],
*p = rsp_data;
- BTM_TRACE_EVENT0 (" BTM_BleWriteScanRsp");
+ BTM_TRACE_EVENT (" BTM_BleWriteScanRsp");
if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
return BTM_ILLEGAL_VALUE;
@@ -704,9 +1060,9 @@
{
tBTM_BLE_LOCAL_ADV_DATA *p_cb_data = &btm_cb.ble_ctr_cb.inq_var.adv_data;
UINT8 *p;
- UINT16 mask = data_mask;
+ tBTM_BLE_AD_MASK mask = data_mask;
- BTM_TRACE_EVENT0 ("BTM_BleWriteAdvData ");
+ BTM_TRACE_EVENT ("BTM_BleWriteAdvData ");
if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
return BTM_ILLEGAL_VALUE;
@@ -719,9 +1075,9 @@
p_cb_data->p_pad = p;
- if (data_mask != 0)
+ if (mask != 0)
{
- BTM_TRACE_ERROR0("Partial data write into ADV");
+ BTM_TRACE_ERROR("Partial data write into ADV");
}
p_cb_data->data_mask &= ~mask;
@@ -752,7 +1108,7 @@
UINT8 *p = p_adv;
UINT8 length;
UINT8 adv_type;
- BTM_TRACE_API1("BTM_CheckAdvData type=0x%02X", type);
+ BTM_TRACE_API("BTM_CheckAdvData type=0x%02X", type);
STREAM_TO_UINT8(length, p);
@@ -780,16 +1136,17 @@
**
** Description This function is called build the adv data and rsp data.
*******************************************************************************/
-static UINT8 *btm_ble_build_adv_data(tBTM_BLE_AD_MASK *p_data_mask, UINT8 **p_dst, tBTM_BLE_ADV_DATA *p_data)
+UINT8 *btm_ble_build_adv_data(tBTM_BLE_AD_MASK *p_data_mask, UINT8 **p_dst,
+ tBTM_BLE_ADV_DATA *p_data)
{
- UINT16 data_mask = *p_data_mask;
+ UINT32 data_mask = *p_data_mask;
UINT8 *p = *p_dst,
*p_flag = NULL;
UINT16 len = BTM_BLE_AD_DATA_LEN, cp_len = 0;
UINT8 i = 0;
tBTM_BLE_PROP_ELEM *p_elem;
- BTM_TRACE_EVENT0 (" btm_ble_build_adv_data");
+ BTM_TRACE_EVENT (" btm_ble_build_adv_data");
/* build the adv data structure and build the data string */
if (data_mask)
@@ -797,7 +1154,7 @@
/* flags */
if (data_mask & BTM_BLE_AD_BIT_FLAGS)
{
- *p++ = 2;
+ *p++ = MIN_ADV_LENGTH;
*p++ = BTM_BLE_AD_TYPE_FLAG;
p_flag = p;
if (p_data)
@@ -821,13 +1178,13 @@
}
/* device name */
#if BTM_MAX_LOC_BD_NAME_LEN > 0
- if (len > 2 && data_mask & BTM_BLE_AD_BIT_DEV_NAME)
+ if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_DEV_NAME)
{
- if (strlen(btm_cb.cfg.bd_name) > (UINT16)(len - 2))
+ if (strlen(btm_cb.cfg.bd_name) > (UINT16)(len - MIN_ADV_LENGTH))
{
- *p++ = len - 2 + 1;
+ *p++ = len - MIN_ADV_LENGTH + 1;
*p++ = BTM_BLE_AD_TYPE_NAME_SHORT;
- ARRAY_TO_STREAM(p, btm_cb.cfg.bd_name, len - 2);
+ ARRAY_TO_STREAM(p, btm_cb.cfg.bd_name, len - MIN_ADV_LENGTH);
}
else
{
@@ -836,61 +1193,181 @@
*p++ = BTM_BLE_AD_TYPE_NAME_CMPL;
ARRAY_TO_STREAM(p, btm_cb.cfg.bd_name, cp_len);
}
- len -= (cp_len + 2);
+ len -= (cp_len + MIN_ADV_LENGTH);
data_mask &= ~BTM_BLE_AD_BIT_DEV_NAME;
}
#endif
/* manufacturer data */
- if (len > 2 && data_mask & BTM_BLE_AD_BIT_MANU &&
- p_data && p_data->manu.len != 0 && p_data->manu.p_val)
+ if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_MANU &&
+ p_data && p_data->p_manu &&
+ p_data->p_manu->len != 0 && p_data->p_manu->p_val)
{
- if (p_data->manu.len > (len - 2))
- cp_len = len - 2;
+ if (p_data->p_manu->len > (len - MIN_ADV_LENGTH))
+ cp_len = len - MIN_ADV_LENGTH;
else
- cp_len = p_data->manu.len;
+ cp_len = p_data->p_manu->len;
*p++ = cp_len + 1;
*p++ = BTM_BLE_AD_TYPE_MANU;
- ARRAY_TO_STREAM(p, p_data->manu.p_val, cp_len);
+ ARRAY_TO_STREAM(p, p_data->p_manu->p_val, cp_len);
- len -= (cp_len + 2);
+ len -= (cp_len + MIN_ADV_LENGTH);
data_mask &= ~BTM_BLE_AD_BIT_MANU;
}
/* TX power */
- if (len > 2 && data_mask & BTM_BLE_AD_BIT_TX_PWR)
+ if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_TX_PWR)
{
- *p++ = 2;
+ *p++ = MIN_ADV_LENGTH;
*p++ = BTM_BLE_AD_TYPE_TX_PWR;
- *p++ = btm_cb.ble_ctr_cb.inq_var.tx_power;
+ if (p_data->tx_power > BTM_BLE_ADV_TX_POWER_MAX)
+ p_data->tx_power = BTM_BLE_ADV_TX_POWER_MAX;
+ *p++ = btm_ble_map_adv_tx_power(p_data->tx_power);
len -= 3;
-
data_mask &= ~BTM_BLE_AD_BIT_TX_PWR;
}
- /* services */
- if (len > 2 && data_mask & BTM_BLE_AD_BIT_SERVICE &&
- p_data && p_data->services.num_service != 0 &&
- p_data->services.p_uuid)
+ /* 16 bits services */
+ if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_SERVICE &&
+ p_data && p_data->p_services &&
+ p_data->p_services->num_service != 0 &&
+ p_data->p_services->p_uuid)
{
- if (p_data->services.num_service * 2 > (len - 2))
+ if (p_data->p_services->num_service * LEN_UUID_16 > (len - MIN_ADV_LENGTH))
{
- cp_len = (len - 2)/2;
- *p ++ = 1 + cp_len * 2;
+ cp_len = (len - MIN_ADV_LENGTH)/LEN_UUID_16;
+ *p ++ = 1 + cp_len * LEN_UUID_16;
*p++ = BTM_BLE_AD_TYPE_16SRV_PART;
}
else
{
- cp_len = p_data->services.num_service;
- *p++ = 1 + cp_len * 2;
+ cp_len = p_data->p_services->num_service;
+ *p++ = 1 + cp_len * LEN_UUID_16;
*p++ = BTM_BLE_AD_TYPE_16SRV_CMPL;
}
for (i = 0; i < cp_len; i ++)
{
- UINT16_TO_STREAM(p, *(p_data->services.p_uuid + i));
+ UINT16_TO_STREAM(p, *(p_data->p_services->p_uuid + i));
}
- len -= (cp_len * 2 + 2);
+ len -= (cp_len * MIN_ADV_LENGTH + MIN_ADV_LENGTH);
data_mask &= ~BTM_BLE_AD_BIT_SERVICE;
}
+ /* 32 bits service uuid */
+ if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_SERVICE_32 &&
+ p_data && p_data->p_service_32b &&
+ p_data->p_service_32b->num_service != 0 &&
+ p_data->p_service_32b->p_uuid)
+ {
+ if ((p_data->p_service_32b->num_service * LEN_UUID_32) > (len - MIN_ADV_LENGTH))
+ {
+ cp_len = (len - MIN_ADV_LENGTH)/LEN_UUID_32;
+ *p ++ = 1 + cp_len * LEN_UUID_32;
+ *p++ = BTM_BLE_AD_TYPE_32SRV_PART;
+ }
+ else
+ {
+ cp_len = p_data->p_service_32b->num_service;
+ *p++ = 1 + cp_len * LEN_UUID_32;
+ *p++ = BTM_BLE_AD_TYPE_32SRV_CMPL;
+ }
+ for (i = 0; i < cp_len; i ++)
+ {
+ UINT32_TO_STREAM(p, *(p_data->p_service_32b->p_uuid + i));
+ }
+
+ len -= (cp_len * LEN_UUID_32 + MIN_ADV_LENGTH);
+ data_mask &= ~BTM_BLE_AD_BIT_SERVICE_32;
+ }
+ /* 128 bits services */
+ if (len >= (MAX_UUID_SIZE + 2) && data_mask & BTM_BLE_AD_BIT_SERVICE_128 &&
+ p_data && p_data->p_services_128b)
+ {
+ *p ++ = 1 + MAX_UUID_SIZE;
+ if (!p_data->p_services_128b->list_cmpl)
+ *p++ = BTM_BLE_AD_TYPE_128SRV_PART;
+ else
+ *p++ = BTM_BLE_AD_TYPE_128SRV_CMPL;
+
+ ARRAY_TO_STREAM(p, p_data->p_services_128b->uuid128, MAX_UUID_SIZE);
+
+ len -= (MAX_UUID_SIZE + MIN_ADV_LENGTH);
+ data_mask &= ~BTM_BLE_AD_BIT_SERVICE_128;
+ }
+ /* 32 bits Service Solicitation UUIDs */
+ if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_SERVICE_32SOL &&
+ p_data && p_data->p_sol_service_32b &&
+ p_data->p_sol_service_32b->num_service != 0 &&
+ p_data->p_sol_service_32b->p_uuid)
+ {
+ if ((p_data->p_sol_service_32b->num_service * LEN_UUID_32) > (len - MIN_ADV_LENGTH))
+ {
+ cp_len = (len - MIN_ADV_LENGTH)/LEN_UUID_32;
+ *p ++ = 1 + cp_len * LEN_UUID_32;
+ }
+ else
+ {
+ cp_len = p_data->p_sol_service_32b->num_service;
+ *p++ = 1 + cp_len * LEN_UUID_32;
+ }
+
+ *p++ = BTM_BLE_AD_TYPE_32SOL_SRV_UUID;
+ for (i = 0; i < cp_len; i ++)
+ {
+ UINT32_TO_STREAM(p, *(p_data->p_sol_service_32b->p_uuid + i));
+ }
+
+ len -= (cp_len * LEN_UUID_32 + MIN_ADV_LENGTH);
+ data_mask &= ~BTM_BLE_AD_BIT_SERVICE_32SOL;
+ }
+ /* 128 bits Solicitation services UUID */
+ if (len >= (MAX_UUID_SIZE + MIN_ADV_LENGTH) && data_mask & BTM_BLE_AD_BIT_SERVICE_128SOL &&
+ p_data && p_data->p_sol_service_128b)
+ {
+ *p ++ = 1 + MAX_UUID_SIZE;
+ *p++ = BTM_BLE_AD_TYPE_128SOL_SRV_UUID;
+ ARRAY_TO_STREAM(p, p_data->p_sol_service_128b->uuid128, MAX_UUID_SIZE);
+ len -= (MAX_UUID_SIZE + MIN_ADV_LENGTH);
+ data_mask &= ~BTM_BLE_AD_BIT_SERVICE_128SOL;
+ }
+ /* 16bits/32bits/128bits Service Data */
+ if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_SERVICE_DATA &&
+ p_data && p_data->p_service_data->len != 0 && p_data->p_service_data->p_val)
+ {
+ if (len > (p_data->p_service_data->service_uuid.len + MIN_ADV_LENGTH))
+ {
+ if (p_data->p_service_data->len > (len - MIN_ADV_LENGTH))
+ cp_len = len - MIN_ADV_LENGTH- p_data->p_service_data->service_uuid.len;
+ else
+ cp_len = p_data->p_service_data->len;
+
+ *p++ = cp_len + 1 + p_data->p_service_data->service_uuid.len;
+ if (p_data->p_service_data->service_uuid.len == LEN_UUID_16)
+ {
+ *p++ = BTM_BLE_AD_TYPE_SERVICE_DATA;
+ UINT16_TO_STREAM(p, p_data->p_service_data->service_uuid.uu.uuid16);
+ }
+ else if (p_data->p_service_data->service_uuid.len == LEN_UUID_32)
+ {
+ *p++ = BTM_BLE_AD_TYPE_32SERVICE_DATA;
+ UINT32_TO_STREAM(p, p_data->p_service_data->service_uuid.uu.uuid32);
+ }
+ else
+ {
+ *p++ = BTM_BLE_AD_TYPE_128SERVICE_DATA;
+ ARRAY_TO_STREAM(p, p_data->p_service_data->service_uuid.uu.uuid128,
+ LEN_UUID_128);
+ }
+
+ ARRAY_TO_STREAM(p, p_data->p_service_data->p_val, cp_len);
+
+ len -= (cp_len + MIN_ADV_LENGTH + p_data->p_service_data->service_uuid.len);
+ data_mask &= ~BTM_BLE_AD_BIT_SERVICE_DATA;
+ }
+ else
+ {
+ BTM_TRACE_WARNING("service data does not fit");
+ }
+ }
+
if (len >= 6 && data_mask & BTM_BLE_AD_BIT_INT_RANGE &&
p_data)
{
@@ -907,17 +1384,18 @@
{
p_elem = p_data->p_proprietary->p_elem + i;
- if (len >= (2 + p_elem->len))/* len byte(1) + ATTR type(1) + Uuid len(2) + value length */
+ if (len >= (MIN_ADV_LENGTH + p_elem->len))/* len byte(1) + ATTR type(1) + Uuid len(2)
+ + value length */
{
*p ++ = p_elem->len + 1; /* Uuid len + value length */
*p ++ = p_elem->adv_type;
ARRAY_TO_STREAM(p, p_elem->p_val, p_elem->len);
- len -= (2 + p_elem->len);
+ len -= (MIN_ADV_LENGTH + p_elem->len);
}
else
{
- BTM_TRACE_WARNING0("data exceed max adv packet length");
+ BTM_TRACE_WARNING("data exceed max adv packet length");
break;
}
}
@@ -930,16 +1408,108 @@
return p_flag;
}
+/*******************************************************************************
+**
+** Function btm_ble_select_adv_interval
+**
+** Description select adv interval based on device mode
+**
+** Returns void
+**
+*******************************************************************************/
+void btm_ble_select_adv_interval(tBTM_BLE_INQ_CB *p_cb, UINT8 evt_type, UINT16 *p_adv_int_min, UINT16 *p_adv_int_max)
+{
+ if (p_cb->adv_interval_min && p_cb->adv_interval_max)
+ {
+ *p_adv_int_min = p_cb->adv_interval_min;
+ *p_adv_int_max = p_cb->adv_interval_max;
+ }
+ else
+ {
+ switch (evt_type)
+ {
+ case BTM_BLE_CONNECT_EVT:
+ *p_adv_int_min = *p_adv_int_max = BTM_BLE_GAP_ADV_FAST_INT_1;
+ break;
+ case BTM_BLE_NON_CONNECT_EVT:
+ case BTM_BLE_DISCOVER_EVT:
+ *p_adv_int_min = *p_adv_int_max = BTM_BLE_GAP_ADV_FAST_INT_2;
+ break;
+ /* connectable directed event */
+ case BTM_BLE_CONNECT_DIR_EVT:
+ *p_adv_int_min = BTM_BLE_GAP_ADV_DIR_MIN_INT;
+ *p_adv_int_max = BTM_BLE_GAP_ADV_DIR_MAX_INT;
+ break;
+
+ default:
+ *p_adv_int_min = *p_adv_int_max = BTM_BLE_GAP_ADV_SLOW_INT;
+ break;
+ }
+ }
+ return;
+}
+/*******************************************************************************
+**
+** Function btm_ble_set_adv_flag
+**
+** Description Set adv flag in adv data.
+**
+** Returns void
+**
+*******************************************************************************/
+void btm_ble_set_adv_flag(UINT16 connect_mode, UINT16 disc_mode)
+{
+ UINT8 flag = 0, old_flag = 0;
+ tBTM_BLE_LOCAL_ADV_DATA *p_adv_data = &btm_cb.ble_ctr_cb.inq_var.adv_data;
+
+ if (p_adv_data->p_flags != NULL)
+ flag = old_flag = *(p_adv_data->p_flags);
+
+ /* BR/EDR non-discoverable , non-connectable */
+ if ((disc_mode & BTM_DISCOVERABLE_MASK) == 0 &&
+ (connect_mode & BTM_CONNECTABLE_MASK) == 0)
+ flag |= BTM_BLE_BREDR_NOT_SPT;
+ else
+ flag &= ~BTM_BLE_BREDR_NOT_SPT;
+
+ /* if local controller support, mark both controller and host support in flag */
+ if (HCI_SIMUL_LE_BREDR_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_0]))
+ flag |= (BTM_BLE_DMT_CONTROLLER_SPT|BTM_BLE_DMT_HOST_SPT);
+ else
+ flag &= ~(BTM_BLE_DMT_CONTROLLER_SPT|BTM_BLE_DMT_HOST_SPT);
+
+ BTM_TRACE_DEBUG("disc_mode %04x", disc_mode);
+ /* update discoverable flag */
+ if (disc_mode & BTM_BLE_LIMITED_DISCOVERABLE)
+ {
+ flag &= ~BTM_BLE_GEN_DISC_FLAG;
+ flag |= BTM_BLE_LIMIT_DISC_FLAG ;
+ }
+ else if (disc_mode & BTM_BLE_GENERAL_DISCOVERABLE)
+ {
+ flag |= BTM_BLE_GEN_DISC_FLAG;
+ flag &= ~BTM_BLE_LIMIT_DISC_FLAG;
+ }
+ else /* remove all discoverable flags */
+ {
+ flag &= ~(BTM_BLE_LIMIT_DISC_FLAG|BTM_BLE_GEN_DISC_FLAG);
+ }
+
+ if (flag != old_flag)
+ {
+ btm_ble_update_adv_flag(flag);
+ }
+}
/*******************************************************************************
**
** Function btm_ble_set_discoverability
**
** Description This function is called to set BLE discoverable mode.
**
-** Parameters: mode: discoverability mode.
+** Parameters: combined_mode: discoverability mode.
**
-** Returns void
+** Returns BTM_SUCCESS is status set successfully; otherwise failure.
**
*******************************************************************************/
tBTM_STATUS btm_ble_set_discoverability(UINT16 combined_mode)
@@ -947,7 +1517,6 @@
tBTM_LE_RANDOM_CB *p_addr_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
UINT16 mode = (combined_mode & BTM_BLE_DISCOVERABLE_MASK);
- UINT8 flag = 0;
UINT8 new_mode = BTM_BLE_ADV_ENABLE;
UINT8 evt_type = (p_cb->connectable_mode == BTM_BLE_NON_CONNECTABLE) ? \
((p_cb->scan_rsp) ? BTM_BLE_DISCOVER_EVT : BTM_BLE_NON_CONNECT_EVT )\
@@ -955,64 +1524,37 @@
tBTM_STATUS status = BTM_SUCCESS;
BD_ADDR p_addr_ptr= {0};
tBLE_ADDR_TYPE init_addr_type = BLE_ADDR_PUBLIC,
- own_addr_type = p_addr_cb->own_addr_type;;
+ own_addr_type = p_addr_cb->own_addr_type;
+ UINT16 adv_int_min, adv_int_max;
- BTM_TRACE_EVENT2 ("btm_ble_set_discoverability mode=0x%0x combined_mode=0x%x", mode, combined_mode);
+ BTM_TRACE_EVENT ("btm_ble_set_discoverability mode=0x%0x combined_mode=0x%x", mode, combined_mode);
/*** Check mode parameter ***/
if (mode > BTM_BLE_MAX_DISCOVERABLE)
return(BTM_ILLEGAL_VALUE);
- p_cb->br_edr_supported_flag |= (combined_mode & BTM_DISCOVERABLE_MASK);
- p_cb->discoverable_mode = mode;
+ btm_ble_set_adv_flag (btm_cb.btm_inq_vars.connectable_mode, combined_mode);
- if (!p_cb->br_edr_supported_flag)
- {
- flag = BTM_BLE_BREDR_NOT_SPT;
- BTM_TRACE_DEBUG1("btm_ble_set_discoverability (BREDR not sup)flag=0x%x",flag);
- }
+ evt_type = btm_set_conn_mode_adv_init_addr(p_cb, p_addr_ptr, &init_addr_type, &own_addr_type);
- BTM_TRACE_DEBUG1 ("br_edr_supported=0x%x", p_cb->br_edr_supported_flag);
+ if (p_cb->connectable_mode == BTM_BLE_NON_CONNECTABLE && mode == BTM_BLE_NON_DISCOVERABLE)
+ new_mode = BTM_BLE_ADV_DISABLE;
- if (mode == BTM_BLE_LIMITED_DISCOVERABLE || mode == BTM_BLE_GENERAL_DISCOVERABLE)
- {
- BTM_TRACE_EVENT0 ("mode == BTM_BLE_LIMITED_DISCOVERABLE ");
- /* write ADV data with limited disc flag */
- if (mode == BTM_BLE_LIMITED_DISCOVERABLE)
- flag |= BTM_BLE_LIMIT_DISC_FLAG ;
- else
- flag |= BTM_BLE_GEN_DISC_FLAG;
- }
- else /* non-discoverable */
- {
- BTM_TRACE_EVENT0 ("mode == BTM_BLE_NON_DISCOVERABLE ");
+ btm_ble_select_adv_interval(p_cb, evt_type, &adv_int_min, &adv_int_max);
- if (p_cb->connectable_mode == BTM_BLE_NON_CONNECTABLE)
- {
- p_cb->br_edr_supported_flag = 0;
-
- BTM_TRACE_EVENT0 ("always disable adv in non-discoverable non-connectable mode if no scan rsp ");
- if (!p_cb->scan_rsp )
- new_mode = BTM_BLE_ADV_DISABLE;
-
- }
- else
- {
- p_cb->evt_type = btm_set_conn_mode_adv_init_addr(p_cb, p_addr_ptr, &init_addr_type, &own_addr_type);
- }
- }
- btm_ble_update_adv_flag(flag);
+ btu_stop_timer(&p_cb->fast_adv_timer);
/* update adv params if start advertising */
- BTM_TRACE_EVENT2 ("evt_type=0x%x p-cb->evt_type=0x%x ", evt_type, p_cb->evt_type);
+ BTM_TRACE_EVENT ("evt_type=0x%x p-cb->evt_type=0x%x ", evt_type, p_cb->evt_type);
+
if (new_mode == BTM_BLE_ADV_ENABLE &&
- (evt_type != p_cb->evt_type ||p_cb->adv_addr_type != own_addr_type))
+ (evt_type != p_cb->evt_type ||p_cb->adv_addr_type != own_addr_type || !p_cb->fast_adv_on))
{
btm_ble_stop_adv();
/* update adv params */
- if (!btsnd_hcic_ble_write_adv_params ((UINT16)(p_cb->adv_interval_min ? p_cb->adv_interval_min : BTM_BLE_GAP_ADV_INT),
- (UINT16)(p_cb->adv_interval_max ? p_cb->adv_interval_max : BTM_BLE_GAP_ADV_INT),
+ if (!btsnd_hcic_ble_write_adv_params (adv_int_min,
+ adv_int_max,
evt_type,
own_addr_type,
init_addr_type,
@@ -1036,11 +1578,18 @@
else
status = btm_ble_stop_adv();
}
+ if (p_cb->adv_mode == BTM_BLE_ADV_ENABLE)
+ {
+ p_cb->fast_adv_on = TRUE;
+ /* start initial GAP mode adv timer */
+ btu_start_timer (&p_cb->fast_adv_timer, BTU_TTYPE_BLE_GAP_FAST_ADV,
+ BTM_BLE_GAP_FAST_ADV_TOUT);
+ }
/* set up stop advertising timer */
if (status == BTM_SUCCESS && mode == BTM_BLE_LIMITED_DISCOVERABLE)
{
- BTM_TRACE_EVENT1 ("start timer for limited disc mode duration=%d (30 secs)", BTM_BLE_GAP_LIM_TOUT);
+ BTM_TRACE_EVENT ("start timer for limited disc mode duration=%d (180 secs)", BTM_BLE_GAP_LIM_TOUT);
/* start Tgap(lim_timeout) */
btu_start_timer (&p_cb->inq_timer_ent, BTU_TTYPE_BLE_GAP_LIM_DISC,
BTM_BLE_GAP_LIM_TOUT);
@@ -1054,9 +1603,9 @@
**
** Description This function is called to set BLE connectability mode.
**
-** Parameters: mode: connectability mode.
+** Parameters: combined_mode: connectability mode.
**
-** Returns void
+** Returns BTM_SUCCESS is status set successfully; otherwise failure.
**
*******************************************************************************/
tBTM_STATUS btm_ble_set_connectability(UINT16 combined_mode)
@@ -1064,57 +1613,39 @@
tBTM_LE_RANDOM_CB *p_addr_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
UINT16 mode = (combined_mode & BTM_BLE_CONNECTABLE_MASK);
- UINT8 cur_flag = 0;
- UINT8 cur_br_edr_not_sup_flag;
- UINT8 new_flag;
UINT8 new_mode = BTM_BLE_ADV_ENABLE;
UINT8 evt_type = (p_cb->scan_rsp) ? BTM_BLE_DISCOVER_EVT: BTM_BLE_NON_CONNECT_EVT;
tBTM_STATUS status = BTM_SUCCESS;
BD_ADDR p_addr_ptr = {0};
tBLE_ADDR_TYPE init_addr_type = BLE_ADDR_PUBLIC,
own_addr_type = p_addr_cb->own_addr_type;
+ UINT16 adv_int_min, adv_int_max;
- BTM_TRACE_EVENT2 ("btm_ble_set_connectability mode=0x%0x combined_mode=0x%x", mode, combined_mode);
+ BTM_TRACE_EVENT ("btm_ble_set_connectability mode=0x%0x combined_mode=0x%x", mode, combined_mode);
+
/*** Check mode parameter ***/
if (mode > BTM_BLE_MAX_CONNECTABLE)
return(BTM_ILLEGAL_VALUE);
- if (btm_cb.ble_ctr_cb.inq_var.adv_data.p_flags)
- cur_flag = *btm_cb.ble_ctr_cb.inq_var.adv_data.p_flags ;
- cur_br_edr_not_sup_flag = (cur_flag & ((UINT8) BTM_BLE_BREDR_NOT_SPT));
- p_cb->br_edr_supported_flag |= ((combined_mode & BTM_CONNECTABLE_MASK) << 4);
- if (p_cb->br_edr_supported_flag && cur_br_edr_not_sup_flag)
- {
- new_flag = cur_flag & ((UINT8) (~BTM_BLE_BREDR_NOT_SPT));
- BTM_TRACE_EVENT2 ("new flag=0x%x cur flag=0x%x",new_flag, cur_flag);
- btm_ble_update_adv_flag(new_flag);
- }
p_cb->connectable_mode = mode;
- if (mode == BTM_BLE_NON_CONNECTABLE)
- {
- if (p_cb->discoverable_mode == BTM_BLE_NON_DISCOVERABLE)
- {
- p_cb->br_edr_supported_flag = 0;
- BTM_TRACE_EVENT0 ("always disable adv in non-discoverable non-connectable mode with no scan rsp");
- if(!p_cb->scan_rsp)
- new_mode = BTM_BLE_ADV_DISABLE;
+ btm_ble_set_adv_flag (combined_mode, btm_cb.btm_inq_vars.discoverable_mode);
- }
- }
- else /* connectable */
- {
- evt_type = btm_set_conn_mode_adv_init_addr(p_cb, p_addr_ptr, &init_addr_type, &own_addr_type);
- }
+ evt_type = btm_set_conn_mode_adv_init_addr(p_cb, p_addr_ptr, &init_addr_type, &own_addr_type);
+ if (mode == BTM_BLE_NON_CONNECTABLE && p_cb->discoverable_mode == BTM_BLE_NON_DISCOVERABLE)
+ new_mode = BTM_BLE_ADV_DISABLE;
+
+ btm_ble_select_adv_interval(p_cb, evt_type, &adv_int_min, &adv_int_max);
+
+ btu_stop_timer(&p_cb->fast_adv_timer);
/* update adv params if needed */
- if ((p_cb->evt_type != evt_type || p_cb->adv_addr_type != p_addr_cb->own_addr_type)
- && new_mode == BTM_BLE_ADV_ENABLE)
+ if ((p_cb->evt_type != evt_type || p_cb->adv_addr_type != p_addr_cb->own_addr_type || !p_cb->fast_adv_on))
{
btm_ble_stop_adv();
- if (!btsnd_hcic_ble_write_adv_params ((UINT16)(p_cb->adv_interval_min ? p_cb->adv_interval_min : BTM_BLE_GAP_ADV_INT),
- (UINT16)(p_cb->adv_interval_max ? p_cb->adv_interval_max : BTM_BLE_GAP_ADV_INT),
+ if (!btsnd_hcic_ble_write_adv_params (adv_int_min,
+ adv_int_max,
evt_type,
own_addr_type,
init_addr_type,
@@ -1132,24 +1663,22 @@
/* update advertising mode */
if (status == BTM_SUCCESS && new_mode != p_cb->adv_mode)
{
- if (btsnd_hcic_ble_set_adv_enable (new_mode))
- {
- status = BTM_SUCCESS;
-
- p_cb->adv_mode = new_mode;
-
- if (p_cb->adv_mode == BTM_BLE_ADV_ENABLE &&
- p_cb->afp != AP_SCAN_CONN_ALL)
- btm_cb.ble_ctr_cb.wl_state |= BTM_BLE_WL_ADV;
- else
- btm_cb.ble_ctr_cb.wl_state &= ~BTM_BLE_WL_ADV;
-
- }
+ if (new_mode == BTM_BLE_ADV_ENABLE)
+ status = btm_ble_start_adv();
+ else
+ status = btm_ble_stop_adv();
}
-
+ if (p_cb->adv_mode == BTM_BLE_ADV_ENABLE)
+ {
+ p_cb->fast_adv_on = TRUE;
+ /* start initial GAP mode adv timer */
+ btu_start_timer (&p_cb->fast_adv_timer, BTU_TTYPE_BLE_GAP_FAST_ADV,
+ BTM_BLE_GAP_FAST_ADV_TOUT);
+ }
return status;
}
+
/*******************************************************************************
**
** Function btm_ble_start_inquiry
@@ -1171,24 +1700,37 @@
*******************************************************************************/
tBTM_STATUS btm_ble_start_inquiry (UINT8 mode, UINT8 duration)
{
- tBTM_STATUS status = BTM_NO_RESOURCES;
- tBTM_BLE_INQ_CB *p_inq = &btm_cb.ble_ctr_cb.inq_var;
+ tBTM_STATUS status = BTM_CMD_STARTED;
+ tBTM_BLE_CB *p_ble_cb = &btm_cb.ble_ctr_cb;
+ tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars;
- BTM_TRACE_DEBUG2("btm_ble_start_inquiry: mode = %02x inq_active = %d", mode, btm_cb.btm_inq_vars.inq_active);
+ BTM_TRACE_DEBUG("btm_ble_start_inquiry: mode = %02x inq_active = 0x%02x", mode, btm_cb.btm_inq_vars.inq_active);
- if (p_inq->proc_mode != BTM_BLE_INQUIRY_NONE)
+ /* if selective connection is active, or inquiry is already active, reject it */
+ if (BTM_BLE_IS_INQ_ACTIVE(p_ble_cb->scan_activity) ||
+ BTM_BLE_IS_SEL_CONN_ACTIVE (p_ble_cb->scan_activity))
{
- BTM_TRACE_ERROR0("LE scan is active, can not start inquiry");
+ BTM_TRACE_ERROR("LE Inquiry is active, can not start inquiry");
return(BTM_BUSY);
}
- btm_update_scanner_filter_policy(SP_ADV_ALL);
-
- /* start scan, already enable duplicate filtering */
- if (btsnd_hcic_ble_set_scan_enable (BTM_BLE_SCAN_ENABLE, BTM_BLE_DUPLICATE_DISABLE))
+ if (!BTM_BLE_IS_SCAN_ACTIVE(p_ble_cb->scan_activity))
{
- status = BTM_CMD_STARTED;
- p_inq->proc_mode = mode;
+ btm_update_scanner_filter_policy(SP_ADV_ALL);
+
+#if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
+ /* enable IRK list */
+ btm_ble_vendor_irk_list_known_dev (TRUE);
+#endif
+ status = btm_ble_start_scan(BTM_BLE_DUPLICATE_DISABLE);
+ }
+
+ if (status == BTM_CMD_STARTED)
+ {
+ p_inq->inq_active |= mode;
+ p_ble_cb->scan_activity |= mode;
+
+ BTM_TRACE_DEBUG("btm_ble_start_inquiry inq_active = 0x%02x", p_inq->inq_active);
if (duration != 0)
{
@@ -1198,6 +1740,7 @@
}
return status;
+
}
/*******************************************************************************
@@ -1215,6 +1758,10 @@
BD_NAME bd_name;
memset(bd_name, 0, (BD_NAME_LEN + 1));
+ if (length > BD_NAME_LEN)
+ {
+ length = BD_NAME_LEN;
+ }
memcpy((UINT8*)bd_name, p_name, length);
if ((!status) || (length==0))
@@ -1249,7 +1796,7 @@
p_cur->results.ble_evt_type != BTM_BLE_EVT_CONN_ADV &&
p_cur->results.ble_evt_type != BTM_BLE_EVT_CONN_DIR_ADV)
{
- BTM_TRACE_DEBUG0("name request to non-connectable device failed.");
+ BTM_TRACE_DEBUG("name request to non-connectable device failed.");
return BTM_ERR_PROCESSING;
}
@@ -1314,11 +1861,11 @@
tBTM_BLE_LOCAL_ADV_DATA *p_adv_data = &btm_cb.ble_ctr_cb.inq_var.adv_data;
UINT8 *p;
- BTM_TRACE_DEBUG1 ("btm_ble_update_adv_flag new=0x%x", flag);
+ BTM_TRACE_DEBUG ("btm_ble_update_adv_flag new=0x%x", flag);
if (p_adv_data->p_flags != NULL)
{
- BTM_TRACE_DEBUG1 ("btm_ble_update_adv_flag old=0x%x", *p_adv_data->p_flags);
+ BTM_TRACE_DEBUG ("btm_ble_update_adv_flag old=0x%x", *p_adv_data->p_flags);
*p_adv_data->p_flags = flag;
}
else /* no FLAGS in ADV data*/
@@ -1361,17 +1908,17 @@
UINT8 *p_cur = p_data;
UINT8 ad_len, ad_type, ad_flag;
- BTM_TRACE_EVENT0 (" btm_ble_parse_adv_data");
+ BTM_TRACE_EVENT (" btm_ble_parse_adv_data");
while (len > 0)
{
- BTM_TRACE_DEBUG1("btm_ble_parse_adv_data: len = %d", len);
+ BTM_TRACE_DEBUG("btm_ble_parse_adv_data: len = %d", len);
if ((ad_len = *p_cur ++) == 0)
break;
ad_type = *p_cur ++;
- BTM_TRACE_DEBUG2(" ad_type = %02x ad_len = %d", ad_type, ad_len);
+ BTM_TRACE_DEBUG(" ad_type = %02x ad_len = %d", ad_type, ad_len);
switch (ad_type)
{
@@ -1387,7 +1934,7 @@
p_info->remote_name[ad_len] = 0;
p_adv_data->p_remote_name = p_info->remote_name;
p_info->remote_name_len = p_adv_data->remote_name_len = ad_len - 1;
- BTM_TRACE_DEBUG1("BTM_BLE_AD_TYPE_NAME name = %s",p_adv_data->p_remote_name);
+ BTM_TRACE_DEBUG("BTM_BLE_AD_TYPE_NAME name = %s",p_adv_data->p_remote_name);
}
p_cur += (ad_len -1);
@@ -1397,7 +1944,7 @@
p_adv_data->ad_mask |= BTM_BLE_AD_BIT_FLAGS;
ad_flag = *p_cur ++;
p_adv_data->flag = (UINT8)(ad_flag & BTM_BLE_ADV_FLAG_MASK) ;
- BTM_TRACE_DEBUG3("BTM_BLE_AD_TYPE_FLAG flag = %s | %s | %s",
+ BTM_TRACE_DEBUG("BTM_BLE_AD_TYPE_FLAG flag = %s | %s | %s",
(p_adv_data->flag & BTM_BLE_LIMIT_DISC_FLAG)? "LE_LIMIT_DISC" : "",
(p_adv_data->flag & BTM_BLE_GEN_DISC_FLAG)? "LE_GENERAL_DISC" : "",
(p_adv_data->flag & BTM_BLE_BREDR_NOT_SPT)? "LE Only device" : "");
@@ -1406,7 +1953,7 @@
case BTM_BLE_AD_TYPE_TX_PWR:
p_adv_data->ad_mask |= BTM_BLE_AD_BIT_TX_PWR;
p_adv_data->tx_power_level = (INT8)*p_cur ++;
- BTM_TRACE_DEBUG1("BTM_BLE_AD_TYPE_TX_PWR tx_level = %d", p_adv_data->tx_power_level);
+ BTM_TRACE_DEBUG("BTM_BLE_AD_TYPE_TX_PWR tx_level = %d", p_adv_data->tx_power_level);
break;
case BTM_BLE_AD_TYPE_MANU:
@@ -1416,7 +1963,7 @@
p_adv_data->ad_mask |= BTM_BLE_AD_BIT_SERVICE;
/* need allocate memory to store UUID list */
p_adv_data->service.num_service = (ad_len - 1)/2;
- BTM_TRACE_DEBUG1("service UUID list, num = %d", p_adv_data->service.num_service);
+ BTM_TRACE_DEBUG("service UUID list, num = %d", p_adv_data->service.num_service);
p_cur += (ad_len - 1);
break;
@@ -1424,7 +1971,7 @@
p_adv_data->ad_mask |= BTM_BLE_AD_BIT_SERVICE_SOL;
/* need allocate memory to store UUID list */
p_adv_data->service.num_service = (ad_len - 1)/2;
- BTM_TRACE_DEBUG1("service UUID list, num = %d", p_adv_data->service.num_service);
+ BTM_TRACE_DEBUG("service UUID list, num = %d", p_adv_data->service.num_service);
p_cur += (ad_len - 1);
break;
@@ -1432,7 +1979,7 @@
p_adv_data->ad_mask |= BTM_BLE_AD_BIT_SERVICE_128SOL;
/* need allocate memory to store UUID list */
p_adv_data->service.num_service = (ad_len - 1)/16;
- BTM_TRACE_DEBUG1("service UUID list, num = %d", p_adv_data->service.num_service);
+ BTM_TRACE_DEBUG("service UUID list, num = %d", p_adv_data->service.num_service);
p_cur += (ad_len - 1);
break;
@@ -1504,68 +2051,181 @@
** Returns void
**
*******************************************************************************/
-BOOLEAN btm_ble_is_discoverable(BD_ADDR bda, UINT8 evt_type, UINT8 *p)
+UINT8 btm_ble_is_discoverable(BD_ADDR bda, UINT8 evt_type, UINT8 *p)
{
- BOOLEAN is_discoverable = FALSE;
- UINT8 *p_flag, flag = 0;
+ UINT8 *p_flag, flag = 0, rt = 0;
UINT8 data_len;
tBTM_INQ_PARMS *p_cond = &btm_cb.btm_inq_vars.inqparms;
+ tBTM_BLE_INQ_CB *p_le_inq_cb = &btm_cb.ble_ctr_cb.inq_var;
- STREAM_TO_UINT8 (data_len, p);
+ UNUSED(p);
/* for observer, always "discoverable */
- if (btm_cb.ble_ctr_cb.inq_var.proc_mode == BTM_BLE_OBSERVE ||
- (btm_cb.ble_ctr_cb.inq_var.proc_mode == BTM_BLE_SELECT_SCAN &&
- btm_cb.ble_ctr_cb.bg_conn_type == BTM_BLE_CONN_SELECTIVE))
- return TRUE;
+ if (BTM_BLE_IS_OBS_ACTIVE(btm_cb.ble_ctr_cb.scan_activity))
+ rt |= BTM_BLE_OBS_RESULT;
+
+ if (BTM_BLE_IS_SEL_CONN_ACTIVE(btm_cb.ble_ctr_cb.scan_activity) &&
+ (evt_type == BTM_BLE_CONNECT_EVT || evt_type == BTM_BLE_CONNECT_DIR_EVT))
+ rt |= BTM_BLE_SEL_CONN_RESULT;
/* does not match filter condition */
if (p_cond->filter_cond_type == BTM_FILTER_COND_BD_ADDR &&
memcmp(bda, p_cond->filter_cond.bdaddr_cond, BD_ADDR_LEN) != 0)
{
- BTM_TRACE_DEBUG0("BD ADDR does not meet filter condition");
- return FALSE;
+ BTM_TRACE_DEBUG("BD ADDR does not meet filter condition");
+ return rt;
}
- /* scan response does not include the flag */
- if (evt_type == BTM_BLE_SCAN_RSP_EVT)
- return FALSE;
-
- if (data_len > BTM_BLE_ADV_DATA_LEN_MAX)
+ if (p_le_inq_cb->adv_len != 0)
{
- BTM_TRACE_WARNING1("ADV data too long %d. discard", data_len);
- return FALSE;
- }
-
- if (data_len != 0)
- {
- if ((p_flag = BTM_CheckAdvData(p, BTM_BLE_AD_TYPE_FLAG, &data_len)) != NULL)
+ if ((p_flag = BTM_CheckAdvData(p_le_inq_cb->adv_data_cache,
+ BTM_BLE_AD_TYPE_FLAG, &data_len)) != NULL)
{
flag = * p_flag;
- if ((btm_cb.ble_ctr_cb.inq_var.proc_mode == BTM_BLE_GENERAL_INQUIRY) &&
+ if ((btm_cb.btm_inq_vars.inq_active & BTM_BLE_GENERAL_INQUIRY) &&
(flag & (BTM_BLE_LIMIT_DISC_FLAG|BTM_BLE_GEN_DISC_FLAG)) != 0)
{
- BTM_TRACE_DEBUG0("Find Generable Discoverable device");
- is_discoverable = TRUE;
+ BTM_TRACE_DEBUG("Find Generable Discoverable device");
+ rt |= BTM_BLE_INQ_RESULT;
}
- else if (btm_cb.ble_ctr_cb.inq_var.proc_mode == BTM_BLE_LIMITED_INQUIRY &&
+ else if (btm_cb.btm_inq_vars.inq_active & BTM_BLE_LIMITED_INQUIRY &&
(flag & BTM_BLE_LIMIT_DISC_FLAG) != 0)
{
- BTM_TRACE_DEBUG0("Find limited discoverable device");
- is_discoverable = TRUE;
+ BTM_TRACE_DEBUG("Find limited discoverable device");
+ rt |= BTM_BLE_INQ_RESULT;
}
-
}
}
+ return rt;
+}
- if (!is_discoverable)
+static void btm_ble_appearance_to_cod(UINT16 appearance, UINT8 *dev_class)
+{
+ dev_class[0] = 0;
+
+ switch (appearance)
{
- BTM_TRACE_ERROR1("discoverable flag not desired: %d", flag);
- }
-
- return is_discoverable;
+ case BTM_BLE_APPEARANCE_GENERIC_PHONE:
+ dev_class[1] = BTM_COD_MAJOR_PHONE;
+ dev_class[2] = BTM_COD_MINOR_UNCLASSIFIED;
+ break;
+ case BTM_BLE_APPEARANCE_GENERIC_COMPUTER:
+ dev_class[1] = BTM_COD_MAJOR_COMPUTER;
+ dev_class[2] = BTM_COD_MINOR_UNCLASSIFIED;
+ break;
+ case BTM_BLE_APPEARANCE_GENERIC_REMOTE:
+ dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
+ dev_class[2] = BTM_COD_MINOR_REMOTE_CONTROL;
+ break;
+ case BTM_BLE_APPEARANCE_GENERIC_THERMOMETER:
+ case BTM_BLE_APPEARANCE_THERMOMETER_EAR:
+ dev_class[1] = BTM_COD_MAJOR_HEALTH;
+ dev_class[2] = BTM_COD_MINOR_THERMOMETER;
+ break;
+ case BTM_BLE_APPEARANCE_GENERIC_HEART_RATE:
+ case BTM_BLE_APPEARANCE_HEART_RATE_BELT:
+ dev_class[1] = BTM_COD_MAJOR_HEALTH;
+ dev_class[2] = BTM_COD_MINOR_HEART_PULSE_MONITOR;
+ break;
+ case BTM_BLE_APPEARANCE_GENERIC_BLOOD_PRESSURE:
+ case BTM_BLE_APPEARANCE_BLOOD_PRESSURE_ARM:
+ case BTM_BLE_APPEARANCE_BLOOD_PRESSURE_WRIST:
+ dev_class[1] = BTM_COD_MAJOR_HEALTH;
+ dev_class[2] = BTM_COD_MINOR_BLOOD_MONITOR;
+ break;
+ case BTM_BLE_APPEARANCE_GENERIC_PULSE_OXIMETER:
+ case BTM_BLE_APPEARANCE_PULSE_OXIMETER_FINGERTIP:
+ case BTM_BLE_APPEARANCE_PULSE_OXIMETER_WRIST:
+ dev_class[1] = BTM_COD_MAJOR_HEALTH;
+ dev_class[2] = BTM_COD_MINOR_PULSE_OXIMETER;
+ break;
+ case BTM_BLE_APPEARANCE_GENERIC_GLUCOSE:
+ dev_class[1] = BTM_COD_MAJOR_HEALTH;
+ dev_class[2] = BTM_COD_MINOR_GLUCOSE_METER;
+ break;
+ case BTM_BLE_APPEARANCE_GENERIC_WEIGHT:
+ dev_class[1] = BTM_COD_MAJOR_HEALTH;
+ dev_class[2] = BTM_COD_MINOR_WEIGHING_SCALE;
+ break;
+ case BTM_BLE_APPEARANCE_GENERIC_WALKING:
+ case BTM_BLE_APPEARANCE_WALKING_IN_SHOE:
+ case BTM_BLE_APPEARANCE_WALKING_ON_SHOE:
+ case BTM_BLE_APPEARANCE_WALKING_ON_HIP:
+ dev_class[1] = BTM_COD_MAJOR_HEALTH;
+ dev_class[2] = BTM_COD_MINOR_STEP_COUNTER;
+ break;
+ case BTM_BLE_APPEARANCE_GENERIC_WATCH:
+ case BTM_BLE_APPEARANCE_SPORTS_WATCH:
+ dev_class[1] = BTM_COD_MAJOR_WEARABLE;
+ dev_class[2] = BTM_COD_MINOR_WRIST_WATCH;
+ break;
+ case BTM_BLE_APPEARANCE_GENERIC_EYEGLASSES:
+ dev_class[1] = BTM_COD_MAJOR_WEARABLE;
+ dev_class[2] = BTM_COD_MINOR_GLASSES;
+ break;
+ case BTM_BLE_APPEARANCE_GENERIC_DISPLAY:
+ dev_class[1] = BTM_COD_MAJOR_IMAGING;
+ dev_class[2] = BTM_COD_MINOR_DISPLAY;
+ break;
+ case BTM_BLE_APPEARANCE_GENERIC_MEDIA_PLAYER:
+ dev_class[1] = BTM_COD_MAJOR_AUDIO;
+ dev_class[2] = BTM_COD_MINOR_UNCLASSIFIED;
+ break;
+ case BTM_BLE_APPEARANCE_GENERIC_BARCODE_SCANNER:
+ case BTM_BLE_APPEARANCE_HID_BARCODE_SCANNER:
+ case BTM_BLE_APPEARANCE_GENERIC_HID:
+ dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
+ dev_class[2] = BTM_COD_MINOR_UNCLASSIFIED;
+ break;
+ case BTM_BLE_APPEARANCE_HID_KEYBOARD:
+ dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
+ dev_class[2] = BTM_COD_MINOR_KEYBOARD;
+ break;
+ case BTM_BLE_APPEARANCE_HID_MOUSE:
+ dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
+ dev_class[2] = BTM_COD_MINOR_POINTING;
+ break;
+ case BTM_BLE_APPEARANCE_HID_JOYSTICK:
+ dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
+ dev_class[2] = BTM_COD_MINOR_JOYSTICK;
+ break;
+ case BTM_BLE_APPEARANCE_HID_GAMEPAD:
+ dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
+ dev_class[2] = BTM_COD_MINOR_GAMEPAD;
+ break;
+ case BTM_BLE_APPEARANCE_HID_DIGITIZER_TABLET:
+ dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
+ dev_class[2] = BTM_COD_MINOR_DIGITIZING_TABLET;
+ break;
+ case BTM_BLE_APPEARANCE_HID_CARD_READER:
+ dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
+ dev_class[2] = BTM_COD_MINOR_CARD_READER;
+ break;
+ case BTM_BLE_APPEARANCE_HID_DIGITAL_PEN:
+ dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
+ dev_class[2] = BTM_COD_MINOR_DIGITAL_PAN;
+ break;
+ case BTM_BLE_APPEARANCE_UKNOWN:
+ case BTM_BLE_APPEARANCE_GENERIC_CLOCK:
+ case BTM_BLE_APPEARANCE_GENERIC_TAG:
+ case BTM_BLE_APPEARANCE_GENERIC_KEYRING:
+ case BTM_BLE_APPEARANCE_GENERIC_CYCLING:
+ case BTM_BLE_APPEARANCE_CYCLING_COMPUTER:
+ case BTM_BLE_APPEARANCE_CYCLING_SPEED:
+ case BTM_BLE_APPEARANCE_CYCLING_CADENCE:
+ case BTM_BLE_APPEARANCE_CYCLING_POWER:
+ case BTM_BLE_APPEARANCE_CYCLING_SPEED_CADENCE:
+ case BTM_BLE_APPEARANCE_GENERIC_OUTDOOR_SPORTS:
+ case BTM_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION:
+ case BTM_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION_AND_NAV:
+ case BTM_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION_POD:
+ case BTM_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION_POD_AND_NAV:
+ default:
+ dev_class[1] = BTM_COD_MAJOR_UNCLASSIFIED;
+ dev_class[2] = BTM_COD_MINOR_UNCLASSIFIED;
+ };
}
/*******************************************************************************
@@ -1595,7 +2255,7 @@
if (data_len > BTM_BLE_ADV_DATA_LEN_MAX)
{
- BTM_TRACE_WARNING1("EIR data too long %d. discard", data_len);
+ BTM_TRACE_WARNING("EIR data too long %d. discard", data_len);
return FALSE;
}
btm_ble_cache_adv_data(p_cur, data_len, p, evt_type);
@@ -1612,7 +2272,7 @@
if ((btm_cb.ble_ctr_cb.inq_var.scan_type == BTM_BLE_SCAN_MODE_ACTI &&
(evt_type == BTM_BLE_CONNECT_EVT || evt_type == BTM_BLE_DISCOVER_EVT)))
{
- BTM_TRACE_DEBUG1("btm_ble_update_inq_result scan_rsp=false, to_report=false,\
+ BTM_TRACE_DEBUG("btm_ble_update_inq_result scan_rsp=false, to_report=false,\
scan_type_active=%d", btm_cb.ble_ctr_cb.inq_var.scan_type);
p_i->scan_rsp = FALSE;
to_report = FALSE;
@@ -1638,19 +2298,31 @@
if (p_le_inq_cb->adv_len != 0)
{
- if ((p_uuid16 = BTM_CheckAdvData(p_le_inq_cb->adv_data_cache,
- BTM_BLE_AD_TYPE_16SRV_CMPL, &len)) != NULL)
+ /* Check to see the BLE device has the Appearance UUID in the advertising data. If it does
+ * then try to convert the appearance value to a class of device value Bluedroid can use.
+ * Otherwise fall back to trying to infer if it is a HID device based on the service class.
+ */
+ p_uuid16 = BTM_CheckAdvData(p_le_inq_cb->adv_data_cache, BTM_BLE_AD_TYPE_APPEARANCE, &len);
+ if (p_uuid16 && len == 2)
{
- UINT8 i;
- for (i = 0; i + 2 <= len; i = i + 2)
+ btm_ble_appearance_to_cod((UINT16)p_uuid16[0] | (p_uuid16[1] << 8), p_cur->dev_class);
+ }
+ else
+ {
+ if ((p_uuid16 = BTM_CheckAdvData(p_le_inq_cb->adv_data_cache,
+ BTM_BLE_AD_TYPE_16SRV_CMPL, &len)) != NULL)
{
- /* if this BLE device support HID over LE, set HID Major in class of device */
- if ((p_uuid16[i] | (p_uuid16[i+1] << 8)) == UUID_SERVCLASS_LE_HID)
+ UINT8 i;
+ for (i = 0; i + 2 <= len; i = i + 2)
{
- p_cur->dev_class[0] = 0;
- p_cur->dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
- p_cur->dev_class[2] = 0;
- break;
+ /* if this BLE device support HID over LE, set HID Major in class of device */
+ if ((p_uuid16[i] | (p_uuid16[i+1] << 8)) == UUID_SERVCLASS_LE_HID)
+ {
+ p_cur->dev_class[0] = 0;
+ p_cur->dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
+ p_cur->dev_class[2] = 0;
+ break;
+ }
}
}
}
@@ -1662,15 +2334,15 @@
{
if (p_cur->ble_addr_type != BLE_ADDR_RANDOM)
{
- BTM_TRACE_DEBUG0("BR/EDR NOT support bit not set, treat as DUMO");
+ BTM_TRACE_DEBUG("BR/EDR NOT support bit not set, treat as DUMO");
p_cur->device_type |= BT_DEVICE_TYPE_DUMO;
} else {
- BTM_TRACE_DEBUG0("Random address, treating device as LE only");
+ BTM_TRACE_DEBUG("Random address, treating device as LE only");
}
}
else
{
- BTM_TRACE_DEBUG0("BR/EDR NOT SUPPORT bit set, LE only device");
+ BTM_TRACE_DEBUG("BR/EDR NOT SUPPORT bit set, LE only device");
}
return to_report;
@@ -1738,49 +2410,61 @@
BD_ADDR bda;
UINT8 evt_type = 0, *p = p_data;
UINT8 addr_type = 0;
-#if (defined BTM_BLE_PRIVACY_SPT && BTM_BLE_PRIVACY_SPT == TRUE)
+ UINT8 num_reports;
+ UINT8 data_len;
+#if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
BOOLEAN match = FALSE;
#endif
- /* always get one device at a time */
- p ++;
+ /* Extract the number of reports in this event. */
+ STREAM_TO_UINT8(num_reports, p);
- /* Extract inquiry results */
- STREAM_TO_UINT8 (evt_type, p);
- STREAM_TO_UINT8 (addr_type, p);
- STREAM_TO_BDADDR (bda, p);
+ while (num_reports--)
+ {
+ /* Extract inquiry results */
+ STREAM_TO_UINT8 (evt_type, p);
+ STREAM_TO_UINT8 (addr_type, p);
+ STREAM_TO_BDADDR (bda, p);
#ifdef BTM_BLE_PC_ADV_TEST_MODE /* For general stack code (e.g. BTInsight testing), we simply do not define it to exclude or set it to TRUE to include */
- if (BTM_BLE_PC_ADV_TEST_MODE) /* For stack component, it is always defined and maps to a global variable g_bDraculaAdvertisingMode */
- {
- if (btm_cb.ble_ctr_cb.p_scan_req_cback)
- (*btm_cb.ble_ctr_cb.p_scan_req_cback)(bda, addr_type, evt_type);
- }
+ if (BTM_BLE_PC_ADV_TEST_MODE) /* For stack component, it is always defined and maps to a global variable g_bDraculaAdvertisingMode */
+ {
+ if (btm_cb.ble_ctr_cb.p_scan_req_cback)
+ (*btm_cb.ble_ctr_cb.p_scan_req_cback)(bda, addr_type, evt_type);
+ }
#endif
+#if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
+ /* map address to security record */
+ btm_public_addr_to_random_pseudo(bda, &addr_type);
+ BTM_TRACE_ERROR("new address: %02x:%02x:%02x:%02x:%02x:%02x",
+ bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]);
+#endif
+ /* Only process the results if the inquiry is still active */
+ if (!BTM_BLE_IS_SCAN_ACTIVE(btm_cb.ble_ctr_cb.scan_activity))
+ return;
- /* Only process the results if the inquiry is still active */
- if ((btm_cb.btm_inq_vars.inq_active & BTM_LE_SCAN_ACTIVE_MASK) == 0 &&
- (btm_cb.ble_ctr_cb.bg_conn_type != BTM_BLE_CONN_SELECTIVE ||
- /* or selective auto connection is active */
- btm_cb.ble_ctr_cb.p_select_cback == NULL))
- return;
-
- BTM_TRACE_DEBUG6("btm_ble_process_adv_pkt:bda= %0x:%0x:%0x:%0x:%0x:%0x",
+ BTM_TRACE_DEBUG("btm_ble_process_adv_pkt:bda= %0x:%0x:%0x:%0x:%0x:%0x",
bda[0],bda[1],bda[2],bda[3],bda[4],bda[5]);
-#if (defined BTM_BLE_PRIVACY_SPT && BTM_BLE_PRIVACY_SPT == TRUE)
+#if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
#if SMP_INCLUDED == TRUE
- /* always do RRA resolution on host */
- if (!match && BTM_BLE_IS_RESOLVE_BDA(bda))
- {
- btm_ble_resolve_random_addr(bda, btm_ble_resolve_random_addr_on_adv, p_data);
- }
- else
+ /* always do RRA resolution on host */
+ if (!match && BTM_BLE_IS_RESOLVE_BDA(bda))
+ {
+ btm_ble_resolve_random_addr(bda, btm_ble_resolve_random_addr_on_adv, p_data);
+ }
+ else
#endif
#endif
- {
- btm_ble_process_adv_pkt_cont(bda, addr_type, evt_type, p);
+ {
+ btm_ble_process_adv_pkt_cont(bda, addr_type, evt_type, p);
+ }
+
+ STREAM_TO_UINT8(data_len, p);
+
+ /* Advance to the next event data_len + rssi byte */
+ p += data_len + 1;
}
}
@@ -1799,13 +2483,12 @@
static void btm_ble_process_adv_pkt_cont(BD_ADDR bda, UINT8 addr_type, UINT8 evt_type, UINT8 *p)
{
tINQ_DB_ENT *p_i;
- BOOLEAN to_report = FALSE;
- BOOLEAN to_report_LE = TRUE; //var for reporting to LE observe
tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars;
tBTM_INQ_RESULTS_CB *p_inq_results_cb = p_inq->p_inq_results_cb;
- tBTM_INQ_RESULTS_CB *p_inq_ble_results_cb = p_inq->p_inq_ble_results_cb;
+ tBTM_INQ_RESULTS_CB *p_obs_results_cb = btm_cb.ble_ctr_cb.p_obs_results_cb;
tBTM_BLE_INQ_CB *p_le_inq_cb = &btm_cb.ble_ctr_cb.inq_var;
- BTM_TRACE_DEBUG2("btm_ble_process_adv_pkt_cont: addr_type: %d, evt_type: %d", addr_type, evt_type);
+ BOOLEAN update = TRUE;
+ UINT8 result = 0;
p_i = btm_inq_db_find (bda);
@@ -1813,26 +2496,23 @@
if (btm_inq_find_bdaddr(bda))
{
/* never been report as an LE device */
- if ((p_i &&
+ if (p_i &&
(!(p_i->inq_info.results.device_type & BT_DEVICE_TYPE_BLE) ||
/* scan repsonse to be updated */
(!p_i->scan_rsp)))
- ||
- btm_cb.ble_ctr_cb.inq_var.proc_mode == BTM_BLE_OBSERVE)
{
- BTM_TRACE_DEBUG0("update new BLE information ");
- to_report = TRUE;
+ update = TRUE;
+ }
+ else if (BTM_BLE_IS_OBS_ACTIVE(btm_cb.ble_ctr_cb.scan_activity))
+ {
+ update = FALSE;
}
else
{
- to_report = FALSE;
+ /* if yes, skip it */
+ return; /* assumption: one result per event */
}
}
- else /* not been processed in this round */
- {
- to_report = TRUE;
- }
-
/* If existing entry, use that, else get a new one (possibly reusing the oldest) */
if (p_i == NULL)
{
@@ -1842,25 +2522,22 @@
}
else
return;
-
- if (to_report && btm_ble_is_discoverable(bda, evt_type, p))
- {
- to_report = TRUE;
- }
- else
- {
- BTM_TRACE_ERROR0("discard adv pkt");
- to_report = FALSE;
- }
}
else if (p_i->inq_count != p_inq->inq_counter) /* first time seen in this inquiry */
{
p_inq->inq_cmpl_info.num_resp++;
}
/* update the LE device information in inquiry database */
- to_report_LE = btm_ble_update_inq_result(p_i, addr_type, evt_type, p);
- if (to_report)
- to_report = to_report_LE;
+ if (!btm_ble_update_inq_result(p_i, addr_type, evt_type, p))
+ return;
+
+ if ((result = btm_ble_is_discoverable(bda, evt_type, p)) == 0)
+ {
+ BTM_TRACE_ERROR("discard adv pkt");
+ return;
+ }
+ if (!update)
+ result &= ~BTM_BLE_INQ_RESULT;
#if BTM_USE_INQ_RESULTS_FILTER == TRUE
/* If the number of responses found and limited, issue a cancel inquiry */
if (p_inq->inqparms.max_resps &&
@@ -1871,15 +2548,14 @@
(/* assume a DUMO device, BR/EDR inquiry is always active */
p_i && p_i->inq_info.results.device_type == BT_DEVICE_TYPE_BLE && p_i->scan_rsp))
{
- BTM_TRACE_WARNING0("INQ RES: Extra Response Received...cancelling inquiry..");
+ BTM_TRACE_WARNING("INQ RES: Extra Response Received...cancelling inquiry..");
/* if is non-periodic inquiry active, cancel now */
if ((p_inq->inq_active & BTM_BR_INQ_ACTIVE_MASK) != 0 &&
(p_inq->inq_active & BTM_PERIODIC_INQUIRY_ACTIVE) == 0)
btsnd_hcic_inq_cancel();
- /* stop LE scan now */
- btm_ble_stop_scan();
+ btm_ble_stop_inquiry();
#if BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE
btm_acl_update_busy_level (BTM_BLI_INQ_DONE_EVT);
@@ -1887,32 +2563,61 @@
}
}
#endif
-
- BTM_TRACE_DEBUG2("btm_ble_process_adv_pkt_cont: to_report =%d, to_report_le=%d",
- to_report, to_report_LE);
/* background connection in selective connection mode */
if (btm_cb.ble_ctr_cb.bg_conn_type == BTM_BLE_CONN_SELECTIVE)
{
- if (p_i->inq_info.results.device_type == BT_DEVICE_TYPE_BLE &&
- (evt_type == BTM_BLE_CONNECT_EVT || evt_type == BTM_BLE_CONNECT_DIR_EVT))
+ if (result & BTM_BLE_SEL_CONN_RESULT)
btm_send_sel_conn_callback(bda, evt_type, p, addr_type);
else
{
- BTM_TRACE_DEBUG0("None LE device, can not initiate selective connection");
+ BTM_TRACE_DEBUG("None LE device, can not initiate selective connection");
}
}
- else if (to_report || to_report_LE)
+ else
{
- if(p_inq_results_cb && to_report)
+ if (p_inq_results_cb && (result & BTM_BLE_INQ_RESULT))
+ {
(p_inq_results_cb)((tBTM_INQ_RESULTS *) &p_i->inq_info.results, p_le_inq_cb->adv_data_cache);
- if(p_inq_ble_results_cb && to_report_LE)
- (p_inq_ble_results_cb)((tBTM_INQ_RESULTS *) &p_i->inq_info.results,
- p_le_inq_cb->adv_data_cache);
+ }
+ if (p_obs_results_cb && (result & BTM_BLE_OBS_RESULT))
+ {
+ (p_obs_results_cb)((tBTM_INQ_RESULTS *) &p_i->inq_info.results, p_le_inq_cb->adv_data_cache);
+ }
}
}
/*******************************************************************************
**
+** Function btm_ble_start_scan
+**
+** Description Start the BLE scan.
+**
+** Returns void
+**
+*******************************************************************************/
+tBTM_STATUS btm_ble_start_scan (UINT8 filter_enable)
+{
+ tBTM_BLE_INQ_CB *p_inq = &btm_cb.ble_ctr_cb.inq_var;
+ tBTM_STATUS status = BTM_CMD_STARTED;
+
+ /* start scan, disable duplicate filtering */
+ if (!btsnd_hcic_ble_set_scan_enable (BTM_BLE_SCAN_ENABLE, filter_enable)) {
+ status = BTM_NO_RESOURCES;
+ btm_cb.ble_ctr_cb.wl_state &= ~BTM_BLE_WL_SCAN;
+ }
+ else
+ {
+ btm_cb.ble_ctr_cb.wl_state |= BTM_BLE_WL_SCAN;
+ if (p_inq->scan_type == BTM_BLE_SCAN_MODE_ACTI)
+ btm_ble_set_topology_mask(BTM_BLE_STATE_ACTIVE_SCAN_BIT);
+ else
+ btm_ble_set_topology_mask(BTM_BLE_STATE_PASSIVE_SCAN_BIT);
+ }
+ return status;
+}
+
+/*******************************************************************************
+**
** Function btm_ble_stop_scan
**
** Description Stop the BLE scan.
@@ -1922,44 +2627,137 @@
*******************************************************************************/
void btm_ble_stop_scan(void)
{
- tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
- tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars;
-
- BTM_TRACE_EVENT0 ("btm_ble_stop_scan ");
-
- btu_stop_timer (&p_cb->inq_timer_ent);
+ BTM_TRACE_EVENT ("btm_ble_stop_scan ");
/* Clear the inquiry callback if set */
- p_cb->scan_type = BTM_BLE_SCAN_MODE_NONE;
- p_cb->proc_mode = BTM_BLE_INQUIRY_NONE;
+ btm_cb.ble_ctr_cb.inq_var.scan_type = BTM_BLE_SCAN_MODE_NONE;
/* stop discovery now */
btsnd_hcic_ble_set_scan_enable (BTM_BLE_SCAN_DISABLE, BTM_BLE_DUPLICATE_ENABLE);
- /* If we have a callback registered for inquiry complete, call it */
- BTM_TRACE_DEBUG2 ("BTM Inq Compl Callback: status 0x%02x, num results %d",
- p_inq->inq_cmpl_info.status, p_inq->inq_cmpl_info.num_resp);
-
btm_update_scanner_filter_policy(SP_ADV_ALL);
- btm_process_inq_complete(HCI_SUCCESS, (UINT8)(p_inq->inqparms.mode & BTM_BLE_INQUIRY_MASK));
-
+ btm_cb.ble_ctr_cb.wl_state &= ~BTM_BLE_WL_SCAN;
}
+/*******************************************************************************
+**
+** Function btm_ble_stop_inquiry
+**
+** Description Stop the BLE Inquiry.
+**
+** Returns void
+**
+*******************************************************************************/
+void btm_ble_stop_inquiry(void)
+{
+ tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars;
+ tBTM_BLE_CB *p_ble_cb = &btm_cb.ble_ctr_cb;
+
+ btu_stop_timer (&p_ble_cb->inq_var.inq_timer_ent);
+
+ p_ble_cb->scan_activity &= ~BTM_BLE_INQUIRY_MASK;
+
+ /* If no more scan activity, stop LE scan now */
+ if (!BTM_BLE_IS_SCAN_ACTIVE(p_ble_cb->scan_activity))
+ btm_ble_stop_scan();
+
+ /* If we have a callback registered for inquiry complete, call it */
+ BTM_TRACE_DEBUG ("BTM Inq Compl Callback: status 0x%02x, num results %d",
+ p_inq->inq_cmpl_info.status, p_inq->inq_cmpl_info.num_resp);
+
+ btm_process_inq_complete(HCI_SUCCESS, (UINT8)(p_inq->inqparms.mode & BTM_BLE_INQUIRY_MASK));
+}
+
+/*******************************************************************************
+**
+** Function btm_ble_stop_observe
+**
+** Description Stop the BLE Observe.
+**
+** Returns void
+**
+*******************************************************************************/
+static void btm_ble_stop_observe(void)
+{
+ tBTM_BLE_CB *p_ble_cb = & btm_cb.ble_ctr_cb;
+ tBTM_CMPL_CB *p_obs_cb = p_ble_cb->p_obs_cmpl_cb;
+
+ btu_stop_timer (&p_ble_cb->obs_timer_ent);
+
+ p_ble_cb->scan_activity &= ~BTM_LE_OBSERVE_ACTIVE;
+
+ p_ble_cb->p_obs_results_cb = NULL;
+ p_ble_cb->p_obs_cmpl_cb = NULL;
+
+ if (!BTM_BLE_IS_SCAN_ACTIVE(p_ble_cb->scan_activity))
+ btm_ble_stop_scan();
+
+ if (p_obs_cb)
+ (p_obs_cb)((tBTM_INQUIRY_CMPL *) &btm_cb.btm_inq_vars.inq_cmpl_info);
+}
+/*******************************************************************************
+**
+** Function btm_ble_adv_states_operation
+**
+** Description Set or clear adv states in topology mask
+**
+** Returns operation status. TRUE if sucessful, FALSE otherwise.
+**
+*******************************************************************************/
+typedef BOOLEAN (BTM_TOPOLOGY_FUNC_PTR)(tBTM_BLE_STATE_MASK);
+static BOOLEAN btm_ble_adv_states_operation(BTM_TOPOLOGY_FUNC_PTR *p_handler, UINT8 adv_evt)
+{
+ BOOLEAN rt = FALSE;
+
+ switch (adv_evt)
+ {
+ case BTM_BLE_CONNECT_EVT:
+ rt = (*p_handler)(BTM_BLE_STATE_CONN_ADV_BIT);
+ break;
+
+ case BTM_BLE_NON_CONNECT_EVT:
+ rt = (*p_handler) (BTM_BLE_STATE_NON_CONN_ADV_BIT);
+ break;
+ case BTM_BLE_CONNECT_DIR_EVT:
+ rt = (*p_handler) (BTM_BLE_STATE_HI_DUTY_DIR_ADV_BIT);
+ break;
+
+ case BTM_BLE_DISCOVER_EVT:
+ rt = (*p_handler) (BTM_BLE_STATE_SCAN_ADV_BIT);
+ break;
+
+ default:
+ BTM_TRACE_ERROR("unknown adv event : %d", adv_evt);
+ break;
+ }
+
+ return rt;
+}
+
/*******************************************************************************
**
** Function btm_ble_start_adv
**
-** Description Stop the BLE advertising.
+** Description start the BLE advertising.
**
** Returns void
**
*******************************************************************************/
-static tBTM_STATUS btm_ble_start_adv(void)
+tBTM_STATUS btm_ble_start_adv(void)
{
tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
tBTM_STATUS rt = BTM_NO_RESOURCES;
+ if (!btm_ble_adv_states_operation (btm_ble_topology_check, p_cb->evt_type))
+ return BTM_WRONG_MODE;
+
+ if (p_cb->afp != AP_SCAN_CONN_ALL)
+ {
+ btm_execute_wl_dev_operation();
+ btm_cb.ble_ctr_cb.wl_state |= BTM_BLE_WL_ADV;
+ }
+
if (btsnd_hcic_ble_set_adv_enable (BTM_BLE_ADV_ENABLE))
{
if (p_cb->afp != AP_SCAN_CONN_ALL)
@@ -1968,13 +2766,13 @@
p_cb->adv_mode = BTM_BLE_ADV_ENABLE;
rt = BTM_SUCCESS;
- }
- else
- {
- p_cb->adv_mode = BTM_BLE_ADV_DISABLE;
- btm_cb.ble_ctr_cb.wl_state &= ~BTM_BLE_WL_ADV;
- }
- return rt;
+ }
+ else
+ {
+ p_cb->adv_mode = BTM_BLE_ADV_DISABLE;
+ btm_cb.ble_ctr_cb.wl_state &= ~BTM_BLE_WL_ADV;
+ }
+ return rt;
}
/*******************************************************************************
**
@@ -1985,7 +2783,7 @@
** Returns void
**
*******************************************************************************/
-static tBTM_STATUS btm_ble_stop_adv(void)
+tBTM_STATUS btm_ble_stop_adv(void)
{
tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
tBTM_STATUS rt = BTM_SUCCESS;
@@ -1994,16 +2792,141 @@
{
if (btsnd_hcic_ble_set_adv_enable (BTM_BLE_ADV_DISABLE))
{
+ p_cb->fast_adv_on = FALSE;
p_cb->adv_mode = BTM_BLE_ADV_DISABLE;
btm_cb.ble_ctr_cb.wl_state &= ~BTM_BLE_WL_ADV;
+
+ /* clear all adv states */
+ btm_ble_clear_topology_mask (BTM_BLE_STATE_ALL_ADV_MASK);
}
else
rt = BTM_NO_RESOURCES;
}
return rt;
-
}
+
+/*******************************************************************************
+**
+** Function btm_ble_set_topology_mask
+**
+** Description set BLE topology mask
+**
+** Returns TRUE is request is allowed, FALSE otherwise.
+**
+*******************************************************************************/
+BOOLEAN btm_ble_set_topology_mask(tBTM_BLE_STATE_MASK request_state_mask)
+{
+ BOOLEAN rt = TRUE;
+
+ request_state_mask &= BTM_BLE_STATE_ALL_MASK;
+
+ btm_cb.ble_ctr_cb.cur_states |= request_state_mask;
+
+ return rt;
+}
+/*******************************************************************************
+**
+** Function btm_ble_clear_topology_mask
+**
+** Description Clear BLE topology bit mask
+**
+** Returns TRUE is request is allowed, FALSE otherwise.
+**
+*******************************************************************************/
+BOOLEAN btm_ble_clear_topology_mask (tBTM_BLE_STATE_MASK request_state_mask)
+{
+ request_state_mask &= BTM_BLE_STATE_ALL_MASK;
+
+ btm_cb.ble_ctr_cb.cur_states &= ~request_state_mask;
+
+ return TRUE;
+}
+/*******************************************************************************
+**
+** Function btm_ble_update_mode_operation
+**
+** Description This function update the GAP role operation when a link status
+** is updated.
+**
+** Returns void
+**
+*******************************************************************************/
+void btm_ble_update_mode_operation(UINT8 link_role, BD_ADDR bd_addr, UINT8 status)
+{
+ tACL_CONN *pa = &btm_cb.acl_db[0];
+ UINT16 xx;
+ UINT16 mask = BTM_BLE_STATE_ALL_CONN_MASK;
+
+ UNUSED(bd_addr);
+
+ if (link_role == HCI_ROLE_SLAVE)
+ {
+ btm_cb.ble_ctr_cb.inq_var.adv_mode = BTM_BLE_ADV_DISABLE;
+ /* clear all adv states */
+ mask |= BTM_BLE_STATE_ALL_ADV_MASK;
+ }
+
+ btm_ble_clear_topology_mask (mask);
+
+ /* check the device link role maps */
+ for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, pa++)
+ {
+ if (pa->in_use && pa->transport == BT_TRANSPORT_LE)
+ {
+ if (pa->link_role == HCI_ROLE_MASTER)
+ btm_ble_set_topology_mask (BTM_BLE_STATE_MASTER_BIT);
+ else
+ btm_ble_set_topology_mask (BTM_BLE_STATE_SLAVE_BIT);
+ }
+ }
+
+ if (btm_cb.cmn_ble_vsc_cb.adv_inst_max == 0 &&
+ btm_cb.ble_ctr_cb.inq_var.connectable_mode == BTM_BLE_CONNECTABLE)
+ {
+ btm_ble_set_connectability ( btm_cb.ble_ctr_cb.inq_var.connectable_mode );
+ }
+
+ if (btm_ble_get_conn_st() == BLE_CONN_IDLE && status != HCI_ERR_HOST_REJECT_RESOURCES)
+ {
+ if (!btm_send_pending_direct_conn())
+ {
+ btm_ble_resume_bg_conn();
+ }
+ }
+}
+
+/*******************************************************************************
+**
+** Function btm_ble_start_slow_adv
+**
+** Description Restart adv with slow adv interval
+**
+** Returns void
+**
+*******************************************************************************/
+static void btm_ble_start_slow_adv (void)
+{
+ tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
+ BD_ADDR p_addr_ptr= {0};
+
+ if (p_cb->adv_mode == BTM_BLE_ADV_ENABLE)
+ {
+ btm_ble_stop_adv();
+
+ btsnd_hcic_ble_write_adv_params (BTM_BLE_GAP_ADV_SLOW_INT,
+ BTM_BLE_GAP_ADV_SLOW_INT,
+ p_cb->evt_type,
+ p_cb->adv_addr_type,
+ btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type,/* slow adv
+ mode never goes into directed adv */
+ p_addr_ptr,
+ p_cb->adv_chnl_map,
+ p_cb->afp);
+
+ btm_ble_start_adv();
+ }
+}
/*******************************************************************************
**
** Function btm_ble_timeout
@@ -2015,27 +2938,48 @@
*******************************************************************************/
void btm_ble_timeout(TIMER_LIST_ENT *p_tle)
{
+ BTM_TRACE_EVENT ("btm_ble_timeout");
+
switch (p_tle->event)
{
+ case BTU_TTYPE_BLE_OBSERVE:
+ btm_ble_stop_observe();
+ break;
+
case BTU_TTYPE_BLE_INQUIRY:
- btm_ble_stop_scan();
+ btm_ble_stop_inquiry();
break;
case BTU_TTYPE_BLE_GAP_LIM_DISC:
/* lim_timeout expiried, limited discovery should exit now */
- btm_ble_update_adv_flag(BTM_BLE_NON_LIMIT_DISC_FLAG);
-
- btm_ble_stop_adv();
+ btm_cb.btm_inq_vars.discoverable_mode &= ~BTM_BLE_LIMITED_DISCOVERABLE;
+ btm_ble_set_adv_flag(btm_cb.btm_inq_vars.connectable_mode, btm_cb.btm_inq_vars.discoverable_mode);
break;
case BTU_TTYPE_BLE_RANDOM_ADDR:
if (btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type == BLE_ADDR_RANDOM)
{
- /* refresh the random addr */
- btm_gen_resolvable_private_addr();
+ if (NULL == (void *)(p_tle->param))
+ {
+ /* refresh the random addr */
+ btm_gen_resolvable_private_addr((void *)btm_gen_resolve_paddr_low);
+ }
+ else
+ {
+ if (BTM_BleMaxMultiAdvInstanceCount() > 0)
+ btm_ble_multi_adv_configure_rpa((tBTM_BLE_MULTI_ADV_INST*)p_tle->param);
+ }
}
break;
+ case BTU_TTYPE_BLE_GAP_FAST_ADV:
+ /* fast adv is completed, fall back to slow adv interval */
+ btm_ble_start_slow_adv();
+ break;
+
+ default:
+ break;
+
}
}
@@ -2054,24 +2998,31 @@
void btm_ble_read_remote_features_complete(UINT8 *p)
{
tACL_CONN *p_acl_cb = &btm_cb.acl_db[0];
- UINT8 status;
UINT16 handle;
+ UINT8 status;
int xx;
- BTM_TRACE_EVENT0 ("btm_ble_read_remote_features_complete ");
+ BTM_TRACE_EVENT ("btm_ble_read_remote_features_complete ");
- STREAM_TO_UINT8 (status, p);
- STREAM_TO_UINT16 (handle, p);
-
- /* Look up the connection by handle and copy features */
- for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p_acl_cb++)
+ STREAM_TO_UINT8(status, p);
+ /* if LE read remote feature failed, expect disconnect complete to be received */
+ if (status == HCI_SUCCESS)
{
- if ((p_acl_cb->in_use) && (p_acl_cb->hci_handle == handle))
+ STREAM_TO_UINT16 (handle, p);
+
+ /* Look up the connection by handle and copy features */
+ for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p_acl_cb++)
{
- STREAM_TO_ARRAY(p_acl_cb->peer_le_features, p, BD_FEATURES_LEN);
- break;
+ if ((p_acl_cb->in_use) && (p_acl_cb->hci_handle == handle))
+ {
+ STREAM_TO_ARRAY(p_acl_cb->peer_le_features, p, BD_FEATURES_LEN);
+ /*notify link up here */
+ l2cble_notify_le_connection (p_acl_cb->remote_addr);
+ break;
+ }
}
}
+
}
/*******************************************************************************
@@ -2093,8 +3044,6 @@
/* toggle back the adv mode */
p_cb->adv_mode = !p_cb->adv_mode;
}
-
-
}
/*******************************************************************************
@@ -2116,58 +3065,6 @@
/*******************************************************************************
**
-** Function btm_ble_update_mode_operation
-**
-** Description This function update the GAP role operation when a link status
-** is updated.
-**
-** Returns void
-**
-*******************************************************************************/
-void btm_ble_update_mode_operation(UINT8 link_role, BD_ADDR bd_addr, BOOLEAN conn_cancel)
-{
- tACL_CONN *pa = &btm_cb.acl_db[0];
- UINT16 xx;
- UINT8 dev_role = link_role;
- UNUSED(bd_addr);
- UNUSED(conn_cancel);
-
- BTM_TRACE_DEBUG1("btm_ble_update_mode_operation adv_mode = %d", btm_cb.ble_ctr_cb.inq_var.adv_mode );
-
- /* update periphera role operation */
- /* If we are LE connectable, check if we need to start advertising again */
- if (link_role == HCI_ROLE_UNKNOWN)
- /* && btm_cb.ble_ctr_cb.inq_var.connectable_mode != BTM_BLE_NON_CONNECTABLE) */
- {
- for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, pa++)
- {
- /* If any other LE link is up, we are still not connectable */
- if (pa->in_use && pa->is_le_link)
- {
- dev_role = pa->link_role;
- break;
- }
- }
- }
-
- if (btm_cb.ble_ctr_cb.inq_var.connectable_mode == BTM_BLE_CONNECTABLE &&
- (dev_role == HCI_ROLE_UNKNOWN )) /* when device has no connection, update adv here */
- /* if already in connection, no connectable adv is allowed unless scatternet is enabled */
- {
- btm_ble_set_connectability ( btm_cb.ble_ctr_cb.inq_var.connectable_mode );
- }
-
- if (btm_ble_get_conn_st() == BLE_CONN_IDLE)
- {
- if (!btm_send_pending_direct_conn())
- {
- btm_ble_resume_bg_conn();
- }
- }
-}
-
-/*******************************************************************************
-**
** Function btm_ble_init
**
** Description Initialize the control block variable values.
@@ -2179,9 +3076,12 @@
{
tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
- BTM_TRACE_EVENT0 ("btm_ble_init ");
+ BTM_TRACE_EVENT ("btm_ble_init ");
memset(p_cb, 0, sizeof(tBTM_BLE_CB));
+ memset(&(btm_cb.cmn_ble_vsc_cb), 0 , sizeof(tBTM_BLE_VSC_CB));
+ btm_cb.cmn_ble_vsc_cb.values_read = FALSE;
+ p_cb->cur_states = 0;
p_cb->inq_var.adv_mode = BTM_BLE_ADV_DISABLE;
p_cb->inq_var.scan_type = BTM_BLE_SCAN_MODE_NONE;
@@ -2195,6 +3095,83 @@
p_cb->scan_int = p_cb->scan_win = BTM_BLE_CONN_PARAM_UNDEF;
p_cb->inq_var.evt_type = BTM_BLE_NON_CONNECT_EVT;
+
+#if BLE_VND_INCLUDED == FALSE
+ btm_ble_vendor_init(BTM_CS_IRK_LIST_MAX);
+ btm_ble_adv_filter_init();
+#endif
}
+/*******************************************************************************
+**
+** Function btm_ble_topology_check
+**
+** Description check to see requested state is supported. One state check at
+** a time is supported
+**
+** Returns TRUE is request is allowed, FALSE otherwise.
+**
+*******************************************************************************/
+BOOLEAN btm_ble_topology_check(tBTM_BLE_STATE_MASK request_state_mask)
+{
+ BOOLEAN rt = FALSE;
+ UINT32 llt_mask = 0;
+ UINT8 *p;
+
+ UINT8 state_offset = 0;
+ UINT16 cur_states = btm_cb.ble_ctr_cb.cur_states;
+ UINT8 mask, offset;
+ UINT8 request_state = 0;
+
+ /* check only one bit is set and within valid range */
+ if (request_state_mask == BTM_BLE_STATE_INVALID ||
+ request_state_mask > BTM_BLE_STATE_SCAN_ADV_BIT ||
+ (request_state_mask & (request_state_mask -1 )) != 0)
+ {
+ BTM_TRACE_ERROR("illegal state requested: %d", request_state_mask);
+ return rt;
+ }
+
+ while (request_state_mask)
+ {
+ request_state_mask >>= 1;
+ request_state ++;
+ }
+
+ /* check if the requested state is supported or not */
+ mask = btm_le_state_combo_tbl[0][request_state - 1][0];
+ offset = btm_le_state_combo_tbl[0][request_state-1][1];
+
+ if (!BTM_LE_STATES_SUPPORTED(btm_cb.devcb.le_supported_states, mask, offset))
+ {
+ BTM_TRACE_ERROR("state requested not supported: %d", request_state);
+ return rt;
+ }
+
+ rt = TRUE;
+ /* make sure currently active states are all supported in conjunction with the requested
+ state. If the bit in table is not set, the combination is not supported */
+ while (cur_states != 0)
+ {
+ if (cur_states & 0x01)
+ {
+ mask = btm_le_state_combo_tbl[request_state][state_offset][0];
+ offset = btm_le_state_combo_tbl[request_state][state_offset][1];
+
+ if (mask != 0 && offset != 0)
+ {
+ if (!BTM_LE_STATES_SUPPORTED(btm_cb.devcb.le_supported_states, mask, offset))
+ {
+ rt = FALSE;
+ break;
+ }
+ }
+ }
+ cur_states >>= 1;
+ state_offset ++;
+ }
+ return rt;
+}
+
+
#endif /* BLE_INCLUDED */
diff --git a/stack/btm/btm_ble_int.h b/stack/btm/btm_ble_int.h
index 7ce4f16..2512d33 100644
--- a/stack/btm/btm_ble_int.h
+++ b/stack/btm/btm_ble_int.h
@@ -61,9 +61,17 @@
#define BTM_BLE_GAP_DISC_SCAN_INT 18 /* Interval(scan_int) = 11.25 ms= 0x0010 * 0.625 ms */
#define BTM_BLE_GAP_DISC_SCAN_WIN 18 /* scan_window = 11.25 ms= 0x0010 * 0.625 ms */
#define BTM_BLE_GAP_ADV_INT 512 /* Tgap(gen_disc) = 1.28 s= 512 * 0.625 ms */
-#define BTM_BLE_GAP_LIM_TOUT 30 /* Tgap(lim_timeout) = 30.72 s max, round down to 30 */
+#define BTM_BLE_GAP_LIM_TOUT 180 /* Tgap(lim_timeout) = 180s max */
+#define BTM_BLE_GAP_ADV_FAST_INT_1 48 /* TGAP(adv_fast_interval1) = 30(used) ~ 60 ms = 48 *0.625 */
+#define BTM_BLE_GAP_ADV_FAST_INT_2 160 /* TGAP(adv_fast_interval2) = 100(used) ~ 150 ms = 160 * 0.625 ms */
+#define BTM_BLE_GAP_ADV_SLOW_INT 2048 /* Tgap(adv_slow_interval) = 1.28 s= 512 * 0.625 ms */
+#define BTM_BLE_GAP_ADV_DIR_MAX_INT 800 /* Tgap(dir_conn_adv_int_max) = 500 ms = 800 * 0.625 ms */
+#define BTM_BLE_GAP_ADV_DIR_MIN_INT 400 /* Tgap(dir_conn_adv_int_min) = 250 ms = 400 * 0.625 ms */
+
+#define BTM_BLE_GAP_FAST_ADV_TOUT 30
+
#define BTM_BLE_SEC_REQ_ACT_NONE 0
#define BTM_BLE_SEC_REQ_ACT_ENCRYPT 1 /* encrypt the link using current key or key refresh */
#define BTM_BLE_SEC_REQ_ACT_PAIR 2
@@ -75,6 +83,16 @@
#define BLE_RESOLVE_ADDR_MASK 0xc0 /* bit 6, and bit7 */
#define BTM_BLE_IS_RESOLVE_BDA(x) ((x[0] & BLE_RESOLVE_ADDR_MASK) == BLE_RESOLVE_ADDR_MSB)
+/* LE scan activity bit mask, continue with LE inquiry bits */
+#define BTM_LE_SELECT_CONN_ACTIVE 0x40 /* selection connection is in progress */
+#define BTM_LE_OBSERVE_ACTIVE 0x80 /* observe is in progress */
+
+/* BLE scan activity mask checking */
+#define BTM_BLE_IS_SCAN_ACTIVE(x) ((x) & BTM_BLE_SCAN_ACTIVE_MASK)
+#define BTM_BLE_IS_INQ_ACTIVE(x) ((x) & BTM_BLE_INQUIRY_MASK)
+#define BTM_BLE_IS_OBS_ACTIVE(x) ((x) & BTM_LE_OBSERVE_ACTIVE)
+#define BTM_BLE_IS_SEL_CONN_ACTIVE(x) ((x) & BTM_LE_SELECT_CONN_ACTIVE)
+
typedef struct
{
UINT16 data_mask;
@@ -98,16 +116,14 @@
#define BTM_BLE_VALID_PRAM(x, min, max) (((x) >= (min) && (x) <= (max)) || ((x) == BTM_BLE_CONN_PARAM_UNDEF))
+#define BTM_BLE_PRIVATE_ADDR_INT 900 /* 15 minutes minimum for
+ random address refreshing */
+
typedef struct
{
UINT16 discoverable_mode;
UINT16 connectable_mode;
- UINT16 br_edr_supported_flag; /* combined BR EDR discoverable and connectable mode */
- /* only meaningful when it is zero. This means
- BR EDR is not supported*/
- UINT8 proc_mode; /* current procedure mode : inquiry or discovery */
-
UINT16 scan_window;
UINT16 scan_interval;
UINT8 scan_type; /* current scan type: active or passive */
@@ -121,6 +137,8 @@
UINT8 adv_mode;
tBLE_BD_ADDR direct_bda;
BOOLEAN directed_conn;
+ BOOLEAN fast_adv_on;
+ TIMER_LIST_ENT fast_adv_timer;
UINT8 adv_len;
UINT8 adv_data_cache[BTM_BLE_CACHE_ADV_DATA_MAX];
@@ -148,8 +166,8 @@
/* random address management control block */
typedef struct
{
- tBLE_ADDR_TYPE own_addr_type; /* local device LE address type */
- BD_ADDR private_addr;
+ tBLE_ADDR_TYPE own_addr_type; /* local device LE address type */
+ BD_ADDR private_addr;
BD_ADDR random_bda;
BOOLEAN busy;
UINT16 index;
@@ -198,6 +216,37 @@
void *p_param;
}tBTM_BLE_CONN_REQ;
+/* LE state request */
+#define BTM_BLE_STATE_INVALID 0
+#define BTM_BLE_STATE_CONN_ADV 1
+#define BTM_BLE_STATE_INIT 2
+#define BTM_BLE_STATE_MASTER 3
+#define BTM_BLE_STATE_SLAVE 4
+#define BTM_BLE_STATE_LO_DUTY_DIR_ADV 5
+#define BTM_BLE_STATE_HI_DUTY_DIR_ADV 6
+#define BTM_BLE_STATE_NON_CONN_ADV 7
+#define BTM_BLE_STATE_PASSIVE_SCAN 8
+#define BTM_BLE_STATE_ACTIVE_SCAN 9
+#define BTM_BLE_STATE_SCAN_ADV 10
+#define BTM_BLE_STATE_MAX 11
+typedef UINT8 tBTM_BLE_STATE;
+
+#define BTM_BLE_STATE_CONN_ADV_BIT 0x0001
+#define BTM_BLE_STATE_INIT_BIT 0x0002
+#define BTM_BLE_STATE_MASTER_BIT 0x0004
+#define BTM_BLE_STATE_SLAVE_BIT 0x0008
+#define BTM_BLE_STATE_LO_DUTY_DIR_ADV_BIT 0x0010
+#define BTM_BLE_STATE_HI_DUTY_DIR_ADV_BIT 0x0020
+#define BTM_BLE_STATE_NON_CONN_ADV_BIT 0x0040
+#define BTM_BLE_STATE_PASSIVE_SCAN_BIT 0x0080
+#define BTM_BLE_STATE_ACTIVE_SCAN_BIT 0x0100
+#define BTM_BLE_STATE_SCAN_ADV_BIT 0x0200
+typedef UINT16 tBTM_BLE_STATE_MASK;
+
+#define BTM_BLE_STATE_ALL_MASK 0x03ff
+#define BTM_BLE_STATE_ALL_ADV_MASK (BTM_BLE_STATE_CONN_ADV_BIT|BTM_BLE_STATE_LO_DUTY_DIR_ADV_BIT|BTM_BLE_STATE_HI_DUTY_DIR_ADV_BIT|BTM_BLE_STATE_SCAN_ADV_BIT)
+#define BTM_BLE_STATE_ALL_SCAN_MASK (BTM_BLE_STATE_PASSIVE_SCAN_BIT|BTM_BLE_STATE_ACTIVE_SCAN_BIT)
+#define BTM_BLE_STATE_ALL_CONN_MASK (BTM_BLE_STATE_MASTER_BIT|BTM_BLE_STATE_SLAVE_BIT)
typedef struct
{
@@ -210,11 +259,18 @@
*/
typedef struct
{
+ UINT8 scan_activity; /* LE scan activity mask */
+
/*****************************************************
** BLE Inquiry
*****************************************************/
tBTM_BLE_INQ_CB inq_var;
+ /* observer callback and timer */
+ tBTM_INQ_RESULTS_CB *p_obs_results_cb;
+ tBTM_CMPL_CB *p_obs_cmpl_cb;
+ TIMER_LIST_ENT obs_timer_ent;
+
/* background connection procedure cb value */
tBTM_BLE_CONN_TYPE bg_conn_type;
UINT16 scan_int;
@@ -236,12 +292,16 @@
tBTM_LE_RANDOM_CB addr_mgnt_cb;
BOOLEAN enabled;
+ BOOLEAN privacy; /* local privacy enabled or disabled */
tBTM_BLE_WL_OP wl_op_q[BTM_BLE_MAX_BG_CONN_DEV_NUM];
#ifdef BTM_BLE_PC_ADV_TEST_MODE
tBTM_BLE_SCAN_REQ_CBACK *p_scan_req_cback;
#endif
+ /* current BLE link state */
+ tBTM_BLE_STATE_MASK cur_states; /* bit mask of tBTM_BLE_STATE */
+
} tBTM_BLE_CB;
#ifdef __cplusplus
@@ -259,16 +319,22 @@
extern tBTM_STATUS btm_ble_start_inquiry (UINT8 mode, UINT8 duration);
extern void btm_ble_dir_adv_tout(void);
-extern void btm_ble_stop_scan(void);
-extern void btm_ble_att_db_init(void);
+extern void btm_ble_stop_scan();
+extern void btm_ble_stop_inquiry(void);
extern void btm_ble_init (void);
extern void btm_ble_connected (UINT8 *bda, UINT16 handle, UINT8 enc_mode, UINT8 role, tBLE_ADDR_TYPE addr_type, BOOLEAN addr_matched);
extern void btm_ble_read_remote_features_complete(UINT8 *p);
extern void btm_ble_write_adv_enable_complete(UINT8 * p);
extern void btm_ble_conn_complete(UINT8 *p, UINT16 evt_len);
+extern void btm_read_ble_local_supported_states_complete(UINT8 *p, UINT16 evt_len);
extern tBTM_BLE_CONN_ST btm_ble_get_conn_st(void);
extern void btm_ble_set_conn_st(tBTM_BLE_CONN_ST new_st);
-
+extern UINT8 *btm_ble_build_adv_data(tBTM_BLE_AD_MASK *p_data_mask, UINT8 **p_dst,
+ tBTM_BLE_ADV_DATA *p_data);
+extern tBTM_STATUS btm_ble_start_adv(void);
+extern tBTM_STATUS btm_ble_stop_adv(void);
+extern tBTM_STATUS btm_ble_start_scan (UINT8 filter_enb);
+extern void btm_ble_create_ll_conn_complete (UINT8 status);
/* LE security function from btm_sec.c */
#if SMP_INCLUDED == TRUE
@@ -277,7 +343,7 @@
extern UINT8 btm_proc_smp_cback(tSMP_EVT event, BD_ADDR bd_addr, tSMP_EVT_DATA *p_data);
extern tBTM_STATUS btm_ble_set_encryption (BD_ADDR bd_addr, void *p_ref_data, UINT8 link_role);
extern void btm_ble_ltk_request(UINT16 handle, UINT8 rand[8], UINT16 ediv);
-extern BOOLEAN btm_ble_start_encrypt(BD_ADDR bda, BOOLEAN use_stk, BT_OCTET16 stk);
+extern tBTM_STATUS btm_ble_start_encrypt(BD_ADDR bda, BOOLEAN use_stk, BT_OCTET16 stk);
extern void btm_ble_link_encrypted(BD_ADDR bd_addr, UINT8 encr_enable);
#endif
@@ -291,15 +357,16 @@
extern void btm_ble_test_command_complete(UINT8 *p);
extern void btm_ble_rand_enc_complete (UINT8 *p, UINT16 op_code, tBTM_RAND_ENC_CB *p_enc_cplt_cback);
+
extern void btm_sec_save_le_key(BD_ADDR bd_addr, tBTM_LE_KEY_TYPE key_type, tBTM_LE_KEY_VALUE *p_keys, BOOLEAN pass_to_application);
extern void btm_ble_update_sec_key_size(BD_ADDR bd_addr, UINT8 enc_key_size);
extern UINT8 btm_ble_read_sec_key_size(BD_ADDR bd_addr);
/* white list function */
-extern BOOLEAN btm_update_dev_to_white_list(BOOLEAN to_add, BD_ADDR bd_addr,UINT8 wl_type);
-extern BOOLEAN btm_update_bg_conn_list(BOOLEAN to_add, BD_ADDR bd_addr, UINT8 *p_attr_tag);
+extern BOOLEAN btm_update_dev_to_white_list(BOOLEAN to_add, BD_ADDR bd_addr);
+extern BOOLEAN btm_update_bg_conn_list(BOOLEAN to_add, BD_ADDR bd_addr);
extern void btm_update_scanner_filter_policy(tBTM_BLE_SFP scan_policy);
-extern void btm_update_adv_filter_policy(tBTM_BLE_AFP adv_policy);
+extern void btm_update_scan_filter_policy(tBTM_BLE_AFP adv_policy);
extern void btm_ble_clear_white_list (void);
/* background connection function */
@@ -311,23 +378,46 @@
extern BOOLEAN btm_ble_renew_bg_conn_params(BOOLEAN add, BD_ADDR bd_addr);
extern UINT8 btm_ble_count_unconn_dev_in_whitelist(void);
extern void btm_write_dir_conn_wl(BD_ADDR target_addr);
-extern void btm_ble_update_mode_operation(UINT8 link_role, BD_ADDR bda, BOOLEAN conn_ccancel);
+extern void btm_ble_update_mode_operation(UINT8 link_role, BD_ADDR bda, UINT8 status);
+extern BOOLEAN btm_execute_wl_dev_operation(void);
/* direct connection utility */
extern BOOLEAN btm_send_pending_direct_conn(void);
extern void btm_ble_enqueue_direct_conn_req(void *p_param);
/* BLE address management */
-extern void btm_gen_resolvable_private_addr (void);
+extern void btm_gen_resolvable_private_addr (void *p_cmd_cplt_cback);
extern void btm_gen_non_resolvable_private_addr (tBTM_BLE_ADDR_CBACK *p_cback, void *p);
extern void btm_ble_resolve_random_addr(BD_ADDR random_bda, tBTM_BLE_RESOLVE_CBACK * p_cback, void *p);
extern void btm_ble_update_reconnect_address(BD_ADDR bd_addr);
+extern void btm_gen_resolve_paddr_low(tBTM_RAND_ENC *p);
+
+extern void btm_ble_multi_adv_configure_rpa (tBTM_BLE_MULTI_ADV_INST *p_inst);
+extern void btm_ble_multi_adv_init(void);
+extern void* btm_ble_multi_adv_get_ref(UINT8 inst_id);
+extern void btm_ble_multi_adv_cleanup(void);
+extern void btm_ble_multi_adv_reenable(UINT8 inst_id);
+extern void btm_ble_multi_adv_enb_privacy(BOOLEAN enable);
+extern char btm_ble_map_adv_tx_power(int tx_power_index);
+extern void btm_ble_batchscan_init(void);
+extern void btm_ble_batchscan_cleanup(void);
+extern void btm_ble_adv_filter_init(void);
+extern void btm_ble_adv_filter_cleanup(void);
+extern BOOLEAN btm_ble_topology_check(tBTM_BLE_STATE_MASK request);
+extern BOOLEAN btm_ble_clear_topology_mask(tBTM_BLE_STATE_MASK request_state);
+extern BOOLEAN btm_ble_set_topology_mask(tBTM_BLE_STATE_MASK request_state);
+
+/* BLE address mapping with CS feature */
+extern BOOLEAN btm_public_addr_to_random_pseudo(BD_ADDR bd_addr, UINT8 *p_addr_type);
+extern BOOLEAN btm_random_pseudo_to_public(BD_ADDR random_pseudo, UINT8 *p_static_addr_type);
+extern void btm_ble_refresh_rra(BD_ADDR pseudo_bda, BD_ADDR rra);
#if BTM_BLE_CONFORMANCE_TESTING == TRUE
BT_API extern void btm_ble_set_no_disc_if_pair_fail (BOOLEAN disble_disc);
BT_API extern void btm_ble_set_test_mac_value (BOOLEAN enable, UINT8 *p_test_mac_val);
BT_API extern void btm_ble_set_test_local_sign_cntr_value(BOOLEAN enable, UINT32 test_local_sign_cntr);
BT_API extern void btm_set_random_address(BD_ADDR random_bda);
+BT_API extern void btm_ble_set_keep_rfu_in_auth_req(BOOLEAN keep_rfu);
#endif
diff --git a/stack/btm/btm_ble_multi_adv.c b/stack/btm/btm_ble_multi_adv.c
new file mode 100644
index 0000000..6876726
--- /dev/null
+++ b/stack/btm/btm_ble_multi_adv.c
@@ -0,0 +1,868 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 Broadcom Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+#include <string.h>
+#include "bt_target.h"
+
+#if (BLE_INCLUDED == TRUE)
+#include "bt_types.h"
+#include "hcimsgs.h"
+#include "btu.h"
+#include "btm_int.h"
+#include "bt_utils.h"
+#include "hcidefs.h"
+#include "btm_ble_api.h"
+
+/* length of each multi adv sub command */
+#define BTM_BLE_MULTI_ADV_ENB_LEN 3
+#define BTM_BLE_MULTI_ADV_SET_PARAM_LEN 24
+#define BTM_BLE_MULTI_ADV_WRITE_DATA_LEN (BTM_BLE_AD_DATA_LEN + 3)
+#define BTM_BLE_MULTI_ADV_SET_RANDOM_ADDR_LEN 8
+
+tBTM_BLE_MULTI_ADV_CB btm_multi_adv_cb;
+tBTM_BLE_MULTI_ADV_INST_IDX_Q btm_multi_adv_idx_q;
+
+#define BTM_BLE_MULTI_ADV_CB_EVT_MASK 0xF0
+#define BTM_BLE_MULTI_ADV_SUBCODE_MASK 0x0F
+
+/*******************************************************************************
+**
+** Function btm_ble_multi_adv_enq_op_q
+**
+** Description enqueue a multi adv operation in q to check command complete
+** status.
+**
+** Returns void
+**
+*******************************************************************************/
+void btm_ble_multi_adv_enq_op_q(UINT8 opcode, UINT8 inst_id, UINT8 cb_evt)
+{
+ tBTM_BLE_MULTI_ADV_OPQ *p_op_q = &btm_multi_adv_cb.op_q;
+
+ p_op_q->p_inst_id[p_op_q->next_idx] = inst_id;
+
+ p_op_q->p_sub_code[p_op_q->next_idx] = (opcode |(cb_evt << 4));
+
+ p_op_q->next_idx = (p_op_q->next_idx + 1) % BTM_BleMaxMultiAdvInstanceCount();
+}
+
+/*******************************************************************************
+**
+** Function btm_ble_multi_adv_deq_op_q
+**
+** Description dequeue a multi adv operation from q when command complete
+** is received.
+**
+** Returns void
+**
+*******************************************************************************/
+void btm_ble_multi_adv_deq_op_q(UINT8 *p_opcode, UINT8 *p_inst_id, UINT8 *p_cb_evt)
+{
+ tBTM_BLE_MULTI_ADV_OPQ *p_op_q = &btm_multi_adv_cb.op_q;
+
+ *p_inst_id = p_op_q->p_inst_id[p_op_q->pending_idx] & 0x7F;
+ *p_cb_evt = (p_op_q->p_sub_code[p_op_q->pending_idx] >> 4);
+ *p_opcode = (p_op_q->p_sub_code[p_op_q->pending_idx] & BTM_BLE_MULTI_ADV_SUBCODE_MASK);
+
+ p_op_q->pending_idx = (p_op_q->pending_idx + 1) % BTM_BleMaxMultiAdvInstanceCount();
+}
+
+/*******************************************************************************
+**
+** Function btm_ble_multi_adv_vsc_cmpl_cback
+**
+** Description Multi adv VSC complete callback
+**
+** Parameters
+**
+** Returns void
+**
+*******************************************************************************/
+void btm_ble_multi_adv_vsc_cmpl_cback (tBTM_VSC_CMPL *p_params)
+{
+ UINT8 status, subcode;
+ UINT8 *p = p_params->p_param_buf, inst_id;
+ UINT16 len = p_params->param_len;
+ tBTM_BLE_MULTI_ADV_INST *p_inst ;
+ UINT8 cb_evt = 0, opcode;
+
+ if (len < 2)
+ {
+ BTM_TRACE_ERROR("wrong length for btm_ble_multi_adv_vsc_cmpl_cback");
+ return;
+ }
+
+ STREAM_TO_UINT8(status, p);
+ STREAM_TO_UINT8(subcode, p);
+
+ btm_ble_multi_adv_deq_op_q(&opcode, &inst_id, &cb_evt);
+
+ BTM_TRACE_DEBUG("op_code = %02x inst_id = %d cb_evt = %02x", opcode, inst_id, cb_evt);
+
+ if (opcode != subcode || inst_id == 0)
+ {
+ BTM_TRACE_ERROR("get unexpected VSC cmpl, expect: %d get: %d",subcode,opcode);
+ return;
+ }
+
+ p_inst = &btm_multi_adv_cb.p_adv_inst[inst_id - 1];
+
+ switch (subcode)
+ {
+ case BTM_BLE_MULTI_ADV_ENB:
+ BTM_TRACE_DEBUG("BTM_BLE_MULTI_ADV_ENB status = %d", status);
+ if (status != HCI_SUCCESS)
+ {
+ btm_multi_adv_cb.p_adv_inst[inst_id-1].inst_id = 0;
+ }
+ break;
+
+ case BTM_BLE_MULTI_ADV_SET_PARAM:
+ {
+ BTM_TRACE_DEBUG("BTM_BLE_MULTI_ADV_SET_PARAM status = %d", status);
+ break;
+ }
+
+ case BTM_BLE_MULTI_ADV_WRITE_ADV_DATA:
+ {
+ BTM_TRACE_DEBUG("BTM_BLE_MULTI_ADV_WRITE_ADV_DATA status = %d", status);
+ break;
+ }
+
+ case BTM_BLE_MULTI_ADV_WRITE_SCAN_RSP_DATA:
+ {
+ BTM_TRACE_DEBUG("BTM_BLE_MULTI_ADV_WRITE_SCAN_RSP_DATA status = %d", status);
+ break;
+ }
+
+ case BTM_BLE_MULTI_ADV_SET_RANDOM_ADDR:
+ {
+ BTM_TRACE_DEBUG("BTM_BLE_MULTI_ADV_SET_RANDOM_ADDR status = %d", status);
+ break;
+ }
+
+ default:
+ break;
+ }
+
+ if (cb_evt != 0 && p_inst->p_cback != NULL)
+ {
+ (p_inst->p_cback)(cb_evt, inst_id, p_inst->p_ref, status);
+ }
+ return;
+}
+
+/*******************************************************************************
+**
+** Function btm_ble_enable_multi_adv
+**
+** Description This function enable the customer specific feature in controller
+**
+** Parameters enable: enable or disable
+** inst_id: adv instance ID, can not be 0
+**
+** Returns status
+**
+*******************************************************************************/
+tBTM_STATUS btm_ble_enable_multi_adv (BOOLEAN enable, UINT8 inst_id, UINT8 cb_evt)
+{
+ UINT8 param[BTM_BLE_MULTI_ADV_ENB_LEN], *pp;
+ UINT8 enb = enable ? 1: 0;
+ tBTM_STATUS rt;
+
+ pp = param;
+ memset(param, 0, BTM_BLE_MULTI_ADV_ENB_LEN);
+
+ UINT8_TO_STREAM (pp, BTM_BLE_MULTI_ADV_ENB);
+ UINT8_TO_STREAM (pp, enb);
+ UINT8_TO_STREAM (pp, inst_id);
+
+ BTM_TRACE_EVENT (" btm_ble_enable_multi_adv: enb %d, Inst ID %d",enb,inst_id);
+
+ if ((rt = BTM_VendorSpecificCommand (HCI_BLE_MULTI_ADV_OCF,
+ BTM_BLE_MULTI_ADV_ENB_LEN,
+ param,
+ btm_ble_multi_adv_vsc_cmpl_cback))
+ == BTM_CMD_STARTED)
+ {
+ btm_ble_multi_adv_enq_op_q(BTM_BLE_MULTI_ADV_ENB, inst_id, cb_evt);
+ }
+ return rt;
+}
+/*******************************************************************************
+**
+** Function btm_ble_map_adv_tx_power
+**
+** Description return the actual power in dBm based on the mapping in config file
+**
+** Parameters advertise parameters used for this instance.
+**
+** Returns tx power in dBm
+**
+*******************************************************************************/
+int btm_ble_tx_power[BTM_BLE_ADV_TX_POWER_MAX + 1] = BTM_BLE_ADV_TX_POWER;
+char btm_ble_map_adv_tx_power(int tx_power_index)
+{
+ if(0 <= tx_power_index && tx_power_index < BTM_BLE_ADV_TX_POWER_MAX)
+ return (char)btm_ble_tx_power[tx_power_index];
+ return 0;
+}
+/*******************************************************************************
+**
+** Function btm_ble_multi_adv_set_params
+**
+** Description This function enable the customer specific feature in controller
+**
+** Parameters advertise parameters used for this instance.
+**
+** Returns status
+**
+*******************************************************************************/
+tBTM_STATUS btm_ble_multi_adv_set_params (tBTM_BLE_MULTI_ADV_INST *p_inst,
+ tBTM_BLE_ADV_PARAMS *p_params,
+ UINT8 cb_evt)
+{
+ UINT8 param[BTM_BLE_MULTI_ADV_SET_PARAM_LEN], *pp;
+ tBTM_STATUS rt;
+ BD_ADDR dummy ={0,0,0,0,0,0};
+
+ pp = param;
+ memset(param, 0, BTM_BLE_MULTI_ADV_SET_PARAM_LEN);
+
+ UINT8_TO_STREAM(pp, BTM_BLE_MULTI_ADV_SET_PARAM);
+
+ UINT16_TO_STREAM (pp, p_params->adv_int_min);
+ UINT16_TO_STREAM (pp, p_params->adv_int_max);
+ UINT8_TO_STREAM (pp, p_params->adv_type);
+
+#if BLE_PRIVACY_SPT
+ if (btm_cb.ble_ctr_cb.privacy)
+ {
+ UINT8_TO_STREAM (pp, BLE_ADDR_RANDOM);
+ BDADDR_TO_STREAM (pp, p_inst->rpa);
+ }
+ else
+#endif
+ {
+ UINT8_TO_STREAM (pp, BLE_ADDR_PUBLIC);
+ BDADDR_TO_STREAM (pp, btm_cb.devcb.local_addr);
+ }
+
+ BTM_TRACE_EVENT (" btm_ble_multi_adv_set_params,Min %d, Max %d,adv_type %d",
+ p_params->adv_int_min,p_params->adv_int_max,p_params->adv_type);
+
+ UINT8_TO_STREAM (pp, 0);
+ BDADDR_TO_STREAM (pp, dummy);
+
+ if (p_params->channel_map == 0 || p_params->channel_map > BTM_BLE_DEFAULT_ADV_CHNL_MAP)
+ p_params->channel_map = BTM_BLE_DEFAULT_ADV_CHNL_MAP;
+ UINT8_TO_STREAM (pp, p_params->channel_map);
+
+ if (p_params->adv_filter_policy >= AP_SCAN_CONN_POLICY_MAX)
+ p_params->adv_filter_policy = AP_SCAN_CONN_ALL;
+ UINT8_TO_STREAM (pp, p_params->adv_filter_policy);
+
+ UINT8_TO_STREAM (pp, p_inst->inst_id);
+
+ if (p_params->tx_power > BTM_BLE_ADV_TX_POWER_MAX)
+ p_params->tx_power = BTM_BLE_ADV_TX_POWER_MAX;
+ UINT8_TO_STREAM (pp, btm_ble_map_adv_tx_power(p_params->tx_power));
+
+ BTM_TRACE_EVENT("set_params:Chnl Map %d,adv_fltr policy %d,ID:%d, TX Power%d",
+ p_params->channel_map,p_params->adv_filter_policy,p_inst->inst_id,p_params->tx_power);
+
+ if ((rt = BTM_VendorSpecificCommand (HCI_BLE_MULTI_ADV_OCF,
+ BTM_BLE_MULTI_ADV_SET_PARAM_LEN,
+ param,
+ btm_ble_multi_adv_vsc_cmpl_cback))
+ == BTM_CMD_STARTED)
+ {
+ p_inst->adv_evt = p_params->adv_type;
+
+#if BLE_PRIVACY_SPT
+ if (btm_cb.ble_ctr_cb.privacy)
+ {
+ /* start timer */
+ p_inst->raddr_timer_ent.param = (TIMER_PARAM_TYPE) p_inst;
+ btu_start_timer_oneshot(&p_inst->raddr_timer_ent, BTU_TTYPE_BLE_RANDOM_ADDR,
+ BTM_BLE_PRIVATE_ADDR_INT);
+ }
+#endif
+ btm_ble_multi_adv_enq_op_q(BTM_BLE_MULTI_ADV_SET_PARAM, p_inst->inst_id, cb_evt);
+ }
+ return rt;
+}
+
+/*******************************************************************************
+**
+** Function btm_ble_multi_adv_write_rpa
+**
+** Description This function write the random address for the adv instance into
+** controller
+**
+** Parameters
+**
+** Returns status
+**
+*******************************************************************************/
+tBTM_STATUS btm_ble_multi_adv_write_rpa (tBTM_BLE_MULTI_ADV_INST *p_inst, BD_ADDR random_addr)
+{
+ UINT8 param[BTM_BLE_MULTI_ADV_SET_RANDOM_ADDR_LEN], *pp = param;
+ tBTM_STATUS rt;
+
+ BTM_TRACE_EVENT (" btm_ble_multi_adv_set_random_addr");
+
+ memset(param, 0, BTM_BLE_MULTI_ADV_SET_RANDOM_ADDR_LEN);
+
+ UINT8_TO_STREAM (pp, BTM_BLE_MULTI_ADV_SET_RANDOM_ADDR);
+ BDADDR_TO_STREAM(pp, random_addr);
+ UINT8_TO_STREAM(pp, p_inst->inst_id);
+
+ if ((rt = BTM_VendorSpecificCommand (HCI_BLE_MULTI_ADV_OCF,
+ BTM_BLE_MULTI_ADV_SET_RANDOM_ADDR_LEN,
+ param,
+ btm_ble_multi_adv_vsc_cmpl_cback)) == BTM_CMD_STARTED)
+ {
+ /* start a periodical timer to refresh random addr */
+ btu_stop_timer(&p_inst->raddr_timer_ent);
+ p_inst->raddr_timer_ent.param = (TIMER_PARAM_TYPE) p_inst;
+ btu_start_timer_oneshot(&p_inst->raddr_timer_ent, BTU_TTYPE_BLE_RANDOM_ADDR,
+ BTM_BLE_PRIVATE_ADDR_INT);
+
+ btm_ble_multi_adv_enq_op_q(BTM_BLE_MULTI_ADV_SET_RANDOM_ADDR, p_inst->inst_id, 0);
+ }
+ return rt;
+}
+
+/*******************************************************************************
+**
+** Function btm_ble_multi_adv_gen_rpa_cmpl
+**
+** Description RPA generation completion callback for each adv instance. Will
+** continue write the new RPA into controller.
+**
+** Returns none.
+**
+*******************************************************************************/
+void btm_ble_multi_adv_gen_rpa_cmpl(tBTM_RAND_ENC *p)
+{
+#if (SMP_INCLUDED == TRUE)
+ tBTM_LE_RANDOM_CB *p_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
+ tSMP_ENC output;
+ UINT8 index = 0;
+ tBTM_BLE_MULTI_ADV_INST *p_inst = NULL;
+
+ /* Retrieve the index of adv instance from stored Q */
+ if (btm_multi_adv_idx_q.front == -1)
+ {
+ BTM_TRACE_ERROR(" %s can't locate advertise instance", __FUNCTION__);
+ return;
+ }
+ else
+ {
+ index = btm_multi_adv_idx_q.inst_index_queue[btm_multi_adv_idx_q.front];
+ if (btm_multi_adv_idx_q.front == btm_multi_adv_idx_q.rear)
+ {
+ btm_multi_adv_idx_q.front = -1;
+ btm_multi_adv_idx_q.rear = -1;
+ }
+ else
+ {
+ btm_multi_adv_idx_q.front = (btm_multi_adv_idx_q.front + 1) % BTM_BLE_MULTI_ADV_MAX;
+ }
+ }
+
+ p_inst = &(btm_multi_adv_cb.p_adv_inst[index]);
+
+ BTM_TRACE_EVENT ("btm_ble_multi_adv_gen_rpa_cmpl inst_id = %d", p_inst->inst_id);
+ if (p)
+ {
+ p->param_buf[2] &= (~BLE_RESOLVE_ADDR_MASK);
+ p->param_buf[2] |= BLE_RESOLVE_ADDR_MSB;
+
+ p_inst->rpa[2] = p->param_buf[0];
+ p_inst->rpa[1] = p->param_buf[1];
+ p_inst->rpa[0] = p->param_buf[2];
+
+ if (!SMP_Encrypt(btm_cb.devcb.id_keys.irk, BT_OCTET16_LEN, p->param_buf, 3, &output))
+ {
+ BTM_TRACE_DEBUG("generate random address failed");
+ }
+ else
+ {
+ /* set hash to be LSB of rpAddress */
+ p_inst->rpa[5] = output.param_buf[0];
+ p_inst->rpa[4] = output.param_buf[1];
+ p_inst->rpa[3] = output.param_buf[2];
+
+ if (p_inst->inst_id != 0 && (p_inst->inst_id < BTM_BleMaxMultiAdvInstanceCount()))
+ {
+ /* set it to controller */
+ btm_ble_multi_adv_write_rpa(p_inst, p_inst->rpa);
+ }
+ }
+ }
+#endif
+}
+
+/*******************************************************************************
+**
+** Function btm_ble_multi_adv_configure_rpa
+**
+** Description This function set the random address for the adv instance
+**
+** Parameters advertise parameters used for this instance.
+**
+** Returns none
+**
+*******************************************************************************/
+void btm_ble_multi_adv_configure_rpa (tBTM_BLE_MULTI_ADV_INST *p_inst)
+{
+ if (btm_multi_adv_idx_q.front == (btm_multi_adv_idx_q.rear + 1) % BTM_BLE_MULTI_ADV_MAX)
+ {
+ BTM_TRACE_ERROR("outstanding rand generation exceeded max allowed ");
+ return;
+ }
+ else
+ {
+ if (btm_multi_adv_idx_q.front == -1)
+ {
+ btm_multi_adv_idx_q.front = 0;
+ btm_multi_adv_idx_q.rear = 0;
+ }
+ else
+ {
+ btm_multi_adv_idx_q.rear = (btm_multi_adv_idx_q.rear + 1) % BTM_BLE_MULTI_ADV_MAX;
+ }
+ btm_multi_adv_idx_q.inst_index_queue[btm_multi_adv_idx_q.rear] = p_inst->index;
+ }
+ btm_gen_resolvable_private_addr((void *)btm_ble_multi_adv_gen_rpa_cmpl);
+}
+
+/*******************************************************************************
+**
+** Function btm_ble_multi_adv_reenable
+**
+** Description This function re-enable adv instance upon a connection establishment.
+**
+** Parameters advertise parameters used for this instance.
+**
+** Returns none.
+**
+*******************************************************************************/
+void btm_ble_multi_adv_reenable(UINT8 inst_id)
+{
+ tBTM_BLE_MULTI_ADV_INST *p_inst = &btm_multi_adv_cb.p_adv_inst[inst_id - 1];
+
+ if (p_inst->inst_id != 0)
+ {
+ if (p_inst->adv_evt != BTM_BLE_CONNECT_DIR_EVT)
+ btm_ble_enable_multi_adv (TRUE, p_inst->inst_id, 0);
+ else
+ /* mark directed adv as disabled if adv has been stopped */
+ {
+ (p_inst->p_cback)(BTM_BLE_MULTI_ADV_DISABLE_EVT,p_inst->inst_id,p_inst->p_ref,0);
+ p_inst->inst_id = 0;
+ }
+ }
+}
+
+/*******************************************************************************
+**
+** Function btm_ble_multi_adv_enb_privacy
+**
+** Description This function enable/disable privacy setting in multi adv
+**
+** Parameters enable: enable or disable the adv instance.
+**
+** Returns none.
+**
+*******************************************************************************/
+void btm_ble_multi_adv_enb_privacy(BOOLEAN enable)
+{
+ UINT8 i;
+ tBTM_BLE_MULTI_ADV_INST *p_inst = &btm_multi_adv_cb.p_adv_inst[0];
+
+ for (i = 0; i < BTM_BleMaxMultiAdvInstanceCount() - 1; i ++, p_inst++)
+ {
+ if (enable)
+ btm_ble_multi_adv_configure_rpa (p_inst);
+ else
+ btu_stop_timer_oneshot(&p_inst->raddr_timer_ent);
+ }
+}
+
+/*******************************************************************************
+**
+** Function BTM_BleEnableAdvInstance
+**
+** Description This function enable a Multi-ADV instance with the specified
+** adv parameters
+**
+** Parameters p_params: pointer to the adv parameter structure, set as default
+** adv parameter when the instance is enabled.
+** p_cback: callback function for the adv instance.
+** p_ref: reference data attach to the adv instance to be enabled.
+**
+** Returns status
+**
+*******************************************************************************/
+tBTM_STATUS BTM_BleEnableAdvInstance (tBTM_BLE_ADV_PARAMS *p_params,
+ tBTM_BLE_MULTI_ADV_CBACK *p_cback,void *p_ref)
+{
+ UINT8 i;
+ tBTM_STATUS rt = BTM_NO_RESOURCES;
+ tBTM_BLE_MULTI_ADV_INST *p_inst = &btm_multi_adv_cb.p_adv_inst[0];
+
+ BTM_TRACE_EVENT("BTM_BleEnableAdvInstance called");
+
+ if (0 == btm_cb.cmn_ble_vsc_cb.adv_inst_max)
+ {
+ BTM_TRACE_ERROR("Controller does not support Multi ADV");
+ return BTM_ERR_PROCESSING;
+ }
+
+ if (NULL == p_inst)
+ {
+ BTM_TRACE_ERROR("Invalid instance in BTM_BleEnableAdvInstance");
+ return BTM_ERR_PROCESSING;
+ }
+
+ for (i = 0; i < BTM_BleMaxMultiAdvInstanceCount() - 1; i ++, p_inst++)
+ {
+ if (p_inst->inst_id == 0)
+ {
+ p_inst->inst_id = i + 1;
+
+ /* configure adv parameter */
+ if (p_params)
+ rt = btm_ble_multi_adv_set_params(p_inst, p_params, 0);
+ else
+ rt = BTM_CMD_STARTED;
+
+ /* enable adv */
+ BTM_TRACE_EVENT("btm_ble_enable_multi_adv being called with inst_id:%d",
+ p_inst->inst_id);
+
+ if (BTM_CMD_STARTED == rt)
+ {
+ if ((rt = btm_ble_enable_multi_adv (TRUE, p_inst->inst_id,
+ BTM_BLE_MULTI_ADV_ENB_EVT)) == BTM_CMD_STARTED)
+ {
+ p_inst->p_cback = p_cback;
+ p_inst->p_ref = p_ref;
+ }
+ }
+
+ if (BTM_CMD_STARTED != rt)
+ {
+ p_inst->inst_id = 0;
+ BTM_TRACE_ERROR("BTM_BleEnableAdvInstance failed");
+ }
+ break;
+ }
+ }
+ return rt;
+}
+
+/*******************************************************************************
+**
+** Function BTM_BleUpdateAdvInstParam
+**
+** Description This function update a Multi-ADV instance with the specified
+** adv parameters.
+**
+** Parameters inst_id: adv instance ID
+** p_params: pointer to the adv parameter structure.
+**
+** Returns status
+**
+*******************************************************************************/
+tBTM_STATUS BTM_BleUpdateAdvInstParam (UINT8 inst_id, tBTM_BLE_ADV_PARAMS *p_params)
+{
+ tBTM_STATUS rt = BTM_ILLEGAL_VALUE;
+ tBTM_BLE_MULTI_ADV_INST *p_inst = &btm_multi_adv_cb.p_adv_inst[inst_id - 1];
+
+ BTM_TRACE_EVENT("BTM_BleUpdateAdvInstParam called with inst_id:%d", inst_id);
+
+ if (0 == btm_cb.cmn_ble_vsc_cb.adv_inst_max)
+ {
+ BTM_TRACE_ERROR("Controller does not support Multi ADV");
+ return BTM_ERR_PROCESSING;
+ }
+
+ if (inst_id < BTM_BleMaxMultiAdvInstanceCount() &&
+ inst_id != BTM_BLE_MULTI_ADV_DEFAULT_STD &&
+ p_params != NULL)
+ {
+ if (p_inst->inst_id == 0)
+ {
+ BTM_TRACE_DEBUG("adv instance %d is not active", inst_id);
+ return BTM_WRONG_MODE;
+ }
+ else
+ btm_ble_enable_multi_adv(FALSE, inst_id, 0);
+
+ if (BTM_CMD_STARTED == btm_ble_multi_adv_set_params(p_inst, p_params, 0))
+ rt = btm_ble_enable_multi_adv(TRUE, inst_id, BTM_BLE_MULTI_ADV_PARAM_EVT);
+ }
+ return rt;
+}
+
+/*******************************************************************************
+**
+** Function BTM_BleCfgAdvInstData
+**
+** Description This function configure a Multi-ADV instance with the specified
+** adv data or scan response data.
+**
+** Parameters inst_id: adv instance ID
+** is_scan_rsp: is this scacn response, if no set as adv data.
+** data_mask: adv data mask.
+** p_data: pointer to the adv data structure.
+**
+** Returns status
+**
+*******************************************************************************/
+tBTM_STATUS BTM_BleCfgAdvInstData (UINT8 inst_id, BOOLEAN is_scan_rsp,
+ tBTM_BLE_AD_MASK data_mask,
+ tBTM_BLE_ADV_DATA *p_data)
+{
+ UINT8 param[BTM_BLE_MULTI_ADV_WRITE_DATA_LEN], *pp = param;
+ UINT8 sub_code = (is_scan_rsp) ?
+ BTM_BLE_MULTI_ADV_WRITE_SCAN_RSP_DATA : BTM_BLE_MULTI_ADV_WRITE_ADV_DATA;
+ UINT8 *p_len;
+ tBTM_STATUS rt;
+ UINT8 *pp_temp = (UINT8*)(param + BTM_BLE_MULTI_ADV_WRITE_DATA_LEN -1);
+ tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
+
+ BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
+ if (0 == cmn_ble_vsc_cb.adv_inst_max)
+ {
+ BTM_TRACE_ERROR("Controller does not support Multi ADV");
+ return BTM_ERR_PROCESSING;
+ }
+
+
+ BTM_TRACE_EVENT("BTM_BleCfgAdvInstData called with inst_id:%d", inst_id);
+ if (inst_id > BTM_BLE_MULTI_ADV_MAX || inst_id == BTM_BLE_MULTI_ADV_DEFAULT_STD)
+ return BTM_ILLEGAL_VALUE;
+
+ memset(param, 0, BTM_BLE_MULTI_ADV_WRITE_DATA_LEN);
+
+ UINT8_TO_STREAM(pp, sub_code);
+ p_len = pp ++;
+ btm_ble_build_adv_data(&data_mask, &pp, p_data);
+ *p_len = (UINT8)(pp - param - 2);
+ UINT8_TO_STREAM(pp_temp, inst_id);
+
+ if ((rt = BTM_VendorSpecificCommand (HCI_BLE_MULTI_ADV_OCF,
+ (UINT8)BTM_BLE_MULTI_ADV_WRITE_DATA_LEN,
+ param,
+ btm_ble_multi_adv_vsc_cmpl_cback))
+ == BTM_CMD_STARTED)
+ {
+ btm_ble_multi_adv_enq_op_q(sub_code, inst_id, BTM_BLE_MULTI_ADV_DATA_EVT);
+ }
+ return rt;
+}
+
+/*******************************************************************************
+**
+** Function BTM_BleDisableAdvInstance
+**
+** Description This function disables a Multi-ADV instance.
+**
+** Parameters inst_id: adv instance ID
+**
+** Returns status
+**
+*******************************************************************************/
+tBTM_STATUS BTM_BleDisableAdvInstance (UINT8 inst_id)
+{
+ tBTM_STATUS rt = BTM_ILLEGAL_VALUE;
+ tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
+
+ BTM_TRACE_EVENT("BTM_BleDisableAdvInstance with inst_id:%d", inst_id);
+
+ BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
+
+ if (0 == cmn_ble_vsc_cb.adv_inst_max)
+ {
+ BTM_TRACE_ERROR("Controller does not support Multi ADV");
+ return BTM_ERR_PROCESSING;
+ }
+
+ if (inst_id < BTM_BleMaxMultiAdvInstanceCount() &&
+ inst_id != BTM_BLE_MULTI_ADV_DEFAULT_STD)
+ {
+ if ((rt = btm_ble_enable_multi_adv(FALSE, inst_id, BTM_BLE_MULTI_ADV_DISABLE_EVT))
+ == BTM_CMD_STARTED)
+ {
+ btm_ble_multi_adv_configure_rpa(&btm_multi_adv_cb.p_adv_inst[inst_id-1]);
+ btu_stop_timer(&btm_multi_adv_cb.p_adv_inst[inst_id-1].raddr_timer_ent);
+ btm_multi_adv_cb.p_adv_inst[inst_id-1].inst_id = 0;
+ }
+ }
+ return rt;
+}
+/*******************************************************************************
+**
+** Function btm_ble_multi_adv_vse_cback
+**
+** Description VSE callback for multi adv events.
+**
+** Returns
+**
+*******************************************************************************/
+void btm_ble_multi_adv_vse_cback(UINT8 len, UINT8 *p)
+{
+ UINT8 sub_event;
+ UINT8 adv_inst, reason, conn_handle, idx;
+
+ /* Check if this is a BLE RSSI vendor specific event */
+ STREAM_TO_UINT8(sub_event, p);
+ len--;
+
+ BTM_TRACE_EVENT("btm_ble_multi_adv_vse_cback called with event:%d", sub_event);
+ if ((sub_event == HCI_VSE_SUBCODE_BLE_MULTI_ADV_ST_CHG) && (len >= 4))
+ {
+ STREAM_TO_UINT8(adv_inst, p);
+ STREAM_TO_UINT8(reason, p);
+ STREAM_TO_UINT16(conn_handle, p);
+
+ if ((idx = btm_handle_to_acl_index(conn_handle)) != MAX_L2CAP_LINKS)
+ {
+ if (btm_cb.ble_ctr_cb.privacy &&
+ adv_inst <= BTM_BLE_MULTI_ADV_MAX && adv_inst != BTM_BLE_MULTI_ADV_DEFAULT_STD)
+ {
+ memcpy(btm_cb.acl_db[idx].conn_addr, btm_multi_adv_cb.p_adv_inst[adv_inst - 1].rpa,
+ BD_ADDR_LEN);
+ }
+ }
+
+ if (adv_inst < BTM_BleMaxMultiAdvInstanceCount() &&
+ adv_inst != BTM_BLE_MULTI_ADV_DEFAULT_STD)
+ {
+ BTM_TRACE_EVENT("btm_ble_multi_adv_reenable called");
+ btm_ble_multi_adv_reenable(adv_inst);
+ }
+ /* re-enable connectibility */
+ else if (adv_inst == BTM_BLE_MULTI_ADV_DEFAULT_STD)
+ {
+ if (btm_cb.ble_ctr_cb.inq_var.connectable_mode == BTM_BLE_CONNECTABLE)
+ {
+ btm_ble_set_connectability ( btm_cb.ble_ctr_cb.inq_var.connectable_mode );
+ }
+ }
+
+ }
+
+}
+/*******************************************************************************
+**
+** Function btm_ble_multi_adv_init
+**
+** Description This function initialize the multi adv control block.
+**
+** Parameters None
+**
+** Returns void
+**
+*******************************************************************************/
+void btm_ble_multi_adv_init()
+{
+ UINT8 i = 0;
+ memset(&btm_multi_adv_cb, 0, sizeof(tBTM_BLE_MULTI_ADV_CB));
+ memset (&btm_multi_adv_idx_q,0, sizeof (tBTM_BLE_MULTI_ADV_INST_IDX_Q));
+ btm_multi_adv_idx_q.front = -1;
+ btm_multi_adv_idx_q.rear = -1;
+
+ if (btm_cb.cmn_ble_vsc_cb.adv_inst_max > 0)
+ {
+ btm_multi_adv_cb.p_adv_inst = GKI_getbuf( sizeof(tBTM_BLE_MULTI_ADV_INST)*
+ (btm_cb.cmn_ble_vsc_cb.adv_inst_max));
+ memset(btm_multi_adv_cb.p_adv_inst, 0, sizeof(tBTM_BLE_MULTI_ADV_INST)*
+ (btm_cb.cmn_ble_vsc_cb.adv_inst_max));
+
+ btm_multi_adv_cb.op_q.p_sub_code = GKI_getbuf( sizeof(UINT8) *
+ (btm_cb.cmn_ble_vsc_cb.adv_inst_max));
+ memset(btm_multi_adv_cb.op_q.p_sub_code, 0,
+ sizeof(UINT8)*(btm_cb.cmn_ble_vsc_cb.adv_inst_max));
+
+ btm_multi_adv_cb.op_q.p_inst_id = GKI_getbuf( sizeof(UINT8) *
+ (btm_cb.cmn_ble_vsc_cb.adv_inst_max));
+ memset(btm_multi_adv_cb.op_q.p_inst_id, 0,
+ sizeof(UINT8)*(btm_cb.cmn_ble_vsc_cb.adv_inst_max));
+ }
+
+ for (i = 0; i < btm_cb.cmn_ble_vsc_cb.adv_inst_max ; i ++)
+ btm_multi_adv_cb.p_adv_inst[i].index = i;
+
+ BTM_RegisterForVSEvents(btm_ble_multi_adv_vse_cback, TRUE);
+}
+
+/*******************************************************************************
+**
+** Function btm_ble_multi_adv_cleanup
+**
+** Description This function cleans up multi adv control block.
+**
+** Parameters
+** Returns void
+**
+*******************************************************************************/
+void btm_ble_multi_adv_cleanup(void)
+{
+ if (btm_multi_adv_cb.p_adv_inst)
+ GKI_freebuf(btm_multi_adv_cb.p_adv_inst);
+
+ if (btm_multi_adv_cb.op_q.p_sub_code)
+ GKI_freebuf(btm_multi_adv_cb.op_q.p_sub_code);
+
+ if (btm_multi_adv_cb.op_q.p_inst_id)
+ GKI_freebuf(btm_multi_adv_cb.op_q.p_inst_id);
+
+}
+
+/*******************************************************************************
+**
+** Function btm_ble_multi_adv_get_ref
+**
+** Description This function obtains the reference pointer for the instance ID provided
+**
+** Parameters inst_id - Instance ID
+**
+** Returns void*
+**
+*******************************************************************************/
+void* btm_ble_multi_adv_get_ref(UINT8 inst_id)
+{
+ tBTM_BLE_MULTI_ADV_INST *p_inst = NULL;
+
+ if (inst_id < BTM_BleMaxMultiAdvInstanceCount())
+ {
+ p_inst = &btm_multi_adv_cb.p_adv_inst[inst_id - 1];
+ if (NULL != p_inst)
+ return p_inst->p_ref;
+ }
+
+ return NULL;
+}
+#endif
+
diff --git a/stack/btm/btm_dev.c b/stack/btm/btm_dev.c
index 0dd534c..f60282f 100644
--- a/stack/btm/btm_dev.c
+++ b/stack/btm/btm_dev.c
@@ -35,6 +35,8 @@
#include "btm_int.h"
#include "hcidefs.h"
#include "l2c_api.h"
+#include "vendor_ble.h"
+
static tBTM_SEC_DEV_REC *btm_find_oldest_dev (void);
/*******************************************************************************
@@ -64,6 +66,7 @@
int i, j;
BOOLEAN found = FALSE;
+ BTM_TRACE_API("%s, link key type:%x", __FUNCTION__,key_type);
p_dev_rec = btm_find_dev (bd_addr);
if (!p_dev_rec)
{
@@ -79,7 +82,7 @@
memset (p_dev_rec, 0, sizeof (tBTM_SEC_DEV_REC));
p_dev_rec->sec_flags = BTM_SEC_IN_USE;
memcpy (p_dev_rec->bd_addr, bd_addr, BD_ADDR_LEN);
- p_dev_rec->hci_handle = BTM_GetHCIConnHandle (bd_addr);
+ p_dev_rec->hci_handle = BTM_GetHCIConnHandle (bd_addr, BT_TRANSPORT_BR_EDR);
#if BLE_INCLUDED == TRUE
/* use default value for background connection params */
@@ -136,7 +139,7 @@
if (link_key)
{
- BTM_TRACE_EVENT6 ("BTM_SecAddDevice() BDA: %02x:%02x:%02x:%02x:%02x:%02x",
+ BTM_TRACE_EVENT ("BTM_SecAddDevice() BDA: %02x:%02x:%02x:%02x:%02x:%02x",
bd_addr[0], bd_addr[1], bd_addr[2],
bd_addr[3], bd_addr[4], bd_addr[5]);
p_dev_rec->sec_flags |= BTM_SEC_LINK_KEY_KNOWN;
@@ -172,15 +175,18 @@
{
tBTM_SEC_DEV_REC *p_dev_rec;
- if (BTM_IsAclConnectionUp(bd_addr))
+ if (BTM_IsAclConnectionUp(bd_addr, BT_TRANSPORT_LE) || BTM_IsAclConnectionUp(bd_addr, BT_TRANSPORT_BR_EDR))
{
- BTM_TRACE_WARNING0("BTM_SecDeleteDevice FAILED: Cannot Delete when connection is active");
+ BTM_TRACE_WARNING("BTM_SecDeleteDevice FAILED: Cannot Delete when connection is active");
return(FALSE);
}
if ((p_dev_rec = btm_find_dev (bd_addr)) == NULL)
return(FALSE);
+#if BLE_INCLUDED == TRUE && BLE_PRIVACY_SPT == TRUE
+ btm_ble_vendor_irk_list_remove_dev(p_dev_rec);
+#endif
btm_sec_free_dev (p_dev_rec);
/* Tell controller to get rid of the link key if it has one stored */
@@ -215,9 +221,9 @@
** Function btm_sec_alloc_dev
**
** Description Look for the record in the device database for the record
-** with specified handle
+** with specified address
**
-** Returns Pointer to the record
+** Returns Pointer to the record or NULL
**
*******************************************************************************/
tBTM_SEC_DEV_REC *btm_sec_alloc_dev (BD_ADDR bd_addr)
@@ -225,21 +231,55 @@
tBTM_SEC_DEV_REC *p_dev_rec = NULL;
tBTM_INQ_INFO *p_inq_info;
int i;
- BTM_TRACE_EVENT0 ("btm_sec_alloc_dev");
+ DEV_CLASS old_cod;
+ int i_new_entry = BTM_SEC_MAX_DEVICE_RECORDS;
+ int i_old_entry = BTM_SEC_MAX_DEVICE_RECORDS;
+ BTM_TRACE_EVENT ("btm_sec_alloc_dev");
+
for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++)
{
- if (!(btm_cb.sec_dev_rec[i].sec_flags & BTM_SEC_IN_USE))
+ /* look for old entry where device details are present */
+ if (!(btm_cb.sec_dev_rec[i].sec_flags & BTM_SEC_IN_USE) &&
+ (!memcmp (btm_cb.sec_dev_rec[i].bd_addr, bd_addr, BD_ADDR_LEN)))
{
- p_dev_rec = &btm_cb.sec_dev_rec[i];
+ i_old_entry = i;
+ BTM_TRACE_EVENT ("btm_sec_alloc_dev old device found");
break;
}
}
- if (!p_dev_rec)
- p_dev_rec = btm_find_oldest_dev();
+ for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++)
+ {
+ if (!(btm_cb.sec_dev_rec[i].sec_flags & BTM_SEC_IN_USE))
+ {
+ i_new_entry = i;
+ break;
+ }
+ }
+ if (i_new_entry == BTM_SEC_MAX_DEVICE_RECORDS) {
+ p_dev_rec = btm_find_oldest_dev();
+ }
+ else {
+ /* if the old device entry not present go with
+ new entry */
+ if(i_old_entry == BTM_SEC_MAX_DEVICE_RECORDS) {
+ p_dev_rec = &btm_cb.sec_dev_rec[i_new_entry];
+ }
+ else {
+ p_dev_rec = &btm_cb.sec_dev_rec[i_old_entry];
+ memcpy (old_cod, p_dev_rec->dev_class, DEV_CLASS_LEN);
+ }
+ }
memset (p_dev_rec, 0, sizeof (tBTM_SEC_DEV_REC));
+ /* Retain the old COD for device */
+ if(i_old_entry != BTM_SEC_MAX_DEVICE_RECORDS) {
+ BTM_TRACE_EVENT ("btm_sec_alloc_dev restoring cod ");
+ memcpy (p_dev_rec->dev_class, old_cod, DEV_CLASS_LEN);
+
+ }
+
p_dev_rec->sec_flags = BTM_SEC_IN_USE;
/* Check with the BT manager if details about remote device are known */
@@ -278,7 +318,10 @@
memcpy (p_dev_rec->bd_addr, bd_addr, BD_ADDR_LEN);
- p_dev_rec->hci_handle = BTM_GetHCIConnHandle (bd_addr);
+#if BLE_INCLUDED == TRUE
+ p_dev_rec->ble_hci_handle = BTM_GetHCIConnHandle (bd_addr, BT_TRANSPORT_LE);
+#endif
+ p_dev_rec->hci_handle = BTM_GetHCIConnHandle (bd_addr, BT_TRANSPORT_BR_EDR);
p_dev_rec->timestamp = btm_cb.dev_rec_count++;
return(p_dev_rec);
@@ -332,7 +375,7 @@
{
if (HCI_SWITCH_SUPPORTED(p_dev_rec->features[HCI_EXT_FEATURES_PAGE_0]))
{
- BTM_TRACE_DEBUG0("btm_dev_support_switch return TRUE (feature found)");
+ BTM_TRACE_DEBUG("btm_dev_support_switch return TRUE (feature found)");
return (TRUE);
}
@@ -349,12 +392,12 @@
/* If we don't know peer's capabilities, assume it supports Role-switch */
if (feature_empty)
{
- BTM_TRACE_DEBUG0("btm_dev_support_switch return TRUE (feature empty)");
+ BTM_TRACE_DEBUG("btm_dev_support_switch return TRUE (feature empty)");
return (TRUE);
}
}
- BTM_TRACE_DEBUG0("btm_dev_support_switch return FALSE");
+ BTM_TRACE_DEBUG("btm_dev_support_switch return FALSE");
return(FALSE);
}
@@ -376,7 +419,11 @@
for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++, p_dev_rec++)
{
if ((p_dev_rec->sec_flags & BTM_SEC_IN_USE)
- && (p_dev_rec->hci_handle == handle))
+ && ((p_dev_rec->hci_handle == handle)
+#if BLE_INCLUDED == TRUE
+ ||(p_dev_rec->ble_hci_handle == handle)
+#endif
+ ))
return(p_dev_rec);
}
return(NULL);
@@ -422,7 +469,7 @@
tBTM_SEC_DEV_REC *btm_find_or_alloc_dev (BD_ADDR bd_addr)
{
tBTM_SEC_DEV_REC *p_dev_rec;
- BTM_TRACE_EVENT0 ("btm_find_or_alloc_dev");
+ BTM_TRACE_EVENT ("btm_find_or_alloc_dev");
if ((p_dev_rec = btm_find_dev (bd_addr)) == NULL)
{
@@ -440,7 +487,7 @@
** the oldest non-paired device. If all devices are paired it
** deletes the oldest paired device.
**
-** Returns Pointer to the record
+** Returns Pointer to the record or NULL
**
*******************************************************************************/
tBTM_SEC_DEV_REC *btm_find_oldest_dev (void)
@@ -454,7 +501,7 @@
for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++, p_dev_rec++)
{
if (((p_dev_rec->sec_flags & BTM_SEC_IN_USE) == 0)
- || ((p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) != 0))
+ || ((p_dev_rec->sec_flags & (BTM_SEC_LINK_KEY_KNOWN |BTM_SEC_LE_LINK_KEY_KNOWN)) != 0))
continue; /* Device is paired so skip it */
if (p_dev_rec->timestamp < ot)
diff --git a/stack/btm/btm_devctl.c b/stack/btm/btm_devctl.c
index 240bd2f..910a892 100644
--- a/stack/btm/btm_devctl.c
+++ b/stack/btm/btm_devctl.c
@@ -175,7 +175,7 @@
#endif
#else
- BTM_TRACE_EVENT0 ("BTM_AUTOMATIC_HCI_RESET is FALSE, so skip btm reset for now");
+ BTM_TRACE_EVENT ("BTM_AUTOMATIC_HCI_RESET is FALSE, so skip btm reset for now");
#endif
}
@@ -319,7 +319,7 @@
*******************************************************************************/
tBTM_STATUS BTM_SetAfhChannels (UINT8 first, UINT8 last)
{
- BTM_TRACE_API4 ("BTM_SetAfhChannels first: %d (%d) last: %d (%d)",
+ BTM_TRACE_API ("BTM_SetAfhChannels first: %d (%d) last: %d (%d)",
first, btm_cb.first_disabled_channel, last,
btm_cb.last_disabled_channel);
@@ -441,7 +441,7 @@
*******************************************************************************/
void btm_read_ble_wl_size(void)
{
- BTM_TRACE_DEBUG0("btm_read_ble_wl_size ");
+ BTM_TRACE_DEBUG("btm_read_ble_wl_size ");
btu_start_timer (&btm_cb.devcb.reset_timer, BTU_TTYPE_BTM_DEV_CTL, BTM_DEV_REPLY_TIMEOUT);
/* Send a Read Buffer Size message to the Host Controller. */
@@ -458,7 +458,7 @@
*******************************************************************************/
void btm_get_ble_buffer_size(void)
{
- BTM_TRACE_DEBUG0("btm_get_ble_buffer_size ");
+ BTM_TRACE_DEBUG("btm_get_ble_buffer_size ");
btu_start_timer (&btm_cb.devcb.reset_timer, BTU_TTYPE_BTM_DEV_CTL, BTM_DEV_REPLY_TIMEOUT);
/* Send a Read Buffer Size message to the Host Controller. */
@@ -477,12 +477,31 @@
*******************************************************************************/
static void btm_read_ble_local_supported_features(void)
{
- BTM_TRACE_DEBUG0("btm_read_ble_local_supported_features ");
+ BTM_TRACE_DEBUG("btm_read_ble_local_supported_features ");
btu_start_timer (&btm_cb.devcb.reset_timer, BTU_TTYPE_BTM_DEV_CTL, BTM_DEV_REPLY_TIMEOUT);
/* Send a Read Local Supported Features message to the Host Controller. */
btsnd_hcic_ble_read_local_spt_feat ();
}
+
+/*******************************************************************************
+**
+** Function btm_read_ble_local_supported_states
+**
+** Description Local function called to send a read BLE local supported
+** features command
+**
+** Returns void
+**
+*******************************************************************************/
+static void btm_read_ble_local_supported_states(void)
+{
+ BTM_TRACE_DEBUG("btm_read_ble_local_supported_states ");
+ btu_start_timer (&btm_cb.devcb.reset_timer, BTU_TTYPE_BTM_DEV_CTL, BTM_DEV_REPLY_TIMEOUT);
+
+ /* Send a Read Local Supported states message to the Host Controller. */
+ btsnd_hcic_ble_read_supported_states ();
+}
#endif
/*******************************************************************************
**
@@ -519,7 +538,7 @@
*******************************************************************************/
static void btm_read_local_supported_cmds (UINT8 local_controller_id)
{
- BTM_TRACE_DEBUG0("Start reading local supported commands");
+ BTM_TRACE_DEBUG("Start reading local supported commands");
btu_start_timer (&btm_cb.devcb.reset_timer, BTU_TTYPE_BTM_DEV_CTL, BTM_DEV_REPLY_TIMEOUT);
@@ -613,7 +632,7 @@
{
int devinx;
- BTM_TRACE_EVENT0 ("btm_reset_complete");
+ BTM_TRACE_EVENT ("btm_reset_complete");
/* Handle if btm initiated the reset */
if (btm_cb.devcb.state == BTM_DEV_STATE_WAIT_RESET_CMPLT)
@@ -794,7 +813,7 @@
UINT16 lm_num_le_bufs;
UNUSED(evt_len);
- BTM_TRACE_DEBUG0("btm_read_ble_buf_size_complete ");
+ BTM_TRACE_DEBUG("btm_read_ble_buf_size_complete ");
STREAM_TO_UINT8 (status, p);
if (status == HCI_SUCCESS)
{
@@ -808,6 +827,36 @@
l2c_link_processs_ble_num_bufs (lm_num_le_bufs);
}
+ btm_read_ble_local_supported_states();
+}
+/*******************************************************************************
+**
+** Function btm_read_ble_local_supported_states_complete
+**
+** Description This function is called when command complete for
+** Read LE Local Supported states complete is received.
+**
+** Returns void
+**
+*******************************************************************************/
+void btm_read_ble_local_supported_states_complete (UINT8 *p, UINT16 evt_len)
+{
+ UINT8 status;
+
+ UNUSED(evt_len);
+ BTM_TRACE_DEBUG("btm_read_ble_local_supported_states_complete ");
+
+ btu_stop_timer (&btm_cb.devcb.reset_timer);
+
+ STREAM_TO_UINT8 (status, p);
+ if (status == HCI_SUCCESS)
+ {
+ STREAM_TO_ARRAY(&btm_cb.devcb.le_supported_states, p, BTM_LE_SUPPORT_STATE_SIZE);
+ }
+ else
+ {
+ BTM_TRACE_WARNING ("btm_read_ble_local_supported_features_complete status = %d", status);
+ }
btm_read_ble_local_supported_features();
}
@@ -828,7 +877,7 @@
UINT8 status;
UNUSED(evt_len);
- BTM_TRACE_DEBUG0("btm_read_ble_local_supported_features_complete ");
+ BTM_TRACE_DEBUG("btm_read_ble_local_supported_features_complete ");
btu_stop_timer (&btm_cb.devcb.reset_timer);
@@ -839,9 +888,11 @@
}
else
{
- BTM_TRACE_WARNING1 ("btm_read_ble_local_supported_features_complete status = %d", status);
+ BTM_TRACE_WARNING ("btm_read_ble_local_supported_features_complete status = %d", status);
}
+ btsnd_hcic_ble_set_evt_mask((UINT8 *)HCI_BLE_EVENT_MASK_DEF);
+
#if BTM_INTERNAL_BB == TRUE
{
UINT8 buf[9] = BTM_INTERNAL_LOCAL_FEA;
@@ -866,7 +917,7 @@
UINT8 status;
UNUSED(evt_len);
- BTM_TRACE_DEBUG0("btm_read_white_list_size_complete ");
+ BTM_TRACE_DEBUG("btm_read_white_list_size_complete ");
STREAM_TO_UINT8 (status, p);
if (status == HCI_SUCCESS)
@@ -874,6 +925,8 @@
STREAM_TO_UINT8(btm_cb.ble_ctr_cb.max_filter_entries, p);
btm_cb.ble_ctr_cb.num_empty_filter = btm_cb.ble_ctr_cb.max_filter_entries;
}
+ /* write LE host support and simultatunous LE supported */
+ btsnd_hcic_ble_write_host_supported(BTM_BLE_HOST_SUPPORT, BTM_BLE_SIMULTANEOUS_HOST);
btm_get_ble_buffer_size();
}
@@ -935,7 +988,7 @@
UINT8 last;
UINT8 first;
- BTM_TRACE_DEBUG1 ("btm_decode_ext_features_page page: %d", page_number);
+ BTM_TRACE_DEBUG ("btm_decode_ext_features_page page: %d", page_number);
switch (page_number)
{
/* Extended (Legacy) Page 0 */
@@ -986,7 +1039,7 @@
}
}
- BTM_TRACE_DEBUG1("Local supported ACL packet types: 0x%04x",
+ BTM_TRACE_DEBUG("Local supported ACL packet types: 0x%04x",
btm_cb.btm_acl_pkt_types_supported);
/* Create (e)SCO supported packet types mask */
@@ -1043,7 +1096,7 @@
}
#endif
- BTM_TRACE_DEBUG1("Local supported SCO packet types: 0x%04x",
+ BTM_TRACE_DEBUG("Local supported SCO packet types: 0x%04x",
btm_cb.btm_sco_pkt_types_supported);
/* Create Default Policy Settings */
@@ -1102,7 +1155,7 @@
break;
default:
- BTM_TRACE_ERROR1("btm_decode_ext_features_page page=%d unknown", page_number);
+ BTM_TRACE_ERROR("btm_decode_ext_features_page page=%d unknown", page_number);
break;
}
}
@@ -1143,11 +1196,11 @@
}
if (!found)
- BTM_TRACE_WARNING0 ("btm_reset_ctrlr_complete: NONE of local controller features is set");
+ BTM_TRACE_WARNING ("btm_reset_ctrlr_complete: NONE of local controller features is set");
max_page_number = i;
- BTM_TRACE_DEBUG1 ("btm_reset_ctrlr_complete: max_page_number: %d", max_page_number);
+ BTM_TRACE_DEBUG ("btm_reset_ctrlr_complete: max_page_number: %d", max_page_number);
/*
* Set State to Ready (needs to be done before btm_decode_ext_features_page
@@ -1191,7 +1244,7 @@
*******************************************************************************/
static void btm_issue_host_support_for_lmp_features (void)
{
- BTM_TRACE_DEBUG1("btm_issue_host_support_for_lmp_features lmp_features_host_may_support: 0x%02x", btm_cb.devcb.lmp_features_host_may_support);
+ BTM_TRACE_DEBUG("btm_issue_host_support_for_lmp_features lmp_features_host_may_support: 0x%02x", btm_cb.devcb.lmp_features_host_may_support);
if (btm_cb.devcb.lmp_features_host_may_support & BTM_HOST_MAY_SUPP_SSP)
{
@@ -1204,8 +1257,7 @@
{
if (btm_cb.devcb.lmp_features_host_may_support & BTM_HOST_MAY_SUPP_SIMULT_BR_LE)
{
- /* At the moment the host can't work simultaneously with BR/EDR and LE */
- btsnd_hcic_ble_write_host_supported(BTM_BLE_HOST_SUPPORT, 0);
+ btsnd_hcic_ble_write_host_supported(BTM_BLE_HOST_SUPPORT, BTM_BLE_SIMULTANEOUS_HOST);
}
else
{
@@ -1241,7 +1293,7 @@
return;
}
- BTM_TRACE_ERROR2("%s lmp_features_host_may_support: 0x%02x. This is unexpected.",__FUNCTION__,
+ BTM_TRACE_ERROR("%s lmp_features_host_may_support: 0x%02x. This is unexpected.",__FUNCTION__,
btm_cb.devcb.lmp_features_host_may_support);
}
@@ -1349,7 +1401,7 @@
/* if local controller has extended features and supports
**HCI_Read_Local_Extended_Features command,
** then start reading these feature starting with extended features page 1 */
- BTM_TRACE_DEBUG0 ("Start reading local extended features");
+ BTM_TRACE_DEBUG ("Start reading local extended features");
btm_get_local_ext_features(HCI_EXT_FEATURES_PAGE_1);
}
else
@@ -1384,7 +1436,7 @@
if (status != HCI_SUCCESS)
{
- BTM_TRACE_WARNING1("btm_read_local_ext_features_complete status = 0x%02X", status);
+ BTM_TRACE_WARNING("btm_read_local_ext_features_complete status = 0x%02X", status);
btm_read_all_lmp_features_complete (HCI_EXT_FEATURES_PAGE_0);
return;
}
@@ -1397,7 +1449,7 @@
if (page_number > HCI_EXT_FEATURES_PAGE_MAX)
{
- BTM_TRACE_ERROR1("btm_read_local_ext_features_complete page=%d unknown",
+ BTM_TRACE_ERROR("btm_read_local_ext_features_complete page=%d unknown",
page_number);
return;
}
@@ -1420,7 +1472,7 @@
if ((page_number == page_number_max) ||
(page_number == HCI_EXT_FEATURES_PAGE_MAX))
{
- BTM_TRACE_DEBUG1("BTM reached last extended features page (%d)", page_number);
+ BTM_TRACE_DEBUG("BTM reached last extended features page (%d)", page_number);
btm_read_all_lmp_features_complete(page_number);
}
/* Else (another page must be read) */
@@ -1428,7 +1480,7 @@
{
/* Read the next features page */
page_number++;
- BTM_TRACE_DEBUG1("BTM reads next extended features page (%d)", page_number);
+ BTM_TRACE_DEBUG("BTM reads next extended features page (%d)", page_number);
btm_get_local_ext_features(page_number);
}
}
@@ -1451,7 +1503,7 @@
btu_stop_timer (&(p_devcb->reset_timer));
STREAM_TO_UINT8 (status, p);
- BTM_TRACE_DEBUG1("btm_read_local_supported_cmds_complete status (0x%02x)", status);
+ BTM_TRACE_DEBUG("btm_read_local_supported_cmds_complete status (0x%02x)", status);
if (status == HCI_SUCCESS)
{
@@ -1481,7 +1533,7 @@
if (status != HCI_SUCCESS)
{
- BTM_TRACE_WARNING1("btm_write_simple_paring_mode_complete status: 0x%02x", status);
+ BTM_TRACE_WARNING("btm_write_simple_paring_mode_complete status: 0x%02x", status);
}
if (btm_cb.devcb.lmp_features_host_may_support & BTM_HOST_MAY_SUPP_SSP)
@@ -1510,7 +1562,7 @@
if (status != HCI_SUCCESS)
{
- BTM_TRACE_WARNING1("btm_write_le_host_supported_complete status: 0x%02x", status);
+ BTM_TRACE_WARNING("btm_write_le_host_supported_complete status: 0x%02x", status);
}
if (btm_cb.devcb.lmp_features_host_may_support & BTM_HOST_MAY_SUPP_LE)
@@ -1822,7 +1874,7 @@
if (page_number <= HCI_EXT_FEATURES_PAGE_MAX)
return (btm_cb.devcb.local_lmp_features[page_number]);
- BTM_TRACE_ERROR1("Warning: BTM_ReadLocalExtendedFeatures page %d unknown",
+ BTM_TRACE_ERROR("Warning: BTM_ReadLocalExtendedFeatures page %d unknown",
page_number);
return NULL;
}
@@ -1883,7 +1935,7 @@
{
void *p_buf;
- BTM_TRACE_EVENT2 ("BTM: BTM_VendorSpecificCommand: Opcode: 0x%04X, ParamLen: %i.",
+ BTM_TRACE_EVENT ("BTM: BTM_VendorSpecificCommand: Opcode: 0x%04X, ParamLen: %i.",
opcode, param_len);
/* Allocate a buffer to hold HCI command plus the callback function */
@@ -1965,7 +2017,7 @@
if (is_register == FALSE)
{
btm_cb.devcb.p_vend_spec_cb[i] = NULL;
- BTM_TRACE_EVENT0("BTM Deregister For VSEvents is successfully");
+ BTM_TRACE_EVENT("BTM Deregister For VSEvents is successfully");
}
return (BTM_SUCCESS);
}
@@ -1977,12 +2029,12 @@
if (free_idx < BTM_MAX_VSE_CALLBACKS)
{
btm_cb.devcb.p_vend_spec_cb[free_idx] = p_cb;
- BTM_TRACE_EVENT0("BTM Register For VSEvents is successfully");
+ BTM_TRACE_EVENT("BTM Register For VSEvents is successfully");
}
else
{
/* No free entries available */
- BTM_TRACE_ERROR0 ("BTM_RegisterForVSEvents: too many callbacks registered");
+ BTM_TRACE_ERROR ("BTM_RegisterForVSEvents: too many callbacks registered");
retval = BTM_NO_RESOURCES;
}
@@ -2007,7 +2059,7 @@
{
UINT8 i;
- BTM_TRACE_DEBUG0 ("BTM Event: Vendor Specific event from controller");
+ BTM_TRACE_DEBUG ("BTM Event: Vendor Specific event from controller");
for (i=0; i<BTM_MAX_VSE_CALLBACKS; i++)
{
@@ -2031,7 +2083,7 @@
*******************************************************************************/
tBTM_STATUS BTM_WritePageTimeout(UINT16 timeout)
{
- BTM_TRACE_EVENT1 ("BTM: BTM_WritePageTimeout: Timeout: %d.", timeout);
+ BTM_TRACE_EVENT ("BTM: BTM_WritePageTimeout: Timeout: %d.", timeout);
/* Send the HCI command */
if (btsnd_hcic_write_page_tout (timeout))
@@ -2055,7 +2107,7 @@
*******************************************************************************/
tBTM_STATUS BTM_WriteVoiceSettings(UINT16 settings)
{
- BTM_TRACE_EVENT1 ("BTM: BTM_WriteVoiceSettings: Settings: 0x%04x.", settings);
+ BTM_TRACE_EVENT ("BTM: BTM_WriteVoiceSettings: Settings: 0x%04x.", settings);
/* Send the HCI command */
if (btsnd_hcic_write_voice_settings ((UINT16)(settings & 0x03ff)))
@@ -2083,7 +2135,7 @@
{
UINT8 cond;
- BTM_TRACE_EVENT0 ("BTM: BTM_EnableTestMode");
+ BTM_TRACE_EVENT ("BTM: BTM_EnableTestMode");
/* set auto accept connection as this is needed during test mode */
/* Allocate a buffer to hold HCI command */
@@ -2170,7 +2222,7 @@
bd_addr = local_bd_addr;
}
- BTM_TRACE_EVENT1 ("BTM: BTM_ReadStoredLinkKey: Read_All: %s",
+ BTM_TRACE_EVENT ("BTM: BTM_ReadStoredLinkKey: Read_All: %s",
read_all_flag ? "TRUE" : "FALSE");
/* Send the HCI command */
@@ -2207,7 +2259,7 @@
if (btm_cb.devcb.p_stored_link_key_cmpl_cb)
return (BTM_BUSY);
- BTM_TRACE_EVENT1 ("BTM: BTM_WriteStoredLinkKey: num_keys: %d", num_keys);
+ BTM_TRACE_EVENT ("BTM: BTM_WriteStoredLinkKey: num_keys: %d", num_keys);
/* Check the maximum number of link keys */
if(num_keys > HCI_MAX_NUM_OF_LINK_KEYS_PER_CMMD)
@@ -2254,7 +2306,7 @@
bd_addr = local_bd_addr;
}
- BTM_TRACE_EVENT1 ("BTM: BTM_DeleteStoredLinkKey: delete_all_flag: %s",
+ BTM_TRACE_EVENT ("BTM: BTM_DeleteStoredLinkKey: delete_all_flag: %s",
delete_all_flag ? "TRUE" : "FALSE");
/* Send the HCI command */
@@ -2300,7 +2352,7 @@
}
else
{
- BTM_TRACE_WARNING1("Read stored link key status %d", result.status);
+ BTM_TRACE_WARNING("Read stored link key status %d", result.status);
result.max_keys = 0;
result.read_keys = 0;
}
diff --git a/stack/btm/btm_inq.c b/stack/btm/btm_inq.c
index 24f91a8..6e7ad87 100644
--- a/stack/btm/btm_inq.c
+++ b/stack/btm/btm_inq.c
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1999-2012 Broadcom Corporation
+ * Copyright (C) 1999-2014 Broadcom Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -183,7 +183,7 @@
BOOLEAN is_limited;
BOOLEAN cod_limited;
- BTM_TRACE_API0 ("BTM_SetDiscoverability");
+ BTM_TRACE_API ("BTM_SetDiscoverability");
#if (BLE_INCLUDED == TRUE && BLE_INCLUDED == TRUE)
if (HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
{
@@ -191,7 +191,7 @@
== BTM_SUCCESS)
{
btm_cb.btm_inq_vars.discoverable_mode &= (~BTM_BLE_DISCOVERABLE_MASK);
- btm_cb.btm_inq_vars.discoverable_mode |= (inq_mode & BTM_BLE_CONNECTABLE_MASK);
+ btm_cb.btm_inq_vars.discoverable_mode |= (inq_mode & BTM_BLE_DISCOVERABLE_MASK);
}
}
inq_mode &= ~BTM_BLE_DISCOVERABLE_MASK;
@@ -212,7 +212,7 @@
if (!interval)
interval = BTM_DEFAULT_DISC_INTERVAL;
- BTM_TRACE_API3 ("BTM_SetDiscoverability: mode %d [NonDisc-0, Lim-1, Gen-2], window 0x%04x, interval 0x%04x",
+ BTM_TRACE_API ("BTM_SetDiscoverability: mode %d [NonDisc-0, Lim-1, Gen-2], window 0x%04x, interval 0x%04x",
inq_mode, window, interval);
/*** Check for valid window and interval parameters ***/
@@ -311,7 +311,7 @@
tBTM_STATUS BTM_SetInquiryScanType (UINT16 scan_type)
{
- BTM_TRACE_API0 ("BTM_SetInquiryScanType");
+ BTM_TRACE_API ("BTM_SetInquiryScanType");
if (scan_type != BTM_SCAN_TYPE_STANDARD && scan_type != BTM_SCAN_TYPE_INTERLACED)
return (BTM_ILLEGAL_VALUE);
@@ -348,7 +348,7 @@
*******************************************************************************/
tBTM_STATUS BTM_SetPageScanType (UINT16 scan_type)
{
- BTM_TRACE_API0 ("BTM_SetPageScanType");
+ BTM_TRACE_API ("BTM_SetPageScanType");
if (scan_type != BTM_SCAN_TYPE_STANDARD && scan_type != BTM_SCAN_TYPE_INTERLACED)
return (BTM_ILLEGAL_VALUE);
@@ -389,7 +389,7 @@
*******************************************************************************/
tBTM_STATUS BTM_SetInquiryMode (UINT8 mode)
{
- BTM_TRACE_API0 ("BTM_SetInquiryMode");
+ BTM_TRACE_API ("BTM_SetInquiryMode");
if (mode == BTM_INQ_RESULT_STANDARD)
{
/* mandatory mode */
@@ -434,7 +434,7 @@
*******************************************************************************/
UINT16 BTM_ReadDiscoverability (UINT16 *p_window, UINT16 *p_interval)
{
- BTM_TRACE_API0 ("BTM_ReadDiscoverability");
+ BTM_TRACE_API ("BTM_ReadDiscoverability");
if (p_window)
*p_window = btm_cb.btm_inq_vars.inq_scan_window;
@@ -480,7 +480,7 @@
tBTM_STATUS status;
tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars;
- BTM_TRACE_API6 ("BTM_SetPeriodicInquiryMode: mode: %d, dur: %d, rsps: %d, flt: %d, min: %d, max: %d",
+ BTM_TRACE_API ("BTM_SetPeriodicInquiryMode: mode: %d, dur: %d, rsps: %d, flt: %d, min: %d, max: %d",
p_inqparms->mode, p_inqparms->duration, p_inqparms->max_resps,
p_inqparms->filter_cond_type, min_delay, max_delay);
@@ -524,7 +524,7 @@
(BTM_GENERAL_INQUIRY_ACTIVE | BTM_PERIODIC_INQUIRY_ACTIVE));
#if (defined(BTM_BYPASS_EVENT_FILTERING) && BTM_BYPASS_EVENT_FILTERING == TRUE)
- BTM_TRACE_WARNING0("BTM: Bypassing event filtering...");
+ BTM_TRACE_WARNING("BTM: Bypassing event filtering...");
p_inq->state = BTM_INQ_ACTIVE_STATE;
p_inq->inqfilt_active = FALSE;
@@ -573,7 +573,7 @@
{
tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars;
tBTM_STATUS status = BTM_SUCCESS;
- BTM_TRACE_API0 ("BTM_CancelPeriodicInquiry called");
+ BTM_TRACE_API ("BTM_CancelPeriodicInquiry called");
/*** Make sure the device is ready ***/
if (!BTM_IsDeviceUp())
@@ -619,7 +619,7 @@
UINT8 scan_mode = 0;
tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars;
- BTM_TRACE_API0 ("BTM_SetConnectability");
+ BTM_TRACE_API ("BTM_SetConnectability");
#if (BLE_INCLUDED == TRUE && BLE_INCLUDED == TRUE)
if (HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
@@ -649,7 +649,7 @@
if (!interval)
interval = BTM_DEFAULT_CONN_INTERVAL;
- BTM_TRACE_API3 ("BTM_SetConnectability: mode %d [NonConn-0, Conn-1], window 0x%04x, interval 0x%04x",
+ BTM_TRACE_API ("BTM_SetConnectability: mode %d [NonConn-0, Conn-1], window 0x%04x, interval 0x%04x",
page_mode, window, interval);
/*** Check for valid window and interval parameters ***/
@@ -708,7 +708,7 @@
*******************************************************************************/
UINT16 BTM_ReadConnectability (UINT16 *p_window, UINT16 *p_interval)
{
- BTM_TRACE_API0 ("BTM_ReadConnectability");
+ BTM_TRACE_API ("BTM_ReadConnectability");
if (p_window)
*p_window = btm_cb.btm_inq_vars.page_scan_window;
@@ -734,7 +734,7 @@
*******************************************************************************/
UINT16 BTM_IsInquiryActive (void)
{
- BTM_TRACE_API0 ("BTM_IsInquiryActive");
+ BTM_TRACE_API ("BTM_IsInquiryActive");
return(btm_cb.btm_inq_vars.inq_active);
}
@@ -759,7 +759,7 @@
#if (defined(BTA_HOST_INTERLEAVE_SEARCH) && BTA_HOST_INTERLEAVE_SEARCH == TRUE)
UINT8 active_mode=p_inq->inq_active;
#endif
- BTM_TRACE_API0 ("BTM_CancelInquiry called");
+ BTM_TRACE_API ("BTM_CancelInquiry called");
/*** Make sure the device is ready ***/
if (!BTM_IsDeviceUp())
@@ -796,10 +796,10 @@
#if BLE_INCLUDED == TRUE
if (((p_inq->inqparms.mode & BTM_BLE_INQUIRY_MASK) != 0)
#if (defined(BTA_HOST_INTERLEAVE_SEARCH) && BTA_HOST_INTERLEAVE_SEARCH == TRUE)
- &&(active_mode & BTM_LE_INQ_ACTIVE_MASK)
+ &&(active_mode & BTM_BLE_INQ_ACTIVE_MASK)
#endif
)
- btm_ble_stop_scan();
+ btm_ble_stop_inquiry();
#endif
}
@@ -853,7 +853,7 @@
tBTM_STATUS status = BTM_CMD_STARTED;
tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars;
- BTM_TRACE_API4 ("BTM_StartInquiry: mode: %d, dur: %d, rsps: %d, flt: %d",
+ BTM_TRACE_API ("BTM_StartInquiry: mode: %d, dur: %d, rsps: %d, flt: %d",
p_inqparms->mode, p_inqparms->duration, p_inqparms->max_resps,
p_inqparms->filter_cond_type);
@@ -865,18 +865,17 @@
/*check if LE observe is already running*/
if(p_inq->scan_type==INQ_LE_OBSERVE && p_inq->p_inq_ble_results_cb!=NULL)
{
- BTM_TRACE_API0("BTM_StartInquiry: LE observe in progress");
+ BTM_TRACE_API("BTM_StartInquiry: LE observe in progress");
p_inq->scan_type = INQ_GENERAL;
p_inq->inq_active = BTM_INQUIRY_INACTIVE;
btm_cb.ble_ctr_cb.inq_var.scan_type = BTM_BLE_SCAN_MODE_NONE;
- btm_cb.ble_ctr_cb.inq_var.proc_mode = BTM_BLE_INQUIRY_NONE;
btsnd_hcic_ble_set_scan_enable (BTM_BLE_SCAN_DISABLE, BTM_BLE_DUPLICATE_ENABLE);
}
else
#endif
{
return (BTM_BUSY);
- BTM_TRACE_API0("BTM_StartInquiry: return BUSY");
+ BTM_TRACE_API("BTM_StartInquiry: return BUSY");
}
}
else
@@ -911,7 +910,7 @@
p_inq->inq_cmpl_info.num_resp = 0; /* Clear the results counter */
p_inq->inq_active = p_inqparms->mode;
- BTM_TRACE_DEBUG1("BTM_StartInquiry: p_inq->inq_active = 0x%02x", p_inq->inq_active);
+ BTM_TRACE_DEBUG("BTM_StartInquiry: p_inq->inq_active = 0x%02x", p_inq->inq_active);
/* interleave scan minimal conditions */
#if (BLE_INCLUDED==TRUE && (defined(BTA_HOST_INTERLEAVE_SEARCH) && BTA_HOST_INTERLEAVE_SEARCH == TRUE))
@@ -919,13 +918,13 @@
/* check if both modes are present */
if((p_inqparms->mode & BTM_BLE_INQUIRY_MASK) && (p_inqparms->mode & BTM_BR_INQUIRY_MASK))
{
- BTM_TRACE_API0("BTM:Interleave Inquiry Mode Set");
+ BTM_TRACE_API("BTM:Interleave Inquiry Mode Set");
p_inqparms->duration=p_inqparms->intl_duration[p_inq->next_state];
p_inq->inqparms.duration=p_inqparms->duration;
}
else
{
- BTM_TRACE_API1("BTM:Single Mode: No interleaving, Mode:0x%02x", p_inqparms->mode);
+ BTM_TRACE_API("BTM:Single Mode: No interleaving, Mode:0x%02x", p_inqparms->mode);
p_inq->next_state=BTM_NO_INTERLEAVING;
}
#endif
@@ -944,7 +943,7 @@
{
#if (defined(BTA_HOST_INTERLEAVE_SEARCH) && BTA_HOST_INTERLEAVE_SEARCH == TRUE)
p_inq->inq_active = (p_inqparms->mode & BTM_BLE_INQUIRY_MASK);
- BTM_TRACE_API2("BTM:Starting LE Scan with duration %d and activeMode:0x%02x",
+ BTM_TRACE_API("BTM:Starting LE Scan with duration %d and activeMode:0x%02x",
p_inqparms->duration, (p_inqparms->mode & BTM_BLE_INQUIRY_MASK));
#endif
if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
@@ -956,7 +955,7 @@
else if ((status = btm_ble_start_inquiry((UINT8)(p_inqparms->mode & BTM_BLE_INQUIRY_MASK),
p_inqparms->duration)) != BTM_CMD_STARTED)
{
- BTM_TRACE_ERROR0("Err Starting LE Inquiry.");
+ BTM_TRACE_ERROR("Err Starting LE Inquiry.");
p_inq->inqparms.mode &= ~ BTM_BLE_INQUIRY_MASK;
}
#if (!defined(BTA_HOST_INTERLEAVE_SEARCH) || BTA_HOST_INTERLEAVE_SEARCH == FALSE)
@@ -970,7 +969,7 @@
}
else
{
- BTM_TRACE_API1("BTM:Interleaving: started LE scan, Advancing to next state: %d",
+ BTM_TRACE_API("BTM:Interleaving: started LE scan, Advancing to next state: %d",
p_inq->next_state+1);
p_inq->next_state+=1;
}
@@ -983,7 +982,7 @@
#endif
- BTM_TRACE_DEBUG1("BTM_StartInquiry: mode = %02x", p_inqparms->mode);
+ BTM_TRACE_DEBUG("BTM_StartInquiry: mode = %02x", p_inqparms->mode);
}
#endif /* end of BLE_INCLUDED */
@@ -999,7 +998,7 @@
p_inq->inq_active = (p_inqparms->mode & BTM_BR_INQUIRY_MASK);
#endif
#if (defined(BTM_BYPASS_EVENT_FILTERING) && BTM_BYPASS_EVENT_FILTERING == TRUE)
- BTM_TRACE_WARNING0("BTM: Bypassing event filtering...");
+ BTM_TRACE_WARNING("BTM: Bypassing event filtering...");
p_inq->inqfilt_active = FALSE;
btm_initiate_inquiry (p_inq);
status = BTM_CMD_STARTED;
@@ -1038,7 +1037,7 @@
p_inq->next_state=BTM_FINISH;
else
{
- BTM_TRACE_API1("BTM:Interleaving: Started BTM inq, Advancing to next state: %d",
+ BTM_TRACE_API("BTM:Interleaving: Started BTM inq, Advancing to next state: %d",
p_inq->next_state+1);
p_inq->next_state+=1;
}
@@ -1048,7 +1047,7 @@
/* Some error beginning the scan process.
Reset the next_state parameter.. Do we need to reset the inq_active also?
*/
- BTM_TRACE_API1("BTM:Interleaving: Error in Starting inquiry, status: 0x%02x", status);
+ BTM_TRACE_API("BTM:Interleaving: Error in Starting inquiry, status: 0x%02x", status);
p_inq->next_state=BTM_BR_ONE;
}
#endif
@@ -1080,12 +1079,13 @@
** BTM_WRONG_MODE if the device is not up.
**
*******************************************************************************/
-tBTM_STATUS BTM_ReadRemoteDeviceName (BD_ADDR remote_bda, tBTM_CMPL_CB *p_cb)
+tBTM_STATUS BTM_ReadRemoteDeviceName (BD_ADDR remote_bda, tBTM_CMPL_CB *p_cb
+ ,tBT_TRANSPORT transport)
{
tBTM_INQ_INFO *p_cur = NULL;
tINQ_DB_ENT *p_i;
- BTM_TRACE_API6 ("BTM_ReadRemoteDeviceName: bd addr [%02x%02x%02x%02x%02x%02x]",
+ BTM_TRACE_API ("BTM_ReadRemoteDeviceName: bd addr [%02x%02x%02x%02x%02x%02x]",
remote_bda[0], remote_bda[1], remote_bda[2],
remote_bda[3], remote_bda[4], remote_bda[5]);
@@ -1098,10 +1098,10 @@
p_cur->remote_name_state = BTM_INQ_RMT_NAME_EMPTY;
#endif
}
- BTM_TRACE_API0 ("no device found in inquiry db");
+ BTM_TRACE_API ("no device found in inquiry db");
#if (BLE_INCLUDED == TRUE)
- if (BTM_UseLeLink(remote_bda))
+ if (transport == BT_TRANSPORT_LE)
{
return btm_ble_read_remote_name(remote_bda, p_cur, p_cb);
}
@@ -1132,7 +1132,7 @@
{
tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars;
- BTM_TRACE_API0 ("BTM_CancelRemoteDeviceName()");
+ BTM_TRACE_API ("BTM_CancelRemoteDeviceName()");
/* Make sure there is not already one in progress */
if (p_inq->remname_active)
@@ -1237,7 +1237,7 @@
UINT16 xx;
tINQ_DB_ENT *p_ent = btm_cb.btm_inq_vars.inq_db;
- BTM_TRACE_API6 ("BTM_InqDbRead: bd addr [%02x%02x%02x%02x%02x%02x]",
+ BTM_TRACE_API ("BTM_InqDbRead: bd addr [%02x%02x%02x%02x%02x%02x]",
p_bda[0], p_bda[1], p_bda[2], p_bda[3], p_bda[4], p_bda[5]);
for (xx = 0; xx < BTM_INQ_DB_SIZE; xx++, p_ent++)
@@ -1583,7 +1583,7 @@
UINT8 normal_active = (BTM_GENERAL_INQUIRY_ACTIVE|BTM_LIMITED_INQUIRY_ACTIVE);
#if (BTM_INQ_DEBUG == TRUE)
- BTM_TRACE_DEBUG4 ("btm_inq_stop_on_ssp: no_inc_ssp=%d inq_active:0x%x state:%d inqfilt_active:%d",
+ BTM_TRACE_DEBUG ("btm_inq_stop_on_ssp: no_inc_ssp=%d inq_active:0x%x state:%d inqfilt_active:%d",
btm_cb.btm_inq_vars.no_inc_ssp, btm_cb.btm_inq_vars.inq_active, btm_cb.btm_inq_vars.state, btm_cb.btm_inq_vars.inqfilt_active);
#endif
if (btm_cb.btm_inq_vars.no_inc_ssp)
@@ -1639,7 +1639,7 @@
UINT16 xx;
#if (BTM_INQ_DEBUG == TRUE)
- BTM_TRACE_DEBUG2 ("btm_clr_inq_db: inq_active:0x%x state:%d",
+ BTM_TRACE_DEBUG ("btm_clr_inq_db: inq_active:0x%x state:%d",
btm_cb.btm_inq_vars.inq_active, btm_cb.btm_inq_vars.state);
#endif
for (xx = 0; xx < BTM_INQ_DB_SIZE; xx++, p_ent++)
@@ -1661,7 +1661,7 @@
}
}
#if (BTM_INQ_DEBUG == TRUE)
- BTM_TRACE_DEBUG2 ("inq_active:0x%x state:%d",
+ BTM_TRACE_DEBUG ("inq_active:0x%x state:%d",
btm_cb.btm_inq_vars.inq_active, btm_cb.btm_inq_vars.state);
#endif
}
@@ -1847,9 +1847,9 @@
UINT8 *p_cond = condition_buf; /* points to the condition to pass to HCI */
#if (BTM_INQ_DEBUG == TRUE)
- BTM_TRACE_DEBUG1 ("btm_set_inq_event_filter: filter type %d [Clear-0, COD-1, BDADDR-2]",
+ BTM_TRACE_DEBUG ("btm_set_inq_event_filter: filter type %d [Clear-0, COD-1, BDADDR-2]",
filter_cond_type);
- BTM_TRACE_DEBUG6 (" condition [%02x%02x%02x %02x%02x%02x]",
+ BTM_TRACE_DEBUG (" condition [%02x%02x%02x %02x%02x%02x]",
p_filt_cond->bdaddr_cond[0], p_filt_cond->bdaddr_cond[1], p_filt_cond->bdaddr_cond[2],
p_filt_cond->bdaddr_cond[3], p_filt_cond->bdaddr_cond[4], p_filt_cond->bdaddr_cond[5]);
#endif
@@ -1911,7 +1911,7 @@
tBTM_CMPL_CB *p_cb = p_inq->p_inqfilter_cmpl_cb;
#if (BTM_INQ_DEBUG == TRUE)
- BTM_TRACE_DEBUG3 ("btm_event_filter_complete: inq_active:0x%x state:%d inqfilt_active:%d",
+ BTM_TRACE_DEBUG ("btm_event_filter_complete: inq_active:0x%x state:%d inqfilt_active:%d",
btm_cb.btm_inq_vars.inq_active, btm_cb.btm_inq_vars.state, btm_cb.btm_inq_vars.inqfilt_active);
#endif
/* If the filter complete event is from an old or cancelled request, ignore it */
@@ -1930,7 +1930,7 @@
if (hci_status != HCI_SUCCESS)
{
/* If standalone operation, return the error status; if embedded in the inquiry, continue the inquiry */
- BTM_TRACE_WARNING1 ("BTM Warning: Set Event Filter Failed (HCI returned 0x%x)", hci_status);
+ BTM_TRACE_WARNING ("BTM Warning: Set Event Filter Failed (HCI returned 0x%x)", hci_status);
status = BTM_ERR_PROCESSING;
}
else
@@ -2010,7 +2010,7 @@
tBTM_INQ_PARMS *p_inqparms = &p_inq->inqparms;
#if (BTM_INQ_DEBUG == TRUE)
- BTM_TRACE_DEBUG3 ("btm_initiate_inquiry: inq_active:0x%x state:%d inqfilt_active:%d",
+ BTM_TRACE_DEBUG ("btm_initiate_inquiry: inq_active:0x%x state:%d inqfilt_active:%d",
btm_cb.btm_inq_vars.inq_active, btm_cb.btm_inq_vars.state, btm_cb.btm_inq_vars.inqfilt_active);
#endif
#if (defined(BTM_BUSY_LEVEL_CHANGE_INCLUDED) && BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE)
@@ -2046,7 +2046,7 @@
{
p_inq->max_bd_entries = (UINT16)(GKI_MAX_BUF_SIZE / sizeof(tINQ_BDADDR));
memset(p_inq->p_bd_db, 0, GKI_MAX_BUF_SIZE);
-/* BTM_TRACE_DEBUG1("btm_initiate_inquiry: memory allocated for %d bdaddrs",
+/* BTM_TRACE_DEBUG("btm_initiate_inquiry: memory allocated for %d bdaddrs",
p_inq->max_bd_entries); */
}
@@ -2098,7 +2098,7 @@
#endif
#if (BTM_INQ_DEBUG == TRUE)
- BTM_TRACE_DEBUG3 ("btm_process_inq_results inq_active:0x%x state:%d inqfilt_active:%d",
+ BTM_TRACE_DEBUG ("btm_process_inq_results inq_active:0x%x state:%d inqfilt_active:%d",
btm_cb.btm_inq_vars.inq_active, btm_cb.btm_inq_vars.state, btm_cb.btm_inq_vars.inqfilt_active);
#endif
/* Only process the results if the BR inquiry is still active */
@@ -2147,7 +2147,7 @@
)
{
-/* BTM_TRACE_WARNING0("INQ RES: Extra Response Received...ignoring"); */
+/* BTM_TRACE_WARNING("INQ RES: Extra Response Received...ignoring"); */
return;
}
#endif
@@ -2155,7 +2155,7 @@
/* Check if this address has already been processed for this inquiry */
if (btm_inq_find_bdaddr(bda))
{
-/* BTM_TRACE_DEBUG6("BDA seen before [%02x%02x %02x%02x %02x%02x]",
+/* BTM_TRACE_DEBUG("BDA seen before [%02x%02x %02x%02x %02x%02x]",
bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]);*/
/* By default suppose no update needed */
i_rssi = (INT8)rssi;
@@ -2170,7 +2170,7 @@
))
{
p_cur = &p_i->inq_info.results;
- BTM_TRACE_DEBUG2("update RSSI new:%d, old:%d", i_rssi, p_cur->rssi);
+ BTM_TRACE_DEBUG("update RSSI new:%d, old:%d", i_rssi, p_cur->rssi);
p_cur->rssi = i_rssi;
update = TRUE;
}
@@ -2261,12 +2261,12 @@
#endif
)
{
-/* BTM_TRACE_DEBUG0("BTMINQ: Found devices, cancelling inquiry..."); */
+/* BTM_TRACE_DEBUG("BTMINQ: Found devices, cancelling inquiry..."); */
btsnd_hcic_inq_cancel();
#if BLE_INCLUDED == TRUE
if ((p_inq->inqparms.mode & BTM_BLE_INQUIRY_MASK) != 0)
- btm_ble_stop_scan();
+ btm_ble_stop_inquiry();
#endif
@@ -2432,7 +2432,7 @@
#if (BTM_INQ_DEBUG == TRUE)
- BTM_TRACE_DEBUG3 ("btm_process_inq_complete inq_active:0x%x state:%d inqfilt_active:%d",
+ BTM_TRACE_DEBUG ("btm_process_inq_complete inq_active:0x%x state:%d inqfilt_active:%d",
btm_cb.btm_inq_vars.inq_active, btm_cb.btm_inq_vars.state, btm_cb.btm_inq_vars.inqfilt_active);
#endif
#if (defined(BTM_BUSY_LEVEL_CHANGE_INCLUDED) && BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE)
@@ -2486,21 +2486,20 @@
p_inq->p_inq_cmpl_cb = (tBTM_CMPL_CB *) NULL;
/* If we have a callback registered for inquiry complete, call it */
- BTM_TRACE_DEBUG2 ("BTM Inq Compl Callback: status 0x%02x, num results %d",
+ BTM_TRACE_DEBUG ("BTM Inq Compl Callback: status 0x%02x, num results %d",
p_inq->inq_cmpl_info.status, p_inq->inq_cmpl_info.num_resp);
if (p_inq_cb)
(p_inq_cb)((tBTM_INQUIRY_CMPL *) &p_inq->inq_cmpl_info);
}
#if (defined(BTA_HOST_INTERLEAVE_SEARCH) && BTA_HOST_INTERLEAVE_SEARCH == TRUE)
- if(p_inq->inqparms.mode != 0 && !(p_inq->inq_active & BTM_PERIODIC_INQUIRY_ACTIVE))
- {
- /* make inquiry inactive for next iteration */
- p_inq->inq_active = BTM_INQUIRY_INACTIVE;
- /* call the inquiry again */
- BTM_StartInquiry(&p_inq->inqparms,p_inq->p_inq_results_cb,p_inq->p_inq_cmpl_cb);
- return;
- }
+ if(p_inq->inqparms.mode != 0 && !(p_inq->inq_active & BTM_PERIODIC_INQUIRY_ACTIVE))
+ {
+ /* make inquiry inactive for next iteration */
+ p_inq->inq_active = BTM_INQUIRY_INACTIVE;
+ /* call the inquiry again */
+ BTM_StartInquiry(&p_inq->inqparms,p_inq->p_inq_results_cb,p_inq->p_inq_cmpl_cb);
+ }
#endif
}
if(p_inq->inqparms.mode == 0 && p_inq->scan_type == INQ_GENERAL)//this inquiry is complete
@@ -2510,13 +2509,13 @@
/* check if the LE observe is pending */
if(p_inq->p_inq_ble_results_cb != NULL)
{
- BTM_TRACE_DEBUG0("BTM Inq Compl: resuming a pending LE scan");
+ BTM_TRACE_DEBUG("BTM Inq Compl: resuming a pending LE scan");
BTM_BleObserve(1,0, p_inq->p_inq_ble_results_cb, p_inq->p_inq_ble_cmpl_cb);
}
#endif
}
#if (BTM_INQ_DEBUG == TRUE)
- BTM_TRACE_DEBUG3 ("inq_active:0x%x state:%d inqfilt_active:%d",
+ BTM_TRACE_DEBUG ("inq_active:0x%x state:%d inqfilt_active:%d",
btm_cb.btm_inq_vars.inq_active, btm_cb.btm_inq_vars.state, btm_cb.btm_inq_vars.inqfilt_active);
#endif
}
@@ -2686,12 +2685,12 @@
if (bda != NULL)
{
- BTM_TRACE_EVENT6("BDA %02x:%02x:%02x:%02x:%02x:%02x",bda[0], bda[1],
+ BTM_TRACE_EVENT("BDA %02x:%02x:%02x:%02x:%02x:%02x",bda[0], bda[1],
bda[2], bda[3],
bda[4], bda[5]);
}
- BTM_TRACE_EVENT6("Inquire BDA %02x:%02x:%02x:%02x:%02x:%02x",p_inq->remname_bda[0], p_inq->remname_bda[1],
+ BTM_TRACE_EVENT("Inquire BDA %02x:%02x:%02x:%02x:%02x:%02x",p_inq->remname_bda[0], p_inq->remname_bda[1],
p_inq->remname_bda[2], p_inq->remname_bda[3],
p_inq->remname_bda[4], p_inq->remname_bda[5]);
@@ -2857,7 +2856,7 @@
*******************************************************************************/
void btm_inq_rmt_name_failed (void)
{
- BTM_TRACE_ERROR1 ("btm_inq_rmt_name_failed() remname_active=%d", btm_cb.btm_inq_vars.remname_active);
+ BTM_TRACE_ERROR ("btm_inq_rmt_name_failed() remname_active=%d", btm_cb.btm_inq_vars.remname_active);
if (btm_cb.btm_inq_vars.remname_active)
btm_process_remote_name (btm_cb.btm_inq_vars.remname_bda, NULL, 0, HCI_ERR_UNSPECIFIED);
@@ -2893,7 +2892,7 @@
results.status = BTM_SUCCESS;
STREAM_TO_UINT8 (results.tx_power, p);
- BTM_TRACE_EVENT2 ("BTM INQ TX POWER Complete: tx_power %d, hci status 0x%02x",
+ BTM_TRACE_EVENT ("BTM INQ TX POWER Complete: tx_power %d, hci status 0x%02x",
results.tx_power, results.hci_status);
}
else
@@ -2921,7 +2920,7 @@
#if (BTM_EIR_SERVER_INCLUDED == TRUE)
if (HCI_EXT_INQ_RSP_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_0]))
{
- BTM_TRACE_API0("Write Extended Inquiry Response to controller");
+ BTM_TRACE_API("Write Extended Inquiry Response to controller");
btsnd_hcic_write_ext_inquiry_response (p_buff, BTM_EIR_DEFAULT_FEC_REQUIRED);
return BTM_SUCCESS;
}
@@ -2955,7 +2954,7 @@
UINT8 *p = p_eir;
UINT8 length;
UINT8 eir_type;
- BTM_TRACE_API1("BTM_CheckEirData type=0x%02X", type);
+ BTM_TRACE_API("BTM_CheckEirData type=0x%02X", type);
STREAM_TO_UINT8(length, p);
while( length && (p - p_eir <= HCI_EXT_INQ_RESPONSE_LEN))
@@ -3197,19 +3196,19 @@
if( *p_num_uuid > max_num_uuid )
{
- BTM_TRACE_WARNING2("BTM_GetEirUuidList number of uuid in EIR = %d, size of uuid list = %d",
+ BTM_TRACE_WARNING("BTM_GetEirUuidList number of uuid in EIR = %d, size of uuid list = %d",
*p_num_uuid, max_num_uuid );
*p_num_uuid = max_num_uuid;
}
- BTM_TRACE_DEBUG2("BTM_GetEirUuidList type = %02X, number of uuid = %d", type, *p_num_uuid );
+ BTM_TRACE_DEBUG("BTM_GetEirUuidList type = %02X, number of uuid = %d", type, *p_num_uuid );
if( uuid_size == LEN_UUID_16 )
{
for( yy = 0; yy < *p_num_uuid; yy++ )
{
STREAM_TO_UINT16(*(p_uuid16 + yy), p_uuid_data);
- BTM_TRACE_DEBUG1(" 0x%04X", *(p_uuid16 + yy));
+ BTM_TRACE_DEBUG(" 0x%04X", *(p_uuid16 + yy));
}
}
else if( uuid_size == LEN_UUID_32 )
@@ -3217,7 +3216,7 @@
for( yy = 0; yy < *p_num_uuid; yy++ )
{
STREAM_TO_UINT32(*(p_uuid32 + yy), p_uuid_data);
- BTM_TRACE_DEBUG1(" 0x%08X", *(p_uuid32 + yy));
+ BTM_TRACE_DEBUG(" 0x%08X", *(p_uuid32 + yy));
}
}
else if( uuid_size == LEN_UUID_128 )
@@ -3227,7 +3226,7 @@
STREAM_TO_ARRAY16(p_uuid_list + yy * LEN_UUID_128, p_uuid_data);
for( xx = 0; xx < LEN_UUID_128; xx++ )
sprintf(buff + xx*2, "%02X", *(p_uuid_list + yy * LEN_UUID_128 + xx));
- BTM_TRACE_DEBUG1(" 0x%s", buff);
+ BTM_TRACE_DEBUG(" 0x%s", buff);
}
}
@@ -3350,7 +3349,7 @@
}
break;
default:
- BTM_TRACE_WARNING0("btm_convert_uuid_to_uuid16 invalid uuid size");
+ BTM_TRACE_WARNING("btm_convert_uuid_to_uuid16 invalid uuid size");
break;
}
@@ -3388,7 +3387,7 @@
p_results->eir_complete_list = FALSE;
}
- BTM_TRACE_API1("btm_set_eir_uuid eir_complete_list=0x%02X", p_results->eir_complete_list);
+ BTM_TRACE_API("btm_set_eir_uuid eir_complete_list=0x%02X", p_results->eir_complete_list);
if( p_uuid_data )
{
@@ -3422,9 +3421,6 @@
BTM_AddEirService( p_results->eir_uuid, uuid16 );
}
}
-
- BTM_TRACE_DEBUG2("btm_set_eir_uuid eir_uuid=0x%08X %08X",
- p_results->eir_uuid[1], p_results->eir_uuid[0] );
}
#endif
diff --git a/stack/btm/btm_int.h b/stack/btm/btm_int.h
index 7865b3e..fcb17bb 100644
--- a/stack/btm/btm_int.h
+++ b/stack/btm/btm_int.h
@@ -46,16 +46,12 @@
typedef char tBTM_LOC_BD_NAME[BTM_MAX_LOC_BD_NAME_LEN + 1];
#endif
-#define BTM_ACL_IS_CONNECTED(bda) (btm_bda_to_acl (bda) != NULL)
+#define BTM_ACL_IS_CONNECTED(bda) (btm_bda_to_acl (bda, BT_TRANSPORT_BR_EDR) != NULL)
/* Definitions for Server Channel Number (SCN) management
*/
#define BTM_MAX_SCN PORT_MAX_RFC_PORTS
-/* Definition for number of the remote device role saved
-*/
-#define BTM_ROLE_DEVICE_NUM 4
-
/* Define masks for supported and exception 2.0 ACL packet types
*/
#define BTM_ACL_SUPPORTED_PKTS_MASK (HCI_PKT_TYPES_MASK_DM1 | \
@@ -119,8 +115,9 @@
#if BTM_PWR_MGR_INCLUDED == FALSE
UINT8 mode;
#endif /* BTM_PWR_MGR_INCLUDED */
+
#if BLE_INCLUDED == TRUE
- UINT8 is_le_link;
+ tBT_TRANSPORT transport;
BD_ADDR conn_addr; /* local device address used for this connection */
UINT8 conn_addr_type; /* local device address type for this connection */
BD_ADDR active_remote_addr; /* remote address used on this connection */
@@ -189,24 +186,29 @@
BD_FEATURES local_lmp_features[HCI_EXT_FEATURES_PAGE_MAX + 1];
#if BLE_INCLUDED == TRUE
+
+ tBTM_CMPL_CB *p_le_test_cmd_cmpl_cb; /* Callback function to be called when
+ LE test mode command has been sent successfully */
+
BD_ADDR read_tx_pwr_addr; /* read TX power target address */
BD_FEATURES local_le_features; /* Local LE Supported features mask for the device */
tBTM_BLE_LOCAL_ID_KEYS id_keys; /* local BLE ID keys */
BT_OCTET16 er; /* BLE encryption key */
+#define BTM_LE_SUPPORT_STATE_SIZE 8
+UINT8 le_supported_states[BTM_LE_SUPPORT_STATE_SIZE];
+
+
+
#if BTM_BLE_CONFORMANCE_TESTING == TRUE
BOOLEAN no_disc_if_pair_fail;
- BOOLEAN enable_test_mac_val;
+ BOOLEAN enable_test_mac_val;
BT_OCTET8 test_mac;
- BOOLEAN enable_test_local_sign_cntr;
- UINT32 test_local_sign_cntr;
+ BOOLEAN enable_test_local_sign_cntr;
+ UINT32 test_local_sign_cntr;
#endif
-#if BLE_INCLUDED == TRUE
- tBTM_CMPL_CB *p_le_test_cmd_cmpl_cb; /* Callback function to be called when
- LE test mode command has been sent successfully */
-#endif
#endif /* BLE_INCLUDED */
@@ -216,8 +218,9 @@
UINT8 state;
tBTM_IO_CAP loc_io_caps; /* IO capability of the local device */
- BOOLEAN loc_auth_req; /* the auth_req flag */
+ tBTM_AUTH_REQ loc_auth_req; /* the auth_req flag */
BD_FEATURES brcm_features; /* Broadcom specific features bit mask */
+#define BTM_RELOAD_LE_HOST_FEATURE 0x10
#define BTM_RE_READ_1ST_PAGE 0x01 /* Set it if you set at least one of "..._HOST_MAY_SUPP_..." bits */
#define BTM_HOST_MAY_SUPP_SSP 0x02
@@ -504,13 +507,16 @@
tBLE_ADDR_TYPE ble_addr_type; /* LE device type: public or random address */
tBLE_ADDR_TYPE static_addr_type; /* static address type */
BD_ADDR static_addr; /* static address */
-#if BTM_BLE_PRIVACY_SPT == TRUE
+#if BLE_PRIVACY_SPT == TRUE
BD_ADDR cur_rand_addr; /* current random address */
#define BTM_BLE_ADDR_PSEUDO 0 /* address index device record */
#define BTM_BLE_ADDR_RRA 1 /* cur_rand_addr */
-#define BTM_BLE_ADDR_STATIC 2 /* static_addr */
+#define BTM_BLE_ADDR_RECONN 2 /* reconnection address */
+#define BTM_BLE_ADDR_STATIC 3 /* static_addr */
UINT8 active_addr_type;
+
+ BOOLEAN privacy_enabled; /* remote device privacy enabled or not */
#endif
#if SMP_INCLUDED == TRUE
@@ -519,6 +525,7 @@
#endif
} tBTM_SEC_BLE;
+
#endif /* BLE_INCLUDED */
/*
@@ -546,8 +553,14 @@
#define BTM_SEC_LINK_KEY_AUTHED 0x20
#define BTM_SEC_ROLE_SWITCHED 0x40
#define BTM_SEC_IN_USE 0x80
+ /* LE link security flag */
+#define BTM_SEC_LE_AUTHENTICATED 0x0200 /* 0x0200 */
+#define BTM_SEC_LE_ENCRYPTED 0x0400 /* 0x04 */
+#define BTM_SEC_LE_NAME_KNOWN 0x0800
+#define BTM_SEC_LE_LINK_KEY_KNOWN 0x1000 /* 0x10 */
+#define BTM_SEC_LE_LINK_KEY_AUTHED 0x2000
- UINT8 sec_flags; /* Current device security state */
+ UINT16 sec_flags; /* Current device security state */
tBTM_BD_NAME sec_bd_name; /* User friendly name of the device. (may be truncated to save space in dev_rec table) */
BD_FEATURES features[HCI_EXT_FEATURES_PAGE_MAX + 1]; /* Features supported by the device */
@@ -586,9 +599,10 @@
#define BTM_SM4_CONN_PEND 0x40 /* set this bit to indicate accepting acl conn; to be cleared on btm_acl_created */
UINT8 sm4; /* BTM_SM4_TRUE, if the peer supports SM4 */
tBTM_IO_CAP rmt_io_caps; /* IO capability of the peer device */
- BOOLEAN rmt_auth_req; /* the auth_req flag as in the IO caps rsp evt */
+ tBTM_AUTH_REQ rmt_auth_req; /* the auth_req flag as in the IO caps rsp evt */
#if (BLE_INCLUDED == TRUE)
+ UINT16 ble_hci_handle; /* use in DUMO connection */
UINT8 enc_key_size; /* current link encryption key size */
tBTM_SEC_BLE ble;
tBT_DEVICE_TYPE device_type;
@@ -612,6 +626,7 @@
#define BTM_SEC_IS_SM4_LEGACY(sm) ((BOOLEAN)(BTM_SM4_KNOWN == ((sm)&BTM_SM4_TRUE)))
#define BTM_SEC_IS_SM4_UNKNOWN(sm) ((BOOLEAN)(BTM_SM4_UNKNOWN == ((sm)&BTM_SM4_TRUE)))
+#define BTM_SEC_LE_MASK (BTM_SEC_LE_AUTHENTICATED|BTM_SEC_LE_ENCRYPTED|BTM_SEC_LE_LINK_KEY_KNOWN|BTM_SEC_LE_LINK_KEY_AUTHED)
/*
** Define device configuration structure
@@ -726,11 +741,13 @@
#define BTM_PAIR_FLAGS_WE_STARTED_DD 0x01 /* We want to do dedicated bonding */
#define BTM_PAIR_FLAGS_PEER_STARTED_DD 0x02 /* Peer initiated dedicated bonding */
-#define BTM_PAIR_FLAGS_DISC_WHEN_DONE 0x04
+#define BTM_PAIR_FLAGS_DISC_WHEN_DONE 0x04 /* Disconnect when done */
#define BTM_PAIR_FLAGS_PIN_REQD 0x08 /* set this bit when pin_callback is called */
#define BTM_PAIR_FLAGS_PRE_FETCH_PIN 0x10 /* set this bit when pre-fetch pin */
#define BTM_PAIR_FLAGS_REJECTED_CONNECT 0x20 /* set this bit when rejected incoming connection */
#define BTM_PAIR_FLAGS_WE_CANCEL_DD 0x40 /* set this bit when cancelling a bonding procedure */
+#define BTM_PAIR_FLAGS_LE_ACTIVE 0x80 /* use this bit when SMP pairing is active */
+
typedef struct
{
@@ -827,6 +844,7 @@
BT_OCTET8 enc_rand; /* received rand value from LTK request*/
UINT16 ediv; /* received ediv value from LTK request */
UINT8 key_size;
+ tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
#endif
/* Packet types supported by the local device */
@@ -918,9 +936,6 @@
tBTM_PCM2_ACTION pcm2_action;
#endif
- BD_ADDR previous_connected_remote_addr[BTM_ROLE_DEVICE_NUM];
- UINT8 previous_connected_role[BTM_ROLE_DEVICE_NUM];
- UINT8 front; /* front index of the role table */
} tBTM_CB;
@@ -975,8 +990,8 @@
extern void btm_acl_init (void);
extern void btm_acl_timeout (TIMER_LIST_ENT *p_tle);
extern void btm_acl_created (BD_ADDR bda, DEV_CLASS dc, BD_NAME bdn,
- UINT16 hci_handle, UINT8 link_role, UINT8 is_le_link);
-extern void btm_acl_removed (BD_ADDR bda);
+ UINT16 hci_handle, UINT8 link_role, tBT_TRANSPORT transport);
+extern void btm_acl_removed (BD_ADDR bda, tBT_TRANSPORT transport);
extern void btm_acl_device_down (void);
extern void btm_acl_update_busy_level (tBTM_BLI_EVENT event);
extern void btm_acl_link_key_change (UINT16 handle, UINT8 status);
@@ -995,17 +1010,19 @@
extern void btm_acl_role_changed (UINT8 hci_status, BD_ADDR bd_addr, UINT8 new_role);
extern void btm_acl_encrypt_change (UINT16 handle, UINT8 status, UINT8 encr_enable);
BTM_API extern UINT16 btm_get_acl_disc_reason_code (void);
-BTM_API extern tBTM_STATUS btm_remove_acl (BD_ADDR bd_addr);
+BTM_API extern tBTM_STATUS btm_remove_acl (BD_ADDR bd_addr, tBT_TRANSPORT transport);
extern void btm_read_remote_features_complete (UINT8 *p);
extern void btm_read_remote_ext_features_complete (UINT8 *p);
extern void btm_read_remote_ext_features_failed (UINT8 status, UINT16 handle);
extern void btm_read_remote_version_complete (UINT8 *p);
+extern void btm_establish_continue (tACL_CONN *p_acl_cb);
+
// btla-specific ++
extern void btm_acl_chk_peer_pkt_type_support (tACL_CONN *p, UINT16 *p_pkt_type);
// btla-specific --
/* Read maximum data packet that can be sent over current connection */
extern UINT16 btm_get_max_packet_size (BD_ADDR addr);
-extern tACL_CONN *btm_bda_to_acl (BD_ADDR bda);
+extern tACL_CONN *btm_bda_to_acl (BD_ADDR bda, tBT_TRANSPORT transport);
extern BOOLEAN btm_acl_notif_conn_collision (BD_ADDR bda);
#if BTM_PWR_MGR_INCLUDED == FALSE
@@ -1139,7 +1156,7 @@
extern void btm_sec_link_key_request (UINT8 *p_bda);
extern void btm_sec_pin_code_request (UINT8 *p_bda);
extern void btm_sec_update_clock_offset (UINT16 handle, UINT16 clock_offset);
-extern void btm_sec_dev_rec_cback_event (tBTM_SEC_DEV_REC *p_dev_rec, UINT8 res);
+extern void btm_sec_dev_rec_cback_event (tBTM_SEC_DEV_REC *p_dev_rec, UINT8 res, BOOLEAN is_le_trasnport);
#if BLE_INCLUDED == TRUE
extern void btm_sec_clear_ble_keys (tBTM_SEC_DEV_REC *p_dev_rec);
diff --git a/stack/btm/btm_main.c b/stack/btm/btm_main.c
index 869899d..f3037f6 100644
--- a/stack/btm/btm_main.c
+++ b/stack/btm/btm_main.c
@@ -48,7 +48,6 @@
*******************************************************************************/
void btm_init (void)
{
- UINT8 i;
/* All fields are cleared; nonzero fields are reinitialized in appropriate function */
memset(&btm_cb, 0, sizeof(tBTM_CB));
@@ -57,9 +56,6 @@
#else
btm_cb.trace_level = BT_TRACE_LEVEL_NONE; /* No traces */
#endif
- for (i = 0; i < BTM_ROLE_DEVICE_NUM; i++) {
- btm_cb.previous_connected_role[i] = BTM_ROLE_UNDEFINED;
- }
/* Initialize BTM component structures */
btm_inq_db_init(); /* Inquiry Database and Structures */
btm_acl_init(); /* ACL Database and Structures */
diff --git a/stack/btm/btm_pm.c b/stack/btm/btm_pm.c
index 02e3a6a..76bfc04 100644
--- a/stack/btm/btm_pm.c
+++ b/stack/btm/btm_pm.c
@@ -197,7 +197,7 @@
if(p_mode == NULL)
return BTM_ILLEGAL_VALUE;
- BTM_TRACE_API3( "BTM_SetPowerMode: pm_id %d BDA: %08x mode:0x%x", pm_id,
+ BTM_TRACE_API( "BTM_SetPowerMode: pm_id %d BDA: %08x mode:0x%x", pm_id,
(remote_bda[2]<<24)+(remote_bda[3]<<16)+(remote_bda[4]<<8)+remote_bda[5], p_mode->mode);
/* take out the force bit */
@@ -225,7 +225,7 @@
((p_mode->mode & BTM_PM_MD_FORCE) && (p_mode->max >= p_cb->interval) && (p_mode->min <= p_cb->interval)) ||
((p_mode->mode & BTM_PM_MD_FORCE)==0 && (p_mode->max >= p_cb->interval)) )
{
- BTM_TRACE_DEBUG4( "BTM_SetPowerMode: mode:0x%x interval %d max:%d, min:%d", p_mode->mode, p_cb->interval, p_mode->max, p_mode->min);
+ BTM_TRACE_DEBUG( "BTM_SetPowerMode: mode:0x%x interval %d max:%d, min:%d", p_mode->mode, p_cb->interval, p_mode->max, p_mode->min);
return BTM_SUCCESS;
}
}
@@ -240,7 +240,7 @@
|| ((pm_id == BTM_PM_SET_ONLY_ID) && (btm_cb.pm_pend_link != MAX_L2CAP_LINKS)) )
{
#if BTM_PM_DEBUG == TRUE
- BTM_TRACE_DEBUG2( "BTM_SetPowerMode: Saving cmd acl_ind %d temp_pm_id %d", acl_ind,temp_pm_id);
+ BTM_TRACE_DEBUG( "BTM_SetPowerMode: Saving cmd acl_ind %d temp_pm_id %d", acl_ind,temp_pm_id);
#endif
/* Make sure mask is set to BTM_PM_REG_SET */
btm_cb.pm_reg_db[temp_pm_id].mask |= BTM_PM_REG_SET;
@@ -249,7 +249,7 @@
}
#if BTM_PM_DEBUG == TRUE
- BTM_TRACE_DEBUG2( "btm_pm state:0x%x, pm_pend_link: %d", p_cb->state, btm_cb.pm_pend_link);
+ BTM_TRACE_DEBUG( "btm_pm state:0x%x, pm_pend_link: %d", p_cb->state, btm_cb.pm_pend_link);
#endif
/* if mode == hold or pending, return */
if( (p_cb->state == BTM_PM_STS_HOLD) ||
@@ -260,7 +260,7 @@
{
/* set the stored mask */
p_cb->state |= BTM_PM_STORED_MASK;
- BTM_TRACE_DEBUG1( "btm_pm state stored:%d",acl_ind);
+ BTM_TRACE_DEBUG( "btm_pm state stored:%d",acl_ind);
}
return BTM_CMD_STORED;
}
@@ -399,7 +399,7 @@
memset (p_db, 0, sizeof(tBTM_PM_MCB));
p_db->state = BTM_PM_ST_ACTIVE;
#if BTM_PM_DEBUG == TRUE
- BTM_TRACE_DEBUG2( "btm_pm_sm_alloc ind:%d st:%d", ind, p_db->state);
+ BTM_TRACE_DEBUG( "btm_pm_sm_alloc ind:%d st:%d", ind, p_db->state);
#endif
}
@@ -420,10 +420,14 @@
for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p++)
{
- if ((p->in_use) && (!memcmp (p->remote_addr, remote_bda, BD_ADDR_LEN)))
+ if ((p->in_use) && (!memcmp (p->remote_addr, remote_bda, BD_ADDR_LEN))
+#if (BLE_INCLUDED == TRUE)
+ && p->transport == BT_TRANSPORT_BR_EDR
+#endif
+ )
{
#if BTM_PM_DEBUG == TRUE
- BTM_TRACE_DEBUG2( "btm_pm_find_acl_ind ind:%d, st:%d", xx, btm_cb.pm_mode_db[xx].state);
+ BTM_TRACE_DEBUG( "btm_pm_find_acl_ind ind:%d, st:%d", xx, btm_cb.pm_mode_db[xx].state);
#endif
break;
}
@@ -587,7 +591,7 @@
md_res.mode = mode;
#if BTM_PM_DEBUG == TRUE
- BTM_TRACE_DEBUG2( "btm_pm_snd_md_req link_ind:%d, mode: %d",
+ BTM_TRACE_DEBUG( "btm_pm_snd_md_req link_ind:%d, mode: %d",
link_ind, mode);
#endif
@@ -623,7 +627,7 @@
btm_cb.pm_pend_id = pm_id;
#if BTM_PM_DEBUG == TRUE
- BTM_TRACE_DEBUG2("btm_pm_snd_md_req state:0x%x, link_ind: %d", p_cb->state, link_ind);
+ BTM_TRACE_DEBUG("btm_pm_snd_md_req state:0x%x, link_ind: %d", p_cb->state, link_ind);
#endif
switch(md_res.mode)
{
@@ -681,7 +685,7 @@
{
/* the command was not sent */
#if BTM_PM_DEBUG == TRUE
- BTM_TRACE_DEBUG1( "pm_pend_link: %d",btm_cb.pm_pend_link);
+ BTM_TRACE_DEBUG( "pm_pend_link: %d",btm_cb.pm_pend_link);
#endif
return (BTM_NO_RESOURCES);
}
@@ -708,7 +712,7 @@
if(btm_cb.pm_mode_db[xx].state & BTM_PM_STORED_MASK)
{
btm_cb.pm_mode_db[xx].state &= ~BTM_PM_STORED_MASK;
- BTM_TRACE_DEBUG1( "btm_pm_check_stored :%d", xx);
+ BTM_TRACE_DEBUG( "btm_pm_check_stored :%d", xx);
btm_pm_snd_md_req(BTM_PM_SET_ONLY_ID, xx, NULL);
break;
}
@@ -743,7 +747,7 @@
p_cb->state = BTM_PM_ST_PENDING;
pm_status = BTM_PM_STS_PENDING;
#if BTM_PM_DEBUG == TRUE
- BTM_TRACE_DEBUG1( "btm_pm_proc_cmd_status new state:0x%x", p_cb->state);
+ BTM_TRACE_DEBUG( "btm_pm_proc_cmd_status new state:0x%x", p_cb->state);
#endif
}
else /* the command was not successfull. Stay in the same state */
@@ -760,7 +764,7 @@
/* no pending cmd now */
#if BTM_PM_DEBUG == TRUE
- BTM_TRACE_DEBUG3( "btm_pm_proc_cmd_status state:0x%x, pm_pend_link: %d(new: %d)",
+ BTM_TRACE_DEBUG( "btm_pm_proc_cmd_status state:0x%x, pm_pend_link: %d(new: %d)",
p_cb->state, btm_cb.pm_pend_link, MAX_L2CAP_LINKS);
#endif
btm_cb.pm_pend_link = MAX_L2CAP_LINKS;
@@ -803,7 +807,7 @@
{
if(p->restore_pkt_types)
{
- BTM_TRACE_DEBUG3("btm mode change AFTER unsniffing; hci hdl 0x%x, types 0x%02x/0x%02x",
+ BTM_TRACE_DEBUG("btm mode change AFTER unsniffing; hci hdl 0x%x, types 0x%02x/0x%02x",
hci_handle, p->pkt_types_mask, p->restore_pkt_types);
p->pkt_types_mask = p->restore_pkt_types;
p->restore_pkt_types = 0; /* Only exists while SCO is active */
@@ -812,7 +816,7 @@
#if (BTM_PM_SNIFF_SLOT_WORK_AROUND == TRUE)
else
{
- BTM_TRACE_DEBUG2("btm mode change AFTER unsniffing; hci hdl 0x%x, types 0x%02x",
+ BTM_TRACE_DEBUG("btm mode change AFTER unsniffing; hci hdl 0x%x, types 0x%02x",
hci_handle, btm_cb.btm_acl_pkt_types_supported);
btm_set_packet_types (p, btm_cb.btm_acl_pkt_types_supported);
}
@@ -833,7 +837,7 @@
#if (BTM_PM_SNIFF_SLOT_WORK_AROUND == TRUE)
else if (mode == HCI_MODE_SNIFF)
{
- BTM_TRACE_DEBUG1("btm mode change to sniff; hci hdl 0x%x use single slot",
+ BTM_TRACE_DEBUG("btm mode change to sniff; hci hdl 0x%x use single slot",
hci_handle);
btm_set_packet_types (p, (HCI_PKT_TYPES_MASK_DM1 | HCI_PKT_TYPES_MASK_DH1));
}
@@ -845,18 +849,18 @@
p_cb->state = mode;
p_cb->interval = interval;
#if BTM_PM_DEBUG == TRUE
- BTM_TRACE_DEBUG2( "btm_pm_proc_mode_change new state:0x%x (old:0x%x)", p_cb->state, old_state);
+ BTM_TRACE_DEBUG( "btm_pm_proc_mode_change new state:0x%x (old:0x%x)", p_cb->state, old_state);
#endif
- if ((p_cb->state == HCI_MODE_ACTIVE) &&
- ((p_lcb = l2cu_find_lcb_by_bd_addr (p->remote_addr)) != NULL))
+ if ((p_lcb = l2cu_find_lcb_by_bd_addr(p->remote_addr, BT_TRANSPORT_BR_EDR)) != NULL)
{
- /* There might be any pending packets due to SNIFF or PENDING state */
- /* Trigger L2C to start transmission of the pending packets. */
- BTM_TRACE_DEBUG0 ("btm mode change to active; check l2c_link for outgoing packets");
- l2c_link_check_send_pkts (p_lcb, NULL, NULL);
-
- //btu_stop_timer (&p_lcb->timer_entry);
+ if ((p_cb->state == BTM_PM_ST_ACTIVE) || (p_cb->state == BTM_PM_ST_SNIFF))
+ {
+ /* There might be any pending packets due to SNIFF or PENDING state */
+ /* Trigger L2C to start transmission of the pending packets. */
+ BTM_TRACE_DEBUG("btm mode change to active; check l2c_link for outgoing packets");
+ l2c_link_check_send_pkts(p_lcb, NULL, NULL);
+ }
}
/* notify registered parties */
@@ -871,7 +875,7 @@
if(old_state & BTM_PM_STORED_MASK)
{
#if BTM_PM_DEBUG == TRUE
- BTM_TRACE_DEBUG1( "btm_pm_proc_mode_change: Sending stored req:%d", xx);
+ BTM_TRACE_DEBUG( "btm_pm_proc_mode_change: Sending stored req:%d", xx);
#endif
btm_pm_snd_md_req(BTM_PM_SET_ONLY_ID, xx, NULL);
}
@@ -882,7 +886,7 @@
if(btm_cb.pm_mode_db[zz].chg_ind == TRUE)
{
#if BTM_PM_DEBUG == TRUE
- BTM_TRACE_DEBUG1( "btm_pm_proc_mode_change: Sending PM req :%d", zz);
+ BTM_TRACE_DEBUG( "btm_pm_proc_mode_change: Sending PM req :%d", zz);
#endif
btm_pm_snd_md_req(BTM_PM_SET_ONLY_ID, zz, NULL);
break;
@@ -955,7 +959,9 @@
}
}
}
+
#endif
+
#else /* BTM_PWR_MGR_INCLUDED == TRUE */
/*******************************************************************************
@@ -984,6 +990,7 @@
#endif
+
/*******************************************************************************
**
** Function BTM_IsPowerManagerOn
@@ -998,3 +1005,88 @@
{
return BTM_PWR_MGR_INCLUDED;
}
+
+/*******************************************************************************
+**
+** Function btm_pm_device_in_active_or_sniff_mode
+**
+** Description This function is called to check if in active or sniff mode
+**
+** Returns TRUE, if in active or sniff mode
+**
+*******************************************************************************/
+BOOLEAN btm_pm_device_in_active_or_sniff_mode(void)
+{
+ /* The active state is the highest state-includes connected device and sniff mode*/
+
+ /* Covers active and sniff modes */
+ if (btm_cb.num_acl > 0)
+ {
+ BTM_TRACE_DEBUG("btm_pm_device_in_active_or_sniff_mode-acl:%d", btm_cb.num_acl);
+ return TRUE;
+ }
+
+#if ((defined BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
+ /* Check BLE states */
+ if (btm_ble_get_conn_st() != BLE_CONN_IDLE)
+ {
+ BTM_TRACE_DEBUG("btm_pm_device_in_active_or_sniff_mode- BLE state: %x",
+ btm_ble_get_conn_st());
+ return TRUE;
+ }
+#endif
+
+ return FALSE;
+}
+
+/*******************************************************************************
+**
+** Function btm_pm_device_in_scan_state
+**
+** Description This function is called to check if in paging, inquiry or connecting mode
+**
+** Returns TRUE, if in paging, inquiry or connecting mode
+**
+*******************************************************************************/
+BOOLEAN btm_pm_device_in_scan_state(void)
+{
+ /* Scan state-paging, inquiry, and trying to connect */
+
+ /* Check for paging */
+ if (btm_cb.is_paging || btm_cb.page_queue.count > 0 ||
+ BTM_BL_PAGING_STARTED == btm_cb.busy_level)
+ {
+ BTM_TRACE_DEBUG("btm_pm_device_in_scan_state- paging");
+ return TRUE;
+ }
+
+ /* Check for inquiry */
+ if ((btm_cb.btm_inq_vars.inq_active & (BTM_BR_INQ_ACTIVE_MASK | BTM_BLE_INQ_ACTIVE_MASK)) != 0)
+ {
+ BTM_TRACE_DEBUG("btm_pm_device_in_scan_state- Inq active");
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+/*******************************************************************************
+**
+** Function BTM_PM_ReadControllerState
+**
+** Description This function is called to obtain the controller state
+**
+** Returns Controller State-BTM_CONTRL_ACTIVE, BTM_CONTRL_SCAN, and BTM_CONTRL_IDLE
+**
+*******************************************************************************/
+tBTM_CONTRL_STATE BTM_PM_ReadControllerState(void)
+{
+ if (TRUE == btm_pm_device_in_active_or_sniff_mode())
+ return BTM_CONTRL_ACTIVE;
+ else
+ if (TRUE == btm_pm_device_in_scan_state())
+ return BTM_CONTRL_SCAN;
+ else
+ return BTM_CONTRL_IDLE;
+}
+
diff --git a/stack/btm/btm_sco.c b/stack/btm/btm_sco.c
index 2200b71..d9d0fbc 100644
--- a/stack/btm/btm_sco.c
+++ b/stack/btm/btm_sco.c
@@ -162,14 +162,14 @@
{
if (!btsnd_hcic_reject_conn (bda, hci_status))
{
- BTM_TRACE_ERROR0("Could not reject (e)SCO conn: No Buffer!!!");
+ BTM_TRACE_ERROR("Could not reject (e)SCO conn: No Buffer!!!");
}
}
else
{
if (!btsnd_hcic_reject_esco_conn (bda, hci_status))
{
- BTM_TRACE_ERROR0("Could not reject (e)SCO conn: No Buffer!!!");
+ BTM_TRACE_ERROR("Could not reject (e)SCO conn: No Buffer!!!");
}
}
}
@@ -225,7 +225,7 @@
}
else
{
- BTM_TRACE_ERROR0("Could not accept SCO conn: No Buffer!!!");
+ BTM_TRACE_ERROR("Could not accept SCO conn: No Buffer!!!");
}
}
else /* Controller is version 1.1 or earlier */
@@ -260,7 +260,7 @@
p_buf = NULL;
#if BTM_SCO_HCI_DEBUG
- BTM_TRACE_DEBUG1 ("btm: [%d] buf in xmit_data_q", p_ccb->xmit_data_q.count );
+ BTM_TRACE_DEBUG ("btm: [%d] buf in xmit_data_q", p_ccb->xmit_data_q.count );
#endif
p_buf = (BT_HDR *)GKI_dequeue (&p_ccb->xmit_data_q);
@@ -347,7 +347,7 @@
/* Ensure we have enough space in the buffer for the SCO and HCI headers */
if (p_buf->offset < HCI_SCO_PREAMBLE_SIZE)
{
- BTM_TRACE_ERROR1 ("BTM SCO - cannot send buffer, offset: %d", p_buf->offset);
+ BTM_TRACE_ERROR ("BTM SCO - cannot send buffer, offset: %d", p_buf->offset);
GKI_freebuf (p_buf);
status = BTM_ILLEGAL_VALUE;
}
@@ -379,7 +379,7 @@
{
GKI_freebuf(p_buf);
- BTM_TRACE_WARNING2 ("BTM_WriteScoData, invalid sco index: %d at state [%d]",
+ BTM_TRACE_WARNING ("BTM_WriteScoData, invalid sco index: %d at state [%d]",
sco_inx, btm_cb.sco_cb.sco_db[sco_inx].state);
status = BTM_UNKNOWN_ADDR;
}
@@ -437,21 +437,21 @@
if (!HCI_EDR_ESCO_2MPS_SUPPORTED(p_acl->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0]))
{
- BTM_TRACE_WARNING0("BTM Remote does not support 2-EDR eSCO");
+ BTM_TRACE_WARNING("BTM Remote does not support 2-EDR eSCO");
temp_pkt_types |= (HCI_ESCO_PKT_TYPES_MASK_NO_2_EV3 |
HCI_ESCO_PKT_TYPES_MASK_NO_2_EV5);
}
if (!HCI_EDR_ESCO_3MPS_SUPPORTED(p_acl->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0]))
{
- BTM_TRACE_WARNING0("BTM Remote does not support 3-EDR eSCO");
+ BTM_TRACE_WARNING("BTM Remote does not support 3-EDR eSCO");
temp_pkt_types |= (HCI_ESCO_PKT_TYPES_MASK_NO_3_EV3 |
HCI_ESCO_PKT_TYPES_MASK_NO_3_EV5);
}
}
- BTM_TRACE_API6(" txbw 0x%x, rxbw 0x%x, lat 0x%x, voice 0x%x, retrans 0x%02x, pkt 0x%04x",
+ BTM_TRACE_API(" txbw 0x%x, rxbw 0x%x, lat 0x%x, voice 0x%x, retrans 0x%02x, pkt 0x%04x",
p_setup->tx_bw, p_setup->rx_bw,
p_setup->max_latency, p_setup->voice_contfmt,
p_setup->retrans_effort, temp_pkt_types);
@@ -505,7 +505,7 @@
if (sco_inx >= BTM_MAX_SCO_LINKS)
{
- BTM_TRACE_ERROR1("btm_accept_sco_link: Invalid sco_inx(%d)", sco_inx);
+ BTM_TRACE_ERROR("btm_accept_sco_link: Invalid sco_inx(%d)", sco_inx);
return;
}
@@ -515,7 +515,7 @@
p_sco->p_disc_cb = p_disc_cb;
p_sco->esco.data.link_type = BTM_LINK_TYPE_ESCO; /* Accept with all supported types */
- BTM_TRACE_DEBUG1("TCS accept SCO: Packet Types 0x%04x", p_setup->packet_types);
+ BTM_TRACE_DEBUG("TCS accept SCO: Packet Types 0x%04x", p_setup->packet_types);
btm_esco_conn_rsp(sco_inx, HCI_SUCCESS, p_sco->esco.data.bd_addr, p_setup);
#else
@@ -582,7 +582,7 @@
/* If originating, ensure that there is an ACL connection to the BD Address */
if (is_orig)
{
- if ((!remote_bda) || ((acl_handle = BTM_GetHCIConnHandle (remote_bda)) == 0xFFFF))
+ if ((!remote_bda) || ((acl_handle = BTM_GetHCIConnHandle (remote_bda, BT_TRANSPORT_BR_EDR)) == 0xFFFF))
return (BTM_UNKNOWN_ADDR);
}
@@ -682,10 +682,10 @@
{
/* If role change is in progress, do not proceed with SCO setup
* Wait till role change is complete */
- p_acl = btm_bda_to_acl(remote_bda);
+ p_acl = btm_bda_to_acl(remote_bda, BT_TRANSPORT_BR_EDR);
if (p_acl && p_acl->switch_role_state != BTM_ACL_SWKEY_STATE_IDLE)
{
- BTM_TRACE_API1("Role Change is in progress for ACL handle 0x%04x",acl_handle);
+ BTM_TRACE_API("Role Change is in progress for ACL handle 0x%04x",acl_handle);
p->state = SCO_ST_PEND_ROLECHANGE;
}
@@ -696,7 +696,7 @@
{
if (is_orig)
{
- BTM_TRACE_API2("BTM_CreateSco -> (e)SCO Link for ACL handle 0x%04x, Desired Type %d",
+ BTM_TRACE_API("BTM_CreateSco -> (e)SCO Link for ACL handle 0x%04x, Desired Type %d",
acl_handle, btm_cb.sco_cb.desired_sco_mode);
if ((btm_send_connect_request(acl_handle, p_setup)) != BTM_CMD_STARTED)
@@ -740,10 +740,10 @@
for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++)
{
if ((p->state == SCO_ST_PEND_UNPARK) &&
- ((acl_handle = BTM_GetHCIConnHandle (p->esco.data.bd_addr)) == hci_handle))
+ ((acl_handle = BTM_GetHCIConnHandle (p->esco.data.bd_addr, BT_TRANSPORT_BR_EDR)) == hci_handle))
{
- BTM_TRACE_API3("btm_sco_chk_pend_unpark -> (e)SCO Link for ACL handle 0x%04x, Desired Type %d, hci_status 0x%02x",
+ BTM_TRACE_API("btm_sco_chk_pend_unpark -> (e)SCO Link for ACL handle 0x%04x, Desired Type %d, hci_status 0x%02x",
acl_handle, btm_cb.sco_cb.desired_sco_mode, hci_status);
if ((btm_send_connect_request(acl_handle, &p->esco.setup)) == BTM_CMD_STARTED)
@@ -774,10 +774,10 @@
for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++)
{
if ((p->state == SCO_ST_PEND_ROLECHANGE) &&
- ((acl_handle = BTM_GetHCIConnHandle (p->esco.data.bd_addr)) == hci_handle))
+ ((acl_handle = BTM_GetHCIConnHandle (p->esco.data.bd_addr, BT_TRANSPORT_BR_EDR)) == hci_handle))
{
- BTM_TRACE_API1("btm_sco_chk_pend_rolechange -> (e)SCO Link for ACL handle 0x%04x", acl_handle);
+ BTM_TRACE_API("btm_sco_chk_pend_rolechange -> (e)SCO Link for ACL handle 0x%04x", acl_handle);
if ((btm_send_connect_request(acl_handle, &p->esco.setup)) == BTM_CMD_STARTED)
p->state = SCO_ST_CONNECTING;
@@ -878,7 +878,7 @@
#endif
/* If here, no one wants the SCO connection. Reject it */
- BTM_TRACE_WARNING0("btm_sco_conn_req: No one wants this SCO connection; rejecting it");
+ BTM_TRACE_WARNING("btm_sco_conn_req: No one wants this SCO connection; rejecting it");
btm_esco_conn_rsp(BTM_MAX_SCO_LINKS, HCI_ERR_HOST_REJECT_RESOURCES, bda, NULL);
}
@@ -921,7 +921,7 @@
/* If role switch is pending, we need try again after role switch is complete */
if(hci_status == HCI_ERR_ROLE_SWITCH_PENDING)
{
- BTM_TRACE_API1("Role Change pending for HCI handle 0x%04x",hci_handle);
+ BTM_TRACE_API("Role Change pending for HCI handle 0x%04x",hci_handle);
p->state = SCO_ST_PEND_ROLECHANGE;
}
/* avoid calling disconnect callback because of sco creation race */
@@ -1374,17 +1374,17 @@
}
}
p_esco->desired_sco_mode = sco_mode;
- BTM_TRACE_API1("BTM_SetEScoMode -> mode %d", sco_mode);
+ BTM_TRACE_API("BTM_SetEScoMode -> mode %d", sco_mode);
}
else
{
p_esco->desired_sco_mode = BTM_LINK_TYPE_SCO;
p_def->packet_types &= BTM_SCO_LINK_ONLY_MASK;
p_def->retrans_effort = 0;
- BTM_TRACE_API0("BTM_SetEScoMode -> mode SCO (eSCO not supported)");
+ BTM_TRACE_API("BTM_SetEScoMode -> mode SCO (eSCO not supported)");
}
- BTM_TRACE_DEBUG6(" txbw 0x%08x, rxbw 0x%08x, max_lat 0x%04x, voice 0x%04x, pkt 0x%04x, rtx effort 0x%02x",
+ BTM_TRACE_DEBUG(" txbw 0x%08x, rxbw 0x%08x, max_lat 0x%04x, voice 0x%04x, pkt 0x%04x, rtx effort 0x%02x",
p_def->tx_bw, p_def->rx_bw, p_def->max_latency,
p_def->voice_contfmt, p_def->packet_types,
p_def->retrans_effort);
@@ -1451,7 +1451,7 @@
#if (BTM_MAX_SCO_LINKS>0)
UINT8 index;
- BTM_TRACE_API1("BTM_ReadEScoLinkParms -> sco_inx 0x%04x", sco_inx);
+ BTM_TRACE_API("BTM_ReadEScoLinkParms -> sco_inx 0x%04x", sco_inx);
if (sco_inx < BTM_MAX_SCO_LINKS &&
btm_cb.sco_cb.sco_db[sco_inx].state >= SCO_ST_CONNECTED)
@@ -1466,7 +1466,7 @@
{
if (btm_cb.sco_cb.sco_db[index].state >= SCO_ST_CONNECTED)
{
- BTM_TRACE_API1("BTM_ReadEScoLinkParms the first active SCO index is %d",index);
+ BTM_TRACE_API("BTM_ReadEScoLinkParms the first active SCO index is %d",index);
*p_parms = btm_cb.sco_cb.sco_db[index].esco.data;
return (BTM_SUCCESS);
}
@@ -1475,7 +1475,7 @@
#endif
- BTM_TRACE_API0("BTM_ReadEScoLinkParms cannot find the SCO index!");
+ BTM_TRACE_API("BTM_ReadEScoLinkParms cannot find the SCO index!");
memset(p_parms, 0, sizeof(tBTM_ESCO_DATA));
return (BTM_WRONG_MODE);
}
@@ -1522,7 +1522,7 @@
(btm_cb.btm_sco_pkt_types_supported & BTM_SCO_LINK_ONLY_MASK);
- BTM_TRACE_API2("BTM_ChangeEScoLinkParms -> SCO Link for handle 0x%04x, pkt 0x%04x",
+ BTM_TRACE_API("BTM_ChangeEScoLinkParms -> SCO Link for handle 0x%04x, pkt 0x%04x",
p_sco->hci_handle, p_setup->packet_types);
if (!btsnd_hcic_change_conn_type (p_sco->hci_handle,
@@ -1541,8 +1541,8 @@
(btm_cb.btm_sco_pkt_types_supported & BTM_SCO_EXCEPTION_PKTS_MASK));
}
- BTM_TRACE_API1("BTM_ChangeEScoLinkParms -> eSCO Link for handle 0x%04x", p_sco->hci_handle);
- BTM_TRACE_API6(" txbw 0x%x, rxbw 0x%x, lat 0x%x, voice 0x%x, retrans 0x%02x, pkt 0x%04x",
+ BTM_TRACE_API("BTM_ChangeEScoLinkParms -> eSCO Link for handle 0x%04x", p_sco->hci_handle);
+ BTM_TRACE_API(" txbw 0x%x, rxbw 0x%x, lat 0x%x, voice 0x%x, retrans 0x%02x, pkt 0x%04x",
p_setup->tx_bw, p_setup->rx_bw, p_parms->max_latency,
p_setup->voice_contfmt, p_parms->retrans_effort, temp_pkt_types);
@@ -1633,7 +1633,7 @@
tBTM_CHG_ESCO_EVT_DATA data;
UINT16 xx;
- BTM_TRACE_EVENT2("btm_esco_proc_conn_chg -> handle 0x%04x, status 0x%02x",
+ BTM_TRACE_EVENT("btm_esco_proc_conn_chg -> handle 0x%04x, status 0x%02x",
handle, status);
for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++)
diff --git a/stack/btm/btm_sec.c b/stack/btm/btm_sec.c
index 09f41b7..9d7bf5a 100644
--- a/stack/btm/btm_sec.c
+++ b/stack/btm/btm_sec.c
@@ -80,13 +80,19 @@
static UINT8 btm_sec_start_authorization (tBTM_SEC_DEV_REC *p_dev_rec);
BOOLEAN btm_sec_are_all_trusted(UINT32 p_mask[]);
-static tBTM_STATUS btm_sec_send_hci_disconnect (tBTM_SEC_DEV_REC *p_dev_rec, UINT8 reason);
+static tBTM_STATUS btm_sec_send_hci_disconnect (tBTM_SEC_DEV_REC *p_dev_rec, UINT8 reason, UINT16 conn_handle);
+UINT8 btm_sec_start_role_switch (tBTM_SEC_DEV_REC *p_dev_rec);
tBTM_SEC_DEV_REC *btm_sec_find_dev_by_sec_state (UINT8 state);
static BOOLEAN btm_sec_set_security_level ( CONNECTION_TYPE conn_type, char *p_name, UINT8 service_id,
UINT16 sec_level, UINT16 psm, UINT32 mx_proto_id,
UINT32 mx_chan_id);
+static BOOLEAN btm_dev_authenticated(tBTM_SEC_DEV_REC *p_dev_rec);
+static BOOLEAN btm_dev_encrypted(tBTM_SEC_DEV_REC *p_dev_rec);
+static BOOLEAN btm_dev_authorized(tBTM_SEC_DEV_REC *p_dev_rec);
+static BOOLEAN btm_serv_trusted(tBTM_SEC_DEV_REC *p_dev_rec, tBTM_SEC_SERV_REC *p_serv_rec);
+
/* TRUE - authenticated link key is possible */
static const BOOLEAN btm_sec_io_map [BTM_IO_CAP_MAX][BTM_IO_CAP_MAX] =
{
@@ -103,6 +109,78 @@
/*******************************************************************************
**
+** Function btm_dev_authenticated
+**
+** Description check device is authenticated
+**
+** Returns BOOLEAN TRUE or FALSE
+**
+*******************************************************************************/
+static BOOLEAN btm_dev_authenticated (tBTM_SEC_DEV_REC *p_dev_rec)
+{
+ if(p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED)
+ {
+ return(TRUE);
+ }
+ return(FALSE);
+}
+
+/*******************************************************************************
+**
+** Function btm_dev_encrypted
+**
+** Description check device is encrypted
+**
+** Returns BOOLEAN TRUE or FALSE
+**
+*******************************************************************************/
+static BOOLEAN btm_dev_encrypted (tBTM_SEC_DEV_REC *p_dev_rec)
+{
+ if(p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED)
+ {
+ return(TRUE);
+ }
+ return(FALSE);
+}
+
+/*******************************************************************************
+**
+** Function btm_dev_authorized
+**
+** Description check device is authorized
+**
+** Returns BOOLEAN TRUE or FALSE
+**
+*******************************************************************************/
+static BOOLEAN btm_dev_authorized (tBTM_SEC_DEV_REC *p_dev_rec)
+{
+ if(p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED)
+ {
+ return(TRUE);
+ }
+ return(FALSE);
+}
+
+/*******************************************************************************
+**
+** Function btm_serv_trusted
+**
+** Description check service is trusted
+**
+** Returns BOOLEAN TRUE or FALSE
+**
+*******************************************************************************/
+static BOOLEAN btm_serv_trusted(tBTM_SEC_DEV_REC *p_dev_rec, tBTM_SEC_SERV_REC *p_serv_rec)
+{
+ if(BTM_SEC_IS_SERVICE_TRUSTED(p_dev_rec->trusted_mask, p_serv_rec->service_id))
+ {
+ return(TRUE);
+ }
+ return(FALSE);
+}
+
+/*******************************************************************************
+**
** Function BTM_SecRegister
**
** Description Application manager calls this function to register for
@@ -118,36 +196,37 @@
BT_OCTET16 temp_value = {0};
#endif
- BTM_TRACE_EVENT0 ("BTM_Sec: application registered");
+ BTM_TRACE_EVENT ("BTM_Sec: application registered");
#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
- BTM_TRACE_ERROR1 ("BTM_SecRegister:p_cb_info->p_le_callback == 0x%x ", p_cb_info->p_le_callback);
-
if (p_cb_info->p_le_callback)
{
-#if SMP_INCLUDED == TRUE
- BTM_TRACE_EVENT0 ("BTM_Sec: SMP_Register( btm_proc_smp_cback )");
- SMP_Register(btm_proc_smp_cback);
-#endif
- /* if no IR is loaded, need to regenerate all the keys */
- if (memcmp(btm_cb.devcb.id_keys.ir, &temp_value, sizeof(BT_OCTET16)) == 0)
+ BTM_TRACE_ERROR ("BTM_SecRegister:p_cb_info->p_le_callback == 0x%x ", p_cb_info->p_le_callback);
+
+ if (p_cb_info->p_le_callback)
{
- btm_ble_reset_id();
+ #if SMP_INCLUDED == TRUE
+ BTM_TRACE_EVENT ("BTM_Sec: SMP_Register( btm_proc_smp_cback )");
+ SMP_Register(btm_proc_smp_cback);
+ #endif
+ /* if no IR is loaded, need to regenerate all the keys */
+ if (memcmp(btm_cb.devcb.id_keys.ir, &temp_value, sizeof(BT_OCTET16)) == 0)
+ {
+ btm_ble_reset_id();
+ }
+ }
+ else
+ {
+ BTM_TRACE_ERROR ("BTM_SecRegister:p_cb_info->p_le_callback == NULL ");
}
}
- else
- {
- BTM_TRACE_ERROR0 ("BTM_SecRegister:p_cb_info->p_le_callback == NULL ");
- }
#endif
-
-
btm_cb.api = *p_cb_info;
#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
- BTM_TRACE_ERROR1 ("BTM_SecRegister: btm_cb.api.p_le_callback = 0x%x ", btm_cb.api.p_le_callback);
+ BTM_TRACE_ERROR ("BTM_SecRegister: btm_cb.api.p_le_callback = 0x%x ", btm_cb.api.p_le_callback);
#endif
- BTM_TRACE_EVENT0 ("BTM_Sec: application registered");
+ BTM_TRACE_EVENT ("BTM_Sec: application registered");
return(TRUE);
}
@@ -270,10 +349,37 @@
if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL)
{
- *p_sec_flags = p_dev_rec->sec_flags;
+ *p_sec_flags = (UINT8) p_dev_rec->sec_flags;
return(TRUE);
}
- BTM_TRACE_ERROR0 ("BTM_GetSecurityFlags false");
+ BTM_TRACE_ERROR ("BTM_GetSecurityFlags false");
+ return(FALSE);
+}
+
+/*******************************************************************************
+**
+** Function BTM_GetSecurityFlagsByTransport
+**
+** Description Get security flags for the device on a particular transport
+**
+** Returns BOOLEAN TRUE or FALSE is device found
+**
+*******************************************************************************/
+BOOLEAN BTM_GetSecurityFlagsByTransport (BD_ADDR bd_addr, UINT8 * p_sec_flags,
+ tBT_TRANSPORT transport)
+{
+ tBTM_SEC_DEV_REC *p_dev_rec;
+
+ if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL)
+ {
+ if (transport == BT_TRANSPORT_BR_EDR)
+ *p_sec_flags = (UINT8) p_dev_rec->sec_flags;
+ else
+ *p_sec_flags = (UINT8) (p_dev_rec->sec_flags >> 8);
+
+ return(TRUE);
+ }
+ BTM_TRACE_ERROR ("BTM_GetSecurityFlags false");
return(FALSE);
}
@@ -309,7 +415,7 @@
/* the default is enabled */
break;
default:
- BTM_TRACE_ERROR1 ("BTM_SetSecurityMode: unknown mode:%d", security_mode);
+ BTM_TRACE_ERROR ("BTM_SetSecurityMode: unknown mode:%d", security_mode);
return;
}
btm_cb.security_mode = security_mode;
@@ -318,7 +424,7 @@
{
/* Lisbon devices and only use BTM_SEC_MODE_SP */
btm_cb.security_mode = BTM_SEC_MODE_SP;
- BTM_TRACE_DEBUG2("BTM_SetSecurityMode: SP:%d, debug:%d", sp_mode, sp_debug_mode);
+ BTM_TRACE_DEBUG("BTM_SetSecurityMode: SP:%d, debug:%d", sp_mode, sp_debug_mode);
btsnd_hcic_write_simple_pairing_mode(sp_mode);
btsnd_hcic_write_simp_pair_debug_mode(sp_debug_mode);
return;
@@ -331,7 +437,7 @@
if ((old_mode == BTM_SEC_MODE_LINK)
&& ( security_mode != BTM_SEC_MODE_LINK))
{
- BTM_TRACE_DEBUG0("BTM_SetSecurityMode: Authen Enable -> FALSE");
+ BTM_TRACE_DEBUG("BTM_SetSecurityMode: Authen Enable -> FALSE");
btsnd_hcic_write_auth_enable (FALSE);
btsnd_hcic_write_encr_mode (HCI_ENCRYPT_MODE_DISABLED);
}
@@ -341,7 +447,7 @@
if ((old_mode != BTM_SEC_MODE_LINK)
&& ( security_mode == BTM_SEC_MODE_LINK))
{
- BTM_TRACE_DEBUG0("BTM_SetSecurityMode: Authen Enable -> TRUE");
+ BTM_TRACE_DEBUG("BTM_SetSecurityMode: Authen Enable -> TRUE");
btsnd_hcic_write_auth_enable (TRUE);
btsnd_hcic_write_encr_mode (HCI_ENCRYPT_MODE_POINT_TO_POINT);
}
@@ -359,7 +465,7 @@
*******************************************************************************/
void BTM_SetPinType (UINT8 pin_type, PIN_CODE pin_code, UINT8 pin_code_len)
{
- BTM_TRACE_API3 ("BTM_SetPinType: pin type %d [variable-0, fixed-1], code %s, length %d",
+ BTM_TRACE_API ("BTM_SetPinType: pin type %d [variable-0, fixed-1], code %s, length %d",
pin_type, (char *) pin_code, pin_code_len);
/* If device is not up security mode will be set as a part of startup */
@@ -390,7 +496,7 @@
*******************************************************************************/
void BTM_SetPairableMode (BOOLEAN allow_pairing, BOOLEAN connect_only_paired)
{
- BTM_TRACE_API2 ("BTM_SetPairableMode() allow_pairing: %u connect_only_paired: %u", allow_pairing, connect_only_paired);
+ BTM_TRACE_API ("BTM_SetPairableMode() allow_pairing: %u connect_only_paired: %u", allow_pairing, connect_only_paired);
btm_cb.pairing_disabled = !allow_pairing;
btm_cb.connect_only_paired = connect_only_paired;
@@ -571,7 +677,7 @@
if (!record_allocated)
{
- BTM_TRACE_WARNING1("BTM_SEC_REG: Out of Service Records (%d)", BTM_SEC_MAX_SERVICE_RECORDS);
+ BTM_TRACE_WARNING("BTM_SEC_REG: Out of Service Records (%d)", BTM_SEC_MAX_SERVICE_RECORDS);
return(record_allocated);
}
@@ -679,24 +785,24 @@
p_srec->security_flags |= (UINT16)(sec_level | BTM_SEC_IN_USE);
}
- BTM_TRACE_API6("BTM_SEC_REG[%d]: id %d, conn_type 0x%x, psm 0x%04x, proto_id %d, chan_id %d",
+ BTM_TRACE_API("BTM_SEC_REG[%d]: id %d, conn_type 0x%x, psm 0x%04x, proto_id %d, chan_id %d",
index, service_id, conn_type, psm, mx_proto_id, mx_chan_id);
- BTM_TRACE_API2(" : security_flags: 0x%04x, ucd_security_flags: 0x%04x",
+ BTM_TRACE_API(" : security_flags: 0x%04x, ucd_security_flags: 0x%04x",
p_srec->security_flags, p_srec->ucd_security_flags);
#if BTM_SEC_SERVICE_NAME_LEN > 0
- BTM_TRACE_API2(" : service name [%s] (up to %d chars saved)",
+ BTM_TRACE_API(" : service name [%s] (up to %d chars saved)",
p_name, BTM_SEC_SERVICE_NAME_LEN);
#endif
#else
p_srec->security_flags |= (UINT16)(sec_level | BTM_SEC_IN_USE);
- BTM_TRACE_API6("BTM_SEC_REG[%d]: id %d, is_orig %d, psm 0x%04x, proto_id %d, chan_id %d",
+ BTM_TRACE_API("BTM_SEC_REG[%d]: id %d, is_orig %d, psm 0x%04x, proto_id %d, chan_id %d",
index, service_id, is_originator, psm, mx_proto_id, mx_chan_id);
#if BTM_SEC_SERVICE_NAME_LEN > 0
- BTM_TRACE_API3(" : sec: 0x%x, service name [%s] (up to %d chars saved)",
+ BTM_TRACE_API(" : sec: 0x%x, service name [%s] (up to %d chars saved)",
p_srec->security_flags, p_name, BTM_SEC_SERVICE_NAME_LEN);
#endif
#endif
@@ -735,7 +841,7 @@
if ((p_srec->security_flags & BTM_SEC_IN_USE) && (p_srec->psm != BT_PSM_SDP) &&
(!service_id || (service_id == p_srec->service_id)))
{
- BTM_TRACE_API2("BTM_SEC_CLR[%d]: id %d", i, service_id);
+ BTM_TRACE_API("BTM_SEC_CLR[%d]: id %d", i, service_id);
p_srec->security_flags = 0;
#if (L2CAP_UCD_INCLUDED == TRUE)
p_srec->ucd_security_flags = 0;
@@ -774,12 +880,12 @@
/* Delete services with specified name (if in use and not SDP) */
if ((p_srec->security_flags & BTM_SEC_IN_USE) && (p_srec->psm == psm) )
{
- BTM_TRACE_API2("BTM_SEC_CLR[%d]: id %d ", i, p_srec->service_id);
+ BTM_TRACE_API("BTM_SEC_CLR[%d]: id %d ", i, p_srec->service_id);
p_srec->security_flags = 0;
num_freed++;
}
}
- BTM_TRACE_API2("btm_sec_clr_service_by_psm psm:0x%x num_freed:%d", psm, num_freed);
+ BTM_TRACE_API("btm_sec_clr_service_by_psm psm:0x%x num_freed:%d", psm, num_freed);
return(num_freed);
}
@@ -802,14 +908,14 @@
if ((p_dev_rec = btm_find_dev (bda)) == NULL)
{
- BTM_TRACE_WARNING0 ("btm_sec_clr_temp_auth_service() - no dev CB");
+ BTM_TRACE_WARNING ("btm_sec_clr_temp_auth_service() - no dev CB");
return;
}
/* Reset the temporary authorized flag so that next time (untrusted) service is accessed autorization will take place */
if (p_dev_rec->last_author_service_id != BTM_SEC_NO_LAST_SERVICE_ID && p_dev_rec->p_cur_service)
{
- BTM_TRACE_DEBUG6 ("btm_sec_clr_auth_service_by_psm [clearing device: %02x:%02x:%02x:%02x:%02x:%02x]",
+ BTM_TRACE_DEBUG ("btm_sec_clr_auth_service_by_psm [clearing device: %02x:%02x:%02x:%02x:%02x:%02x]",
bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]);
p_dev_rec->last_author_service_id = BTM_SEC_NO_LAST_SERVICE_ID;
@@ -842,7 +948,7 @@
if ((p_srec->security_flags & BTM_SEC_IN_USE) &&
(!service_id || (service_id == (UINT32)p_srec->service_id)))
{
- BTM_TRACE_API2("BTM_UCD_SEC_CLR[%d]: id %d", i, service_id);
+ BTM_TRACE_API("BTM_UCD_SEC_CLR[%d]: id %d", i, service_id);
p_srec->ucd_security_flags = 0;
num_cleared++;
}
@@ -873,25 +979,25 @@
{
tBTM_SEC_DEV_REC *p_dev_rec;
- BTM_TRACE_API4 ("BTM_PINCodeReply(): PairState: %s PairFlags: 0x%02x PinLen:%d Result:%d",
+ BTM_TRACE_API ("BTM_PINCodeReply(): PairState: %s PairFlags: 0x%02x PinLen:%d Result:%d",
btm_pair_state_descr(btm_cb.pairing_state), btm_cb.pairing_flags, pin_len, res);
/* If timeout already expired or has been canceled, ignore the reply */
if (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_PIN)
{
- BTM_TRACE_WARNING1 ("BTM_PINCodeReply() - Wrong State: %d", btm_cb.pairing_state);
+ BTM_TRACE_WARNING ("BTM_PINCodeReply() - Wrong State: %d", btm_cb.pairing_state);
return;
}
if (memcmp (bd_addr, btm_cb.pairing_bda, BD_ADDR_LEN) != 0)
{
- BTM_TRACE_ERROR0 ("BTM_PINCodeReply() - Wrong BD Addr");
+ BTM_TRACE_ERROR ("BTM_PINCodeReply() - Wrong BD Addr");
return;
}
if ((p_dev_rec = btm_find_dev (bd_addr)) == NULL)
{
- BTM_TRACE_ERROR0 ("BTM_PINCodeReply() - no dev CB");
+ BTM_TRACE_ERROR ("BTM_PINCodeReply() - no dev CB");
return;
}
@@ -942,7 +1048,7 @@
/* before originating */
if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT)
{
- BTM_TRACE_WARNING0 ("BTM_PINCodeReply(): waiting HCI_Connection_Complete after rejected incoming connection");
+ BTM_TRACE_WARNING ("BTM_PINCodeReply(): waiting HCI_Connection_Complete after rejected incoming connection");
/* we change state little bit early so btm_sec_connected() will originate connection */
/* when existing ACL link is down completely */
btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ);
@@ -950,7 +1056,7 @@
/* if we already accepted incoming connection from pairing device */
else if (p_dev_rec->sm4 & BTM_SM4_CONN_PEND)
{
- BTM_TRACE_WARNING0 ("BTM_PINCodeReply(): link is connecting so wait pin code request from peer");
+ BTM_TRACE_WARNING ("BTM_PINCodeReply(): link is connecting so wait pin code request from peer");
btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ);
}
else if (btm_sec_dd_create_conn(p_dev_rec) != BTM_CMD_STARTED)
@@ -958,7 +1064,8 @@
btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
p_dev_rec->sec_flags &= ~BTM_SEC_LINK_KEY_AUTHED;
- (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class,
+ if (btm_cb.api.p_auth_complete_callback)
+ (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class,
p_dev_rec->sec_bd_name, HCI_ERR_AUTH_FAILURE);
}
return;
@@ -968,7 +1075,7 @@
btm_cb.acl_disc_reason = HCI_SUCCESS;
#ifdef PORCHE_PAIRING_CONFLICT
- BTM_TRACE_EVENT2("BTM_PINCodeReply(): Saving pin_len: %d btm_cb.pin_code_len: %d", pin_len, btm_cb.pin_code_len);
+ BTM_TRACE_EVENT("BTM_PINCodeReply(): Saving pin_len: %d btm_cb.pin_code_len: %d", pin_len, btm_cb.pin_code_len);
/* if this was not pre-fetched, save the PIN */
if (btm_cb.pin_code_len == 0)
memcpy (btm_cb.pin_code, p_pin, pin_len);
@@ -995,12 +1102,12 @@
if ((p_dev_rec = btm_find_dev (bd_addr)) == NULL)
{
- BTM_TRACE_WARNING6 ("Security Manager: Attempting Authorization of Unknown Device Address [%02x%02x%02x%02x%02x%02x]",
+ BTM_TRACE_WARNING ("Security Manager: Attempting Authorization of Unknown Device Address [%02x%02x%02x%02x%02x%02x]",
bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]);
return;
}
- BTM_TRACE_EVENT4 ("Security Manager: authorized status:%d State:%d Trusted:%08x %08x",
+ BTM_TRACE_EVENT ("Security Manager: authorized status:%d State:%d Trusted:%08x %08x",
res, (p_dev_rec) ? p_dev_rec->sec_state : 0, trusted_mask[0], trusted_mask[1]);
if (res == BTM_SUCCESS)
@@ -1015,7 +1122,7 @@
by another multiplexer layer */
if (!p_dev_rec->is_originator)
{
- BTM_TRACE_DEBUG1("BTM_DeviceAuthorized: Setting last_author_service_id to %d",
+ BTM_TRACE_DEBUG("BTM_DeviceAuthorized: Setting last_author_service_id to %d",
p_dev_rec->p_cur_service->service_id);
p_dev_rec->last_author_service_id = p_dev_rec->p_cur_service->service_id;
}
@@ -1028,25 +1135,21 @@
if (res != BTM_SUCCESS)
{
- btm_sec_dev_rec_cback_event (p_dev_rec, res);
+ btm_sec_dev_rec_cback_event (p_dev_rec, res, FALSE);
return;
}
if ((res = (UINT8)btm_sec_execute_procedure (p_dev_rec)) != BTM_CMD_STARTED)
{
- btm_sec_dev_rec_cback_event (p_dev_rec, res);
+ btm_sec_dev_rec_cback_event (p_dev_rec, res, FALSE);
}
}
-
-
/*******************************************************************************
**
-** Function BTM_SecBond
+** Function btm_sec_bond_by_transport
**
-** Description This function is called to perform bonding with peer device.
-** If the connection is already up, but not secure, pairing
-** is attempted. If already paired BTM_SUCCESS is returned.
+** Description this is the bond function that will start either SSP or SMP.
**
** Parameters: bd_addr - Address of the device to bond
** pin_len - length in bytes of the PIN Code
@@ -1055,35 +1158,45 @@
**
** Note: After 2.1 parameters are not used and preserved here not to change API
*******************************************************************************/
-tBTM_STATUS BTM_SecBond (BD_ADDR bd_addr, UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[])
+tBTM_STATUS btm_sec_bond_by_transport (BD_ADDR bd_addr, tBT_TRANSPORT transport,
+ UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[])
{
tBTM_SEC_DEV_REC *p_dev_rec;
tBTM_STATUS status;
UINT8 *p_features;
UINT8 ii;
-
- BTM_TRACE_API6 ("BTM_SecBond BDA: %02x:%02x:%02x:%02x:%02x:%02x",
+ tACL_CONN *p= btm_bda_to_acl(bd_addr, transport);
+ BTM_TRACE_API ("btm_sec_bond_by_transport BDA: %02x:%02x:%02x:%02x:%02x:%02x",
bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]);
+ BTM_TRACE_DEBUG("btm_sec_bond_by_transport: Transport used %d" , transport);
+
+
/* Other security process is in progress */
if (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
{
- BTM_TRACE_ERROR1 ("BTM_SecBond: already busy in state: %s", btm_pair_state_descr(btm_cb.pairing_state));
+ BTM_TRACE_ERROR ("BTM_SecBond: already busy in state: %s", btm_pair_state_descr(btm_cb.pairing_state));
return(BTM_WRONG_MODE);
}
if ((p_dev_rec = btm_find_or_alloc_dev (bd_addr)) == NULL)
{
return(BTM_NO_RESOURCES);
- }
+ }
- BTM_TRACE_DEBUG1 ("before update sec_flags=0x%x", p_dev_rec->sec_flags);
+ BTM_TRACE_DEBUG ("before update sec_flags=0x%x", p_dev_rec->sec_flags);
/* Finished if connection is active and already paired */
- if ( (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE)
- && (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED) )
+ if ( ((p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE) && transport == BT_TRANSPORT_BR_EDR
+ && (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))
+#if (BLE_INCLUDED == TRUE)
+ ||((p_dev_rec->ble_hci_handle != BTM_SEC_INVALID_HANDLE) && transport == BT_TRANSPORT_LE
+ && (p_dev_rec->sec_flags & BTM_SEC_LE_AUTHENTICATED))
+#endif
+
+ )
{
- BTM_TRACE_WARNING0("BTM_SecBond -> Already Paired");
+ BTM_TRACE_WARNING("BTM_SecBond -> Already Paired");
return(BTM_SUCCESS);
}
@@ -1107,26 +1220,29 @@
if (trusted_mask)
BTM_SEC_COPY_TRUSTED_DEVICE(trusted_mask, p_dev_rec->trusted_mask);
+#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
+ if (transport == BT_TRANSPORT_LE)
+ {
+ p_dev_rec->sec_flags &= ~ BTM_SEC_LE_MASK;
+
+ if (SMP_Pair(bd_addr) == SMP_STARTED)
+ {
+ btm_cb.pairing_flags |= BTM_PAIR_FLAGS_LE_ACTIVE;
+ p_dev_rec->sec_state = BTM_SEC_STATE_AUTHENTICATING;
+ btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
+ return BTM_CMD_STARTED;
+ }
+
+ btm_cb.pairing_flags = 0;
+ return(BTM_NO_RESOURCES);
+ }
+#endif
+
p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED
| BTM_SEC_ROLE_SWITCHED | BTM_SEC_LINK_KEY_AUTHED);
-#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
- /* LE device, do SMP pairing */
- if (BTM_UseLeLink(bd_addr))
- {
- if (SMP_Pair(bd_addr) == SMP_STARTED)
- {
- btm_cb.pairing_state = BTM_PAIR_STATE_WAIT_AUTH_COMPLETE;
- p_dev_rec->sec_state = BTM_SEC_STATE_AUTHENTICATING;
- return BTM_CMD_STARTED;
- }
- else
- return(BTM_NO_RESOURCES);
- }
-#endif
-
- BTM_TRACE_DEBUG1 ("after update sec_flags=0x%x", p_dev_rec->sec_flags);
+ BTM_TRACE_DEBUG ("after update sec_flags=0x%x", p_dev_rec->sec_flags);
if (!HCI_SIMPLE_PAIRING_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_0]))
{
/* The special case when we authenticate keyboard. Set pin type to fixed */
@@ -1144,20 +1260,20 @@
for (ii = 0; ii <= HCI_EXT_FEATURES_PAGE_MAX; ii++)
{
p_features = p_dev_rec->features[ii];
- BTM_TRACE_EVENT5(" remote_features page[%1d] = %02x-%02x-%02x-%02x",
+ BTM_TRACE_EVENT(" remote_features page[%1d] = %02x-%02x-%02x-%02x",
ii, p_features[0], p_features[1], p_features[2], p_features[3]);
- BTM_TRACE_EVENT4(" %02x-%02x-%02x-%02x",
+ BTM_TRACE_EVENT(" %02x-%02x-%02x-%02x",
p_features[4], p_features[5], p_features[6], p_features[7]);
}
- BTM_TRACE_EVENT2 ("BTM_SecBond: Remote sm4: 0x%x HCI Handle: 0x%04x", p_dev_rec->sm4, p_dev_rec->hci_handle);
+ BTM_TRACE_EVENT ("BTM_SecBond: Remote sm4: 0x%x HCI Handle: 0x%04x", p_dev_rec->sm4, p_dev_rec->hci_handle);
#if BTM_SEC_FORCE_RNR_FOR_DBOND == TRUE
p_dev_rec->sec_flags &= ~BTM_SEC_NAME_KNOWN;
#endif
/* If connection already exists... */
- if (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE)
+ if (p && p->hci_handle != BTM_SEC_INVALID_HANDLE)
{
if (!btm_sec_start_authentication (p_dev_rec))
return(BTM_NO_RESOURCES);
@@ -1169,7 +1285,7 @@
return(BTM_CMD_STARTED);
}
- BTM_TRACE_DEBUG2 ("sec mode: %d sm4:x%x", btm_cb.security_mode, p_dev_rec->sm4);
+ BTM_TRACE_DEBUG ("sec mode: %d sm4:x%x", btm_cb.security_mode, p_dev_rec->sm4);
if (!HCI_SIMPLE_PAIRING_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_0])
|| (p_dev_rec->sm4 == BTM_SM4_KNOWN))
{
@@ -1185,14 +1301,15 @@
* -> RNR (to learn if peer is 2.1)
* RNR when no ACL causes HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT */
btm_sec_change_pairing_state (BTM_PAIR_STATE_GET_REM_NAME);
- BTM_ReadRemoteDeviceName(bd_addr, NULL);
+ BTM_ReadRemoteDeviceName(bd_addr, NULL, BT_TRANSPORT_BR_EDR);
}
else
{
/* We are accepting connection request from peer */
btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ);
}
- BTM_TRACE_DEBUG3 ("State:%s sm4: 0x%x sec_state:%d", btm_pair_state_descr (btm_cb.pairing_state), p_dev_rec->sm4, p_dev_rec->sec_state);
+ BTM_TRACE_DEBUG ("State:%s sm4: 0x%x sec_state:%d",
+ btm_pair_state_descr (btm_cb.pairing_state), p_dev_rec->sm4, p_dev_rec->sec_state);
return BTM_CMD_STARTED;
}
@@ -1207,7 +1324,64 @@
return status;
}
+/*******************************************************************************
+**
+** Function BTM_SecBondByTransport
+**
+** Description This function is called to perform bonding with peer device.
+** If the connection is already up, but not secure, pairing
+** is attempted. If already paired BTM_SUCCESS is returned.
+**
+** Parameters: bd_addr - Address of the device to bond
+** transport - doing SSP over BR/EDR or SMP over LE
+** pin_len - length in bytes of the PIN Code
+** p_pin - pointer to array with the PIN Code
+** trusted_mask - bitwise OR of trusted services (array of UINT32)
+**
+** Note: After 2.1 parameters are not used and preserved here not to change API
+*******************************************************************************/
+tBTM_STATUS BTM_SecBondByTransport (BD_ADDR bd_addr, tBT_TRANSPORT transport,
+ UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[])
+{
+#if SMP_INCLUDED == TRUE
+ tBT_DEVICE_TYPE dev_type;
+ tBLE_ADDR_TYPE addr_type;
+ BTM_ReadDevInfo(bd_addr, &dev_type, &addr_type);
+ /* LE device, do SMP pairing */
+ if ((transport == BT_TRANSPORT_LE && (dev_type & BT_DEVICE_TYPE_BLE) == 0) ||
+ (transport == BT_TRANSPORT_BR_EDR && (dev_type & BT_DEVICE_TYPE_BREDR) == 0))
+ {
+ return BTM_ILLEGAL_ACTION;
+ }
+#endif
+ return btm_sec_bond_by_transport(bd_addr, transport, pin_len, p_pin, trusted_mask);
+}
+
+/*******************************************************************************
+**
+** Function BTM_SecBond
+**
+** Description This function is called to perform bonding with peer device.
+** If the connection is already up, but not secure, pairing
+** is attempted. If already paired BTM_SUCCESS is returned.
+**
+** Parameters: bd_addr - Address of the device to bond
+** pin_len - length in bytes of the PIN Code
+** p_pin - pointer to array with the PIN Code
+** trusted_mask - bitwise OR of trusted services (array of UINT32)
+**
+** Note: After 2.1 parameters are not used and preserved here not to change API
+*******************************************************************************/
+tBTM_STATUS BTM_SecBond (BD_ADDR bd_addr, UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[])
+{
+ tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR;
+#if BLE_INCLUDED == TRUE
+ if (BTM_UseLeLink(bd_addr))
+ transport = BT_TRANSPORT_LE;
+#endif
+ return btm_sec_bond_by_transport(bd_addr, transport, pin_len, p_pin, trusted_mask);
+}
/*******************************************************************************
**
** Function BTM_SecBondCancel
@@ -1216,16 +1390,14 @@
** with peer device.
**
** Parameters: bd_addr - Address of the peer device
+** transport - FALSE for BR/EDR link; TRUE for LE link
**
*******************************************************************************/
tBTM_STATUS BTM_SecBondCancel (BD_ADDR bd_addr)
{
tBTM_SEC_DEV_REC *p_dev_rec;
-#if SMP_INCLUDED == TRUE
- tACL_CONN *p=NULL;
-#endif
- BTM_TRACE_API2 ("BTM_SecBondCancel() State: %s flags:0x%x",
+ BTM_TRACE_API ("BTM_SecBondCancel() State: %s flags:0x%x",
btm_pair_state_descr (btm_cb.pairing_state), btm_cb.pairing_flags);
if (((p_dev_rec = btm_find_dev (bd_addr)) == NULL)
@@ -1233,23 +1405,21 @@
return BTM_UNKNOWN_ADDR;
#if SMP_INCLUDED == TRUE
- p = btm_bda_to_acl(bd_addr);
- if (p && p->is_le_link &&
- (p_dev_rec->sec_state == BTM_SEC_STATE_AUTHENTICATING))
+ if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_LE_ACTIVE)
{
- BTM_TRACE_DEBUG0 ("Cancel LE pairing");
- if (SMP_PairCancel(bd_addr))
+ if (p_dev_rec->sec_state == BTM_SEC_STATE_AUTHENTICATING)
{
- return BTM_CMD_STARTED;
+ BTM_TRACE_DEBUG ("Cancel LE pairing");
+ if (SMP_PairCancel(bd_addr))
+ {
+ return BTM_CMD_STARTED;
+ }
}
- else
- {
- return BTM_WRONG_MODE;
- }
+ return BTM_WRONG_MODE;
}
#endif
- BTM_TRACE_DEBUG2 ("hci_handle:0x%x sec_state:%d", p_dev_rec->hci_handle, p_dev_rec->sec_state );
+ BTM_TRACE_DEBUG ("hci_handle:0x%x sec_state:%d", p_dev_rec->hci_handle, p_dev_rec->sec_state );
if (BTM_PAIR_STATE_WAIT_LOCAL_PIN == btm_cb.pairing_state &&
BTM_PAIR_FLAGS_WE_STARTED_DD & btm_cb.pairing_flags)
{
@@ -1271,7 +1441,7 @@
/* If the HCI link was set up by Bonding process */
if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE)
- return btm_sec_send_hci_disconnect(p_dev_rec, HCI_ERR_PEER_USER);
+ return btm_sec_send_hci_disconnect(p_dev_rec, HCI_ERR_PEER_USER, p_dev_rec->hci_handle);
else
l2cu_update_lcb_4_bonding(bd_addr, FALSE);
@@ -1375,6 +1545,8 @@
** p_ref_data - pointer to any data the caller wishes to receive
** in the callback function upon completion.
* can be set to NULL if not used.
+** transport - TRUE to encryption the link over LE trasnport
+** or FALSE for BR/EDR trasnport
**
** Returns BTM_SUCCESS - already encrypted
** BTM_PENDING - command will be returned in the callback
@@ -1383,41 +1555,45 @@
** BTM_MODE_UNSUPPORTED - if security manager not linked in.
**
*******************************************************************************/
-tBTM_STATUS BTM_SetEncryption (BD_ADDR bd_addr, tBTM_SEC_CBACK *p_callback,
+tBTM_STATUS BTM_SetEncryption (BD_ADDR bd_addr, tBT_TRANSPORT transport, tBTM_SEC_CBACK *p_callback,
void *p_ref_data)
{
tBTM_SEC_DEV_REC *p_dev_rec;
tBTM_STATUS rc;
-
#if BLE_INCLUDED == TRUE
- tACL_CONN *p;
- p = btm_bda_to_acl(bd_addr);
+ tACL_CONN *p = btm_bda_to_acl(bd_addr, transport);
#endif
p_dev_rec = btm_find_dev (bd_addr);
- if (!p_dev_rec || (p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE))
+
+ if (!p_dev_rec ||
+ (transport == BT_TRANSPORT_BR_EDR && p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE)
+#if BLE_INCLUDED == TRUE
+ || (transport == BT_TRANSPORT_LE && p_dev_rec->ble_hci_handle == BTM_SEC_INVALID_HANDLE)
+#endif
+ )
{
/* Connection should be up and runnning */
- BTM_TRACE_WARNING0 ("Security Manager: BTM_SetEncryption not connected");
+ BTM_TRACE_WARNING ("Security Manager: BTM_SetEncryption not connected");
if (p_callback)
- (*p_callback) (bd_addr, p_ref_data, BTM_WRONG_MODE);
+ (*p_callback) (bd_addr, transport, p_ref_data, BTM_WRONG_MODE);
return(BTM_WRONG_MODE);
}
-
- if (
-#if BLE_INCLUDED == TRUE
- !p->is_le_link &&
+ if ((transport == BT_TRANSPORT_BR_EDR &&
+ (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED))
+#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
+ || (transport == BT_TRANSPORT_LE &&
+ (p_dev_rec->sec_flags & BTM_SEC_LE_ENCRYPTED))
#endif
- (p_dev_rec->sec_flags & (BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED))
- == (BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED))
+ )
{
- BTM_TRACE_EVENT0 ("Security Manager: BTM_SetEncryption already encrypted");
+ BTM_TRACE_EVENT ("Security Manager: BTM_SetEncryption already encrypted");
if (p_callback)
- (*p_callback) (bd_addr, p_ref_data, BTM_SUCCESS);
+ (*p_callback) (bd_addr, transport, p_ref_data, BTM_SUCCESS);
return(BTM_SUCCESS);
}
@@ -1425,10 +1601,10 @@
if (p_dev_rec->p_callback)
{
/* Connection should be up and runnning */
- BTM_TRACE_WARNING0 ("Security Manager: BTM_SetEncryption busy");
+ BTM_TRACE_WARNING ("Security Manager: BTM_SetEncryption busy");
if (p_callback)
- (*p_callback) (bd_addr, p_ref_data, BTM_BUSY);
+ (*p_callback) (bd_addr, transport, p_ref_data, BTM_BUSY);
return(BTM_BUSY);
}
@@ -1438,11 +1614,12 @@
p_dev_rec->security_required |= (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT);
p_dev_rec->is_originator = FALSE;
- BTM_TRACE_API4 ("Security Manager: BTM_SetEncryption Handle:%d State:%d Flags:0x%x Required:0x%x",
+ BTM_TRACE_API ("Security Manager: BTM_SetEncryption Handle:%d State:%d Flags:0x%x Required:0x%x",
p_dev_rec->hci_handle, p_dev_rec->sec_state, p_dev_rec->sec_flags,
p_dev_rec->security_required);
+
#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
- if (p->is_le_link)
+ if (transport == BT_TRANSPORT_LE)
{
rc = btm_ble_set_encryption(bd_addr, p_ref_data, p->link_role);
}
@@ -1451,12 +1628,12 @@
rc = btm_sec_execute_procedure (p_dev_rec);
- if ( rc != BTM_CMD_STARTED)
+ if (rc != BTM_CMD_STARTED && rc != BTM_BUSY)
{
if (p_callback)
{
p_dev_rec->p_callback = NULL;
- (*p_callback) (bd_addr, p_dev_rec->p_ref_data, rc);
+ (*p_callback) (bd_addr, transport, p_dev_rec->p_ref_data, rc);
}
}
return(rc);
@@ -1465,13 +1642,13 @@
/*******************************************************************************
* disconnect the ACL link, if it's not done yet.
*******************************************************************************/
-static tBTM_STATUS btm_sec_send_hci_disconnect (tBTM_SEC_DEV_REC *p_dev_rec, UINT8 reason)
+static tBTM_STATUS btm_sec_send_hci_disconnect (tBTM_SEC_DEV_REC *p_dev_rec, UINT8 reason, UINT16 conn_handle)
{
UINT8 old_state = p_dev_rec->sec_state;
tBTM_STATUS status = BTM_CMD_STARTED;
- BTM_TRACE_EVENT2 ("btm_sec_send_hci_disconnect: handle:0x%x, reason=0x%x",
- p_dev_rec->hci_handle, reason);
+ BTM_TRACE_EVENT ("btm_sec_send_hci_disconnect: handle:0x%x, reason=0x%x",
+ conn_handle, reason);
/* if some other thread disconnecting, we do not send second command */
if (BTM_SEC_STATE_DISCONNECTING != old_state)
@@ -1480,16 +1657,18 @@
#if BTM_DISC_DURING_RS == TRUE
/* If a Role Switch is in progress, delay the HCI Disconnect to avoid controller problem (4329B1) */
- if (p_dev_rec->rs_disc_pending == BTM_SEC_RS_PENDING)
+ if (p_dev_rec->rs_disc_pending == BTM_SEC_RS_PENDING &&
+ p_dev_rec->hci_handle == conn_handle)
+
{
- BTM_TRACE_ERROR0("RS in progress - Set DISC Pending flag in btm_sec_send_hci_disconnect to delay disconnect");
+ BTM_TRACE_DEBUG("RS in progress - Set DISC Pending flag in btm_sec_send_hci_disconnect to delay disconnect");
p_dev_rec->rs_disc_pending = BTM_SEC_DISC_PENDING;
status = BTM_SUCCESS;
}
else
#endif
/* Tear down the HCI link */
- if (!btsnd_hcic_disconnect (p_dev_rec->hci_handle, reason))
+ if (!btsnd_hcic_disconnect (conn_handle, reason))
{
/* could not send disconnect. restore old state */
p_dev_rec->sec_state = old_state;
@@ -1514,7 +1693,7 @@
{
tBTM_SEC_DEV_REC *p_dev_rec;
- BTM_TRACE_EVENT2 ("BTM_ConfirmReqReply() State: %s Res: %u",
+ BTM_TRACE_EVENT ("BTM_ConfirmReqReply() State: %s Res: %u",
btm_pair_state_descr(btm_cb.pairing_state), res);
/* If timeout already expired or has been canceled, ignore the reply */
@@ -1562,7 +1741,7 @@
{
tBTM_SEC_DEV_REC *p_dev_rec;
- BTM_TRACE_API2 ("BTM_PasskeyReqReply: State: %s res:%d",
+ BTM_TRACE_API ("BTM_PasskeyReqReply: State: %s res:%d",
btm_pair_state_descr(btm_cb.pairing_state), res);
if ( (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE)
@@ -1579,7 +1758,7 @@
btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY;
if (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE)
- btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE);
+ btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle);
else
BTM_SecBondCancel(bd_addr);
@@ -1652,7 +1831,7 @@
*******************************************************************************/
void BTM_IoCapRsp(BD_ADDR bd_addr, tBTM_IO_CAP io_cap, tBTM_OOB_DATA oob, tBTM_AUTH_REQ auth_req)
{
- BTM_TRACE_EVENT3 ("BTM_IoCapRsp: state: %s oob: %d io_cap: %d",
+ BTM_TRACE_EVENT ("BTM_IoCapRsp: state: %s oob: %d io_cap: %d",
btm_pair_state_descr(btm_cb.pairing_state), oob, io_cap);
if ( (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS)
@@ -1703,7 +1882,7 @@
*******************************************************************************/
void BTM_RemoteOobDataReply(tBTM_STATUS res, BD_ADDR bd_addr, BT_OCTET16 c, BT_OCTET16 r)
{
- BTM_TRACE_EVENT2 ("BTM_RemoteOobDataReply(): State: %s res:%d",
+ BTM_TRACE_EVENT ("BTM_RemoteOobDataReply(): State: %s res:%d",
btm_pair_state_descr(btm_cb.pairing_state), res);
/* If timeout already expired or has been canceled, ignore the reply */
@@ -1920,7 +2099,7 @@
&& (p_serv_rec->service_id == service_id)
&& (p_serv_rec->orig_mx_chan_id == mx_chan_id))
{
- BTM_TRACE_API4("BTM_SetOutService p_out_serv id %d, psm 0x%04x, proto_id %d, chan_id %d",
+ BTM_TRACE_API("BTM_SetOutService p_out_serv id %d, psm 0x%04x, proto_id %d, chan_id %d",
p_serv_rec->service_id, p_serv_rec->psm, p_serv_rec->mx_proto_id, p_serv_rec->orig_mx_chan_id);
btm_cb.p_out_serv = p_serv_rec;
if (p_dev_rec)
@@ -1951,9 +2130,17 @@
if (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)
{
is_possible = FALSE;
- BTM_TRACE_DEBUG5 ("btm_sec_is_upgrade_possible id:%d, link_key_typet:%d, rmt_io_caps:%d, chk flags:x%x, flags:x%x",
+ if(p_dev_rec->p_cur_service)
+ {
+ BTM_TRACE_DEBUG ("btm_sec_is_upgrade_possible id:%d, link_key_typet:%d, rmt_io_caps:%d, chk flags:x%x, flags:x%x",
p_dev_rec->p_cur_service->service_id, p_dev_rec->link_key_type, p_dev_rec->rmt_io_caps,
mtm_check, p_dev_rec->p_cur_service->security_flags);
+ }
+ else
+ {
+ BTM_TRACE_DEBUG ("btm_sec_is_upgrade_possible link_key_typet:%d, rmt_io_caps:%d, chk flags:x%x, ",
+ p_dev_rec->link_key_type, p_dev_rec->rmt_io_caps, mtm_check);
+ }
/* Already have a link key to the connected peer. Is the link key secure enough?
** Is a link key upgrade even possible?
*/
@@ -1968,7 +2155,7 @@
is_possible = TRUE;
}
}
- BTM_TRACE_DEBUG2 ("btm_sec_is_upgrade_possible is_possible:%d sec_flags:0x%x", is_possible, p_dev_rec->sec_flags);
+ BTM_TRACE_DEBUG ("btm_sec_is_upgrade_possible is_possible:%d sec_flags:0x%x", is_possible, p_dev_rec->sec_flags);
return is_possible;
}
@@ -1986,14 +2173,14 @@
{
tBTM_SP_UPGRADE evt_data;
- BTM_TRACE_DEBUG0 ("btm_sec_check_upgrade...");
+ BTM_TRACE_DEBUG ("btm_sec_check_upgrade...");
/* Only check if link key already exists */
if (!(p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN))
return;
if (btm_sec_is_upgrade_possible (p_dev_rec, is_originator) == TRUE)
{
- BTM_TRACE_DEBUG1 ("need upgrade!! sec_flags:0x%x", p_dev_rec->sec_flags);
+ BTM_TRACE_DEBUG ("need upgrade!! sec_flags:0x%x", p_dev_rec->sec_flags);
/* upgrade is possible: check if the application wants the upgrade.
* If the application is configured to use a global MITM flag,
* it probably would not want to upgrade the link key based on the security level database */
@@ -2002,7 +2189,7 @@
if (btm_cb.api.p_sp_callback)
(*btm_cb.api.p_sp_callback) (BTM_SP_UPGRADE_EVT, (tBTM_SP_EVT_DATA *)&evt_data);
- BTM_TRACE_DEBUG1 ("evt_data.upgrade:0x%x", evt_data.upgrade);
+ BTM_TRACE_DEBUG ("evt_data.upgrade:0x%x", evt_data.upgrade);
if (evt_data.upgrade)
{
/* if the application confirms the upgrade, set the upgrade bit */
@@ -2011,7 +2198,7 @@
/* Clear the link key known to go through authentication/pairing again */
p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED);
p_dev_rec->sec_flags &= ~BTM_SEC_AUTHENTICATED;
- BTM_TRACE_DEBUG1 ("sec_flags:0x%x", p_dev_rec->sec_flags);
+ BTM_TRACE_DEBUG ("sec_flags:0x%x", p_dev_rec->sec_flags);
}
}
}
@@ -2050,6 +2237,7 @@
tBTM_STATUS rc = BTM_SUCCESS;
BOOLEAN chk_acp_auth_done = FALSE;
BOOLEAN is_originator;
+ BOOLEAN transport = FALSE; /* should check PSM range in LE connection oriented L2CAP connection */
#if (L2CAP_UCD_INCLUDED == TRUE)
if (conn_type & CONNECTION_TYPE_ORIG_MASK)
@@ -2057,11 +2245,11 @@
else
is_originator = FALSE;
- BTM_TRACE_DEBUG2 ("btm_sec_l2cap_access_req conn_type:0x%x, 0x%x", conn_type, p_ref_data);
+ BTM_TRACE_DEBUG ("btm_sec_l2cap_access_req conn_type:0x%x, 0x%x", conn_type, p_ref_data);
#else
is_originator = conn_type;
- BTM_TRACE_DEBUG2 ("btm_sec_l2cap_access_req is_originator:%d, 0x%x", is_originator, p_ref_data);
+ BTM_TRACE_DEBUG ("btm_sec_l2cap_access_req is_originator:%d, 0x%x", is_originator, p_ref_data);
#endif
/* Find or get oldest record */
@@ -2075,9 +2263,9 @@
/* If there is no application registered with this PSM do not allow connection */
if (!p_serv_rec)
{
- BTM_TRACE_WARNING1 ("btm_sec_l2cap_access_req() PSM:%d no application registerd", psm);
+ BTM_TRACE_WARNING ("btm_sec_l2cap_access_req() PSM:%d no application registerd", psm);
- (*p_callback) (bd_addr, p_ref_data, BTM_MODE_UNSUPPORTED);
+ (*p_callback) (bd_addr, transport, p_ref_data, BTM_MODE_UNSUPPORTED);
return(BTM_MODE_UNSUPPORTED);
}
@@ -2085,7 +2273,7 @@
/* SDP connection we will always let through */
if (BT_PSM_SDP == psm)
{
- (*p_callback) (bd_addr, p_ref_data, BTM_SUCCESS_NO_SECURITY);
+ (*p_callback) (bd_addr,transport, p_ref_data, BTM_SUCCESS_NO_SECURITY);
return(BTM_SUCCESS);
}
@@ -2119,7 +2307,7 @@
if (rc == BTM_SUCCESS)
{
if (p_callback)
- (*p_callback) (bd_addr, (void *)p_ref_data, BTM_SUCCESS);
+ (*p_callback) (bd_addr, transport, (void *)p_ref_data, BTM_SUCCESS);
return(BTM_SUCCESS);
}
@@ -2134,9 +2322,9 @@
/* we will process one after another */
if ( (p_dev_rec->p_callback) || (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) )
{
- BTM_TRACE_EVENT4 ("btm_sec_l2cap_access_req() - busy - PSM:%d delayed state: %s mode:%d, sm4:0x%x",
+ BTM_TRACE_EVENT ("btm_sec_l2cap_access_req() - busy - PSM:%d delayed state: %s mode:%d, sm4:0x%x",
psm, btm_pair_state_descr(btm_cb.pairing_state), btm_cb.security_mode, p_dev_rec->sm4);
- BTM_TRACE_EVENT2 ("security_flags:x%x, sec_flags:x%x", security_required, p_dev_rec->sec_flags);
+ BTM_TRACE_EVENT ("security_flags:x%x, sec_flags:x%x", security_required, p_dev_rec->sec_flags);
rc = BTM_CMD_STARTED;
if ((BTM_SEC_MODE_SP != btm_cb.security_mode)
|| ((BTM_SEC_MODE_SP == btm_cb.security_mode) && (BTM_SM4_KNOWN == p_dev_rec->sm4))
@@ -2148,9 +2336,9 @@
if (is_originator)
{
if (((security_required & BTM_SEC_OUT_FLAGS) == 0) ||
- ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_AUTHENTICATE) && (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))) ||
- ((((security_required & BTM_SEC_OUT_FLAGS) == (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT)) && (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED))) ||
- ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_FLAGS) && (p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED))) )
+ ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec))) ||
+ ((((security_required & BTM_SEC_OUT_FLAGS) == (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT)) && btm_dev_encrypted(p_dev_rec))) ||
+ ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_FLAGS) && btm_dev_authorized(p_dev_rec) && btm_dev_encrypted(p_dev_rec))) )
{
rc = BTM_SUCCESS;
}
@@ -2158,9 +2346,12 @@
else
{
if (((security_required & BTM_SEC_IN_FLAGS) == 0) ||
- ((((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHENTICATE) && (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))) ||
- ((((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT)) && (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED))) ||
- ((((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_FLAGS) && (p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED))) )
+ (((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec)) ||
+ (((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT)) && btm_dev_encrypted(p_dev_rec)) ||
+ (((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHORIZE) && (btm_dev_authorized(p_dev_rec)||btm_serv_trusted(p_dev_rec, p_serv_rec))) ||
+ (((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_AUTHORIZE)) && ((btm_dev_authorized(p_dev_rec)||btm_serv_trusted(p_dev_rec, p_serv_rec)) && btm_dev_authenticated(p_dev_rec))) ||
+ (((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_ENCRYPT | BTM_SEC_IN_AUTHORIZE)) && ((btm_dev_authorized(p_dev_rec)||btm_serv_trusted(p_dev_rec, p_serv_rec)) && btm_dev_encrypted(p_dev_rec))) ||
+ (((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_FLAGS) && btm_dev_encrypted(p_dev_rec) && (btm_dev_authorized(p_dev_rec)||btm_serv_trusted(p_dev_rec, p_serv_rec))))
{
rc = BTM_SUCCESS;
}
@@ -2169,7 +2360,7 @@
if (rc == BTM_SUCCESS)
{
if (p_callback)
- (*p_callback) (bd_addr, (void *)p_ref_data, BTM_SUCCESS);
+ (*p_callback) (bd_addr, transport, (void *)p_ref_data, BTM_SUCCESS);
return(BTM_SUCCESS);
}
@@ -2197,7 +2388,7 @@
{
if ( !(BTM_SM4_KNOWN & p_dev_rec->sm4))
{
- BTM_TRACE_DEBUG1 ("remote features unknown!!sec_flags:0x%x", p_dev_rec->sec_flags);
+ BTM_TRACE_DEBUG ("remote features unknown!!sec_flags:0x%x", p_dev_rec->sec_flags);
/* the remote features are not known yet */
p_dev_rec->sm4 |= BTM_SM4_REQ_PEND;
@@ -2219,7 +2410,7 @@
{
if ( !(BTM_SM4_KNOWN & p_dev_rec->sm4))
{
- BTM_TRACE_DEBUG1 ("(rsp) remote features unknown!!sec_flags:0x%x", p_dev_rec->sec_flags);
+ BTM_TRACE_DEBUG ("(rsp) remote features unknown!!sec_flags:0x%x", p_dev_rec->sec_flags);
/* the remote features are not known yet */
p_dev_rec->sm4 |= BTM_SM4_REQ_PEND;
@@ -2229,7 +2420,7 @@
}
}
- BTM_TRACE_DEBUG4 ("btm_sec_l2cap_access_req() sm4:0x%x, sec_flags:0x%x, security_required:0x%x chk:%d",
+ BTM_TRACE_DEBUG ("btm_sec_l2cap_access_req() sm4:0x%x, sec_flags:0x%x, security_required:0x%x chk:%d",
p_dev_rec->sm4, p_dev_rec->sec_flags, security_required, chk_acp_auth_done);
old_security_required = p_dev_rec->security_required;
@@ -2254,15 +2445,15 @@
if ((btm_sec_find_next_serv (p_serv_rec)) != NULL)
#endif
{
- BTM_TRACE_DEBUG2 ("no next_serv sm4:0x%x, chk:%d", p_dev_rec->sm4, chk_acp_auth_done);
+ BTM_TRACE_DEBUG ("no next_serv sm4:0x%x, chk:%d", p_dev_rec->sm4, chk_acp_auth_done);
if (!BTM_SEC_IS_SM4(p_dev_rec->sm4))
{
- BTM_TRACE_EVENT1 ("Security Manager: l2cap_access_req PSM:%d postponed for multiplexer", psm);
+ BTM_TRACE_EVENT ("Security Manager: l2cap_access_req PSM:%d postponed for multiplexer", psm);
/* pre-Lisbon: restore the old settings */
p_dev_rec->security_required = old_security_required;
p_dev_rec->is_originator = old_is_originator;
- (*p_callback) (bd_addr, p_ref_data, BTM_SUCCESS);
+ (*p_callback) (bd_addr, transport, p_ref_data, BTM_SUCCESS);
return(BTM_SUCCESS);
}
@@ -2272,19 +2463,19 @@
* The layer above L2CAP needs to carry out the security requirement after L2CAP connect response is received*/
if (is_originator && (btm_cb.security_mode != BTM_SEC_MODE_SP || !BTM_SEC_IS_SM4(p_dev_rec->sm4)) && (psm >= 0x1001))
{
- BTM_TRACE_EVENT1 ("dynamic PSM:0x%x in legacy mode - postponed for upper layer", psm);
+ BTM_TRACE_EVENT ("dynamic PSM:0x%x in legacy mode - postponed for upper layer", psm);
/* restore the old settings */
p_dev_rec->security_required = old_security_required;
p_dev_rec->is_originator = old_is_originator;
- (*p_callback) (bd_addr, p_ref_data, BTM_SUCCESS);
+ (*p_callback) (bd_addr, transport, p_ref_data, BTM_SUCCESS);
return(BTM_SUCCESS);
}
if (chk_acp_auth_done)
{
- BTM_TRACE_DEBUG2 ("(SM4 to SM4) btm_sec_l2cap_access_req rspd. authenticated: x%x, enc: x%x",
+ BTM_TRACE_DEBUG ("(SM4 to SM4) btm_sec_l2cap_access_req rspd. authenticated: x%x, enc: x%x",
(p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED), (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED));
/* SM4, but we do not know for sure which level of security we need.
* as long as we have a link key, it's OK */
@@ -2296,12 +2487,12 @@
2046 may report HCI_Encryption_Change and L2C Connection Request out of sequence
because of data path issues. Delay this disconnect a little bit
*/
- BTM_TRACE_ERROR0 ("peer should have initiated security process by now (SM4 to SM4)");
+ BTM_TRACE_ERROR ("peer should have initiated security process by now (SM4 to SM4)");
p_dev_rec->p_callback = p_callback;
p_dev_rec->sec_state = BTM_SEC_STATE_DELAY_FOR_ENC;
- (*p_callback) (bd_addr, p_ref_data, rc);
+ (*p_callback) (bd_addr, transport, p_ref_data, rc);
- return(BTM_SUCCESS);
+ return(BTM_CMD_STARTED);
}
}
@@ -2324,13 +2515,13 @@
btm_sec_check_upgrade(p_dev_rec, is_originator);
}
- BTM_TRACE_EVENT6 ("Security Manager: l2cap_access_req PSM:%d Handle:%d State:%d Flags:0x%x Required:0x%x Service ID:%d",
+ BTM_TRACE_EVENT ("Security Manager: l2cap_access_req PSM:%d Handle:%d State:%d Flags:0x%x Required:0x%x Service ID:%d",
psm, handle, p_dev_rec->sec_state, p_dev_rec->sec_flags, p_dev_rec->security_required, p_dev_rec->p_cur_service->service_id);
if ((rc = btm_sec_execute_procedure (p_dev_rec)) != BTM_CMD_STARTED)
{
p_dev_rec->p_callback = NULL;
- (*p_callback) (bd_addr, p_dev_rec->p_ref_data, (UINT8)rc);
+ (*p_callback) (bd_addr, transport, p_dev_rec->p_ref_data, (UINT8)rc);
}
return(rc);
@@ -2368,8 +2559,9 @@
tBTM_SEC_SERV_REC *p_serv_rec;
tBTM_STATUS rc;
UINT16 security_required;
+ BOOLEAN transport = FALSE;/* should check PSM range in LE connection oriented L2CAP connection */
- BTM_TRACE_DEBUG1 ("btm_sec_mx_access_request is_originator:%d", is_originator);
+ BTM_TRACE_DEBUG ("btm_sec_mx_access_request is_originator:%d", is_originator);
/* Find or get oldest record */
p_dev_rec = btm_find_or_alloc_dev (bd_addr);
@@ -2380,9 +2572,9 @@
if (!p_serv_rec)
{
if (p_callback)
- (*p_callback) (bd_addr, p_ref_data, BTM_MODE_UNSUPPORTED);
+ (*p_callback) (bd_addr, transport, p_ref_data, BTM_MODE_UNSUPPORTED);
- BTM_TRACE_ERROR3 ("Security Manager: MX service not found PSM:%d Proto:%d SCN:%d",
+ BTM_TRACE_ERROR ("Security Manager: MX service not found PSM:%d Proto:%d SCN:%d",
psm, mx_proto_id, mx_chan_id);
return BTM_NO_RESOURCES;
}
@@ -2391,7 +2583,7 @@
/* we will process one after another */
if ( (p_dev_rec->p_callback) || (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) )
{
- BTM_TRACE_EVENT4 ("btm_sec_mx_access_request service PSM:%d Proto:%d SCN:%d delayed state: %s",
+ BTM_TRACE_EVENT ("btm_sec_mx_access_request service PSM:%d Proto:%d SCN:%d delayed state: %s",
psm, mx_proto_id, mx_chan_id, btm_pair_state_descr(btm_cb.pairing_state));
rc = BTM_CMD_STARTED;
@@ -2406,8 +2598,8 @@
if (is_originator)
{
if (((security_required & BTM_SEC_OUT_FLAGS) == 0) ||
- ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_AUTHENTICATE) && (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))) ||
- ((((security_required & BTM_SEC_OUT_FLAGS) == (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT)) && (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED)))
+ ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec))) ||
+ ((((security_required & BTM_SEC_OUT_FLAGS) == (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT)) && btm_dev_encrypted(p_dev_rec)))
)
{
rc = BTM_SUCCESS;
@@ -2416,8 +2608,11 @@
else
{
if (((security_required & BTM_SEC_IN_FLAGS) == 0) ||
- ((((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHENTICATE) && (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))) ||
- ((((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT)) && (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED)))
+ ((((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec))) ||
+ (((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHORIZE) && (btm_dev_authorized(p_dev_rec)||btm_serv_trusted(p_dev_rec, p_serv_rec))) ||
+ (((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_AUTHENTICATE)) && ((btm_dev_authorized(p_dev_rec)||btm_serv_trusted(p_dev_rec, p_serv_rec)) && btm_dev_authenticated(p_dev_rec))) ||
+ (((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_ENCRYPT)) && ((btm_dev_authorized(p_dev_rec)||btm_serv_trusted(p_dev_rec, p_serv_rec))&& btm_dev_encrypted(p_dev_rec))) ||
+ ((((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT)) && btm_dev_encrypted(p_dev_rec)))
)
{
rc = BTM_SUCCESS;
@@ -2453,7 +2648,7 @@
/* scn, we need to request user's permission again. */
p_dev_rec->sec_flags &= ~(BTM_SEC_AUTHORIZED);
- BTM_TRACE_EVENT6 ("Security Manager: mx_access_req proto_id:%d chan_id:%d State:%d Flags:0x%x Required:0x%x Service ID:%d",
+ BTM_TRACE_EVENT ("Security Manager: mx_access_req proto_id:%d chan_id:%d State:%d Flags:0x%x Required:0x%x Service ID:%d",
mx_proto_id, mx_chan_id, p_dev_rec->sec_state, p_dev_rec->sec_flags, p_dev_rec->security_required, p_dev_rec->p_cur_service->service_id);
if ((rc = btm_sec_execute_procedure (p_dev_rec)) != BTM_CMD_STARTED)
@@ -2462,7 +2657,7 @@
{
p_dev_rec->p_callback = NULL;
- (*p_callback) (bd_addr, p_ref_data, (UINT8)rc);
+ (*p_callback) (bd_addr,transport, p_ref_data, (UINT8)rc);
}
}
@@ -2486,7 +2681,7 @@
/* Some device may request a connection before we are done with the HCI_Reset sequence */
if (btm_cb.devcb.state != BTM_DEV_STATE_READY)
{
- BTM_TRACE_EVENT0 ("Security Manager: connect request when device not ready");
+ BTM_TRACE_EVENT ("Security Manager: connect request when device not ready");
btsnd_hcic_reject_conn (bda, HCI_ERR_HOST_REJECT_DEVICE);
return;
}
@@ -2498,7 +2693,7 @@
{
if (!p_dev_rec || !(p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED))
{
- BTM_TRACE_EVENT0 ("Security Manager: connect request from non-paired device");
+ BTM_TRACE_EVENT ("Security Manager: connect request from non-paired device");
btsnd_hcic_reject_conn (bda, HCI_ERR_HOST_REJECT_DEVICE);
return;
}
@@ -2510,7 +2705,7 @@
{
if (!p_dev_rec)
{
- BTM_TRACE_EVENT0 ("Security Manager: connect request from not paired device");
+ BTM_TRACE_EVENT ("Security Manager: connect request from not paired device");
btsnd_hcic_reject_conn (bda, HCI_ERR_HOST_REJECT_DEVICE);
return;
}
@@ -2522,7 +2717,7 @@
{
if (!(* btm_cb.p_conn_filter_cb) (bda, dc))
{
- BTM_TRACE_EVENT0 ("Security Manager: connect request did not pass filter");
+ BTM_TRACE_EVENT ("Security Manager: connect request did not pass filter");
/* incomming call did not pass connection filters. Reject */
btsnd_hcic_reject_conn (bda, HCI_ERR_HOST_REJECT_DEVICE);
@@ -2534,7 +2729,7 @@
&&(btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
&&(!memcmp (btm_cb.pairing_bda, bda, BD_ADDR_LEN)))
{
- BTM_TRACE_EVENT0 ("Security Manager: reject connect request from bonding device");
+ BTM_TRACE_EVENT ("Security Manager: reject connect request from bonding device");
/* incoming connection from bonding device is rejected */
btm_cb.pairing_flags |= BTM_PAIR_FLAGS_REJECTED_CONNECT;
@@ -2613,7 +2808,7 @@
UINT8 status;
STREAM_TO_UINT8 (status, p);
- BTM_TRACE_EVENT2 ("btm_create_conn_cancel_complete(): in State: %s status:%d",
+ BTM_TRACE_EVENT ("btm_create_conn_cancel_complete(): in State: %s status:%d",
btm_pair_state_descr(btm_cb.pairing_state), status);
/* if the create conn cancel cmd was issued by the bond cancel,
@@ -2666,9 +2861,9 @@
while ((p_e = (tBTM_SEC_QUEUE_ENTRY *)GKI_dequeue (&bq)) != NULL)
{
/* Check that the ACL is still up before starting security procedures */
- if (btm_bda_to_acl(p_e->bd_addr) != NULL)
+ if (btm_bda_to_acl(p_e->bd_addr, BT_TRANSPORT_BR_EDR) != NULL)
{
- BTM_TRACE_EVENT4 ("btm_sec_check_pending_reqs() submitting PSM: 0x%04x Is_Orig: %u mx_proto_id: %u mx_chan_id: %u",
+ BTM_TRACE_EVENT ("btm_sec_check_pending_reqs() submitting PSM: 0x%04x Is_Orig: %u mx_proto_id: %u mx_chan_id: %u",
p_e->psm, p_e->is_orig, p_e->mx_proto_id, p_e->mx_chan_id);
btm_sec_mx_access_request (p_e->bd_addr, p_e->psm, p_e->is_orig,
@@ -2717,7 +2912,7 @@
*******************************************************************************/
void btm_sec_device_down (void)
{
- BTM_TRACE_EVENT1 ("btm_sec_device_down() State: %s", btm_pair_state_descr(btm_cb.pairing_state));
+ BTM_TRACE_EVENT ("btm_sec_device_down() State: %s", btm_pair_state_descr(btm_cb.pairing_state));
btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
}
@@ -2747,9 +2942,13 @@
* right now. */
if (HCI_SIMPLE_PAIRING_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_0]))
{
+ btsnd_hcic_write_simple_pairing_mode(HCI_SP_MODE_ENABLED);
#if BLE_INCLUDED == TRUE
btsnd_hcic_set_event_mask(LOCAL_BR_EDR_CONTROLLER_ID,
(UINT8 *)HCI_DUMO_EVENT_MASK_EXT);
+
+ btsnd_hcic_ble_set_evt_mask((UINT8 *)HCI_BLE_EVENT_MASK_DEF);
+
#else
btsnd_hcic_set_event_mask(LOCAL_BR_EDR_CONTROLLER_ID,
(UINT8 *)HCI_LISBON_EVENT_MASK_EXT);
@@ -2767,7 +2966,7 @@
btm_cb.security_mode = BTM_SEC_MODE_SERVICE;
}
- BTM_TRACE_DEBUG1 ("btm_sec_dev_reset sec mode: %d", btm_cb.security_mode);
+ BTM_TRACE_DEBUG ("btm_sec_dev_reset sec mode: %d", btm_cb.security_mode);
}
/*******************************************************************************
@@ -2815,9 +3014,9 @@
tL2C_LCB *p_lcb;
/* Make sure an L2cap link control block is available */
- if ((p_lcb = l2cu_allocate_lcb (p_dev_rec->bd_addr, TRUE)) == NULL)
+ if ((p_lcb = l2cu_allocate_lcb (p_dev_rec->bd_addr, TRUE, BT_TRANSPORT_BR_EDR)) == NULL)
{
- BTM_TRACE_WARNING6 ("Security Manager: failed allocate LCB [%02x%02x%02x%02x%02x%02x]",
+ BTM_TRACE_WARNING ("Security Manager: failed allocate LCB [%02x%02x%02x%02x%02x%02x]",
p_dev_rec->bd_addr[0], p_dev_rec->bd_addr[1], p_dev_rec->bd_addr[2],
p_dev_rec->bd_addr[3], p_dev_rec->bd_addr[4], p_dev_rec->bd_addr[5]);
@@ -2827,9 +3026,9 @@
/* set up the control block to indicated dedicated bonding */
btm_cb.pairing_flags |= BTM_PAIR_FLAGS_DISC_WHEN_DONE;
- if (l2cu_create_conn(p_lcb) == FALSE)
+ if (l2cu_create_conn(p_lcb, BT_TRANSPORT_BR_EDR) == FALSE)
{
- BTM_TRACE_WARNING6 ("Security Manager: failed create [%02x%02x%02x%02x%02x%02x]",
+ BTM_TRACE_WARNING ("Security Manager: failed create [%02x%02x%02x%02x%02x%02x]",
p_dev_rec->bd_addr[0], p_dev_rec->bd_addr[1], p_dev_rec->bd_addr[2],
p_dev_rec->bd_addr[3], p_dev_rec->bd_addr[4], p_dev_rec->bd_addr[5]);
@@ -2841,7 +3040,7 @@
btm_acl_update_busy_level (BTM_BLI_PAGE_EVT);
#endif
- BTM_TRACE_DEBUG6 ("Security Manager: btm_sec_dd_create_conn [%02x%02x%02x%02x%02x%02x]",
+ BTM_TRACE_DEBUG ("Security Manager: btm_sec_dd_create_conn [%02x%02x%02x%02x%02x%02x]",
p_dev_rec->bd_addr[0], p_dev_rec->bd_addr[1], p_dev_rec->bd_addr[2],
p_dev_rec->bd_addr[3], p_dev_rec->bd_addr[4], p_dev_rec->bd_addr[5]);
@@ -2867,7 +3066,7 @@
DEV_CLASS dev_class;
UINT8 old_sec_state;
- BTM_TRACE_EVENT0 ("btm_sec_rmt_name_request_complete");
+ BTM_TRACE_EVENT ("btm_sec_rmt_name_request_complete");
if (((p_bd_addr == NULL) && !BTM_ACL_IS_CONNECTED(btm_cb.connecting_bda))
|| ((p_bd_addr != NULL) && !BTM_ACL_IS_CONNECTED(p_bd_addr)))
{
@@ -2905,13 +3104,13 @@
if (p_dev_rec)
{
- BTM_TRACE_EVENT5 ("Security Manager: rmt_name_complete PairState: %s RemName: %s status: %d State:%d p_dev_rec: 0x%08x ",
+ BTM_TRACE_EVENT ("Security Manager: rmt_name_complete PairState: %s RemName: %s status: %d State:%d p_dev_rec: 0x%08x ",
btm_pair_state_descr (btm_cb.pairing_state), p_bd_name,
status, p_dev_rec->sec_state, p_dev_rec);
}
else
{
- BTM_TRACE_EVENT3 ("Security Manager: rmt_name_complete PairState: %s RemName: %s status: %d",
+ BTM_TRACE_EVENT ("Security Manager: rmt_name_complete PairState: %s RemName: %s status: %d",
btm_pair_state_descr (btm_cb.pairing_state), p_bd_name,
status);
}
@@ -2924,7 +3123,7 @@
{
BCM_STRNCPY_S ((char *)p_dev_rec->sec_bd_name, sizeof (p_dev_rec->sec_bd_name), (char *)p_bd_name, BTM_MAX_REM_BD_NAME_LEN);
p_dev_rec->sec_flags |= BTM_SEC_NAME_KNOWN;
- BTM_TRACE_EVENT1 ("setting BTM_SEC_NAME_KNOWN sec_flags:0x%x", p_dev_rec->sec_flags);
+ BTM_TRACE_EVENT ("setting BTM_SEC_NAME_KNOWN sec_flags:0x%x", p_dev_rec->sec_flags);
}
else
{
@@ -2938,7 +3137,7 @@
/* Notify all clients waiting for name to be resolved */
for (i = 0;i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++)
{
- if (btm_cb.p_rmt_name_callback[i])
+ if (btm_cb.p_rmt_name_callback[i] && p_bd_addr)
(*btm_cb.p_rmt_name_callback[i])(p_bd_addr, p_dev_rec->dev_class,
p_dev_rec->sec_bd_name);
}
@@ -2952,7 +3151,7 @@
/* Notify all clients waiting for name to be resolved even if not found so clients can continue */
for (i = 0;i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++)
{
- if (btm_cb.p_rmt_name_callback[i])
+ if (btm_cb.p_rmt_name_callback[i] && p_bd_addr)
(*btm_cb.p_rmt_name_callback[i])(p_bd_addr, dev_class, (UINT8 *)"");
}
@@ -2963,13 +3162,13 @@
if ( (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_LOCAL_PIN) && p_bd_addr
&& (memcmp (btm_cb.pairing_bda, p_bd_addr, BD_ADDR_LEN) == 0) )
{
- BTM_TRACE_EVENT2 ("btm_sec_rmt_name_request_complete() delayed pin now being requested flags:0x%x, (p_pin_callback=0x%p)", btm_cb.pairing_flags, btm_cb.api.p_pin_callback);
+ BTM_TRACE_EVENT ("btm_sec_rmt_name_request_complete() delayed pin now being requested flags:0x%x, (p_pin_callback=0x%p)", btm_cb.pairing_flags, btm_cb.api.p_pin_callback);
if (((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) == 0) &&
((btm_cb.pairing_flags & BTM_PAIR_FLAGS_PIN_REQD) == 0) &&
btm_cb.api.p_pin_callback)
{
- BTM_TRACE_EVENT0 ("btm_sec_rmt_name_request_complete() calling pin_callback");
+ BTM_TRACE_EVENT ("btm_sec_rmt_name_request_complete() calling pin_callback");
btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD;
(*btm_cb.api.p_pin_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, p_bd_name);
}
@@ -2984,7 +3183,7 @@
{
if (p_bd_addr && memcmp (btm_cb.pairing_bda, p_bd_addr, BD_ADDR_LEN) == 0)
{
- BTM_TRACE_EVENT2 ("btm_sec_rmt_name_request_complete() continue bonding sm4: 0x%04x, status:0x%x", p_dev_rec->sm4, status);
+ BTM_TRACE_EVENT ("btm_sec_rmt_name_request_complete() continue bonding sm4: 0x%04x, status:0x%x", p_dev_rec->sm4, status);
if(btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_CANCEL_DD)
{
btm_sec_bond_cancel_complete();
@@ -2995,23 +3194,29 @@
{
btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
- (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class,
- p_dev_rec->sec_bd_name, status);
+ if (btm_cb.api.p_auth_complete_callback)
+ (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class,
+ p_dev_rec->sec_bd_name, status);
return;
}
/* if peer is very old legacy devices, HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT is not reported */
if (BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4))
{
- /* set the KNOWN flag only if BTM_PAIR_FLAGS_REJECTED_CONNECT is not set.
- * If it is set, there may be a race condition */
- BTM_TRACE_EVENT1 ("btm_sec_rmt_name_request_complete IS_SM4_UNKNOWN Flags:0x%04x", btm_cb.pairing_flags);
+ /* set the KNOWN flag only if BTM_PAIR_FLAGS_REJECTED_CONNECT is not set.*/
+ /* If it is set, there may be a race condition */
+ BTM_TRACE_DEBUG ("btm_sec_rmt_name_request_complete IS_SM4_UNKNOWN Flags:0x%04x",
+ btm_cb.pairing_flags);
if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT) == 0)
{
p_dev_rec->sm4 |= BTM_SM4_KNOWN;
}
}
+ BTM_TRACE_DEBUG("%s, SM4 Value: %x, Legacy:%d,IS SM4:%d, Unknown:%d",__FUNCTION__,
+ p_dev_rec->sm4, BTM_SEC_IS_SM4_LEGACY(p_dev_rec->sm4),
+ BTM_SEC_IS_SM4(p_dev_rec->sm4),BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4));
+
/* BT 2.1 or carkit, bring up the connection to force the peer to request PIN.
** Else prefetch (btm_sec_check_prefetch_pin will do the prefetching if needed)
*/
@@ -3021,15 +3226,16 @@
/* before originating */
if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT)
{
- BTM_TRACE_WARNING0 ("btm_sec_rmt_name_request_complete: waiting HCI_Connection_Complete after rejecting connection");
+ BTM_TRACE_WARNING ("btm_sec_rmt_name_request_complete: waiting HCI_Connection_Complete after rejecting connection");
}
/* Both we and the peer are 2.1 - continue to create connection */
else if (btm_sec_dd_create_conn(p_dev_rec) != BTM_CMD_STARTED)
{
- BTM_TRACE_WARNING0 ("btm_sec_rmt_name_request_complete: failed to start connection");
+ BTM_TRACE_WARNING ("btm_sec_rmt_name_request_complete: failed to start connection");
btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
+ if (btm_cb.api.p_auth_complete_callback)
(*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class,
p_dev_rec->sec_bd_name, HCI_ERR_MEMORY_FULL);
}
@@ -3038,9 +3244,9 @@
}
else
{
- BTM_TRACE_WARNING0 ("btm_sec_rmt_name_request_complete: wrong BDA, retry with pairing BDA");
+ BTM_TRACE_WARNING ("btm_sec_rmt_name_request_complete: wrong BDA, retry with pairing BDA");
- BTM_ReadRemoteDeviceName (btm_cb.pairing_bda, NULL);
+ BTM_ReadRemoteDeviceName (btm_cb.pairing_bda, NULL, BT_TRANSPORT_BR_EDR);
return;
}
}
@@ -3072,7 +3278,7 @@
if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
&& (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))
{
- BTM_TRACE_WARNING0 ("btm_sec_rmt_name_request_complete (none/ce)");
+ BTM_TRACE_WARNING ("btm_sec_rmt_name_request_complete (none/ce)");
p_dev_rec->security_required &= ~(BTM_SEC_OUT_AUTHENTICATE);
l2cu_start_post_bond_timer(p_dev_rec->hci_handle);
return;
@@ -3084,13 +3290,13 @@
/* If get name failed, notify the waiting layer */
if (status != HCI_SUCCESS)
{
- btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING);
+ btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING, FALSE);
return;
}
if (p_dev_rec->sm4 & BTM_SM4_REQ_PEND)
{
- BTM_TRACE_EVENT0 ("waiting for remote features!!");
+ BTM_TRACE_EVENT ("waiting for remote features!!");
return;
}
@@ -3102,7 +3308,7 @@
return;
/* There is no next procedure or start of procedure failed, notify the waiting layer */
- btm_sec_dev_rec_cback_event (p_dev_rec, status);
+ btm_sec_dev_rec_cback_event (p_dev_rec, status, FALSE);
}
/*******************************************************************************
@@ -3124,7 +3330,7 @@
STREAM_TO_BDADDR (bd_addr, p);
p_dev_rec = btm_find_or_alloc_dev (bd_addr);
- BTM_TRACE_EVENT2 ("btm_sec_rmt_host_support_feat_evt sm4: 0x%x p[0]: 0x%x", p_dev_rec->sm4, p[0]);
+ BTM_TRACE_EVENT ("btm_sec_rmt_host_support_feat_evt sm4: 0x%x p[0]: 0x%x", p_dev_rec->sm4, p[0]);
if (BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4))
{
@@ -3134,7 +3340,7 @@
{
p_dev_rec->sm4 = BTM_SM4_TRUE;
}
- BTM_TRACE_EVENT2 ("btm_sec_rmt_host_support_feat_evt sm4: 0x%x features[0]: 0x%x", p_dev_rec->sm4, features[0]);
+ BTM_TRACE_EVENT ("btm_sec_rmt_host_support_feat_evt sm4: 0x%x features[0]: 0x%x", p_dev_rec->sm4, features[0]);
}
}
@@ -3166,12 +3372,12 @@
evt_data.oob_data = BTM_OOB_NONE;
evt_data.auth_req = BTM_DEFAULT_AUTH_REQ;
- BTM_TRACE_EVENT1 ("btm_io_capabilities_req() State: %s", btm_pair_state_descr(btm_cb.pairing_state));
+ BTM_TRACE_EVENT ("btm_io_capabilities_req() State: %s", btm_pair_state_descr(btm_cb.pairing_state));
p_dev_rec = btm_find_or_alloc_dev (evt_data.bd_addr);
p_dev_rec->sm4 |= BTM_SM4_TRUE;
- BTM_TRACE_EVENT3 ("btm_io_capabilities_req() State: %s Flags: 0x%04x p_cur_service: 0x%08x",
+ BTM_TRACE_EVENT ("btm_io_capabilities_req() State: %s Flags: 0x%04x p_cur_service: 0x%08x",
btm_pair_state_descr(btm_cb.pairing_state), btm_cb.pairing_flags, p_dev_rec->p_cur_service);
if (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
@@ -3279,7 +3485,7 @@
btm_cb.devcb.loc_auth_req = evt_data.auth_req;
btm_cb.devcb.loc_io_caps = evt_data.io_cap;
- BTM_TRACE_EVENT4 ("btm_io_capabilities_req: State: %s IO_CAP:%d oob_data:%d auth_req:%d",
+ BTM_TRACE_EVENT ("btm_io_capabilities_req: State: %s IO_CAP:%d oob_data:%d auth_req:%d",
btm_pair_state_descr(btm_cb.pairing_state), evt_data.io_cap,
evt_data.oob_data, evt_data.auth_req);
@@ -3374,7 +3580,7 @@
/* All events start with bd_addr */
STREAM_TO_BDADDR (p_bda, p);
- BTM_TRACE_EVENT4 ("btm_proc_sp_req_evt() BDA: %08x%04x event: 0x%x, State: %s",
+ BTM_TRACE_EVENT ("btm_proc_sp_req_evt() BDA: %08x%04x event: 0x%x, State: %s",
(p_bda[0]<<24) + (p_bda[1]<<16) + (p_bda[2]<<8) + p_bda[3], (p_bda[4] << 8) + p_bda[5],
event, btm_pair_state_descr(btm_cb.pairing_state));
@@ -3409,7 +3615,7 @@
evt_data.cfm_req.just_works = FALSE;
}
#endif
- BTM_TRACE_DEBUG5 ("btm_proc_sp_req_evt() just_works:%d, io loc:%d, rmt:%d, auth loc:%d, rmt:%d",
+ BTM_TRACE_DEBUG ("btm_proc_sp_req_evt() just_works:%d, io loc:%d, rmt:%d, auth loc:%d, rmt:%d",
evt_data.cfm_req.just_works, btm_cb.devcb.loc_io_caps, p_dev_rec->rmt_io_caps,
btm_cb.devcb.loc_auth_req, p_dev_rec->rmt_auth_req);
@@ -3423,7 +3629,7 @@
/* Passkey notification (other side is a keyboard) */
STREAM_TO_UINT32 (evt_data.key_notif.passkey, p);
- BTM_TRACE_DEBUG1 ("BTM_SP_KEY_NOTIF_EVT: passkey: %u", evt_data.key_notif.passkey);
+ BTM_TRACE_DEBUG ("BTM_SP_KEY_NOTIF_EVT: passkey: %u", evt_data.key_notif.passkey);
btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
break;
@@ -3453,7 +3659,7 @@
if (event == BTM_SP_CFM_REQ_EVT)
{
- BTM_TRACE_DEBUG1 ("calling BTM_ConfirmReqReply with status: %d", status);
+ BTM_TRACE_DEBUG ("calling BTM_ConfirmReqReply with status: %d", status);
BTM_ConfirmReqReply (status, p_bda);
}
#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
@@ -3542,13 +3748,13 @@
if ((p_dev_rec = btm_find_dev (evt_data.bd_addr)) == NULL)
{
- BTM_TRACE_ERROR2 ("btm_simple_pair_complete() with unknown BDA: %08x%04x",
+ BTM_TRACE_ERROR ("btm_simple_pair_complete() with unknown BDA: %08x%04x",
(evt_data.bd_addr[0]<<24) + (evt_data.bd_addr[1]<<16) + (evt_data.bd_addr[2]<<8) + evt_data.bd_addr[3],
(evt_data.bd_addr[4] << 8) + evt_data.bd_addr[5]);
return;
}
- BTM_TRACE_EVENT3 ("btm_simple_pair_complete() Pair State: %s Status:%d sec_state: %u",
+ BTM_TRACE_EVENT ("btm_simple_pair_complete() Pair State: %s Status:%d sec_state: %u",
btm_pair_state_descr(btm_cb.pairing_state), status, p_dev_rec->sec_state);
evt_data.status = BTM_ERR_PROCESSING;
@@ -3592,7 +3798,11 @@
if (disc)
{
/* simple pairing failed */
- btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE);
+ /* Avoid sending disconnect on HCI_ERR_PEER_USER */
+ if ((status != HCI_ERR_PEER_USER) && (status != HCI_ERR_CONN_CAUSE_LOCAL_HOST))
+ {
+ btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle);
+ }
}
}
@@ -3619,7 +3829,7 @@
STREAM_TO_BDADDR (p_bda, p);
- BTM_TRACE_EVENT6 ("btm_rem_oob_req() BDA: %02x:%02x:%02x:%02x:%02x:%02x",
+ BTM_TRACE_EVENT ("btm_rem_oob_req() BDA: %02x:%02x:%02x:%02x:%02x:%02x",
p_bda[0], p_bda[1], p_bda[2], p_bda[3], p_bda[4], p_bda[5]);
if ( (NULL != (p_dev_rec = btm_find_dev (p_bda))) &&
@@ -3658,7 +3868,7 @@
tBTM_SP_LOC_OOB evt_data;
UINT8 status = *p++;
- BTM_TRACE_EVENT1 ("btm_read_local_oob_complete:%d", status);
+ BTM_TRACE_EVENT ("btm_read_local_oob_complete:%d", status);
if (status == HCI_SUCCESS)
{
evt_data.status = BTM_SUCCESS;
@@ -3702,7 +3912,7 @@
if (p_dev_rec != NULL)
{
- BTM_TRACE_DEBUG1 ("btm_sec_auth_collision: state %d (retrying in a moment...)", p_dev_rec->sec_state);
+ BTM_TRACE_DEBUG ("btm_sec_auth_collision: state %d (retrying in a moment...)", p_dev_rec->sec_state);
/* We will restart authentication after timeout */
if (p_dev_rec->sec_state == BTM_SEC_STATE_AUTHENTICATING || p_dev_rec->sec_state == BTM_SEC_STATE_ENCRYPTING)
p_dev_rec->sec_state = 0;
@@ -3736,7 +3946,7 @@
#if (BT_USE_TRACES == TRUE)
if (p_dev_rec)
{
- BTM_TRACE_EVENT6 ("Security Manager: auth_complete PairState: %s handle:%u status:%d dev->sec_state: %u Bda:%08x, RName:%s",
+ BTM_TRACE_EVENT ("Security Manager: auth_complete PairState: %s handle:%u status:%d dev->sec_state: %u Bda:%08x, RName:%s",
btm_pair_state_descr (btm_cb.pairing_state),
handle, status,
p_dev_rec->sec_state,
@@ -3745,7 +3955,7 @@
}
else
{
- BTM_TRACE_EVENT3 ("Security Manager: auth_complete PairState: %s handle:%u status:%d",
+ BTM_TRACE_EVENT ("Security Manager: auth_complete PairState: %s handle:%u status:%d",
btm_pair_state_descr (btm_cb.pairing_state),
handle, status);
}
@@ -3831,7 +4041,10 @@
p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE;
if (status != HCI_SUCCESS)
- btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_PEER_USER);
+ {
+ if(((status != HCI_ERR_PEER_USER) && (status != HCI_ERR_CONN_CAUSE_LOCAL_HOST)))
+ btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_PEER_USER, p_dev_rec->hci_handle);
+ }
else
l2cu_start_post_bond_timer (p_dev_rec->hci_handle);
@@ -3848,7 +4061,7 @@
{
/* not retried yet. set the retry bit */
p_dev_rec->sm4 |= BTM_SM4_RETRY;
- BTM_TRACE_DEBUG2 ("Collision retry sm4:x%x sec_flags:0x%x", p_dev_rec->sm4, p_dev_rec->sec_flags);
+ BTM_TRACE_DEBUG ("Collision retry sm4:x%x sec_flags:0x%x", p_dev_rec->sm4, p_dev_rec->sec_flags);
}
/* this retry for missing key is for Lisbon or later only.
* Legacy device do not need this. the controller will drive the retry automatically */
@@ -3857,7 +4070,7 @@
/* not retried yet. set the retry bit */
p_dev_rec->sm4 |= BTM_SM4_RETRY;
p_dev_rec->sec_flags &= ~BTM_SEC_LINK_KEY_KNOWN;
- BTM_TRACE_DEBUG2 ("Retry for missing key sm4:x%x sec_flags:0x%x", p_dev_rec->sm4, p_dev_rec->sec_flags);
+ BTM_TRACE_DEBUG ("Retry for missing key sm4:x%x sec_flags:0x%x", p_dev_rec->sm4, p_dev_rec->sec_flags);
/* With BRCM controller, we do not need to delete the stored link key in controller.
If the stack may sit on top of other controller, we may need this
@@ -3871,11 +4084,11 @@
}
}
- btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING);
+ btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING, FALSE);
if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE)
{
- btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE);
+ btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle);
}
return;
}
@@ -3887,7 +4100,7 @@
/* If there is no next procedure, or procedure failed to start, notify the caller */
if (status != BTM_CMD_STARTED)
- btm_sec_dev_rec_cback_event (p_dev_rec, status);
+ btm_sec_dev_rec_cback_event (p_dev_rec, status, FALSE);
}
/*******************************************************************************
@@ -3905,7 +4118,7 @@
tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev_by_handle (handle);
UINT8 bd_addr[BD_ADDR_LEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff} ;
- BTM_TRACE_EVENT2 ("Security Manager: mkey comp status:%d State:%d",
+ BTM_TRACE_EVENT ("Security Manager: mkey comp status:%d State:%d",
status, (p_dev_rec) ? p_dev_rec->sec_state : 0);
/* If encryption setup failed, notify the waiting layer */
@@ -3933,11 +4146,12 @@
{
tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev_by_handle (handle);
#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
- tACL_CONN *p_acl;
+ tACL_CONN *p_acl = NULL;
+ UINT8 acl_idx = btm_handle_to_acl_index(handle);
#endif
- BTM_TRACE_EVENT3 ("Security Manager: encrypt_change status:%d State:%d, encr_enable = %d",
+ BTM_TRACE_EVENT ("Security Manager: encrypt_change status:%d State:%d, encr_enable = %d",
status, (p_dev_rec) ? p_dev_rec->sec_state : 0, encr_enable);
- BTM_TRACE_DEBUG1 ("before update p_dev_rec->sec_flags=0x%x", (p_dev_rec) ? p_dev_rec->sec_flags : 0 );
+ BTM_TRACE_DEBUG ("before update p_dev_rec->sec_flags=0x%x", (p_dev_rec) ? p_dev_rec->sec_flags : 0 );
/* For transaction collision we need to wait and repeat. There is no need */
/* for random timeout because only slave should receive the result */
@@ -3952,20 +4166,34 @@
return;
if ((status == HCI_SUCCESS) && encr_enable)
- p_dev_rec->sec_flags |= (BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED);
+ {
+ if (p_dev_rec->hci_handle == handle)
+ p_dev_rec->sec_flags |= (BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED);
+ else
+ p_dev_rec->sec_flags |= (BTM_SEC_LE_AUTHENTICATED | BTM_SEC_LE_ENCRYPTED);
+ }
/* It is possible that we decrypted the link to perform role switch */
/* mark link not to be encrypted, so that when we execute security next time it will kick in again */
if ((status == HCI_SUCCESS) && !encr_enable)
- p_dev_rec->sec_flags &= ~BTM_SEC_ENCRYPTED;
+ {
+ if (p_dev_rec->hci_handle == handle)
+ p_dev_rec->sec_flags &= ~BTM_SEC_ENCRYPTED;
+ else
+ p_dev_rec->sec_flags &= ~BTM_SEC_LE_ENCRYPTED;
+ }
- BTM_TRACE_DEBUG1 ("after update p_dev_rec->sec_flags=0x%x", p_dev_rec->sec_flags );
+ BTM_TRACE_DEBUG ("after update p_dev_rec->sec_flags=0x%x", p_dev_rec->sec_flags );
#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
- p_acl = btm_bda_to_acl(p_dev_rec->bd_addr);
+ if (acl_idx != MAX_L2CAP_LINKS )
+ p_acl = &btm_cb.acl_db[acl_idx];
- if (p_acl && p_acl->is_le_link)
+ if (p_acl && p_acl->transport == BT_TRANSPORT_LE)
{
+ if (status == HCI_ERR_KEY_MISSING || status == HCI_ERR_AUTH_FAILURE
+ ||status == HCI_ERR_ENCRY_MODE_NOT_ACCEPTABLE)
+ p_dev_rec->sec_flags &= ~ (BTM_SEC_LE_LINK_KEY_KNOWN);
btm_ble_link_encrypted(p_dev_rec->bd_addr, encr_enable);
return;
}
@@ -3991,7 +4219,7 @@
/* If encryption setup failed, notify the waiting layer */
if (status != HCI_SUCCESS)
{
- btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING);
+ btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING, FALSE);
return;
}
@@ -4000,7 +4228,7 @@
/* If there is no next procedure, or procedure failed to start, notify the caller */
if (status != BTM_CMD_STARTED)
- btm_sec_dev_rec_cback_event (p_dev_rec, status);
+ btm_sec_dev_rec_cback_event (p_dev_rec, status, FALSE);
}
/*******************************************************************************
@@ -4050,16 +4278,17 @@
tBTM_SEC_DEV_REC *p_dev_rec = btm_cb.p_collided_dev_rec;
UNUSED(p_tle);
- BTM_TRACE_EVENT0 ("btm_sec_connect_after_reject_timeout()");
+ BTM_TRACE_EVENT ("btm_sec_connect_after_reject_timeout()");
btm_cb.sec_collision_tle.param = 0;
btm_cb.p_collided_dev_rec = 0;
if (btm_sec_dd_create_conn(p_dev_rec) != BTM_CMD_STARTED)
{
- BTM_TRACE_WARNING0 ("Security Manager: btm_sec_connect_after_reject_timeout: failed to start connection");
+ BTM_TRACE_WARNING ("Security Manager: btm_sec_connect_after_reject_timeout: failed to start connection");
btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
+ if (btm_cb.api.p_auth_complete_callback)
(*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class,
p_dev_rec->sec_bd_name, HCI_ERR_MEMORY_FULL);
}
@@ -4081,6 +4310,7 @@
UINT8 res;
BOOLEAN is_pairing_device = FALSE;
tACL_CONN *p_acl_cb;
+ UINT8 bit_shift = 0;
btm_acl_resubmit_page();
@@ -4089,14 +4319,14 @@
#if (BT_USE_TRACES == TRUE)
if (p_dev_rec)
{
- BTM_TRACE_EVENT6 ("Security Manager: btm_sec_connected in state: %s handle:%d status:%d enc_mode:%d bda:%x RName:%s",
+ BTM_TRACE_EVENT ("Security Manager: btm_sec_connected in state: %s handle:%d status:%d enc_mode:%d bda:%x RName:%s",
btm_pair_state_descr(btm_cb.pairing_state), handle, status, enc_mode,
(bda[2]<<24)+(bda[3]<<16)+(bda[4]<<8)+bda[5],
p_dev_rec->sec_bd_name);
}
else
{
- BTM_TRACE_EVENT5 ("Security Manager: btm_sec_connected in state: %s handle:%d status:%d enc_mode:%d bda:%x ",
+ BTM_TRACE_EVENT ("Security Manager: btm_sec_connected in state: %s handle:%d status:%d enc_mode:%d bda:%x ",
btm_pair_state_descr(btm_cb.pairing_state), handle, status, enc_mode,
(bda[2]<<24)+(bda[3]<<16)+(bda[4]<<8)+bda[5]);
}
@@ -4108,9 +4338,6 @@
if (status == HCI_SUCCESS)
{
p_dev_rec = btm_sec_alloc_dev (bda);
-#if BLE_INCLUDED == TRUE
- p_dev_rec->device_type |= BT_DEVICE_TYPE_BREDR;
-#endif
}
else
{
@@ -4121,6 +4348,10 @@
}
else /* Update the timestamp for this device */
{
+
+#if BLE_INCLUDED == TRUE
+ bit_shift = (handle == p_dev_rec->ble_hci_handle) ? 8 :0;
+#endif
p_dev_rec->timestamp = btm_cb.dev_rec_count++;
if (p_dev_rec->sm4 & BTM_SM4_CONN_PEND)
{
@@ -4133,7 +4364,7 @@
/* Motorola S9 disconnects without asking pin code */
if ((status != HCI_SUCCESS)&&(btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_PIN_REQ))
{
- BTM_TRACE_WARNING0 ("Security Manager: btm_sec_connected: incoming connection failed without asking PIN");
+ BTM_TRACE_WARNING ("Security Manager: btm_sec_connected: incoming connection failed without asking PIN");
p_dev_rec->sm4 &= ~BTM_SM4_CONN_PEND;
if (p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN)
@@ -4147,7 +4378,7 @@
else
{
btm_sec_change_pairing_state (BTM_PAIR_STATE_GET_REM_NAME);
- BTM_ReadRemoteDeviceName(p_dev_rec->bd_addr, NULL);
+ BTM_ReadRemoteDeviceName(p_dev_rec->bd_addr, NULL, BT_TRANSPORT_BR_EDR);
}
#if BTM_DISC_DURING_RS == TRUE
p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING; /* reset flag */
@@ -4164,6 +4395,10 @@
}
}
+#if BLE_INCLUDED == TRUE
+ p_dev_rec->device_type |= BT_DEVICE_TYPE_BREDR;
+#endif
+
#if BTM_DISC_DURING_RS == TRUE
p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING; /* reset flag */
#endif
@@ -4177,7 +4412,7 @@
if ((status == HCI_ERR_HOST_REJECT_DEVICE)
&&(btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT))
{
- BTM_TRACE_WARNING2 ("Security Manager: btm_sec_connected: HCI_Conn_Comp Flags:0x%04x, sm4: 0x%x",
+ BTM_TRACE_WARNING ("Security Manager: btm_sec_connected: HCI_Conn_Comp Flags:0x%04x, sm4: 0x%x",
btm_cb.pairing_flags, p_dev_rec->sm4);
btm_cb.pairing_flags &= ~BTM_PAIR_FLAGS_REJECTED_CONNECT;
@@ -4185,7 +4420,7 @@
{
/* Try again: RNR when no ACL causes HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT */
btm_sec_change_pairing_state (BTM_PAIR_STATE_GET_REM_NAME);
- BTM_ReadRemoteDeviceName(bda, NULL);
+ BTM_ReadRemoteDeviceName(bda, NULL, BT_TRANSPORT_BR_EDR);
return;
}
@@ -4204,7 +4439,7 @@
/* wait for incoming connection without resetting pairing state */
else if (status == HCI_ERR_CONNECTION_EXISTS)
{
- BTM_TRACE_WARNING0 ("Security Manager: btm_sec_connected: Wait for incoming connection");
+ BTM_TRACE_WARNING ("Security Manager: btm_sec_connected: Wait for incoming connection");
return;
}
@@ -4221,8 +4456,8 @@
if (is_pairing_device)
{
p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE;
- p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED);
- BTM_TRACE_DEBUG1 ("security_required:%x ", p_dev_rec->security_required );
+ p_dev_rec->sec_flags &= ~((BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED) << bit_shift);
+ BTM_TRACE_DEBUG ("security_required:%x ", p_dev_rec->security_required );
btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
@@ -4234,17 +4469,33 @@
p_dev_rec->sec_bd_name, status);
}
}
- else if ((status == HCI_ERR_AUTH_FAILURE) ||
+ /*
+ Do not send authentication failure, if following conditions hold good
+ 1. BTM Sec Pairing state is idle
+ 2. Link key for the remote device is present.
+ 3. Remote is SSP capable.
+ */
+ else if ((p_dev_rec->link_key_type <= BTM_LKEY_TYPE_REMOTE_UNIT) &&
+ (((status == HCI_ERR_AUTH_FAILURE) ||
(status == HCI_ERR_KEY_MISSING) ||
(status == HCI_ERR_HOST_REJECT_SECURITY) ||
(status == HCI_ERR_PAIRING_NOT_ALLOWED) ||
(status == HCI_ERR_UNIT_KEY_USED) ||
(status == HCI_ERR_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED) ||
(status == HCI_ERR_ENCRY_MODE_NOT_ACCEPTABLE) ||
- (status == HCI_ERR_REPEATED_ATTEMPTS))
+ (status == HCI_ERR_REPEATED_ATTEMPTS))))
{
p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE;
- p_dev_rec->sec_flags &= ~BTM_SEC_LINK_KEY_KNOWN;
+ p_dev_rec->sec_flags &= ~ (BTM_SEC_LE_LINK_KEY_KNOWN << bit_shift);
+
+
+#ifdef BRCM_NOT_4_BTE
+ /* If we rejected pairing, pass this special result code */
+ if (btm_cb.acl_disc_reason == HCI_ERR_HOST_REJECT_SECURITY)
+ {
+ status = HCI_ERR_HOST_REJECT_SECURITY;
+ }
+#endif
/* We need to notify host that the key is not known any more */
if (btm_cb.api.p_auth_complete_callback)
@@ -4257,9 +4508,9 @@
if (status == HCI_ERR_CONNECTION_TOUT || status == HCI_ERR_LMP_RESPONSE_TIMEOUT ||
status == HCI_ERR_UNSPECIFIED || status == HCI_ERR_PAGE_TIMEOUT)
- btm_sec_dev_rec_cback_event (p_dev_rec, BTM_DEVICE_TIMEOUT);
+ btm_sec_dev_rec_cback_event (p_dev_rec, BTM_DEVICE_TIMEOUT, FALSE);
else
- btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING);
+ btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING, FALSE);
return;
}
@@ -4304,7 +4555,7 @@
/* role may not be correct here, it will be updated by l2cap, but we need to */
/* notify btm_acl that link is up, so starting of rmt name request will not */
/* set paging flag up */
- p_acl_cb = btm_bda_to_acl(bda);
+ p_acl_cb = btm_bda_to_acl(bda, BT_TRANSPORT_BR_EDR);
if (p_acl_cb)
{
/* whatever is in btm_establish_continue() without reporting the BTM_BL_CONN_EVT event */
@@ -4318,30 +4569,30 @@
BTM_SetLinkPolicy (p_acl_cb->remote_addr, &btm_cb.btm_def_link_policy);
#endif
}
- btm_acl_created (bda, p_dev_rec->dev_class, p_dev_rec->sec_bd_name, handle, HCI_ROLE_SLAVE, FALSE);
+ btm_acl_created (bda, p_dev_rec->dev_class, p_dev_rec->sec_bd_name, handle, HCI_ROLE_SLAVE, BT_TRANSPORT_BR_EDR);
/* Initialize security flags. We need to do that because some */
/* authorization complete could have come after the connection is dropped */
/* and that would set wrong flag that link has been authorized already */
- p_dev_rec->sec_flags &= ~(BTM_SEC_AUTHORIZED | BTM_SEC_AUTHENTICATED |
- BTM_SEC_ENCRYPTED | BTM_SEC_ROLE_SWITCHED);
+ p_dev_rec->sec_flags &= ~((BTM_SEC_AUTHORIZED | BTM_SEC_AUTHENTICATED |
+ BTM_SEC_ENCRYPTED | BTM_SEC_ROLE_SWITCHED) << bit_shift);
if (enc_mode != HCI_ENCRYPT_MODE_DISABLED)
- p_dev_rec->sec_flags |= (BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED);
+ p_dev_rec->sec_flags |= ((BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED) << bit_shift);
if (btm_cb.security_mode == BTM_SEC_MODE_LINK)
- p_dev_rec->sec_flags |= BTM_SEC_AUTHENTICATED;
+ p_dev_rec->sec_flags |= (BTM_SEC_AUTHENTICATED << bit_shift);
p_dev_rec->link_key_changed = FALSE;
/* After connection is established we perform security if we do not know */
/* the name, or if we are originator because some procedure can have */
/* been scheduled while connection was down */
- BTM_TRACE_DEBUG1 ("is_originator:%d ", p_dev_rec->is_originator);
+ BTM_TRACE_DEBUG ("is_originator:%d ", p_dev_rec->is_originator);
if (!(p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) || p_dev_rec->is_originator)
{
if ((res = btm_sec_execute_procedure (p_dev_rec)) != BTM_CMD_STARTED)
- btm_sec_dev_rec_cback_event (p_dev_rec, res);
+ btm_sec_dev_rec_cback_event (p_dev_rec, res, FALSE);
}
return;
}
@@ -4361,7 +4612,7 @@
tBTM_SEC_DEV_REC *p_dev_rec = (tBTM_SEC_DEV_REC *)p_ref_data;
UINT8 res;
- BTM_TRACE_EVENT0 ("Security Manager: role changed");
+ BTM_TRACE_EVENT ("Security Manager: role changed");
/* If this role switch was started by peer do not need to do anything */
if (p_dev_rec->sec_state != BTM_SEC_STATE_SWITCHING_ROLE)
@@ -4371,7 +4622,7 @@
if (((p_dev_rec->security_required & BTM_SEC_FORCE_MASTER) && !p_dev_rec->role_master)
|| ((p_dev_rec->security_required & BTM_SEC_FORCE_SLAVE) && p_dev_rec->role_master))
{
- btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING);
+ btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING, FALSE);
return;
}
@@ -4384,7 +4635,7 @@
if ((res = (UINT8)btm_sec_execute_procedure (p_dev_rec)) != BTM_CMD_STARTED)
{
- btm_sec_dev_rec_cback_event (p_dev_rec, res);
+ btm_sec_dev_rec_cback_event (p_dev_rec, res, FALSE);
}
}
@@ -4418,7 +4669,7 @@
return(BTM_BUSY);
}
- return(btm_sec_send_hci_disconnect(p_dev_rec, reason));
+ return(btm_sec_send_hci_disconnect(p_dev_rec, reason, handle));
}
/*******************************************************************************
@@ -4437,6 +4688,7 @@
UINT8 old_pairing_flags = btm_cb.pairing_flags;
int result = HCI_ERR_AUTH_FAILURE;
tBTM_SEC_CALLBACK *p_callback = NULL;
+ tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR;
/* If page was delayed for disc complete, can do it now */
btm_cb.discing = FALSE;
@@ -4446,21 +4698,23 @@
if (!p_dev_rec)
return;
+ transport = (handle == p_dev_rec->hci_handle) ? BT_TRANSPORT_BR_EDR: BT_TRANSPORT_LE;
+
p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING; /* reset flag */
#if BTM_DISC_DURING_RS == TRUE
- BTM_TRACE_ERROR0("btm_sec_disconnected - Clearing Pending flag");
+ BTM_TRACE_ERROR("btm_sec_disconnected - Clearing Pending flag");
p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING; /* reset flag */
#endif
/* clear unused flags */
p_dev_rec->sm4 &= BTM_SM4_TRUE;
- BTM_TRACE_EVENT6("btm_sec_disconnected() sec_req:x%x State: %s reason:%d bda:%04x%08x RName:%s",
+ BTM_TRACE_EVENT("btm_sec_disconnected() sec_req:x%x State: %s reason:%d bda:%04x%08x RName:%s",
p_dev_rec->security_required, btm_pair_state_descr(btm_cb.pairing_state), reason, (p_dev_rec->bd_addr[0]<<8)+p_dev_rec->bd_addr[1],
(p_dev_rec->bd_addr[2]<<24)+(p_dev_rec->bd_addr[3]<<16)+(p_dev_rec->bd_addr[4]<<8)+p_dev_rec->bd_addr[5], p_dev_rec->sec_bd_name);
- BTM_TRACE_EVENT1("before Update sec_flags=0x%x", p_dev_rec->sec_flags);
+ BTM_TRACE_EVENT("before Update sec_flags=0x%x", p_dev_rec->sec_flags);
/* If we are in the process of bonding we need to tell client that auth failed */
if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
@@ -4487,16 +4741,24 @@
}
}
- p_dev_rec->hci_handle = BTM_SEC_INVALID_HANDLE;
- p_dev_rec->sec_state = BTM_SEC_STATE_IDLE;
-
#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
p_dev_rec->enc_key_size = 0;
- btm_ble_update_mode_operation(HCI_ROLE_UNKNOWN, p_dev_rec->bd_addr, FALSE);
+ btm_ble_update_mode_operation(HCI_ROLE_UNKNOWN, p_dev_rec->bd_addr, HCI_SUCCESS);
/* see sec_flags processing in btm_acl_removed */
-#endif
- p_dev_rec->sec_flags &= ~(BTM_SEC_AUTHORIZED | BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED | BTM_SEC_ROLE_SWITCHED);
+ if (transport == BT_TRANSPORT_LE)
+ {
+ p_dev_rec->ble_hci_handle = BTM_SEC_INVALID_HANDLE;
+ p_dev_rec->sec_flags &= ~(BTM_SEC_LE_AUTHENTICATED|BTM_SEC_LE_ENCRYPTED);
+ }
+ else
+#endif
+ {
+ p_dev_rec->hci_handle = BTM_SEC_INVALID_HANDLE;
+ p_dev_rec->sec_flags &= ~(BTM_SEC_AUTHORIZED | BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED | BTM_SEC_ROLE_SWITCHED);
+ }
+
+ p_dev_rec->sec_state = BTM_SEC_STATE_IDLE;
p_dev_rec->security_required = BTM_SEC_NONE;
p_callback = p_dev_rec->p_callback;
@@ -4506,10 +4768,10 @@
{
p_dev_rec->p_callback = NULL; /* when the peer device time out the authentication before
we do, this call back must be reset here */
- (*p_callback) (p_dev_rec->bd_addr, p_dev_rec->p_ref_data, BTM_ERR_PROCESSING);
+ (*p_callback) (p_dev_rec->bd_addr, transport, p_dev_rec->p_ref_data, BTM_ERR_PROCESSING);
}
- BTM_TRACE_EVENT1("after Update sec_flags=0x%x", p_dev_rec->sec_flags);
+ BTM_TRACE_EVENT("after Update sec_flags=0x%x", p_dev_rec->sec_flags);
}
/*******************************************************************************
@@ -4527,7 +4789,7 @@
tBTM_SEC_DEV_REC *p_dev_rec = btm_find_or_alloc_dev (p_bda);
BOOLEAN we_are_bonding = FALSE;
- BTM_TRACE_EVENT3 ("btm_sec_link_key_notification() BDA:%04x%08x, TYPE: %d",
+ BTM_TRACE_EVENT ("btm_sec_link_key_notification() BDA:%04x%08x, TYPE: %d",
(p_bda[0]<<8)+p_bda[1], (p_bda[2]<<24)+(p_bda[3]<<16)+(p_bda[4]<<8)+p_bda[5],
key_type);
@@ -4561,7 +4823,7 @@
if ((!(p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN)
&& ((p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK) != BTM_COD_MAJOR_PERIPHERAL)) )
{
- BTM_TRACE_EVENT3 ("btm_sec_link_key_notification() Delayed BDA: %08x%04x Type:%d",
+ BTM_TRACE_EVENT ("btm_sec_link_key_notification() Delayed BDA: %08x%04x Type:%d",
(p_bda[0]<<24) + (p_bda[1]<<16) + (p_bda[2]<<8) + p_bda[3], (p_bda[4] << 8) + p_bda[5], key_type);
p_dev_rec->link_key_not_sent = TRUE;
@@ -4573,7 +4835,7 @@
btm_inq_rmt_name_failed();
}
- BTM_TRACE_EVENT3 ("rmt_io_caps:%d, sec_flags:x%x, dev_class[1]:x%02x", p_dev_rec->rmt_io_caps, p_dev_rec->sec_flags, p_dev_rec->dev_class[1])
+ BTM_TRACE_EVENT ("rmt_io_caps:%d, sec_flags:x%x, dev_class[1]:x%02x", p_dev_rec->rmt_io_caps, p_dev_rec->sec_flags, p_dev_rec->dev_class[1])
return;
}
@@ -4613,9 +4875,19 @@
{
tBTM_SEC_DEV_REC *p_dev_rec = btm_find_or_alloc_dev (p_bda);
- BTM_TRACE_EVENT6 ("btm_sec_link_key_request() BDA: %02x:%02x:%02x:%02x:%02x:%02x",
+ BTM_TRACE_EVENT ("btm_sec_link_key_request() BDA: %02x:%02x:%02x:%02x:%02x:%02x",
p_bda[0], p_bda[1], p_bda[2], p_bda[3], p_bda[4], p_bda[5]);
+ if( (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_PIN_REQ) &&
+ (btm_cb.collision_start_time != 0) &&
+ (memcmp (btm_cb.p_collided_dev_rec->bd_addr, p_bda, BD_ADDR_LEN) == 0) )
+ {
+ BTM_TRACE_EVENT ("btm_sec_link_key_request() rejecting link key req "
+ "State: %d START_TIMEOUT : %d",
+ btm_cb.pairing_state, btm_cb.collision_start_time);
+ btsnd_hcic_link_key_neg_reply (p_bda);
+ return;
+ }
if (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)
{
btsnd_hcic_link_key_req_reply (p_bda, p_dev_rec->link_key);
@@ -4673,7 +4945,7 @@
*/
p_dev_rec = btm_find_dev (p_cb->pairing_bda);
- BTM_TRACE_EVENT2 ("btm_sec_pairing_timeout() State: %s Flags: %u",
+ BTM_TRACE_EVENT ("btm_sec_pairing_timeout() State: %s Flags: %u",
btm_pair_state_descr(p_cb->pairing_state), p_cb->pairing_flags);
switch (p_cb->pairing_state)
@@ -4736,12 +5008,12 @@
* now it's time to tear down the ACL link*/
if (p_dev_rec == NULL)
{
- BTM_TRACE_ERROR2 ("btm_sec_pairing_timeout() BTM_PAIR_STATE_WAIT_DISCONNECT unknown BDA: %08x%04x",
+ BTM_TRACE_ERROR ("btm_sec_pairing_timeout() BTM_PAIR_STATE_WAIT_DISCONNECT unknown BDA: %08x%04x",
(p_cb->pairing_bda[0]<<24) + (p_cb->pairing_bda[1]<<16) + (p_cb->pairing_bda[2]<<8) + p_cb->pairing_bda[3],
(p_cb->pairing_bda[4] << 8) + p_cb->pairing_bda[5]);
break;
}
- btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE);
+ btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle);
btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
break;
@@ -4765,7 +5037,7 @@
break;
default:
- BTM_TRACE_WARNING1 ("btm_sec_pairing_timeout() not processed state: %s", btm_pair_state_descr(btm_cb.pairing_state));
+ BTM_TRACE_WARNING ("btm_sec_pairing_timeout() not processed state: %s", btm_pair_state_descr(btm_cb.pairing_state));
btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
break;
}
@@ -4785,7 +5057,11 @@
tBTM_SEC_DEV_REC *p_dev_rec;
tBTM_CB *p_cb = &btm_cb;
- BTM_TRACE_EVENT3 ("btm_sec_pin_code_request() State: %s, BDA:%04x%08x",
+#ifdef PORCHE_PAIRING_CONFLICT
+ UINT8 default_pin_code_len = 4;
+ PIN_CODE default_pin_code = {0x30, 0x30, 0x30, 0x30};
+#endif
+ BTM_TRACE_EVENT ("btm_sec_pin_code_request() State: %s, BDA:%04x%08x",
btm_pair_state_descr(btm_cb.pairing_state),
(p_bda[0]<<8)+p_bda[1], (p_bda[2]<<24)+(p_bda[3]<<16)+(p_bda[4]<<8)+p_bda[5] );
@@ -4810,15 +5086,16 @@
else if ((btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_PIN_REQ)
|| memcmp (p_bda, btm_cb.pairing_bda, BD_ADDR_LEN) != 0)
{
- BTM_TRACE_WARNING1 ("btm_sec_pin_code_request() rejected - state: %s",
+ BTM_TRACE_WARNING ("btm_sec_pin_code_request() rejected - state: %s",
btm_pair_state_descr(btm_cb.pairing_state));
#ifdef PORCHE_PAIRING_CONFLICT
/* reply pin code again due to counter in_rand when local initiates pairing */
- BTM_TRACE_EVENT0 ("btm_sec_pin_code_request from remote dev. for local initiated pairing");
+ BTM_TRACE_EVENT ("btm_sec_pin_code_request from remote dev. for local initiated pairing");
if(! btm_cb.pin_code_len_saved)
{
- btsnd_hcic_pin_code_neg_reply (p_bda);
+ btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
+ btsnd_hcic_pin_code_req_reply (p_bda, default_pin_code_len, default_pin_code);
}
else
{
@@ -4847,7 +5124,7 @@
if (!p_cb->pairing_disabled && (p_cb->cfg.pin_type == HCI_PIN_TYPE_FIXED))
{
- BTM_TRACE_EVENT0 ("btm_sec_pin_code_request fixed pin replying");
+ BTM_TRACE_EVENT ("btm_sec_pin_code_request fixed pin replying");
btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
btsnd_hcic_pin_code_req_reply (p_bda, p_cb->cfg.pin_code_len, p_cb->cfg.pin_code);
return;
@@ -4861,7 +5138,7 @@
/* We could have started connection after asking user for the PIN code */
if (btm_cb.pin_code_len != 0)
{
- BTM_TRACE_EVENT0 ("btm_sec_pin_code_request bonding sending reply");
+ BTM_TRACE_EVENT ("btm_sec_pin_code_request bonding sending reply");
btsnd_hcic_pin_code_req_reply (p_bda, btm_cb.pin_code_len, p_cb->pin_code);
#ifdef PORCHE_PAIRING_CONFLICT
@@ -4890,7 +5167,7 @@
&& ((p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK) == BTM_COD_MAJOR_PERIPHERAL)
&& (p_dev_rec->dev_class[2] & BTM_COD_MINOR_KEYBOARD)) )
{
- BTM_TRACE_WARNING3("btm_sec_pin_code_request(): Pairing disabled:%d; PIN callback:%x, Dev Rec:%x!",
+ BTM_TRACE_WARNING("btm_sec_pin_code_request(): Pairing disabled:%d; PIN callback:%x, Dev Rec:%x!",
p_cb->pairing_disabled, p_cb->api.p_pin_callback, p_dev_rec);
btsnd_hcic_pin_code_neg_reply (p_bda);
@@ -4911,7 +5188,7 @@
/* Also cannot send remote name request while paging, i.e. connection is not completed */
if (p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN)
{
- BTM_TRACE_EVENT0 ("btm_sec_pin_code_request going for callback");
+ BTM_TRACE_EVENT ("btm_sec_pin_code_request going for callback");
btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD;
if (p_cb->api.p_pin_callback)
@@ -4919,7 +5196,7 @@
}
else
{
- BTM_TRACE_EVENT0 ("btm_sec_pin_code_request going for remote name");
+ BTM_TRACE_EVENT ("btm_sec_pin_code_request going for remote name");
/* We received PIN code request for the device with unknown name */
/* it is not user friendly just to ask for the PIN without name */
@@ -4931,7 +5208,7 @@
p_dev_rec->sec_flags |= BTM_SEC_NAME_KNOWN;
p_dev_rec->sec_bd_name[0] = 'f';
p_dev_rec->sec_bd_name[1] = '0';
- BTM_TRACE_ERROR0 ("can not send rmt_name_req?? fake a name and call callback");
+ BTM_TRACE_ERROR ("can not send rmt_name_req?? fake a name and call callback");
btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD;
if (p_cb->api.p_pin_callback)
@@ -4990,7 +5267,7 @@
*******************************************************************************/
static tBTM_STATUS btm_sec_execute_procedure (tBTM_SEC_DEV_REC *p_dev_rec)
{
- BTM_TRACE_EVENT3 ("btm_sec_execute_procedure: Required:0x%x Flags:0x%x State:%d",
+ BTM_TRACE_EVENT ("btm_sec_execute_procedure: Required:0x%x Flags:0x%x State:%d",
p_dev_rec->security_required, p_dev_rec->sec_flags, p_dev_rec->sec_state);
/* There is a chance that we are getting name. Wait until done. */
@@ -5001,7 +5278,7 @@
if (!(p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN)
&& (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE))
{
- BTM_TRACE_EVENT0 ("Security Manager: Start get name");
+ BTM_TRACE_EVENT ("Security Manager: Start get name");
if (!btm_sec_start_get_name (p_dev_rec))
{
return(BTM_NO_RESOURCES);
@@ -5022,7 +5299,7 @@
return(BTM_FAILED_ON_SECURITY);
#endif
- BTM_TRACE_EVENT0 ("Security Manager: Start authentication");
+ BTM_TRACE_EVENT ("Security Manager: Start authentication");
if (!btm_sec_start_authentication (p_dev_rec))
{
@@ -5044,7 +5321,7 @@
return(BTM_FAILED_ON_SECURITY);
#endif
- BTM_TRACE_EVENT0 ("Security Manager: Start encryption");
+ BTM_TRACE_EVENT ("Security Manager: Start encryption");
if (!btm_sec_start_encryption (p_dev_rec))
{
@@ -5059,7 +5336,7 @@
&& (( p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_OUT_AUTHORIZE))
|| (!p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_IN_AUTHORIZE))))
{
- BTM_TRACE_EVENT2 ("service id:%d, is trusted:%d",
+ BTM_TRACE_EVENT ("service id:%d, is trusted:%d",
p_dev_rec->p_cur_service->service_id,
(BTM_SEC_IS_SERVICE_TRUSTED(p_dev_rec->trusted_mask,
p_dev_rec->p_cur_service->service_id)));
@@ -5068,7 +5345,7 @@
(BTM_SEC_IS_SERVICE_TRUSTED(p_dev_rec->trusted_mask,
p_dev_rec->p_cur_service->service_id) == FALSE))
{
- BTM_TRACE_EVENT0 ("Security Manager: Start authorization");
+ BTM_TRACE_EVENT ("Security Manager: Start authorization");
return(btm_sec_start_authorization (p_dev_rec));
}
}
@@ -5080,8 +5357,8 @@
BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER |
BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE);
- BTM_TRACE_EVENT2 ("Security Manager: trusted:0x%04x%04x", p_dev_rec->trusted_mask[1], p_dev_rec->trusted_mask[0]);
- BTM_TRACE_EVENT0 ("Security Manager: access granted");
+ BTM_TRACE_EVENT ("Security Manager: trusted:0x%04x%04x", p_dev_rec->trusted_mask[1], p_dev_rec->trusted_mask[0]);
+ BTM_TRACE_EVENT ("Security Manager: access granted");
return(BTM_SUCCESS);
}
@@ -5198,7 +5475,7 @@
else /* Already authorized once for this L2CAP bringup */
{
- BTM_TRACE_DEBUG1 ("btm_sec_start_authorization: (Ignoring extra Authorization prompt for service %d)", service_id);
+ BTM_TRACE_DEBUG ("btm_sec_start_authorization: (Ignoring extra Authorization prompt for service %d)", service_id);
return (BTM_SUCCESS);
}
@@ -5329,7 +5606,7 @@
tBTM_SEC_SERV_REC *p_serv_rec = &btm_cb.sec_serv_rec[0];
int i;
- BTM_TRACE_DEBUG0 ("btm_sec_find_mx_serv");
+ BTM_TRACE_DEBUG ("btm_sec_find_mx_serv");
if (is_originator && p_out_serv && p_out_serv->psm == psm
&& p_out_serv->mx_proto_id == mx_proto_id
&& p_out_serv->orig_mx_chan_id == mx_chan_id)
@@ -5370,7 +5647,7 @@
tBTM_STATUS status;
UNUSED(p_tle);
- BTM_TRACE_EVENT0 ("btm_sec_collision_timeout()");
+ BTM_TRACE_EVENT ("btm_sec_collision_timeout()");
btm_cb.sec_collision_tle.param = 0;
status = btm_sec_execute_procedure (btm_cb.p_collided_dev_rec);
@@ -5379,7 +5656,7 @@
if (status != BTM_CMD_STARTED)
{
/* There is no next procedure or start of procedure failed, notify the waiting layer */
- btm_sec_dev_rec_cback_event (btm_cb.p_collided_dev_rec, status);
+ btm_sec_dev_rec_cback_event (btm_cb.p_collided_dev_rec, status, FALSE);
}
}
@@ -5442,7 +5719,7 @@
if (btm_cb.security_mode_changed)
{
btm_cb.security_mode_changed = FALSE;
- BTM_TRACE_DEBUG1("btm_restore_mode: Authen Enable -> %d", (btm_cb.security_mode == BTM_SEC_MODE_LINK));
+ BTM_TRACE_DEBUG("btm_restore_mode: Authen Enable -> %d", (btm_cb.security_mode == BTM_SEC_MODE_LINK));
btsnd_hcic_write_auth_enable ((UINT8)(btm_cb.security_mode == BTM_SEC_MODE_LINK));
}
@@ -5492,11 +5769,11 @@
{
tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev_by_handle (handle);
- BTM_TRACE_EVENT2 ("BTM_snd_conn_encrypt Security Manager: encrypt_change p_dev_rec : 0x%x, enable = %s", p_dev_rec, (enable == TRUE) ? "TRUE" : "FALSE");
+ BTM_TRACE_EVENT ("BTM_snd_conn_encrypt Security Manager: encrypt_change p_dev_rec : 0x%x, enable = %s", p_dev_rec, (enable == TRUE) ? "TRUE" : "FALSE");
if (!p_dev_rec)
{
- BTM_TRACE_EVENT1 ("BTM_snd_conn_encrypt Error no p_dev_rec : 0x%x\n", p_dev_rec);
+ BTM_TRACE_EVENT ("BTM_snd_conn_encrypt Error no p_dev_rec : 0x%x\n", p_dev_rec);
return(FALSE);
}
@@ -5524,8 +5801,8 @@
{
tBTM_PAIRING_STATE old_state = btm_cb.pairing_state;
- BTM_TRACE_EVENT1 ("btm_sec_change_pairing_state Old: %s", btm_pair_state_descr(btm_cb.pairing_state));
- BTM_TRACE_EVENT2 ("btm_sec_change_pairing_state New: %s pairing_flags:0x%x",btm_pair_state_descr(new_state), btm_cb.pairing_flags);
+ BTM_TRACE_EVENT ("btm_sec_change_pairing_state Old: %s", btm_pair_state_descr(btm_cb.pairing_state));
+ BTM_TRACE_EVENT ("btm_sec_change_pairing_state New: %s pairing_flags:0x%x",btm_pair_state_descr(new_state), btm_cb.pairing_flags);
btm_cb.pairing_state = new_state;
@@ -5604,15 +5881,16 @@
** Parameters: void
**
*******************************************************************************/
-void btm_sec_dev_rec_cback_event (tBTM_SEC_DEV_REC *p_dev_rec, UINT8 res)
+void btm_sec_dev_rec_cback_event (tBTM_SEC_DEV_REC *p_dev_rec, UINT8 res, BOOLEAN is_le_transport)
{
tBTM_SEC_CALLBACK *p_callback = p_dev_rec->p_callback;
+ tBT_TRANSPORT transport = is_le_transport ? BT_TRANSPORT_LE : BT_TRANSPORT_BR_EDR;
if (p_dev_rec->p_callback)
{
p_dev_rec->p_callback = NULL;
- (*p_callback) (p_dev_rec->bd_addr, p_dev_rec->p_ref_data, res);
+ (*p_callback) (p_dev_rec->bd_addr, transport, p_dev_rec->p_ref_data, res);
}
btm_sec_check_pending_reqs();
@@ -5644,7 +5922,7 @@
memcpy (p_e->bd_addr, bd_addr, BD_ADDR_LEN);
- BTM_TRACE_EVENT4 ("btm_sec_queue_mx_request() PSM: 0x%04x Is_Orig: %u mx_proto_id: %u mx_chan_id: %u",
+ BTM_TRACE_EVENT ("btm_sec_queue_mx_request() PSM: 0x%04x Is_Orig: %u mx_proto_id: %u mx_chan_id: %u",
psm, is_orig, mx_proto_id, mx_chan_id);
GKI_enqueue (&btm_cb.sec_pending_q, p_e);
@@ -5664,7 +5942,7 @@
if ((major == BTM_COD_MAJOR_AUDIO)
&& ((minor == BTM_COD_MINOR_CONFM_HANDSFREE) || (minor == BTM_COD_MINOR_CAR_AUDIO)) )
{
- BTM_TRACE_EVENT2 ("btm_sec_check_prefetch_pin: Skipping pre-fetch PIN for carkit COD Major: 0x%02x Minor: 0x%02x", major, minor);
+ BTM_TRACE_EVENT ("btm_sec_check_prefetch_pin: Skipping pre-fetch PIN for carkit COD Major: 0x%02x Minor: 0x%02x", major, minor);
if (btm_cb.security_mode_changed == FALSE)
{
@@ -5689,8 +5967,8 @@
/* pin was not supplied - pre-fetch pin code now */
if (btm_cb.api.p_pin_callback && ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_PIN_REQD) == 0))
{
- BTM_TRACE_DEBUG0("btm_sec_check_prefetch_pin: PIN code callback called");
- if (btm_bda_to_acl(p_dev_rec->bd_addr) == NULL)
+ BTM_TRACE_DEBUG("btm_sec_check_prefetch_pin: PIN code callback called");
+ if (btm_bda_to_acl(p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR) == NULL)
btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD;
(btm_cb.api.p_pin_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, p_dev_rec->sec_bd_name);
}
@@ -5717,7 +5995,7 @@
void btm_sec_clear_ble_keys (tBTM_SEC_DEV_REC *p_dev_rec)
{
- BTM_TRACE_DEBUG0 ("btm_sec_clear_ble_keys: Clearing BLE Keys");
+ BTM_TRACE_DEBUG ("btm_sec_clear_ble_keys: Clearing BLE Keys");
#if (SMP_INCLUDED== TRUE)
p_dev_rec->ble.key_type = 0;
memset (&p_dev_rec->ble.keys, 0, sizeof(tBTM_SEC_BLE_KEYS));
@@ -5741,13 +6019,15 @@
tBTM_SEC_DEV_REC *p_dev_rec= btm_find_dev (bda);
BOOLEAN is_bonded= FALSE;
+ if (p_dev_rec &&
#if (SMP_INCLUDED== TRUE)
- if (p_dev_rec && (p_dev_rec->ble.key_type || (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)))
+ ((p_dev_rec->ble.key_type && (p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_KNOWN))||
+#endif
+ (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)))
{
is_bonded = TRUE;
}
-#endif
- BTM_TRACE_DEBUG1 ("btm_sec_is_a_bonded_dev is_bonded=%d", is_bonded);
+ BTM_TRACE_DEBUG ("btm_sec_is_a_bonded_dev is_bonded=%d", is_bonded);
return(is_bonded);
}
@@ -5793,7 +6073,7 @@
int i;
if (start_idx >= BTM_SEC_MAX_DEVICE_RECORDS)
{
- BTM_TRACE_DEBUG0 ("LE bonded device not found");
+ BTM_TRACE_DEBUG ("LE bonded device not found");
return found;
}
@@ -5807,7 +6087,7 @@
break;
}
}
- BTM_TRACE_DEBUG1 ("btm_sec_find_bonded_dev=%d", found);
+ BTM_TRACE_DEBUG ("btm_sec_find_bonded_dev=%d", found);
#endif
return(found);
}
diff --git a/stack/btu/btu_hcif.c b/stack/btu/btu_hcif.c
index 0081850..9ec8dd3 100644
--- a/stack/btu/btu_hcif.c
+++ b/stack/btu/btu_hcif.c
@@ -37,6 +37,9 @@
#include "btm_api.h"
#include "btm_int.h"
+extern void btm_process_cancel_complete(UINT8 status, UINT8 mode);
+extern void btm_ble_test_command_complete(UINT8 *p);
+
// btla-specific ++
#define LOG_TAG "BTLD"
#if (defined(ANDROID_APP_INCLUDED) && (ANDROID_APP_INCLUDED == TRUE) && (!defined(LINUX_NATIVE)) )
@@ -133,9 +136,12 @@
static void btu_ble_ll_conn_complete_evt (UINT8 *p, UINT16 evt_len);
static void btu_ble_process_adv_pkt (UINT8 *p);
static void btu_ble_read_remote_feat_evt (UINT8 *p);
-static void btu_ble_ll_conn_param_upd_evt (UINT8 *p);
+static void btu_ble_ll_conn_param_upd_evt (UINT8 *p, UINT16 evt_len);
static void btu_ble_proc_ltk_req (UINT8 *p);
static void btu_hcif_encryption_key_refresh_cmpl_evt (UINT8 *p);
+#if (BLE_LLT_INCLUDED == TRUE)
+static void btu_ble_rc_param_req_evt(UINT8 *p);
+#endif
#endif
/*******************************************************************************
**
@@ -188,11 +194,6 @@
#endif
)
{
-#if 0
- BT_TRACE_2 (TRACE_LAYER_HCI, TRACE_TYPE_DEBUG,
- "Storing VSC callback opcode=0x%04x, Callback function=0x%07x",
- opcode, *(UINT32 *)(p_buf + 1));
-#endif
memcpy ((UINT8 *)(p_cmd + 1), (UINT8 *)(p_buf + 1), sizeof(void *));
}
@@ -401,8 +402,7 @@
case HCI_BLE_EVENT:
STREAM_TO_UINT8 (ble_sub_code, p);
- BT_TRACE_2 (TRACE_LAYER_HCI, TRACE_TYPE_EVENT, "BLE HCI(id=%d) event = 0x%02x)",
- hci_evt_code, ble_sub_code);
+ HCI_TRACE_EVENT("BLE HCI(id=%d) event = 0x%02x)", hci_evt_code, ble_sub_code);
switch (ble_sub_code)
{
@@ -413,7 +413,7 @@
btu_ble_ll_conn_complete_evt(p, hci_evt_len);
break;
case HCI_BLE_LL_CONN_PARAM_UPD_EVT:
- btu_ble_ll_conn_param_upd_evt(p);
+ btu_ble_ll_conn_param_upd_evt(p, hci_evt_len);
break;
case HCI_BLE_READ_REMOTE_FEAT_CMPL_EVT:
btu_ble_read_remote_feat_evt(p);
@@ -421,6 +421,12 @@
case HCI_BLE_LTK_REQ_EVT: /* received only at slave device */
btu_ble_proc_ltk_req(p);
break;
+#if (BLE_LLT_INCLUDED == TRUE)
+ case HCI_BLE_RC_PARAM_REQ_EVT:
+ btu_ble_rc_param_req_evt(p);
+ break;
+#endif
+
}
break;
#endif /* BLE_INCLUDED */
@@ -498,7 +504,7 @@
else
{
/* Unknown controller */
- BT_TRACE_1 (TRACE_LAYER_HCI, TRACE_TYPE_WARNING, "BTU HCI(ctrl id=%d) controller ID not recognized", controller_id);
+ HCI_TRACE_WARNING("BTU HCI(ctrl id=%d) controller ID not recognized", controller_id);
GKI_freebuf(p_buf);;
}
@@ -1100,7 +1106,7 @@
break;
#if (BLE_INCLUDED == TRUE)
-/* BLE Commands */
+/* BLE Commands sComplete*/
case HCI_BLE_READ_WHITE_LIST_SIZE :
btm_read_white_list_size_complete(p, evt_len);
break;
@@ -1119,9 +1125,9 @@
case HCI_BLE_RAND:
case HCI_BLE_ENCRYPT:
-
btm_ble_rand_enc_complete (p, opcode, (tBTM_RAND_ENC_CB *)p_cplt_cback);
break;
+
case HCI_BLE_READ_BUFFER_SIZE:
btm_read_ble_buf_size_complete(p, evt_len);
break;
@@ -1138,6 +1144,14 @@
btm_ble_write_adv_enable_complete(p);
break;
+ case HCI_BLE_READ_SUPPORTED_STATES:
+ btm_read_ble_local_supported_states_complete(p, evt_len);
+ break;
+
+ case HCI_BLE_CREATE_LL_CONN:
+ btm_ble_create_ll_conn_complete(*p);
+ break;
+
case HCI_BLE_TRANSMITTER_TEST:
case HCI_BLE_RECEIVER_TEST:
case HCI_BLE_TEST_END:
@@ -1375,6 +1389,12 @@
btm_sec_encrypt_change (BTM_INVALID_HCI_HANDLE, status, FALSE);
break;
+#if BLE_INCLUDED == TRUE
+ case HCI_BLE_CREATE_LL_CONN:
+ btm_ble_create_ll_conn_complete(status);
+ break;
+#endif
+
#if BTM_SCO_INCLUDED == TRUE
case HCI_SETUP_ESCO_CONNECTION:
/* read handle out of stored command */
@@ -1504,8 +1524,7 @@
}
else
{
- BT_TRACE_1 (TRACE_LAYER_HCI, TRACE_TYPE_WARNING,
- "No command in queue matching opcode %d", opcode);
+ HCI_TRACE_WARNING("No command in queue matching opcode %d", opcode);
}
/* See if we can forward any more commands */
@@ -1533,7 +1552,7 @@
#if (defined(BTU_CMD_CMPL_TOUT_DOUBLE_CHECK) && BTU_CMD_CMPL_TOUT_DOUBLE_CHECK == TRUE)
if (!(p_hci_cmd_cb->checked_hcisu))
{
- BT_TRACE_1 (TRACE_LAYER_HCI, TRACE_TYPE_WARNING, "BTU HCI(id=%d) command timeout - double check HCISU", controller_id);
+ HCI_TRACE_WARNING("BTU HCI(id=%d) command timeout - double check HCISU", controller_id);
/* trigger HCISU to read any pending data in transport buffer */
GKI_send_event(HCISU_TASK, HCISU_EVT_MASK);
@@ -1555,7 +1574,7 @@
/* get queued command */
if ((p_cmd = (BT_HDR *) GKI_dequeue (&(p_hci_cmd_cb->cmd_cmpl_q))) == NULL)
{
- BT_TRACE_0 (TRACE_LAYER_HCI, TRACE_TYPE_WARNING, "Cmd timeout; no cmd in queue");
+ HCI_TRACE_WARNING("Cmd timeout; no cmd in queue");
return;
}
@@ -1578,7 +1597,7 @@
if (controller_id == NFC_CONTROLLER_ID)
{
//TODO call nfc_ncif_cmd_timeout
- BT_TRACE_2 (TRACE_LAYER_HCI, TRACE_TYPE_WARNING, "BTU NCI command timeout - header 0x%02x%02x", p[0], p[1]);
+ HCI_TRACE_WARNING("BTU NCI command timeout - header 0x%02x%02x", p[0], p[1]);
return;
}
#endif
@@ -1594,7 +1613,7 @@
ALOGE("#");
ALOGE("######################################################################");
#else
- BT_TRACE_2 (TRACE_LAYER_HCI, TRACE_TYPE_WARNING, "BTU HCI(id=%d) command timeout. opcode=0x%x", controller_id, opcode);
+ HCI_TRACE_WARNING("BTU HCI(id=%d) command timeout. opcode=0x%x", controller_id, opcode);
#endif
// btla-specific ++
@@ -1634,11 +1653,6 @@
)
{
p_cplt_cback = *((void **)(p_cmd + 1));
-#if 0
- BT_TRACE_2 (TRACE_LAYER_HCI, TRACE_TYPE_DEBUG,
- "Restoring VSC callback for opcode=0x%04x, Callback function=0x%07x",
- opcode, (UINT32)p_cplt_cback);
-#endif
}
/* fake a command complete; first create a fake event */
@@ -1655,8 +1669,7 @@
times, Bluetooth process will be killed and restarted */
if (num_hci_cmds_timed_out >= BTM_MAX_HCI_CMD_TOUT_BEFORE_RESTART)
{
- BT_TRACE_1(TRACE_LAYER_HCI, TRACE_TYPE_ERROR,
- "Num consecutive HCI Cmd tout =%d Restarting BT process",num_hci_cmds_timed_out);
+ HCI_TRACE_ERROR("Num consecutive HCI Cmd tout =%d Restarting BT process",num_hci_cmds_timed_out);
usleep(10000); /* 10 milliseconds */
/* Killing the process to force a restart as part of fault tolerance */
@@ -1664,8 +1677,7 @@
}
else
{
- BT_TRACE_1 (TRACE_LAYER_HCI, TRACE_TYPE_WARNING, "HCI Cmd timeout counter %d",
- num_hci_cmds_timed_out);
+ HCI_TRACE_WARNING("HCI Cmd timeout counter %d", num_hci_cmds_timed_out);
/* If anyone wants device status notifications, give him one */
btm_report_device_status (BTM_DEV_STATUS_CMD_TOUT);
@@ -1685,7 +1697,7 @@
*******************************************************************************/
static void btu_hcif_hardware_error_evt (UINT8 *p)
{
- BT_TRACE_1 (TRACE_LAYER_HCI, TRACE_TYPE_ERROR, "Ctlr H/w error event - code:0x%x", *p);
+ HCI_TRACE_ERROR("Ctlr H/w error event - code:0x%x", *p);
/* If anyone wants device status notifications, give him one. */
btm_report_device_status (BTM_DEV_STATUS_DOWN);
@@ -2254,7 +2266,7 @@
static void btu_ble_process_adv_pkt (UINT8 *p)
{
- BT_TRACE_0 (TRACE_LAYER_HCI, TRACE_TYPE_EVENT, "btu_ble_process_adv_pkt");
+ HCI_TRACE_EVENT("btu_ble_process_adv_pkt");
btm_ble_process_adv_pkt(p);
}
@@ -2264,18 +2276,17 @@
btm_ble_conn_complete(p, evt_len);
}
-static void btu_ble_ll_conn_param_upd_evt (UINT8 *p)
+static void btu_ble_ll_conn_param_upd_evt (UINT8 *p, UINT16 evt_len)
{
/* LE connection update has completed successfully as a master. */
/* We can enable the update request if the result is a success. */
/* extract the HCI handle first */
UINT8 status;
UINT16 handle;
- BT_TRACE_0(TRACE_LAYER_HCI, TRACE_TYPE_EVENT, "btu_ble_ll_conn_param_upd_evt");
STREAM_TO_UINT8 (status, p);
STREAM_TO_UINT16 (handle, p);
- L2CA_HandleConnUpdateEvent(handle, status);
+ l2cble_process_conn_update_evt(handle, status);
}
static void btu_ble_read_remote_feat_evt (UINT8 *p)
@@ -2299,5 +2310,21 @@
/**********************************************
** End of BLE Events Handler
***********************************************/
+#if (defined BLE_LLT_INCLUDED) && (BLE_LLT_INCLUDED == TRUE)
+static void btu_ble_rc_param_req_evt(UINT8 *p)
+{
+ UINT16 handle;
+ UINT16 int_min, int_max, latency, timeout;
+
+ STREAM_TO_UINT16(handle, p);
+ STREAM_TO_UINT16(int_min, p);
+ STREAM_TO_UINT16(int_max, p);
+ STREAM_TO_UINT16(latency, p);
+ STREAM_TO_UINT16(timeout, p);
+
+ l2cble_process_rc_param_request_evt(handle, int_min, int_max, latency, timeout);
+}
+#endif /* BLE_LLT_INCLUDED */
+
#endif /* BLE_INCLUDED */
diff --git a/stack/btu/btu_init.c b/stack/btu/btu_init.c
index fe52361..c29d3e2 100644
--- a/stack/btu/btu_init.c
+++ b/stack/btu/btu_init.c
@@ -149,7 +149,7 @@
*******************************************************************************/
void btu_uipc_rx_cback(BT_HDR *p_msg)
{
- BT_TRACE_3 (TRACE_LAYER_BTM, TRACE_TYPE_DEBUG, "btu_uipc_rx_cback event 0x%x, len %d, offset %d",
+ BT_TRACE(TRACE_LAYER_BTM, TRACE_TYPE_DEBUG, "btu_uipc_rx_cback event 0x%x, len %d, offset %d",
p_msg->event, p_msg->len, p_msg->offset);
GKI_send_msg(BTU_TASK, BTU_HCI_RCV_MBOX, p_msg);
diff --git a/stack/btu/btu_task.c b/stack/btu/btu_task.c
index 9c09214..16c671c 100644
--- a/stack/btu/btu_task.c
+++ b/stack/btu/btu_task.c
@@ -39,6 +39,7 @@
#include "l2c_int.h"
#include "btu.h"
#include "bt_utils.h"
+#include <sys/prctl.h>
#include "sdpint.h"
@@ -170,7 +171,7 @@
#if (defined(HCISU_H4_INCLUDED) && HCISU_H4_INCLUDED == TRUE)
/* wait an event that HCISU is ready */
- BT_TRACE_0(TRACE_LAYER_BTU, TRACE_TYPE_API,
+ BT_TRACE(TRACE_LAYER_BTU, TRACE_TYPE_API,
"btu_task pending for preload complete event");
for (;;)
@@ -179,7 +180,7 @@
if (event & EVENT_MASK(GKI_SHUTDOWN_EVT))
{
/* indicates BT ENABLE abort */
- BT_TRACE_0(TRACE_LAYER_BTU, TRACE_TYPE_WARNING,
+ BT_TRACE(TRACE_LAYER_BTU, TRACE_TYPE_WARNING,
"btu_task start abort!");
return (0);
}
@@ -189,13 +190,13 @@
}
else
{
- BT_TRACE_1(TRACE_LAYER_BTU, TRACE_TYPE_WARNING,
+ BT_TRACE(TRACE_LAYER_BTU, TRACE_TYPE_WARNING,
"btu_task ignore evt %04x while pending for preload complete",
event);
}
}
- BT_TRACE_0(TRACE_LAYER_BTU, TRACE_TYPE_API,
+ BT_TRACE(TRACE_LAYER_BTU, TRACE_TYPE_API,
"btu_task received preload complete event");
#endif
@@ -221,6 +222,8 @@
/* Send a startup evt message to BTIF_TASK to kickstart the init procedure */
GKI_send_event(BTIF_TASK, BT_EVT_TRIGGER_STACK_INIT);
+ prctl(PR_SET_NAME, (unsigned long)"BTU TASK", 0, 0, 0);
+
raise_priority_a2dp(TASK_HIGH_BTU);
/* Wait for, and process, events */
@@ -331,13 +334,32 @@
break;
case BT_EVT_TO_STOP_TIMER:
- if (btu_cb.timer_queue.p_first == NULL)
- {
+ if (GKI_timer_queue_is_empty(&btu_cb.timer_queue)) {
GKI_stop_timer(TIMER_0);
}
GKI_freebuf (p_msg);
break;
+ case BT_EVT_TO_START_TIMER_ONESHOT:
+ if (!GKI_timer_queue_is_empty(&btu_cb.timer_queue_oneshot)) {
+ TIMER_LIST_ENT *tle = GKI_timer_getfirst(&btu_cb.timer_queue_oneshot);
+ // Start non-repeating timer.
+ GKI_start_timer(TIMER_3, tle->ticks, FALSE);
+ } else {
+ BTM_TRACE_WARNING("Oneshot timer queue empty when received start request");
+ }
+ GKI_freebuf(p_msg);
+ break;
+
+ case BT_EVT_TO_STOP_TIMER_ONESHOT:
+ if (GKI_timer_queue_is_empty(&btu_cb.timer_queue_oneshot)) {
+ GKI_stop_timer(TIMER_3);
+ } else {
+ BTM_TRACE_WARNING("Oneshot timer queue not empty when received stop request");
+ }
+ GKI_freebuf (p_msg);
+ break;
+
#if defined(QUICK_TIMER_TICKS_PER_SEC) && (QUICK_TIMER_TICKS_PER_SEC > 0)
case BT_EVT_TO_START_QUICK_TIMER :
GKI_start_timer (TIMER_2, QUICK_TIMER_TICKS, TRUE);
@@ -374,19 +396,17 @@
}
- if (event & TIMER_0_EVT_MASK)
- {
- TIMER_LIST_ENT *p_tle;
-
+ if (event & TIMER_0_EVT_MASK) {
GKI_update_timer_list (&btu_cb.timer_queue, 1);
- while ((btu_cb.timer_queue.p_first) && (!btu_cb.timer_queue.p_first->ticks))
- {
- p_tle = btu_cb.timer_queue.p_first;
- GKI_remove_from_timer_list (&btu_cb.timer_queue, p_tle);
+ while (!GKI_timer_queue_is_empty(&btu_cb.timer_queue)) {
+ TIMER_LIST_ENT *p_tle = GKI_timer_getfirst(&btu_cb.timer_queue);
+ if (p_tle->ticks != 0)
+ break;
- switch (p_tle->event)
- {
+ GKI_remove_from_timer_list(&btu_cb.timer_queue, p_tle);
+
+ switch (p_tle->event) {
case BTU_TTYPE_BTM_DEV_CTL:
btm_dev_timeout(p_tle);
break;
@@ -400,7 +420,6 @@
case BTU_TTYPE_L2CAP_HOLD:
case BTU_TTYPE_L2CAP_INFO:
case BTU_TTYPE_L2CAP_FCR_ACK:
-
l2c_process_timeout (p_tle);
break;
@@ -472,7 +491,8 @@
#if (defined(BLE_INCLUDED) && BLE_INCLUDED == TRUE)
case BTU_TTYPE_BLE_INQUIRY:
case BTU_TTYPE_BLE_GAP_LIM_DISC:
- case BTU_TTYPE_BLE_RANDOM_ADDR:
+ case BTU_TTYPE_BLE_GAP_FAST_ADV:
+ case BTU_TTYPE_BLE_OBSERVE:
btm_ble_timeout(p_tle);
break;
@@ -560,6 +580,53 @@
}
#endif
+ if (event & TIMER_3_EVT_MASK) {
+ BTM_TRACE_API("Received oneshot timer event complete");
+ if (!GKI_timer_queue_is_empty(&btu_cb.timer_queue_oneshot)) {
+ TIMER_LIST_ENT *p_tle = GKI_timer_getfirst(&btu_cb.timer_queue_oneshot);
+ INT32 ticks_since_last_update = GKI_timer_ticks_getinitial(GKI_timer_getfirst(&btu_cb.timer_queue_oneshot));
+ GKI_update_timer_list(&btu_cb.timer_queue_oneshot, ticks_since_last_update);
+ }
+
+ while (!GKI_timer_queue_is_empty(&btu_cb.timer_queue_oneshot)) {
+ TIMER_LIST_ENT *p_tle = GKI_timer_getfirst(&btu_cb.timer_queue_oneshot);
+ if (p_tle->ticks != 0)
+ break;
+
+ GKI_remove_from_timer_list(&btu_cb.timer_queue_oneshot, p_tle);
+
+ switch (p_tle->event) {
+#if (defined(BLE_INCLUDED) && BLE_INCLUDED == TRUE)
+ case BTU_TTYPE_BLE_RANDOM_ADDR:
+ btm_ble_timeout(p_tle);
+ break;
+#endif
+
+ case BTU_TTYPE_USER_FUNC:
+ {
+ tUSER_TIMEOUT_FUNC *p_uf = (tUSER_TIMEOUT_FUNC *)p_tle->param;
+ (*p_uf)(p_tle);
+ }
+ break;
+
+ default:
+ // FAIL
+ BTM_TRACE_WARNING("Received unexpected oneshot timer event:0x%x\n",
+ p_tle->event);
+ break;
+ }
+ }
+
+ /* Update GKI timer with new tick value from first timer. */
+ if (!GKI_timer_queue_is_empty(&btu_cb.timer_queue_oneshot)) {
+ TIMER_LIST_ENT *p_tle = GKI_timer_getfirst(&btu_cb.timer_queue_oneshot);
+ if (p_tle->ticks > 0)
+ GKI_start_timer(TIMER_3, p_tle->ticks, FALSE);
+ } else {
+ GKI_stop_timer(TIMER_3);
+ }
+ }
+
if (event & EVENT_MASK(APPL_EVT_7))
break;
}
@@ -605,7 +672,8 @@
GKI_remove_from_timer_list (&btu_cb.timer_queue, p_tle);
p_tle->event = type;
- p_tle->ticks = timeout; /* Save the number of seconds for the timer */
+ p_tle->ticks = timeout;
+ p_tle->ticks_initial = timeout;
GKI_add_to_timer_list (&btu_cb.timer_queue, p_tle);
GKI_enable();
@@ -700,7 +768,8 @@
GKI_remove_from_timer_list (&btu_cb.quick_timer_queue, p_tle);
p_tle->event = type;
- p_tle->ticks = timeout; /* Save the number of ticks for the timer */
+ p_tle->ticks = timeout;
+ p_tle->ticks_initial = timeout;
GKI_add_to_timer_list (&btu_cb.quick_timer_queue, p_tle);
GKI_enable();
@@ -783,84 +852,59 @@
}
#endif /* defined(QUICK_TIMER_TICKS_PER_SEC) && (QUICK_TIMER_TICKS_PER_SEC > 0) */
+/*
+ * Starts a oneshot timer with a timeout in seconds.
+ */
+void btu_start_timer_oneshot(TIMER_LIST_ENT *p_tle, UINT16 type, UINT32 timeout_in_secs) {
+ INT32 timeout_in_ticks = GKI_SECS_TO_TICKS(timeout_in_secs);
+ BTM_TRACE_DEBUG("Starting oneshot timer type:%d timeout:%ds", type, timeout_in_secs);
+ GKI_disable();
+ if (GKI_timer_queue_is_empty(&btu_cb.timer_queue_oneshot)) {
+ }
+ GKI_remove_from_timer_list(&btu_cb.timer_queue_oneshot, p_tle);
-void btu_register_timer (TIMER_LIST_ENT *p_tle, UINT16 type, UINT32 timeout, tBTU_TIMER_CALLBACK timer_cb)
-{
- UINT8 i = 0;
- INT8 first = -1;
- for (; i < BTU_MAX_REG_TIMER; i++)
- {
- if (btu_cb.timer_reg[i].p_tle == NULL && first < 0)
- first = i;
- if (btu_cb.timer_reg[i].p_tle == p_tle)
- {
- btu_cb.timer_reg[i].timer_cb = timer_cb;
- btu_start_timer(p_tle, type, timeout);
- first = -1;
- break;
+ p_tle->event = type;
+ p_tle->ticks = timeout_in_ticks;
+ p_tle->ticks_initial = timeout_in_ticks;
+
+ GKI_add_to_timer_list(&btu_cb.timer_queue_oneshot, p_tle);
+ /* RPC to BTU thread if timer start request from non-BTU task */
+ if (GKI_get_taskid() != BTU_TASK) {
+ /* post event to start timer in BTU task */
+ BTM_TRACE_WARNING("Posting oneshot timer event to btu_task");
+ BT_HDR *p_msg = (BT_HDR *)GKI_getbuf(BT_HDR_SIZE);
+ if (p_msg != NULL) {
+ p_msg->event = BT_EVT_TO_START_TIMER_ONESHOT;
+ GKI_send_msg (BTU_TASK, TASK_MBOX_0, p_msg);
}
+ } else {
+ TIMER_LIST_ENT *tle = GKI_timer_getfirst(&btu_cb.timer_queue_oneshot);
+ GKI_start_timer(TIMER_3, tle->ticks, FALSE);
}
-
- if (first >= 0 && first < BTU_MAX_REG_TIMER)
- {
- btu_cb.timer_reg[first].timer_cb = timer_cb;
- btu_cb.timer_reg[first].p_tle = p_tle;
- btu_start_timer(p_tle, type, timeout);
- }
-
+ GKI_enable();
}
+void btu_stop_timer_oneshot(TIMER_LIST_ENT *p_tle) {
+ GKI_disable();
+ GKI_remove_from_timer_list(&btu_cb.timer_queue_oneshot, p_tle);
-void btu_deregister_timer(TIMER_LIST_ENT *p_tle)
-{
- UINT8 i = 0;
-
- for (; i < BTU_MAX_REG_TIMER; i++)
- {
- if (btu_cb.timer_reg[i].p_tle == p_tle)
- {
- btu_stop_timer(p_tle);
- btu_cb.timer_reg[i].timer_cb = NULL;
- btu_cb.timer_reg[i].p_tle = NULL;
- break;
+ if (GKI_get_taskid() != BTU_TASK) {
+ /* post event to stop timer in BTU task */
+ BT_HDR *p_msg = (BT_HDR *)GKI_getbuf(BT_HDR_SIZE);
+ if (p_msg != NULL) {
+ p_msg->event = BT_EVT_TO_STOP_TIMER_ONESHOT;
+ GKI_send_msg (BTU_TASK, TASK_MBOX_0, p_msg);
+ }
+ } else {
+ if (GKI_timer_queue_is_empty(&btu_cb.timer_queue_oneshot)) {
+ BTM_TRACE_WARNING("Stopping oneshot timer");
+ GKI_stop_timer(TIMER_3);
+ } else {
+ BTM_TRACE_WARNING("Request to stop oneshot timer with non empty queue");
}
}
-}
-
-void btu_register_event_range (UINT16 start, tBTU_EVENT_CALLBACK event_cb)
-{
- UINT8 i = 0;
- INT8 first = -1;
-
- for (; i < BTU_MAX_REG_EVENT; i++)
- {
- if (btu_cb.event_reg[i].event_cb == NULL && first < 0)
- first = i;
-
- if (btu_cb.event_reg[i].event_range == start)
- {
- btu_cb.event_reg[i].event_cb = event_cb;
-
- if (!event_cb)
- btu_cb.event_reg[i].event_range = 0;
-
- first = -1;
- }
- }
-
- /* if not deregistering && an empty index was found in range, register */
- if (event_cb && first >= 0 && first < BTU_MAX_REG_EVENT)
- {
- btu_cb.event_reg[first].event_range = start;
- btu_cb.event_reg[first].event_cb = event_cb;
- }
-}
-
-
-void btu_deregister_event_range (UINT16 range)
-{
- btu_register_event_range(range, NULL);
+ GKI_enable();
}
#if (defined(HCILP_INCLUDED) && HCILP_INCLUDED == TRUE)
diff --git a/stack/gap/gap_api.c b/stack/gap/gap_api.c
index fb90d03..530d141 100644
--- a/stack/gap/gap_api.c
+++ b/stack/gap/gap_api.c
@@ -348,7 +348,7 @@
}
else
{
- GAP_TRACE_ERROR1 ("GAP_SetPairableMode: illegal mode %d", mode);
+ GAP_TRACE_ERROR ("GAP_SetPairableMode: illegal mode %d", mode);
status = GAP_ERR_ILL_MODE;
}
return (status);
@@ -604,13 +604,13 @@
memcpy(p_results, &gap_cb.cur_inqptr->results, sizeof(tBTM_INQ_RESULTS));
ptr = (UINT8 *)gap_cb.cur_inqptr->results.remote_bd_addr;
- GAP_TRACE_EVENT6("GAP_GetFirstInqResult %02x%02x%02x%02x%02x%02x",
+ GAP_TRACE_EVENT("GAP_GetFirstInqResult %02x%02x%02x%02x%02x%02x",
ptr[0],ptr[1],ptr[2],ptr[3],ptr[4],ptr[5]);
return(BT_PASS);
}
else
{
- GAP_TRACE_EVENT0("GAP_FirstInqResults: No BD_ADDRs Found");
+ GAP_TRACE_EVENT("GAP_FirstInqResults: No BD_ADDRs Found");
memset(p_results, 0, sizeof(tBTM_INQ_RESULTS));
return(GAP_EOINQDB);
}
@@ -643,14 +643,14 @@
sizeof(tGAP_INQ_RESULTS));
ptr = (UINT8 *)gap_cb.cur_inqptr->results.remote_bd_addr;
- GAP_TRACE_EVENT6("GAP_GetNextInqResult %02x%02x%02x%02x%02x%02x",
+ GAP_TRACE_EVENT("GAP_GetNextInqResult %02x%02x%02x%02x%02x%02x",
ptr[0],ptr[1],ptr[2],ptr[3],ptr[4],ptr[5]);
return(BT_PASS);
}
else
{
- GAP_TRACE_EVENT0("GAP_NextInqResults: No BD_ADDRs Found");
+ GAP_TRACE_EVENT("GAP_NextInqResults: No BD_ADDRs Found");
memset(p_results, 0, sizeof(tBTM_INQ_RESULTS));
return(GAP_EOINQDB);
}
@@ -734,7 +734,7 @@
p_cb->gap_cback = callback;
p_cb->event = GAP_EVT_REM_NAME_COMPLETE; /* Return event expected */
- btm_status = BTM_ReadRemoteDeviceName (addr, gap_cb.btm_cback[p_cb->index]);
+ btm_status = BTM_ReadRemoteDeviceName (addr, gap_cb.btm_cback[p_cb->index], BT_TRANSPORT_BR_EDR);
/* If the name was not returned immediately, or if an error occurred, release the control block */
if ((retval = gap_convert_btm_status (btm_status)) != GAP_CMD_INITIATED)
diff --git a/stack/gap/gap_ble.c b/stack/gap/gap_ble.c
index d44577d..78a7819 100644
--- a/stack/gap/gap_ble.c
+++ b/stack/gap/gap_ble.c
@@ -57,7 +57,8 @@
static void gap_ble_s_attr_request_cback (UINT16 conn_id, UINT32 trans_id, tGATTS_REQ_TYPE op_code, tGATTS_DATA *p_data);
/* client connection callback */
-static void gap_ble_c_connect_cback (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id, BOOLEAN connected, tGATT_DISCONN_REASON reason);
+static void gap_ble_c_connect_cback (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id, BOOLEAN connected,
+ tGATT_DISCONN_REASON reason, tGATT_TRANSPORT transport);
static void gap_ble_c_cmpl_cback (UINT16 conn_id, tGATTC_OPTYPE op, tGATT_STATUS status, tGATT_CL_COMPLETE *p_data);
static tGATT_CBACK gap_cback =
@@ -67,6 +68,7 @@
NULL,
NULL,
gap_ble_s_attr_request_cback,
+ NULL,
NULL
};
@@ -196,7 +198,7 @@
tGAP_CLCB *p_clcb;
UINT16 i;
- GAP_TRACE_EVENT2 ("gap_get_conn_id_if_connected() - BDA: %08x%04x ",
+ GAP_TRACE_EVENT ("gap_get_conn_id_if_connected() - BDA: %08x%04x ",
(bd_addr[0]<<24)+(bd_addr[1]<<16)+(bd_addr[2]<<8)+bd_addr[3],
(bd_addr[4]<<8)+bd_addr[5]);
@@ -209,69 +211,10 @@
}
/* If here, failed to allocate a client control block */
- GATT_TRACE_DEBUG0 ("gap_get_conn_id_if_connected: not connected");
+ GATT_TRACE_DEBUG ("gap_get_conn_id_if_connected: not connected");
return(GATT_INVALID_CONN_ID);
}
-/*******************************************************************************
-**
-** Function gap_ble_enqueue_op
-**
-** Description enqueue a GAP operation when GAP client is busy
-**
-** Returns void
-**
-*******************************************************************************/
-void gap_ble_enqueue_op( tGAP_CLCB * p_clcb, UINT8 op, BD_ADDR reconn_addr, UINT8 privacy_flag, void *p_cback)
-{
- tGAP_BLE_PENDING_OP *p_op = (tGAP_BLE_PENDING_OP *)GKI_getbuf(sizeof(tGAP_BLE_PENDING_OP));
-
- if (p_op != NULL)
- {
- p_op->op = op;
- p_op->p_pending_cback = p_cback;
-
- if (op == GATT_SET_GAP_PRIVACY_FLAG)
- p_op->pending_data.privacy_flag = privacy_flag;
- else if (op == GATT_UPDATE_RECONN_ADDR)
- memcpy(p_op->pending_data.reconn_addr, reconn_addr, BD_ADDR_LEN);
-
- GKI_enqueue(&p_clcb->pending_op_q, p_op);
- }
-}
-
-/*******************************************************************************
-**
-** Function gap_ble_process_pending_op
-**
-** Description get next pending operation and process it
-**
-** Returns void
-**
-*******************************************************************************/
-static BOOLEAN gap_ble_process_pending_op(tGAP_CLCB *p_clcb)
-{
- tGAP_BLE_PENDING_OP *p_pending_op = (tGAP_BLE_PENDING_OP *)GKI_dequeue(&p_clcb->pending_op_q);
- BOOLEAN started = FALSE;
-
- if (p_pending_op != NULL)
- {
- if (p_pending_op->op == GATT_UPDATE_RECONN_ADDR)
- {
- GAP_BleUpdateReconnectAddr( p_clcb->bda,
- p_pending_op->pending_data.reconn_addr,
- (tGAP_BLE_RECONN_ADDR_CBACK *)p_pending_op->p_pending_cback);
- started = TRUE;
- }
- GKI_freebuf(p_pending_op);
- }
- else
- {
- GAP_TRACE_EVENT0("No pending operation");
- }
-
- return started;
-}
/*******************************************************************************
** GAP Attributes Database Request callback
@@ -307,7 +250,7 @@
p_value->len -= offset;
p_dev_name += offset;
ARRAY_TO_STREAM(p, p_dev_name, p_value->len);
- GAP_TRACE_EVENT1("GATT_UUID_GAP_DEVICE_NAME len=0x%04x", p_value->len);
+ GAP_TRACE_EVENT("GATT_UUID_GAP_DEVICE_NAME len=0x%04x", p_value->len);
}
break;
@@ -316,16 +259,6 @@
p_value->len = 2;
break;
- case GATT_UUID_GAP_PRIVACY_FLAG:
- UINT8_TO_STREAM(p, p_db_attr->attr_value.privacy);
- p_value->len = 1;
- break;
-
- case GATT_UUID_GAP_RECONN_ADDR:
- p_value->len = BD_ADDR_LEN;
- BDADDR_TO_STREAM(p, p_db_attr->attr_value.reconn_bda);
- break;
-
case GATT_UUID_GAP_PREF_CONN_PARAM:
UINT16_TO_STREAM(p, p_db_attr->attr_value.conn_param.int_min); /* int_min */
UINT16_TO_STREAM(p, p_db_attr->attr_value.conn_param.int_max); /* int_max */
@@ -357,18 +290,6 @@
return status;
}
-BOOLEAN gap_read_local_reconn_addr(BD_ADDR_PTR reconn_bda)
-{
- BD_ADDR dummy_bda = {0};
-
- if (memcmp(gap_cb.reconn_bda, dummy_bda, BD_ADDR_LEN) != 0)
- {
- memcpy(reconn_bda, gap_cb.reconn_bda, BD_ADDR_LEN);
- return TRUE;
- }
- else
- return FALSE;
-}
/******************************************************************************
**
@@ -389,26 +310,7 @@
{
if (p_data-> handle == p_db_attr->handle)
{
- if (p_data->offset != 0) return GATT_NOT_LONG;
- if (p_data->is_prep) return GATT_REQ_NOT_SUPPORTED;
-
-/* DO NOT SUPPORT RECONNECTION ADDRESS FOR NOW
-
- if (p_db_attr->uuid == GATT_UUID_GAP_RECONN_ADDR)
- {
- if (!btm_cb.ble_ctr_cb.privacy)
- return GATT_WRITE_NOT_PERMIT;
- if (p_data->len != BD_ADDR_LEN) return GATT_INVALID_ATTR_LEN;
-
- STREAM_TO_BDADDR(p_db_attr->attr_value.reconn_bda, p);
- // write direct connection address
- memcpy(&gap_cb.reconn_bda, p_db_attr->attr_value.reconn_bda, BD_ADDR_LEN);
-
- return GATT_SUCCESS;
- }
- else
-*/
- return GATT_WRITE_NOT_PERMIT;
+ return GATT_WRITE_NOT_PERMIT;
}
}
return GATT_NOT_FOUND;
@@ -431,7 +333,7 @@
tGATTS_RSP rsp_msg;
BOOLEAN ignore = FALSE;
- GAP_TRACE_EVENT1("gap_ble_s_attr_request_cback : recv type (0x%02x)", type);
+ GAP_TRACE_EVENT("gap_ble_s_attr_request_cback : recv type (0x%02x)", type);
memset(&rsp_msg, 0, sizeof(tGATTS_RSP));
@@ -450,16 +352,16 @@
case GATTS_REQ_TYPE_WRITE_EXEC:
ignore = TRUE;
- GAP_TRACE_EVENT0("Ignore GATTS_REQ_TYPE_WRITE_EXEC" );
+ GAP_TRACE_EVENT("Ignore GATTS_REQ_TYPE_WRITE_EXEC" );
break;
case GATTS_REQ_TYPE_MTU:
- GAP_TRACE_EVENT1("Get MTU exchange new mtu size: %d", p_data->mtu);
+ GAP_TRACE_EVENT("Get MTU exchange new mtu size: %d", p_data->mtu);
ignore = TRUE;
break;
default:
- GAP_TRACE_EVENT1("Unknown/unexpected LE GAP ATT request: 0x%02x", type);
+ GAP_TRACE_EVENT("Unknown/unexpected LE GAP ATT request: 0x%02x", type);
break;
}
@@ -495,7 +397,7 @@
/* Create a GAP service */
service_handle = GATTS_CreateService (gap_cb.gatt_if, &uuid, 0, GAP_MAX_ATTR_NUM, TRUE);
- GAP_TRACE_EVENT1 ("gap_attr_db_init service_handle = %d", service_handle);
+ GAP_TRACE_EVENT ("gap_attr_db_init service_handle = %d", service_handle);
/* add Device Name Characteristic
*/
@@ -513,12 +415,27 @@
GATT_CHAR_PROP_BIT_READ);
p_db_attr ++;
+#if BTM_PERIPHERAL_ENABLED == TRUE /* Only needed for peripheral testing */
+ /* add preferred connection parameter characteristic
+ */
+ uuid.uu.uuid16 = p_db_attr->uuid = GATT_UUID_GAP_PREF_CONN_PARAM;
+ p_db_attr->attr_value.conn_param.int_max = GAP_PREFER_CONN_INT_MAX; /* 6 */
+ p_db_attr->attr_value.conn_param.int_min = GAP_PREFER_CONN_INT_MIN; /* 0 */
+ p_db_attr->attr_value.conn_param.latency = GAP_PREFER_CONN_LATENCY; /* 0 */
+ p_db_attr->attr_value.conn_param.sp_tout = GAP_PREFER_CONN_SP_TOUT; /* 2000 */
+ p_db_attr->handle = GATTS_AddCharacteristic(service_handle,
+ &uuid,
+ GATT_PERM_READ,
+ GATT_CHAR_PROP_BIT_READ);
+ p_db_attr ++;
+#endif
+
/* start service now */
memset (&app_uuid.uu.uuid128, 0x81, LEN_UUID_128);
status = GATTS_StartService(gap_cb.gatt_if, service_handle, GAP_TRANSPORT_SUPPORTED );
- GAP_TRACE_EVENT3 ("GAP App gatt_if: %d s_hdl = %d start_status=%d",
+ GAP_TRACE_EVENT ("GAP App gatt_if: %d s_hdl = %d start_status=%d",
gap_cb.gatt_if, service_handle, status);
@@ -539,13 +456,13 @@
tGAP_ATTR *p_db_attr = gap_cb.gatt_attr;
UINT8 i = 0;
- GAP_TRACE_EVENT1("GAP_BleAttrDBUpdate attr_uuid=0x%04x", attr_uuid);
+ GAP_TRACE_EVENT("GAP_BleAttrDBUpdate attr_uuid=0x%04x", attr_uuid);
for (i = 0; i < GAP_MAX_CHAR_NUM; i ++, p_db_attr ++)
{
if (p_db_attr->uuid == attr_uuid)
{
- GAP_TRACE_EVENT1("Found attr_uuid=0x%04x", attr_uuid);
+ GAP_TRACE_EVENT("Found attr_uuid=0x%04x", attr_uuid);
switch (attr_uuid)
{
@@ -583,22 +500,19 @@
tGAP_BLE_DEV_NAME_CBACK *p_dev_name_cback = (tGAP_BLE_DEV_NAME_CBACK *)(p_clcb->p_cback);
UINT16 op = p_clcb->cl_op_uuid;
- GAP_TRACE_EVENT1("gap_ble_cl_op_cmpl status: %d", status);
+ GAP_TRACE_EVENT("gap_ble_cl_op_cmpl status: %d", status);
p_clcb->cl_op_uuid = 0;
p_clcb->p_cback=NULL;
if (p_dev_name_cback)
{
- GAP_TRACE_EVENT0("calling gap_ble_cl_op_cmpl");
+ GAP_TRACE_EVENT("calling gap_ble_cl_op_cmpl");
if (op == GATT_UUID_GAP_DEVICE_NAME)
(* p_dev_name_cback)(status, p_clcb->bda, len, (char *)p_name);
}
- if (!gap_ble_process_pending_op(p_clcb) &&
- p_clcb->cl_op_uuid == 0)
- GATT_Disconnect(p_clcb->conn_id);
}
@@ -612,13 +526,16 @@
**
*******************************************************************************/
static void gap_ble_c_connect_cback (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id,
- BOOLEAN connected, tGATT_DISCONN_REASON reason)
+ BOOLEAN connected, tGATT_DISCONN_REASON reason,
+ tGATT_TRANSPORT transport)
{
tGAP_CLCB *p_clcb = gap_find_clcb_by_bd_addr (bda);
UINT16 cl_op_uuid;
- UNUSED(gatt_if);
- GAP_TRACE_EVENT5 ("gap_ble_c_connect_cback: from %08x%04x connected:%d conn_id=%d reason = 0x%04x",
+ UNUSED(gatt_if);
+ UNUSED(transport);
+
+ GAP_TRACE_EVENT ("gap_ble_c_connect_cback: from %08x%04x connected:%d conn_id=%d reason = 0x%04x",
(bda[0]<<24)+(bda[1]<<16)+(bda[2]<<8)+bda[3],
(bda[4]<<8)+bda[5], connected, conn_id, reason);
@@ -629,16 +546,13 @@
{
if ((p_clcb = gap_clcb_alloc(conn_id, bda))== NULL)
{
- GAP_TRACE_ERROR0 ("gap_ble_c_connect_cback: no_resource");
+ GAP_TRACE_ERROR ("gap_ble_c_connect_cback: no_resource");
return;
}
}
p_clcb->conn_id = conn_id;
p_clcb->connected = TRUE;
- /* Do not use reconnection address for now -->
- check privacy enabled? set reconnect address
- btm_ble_update_reconnect_address(bda);*/
}
else
{
@@ -650,7 +564,7 @@
{
cl_op_uuid = p_clcb->cl_op_uuid;
- GAP_TRACE_EVENT1 ("cl_op_uuid=0x%04x", cl_op_uuid );
+ GAP_TRACE_EVENT ("cl_op_uuid=0x%04x", cl_op_uuid );
if (p_clcb->connected)
{
@@ -659,6 +573,10 @@
{
GAP_BleReadPeerDevName (bda, (tGAP_BLE_DEV_NAME_CBACK *)p_clcb->p_cback);
}
+ else if (cl_op_uuid == GATT_UUID_GAP_PREF_CONN_PARAM)
+ {
+ GAP_BleReadPeerPrefConnParams(bda);
+ }
}
/* current link disconnect */
else
@@ -693,9 +611,9 @@
op_type = p_clcb->cl_op_uuid;
- GAP_TRACE_EVENT3 ("gap_ble_c_cmpl_cback() - op_code: 0x%02x status: 0x%02x read_type: 0x%04x", op, status, op_type);
+ GAP_TRACE_EVENT ("gap_ble_c_cmpl_cback() - op_code: 0x%02x status: 0x%02x read_type: 0x%04x", op, status, op_type);
/* Currently we only issue read commands */
- if (op != GATTC_OPTYPE_READ && op != GATTC_OPTYPE_WRITE)
+ if (op != GATTC_OPTYPE_READ)
return;
if (status != GATT_SUCCESS)
@@ -709,7 +627,7 @@
switch (op_type)
{
case GATT_UUID_GAP_PREF_CONN_PARAM:
- GAP_TRACE_EVENT0 ("GATT_UUID_GAP_PREF_CONN_PARAM");
+ GAP_TRACE_EVENT ("GATT_UUID_GAP_PREF_CONN_PARAM");
/* Extract the peripheral preferred connection parameters and save them */
STREAM_TO_UINT16 (min, pp);
@@ -723,7 +641,7 @@
break;
case GATT_UUID_GAP_DEVICE_NAME:
- GAP_TRACE_EVENT0 ("GATT_UUID_GAP_DEVICE_NAME");
+ GAP_TRACE_EVENT ("GATT_UUID_GAP_DEVICE_NAME");
len = (UINT16)strlen((char *)pp);
if (len > GAP_CHAR_DEV_NAME_SIZE)
len = GAP_CHAR_DEV_NAME_SIZE;
@@ -731,7 +649,6 @@
break;
case GATT_UUID_GAP_ICON:
break;
-
}
}
@@ -758,7 +675,7 @@
if (GATTC_Read(p_clcb->conn_id, GATT_READ_BY_TYPE, ¶m) != GATT_SUCCESS)
{
- GAP_TRACE_ERROR0 ("GAP_BleReadPeerPrefConnParams: GATT_Read Failed");
+ GAP_TRACE_ERROR ("GAP_BleReadPeerPrefConnParams: GATT_Read Failed");
/* release the link here */
GATT_Disconnect(p_clcb->conn_id);
return(FALSE);
@@ -791,13 +708,13 @@
{
if ((p_clcb = gap_clcb_alloc(0, peer_bda)) == NULL)
{
- GAP_TRACE_ERROR0("GAP_BleReadPeerPrefConnParams max connection reached");
+ GAP_TRACE_ERROR("GAP_BleReadPeerPrefConnParams max connection reached");
return FALSE;
}
p_clcb->connected = FALSE;
}
- GAP_TRACE_API3 ("GAP_BleReadPeerPrefConnParams() - BDA: %08x%04x cl_op_uuid: 0x%04x",
+ GAP_TRACE_API ("GAP_BleReadPeerPrefConnParams() - BDA: %08x%04x cl_op_uuid: 0x%04x",
(peer_bda[0]<<24)+(peer_bda[1]<<16)+(peer_bda[2]<<8)+peer_bda[3],
(peer_bda[4]<<8)+peer_bda[5], p_clcb->cl_op_uuid);
@@ -806,18 +723,20 @@
return(FALSE);
/* hold the link here */
- GATT_Connect(gap_cb.gatt_if, p_clcb->bda, TRUE);
-
- if (p_clcb->connected)
+ if (GATT_Connect(gap_cb.gatt_if, p_clcb->bda, TRUE, BT_TRANSPORT_LE))
{
- return gap_ble_cl_read_request(p_clcb, GATT_UUID_GAP_PREF_CONN_PARAM, NULL);
+
+ if (p_clcb->connected)
+ {
+ return gap_ble_cl_read_request(p_clcb, GATT_UUID_GAP_PREF_CONN_PARAM, NULL);
+ }
+ /* Mark currently active operation */
+ p_clcb->cl_op_uuid = GATT_UUID_GAP_PREF_CONN_PARAM;
+
+ return(TRUE);
}
- /* Mark currently active operation */
- p_clcb->cl_op_uuid = GATT_UUID_GAP_PREF_CONN_PARAM;
-
- return(TRUE);
-
-
+ else
+ return FALSE;
}
/*******************************************************************************
@@ -839,14 +758,14 @@
if ((p_clcb = gap_find_clcb_by_bd_addr (peer_bda)) == NULL)
{
if ((p_clcb = gap_clcb_alloc(0, peer_bda)) == NULL)
- {
- GAP_TRACE_ERROR0("GAP_BleReadPeerDevName max connection reached");
+ {
+ GAP_TRACE_ERROR("GAP_BleReadPeerDevName max connection reached");
return FALSE;
- }
+ }
p_clcb->connected = FALSE;
}
- GAP_TRACE_EVENT3 ("GAP_BleReadPeerDevName() - BDA: %08x%04x cl_op_uuid: 0x%04x",
+ GAP_TRACE_EVENT ("GAP_BleReadPeerDevName() - BDA: %08x%04x cl_op_uuid: 0x%04x",
(peer_bda[0]<<24)+(peer_bda[1]<<16)+(peer_bda[2]<<8)+peer_bda[3],
(peer_bda[4]<<8)+peer_bda[5], p_clcb->cl_op_uuid);
@@ -855,21 +774,26 @@
return(FALSE);
/* hold the link here */
- GATT_Connect(gap_cb.gatt_if, p_clcb->bda, TRUE);
- if (p_clcb->connected)
+ if (GATT_Connect(gap_cb.gatt_if, p_clcb->bda, TRUE, BT_TRANSPORT_LE))
{
- return gap_ble_cl_read_request(p_clcb, GATT_UUID_GAP_DEVICE_NAME, (void *)p_cback);
+ if (p_clcb->connected)
+ {
+ return gap_ble_cl_read_request(p_clcb, GATT_UUID_GAP_DEVICE_NAME, (void *)p_cback);
+ }
+
+ p_clcb->p_cback = (void *)p_cback;
+ /* Mark currently active operation */
+ p_clcb->cl_op_uuid = GATT_UUID_GAP_DEVICE_NAME;
+
+
+ return(TRUE);
}
-
- p_clcb->p_cback = (void *)p_cback;
- /* Mark currently active operation */
- p_clcb->cl_op_uuid = GATT_UUID_GAP_DEVICE_NAME;
-
-
- return(TRUE);
+ else
+ return FALSE;
}
+
/*******************************************************************************
**
** Function GAP_BleCancelReadPeerDevName
@@ -883,13 +807,13 @@
{
tGAP_CLCB *p_clcb = gap_find_clcb_by_bd_addr (peer_bda);
- GAP_TRACE_EVENT3 ("GAP_BleCancelReadPeerDevName() - BDA: %08x%04x cl_op_uuid: 0x%04x",
+ GAP_TRACE_EVENT ("GAP_BleCancelReadPeerDevName() - BDA: %08x%04x cl_op_uuid: 0x%04x",
(peer_bda[0]<<24)+(peer_bda[1]<<16)+(peer_bda[2]<<8)+peer_bda[3],
(peer_bda[4]<<8)+peer_bda[5], (p_clcb == NULL)? 0 : p_clcb->cl_op_uuid);
if (p_clcb == NULL || p_clcb->cl_op_uuid != GATT_UUID_GAP_DEVICE_NAME)
{
- GAP_TRACE_ERROR0 ("Cannot cancel current op is not get dev name");
+ GAP_TRACE_ERROR ("Cannot cancel current op is not get dev name");
return FALSE;
}
@@ -897,7 +821,7 @@
{
if (!GATT_CancelConnect(gap_cb.gatt_if, peer_bda, TRUE))
{
- GAP_TRACE_ERROR0 ("Cannot cancel where No connection id");
+ GAP_TRACE_ERROR ("Cannot cancel where No connection id");
return FALSE;
}
}
@@ -907,73 +831,6 @@
return(TRUE);
}
-/*******************************************************************************
-**
-** Function GAP_BleUpdateReconnectAddr
-**
-** Description Start a process to udpate the reconnect address if remote devive
-** has privacy enabled.
-**
-** Returns TRUE if read started, else FALSE if GAP is busy
-**
-*******************************************************************************/
-BOOLEAN GAP_BleUpdateReconnectAddr (BD_ADDR peer_bda, BD_ADDR reconn_addr,
- tGAP_BLE_RECONN_ADDR_CBACK *p_cback)
-{
- tGAP_CLCB *p_clcb;
- tGATT_DISC_PARAM param;
-
- if (p_cback == NULL)
- return(FALSE);
-
- /* This function should only be called if there is a connection to */
- /* the peer. Get a client handle for that connection. */
- if ((p_clcb = gap_find_clcb_by_bd_addr (peer_bda)) == NULL ||
- !p_clcb->connected)
- {
- GAP_TRACE_ERROR0("No connection, can not update reconnect address");
- return(FALSE);
- }
-
- GAP_TRACE_API3 ("GAP_BleUpdateReconnectAddr() - BDA: %08x%04x cl_op_uuid: 0x%04x",
- (peer_bda[0]<<24)+(peer_bda[1]<<16)+(peer_bda[2]<<8)+peer_bda[3],
- (peer_bda[4]<<8)+peer_bda[5], p_clcb->cl_op_uuid);
-
- /* For now we only handle one at a time */
- if (p_clcb->cl_op_uuid != 0)
- {
- gap_ble_enqueue_op(p_clcb, GATT_UPDATE_RECONN_ADDR, reconn_addr, 0, (void *)p_cback);
- return(FALSE);
- }
-
- /* hold the link here */
- GATT_Connect(gap_cb.gatt_if, p_clcb->bda, TRUE);
-
- memset(¶m, 0, sizeof(tGATT_DISC_PARAM));
-
- param.service.len = LEN_UUID_16;
- param.service.uu.uuid16 = GATT_UUID_GAP_RECONN_ADDR;
- param.s_handle = 1;
- param.e_handle = 0xFFFF;
-
- if (GATTC_Discover(p_clcb->conn_id, GATT_DISC_CHAR, ¶m) != GATT_SUCCESS)
- {
- GAP_TRACE_ERROR0 ("GAP_BleReadPeerPrefConnParams: GATT_Read Failed");
- /* release the link here */
- GATT_Disconnect(p_clcb->conn_id);
- return(FALSE);
- }
- else
- {
- p_clcb->p_cback = (void *)p_cback;
- memcpy(p_clcb->reconn_addr, reconn_addr, BD_ADDR_LEN);
- p_clcb->cl_op_uuid = GATT_UUID_GAP_RECONN_ADDR;
- }
-
- return TRUE;
-
-}
-
#endif /* BLE_INCLUDED */
diff --git a/stack/gap/gap_conn.c b/stack/gap/gap_conn.c
index 44bb5ec..d1e96d8 100644
--- a/stack/gap/gap_conn.c
+++ b/stack/gap/gap_conn.c
@@ -127,7 +127,7 @@
UINT16 cid;
tBT_UUID bt_uuid = {2, {GAP_PROTOCOL_ID}};
- GAP_TRACE_EVENT0 ("GAP_CONN - Open Request");
+ GAP_TRACE_EVENT ("GAP_CONN - Open Request");
/* Allocate a new CCB. Return if none available. */
if ((p_ccb = gap_allocate_ccb()) == NULL)
@@ -152,7 +152,7 @@
if (!p_ccb->rem_addr_specified && !is_server)
{
gap_release_ccb (p_ccb);
- GAP_TRACE_ERROR0 ("GAP ERROR: Client must specify a remote BD ADDR to connect to!");
+ GAP_TRACE_ERROR ("GAP ERROR: Client must specify a remote BD ADDR to connect to!");
return (GAP_INVALID_HANDLE);
}
@@ -178,7 +178,7 @@
/* Register the PSM with L2CAP */
if ((p_ccb->psm = L2CA_REGISTER (psm, &gap_cb.conn.reg_info, AMP_AUTOSWITCH_ALLOWED|AMP_USE_AMP_IF_POSSIBLE)) == 0)
{
- GAP_TRACE_ERROR1 ("GAP_ConnOpen: Failure registering PSM 0x%04x", psm);
+ GAP_TRACE_ERROR ("GAP_ConnOpen: Failure registering PSM 0x%04x", psm);
gap_release_ccb (p_ccb);
return (GAP_INVALID_HANDLE);
}
@@ -187,7 +187,7 @@
p_ccb->service_id = service_id;
if (!BTM_SetSecurityLevel ((UINT8)!is_server, p_serv_name, p_ccb->service_id, security, p_ccb->psm, 0, 0))
{
- GAP_TRACE_ERROR0 ("GAP_CONN - Security Error");
+ GAP_TRACE_ERROR ("GAP_CONN - Security Error");
gap_release_ccb (p_ccb);
return (GAP_INVALID_HANDLE);
}
@@ -254,7 +254,7 @@
{
tGAP_CCB *p_ccb = gap_find_ccb_by_handle (gap_handle);
- GAP_TRACE_EVENT1 ("GAP_CONN - close handle: 0x%x", gap_handle);
+ GAP_TRACE_EVENT ("GAP_CONN - close handle: 0x%x", gap_handle);
if (p_ccb)
{
@@ -337,7 +337,7 @@
GKI_enable();
- GAP_TRACE_EVENT2 ("GAP_ConnReadData - rx_queue_size left=%d, *p_len=%d",
+ GAP_TRACE_EVENT ("GAP_ConnReadData - rx_queue_size left=%d, *p_len=%d",
p_ccb->rx_queue_size, *p_len);
return (BT_PASS);
@@ -374,7 +374,7 @@
else
rc = GAP_INVALID_HANDLE;
- GAP_TRACE_EVENT2 ("GAP_GetRxQueueCnt - rc = 0x%04x, rx_queue_count=%d",
+ GAP_TRACE_EVENT ("GAP_GetRxQueueCnt - rc = 0x%04x, rx_queue_count=%d",
rc , *p_rx_queue_count);
return (rc);
@@ -538,7 +538,7 @@
max_len -= p_buf->len;
p_data += p_buf->len;
- GAP_TRACE_EVENT1 ("GAP_WriteData %d bytes", p_buf->len);
+ GAP_TRACE_EVENT ("GAP_WriteData %d bytes", p_buf->len);
GKI_enqueue (&p_ccb->tx_queue, p_buf);
}
@@ -652,18 +652,18 @@
{
tGAP_CCB *p_ccb = gap_find_ccb_by_handle (gap_handle);
- GAP_TRACE_EVENT1 ("GAP_ConnGetRemoteAddr gap_handle = %d", gap_handle);
+ GAP_TRACE_EVENT ("GAP_ConnGetRemoteAddr gap_handle = %d", gap_handle);
if ((p_ccb) && (p_ccb->con_state > GAP_CCB_STATE_LISTENING))
{
- GAP_TRACE_EVENT6("GAP_ConnGetRemoteAddr bda :0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x\n", \
+ GAP_TRACE_EVENT("GAP_ConnGetRemoteAddr bda :0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x\n", \
p_ccb->rem_dev_address[0],p_ccb->rem_dev_address[1],p_ccb->rem_dev_address[2],
p_ccb->rem_dev_address[3],p_ccb->rem_dev_address[4],p_ccb->rem_dev_address[5]);
return (p_ccb->rem_dev_address);
}
else
{
- GAP_TRACE_EVENT0 ("GAP_ConnGetRemoteAddr return Error ");
+ GAP_TRACE_EVENT ("GAP_ConnGetRemoteAddr return Error ");
return (NULL);
}
}
@@ -742,9 +742,9 @@
if (xx == GAP_MAX_CONNECTIONS)
{
- GAP_TRACE_WARNING0("*******");
- GAP_TRACE_WARNING0("WARNING: GAP Conn Indication for Unexpected Bd Addr...Disconnecting");
- GAP_TRACE_WARNING0("*******");
+ GAP_TRACE_WARNING("*******");
+ GAP_TRACE_WARNING("WARNING: GAP Conn Indication for Unexpected Bd Addr...Disconnecting");
+ GAP_TRACE_WARNING("*******");
/* Disconnect because it is an unexpected connection */
L2CA_DISCONNECT_REQ (l2cap_cid);
@@ -761,7 +761,7 @@
/* Send response to the L2CAP layer. */
L2CA_CONNECT_RSP (bd_addr, l2cap_id, l2cap_cid, L2CAP_CONN_OK, L2CAP_CONN_OK, &p_ccb->ertm_info, &bt_uuid);
- GAP_TRACE_EVENT1("GAP_CONN - Rcvd L2CAP conn ind, CID: 0x%x", p_ccb->connection_id);
+ GAP_TRACE_EVENT("GAP_CONN - Rcvd L2CAP conn ind, CID: 0x%x", p_ccb->connection_id);
/* Send a Configuration Request. */
L2CA_CONFIG_REQ (l2cap_cid, &p_ccb->cfg);
@@ -779,7 +779,7 @@
*******************************************************************************/
static void gap_checks_con_flags (tGAP_CCB *p_ccb)
{
- GAP_TRACE_EVENT1 ("gap_checks_con_flags conn_flags:0x%x, ", p_ccb->con_flags);
+ GAP_TRACE_EVENT ("gap_checks_con_flags conn_flags:0x%x, ", p_ccb->con_flags);
/* if all the required con_flags are set, report the OPEN event now */
if ((p_ccb->con_flags & GAP_CCB_FLAGS_CONN_DONE) == GAP_CCB_FLAGS_CONN_DONE)
{
@@ -799,12 +799,13 @@
** Returns void
**
*******************************************************************************/
-static void gap_sec_check_complete (BD_ADDR bd_addr, void *p_ref_data, UINT8 res)
+static void gap_sec_check_complete (BD_ADDR bd_addr, tBT_TRANSPORT transport, void *p_ref_data, UINT8 res)
{
tGAP_CCB *p_ccb = (tGAP_CCB *)p_ref_data;
UNUSED(bd_addr);
+ UNUSED (transport);
- GAP_TRACE_EVENT3 ("gap_sec_check_complete conn_state:%d, conn_flags:0x%x, status:%d",
+ GAP_TRACE_EVENT ("gap_sec_check_complete conn_state:%d, conn_flags:0x%x, status:%d",
p_ccb->con_state, p_ccb->con_flags, res);
if (p_ccb->con_state == GAP_CCB_STATE_IDLE)
return;
@@ -968,7 +969,7 @@
{
tGAP_CCB *p_ccb;
- GAP_TRACE_EVENT1 ("GAP_CONN - Rcvd L2CAP disc, CID: 0x%x", l2cap_cid);
+ GAP_TRACE_EVENT ("GAP_CONN - Rcvd L2CAP disc, CID: 0x%x", l2cap_cid);
/* Find CCB based on CID */
if ((p_ccb = gap_find_ccb_by_cid (l2cap_cid)) == NULL)
@@ -1008,7 +1009,7 @@
p_ccb->rx_queue_size += p_msg->len;
/*
- GAP_TRACE_EVENT2 ("gap_data_ind - rx_queue_size=%d, msg len=%d",
+ GAP_TRACE_EVENT ("gap_data_ind - rx_queue_size=%d, msg len=%d",
p_ccb->rx_queue_size, p_msg->len);
*/
@@ -1036,7 +1037,7 @@
BT_HDR *p_buf;
UINT8 status;
- GAP_TRACE_EVENT2 ("GAP_CONN - Rcvd L2CAP Is Congested (%d), CID: 0x%x",
+ GAP_TRACE_EVENT ("GAP_CONN - Rcvd L2CAP Is Congested (%d), CID: 0x%x",
is_congested, lcid);
/* Find CCB based on CID */
@@ -1218,7 +1219,7 @@
}
else
{
- GAP_TRACE_ERROR0("Unable to allocate message buffer for event.");
+ GAP_TRACE_ERROR("Unable to allocate message buffer for event.");
}
}
diff --git a/stack/gap/gap_utils.c b/stack/gap/gap_utils.c
index 866ad7a..3ef893d 100644
--- a/stack/gap/gap_utils.c
+++ b/stack/gap/gap_utils.c
@@ -58,18 +58,18 @@
p_data = &inq_cmpl;
- GAP_TRACE_EVENT2(" GAP Inquiry Complete Event (Status 0x%04x, Result(s) %d)",
+ GAP_TRACE_EVENT(" GAP Inquiry Complete Event (Status 0x%04x, Result(s) %d)",
inq_cmpl.status, inq_cmpl.num_results);
break;
case GAP_EVT_DISCOVERY_COMPLETE:
if (*((UINT16 *) p_data))
{
- GAP_TRACE_EVENT1(" GAP Discovery Complete Event(SDP Result: 0x%04x)", *((UINT16 *) p_data));
+ GAP_TRACE_EVENT(" GAP Discovery Complete Event(SDP Result: 0x%04x)", *((UINT16 *) p_data));
}
else
{
- GAP_TRACE_EVENT0(" GAP Discovery Successfully Completed");
+ GAP_TRACE_EVENT(" GAP Discovery Successfully Completed");
}
break;
@@ -79,7 +79,7 @@
((tGAP_REMOTE_DEV_NAME *)p_data)->status =
gap_convert_btm_status ((tBTM_STATUS)((tBTM_REMOTE_DEV_NAME *)p_data)->status);
- GAP_TRACE_EVENT1(" GAP Remote Name Complete Event (status 0x%04x)", ((tGAP_REMOTE_DEV_NAME *)p_data)->status);
+ GAP_TRACE_EVENT(" GAP Remote Name Complete Event (status 0x%04x)", ((tGAP_REMOTE_DEV_NAME *)p_data)->status);
break;
};
@@ -119,11 +119,11 @@
UINT8 index;
UNUSED(p_eir);
- GAP_TRACE_EVENT6 ("GAP Inquiry Results Callback (bdaddr [%02x%02x%02x%02x%02x%02x])",
+ GAP_TRACE_EVENT ("GAP Inquiry Results Callback (bdaddr [%02x%02x%02x%02x%02x%02x])",
p_results->remote_bd_addr[0], p_results->remote_bd_addr[1],
p_results->remote_bd_addr[2], p_results->remote_bd_addr[3],
p_results->remote_bd_addr[4], p_results->remote_bd_addr[5]);
- GAP_TRACE_EVENT4 (" (COD [%02x%02x%02x], clkoff 0x%04x)",
+ GAP_TRACE_EVENT (" (COD [%02x%02x%02x], clkoff 0x%04x)",
p_results->dev_class[0], p_results->dev_class[1], p_results->dev_class[2],
p_results->clock_offset);
@@ -167,7 +167,7 @@
{
if (p->status == BTM_SUCCESS)
{
- GAP_TRACE_EVENT2(" GAP: FindAddrByName Rem Name Cmpl Evt (Status 0x%04x, Name [%s])",
+ GAP_TRACE_EVENT(" GAP: FindAddrByName Rem Name Cmpl Evt (Status 0x%04x, Name [%s])",
p->status, p->remote_bd_name);
/* See if the returned name matches the desired name; if not initiate another search */
@@ -183,7 +183,7 @@
if ((p_cb->p_cur_inq = BTM_InqDbNext(p_cb->p_cur_inq)) != NULL)
{
if ((BTM_ReadRemoteDeviceName (p_cb->p_cur_inq->results.remote_bd_addr,
- (tBTM_CMPL_CB *) gap_find_addr_name_cb)) == BTM_CMD_STARTED)
+ (tBTM_CMPL_CB *) gap_find_addr_name_cb, BT_TRANSPORT_BR_EDR)) == BTM_CMD_STARTED)
return; /* This routine will get called again with the next results */
else
p_result->status = gap_convert_btm_status ((tBTM_STATUS) p->status);
@@ -194,7 +194,7 @@
}
else
{
- GAP_TRACE_EVENT1(" GAP: FindAddrByName Rem Name Cmpl Evt (Status 0x%04x)", p->status);
+ GAP_TRACE_EVENT(" GAP: FindAddrByName Rem Name Cmpl Evt (Status 0x%04x)", p->status);
p_result->status = gap_convert_btm_status ((tBTM_STATUS) p->status);
}
@@ -232,7 +232,7 @@
if (p_cb->in_use)
{
- GAP_TRACE_EVENT2(" GAP: FindAddrByName Inq Cmpl Evt (Status 0x%04x, Result(s) %d)",
+ GAP_TRACE_EVENT(" GAP: FindAddrByName Inq Cmpl Evt (Status 0x%04x, Result(s) %d)",
p->status, p->num_resp);
if (p->status == BTM_SUCCESS)
@@ -246,7 +246,7 @@
if ((p_cb->p_cur_inq = BTM_InqDbFirst()) != NULL)
{
if ((BTM_ReadRemoteDeviceName (p_cb->p_cur_inq->results.remote_bd_addr,
- (tBTM_CMPL_CB *) gap_find_addr_name_cb)) == BTM_CMD_STARTED)
+ (tBTM_CMPL_CB *) gap_find_addr_name_cb, BT_TRANSPORT_BR_EDR)) == BTM_CMD_STARTED)
return; /* Wait for the response in gap_find_addr_name_cb() */
else
p_result->status = gap_convert_btm_status (p->status);
diff --git a/stack/gatt/att_protocol.c b/stack/gatt/att_protocol.c
index 3348599..00512e2 100644
--- a/stack/gatt/att_protocol.c
+++ b/stack/gatt/att_protocol.c
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 2008-2012 Broadcom Corporation
+ * Copyright (C) 2008-2014 Broadcom Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -74,7 +74,7 @@
BT_HDR *p_buf = NULL;
UINT8 *p;
- if ((p_buf = (BT_HDR *)GKI_getbuf((UINT16)(sizeof(BT_HDR) + 10 + L2CAP_MIN_OFFSET))) != NULL)
+ if ((p_buf = (BT_HDR *)GKI_getpoolbuf(GATT_BUF_POOL_ID)) != NULL)
{
p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
@@ -162,7 +162,7 @@
** Returns pointer to the command buffer.
**
*******************************************************************************/
-BT_HDR *attp_build_read_handles_cmd (UINT16 payload_size, tGATT_FIND_TYPE_VALUE *p_value_type)
+BT_HDR *attp_build_read_by_type_value_cmd (UINT16 payload_size, tGATT_FIND_TYPE_VALUE *p_value_type)
{
BT_HDR *p_buf = NULL;
UINT8 *p;
@@ -335,7 +335,7 @@
if (op_code == GATT_RSP_READ_BY_TYPE)
*p_pair_len = (len + 2);
- GATT_TRACE_WARNING1("attribute value too long, to be truncated to %d", len);
+ GATT_TRACE_WARNING("attribute value too long, to be truncated to %d", len);
}
ARRAY_TO_STREAM (p, p_data, len);
@@ -347,12 +347,12 @@
/*******************************************************************************
**
-** Function attp_send_msg_to_L2CAP
+** Function attp_send_msg_to_l2cap
**
** Description Send message to L2CAP.
**
*******************************************************************************/
-BOOLEAN attp_send_msg_to_L2CAP(tGATT_TCB *p_tcb, BT_HDR *p_toL2CAP)
+tGATT_STATUS attp_send_msg_to_l2cap(tGATT_TCB *p_tcb, BT_HDR *p_toL2CAP)
{
UINT16 l2cap_ret;
@@ -364,15 +364,16 @@
if (l2cap_ret == L2CAP_DW_FAILED)
{
- GATT_TRACE_ERROR1("ATT failed to pass msg:0x%0x to L2CAP",
+ GATT_TRACE_ERROR("ATT failed to pass msg:0x%0x to L2CAP",
*((UINT8 *)(p_toL2CAP + 1) + p_toL2CAP->offset));
- GKI_freebuf(p_toL2CAP);
- return FALSE;
+ return GATT_INTERNAL_ERROR;
}
- else
+ else if (l2cap_ret == L2CAP_DW_CONGESTED)
{
- return TRUE;
+ GATT_TRACE_DEBUG("ATT congested, message accepted");
+ return GATT_CONGESTED;
}
+ return GATT_SUCCESS;
}
/*******************************************************************************
@@ -391,7 +392,7 @@
{
case GATT_RSP_READ_BLOB:
case GATT_RSP_PREPARE_WRITE:
- GATT_TRACE_EVENT2 ("ATT_RSP_READ_BLOB/GATT_RSP_PREPARE_WRITE: len = %d offset = %d",
+ GATT_TRACE_EVENT ("ATT_RSP_READ_BLOB/GATT_RSP_PREPARE_WRITE: len = %d offset = %d",
p_msg->attr_value.len, p_msg->attr_value.offset);
offset = p_msg->attr_value.offset;
/* Coverity: [FALSE-POSITIVE error] intended fall through */
@@ -426,12 +427,12 @@
break;
default:
- GATT_TRACE_DEBUG1("attp_build_sr_msg: unknown op code = %d", op_code);
+ GATT_TRACE_DEBUG("attp_build_sr_msg: unknown op code = %d", op_code);
break;
}
if (!p_cmd)
- GATT_TRACE_ERROR0("No resources");
+ GATT_TRACE_ERROR("No resources");
return p_cmd;
}
@@ -459,11 +460,7 @@
if (p_msg != NULL)
{
p_msg->offset = L2CAP_MIN_OFFSET;
-
- if (attp_send_msg_to_L2CAP (p_tcb, p_msg))
- cmd_sent = GATT_SUCCESS;
- else
- cmd_sent = GATT_INTERNAL_ERROR;
+ cmd_sent = attp_send_msg_to_l2cap (p_tcb, p_msg);
}
}
return cmd_sent;
@@ -475,22 +472,26 @@
**
** Description Send a ATT command or enqueue it.
**
-** Returns TRUE if command sent, otherwise FALSE.
+** Returns GATT_SUCCESS if command sent
+** GATT_CONGESTED if command sent but channel congested
+** GATT_CMD_STARTED if command queue up in GATT
+** GATT_ERROR if command sending failure
**
*******************************************************************************/
-UINT8 attp_cl_send_cmd(tGATT_TCB *p_tcb, UINT16 clcb_idx, UINT8 cmd_code, BT_HDR *p_cmd)
+tGATT_STATUS attp_cl_send_cmd(tGATT_TCB *p_tcb, UINT16 clcb_idx, UINT8 cmd_code, BT_HDR *p_cmd)
{
- UINT8 att_ret = GATT_SUCCESS;
+ tGATT_STATUS att_ret = GATT_SUCCESS;
if (p_tcb != NULL)
{
cmd_code &= ~GATT_AUTH_SIGN_MASK;
+ /* no pending request or value confirmation */
if (p_tcb->pending_cl_req == p_tcb->next_slot_inq ||
cmd_code == GATT_HANDLE_VALUE_CONF)
{
- /* no penindg request or value confirmation */
- if (attp_send_msg_to_L2CAP(p_tcb, p_cmd))
+ att_ret = attp_send_msg_to_l2cap(p_tcb, p_cmd);
+ if (att_ret == GATT_CONGESTED || att_ret == GATT_SUCCESS)
{
/* do not enq cmd if handle value confirmation or set request */
if (cmd_code != GATT_HANDLE_VALUE_CONF && cmd_code != GATT_CMD_WRITE)
@@ -509,7 +510,7 @@
}
}
else
- att_ret = GATT_ILLEGAL_PARAMETER;
+ att_ret = GATT_ERROR;
return att_ret;
}
@@ -606,7 +607,7 @@
break;
case GATT_REQ_FIND_TYPE_VALUE:
- p_cmd = attp_build_read_handles_cmd(p_tcb->payload_size, &p_msg->find_type_value);
+ p_cmd = attp_build_read_by_type_value_cmd(p_tcb->payload_size, &p_msg->find_type_value);
break;
case GATT_REQ_READ_MULTI:
@@ -625,7 +626,7 @@
}
else
{
- GATT_TRACE_ERROR0("Peer device not connected");
+ GATT_TRACE_ERROR("Peer device not connected");
}
return status;
diff --git a/stack/gatt/gatt_api.c b/stack/gatt/gatt_api.c
index 54ea0f0..6683cb6 100644
--- a/stack/gatt/gatt_api.c
+++ b/stack/gatt/gatt_api.c
@@ -151,11 +151,11 @@
tBT_UUID *p_app_uuid128;
- GATT_TRACE_API0 ("GATTS_CreateService" );
+ GATT_TRACE_API ("GATTS_CreateService" );
if (p_reg == NULL)
{
- GATT_TRACE_ERROR1 ("Inavlid gatt_if=%d", gatt_if);
+ GATT_TRACE_ERROR ("Inavlid gatt_if=%d", gatt_if);
return(0);
}
@@ -164,7 +164,7 @@
if ((p_list = gatt_find_hdl_buffer_by_app_id(p_app_uuid128, p_svc_uuid, svc_inst)) != NULL)
{
s_hdl = p_list->asgn_range.s_handle;
- GATT_TRACE_DEBUG0 ("Service already been created!!");
+ GATT_TRACE_DEBUG ("Service already been created!!");
}
else
{
@@ -196,14 +196,14 @@
/* check for space */
if (num_handles > (0xFFFF - s_hdl + 1))
{
- GATT_TRACE_ERROR2 ("GATTS_ReserveHandles: no handles, s_hdl: %u needed: %u", s_hdl, num_handles);
+ GATT_TRACE_ERROR ("GATTS_ReserveHandles: no handles, s_hdl: %u needed: %u", s_hdl, num_handles);
return(0);
}
if ( (p_list = gatt_alloc_hdl_buffer()) == NULL)
{
/* No free entry */
- GATT_TRACE_ERROR0 ("GATTS_ReserveHandles: no free handle blocks");
+ GATT_TRACE_ERROR ("GATTS_ReserveHandles: no free handle blocks");
return(0);
}
@@ -224,7 +224,7 @@
if ( (p_buf = gatt_add_pending_new_srv_start(&p_list->asgn_range)) == NULL)
{
/* No free entry */
- GATT_TRACE_ERROR0 ("gatt_add_pending_new_srv_start: no free blocks");
+ GATT_TRACE_ERROR ("gatt_add_pending_new_srv_start: no free blocks");
if (p_list)
{
@@ -234,13 +234,13 @@
return(0);
}
- GATT_TRACE_DEBUG0 ("Add a new srv chg item");
+ GATT_TRACE_DEBUG ("Add a new srv chg item");
}
}
- if (!gatts_init_service_db(&p_list->svc_db, *p_svc_uuid, is_pri, s_hdl , num_handles))
+ if (!gatts_init_service_db(&p_list->svc_db, p_svc_uuid, is_pri, s_hdl , num_handles))
{
- GATT_TRACE_ERROR0 ("GATTS_ReserveHandles: service DB initialization failed");
+ GATT_TRACE_ERROR ("GATTS_ReserveHandles: service DB initialization failed");
if (p_list)
{
gatt_remove_an_item_from_list(p_list_info, p_list);
@@ -252,7 +252,7 @@
return(0);
}
- GATT_TRACE_DEBUG6 ("GATTS_CreateService(success): handles needed:%u s_hdl=%u e_hdl=%u %s[%x] is_primary=%d",
+ GATT_TRACE_DEBUG ("GATTS_CreateService(success): handles needed:%u s_hdl=%u e_hdl=%u %s[%x] is_primary=%d",
num_handles, p_list->asgn_range.s_handle , p_list->asgn_range.e_handle,
((p_list->asgn_range.svc_uuid.len == 2) ? "uuid16": "uuid128" ),
p_list->asgn_range.svc_uuid.uu.uuid16,
@@ -281,12 +281,12 @@
if ((p_decl = gatt_find_hdl_buffer_by_handle(service_handle)) == NULL)
{
- GATT_TRACE_DEBUG0("Service not created");
+ GATT_TRACE_DEBUG("Service not created");
return 0;
}
if ((p_incl_decl = gatt_find_hdl_buffer_by_handle(include_svc_handle)) == NULL)
{
- GATT_TRACE_DEBUG0("Included Service not created");
+ GATT_TRACE_DEBUG("Included Service not created");
return 0;
}
@@ -319,14 +319,14 @@
if ((p_decl = gatt_find_hdl_buffer_by_handle(service_handle)) == NULL)
{
- GATT_TRACE_DEBUG0("Service not created");
+ GATT_TRACE_DEBUG("Service not created");
return 0;
}
/* data validity checking */
if ( ((property & GATT_CHAR_PROP_BIT_AUTH) && !(perm & GATT_WRITE_SIGNED_PERM)) ||
((perm & GATT_WRITE_SIGNED_PERM) && !(property & GATT_CHAR_PROP_BIT_AUTH)) )
{
- GATT_TRACE_DEBUG2("Invalid configuration property=0x%x perm=0x%x ", property, perm);
+ GATT_TRACE_DEBUG("Invalid configuration property=0x%x perm=0x%x ", property, perm);
return 0;
}
@@ -362,13 +362,14 @@
if ((p_decl = gatt_find_hdl_buffer_by_handle(service_handle)) == NULL)
{
- GATT_TRACE_DEBUG0("Service not created");
+ GATT_TRACE_DEBUG("Service not created");
return 0;
}
if (p_descr_uuid == NULL ||
- (p_descr_uuid->len != LEN_UUID_128 && p_descr_uuid->len != LEN_UUID_16))
+ (p_descr_uuid->len != LEN_UUID_128 && p_descr_uuid->len != LEN_UUID_16
+ && p_descr_uuid->len != LEN_UUID_32))
{
- GATT_TRACE_DEBUG0("Illegal parameter");
+ GATT_TRACE_DEBUG("Illegal parameter");
return 0;
}
@@ -400,18 +401,18 @@
tGATT_REG *p_reg = gatt_get_regcb(gatt_if);
tBT_UUID *p_app_uuid128;
- GATT_TRACE_DEBUG0 ("GATTS_DeleteService");
+ GATT_TRACE_DEBUG ("GATTS_DeleteService");
if (p_reg == NULL)
{
- GATT_TRACE_ERROR0 ("Applicaiton not foud");
+ GATT_TRACE_ERROR ("Applicaiton not foud");
return(FALSE);
}
p_app_uuid128 = &p_reg->app_uuid128;
if ((p_list = gatt_find_hdl_buffer_by_app_id(p_app_uuid128, p_svc_uuid, svc_inst)) == NULL)
{
- GATT_TRACE_ERROR0 ("No Service found");
+ GATT_TRACE_ERROR ("No Service found");
return(FALSE);
}
@@ -419,7 +420,7 @@
&p_list->asgn_range.svc_uuid,
p_list->asgn_range.svc_inst)) != NULL)
{
- GATT_TRACE_DEBUG0 ("Delete a new service changed item - the service has not yet started");
+ GATT_TRACE_DEBUG ("Delete a new service changed item - the service has not yet started");
GKI_freebuf (GKI_remove_from_queue (&gatt_cb.pending_new_srv_start_q, p_buf));
}
else
@@ -434,7 +435,7 @@
GATTS_StopService(gatt_cb.sr_reg[i_sreg].s_hdl);
}
- GATT_TRACE_DEBUG2 ("released handles s_hdl=%u e_hdl=%u",
+ GATT_TRACE_DEBUG ("released handles s_hdl=%u e_hdl=%u",
p_list->asgn_range.s_handle , p_list->asgn_range.e_handle );
if ( (p_list->asgn_range.s_handle >= gatt_cb.hdl_cfg.app_start_hdl)
@@ -471,19 +472,19 @@
tGATTS_PENDING_NEW_SRV_START *p_buf;
- GATT_TRACE_API0 ("GATTS_StartService");
+ GATT_TRACE_API ("GATTS_StartService");
if (p_reg == NULL)
{
/* Not found */
- GATT_TRACE_ERROR0 ("Applicaiton not found ");
+ GATT_TRACE_ERROR ("Applicaiton not found ");
return GATT_NOT_FOUND;
}
if ((p_list = gatt_find_hdl_buffer_by_handle(service_handle)) == NULL)
{
/* Not found */
- GATT_TRACE_ERROR0 ("no service found");
+ GATT_TRACE_ERROR ("no service found");
return GATT_NOT_FOUND;
}
@@ -491,14 +492,14 @@
&p_list->asgn_range.svc_uuid,
p_list->asgn_range.svc_inst) != GATT_MAX_SR_PROFILES)
{
- GATT_TRACE_ERROR0 ("Duplicate Service start - Service already started");
+ GATT_TRACE_ERROR ("Duplicate Service start - Service already started");
return GATT_SERVICE_STARTED;
}
/*this is a new application servoce start */
if ((i_sreg = gatt_sr_alloc_rcb(p_list)) == GATT_MAX_SR_PROFILES)
{
- GATT_TRACE_ERROR0 ("GATTS_StartService: no free server registration block");
+ GATT_TRACE_ERROR ("GATTS_StartService: no free server registration block");
return GATT_NO_RESOURCES;
}
@@ -525,9 +526,9 @@
gatt_add_a_srv_to_list(&gatt_cb.srv_list_info, &gatt_cb.srv_list[i_sreg]);
- GATT_TRACE_DEBUG1 ("allocated i_sreg=%d ",i_sreg);
+ GATT_TRACE_DEBUG ("allocated i_sreg=%d ",i_sreg);
- GATT_TRACE_DEBUG5 ("s_hdl=%d e_hdl=%d type=0x%x svc_inst=%d sdp_hdl=0x%x",
+ GATT_TRACE_DEBUG ("s_hdl=%d e_hdl=%d type=0x%x svc_inst=%d sdp_hdl=0x%x",
p_sreg->s_hdl,p_sreg->e_hdl,
p_sreg->type, p_sreg->service_instance,
p_sreg->sdp_handle);
@@ -560,7 +561,7 @@
{
UINT8 ii = gatt_sr_find_i_rcb_by_handle(service_handle);
- GATT_TRACE_API1("GATTS_StopService %u", service_handle);
+ GATT_TRACE_API("GATTS_StopService %u", service_handle);
/* Index 0 is reserved for GATT, and is never stopped */
if ( (ii > 0) && (ii < GATT_MAX_SR_PROFILES) && (gatt_cb.sr_reg[ii].in_use) )
@@ -575,7 +576,7 @@
}
else
{
- GATT_TRACE_ERROR1("GATTS_StopService service_handle: %u is not in use", service_handle);
+ GATT_TRACE_ERROR("GATTS_StopService service_handle: %u is not in use", service_handle);
}
}
/*******************************************************************************
@@ -594,7 +595,7 @@
*******************************************************************************/
tGATT_STATUS GATTS_HandleValueIndication (UINT16 conn_id, UINT16 attr_handle, UINT16 val_len, UINT8 *p_val)
{
- tGATT_STATUS cmd_status = GATT_ILLEGAL_PARAMETER;
+ tGATT_STATUS cmd_status = GATT_NO_RESOURCES;
tGATT_VALUE indication;
BT_HDR *p_msg;
@@ -605,44 +606,45 @@
tGATT_TCB *p_tcb = gatt_get_tcb_by_idx(tcb_idx);
- GATT_TRACE_API0 ("GATTS_HandleValueIndication");
+ GATT_TRACE_API ("GATTS_HandleValueIndication");
if ( (p_reg == NULL) || (p_tcb == NULL))
{
- GATT_TRACE_ERROR1 ("GATTS_HandleValueIndication Unknown conn_id: %u ", conn_id);
+ GATT_TRACE_ERROR ("GATTS_HandleValueIndication Unknown conn_id: %u ", conn_id);
return(tGATT_STATUS) GATT_INVALID_CONN_ID;
}
+
+ if (! GATT_HANDLE_IS_VALID (attr_handle))
+ return GATT_ILLEGAL_PARAMETER;
+
indication.conn_id = conn_id;
indication.handle = attr_handle;
indication.len = val_len;
memcpy (indication.value, p_val, val_len);
indication.auth_req = GATT_AUTH_REQ_NONE;
- if (GATT_HANDLE_IS_VALID (attr_handle) )
+ if (GATT_HANDLE_IS_VALID(p_tcb->indicate_handle))
{
- if (GATT_HANDLE_IS_VALID(p_tcb->indicate_handle))
+ GATT_TRACE_DEBUG ("Add a pending indication");
+ if ((p_buf = gatt_add_pending_ind(p_tcb, &indication)) !=NULL)
{
- GATT_TRACE_DEBUG0 ("Add a pending indication");
- if ((p_buf = gatt_add_pending_ind(p_tcb, &indication)) !=NULL)
- {
- cmd_status = GATT_SUCCESS;
- }
- else
- {
- cmd_status = GATT_NO_RESOURCES;
- }
+ cmd_status = GATT_SUCCESS;
}
else
{
+ cmd_status = GATT_NO_RESOURCES;
+ }
+ }
+ else
+ {
- if ( (p_msg = attp_build_sr_msg (p_tcb, GATT_HANDLE_VALUE_IND, (tGATT_SR_MSG *)&indication)) != NULL)
+ if ( (p_msg = attp_build_sr_msg (p_tcb, GATT_HANDLE_VALUE_IND, (tGATT_SR_MSG *)&indication)) != NULL)
+ {
+ cmd_status = attp_send_sr_msg (p_tcb, p_msg);
+
+ if (cmd_status == GATT_SUCCESS || cmd_status == GATT_CONGESTED)
{
- cmd_status = attp_send_sr_msg (p_tcb, p_msg);
-
- if (cmd_status == GATT_SUCCESS)
- {
- p_tcb->indicate_handle = indication.handle;
- gatt_start_conf_timer(p_tcb);
- }
+ p_tcb->indicate_handle = indication.handle;
+ gatt_start_conf_timer(p_tcb);
}
}
}
@@ -674,11 +676,11 @@
tGATT_REG *p_reg = gatt_get_regcb(gatt_if);
tGATT_TCB *p_tcb = gatt_get_tcb_by_idx(tcb_idx);
- GATT_TRACE_API0 ("GATTS_HandleValueNotification");
+ GATT_TRACE_API ("GATTS_HandleValueNotification");
if ( (p_reg == NULL) || (p_tcb == NULL))
{
- GATT_TRACE_ERROR1 ("GATTS_HandleValueNotification Unknown conn_id: %u ", conn_id);
+ GATT_TRACE_ERROR ("GATTS_HandleValueNotification Unknown conn_id: %u ", conn_id);
return(tGATT_STATUS) GATT_INVALID_CONN_ID;
}
@@ -689,8 +691,13 @@
memcpy (notif.value, p_val, val_len);
notif.auth_req = GATT_AUTH_REQ_NONE;;
- p_buf = attp_build_sr_msg (p_tcb, GATT_HANDLE_VALUE_NOTIF, (tGATT_SR_MSG *)¬if);
- cmd_sent = attp_send_sr_msg (p_tcb, p_buf);
+ if ((p_buf = attp_build_sr_msg (p_tcb, GATT_HANDLE_VALUE_NOTIF, (tGATT_SR_MSG *)¬if))
+ != NULL)
+ {
+ cmd_sent = attp_send_sr_msg (p_tcb, p_buf);
+ }
+ else
+ cmd_sent = GATT_NO_RESOURCES;
}
return cmd_sent;
}
@@ -718,18 +725,18 @@
tGATT_REG *p_reg = gatt_get_regcb(gatt_if);
tGATT_TCB *p_tcb = gatt_get_tcb_by_idx(tcb_idx);
- GATT_TRACE_API3 ("GATTS_SendRsp: conn_id: %u trans_id: %u Status: 0x%04x",
+ GATT_TRACE_API ("GATTS_SendRsp: conn_id: %u trans_id: %u Status: 0x%04x",
conn_id, trans_id, status);
if ( (p_reg == NULL) || (p_tcb == NULL))
{
- GATT_TRACE_ERROR1 ("GATTS_SendRsp Unknown conn_id: %u ", conn_id);
+ GATT_TRACE_ERROR ("GATTS_SendRsp Unknown conn_id: %u ", conn_id);
return(tGATT_STATUS) GATT_INVALID_CONN_ID;
}
if (p_tcb->sr_cmd.trans_id != trans_id)
{
- GATT_TRACE_ERROR2 ("GATTS_SendRsp conn_id: %u waiting for op_code = %02x",
+ GATT_TRACE_ERROR ("GATTS_SendRsp conn_id: %u waiting for op_code = %02x",
conn_id, p_tcb->sr_cmd.op_code);
return(GATT_WRONG_STATE);
@@ -773,10 +780,13 @@
tGATT_CLCB *p_clcb;
- GATT_TRACE_API2 ("GATTC_ConfigureMTU conn_id=%d mtu=%d", conn_id, mtu );
+ GATT_TRACE_API ("GATTC_ConfigureMTU conn_id=%d mtu=%d", conn_id, mtu );
- // Validate that the link is BLE, not BR/EDR
- // ????
+ /* Validate that the link is BLE, not BR/EDR */
+ if (p_tcb->transport != BT_TRANSPORT_LE)
+ {
+ return GATT_ERROR;
+ }
if ( (p_tcb == NULL) || (p_reg==NULL) || (mtu < GATT_DEF_BLE_MTU_SIZE) || (mtu > GATT_MAX_MTU_SIZE))
{
@@ -785,7 +795,7 @@
if (gatt_is_clcb_allocated(conn_id))
{
- GATT_TRACE_ERROR1("GATTC_ConfigureMTU GATT_BUSY conn_id = %d", conn_id);
+ GATT_TRACE_ERROR("GATTC_ConfigureMTU GATT_BUSY conn_id = %d", conn_id);
return GATT_BUSY;
}
@@ -824,19 +834,19 @@
tGATT_REG *p_reg = gatt_get_regcb(gatt_if);
- GATT_TRACE_API2 ("GATTC_Discover conn_id=%d disc_type=%d",conn_id, disc_type);
+ GATT_TRACE_API ("GATTC_Discover conn_id=%d disc_type=%d",conn_id, disc_type);
if ( (p_tcb == NULL) || (p_reg==NULL) ||(p_param == NULL) ||
(disc_type >= GATT_DISC_MAX))
{
- GATT_TRACE_ERROR2("GATTC_Discover Illegal param: disc_type %d conn_id = %d", disc_type, conn_id);
+ GATT_TRACE_ERROR("GATTC_Discover Illegal param: disc_type %d conn_id = %d", disc_type, conn_id);
return GATT_ILLEGAL_PARAMETER;
}
if (gatt_is_clcb_allocated(conn_id))
{
- GATT_TRACE_ERROR1("GATTC_Discover GATT_BUSY conn_id = %d", conn_id);
+ GATT_TRACE_ERROR("GATTC_Discover GATT_BUSY conn_id = %d", conn_id);
return GATT_BUSY;
}
@@ -893,17 +903,17 @@
tGATT_REG *p_reg = gatt_get_regcb(gatt_if);
- GATT_TRACE_API2 ("GATTC_Read conn_id=%d type=%d", conn_id, type);
+ GATT_TRACE_API ("GATTC_Read conn_id=%d type=%d", conn_id, type);
if ( (p_tcb == NULL) || (p_reg==NULL) || (p_read == NULL) || ((type >= GATT_READ_MAX) || (type == 0)))
{
- GATT_TRACE_ERROR2("GATT_Read Illegal param: conn_id %d, type 0%d,", conn_id, type);
+ GATT_TRACE_ERROR("GATT_Read Illegal param: conn_id %d, type 0%d,", conn_id, type);
return GATT_ILLEGAL_PARAMETER;
}
if (gatt_is_clcb_allocated(conn_id))
{
- GATT_TRACE_ERROR1("GATTC_Read GATT_BUSY conn_id = %d", conn_id);
+ GATT_TRACE_ERROR("GATTC_Read GATT_BUSY conn_id = %d", conn_id);
return GATT_BUSY;
}
@@ -983,13 +993,13 @@
if ( (p_tcb == NULL) || (p_reg==NULL) || (p_write == NULL) ||
((type != GATT_WRITE) && (type != GATT_WRITE_PREPARE) && (type != GATT_WRITE_NO_RSP)) )
{
- GATT_TRACE_ERROR2("GATT_Write Illegal param: conn_id %d, type 0%d,", conn_id, type);
+ GATT_TRACE_ERROR("GATT_Write Illegal param: conn_id %d, type 0%d,", conn_id, type);
return GATT_ILLEGAL_PARAMETER;
}
if (gatt_is_clcb_allocated(conn_id))
{
- GATT_TRACE_ERROR1("GATTC_Write GATT_BUSY conn_id = %d", conn_id);
+ GATT_TRACE_ERROR("GATTC_Write GATT_BUSY conn_id = %d", conn_id);
return GATT_BUSY;
}
@@ -1054,17 +1064,17 @@
tGATT_TCB *p_tcb = gatt_get_tcb_by_idx(tcb_idx);
tGATT_REG *p_reg = gatt_get_regcb(gatt_if);
- GATT_TRACE_API2 ("GATTC_ExecuteWrite conn_id=%d is_execute=%d", conn_id, is_execute);
+ GATT_TRACE_API ("GATTC_ExecuteWrite conn_id=%d is_execute=%d", conn_id, is_execute);
if ( (p_tcb == NULL) || (p_reg==NULL) )
{
- GATT_TRACE_ERROR1("GATTC_ExecuteWrite Illegal param: conn_id %d", conn_id);
+ GATT_TRACE_ERROR("GATTC_ExecuteWrite Illegal param: conn_id %d", conn_id);
return GATT_ILLEGAL_PARAMETER;
}
if (gatt_is_clcb_allocated(conn_id))
{
- GATT_TRACE_ERROR1("GATTC_Write GATT_BUSY conn_id = %d", conn_id);
+ GATT_TRACE_ERROR("GATTC_Write GATT_BUSY conn_id = %d", conn_id);
return GATT_BUSY;
}
@@ -1076,7 +1086,7 @@
}
else
{
- GATT_TRACE_ERROR1("Unable to allocate client CB for conn_id %d ", conn_id);
+ GATT_TRACE_ERROR("Unable to allocate client CB for conn_id %d ", conn_id);
status = GATT_NO_RESOURCES;
}
return status;
@@ -1100,7 +1110,7 @@
tGATT_STATUS ret = GATT_ILLEGAL_PARAMETER;
tGATT_TCB *p_tcb=gatt_get_tcb_by_idx(GATT_GET_TCB_IDX(conn_id));
- GATT_TRACE_API2 ("GATTC_SendHandleValueConfirm conn_id=%d handle=0x%x", conn_id, handle);
+ GATT_TRACE_API ("GATTC_SendHandleValueConfirm conn_id=%d handle=0x%x", conn_id, handle);
if (p_tcb)
{
@@ -1108,7 +1118,7 @@
{
btu_stop_timer (&p_tcb->ind_ack_timer_ent);
- GATT_TRACE_DEBUG1 ("notif_count=%d ", p_tcb->ind_count);
+ GATT_TRACE_DEBUG ("notif_count=%d ", p_tcb->ind_count);
/* send confirmation now */
ret = attp_send_cl_msg(p_tcb, 0, GATT_HANDLE_VALUE_CONF, (tGATT_CL_MSG *)&handle);
@@ -1117,13 +1127,13 @@
}
else
{
- GATT_TRACE_DEBUG1 ("GATTC_SendHandleValueConfirm - conn_id: %u - ignored not waiting for indicaiton ack", conn_id);
+ GATT_TRACE_DEBUG ("GATTC_SendHandleValueConfirm - conn_id: %u - ignored not waiting for indicaiton ack", conn_id);
ret = GATT_SUCCESS;
}
}
else
{
- GATT_TRACE_ERROR1 ("GATTC_SendHandleValueConfirm - Unknown conn_id: %u", conn_id);
+ GATT_TRACE_ERROR ("GATTC_SendHandleValueConfirm - Unknown conn_id: %u", conn_id);
}
return ret;
}
@@ -1147,12 +1157,12 @@
** Returns void
**
*******************************************************************************/
-void GATT_SetIdleTimeout (BD_ADDR bd_addr, UINT16 idle_tout)
+void GATT_SetIdleTimeout (BD_ADDR bd_addr, UINT16 idle_tout, tBT_TRANSPORT transport)
{
tGATT_TCB *p_tcb;
BOOLEAN status = FALSE;
- if ((p_tcb = gatt_find_tcb_by_addr (bd_addr)) != NULL)
+ if ((p_tcb = gatt_find_tcb_by_addr (bd_addr, transport)) != NULL)
{
if (p_tcb->att_lcid == L2CAP_ATT_CID)
{
@@ -1164,7 +1174,7 @@
}
}
- GATT_TRACE_API2 ("GATT_SetIdleTimeout idle_tout=%d status=%d(1-OK 0-not performed)",
+ GATT_TRACE_API ("GATT_SetIdleTimeout idle_tout=%d status=%d(1-OK 0-not performed)",
idle_tout, status);
}
@@ -1188,14 +1198,14 @@
UINT8 i_gatt_if=0;
tGATT_IF gatt_if=0;
- GATT_TRACE_API0 ("GATT_Register");
+ GATT_TRACE_API ("GATT_Register");
gatt_dbg_display_uuid(*p_app_uuid128);
for (i_gatt_if = 0, p_reg = gatt_cb.cl_rcb; i_gatt_if < GATT_MAX_APPS; i_gatt_if++, p_reg++)
{
if (p_reg->in_use && !memcmp(p_app_uuid128->uu.uuid128, p_reg->app_uuid128.uu.uuid128, LEN_UUID_128))
{
- GATT_TRACE_ERROR0("application already registered.");
+ GATT_TRACE_ERROR("application already registered.");
return 0;
}
}
@@ -1215,7 +1225,7 @@
break;
}
}
- GATT_TRACE_API1 ("allocated gatt_if=%d", gatt_if);
+ GATT_TRACE_API ("allocated gatt_if=%d", gatt_if);
return gatt_if;
}
@@ -1239,11 +1249,11 @@
UINT8 i, ii, j;
tGATT_SR_REG *p_sreg;
- GATT_TRACE_API1 ("GATT_Deregister gatt_if=%d", gatt_if);
+ GATT_TRACE_API ("GATT_Deregister gatt_if=%d", gatt_if);
/* Index 0 is GAP and is never deregistered */
if ( (gatt_if == 0) || (p_reg == NULL) )
{
- GATT_TRACE_ERROR1 ("GATT_Deregister with invalid gatt_if: %u", gatt_if);
+ GATT_TRACE_ERROR ("GATT_Deregister with invalid gatt_if: %u", gatt_if);
return;
}
@@ -1275,7 +1285,7 @@
if (!gatt_num_apps_hold_link(p_tcb))
{
/* this will disconnect the link or cancel the pending connect request at lower layer*/
- gatt_disconnect(p_tcb->peer_bda);
+ gatt_disconnect(p_tcb);
}
}
@@ -1323,19 +1333,20 @@
BD_ADDR bda;
UINT8 start_idx, found_idx;
UINT16 conn_id;
+ tGATT_TRANSPORT transport ;
- GATT_TRACE_API1 ("GATT_StartIf gatt_if=%d", gatt_if);
+ GATT_TRACE_API ("GATT_StartIf gatt_if=%d", gatt_if);
if ((p_reg = gatt_get_regcb(gatt_if)) != NULL)
{
p_reg = &gatt_cb.cl_rcb[gatt_if - 1];
start_idx = 0;
- while (gatt_find_the_connected_bda(start_idx, bda, &found_idx))
+ while (gatt_find_the_connected_bda(start_idx, bda, &found_idx, &transport))
{
- p_tcb = gatt_find_tcb_by_addr(bda);
+ p_tcb = gatt_find_tcb_by_addr(bda, transport);
if (p_reg->app_cb.p_conn_cb && p_tcb)
{
conn_id = GATT_CREATE_CONN_ID(p_tcb->tcb_idx, gatt_if);
- (*p_reg->app_cb.p_conn_cb)(gatt_if, bda, conn_id, TRUE, 0);
+ (*p_reg->app_cb.p_conn_cb)(gatt_if, bda, conn_id, TRUE, 0, transport);
}
start_idx = ++found_idx;
}
@@ -1357,23 +1368,31 @@
** Returns TRUE if connection started; FALSE if connection start failure.
**
*******************************************************************************/
-BOOLEAN GATT_Connect (tGATT_IF gatt_if, BD_ADDR bd_addr, BOOLEAN is_direct){
+BOOLEAN GATT_Connect (tGATT_IF gatt_if, BD_ADDR bd_addr, BOOLEAN is_direct, tBT_TRANSPORT transport)
+{
tGATT_REG *p_reg;
- BOOLEAN status;
+ BOOLEAN status = FALSE;
- GATT_TRACE_API1 ("GATT_Connect gatt_if=%d", gatt_if);
+ GATT_TRACE_API ("GATT_Connect gatt_if=%d", gatt_if);
/* Make sure app is registered */
if ((p_reg = gatt_get_regcb(gatt_if)) == NULL)
{
- GATT_TRACE_ERROR1("GATT_Connect - gatt_if =%d is not registered", gatt_if);
+ GATT_TRACE_ERROR("GATT_Connect - gatt_if =%d is not registered", gatt_if);
return(FALSE);
}
if (is_direct)
- status = gatt_act_connect (p_reg, bd_addr);
+ status = gatt_act_connect (p_reg, bd_addr, transport);
else
+ {
+ if (transport == BT_TRANSPORT_LE)
status = gatt_update_auto_connect_dev(gatt_if,TRUE, bd_addr, TRUE);
+ else
+ {
+ GATT_TRACE_ERROR("Unsupported transport for background connection");
+ }
+ }
return status;
@@ -1400,11 +1419,11 @@
tGATT_IF temp_gatt_if;
UINT8 start_idx, found_idx;
- GATT_TRACE_API1 ("GATT_CancelConnect gatt_if=%d", gatt_if);
+ GATT_TRACE_API ("GATT_CancelConnect gatt_if=%d", gatt_if);
if ((gatt_if != 0) && ((p_reg = gatt_get_regcb(gatt_if)) == NULL))
{
- GATT_TRACE_ERROR1("GATT_CancelConnect - gatt_if =%d is not registered", gatt_if);
+ GATT_TRACE_ERROR("GATT_CancelConnect - gatt_if =%d is not registered", gatt_if);
return(FALSE);
}
@@ -1412,9 +1431,10 @@
{
if (!gatt_if)
{
- GATT_TRACE_DEBUG0("GATT_CancelConnect - unconditional");
+ GATT_TRACE_DEBUG("GATT_CancelConnect - unconditional");
start_idx = 0;
- p_tcb = gatt_find_tcb_by_addr(bd_addr);
+ /* only LE connection can be cancelled */
+ p_tcb = gatt_find_tcb_by_addr(bd_addr, BT_TRANSPORT_LE);
if (p_tcb && gatt_num_apps_hold_link(p_tcb))
{
while (status && gatt_find_app_hold_link(p_tcb, start_idx, &found_idx, &temp_gatt_if))
@@ -1425,7 +1445,7 @@
}
else
{
- GATT_TRACE_ERROR0("GATT_CancelConnect - no app found");
+ GATT_TRACE_ERROR("GATT_CancelConnect - no app found");
status = FALSE;
}
}
@@ -1445,7 +1465,7 @@
}
else
{
- GATT_TRACE_ERROR0("GATT_CancelConnect -no app associated with the bg device for unconditional removal");
+ GATT_TRACE_ERROR("GATT_CancelConnect -no app associated with the bg device for unconditional removal");
status = FALSE;
}
}
@@ -1477,7 +1497,7 @@
tGATT_IF gatt_if=GATT_GET_GATT_IF(conn_id);
UINT8 tcb_idx = GATT_GET_TCB_IDX(conn_id);
- GATT_TRACE_API1 ("GATT_Disconnect conn_id=%d ", conn_id);
+ GATT_TRACE_API ("GATT_Disconnect conn_id=%d ", conn_id);
p_tcb = gatt_get_tcb_by_idx(tcb_idx);
@@ -1486,7 +1506,7 @@
gatt_update_app_use_link_flag(gatt_if, p_tcb, FALSE, FALSE);
if (!gatt_num_apps_hold_link(p_tcb))
{
- gatt_disconnect(p_tcb->peer_bda);
+ gatt_disconnect(p_tcb);
}
ret = GATT_SUCCESS;
}
@@ -1508,7 +1528,8 @@
** Returns TRUE the ligical link information is found for conn_id
**
*******************************************************************************/
-BOOLEAN GATT_GetConnectionInfor(UINT16 conn_id, tGATT_IF *p_gatt_if, BD_ADDR bd_addr)
+BOOLEAN GATT_GetConnectionInfor(UINT16 conn_id, tGATT_IF *p_gatt_if, BD_ADDR bd_addr,
+ tBT_TRANSPORT *p_transport)
{
tGATT_IF gatt_if = GATT_GET_GATT_IF(conn_id);
@@ -1517,12 +1538,13 @@
tGATT_TCB *p_tcb= gatt_get_tcb_by_idx(tcb_idx);
BOOLEAN status=FALSE;
- GATT_TRACE_API1 ("GATT_GetConnectionInfor conn_id=%d", conn_id);
+ GATT_TRACE_API ("GATT_GetConnectionInfor conn_id=%d", conn_id);
if (p_tcb && p_reg )
{
memcpy(bd_addr, p_tcb->peer_bda, BD_ADDR_LEN);
*p_gatt_if = gatt_if;
+ *p_transport = p_tcb->transport;
status = TRUE;
}
return status;
@@ -1539,14 +1561,16 @@
** Parameters gatt_if: applicaiton interface (input)
** bd_addr: peer device address. (input)
** p_conn_id: connection id (output)
+** transport: transport option
**
** Returns TRUE the logical link is connected
**
*******************************************************************************/
-BOOLEAN GATT_GetConnIdIfConnected(tGATT_IF gatt_if, BD_ADDR bd_addr, UINT16 *p_conn_id)
+BOOLEAN GATT_GetConnIdIfConnected(tGATT_IF gatt_if, BD_ADDR bd_addr, UINT16 *p_conn_id,
+ tBT_TRANSPORT transport)
{
tGATT_REG *p_reg = gatt_get_regcb(gatt_if);
- tGATT_TCB *p_tcb= gatt_find_tcb_by_addr(bd_addr);
+ tGATT_TCB *p_tcb= gatt_find_tcb_by_addr(bd_addr, transport);
BOOLEAN status=FALSE;
if (p_reg && p_tcb && (gatt_get_ch_state(p_tcb) == GATT_CH_OPEN) )
@@ -1555,7 +1579,7 @@
status = TRUE;
}
- GATT_TRACE_API1 ("GATT_GetConnIdIfConnected status=%d", status);
+ GATT_TRACE_API ("GATT_GetConnIdIfConnected status=%d", status);
return status;
}
@@ -1580,12 +1604,12 @@
tGATT_REG *p_reg;
BOOLEAN status = TRUE;
- GATT_TRACE_API1 ("GATT_Listen gatt_if=%d", gatt_if);
+ GATT_TRACE_API ("GATT_Listen gatt_if=%d", gatt_if);
/* Make sure app is registered */
if ((p_reg = gatt_get_regcb(gatt_if)) == NULL)
{
- GATT_TRACE_ERROR1("GATT_Listen - gatt_if =%d is not registered", gatt_if);
+ GATT_TRACE_ERROR("GATT_Listen - gatt_if =%d is not registered", gatt_if);
return(FALSE);
}
@@ -1598,10 +1622,7 @@
p_reg->listening = start ? GATT_LISTEN_TO_ALL : GATT_LISTEN_TO_NONE;
}
- gatt_update_listen_mode();
-
- return status;
-
+ return gatt_update_listen_mode();
}
#endif
diff --git a/stack/gatt/gatt_attr.c b/stack/gatt/gatt_attr.c
index 1ee4ae3..df852e3 100644
--- a/stack/gatt/gatt_attr.c
+++ b/stack/gatt/gatt_attr.c
@@ -41,7 +41,8 @@
#endif
static void gatt_profile_request_cback (UINT16 conn_id, UINT32 trans_id, UINT8 op_code, tGATTS_DATA *p_data);
-static void gatt_profile_connect_cback (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id, BOOLEAN connected, tGATT_DISCONN_REASON reason);
+static void gatt_profile_connect_cback (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id,
+ BOOLEAN connected, tGATT_DISCONN_REASON reason, tBT_TRANSPORT transport);
static tGATT_CBACK gatt_profile_cback =
{
@@ -50,6 +51,7 @@
NULL,
NULL,
gatt_profile_request_cback,
+ NULL,
NULL
} ;
@@ -87,14 +89,15 @@
** Returns Pointer to the found link conenction control block.
**
*******************************************************************************/
-tGATT_PROFILE_CLCB *gatt_profile_find_clcb_by_bd_addr(BD_ADDR bda)
+static tGATT_PROFILE_CLCB *gatt_profile_find_clcb_by_bd_addr(BD_ADDR bda, tBT_TRANSPORT transport)
{
UINT8 i_clcb;
tGATT_PROFILE_CLCB *p_clcb = NULL;
for (i_clcb = 0, p_clcb= gatt_cb.profile_clcb; i_clcb < GATT_MAX_APPS; i_clcb++, p_clcb++)
{
- if (p_clcb->in_use && p_clcb->connected && !memcmp(p_clcb->bda, bda, BD_ADDR_LEN))
+ if (p_clcb->in_use && p_clcb->transport == transport &&
+ p_clcb->connected && !memcmp(p_clcb->bda, bda, BD_ADDR_LEN))
{
return p_clcb;
}
@@ -112,7 +115,7 @@
** Returns NULL if not found. Otherwise pointer to the connection link block.
**
*******************************************************************************/
-tGATT_PROFILE_CLCB *gatt_profile_clcb_alloc (UINT16 conn_id, BD_ADDR bda)
+tGATT_PROFILE_CLCB *gatt_profile_clcb_alloc (UINT16 conn_id, BD_ADDR bda, tBT_TRANSPORT tranport)
{
UINT8 i_clcb = 0;
tGATT_PROFILE_CLCB *p_clcb = NULL;
@@ -124,6 +127,7 @@
p_clcb->in_use = TRUE;
p_clcb->conn_id = conn_id;
p_clcb->connected = TRUE;
+ p_clcb->transport = tranport;
memcpy (p_clcb->bda, bda, BD_ADDR_LEN);
break;
}
@@ -187,16 +191,16 @@
case GATTS_REQ_TYPE_WRITE_EXEC:
case GATT_CMD_WRITE:
ignore = TRUE;
- GATT_TRACE_EVENT0("Ignore GATT_REQ_EXEC_WRITE/WRITE_CMD" );
+ GATT_TRACE_EVENT("Ignore GATT_REQ_EXEC_WRITE/WRITE_CMD" );
break;
case GATTS_REQ_TYPE_MTU:
- GATT_TRACE_EVENT1("Get MTU exchange new mtu size: %d", p_data->mtu);
+ GATT_TRACE_EVENT("Get MTU exchange new mtu size: %d", p_data->mtu);
ignore = TRUE;
break;
default:
- GATT_TRACE_EVENT1("Unknown/unexpected LE GAP ATT request: 0x%02x", type);
+ GATT_TRACE_EVENT("Unknown/unexpected LE GAP ATT request: 0x%02x", type);
break;
}
@@ -215,19 +219,20 @@
**
*******************************************************************************/
static void gatt_profile_connect_cback (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id,
- BOOLEAN connected, tGATT_DISCONN_REASON reason)
+ BOOLEAN connected, tGATT_DISCONN_REASON reason,
+ tBT_TRANSPORT transport)
{
UNUSED(gatt_if);
- GATT_TRACE_EVENT5 ("gatt_profile_connect_cback: from %08x%04x connected:%d conn_id=%d reason = 0x%04x",
+ GATT_TRACE_EVENT ("gatt_profile_connect_cback: from %08x%04x connected:%d conn_id=%d reason = 0x%04x",
(bda[0]<<24)+(bda[1]<<16)+(bda[2]<<8)+bda[3],
(bda[4]<<8)+bda[5], connected, conn_id, reason);
if (connected)
{
- if (gatt_profile_clcb_alloc(conn_id, bda) == NULL)
+ if (gatt_profile_clcb_alloc(conn_id, bda, transport) == NULL)
{
- GATT_TRACE_ERROR0 ("gatt_profile_connect_cback: no_resource");
+ GATT_TRACE_ERROR ("gatt_profile_connect_cback: no_resource");
return;
}
}
@@ -268,14 +273,14 @@
gatt_cb.gattp_attr.handle =
gatt_cb.handle_of_h_r = GATTS_AddCharacteristic(service_handle, &uuid, 0, GATT_CHAR_PROP_BIT_INDICATE);
- GATT_TRACE_DEBUG1 ("gatt_profile_db_init: handle of service changed%d",
+ GATT_TRACE_DEBUG ("gatt_profile_db_init: handle of service changed%d",
gatt_cb.handle_of_h_r );
/* start service
*/
status = GATTS_StartService (gatt_cb.gatt_if, service_handle, GATTP_TRANSPORT_SUPPORTED );
- GATT_TRACE_DEBUG2 ("gatt_profile_db_init: gatt_if=%d start status%d",
+ GATT_TRACE_DEBUG ("gatt_profile_db_init: gatt_if=%d start status%d",
gatt_cb.gatt_if, status);
}
diff --git a/stack/gatt/gatt_auth.c b/stack/gatt/gatt_auth.c
index 7dc99e1..10cf76e 100644
--- a/stack/gatt/gatt_auth.c
+++ b/stack/gatt/gatt_auth.c
@@ -114,9 +114,8 @@
}
else
{
- /* if this is a bad signature, assume from attacker, ignore it */
- GATT_TRACE_ERROR0("Signature Verification Failed");
- gatt_disconnect(p_tcb->peer_bda);
+ /* if this is a bad signature, assume from attacker, ignore it */
+ GATT_TRACE_ERROR("Signature Verification Failed, data ignored");
}
return;
@@ -132,7 +131,7 @@
*******************************************************************************/
void gatt_sec_check_complete(BOOLEAN sec_check_ok, tGATT_CLCB *p_clcb, UINT8 sec_act)
{
- if (GKI_queue_is_empty(&p_clcb->p_tcb->pending_enc_clcb))
+ if (p_clcb && p_clcb->p_tcb && GKI_queue_is_empty(&p_clcb->p_tcb->pending_enc_clcb))
gatt_set_sec_act(p_clcb->p_tcb, GATT_SEC_NONE);
if (!sec_check_ok)
@@ -157,7 +156,7 @@
** Returns
**
*******************************************************************************/
-void gatt_enc_cmpl_cback(BD_ADDR bd_addr, void *p_ref_data, tBTM_STATUS result)
+void gatt_enc_cmpl_cback(BD_ADDR bd_addr, tBT_TRANSPORT transport, void *p_ref_data, tBTM_STATUS result)
{
tGATT_TCB *p_tcb;
UINT8 sec_flag;
@@ -166,8 +165,8 @@
UINT16 count;
UNUSED(p_ref_data);
- GATT_TRACE_DEBUG0("gatt_enc_cmpl_cback");
- if ((p_tcb = gatt_find_tcb_by_addr(bd_addr)) != NULL)
+ GATT_TRACE_DEBUG("gatt_enc_cmpl_cback");
+ if ((p_tcb = gatt_find_tcb_by_addr(bd_addr, transport)) != NULL)
{
if (gatt_get_sec_act(p_tcb) == GATT_SEC_ENC_PENDING)
return;
@@ -178,8 +177,9 @@
{
if (gatt_get_sec_act(p_tcb) == GATT_SEC_ENCRYPT_MITM )
{
- BTM_GetSecurityFlags(bd_addr, &sec_flag);
- if (sec_flag & sec_flag & BTM_SEC_FLAG_LKEY_AUTHED)
+ BTM_GetSecurityFlagsByTransport(bd_addr, &sec_flag, transport);
+
+ if (sec_flag & BTM_SEC_FLAG_LKEY_AUTHED)
{
status = TRUE;
}
@@ -206,12 +206,12 @@
}
else
{
- GATT_TRACE_ERROR0("Unknown operation encryption completed");
+ GATT_TRACE_ERROR("Unknown operation encryption completed");
}
}
else
{
- GATT_TRACE_ERROR0("enc callback for unknown bd_addr");
+ GATT_TRACE_ERROR("enc callback for unknown bd_addr");
}
}
@@ -232,7 +232,7 @@
UINT16 count;
UINT8 i = 0;
- if ((p_tcb = gatt_find_tcb_by_addr(bd_addr)) != NULL)
+ if ((p_tcb = gatt_find_tcb_by_addr(bd_addr, BT_TRANSPORT_LE)) != NULL)
{
for (i = 0; i < GATT_MAX_APPS; i++)
{
@@ -262,7 +262,7 @@
}
else
{
- GATT_TRACE_DEBUG0("notify GATT for encryption completion of unknown device");
+ GATT_TRACE_DEBUG("notify GATT for encryption completion of unknown device");
}
return;
}
@@ -316,9 +316,7 @@
UINT8 sec_flag;
tGATT_TCB *p_tcb = p_clcb->p_tcb;
tGATT_AUTH_REQ auth_req = p_clcb->auth_req;
-
BOOLEAN is_link_encrypted= FALSE;
- BOOLEAN is_le_link=FALSE;
BOOLEAN is_link_key_known=FALSE;
BOOLEAN is_key_mitm=FALSE;
UINT8 key_type;
@@ -327,8 +325,8 @@
if (auth_req == GATT_AUTH_REQ_NONE )
return act;
- is_le_link = BTM_UseLeLink(p_tcb->peer_bda);
- BTM_GetSecurityFlags(p_tcb->peer_bda, &sec_flag);
+ BTM_GetSecurityFlagsByTransport(p_tcb->peer_bda, &sec_flag, p_clcb->p_tcb->transport);
+
btm_ble_link_sec_check(p_tcb->peer_bda, auth_req, &sec_act);
/* if a encryption is pending, need to wait */
@@ -336,24 +334,15 @@
auth_req != GATT_AUTH_REQ_NONE)
return GATT_SEC_ENC_PENDING;
- if (sec_flag & BTM_SEC_FLAG_ENCRYPTED)
+ if (sec_flag & (BTM_SEC_FLAG_ENCRYPTED| BTM_SEC_FLAG_LKEY_KNOWN))
{
- is_link_encrypted = TRUE;
+ if (sec_flag & BTM_SEC_FLAG_ENCRYPTED)
+ is_link_encrypted = TRUE;
+
is_link_key_known = TRUE;
if (sec_flag & BTM_SEC_FLAG_LKEY_AUTHED)
- {
is_key_mitm = TRUE;
- }
-
- }
- else if (sec_flag & BTM_SEC_FLAG_LKEY_KNOWN)
- {
- is_link_key_known = TRUE;
- if (sec_flag & BTM_SEC_FLAG_LKEY_AUTHED)
- {
- is_key_mitm = TRUE;
- }
}
/* first check link key upgrade required or not */
@@ -377,7 +366,7 @@
/* now check link needs to be encrypted or not if the link key upgrade is not required */
if (act == GATT_SEC_OK)
{
- if (is_le_link &&
+ if (p_tcb->transport == BT_TRANSPORT_LE &&
(p_clcb->operation == GATTC_OPTYPE_WRITE) &&
(p_clcb->op_subtype == GATT_WRITE_NO_RSP))
{
@@ -430,7 +419,7 @@
tGATT_STATUS encrypt_status = GATT_NOT_ENCRYPTED;
UINT8 sec_flag=0;
- BTM_GetSecurityFlags(p_tcb->peer_bda, &sec_flag);
+ BTM_GetSecurityFlagsByTransport(p_tcb->peer_bda, &sec_flag, p_tcb->transport);
if ((sec_flag & BTM_SEC_FLAG_ENCRYPTED) && (sec_flag & BTM_SEC_FLAG_LKEY_KNOWN))
{
@@ -439,7 +428,7 @@
encrypt_status = GATT_ENCRYPED_MITM;
}
- GATT_TRACE_DEBUG1("gatt_get_link_encrypt_status status=0x%x",encrypt_status);
+ GATT_TRACE_DEBUG("gatt_get_link_encrypt_status status=0x%x",encrypt_status);
return encrypt_status ;
}
@@ -500,7 +489,7 @@
switch (gatt_sec_act )
{
case GATT_SEC_SIGN_DATA:
- GATT_TRACE_DEBUG0("gatt_security_check_start: Do data signing");
+ GATT_TRACE_DEBUG("gatt_security_check_start: Do data signing");
gatt_sign_data(p_clcb);
break;
case GATT_SEC_ENCRYPT:
@@ -508,12 +497,12 @@
case GATT_SEC_ENCRYPT_MITM:
if (sec_act_old < GATT_SEC_ENCRYPT)
{
- GATT_TRACE_DEBUG0("gatt_security_check_start: Encrypt now or key upgreade first");
+ GATT_TRACE_DEBUG("gatt_security_check_start: Encrypt now or key upgreade first");
gatt_convert_sec_action(gatt_sec_act, &btm_ble_sec_act);
- btm_status = BTM_SetEncryption(p_tcb->peer_bda, gatt_enc_cmpl_cback, &btm_ble_sec_act);
+ btm_status = BTM_SetEncryption(p_tcb->peer_bda, p_tcb->transport , gatt_enc_cmpl_cback, &btm_ble_sec_act);
if ( (btm_status != BTM_SUCCESS) && (btm_status != BTM_CMD_STARTED))
{
- GATT_TRACE_ERROR1("gatt_security_check_start BTM_SetEncryption failed btm_status=%d", btm_status);
+ GATT_TRACE_ERROR("gatt_security_check_start BTM_SetEncryption failed btm_status=%d", btm_status);
status = FALSE;
}
}
diff --git a/stack/gatt/gatt_cl.c b/stack/gatt/gatt_cl.c
index e8c41fc..0dd3c49 100644
--- a/stack/gatt/gatt_cl.c
+++ b/stack/gatt/gatt_cl.c
@@ -27,6 +27,7 @@
#if BLE_INCLUDED == TRUE
#include <string.h>
+#include "bt_utils.h"
#include "gki.h"
#include "gatt_int.h"
@@ -102,6 +103,13 @@
cl_req.find_type_value.s_handle = p_clcb->s_handle;
cl_req.find_type_value.e_handle = p_clcb->e_handle;
cl_req.find_type_value.value_len = p_clcb->uuid.len;
+ /* if service type is 32 bits UUID, convert it now */
+ if (p_clcb->uuid.len == LEN_UUID_32)
+ {
+ cl_req.find_type_value.value_len = LEN_UUID_128;
+ gatt_convert_uuid32_to_uuid128(cl_req.find_type_value.value, p_clcb->uuid.uu.uuid32);
+ }
+ else
memcpy (cl_req.find_type_value.value, &p_clcb->uuid.uu, p_clcb->uuid.len);
}
@@ -164,7 +172,7 @@
else
p_clcb->first_read_blob_after_read = FALSE;
- GATT_TRACE_DEBUG1("gatt_act_read first_read_blob_after_read=%d",
+ GATT_TRACE_DEBUG("gatt_act_read first_read_blob_after_read=%d",
p_clcb->first_read_blob_after_read);
op_code = GATT_REQ_READ_BLOB;
msg.read_blob.offset = offset;
@@ -191,7 +199,7 @@
break;
default:
- GATT_TRACE_ERROR1("Unknown read type: %d", p_clcb->op_subtype);
+ GATT_TRACE_ERROR("Unknown read type: %d", p_clcb->op_subtype);
break;
}
@@ -260,19 +268,19 @@
default:
rt = GATT_INTERNAL_ERROR;
- GATT_TRACE_ERROR1("Unknown write type: %d", p_clcb->op_subtype);
+ GATT_TRACE_ERROR("Unknown write type: %d", p_clcb->op_subtype);
break;
}
}
else
rt = GATT_INTERNAL_ERROR;
- if ((rt != GATT_SUCCESS && rt != GATT_CMD_STARTED)
+ if ((rt != GATT_SUCCESS && rt != GATT_CMD_STARTED && rt != GATT_CONGESTED)
|| (rt != GATT_CMD_STARTED && p_clcb->op_subtype == GATT_WRITE_NO_RSP))
{
if (rt != GATT_SUCCESS)
{
- GATT_TRACE_ERROR1("gatt_act_write() failed op_code=0x%x", op_code);
+ GATT_TRACE_ERROR("gatt_act_write() failed op_code=0x%x", op_code);
}
gatt_end_operation(p_clcb, rt, NULL);
}
@@ -290,7 +298,7 @@
{
UINT8 rt ;
- GATT_TRACE_DEBUG0("gatt_send_queue_write_cancel ");
+ GATT_TRACE_DEBUG("gatt_send_queue_write_cancel ");
rt = attp_send_cl_msg(p_tcb, p_clcb->clcb_idx, GATT_REQ_EXEC_WRITE, (tGATT_CL_MSG *)&flag);
@@ -314,7 +322,7 @@
BOOLEAN exec = FALSE;
tGATT_EXEC_FLAG flag = GATT_PREP_WRITE_EXEC;
- GATT_TRACE_DEBUG0("gatt_check_write_long_terminate ");
+ GATT_TRACE_DEBUG("gatt_check_write_long_terminate ");
/* check the first write response status */
if (p_rsp_value != NULL)
{
@@ -358,7 +366,7 @@
UINT8 rt = GATT_SUCCESS;
UINT8 type = p_clcb->op_subtype;
- GATT_TRACE_DEBUG1("gatt_send_prepare_write type=0x%x", type );
+ GATT_TRACE_DEBUG("gatt_send_prepare_write type=0x%x", type );
to_send = p_attr->len - p_attr->offset;
if (to_send > (p_tcb->payload_size - GATT_WRITE_LONG_HDR_SIZE)) /* 2 = UINT16 offset bytes */
@@ -372,7 +380,7 @@
offset += p_clcb->start_offset;
}
- GATT_TRACE_DEBUG2("offset =0x%x len=%d", offset, to_send );
+ GATT_TRACE_DEBUG("offset =0x%x len=%d", offset, to_send );
rt = gatt_send_write_msg(p_tcb,
p_clcb->clcb_idx,
@@ -402,12 +410,14 @@
** Returns void
**
*******************************************************************************/
-static void gatt_process_find_type_value_rsp (tGATT_CLCB *p_clcb, UINT16 len, UINT8 *p_data)
+void gatt_process_find_type_value_rsp (tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb, UINT16 len, UINT8 *p_data)
{
tGATT_DISC_RES result;
UINT8 *p = p_data;
- GATT_TRACE_DEBUG0("gatt_process_find_type_value_rsp ");
+ UNUSED(p_tcb);
+
+ GATT_TRACE_DEBUG("gatt_process_find_type_value_rsp ");
/* unexpected response */
if (p_clcb->operation != GATTC_OPTYPE_DISCOVERY || p_clcb->op_subtype != GATT_DISC_SRVC_BY_UUID)
return;
@@ -445,14 +455,18 @@
** Returns void
**
*******************************************************************************/
-static void gatt_process_read_info_rsp(tGATT_CLCB *p_clcb, UINT16 len, UINT8 *p_data)
+void gatt_process_read_info_rsp(tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb, UINT8 op_code,
+ UINT16 len, UINT8 *p_data)
{
tGATT_DISC_RES result;
UINT8 *p = p_data, uuid_len = 0, type;
+ UNUSED(p_tcb);
+ UNUSED(op_code);
+
if (len < GATT_INFO_RSP_MIN_LEN)
{
- GATT_TRACE_ERROR0("invalid Info Response PDU received, discard.");
+ GATT_TRACE_ERROR("invalid Info Response PDU received, discard.");
gatt_end_operation(p_clcb, GATT_INVALID_PDU, NULL);
return;
}
@@ -500,11 +514,15 @@
** Returns void.
**
*******************************************************************************/
-static void gatt_proc_disc_error_rsp(tGATT_CLCB *p_clcb, UINT8 opcode, UINT8 reason)
+void gatt_proc_disc_error_rsp(tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb, UINT8 opcode,
+ UINT16 handle, UINT8 reason)
{
tGATT_STATUS status = (tGATT_STATUS) reason;
- GATT_TRACE_DEBUG2("gatt_proc_disc_error_rsp reason: %02x cmd_code %04x", reason, opcode);
+ UNUSED(p_tcb);
+ UNUSED(handle);
+
+ GATT_TRACE_DEBUG("gatt_proc_disc_error_rsp reason: %02x cmd_code %04x", reason, opcode);
switch (opcode)
{
@@ -515,11 +533,11 @@
if (reason == GATT_NOT_FOUND)
{
status = GATT_SUCCESS;
- GATT_TRACE_DEBUG0("Discovery completed");
+ GATT_TRACE_DEBUG("Discovery completed");
}
break;
default:
- GATT_TRACE_ERROR1("Incorrect discovery opcode %04x", opcode);
+ GATT_TRACE_ERROR("Incorrect discovery opcode %04x", opcode);
break;
}
@@ -536,20 +554,24 @@
** Returns void
**
*******************************************************************************/
-static void gatt_process_error_rsp(tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb, UINT8 *p_data)
+void gatt_process_error_rsp(tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb, UINT8 op_code,
+ UINT16 len, UINT8 *p_data)
{
UINT8 opcode, reason, * p= p_data;
UINT16 handle;
tGATT_VALUE *p_attr = (tGATT_VALUE *)p_clcb->p_attr_buf;
- GATT_TRACE_DEBUG0("gatt_process_error_rsp ");
+ UNUSED(op_code);
+ UNUSED(len);
+
+ GATT_TRACE_DEBUG("gatt_process_error_rsp ");
STREAM_TO_UINT8(opcode, p);
STREAM_TO_UINT16(handle, p);
STREAM_TO_UINT8(reason, p);
if (p_clcb->operation == GATTC_OPTYPE_DISCOVERY)
{
- gatt_proc_disc_error_rsp(p_clcb, opcode, reason);
+ gatt_proc_disc_error_rsp(p_tcb, p_clcb, opcode, handle, reason);
}
else
{
@@ -591,11 +613,11 @@
tGATT_VALUE value = {0};
UINT8 *p= p_data;
- GATT_TRACE_ERROR2("value resp op_code = %s len = %d", gatt_dbg_op_name(op_code), len);
+ GATT_TRACE_ERROR("value resp op_code = %s len = %d", gatt_dbg_op_name(op_code), len);
if (len < GATT_PREP_WRITE_RSP_MIN_LEN)
{
- GATT_TRACE_ERROR0("illegal prepare write response length, discard");
+ GATT_TRACE_ERROR("illegal prepare write response length, discard");
gatt_end_operation(p_clcb, GATT_INVALID_PDU, &value);
return;
}
@@ -643,11 +665,11 @@
UINT8 *p= p_data, i,
event = (op_code == GATT_HANDLE_VALUE_NOTIF) ? GATTC_OPTYPE_NOTIFICATION : GATTC_OPTYPE_INDICATION;
- GATT_TRACE_DEBUG0("gatt_process_notification ");
+ GATT_TRACE_DEBUG("gatt_process_notification ");
if (len < GATT_NOTIFICATION_MIN_LEN)
{
- GATT_TRACE_ERROR0("illegal notification PDU length, discard");
+ GATT_TRACE_ERROR("illegal notification PDU length, discard");
return;
}
@@ -672,7 +694,7 @@
For now, just log the error reset the counter.
Later we need to disconnect the link unconditionally.
*/
- GATT_TRACE_ERROR1("gatt_process_notification rcv Ind. but ind_count=%d (will reset ind_count)", p_tcb->ind_count);
+ GATT_TRACE_ERROR("gatt_process_notification rcv Ind. but ind_count=%d (will reset ind_count)", p_tcb->ind_count);
}
p_tcb->ind_count = 0;
}
@@ -733,7 +755,7 @@
if (len < GATT_READ_BY_TYPE_RSP_MIN_LEN)
{
- GATT_TRACE_ERROR0("Illegal ReadByType/ReadByGroupType Response length, discard");
+ GATT_TRACE_ERROR("Illegal ReadByType/ReadByGroupType Response length, discard");
gatt_end_operation(p_clcb, GATT_INVALID_PDU, NULL);
return;
}
@@ -744,7 +766,7 @@
{
/* this is an error case that server's response containing a value length which is larger than MTU-2
or value_len > message total length -1 */
- GATT_TRACE_ERROR4("gatt_process_read_by_type_rsp: Discard response op_code=%d vale_len=%d > (MTU-2=%d or msg_len-1=%d)",
+ GATT_TRACE_ERROR("gatt_process_read_by_type_rsp: Discard response op_code=%d vale_len=%d > (MTU-2=%d or msg_len-1=%d)",
op_code, value_len, (p_tcb->payload_size - 2), (len-1));
gatt_end_operation(p_clcb, GATT_ERROR, NULL);
return;
@@ -790,7 +812,7 @@
record_value.group_value.e_handle = handle;
if (!gatt_parse_uuid_from_cmd(&record_value.group_value.service_type, value_len, &p))
{
- GATT_TRACE_ERROR0("discover all service response parsing failure");
+ GATT_TRACE_ERROR("discover all service response parsing failure");
break;
}
}
@@ -826,7 +848,7 @@
}
else
{
- GATT_TRACE_ERROR1("gatt_process_read_by_type_rsp INCL_SRVC failed with invalid data value_len=%d", value_len);
+ GATT_TRACE_ERROR("gatt_process_read_by_type_rsp INCL_SRVC failed with invalid data value_len=%d", value_len);
gatt_end_operation(p_clcb, GATT_INVALID_PDU, (void *)p);
return;
}
@@ -921,12 +943,14 @@
** Returns void
**
*******************************************************************************/
-static void gatt_process_read_rsp(tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb,
- UINT16 len, UINT8 *p_data)
+void gatt_process_read_rsp(tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb, UINT8 op_code,
+ UINT16 len, UINT8 *p_data)
{
UINT16 offset = p_clcb->counter;
UINT8 * p= p_data;
+ UNUSED(op_code);
+
if (p_clcb->operation == GATTC_OPTYPE_READ)
{
if (p_clcb->op_subtype != GATT_READ_BY_HANDLE)
@@ -956,7 +980,7 @@
if (len == (p_tcb->payload_size - 1) && /* full packet for read or read blob rsp */
len + offset < GATT_MAX_ATTR_LEN)
{
- GATT_TRACE_DEBUG3("full pkt issue read blob for remianing bytes old offset=%d len=%d new offset=%d",
+ GATT_TRACE_DEBUG("full pkt issue read blob for remianing bytes old offset=%d len=%d new offset=%d",
offset, len, p_clcb->counter);
gatt_act_read(p_clcb, p_clcb->counter);
}
@@ -967,7 +991,7 @@
}
else /* exception, should not happen */
{
- GATT_TRACE_ERROR2("attr offset = %d p_attr_buf = %d ", offset, p_clcb->p_attr_buf);
+ GATT_TRACE_ERROR("attr offset = %d p_attr_buf = %d ", offset, p_clcb->p_attr_buf);
gatt_end_operation(p_clcb, GATT_NO_RESOURCES, (void *)p_clcb->p_attr_buf);
}
}
@@ -1030,7 +1054,7 @@
if (len < GATT_MTU_RSP_MIN_LEN)
{
- GATT_TRACE_ERROR0("invalid MTU response PDU received, discard.");
+ GATT_TRACE_ERROR("invalid MTU response PDU received, discard.");
status = GATT_INVALID_PDU;
}
else
@@ -1078,15 +1102,17 @@
BOOLEAN sent = FALSE;
UINT8 rsp_code;
tGATT_CLCB *p_clcb = NULL;
+ tGATT_STATUS att_ret = GATT_SUCCESS;
while (!sent &&
p_tcb->pending_cl_req != p_tcb->next_slot_inq &&
p_cmd->to_send && p_cmd->p_cmd != NULL)
{
- sent = attp_send_msg_to_L2CAP(p_tcb, p_cmd->p_cmd);
+ att_ret = attp_send_msg_to_l2cap(p_tcb, p_cmd->p_cmd);
- if (sent)
+ if (att_ret == GATT_SUCCESS || att_ret == GATT_CONGESTED)
{
+ sent = TRUE;
p_cmd->to_send = FALSE;
p_cmd->p_cmd = NULL;
@@ -1100,15 +1126,17 @@
p_clcb = gatt_cmd_dequeue(p_tcb, &rsp_code);
/* if no ack needed, keep sending */
- sent = FALSE;
+ if (att_ret == GATT_SUCCESS)
+ sent = FALSE;
+
p_cmd = &p_tcb->cl_cmd_q[p_tcb->pending_cl_req];
/* send command complete callback here */
- gatt_end_operation(p_clcb, GATT_SUCCESS, NULL);
+ gatt_end_operation(p_clcb, att_ret, NULL);
}
}
else
{
- GATT_TRACE_ERROR0("gatt_cl_send_next_cmd_inq: L2CAP sent error");
+ GATT_TRACE_ERROR("gatt_cl_send_next_cmd_inq: L2CAP sent error");
memset(p_cmd, 0, sizeof(tGATT_CMD_Q));
p_tcb->pending_cl_req ++;
@@ -1144,7 +1172,7 @@
if (p_clcb == NULL || (rsp_code != op_code && op_code != GATT_RSP_ERROR))
{
- GATT_TRACE_WARNING2 ("ATT - Ignore wrong response. Receives (%02x) \
+ GATT_TRACE_WARNING ("ATT - Ignore wrong response. Receives (%02x) \
Request(%02x) Ignored", op_code, rsp_code);
return;
@@ -1159,7 +1187,7 @@
/* The message has to be smaller than the agreed MTU, len does not count op_code */
if (len >= p_tcb->payload_size)
{
- GATT_TRACE_ERROR2("invalid response/indicate pkt size: %d, PDU size: %d", len + 1, p_tcb->payload_size);
+ GATT_TRACE_ERROR("invalid response/indicate pkt size: %d, PDU size: %d", len + 1, p_tcb->payload_size);
if (op_code != GATT_HANDLE_VALUE_NOTIF &&
op_code != GATT_HANDLE_VALUE_IND)
gatt_end_operation(p_clcb, GATT_ERROR, NULL);
@@ -1169,7 +1197,7 @@
switch (op_code)
{
case GATT_RSP_ERROR:
- gatt_process_error_rsp(p_tcb, p_clcb, p_data);
+ gatt_process_error_rsp(p_tcb, p_clcb, op_code, len, p_data);
break;
case GATT_RSP_MTU: /* 2 bytes mtu */
@@ -1177,7 +1205,7 @@
break;
case GATT_RSP_FIND_INFO:
- gatt_process_read_info_rsp(p_clcb, len, p_data);
+ gatt_process_read_info_rsp(p_tcb, p_clcb, op_code, len, p_data);
break;
case GATT_RSP_READ_BY_TYPE:
@@ -1188,11 +1216,11 @@
case GATT_RSP_READ:
case GATT_RSP_READ_BLOB:
case GATT_RSP_READ_MULTI:
- gatt_process_read_rsp(p_tcb, p_clcb, len, p_data);
+ gatt_process_read_rsp(p_tcb, p_clcb, op_code, len, p_data);
break;
case GATT_RSP_FIND_TYPE_VALUE: /* disc service with UUID */
- gatt_process_find_type_value_rsp(p_clcb, len, p_data);
+ gatt_process_find_type_value_rsp(p_tcb, p_clcb, len, p_data);
break;
case GATT_RSP_WRITE:
@@ -1213,7 +1241,7 @@
break;
default:
- GATT_TRACE_ERROR1("Unknown opcode = %d", op_code);
+ GATT_TRACE_ERROR("Unknown opcode = %d", op_code);
break;
}
}
diff --git a/stack/gatt/gatt_db.c b/stack/gatt/gatt_db.c
index 268bc7d..b7887c9 100644
--- a/stack/gatt/gatt_db.c
+++ b/stack/gatt/gatt_db.c
@@ -27,6 +27,7 @@
#if BLE_INCLUDED == TRUE
#include "bt_trace.h"
+#include "bt_utils.h"
#include <stdio.h>
#include <string.h>
@@ -38,11 +39,11 @@
** L O C A L F U N C T I O N P R O T O T Y P E S *
*********************************************************************************/
static BOOLEAN allocate_svc_db_buf(tGATT_SVC_DB *p_db);
-static void *allocate_attr_in_db(tGATT_SVC_DB *p_db, UINT16 uuid16, UINT8 *p_uuid128, tGATT_PERM perm);
+static void *allocate_attr_in_db(tGATT_SVC_DB *p_db, tBT_UUID *p_uuid, tGATT_PERM perm);
static BOOLEAN deallocate_attr_in_db(tGATT_SVC_DB *p_db, void *p_attr);
static BOOLEAN copy_extra_byte_in_db(tGATT_SVC_DB *p_db, void **p_dst, UINT16 len);
-static void gatts_db_add_service_declaration(tGATT_SVC_DB *p_db, tBT_UUID service, BOOLEAN is_pri);
+static BOOLEAN gatts_db_add_service_declaration(tGATT_SVC_DB *p_db, tBT_UUID *p_service, BOOLEAN is_pri);
static tGATT_STATUS gatts_send_app_read_request(tGATT_TCB *p_tcb, UINT8 op_code,
UINT16 handle, UINT16 offset, UINT32 trans_id);
@@ -58,25 +59,23 @@
** Returns Status of te operation.
**
*******************************************************************************/
-BOOLEAN gatts_init_service_db (tGATT_SVC_DB *p_db, tBT_UUID service, BOOLEAN is_pri,
+BOOLEAN gatts_init_service_db (tGATT_SVC_DB *p_db, tBT_UUID *p_service, BOOLEAN is_pri,
UINT16 s_hdl, UINT16 num_handle)
{
if (!allocate_svc_db_buf(p_db))
{
- GATT_TRACE_ERROR0("gatts_init_service_db failed, no resources");
+ GATT_TRACE_ERROR("gatts_init_service_db failed, no resources");
return FALSE;
}
- GATT_TRACE_DEBUG0("gatts_init_service_db");
- GATT_TRACE_DEBUG2("s_hdl = %d num_handle = %d", s_hdl, num_handle );
+ GATT_TRACE_DEBUG("gatts_init_service_db");
+ GATT_TRACE_DEBUG("s_hdl = %d num_handle = %d", s_hdl, num_handle );
/* update service database information */
p_db->next_handle = s_hdl;
p_db->end_handle = s_hdl + num_handle;
- gatts_db_add_service_declaration(p_db, service, is_pri);
-
- return TRUE;
+ return gatts_db_add_service_declaration(p_db, p_service, is_pri);
}
/*******************************************************************************
@@ -95,7 +94,7 @@
{
if (!p_db || !p_db->p_attr_list)
{
- GATT_TRACE_ERROR0("service DB empty");
+ GATT_TRACE_ERROR("service DB empty");
return NULL;
}
@@ -115,6 +114,7 @@
**
*******************************************************************************/
static tGATT_STATUS gatts_check_attr_readability(tGATT_ATTR16 *p_attr,
+ UINT16 offset,
BOOLEAN read_long,
tGATT_SEC_FLAG sec_flag,
UINT8 key_size)
@@ -122,6 +122,7 @@
UINT16 min_key_size;
tGATT_PERM perm = p_attr->permission;
+ UNUSED(offset);
min_key_size = (((perm & GATT_ENCRYPT_KEY_SIZE_MASK) >> 12));
if (min_key_size != 0 )
{
@@ -130,32 +131,32 @@
if (!(perm & GATT_READ_ALLOWED))
{
- GATT_TRACE_ERROR0( "GATT_READ_NOT_PERMIT");
+ GATT_TRACE_ERROR( "GATT_READ_NOT_PERMIT");
return GATT_READ_NOT_PERMIT;
}
if ((perm & GATT_READ_AUTH_REQUIRED ) && !(sec_flag & GATT_SEC_FLAG_LKEY_UNAUTHED) &&
!(sec_flag & BTM_SEC_FLAG_ENCRYPTED))
{
- GATT_TRACE_ERROR0( "GATT_INSUF_AUTHENTICATION");
+ GATT_TRACE_ERROR( "GATT_INSUF_AUTHENTICATION");
return GATT_INSUF_AUTHENTICATION;
}
if ((perm & GATT_READ_MITM_REQUIRED ) && !(sec_flag & GATT_SEC_FLAG_LKEY_AUTHED))
{
- GATT_TRACE_ERROR0( "GATT_INSUF_AUTHENTICATION: MITM Required");
+ GATT_TRACE_ERROR( "GATT_INSUF_AUTHENTICATION: MITM Required");
return GATT_INSUF_AUTHENTICATION;
}
if ((perm & GATT_READ_ENCRYPTED_REQUIRED ) && !(sec_flag & GATT_SEC_FLAG_ENCRYPTED))
{
- GATT_TRACE_ERROR0( "GATT_INSUF_ENCRYPTION");
+ GATT_TRACE_ERROR( "GATT_INSUF_ENCRYPTION");
return GATT_INSUF_ENCRYPTION;
}
if ( (perm & GATT_READ_ENCRYPTED_REQUIRED) && (sec_flag & GATT_SEC_FLAG_ENCRYPTED) && (key_size < min_key_size))
{
- GATT_TRACE_ERROR0( "GATT_INSUF_KEY_SIZE");
+ GATT_TRACE_ERROR( "GATT_INSUF_KEY_SIZE");
return GATT_INSUF_KEY_SIZE;
}
@@ -172,7 +173,7 @@
case GATT_UUID_CHAR_CLIENT_CONFIG:
case GATT_UUID_CHAR_SRVR_CONFIG:
case GATT_UUID_CHAR_PRESENT_FORMAT:
- GATT_TRACE_ERROR0("GATT_NOT_LONG");
+ GATT_TRACE_ERROR("GATT_NOT_LONG");
return GATT_NOT_LONG;
default:
@@ -216,21 +217,21 @@
UINT16 read_long_uuid=0;
tGATT_ATTR16 *p_attr16 = (tGATT_ATTR16 *)p_attr;
- GATT_TRACE_DEBUG5("read_attr_value uuid=0x%04x perm=0x%0x sec_flag=0x%x offset=%d read_long=%d",
+ GATT_TRACE_DEBUG("read_attr_value uuid=0x%04x perm=0x%0x sec_flag=0x%x offset=%d read_long=%d",
p_attr16->uuid,
p_attr16->permission,
sec_flag,
offset,
read_long);
- status = gatts_check_attr_readability((tGATT_ATTR16 *)p_attr, read_long, sec_flag, key_size);
-
- if (p_attr16->uuid_type == GATT_ATTR_UUID_TYPE_16)
- uuid16 = p_attr16->uuid;
+ status = gatts_check_attr_readability((tGATT_ATTR16 *)p_attr, offset, read_long, sec_flag, key_size);
if (status != GATT_SUCCESS)
return status;
+ if (p_attr16->uuid_type == GATT_ATTR_UUID_TYPE_16)
+ uuid16 = p_attr16->uuid;
+
status = GATT_NO_RESOURCES;
if (read_long &&
@@ -261,6 +262,12 @@
{
UINT16_TO_STREAM(p, ((tGATT_ATTR16 *)(p_attr16->p_next))->uuid);
}
+ /* convert a 32bits UUID to 128 bits */
+ else if (((tGATT_ATTR32 *)(p_attr16->p_next))->uuid_type == GATT_ATTR_UUID_TYPE_32)
+ {
+ gatt_convert_uuid32_to_uuid128 (p, ((tGATT_ATTR32 *)(p_attr16->p_next))->uuid);
+ p += LEN_UUID_128;
+ }
else
{
ARRAY_TO_STREAM (p, ((tGATT_ATTR128 *)(p_attr16->p_next))->uuid, LEN_UUID_128);
@@ -271,13 +278,17 @@
}
else if (uuid16 == GATT_UUID_INCLUDE_SERVICE)
{
- len = (p_attr16->p_value->incl_handle.service_type.len == 2) ? 6 : 4;
+ if (p_attr16->p_value->incl_handle.service_type.len == LEN_UUID_16)
+ len = 6;
+ else
+ len = 4;
+
if (mtu >= len)
{
UINT16_TO_STREAM(p, p_attr16->p_value->incl_handle.s_handle);
UINT16_TO_STREAM(p, p_attr16->p_value->incl_handle.e_handle);
- if (p_attr16->p_value->incl_handle.service_type.len == 2)
+ if (p_attr16->p_value->incl_handle.service_type.len == LEN_UUID_16)
{
UINT16_TO_STREAM(p, p_attr16->p_value->incl_handle.service_type.uu.uuid16);
}
@@ -345,6 +356,11 @@
attr_uuid.len = LEN_UUID_16;
attr_uuid.uu.uuid16 = p_attr->uuid;
}
+ else if (p_attr->uuid_type == GATT_ATTR_UUID_TYPE_32)
+ {
+ attr_uuid.len = LEN_UUID_32;
+ attr_uuid.uu.uuid32 = ((tGATT_ATTR32 *)p_attr)->uuid;
+ }
else
{
attr_uuid.len = LEN_UUID_128;
@@ -382,7 +398,7 @@
}
else
{
- GATT_TRACE_ERROR0("format mismatch");
+ GATT_TRACE_ERROR("format mismatch");
status = GATT_NO_RESOURCES;
break;
}
@@ -407,7 +423,7 @@
BTM_SEC_LINK_KEY_KNOWN)
{
tACL_CONN *p;
- p = btm_bda_to_acl(p_tcb->peer_bda);
+ p = btm_bda_to_acl(p_tcb->peer_bda, BT_TRANSPORT_LE);
if ((p != NULL) && (p->link_role == BTM_ROLE_MASTER))
{
tBTM_BLE_SEC_ACT sec_act = BTM_BLE_SEC_ENCRYPT;
@@ -436,17 +452,18 @@
tBT_UUID service)
{
tGATT_ATTR16 *p_attr;
+ tBT_UUID uuid = {LEN_UUID_16, {GATT_UUID_INCLUDE_SERVICE}};
- GATT_TRACE_DEBUG3("gatts_add_included_service: s_hdl = 0x%04x e_hdl = 0x%04x uuid = 0x%04x",
+ GATT_TRACE_DEBUG("gatts_add_included_service: s_hdl = 0x%04x e_hdl = 0x%04x uuid = 0x%04x",
s_handle, e_handle, service.uu.uuid16);
if (service.len == 0 || s_handle == 0 || e_handle == 0)
{
- GATT_TRACE_ERROR0("gatts_add_included_service Illegal Params.");
+ GATT_TRACE_ERROR("gatts_add_included_service Illegal Params.");
return 0;
}
- if ((p_attr = (tGATT_ATTR16 *) allocate_attr_in_db(p_db, GATT_UUID_INCLUDE_SERVICE, NULL, GATT_PERM_READ)) != NULL)
+ if ((p_attr = (tGATT_ATTR16 *) allocate_attr_in_db(p_db, &uuid, GATT_PERM_READ)) != NULL)
{
if (copy_extra_byte_in_db(p_db, (void **)&p_attr->p_value, sizeof(tGATT_INCL_SRVC)))
{
@@ -485,11 +502,11 @@
tBT_UUID * p_char_uuid)
{
tGATT_ATTR16 *p_char_decl, *p_char_val;
- UINT16 uuid16 = (p_char_uuid->len == LEN_UUID_16) ? p_char_uuid->uu.uuid16 : 0;
+ tBT_UUID uuid = {LEN_UUID_16, {GATT_UUID_CHAR_DECLARE}};
- GATT_TRACE_DEBUG2("gatts_add_characteristic perm=0x%0x property=0x%0x", perm, property);
+ GATT_TRACE_DEBUG("gatts_add_characteristic perm=0x%0x property=0x%0x", perm, property);
- if ((p_char_decl = (tGATT_ATTR16 *)allocate_attr_in_db(p_db, GATT_UUID_CHAR_DECLARE, NULL, GATT_PERM_READ)) != NULL)
+ if ((p_char_decl = (tGATT_ATTR16 *)allocate_attr_in_db(p_db, &uuid, GATT_PERM_READ)) != NULL)
{
if (!copy_extra_byte_in_db(p_db, (void **)&p_char_decl->p_value, sizeof(tGATT_CHAR_DECL)))
{
@@ -497,7 +514,7 @@
return 0;
}
- p_char_val = (tGATT_ATTR16 *)allocate_attr_in_db(p_db, uuid16, p_char_uuid->uu.uuid128, perm);
+ p_char_val = (tGATT_ATTR16 *)allocate_attr_in_db(p_db, p_char_uuid, perm);
if (p_char_val == NULL)
{
@@ -578,18 +595,16 @@
tBT_UUID * p_descr_uuid)
{
tGATT_ATTR16 *p_char_dscptr;
- UINT16 uuid16 = (p_descr_uuid->len == LEN_UUID_16)? p_descr_uuid->uu.uuid16 : 0;
- GATT_TRACE_DEBUG1("gatts_add_char_descr uuid=0x%04x", p_descr_uuid->uu.uuid16);
+ GATT_TRACE_DEBUG("gatts_add_char_descr uuid=0x%04x", p_descr_uuid->uu.uuid16);
/* Add characteristic descriptors */
if ((p_char_dscptr = (tGATT_ATTR16 *)allocate_attr_in_db(p_db,
- uuid16,
- p_descr_uuid->uu.uuid128,
+ p_descr_uuid,
perm))
== NULL)
{
- GATT_TRACE_DEBUG0("gatts_add_char_descr Fail for adding char descriptors.");
+ GATT_TRACE_DEBUG("gatts_add_char_descr Fail for adding char descriptors.");
return 0;
}
else
@@ -695,7 +710,7 @@
{
if (p_attr->handle == handle)
{
- status = gatts_check_attr_readability (p_attr,
+ status = gatts_check_attr_readability (p_attr, 0,
is_long,
sec_flag, key_size);
break;
@@ -734,7 +749,7 @@
tGATT_PERM perm;
UINT16 min_key_size;
- GATT_TRACE_DEBUG6( "gatts_write_attr_perm_check op_code=0x%0x handle=0x%04x offset=%d len=%d sec_flag=0x%0x key_size=%d",
+ GATT_TRACE_DEBUG( "gatts_write_attr_perm_check op_code=0x%0x handle=0x%04x offset=%d len=%d sec_flag=0x%0x key_size=%d",
op_code, handle, offset, len, sec_flag, key_size);
if (p_db != NULL)
@@ -751,7 +766,7 @@
{
min_key_size +=6;
}
- GATT_TRACE_DEBUG2( "gatts_write_attr_perm_check p_attr->permission =0x%04x min_key_size==0x%04x",
+ GATT_TRACE_DEBUG( "gatts_write_attr_perm_check p_attr->permission =0x%04x min_key_size==0x%04x",
p_attr->permission,
min_key_size);
@@ -778,44 +793,45 @@
if ((op_code == GATT_SIGN_CMD_WRITE) && !(perm & GATT_WRITE_SIGNED_PERM))
{
status = GATT_WRITE_NOT_PERMIT;
- GATT_TRACE_DEBUG0( "gatts_write_attr_perm_check - sign cmd write not allowed");
+ GATT_TRACE_DEBUG( "gatts_write_attr_perm_check - sign cmd write not allowed");
}
if ((op_code == GATT_SIGN_CMD_WRITE) && (sec_flag & GATT_SEC_FLAG_ENCRYPTED))
{
status = GATT_INVALID_PDU;
- GATT_TRACE_ERROR0( "gatts_write_attr_perm_check - Error!! sign cmd write sent on a encypted link");
+ GATT_TRACE_ERROR( "gatts_write_attr_perm_check - Error!! sign cmd write sent on a encypted link");
}
else if (!(perm & GATT_WRITE_ALLOWED))
{
status = GATT_WRITE_NOT_PERMIT;
- GATT_TRACE_ERROR0( "gatts_write_attr_perm_check - GATT_WRITE_NOT_PERMIT");
+ GATT_TRACE_ERROR( "gatts_write_attr_perm_check - GATT_WRITE_NOT_PERMIT");
}
/* require authentication, but not been authenticated */
else if ((perm & GATT_WRITE_AUTH_REQUIRED ) && !(sec_flag & GATT_SEC_FLAG_LKEY_UNAUTHED))
{
status = GATT_INSUF_AUTHENTICATION;
- GATT_TRACE_ERROR0( "gatts_write_attr_perm_check - GATT_INSUF_AUTHENTICATION");
+ GATT_TRACE_ERROR( "gatts_write_attr_perm_check - GATT_INSUF_AUTHENTICATION");
}
else if ((perm & GATT_WRITE_MITM_REQUIRED ) && !(sec_flag & GATT_SEC_FLAG_LKEY_AUTHED))
{
status = GATT_INSUF_AUTHENTICATION;
- GATT_TRACE_ERROR0( "gatts_write_attr_perm_check - GATT_INSUF_AUTHENTICATION: MITM required");
+ GATT_TRACE_ERROR( "gatts_write_attr_perm_check - GATT_INSUF_AUTHENTICATION: MITM required");
}
else if ((perm & GATT_WRITE_ENCRYPTED_PERM ) && !(sec_flag & GATT_SEC_FLAG_ENCRYPTED))
{
status = GATT_INSUF_ENCRYPTION;
- GATT_TRACE_ERROR0( "gatts_write_attr_perm_check - GATT_INSUF_ENCRYPTION");
+ GATT_TRACE_ERROR( "gatts_write_attr_perm_check - GATT_INSUF_ENCRYPTION");
}
else if ((perm & GATT_WRITE_ENCRYPTED_PERM ) && (sec_flag & GATT_SEC_FLAG_ENCRYPTED) && (key_size < min_key_size))
{
status = GATT_INSUF_KEY_SIZE;
- GATT_TRACE_ERROR0( "gatts_write_attr_perm_check - GATT_INSUF_KEY_SIZE");
+ GATT_TRACE_ERROR( "gatts_write_attr_perm_check - GATT_INSUF_KEY_SIZE");
}
/* LE security mode 2 attribute */
- else if (perm & GATT_WRITE_SIGNED_PERM && op_code != GATT_SIGN_CMD_WRITE && !(sec_flag & GATT_SEC_FLAG_ENCRYPTED))
+ else if (perm & GATT_WRITE_SIGNED_PERM && op_code != GATT_SIGN_CMD_WRITE && !(sec_flag & GATT_SEC_FLAG_ENCRYPTED)
+ && (perm & GATT_WRITE_ALLOWED) == 0)
{
status = GATT_INSUF_AUTHENTICATION;
- GATT_TRACE_ERROR0( "gatts_write_attr_perm_check - GATT_INSUF_AUTHENTICATION: LE security mode 2 required");
+ GATT_TRACE_ERROR( "gatts_write_attr_perm_check - GATT_INSUF_AUTHENTICATION: LE security mode 2 required");
}
else /* writable: must be char value declaration or char descritpors */
{
@@ -842,7 +858,8 @@
break;
}
}
- else if (p_attr->uuid_type == GATT_ATTR_UUID_TYPE_128)
+ else if (p_attr->uuid_type == GATT_ATTR_UUID_TYPE_128 ||
+ p_attr->uuid_type == GATT_ATTR_UUID_TYPE_32)
{
status = GATT_SUCCESS;
}
@@ -865,12 +882,12 @@
if (op_code == GATT_REQ_PREPARE_WRITE && offset != 0) /* does not allow write blob */
{
status = GATT_NOT_LONG;
- GATT_TRACE_ERROR0( "gatts_write_attr_perm_check - GATT_NOT_LONG");
+ GATT_TRACE_ERROR( "gatts_write_attr_perm_check - GATT_NOT_LONG");
}
else if (len != max_size) /* data does not match the required format */
{
status = GATT_INVALID_ATTR_LEN;
- GATT_TRACE_ERROR0( "gatts_write_attr_perm_check - GATT_INVALID_PDU");
+ GATT_TRACE_ERROR( "gatts_write_attr_perm_check - GATT_INVALID_PDU");
}
else
{
@@ -897,28 +914,35 @@
**
**
** Parameter p_db : database pointer.
+** p_uuid: pointer to attribute UUID
** service : type of attribute to be added.
**
** Returns pointer to the newly allocated attribute.
**
*******************************************************************************/
-static void *allocate_attr_in_db(tGATT_SVC_DB *p_db, UINT16 uuid16, UINT8 *uuid128, tGATT_PERM perm)
+static void *allocate_attr_in_db(tGATT_SVC_DB *p_db, tBT_UUID *p_uuid, tGATT_PERM perm)
{
tGATT_ATTR16 *p_attr16 = NULL, *p_last;
+ tGATT_ATTR32 *p_attr32 = NULL;
tGATT_ATTR128 *p_attr128 = NULL;
- UINT16 len = (uuid16 == 0) ? sizeof(tGATT_ATTR128): sizeof(tGATT_ATTR16);
+ UINT16 len = sizeof(tGATT_ATTR128);
- GATT_TRACE_DEBUG1("allocate attr %d bytes ",len);
-
- if (uuid16 == GATT_ILLEGAL_UUID && uuid128 == NULL)
+ if (p_uuid == NULL)
{
- GATT_TRACE_ERROR0("illegal UUID");
+ GATT_TRACE_ERROR("illegal UUID");
return NULL;
}
+ if (p_uuid->len == LEN_UUID_16)
+ len = sizeof(tGATT_ATTR16);
+ else if (p_uuid->len == LEN_UUID_32)
+ len = sizeof(tGATT_ATTR32);
+
+ GATT_TRACE_DEBUG("allocate attr %d bytes ",len);
+
if (p_db->end_handle <= p_db->next_handle)
{
- GATT_TRACE_DEBUG2("handle space full. handle_max = %d next_handle = %d",
+ GATT_TRACE_DEBUG("handle space full. handle_max = %d next_handle = %d",
p_db->end_handle, p_db->next_handle);
return NULL;
}
@@ -927,25 +951,29 @@
{
if (!allocate_svc_db_buf(p_db))
{
- GATT_TRACE_ERROR0("allocate_attr_in_db failed, no resources");
+ GATT_TRACE_ERROR("allocate_attr_in_db failed, no resources");
return NULL;
}
}
-
+ memset(p_db->p_free_mem, 0, len);
p_attr16 = (tGATT_ATTR16 *) p_db->p_free_mem;
- p_attr128 = (tGATT_ATTR128 *) p_db->p_free_mem;
- memset(p_attr16, 0, len);
-
- if (uuid16 != GATT_ILLEGAL_UUID)
+ if (p_uuid->len == LEN_UUID_16 && p_uuid->uu.uuid16 != GATT_ILLEGAL_UUID)
{
p_attr16->uuid_type = GATT_ATTR_UUID_TYPE_16;
- p_attr16->uuid = uuid16;
+ p_attr16->uuid = p_uuid->uu.uuid16;
}
- else
+ else if (p_uuid->len == LEN_UUID_32)
{
+ p_attr32 = (tGATT_ATTR32 *) p_db->p_free_mem;
+ p_attr32->uuid_type = GATT_ATTR_UUID_TYPE_32;
+ p_attr32->uuid = p_uuid->uu.uuid32;
+ }
+ else if (p_uuid->len == LEN_UUID_128)
+ {
+ p_attr128 = (tGATT_ATTR128 *) p_db->p_free_mem;
p_attr128->uuid_type = GATT_ATTR_UUID_TYPE_128;
- memcpy(p_attr128->uuid, uuid128, LEN_UUID_128);
+ memcpy(p_attr128->uuid, p_uuid->uu.uuid128, LEN_UUID_128);
}
p_db->p_free_mem += len;
@@ -970,12 +998,17 @@
if (p_attr16->uuid_type == GATT_ATTR_UUID_TYPE_16)
{
- GATT_TRACE_DEBUG3("=====> handle = [0x%04x] uuid = [0x%04x] perm=0x%02x ",
+ GATT_TRACE_DEBUG("=====> handle = [0x%04x] uuid16 = [0x%04x] perm=0x%02x ",
p_attr16->handle, p_attr16->uuid, p_attr16->permission);
}
+ else if (p_attr16->uuid_type == GATT_ATTR_UUID_TYPE_32)
+ {
+ GATT_TRACE_DEBUG("=====> handle = [0x%04x] uuid32 = [0x%08x] perm=0x%02x ",
+ p_attr32->handle, p_attr32->uuid, p_attr32->permission);
+ }
else
{
- GATT_TRACE_DEBUG4("=====> handle = [0x%04x] uuid128 = [0x%02x:0x%02x] perm=0x%02x ",
+ GATT_TRACE_DEBUG("=====> handle = [0x%04x] uuid128 = [0x%02x:0x%02x] perm=0x%02x ",
p_attr128->handle, p_attr128->uuid[0],p_attr128->uuid[1],
p_attr128->permission);
}
@@ -1050,7 +1083,7 @@
{
if (!allocate_svc_db_buf(p_db))
{
- GATT_TRACE_ERROR0("copy_extra_byte_in_db failed, no resources");
+ GATT_TRACE_ERROR("copy_extra_byte_in_db failed, no resources");
return FALSE;
}
}
@@ -1077,11 +1110,11 @@
{
BT_HDR *p_buf;
- GATT_TRACE_DEBUG0("allocate_svc_db_buf allocating extra buffer");
+ GATT_TRACE_DEBUG("allocate_svc_db_buf allocating extra buffer");
if ((p_buf = (BT_HDR *)GKI_getpoolbuf(GATT_DB_POOL_ID)) == NULL)
{
- GATT_TRACE_ERROR0("allocate_svc_db_buf failed, no resources");
+ GATT_TRACE_ERROR("allocate_svc_db_buf failed, no resources");
return FALSE;
}
@@ -1151,21 +1184,44 @@
** Returns void
**
*******************************************************************************/
-static void gatts_db_add_service_declaration(tGATT_SVC_DB *p_db, tBT_UUID service, BOOLEAN is_pri)
+static BOOLEAN gatts_db_add_service_declaration(tGATT_SVC_DB *p_db, tBT_UUID *p_service, BOOLEAN is_pri)
{
tGATT_ATTR16 *p_attr;
- UINT16 service_type = is_pri ? GATT_UUID_PRI_SERVICE: GATT_UUID_SEC_SERVICE;
+ tBT_UUID uuid = {LEN_UUID_16, {0}};
+ BOOLEAN rt = FALSE;
- GATT_TRACE_DEBUG0( "add_service_declaration");
+ GATT_TRACE_DEBUG( "add_service_declaration");
+
+ if (is_pri)
+ uuid.uu.uuid16 = GATT_UUID_PRI_SERVICE;
+ else
+ uuid.uu.uuid16 = GATT_UUID_SEC_SERVICE;
/* add service declration record */
- if ((p_attr = (tGATT_ATTR16 *)(allocate_attr_in_db(p_db, service_type, NULL, GATT_PERM_READ))) != NULL)
+ if ((p_attr = (tGATT_ATTR16 *)(allocate_attr_in_db(p_db, &uuid, GATT_PERM_READ))) != NULL)
{
if (copy_extra_byte_in_db (p_db, (void **)&p_attr->p_value, sizeof(tBT_UUID)))
{
- memcpy (&p_attr->p_value->uuid, &service, sizeof(tBT_UUID));
+ if (p_service->len == LEN_UUID_16)
+ {
+ p_attr->p_value->uuid.len = LEN_UUID_16;
+ p_attr->p_value->uuid.uu.uuid16 = p_service->uu.uuid16;
+ }
+ else if (p_service->len == LEN_UUID_32)
+ {
+ p_attr->p_value->uuid.len = LEN_UUID_128;
+ gatt_convert_uuid32_to_uuid128(p_attr->p_value->uuid.uu.uuid128, p_service->uu.uuid32);
+ }
+ else
+ {
+ p_attr->p_value->uuid.len = LEN_UUID_128;
+ memcpy(p_attr->p_value->uuid.uu.uuid128, p_service->uu.uuid128, LEN_UUID_128);
+ }
+ rt = TRUE;
}
+
}
+ return rt;
}
#endif /* BLE_INCLUDED */
diff --git a/stack/gatt/gatt_int.h b/stack/gatt/gatt_int.h
index 1f81d63..663aa7d 100644
--- a/stack/gatt/gatt_int.h
+++ b/stack/gatt/gatt_int.h
@@ -21,8 +21,6 @@
#include "bt_target.h"
-#if BLE_INCLUDED == TRUE
-
#include "bt_trace.h"
#include "gatt_api.h"
@@ -169,6 +167,7 @@
*/
#define GATT_ATTR_UUID_TYPE_16 0
#define GATT_ATTR_UUID_TYPE_128 1
+#define GATT_ATTR_UUID_TYPE_32 2
typedef UINT8 tGATT_ATTR_UUID_TYPE;
/* 16 bits UUID Attribute in server database
@@ -184,6 +183,20 @@
UINT16 uuid;
} tGATT_ATTR16;
+/* 32 bits UUID Attribute in server database
+*/
+typedef struct
+{
+ void *p_next; /* pointer to the next attribute,
+ either tGATT_ATTR16, tGATT_ATTR32 or tGATT_ATTR128 */
+ tGATT_ATTR_VALUE *p_value;
+ tGATT_ATTR_UUID_TYPE uuid_type;
+ tGATT_PERM permission;
+ UINT16 handle;
+ UINT32 uuid;
+} tGATT_ATTR32;
+
+
/* 128 bits UUID Attribute in server database
*/
typedef struct
@@ -340,6 +353,7 @@
BUFFER_Q pending_enc_clcb; /* pending encryption channel q */
tGATT_SEC_ACTION sec_act;
BD_ADDR peer_bda;
+ tBT_TRANSPORT transport;
UINT32 trans_id;
UINT16 att_lcid; /* L2CAP channel ID for ATT */
@@ -400,6 +414,7 @@
BOOLEAN in_use;
TIMER_LIST_ENT rsp_timer_ent; /* peer response timer */
UINT8 retry_count;
+
} tGATT_CLCB;
typedef struct
@@ -454,6 +469,7 @@
BOOLEAN in_use;
BOOLEAN connected;
BD_ADDR bda;
+ tBT_TRANSPORT transport;
}tGATT_PROFILE_CLCB;
typedef struct
@@ -524,9 +540,9 @@
extern void gatt_init (void);
/* from gatt_main.c */
-extern BOOLEAN gatt_disconnect (BD_ADDR rem_bda);
-extern BOOLEAN gatt_act_connect (tGATT_REG *p_reg, BD_ADDR bd_addr);
-extern BOOLEAN gatt_connect (BD_ADDR rem_bda, tGATT_TCB *p_tcb);
+extern BOOLEAN gatt_disconnect (tGATT_TCB *p_tcb);
+extern BOOLEAN gatt_act_connect (tGATT_REG *p_reg, BD_ADDR bd_addr, tBT_TRANSPORT transport);
+extern BOOLEAN gatt_connect (BD_ADDR rem_bda, tGATT_TCB *p_tcb, tBT_TRANSPORT transport);
extern void gatt_data_process (tGATT_TCB *p_tcb, BT_HDR *p_buf);
extern void gatt_update_app_use_link_flag ( tGATT_IF gatt_if, tGATT_TCB *p_tcb, BOOLEAN is_add, BOOLEAN check_acl_link);
@@ -541,16 +557,15 @@
/* from gatt_attr.c */
extern UINT16 gatt_profile_find_conn_id_by_bd_addr(BD_ADDR bda);
-extern tGATT_PROFILE_CLCB *gatt_profile_find_clcb_by_bd_addr(BD_ADDR bda);
extern BOOLEAN gatt_profile_clcb_dealloc (UINT16 conn_id);
-extern tGATT_PROFILE_CLCB *gatt_profile_clcb_alloc (UINT16 conn_id, BD_ADDR bda);
+extern tGATT_PROFILE_CLCB *gatt_profile_clcb_alloc (UINT16 conn_id, BD_ADDR bda, tBT_TRANSPORT transport);
/* Functions provided by att_protocol.c */
extern tGATT_STATUS attp_send_cl_msg (tGATT_TCB *p_tcb, UINT16 clcb_idx, UINT8 op_code, tGATT_CL_MSG *p_msg);
extern BT_HDR *attp_build_sr_msg(tGATT_TCB *p_tcb, UINT8 op_code, tGATT_SR_MSG *p_msg);
extern tGATT_STATUS attp_send_sr_msg (tGATT_TCB *p_tcb, BT_HDR *p_msg);
-extern BOOLEAN attp_send_msg_to_L2CAP(tGATT_TCB *p_tcb, BT_HDR *p_toL2CAP);
+extern tGATT_STATUS attp_send_msg_to_l2cap(tGATT_TCB *p_tcb, BT_HDR *p_toL2CAP);
/* utility functions */
extern UINT8 * gatt_dbg_op_name(UINT8 op_code);
@@ -558,7 +573,8 @@
extern BOOLEAN gatt_parse_uuid_from_cmd(tBT_UUID *p_uuid, UINT16 len, UINT8 **p_data);
extern UINT8 gatt_build_uuid_to_stream(UINT8 **p_dst, tBT_UUID uuid);
extern BOOLEAN gatt_uuid_compare(tBT_UUID src, tBT_UUID tar);
-extern void gatt_sr_get_sec_info(BD_ADDR rem_bda, BOOLEAN le_conn, UINT8 *p_sec_flag, UINT8 *p_key_size);
+extern void gatt_convert_uuid32_to_uuid128(UINT8 uuid_128[LEN_UUID_128], UINT32 uuid_32);
+extern void gatt_sr_get_sec_info(BD_ADDR rem_bda, tBT_TRANSPORT transport, UINT8 *p_sec_flag, UINT8 *p_key_size);
extern void gatt_start_rsp_timer(UINT16 clcb_idx);
extern void gatt_start_conf_timer(tGATT_TCB *p_tcb);
extern void gatt_rsp_timeout(TIMER_LIST_ENT *p_tle);
@@ -573,13 +589,14 @@
extern BOOLEAN gatt_is_srv_chg_ind_pending (tGATT_TCB *p_tcb);
extern tGATTS_SRV_CHG *gatt_is_bda_in_the_srv_chg_clt_list (BD_ADDR bda);
-extern BOOLEAN gatt_find_the_connected_bda(UINT8 start_idx, BD_ADDR bda, UINT8 *p_found_idx);
+extern BOOLEAN gatt_find_the_connected_bda(UINT8 start_idx, BD_ADDR bda, UINT8 *p_found_idx, tBT_TRANSPORT *p_transport);
extern void gatt_set_srv_chg(void);
extern void gatt_delete_dev_from_srv_chg_clt_list(BD_ADDR bd_addr);
extern tGATT_VALUE *gatt_add_pending_ind(tGATT_TCB *p_tcb, tGATT_VALUE *p_ind);
extern tGATTS_PENDING_NEW_SRV_START *gatt_add_pending_new_srv_start( tGATTS_HNDL_RANGE *p_new_srv_start);
extern void gatt_free_srvc_db_buffer_app_id(tBT_UUID *p_app_id);
-extern void gatt_update_listen_mode(void);
+extern BOOLEAN gatt_update_listen_mode(void);
+extern BOOLEAN gatt_cl_send_next_cmd_inq(tGATT_TCB *p_tcb);
/* reserved handle list */
extern tGATT_HDL_LIST_ELEM *gatt_find_hdl_buffer_by_app_id (tBT_UUID *p_app_uuid128, tBT_UUID *p_svc_uuid, UINT16 svc_inst);
@@ -635,16 +652,16 @@
extern UINT8 gatt_num_apps_hold_link(tGATT_TCB *p_tcb);
extern UINT8 gatt_num_clcb_by_bd_addr(BD_ADDR bda);
extern tGATT_TCB * gatt_find_tcb_by_cid(UINT16 lcid);
-extern tGATT_TCB * gatt_allocate_tcb_by_bdaddr(BD_ADDR bda);
+extern tGATT_TCB * gatt_allocate_tcb_by_bdaddr(BD_ADDR bda, tBT_TRANSPORT transport);
extern tGATT_TCB * gatt_get_tcb_by_idx(UINT8 tcb_idx);
-extern tGATT_TCB * gatt_find_tcb_by_addr(BD_ADDR bda);
-
+extern tGATT_TCB * gatt_find_tcb_by_addr(BD_ADDR bda, tBT_TRANSPORT transport);
+extern BOOLEAN gatt_send_ble_burst_data (BD_ADDR remote_bda, BT_HDR *p_buf);
/* GATT client functions */
extern void gatt_dequeue_sr_cmd (tGATT_TCB *p_tcb);
extern UINT8 gatt_send_write_msg(tGATT_TCB *p_tcb, UINT16 clcb_idx, UINT8 op_code, UINT16 handle,
UINT16 len, UINT16 offset, UINT8 *p_data);
-extern void gatt_cleanup_upon_disc(BD_ADDR bda, UINT16 reason);
+extern void gatt_cleanup_upon_disc(BD_ADDR bda, UINT16 reason, tBT_TRANSPORT transport);
extern void gatt_end_operation(tGATT_CLCB *p_clcb, tGATT_STATUS status, void *p_data);
extern void gatt_act_discovery(tGATT_CLCB *p_clcb);
@@ -667,7 +684,7 @@
extern void gatt_set_sec_act(tGATT_TCB *p_tcb, tGATT_SEC_ACTION sec_act);
/* gatt_db.c */
-extern BOOLEAN gatts_init_service_db (tGATT_SVC_DB *p_db, tBT_UUID service, BOOLEAN is_pri, UINT16 s_hdl, UINT16 num_handle);
+extern BOOLEAN gatts_init_service_db (tGATT_SVC_DB *p_db, tBT_UUID *p_service, BOOLEAN is_pri, UINT16 s_hdl, UINT16 num_handle);
extern UINT16 gatts_add_included_service (tGATT_SVC_DB *p_db, UINT16 s_handle, UINT16 e_handle, tBT_UUID service);
extern UINT16 gatts_add_characteristic (tGATT_SVC_DB *p_db, tGATT_PERM perm, tGATT_CHAR_PROP property, tBT_UUID *p_char_uuid);
extern UINT16 gatts_add_char_descr (tGATT_SVC_DB *p_db, tGATT_PERM perm, tBT_UUID *p_dscp_uuid);
@@ -684,4 +701,4 @@
extern void gatt_reset_bgdev_list(void);
#endif
-#endif /* BLE_INCLUDED */
+
diff --git a/stack/gatt/gatt_main.c b/stack/gatt/gatt_main.c
index d5e017b..54951b2 100644
--- a/stack/gatt/gatt_main.c
+++ b/stack/gatt/gatt_main.c
@@ -44,8 +44,9 @@
/********************************************************************************/
/* L O C A L F U N C T I O N P R O T O T Y P E S */
/********************************************************************************/
-static void gatt_le_connect_cback (BD_ADDR bd_addr, BOOLEAN connected, UINT16 reason);
+static void gatt_le_connect_cback (BD_ADDR bd_addr, BOOLEAN connected, UINT16 reason, tBT_TRANSPORT transport);
static void gatt_le_data_ind (BD_ADDR bd_addr, BT_HDR *p_buf);
+static void gatt_le_cong_cback(BD_ADDR remote_bda, BOOLEAN congest);
static void gatt_l2cif_connect_ind_cback (BD_ADDR bd_addr, UINT16 l2cap_cid, UINT16 psm, UINT8 l2cap_id);
static void gatt_l2cif_connect_cfm_cback (UINT16 l2cap_cid, UINT16 result);
@@ -55,6 +56,7 @@
static void gatt_l2cif_disconnect_cfm_cback (UINT16 l2cap_cid, UINT16 result);
static void gatt_l2cif_data_ind_cback (UINT16 l2cap_cid, BT_HDR *p_msg);
static void gatt_send_conn_cback (tGATT_TCB *p_tcb);
+static void gatt_l2cif_congest_cback (UINT16 cid, BOOLEAN congested);
static const tL2CAP_APPL_INFO dyn_info =
{
@@ -67,7 +69,7 @@
gatt_l2cif_disconnect_cfm_cback,
NULL,
gatt_l2cif_data_ind_cback,
- NULL,
+ gatt_l2cif_congest_cback,
NULL
} ;
@@ -89,7 +91,7 @@
{
tL2CAP_FIXED_CHNL_REG fixed_reg;
- GATT_TRACE_DEBUG0("gatt_init()");
+ GATT_TRACE_DEBUG("gatt_init()");
memset (&gatt_cb, 0, sizeof(tGATT_CB));
@@ -110,6 +112,7 @@
fixed_reg.pL2CA_FixedConn_Cb = gatt_le_connect_cback;
fixed_reg.pL2CA_FixedData_Cb = gatt_le_data_ind;
+ fixed_reg.pL2CA_FixedCong_Cb = gatt_le_cong_cback; /* congestion callback */
fixed_reg.default_idle_tout = 0xffff; /* 0xffff default idle timeout */
L2CA_RegisterFixedChannel (L2CAP_ATT_CID, &fixed_reg);
@@ -117,7 +120,7 @@
/* Now, register with L2CAP for ATT PSM over BR/EDR */
if (!L2CA_Register (BT_PSM_ATT, (tL2CAP_APPL_INFO *) &dyn_info))
{
- GATT_TRACE_ERROR0 ("ATT Dynamic Registration failed");
+ GATT_TRACE_ERROR ("ATT Dynamic Registration failed");
}
BTM_SetSecurityLevel(TRUE, "", BTM_SEC_SERVICE_ATT, BTM_SEC_NONE, BT_PSM_ATT, 0, 0);
@@ -143,15 +146,14 @@
** Returns TRUE if connection is started, otherwise return FALSE.
**
*******************************************************************************/
-BOOLEAN gatt_connect (BD_ADDR rem_bda, tGATT_TCB *p_tcb)
+BOOLEAN gatt_connect (BD_ADDR rem_bda, tGATT_TCB *p_tcb, tBT_TRANSPORT transport)
{
BOOLEAN gatt_ret = FALSE;
if (gatt_get_ch_state(p_tcb) != GATT_CH_OPEN)
gatt_set_ch_state(p_tcb, GATT_CH_CONN);
- /* select the physical link for GATT connection */
- if (BTM_UseLeLink(rem_bda))
+ if (transport == BT_TRANSPORT_LE)
{
p_tcb->att_lcid = L2CAP_ATT_CID;
gatt_ret = L2CA_ConnectFixedChnl (L2CAP_ATT_CID, rem_bda);
@@ -171,18 +173,17 @@
**
** Description This function is called to disconnect to an ATT device.
**
-** Parameter rem_bda: remote device address to disconnect from.
+** Parameter p_tcb: pointer to the TCB to disconnect.
**
** Returns TRUE: if connection found and to be disconnected; otherwise
** return FALSE.
**
*******************************************************************************/
-BOOLEAN gatt_disconnect (BD_ADDR rem_bda)
+BOOLEAN gatt_disconnect (tGATT_TCB *p_tcb)
{
- tGATT_TCB *p_tcb = gatt_find_tcb_by_addr(rem_bda);
BOOLEAN ret = FALSE;
tGATT_CH_STATE ch_state;
- GATT_TRACE_DEBUG0 ("gatt_disconnect ");
+ GATT_TRACE_DEBUG ("gatt_disconnect ");
if (p_tcb != NULL)
{
@@ -194,12 +195,12 @@
if (ch_state == GATT_CH_OPEN)
{
/* only LCB exist between remote device and local */
- ret = L2CA_RemoveFixedChnl (L2CAP_ATT_CID, rem_bda);
+ ret = L2CA_RemoveFixedChnl (L2CAP_ATT_CID, p_tcb->peer_bda);
}
else
{
gatt_set_ch_state(p_tcb, GATT_CH_CLOSING);
- ret = L2CA_CancelBleConnectReq (rem_bda);
+ ret = L2CA_CancelBleConnectReq (p_tcb->peer_bda);
}
}
else
@@ -209,7 +210,7 @@
}
else
{
- GATT_TRACE_DEBUG0 ("gatt_disconnect already in closing state");
+ GATT_TRACE_DEBUG ("gatt_disconnect already in closing state");
}
}
@@ -232,7 +233,7 @@
if (p_tcb == NULL)
{
- GATT_TRACE_ERROR0("gatt_update_app_hold_link_status p_tcb=NULL");
+ GATT_TRACE_ERROR("gatt_update_app_hold_link_status p_tcb=NULL");
return;
}
@@ -263,7 +264,7 @@
}
}
- GATT_TRACE_DEBUG4("gatt_update_app_hold_link_status found=%d[1-found] idx=%d gatt_if=%d is_add=%d", found, i, gatt_if, is_add);
+ GATT_TRACE_DEBUG("gatt_update_app_hold_link_status found=%d[1-found] idx=%d gatt_if=%d is_add=%d", found, i, gatt_if, is_add);
}
@@ -279,20 +280,21 @@
*******************************************************************************/
void gatt_update_app_use_link_flag (tGATT_IF gatt_if, tGATT_TCB *p_tcb, BOOLEAN is_add, BOOLEAN check_acl_link)
{
- GATT_TRACE_DEBUG2("gatt_update_app_use_link_flag is_add=%d chk_link=%d",
+ GATT_TRACE_DEBUG("gatt_update_app_use_link_flag is_add=%d chk_link=%d",
is_add, check_acl_link);
gatt_update_app_hold_link_status(gatt_if, p_tcb, is_add);
if (check_acl_link &&
p_tcb &&
- (BTM_GetHCIConnHandle(p_tcb->peer_bda) != GATT_INVALID_ACL_HANDLE))
+ p_tcb->att_lcid == L2CAP_ATT_CID && /* only update link idle timer for fixed channel */
+ (BTM_GetHCIConnHandle(p_tcb->peer_bda, p_tcb->transport) != GATT_INVALID_ACL_HANDLE))
{
if (is_add)
{
- GATT_TRACE_DEBUG0("GATT disables link idle timer");
+ GATT_TRACE_DEBUG("GATT disables link idle timer");
/* acl link is connected disable the idle timeout */
- GATT_SetIdleTimeout(p_tcb->peer_bda, GATT_LINK_NO_IDLE_TIMEOUT);
+ GATT_SetIdleTimeout(p_tcb->peer_bda, GATT_LINK_NO_IDLE_TIMEOUT, p_tcb->transport);
}
else
{
@@ -300,8 +302,8 @@
{
/* acl link is connected but no application needs to use the link
so set the timeout value to GATT_LINK_IDLE_TIMEOUT_WHEN_NO_APP seconds */
- GATT_TRACE_DEBUG1("GATT starts link idle timer =%d sec", GATT_LINK_IDLE_TIMEOUT_WHEN_NO_APP);
- GATT_SetIdleTimeout(p_tcb->peer_bda, GATT_LINK_IDLE_TIMEOUT_WHEN_NO_APP);
+ GATT_TRACE_DEBUG("GATT starts link idle timer =%d sec", GATT_LINK_IDLE_TIMEOUT_WHEN_NO_APP);
+ GATT_SetIdleTimeout(p_tcb->peer_bda, GATT_LINK_IDLE_TIMEOUT_WHEN_NO_APP, p_tcb->transport);
}
}
@@ -317,25 +319,22 @@
** Returns void.
**
*******************************************************************************/
-BOOLEAN gatt_act_connect (tGATT_REG *p_reg, BD_ADDR bd_addr)
+BOOLEAN gatt_act_connect (tGATT_REG *p_reg, BD_ADDR bd_addr, tBT_TRANSPORT transport)
{
BOOLEAN ret = FALSE;
tGATT_TCB *p_tcb;
UINT8 st;
- GATT_TRACE_DEBUG0("gatt_act_connect");
-
- if ((p_tcb = gatt_find_tcb_by_addr(bd_addr)) != NULL)
+ if ((p_tcb = gatt_find_tcb_by_addr(bd_addr, transport)) != NULL)
{
ret = TRUE;
st = gatt_get_ch_state(p_tcb);
/* before link down, another app try to open a GATT connection */
if(st == GATT_CH_OPEN && gatt_num_apps_hold_link(p_tcb) == 0 &&
- /* only connection on fix channel when the l2cap channel is already open */
- p_tcb->att_lcid == L2CAP_ATT_CID )
+ transport == BT_TRANSPORT_LE )
{
- if (!gatt_connect(bd_addr, p_tcb))
+ if (!gatt_connect(bd_addr, p_tcb, transport))
ret = FALSE;
}
else if(st == GATT_CH_CLOSING)
@@ -346,11 +345,11 @@
}
else
{
- if ((p_tcb = gatt_allocate_tcb_by_bdaddr(bd_addr)) != NULL)
+ if ((p_tcb = gatt_allocate_tcb_by_bdaddr(bd_addr, transport)) != NULL)
{
- if (!gatt_connect(bd_addr, p_tcb))
+ if (!gatt_connect(bd_addr, p_tcb, transport))
{
- GATT_TRACE_ERROR0("gatt_connect failed");
+ GATT_TRACE_ERROR("gatt_connect failed");
memset(p_tcb, 0, sizeof(tGATT_TCB));
}
else
@@ -359,7 +358,7 @@
else
{
ret = 0;
- GATT_TRACE_ERROR1("Max TCB for gatt_if [%d] reached.", p_reg->gatt_if);
+ GATT_TRACE_ERROR("Max TCB for gatt_if [%d] reached.", p_reg->gatt_if);
}
}
@@ -380,19 +379,22 @@
** connected (conn = TRUE)/disconnected (conn = FALSE).
**
*******************************************************************************/
-static void gatt_le_connect_cback (BD_ADDR bd_addr, BOOLEAN connected, UINT16 reason)
+static void gatt_le_connect_cback (BD_ADDR bd_addr, BOOLEAN connected,
+ UINT16 reason, tBT_TRANSPORT transport)
{
- tGATT_TCB *p_tcb = gatt_find_tcb_by_addr(bd_addr);
-
+ tGATT_TCB *p_tcb = gatt_find_tcb_by_addr(bd_addr, transport);
BOOLEAN check_srv_chg = FALSE;
tGATTS_SRV_CHG *p_srv_chg_clt=NULL;
- GATT_TRACE_DEBUG3 ("GATT ATT protocol channel with BDA: %08x%04x is %s",
+ /* ignore all fixed channel connect/disconnect on BR/EDR link for GATT */
+ if (transport == BT_TRANSPORT_BR_EDR)
+ return;
+
+ GATT_TRACE_DEBUG ("GATT ATT protocol channel with BDA: %08x%04x is %s",
(bd_addr[0]<<24)+(bd_addr[1]<<16)+(bd_addr[2]<<8)+bd_addr[3],
(bd_addr[4]<<8)+bd_addr[5], (connected) ? "connected" : "disconnected");
-
if ((p_srv_chg_clt = gatt_is_bda_in_the_srv_chg_clt_list(bd_addr)) != NULL)
{
check_srv_chg = TRUE;
@@ -405,16 +407,9 @@
if (connected)
{
- GATT_TRACE_DEBUG1("connected is TRUE reason=%d",reason );
- /* BR/EDR lik, ignore this callback */
- if (reason == 0)
- return;
-
/* do we have a channel initiating a connection? */
if (p_tcb)
{
- if (check_srv_chg)
- gatt_chk_srv_chg (p_srv_chg_clt);
/* we are initiating connection */
if ( gatt_get_ch_state(p_tcb) == GATT_CH_CONN)
{
@@ -424,11 +419,14 @@
gatt_send_conn_cback(p_tcb);
}
+ if (check_srv_chg)
+ gatt_chk_srv_chg (p_srv_chg_clt);
}
/* this is incoming connection or background connection callback */
+
else
{
- if ((p_tcb = gatt_allocate_tcb_by_bdaddr(bd_addr)) != NULL)
+ if ((p_tcb = gatt_allocate_tcb_by_bdaddr(bd_addr, BT_TRANSPORT_LE)) != NULL)
{
p_tcb->att_lcid = L2CAP_ATT_CID;
@@ -444,14 +442,70 @@
}
else
{
- GATT_TRACE_ERROR0("CCB max out, no rsources");
+ GATT_TRACE_ERROR("CCB max out, no rsources");
}
}
}
else
{
- gatt_cleanup_upon_disc(bd_addr, reason);
- GATT_TRACE_DEBUG0 ("ATT disconnected");
+ gatt_cleanup_upon_disc(bd_addr, reason, transport);
+ GATT_TRACE_DEBUG ("ATT disconnected");
+ }
+}
+
+/*******************************************************************************
+**
+** Function gatt_channel_congestion
+**
+** Description This function is called to process the congestion callback
+** from lcb
+**
+** Returns void
+**
+*******************************************************************************/
+static void gatt_channel_congestion(tGATT_TCB *p_tcb, BOOLEAN congested)
+{
+ UINT8 i = 0;
+ tGATT_REG *p_reg=NULL;
+ UINT16 conn_id;
+
+ /* if uncongested, check to see if there is any more pending data */
+ if (p_tcb != NULL && congested == FALSE)
+ {
+ gatt_cl_send_next_cmd_inq(p_tcb);
+ }
+ /* notifying all applications for the connection up event */
+ for (i = 0, p_reg = gatt_cb.cl_rcb ; i < GATT_MAX_APPS; i++, p_reg++)
+ {
+ if (p_reg->in_use)
+ {
+ if (p_reg->app_cb.p_congestion_cb)
+ {
+ conn_id = GATT_CREATE_CONN_ID(p_tcb->tcb_idx, p_reg->gatt_if);
+ (*p_reg->app_cb.p_congestion_cb)(conn_id, congested);
+ }
+ }
+ }
+}
+
+/*******************************************************************************
+**
+** Function gatt_le_cong_cback
+**
+** Description This function is called when GATT fixed channel is congested
+** or uncongested.
+**
+** Returns void
+**
+*******************************************************************************/
+static void gatt_le_cong_cback(BD_ADDR remote_bda, BOOLEAN congested)
+{
+ tGATT_TCB *p_tcb = gatt_find_tcb_by_addr(remote_bda, BT_TRANSPORT_LE);
+
+ /* if uncongested, check to see if there is any more pending data */
+ if (p_tcb != NULL)
+ {
+ gatt_channel_congestion(p_tcb, congested);
}
}
@@ -475,7 +529,7 @@
tGATT_TCB *p_tcb;
/* Find CCB based on bd addr */
- if ((p_tcb = gatt_find_tcb_by_addr (bd_addr)) != NULL &&
+ if ((p_tcb = gatt_find_tcb_by_addr (bd_addr, BT_TRANSPORT_LE)) != NULL &&
gatt_get_ch_state(p_tcb) >= GATT_CH_OPEN)
{
gatt_data_process(p_tcb, p_buf);
@@ -486,7 +540,7 @@
if (p_tcb != NULL)
{
- GATT_TRACE_WARNING1 ("ATT - Ignored L2CAP data while in state: %d",
+ GATT_TRACE_WARNING ("ATT - Ignored L2CAP data while in state: %d",
gatt_get_ch_state(p_tcb));
}
}
@@ -508,15 +562,15 @@
/* do we already have a control channel for this peer? */
UINT8 result = L2CAP_CONN_OK;
tL2CAP_CFG_INFO cfg;
- tGATT_TCB *p_tcb = gatt_find_tcb_by_addr(bd_addr);
+ tGATT_TCB *p_tcb = gatt_find_tcb_by_addr(bd_addr, BT_TRANSPORT_BR_EDR);
UNUSED(psm);
- GATT_TRACE_ERROR1("Connection indication cid = %d", lcid);
+ GATT_TRACE_ERROR("Connection indication cid = %d", lcid);
/* new connection ? */
if (p_tcb == NULL)
{
/* allocate tcb */
- if ((p_tcb = gatt_allocate_tcb_by_bdaddr(bd_addr)) == NULL)
+ if ((p_tcb = gatt_allocate_tcb_by_bdaddr(bd_addr, BT_TRANSPORT_BR_EDR)) == NULL)
{
/* no tcb available, reject L2CAP connection */
result = L2CAP_CONN_NO_RESOURCES;
@@ -558,7 +612,7 @@
** Returns void
**
*******************************************************************************/
-void gatt_l2cif_connect_cfm_cback(UINT16 lcid, UINT16 result)
+static void gatt_l2cif_connect_cfm_cback(UINT16 lcid, UINT16 result)
{
tGATT_TCB *p_tcb;
tL2CAP_CFG_INFO cfg;
@@ -566,7 +620,7 @@
/* look up clcb for this channel */
if ((p_tcb = gatt_find_tcb_by_cid(lcid)) != NULL)
{
- GATT_TRACE_DEBUG3("gatt_l2c_connect_cfm_cback result: %d ch_state: %d, lcid:0x%x", result, gatt_get_ch_state(p_tcb), p_tcb->att_lcid);
+ GATT_TRACE_DEBUG("gatt_l2c_connect_cfm_cback result: %d ch_state: %d, lcid:0x%x", result, gatt_get_ch_state(p_tcb), p_tcb->att_lcid);
/* if in correct state */
if (gatt_get_ch_state(p_tcb) == GATT_CH_CONN)
@@ -586,7 +640,7 @@
/* else initiating connection failure */
else
{
- gatt_cleanup_upon_disc(p_tcb->peer_bda, GATT_CONN_L2C_FAILURE);
+ gatt_cleanup_upon_disc(p_tcb->peer_bda, result, GATT_TRANSPORT_BR_EDR);
}
}
else /* wrong state, disconnect it */
@@ -701,11 +755,8 @@
}
else
{
- if (btm_sec_is_a_bonded_dev(p_tcb->peer_bda) &&
- btm_sec_is_le_capable_dev(p_tcb->peer_bda))
- {
+ if (btm_sec_is_a_bonded_dev(p_tcb->peer_bda))
gatt_add_a_bonded_dev_for_srv_chg(p_tcb->peer_bda);
- }
}
/* send callback */
@@ -738,20 +789,17 @@
/* send L2CAP disconnect response */
L2CA_DisconnectRsp(lcid);
}
-
if (gatt_is_bda_in_the_srv_chg_clt_list(p_tcb->peer_bda) == NULL)
{
- if (btm_sec_is_a_bonded_dev(p_tcb->peer_bda) &&
- btm_sec_is_le_capable_dev(p_tcb->peer_bda))
+ if (btm_sec_is_a_bonded_dev(p_tcb->peer_bda))
gatt_add_a_bonded_dev_for_srv_chg(p_tcb->peer_bda);
}
-
/* if ACL link is still up, no reason is logged, l2cap is disconnect from peer */
- if ((reason = L2CA_GetDisconnectReason(p_tcb->peer_bda)) == 0)
+ if ((reason = L2CA_GetDisconnectReason(p_tcb->peer_bda, p_tcb->transport)) == 0)
reason = GATT_CONN_TERMINATE_PEER_USER;
/* send disconnect callback */
- gatt_cleanup_upon_disc(p_tcb->peer_bda, reason);
+ gatt_cleanup_upon_disc(p_tcb->peer_bda, reason, GATT_TRANSPORT_BR_EDR);
}
}
@@ -765,7 +813,7 @@
** Returns void
**
*******************************************************************************/
-void gatt_l2cif_disconnect_cfm_cback(UINT16 lcid, UINT16 result)
+static void gatt_l2cif_disconnect_cfm_cback(UINT16 lcid, UINT16 result)
{
tGATT_TCB *p_tcb;
UINT16 reason;
@@ -777,17 +825,16 @@
/* If the device is not in the service changed client list, add it... */
if (gatt_is_bda_in_the_srv_chg_clt_list(p_tcb->peer_bda) == NULL)
{
- if (btm_sec_is_a_bonded_dev(p_tcb->peer_bda) &&
- btm_sec_is_le_capable_dev(p_tcb->peer_bda))
+ if (btm_sec_is_a_bonded_dev(p_tcb->peer_bda))
gatt_add_a_bonded_dev_for_srv_chg(p_tcb->peer_bda);
}
/* send disconnect callback */
/* if ACL link is still up, no reason is logged, l2cap is disconnect from peer */
- if ((reason = L2CA_GetDisconnectReason(p_tcb->peer_bda)) == 0)
+ if ((reason = L2CA_GetDisconnectReason(p_tcb->peer_bda, p_tcb->transport)) == 0)
reason = GATT_CONN_TERMINATE_LOCAL_HOST;
- gatt_cleanup_upon_disc(p_tcb->peer_bda, reason);
+ gatt_cleanup_upon_disc(p_tcb->peer_bda, reason, GATT_TRANSPORT_BR_EDR);
}
}
@@ -801,7 +848,7 @@
** Returns void
**
*******************************************************************************/
-void gatt_l2cif_data_ind_cback(UINT16 lcid, BT_HDR *p_buf)
+static void gatt_l2cif_data_ind_cback(UINT16 lcid, BT_HDR *p_buf)
{
tGATT_TCB *p_tcb;
@@ -818,6 +865,25 @@
/*******************************************************************************
**
+** Function gatt_l2cif_congest_cback
+**
+** Description L2CAP congestion callback
+**
+** Returns void
+**
+*******************************************************************************/
+static void gatt_l2cif_congest_cback (UINT16 lcid, BOOLEAN congested)
+{
+ tGATT_TCB *p_tcb = gatt_find_tcb_by_cid(lcid);
+
+ if (p_tcb != NULL)
+ {
+ gatt_channel_congestion(p_tcb, congested);
+ }
+}
+
+/*******************************************************************************
+**
** Function gatt_send_conn_cback
**
** Description Callback used to notify layer above about a connection.
@@ -846,16 +912,17 @@
if (p_reg->app_cb.p_conn_cb)
{
conn_id = GATT_CREATE_CONN_ID(p_tcb->tcb_idx, p_reg->gatt_if);
- (*p_reg->app_cb.p_conn_cb)(p_reg->gatt_if, p_tcb->peer_bda, conn_id, TRUE, 0);
+ (*p_reg->app_cb.p_conn_cb)(p_reg->gatt_if, p_tcb->peer_bda, conn_id,
+ TRUE, 0, p_tcb->transport);
}
}
}
- if (gatt_num_apps_hold_link(p_tcb))
+ if (gatt_num_apps_hold_link(p_tcb) && p_tcb->att_lcid == L2CAP_ATT_CID )
{
/* disable idle timeout if one or more clients are holding the link disable the idle timer */
- GATT_SetIdleTimeout(p_tcb->peer_bda, GATT_LINK_NO_IDLE_TIMEOUT);
+ GATT_SetIdleTimeout(p_tcb->peer_bda, GATT_LINK_NO_IDLE_TIMEOUT, p_tcb->transport);
}
}
@@ -894,7 +961,6 @@
if (op_code == GATT_SIGN_CMD_WRITE)
{
gatt_verify_signature(p_tcb, p_buf);
- return;
}
else
{
@@ -907,12 +973,12 @@
}
else
{
- GATT_TRACE_ERROR1 ("ATT - Rcvd L2CAP data, unknown cmd: 0x%x", op_code);
+ GATT_TRACE_ERROR ("ATT - Rcvd L2CAP data, unknown cmd: 0x%x", op_code);
}
}
else
{
- GATT_TRACE_ERROR0 ("invalid data length, ignore");
+ GATT_TRACE_ERROR ("invalid data length, ignore");
}
GKI_freebuf (p_buf);
@@ -961,7 +1027,7 @@
UINT8 *p = handle_range;
UINT16 conn_id;
- GATT_TRACE_DEBUG0("gatt_send_srv_chg_ind");
+ GATT_TRACE_DEBUG("gatt_send_srv_chg_ind");
if (gatt_cb.handle_of_h_r)
{
@@ -976,7 +1042,7 @@
}
else
{
- GATT_TRACE_ERROR2("Unable to find conn_id for %08x%04x ",
+ GATT_TRACE_ERROR("Unable to find conn_id for %08x%04x ",
(peer_bda[0]<<24)+(peer_bda[1]<<16)+(peer_bda[2]<<8)+peer_bda[3],
(peer_bda[4]<<8)+peer_bda[5] );
}
@@ -995,7 +1061,7 @@
*******************************************************************************/
void gatt_chk_srv_chg(tGATTS_SRV_CHG *p_srv_chg_clt)
{
- GATT_TRACE_DEBUG1("gatt_chk_srv_chg srv_changed=%d", p_srv_chg_clt->srv_changed );
+ GATT_TRACE_DEBUG("gatt_chk_srv_chg srv_changed=%d", p_srv_chg_clt->srv_changed );
if (p_srv_chg_clt->srv_changed)
{
@@ -1021,14 +1087,14 @@
UINT8 num_clients,i;
tGATTS_SRV_CHG srv_chg_clt;
- GATT_TRACE_DEBUG0("gatt_init_srv_chg");
+ GATT_TRACE_DEBUG("gatt_init_srv_chg");
if (gatt_cb.cb_info.p_srv_chg_callback)
{
status = (*gatt_cb.cb_info.p_srv_chg_callback)(GATTS_SRV_CHG_CMD_READ_NUM_CLENTS, NULL, &rsp);
if (status && rsp.num_clients)
{
- GATT_TRACE_DEBUG1("gatt_init_srv_chg num_srv_chg_clt_clients=%d", rsp.num_clients);
+ GATT_TRACE_DEBUG("gatt_init_srv_chg num_srv_chg_clt_clients=%d", rsp.num_clients);
num_clients = rsp.num_clients;
i = 1; /* use one based index */
while ((i <= num_clients) && status)
@@ -1039,7 +1105,7 @@
memcpy(&srv_chg_clt, &rsp.srv_chg ,sizeof(tGATTS_SRV_CHG));
if (gatt_add_srv_chg_clt(&srv_chg_clt) == NULL)
{
- GATT_TRACE_ERROR0("Unable to add a service change client");
+ GATT_TRACE_ERROR("Unable to add a service change client");
status = FALSE;
}
}
@@ -1049,7 +1115,7 @@
}
else
{
- GATT_TRACE_DEBUG0("gatt_init_srv_chg callback not registered yet");
+ GATT_TRACE_DEBUG("gatt_init_srv_chg callback not registered yet");
}
}
@@ -1068,14 +1134,15 @@
BD_ADDR bda;
BOOLEAN srv_chg_ind_pending=FALSE;
tGATT_TCB *p_tcb;
+ tBT_TRANSPORT transport;
- GATT_TRACE_DEBUG0 ("gatt_proc_srv_chg");
+ GATT_TRACE_DEBUG ("gatt_proc_srv_chg");
if (gatt_cb.cb_info.p_srv_chg_callback && gatt_cb.handle_of_h_r)
{
gatt_set_srv_chg();
start_idx =0;
- while (gatt_find_the_connected_bda(start_idx, bda, &found_idx))
+ while (gatt_find_the_connected_bda(start_idx, bda, &found_idx, &transport))
{
p_tcb = &gatt_cb.tcb[found_idx];;
srv_chg_ind_pending = gatt_is_srv_chg_ind_pending(p_tcb);
@@ -1086,7 +1153,7 @@
}
else
{
- GATT_TRACE_DEBUG0 ("discard srv chg - already has one in the queue");
+ GATT_TRACE_DEBUG ("discard srv chg - already has one in the queue");
}
start_idx = ++found_idx;
}
@@ -1106,7 +1173,7 @@
{
if (p_tcb)
{
- GATT_TRACE_DEBUG2 ("gatt_set_ch_state: old=%d new=%d", p_tcb->ch_state, ch_state);
+ GATT_TRACE_DEBUG ("gatt_set_ch_state: old=%d new=%d", p_tcb->ch_state, ch_state);
p_tcb->ch_state = ch_state;
}
}
@@ -1125,7 +1192,7 @@
tGATT_CH_STATE ch_state = GATT_CH_CLOSE;
if (p_tcb)
{
- GATT_TRACE_DEBUG1 ("gatt_get_ch_state: ch_state=%d", p_tcb->ch_state);
+ GATT_TRACE_DEBUG ("gatt_get_ch_state: ch_state=%d", p_tcb->ch_state);
ch_state = p_tcb->ch_state;
}
return ch_state;
diff --git a/stack/gatt/gatt_sr.c b/stack/gatt/gatt_sr.c
old mode 100644
new mode 100755
index c006dd2..2199794
--- a/stack/gatt/gatt_sr.c
+++ b/stack/gatt/gatt_sr.c
@@ -98,10 +98,10 @@
void gatt_dequeue_sr_cmd (tGATT_TCB *p_tcb)
{
/* Double check in case any buffers are queued */
- GATT_TRACE_DEBUG0("gatt_dequeue_sr_cmd" );
+ GATT_TRACE_DEBUG("gatt_dequeue_sr_cmd" );
if (p_tcb->sr_cmd.p_rsp_msg)
{
- GATT_TRACE_ERROR1("free p_tcb->sr_cmd.p_rsp_msg = %d", p_tcb->sr_cmd.p_rsp_msg);
+ GATT_TRACE_ERROR("free p_tcb->sr_cmd.p_rsp_msg = %d", p_tcb->sr_cmd.p_rsp_msg);
GKI_freebuf (p_tcb->sr_cmd.p_rsp_msg);
}
@@ -129,7 +129,7 @@
UINT8 *p;
BOOLEAN is_overflow = FALSE;
- GATT_TRACE_DEBUG2 ("process_read_multi_rsp status=%d mtu=%d", status, mtu);
+ GATT_TRACE_DEBUG ("process_read_multi_rsp status=%d mtu=%d", status, mtu);
if (p_buf == NULL)
{
@@ -144,7 +144,7 @@
p_cmd->status = status;
if (status == GATT_SUCCESS)
{
- GATT_TRACE_DEBUG2 ("Multi read count=%d num_hdls=%d",
+ GATT_TRACE_DEBUG ("Multi read count=%d num_hdls=%d",
p_cmd->multi_rsp_q.count, p_cmd->multi_req.num_handles);
/* Wait till we get all the responses */
if (p_cmd->multi_rsp_q.count == p_cmd->multi_req.num_handles)
@@ -186,7 +186,7 @@
/* just send the partial response for the overflow case */
len = p_rsp->attr_value.len - (total_len - mtu);
is_overflow = TRUE;
- GATT_TRACE_DEBUG2 ("multi read overflow available len=%d val_len=%d", len, p_rsp->attr_value.len );
+ GATT_TRACE_DEBUG ("multi read overflow available len=%d val_len=%d", len, p_rsp->attr_value.len );
}
else
{
@@ -222,10 +222,10 @@
/* Sanity check on the buffer length */
if (p_buf->len == 0)
{
- GATT_TRACE_ERROR0("process_read_multi_rsp - nothing found!!");
+ GATT_TRACE_ERROR("process_read_multi_rsp - nothing found!!");
p_cmd->status = GATT_NOT_FOUND;
GKI_freebuf (p_buf);
- GATT_TRACE_DEBUG0(" GKI_freebuf (p_buf)");
+ GATT_TRACE_DEBUG(" GKI_freebuf (p_buf)");
}
else if (p_cmd->p_rsp_msg != NULL)
{
@@ -265,7 +265,7 @@
tGATT_STATUS ret_code = GATT_SUCCESS;
UNUSED(trans_id);
- GATT_TRACE_DEBUG1("gatt_sr_process_app_rsp gatt_if=%d", gatt_if);
+ GATT_TRACE_DEBUG("gatt_sr_process_app_rsp gatt_if=%d", gatt_if);
gatt_sr_update_cback_cnt(p_tcb, gatt_if, FALSE, FALSE);
@@ -294,7 +294,7 @@
}
else
{
- GATT_TRACE_ERROR0("Exception!!! already has respond message");
+ GATT_TRACE_ERROR("Exception!!! already has respond message");
}
}
}
@@ -313,7 +313,7 @@
gatt_dequeue_sr_cmd(p_tcb);
}
- GATT_TRACE_DEBUG1("gatt_sr_process_app_rsp ret_code=%d", ret_code);
+ GATT_TRACE_DEBUG("gatt_sr_process_app_rsp ret_code=%d", ret_code);
return ret_code;
}
@@ -328,7 +328,7 @@
** Returns void
**
*******************************************************************************/
-static void gatt_process_exec_write_req (tGATT_TCB *p_tcb, UINT8 op_code, UINT8 *p_data)
+void gatt_process_exec_write_req (tGATT_TCB *p_tcb, UINT8 op_code, UINT16 len, UINT8 *p_data)
{
UINT8 *p = p_data, flag, i = 0;
UINT32 trans_id = 0;
@@ -336,11 +336,13 @@
tGATT_IF gatt_if;
UINT16 conn_id;
+ UNUSED(len);
+
#if GATT_CONFORMANCE_TESTING == TRUE
if (gatt_cb.enable_err_rsp && gatt_cb.req_op_code == op_code)
{
- GATT_TRACE_DEBUG2("conf test forced err rsp for %s error status=%d",
- __FUNCTION__,gatt_cb.err_status);
+ GATT_TRACE_DEBUG("Conformance tst: forced err rspv for Execute Write: error status=%d",
+ gatt_cb.err_status);
gatt_send_error_rsp (p_tcb, gatt_cb.err_status, gatt_cb.req_op_code, gatt_cb.handle, FALSE);
@@ -376,13 +378,8 @@
}
else /* nothing needs to be executed , send response now */
{
- GATT_TRACE_ERROR0("gatt_process_exec_write_req: no prepare write pending");
-
- if ((p_buf = attp_build_sr_msg(p_tcb, GATT_RSP_EXEC_WRITE, NULL)) != NULL)
- {
- attp_send_sr_msg (p_tcb, p_buf);
- }
-
+ GATT_TRACE_ERROR("gatt_process_exec_write_req: no prepare write pending");
+ gatt_send_error_rsp(p_tcb, GATT_ERROR, GATT_REQ_EXEC_WRITE, 0, FALSE);
}
}
@@ -405,18 +402,18 @@
UINT8 sec_flag, key_size;
tGATTS_RSP *p_msg;
- GATT_TRACE_DEBUG0("gatt_process_read_multi_req" );
+ GATT_TRACE_DEBUG("gatt_process_read_multi_req" );
p_tcb->sr_cmd.multi_req.num_handles = 0;
gatt_sr_get_sec_info(p_tcb->peer_bda,
- (BOOLEAN)(p_tcb->att_lcid == L2CAP_ATT_CID),
+ p_tcb->transport,
&sec_flag,
&key_size);
#if GATT_CONFORMANCE_TESTING == TRUE
if (gatt_cb.enable_err_rsp && gatt_cb.req_op_code == op_code)
{
- GATT_TRACE_DEBUG1("Conformance tst: forced err rspvofr ReadMultiple: error status=%d", gatt_cb.err_status);
+ GATT_TRACE_DEBUG("Conformance tst: forced err rspvofr ReadMultiple: error status=%d", gatt_cb.err_status);
STREAM_TO_UINT16(handle, p);
@@ -442,7 +439,7 @@
key_size))
!= GATT_SUCCESS)
{
- GATT_TRACE_DEBUG1("read permission denied : 0x%02x", err);
+ GATT_TRACE_DEBUG("read permission denied : 0x%02x", err);
break;
}
}
@@ -457,7 +454,7 @@
if (ll != 0)
{
- GATT_TRACE_ERROR0("max attribute handle reached in ReadMultiple Request.");
+ GATT_TRACE_ERROR("max attribute handle reached in ReadMultiple Request.");
}
if (p_tcb->sr_cmd.multi_req.num_handles == 0)
@@ -527,7 +524,7 @@
*******************************************************************************/
static tGATT_STATUS gatt_build_primary_service_rsp (BT_HDR *p_msg, tGATT_TCB *p_tcb,
UINT8 op_code, UINT16 s_hdl,
- UINT16 e_hdl, tBT_UUID value)
+ UINT16 e_hdl, UINT8 *p_data, tBT_UUID value)
{
tGATT_STATUS status = GATT_NOT_FOUND;
UINT8 handle_len =4, *p ;
@@ -536,6 +533,8 @@
tGATT_SRV_LIST_ELEM *p_srv=NULL;
tBT_UUID *p_uuid;
+ UNUSED(p_data);
+
p = (UINT8 *)(p_msg + 1) + L2CAP_MIN_OFFSET;
p_srv = p_list->p_first;
@@ -579,7 +578,7 @@
if (p_list->p_last_primary == p_srv &&
p_list->p_last_primary == p_list->p_last)
{
- GATT_TRACE_DEBUG0("Use 0xFFFF for the last primary attribute");
+ GATT_TRACE_DEBUG("Use 0xFFFF for the last primary attribute");
UINT16_TO_STREAM(p, 0xFFFF); /* see GATT ERRATA 4065, 4063, ATT ERRATA 4062 */
}
else
@@ -643,7 +642,7 @@
if (p_attr->handle >= s_hdl)
{
if (p_msg->offset == 0)
- p_msg->offset = (p_attr->uuid_type == GATT_ATTR_UUID_TYPE_128) ? GATT_INFO_TYPE_PAIR_128 : GATT_INFO_TYPE_PAIR_16;
+ p_msg->offset = (p_attr->uuid_type == GATT_ATTR_UUID_TYPE_16) ? GATT_INFO_TYPE_PAIR_16 : GATT_INFO_TYPE_PAIR_128;
if (len >= info_pair_len[p_msg->offset - 1])
{
@@ -652,15 +651,20 @@
UINT16_TO_STREAM(p, p_attr->handle);
UINT16_TO_STREAM(p, p_attr->uuid);
}
- else if (p_msg->offset == GATT_INFO_TYPE_PAIR_128 &&
- p_attr->uuid_type == GATT_ATTR_UUID_TYPE_128 )
+ else if (p_msg->offset == GATT_INFO_TYPE_PAIR_128 && p_attr->uuid_type == GATT_ATTR_UUID_TYPE_128 )
{
UINT16_TO_STREAM(p, p_attr->handle);
ARRAY_TO_STREAM (p, ((tGATT_ATTR128 *) p_attr)->uuid, LEN_UUID_128);
}
+ else if (p_msg->offset == GATT_INFO_TYPE_PAIR_128 && p_attr->uuid_type == GATT_ATTR_UUID_TYPE_32)
+ {
+ UINT16_TO_STREAM(p, p_attr->handle);
+ gatt_convert_uuid32_to_uuid128(p, ((tGATT_ATTR32 *) p_attr)->uuid);
+ p += LEN_UUID_128;
+ }
else
{
- GATT_TRACE_ERROR0("format mismatch");
+ GATT_TRACE_ERROR("format mismatch");
status = GATT_NO_RESOURCES;
break;
/* format mismatch */
@@ -725,7 +729,7 @@
if (gatt_parse_uuid_from_cmd (p_uuid_filter, uuid_len, &p) == FALSE ||
p_uuid_filter->len == 0)
{
- GATT_TRACE_DEBUG0("UUID filter does not exsit");
+ GATT_TRACE_DEBUG("UUID filter does not exsit");
reason = GATT_INVALID_PDU;
}
else
@@ -764,6 +768,7 @@
BT_HDR *p_msg = NULL;
UINT16 msg_len = (UINT16)(sizeof(BT_HDR) + p_tcb->payload_size + L2CAP_MIN_OFFSET);
+ memset (&value, 0, sizeof(tBT_UUID));
reason = gatts_validate_packet_format(op_code, &len, &p_data, &uuid, &s_hdl, &e_hdl);
if (reason == GATT_SUCCESS)
@@ -780,13 +785,13 @@
{
if ((p_msg = (BT_HDR *)GKI_getbuf(msg_len)) == NULL)
{
- GATT_TRACE_ERROR0("gatts_process_primary_service_req failed. no resources.");
+ GATT_TRACE_ERROR("gatts_process_primary_service_req failed. no resources.");
reason = GATT_NO_RESOURCES;
}
else
{
memset(p_msg, 0, msg_len);
- reason = gatt_build_primary_service_rsp (p_msg, p_tcb, op_code, s_hdl, e_hdl, value);
+ reason = gatt_build_primary_service_rsp (p_msg, p_tcb, op_code, s_hdl, e_hdl, p_data, value);
}
}
}
@@ -795,13 +800,13 @@
if (op_code == GATT_REQ_READ_BY_GRP_TYPE)
{
reason = GATT_UNSUPPORT_GRP_TYPE;
- GATT_TRACE_DEBUG1("unexpected ReadByGrpType Group: 0x%04x", uuid.uu.uuid16);
+ GATT_TRACE_DEBUG("unexpected ReadByGrpType Group: 0x%04x", uuid.uu.uuid16);
}
else
{
/* we do not support ReadByTypeValue with any non-primamry_service type */
reason = GATT_NOT_FOUND;
- GATT_TRACE_DEBUG1("unexpected ReadByTypeValue type: 0x%04x", uuid.uu.uuid16);
+ GATT_TRACE_DEBUG("unexpected ReadByTypeValue type: 0x%04x", uuid.uu.uuid16);
}
}
}
@@ -915,7 +920,7 @@
}
else if (len < GATT_MTU_REQ_MIN_LEN)
{
- GATT_TRACE_ERROR0("invalid MTU request PDU received.");
+ GATT_TRACE_ERROR("invalid MTU request PDU received.");
gatt_send_error_rsp (p_tcb, GATT_INVALID_PDU, GATT_REQ_MTU, 0, FALSE);
}
else
@@ -929,7 +934,7 @@
else
p_tcb->payload_size = mtu;
- GATT_TRACE_ERROR1("MTU request PDU with MTU size %d", p_tcb->payload_size);
+ GATT_TRACE_ERROR("MTU request PDU with MTU size %d", p_tcb->payload_size);
if ((p_buf = attp_build_sr_msg(p_tcb, GATT_RSP_MTU, (tGATT_SR_MSG *) &p_tcb->payload_size)) != NULL)
{
@@ -986,7 +991,7 @@
#if GATT_CONFORMANCE_TESTING == TRUE
if (gatt_cb.enable_err_rsp && gatt_cb.req_op_code == op_code)
{
- GATT_TRACE_DEBUG1("Conformance tst: forced err rsp for ReadByType: error status=%d", gatt_cb.err_status);
+ GATT_TRACE_DEBUG("Conformance tst: forced err rsp for ReadByType: error status=%d", gatt_cb.err_status);
gatt_send_error_rsp (p_tcb, gatt_cb.err_status, gatt_cb.req_op_code, s_hdl, FALSE);
@@ -998,7 +1003,7 @@
{
if ((p_msg = (BT_HDR *)GKI_getbuf(msg_len)) == NULL)
{
- GATT_TRACE_ERROR0("gatts_process_find_info failed. no resources.");
+ GATT_TRACE_ERROR("gatts_process_find_info failed. no resources.");
reason = GATT_NO_RESOURCES;
}
@@ -1025,7 +1030,7 @@
p_rcb->e_hdl < s_hdl))
{
gatt_sr_get_sec_info(p_tcb->peer_bda,
- (BOOLEAN)(p_tcb->att_lcid == L2CAP_ATT_CID),
+ p_tcb->transport,
&sec_flag,
&key_size);
@@ -1105,7 +1110,7 @@
case GATT_SIGN_CMD_WRITE:
if (op_code == GATT_SIGN_CMD_WRITE)
{
- GATT_TRACE_DEBUG0("Write CMD with data sigining" );
+ GATT_TRACE_DEBUG("Write CMD with data sigining" );
len -= GATT_AUTH_SIGN_LEN;
}
/* fall through */
@@ -1120,7 +1125,7 @@
}
gatt_sr_get_sec_info(p_tcb->peer_bda,
- (BOOLEAN)(p_tcb->att_lcid == L2CAP_ATT_CID),
+ p_tcb->transport,
&sec_flag,
&key_size);
@@ -1148,7 +1153,7 @@
}
else
{
- GATT_TRACE_ERROR0("max pending command, send error");
+ GATT_TRACE_ERROR("max pending command, send error");
status = GATT_BUSY; /* max pending command, application error */
}
}
@@ -1173,7 +1178,7 @@
**
*******************************************************************************/
static void gatts_process_read_req(tGATT_TCB *p_tcb, tGATT_SR_REG *p_rcb, UINT8 op_code,
- UINT16 handle, UINT8 *p_data)
+ UINT16 handle, UINT16 len, UINT8 *p_data)
{
UINT16 buf_len = (UINT16)(sizeof(BT_HDR) + p_tcb->payload_size + L2CAP_MIN_OFFSET);
tGATT_STATUS reason;
@@ -1181,9 +1186,10 @@
UINT8 sec_flag, key_size, *p;
UINT16 offset = 0, value_len = 0;
+ UNUSED (len);
if ((p_msg = (BT_HDR *)GKI_getbuf(buf_len)) == NULL)
{
- GATT_TRACE_ERROR0("gatts_process_find_info failed. no resources.");
+ GATT_TRACE_ERROR("gatts_process_find_info failed. no resources.");
reason = GATT_NO_RESOURCES;
}
@@ -1199,7 +1205,7 @@
buf_len = p_tcb->payload_size - 1;
gatt_sr_get_sec_info(p_tcb->peer_bda,
- (BOOLEAN)(p_tcb->att_lcid == L2CAP_ATT_CID),
+ p_tcb->transport,
&sec_flag,
&key_size);
@@ -1252,7 +1258,7 @@
if (len < 2)
{
- GATT_TRACE_ERROR0("Illegal PDU length, discard request");
+ GATT_TRACE_ERROR("Illegal PDU length, discard request");
status = GATT_INVALID_PDU;
}
else
@@ -1265,7 +1271,7 @@
gatt_cb.handle = handle;
if (gatt_cb.enable_err_rsp && gatt_cb.req_op_code == op_code)
{
- GATT_TRACE_DEBUG1("Conformance tst: forced err rsp: error status=%d", gatt_cb.err_status);
+ GATT_TRACE_DEBUG("Conformance tst: forced err rsp: error status=%d", gatt_cb.err_status);
gatt_send_error_rsp (p_tcb, gatt_cb.err_status, gatt_cb.req_op_code, handle, FALSE);
@@ -1289,7 +1295,7 @@
{
case GATT_REQ_READ: /* read char/char descriptor value */
case GATT_REQ_READ_BLOB:
- gatts_process_read_req(p_tcb, p_rcb, op_code, handle, p);
+ gatts_process_read_req(p_tcb, p_rcb, op_code, handle, len, p);
break;
case GATT_REQ_WRITE: /* write char/char descriptor value */
@@ -1329,11 +1335,11 @@
tGATTS_SRV_CHG_REQ req;
tGATTS_SRV_CHG *p_buf = NULL;
- GATT_TRACE_DEBUG0("gatts_proc_srv_chg_ind_ack");
+ GATT_TRACE_DEBUG("gatts_proc_srv_chg_ind_ack");
if ((p_buf = gatt_is_bda_in_the_srv_chg_clt_list(p_tcb->peer_bda)) != NULL)
{
- GATT_TRACE_DEBUG0("NV update set srv chg = FALSE");
+ GATT_TRACE_DEBUG("NV update set srv chg = FALSE");
p_buf->srv_changed = FALSE;
memcpy(&req.srv_chg, p_buf, sizeof(tGATTS_SRV_CHG));
if (gatt_cb.cb_info.p_srv_chg_callback)
@@ -1354,7 +1360,7 @@
static void gatts_chk_pending_ind(tGATT_TCB *p_tcb )
{
tGATT_VALUE *p_buf = (tGATT_VALUE *)GKI_getfirst(&p_tcb->pending_ind_q);
- GATT_TRACE_DEBUG0("gatts_chk_pending_ind");
+ GATT_TRACE_DEBUG("gatts_chk_pending_ind");
if (p_buf )
{
@@ -1380,7 +1386,7 @@
{
BOOLEAN continue_processing = TRUE;
- GATT_TRACE_DEBUG1 ("gatts_proc_ind_ack ack handle=%d", ack_handle);
+ GATT_TRACE_DEBUG ("gatts_proc_ind_ack ack handle=%d", ack_handle);
if (ack_handle == gatt_cb.handle_of_h_r)
{
@@ -1433,7 +1439,7 @@
}
else
{
- GATT_TRACE_ERROR0("unexpected handle value confirmation");
+ GATT_TRACE_ERROR("unexpected handle value confirmation");
}
}
@@ -1459,7 +1465,7 @@
/* The message has to be smaller than the agreed MTU, len does not include op code */
if (len >= p_tcb->payload_size)
{
- GATT_TRACE_ERROR2("server receive invalid PDU size:%d pdu size:%d", len + 1, p_tcb->payload_size );
+ GATT_TRACE_ERROR("server receive invalid PDU size:%d pdu size:%d", len + 1, p_tcb->payload_size );
/* for invalid request expecting response, send it now */
if (op_code != GATT_CMD_WRITE &&
op_code != GATT_SIGN_CMD_WRITE &&
@@ -1506,7 +1512,7 @@
break;
case GATT_REQ_EXEC_WRITE:
- gatt_process_exec_write_req (p_tcb, op_code, p_data);
+ gatt_process_exec_write_req (p_tcb, op_code, len, p_data);
break;
case GATT_REQ_READ_MULTI:
diff --git a/stack/gatt/gatt_utils.c b/stack/gatt/gatt_utils.c
index 978c88c..0e841a9 100644
--- a/stack/gatt/gatt_utils.c
+++ b/stack/gatt/gatt_utils.c
@@ -91,7 +91,7 @@
*******************************************************************************/
void gatt_free_pending_ind(tGATT_TCB *p_tcb)
{
- GATT_TRACE_DEBUG0("gatt_free_pending_ind");
+ GATT_TRACE_DEBUG("gatt_free_pending_ind");
/* release all queued indications */
while (p_tcb->pending_ind_q.p_first)
GKI_freebuf (GKI_dequeue (&p_tcb->pending_ind_q));
@@ -108,7 +108,7 @@
*******************************************************************************/
void gatt_free_pending_enc_queue(tGATT_TCB *p_tcb)
{
- GATT_TRACE_DEBUG0("gatt_free_pending_enc_queue");
+ GATT_TRACE_DEBUG("gatt_free_pending_enc_queue");
/* release all queued indications */
while (p_tcb->pending_enc_clcb.p_first)
GKI_freebuf (GKI_dequeue (&p_tcb->pending_enc_clcb));
@@ -128,7 +128,7 @@
tGATTS_SRV_CHG *p_buf;
tGATTS_SRV_CHG_REQ req;
- GATT_TRACE_DEBUG0 ("gatt_delete_dev_from_srv_chg_clt_list");
+ GATT_TRACE_DEBUG ("gatt_delete_dev_from_srv_chg_clt_list");
if ((p_buf = gatt_is_bda_in_the_srv_chg_clt_list(bd_addr)) != NULL)
{
if (gatt_cb.cb_info.p_srv_chg_callback)
@@ -156,13 +156,13 @@
tGATTS_SRV_CHG *p_buf = (tGATTS_SRV_CHG *)GKI_getfirst(&gatt_cb.srv_chg_clt_q);
tGATTS_SRV_CHG_REQ req;
- GATT_TRACE_DEBUG0 ("gatt_set_srv_chg");
+ GATT_TRACE_DEBUG ("gatt_set_srv_chg");
while (p_buf)
{
- GATT_TRACE_DEBUG0 ("found a srv_chg clt");
+ GATT_TRACE_DEBUG ("found a srv_chg clt");
if (!p_buf->srv_changed)
{
- GATT_TRACE_DEBUG0 ("set srv_changed to TRUE");
+ GATT_TRACE_DEBUG ("set srv_changed to TRUE");
p_buf->srv_changed= TRUE;
memcpy(&req.srv_chg, p_buf, sizeof(tGATTS_SRV_CHG));
if (gatt_cb.cb_info.p_srv_chg_callback)
@@ -193,7 +193,7 @@
&& gatt_uuid_compare (*p_svc_uuid, p->svc_uuid)
&& (svc_inst == p->svc_inst) )
{
- GATT_TRACE_DEBUG0 ("gatt_sr_is_new_srv_chg: Yes");
+ GATT_TRACE_DEBUG ("gatt_sr_is_new_srv_chg: Yes");
break;
}
p_buf = (tGATTS_PENDING_NEW_SRV_START *)GKI_getnext(p_buf);
@@ -215,10 +215,10 @@
tGATT_VALUE *gatt_add_pending_ind(tGATT_TCB *p_tcb, tGATT_VALUE *p_ind)
{
tGATT_VALUE *p_buf;
- GATT_TRACE_DEBUG0 ("gatt_add_pending_ind");
+ GATT_TRACE_DEBUG ("gatt_add_pending_ind");
if ((p_buf = (tGATT_VALUE *)GKI_getbuf((UINT16)sizeof(tGATT_VALUE))) != NULL)
{
- GATT_TRACE_DEBUG0 ("enqueue a pending indication");
+ GATT_TRACE_DEBUG ("enqueue a pending indication");
memcpy(p_buf, p_ind, sizeof(tGATT_VALUE));
GKI_enqueue (&p_tcb->pending_ind_q, p_buf);
}
@@ -239,10 +239,10 @@
{
tGATTS_PENDING_NEW_SRV_START *p_buf;
- GATT_TRACE_DEBUG0 ("gatt_add_pending_new_srv_start");
+ GATT_TRACE_DEBUG ("gatt_add_pending_new_srv_start");
if ((p_buf = (tGATTS_PENDING_NEW_SRV_START *)GKI_getbuf((UINT16)sizeof(tGATTS_PENDING_NEW_SRV_START))) != NULL)
{
- GATT_TRACE_DEBUG0 ("enqueue a new pending new srv start");
+ GATT_TRACE_DEBUG ("enqueue a new pending new srv start");
p_buf->p_new_srv_start = p_new_srv_start;
GKI_enqueue (&gatt_cb.pending_new_srv_start_q, p_buf);
}
@@ -262,10 +262,10 @@
tGATTS_SRV_CHG *gatt_add_srv_chg_clt(tGATTS_SRV_CHG *p_srv_chg)
{
tGATTS_SRV_CHG *p_buf;
- GATT_TRACE_DEBUG0 ("gatt_add_srv_chg_clt");
+ GATT_TRACE_DEBUG ("gatt_add_srv_chg_clt");
if ((p_buf = (tGATTS_SRV_CHG *)GKI_getbuf((UINT16)sizeof(tGATTS_SRV_CHG))) != NULL)
{
- GATT_TRACE_DEBUG0 ("enqueue a srv chg client");
+ GATT_TRACE_DEBUG ("enqueue a srv chg client");
memcpy(p_buf, p_srv_chg, sizeof(tGATTS_SRV_CHG));
GKI_enqueue (&gatt_cb.srv_chg_clt_q, p_buf);
}
@@ -352,7 +352,7 @@
&& gatt_uuid_compare (*p_svc_uuid, p_list->asgn_range.svc_uuid)
&& (svc_inst == p_list->asgn_range.svc_inst) )
{
- GATT_TRACE_DEBUG0 ("Already allocated handles for this service before!!");
+ GATT_TRACE_DEBUG ("Already allocated handles for this service before!!");
return(p_list);
}
p_list = p_list->p_next;
@@ -503,7 +503,7 @@
if (!p_new)
{
- GATT_TRACE_DEBUG0("p_new==NULL");
+ GATT_TRACE_DEBUG("p_new==NULL");
return FALSE;
}
@@ -567,7 +567,7 @@
{
if (!p_remove || !p_list->p_first)
{
- GATT_TRACE_DEBUG0("p_remove==NULL || p_list->p_first==NULL");
+ GATT_TRACE_DEBUG("p_remove==NULL || p_list->p_first==NULL");
return FALSE;
}
@@ -608,7 +608,7 @@
tGATT_HDL_LIST_ELEM *p_old;
if (!p_new)
{
- GATT_TRACE_DEBUG0("p_new==NULL");
+ GATT_TRACE_DEBUG("p_new==NULL");
return FALSE;
}
@@ -671,7 +671,7 @@
{
if (!p_remove || !p_list->p_first)
{
- GATT_TRACE_DEBUG0("p_remove==NULL || p_list->p_first==NULL");
+ GATT_TRACE_DEBUG("p_remove==NULL || p_list->p_first==NULL");
return FALSE;
}
@@ -705,11 +705,12 @@
** Returns TRUE if found
**
*******************************************************************************/
-BOOLEAN gatt_find_the_connected_bda(UINT8 start_idx, BD_ADDR bda, UINT8 *p_found_idx)
+BOOLEAN gatt_find_the_connected_bda(UINT8 start_idx, BD_ADDR bda, UINT8 *p_found_idx,
+ tBT_TRANSPORT *p_transport)
{
UINT8 i;
BOOLEAN found = FALSE;
- GATT_TRACE_DEBUG1("gatt_find_the_connected_bda start_idx=%d",start_idx);
+ GATT_TRACE_DEBUG("gatt_find_the_connected_bda start_idx=%d",start_idx);
for (i = start_idx ; i < GATT_MAX_PHY_CHANNEL; i ++)
{
@@ -717,13 +718,14 @@
{
memcpy( bda, gatt_cb.tcb[i].peer_bda, BD_ADDR_LEN);
*p_found_idx = i;
+ *p_transport = gatt_cb.tcb[i].transport;
found = TRUE;
- GATT_TRACE_DEBUG6("gatt_find_the_connected_bda bda :%02x-%02x-%02x-%02x-%02x-%02x",
+ GATT_TRACE_DEBUG("gatt_find_the_connected_bda bda :%02x-%02x-%02x-%02x-%02x-%02x",
bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]);
break;
}
}
- GATT_TRACE_DEBUG2("gatt_find_the_connected_bda found=%d found_idx=%d", found, i);
+ GATT_TRACE_DEBUG("gatt_find_the_connected_bda found=%d found_idx=%d", found, i);
return found;
}
@@ -744,7 +746,7 @@
tGATT_VALUE *p_buf = (tGATT_VALUE *)GKI_getfirst(&p_tcb->pending_ind_q);
BOOLEAN srv_chg_ind_pending = FALSE;
- GATT_TRACE_DEBUG1("gatt_is_srv_chg_ind_pending is_queue_empty=%d", GKI_queue_is_empty(&p_tcb->pending_ind_q) );
+ GATT_TRACE_DEBUG("gatt_is_srv_chg_ind_pending is_queue_empty=%d", GKI_queue_is_empty(&p_tcb->pending_ind_q) );
if (p_tcb->indicate_handle == gatt_cb.handle_of_h_r)
{
@@ -763,7 +765,7 @@
}
}
- GATT_TRACE_DEBUG1("srv_chg_ind_pending = %d", srv_chg_ind_pending);
+ GATT_TRACE_DEBUG("srv_chg_ind_pending = %d", srv_chg_ind_pending);
return srv_chg_ind_pending;
}
@@ -781,14 +783,14 @@
{
tGATTS_SRV_CHG *p_buf = (tGATTS_SRV_CHG *)GKI_getfirst(&gatt_cb.srv_chg_clt_q);
- GATT_TRACE_DEBUG6("gatt_is_bda_in_the_srv_chg_clt_list :%02x-%02x-%02x-%02x-%02x-%02x",
+ GATT_TRACE_DEBUG("gatt_is_bda_in_the_srv_chg_clt_list :%02x-%02x-%02x-%02x-%02x-%02x",
bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]);
while (p_buf != NULL)
{
if (!memcmp( bda, p_buf->bda, BD_ADDR_LEN))
{
- GATT_TRACE_DEBUG0("bda is in the srv chg clt list");
+ GATT_TRACE_DEBUG("bda is in the srv chg clt list");
break;
}
p_buf = (tGATTS_SRV_CHG *)GKI_getnext(p_buf);
@@ -833,19 +835,19 @@
** Returns GATT_INDEX_INVALID if not found. Otherwise index to the tcb.
**
*******************************************************************************/
-UINT8 gatt_find_i_tcb_by_addr(BD_ADDR bda)
+UINT8 gatt_find_i_tcb_by_addr(BD_ADDR bda, tBT_TRANSPORT transport)
{
- UINT8 i = 0, j = GATT_INDEX_INVALID;
+ UINT8 i = 0;
for ( ; i < GATT_MAX_PHY_CHANNEL; i ++)
{
- if (!memcmp(gatt_cb.tcb[i].peer_bda, bda, BD_ADDR_LEN))
+ if (!memcmp(gatt_cb.tcb[i].peer_bda, bda, BD_ADDR_LEN) &&
+ gatt_cb.tcb[i].transport == transport)
{
- j = i;
- break;
+ return i;
}
}
- return j;
+ return GATT_INDEX_INVALID;
}
@@ -877,12 +879,12 @@
** Returns NULL if not found. Otherwise index to the tcb.
**
*******************************************************************************/
-tGATT_TCB * gatt_find_tcb_by_addr(BD_ADDR bda)
+tGATT_TCB * gatt_find_tcb_by_addr(BD_ADDR bda, tBT_TRANSPORT transport)
{
tGATT_TCB *p_tcb = NULL;
UINT8 i = 0;
- if ((i = gatt_find_i_tcb_by_addr(bda)) != GATT_INDEX_INVALID)
+ if ((i = gatt_find_i_tcb_by_addr(bda, transport)) != GATT_INDEX_INVALID)
p_tcb = &gatt_cb.tcb[i];
return p_tcb;
@@ -919,14 +921,14 @@
** Returns GATT_INDEX_INVALID if not found. Otherwise index to the tcb.
**
*******************************************************************************/
-tGATT_TCB * gatt_allocate_tcb_by_bdaddr(BD_ADDR bda)
+tGATT_TCB * gatt_allocate_tcb_by_bdaddr(BD_ADDR bda, tBT_TRANSPORT transport)
{
UINT8 i = 0;
BOOLEAN allocated = FALSE;
tGATT_TCB *p_tcb = NULL;
/* search for existing tcb with matching bda */
- i = gatt_find_i_tcb_by_addr(bda);
+ i = gatt_find_i_tcb_by_addr(bda, transport);
/* find free tcb */
if (i == GATT_INDEX_INVALID)
{
@@ -944,6 +946,7 @@
GKI_init_q (&p_tcb->pending_ind_q);
p_tcb->in_use = TRUE;
p_tcb->tcb_idx = i;
+ p_tcb->transport = transport;
}
memcpy(p_tcb->peer_bda, bda, BD_ADDR_LEN);
}
@@ -970,6 +973,23 @@
/*******************************************************************************
**
+** Function gatt_convert_uuid32_to_uuid128
+**
+** Description Convert a 32 bits UUID to be an standard 128 bits one.
+**
+** Returns TRUE if two uuid match; FALSE otherwise.
+**
+*******************************************************************************/
+void gatt_convert_uuid32_to_uuid128(UINT8 uuid_128[LEN_UUID_128], UINT32 uuid_32)
+{
+ UINT8 *p = &uuid_128[LEN_UUID_128 - 4];
+
+ memcpy (uuid_128, base_uuid, LEN_UUID_128);
+
+ UINT32_TO_STREAM(p, uuid_32);
+}
+/*******************************************************************************
+**
** Function gatt_uuid_compare
**
** Description Compare two UUID to see if they are the same.
@@ -989,11 +1009,17 @@
}
/* If both are 16-bit, we can do a simple compare */
- if (src.len == 2 && tar.len == 2)
+ if (src.len == LEN_UUID_16 && tar.len == LEN_UUID_16)
{
return src.uu.uuid16 == tar.uu.uuid16;
}
+ /* If both are 32-bit, we can do a simple compare */
+ if (src.len == LEN_UUID_32 && tar.len == LEN_UUID_32)
+ {
+ return src.uu.uuid32 == tar.uu.uuid32;
+ }
+
/* One or both of the UUIDs is 128-bit */
if (src.len == LEN_UUID_16)
{
@@ -1001,6 +1027,11 @@
gatt_convert_uuid16_to_uuid128(su, src.uu.uuid16);
ps = su;
}
+ else if (src.len == LEN_UUID_32)
+ {
+ gatt_convert_uuid32_to_uuid128(su, src.uu.uuid32);
+ ps = su;
+ }
else
ps = src.uu.uuid128;
@@ -1010,6 +1041,12 @@
gatt_convert_uuid16_to_uuid128(tu, tar.uu.uuid16);
pt = tu;
}
+ else if (tar.len == LEN_UUID_32)
+ {
+ /* convert a 32 bits UUID to 128 bits value */
+ gatt_convert_uuid32_to_uuid128(tu, tar.uu.uuid32);
+ pt = tu;
+ }
else
pt = tar.uu.uuid128;
@@ -1035,6 +1072,12 @@
UINT16_TO_STREAM (p, uuid.uu.uuid16);
len = LEN_UUID_16;
}
+ else if (uuid.len == LEN_UUID_32) /* always convert 32 bits into 128 bits as alwats */
+ {
+ gatt_convert_uuid32_to_uuid128(p, uuid.uu.uuid32);
+ p += LEN_UUID_128;
+ len = LEN_UUID_128;
+ }
else if (uuid.len == LEN_UUID_128)
{
ARRAY_TO_STREAM (p, uuid.uu.uuid128, LEN_UUID_128);
@@ -1090,7 +1133,11 @@
STREAM_TO_UINT16(p_uuid_rec->uu.uuid16, p_uuid);
}
else
- is_base_uuid = FALSE;
+ {
+ p_uuid += (LEN_UUID_128 - LEN_UUID_32);
+ p_uuid_rec->len = LEN_UUID_32;
+ STREAM_TO_UINT32(p_uuid_rec->uu.uuid32, p_uuid);
+ }
}
if (!is_base_uuid)
{
@@ -1100,10 +1147,13 @@
*p_data += LEN_UUID_128;
break;
+ /* do not allow 32 bits UUID in ATT PDU now */
+ case LEN_UUID_32:
+ GATT_TRACE_ERROR("DO NOT ALLOW 32 BITS UUID IN ATT PDU");
case 0:
default:
if (uuid_size != 0) ret = FALSE;
- GATT_TRACE_WARNING0("gatt_parse_uuid_from_cmd invalid uuid size");
+ GATT_TRACE_WARNING("gatt_parse_uuid_from_cmd invalid uuid size");
break;
}
@@ -1178,7 +1228,7 @@
tGATT_CLCB *p_clcb = (tGATT_CLCB *)p_tle->param;
if (p_clcb == NULL || p_clcb->p_tcb == NULL)
{
- GATT_TRACE_WARNING0("gatt_rsp_timeout clcb is already deleted");
+ GATT_TRACE_WARNING("gatt_rsp_timeout clcb is already deleted");
return;
}
if (p_clcb->operation == GATTC_OPTYPE_DISCOVERY &&
@@ -1186,10 +1236,10 @@
p_clcb->retry_count < GATT_REQ_RETRY_LIMIT)
{
UINT8 rsp_code;
- GATT_TRACE_WARNING0("gatt_rsp_timeout retry discovery primary service");
+ GATT_TRACE_WARNING("gatt_rsp_timeout retry discovery primary service");
if (p_clcb != gatt_cmd_dequeue(p_clcb->p_tcb, &rsp_code))
{
- GATT_TRACE_ERROR0("gatt_rsp_timeout command queue out of sync, disconnect");
+ GATT_TRACE_ERROR("gatt_rsp_timeout command queue out of sync, disconnect");
}
else
{
@@ -1199,8 +1249,8 @@
}
}
- GATT_TRACE_WARNING0("gatt_rsp_timeout disconnecting...");
- gatt_disconnect (p_clcb->p_tcb->peer_bda);
+ GATT_TRACE_WARNING("gatt_rsp_timeout disconnecting...");
+ gatt_disconnect (p_clcb->p_tcb);
}
/*******************************************************************************
@@ -1216,7 +1266,7 @@
{
tGATT_TCB * p_tcb = (tGATT_TCB *)p_tle->param;
- GATT_TRACE_WARNING0("gatt_ind_ack_timeout send ack now");
+ GATT_TRACE_WARNING("gatt_ind_ack_timeout send ack now");
if (p_tcb != NULL)
p_tcb->ind_count = 0;
@@ -1274,7 +1324,7 @@
gatt_uuid_compare (*p_svc_uuid, *p_this_uuid) &&
(svc_inst == p_sreg->service_instance))
{
- GATT_TRACE_ERROR0 ("Active Service Found ");
+ GATT_TRACE_ERROR ("Active Service Found ");
gatt_dbg_display_uuid(*p_svc_uuid);
break;
@@ -1313,7 +1363,7 @@
p_sreg->e_hdl = p_list->asgn_range.e_handle;
p_sreg->p_db = &p_list->svc_db;
- GATT_TRACE_DEBUG1 ("total GKI buffer in db [%d]",p_sreg->p_db->svc_buffer.count);
+ GATT_TRACE_DEBUG ("total GKI buffer in db [%d]",p_sreg->p_db->svc_buffer.count);
break;
}
}
@@ -1330,12 +1380,11 @@
** Returns void
**
*******************************************************************************/
-void gatt_sr_get_sec_info(BD_ADDR rem_bda, BOOLEAN le_conn, UINT8 *p_sec_flag, UINT8 *p_key_size)
+void gatt_sr_get_sec_info(BD_ADDR rem_bda, tBT_TRANSPORT transport, UINT8 *p_sec_flag, UINT8 *p_key_size)
{
UINT8 sec_flag = 0;
- UNUSED(le_conn);
- BTM_GetSecurityFlags(rem_bda, &sec_flag);
+ BTM_GetSecurityFlagsByTransport(rem_bda, &sec_flag, transport);
sec_flag &= (GATT_SEC_FLAG_LKEY_UNAUTHED | GATT_SEC_FLAG_LKEY_AUTHED | GATT_SEC_FLAG_ENCRYPTED);
@@ -1361,7 +1410,7 @@
if (!p_reg )
{
- GATT_TRACE_ERROR0 ("p_reg not found discard request");
+ GATT_TRACE_ERROR ("p_reg not found discard request");
return;
}
@@ -1372,7 +1421,7 @@
}
else
{
- GATT_TRACE_WARNING1("Call back not found for application conn_id=%d", conn_id);
+ GATT_TRACE_WARNING("Call back not found for application conn_id=%d", conn_id);
}
}
@@ -1428,7 +1477,7 @@
UINT8 buff[60];
UINT8 *p = buff;
- GATT_TRACE_DEBUG2("gatt_add_sdp_record s_hdl=0x%x s_hdl=0x%x",start_hdl, end_hdl);
+ GATT_TRACE_DEBUG("gatt_add_sdp_record s_hdl=0x%x s_hdl=0x%x",start_hdl, end_hdl);
if ((sdp_handle = SDP_CreateRecord()) == 0)
return 0;
@@ -1438,6 +1487,14 @@
case LEN_UUID_16:
SDP_AddServiceClassIdList(sdp_handle, 1, &p_uuid->uu.uuid16);
break;
+
+ case LEN_UUID_32:
+ UINT8_TO_BE_STREAM (p, (UUID_DESC_TYPE << 3) | SIZE_FOUR_BYTES);
+ UINT32_TO_BE_STREAM (p, p_uuid->uu.uuid32);
+ SDP_AddAttribute (sdp_handle, ATTR_ID_SERVICE_CLASS_ID_LIST, DATA_ELE_SEQ_DESC_TYPE,
+ (UINT32) (p - buff), buff);
+ break;
+
case LEN_UUID_128:
UINT8_TO_BE_STREAM (p, (UUID_DESC_TYPE << 3) | SIZE_SIXTEEN_BYTES);
ARRAY_TO_BE_STREAM (p, p_uuid->uu.uuid128, LEN_UUID_128);
@@ -1446,7 +1503,7 @@
break;
default:
- GATT_TRACE_ERROR1("inavlid UUID len=%d", p_uuid->len);
+ GATT_TRACE_ERROR("inavlid UUID len=%d", p_uuid->len);
SDP_DeleteRecord(sdp_handle);
return 0;
break;
@@ -1482,7 +1539,7 @@
*******************************************************************************/
void gatt_set_err_rsp(BOOLEAN enable, UINT8 req_op_code, UINT8 err_status)
{
- GATT_TRACE_DEBUG3("gatt_set_err_rsp enable=%d op_code=%d, err_status=%d", enable, req_op_code, err_status);
+ GATT_TRACE_DEBUG("gatt_set_err_rsp enable=%d op_code=%d, err_status=%d", enable, req_op_code, err_status);
gatt_cb.enable_err_rsp = enable;
gatt_cb.req_op_code = req_op_code;
gatt_cb.err_status = err_status;
@@ -1644,7 +1701,7 @@
num ++;
}
- GATT_TRACE_DEBUG1("gatt_num_apps_hold_link num=%d", num);
+ GATT_TRACE_DEBUG("gatt_num_apps_hold_link num=%d", num);
return num;
}
@@ -1853,7 +1910,7 @@
{
UINT8 idx = ((UINT8) gatt_if) - 1 ;
- GATT_TRACE_DEBUG4("gatt_sr_update_prep_cnt tcb idx=%d gatt_if=%d is_inc=%d is_reset_first=%d",
+ GATT_TRACE_DEBUG("gatt_sr_update_prep_cnt tcb idx=%d gatt_if=%d is_inc=%d is_reset_first=%d",
p_tcb->tcb_idx, gatt_if, is_inc, is_reset_first);
if (p_tcb)
@@ -1889,12 +1946,13 @@
tGATT_TCB *p_tcb=NULL;
BOOLEAN status= TRUE;
- p_tcb = gatt_find_tcb_by_addr(bda);
+ p_tcb = gatt_find_tcb_by_addr(bda, BT_TRANSPORT_LE);
+
if (p_tcb)
{
if (gatt_get_ch_state(p_tcb) == GATT_CH_OPEN)
{
- GATT_TRACE_ERROR0("GATT_CancelConnect - link connected Too late to cancel");
+ GATT_TRACE_ERROR("GATT_CancelConnect - link connected Too late to cancel");
status = FALSE;
}
else
@@ -1902,7 +1960,7 @@
gatt_update_app_use_link_flag(gatt_if, p_tcb, FALSE, FALSE);
if (!gatt_num_apps_hold_link(p_tcb))
{
- gatt_disconnect(p_tcb->peer_bda);
+ gatt_disconnect(p_tcb);
}
}
}
@@ -2060,7 +2118,7 @@
UINT16 conn_id;
UINT8 operation;
- GATT_TRACE_DEBUG3 ("gatt_end_operation status=%d op=%d subtype=%d",
+ GATT_TRACE_DEBUG ("gatt_end_operation status=%d op=%d subtype=%d",
status, p_clcb->operation, p_clcb->op_subtype);
if (p_cmpl_cb != NULL && p_clcb->operation != 0)
@@ -2087,7 +2145,7 @@
}
else
{
- GATT_TRACE_DEBUG0("Rcv Prepare write rsp but no data");
+ GATT_TRACE_DEBUG("Rcv Prepare write rsp but no data");
}
}
}
@@ -2117,7 +2175,7 @@
else if (p_cmpl_cb && op)
(*p_cmpl_cb)(conn_id, op, status, &cb_data);
else
- GATT_TRACE_WARNING3 ("gatt_end_operation not sent out op=%d p_disc_cmpl_cb:%p p_cmpl_cb:%p",
+ GATT_TRACE_WARNING ("gatt_end_operation not sent out op=%d p_disc_cmpl_cb:%p p_cmpl_cb:%p",
operation, p_disc_cmpl_cb, p_cmpl_cb);
}
@@ -2131,7 +2189,7 @@
** Returns 16 bits uuid.
**
*******************************************************************************/
-void gatt_cleanup_upon_disc(BD_ADDR bda, UINT16 reason)
+void gatt_cleanup_upon_disc(BD_ADDR bda, UINT16 reason, tBT_TRANSPORT transport)
{
tGATT_TCB *p_tcb = NULL;
tGATT_CLCB *p_clcb;
@@ -2140,18 +2198,19 @@
tGATT_REG *p_reg=NULL;
- GATT_TRACE_DEBUG0 ("gatt_cleanup_upon_disc ");
+ GATT_TRACE_DEBUG ("gatt_cleanup_upon_disc ");
- if ((p_tcb = gatt_find_tcb_by_addr(bda)) != NULL)
+ if ((p_tcb = gatt_find_tcb_by_addr(bda, transport)) != NULL)
{
- GATT_TRACE_DEBUG0 ("found p_tcb ");
+ GATT_TRACE_DEBUG ("found p_tcb ");
+ gatt_set_ch_state(p_tcb, GATT_CH_CLOSE);
for (i = 0; i < GATT_CL_MAX_LCB; i ++)
{
p_clcb = &gatt_cb.clcb[i];
if (p_clcb->in_use && p_clcb->p_tcb == p_tcb)
{
btu_stop_timer(&p_clcb->rsp_timer_ent);
- GATT_TRACE_DEBUG2 ("found p_clcb conn_id=%d clcb_idx=%d", p_clcb->conn_id, p_clcb->clcb_idx);
+ GATT_TRACE_DEBUG ("found p_clcb conn_id=%d clcb_idx=%d", p_clcb->conn_id, p_clcb->clcb_idx);
if (p_clcb->operation != GATTC_OPTYPE_NONE)
gatt_end_operation(p_clcb, GATT_ERROR, NULL);
@@ -2171,14 +2230,14 @@
if (p_reg->in_use && p_reg->app_cb.p_conn_cb)
{
conn_id = GATT_CREATE_CONN_ID(p_tcb->tcb_idx, p_reg->gatt_if);
- GATT_TRACE_DEBUG3 ("found p_reg tcb_idx=%d gatt_if=%d conn_id=0x%x", p_tcb->tcb_idx, p_reg->gatt_if, conn_id);
- (*p_reg->app_cb.p_conn_cb)(p_reg->gatt_if, bda, conn_id, FALSE, reason);
+ GATT_TRACE_DEBUG ("found p_reg tcb_idx=%d gatt_if=%d conn_id=0x%x", p_tcb->tcb_idx, p_reg->gatt_if, conn_id);
+ (*p_reg->app_cb.p_conn_cb)(p_reg->gatt_if, bda, conn_id, FALSE, reason, transport);
}
}
memset(p_tcb, 0, sizeof(tGATT_TCB));
}
- GATT_TRACE_DEBUG0 ("exit gatt_cleanup_upon_disc ");
+ GATT_TRACE_DEBUG ("exit gatt_cleanup_upon_disc ");
}
/*******************************************************************************
**
@@ -2228,6 +2287,10 @@
{
sprintf(str_buf, "0x%04x", bt_uuid.uu.uuid16);
}
+ else if (bt_uuid.len == LEN_UUID_32)
+ {
+ sprintf(str_buf, "0x%08x", (unsigned int)bt_uuid.uu.uuid32);
+ }
else if (bt_uuid.len == LEN_UUID_128)
{
x += sprintf(&str_buf[x], "0x%02x%02x%02x%02x%02x%02x%02x%02x",
@@ -2244,7 +2307,7 @@
else
BCM_STRNCPY_S(str_buf, sizeof(str_buf), "Unknown UUID 0", 15);
- GATT_TRACE_DEBUG1 ("UUID=[%s]", str_buf);
+ GATT_TRACE_DEBUG ("UUID=[%s]", str_buf);
}
@@ -2350,7 +2413,7 @@
{
if (p_dev->gatt_if[i] == gatt_if)
{
- GATT_TRACE_ERROR0("device already in iniator white list");
+ GATT_TRACE_ERROR("device already in iniator white list");
return TRUE;
}
else if (p_dev->gatt_if[i] == 0)
@@ -2367,7 +2430,7 @@
{
if (p_dev->listen_gif[i] == gatt_if)
{
- GATT_TRACE_ERROR0("device already in adv white list");
+ GATT_TRACE_ERROR("device already in adv white list");
return TRUE;
}
else if (p_dev->listen_gif[i] == 0)
@@ -2389,7 +2452,7 @@
}
else
{
- GATT_TRACE_ERROR0("no device record available");
+ GATT_TRACE_ERROR("no device record available");
}
return ret;
@@ -2406,7 +2469,7 @@
*******************************************************************************/
BOOLEAN gatt_remove_bg_dev_for_app(tGATT_IF gatt_if, BD_ADDR bd_addr)
{
- tGATT_TCB *p_tcb = gatt_find_tcb_by_addr(bd_addr);
+ tGATT_TCB *p_tcb = gatt_find_tcb_by_addr(bd_addr, BT_TRANSPORT_LE);
BOOLEAN status;
if (p_tcb)
@@ -2628,13 +2691,13 @@
{
BOOLEAN ret = FALSE;
tGATT_REG *p_reg;
- tGATT_TCB *p_tcb = gatt_find_tcb_by_addr(bd_addr);
+ tGATT_TCB *p_tcb = gatt_find_tcb_by_addr(bd_addr, BT_TRANSPORT_LE);
- GATT_TRACE_API0 ("gatt_update_auto_connect_dev ");
+ GATT_TRACE_API ("gatt_update_auto_connect_dev ");
/* Make sure app is registered */
if ((p_reg = gatt_get_regcb(gatt_if)) == NULL)
{
- GATT_TRACE_ERROR1("gatt_update_auto_connect_dev - gatt_if is not registered", gatt_if);
+ GATT_TRACE_ERROR("gatt_update_auto_connect_dev - gatt_if is not registered", gatt_if);
return(FALSE);
}
@@ -2659,54 +2722,6 @@
/*******************************************************************************
**
-** Function gatt_get_conn_id
-**
-** Description This function returns a connecttion handle to a ATT server
-** if the server is already connected
-**
-** Parameters gatt_if: client interface.
-** bd_addr: peer device address.
-**
-** Returns Connection handle or invalid handle value
-**
-*******************************************************************************/
-UINT16 gatt_get_conn_id (tGATT_IF gatt_if, BD_ADDR bd_addr)
-{
- tGATT_REG *p_reg;
- tGATT_CLCB *p_clcb;
- tGATT_TCB *p_tcb;
- UINT8 i;
-
- GATT_TRACE_API1 ("GATTC_GetConnIfConnected gatt_if=%d", gatt_if);
- /* Do we have a transport to the peer ? If not, we are not connected */
- if ((p_tcb = gatt_find_tcb_by_addr(bd_addr)) == NULL)
- {
- GATT_TRACE_EVENT0 ("GATTC_GetConnIfConnected - no TCB found");
- return(GATT_INVALID_CONN_ID);
- }
-
- /* Make sure app is registered */
- if ((p_reg = gatt_get_regcb(gatt_if)) == NULL)
- {
- GATT_TRACE_ERROR1("GATTC_GetConnIfConnected - gatt_if is not registered", gatt_if);
- return(GATT_INVALID_CONN_ID);
- }
-
- /* Now see if the app already has a client control block to that peer */
- for (i = 0, p_clcb = gatt_cb.clcb; i < GATT_CL_MAX_LCB; i++, p_clcb++)
- {
- if ( p_clcb->in_use && (p_clcb->p_reg == p_reg) && (p_clcb->p_tcb == p_tcb) )
- {
- return(p_clcb->conn_id);
- }
- }
-
- /* If here, failed to allocate a client control block */
- GATT_TRACE_ERROR1 ("gatt_get_conn_id: not connected- gatt_if: %u", gatt_if);
- return(GATT_INVALID_CONN_ID);
-}
-/*******************************************************************************
-**
** Function gatt_add_pending_new_srv_start
**
** Description Add a pending new srv start to the new service start queue
@@ -2718,10 +2733,10 @@
{
tGATT_PENDING_ENC_CLCB *p_buf;
- GATT_TRACE_DEBUG0 ("gatt_add_pending_new_srv_start");
+ GATT_TRACE_DEBUG ("gatt_add_pending_new_srv_start");
if ((p_buf = (tGATT_PENDING_ENC_CLCB *)GKI_getbuf((UINT16)sizeof(tGATT_PENDING_ENC_CLCB))) != NULL)
{
- GATT_TRACE_DEBUG0 ("enqueue a new pending encryption channel clcb");
+ GATT_TRACE_DEBUG ("enqueue a new pending encryption channel clcb");
p_buf->p_clcb = p_clcb;
GKI_enqueue (&p_tcb->pending_enc_clcb, p_buf);
}
@@ -2736,12 +2751,13 @@
** Returns Pointer to the new service start buffer, NULL no buffer available
**
*******************************************************************************/
-void gatt_update_listen_mode(void)
+BOOLEAN gatt_update_listen_mode(void)
{
UINT8 ii = 0;
tGATT_REG *p_reg = &gatt_cb.cl_rcb[0];
UINT8 listening = 0;
UINT16 connectability, window, interval;
+ BOOLEAN rt = TRUE;
for (; ii < GATT_MAX_APPS; ii ++, p_reg ++)
{
@@ -2757,16 +2773,24 @@
else
BTM_BleUpdateAdvFilterPolicy (AP_SCAN_CONN_WL);
- connectability = BTM_ReadConnectability (&window, &interval);
-
- if (listening != GATT_LISTEN_TO_NONE)
+ if (rt)
{
- connectability |= BTM_BLE_CONNECTABLE;
+ connectability = BTM_ReadConnectability (&window, &interval);
+
+ if (listening != GATT_LISTEN_TO_NONE)
+ {
+ connectability |= BTM_BLE_CONNECTABLE;
+ }
+ else
+ {
+ if ((connectability & BTM_BLE_CONNECTABLE) == 0)
+ connectability &= ~BTM_BLE_CONNECTABLE;
+ }
+ /* turning on the adv now */
+ btm_ble_set_connectability(connectability);
}
- else
- connectability &= ~BTM_BLE_CONNECTABLE;
- /* turning on the adv now */
- BTM_SetConnectability(connectability, window, interval);
+
+ return rt;
}
#endif
diff --git a/stack/hcic/hciblecmds.c b/stack/hcic/hciblecmds.c
index a4e55da..860fb7a 100644
--- a/stack/hcic/hciblecmds.c
+++ b/stack/hcic/hciblecmds.c
@@ -35,27 +35,6 @@
#if (defined BLE_INCLUDED) && (BLE_INCLUDED == TRUE)
-BOOLEAN btsnd_hcic_ble_reset(void)
-{
- BT_HDR *p;
- UINT8 *pp;
-
- if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL)
- return (FALSE);
-
- pp = (UINT8 *)(p + 1);
-
- p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD;
- p->offset = 0;
-
- UINT16_TO_STREAM (pp, HCI_BLE_RESET);
- UINT8_TO_STREAM (pp, 0);
-
- btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
- return (TRUE);
-
-}
-
BOOLEAN btsnd_hcic_ble_set_evt_mask (BT_EVENT_MASK event_mask)
{
BT_HDR *p;
@@ -163,7 +142,7 @@
BOOLEAN btsnd_hcic_ble_write_adv_params (UINT16 adv_int_min, UINT16 adv_int_max,
UINT8 adv_type, UINT8 addr_type_own,
UINT8 addr_type_dir, BD_ADDR direct_bda,
- UINT8 channel_map, UINT8 adv_filter_policy)
+ UINT8 channel_map, UINT8 scan_filter_policy)
{
BT_HDR *p;
UINT8 *pp;
@@ -186,7 +165,7 @@
UINT8_TO_STREAM (pp, addr_type_dir);
BDADDR_TO_STREAM (pp, direct_bda);
UINT8_TO_STREAM (pp, channel_map);
- UINT8_TO_STREAM (pp, adv_filter_policy);
+ UINT8_TO_STREAM (pp, scan_filter_policy);
btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
return (TRUE);
@@ -856,4 +835,62 @@
return (TRUE);
}
+#if (defined BLE_LLT_INCLUDED) && (BLE_LLT_INCLUDED == TRUE)
+
+BOOLEAN btsnd_hcic_ble_rc_param_req_reply( UINT16 handle,
+ UINT16 conn_int_min, UINT16 conn_int_max,
+ UINT16 conn_latency, UINT16 conn_timeout,
+ UINT16 min_ce_len, UINT16 max_ce_len )
+{
+ BT_HDR *p;
+ UINT8 *pp;
+
+ if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_REPLY)) == NULL)
+ return (FALSE);
+
+ pp = (UINT8 *)(p + 1);
+
+ p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_REPLY;
+ p->offset = 0;
+
+ UINT16_TO_STREAM (pp, HCI_BLE_RC_PARAM_REQ_REPLY);
+ UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_REPLY);
+
+ UINT16_TO_STREAM (pp, handle);
+ UINT16_TO_STREAM (pp, conn_int_min);
+ UINT16_TO_STREAM (pp, conn_int_max);
+ UINT16_TO_STREAM (pp, conn_latency);
+ UINT16_TO_STREAM (pp, conn_timeout);
+ UINT16_TO_STREAM (pp, min_ce_len);
+ UINT16_TO_STREAM (pp, max_ce_len);
+
+ btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
+ return (TRUE);
+}
+
+BOOLEAN btsnd_hcic_ble_rc_param_req_neg_reply(UINT16 handle, UINT8 reason)
+{
+ BT_HDR *p;
+ UINT8 *pp;
+
+ if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_NEG_REPLY)) == NULL)
+ return (FALSE);
+
+ pp = (UINT8 *)(p + 1);
+
+ p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_NEG_REPLY;
+ p->offset = 0;
+
+ UINT16_TO_STREAM (pp, HCI_BLE_RC_PARAM_REQ_NEG_REPLY);
+ UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_NEG_REPLY);
+
+ UINT16_TO_STREAM (pp, handle);
+ UINT8_TO_STREAM (pp, reason);
+
+ btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
+ return (TRUE);
+}
#endif
+
+#endif
+
diff --git a/stack/hcic/hcicmds.c b/stack/hcic/hcicmds.c
index 778ebfb..a530d2a 100644
--- a/stack/hcic/hcicmds.c
+++ b/stack/hcic/hcicmds.c
@@ -783,13 +783,6 @@
BT_HDR *p;
UINT8 *pp;
- #ifdef BDCFG_OVERRIDE_SNIFF_MODE_MAX
- max_sniff_period = BDCFG_OVERRIDE_SNIFF_MODE_MAX;
- min_sniff_period = BDCFG_OVERRIDE_SNIFF_MODE_MIN;
- sniff_attempt = BDCFG_OVERRIDE_SNIFF_MODE_ATTEMPT;
- sniff_timeout = BDCFG_OVERRIDE_SNIFF_MODE_TIMEOUT;
- #endif
-
if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SNIFF_MODE)) == NULL)
return (FALSE);
@@ -1371,6 +1364,7 @@
return (FALSE);
pp = (UINT8 *)(p + 1);
+ memset(pp, 0, HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CHANGE_NAME);
p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CHANGE_NAME;
p->offset = 0;
diff --git a/stack/hid/hidh_api.c b/stack/hid/hidh_api.c
index 1868671..b0c3aa5 100644
--- a/stack/hid/hidh_api.c
+++ b/stack/hid/hidh_api.c
@@ -445,19 +445,19 @@
if( !hh_cb.reg_flag )
{
- HIDH_TRACE_ERROR0("HID_ERR_NOT_REGISTERED");
+ HIDH_TRACE_ERROR("HID_ERR_NOT_REGISTERED");
status = HID_ERR_NOT_REGISTERED;
}
if( (dev_handle >= HID_HOST_MAX_DEVICES) || (!hh_cb.devices[dev_handle].in_use) )
{
- HIDH_TRACE_ERROR0("HID_ERR_INVALID_PARAM");
+ HIDH_TRACE_ERROR("HID_ERR_INVALID_PARAM");
status = HID_ERR_INVALID_PARAM;
}
else if( hh_cb.devices[dev_handle].state != HID_DEV_CONNECTED )
{
- HIDH_TRACE_ERROR1("HID_ERR_NO_CONNECTION dev_handle %d", dev_handle);
+ HIDH_TRACE_ERROR("HID_ERR_NO_CONNECTION dev_handle %d", dev_handle);
status = HID_ERR_NO_CONNECTION;
}
@@ -504,42 +504,42 @@
if (!BTM_SetSecurityLevel (FALSE, serv_name, BTM_SEC_SERVICE_HIDH_SEC_CTRL,
sec_lvl, HID_PSM_CONTROL, BTM_SEC_PROTO_HID, HID_SEC_CHN))
{
- HIDH_TRACE_ERROR0 ("Security Registration 1 failed");
+ HIDH_TRACE_ERROR ("Security Registration 1 failed");
return (HID_ERR_NO_RESOURCES);
}
if (!BTM_SetSecurityLevel (TRUE, serv_name, BTM_SEC_SERVICE_HIDH_SEC_CTRL,
sec_lvl, HID_PSM_CONTROL, BTM_SEC_PROTO_HID, HID_SEC_CHN))
{
- HIDH_TRACE_ERROR0 ("Security Registration 2 failed");
+ HIDH_TRACE_ERROR ("Security Registration 2 failed");
return (HID_ERR_NO_RESOURCES);
}
if (!BTM_SetSecurityLevel (FALSE, serv_name, BTM_SEC_SERVICE_HIDH_NOSEC_CTRL,
BTM_SEC_NONE, HID_PSM_CONTROL, BTM_SEC_PROTO_HID, HID_NOSEC_CHN))
{
- HIDH_TRACE_ERROR0 ("Security Registration 3 failed");
+ HIDH_TRACE_ERROR ("Security Registration 3 failed");
return (HID_ERR_NO_RESOURCES);
}
if (!BTM_SetSecurityLevel (TRUE, serv_name, BTM_SEC_SERVICE_HIDH_NOSEC_CTRL,
BTM_SEC_NONE, HID_PSM_CONTROL, BTM_SEC_PROTO_HID, HID_NOSEC_CHN))
{
- HIDH_TRACE_ERROR0 ("Security Registration 4 failed");
+ HIDH_TRACE_ERROR ("Security Registration 4 failed");
return (HID_ERR_NO_RESOURCES);
}
if (!BTM_SetSecurityLevel (TRUE, serv_name, BTM_SEC_SERVICE_HIDH_INTR,
BTM_SEC_NONE, HID_PSM_INTERRUPT, BTM_SEC_PROTO_HID, 0))
{
- HIDH_TRACE_ERROR0 ("Security Registration 5 failed");
+ HIDH_TRACE_ERROR ("Security Registration 5 failed");
return (HID_ERR_NO_RESOURCES);
}
if (!BTM_SetSecurityLevel (FALSE, serv_name, BTM_SEC_SERVICE_HIDH_INTR,
BTM_SEC_NONE, HID_PSM_INTERRUPT, BTM_SEC_PROTO_HID, 0))
{
- HIDH_TRACE_ERROR0 ("Security Registration 6 failed");
+ HIDH_TRACE_ERROR ("Security Registration 6 failed");
return (HID_ERR_NO_RESOURCES);
}
@@ -570,7 +570,7 @@
if ((p_inq_info->results.dev_class[1] & BTM_COD_MAJOR_CLASS_MASK)
== BTM_COD_MAJOR_PERIPHERAL )
{
- HIDH_TRACE_DEBUG0("hid_known_hid_device:dev found in InqDB & COD matches HID dev");
+ HIDH_TRACE_DEBUG("hid_known_hid_device:dev found in InqDB & COD matches HID dev");
return TRUE;
}
}
@@ -581,7 +581,7 @@
if ((p_dev_rec != NULL) &&
((p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK) == BTM_COD_MAJOR_PERIPHERAL ))
{
- HIDH_TRACE_DEBUG0("hid_known_hid_device:dev found in SecDevDB & COD matches HID dev");
+ HIDH_TRACE_DEBUG("hid_known_hid_device:dev found in SecDevDB & COD matches HID dev");
return TRUE;
}
}
@@ -594,6 +594,6 @@
return TRUE;
}
/* Check if this device is marked as HID Device in IOP Dev */
- HIDH_TRACE_DEBUG0("hid_known_hid_device:remote is not HID device");
+ HIDH_TRACE_DEBUG("hid_known_hid_device:remote is not HID device");
return FALSE;
}
diff --git a/stack/hid/hidh_conn.c b/stack/hid/hidh_conn.c
index 86b41d3..853e3ed 100644
--- a/stack/hid/hidh_conn.c
+++ b/stack/hid/hidh_conn.c
@@ -98,13 +98,13 @@
/* Now, register with L2CAP */
if (!L2CA_Register (HID_PSM_CONTROL, (tL2CAP_APPL_INFO *) &hst_reg_info))
{
- HIDH_TRACE_ERROR0 ("HID Control Registration failed");
+ HIDH_TRACE_ERROR ("HID-Host Control Registration failed");
return (HID_ERR_L2CAP_FAILED) ;
}
if (!L2CA_Register (HID_PSM_INTERRUPT, (tL2CAP_APPL_INFO *) &hst_reg_info))
{
L2CA_Deregister( HID_PSM_CONTROL ) ;
- HIDH_TRACE_ERROR0 ("HID Interrupt Registration failed");
+ HIDH_TRACE_ERROR ("HID-Host Interrupt Registration failed");
return (HID_ERR_L2CAP_FAILED) ;
}
@@ -130,17 +130,19 @@
{
tHID_CONN *p_hcon = &hh_cb.devices[dhandle].conn;
- HIDH_TRACE_EVENT0 ("HID-Host disconnect");
+ HIDH_TRACE_EVENT ("HID-Host disconnect");
if ((p_hcon->ctrl_cid != 0) || (p_hcon->intr_cid != 0))
{
p_hcon->conn_state = HID_CONN_STATE_DISCONNECTING;
+ /* Set l2cap idle timeout to 0 (so ACL link is disconnected
+ * immediately after last channel is closed) */
+ L2CA_SetIdleTimeoutByBdAddr(hh_cb.devices[dhandle].addr, 0);
/* Disconnect both interrupt and control channels */
if (p_hcon->intr_cid)
L2CA_DisconnectReq (p_hcon->intr_cid);
-
- if (p_hcon->ctrl_cid)
+ else if (p_hcon->ctrl_cid)
L2CA_DisconnectReq (p_hcon->ctrl_cid);
}
else
@@ -161,10 +163,11 @@
** send security block L2C connection response.
**
*******************************************************************************/
-void hidh_sec_check_complete_term (BD_ADDR bd_addr, void *p_ref_data, UINT8 res)
+void hidh_sec_check_complete_term (BD_ADDR bd_addr, tBT_TRANSPORT transport, void *p_ref_data, UINT8 res)
{
tHID_HOST_DEV_CTB *p_dev= (tHID_HOST_DEV_CTB *) p_ref_data;
UNUSED(bd_addr);
+ UNUSED (transport);
if( res == BTM_SUCCESS && p_dev->conn.conn_state == HID_CONN_STATE_SECURITY )
{
@@ -206,7 +209,7 @@
UINT8 i = HID_HOST_MAX_DEVICES;
tHID_HOST_DEV_CTB *p_dev;
- HIDH_TRACE_EVENT2 ("HID-Host Rcvd L2CAP conn ind, PSM: 0x%04x CID 0x%x", psm, l2cap_cid);
+ HIDH_TRACE_EVENT ("HID-Host Rcvd L2CAP conn ind, PSM: 0x%04x CID 0x%x", psm, l2cap_cid);
/* always add incoming connection device into HID database by default */
if (HID_HostAddDev(bd_addr, HID_SEC_REQUIRED, &i) != HID_SUCCESS)
@@ -223,12 +226,12 @@
{
if (p_hcon->ctrl_cid == 0)
{
- HIDH_TRACE_WARNING0 ("HID-Host Rcvd INTR L2CAP conn ind, but no CTL channel");
+ HIDH_TRACE_WARNING ("HID-Host Rcvd INTR L2CAP conn ind, but no CTL channel");
bAccept = FALSE;
}
if (p_hcon->conn_state != HID_CONN_STATE_CONNECTING_INTR)
{
- HIDH_TRACE_WARNING1 ("HID-Host Rcvd INTR L2CAP conn ind, wrong state: %d",
+ HIDH_TRACE_WARNING ("HID-Host Rcvd INTR L2CAP conn ind, wrong state: %d",
p_hcon->conn_state);
bAccept = FALSE;
}
@@ -241,7 +244,7 @@
#else
if (p_hcon->conn_state != HID_CONN_STATE_UNUSED)
{
- HIDH_TRACE_WARNING1 ("HID-Host - Rcvd CTL L2CAP conn ind, wrong state: %d",
+ HIDH_TRACE_WARNING ("HID-Host - Rcvd CTL L2CAP conn ind, wrong state: %d",
p_hcon->conn_state);
bAccept = FALSE;
}
@@ -283,7 +286,7 @@
/* Send a Configuration Request. */
L2CA_ConfigReq (l2cap_cid, &hh_cb.l2cap_cfg);
- HIDH_TRACE_EVENT2 ("HID-Host Rcvd L2CAP conn ind, sent config req, PSM: 0x%04x CID 0x%x",
+ HIDH_TRACE_EVENT ("HID-Host Rcvd L2CAP conn ind, sent config req, PSM: 0x%04x CID 0x%x",
psm, l2cap_cid);
}
@@ -314,7 +317,7 @@
** Returns void
**
*******************************************************************************/
-void hidh_sec_check_complete_orig (BD_ADDR bd_addr, void *p_ref_data, UINT8 res)
+void hidh_sec_check_complete_orig (BD_ADDR bd_addr, tBT_TRANSPORT transport, void *p_ref_data, UINT8 res)
{
tHID_HOST_DEV_CTB *p_dev = (tHID_HOST_DEV_CTB *) p_ref_data;
UINT8 dhandle;
@@ -323,27 +326,19 @@
#endif
UINT32 reason;
UNUSED(bd_addr);
+ UNUSED (transport);
dhandle = ((UINT32)p_dev - (UINT32)&(hh_cb.devices[0]))/ sizeof(tHID_HOST_DEV_CTB);
if( res == BTM_SUCCESS && p_dev->conn.conn_state == HID_CONN_STATE_SECURITY )
{
- HIDH_TRACE_EVENT0 ("HID-Host Originator security pass.");
+ HIDH_TRACE_EVENT ("HID-Host Originator security pass.");
p_dev->conn.disc_reason = HID_SUCCESS; /* Authentication passed. Reset disc_reason (from HID_ERR_AUTH_FAILED) */
- /* Check if L2CAP started the connection process for interrupt channel */
- if ((p_dev->conn.intr_cid = L2CA_ConnectReq (HID_PSM_INTERRUPT, hh_cb.devices[dhandle].addr)) == 0)
- {
- HIDH_TRACE_WARNING0 ("HID-Host INTR Originate failed");
- reason = HID_L2CAP_REQ_FAIL ;
- hidh_conn_disconnect (dhandle);
- hh_cb.callback( dhandle, hh_cb.devices[dhandle].addr, HID_HDEV_EVT_CLOSE, reason, NULL ) ;
- return;
- }
- else
- {
- /* Transition to the next appropriate state, waiting for connection confirm on control channel. */
- p_dev->conn.conn_state = HID_CONN_STATE_CONNECTING_INTR;
- }
+ /* Transition to the next appropriate state, configuration */
+ p_dev->conn.conn_state = HID_CONN_STATE_CONFIG;
+ L2CA_ConfigReq (p_dev->conn.ctrl_cid, &hh_cb.l2cap_cfg);
+ HIDH_TRACE_EVENT ("HID-Host Got Control conn cnf, sent cfg req, CID: 0x%x", p_dev->conn.ctrl_cid);
+
}
if( res != BTM_SUCCESS && p_dev->conn.conn_state == HID_CONN_STATE_SECURITY )
@@ -394,9 +389,10 @@
if ((p_hcon == NULL)
|| (!(p_hcon->conn_flags & HID_CONN_FLAGS_IS_ORIG))
|| ((l2cap_cid == p_hcon->ctrl_cid) && (p_hcon->conn_state != HID_CONN_STATE_CONNECTING_CTRL))
- || ((l2cap_cid == p_hcon->intr_cid) && (p_hcon->conn_state != HID_CONN_STATE_CONNECTING_INTR)))
+ || ((l2cap_cid == p_hcon->intr_cid) && (p_hcon->conn_state != HID_CONN_STATE_CONNECTING_INTR)
+ && (p_hcon->conn_state != HID_CONN_STATE_DISCONNECTING)))
{
- HIDH_TRACE_WARNING1 ("HID-Host Rcvd unexpected conn cnf, CID 0x%x ", l2cap_cid);
+ HIDH_TRACE_WARNING ("HID-Host Rcvd unexpected conn cnf, CID 0x%x ", l2cap_cid);
return;
}
@@ -439,12 +435,11 @@
else
{
p_hcon->conn_state = HID_CONN_STATE_CONFIG;
+ /* Send a Configuration Request. */
+ L2CA_ConfigReq (l2cap_cid, &hh_cb.l2cap_cfg);
+ HIDH_TRACE_EVENT ("HID-Host got Interrupt conn cnf, sent cfg req, CID: 0x%x", l2cap_cid);
}
- /* Send a Configuration Request. */
- L2CA_ConfigReq (l2cap_cid, &hh_cb.l2cap_cfg);
-
- HIDH_TRACE_EVENT1 ("HID-Host got CTRL conn cnf, sent cfg req, CID: 0x%x", l2cap_cid);
return;
}
@@ -463,6 +458,7 @@
UINT8 dhandle;
tHID_CONN *p_hcon = NULL;
tHID_HOST_DEV_CTB *p_dev;
+ UINT32 reason;
/* Find CCB based on CID */
if( (dhandle = find_conn_by_cid(l2cap_cid)) < HID_HOST_MAX_DEVICES )
@@ -473,11 +469,11 @@
if (p_hcon == NULL)
{
- HIDH_TRACE_WARNING1 ("HID-Host Rcvd L2CAP cfg ind, unknown CID: 0x%x", l2cap_cid);
+ HIDH_TRACE_WARNING ("HID-Host Rcvd L2CAP cfg ind, unknown CID: 0x%x", l2cap_cid);
return;
}
- HIDH_TRACE_EVENT1 ("HID-Host Rcvd cfg ind, sent cfg cfm, CID: 0x%x", l2cap_cid);
+ HIDH_TRACE_EVENT ("HID-Host Rcvd cfg ind, sent cfg cfm, CID: 0x%x", l2cap_cid);
/* Remember the remote MTU size */
if ((!p_cfg->mtu_present) || (p_cfg->mtu > HID_HOST_MTU))
@@ -493,7 +489,29 @@
L2CA_ConfigRsp (l2cap_cid, p_cfg);
if (l2cap_cid == p_hcon->ctrl_cid)
+ {
p_hcon->conn_flags |= HID_CONN_FLAGS_HIS_CTRL_CFG_DONE;
+ if ((p_hcon->conn_flags & HID_CONN_FLAGS_IS_ORIG) &&
+ (p_hcon->conn_flags & HID_CONN_FLAGS_MY_CTRL_CFG_DONE))
+ {
+ /* Connect interrupt channel */
+ p_hcon->disc_reason = HID_L2CAP_CONN_FAIL; /* Reset initial reason for CLOSE_EVT: Connection Attempt was made but failed */
+ if ((p_hcon->intr_cid = L2CA_ConnectReq (HID_PSM_INTERRUPT, hh_cb.devices[dhandle].addr)) == 0)
+ {
+ HIDH_TRACE_WARNING ("HID-Host INTR Originate failed");
+ reason = HID_L2CAP_REQ_FAIL ;
+ p_hcon->conn_state = HID_CONN_STATE_UNUSED;
+ hidh_conn_disconnect (dhandle);
+ hh_cb.callback( dhandle, hh_cb.devices[dhandle].addr, HID_HDEV_EVT_CLOSE, reason, NULL ) ;
+ return;
+ }
+ else
+ {
+ /* Transition to the next appropriate state, waiting for connection confirm on interrupt channel. */
+ p_hcon->conn_state = HID_CONN_STATE_CONNECTING_INTR;
+ }
+ }
+ }
else
p_hcon->conn_flags |= HID_CONN_FLAGS_HIS_INTR_CFG_DONE;
@@ -502,6 +520,8 @@
&& (p_hcon->conn_state == HID_CONN_STATE_CONFIG))
{
p_hcon->conn_state = HID_CONN_STATE_CONNECTED;
+ /* Reset disconnect reason to success, as connection successful */
+ p_hcon->disc_reason = HID_SUCCESS;
hh_cb.devices[dhandle].state = HID_DEV_CONNECTED;
hh_cb.callback( dhandle, hh_cb.devices[dhandle].addr, HID_HDEV_EVT_OPEN, 0, NULL ) ;
@@ -525,7 +545,7 @@
tHID_CONN *p_hcon = NULL;
UINT32 reason;
- HIDH_TRACE_EVENT2 ("HID-Host Rcvd cfg cfm, CID: 0x%x Result: %d", l2cap_cid, p_cfg->result);
+ HIDH_TRACE_EVENT ("HID-Host Rcvd cfg cfm, CID: 0x%x Result: %d", l2cap_cid, p_cfg->result);
/* Find CCB based on CID */
if( (dhandle = find_conn_by_cid(l2cap_cid)) < HID_HOST_MAX_DEVICES )
@@ -533,7 +553,7 @@
if (p_hcon == NULL)
{
- HIDH_TRACE_WARNING1 ("HID-Host Rcvd L2CAP cfg ind, unknown CID: 0x%x", l2cap_cid);
+ HIDH_TRACE_WARNING ("HID-Host Rcvd L2CAP cfg ind, unknown CID: 0x%x", l2cap_cid);
return;
}
@@ -547,7 +567,29 @@
}
if (l2cap_cid == p_hcon->ctrl_cid)
+ {
p_hcon->conn_flags |= HID_CONN_FLAGS_MY_CTRL_CFG_DONE;
+ if ((p_hcon->conn_flags & HID_CONN_FLAGS_IS_ORIG) &&
+ (p_hcon->conn_flags & HID_CONN_FLAGS_HIS_CTRL_CFG_DONE))
+ {
+ /* Connect interrupt channel */
+ p_hcon->disc_reason = HID_L2CAP_CONN_FAIL; /* Reset initial reason for CLOSE_EVT: Connection Attempt was made but failed */
+ if ((p_hcon->intr_cid = L2CA_ConnectReq (HID_PSM_INTERRUPT, hh_cb.devices[dhandle].addr)) == 0)
+ {
+ HIDH_TRACE_WARNING ("HID-Host INTR Originate failed");
+ reason = HID_L2CAP_REQ_FAIL ;
+ p_hcon->conn_state = HID_CONN_STATE_UNUSED;
+ hidh_conn_disconnect (dhandle);
+ hh_cb.callback( dhandle, hh_cb.devices[dhandle].addr, HID_HDEV_EVT_CLOSE, reason, NULL ) ;
+ return;
+ }
+ else
+ {
+ /* Transition to the next appropriate state, waiting for connection confirm on interrupt channel. */
+ p_hcon->conn_state = HID_CONN_STATE_CONNECTING_INTR;
+ }
+ }
+ }
else
p_hcon->conn_flags |= HID_CONN_FLAGS_MY_INTR_CFG_DONE;
@@ -556,6 +598,8 @@
&& (p_hcon->conn_state == HID_CONN_STATE_CONFIG))
{
p_hcon->conn_state = HID_CONN_STATE_CONNECTED;
+ /* Reset disconnect reason to success, as connection successful */
+ p_hcon->disc_reason = HID_SUCCESS;
hh_cb.devices[dhandle].state = HID_DEV_CONNECTED;
hh_cb.callback( dhandle, hh_cb.devices[dhandle].addr, HID_HDEV_EVT_OPEN, 0, NULL ) ;
@@ -586,14 +630,14 @@
if (p_hcon == NULL)
{
- HIDH_TRACE_WARNING1 ("HID-Host Rcvd L2CAP disc, unknown CID: 0x%x", l2cap_cid);
+ HIDH_TRACE_WARNING ("HID-Host Rcvd L2CAP disc, unknown CID: 0x%x", l2cap_cid);
return;
}
if (ack_needed)
L2CA_DisconnectRsp (l2cap_cid);
- HIDH_TRACE_EVENT1 ("HID-Host Rcvd L2CAP disc, CID: 0x%x", l2cap_cid);
+ HIDH_TRACE_EVENT ("HID-Host Rcvd L2CAP disc, CID: 0x%x", l2cap_cid);
p_hcon->conn_state = HID_CONN_STATE_DISCONNECTING;
@@ -618,6 +662,7 @@
hh_cb.devices[dhandle].conn_tries = 0;
hh_cb.devices[dhandle].conn.timer_entry.param = (UINT32) dhandle;
btu_start_timer (&(hh_cb.devices[dhandle].conn.timer_entry), BTU_TTYPE_HID_HOST_REPAGE_TO, HID_HOST_REPAGE_WIN);
+ hh_cb.callback( dhandle, hh_cb.devices[dhandle].addr, HID_HDEV_EVT_CLOSE, disc_res, NULL);
}
else
#endif
@@ -665,16 +710,23 @@
if (p_hcon == NULL)
{
- HIDH_TRACE_WARNING1 ("HID-Host Rcvd L2CAP disc cfm, unknown CID: 0x%x", l2cap_cid);
+ HIDH_TRACE_WARNING ("HID-Host Rcvd L2CAP disc cfm, unknown CID: 0x%x", l2cap_cid);
return;
}
- HIDH_TRACE_EVENT1 ("HID-Host Rcvd L2CAP disc cfm, CID: 0x%x", l2cap_cid);
+ HIDH_TRACE_EVENT ("HID-Host Rcvd L2CAP disc cfm, CID: 0x%x", l2cap_cid);
if (l2cap_cid == p_hcon->ctrl_cid)
p_hcon->ctrl_cid = 0;
else
+ {
p_hcon->intr_cid = 0;
+ if (p_hcon->ctrl_cid)
+ {
+ HIDH_TRACE_EVENT ("HID-Host Initiating L2CAP Ctrl disconnection");
+ L2CA_DisconnectReq (p_hcon->ctrl_cid);
+ }
+ }
if ((p_hcon->ctrl_cid == 0) && (p_hcon->intr_cid == 0))
{
@@ -705,11 +757,11 @@
if (p_hcon == NULL)
{
- HIDH_TRACE_WARNING1 ("HID-Host Rcvd L2CAP congestion status, unknown CID: 0x%x", l2cap_cid);
+ HIDH_TRACE_WARNING ("HID-Host Rcvd L2CAP congestion status, unknown CID: 0x%x", l2cap_cid);
return;
}
- HIDH_TRACE_EVENT2 ("HID-Host Rcvd L2CAP congestion status, CID: 0x%x Cong: %d", l2cap_cid, congested);
+ HIDH_TRACE_EVENT ("HID-Host Rcvd L2CAP congestion status, CID: 0x%x Cong: %d", l2cap_cid, congested);
if (congested)
p_hcon->conn_flags |= HID_CONN_FLAGS_CONGESTED;
@@ -743,7 +795,7 @@
UINT8 dhandle;
tHID_CONN *p_hcon = NULL;
- HIDH_TRACE_DEBUG1 ("HID-Host hidh_l2cif_data_ind [l2cap_cid=0x%04x]", l2cap_cid);
+ HIDH_TRACE_DEBUG ("HID-Host hidh_l2cif_data_ind [l2cap_cid=0x%04x]", l2cap_cid);
/* Find CCB based on CID */
if ((dhandle = find_conn_by_cid(l2cap_cid)) < HID_HOST_MAX_DEVICES)
@@ -751,7 +803,7 @@
if (p_hcon == NULL)
{
- HIDH_TRACE_WARNING1 ("HID-Host Rcvd L2CAP data, unknown CID: 0x%x", l2cap_cid);
+ HIDH_TRACE_WARNING ("HID-Host Rcvd L2CAP data, unknown CID: 0x%x", l2cap_cid);
GKI_freebuf (p_msg);
return;
}
@@ -831,6 +883,13 @@
UINT8 use_data = 0 ;
BOOLEAN blank_datc = FALSE;
+ if (!BTM_IsAclConnectionUp(hh_cb.devices[dhandle].addr, BT_TRANSPORT_BR_EDR))
+ {
+ if (buf)
+ GKI_freebuf ((void *)buf);
+ return( HID_ERR_NO_CONNECTION );
+ }
+
if (p_hcon->conn_flags & HID_CONN_FLAGS_CONGESTED)
{
if (buf)
@@ -977,7 +1036,7 @@
/* Check if L2CAP started the connection process */
if ((p_dev->conn.ctrl_cid = L2CA_ConnectReq (HID_PSM_CONTROL, p_dev->addr)) == 0)
{
- HIDH_TRACE_WARNING0 ("HID-Host Originate failed");
+ HIDH_TRACE_WARNING ("HID-Host Originate failed");
hh_cb.callback( dhandle, hh_cb.devices[dhandle].addr, HID_HDEV_EVT_CLOSE,
HID_ERR_L2CAP_FAILED, NULL ) ;
}
diff --git a/stack/include/avdt_api.h b/stack/include/avdt_api.h
index beaecf6..93ed6ae 100644
--- a/stack/include/avdt_api.h
+++ b/stack/include/avdt_api.h
@@ -454,6 +454,35 @@
*******************************************************************************/
AVDT_API extern void AVDT_Deregister(void);
+
+/*******************************************************************************
+**
+** Function AVDT_SINK_Activate
+**
+** Description Activate SEP of A2DP Sink. In Use parameter is adjusted.
+** In Use will be made false in case of activation. A2DP SRC
+** will receive in_use as false and can open A2DP Sink
+** connection
+**
+** Returns void
+**
+*******************************************************************************/
+AVDT_API extern void AVDT_SINK_Activate(void);
+
+/*******************************************************************************
+**
+** Function AVDT_SINK_Deactivate
+**
+** Description Deactivate SEP of A2DP Sink. In Use parameter is adjusted.
+** In Use will be made TRUE in case of activation. A2DP SRC
+** will receive in_use as true and will not open A2DP Sink
+** connection
+**
+** Returns void.
+**
+*******************************************************************************/
+AVDT_API extern void AVDT_SINK_Deactivate(void);
+
/*******************************************************************************
**
** Function AVDT_CreateStream
diff --git a/stack/include/bt_types.h b/stack/include/bt_types.h
index 33fb884..617eaf3 100644
--- a/stack/include/bt_types.h
+++ b/stack/include/bt_types.h
@@ -128,6 +128,12 @@
#define BT_EVT_TO_NFCCSIM_NCI 0x4a00 /* events to NFCC simulation (NCI packets) */
+/* start timer */
+#define BT_EVT_TO_START_TIMER_ONESHOT 0x4c00
+
+/* stop timer */
+#define BT_EVT_TO_STOP_TIMER_ONESHOT 0x4d00
+
/* HCISU Events */
#define BT_EVT_HCISU 0x5000
@@ -199,10 +205,11 @@
*/
typedef struct
{
- UINT16 event;
- UINT16 len;
- UINT16 offset;
- UINT16 layer_specific;
+ uint16_t event;
+ uint16_t len;
+ uint16_t offset;
+ uint16_t layer_specific;
+ uint8_t data[];
} BT_HDR;
#define BT_HDR_SIZE (sizeof (BT_HDR))
@@ -497,6 +504,10 @@
#define BLE_ADDR_TYPE_MASK (BLE_ADDR_RANDOM | BLE_ADDR_PUBLIC)
typedef UINT8 tBLE_ADDR_TYPE;
+#define BT_TRANSPORT_BR_EDR 1
+#define BT_TRANSPORT_LE 2
+typedef UINT8 tBT_TRANSPORT;
+
#define BLE_ADDR_IS_STATIC(x) ((x[0] & 0xC0) == 0xC0)
typedef struct
diff --git a/stack/include/btm_api.h b/stack/include/btm_api.h
index f4b17d4..dbd0fb2 100644
--- a/stack/include/btm_api.h
+++ b/stack/include/btm_api.h
@@ -200,20 +200,20 @@
/* BTM_IsInquiryActive return values (Bit Mask)
* Note: These bit masks are associated with the inquiry modes (BTM_*_INQUIRY) */
#define BTM_INQUIRY_INACTIVE 0x0 /* no inquiry in progress */
-#define BTM_GENERAL_INQUIRY_ACTIVE 0x1 /* a general inquiry is in progress */
-#define BTM_LIMITED_INQUIRY_ACTIVE 0x2 /* a limited inquiry is in progress */
+#define BTM_GENERAL_INQUIRY_ACTIVE BTM_GENERAL_INQUIRY /* a general inquiry is in progress */
+#define BTM_LIMITED_INQUIRY_ACTIVE BTM_LIMITED_INQUIRY /* a limited inquiry is in progress */
#define BTM_PERIODIC_INQUIRY_ACTIVE 0x8 /* a periodic inquiry is active */
#define BTM_SSP_INQUIRY_ACTIVE 0x4 /* SSP is active, so inquiry is disallowed (work around for FW bug) */
-#define BTM_LE_GENERAL_INQUIRY_ACTIVE 0x10 /* a general inquiry is in progress */
-#define BTM_LE_LIMITED_INQUIRY_ACTIVE 0x20 /* a limited inquiry is in progress */
-#define BTM_LE_SELECT_CONN_ACTIVE 0x40 /* selection connection is in progress */
-#define BTM_LE_OBSERVE_ACTIVE 0x80 /* selection connection is in progress */
+#define BTM_LE_GENERAL_INQUIRY_ACTIVE BTM_BLE_GENERAL_INQUIRY /* a general inquiry is in progress */
+#define BTM_LE_LIMITED_INQUIRY_ACTIVE BTM_BLE_LIMITED_INQUIRY /* a limited inquiry is in progress */
+#define BTM_LE_SELECT_CONN_ACTIVE 0x40 /* selection connection is in progress */
+#define BTM_LE_OBSERVE_ACTIVE 0x80 /* selection connection is in progress */
/* inquiry activity mask */
-#define BTM_BR_INQ_ACTIVE_MASK (BTM_GENERAL_INQUIRY_ACTIVE|BTM_LIMITED_INQUIRY_ACTIVE|BTM_PERIODIC_INQUIRY_ACTIVE) /* BR/EDR inquiry activity mask */
-#define BTM_LE_SCAN_ACTIVE_MASK 0xF0 /* LE scan activity mask */
-#define BTM_LE_INQ_ACTIVE_MASK (BTM_LE_GENERAL_INQUIRY_ACTIVE|BTM_LE_LIMITED_INQUIRY_ACTIVE) /* LE inquiry activity mask*/
-#define BTM_INQUIRY_ACTIVE_MASK (BTM_BR_INQ_ACTIVE_MASK | BTM_LE_INQ_ACTIVE_MASK) /* inquiry activity mask */
+#define BTM_BR_INQ_ACTIVE_MASK (BTM_GENERAL_INQUIRY_ACTIVE|BTM_LIMITED_INQUIRY_ACTIVE|BTM_PERIODIC_INQUIRY_ACTIVE) /* BR/EDR inquiry activity mask */
+#define BTM_BLE_SCAN_ACTIVE_MASK 0xF0 /* LE scan activity mask */
+#define BTM_BLE_INQ_ACTIVE_MASK (BTM_LE_GENERAL_INQUIRY_ACTIVE|BTM_LE_LIMITED_INQUIRY_ACTIVE) /* LE inquiry activity mask*/
+#define BTM_INQUIRY_ACTIVE_MASK (BTM_BR_INQ_ACTIVE_MASK | BTM_BLE_INQ_ACTIVE_MASK) /* inquiry activity mask */
/* Define scan types */
#define BTM_SCAN_TYPE_STANDARD 0
@@ -659,6 +659,7 @@
typedef struct
{
UINT16 status;
+ BD_ADDR bd_addr;
UINT16 length;
BD_NAME remote_bd_name;
} tBTM_REMOTE_DEV_NAME;
@@ -837,6 +838,10 @@
DEV_CLASS_PTR p_dc; /* The device class */
BD_NAME_PTR p_bdn; /* The device name */
UINT8 *p_features; /* pointer to the remote device's features page[0] (supported features page) */
+#if BLE_INCLUDED == TRUE
+ UINT16 handle; /* connection handle */
+ tBT_TRANSPORT transport; /* link is LE or not */
+#endif
} tBTM_BL_CONN_DATA;
/* the data type associated with BTM_BL_DISCN_EVT */
@@ -844,6 +849,10 @@
{
tBTM_BL_EVENT event; /* The event reported. */
BD_ADDR_PTR p_bda; /* The address of the disconnected device */
+#if BLE_INCLUDED == TRUE
+ UINT16 handle; /* disconnected connection handle */
+ tBT_TRANSPORT transport; /* link is LE link or not */
+#endif
} tBTM_BL_DISCN_DATA;
/* Busy-Level shall have the inquiry_paging mask set when
@@ -893,10 +902,16 @@
** changes. First param is BD address, second is if added or removed.
** Registered through BTM_AclRegisterForChanges call.
*/
+#if BLE_INCLUDED == TRUE
+typedef void (tBTM_ACL_DB_CHANGE_CB) (BD_ADDR p_bda, DEV_CLASS p_dc,
+ BD_NAME p_bdn, UINT8 *features,
+ BOOLEAN is_new, UINT16 handle,
+ tBT_TRANSPORT transport);
+#else
typedef void (tBTM_ACL_DB_CHANGE_CB) (BD_ADDR p_bda, DEV_CLASS p_dc,
BD_NAME p_bdn, UINT8 *features,
BOOLEAN is_new);
-
+#endif
/*****************************************************************************
** SCO CHANNEL MANAGEMENT
*****************************************************************************/
@@ -1565,7 +1580,8 @@
** optional data passed in by BTM_SetEncryption
** tBTM_STATUS - result of the operation
*/
-typedef void (tBTM_SEC_CBACK) (BD_ADDR bd_addr, void *p_ref_data, tBTM_STATUS result);
+typedef void (tBTM_SEC_CBACK) (BD_ADDR bd_addr, tBT_TRANSPORT trasnport,
+ void *p_ref_data, tBTM_STATUS result);
/* Bond Cancel complete. Parameters are
** Result of the cancel operation
@@ -1897,73 +1913,6 @@
#define BTM_VSC_NFC_SUPPORTED(x) ((x)[BTM_FEATURE_NFC_OFF] & BTM_FEATURE_NFC_MASK)
-/************************
-** Dual-Stack support
-*************************/
-/* BTM_SYNC_FAIL_EVT reason codes */
-#define BTM_SYNC_SUCCESS 0
-#define BTM_SYNC_FAIL_BTE_SWITCH_REJECTED 1
-#define BTM_SYNC_FAIL_TRANS_PAUSE 2
-#define BTM_SYNC_FAIL_CORE_SYNC 3
-#define BTM_SYNC_FAIL_BTA_SYNC 4
-#define BTM_SYNC_FAIL_TRANS_RESUME 5
-#define BTM_SYNC_FAIL_RESYNC 6
-#define BTM_SYNC_FAIL_ERROR 7
-#define BTM_SYNC_FAIL_UIPC_OPEN 8
-typedef UINT8 tBTM_SYNC_STATUS;
-
-/* Direction of sync (used by BTM_SyncStack) */
-#define BTM_SW_BB_TO_MM 0
-#define BTM_SW_TO_BB 1 /* Switch back to baseband stack (from either MM or BTC host) */
-#define BTM_SW_RESYNC 2
-#define BTM_SW_BB_TO_BTC 3 /* Switch from baseband stack to Bluetooth Controller Host stack */
-#define BTM_SW_MM_TO_BB 4
-#define BTM_SW_BTC_TO_BB 5
-typedef UINT8 tBTM_SW_DIR;
-
-/* Stack synchronization events (returned by tBTM_SYNC_STACK_CBACK callback) */
-#define BTM_SYNC_CPLT_EVT 0
-#define BTM_SYNC_BTA_EVT 1
-#define BTM_RESYNC_CPLT_EVT 2
-#define BTM_UIPC_OPENED_EVT 3
-#define BTM_UIPC_CLOSED_EVT 4
-typedef UINT8 tBTM_SYNC_STACK_EVT;
-
-/* Synchronization info from BTA/application that will be sent when calling BTE sync request functions */
-typedef struct
-{
- tBTM_SW_DIR dir;
- UINT16 lcid[BTM_SYNC_INFO_NUM_STR];
- UINT8 avdt_handle[BTM_SYNC_INFO_NUM_STR];
-} tBTM_SYNC_INFO;
-
-/* Stack synchonization callback function
-** Parameters are
-** event: stack synchronization event
-** status: BTM_SUCCESS if event was successful
-*/
-typedef void (*tBTM_SYNC_STACK_CBACK)(tBTM_SYNC_STACK_EVT event, tBTM_SYNC_STATUS status);
-
-
-/* Sync complete callback function. Called by bte layers after synchronization is complete
-** so that BTM_SYNC can procede with the next step for switching stack to MM
-**
-** Parameters are
-** status: BTM_SUCCESS if synchronization was successful
-*/
-typedef void (*tBTM_SYNC_CPLT_CBACK)(tBTM_STATUS status);
-
-
-
-/* IPC event callback function. Called by BTM when an IPC event is received.
-** These events are currently sent to DM through the callback function.
-**
-** Parameters are
-** status: BTM_SUCCESS if synchronization was successful
-** p_data: Actual message in the IPC
-*/
-typedef void (tBTM_IPC_EVT_CBACK)(tBTM_STATUS status, BT_HDR *p_data);
-
/* MIP evnets, callbacks */
enum
{
@@ -2027,6 +1976,12 @@
/* MIP Device query callback function */
typedef BOOLEAN (tBTM_MIP_QUERY_CB) (BD_ADDR dev_addr, UINT8 *p_mode, LINK_KEY link_key);
+#define BTM_CONTRL_ACTIVE 1 /* ACL link on, SCO link ongoing, sniff mode */
+#define BTM_CONTRL_SCAN 2 /* Scan state - paging/inquiry/trying to connect*/
+#define BTM_CONTRL_IDLE 3 /* Idle state - page scan, LE advt, inquiry scan */
+
+typedef UINT8 tBTM_CONTRL_STATE;
+
/*****************************************************************************
** EXTERNAL FUNCTION DECLARATIONS
*****************************************************************************/
@@ -2659,7 +2614,8 @@
**
*******************************************************************************/
BTM_API extern tBTM_STATUS BTM_ReadRemoteDeviceName (BD_ADDR remote_bda,
- tBTM_CMPL_CB *p_cb);
+ tBTM_CMPL_CB *p_cb,
+ tBT_TRANSPORT transport);
/*******************************************************************************
@@ -3187,7 +3143,7 @@
** Returns TRUE if connection is up, else FALSE.
**
*******************************************************************************/
- BTM_API extern BOOLEAN BTM_IsAclConnectionUp (BD_ADDR remote_bda);
+ BTM_API extern BOOLEAN BTM_IsAclConnectionUp (BD_ADDR remote_bda, tBT_TRANSPORT transport);
/*******************************************************************************
@@ -3273,7 +3229,8 @@
** BTM_BUSY if command is already in progress
**
*******************************************************************************/
- BTM_API extern tBTM_STATUS BTM_ReadTxPower (BD_ADDR remote_bda, tBTM_CMPL_CB *p_cb);
+ BTM_API extern tBTM_STATUS BTM_ReadTxPower (BD_ADDR remote_bda,
+ tBT_TRANSPORT transport, tBTM_CMPL_CB *p_cb);
/*******************************************************************************
**
@@ -3640,7 +3597,8 @@
** Returns TRUE if registered OK, else FALSE
**
*******************************************************************************/
- BTM_API extern BOOLEAN BTM_SecRegisterLinkKeyNotificationCallback (tBTM_LINK_KEY_CALLBACK *p_callback);
+ BTM_API extern BOOLEAN BTM_SecRegisterLinkKeyNotificationCallback (
+ tBTM_LINK_KEY_CALLBACK *p_callback);
/*******************************************************************************
@@ -3653,7 +3611,8 @@
** Returns TRUE if registered OK, else FALSE
**
*******************************************************************************/
- BTM_API extern BOOLEAN BTM_SecAddRmtNameNotifyCallback (tBTM_RMT_NAME_CALLBACK *p_callback);
+ BTM_API extern BOOLEAN BTM_SecAddRmtNameNotifyCallback (
+ tBTM_RMT_NAME_CALLBACK *p_callback);
/*******************************************************************************
@@ -3666,7 +3625,8 @@
** Returns TRUE if OK, else FALSE
**
*******************************************************************************/
- BTM_API extern BOOLEAN BTM_SecDeleteRmtNameNotifyCallback (tBTM_RMT_NAME_CALLBACK *p_callback);
+ BTM_API extern BOOLEAN BTM_SecDeleteRmtNameNotifyCallback (
+ tBTM_RMT_NAME_CALLBACK *p_callback);
/*******************************************************************************
@@ -3709,6 +3669,22 @@
/*******************************************************************************
**
+** Function BTM_GetSecurityFlagsByTransport
+**
+** Description Get security flags for the device on a particular transport
+**
+** Parameters bd_addr: BD address of remote device
+** p_sec_flags : Out parameter to be filled with security flags for the connection
+** transport : Physical transport of the connection (BR/EDR or LE)
+**
+** Returns BOOLEAN TRUE or FALSE is device found
+**
+*******************************************************************************/
+ BTM_API extern BOOLEAN BTM_GetSecurityFlagsByTransport (BD_ADDR bd_addr,
+ UINT8 * p_sec_flags, tBT_TRANSPORT transport);
+
+/*******************************************************************************
+**
** Function BTM_ReadTrustedMask
**
** Description Get trusted mask for the device
@@ -3789,9 +3765,10 @@
** Returns TRUE if registered OK, else FALSE
**
*******************************************************************************/
- BTM_API extern BOOLEAN BTM_SetUCDSecurityLevel (BOOLEAN is_originator, char *p_name, UINT8 service_id,
- UINT16 sec_level, UINT16 psm, UINT32 mx_proto_id,
- UINT32 mx_chan_id);
+ BTM_API extern BOOLEAN BTM_SetUCDSecurityLevel (BOOLEAN is_originator, char *p_name,
+ UINT8 service_id, UINT16 sec_level,
+ UINT16 psm, UINT32 mx_proto_id,
+ UINT32 mx_chan_id);
/*******************************************************************************
**
@@ -3951,10 +3928,37 @@
**
** Description This function is called to perform bonding with peer device.
**
+** Parameters: bd_addr - Address of the device to bond
+** pin_len - length in bytes of the PIN Code
+** p_pin - pointer to array with the PIN Code
+** trusted_mask - bitwise OR of trusted services (array of UINT32)
+
** Returns BTM_CMD_STARTED if successfully initiated, otherwise error
**
*******************************************************************************/
- BTM_API extern tBTM_STATUS BTM_SecBond (BD_ADDR bd_addr, UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[]);
+ BTM_API extern tBTM_STATUS BTM_SecBond (BD_ADDR bd_addr,
+ UINT8 pin_len, UINT8 *p_pin,
+ UINT32 trusted_mask[]);
+
+/*******************************************************************************
+**
+** Function BTM_SecBondByTransport
+**
+** Description This function is called to perform bonding by designated transport
+**
+** Parameters: bd_addr - Address of the device to bond
+** pin_len - length in bytes of the PIN Code
+** p_pin - pointer to array with the PIN Code
+** trusted_mask - bitwise OR of trusted services (array of UINT32)
+** transport : Physical transport to use for bonding (BR/EDR or LE)
+**
+** Returns BTM_CMD_STARTED if successfully initiated, otherwise error
+**
+*******************************************************************************/
+ BTM_API extern tBTM_STATUS BTM_SecBondByTransport (BD_ADDR bd_addr,
+ tBT_TRANSPORT transport,
+ UINT8 pin_len, UINT8 *p_pin,
+ UINT32 trusted_mask[]);
/*******************************************************************************
**
@@ -3993,8 +3997,8 @@
** BTM_MODE_UNSUPPORTED - if security manager not linked in.
**
*******************************************************************************/
- BTM_API extern tBTM_STATUS BTM_SetEncryption (BD_ADDR bd_addr, tBTM_SEC_CBACK *p_callback,
- void *p_ref_data);
+ BTM_API extern tBTM_STATUS BTM_SetEncryption (BD_ADDR bd_addr, tBT_TRANSPORT transport,
+ tBTM_SEC_CBACK *p_callback, void *p_ref_data);
/*******************************************************************************
**
@@ -4079,7 +4083,8 @@
** r - simple pairing Randomizer C.
**
*******************************************************************************/
- BTM_API extern void BTM_RemoteOobDataReply(tBTM_STATUS res, BD_ADDR bd_addr, BT_OCTET16 c, BT_OCTET16 r);
+ BTM_API extern void BTM_RemoteOobDataReply(tBTM_STATUS res, BD_ADDR bd_addr,
+ BT_OCTET16 c, BT_OCTET16 r);
/*******************************************************************************
**
@@ -4232,7 +4237,7 @@
** Returns the handle of the connection, or 0xFFFF if none.
**
*******************************************************************************/
- BTM_API extern UINT16 BTM_GetHCIConnHandle (BD_ADDR remote_bda);
+ BTM_API extern UINT16 BTM_GetHCIConnHandle (BD_ADDR remote_bda, tBT_TRANSPORT transport);
/*******************************************************************************
@@ -4419,171 +4424,6 @@
BTM_API extern UINT8 BTM_GetEirUuidList( UINT8 *p_eir, UINT8 uuid_size, UINT8 *p_num_uuid,
UINT8 *p_uuid_list, UINT8 max_num_uuid);
-/*******************************************************************************
-**
-** Function BTM_SyncStack
-**
-** Description For Dual-Stack support. Called to initiate switching to/from
-** main stack (running on phone baseband) to mm stack (light
-** stack running on multi-media chip)
-**
-** Parameters sync_dir: BTM_SW_BB_TO_MM: switch from BB to MM stack
-** BTM_SW_MM_TO_BB: switch from MM to BB stack
-** BTM_SW_RESYNC: resync MM and BB stacks
-**
-** p_sync_cback: callback function for event notification
-** Returns
-**
-*******************************************************************************/
- BTM_API extern tBTM_STATUS BTM_SyncStack(tBTM_SW_DIR sync_dir, tBTM_SYNC_STACK_CBACK p_sync_cback);
-
-/*******************************************************************************
-**
-** Function BTM_SyncBtaRsp
-**
-** Description For Dual-Stack support. Called to indicate that upper layers
-** (e.g. BTA or application) have completed synchronizing bta/app
-** specific layers for switching.
-**
-** Called in response to 'BTM_SYNC_BTA_EVT'
-**
-** Parameters status: BTM_SUCESS: bta/app successfully synchronized
-** otherwise: sync was unsuccessfule. Abort switch.
-**
-** p_btm_sync_info: information from bta/app that will be needed
-** by BTE (avdt and l2cap) for switching.
-**
-** Returns void
-**
-*******************************************************************************/
- BTM_API extern void BTM_SyncBtaRsp(tBTM_STATUS status, tBTM_SYNC_INFO *p_btm_sync_info);
-
-/*******************************************************************************
-**
-** Function BTM_OpenUIPC
-**
-** Description For Dual-Stack support. Called to open UIPC between
-** main stack (running on phone baseband) to embedded light stack
-** (running on Multimedia or Bluetooth Controller chip)
-**
-** Parameters sync_dir: BTM_SW_BB_TO_MM: switch from BB to MM stack
-** BTM_SW_BB_TO_BTC:switch from BB to BTC stack
-**
-** p_sync_callback: callback function for event notification
-** Returns
-**
-*******************************************************************************/
- BTM_API extern tBTM_STATUS BTM_OpenUIPC(tBTM_SW_DIR sync_dir, tBTM_SYNC_STACK_CBACK p_sync_callback);
-
-/*******************************************************************************
-**
-** Function BTM_CloseUIPC
-**
-** Description For Dual-Stack support. Called to close UIPC between
-** main stack (running on phone baseband) to embedded light stack
-** (running on Multimedia or Bluetooth Controller chip)
-**
-** Parameters
-** p_sync_callback: callback function for event notification
-** Returns
-**
-*******************************************************************************/
- BTM_API extern tBTM_STATUS BTM_CloseUIPC(tBTM_SYNC_STACK_CBACK p_sync_callback);
-
-/*******************************************************************************
-**
-** Function BTM_IpcSend
-**
-** Description For Dual-Stack support. Called to send ipc messages from
-** full stack to lite stack and vice-versa. This API is
-** typically called by bta layers e.g. bta_av.
-**
-**
-** Parameters len: Length of the buffer in the ipc message
-**
-** buffer: Pointer to the buffer to be passed in the IPC message
-**
-** Returns void
-**
-*******************************************************************************/
- BTM_API extern void BTM_IpcSend(UINT16 len, UINT8* buffer);
-
-/*******************************************************************************
-**
-** Function BTM_IpcSendBuf
-**
-** Description For Dual-Stack support. Called to send ipc messages from
-** full stack to lite stack and vice-versa. This API is
-** typically called by bta layers e.g. bta_av_sync.
-**
-**
-** Parameters p_buf: Pointer to the buffer to be passed in the IPC message
-**
-** Returns void
-**
-*******************************************************************************/
- BTM_API extern void BTM_IpcSendBuf(BT_HDR* p_buf);
-
-/*******************************************************************************
-**
-** Function BTM_RegIpcEvtHandler
-**
-** Description registers the DM provided handler for IPC events
-**
-**
-** Returns void
-**
-*******************************************************************************/
- BTM_API extern void BTM_RegIpcEvtHandler(tBTM_IPC_EVT_CBACK *p_cback);
-
-/*******************************************************************************
-**
-** Function BTM_RegRTIpcEvtHandler
-**
-** Description registers the RT(Audio Routing) provided handler for IPC events
-**
-**
-** Returns void
-**
-*******************************************************************************/
- BTM_API extern void BTM_RegRTIpcEvtHandler(tBTM_IPC_EVT_CBACK *p_cback);
-
-/*****************************************************************************
-** N2BT
-*****************************************************************************/
-
-/* Data callback for N2BT */
- typedef void (tBTM_N2BT_DATA_CB) (BD_ADDR bd_addr, UINT16 handle, UINT8 *p_data, UINT16 datalen);
-
-/*******************************************************************************
-**
-** Function BTM_N2BtAcquire
-**
-** Description Put controller into acquisition mode
-**
-** Returns void
-**
-*******************************************************************************/
- BTM_API extern void BTM_N2BtAcquire(BD_ADDR bd_addr, UINT16 timeout,
- UINT8 freq, UINT8 src_addrlen, UINT8 sensor_flags,
- UINT8 sensor_type, UINT8 sensor_clk_accuracy,
- UINT16 add_rx_window, UINT16 init_crc,
- UINT32 ac_low, UINT32 ac_high, UINT16 pkt_hdr,
- UINT16 list_dur, UINT16 list_int,
- UINT8 oor_missed_pkts, tBTM_VSC_CMPL_CB *p_cb,
- tBTM_N2BT_DATA_CB *p_data_cback);
-
-/*******************************************************************************
-**
-** Function BTM_N2BtDisconnect
-**
-** Description Disconnects all N2BT devices
-**
-** Returns void
-**
-*******************************************************************************/
- BTM_API extern void BTM_N2BtDisconnect(void);
-
/*****************************************************************************
** SCO OVER HCI
*****************************************************************************/
@@ -4662,6 +4502,18 @@
*******************************************************************************/
BTM_API extern void BTM_PCM2Setup_Write (BOOLEAN clk_master, tBTM_VSC_CMPL_CB *p_arc_cb);
+
+/*******************************************************************************
+**
+** Function BTM_PM_ReadControllerState
+**
+** Description This function is called to obtain the controller state
+**
+** Returns Controller state (BTM_CONTRL_ACTIVE, BTM_CONTRL_SCAN, and BTM_CONTRL_IDLE)
+**
+*******************************************************************************/
+BTM_API extern tBTM_CONTRL_STATE BTM_PM_ReadControllerState(void);
+
#ifdef __cplusplus
}
#endif
diff --git a/stack/include/btm_ble_api.h b/stack/include/btm_ble_api.h
index 584ce9a..0e76468 100644
--- a/stack/include/btm_ble_api.h
+++ b/stack/include/btm_ble_api.h
@@ -26,25 +26,40 @@
#define BTM_BLE_API_H
#include "btm_api.h"
+#include "gki.h"
#define CHNL_MAP_LEN 5
typedef UINT8 tBTM_BLE_CHNL_MAP[CHNL_MAP_LEN];
-#define BTM_BLE_CONNECT_EVT 0x00
-#define BTM_BLE_CONNECT_DIR_EVT 0x01
-#define BTM_BLE_DISCOVER_EVT 0x02
-#define BTM_BLE_NON_CONNECT_EVT 0x03
+/* 0x00-0x04 only used for set advertising parameter command */
+#define BTM_BLE_CONNECT_EVT 0x00 /* 0x00-0x04 only used for set advertising
+ parameter command */
+#define BTM_BLE_CONNECT_DIR_EVT 0x01 /* Connectable directed advertising */
+#define BTM_BLE_DISCOVER_EVT 0x02 /* Scannable undirected advertising */
+#define BTM_BLE_NON_CONNECT_EVT 0x03 /* Non connectable undirected advertising */
+#define BTM_BLE_CONNECT_LO_DUTY_DIR_EVT 0x04 /* Connectable low duty
+ cycle directed advertising */
+ /* 0x00 - 0x05 can be received on adv event type */
#define BTM_BLE_SCAN_RSP_EVT 0x04
-#define BTM_BLE_SCAN_REQ_EVT 0x06
+#define BTM_BLE_SCAN_REQ_EVT 0x05
#define BTM_BLE_UNKNOWN_EVT 0xff
#define BTM_BLE_UNKNOWN_EVT 0xff
+typedef UINT32 tBTM_BLE_REF_VALUE;
+
#define BTM_BLE_SCAN_MODE_PASS 0
#define BTM_BLE_SCAN_MODE_ACTI 1
#define BTM_BLE_SCAN_MODE_NONE 0xff
typedef UINT8 tBTM_BLE_SCAN_MODE;
+#define BTM_BLE_BATCH_SCAN_MODE_DISABLE 0
+#define BTM_BLE_BATCH_SCAN_MODE_PASS 1
+#define BTM_BLE_BATCH_SCAN_MODE_ACTI 2
+#define BTM_BLE_BATCH_SCAN_MODE_PASS_ACTI 3
+
+typedef UINT8 tBTM_BLE_BATCH_SCAN_MODE;
+
/* advertising channel map */
#define BTM_BLE_ADV_CHNL_37 (0x01 << 0)
#define BTM_BLE_ADV_CHNL_38 (0x01 << 1)
@@ -82,6 +97,18 @@
#define BTM_BLE_ADV_INT_MIN 0x0020
#define BTM_BLE_ADV_INT_MAX 0x4000
+/* Full scan boundary values */
+#define BTM_BLE_ADV_SCAN_FULL_MIN 0x00
+#define BTM_BLE_ADV_SCAN_FULL_MAX 0x64
+
+/* Partial scan boundary values */
+#define BTM_BLE_ADV_SCAN_TRUNC_MIN BTM_BLE_ADV_SCAN_FULL_MIN
+#define BTM_BLE_ADV_SCAN_TRUNC_MAX BTM_BLE_ADV_SCAN_FULL_MAX
+
+/* Threshold values */
+#define BTM_BLE_ADV_SCAN_THR_MIN BTM_BLE_ADV_SCAN_FULL_MIN
+#define BTM_BLE_ADV_SCAN_THR_MAX BTM_BLE_ADV_SCAN_FULL_MAX
+
/* connection parameter boundary values */
#define BTM_BLE_SCAN_INT_MIN 0x0004
#define BTM_BLE_SCAN_INT_MAX 0x4000
@@ -93,7 +120,6 @@
#define BTM_BLE_CONN_SUP_TOUT_MIN 0x000A
#define BTM_BLE_CONN_SUP_TOUT_MAX 0x0C80
#define BTM_BLE_CONN_PARAM_UNDEF 0xffff /* use this value when a specific value not to be overwritten */
-#define BTM_BLE_CONN_SUP_TOUT_DEF 700
/* default connection parameters if not configured, use GAP recommend value for auto/selective connection */
/* default scan interval */
@@ -110,7 +136,7 @@
#define BTM_BLE_SCAN_SLOW_INT_1 2048 /* 1.28 s = 2048 *0.625 */
#endif
#ifndef BTM_BLE_SCAN_SLOW_WIN_1
-#define BTM_BLE_SCAN_SLOW_WIN_1 18 /* 11.25 ms = 18 *0.625 */
+#define BTM_BLE_SCAN_SLOW_WIN_1 48 /* 30 ms = 48 *0.625 */
#endif
/* default scan paramter used in reduced power cycle (background scanning) */
@@ -157,6 +183,58 @@
#define BTM_BLE_SIMULTANEOUS_HOST 0x01
#endif
+/* Appearance Values Reported with BTM_BLE_AD_TYPE_APPEARANCE */
+#define BTM_BLE_APPEARANCE_UKNOWN 0x0000
+#define BTM_BLE_APPEARANCE_GENERIC_PHONE 0x0040
+#define BTM_BLE_APPEARANCE_GENERIC_COMPUTER 0x0080
+#define BTM_BLE_APPEARANCE_GENERIC_WATCH 0x00C0
+#define BTM_BLE_APPEARANCE_SPORTS_WATCH 0x00C1
+#define BTM_BLE_APPEARANCE_GENERIC_CLOCK 0x0100
+#define BTM_BLE_APPEARANCE_GENERIC_DISPLAY 0x0140
+#define BTM_BLE_APPEARANCE_GENERIC_REMOTE 0x0180
+#define BTM_BLE_APPEARANCE_GENERIC_EYEGLASSES 0x01C0
+#define BTM_BLE_APPEARANCE_GENERIC_TAG 0x0200
+#define BTM_BLE_APPEARANCE_GENERIC_KEYRING 0x0240
+#define BTM_BLE_APPEARANCE_GENERIC_MEDIA_PLAYER 0x0280
+#define BTM_BLE_APPEARANCE_GENERIC_BARCODE_SCANNER 0x02C0
+#define BTM_BLE_APPEARANCE_GENERIC_THERMOMETER 0x0300
+#define BTM_BLE_APPEARANCE_THERMOMETER_EAR 0x0301
+#define BTM_BLE_APPEARANCE_GENERIC_HEART_RATE 0x0340
+#define BTM_BLE_APPEARANCE_HEART_RATE_BELT 0x0341
+#define BTM_BLE_APPEARANCE_GENERIC_BLOOD_PRESSURE 0x0380
+#define BTM_BLE_APPEARANCE_BLOOD_PRESSURE_ARM 0x0381
+#define BTM_BLE_APPEARANCE_BLOOD_PRESSURE_WRIST 0x0382
+#define BTM_BLE_APPEARANCE_GENERIC_HID 0x03C0
+#define BTM_BLE_APPEARANCE_HID_KEYBOARD 0x03C1
+#define BTM_BLE_APPEARANCE_HID_MOUSE 0x03C2
+#define BTM_BLE_APPEARANCE_HID_JOYSTICK 0x03C3
+#define BTM_BLE_APPEARANCE_HID_GAMEPAD 0x03C4
+#define BTM_BLE_APPEARANCE_HID_DIGITIZER_TABLET 0x03C5
+#define BTM_BLE_APPEARANCE_HID_CARD_READER 0x03C6
+#define BTM_BLE_APPEARANCE_HID_DIGITAL_PEN 0x03C7
+#define BTM_BLE_APPEARANCE_HID_BARCODE_SCANNER 0x03C8
+#define BTM_BLE_APPEARANCE_GENERIC_GLUCOSE 0x0400
+#define BTM_BLE_APPEARANCE_GENERIC_WALKING 0x0440
+#define BTM_BLE_APPEARANCE_WALKING_IN_SHOE 0x0441
+#define BTM_BLE_APPEARANCE_WALKING_ON_SHOE 0x0442
+#define BTM_BLE_APPEARANCE_WALKING_ON_HIP 0x0443
+#define BTM_BLE_APPEARANCE_GENERIC_CYCLING 0x0480
+#define BTM_BLE_APPEARANCE_CYCLING_COMPUTER 0x0481
+#define BTM_BLE_APPEARANCE_CYCLING_SPEED 0x0482
+#define BTM_BLE_APPEARANCE_CYCLING_CADENCE 0x0483
+#define BTM_BLE_APPEARANCE_CYCLING_POWER 0x0484
+#define BTM_BLE_APPEARANCE_CYCLING_SPEED_CADENCE 0x0485
+#define BTM_BLE_APPEARANCE_GENERIC_PULSE_OXIMETER 0x0C40
+#define BTM_BLE_APPEARANCE_PULSE_OXIMETER_FINGERTIP 0x0C41
+#define BTM_BLE_APPEARANCE_PULSE_OXIMETER_WRIST 0x0C42
+#define BTM_BLE_APPEARANCE_GENERIC_WEIGHT 0x0C80
+#define BTM_BLE_APPEARANCE_GENERIC_OUTDOOR_SPORTS 0x1440
+#define BTM_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION 0x1441
+#define BTM_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION_AND_NAV 0x1442
+#define BTM_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION_POD 0x1443
+#define BTM_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION_POD_AND_NAV 0x1444
+
+
/* Structure returned with Rand/Encrypt complete callback */
typedef struct
{
@@ -179,39 +257,36 @@
#define BTM_BLE_POLICY_ALLOW_CONN 0x02 /* relevant to advertiser */
#define BTM_BLE_POLICY_WHITE_ALL 0x03 /* relevant to both */
-typedef struct
-{
- UINT8 adv_int_min;
- UINT8 adv_int_max;
- tBTM_BLE_CHNL_MAP chnl_map;
-
-}tBTM_BLE_ADV_PARAMS;
-
/* ADV data flag bit definition used for BTM_BLE_AD_TYPE_FLAG */
#define BTM_BLE_LIMIT_DISC_FLAG (0x01 << 0)
#define BTM_BLE_GEN_DISC_FLAG (0x01 << 1)
#define BTM_BLE_BREDR_NOT_SPT (0x01 << 2)
+/* 4.1 spec adv flag for simultaneous BR/EDR+LE connection support */
+#define BTM_BLE_DMT_CONTROLLER_SPT (0x01 << 3)
+#define BTM_BLE_DMT_HOST_SPT (0x01 << 4)
#define BTM_BLE_NON_LIMIT_DISC_FLAG (0x00 ) /* lowest bit unset */
#define BTM_BLE_ADV_FLAG_MASK (BTM_BLE_LIMIT_DISC_FLAG | BTM_BLE_BREDR_NOT_SPT | BTM_BLE_GEN_DISC_FLAG)
#define BTM_BLE_LIMIT_DISC_MASK (BTM_BLE_LIMIT_DISC_FLAG )
-#define BTM_BLE_AD_BIT_DEV_NAME (0x0001 << 0)
-#define BTM_BLE_AD_BIT_FLAGS (0x0001 << 1)
-#define BTM_BLE_AD_BIT_MANU (0x0001 << 2)
-#define BTM_BLE_AD_BIT_TX_PWR (0x0001 << 3)
-#define BTM_BLE_AD_BIT_INT_RANGE (0x0001 << 5)
-#define BTM_BLE_AD_BIT_SERVICE (0x0001 << 6)
-#define BTM_BLE_AD_BIT_SERVICE_SOL (0x0001 << 7)
-#define BTM_BLE_AD_BIT_SERVICE_DATA (0x0001 << 8)
-#define BTM_BLE_AD_BIT_SIGN_DATA (0x0001 << 9)
-#define BTM_BLE_AD_BIT_SERVICE_128SOL (0x0001 << 10)
-#define BTM_BLE_AD_BIT_APPEARANCE (0x0001 << 11)
-#define BTM_BLE_AD_BIT_PUBLIC_ADDR (0x0001 << 12)
-#define BTM_BLE_AD_BIT_RANDOM_ADDR (0x0001 << 13)
+#define BTM_BLE_AD_BIT_DEV_NAME (0x00000001 << 0)
+#define BTM_BLE_AD_BIT_FLAGS (0x00000001 << 1)
+#define BTM_BLE_AD_BIT_MANU (0x00000001 << 2)
+#define BTM_BLE_AD_BIT_TX_PWR (0x00000001 << 3)
+#define BTM_BLE_AD_BIT_INT_RANGE (0x00000001 << 5)
+#define BTM_BLE_AD_BIT_SERVICE (0x00000001 << 6)
+#define BTM_BLE_AD_BIT_SERVICE_SOL (0x00000001 << 7)
+#define BTM_BLE_AD_BIT_SERVICE_DATA (0x00000001 << 8)
+#define BTM_BLE_AD_BIT_SIGN_DATA (0x00000001 << 9)
+#define BTM_BLE_AD_BIT_SERVICE_128SOL (0x00000001 << 10)
+#define BTM_BLE_AD_BIT_APPEARANCE (0x00000001 << 11)
+#define BTM_BLE_AD_BIT_PUBLIC_ADDR (0x00000001 << 12)
+#define BTM_BLE_AD_BIT_RANDOM_ADDR (0x00000001 << 13)
+#define BTM_BLE_AD_BIT_SERVICE_32 (0x00000001 << 4)
+#define BTM_BLE_AD_BIT_SERVICE_32SOL (0x00000001 << 14)
+#define BTM_BLE_AD_BIT_PROPRIETARY (0x00000001 << 15)
+#define BTM_BLE_AD_BIT_SERVICE_128 (0x00000001 << 16) /*128-bit Service UUIDs*/
-#define BTM_BLE_AD_BIT_PROPRIETARY (0x0001 << 15)
-
-typedef UINT16 tBTM_BLE_AD_MASK;
+typedef UINT32 tBTM_BLE_AD_MASK;
#define BTM_BLE_AD_TYPE_FLAG HCI_EIR_FLAGS_TYPE /* 0x01 */
#define BTM_BLE_AD_TYPE_16SRV_PART HCI_EIR_MORE_16BITS_UUID_TYPE /* 0x02 */
@@ -233,9 +308,35 @@
#define BTM_BLE_AD_TYPE_PUBLIC_TARGET 0x17
#define BTM_BLE_AD_TYPE_RANDOM_TARGET 0x18
#define BTM_BLE_AD_TYPE_APPEARANCE 0x19
+#define BTM_BLE_AD_TYPE_ADV_INT 0x1a
+#define BTM_BLE_AD_TYPE_32SOL_SRV_UUID 0x1b
+#define BTM_BLE_AD_TYPE_32SERVICE_DATA 0x1c
+#define BTM_BLE_AD_TYPE_128SERVICE_DATA 0x1d
+
#define BTM_BLE_AD_TYPE_MANU HCI_EIR_MANUFACTURER_SPECIFIC_TYPE /* 0xff */
typedef UINT8 tBTM_BLE_AD_TYPE;
+/* adv tx power level */
+#define BTM_BLE_ADV_TX_POWER_MIN 0 /* minimum tx power */
+#define BTM_BLE_ADV_TX_POWER_LOW 1 /* low tx power */
+#define BTM_BLE_ADV_TX_POWER_MID 2 /* middle tx power */
+#define BTM_BLE_ADV_TX_POWER_UPPER 3 /* upper tx power */
+#define BTM_BLE_ADV_TX_POWER_MAX 4 /* maximum tx power */
+typedef UINT8 tBTM_BLE_ADV_TX_POWER;
+
+/* adv tx power in dBm */
+typedef struct
+{
+ UINT8 adv_inst_max; /* max adv instance supported in controller */
+ UINT8 rpa_offloading;
+ UINT16 tot_scan_results_strg;
+ UINT8 max_irk_list_sz;
+ UINT8 filter_support;
+ UINT8 max_filter;
+ UINT8 energy_support;
+ BOOLEAN values_read;
+}tBTM_BLE_VSC_CB;
+
/* slave preferred connection interval range */
typedef struct
{
@@ -252,12 +353,35 @@
UINT16 *p_uuid;
}tBTM_BLE_SERVICE;
+/* 32 bits Service supported in the device */
+typedef struct
+{
+ UINT8 num_service;
+ BOOLEAN list_cmpl;
+ UINT32 *p_uuid;
+}tBTM_BLE_32SERVICE;
+
+/* 128 bits Service supported in the device */
+typedef struct
+{
+ BOOLEAN list_cmpl;
+ UINT8 uuid128[MAX_UUID_SIZE];
+}tBTM_BLE_128SERVICE;
+
typedef struct
{
UINT8 len;
UINT8 *p_val;
}tBTM_BLE_MANU;
+
+typedef struct
+{
+ tBT_UUID service_uuid;
+ UINT8 len;
+ UINT8 *p_val;
+}tBTM_BLE_SERVICE_DATA;
+
typedef struct
{
UINT8 adv_type;
@@ -273,14 +397,350 @@
typedef struct
{
- tBTM_BLE_MANU manu; /* manufactuer data */
tBTM_BLE_INT_RANGE int_range; /* slave prefered conn interval range */
- tBTM_BLE_SERVICE services; /* services */
+ tBTM_BLE_MANU *p_manu; /* manufactuer data */
+ tBTM_BLE_SERVICE *p_services; /* services */
+ tBTM_BLE_128SERVICE *p_services_128b; /* 128 bits service */
+ tBTM_BLE_32SERVICE *p_service_32b; /* 32 bits Service UUID */
+ tBTM_BLE_SERVICE *p_sol_services; /* 16 bits services Solicitation UUIDs */
+ tBTM_BLE_32SERVICE *p_sol_service_32b; /* List of 32 bit Service Solicitation UUIDs */
+ tBTM_BLE_128SERVICE *p_sol_service_128b; /* List of 128 bit Service Solicitation UUIDs */
+ tBTM_BLE_PROPRIETARY *p_proprietary;
+ tBTM_BLE_SERVICE_DATA *p_service_data; /* service data */
UINT16 appearance;
UINT8 flag;
- tBTM_BLE_PROPRIETARY *p_proprietary;
+ UINT8 tx_power;
}tBTM_BLE_ADV_DATA;
+#ifndef BTM_BLE_MULTI_ADV_MAX
+#define BTM_BLE_MULTI_ADV_MAX 10 /* controller returned adv_inst_max should be less
+ than this number */
+#endif
+
+#define BTM_BLE_MULTI_ADV_INVALID 0
+
+#define BTM_BLE_MULTI_ADV_ENB_EVT 1
+#define BTM_BLE_MULTI_ADV_DISABLE_EVT 2
+#define BTM_BLE_MULTI_ADV_PARAM_EVT 3
+#define BTM_BLE_MULTI_ADV_DATA_EVT 4
+typedef UINT8 tBTM_BLE_MULTI_ADV_EVT;
+
+#define BTM_BLE_MULTI_ADV_DEFAULT_STD 0
+
+typedef struct
+{
+ UINT16 adv_int_min;
+ UINT16 adv_int_max;
+ UINT8 adv_type;
+ tBTM_BLE_ADV_CHNL_MAP channel_map;
+ tBTM_BLE_AFP adv_filter_policy;
+ tBTM_BLE_ADV_TX_POWER tx_power;
+}tBTM_BLE_ADV_PARAMS;
+
+typedef struct
+{
+ UINT8 *p_sub_code; /* dynamic array to store sub code */
+ UINT8 *p_inst_id; /* dynamic array to store instance id */
+ UINT8 pending_idx;
+ UINT8 next_idx;
+}tBTM_BLE_MULTI_ADV_OPQ;
+
+typedef void (tBTM_BLE_MULTI_ADV_CBACK)(tBTM_BLE_MULTI_ADV_EVT evt, UINT8 inst_id,
+ void *p_ref, tBTM_STATUS status);
+
+typedef struct
+{
+ UINT8 inst_id;
+ UINT8 adv_evt;
+ BD_ADDR rpa;
+ TIMER_LIST_ENT raddr_timer_ent;
+ tBTM_BLE_MULTI_ADV_CBACK *p_cback;
+ void *p_ref;
+ UINT8 index;
+}tBTM_BLE_MULTI_ADV_INST;
+
+typedef struct
+{
+ UINT8 inst_index_queue[BTM_BLE_MULTI_ADV_MAX];
+ int front;
+ int rear;
+}tBTM_BLE_MULTI_ADV_INST_IDX_Q;
+
+typedef struct
+{
+ tBTM_BLE_MULTI_ADV_INST *p_adv_inst; /* dynamic array to store adv instance */
+ tBTM_BLE_MULTI_ADV_OPQ op_q;
+}tBTM_BLE_MULTI_ADV_CB;
+
+typedef void (tBTM_BLE_SCAN_THRESHOLD_CBACK)(tBTM_BLE_REF_VALUE ref_value);
+typedef void (tBTM_BLE_SCAN_REP_CBACK)(tBTM_BLE_REF_VALUE ref_value, UINT8 report_format,
+ UINT8 num_records, UINT16 total_len,
+ UINT8* p_rep_data, UINT8 status);
+typedef void (tBTM_BLE_SCAN_SETUP_CBACK)(UINT8 evt, tBTM_BLE_REF_VALUE ref_value, UINT8 status);
+
+#ifndef BTM_BLE_BATCH_SCAN_MAX
+#define BTM_BLE_BATCH_SCAN_MAX 5
+#endif
+
+#ifndef BTM_BLE_BATCH_REP_MAIN_Q_SIZE
+#define BTM_BLE_BATCH_REP_MAIN_Q_SIZE 2
+#endif
+
+typedef enum
+{
+ BTM_BLE_SCAN_INVALID_STATE=0,
+ BTM_BLE_SCAN_ENABLE_CALLED=1,
+ BTM_BLE_SCAN_ENABLED_STATE=2,
+ BTM_BLE_SCAN_DISABLE_CALLED=3,
+ BTM_BLE_SCAN_DISABLED_STATE=4
+}tBTM_BLE_BATCH_SCAN_STATE;
+
+enum
+{
+ BTM_BLE_DISCARD_OLD_ITEMS,
+ BTM_BLE_DISCARD_LOWER_RSSI_ITEMS
+};
+typedef UINT8 tBTM_BLE_DISCARD_RULE;
+
+typedef struct
+{
+ UINT8 sub_code[BTM_BLE_BATCH_SCAN_MAX];
+ tBTM_BLE_BATCH_SCAN_STATE cur_state[BTM_BLE_BATCH_SCAN_MAX];
+ tBTM_BLE_REF_VALUE ref_value[BTM_BLE_BATCH_SCAN_MAX];
+ UINT8 pending_idx;
+ UINT8 next_idx;
+}tBTM_BLE_BATCH_SCAN_OPQ;
+
+typedef struct
+{
+ UINT8 rep_mode[BTM_BLE_BATCH_REP_MAIN_Q_SIZE];
+ tBTM_BLE_REF_VALUE ref_value[BTM_BLE_BATCH_REP_MAIN_Q_SIZE];
+ UINT8 num_records[BTM_BLE_BATCH_REP_MAIN_Q_SIZE];
+ UINT16 data_len[BTM_BLE_BATCH_REP_MAIN_Q_SIZE];
+ UINT8 *p_data[BTM_BLE_BATCH_REP_MAIN_Q_SIZE];
+ UINT8 pending_idx;
+ UINT8 next_idx;
+}tBTM_BLE_BATCH_SCAN_REP_Q;
+
+typedef struct
+{
+ tBTM_BLE_BATCH_SCAN_STATE cur_state;
+ tBTM_BLE_BATCH_SCAN_MODE scan_mode;
+ UINT32 scan_interval;
+ UINT32 scan_window;
+ tBLE_ADDR_TYPE addr_type;
+ tBTM_BLE_DISCARD_RULE discard_rule;
+ tBTM_BLE_BATCH_SCAN_OPQ op_q;
+ tBTM_BLE_BATCH_SCAN_REP_Q main_rep_q;
+ tBTM_BLE_SCAN_SETUP_CBACK *p_setup_cback;
+ tBTM_BLE_SCAN_THRESHOLD_CBACK *p_thres_cback;
+ tBTM_BLE_SCAN_REP_CBACK *p_scan_rep_cback;
+ tBTM_BLE_REF_VALUE ref_value;
+}tBTM_BLE_BATCH_SCAN_CB;
+
+/* filter selection bit index */
+#define BTM_BLE_PF_ADDR_FILTER 0
+#define BTM_BLE_PF_SRVC_DATA 1
+#define BTM_BLE_PF_SRVC_UUID 2
+#define BTM_BLE_PF_SRVC_SOL_UUID 3
+#define BTM_BLE_PF_LOCAL_NAME 4
+#define BTM_BLE_PF_MANU_DATA 5
+#define BTM_BLE_PF_SRVC_DATA_PATTERN 6
+#define BTM_BLE_PF_TYPE_ALL 7 /* when passed in payload filter type all, only clear action is applicable */
+#define BTM_BLE_PF_TYPE_MAX 8
+
+/* max number of filter spot for different filter type */
+#ifndef BTM_BLE_MAX_UUID_FILTER
+#define BTM_BLE_MAX_UUID_FILTER 8
+#endif
+#ifndef BTM_BLE_MAX_ADDR_FILTER
+#define BTM_BLE_MAX_ADDR_FILTER 8
+#endif
+#ifndef BTM_BLE_PF_STR_COND_MAX
+#define BTM_BLE_PF_STR_COND_MAX 4 /* apply to manu data , or local name */
+#endif
+#ifndef BTM_BLE_PF_STR_LEN_MAX
+#define BTM_BLE_PF_STR_LEN_MAX 29 /* match for first 29 bytes */
+#endif
+
+typedef UINT8 tBTM_BLE_PF_COND_TYPE;
+
+#define BTM_BLE_PF_LOGIC_OR 0
+#define BTM_BLE_PF_LOGIC_AND 1
+typedef UINT8 tBTM_BLE_PF_LOGIC_TYPE;
+
+#define BTM_BLE_PF_ENABLE 1
+#define BTM_BLE_PF_CONFIG 2
+typedef UINT8 tBTM_BLE_PF_ACTION;
+
+typedef UINT8 tBTM_BLE_PF_FILT_INDEX;
+
+typedef UINT8 tBTM_BLE_PF_AVBL_SPACE;
+
+#define BTM_BLE_PF_BRDCAST_ADDR_FILT 1
+#define BTM_BLE_PF_SERV_DATA_CHG_FILT 2
+#define BTM_BLE_PF_SERV_UUID 4
+#define BTM_BLE_PF_SERV_SOLC_UUID 8
+#define BTM_BLE_PF_LOC_NAME_CHECK 16
+#define BTM_BLE_PF_MANUF_NAME_CHECK 32
+#define BTM_BLE_PF_SERV_DATA_CHECK 64
+typedef UINT16 tBTM_BLE_PF_FEAT_SEL;
+
+#define BTM_BLE_PF_LIST_LOGIC_OR 1
+#define BTM_BLE_PF_LIST_LOGIC_AND 2
+typedef UINT16 tBTM_BLE_PF_LIST_LOGIC_TYPE;
+
+#define BTM_BLE_PF_FILT_LOGIC_OR 0
+#define BTM_BLE_PF_FILT_LOGIC_AND 1
+typedef UINT16 tBTM_BLE_PF_FILT_LOGIC_TYPE;
+
+typedef UINT8 tBTM_BLE_PF_RSSI_THRESHOLD;
+typedef UINT8 tBTM_BLE_PF_DELIVERY_MODE;
+typedef UINT16 tBTM_BLE_PF_TIMEOUT;
+typedef UINT8 tBTM_BLE_PF_TIMEOUT_CNT;
+
+typedef struct
+{
+ tBTM_BLE_PF_FEAT_SEL feat_seln;
+ tBTM_BLE_PF_LIST_LOGIC_TYPE logic_type;
+ tBTM_BLE_PF_FILT_LOGIC_TYPE filt_logic_type;
+ tBTM_BLE_PF_RSSI_THRESHOLD rssi_high_thres;
+ tBTM_BLE_PF_RSSI_THRESHOLD rssi_low_thres;
+ tBTM_BLE_PF_DELIVERY_MODE dely_mode;
+ tBTM_BLE_PF_TIMEOUT found_timeout;
+ tBTM_BLE_PF_TIMEOUT lost_timeout;
+ tBTM_BLE_PF_TIMEOUT_CNT found_timeout_cnt;
+}tBTM_BLE_PF_FILT_PARAMS;
+
+enum
+{
+ BTM_BLE_SCAN_COND_ADD,
+ BTM_BLE_SCAN_COND_DELETE,
+ BTM_BLE_SCAN_COND_CLEAR = 2
+};
+typedef UINT8 tBTM_BLE_SCAN_COND_OP;
+
+enum
+{
+ BTM_BLE_FILT_ENABLE_DISABLE = 1,
+ BTM_BLE_FILT_CFG = 2,
+ BTM_BLE_FILT_ADV_PARAM = 3
+};
+
+typedef UINT8 tBTM_BLE_FILT_CB_EVT;
+
+/* BLE adv payload filtering config complete callback */
+typedef void (tBTM_BLE_PF_CFG_CBACK)(tBTM_BLE_PF_ACTION action, tBTM_BLE_SCAN_COND_OP cfg_op,
+ tBTM_BLE_PF_AVBL_SPACE avbl_space, tBTM_STATUS status,
+ tBTM_BLE_REF_VALUE ref_value);
+
+typedef void (tBTM_BLE_PF_CMPL_CBACK) (tBTM_BLE_PF_CFG_CBACK);
+
+/* BLE adv payload filtering status setup complete callback */
+typedef void (tBTM_BLE_PF_STATUS_CBACK) (UINT8 action, tBTM_STATUS status,
+ tBTM_BLE_REF_VALUE ref_value);
+
+/* BLE adv payload filtering param setup complete callback */
+typedef void (tBTM_BLE_PF_PARAM_CBACK) (tBTM_BLE_PF_ACTION action_type,
+ tBTM_BLE_PF_AVBL_SPACE avbl_space,
+ tBTM_BLE_REF_VALUE ref_value, tBTM_STATUS status);
+
+typedef union
+{
+ UINT16 uuid16_mask;
+ UINT32 uuid32_mask;
+ UINT8 uuid128_mask[LEN_UUID_128];
+}tBTM_BLE_PF_COND_MASK;
+
+typedef struct
+{
+ tBLE_BD_ADDR *p_target_addr; /* target address, if NULL, generic UUID filter */
+ tBT_UUID uuid; /* UUID condition */
+ tBTM_BLE_PF_LOGIC_TYPE cond_logic; /* AND/OR */
+ tBTM_BLE_PF_COND_MASK *p_uuid_mask; /* UUID mask */
+}tBTM_BLE_PF_UUID_COND;
+
+typedef struct
+{
+ UINT8 data_len; /* <= 20 bytes */
+ UINT8 *p_data;
+}tBTM_BLE_PF_LOCAL_NAME_COND;
+
+typedef struct
+{
+ UINT16 company_id; /* company ID */
+ UINT8 data_len; /* <= 20 bytes */
+ UINT8 *p_pattern;
+ UINT16 company_id_mask; /* UUID value mask */
+ UINT8 *p_pattern_mask; /* Manufactuer data matching mask, same length as data pattern,
+ set to all 0xff, match exact data */
+}tBTM_BLE_PF_MANU_COND;
+
+typedef struct
+{
+ UINT16 uuid; /* service ID */
+ UINT8 data_len; /* <= 20 bytes */
+ UINT8 *p_pattern;
+ UINT8 *p_pattern_mask; /* Service data matching mask, same length as data pattern,
+ set to all 0xff, match exact data */
+}tBTM_BLE_PF_SRVC_PATTERN_COND;
+
+
+typedef union
+{
+ tBLE_BD_ADDR target_addr;
+ tBTM_BLE_PF_LOCAL_NAME_COND local_name; /* lcoal name filtering */
+ tBTM_BLE_PF_MANU_COND manu_data; /* manufactuer data filtering */
+ tBTM_BLE_PF_UUID_COND srvc_uuid; /* service UUID filtering */
+ tBTM_BLE_PF_UUID_COND solicitate_uuid; /* solicitated service UUID filtering */
+ tBTM_BLE_PF_SRVC_PATTERN_COND srvc_data; /* service data pattern */
+}tBTM_BLE_PF_COND_PARAM;
+
+typedef struct
+{
+ UINT8 action_ocf[BTM_BLE_PF_TYPE_MAX];
+ tBTM_BLE_REF_VALUE ref_value[BTM_BLE_PF_TYPE_MAX];
+ tBTM_BLE_PF_PARAM_CBACK *p_filt_param_cback[BTM_BLE_PF_TYPE_MAX];
+ tBTM_BLE_PF_CFG_CBACK *p_scan_cfg_cback[BTM_BLE_PF_TYPE_MAX];
+ UINT8 cb_evt[BTM_BLE_PF_TYPE_MAX];
+ UINT8 pending_idx;
+ UINT8 next_idx;
+}tBTM_BLE_ADV_FILTER_ADV_OPQ;
+
+#define BTM_BLE_MAX_FILTER_COUNTER (BTM_BLE_MAX_ADDR_FILTER + 1) /* per device filter + one generic filter indexed by 0 */
+
+#ifndef BTM_CS_IRK_LIST_MAX
+#define BTM_CS_IRK_LIST_MAX 0x20
+#endif
+
+typedef struct
+{
+ BOOLEAN in_use;
+ BD_ADDR bd_addr;
+ UINT8 pf_counter[BTM_BLE_PF_TYPE_MAX]; /* number of filter indexed by tBTM_BLE_PF_COND_TYPE */
+}tBTM_BLE_PF_COUNT;
+
+typedef struct
+{
+ BOOLEAN enable;
+ UINT8 op_type;
+ tBTM_BLE_PF_COUNT *p_addr_filter_count; /* per BDA filter array */
+ tBLE_BD_ADDR cur_filter_target;
+ tBTM_BLE_PF_STATUS_CBACK *p_filt_stat_cback;
+ tBTM_BLE_ADV_FILTER_ADV_OPQ op_q;
+}tBTM_BLE_ADV_FILTER_CB;
+
+/* Sub codes */
+#define BTM_BLE_META_PF_ENABLE 0x00
+#define BTM_BLE_META_PF_FEAT_SEL 0x01
+#define BTM_BLE_META_PF_ADDR 0x02
+#define BTM_BLE_META_PF_UUID 0x03
+#define BTM_BLE_META_PF_SOL_UUID 0x04
+#define BTM_BLE_META_PF_LOCAL_NAME 0x05
+#define BTM_BLE_META_PF_MANU_DATA 0x06
+#define BTM_BLE_META_PF_SRVC_DATA 0x07
+#define BTM_BLE_META_PF_ALL 0x08
+
/* These are the fields returned in each device adv packet. It
** is returned in the results callback if registered.
*/
@@ -303,7 +763,53 @@
};
typedef UINT8 tBTM_BLE_CONN_TYPE;
+typedef void (tBTM_BLE_TRACK_ADV_CBACK)(int filt_index, tBLE_ADDR_TYPE addr_type, BD_ADDR bda,
+ int adv_state, tBTM_BLE_REF_VALUE ref_value);
+
+typedef UINT8 tBTM_BLE_TRACK_ADV_EVT;
+
+typedef struct
+{
+ tBTM_BLE_REF_VALUE ref_value;
+ tBTM_BLE_TRACK_ADV_CBACK *p_track_cback;
+}tBTM_BLE_ADV_TRACK_CB;
+
+enum
+{
+ BTM_BLE_TRACK_ADV_ADD,
+ BTM_BLE_TRACK_ADV_REMOVE
+};
+
+typedef UINT8 tBTM_BLE_TRACK_ADV_ACTION;
+
+#define BTM_BLE_MULTI_ADV_INVALID 0
+
+#define BTM_BLE_BATCH_SCAN_ENABLE_EVT 1
+#define BTM_BLE_BATCH_SCAN_CFG_STRG_EVT 2
+#define BTM_BLE_BATCH_SCAN_READ_REPTS_EVT 3
+#define BTM_BLE_BATCH_SCAN_THR_EVT 4
+#define BTM_BLE_BATCH_SCAN_PARAM_EVT 5
+#define BTM_BLE_BATCH_SCAN_DISABLE_EVT 6
+
+typedef UINT8 tBTM_BLE_BATCH_SCAN_EVT;
+
+typedef UINT32 tBTM_BLE_TX_TIME_MS;
+typedef UINT32 tBTM_BLE_RX_TIME_MS;
+typedef UINT32 tBTM_BLE_IDLE_TIME_MS;
+typedef UINT32 tBTM_BLE_ENERGY_USED;
+
+typedef void (tBTM_BLE_ENERGY_INFO_CBACK)(tBTM_BLE_TX_TIME_MS tx_time, tBTM_BLE_RX_TIME_MS rx_time,
+ tBTM_BLE_IDLE_TIME_MS idle_time,
+ tBTM_BLE_ENERGY_USED energy_used,
+ tBTM_STATUS status);
+
+typedef struct
+{
+ tBTM_BLE_ENERGY_INFO_CBACK *p_ener_cback;
+}tBTM_BLE_ENERGY_INFO_CB;
+
typedef BOOLEAN (tBTM_BLE_SEL_CBACK)(BD_ADDR random_bda, UINT8 *p_remote_name);
+typedef void (tBTM_BLE_CTRL_FEATURES_CBACK)(tBTM_STATUS status);
/* callback function for SMP signing algorithm, signed data in little endian order with tlen bits long */
typedef void (tBTM_BLE_SIGN_CBACK)(void *p_ref_data, UINT8 *p_signing_data);
@@ -313,6 +819,8 @@
typedef void (tBTM_BLE_SCAN_REQ_CBACK)(BD_ADDR remote_bda, tBLE_ADDR_TYPE addr_type, UINT8 adv_evt);
+tBTM_BLE_SCAN_SETUP_CBACK bta_ble_scan_setup_cb;
+
/*****************************************************************************
** EXTERNAL FUNCTION DECLARATIONS
*****************************************************************************/
@@ -401,6 +909,18 @@
BTM_API extern void BTM_BleReadAdvParams (UINT16 *adv_int_min, UINT16 *adv_int_max,
tBLE_BD_ADDR *p_dir_bda, tBTM_BLE_ADV_CHNL_MAP *p_chnl_map);
+/*******************************************************************************
+**
+** Function BTM_BleObtainVendorCapabilities
+**
+** Description This function is called to obatin vendor capabilties
+**
+** Parameters p_cmn_vsc_cb - Returns the vednor capabilities
+**
+** Returns void
+**
+*******************************************************************************/
+extern void BTM_BleObtainVendorCapabilities(tBTM_BLE_VSC_CB *p_cmn_vsc_cb);
/*******************************************************************************
**
@@ -417,6 +937,105 @@
*******************************************************************************/
BTM_API extern void BTM_BleSetScanParams(UINT16 scan_interval, UINT16 scan_window,
tBTM_BLE_SCAN_MODE scan_type);
+/*******************************************************************************
+**
+** Function BTM_BleGetVendorCapabilities
+**
+** Description This function reads local LE features
+**
+** Parameters p_cmn_vsc_cb : Locala LE capability structure
+**
+** Returns void
+**
+*******************************************************************************/
+BTM_API extern void BTM_BleGetVendorCapabilities(tBTM_BLE_VSC_CB *p_cmn_vsc_cb);
+/*******************************************************************************
+**
+** Function BTM_BleSetStorageConfig
+**
+** Description This function is called to setup storage configuration and setup callbacks.
+**
+** Parameters UINT8 batch_scan_full_max -Batch scan full maximum
+ UINT8 batch_scan_trunc_max - Batch scan truncated value maximum
+ UINT8 batch_scan_notify_threshold - Threshold value
+ tBTM_BLE_SCAN_SETUP_CBACK *p_setup_cback - Setup callback
+ tBTM_BLE_SCAN_THRESHOLD_CBACK *p_thres_cback -Threshold callback
+ void *p_ref - Reference value
+**
+** Returns tBTM_STATUS
+**
+*******************************************************************************/
+BTM_API extern tBTM_STATUS BTM_BleSetStorageConfig(UINT8 batch_scan_full_max,
+ UINT8 batch_scan_trunc_max,
+ UINT8 batch_scan_notify_threshold,
+ tBTM_BLE_SCAN_SETUP_CBACK *p_setup_cback,
+ tBTM_BLE_SCAN_THRESHOLD_CBACK *p_thres_cback,
+ tBTM_BLE_SCAN_REP_CBACK* p_cback,
+ tBTM_BLE_REF_VALUE ref_value);
+
+/*******************************************************************************
+**
+** Function BTM_BleEnableBatchScan
+**
+** Description This function is called to enable batch scan
+**
+** Parameters tBTM_BLE_BATCH_SCAN_MODE scan_mode - Batch scan mode
+ UINT32 scan_interval -Scan interval
+ UINT32 scan_window - Scan window value
+ tBLE_ADDR_TYPE addr_type - Address type
+ tBTM_BLE_DISCARD_RULE discard_rule - Data discard rules
+**
+** Returns tBTM_STATUS
+**
+*******************************************************************************/
+BTM_API extern tBTM_STATUS BTM_BleEnableBatchScan(tBTM_BLE_BATCH_SCAN_MODE scan_mode,
+ UINT32 scan_interval, UINT32 scan_window,
+ tBTM_BLE_DISCARD_RULE discard_rule,
+ tBLE_ADDR_TYPE addr_type,
+ tBTM_BLE_REF_VALUE ref_value);
+
+/*******************************************************************************
+**
+** Function BTM_BleDisableBatchScan
+**
+** Description This function is called to disable batch scanning
+**
+** Parameters void
+**
+** Returns void
+**
+*******************************************************************************/
+BTM_API extern tBTM_STATUS BTM_BleDisableBatchScan(tBTM_BLE_REF_VALUE ref_value);
+
+/*******************************************************************************
+**
+** Function BTM_BleReadScanReports
+**
+** Description This function is called to read batch scan reports
+**
+** Parameters tBTM_BLE_SCAN_MODE scan_mode - Scan mode report to be read out
+ tBTM_BLE_SCAN_REP_CBACK* p_cback - Reports callback
+**
+** Returns tBTM_STATUS
+**
+*******************************************************************************/
+BTM_API extern tBTM_STATUS BTM_BleReadScanReports(tBTM_BLE_SCAN_MODE scan_mode,
+ tBTM_BLE_REF_VALUE ref_value);
+
+/*******************************************************************************
+**
+** Function BTM_BleTrackAdvertiser
+**
+** Description This function is called to read batch scan reports
+**
+** Parameters p_track_cback - Tracking callback
+** ref_value - Reference value
+**
+** Returns tBTM_STATUS
+**
+*******************************************************************************/
+BTM_API extern tBTM_STATUS BTM_BleTrackAdvertiser(tBTM_BLE_TRACK_ADV_CBACK *p_track_cback,
+ tBTM_BLE_REF_VALUE ref_value);
/*******************************************************************************
**
@@ -434,19 +1053,6 @@
/*******************************************************************************
**
-** Function BTM_BleReset
-**
-** Description This function is called to reset ULP controller.
-**
-** Parameters None.
-**
-** Returns void
-**
-*******************************************************************************/
-BTM_API extern void BTM_BleReset(void);
-
-/*******************************************************************************
-**
** Function BTM_BleObserve
**
** Description This procedure keep the device listening for advertising
@@ -661,6 +1267,20 @@
*******************************************************************************/
BTM_API extern BOOLEAN BTM_BleUpdateBgConnDev(BOOLEAN add_remove, BD_ADDR remote_bda);
+/*******************************************************************************
+**
+** Function BTM_BleClearBgConnDev
+**
+** Description This function is called to clear the whitelist,
+** end any pending whitelist connections,
+* and reset the local bg device list.
+**
+** Parameters void
+**
+** Returns void
+**
+*******************************************************************************/
+BTM_API extern void BTM_BleClearBgConnDev(void);
/********************************************************
**
@@ -698,6 +1318,19 @@
*******************************************************************************/
BTM_API extern void BTM_BleSetConnScanParams (UINT16 scan_interval, UINT16 scan_window);
+/******************************************************************************
+**
+** Function BTM_BleReadControllerFeatures
+**
+** Description Reads BLE specific controller features
+**
+** Parameters: tBTM_BLE_CTRL_FEATURES_CBACK : Callback to notify when features are read
+**
+** Returns void
+**
+*******************************************************************************/
+BTM_API extern void BTM_BleReadControllerFeatures(tBTM_BLE_CTRL_FEATURES_CBACK *p_vsc_cback);
+
/*******************************************************************************
**
** Function BTM_CheckAdvData
@@ -772,6 +1405,28 @@
/*******************************************************************************
**
+** Function BTM_BleLocalPrivacyEnabled
+**
+** Description Checks if local device supports private address
+**
+** Returns Return TRUE if local privacy is enabled else FALSE
+**
+*******************************************************************************/
+BTM_API extern BOOLEAN BTM_BleLocalPrivacyEnabled();
+
+/*******************************************************************************
+**
+** Function BTM_BleMaxMultiAdvInstanceCount
+**
+** Description Returns max number of multi adv instances supported by controller
+**
+** Returns Max multi adv instance count
+**
+*******************************************************************************/
+BTM_API extern UINT8 BTM_BleMaxMultiAdvInstanceCount();
+
+/*******************************************************************************
+**
** Function BTM_BleSetConnMode
**
** Description This function is called to set BLE connectable mode for a
@@ -866,17 +1521,6 @@
/*******************************************************************************
**
-** Function BTM_IsBleLink
-**
-** Description This function is to check the link type is BLE or BR/EDR.
-**
-** Returns TRUE if BLE link; FALSE if BR/EDR.
-**
-*******************************************************************************/
-BTM_API extern BOOLEAN BTM_IsBleLink (BD_ADDR bd_addr);
-
-/*******************************************************************************
-**
** Function BTM_UseLeLink
**
** Description This function is to select the underneath physical link to use.
@@ -886,6 +1530,158 @@
*******************************************************************************/
BTM_API extern BOOLEAN BTM_UseLeLink (BD_ADDR bd_addr);
+/*******************************************************************************
+**
+** Function BTM_BleStackEnable
+**
+** Description Enable/Disable BLE functionality on stack regarless controller
+** capability.
+**
+** Parameters: enable: TRUE to enable, FALSE to disable.
+**
+** Returns TRUE if added OK, else FALSE
+**
+*******************************************************************************/
+BTM_API extern tBTM_STATUS BTM_BleStackEnable (BOOLEAN enable);
+
+/*******************************************************************************/
+/* Multi ADV API */
+/*******************************************************************************
+**
+** Function BTM_BleEnableAdvInstance
+**
+** Description This function enable a Multi-ADV instance with the specified
+** adv parameters
+**
+** Parameters p_params: pointer to the adv parameter structure, set as default
+** adv parameter when the instance is enabled.
+** p_cback: callback function for the adv instance.
+** p_ref: reference data attach to the adv instance to be enabled.
+**
+** Returns status
+**
+*******************************************************************************/
+BTM_API extern tBTM_STATUS BTM_BleEnableAdvInstance (tBTM_BLE_ADV_PARAMS *p_params,
+ tBTM_BLE_MULTI_ADV_CBACK *p_cback,
+ void *p_ref);
+
+/*******************************************************************************
+**
+** Function BTM_BleUpdateAdvInstParam
+**
+** Description This function update a Multi-ADV instance with the specififed
+** adv parameters.
+**
+** Parameters inst_id: adv instance ID
+** p_params: pointer to the adv parameter structure.
+**
+** Returns status
+**
+*******************************************************************************/
+BTM_API extern tBTM_STATUS BTM_BleUpdateAdvInstParam (UINT8 inst_id, tBTM_BLE_ADV_PARAMS *p_params);
+
+/*******************************************************************************
+**
+** Function BTM_BleCfgAdvInstData
+**
+** Description This function configure a Multi-ADV instance with the specified
+** adv data or scan response data.
+**
+** Parameters inst_id: adv instance ID
+** is_scan_rsp: is this scacn response, if no set as adv data.
+** data_mask: adv data mask.
+** p_data: pointer to the adv data structure.
+**
+** Returns status
+**
+*******************************************************************************/
+BTM_API extern tBTM_STATUS BTM_BleCfgAdvInstData (UINT8 inst_id, BOOLEAN is_scan_rsp,
+ tBTM_BLE_AD_MASK data_mask,
+ tBTM_BLE_ADV_DATA *p_data);
+
+/*******************************************************************************
+**
+** Function BTM_BleDisableAdvInstance
+**
+** Description This function disable a Multi-ADV instance.
+**
+** Parameters inst_id: adv instance ID
+**
+** Returns status
+**
+*******************************************************************************/
+BTM_API extern tBTM_STATUS BTM_BleDisableAdvInstance (UINT8 inst_id);
+
+/*******************************************************************************
+**
+** Function BTM_BleAdvFilterParamSetup
+**
+** Description This function is called to setup the adv data payload filter
+** condition.
+**
+** Parameters p_target: enabble the filter condition on a target device; if NULL
+** enable the generic scan condition.
+** enable: enable or disable the filter condition
+**
+** Returns void
+**
+*******************************************************************************/
+BTM_API extern tBTM_STATUS BTM_BleAdvFilterParamSetup(int action,
+ tBTM_BLE_PF_FILT_INDEX filt_index,
+ tBTM_BLE_PF_FILT_PARAMS *p_filt_params,
+ tBLE_BD_ADDR *p_target, tBTM_BLE_PF_PARAM_CBACK *p_cmpl_cback,
+ tBTM_BLE_REF_VALUE ref_value);
+
+/*******************************************************************************
+**
+** Function BTM_BleCfgFilterCondition
+**
+** Description This function is called to configure the adv data payload filter
+** condition.
+**
+** Parameters action: to read/write/clear
+** cond_type: filter condition type.
+** p_cond: filter condition paramter
+**
+** Returns tBTM_STATUS
+**
+*******************************************************************************/
+BTM_API extern tBTM_STATUS BTM_BleCfgFilterCondition(tBTM_BLE_SCAN_COND_OP action,
+ tBTM_BLE_PF_COND_TYPE cond_type,
+ tBTM_BLE_PF_FILT_INDEX filt_index,
+ tBTM_BLE_PF_COND_PARAM *p_cond,
+ tBTM_BLE_PF_CFG_CBACK *p_cmpl_cback,
+ tBTM_BLE_REF_VALUE ref_value);
+
+/*******************************************************************************
+**
+** Function BTM_BleEnableDisableFilterFeature
+**
+** Description This function is called to enable or disable the APCF feature
+**
+** Parameters enable - TRUE - enables the APCF, FALSE - disables the APCF
+** ref_value - Ref value
+**
+** Returns tBTM_STATUS
+**
+*******************************************************************************/
+BTM_API extern tBTM_STATUS BTM_BleEnableDisableFilterFeature(UINT8 enable,
+ tBTM_BLE_PF_STATUS_CBACK *p_stat_cback,
+ tBTM_BLE_REF_VALUE ref_value);
+
+/*******************************************************************************
+**
+** Function BTM_BleGetEnergyInfo
+**
+** Description This function obtains the energy info
+**
+** Parameters p_ener_cback - Callback pointer
+**
+** Returns status
+**
+*******************************************************************************/
+BTM_API extern tBTM_STATUS BTM_BleGetEnergyInfo(tBTM_BLE_ENERGY_INFO_CBACK *p_ener_cback);
+
#ifdef __cplusplus
}
#endif
diff --git a/stack/include/btu.h b/stack/include/btu.h
index 4f0e162..5526536 100644
--- a/stack/include/btu.h
+++ b/stack/include/btu.h
@@ -153,10 +153,13 @@
#define BTU_TTYPE_ATT_WAIT_FOR_APP_RSP 104
#define BTU_TTYPE_ATT_WAIT_FOR_IND_ACK 105
-#define BTU_TTYPE_UCD_TO 106
+#define BTU_TTYPE_BLE_GAP_FAST_ADV 106
+#define BTU_TTYPE_BLE_OBSERVE 107
-/* BTU timer event for TBFC */
-#define BTU_TTYPE_TBFC_RESUME 107
+
+#define BTU_TTYPE_UCD_TO 108
+
+
/* Define the BTU_TASK APPL events
*/
@@ -228,6 +231,7 @@
TIMER_LIST_Q quick_timer_queue; /* Timer queue for transport level (100/10 msec)*/
TIMER_LIST_Q timer_queue; /* Timer queue for normal BTU task (1 second) */
+ TIMER_LIST_Q timer_queue_oneshot; /* Timer queue for oneshot BTU tasks */
TIMER_LIST_ENT cmd_cmpl_timer; /* Command complete timer */
@@ -266,13 +270,11 @@
*/
BTU_API extern void btu_start_timer (TIMER_LIST_ENT *p_tle, UINT16 type, UINT32 timeout);
BTU_API extern void btu_stop_timer (TIMER_LIST_ENT *p_tle);
-BTU_API extern void btu_register_timer (TIMER_LIST_ENT *p_tle, UINT16 type, UINT32 timeout, tBTU_TIMER_CALLBACK timer_cb);
-BTU_API extern void btu_deregister_timer(TIMER_LIST_ENT *p_tle);
+BTU_API extern void btu_start_timer_oneshot(TIMER_LIST_ENT *p_tle, UINT16 type, UINT32 timeout);
+BTU_API extern void btu_stop_timer_oneshot(TIMER_LIST_ENT *p_tle);
+
BTU_API extern UINT32 btu_remaining_time (TIMER_LIST_ENT *p_tle);
-
-BTU_API extern void btu_register_event_range (UINT16 range, tBTU_EVENT_CALLBACK event_cb);
-BTU_API extern void btu_deregister_event_range (UINT16 range);
BTU_API extern void btu_uipc_rx_cback(BT_HDR *p_msg);
BTU_API extern void btu_hcif_flush_cmd_queue(void);
diff --git a/stack/include/gap_api.h b/stack/include/gap_api.h
index a17510f..a210f69 100644
--- a/stack/include/gap_api.h
+++ b/stack/include/gap_api.h
@@ -440,10 +440,16 @@
**
** Description This function is called to initiate bonding with peer device
**
+** Parameters: bd_addr - Address of the device to bond
+** pin_len - length in bytes of the PIN Code
+** p_pin - pointer to array with the PIN Code
+** trusted_mask - bitwise OR of trusted services (array of UINT32)
+**
** Returns tBTM_STATUS - BTM_CMD_STARTED of successfully initiated
**
*******************************************************************************/
-GAP_API extern UINT8 GAP_Bond (BD_ADDR bd_addr, UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[]);
+GAP_API extern UINT8 GAP_Bond (BD_ADDR bd_addr, UINT8 pin_len,
+ UINT8 *p_pin, UINT32 trusted_mask[]);
/*******************************************************************************
**
diff --git a/stack/include/gatt_api.h b/stack/include/gatt_api.h
index f3df8b7..392b4b2 100644
--- a/stack/include/gatt_api.h
+++ b/stack/include/gatt_api.h
@@ -25,44 +25,48 @@
** Constants
*****************************************************************************/
/* Success code and error codes */
-#define GATT_SUCCESS 0x0000
-#define GATT_INVALID_HANDLE 0x0001
-#define GATT_READ_NOT_PERMIT 0x0002
-#define GATT_WRITE_NOT_PERMIT 0x0003
-#define GATT_INVALID_PDU 0x0004
-#define GATT_INSUF_AUTHENTICATION 0x0005
-#define GATT_REQ_NOT_SUPPORTED 0x0006
-#define GATT_INVALID_OFFSET 0x0007
-#define GATT_INSUF_AUTHORIZATION 0x0008
-#define GATT_PREPARE_Q_FULL 0x0009
-#define GATT_NOT_FOUND 0x000a
-#define GATT_NOT_LONG 0x000b
-#define GATT_INSUF_KEY_SIZE 0x000c
-#define GATT_INVALID_ATTR_LEN 0x000d
-#define GATT_ERR_UNLIKELY 0x000e
-#define GATT_INSUF_ENCRYPTION 0x000f
-#define GATT_UNSUPPORT_GRP_TYPE 0x0010
-#define GATT_INSUF_RESOURCE 0x0011
+#define GATT_SUCCESS 0x00
+#define GATT_INVALID_HANDLE 0x01
+#define GATT_READ_NOT_PERMIT 0x02
+#define GATT_WRITE_NOT_PERMIT 0x03
+#define GATT_INVALID_PDU 0x04
+#define GATT_INSUF_AUTHENTICATION 0x05
+#define GATT_REQ_NOT_SUPPORTED 0x06
+#define GATT_INVALID_OFFSET 0x07
+#define GATT_INSUF_AUTHORIZATION 0x08
+#define GATT_PREPARE_Q_FULL 0x09
+#define GATT_NOT_FOUND 0x0a
+#define GATT_NOT_LONG 0x0b
+#define GATT_INSUF_KEY_SIZE 0x0c
+#define GATT_INVALID_ATTR_LEN 0x0d
+#define GATT_ERR_UNLIKELY 0x0e
+#define GATT_INSUF_ENCRYPTION 0x0f
+#define GATT_UNSUPPORT_GRP_TYPE 0x10
+#define GATT_INSUF_RESOURCE 0x11
-#define GATT_ILLEGAL_PARAMETER 0x0087
-#define GATT_NO_RESOURCES 0x0080
-#define GATT_INTERNAL_ERROR 0x0081
-#define GATT_WRONG_STATE 0x0082
-#define GATT_DB_FULL 0x0083
-#define GATT_BUSY 0x0084
-#define GATT_ERROR 0x0085
-#define GATT_CMD_STARTED 0x0086
-#define GATT_PENDING 0x0088
-#define GATT_AUTH_FAIL 0x0089
-#define GATT_MORE 0x008a
-#define GATT_INVALID_CFG 0x008b
-#define GATT_SERVICE_STARTED 0x008c
+#define GATT_ILLEGAL_PARAMETER 0x87
+#define GATT_NO_RESOURCES 0x80
+#define GATT_INTERNAL_ERROR 0x81
+#define GATT_WRONG_STATE 0x82
+#define GATT_DB_FULL 0x83
+#define GATT_BUSY 0x84
+#define GATT_ERROR 0x85
+#define GATT_CMD_STARTED 0x86
+#define GATT_PENDING 0x88
+#define GATT_AUTH_FAIL 0x89
+#define GATT_MORE 0x8a
+#define GATT_INVALID_CFG 0x8b
+#define GATT_SERVICE_STARTED 0x8c
#define GATT_ENCRYPED_MITM GATT_SUCCESS
-#define GATT_ENCRYPED_NO_MITM 0x008d
-#define GATT_NOT_ENCRYPTED 0x008e
+#define GATT_ENCRYPED_NO_MITM 0x8d
+#define GATT_NOT_ENCRYPTED 0x8e
+#define GATT_CONGESTED 0x8f
-
+ /* 0xE0 ~ 0xFC reserved for future use */
+#define GATT_CCC_CFG_ERR 0xFD /* Client Characteristic Configuration Descriptor Improperly Configured */
+#define GATT_PRC_IN_PROGRESS 0xFE /* Procedure Already in progress */
+#define GATT_OUT_OF_RANGE 0xFF /* Attribute value out of range */
typedef UINT8 tGATT_STATUS;
@@ -325,12 +329,9 @@
} tGATTS_RSP;
/* Transports for the primary service */
-enum
-{
- GATT_TRANSPORT_LE,
- GATT_TRANSPORT_BR_EDR,
- GATT_TRANSPORT_LE_BR_EDR
-};
+#define GATT_TRANSPORT_LE BT_TRANSPORT_LE
+#define GATT_TRANSPORT_BR_EDR BT_TRANSPORT_BR_EDR
+#define GATT_TRANSPORT_LE_BR_EDR (BT_TRANSPORT_LE|BT_TRANSPORT_BR_EDR)
typedef UINT8 tGATT_TRANSPORT;
#define GATT_PREP_WRITE_CANCEL 0x00
@@ -548,26 +549,33 @@
typedef UINT8 tGATT_IF;
-#define GATT_LINK_IDLE_TIMEOUT_WHEN_NO_APP 0 /* start a idle timer for this duration when no application
- need to use the link */
+#define GATT_LINK_IDLE_TIMEOUT_WHEN_NO_APP 0 /* start a idle timer for this duration
+ when no application need to use the link */
#define GATT_LINK_NO_IDLE_TIMEOUT 0xFFFF
#define GATT_INVALID_ACL_HANDLE 0xFFFF
/* discover result callback function */
-typedef void (tGATT_DISC_RES_CB) (UINT16 conn_id, tGATT_DISC_TYPE disc_type, tGATT_DISC_RES *p_data);
+typedef void (tGATT_DISC_RES_CB) (UINT16 conn_id, tGATT_DISC_TYPE disc_type,
+ tGATT_DISC_RES *p_data);
/* discover complete callback function */
typedef void (tGATT_DISC_CMPL_CB) (UINT16 conn_id, tGATT_DISC_TYPE disc_type, tGATT_STATUS status);
/* Define a callback function for when read/write/disc/config operation is completed. */
-typedef void (tGATT_CMPL_CBACK) (UINT16 conn_id, tGATTC_OPTYPE op, tGATT_STATUS status, tGATT_CL_COMPLETE *p_data);
+typedef void (tGATT_CMPL_CBACK) (UINT16 conn_id, tGATTC_OPTYPE op, tGATT_STATUS status,
+ tGATT_CL_COMPLETE *p_data);
/* Define a callback function when an initialized connection is established. */
-typedef void (tGATT_CONN_CBACK) (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id, BOOLEAN connected, tGATT_DISCONN_REASON reason);
+typedef void (tGATT_CONN_CBACK) (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id, BOOLEAN connected,
+ tGATT_DISCONN_REASON reason, tBT_TRANSPORT transport);
/* attribute request callback for ATT server */
-typedef void (tGATT_REQ_CBACK )(UINT16 conn_id, UINT32 trans_id, tGATTS_REQ_TYPE type, tGATTS_DATA *p_data);
+typedef void (tGATT_REQ_CBACK )(UINT16 conn_id, UINT32 trans_id, tGATTS_REQ_TYPE type,
+ tGATTS_DATA *p_data);
+
+/* channel congestion/uncongestion callback */
+typedef void (tGATT_CONGESTION_CBACK )(UINT16 conn_id, BOOLEAN congested);
/* Define a callback function when encryption is established. */
typedef void (tGATT_ENC_CMPL_CB)(tGATT_IF gatt_if, BD_ADDR bda);
@@ -585,6 +593,7 @@
tGATT_DISC_CMPL_CB *p_disc_cmpl_cb;
tGATT_REQ_CBACK *p_req_cb;
tGATT_ENC_CMPL_CB *p_enc_cmpl_cb;
+ tGATT_CONGESTION_CBACK *p_congestion_cb;
} tGATT_CBACK;
/*********************** Start Handle Management Definitions **********************
@@ -639,7 +648,8 @@
/* Attibute server handle ranges NV storage callback functions
*/
typedef void (tGATTS_NV_SAVE_CBACK)(BOOLEAN is_saved, tGATTS_HNDL_RANGE *p_hndl_range);
-typedef BOOLEAN (tGATTS_NV_SRV_CHG_CBACK)(tGATTS_SRV_CHG_CMD cmd, tGATTS_SRV_CHG_REQ *p_req, tGATTS_SRV_CHG_RSP *p_rsp);
+typedef BOOLEAN (tGATTS_NV_SRV_CHG_CBACK)(tGATTS_SRV_CHG_CMD cmd, tGATTS_SRV_CHG_REQ *p_req,
+ tGATTS_SRV_CHG_RSP *p_rsp);
typedef struct
{
@@ -801,7 +811,8 @@
** Returns TRUE if operation succeed, FALSE if handle block was not found.
**
*******************************************************************************/
- GATT_API extern BOOLEAN GATTS_DeleteService (tGATT_IF gatt_if, tBT_UUID *p_svc_uuid, UINT16 svc_inst);
+ GATT_API extern BOOLEAN GATTS_DeleteService (tGATT_IF gatt_if, tBT_UUID *p_svc_uuid,
+ UINT16 svc_inst);
/*******************************************************************************
**
@@ -998,11 +1009,13 @@
**
** Parameter bd_addr: target device bd address.
** idle_tout: timeout value in seconds.
+** transport: trasnport option.
**
** Returns void
**
*******************************************************************************/
- GATT_API extern void GATT_SetIdleTimeout (BD_ADDR bd_addr, UINT16 idle_tout);
+ GATT_API extern void GATT_SetIdleTimeout (BD_ADDR bd_addr, UINT16 idle_tout,
+ tGATT_TRANSPORT transport);
/*******************************************************************************
@@ -1058,11 +1071,13 @@
** Parameters gatt_if: applicaiton interface
** bd_addr: peer device address.
** is_direct: is a direct conenection or a background auto connection
+** transport : Physical transport for GATT connection (BR/EDR or LE)
**
** Returns TRUE if connection started; FALSE if connection start failure.
**
*******************************************************************************/
- GATT_API extern BOOLEAN GATT_Connect (tGATT_IF gatt_if, BD_ADDR bd_addr, BOOLEAN is_direct);
+ GATT_API extern BOOLEAN GATT_Connect (tGATT_IF gatt_if, BD_ADDR bd_addr,
+ BOOLEAN is_direct, tBT_TRANSPORT transport);
/*******************************************************************************
@@ -1080,7 +1095,8 @@
** Returns TRUE if connection started; FALSE if connection start failure.
**
*******************************************************************************/
- GATT_API extern BOOLEAN GATT_CancelConnect (tGATT_IF gatt_if, BD_ADDR bd_addr, BOOLEAN is_direct);
+ GATT_API extern BOOLEAN GATT_CancelConnect (tGATT_IF gatt_if, BD_ADDR bd_addr,
+ BOOLEAN is_direct);
/*******************************************************************************
**
@@ -1108,11 +1124,13 @@
** Parameters conn_id: connection id (input)
** p_gatt_if: applicaiton interface (output)
** bd_addr: peer device address. (output)
+** transport : physical transport of the GATT connection (BR/EDR or LE)
**
** Returns TRUE the ligical link information is found for conn_id
**
*******************************************************************************/
- GATT_API extern BOOLEAN GATT_GetConnectionInfor(UINT16 conn_id, tGATT_IF *p_gatt_if, BD_ADDR bd_addr);
+ GATT_API extern BOOLEAN GATT_GetConnectionInfor(UINT16 conn_id, tGATT_IF *p_gatt_if,
+ BD_ADDR bd_addr, tBT_TRANSPORT *p_transport);
/*******************************************************************************
@@ -1125,11 +1143,13 @@
** Parameters gatt_if: applicaiton interface (input)
** bd_addr: peer device address. (input)
** p_conn_id: connection id (output)
+** transport : physical transport of the GATT connection (BR/EDR or LE)
**
** Returns TRUE the ligical link is connected
**
*******************************************************************************/
- GATT_API extern BOOLEAN GATT_GetConnIdIfConnected(tGATT_IF gatt_if, BD_ADDR bd_addr, UINT16 *p_conn_id);
+ GATT_API extern BOOLEAN GATT_GetConnIdIfConnected(tGATT_IF gatt_if, BD_ADDR bd_addr,
+ UINT16 *p_conn_id, tBT_TRANSPORT transport);
/*******************************************************************************
diff --git a/stack/include/hcidefs.h b/stack/include/hcidefs.h
index ad31d52..0349d6a 100644
--- a/stack/include/hcidefs.h
+++ b/stack/include/hcidefs.h
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1999-2012 Broadcom Corporation
+ * Copyright (C) 1999-2014 Broadcom Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -231,11 +231,11 @@
#define HCI_SET_MWS_PATTERN_CONFIGURATION (0x0073 | HCI_GRP_HOST_CONT_BASEBAND_CMDS)
/* ConnectionLess Broadcast */
-#define HCI_SET_RESERVED_LT_ADDR (0x0077 | HCI_GRP_HOST_CONT_BASEBAND_CMDS)
-#define HCI_DELETE_RESERVED_LT_ADDR (0x0078 | HCI_GRP_HOST_CONT_BASEBAND_CMDS)
-#define HCI_WRITE_CLB_DATA (0x0079 | HCI_GRP_HOST_CONT_BASEBAND_CMDS)
-#define HCI_WRITE_SYNC_TRAIN_PARAM (0x007A | HCI_GRP_HOST_CONT_BASEBAND_CMDS)
-#define HCI_READ_SYNC_TRAIN_PARAM (0x007B | HCI_GRP_HOST_CONT_BASEBAND_CMDS)
+#define HCI_SET_RESERVED_LT_ADDR (0x0074 | HCI_GRP_HOST_CONT_BASEBAND_CMDS)
+#define HCI_DELETE_RESERVED_LT_ADDR (0x0075 | HCI_GRP_HOST_CONT_BASEBAND_CMDS)
+#define HCI_WRITE_CLB_DATA (0x0076 | HCI_GRP_HOST_CONT_BASEBAND_CMDS)
+#define HCI_READ_SYNC_TRAIN_PARAM (0x0077 | HCI_GRP_HOST_CONT_BASEBAND_CMDS)
+#define HCI_WRITE_SYNC_TRAIN_PARAM (0x0078 | HCI_GRP_HOST_CONT_BASEBAND_CMDS)
#define HCI_CONT_BASEBAND_CMDS_FIRST HCI_SET_EVENT_MASK
#define HCI_CONT_BASEBAND_CMDS_LAST HCI_READ_SYNC_TRAIN_PARAM
@@ -323,12 +323,56 @@
#define HCI_BLE_LTK_REQ_REPLY (0x001A | HCI_GRP_BLE_CMDS)
#define HCI_BLE_LTK_REQ_NEG_REPLY (0x001B | HCI_GRP_BLE_CMDS)
#define HCI_BLE_READ_SUPPORTED_STATES (0x001C | HCI_GRP_BLE_CMDS)
+ /*0x001D, 0x001E and 0x001F are reserved*/
+
+#define HCI_BLE_RC_PARAM_REQ_REPLY (0x0020 | HCI_GRP_BLE_CMDS)
+#define HCI_BLE_RC_PARAM_REQ_NEG_REPLY (0x0021 | HCI_GRP_BLE_CMDS)
+
+
/* BLE TEST COMMANDS */
#define HCI_BLE_RECEIVER_TEST (0x001D | HCI_GRP_BLE_CMDS)
#define HCI_BLE_TRANSMITTER_TEST (0x001E | HCI_GRP_BLE_CMDS)
#define HCI_BLE_TEST_END (0x001F | HCI_GRP_BLE_CMDS)
-#define HCI_BLE_RESET (0x0020 | HCI_GRP_BLE_CMDS)
+/* LE Get Vendor Capabilities Command OCF */
+#define HCI_BLE_VENDOR_CAP_OCF (0x0153 | HCI_GRP_VENDOR_SPECIFIC)
+
+/* Multi adv OCF */
+#define HCI_BLE_MULTI_ADV_OCF (0x0154 | HCI_GRP_VENDOR_SPECIFIC)
+
+/* Batch scan OCF */
+#define HCI_BLE_BATCH_SCAN_OCF (0x0156 | HCI_GRP_VENDOR_SPECIFIC)
+
+/* ADV filter OCF */
+#define HCI_BLE_ADV_FILTER_OCF (0x0157 | HCI_GRP_VENDOR_SPECIFIC)
+
+/* Tracking OCF */
+#define HCI_BLE_TRACK_ADV_OCF (0x0158 | HCI_GRP_VENDOR_SPECIFIC)
+
+/* Energy info OCF */
+#define HCI_BLE_ENERGY_INFO_OCF (0x0159 | HCI_GRP_VENDOR_SPECIFIC)
+
+/* subcode for multi adv feature */
+#define BTM_BLE_MULTI_ADV_SET_PARAM 0x01
+#define BTM_BLE_MULTI_ADV_WRITE_ADV_DATA 0x02
+#define BTM_BLE_MULTI_ADV_WRITE_SCAN_RSP_DATA 0x03
+#define BTM_BLE_MULTI_ADV_SET_RANDOM_ADDR 0x04
+#define BTM_BLE_MULTI_ADV_ENB 0x05
+
+/* multi adv VSE subcode */
+#define HCI_VSE_SUBCODE_BLE_MULTI_ADV_ST_CHG 0x55 /* multi adv instance state change */
+
+/* subcode for batch scan feature */
+#define BTM_BLE_BATCH_SCAN_ENB_DISAB_CUST_FEATURE 0x01
+#define BTM_BLE_BATCH_SCAN_SET_STORAGE_PARAM 0x02
+#define BTM_BLE_BATCH_SCAN_SET_PARAMS 0x03
+#define BTM_BLE_BATCH_SCAN_READ_RESULTS 0x04
+
+/* batch scan VSE subcode */
+#define HCI_VSE_SUBCODE_BLE_THRESHOLD_SUB_EVT 0x54 /* Threshold event */
+
+/* tracking sub event */
+#define HCI_VSE_SUBCODE_BLE_TRACKING_SUB_EVT 0x56 /* Tracking event */
/* LE supported states definition */
#define HCI_LE_ADV_STATE 0x00000001
@@ -344,6 +388,214 @@
#define HCI_LE_SCAN_SL_STATE 0x00000400
#define HCI_LE_INIT_MA_STATE 0x00000800
+/* LE Supported States */
+/* Non Connectable Adv state is supported. 0x0000000000000001 */
+#define HCI_SUPP_LE_STATES_NON_CONN_ADV_MASK 0x01
+#define HCI_SUPP_LE_STATES_NON_CONN_ADV_OFF 0
+#define HCI_LE_STATES_NON_CONN_ADV_SUPPORTED(x) ((x)[HCI_SUPP_LE_STATES_NON_CONN_ADV_OFF] & HCI_SUPP_LE_STATES_NON_CONN_ADV_MASK)
+
+/*Scanneable Connectable Adv state is supported. 0x0000000000000002 */
+#define HCI_SUPP_LE_STATES_SCAN_ADV_MASK 0x02
+#define HCI_SUPP_LE_STATESSCAN_ADV_OFF 0
+#define HCI_LE_STATES_SCAN_ADV_SUPPORTED(x) ((x)[HCI_SUPP_LE_STATESSCAN_ADV_OFF] & HCI_SUPP_LE_STATES_SCAN_ADV_MASK)
+
+/* Connectable Adv state is supported. 0x0000000000000004 */
+#define HCI_SUPP_LE_STATES_CONN_ADV_MASK 0x04
+#define HCI_SUPP_LE_STATES_CONN_ADV_OFF 0
+#define HCI_LE_STATES_CONN_ADV_SUPPORTED(x) ((x)[HCI_SUPP_LE_STATES_CONN_ADV_OFF] & HCI_SUPP_LE_STATES_CONN_ADV_MASK)
+
+/* Hi duty Cycle Directed Adv state is supported. 0x0000000000000008 */
+#define HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_MASK 0x08
+#define HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_OFF 0
+#define HCI_LE_STATES_HI_DUTY_DIR_ADV_SUPPORTED(x) ((x)[HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_OFF] & HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_MASK)
+
+/* Passive Scan state is supported. 0x0000000000000010 */
+#define HCI_SUPP_LE_STATES_PASS_SCAN_MASK 0x10
+#define HCI_SUPP_LE_STATES_PASS_SCAN_OFF 0
+#define HCI_LE_STATES_PASS_SCAN_SUPPORTED(x) ((x)[HCI_SUPP_LE_STATES_PASS_SCAN_OFF] & HCI_SUPP_LE_STATES_PASS_SCAN_MASK)
+
+/* Active Scan state is supported. 0x0000000000000020 */
+#define HCI_SUPP_LE_STATES_ACTIVE_SCAN_MASK 0x20
+#define HCI_SUPP_LE_STATES_ACTIVE_SCAN_OFF 0
+#define HCI_LE_STATES_ACTIVE_SCAN_SUPPORTED(x) ((x)[HCI_SUPP_LE_STATES_ACTIVE_SCAN_OFF] & HCI_SUPP_LE_STATES_ACTIVE_SCAN_MASK)
+
+/* Initiating state is supported. 0x0000000000000040 (or connection state in master role is also supported) */
+#define HCI_SUPP_LE_STATES_INIT_MASK 0x40
+#define HCI_SUPP_LE_STATES_INIT_OFF 0
+#define HCI_LE_STATES_INIT_SUPPORTED(x) ((x)[HCI_SUPP_LE_STATES_INIT_OFF] & HCI_SUPP_LE_STATES_INIT_MASK)
+
+/*connection state in slave role is also supported. 0x0000000000000080 */
+#define HCI_SUPP_LE_STATES_SLAVE_MASK 0x80
+#define HCI_SUPP_LE_STATES_SLAVE_OFF 0
+#define HCI_LE_STATES_SLAVE_SUPPORTED(x) ((x)[HCI_SUPP_LE_STATES_SLAVE_OFF] & HCI_SUPP_LE_STATES_SLAVE_MASK)
+
+/* Non Connectable Adv state and Passive Scanning State combination is supported. 0x0000000000000100 */
+#define HCI_SUPP_LE_STATES_NON_CONN_ADV_PASS_SCAN_MASK 0x01
+#define HCI_SUPP_LE_STATES_NON_CONN_ADV_PASS_SCAN_OFF 1
+#define HCI_LE_STATES_NON_CONN_ADV_PASS_SCAN_SUPPORTED(x) ((x)[HCI_SUPP_LE_STATES_NON_CONN_ADV_PASS_SCAN_OFF] & HCI_SUPP_LE_STATES_NON_CONN_ADV_PASS_SCAN_MASK)
+
+/*Scannable Adv state and Passive Scanning State combination is supported. 0x0000000000000200 */
+#define HCI_SUPP_LE_STATES_SCAN_ADV_PASS_SCAN_MASK 0x02
+#define HCI_SUPP_LE_STATES_SCAN_ADV_PASS_SCAN_OFF 1
+#define HCI_LE_STATES_SCAN_ADV_PASS_SCAN_SUPPORTED(x) ((x)[HCI_SUPP_LE_STATES_SCAN_ADV_PASS_SCAN_OFF] & HCI_SUPP_LE_STATES_SCAN_ADV_PASS_SCAN_MASK)
+
+/*Connectable Adv state and Passive Scanning State combination is supported. 0x0000000000000400 */
+#define HCI_SUPP_LE_STATES_CONN_ADV_PASS_SCAN_MASK 0x04
+#define HCI_SUPP_LE_STATES_CONN_ADV_PASS_SCAN_OFF 1
+#define HCI_LE_STATES_CONN_ADV_PASS_SCAN_SUPPORTED(x) ((x)[HCI_SUPP_LE_STATES_CONN_ADV_PASS_SCAN_OFF] & HCI_SUPP_LE_STATES_CONN_ADV_PASS_SCAN_MASK)
+
+/*High Duty Cycl Directed ADv and Passive Scanning State combination is supported. 0x0000000000000800 */
+#define HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_PASS_SCAN_MASK 0x08
+#define HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_PASS_SCAN_OFF 1
+#define HCI_LE_STATES_HI_DUTY_DIR_ADV_PASS_SCAN_SUPPORTED(x) ((x)[HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_PASS_SCAN_MASK] & HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_PASS_SCAN_OFF)
+
+/*Non Connectable Adv state and Passive Scanning State combination is supported. 0x0000000000001000 */
+#define HCI_SUPP_LE_STATES_NON_CONN_ADV_ACTIVE_SCAN_MASK 0x10
+#define HCI_SUPP_LE_STATES_NON_CONN_ADV_ACTIVE_SCAN_OFF 1
+#define HCI_LE_STATES_NON_CONN_ADV_ACTIVE_SCAN_SUPPORTED(x) ((x)[HCI_SUPP_LE_STATES_NON_CONN_ADV_ACTIVE_SCAN_OFF] & HCI_SUPP_LE_STATES_NON_CONN_ADV_ACTIVE_SCAN_MASK)
+
+/*Scannable Adv state and Active Scanning State combination is supported. 0x0000000000002000 */
+#define HCI_SUPP_LE_STATES_SCAN_ADV_ACTIVE_SCAN_MASK 0x20
+#define HCI_SUPP_LE_STATES_SCAN_ADV_ACTIVE_SCAN_OFF 1
+#define HCI_LE_STATES_SCAN_ADV_ACTIVE_SCAN_SUPPORTED(x) ((x)[HCI_SUPP_LE_STATES_SCAN_ADV_ACTIVE_SCAN_OFF] & HCI_SUPP_LE_STATES_SCAN_ADV_ACTIVE_SCAN_MASK)
+
+/*Connectable Adv state and Active Scanning State combination is supported. 0x0000000000004000 */
+#define HCI_SUPP_LE_STATES_CONN_ADV_ACTIVE_SCAN_MASK 0x40
+#define HCI_SUPP_LE_STATES_CONN_ADV_ACTIVE_SCAN_OFF 1
+#define HCI_LE_STATES_CONN_ADV_ACTIVE_SCAN_SUPPORTED(x) ((x)[HCI_SUPP_LE_STATES_CONN_ADV_ACTIVE_SCAN_OFF] & HCI_SUPP_LE_STATES_CONN_ADV_ACTIVE_SCAN_MASK)
+
+/*High Duty Cycl Directed ADv and ACtive Scanning State combination is supported. 0x0000000000008000 */
+#define HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_ACTIVE_SCAN_MASK 0x80
+#define HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_ACTIVE_SCAN_OFF 1
+#define HCI_LE_STATES_HI_DUTY_DIR_ADV_ACTIVE_SCAN_SUPPORTED(x) ((x)[HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_ACTIVE_SCAN_MASK] & HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_ACTIVE_SCAN_OFF)
+
+/*Non-Connectable Adv state and Initiating State combination is supported. 0x0000000000010000 */
+#define HCI_SUPP_LE_STATES_NON_CONN_INIT_MASK 0x01
+#define HCI_SUPP_LE_STATES_NON_CONN_INIT_OFF 2
+#define HCI_LE_STATES_NON_CONN_INIT_SUPPORTED(x) ((x)[HCI_SUPP_LE_STATES_NON_CONN_INIT_OFF] & HCI_SUPP_LE_STATES_NON_CONN_INIT_MASK)
+
+/* Scannable Adv state and Initiating State combination is supported. 0x0000000000020000 */
+#define HCI_SUPP_LE_STATES_SCAN_ADV_INIT_MASK 0x02
+#define HCI_SUPP_LE_STATES_SCAN_ADV_INIT_OFF 2
+#define HCI_LE_STATES_SCAN_ADV_INIT_SUPPORTED(x) ((x)[HCI_SUPP_LE_STATES_SCAN_ADV_INIT_OFF] & HCI_SUPP_LE_STATES_SCAN_ADV_INIT_MASK)
+
+/* Non-Connectable Adv state and Master Role combination is supported. 0x0000000000040000 */
+#define HCI_SUPP_LE_STATES_NON_CONN_ADV_MASTER_MASK 0x04
+#define HCI_SUPP_LE_STATES_NON_CONN_ADV_MASTER_OFF 2
+#define HCI_LE_STATES_NON_CONN_ADV_MASTER_SUPPORTED(x) ((x)[HCI_SUPP_LE_STATES_NON_CONN_ADV_MASTER_OFF] & HCI_SUPP_LE_STATES_NON_CONN_ADV_MASTER_MASK)
+
+/*Scannable Adv state and Master Role combination is supported. 0x0000000000040000 */
+#define HCI_SUPP_LE_STATES_SCAN_ADV_MASTER_MASK 0x08
+#define HCI_SUPP_LE_STATES_SCAN_ADV_MASTER_OFF 2
+#define HCI_LE_STATES_SCAN_ADV_MASTER_SUPPORTED(x) ((x)[HCI_SUPP_LE_STATES_SCAN_ADV_MASTER_OFF] & HCI_SUPP_LE_STATES_SCAN_ADV_MASTER_MASK)
+
+/* Non-Connectable Adv and Slave Role combination is supported. 0x000000000100000 */
+#define HCI_SUPP_LE_STATES_NON_CONN_ADV_SLAVE_MASK 0x10
+#define HCI_SUPP_LE_STATES_NON_CONN_ADV_SLAVE_OFF 2
+#define HCI_LE_STATES_NON_CONN_ADV_SLAVE_SUPPORTED(x) ((x)[HCI_SUPP_LE_STATES_NON_CONN_ADV_SLAVE_OFF] & HCI_SUPP_LE_STATES_NON_CONN_ADV_SLAVE_MASK)
+
+/*Scannable Adv and Slave Role combination is supported. 0x000000000200000 */
+#define HCI_SUPP_LE_STATES_SCAN_ADV_SLAVE_MASK 0x20
+#define HCI_SUPP_LE_STATES_SCAN_ADV_SLAVE_OFF 2
+#define HCI_LE_STATES_SCAN_ADV_SLAVE_SUPPORTED(x) ((x)[HCI_SUPP_LE_STATES_SCAN_ADV_SLAVE_OFF] & HCI_SUPP_LE_STATES_SCAN_ADV_SLAVE_MASK)
+
+/*Passive Scan and Initiating State combination is supported. 0x000000000400000 */
+#define HCI_SUPP_LE_STATES_PASS_SCAN_INIT_MASK 0x40
+#define HCI_SUPP_LE_STATES_PASS_SCAN_INIT_OFF 2
+#define HCI_LE_STATES_PASS_SCAN_INIT_SUPPORTED(x) ((x)[HCI_SUPP_LE_STATES_PASS_SCAN_INIT_OFF] & HCI_SUPP_LE_STATES_PASS_SCAN_INIT_MASK)
+
+/*Active Scan and Initiating State combination is supported. 0x000000000800000 */
+#define HCI_SUPP_LE_STATES_ACTIVE_SCAN_INIT_MASK 0x80
+#define HCI_SUPP_LE_STATES_ACTIVE_SCAN_INIT_OFF 2
+#define HCI_LE_STATES_ACTIVE_SCAN_INIT_SUPPORTED(x) ((x)[HCI_SUPP_LE_STATES_ACTIVE_SCAN_INIT_OFF] & HCI_SUPP_LE_STATES_ACTIVE_SCAN_INIT_MASK)
+
+/*Passive Scan and Master Role combination is supported. 0x000000001000000 */
+#define HCI_SUPP_LE_STATES_PASS_SCAN_MASTER_MASK 0x01
+#define HCI_SUPP_LE_STATES_PASS_SCAN_MASTER_OFF 3
+#define HCI_LE_STATES_PASS_SCAN_MASTER_SUPPORTED(x) ((x)[HCI_SUPP_LE_STATES_PASS_SCAN_MASTER_OFF] & HCI_SUPP_LE_STATES_PASS_SCAN_MASTER_MASK)
+
+/*Active Scan and Master Role combination is supported. 0x000000002000000 */
+#define HCI_SUPP_LE_STATES_ACTIVE_SCAN_MASTER_MASK 0x02
+#define HCI_SUPP_LE_STATES_ACTIVE_SCAN_MASTER_OFF 3
+#define HCI_LE_STATES_ACTIVE_SCAN_MASTER_SUPPORTED(x) ((x)[HCI_SUPP_LE_STATES_ACTIVE_SCAN_MASTER_OFF] & HCI_SUPP_LE_STATES_ACTIVE_SCAN_MASTER_MASK)
+
+/*Passive Scan and Slave Role combination is supported. 0x000000004000000 */
+#define HCI_SUPP_LE_STATES_PASS_SCAN_SLAVE_MASK 0x04
+#define HCI_SUPP_LE_STATES_PASS_SCAN_SLAVE_OFF 3
+#define HCI_LE_STATES_PASS_SCAN_SLAVE_SUPPORTED(x) ((x)[HCI_SUPP_LE_STATES_PASS_SCAN_SLAVE_OFF] & HCI_SUPP_LE_STATES_PASS_SCAN_SLAVE_MASK)
+
+/*Active Scan and Slave Role combination is supported. 0x000000008000000 */
+#define HCI_SUPP_LE_STATES_ACTIVE_SCAN_SLAVE_MASK 0x08
+#define HCI_SUPP_LE_STATES_ACTIVE_SCAN_SLAVE_OFF 3
+#define HCI_LE_STATES_ACTIVE_SCAN_SLAVE_SUPPORTED(x) ((x)[HCI_SUPP_LE_STATES_ACTIVE_SCAN_SLAVE_OFF] & HCI_SUPP_LE_STATES_ACTIVE_SCAN_SLAVE_MASK)
+
+/*Link Layer Topology Added States Combo */
+/*Initiating State and Master Role combination supported.
+ Master Role and Master Role combination is also supported. 0x0000000010000000 */
+#define HCI_SUPP_LE_STATES_INIT_MASTER_MASK 0x10
+#define HCI_SUPP_LE_STATES_INIT_MASTER_OFF 3
+#define HCI_LE_STATES_INIT_MASTER_SUPPORTED(x) ((x)[HCI_SUPP_LE_STATES_INIT_MASTER_OFF] & HCI_SUPP_LE_STATES_INIT_MASTER_MASK)
+
+/* Connectable Advertising State and Initiating State combination supported. 0x0000000100000000 */
+#define HCI_SUPP_LE_STATES_CONN_ADV_INIT_MASK 0x01
+#define HCI_SUPP_LE_STATES_CONN_ADV_INIT_OFF 4
+#define HCI_LE_STATES_CONN_ADV_INIT_SUPPORTED(x) ((x)[HCI_SUPP_LE_STATES_CONN_ADV_INIT_OFF] & HCI_SUPP_LE_STATES_CONN_ADV_INIT_MASK)
+
+/* High Duty Cycle Directed Advertising State and Initiating State combination supported. */
+#define HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_INIT_MASK 0x02
+#define HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_INIT_OFF 4
+#define HCI_LE_STATES_HI_DUTY_DIR_ADV_INIT_SUPPORTED(x) ((x)[HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_INIT_OFF] & HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_INIT_MASK)
+
+/* Low Duty Cycle Directed Advertising State and Initiating State combination supported.*/
+#define HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_INIT_MASK 0x04
+#define HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_INIT_OFF 4
+#define HCI_LE_STATES_LO_DUTY_DIR_ADV_INIT_SUPPORTED(x) ((x)[HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_INIT_OFF] & HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_INIT_MASK)
+
+/* Connectable Advertising State and Master Role combination supported.*/
+#define HCI_SUPP_LE_STATES_CONN_ADV_MASTER_MASK 0x08
+#define HCI_SUPP_LE_STATES_CONN_ADV_MASTER_OFF 4
+#define HCI_LE_STATES_CONN_ADV_MASTER_SUPPORTED(x) ((x)[HCI_SUPP_LE_STATES_CONN_ADV_MASTER_OFF] & HCI_SUPP_LE_STATES_CONN_ADV_MASTER_MASK)
+
+/* High Duty Cycle Directed Advertising State and Master Role combination supported.*/
+#define HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_MASTER_MASK 0x10
+#define HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_MASTER_OFF 4
+#define HCI_LE_STATES_HI_DUTY_DIR_ADV_MASTER_SUPPORTED(x) ((x)[HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_MASTER_OFF] & HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_MASTER_MASK)
+
+/* Low Duty Cycle Directed Advertising State and Master Role combination supported.*/
+#define HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_MASTER_MASK 0x20
+#define HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_MASTER_OFF 4
+#define HCI_LE_STATES_LO_DUTY_DIR_ADV_MASTER_SUPPORTED(x) ((x)[HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_MASTER_OFF] & HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_MASTER_MASK)
+
+/* Connectable Advertising State and Slave Role combination supported. */
+#define HCI_SUPP_LE_STATES_CONN_ADV_SLAVE_MASK 0x40
+#define HCI_SUPP_LE_STATES_CONN_ADV_SLAVE_OFF 4
+#define HCI_LE_STATES_CONN_ADV_SLAVE_SUPPORTED(x) ((x)[HCI_SUPP_LE_STATES_CONN_ADV_SLAVE_OFF] & HCI_SUPP_LE_STATES_CONN_ADV_SLAVE_MASK)
+
+/* High Duty Cycle Directed Advertising State and slave Role combination supported.*/
+#define HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_SLAVE_MASK 0x80
+#define HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_SLAVE_OFF 4
+#define HCI_LE_STATES_HI_DUTY_DIR_ADV_SLAVE_SUPPORTED(x) ((x)[HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_SLAVE_OFF] & HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_SLAVE_MASK)
+
+/* Low Duty Cycle Directed Advertising State and slave Role combination supported.*/
+#define HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_SLAVE_MASK 0x01
+#define HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_SLAVE_OFF 5
+#define HCI_LE_STATES_LO_DUTY_DIR_ADV_SLAVE_SUPPORTED(x) ((x)[HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_SLAVE_OFF] & HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_SLAVE_MASK)
+
+/* Initiating State and Slave Role combination supported.
+ Master Role and Slave Role combination also supported.
+ */
+#define HCI_SUPP_LE_STATES_INIT_MASTER_SLAVE_MASK 0x02
+#define HCI_SUPP_LE_STATES_INIT_MASTER_SLAVE_OFF 5
+#define HCI_LE_STATES_INIT_MASTER_SLAVE_SUPPORTED(x) ((x)[HCI_SUPP_LE_STATES_INIT_MASTER_SLAVE_OFF] & HCI_SUPP_LE_STATES_INIT_MASTER_SLAVE_MASK)
+
+#define HCI_BRCM_ENABLE_WBS_MODIFIED (0x0102 | HCI_GRP_VENDOR_SPECIFIC)
+
+/* ConnectionLess Broadcast Stream VSC */
+#define HCI_BRCM_SET_CLB_STREAM (0x0111 | HCI_GRP_VENDOR_SPECIFIC)
+#define HCI_BRCM_RECEIVE_CLB_STREAM (0x0112 | HCI_GRP_VENDOR_SPECIFIC)
+#define HCI_BRCM_WRITE_CLB_STREAM_DATA (0x0113 | HCI_GRP_VENDOR_SPECIFIC)
+#define HCI_BRCM_CLB_STREAM_FLUSH (0x0114 | HCI_GRP_VENDOR_SPECIFIC)
+
/*
** Definitions for HCI Events
*/
@@ -411,6 +663,7 @@
#define HCI_NUM_COMPL_DATA_BLOCKS_EVT 0x48
#define HCI_SHORT_RANGE_MODE_COMPLETE_EVT 0x4C
#define HCI_AMP_STATUS_CHANGE_EVT 0x4D
+#define HCI_SET_TRIGGERED_CLOCK_CAPTURE_EVT 0x4E
/* ULP HCI Event */
#define HCI_BLE_EVENT 0x03E
@@ -420,16 +673,11 @@
#define HCI_BLE_LL_CONN_PARAM_UPD_EVT 0x03
#define HCI_BLE_READ_REMOTE_FEAT_CMPL_EVT 0x04
#define HCI_BLE_LTK_REQ_EVT 0x05
+#define HCI_BLE_RC_PARAM_REQ_EVT 0x06
-/* ConnectionLess Broadcast events */
-#define HCI_SYNC_TRAIN_COMP_EVT 0x4F
-#define HCI_SYNC_TRAIN_RECEIVED_EVT 0x50
-#define HCI_CLB_RX_DATA_EVT 0x51
-#define HCI_CLB_RX_TIMEOUT_EVT 0x52
-#define HCI_TRUNCATED_PAGE_COMP_EVT 0x53
-#define HCI_SLAVE_PAGE_RESP_TIMEOUT_EVT 0x54
-#define HCI_CLB_CHANNEL_CHANGE_EVT 0x55
-#define HCI_INQUIRY_RESPONSE_NOTIF 0x56
+/* Definitions for LE Channel Map */
+#define HCI_BLE_CHNL_MAP_SIZE 5
+
#define HCI_EVENT_RSP_FIRST HCI_INQUIRY_COMP_EVT
#define HCI_EVENT_RSP_LAST HCI_CLB_CHANNEL_CHANGE_EVT
@@ -439,6 +687,9 @@
because conflict w/ TCI_EVT and per
specification compliant */
+/* the event mask for BLE event mask */
+#define HCI_BLE_EVENT_MASK_DEF "\x00\x00\x00\x00\x00\x00\x00\x3f"
+
/*
@@ -1583,6 +1834,10 @@
#define HCI_EXT_FEATURE_SIMUL_DUMO_HOST_OFF 0
#define HCI_SIMUL_DUMO_HOST_SUPPORTED(x) ((x)[HCI_EXT_FEATURE_SIMUL_DUMO_HOST_OFF] & HCI_EXT_FEATURE_SIMUL_DUMO_HOST_MASK)
+#define HCI_EXT_FEATURE_SC_HOST_MASK 0x08
+#define HCI_EXT_FEATURE_SC_HOST_OFF 0
+#define HCI_SC_HOST_SUPPORTED(x) ((x)[HCI_EXT_FEATURE_SC_HOST_OFF] & HCI_EXT_FEATURE_SC_HOST_MASK)
+
/*
** LMP features encoding - page 2
*/
@@ -1606,19 +1861,43 @@
#define HCI_EXT_FEATURE_INQ_RESP_NOTIF_OFF 0
#define HCI_INQ_RESP_NOTIF_SUPPORTED(x) ((x)[HCI_EXT_FEATURE_INQ_RESP_NOTIF_OFF] & HCI_EXT_FEATURE_INQ_RESP_NOTIF_MASK)
+#define HCI_EXT_FEATURE_SC_CTRLR_MASK 0x01
+#define HCI_EXT_FEATURE_SC_CTRLR_OFF 1
+#define HCI_SC_CTRLR_SUPPORTED(x) ((x)[HCI_EXT_FEATURE_SC_CTRLR_OFF] & HCI_EXT_FEATURE_SC_CTRLR_MASK)
+
+#define HCI_EXT_FEATURE_PING_MASK 0x02
+#define HCI_EXT_FEATURE_PING_OFF 1
+#define HCI_PING_SUPPORTED(x) ((x)[HCI_EXT_FEATURE_PING_OFF] & HCI_EXT_FEATURE_PING_MASK)
+
/*
** LE features encoding - page 0 (the only page for now)
*/
+/* LE Encryption */
#define HCI_LE_FEATURE_LE_ENCRYPTION_MASK 0x01
#define HCI_LE_FEATURE_LE_ENCRYPTION_OFF 0
#define HCI_LE_ENCRYPTION_SUPPORTED(x) ((x)[HCI_LE_FEATURE_LE_ENCRYPTION_OFF] & HCI_LE_FEATURE_LE_ENCRYPTION_MASK)
+/* Connection Parameters Request Procedure */
+#define HCI_LE_FEATURE_CONN_PARAM_REQ_MASK 0x02
+#define HCI_LE_FEATURE_CONN_PARAM_REQ_OFF 0
+#define HCI_LE_CONN_PARAM_REQ_SUPPORTED(x) ((x)[HCI_LE_FEATURE_CONN_PARAM_REQ_OFF] & HCI_LE_FEATURE_CONN_PARAM_REQ_MASK)
+
+/* Extended Reject Indication */
+#define HCI_LE_FEATURE_EXT_REJ_IND_MASK 0x04
+#define HCI_LE_FEATURE_EXT_REJ_IND_OFF 0
+#define HCI_LE_EXT_REJ_IND_SUPPORTED(x) ((x)[HCI_LE_FEATURE_EXT_REJ_IND_OFF] & HCI_LE_FEATURE_EXT_REJ_IND_MASK)
+
+/* Slave-initiated Features Exchange */
+#define HCI_LE_FEATURE_SLAVE_INIT_FEAT_EXC_MASK 0x08
+#define HCI_LE_FEATURE_SLAVE_INIT_FEAT_EXC_OFF 0
+#define HCI_LE_SLAVE_INIT_FEAT_EXC_SUPPORTED(x) ((x)[HCI_LE_FEATURE_SLAVE_INIT_FEAT_EXC_OFF] & HCI_LE_FEATURE_SLAVE_INIT_FEAT_EXC_MASK)
/*
** Local Supported Commands encoding
*/
#define HCI_NUM_SUPP_COMMANDS_BYTES 64
+/* Supported Commands Byte 0 */
#define HCI_SUPP_COMMANDS_INQUIRY_MASK 0x01
#define HCI_SUPP_COMMANDS_INQUIRY_OFF 0
#define HCI_INQUIRY_SUPPORTED(x) ((x)[HCI_SUPP_COMMANDS_INQUIRY_OFF] & HCI_SUPP_COMMANDS_INQUIRY_MASK)
@@ -2398,8 +2677,42 @@
#define HCI_SUPP_COMMANDS_WRITE_SYNC_TRAIN_PARAM_OFF 32
#define HCI_WRITE_SYNC_TRAIN_PARAM_SUPPORTED(x) ((x)[HCI_SUPP_COMMANDS_WRITE_SYNC_TRAIN_PARAM_OFF] & HCI_SUPP_COMMANDS_WRITE_SYNC_TRAIN_PARAM)
+#define HCI_SUPP_COMMANDS_REMOTE_OOB_EXTENDED_DATA_REQUEST_REPLY_MASK 0x02
+#define HCI_SUPP_COMMANDS_REMOTE_OOB_EXTENDED_DATA_REQUEST_REPLY_OFF 32
+#define HCI_REMOTE_OOB_EXTENDED_DATA_REQUEST_REPLY_SUPPORTED(x) ((x)[HCI_SUPP_COMMANDS_REMOTE_OOB_EXTENDED_DATA_REQUEST_REPLY_OFF] & HCI_SUPP_COMMANDS_REMOTE_OOB_EXTENDED_DATA_REQUEST_REPLY_MASK)
+#define HCI_SUPP_COMMANDS_READ_SECURE_CONNS_SUPPORT_MASK 0x04
+#define HCI_SUPP_COMMANDS_READ_SECURE_CONNS_SUPPORT_OFF 32
+#define HCI_READ_SECURE_CONNS_SUPPORT_SUPPORTED(x) ((x)[HCI_SUPP_COMMANDS_READ_SECURE_CONNS_SUPPORT_OFF] & HCI_SUPP_COMMANDS_READ_SECURE_CONNS_SUPPORT_MASK)
+#define HCI_SUPP_COMMANDS_WRITE_SECURE_CONNS_SUPPORT_MASK 0x08
+#define HCI_SUPP_COMMANDS_WRITE_SECURE_CONNS_SUPPORT_OFF 32
+#define HCI_WRITE_SECURE_CONNS_SUPPORT_SUPPORTED(x) ((x)[HCI_SUPP_COMMANDS_WRITE_SECURE_CONNS_SUPPORT_OFF] & HCI_SUPP_COMMANDS_WRITE_SECURE_CONNS_SUPPORT_MASK)
+
+#define HCI_SUPP_COMMANDS_READ_AUTHENT_PAYLOAD_TOUT_MASK 0x10
+#define HCI_SUPP_COMMANDS_READ_AUTHENT_PAYLOAD_TOUT_OFF 32
+#define HCI_READ_AUTHENT_PAYLOAD_TOUT_SUPPORTED(x) ((x)[HCI_SUPP_COMMANDS_READ_AUTHENT_PAYLOAD_TOUT_OFF] & HCI_SUPP_COMMANDS_READ_AUTHENT_PAYLOAD_TOUT_MASK)
+
+#define HCI_SUPP_COMMANDS_WRITE_AUTHENT_PAYLOAD_TOUT_MASK 0x20
+#define HCI_SUPP_COMMANDS_WRITE_AUTHENT_PAYLOAD_TOUT_OFF 32
+#define HCI_WRITE_AUTHENT_PAYLOAD_TOUT_SUPPORTED(x) ((x)[HCI_SUPP_COMMANDS_WRITE_AUTHENT_PAYLOAD_TOUT_OFF] & HCI_SUPP_COMMANDS_WRITE_AUTHENT_PAYLOAD_TOUT_MASK)
+
+#define HCI_SUPP_COMMANDS_READ_LOCAL_OOB_EXTENDED_DATA_MASK 0x40
+#define HCI_SUPP_COMMANDS_READ_LOCAL_OOB_EXTENDED_DATA_OFF 32
+#define HCI_READ_LOCAL_OOB_EXTENDED_DATA_SUPPORTED(x) ((x)[HCI_SUPP_COMMANDS_READ_LOCAL_OOB_EXTENDED_DATA_OFF] & HCI_SUPP_COMMANDS_READ_LOCAL_OOB_EXTENDED_DATA_MASK)
+
+#define HCI_SUPP_COMMANDS_WRITE_SECURE_CONNECTIONS_TEST_MODE_MASK 0x80
+#define HCI_SUPP_COMMANDS_WRITE_SECURE_CONNECTIONS_TEST_MODE_OFF 32
+#define HCI_WRITE_SECURE_CONNECTIONS_TEST_MODE_SUPPORTED(x) ((x)[HCI_SUPP_COMMANDS_WRITE_SECURE_CONNECTIONS_TEST_MODE_OFF] & HCI_SUPP_COMMANDS_WRITE_SECURE_CONNECTIONS_TEST_MODE_MASK)
+
+/* supported LE remote control connection parameter request reply */
+#define HCI_SUPP_COMMANDS_LE_RC_CONN_PARAM_UPD_RPY_MASK 0x10
+#define HCI_SUPP_COMMANDS_LE_RC_CONN_PARAM_UPD_RPY_OFF 33
+#define HCI_LE_RC_CONN_PARAM_UPD_RPY_SUPPORTED(x) ((x)[HCI_SUPP_COMMANDS_LE_RC_CONN_PARAM_UPD_RPY_OFF] & HCI_SUPP_COMMANDS_LE_RC_CONN_PARAM_UPD_RPY_MASK)
+
+#define HCI_SUPP_COMMANDS_RLE_RC_CONN_PARAM_UPD_NEG_RPY_MASK 0x20
+#define HCI_SUPP_COMMANDS_LE_RC_CONN_PARAM_UPD_NEG_RPY_OFF 33
+#define HCI_LE_RC_CONN_PARAM_UPD_NEG_RPY_SUPPORTED(x) ((x)[HCI_SUPP_COMMANDS_LE_RC_CONN_PARAM_UPD_NEG_RPY_OFF] & HCI_SUPP_COMMANDS_RLE_RC_CONN_PARAM_UPD_NEG_RPY_MASK)
/*
Commands of HCI_GRP_VENDOR_SPECIFIC group for WIDCOMM SW LM Simulator
diff --git a/stack/include/hcimsgs.h b/stack/include/hcimsgs.h
index cb85cb1..3201f75 100644
--- a/stack/include/hcimsgs.h
+++ b/stack/include/hcimsgs.h
@@ -1252,8 +1252,6 @@
#define HCIC_PARAM_SIZE_BLE_WRITE_ADV_DATA 31
/* ULP HCI command */
-HCI_API extern BOOLEAN btsnd_hcic_ble_reset(void);
-
HCI_API extern BOOLEAN btsnd_hcic_ble_set_evt_mask (BT_EVENT_MASK event_mask);
HCI_API extern BOOLEAN btsnd_hcic_ble_read_buffer_size (void);
@@ -1267,7 +1265,7 @@
HCI_API extern BOOLEAN btsnd_hcic_ble_write_adv_params (UINT16 adv_int_min, UINT16 adv_int_max,
UINT8 adv_type, UINT8 addr_type_own,
UINT8 addr_type_dir, BD_ADDR direct_bda,
- UINT8 channel_map, UINT8 adv_filter_policy);
+ UINT8 channel_map, UINT8 scan_filter_policy);
HCI_API extern BOOLEAN btsnd_hcic_ble_read_adv_chnl_tx_power (void);
@@ -1331,6 +1329,20 @@
UINT8 payload);
HCI_API extern BOOLEAN btsnd_hcic_ble_test_end(void);
+#if (defined BLE_LLT_INCLUDED) && (BLE_LLT_INCLUDED == TRUE)
+
+#define HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_REPLY 14
+HCI_API extern BOOLEAN btsnd_hcic_ble_rc_param_req_reply(UINT16 handle,
+ UINT16 conn_int_min, UINT16 conn_int_max,
+ UINT16 conn_latency, UINT16 conn_timeout,
+ UINT16 min_ce_len, UINT16 max_ce_len);
+
+#define HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_NEG_REPLY 3
+HCI_API extern BOOLEAN btsnd_hcic_ble_rc_param_req_neg_reply(UINT16 handle, UINT8 reason);
+
+#endif /* BLE_LLT_INCLUDED */
+
+
#endif /* BLE_INCLUDED */
#ifdef __cplusplus
diff --git a/stack/include/l2c_api.h b/stack/include/l2c_api.h
index 7679d26..c85d76b 100644
--- a/stack/include/l2c_api.h
+++ b/stack/include/l2c_api.h
@@ -647,7 +647,7 @@
** Returns TRUE if valid Channel, else FALSE
**
*******************************************************************************/
-L2C_API extern BOOLEAN L2CA_SendTestSFrame (UINT16 cid, BOOLEAN rr_or_rej,
+L2C_API extern BOOLEAN L2CA_SendTestSFrame (UINT16 cid, UINT8 sup_type,
UINT8 back_track);
/*******************************************************************************
@@ -919,8 +919,9 @@
** BD Address of remote
** TRUE if channel is connected, FALSE if disconnected
** Reason for connection failure
+** transport : physical transport, BR/EDR or LE
*/
-typedef void (tL2CA_FIXED_CHNL_CB) (BD_ADDR, BOOLEAN, UINT16);
+typedef void (tL2CA_FIXED_CHNL_CB) (BD_ADDR, BOOLEAN, UINT16, tBT_TRANSPORT);
/* Signalling data received. Parameters are
** BD Address of remote
@@ -928,12 +929,21 @@
*/
typedef void (tL2CA_FIXED_DATA_CB) (BD_ADDR, BT_HDR *);
+/* Congestion status callback protype. This callback is optional. If
+** an application tries to send data when the transmit queue is full,
+** the data will anyways be dropped. The parameter is:
+** remote BD_ADDR
+** TRUE if congested, FALSE if uncongested
+*/
+typedef void (tL2CA_FIXED_CONGESTION_STATUS_CB) (BD_ADDR, BOOLEAN);
+
/* Fixed channel registration info (the callback addresses and channel config)
*/
typedef struct
{
tL2CA_FIXED_CHNL_CB *pL2CA_FixedConn_Cb;
tL2CA_FIXED_DATA_CB *pL2CA_FixedData_Cb;
+ tL2CA_FIXED_CONGESTION_STATUS_CB *pL2CA_FixedCong_Cb;
tL2CAP_FCR_OPTS fixed_chnl_opts;
UINT16 default_idle_tout;
@@ -1128,7 +1138,8 @@
** Return value: TRUE if update started
**
*******************************************************************************/
-L2C_API extern BOOLEAN L2CA_UpdateBleConnParams (BD_ADDR rem_bdRa, UINT16 min_int, UINT16 max_int, UINT16 latency, UINT16 timeout);
+L2C_API extern BOOLEAN L2CA_UpdateBleConnParams (BD_ADDR rem_bdRa, UINT16 min_int,
+ UINT16 max_int, UINT16 latency, UINT16 timeout);
/*******************************************************************************
**
@@ -1146,18 +1157,6 @@
/*******************************************************************************
**
-** Function L2CA_HandleConnUpdateEvent
-**
-** Description This function enables the connection update request from remote
-** after a successful connection update response is received.
-**
-** Returns void
-**
-*******************************************************************************/
-L2C_API void L2CA_HandleConnUpdateEvent (UINT16 handle, UINT8 status);
-
-/*******************************************************************************
-**
** Function L2CA_GetBleConnRole
**
** Description This function returns the connection role.
@@ -1173,10 +1172,13 @@
**
** Description This function returns the disconnect reason code.
**
+** Parameters: BD Address of remote
+** Physical transport for the L2CAP connection (BR/EDR or LE)
+**
** Returns disconnect reason
**
*******************************************************************************/
-L2C_API extern UINT16 L2CA_GetDisconnectReason (BD_ADDR remote_bda);
+L2C_API extern UINT16 L2CA_GetDisconnectReason (BD_ADDR remote_bda, tBT_TRANSPORT transport);
#endif /* (BLE_INCLUDED == TRUE) */
diff --git a/stack/include/smp_api.h b/stack/include/smp_api.h
index 68c9ebf..e47cce3 100644
--- a/stack/include/smp_api.h
+++ b/stack/include/smp_api.h
@@ -134,9 +134,9 @@
typedef struct
{
- UINT8 reason;
- UINT8 sec_level;
- BOOLEAN is_pair_cancel;
+ tSMP_STATUS reason;
+ tSMP_SEC_LEVEL sec_level;
+ BOOLEAN is_pair_cancel;
} tSMP_CMPL;
typedef union
diff --git a/stack/include/srvc_api.h b/stack/include/srvc_api.h
index e957ff2..d04964a 100644
--- a/stack/include/srvc_api.h
+++ b/stack/include/srvc_api.h
@@ -176,7 +176,8 @@
** Returns void
**
*******************************************************************************/
- GATT_API extern BOOLEAN DIS_ReadDISInfo(BD_ADDR peer_bda, tDIS_READ_CBACK *p_cback);
+ GATT_API extern BOOLEAN DIS_ReadDISInfo(BD_ADDR peer_bda, tDIS_READ_CBACK *p_cback,
+ tDIS_ATTR_MASK mask);
/*******************************************************************************
** BATTERY SERVICE API
diff --git a/stack/include/uipc_msg.h b/stack/include/uipc_msg.h
index 6a9a4ae..53cdccf 100644
--- a/stack/include/uipc_msg.h
+++ b/stack/include/uipc_msg.h
@@ -105,231 +105,6 @@
} tUIPC_LOG_MSG;
#define UIPC_LOG_MSGLEN (IPC_LOG_MSG_LEN + 4)
-/********************************
-
- H5 Sync Message
-
-********************************/
-
-/* op_code */
-#define SLIP_SYNC_TO_LITE_REQ 0
-#define SLIP_SYNC_TO_LITE_RESP 1
-#define SLIP_SYNC_TO_FULL_REQ 2
-#define SLIP_SYNC_TO_FULL_RESP 3
-#define SLIP_SYNC_NOTIFY 4
-
-/* status */
-#define SLIP_SYNC_SUCCESS 0
-#define SLIP_SYNC_FAILURE 1
-
-typedef struct
-{
- UINT8 op_code;
- UINT8 status;
- UINT16 acl_pkt_size;
- UINT8 state;
- UINT8 lp_state; /* Low Power state */
- UINT8 next_seqno; /* next send seq */
- UINT8 ack; /* next ack seq, expected seq from peer */
- UINT8 sent_ack; /* last sent ack */
- UINT8 sliding_window_size;/* window size */
- BOOLEAN oof_flow_control; /* Out of Frame SW Flow Control */
- BOOLEAN data_integrity_type;/* Level of Data Integrity Check */
- UINT8 rx_state; /* rx state for incoming packet processing */
-} tSLIP_SYNC_INFO;
-
-/********************************
-
- L2CAP Sync Message
-
-********************************/
-
-/* op_code */
-#define L2C_SYNC_TO_LITE_REQ 0
-#define L2C_SYNC_TO_LITE_RESP 1
-#define L2C_REMOVE_TO_LITE_REQ 2
-#define L2C_REMOVE_TO_LITE_RESP 3
-#define L2C_FLUSH_TO_FULL_IND 4
-
-/* status */
-#define L2C_SYNC_SUCCESS 0
-#define L2C_SYNC_FAILURE 1
-
-typedef struct t_l2c_stream_info
-{
- UINT16 local_cid; /* Local CID */
- UINT16 remote_cid; /* Remote CID */
- UINT16 out_mtu; /* Max MTU we will send */
- UINT16 handle; /* The handle used with LM */
- UINT16 link_xmit_quota; /* Num outstanding pkts allowed */
- BOOLEAN is_flushable; /* TRUE if flushable channel */
-} tL2C_STREAM_INFO;
-
-typedef struct t_l2c_sync_to_lite_req
-{
- UINT8 op_code; /* L2C_SYNC_TO_LITE_REQ */
- UINT16 light_xmit_quota; /* Total quota for light stack */
- UINT16 acl_data_size; /* Max ACL data size across HCI transport */
- UINT16 non_flushable_pbf; /* L2CAP_PKT_START_NON_FLUSHABLE if controller supports */
- /* Otherwise, L2CAP_PKT_START */
- UINT8 multi_av_data_cong_start; /* Multi-AV queue size to start congestion */
- UINT8 multi_av_data_cong_end; /* Multi-AV queue size to end congestion */
- UINT8 multi_av_data_cong_discard; /* Multi-AV queue size to discard */
- UINT8 num_stream;
- tL2C_STREAM_INFO stream[BTM_SYNC_INFO_NUM_STR];
-} tL2C_SYNC_TO_LITE_REQ;
-
-typedef struct t_l2c_sync_to_lite_resp_stream
-{
- UINT16 lcid;
- UINT8 status;
-} tL2C_SYNC_TO_LITE_RESP_STREAM;
-
-typedef struct t_l2c_sync_to_lite_resp
-{
- UINT8 op_code; /* L2C_SYNC_TO_LITE_RESP */
- UINT16 light_xmit_unacked; /* unacked packet more than quota in light stack */
- UINT8 num_stream;
- tL2C_SYNC_TO_LITE_RESP_STREAM stream[BTM_SYNC_INFO_NUM_STR];
-} tL2C_SYNC_TO_LITE_RESP;
-
-typedef struct t_l2c_remove_to_lite_req
-{
- UINT8 op_code; /* L2C_REMOVE_TO_LITE_REQ */
- UINT16 light_xmit_quota; /* Total quota for light stack */
- UINT8 num_stream;
- UINT16 lcid[BTM_SYNC_INFO_NUM_STR];
-} tL2C_REMOVE_TO_LITE_REQ;
-
-typedef tL2C_SYNC_TO_LITE_RESP tL2C_REMOVE_TO_LITE_RESP;
-typedef tL2C_REMOVE_TO_LITE_REQ tL2C_FLUSH_TO_FULL_IND;
-
-typedef union t_l2c_sync_msg
-{
- UINT8 op_code;
- tL2C_SYNC_TO_LITE_REQ sync_req;
- tL2C_SYNC_TO_LITE_RESP sync_resp;
- tL2C_REMOVE_TO_LITE_REQ remove_req;
- tL2C_REMOVE_TO_LITE_RESP remove_resp;
- tL2C_FLUSH_TO_FULL_IND flush_ind;
-} tL2C_SYNC_MSG;
-
-/********************************
-
- AVDTP Sync Message
-
-********************************/
-
-/* op_code */
-#define AVDT_SYNC_TO_LITE_REQ 0
-#define AVDT_SYNC_TO_LITE_RESP 1
-#define AVDT_RESYNC_TO_LITE_REQ 2
-#define AVDT_RESYNC_TO_LITE_RESP 3
-#define AVDT_SYNC_TO_FULL_REQ 4
-#define AVDT_SYNC_TO_FULL_RESP 5
-#define AVDT_REMOVE_TO_LITE_REQ 6
-#define AVDT_REMOVE_TO_LITE_RESP 7
-#define AVDT_SYNC_TO_BTC_LITE_REQ 8
-#define AVDT_SYNC_TO_BTC_LITE_RESP 9
-
-/* status */
-#define AVDT_SYNC_SUCCESS 0
-#define AVDT_SYNC_FAILURE 1
-
-typedef struct
-{
- UINT16 lcid;
- UINT32 ssrc;
-} tAVDT_SYNC_TO_BTC_LITE_REQ_STREAM;
-
-typedef struct
-{
- UINT8 opcode; /* AVDT_SYNC_TO_BTC_LITE_REQ */
- UINT8 num_stream;
- tAVDT_SYNC_TO_BTC_LITE_REQ_STREAM stream[BTM_SYNC_INFO_NUM_STR];
-} tAVDT_SYNC_TO_BTC_LITE_REQ;
-
-typedef struct
-{
- UINT8 opcode; /* AVDT_SYNC_TO_BTC_LITE_RESP */
- UINT8 status;
-} tAVDT_SYNC_TO_BTC_LITE_RESP;
-
-typedef struct t_avdt_scb_sync_info
-{
- UINT8 handle; /* SCB handle */
- BD_ADDR peer_addr; /* BD address of peer */
- UINT16 local_cid; /* Local CID */
- UINT16 peer_mtu; /* L2CAP mtu of the peer device */
- UINT8 mux_tsid_media; /* TSID for media transport session */
- UINT16 media_seq; /* media packet sequence number */
-} tAVDT_SCB_SYNC_INFO;
-
-typedef struct t_avdt_sync_info
-{
- UINT8 op_code;
- UINT8 status;
-
- tAVDT_SCB_SYNC_INFO scb_info[BTM_SYNC_INFO_NUM_STR];
-
-} tAVDT_SYNC_INFO;
-
-typedef union t_avdt_sync_msg
-{
- UINT8 op_code;
- tAVDT_SYNC_INFO sync_info;
- tAVDT_SYNC_TO_BTC_LITE_REQ btc_sync_req;
- tAVDT_SYNC_TO_BTC_LITE_RESP btc_sync_resp;
-} tAVDT_SYNC_MSG;
-
-/********************************
-
- BTA AV Sync Message
-
-********************************/
-
-/* op_code for MM light stack */
-#define BTA_AV_SYNC_TO_LITE_REQ 0
-#define BTA_AV_SYNC_TO_LITE_RESP 1
-#define BTA_AV_STR_START_TO_LITE_REQ 2
-#define BTA_AV_STR_START_TO_LITE_RESP 3
-#define BTA_AV_STR_STOP_TO_LITE_REQ 4
-#define BTA_AV_STR_STOP_TO_LITE_RESP 5
-#define BTA_AV_STR_CLEANUP_TO_LITE_REQ 6
-#define BTA_AV_STR_CLEANUP_TO_LITE_RESP 7
-#define BTA_AV_STR_SUSPEND_TO_LITE_REQ 8
-#define BTA_AV_STR_SUSPEND_TO_LITE_RESP 9
-#define BTA_AV_SYNC_ERROR_RESP 10
-
-/* op_code for BTC light stack */
-#define A2DP_START_REQ 11
-#define A2DP_START_RESP 12
-#define A2DP_STOP_REQ 13
-#define A2DP_STOP_RESP 14
-#define A2DP_CLEANUP_REQ 15
-#define A2DP_CLEANUP_RESP 16
-#define A2DP_SUSPEND_REQ 17
-#define A2DP_SUSPEND_RESP 18
-
-#define A2DP_JITTER_DONE_IND 41 /* For BTSNK */
-
-#define AUDIO_CODEC_CONFIG_REQ 19
-#define AUDIO_CODEC_CONFIG_RESP 20
-#define AUDIO_CODEC_SET_BITRATE_REQ 21
-#define AUDIO_CODEC_FLUSH_REQ 22
-#define AUDIO_ROUTE_CONFIG_REQ 23
-#define AUDIO_ROUTE_CONFIG_RESP 24
-#define AUDIO_MIX_CONFIG_REQ 25
-#define AUDIO_MIX_CONFIG_RESP 26
-#define AUDIO_BURST_FRAMES_IND 27
-#define AUDIO_BURST_END_IND 28
-#define AUDIO_EQ_MODE_CONFIG_REQ 29
-#define AUDIO_SCALE_CONFIG_REQ 30
-
-/* For TIVO, only applicable for I2S -> DAC */
-#define AUDIO_SUB_ROUTE_REQ 51
-#define AUDIO_SUB_ROUTE_RESP 52
-
typedef struct
{
UINT8 opcode; /* A2DP_START_REQ */
@@ -789,96 +564,5 @@
tMIX_SCALE_CONFIG mix_scale;
} tAUDIO_SCALE_CONFIG_REQ;
-typedef UINT8 tBTA_AV_DUAL_STACK_EVT;
-
-typedef struct
-{
- UINT8 avdt_handle; /* AVDTP handle */
- UINT8 chnl; /* the channel: audio/video */
- UINT8 codec_type; /* codec type */
- BOOLEAN cong; /* TRUE if AVDTP congested */
- UINT8 hdi; /* the index to SCB[] */
- UINT8 hndl; /* the handle: ((hdi + 1)|chnl) */
- UINT8 l2c_bufs; /* the number of buffers queued to L2CAP */
- UINT16 l2c_cid; /* L2CAP channel ID */
- BD_ADDR peer_addr; /* peer BD address */
-}tBTA_AV_SYNC_INFO;
-
-typedef struct
-{
- tBTA_AV_DUAL_STACK_EVT event;
- tBTA_AV_SYNC_INFO sync_info;
- UINT16 curr_mtu; /* common mtu shared by all active streams */
- UINT8 multi_av_supported; /* Whether multi-av is supported */
-}tBTA_AV_SYNC_INFO_REQ; /* SYNC_TO_LITE_REQ */
-
-/* Dual stack stream events */
-typedef struct
-{
- tBTA_AV_DUAL_STACK_EVT event;
- UINT8 scb_idx;
-}tBTA_AV_SCB_EVT;
-
-/* data type for the Audio Codec Information*/
-typedef struct
-{
- UINT16 bit_rate; /* SBC encoder bit rate in kbps */
- UINT16 bit_rate_busy; /* SBC encoder bit rate in kbps */
- UINT16 bit_rate_swampd; /* SBC encoder bit rate in kbps */
- UINT8 busy_level; /* Busy level indicating the bit-rate to be used */
- UINT8 codec_info[AVDT_CODEC_SIZE];
- UINT8 codec_type; /* Codec type */
-} tBTA_AV_AUDIO_CODEC_SYNC_INFO;
-
-/* Dual stack stream events */
-typedef struct
-{
- tBTA_AV_DUAL_STACK_EVT event;
- UINT8 scb_idx;
- UINT8 audio_open_cnt;
- tBTA_AV_AUDIO_CODEC_SYNC_INFO p_codec_cfg;
- UINT8 start_stop_flag;
-}tBTA_AV_SCB_REQ;
-
-typedef struct
-{
- tBTA_AV_DUAL_STACK_EVT event;
- UINT8 scb_idx;
- UINT8 audio_open_cnt;
- UINT16 curr_mtu; /* common mtu shared by all active streams */
-}tBTA_AV_SCB_CLEANUP_REQ;
-
-/* Add request/response structures if needed ...
-typedef struct
-{
- event;
- data;
-}tBTA_AV_SYNC_*_REQ/RESP;
-*/
-
-typedef union
-{
- /* MM light stack */
- tBTA_AV_DUAL_STACK_EVT event;
- tBTA_AV_SYNC_INFO_REQ sync_info_req;
- tBTA_AV_SCB_EVT scb_evt;
- tBTA_AV_SCB_REQ scb_req;
- tBTA_AV_SCB_CLEANUP_REQ scb_cleanup_req;
-
- /* BTC light stack */
- UINT8 opcode;
- tA2DP_START_REQ btc_start_req;
- tA2DP_STOP_REQ btc_stop_req;
- tA2DP_CLEANUP_REQ btc_cleanup_req;
- tA2DP_SUSPEND_REQ btc_suspend_req;
-
- tAUDIO_CODEC_CONFIG_REQ codec_config_req;
- tAUDIO_CODEC_SET_BITRATE_REQ codec_bitrate_req;
- tAUDIO_CODEC_FLUSH_REQ codec_flush_req;
- tAUDIO_ROUTE_CONFIG_REQ route_config_req;
- tAUDIO_MIX_CONFIG_REQ mix_config_req;
- tAUDIO_EQ_MODE_CONFIG_REQ eq_mode_req;
- tAUDIO_SCALE_CONFIG_REQ scale_config_req;
-}tBTA_DUAL_STACK_MSG;
-
#endif /* UIPC_MSG_H */
+
diff --git a/stack/l2cap/l2c_api.c b/stack/l2cap/l2c_api.c
index 30249a4..3d228d8 100644
--- a/stack/l2cap/l2c_api.c
+++ b/stack/l2cap/l2c_api.c
@@ -54,7 +54,7 @@
tL2C_RCB *p_rcb;
UINT16 vpsm = psm;
- L2CAP_TRACE_API1 ("L2CAP - L2CA_Register() called for PSM: 0x%04x", psm);
+ L2CAP_TRACE_API ("L2CAP - L2CA_Register() called for PSM: 0x%04x", psm);
/* Verify that the required callback info has been filled in
** Note: Connection callbacks are required but not checked
@@ -66,14 +66,14 @@
|| (!p_cb_info->pL2CA_DataInd_Cb)
|| (!p_cb_info->pL2CA_DisconnectInd_Cb))
{
- L2CAP_TRACE_ERROR1 ("L2CAP - no cb registering PSM: 0x%04x", psm);
+ L2CAP_TRACE_ERROR ("L2CAP - no cb registering PSM: 0x%04x", psm);
return (0);
}
/* Verify PSM is valid */
if (L2C_INVALID_PSM(psm))
{
- L2CAP_TRACE_ERROR1 ("L2CAP - invalid PSM value, PSM: 0x%04x", psm);
+ L2CAP_TRACE_ERROR ("L2CAP - invalid PSM value, PSM: 0x%04x", psm);
return (0);
}
@@ -87,7 +87,7 @@
break;
}
- L2CAP_TRACE_API2 ("L2CA_Register - Real PSM: 0x%04x Virtual PSM: 0x%04x", psm, vpsm);
+ L2CAP_TRACE_API ("L2CA_Register - Real PSM: 0x%04x Virtual PSM: 0x%04x", psm, vpsm);
}
/* If registration block already there, just overwrite it */
@@ -95,7 +95,7 @@
{
if ((p_rcb = l2cu_allocate_rcb (vpsm)) == NULL)
{
- L2CAP_TRACE_WARNING2 ("L2CAP - no RCB available, PSM: 0x%04x vPSM: 0x%04x", psm, vpsm);
+ L2CAP_TRACE_WARNING ("L2CAP - no RCB available, PSM: 0x%04x vPSM: 0x%04x", psm, vpsm);
return (0);
}
}
@@ -125,7 +125,7 @@
tL2C_LCB *p_lcb;
int ii;
- L2CAP_TRACE_API1 ("L2CAP - L2CA_Deregister() called for PSM: 0x%04x", psm);
+ L2CAP_TRACE_API ("L2CAP - L2CA_Deregister() called for PSM: 0x%04x", psm);
if ((p_rcb = l2cu_find_rcb_by_psm (psm)) != NULL)
{
@@ -151,7 +151,7 @@
}
else
{
- L2CAP_TRACE_WARNING1 ("L2CAP - PSM: 0x%04x not found for deregistration", psm);
+ L2CAP_TRACE_WARNING ("L2CAP - PSM: 0x%04x not found for deregistration", psm);
}
}
@@ -170,7 +170,7 @@
BOOLEAN done = FALSE;
UINT16 psm = l2cb.dyn_psm;
- L2CAP_TRACE_API0( "L2CA_AllocatePSM");
+ L2CAP_TRACE_API( "L2CA_AllocatePSM");
while (!done)
{
psm += 2;
@@ -223,6 +223,10 @@
** connection establishment gets started. The callback function
** will be invoked when connection establishes or fails.
**
+** Parameters: PSM: L2CAP PSM for the connection
+** BD address of the peer
+** Enhaced retransmission mode configurations
+
** Returns the CID of the connection, or 0 if it failed to start
**
*******************************************************************************/
@@ -232,32 +236,35 @@
tL2C_CCB *p_ccb;
tL2C_RCB *p_rcb;
- L2CAP_TRACE_API6 ("L2CA_ErtmConnectReq() PSM: 0x%04x BDA: %08x%04x p_ertm_info: 0x%08x allowed:0x%x preferred:%d", psm,
+ L2CAP_TRACE_API ("L2CA_ErtmConnectReq() PSM: 0x%04x BDA: %08x%04x p_ertm_info: 0x%08x allowed:0x%x preferred:%d", psm,
(p_bd_addr[0]<<24)+(p_bd_addr[1]<<16)+(p_bd_addr[2]<<8)+p_bd_addr[3],
(p_bd_addr[4]<<8)+p_bd_addr[5], p_ertm_info,
- (p_ertm_info) ? p_ertm_info->allowed_modes : 0, (p_ertm_info) ? p_ertm_info->preferred_mode : 0);
+ (p_ertm_info) ? p_ertm_info->allowed_modes : 0,
+ (p_ertm_info) ? p_ertm_info->preferred_mode : 0);
/* Fail if we have not established communications with the controller */
if (!BTM_IsDeviceUp())
{
- L2CAP_TRACE_WARNING0 ("L2CAP connect req - BTU not ready");
+ L2CAP_TRACE_WARNING ("L2CAP connect req - BTU not ready");
return (0);
}
/* Fail if the PSM is not registered */
if ((p_rcb = l2cu_find_rcb_by_psm (psm)) == NULL)
{
- L2CAP_TRACE_WARNING1 ("L2CAP - no RCB for L2CA_conn_req, PSM: 0x%04x", psm);
+ L2CAP_TRACE_WARNING ("L2CAP - no RCB for L2CA_conn_req, PSM: 0x%04x", psm);
return (0);
}
/* First, see if we already have a link to the remote */
- if ((p_lcb = l2cu_find_lcb_by_bd_addr (p_bd_addr)) == NULL)
+ /* assume all ERTM l2cap connection is going over BR/EDR for now */
+ if ((p_lcb = l2cu_find_lcb_by_bd_addr (p_bd_addr, BT_TRANSPORT_BR_EDR)) == NULL)
{
/* No link. Get an LCB and start link establishment */
- if ( ((p_lcb = l2cu_allocate_lcb (p_bd_addr, FALSE)) == NULL)
- || (l2cu_create_conn(p_lcb) == FALSE) )
+ if ( ((p_lcb = l2cu_allocate_lcb (p_bd_addr, FALSE, BT_TRANSPORT_BR_EDR)) == NULL)
+ /* currently use BR/EDR for ERTM mode l2cap connection */
+ || (l2cu_create_conn(p_lcb, BT_TRANSPORT_BR_EDR) == FALSE) )
{
- L2CAP_TRACE_WARNING2 ("L2CAP - conn not started for PSM: 0x%04x p_lcb: 0x%08x", psm, p_lcb);
+ L2CAP_TRACE_WARNING ("L2CAP - conn not started for PSM: 0x%04x p_lcb: 0x%08x", psm, p_lcb);
return (0);
}
}
@@ -265,7 +272,7 @@
/* Allocate a channel control block */
if ((p_ccb = l2cu_allocate_ccb (p_lcb, 0)) == NULL)
{
- L2CAP_TRACE_WARNING1 ("L2CAP - no CCB for L2CA_conn_req, PSM: 0x%04x", psm);
+ L2CAP_TRACE_WARNING ("L2CAP - no CCB for L2CA_conn_req, PSM: 0x%04x", psm);
return (0);
}
@@ -289,7 +296,8 @@
if (p_ccb->ertm_info.user_tx_pool_id == L2CAP_DEFAULT_ERM_POOL_ID)
p_ccb->ertm_info.user_tx_pool_id = HCI_ACL_POOL_ID;
- p_ccb->max_rx_mtu = GKI_get_pool_bufsize (p_ertm_info->user_rx_pool_id) - (L2CAP_MIN_OFFSET + L2CAP_SDU_LEN_OFFSET + L2CAP_FCS_LEN);
+ p_ccb->max_rx_mtu = GKI_get_pool_bufsize (p_ertm_info->user_rx_pool_id) -
+ (L2CAP_MIN_OFFSET + L2CAP_SDU_LEN_OFFSET + L2CAP_FCS_LEN);
}
/* If link is up, start the L2CAP connection */
@@ -306,13 +314,13 @@
*/
else if (p_lcb->link_state == LST_DISCONNECTING)
{
- L2CAP_TRACE_DEBUG0 ("L2CAP API - link disconnecting: RETRY LATER");
+ L2CAP_TRACE_DEBUG ("L2CAP API - link disconnecting: RETRY LATER");
/* Save ccb so it can be started after disconnect is finished */
p_lcb->p_pending_ccb = p_ccb;
}
- L2CAP_TRACE_API2 ("L2CAP - L2CA_conn_req(psm: 0x%04x) returned CID: 0x%04x", psm, p_ccb->local_cid);
+ L2CAP_TRACE_API ("L2CAP - L2CA_conn_req(psm: 0x%04x) returned CID: 0x%04x", psm, p_ccb->local_cid);
/* Return the local CID as our handle */
return (p_ccb->local_cid);
@@ -330,7 +338,8 @@
** Returns TRUE for success, FALSE for failure
**
*******************************************************************************/
-BOOLEAN L2CA_ConnectRsp (BD_ADDR p_bd_addr, UINT8 id, UINT16 lcid, UINT16 result, UINT16 status)
+BOOLEAN L2CA_ConnectRsp (BD_ADDR p_bd_addr, UINT8 id, UINT16 lcid,
+ UINT16 result, UINT16 status)
{
return L2CA_ErtmConnectRsp (p_bd_addr, id, lcid, result, status, NULL);
}
@@ -353,30 +362,30 @@
tL2C_LCB *p_lcb;
tL2C_CCB *p_ccb;
- L2CAP_TRACE_API6 ("L2CA_ErtmConnectRsp() CID: 0x%04x Result: %d Status: %d BDA: %08x%04x p_ertm_info:0x%08x",
+ L2CAP_TRACE_API ("L2CA_ErtmConnectRsp() CID: 0x%04x Result: %d Status: %d BDA: %08x%04x p_ertm_info:0x%08x",
lcid, result, status,
(p_bd_addr[0]<<24)+(p_bd_addr[1]<<16)+(p_bd_addr[2]<<8)+p_bd_addr[3],
(p_bd_addr[4]<<8)+p_bd_addr[5], p_ertm_info);
/* First, find the link control block */
- if ((p_lcb = l2cu_find_lcb_by_bd_addr (p_bd_addr)) == NULL)
+ if ((p_lcb = l2cu_find_lcb_by_bd_addr (p_bd_addr, BT_TRANSPORT_BR_EDR)) == NULL)
{
/* No link. Get an LCB and start link establishment */
- L2CAP_TRACE_WARNING0 ("L2CAP - no LCB for L2CA_conn_rsp");
+ L2CAP_TRACE_WARNING ("L2CAP - no LCB for L2CA_conn_rsp");
return (FALSE);
}
/* Now, find the channel control block */
if ((p_ccb = l2cu_find_ccb_by_cid (p_lcb, lcid)) == NULL)
{
- L2CAP_TRACE_WARNING0 ("L2CAP - no CCB for L2CA_conn_rsp");
+ L2CAP_TRACE_WARNING ("L2CAP - no CCB for L2CA_conn_rsp");
return (FALSE);
}
/* The IDs must match */
if (p_ccb->remote_id != id)
{
- L2CAP_TRACE_WARNING2 ("L2CAP - bad id in L2CA_conn_rsp. Exp: %d Got: %d", p_ccb->remote_id, id);
+ L2CAP_TRACE_WARNING ("L2CAP - bad id in L2CA_conn_rsp. Exp: %d Got: %d", p_ccb->remote_id, id);
return (FALSE);
}
@@ -436,13 +445,13 @@
{
tL2C_CCB *p_ccb;
- L2CAP_TRACE_API5 ("L2CA_ConfigReq() CID 0x%04x: fcr_present:%d (mode %d) mtu_present:%d (%d)",
+ L2CAP_TRACE_API ("L2CA_ConfigReq() CID 0x%04x: fcr_present:%d (mode %d) mtu_present:%d (%d)",
cid, p_cfg->fcr_present, p_cfg->fcr.mode, p_cfg->mtu_present, p_cfg->mtu);
/* Find the channel control block. We don't know the link it is on. */
if ((p_ccb = l2cu_find_ccb_by_cid (NULL, cid)) == NULL)
{
- L2CAP_TRACE_WARNING1 ("L2CAP - no CCB for L2CA_cfg_req, CID: %d", cid);
+ L2CAP_TRACE_WARNING ("L2CAP - no CCB for L2CA_cfg_req, CID: %d", cid);
return (FALSE);
}
@@ -459,7 +468,7 @@
if ( (p_cfg->mtu_present) && (p_cfg->mtu > L2CAP_MTU_SIZE) )
{
- L2CAP_TRACE_WARNING1 ("L2CAP - adjust MTU: %u too large", p_cfg->mtu);
+ L2CAP_TRACE_WARNING ("L2CAP - adjust MTU: %u too large", p_cfg->mtu);
p_cfg->mtu = L2CAP_MTU_SIZE;
}
}
@@ -487,13 +496,13 @@
{
tL2C_CCB *p_ccb;
- L2CAP_TRACE_API6 ("L2CA_ConfigRsp() CID: 0x%04x Result: %d MTU present:%d Flush TO:%d FCR:%d FCS:%d",
+ L2CAP_TRACE_API ("L2CA_ConfigRsp() CID: 0x%04x Result: %d MTU present:%d Flush TO:%d FCR:%d FCS:%d",
cid, p_cfg->result, p_cfg->mtu_present, p_cfg->flush_to_present, p_cfg->fcr_present, p_cfg->fcs_present);
/* Find the channel control block. We don't know the link it is on. */
if ((p_ccb = l2cu_find_ccb_by_cid (NULL, cid)) == NULL)
{
- L2CAP_TRACE_WARNING1 ("L2CAP - no CCB for L2CA_cfg_rsp, CID: %d", cid);
+ L2CAP_TRACE_WARNING ("L2CAP - no CCB for L2CA_cfg_rsp, CID: %d", cid);
return (FALSE);
}
@@ -531,12 +540,12 @@
{
tL2C_CCB *p_ccb;
- L2CAP_TRACE_API1 ("L2CA_DisconnectReq() CID: 0x%04x", cid);
+ L2CAP_TRACE_API ("L2CA_DisconnectReq() CID: 0x%04x", cid);
/* Find the channel control block. We don't know the link it is on. */
if ((p_ccb = l2cu_find_ccb_by_cid (NULL, cid)) == NULL)
{
- L2CAP_TRACE_WARNING1 ("L2CAP - no CCB for L2CA_disc_req, CID: %d", cid);
+ L2CAP_TRACE_WARNING ("L2CAP - no CCB for L2CA_disc_req, CID: %d", cid);
return (FALSE);
}
@@ -559,12 +568,12 @@
{
tL2C_CCB *p_ccb;
- L2CAP_TRACE_API1 ("L2CA_DisconnectRsp() CID: 0x%04x", cid);
+ L2CAP_TRACE_API ("L2CA_DisconnectRsp() CID: 0x%04x", cid);
/* Find the channel control block. We don't know the link it is on. */
if ((p_ccb = l2cu_find_ccb_by_cid (NULL, cid)) == NULL)
{
- L2CAP_TRACE_WARNING1 ("L2CAP - no CCB for L2CA_disc_rsp, CID: %d", cid);
+ L2CAP_TRACE_WARNING ("L2CAP - no CCB for L2CA_disc_rsp, CID: %d", cid);
return (FALSE);
}
@@ -586,7 +595,7 @@
{
tL2C_LCB *p_lcb;
- L2CAP_TRACE_API6 ("L2CA_Ping() BDA: %02x-%02x-%02x-%02x-%02x-%02x",
+ L2CAP_TRACE_API ("L2CA_Ping() BDA: %02x-%02x-%02x-%02x-%02x-%02x",
p_bd_addr[0], p_bd_addr[1], p_bd_addr[2], p_bd_addr[3], p_bd_addr[4], p_bd_addr[5]);
/* Fail if we have not established communications with the controller */
@@ -594,15 +603,15 @@
return (FALSE);
/* First, see if we already have a link to the remote */
- if ((p_lcb = l2cu_find_lcb_by_bd_addr (p_bd_addr)) == NULL)
+ if ((p_lcb = l2cu_find_lcb_by_bd_addr (p_bd_addr, BT_TRANSPORT_BR_EDR)) == NULL)
{
/* No link. Get an LCB and start link establishment */
- if ((p_lcb = l2cu_allocate_lcb (p_bd_addr, FALSE)) == NULL)
+ if ((p_lcb = l2cu_allocate_lcb (p_bd_addr, FALSE, BT_TRANSPORT_BR_EDR)) == NULL)
{
- L2CAP_TRACE_WARNING0 ("L2CAP - no LCB for L2CA_ping");
+ L2CAP_TRACE_WARNING ("L2CAP - no LCB for L2CA_ping");
return (FALSE);
}
- if (l2cu_create_conn(p_lcb) == FALSE)
+ if (l2cu_create_conn(p_lcb, BT_TRANSPORT_BR_EDR) == FALSE)
{
return (FALSE);
}
@@ -615,14 +624,14 @@
/* We only allow 1 ping outstanding at a time */
if (p_lcb->p_echo_rsp_cb != NULL)
{
- L2CAP_TRACE_WARNING0 ("L2CAP - rejected second L2CA_ping");
+ L2CAP_TRACE_WARNING ("L2CAP - rejected second L2CA_ping");
return (FALSE);
}
/* Have a link control block. If link is disconnecting, tell user to retry later */
if (p_lcb->link_state == LST_DISCONNECTING)
{
- L2CAP_TRACE_WARNING0 ("L2CAP - L2CA_ping rejected - link disconnecting");
+ L2CAP_TRACE_WARNING ("L2CAP - L2CA_ping rejected - link disconnecting");
return (FALSE);
}
@@ -654,7 +663,7 @@
tL2C_LCB *p_lcb;
UINT8 *pp;
- L2CAP_TRACE_API2 ("L2CA_Echo() BDA: %08X%04X",
+ L2CAP_TRACE_API ("L2CA_Echo() BDA: %08X%04X",
((p_bd_addr[0] << 24) + (p_bd_addr[1] << 16) + (p_bd_addr[2] << 8) + (p_bd_addr[3])),
((p_bd_addr[4] << 8) + (p_bd_addr[5])));
@@ -670,15 +679,15 @@
}
/* We assume the upper layer will call this function only when the link is established. */
- if ((p_lcb = l2cu_find_lcb_by_bd_addr (p_bd_addr)) == NULL)
+ if ((p_lcb = l2cu_find_lcb_by_bd_addr (p_bd_addr, BT_TRANSPORT_BR_EDR)) == NULL)
{
- L2CAP_TRACE_ERROR0 ("L2CA_Echo ERROR : link not established");
+ L2CAP_TRACE_ERROR ("L2CA_Echo ERROR : link not established");
return FALSE;
}
if (p_lcb->link_state != LST_CONNECTED)
{
- L2CAP_TRACE_ERROR0 ("L2CA_Echo ERROR : link is not connected");
+ L2CAP_TRACE_ERROR ("L2CA_Echo ERROR : link is not connected");
return FALSE;
}
@@ -727,7 +736,7 @@
/* Find the channel control block. We don't know the link it is on. */
if ((p_ccb = l2cu_find_ccb_by_cid (NULL, cid)) == NULL)
{
- L2CAP_TRACE_WARNING1 ("L2CAP - no CCB for L2CA_SetIdleTimeout, CID: %d", cid);
+ L2CAP_TRACE_WARNING ("L2CAP - no CCB for L2CA_SetIdleTimeout, CID: %d", cid);
return (FALSE);
}
@@ -767,7 +776,7 @@
if (memcmp (BT_BD_ANY, bd_addr, BD_ADDR_LEN))
{
- p_lcb = l2cu_find_lcb_by_bd_addr( bd_addr );
+ p_lcb = l2cu_find_lcb_by_bd_addr( bd_addr, BT_TRANSPORT_BR_EDR);
if ((p_lcb) && (p_lcb->in_use) && (p_lcb->link_state == LST_CONNECTED))
p_lcb->idle_timeout = timeout;
else
@@ -827,7 +836,7 @@
*******************************************************************************/
UINT8 L2CA_SetDesireRole (UINT8 new_role)
{
- L2CAP_TRACE_API2 ("L2CA_SetDesireRole() new:x%x, disallow_switch:%d",
+ L2CAP_TRACE_API ("L2CA_SetDesireRole() new:x%x, disallow_switch:%d",
new_role, l2cb.disallow_switch);
if (L2CAP_ROLE_CHECK_SWITCH != (L2CAP_ROLE_CHECK_SWITCH & new_role))
@@ -864,25 +873,25 @@
tL2C_CCB *p_ccb;
tL2C_RCB *p_rcb;
- L2CAP_TRACE_API2 ("L2CA_LocalLoopbackReq() PSM: %d Handle: 0x%04x", psm, handle);
+ L2CAP_TRACE_API ("L2CA_LocalLoopbackReq() PSM: %d Handle: 0x%04x", psm, handle);
/* Fail if we have not established communications with the controller */
if (!BTM_IsDeviceUp())
{
- L2CAP_TRACE_WARNING0 ("L2CAP loop req - BTU not ready");
+ L2CAP_TRACE_WARNING ("L2CAP loop req - BTU not ready");
return (0);
}
/* Fail if the PSM is not registered */
if ((p_rcb = l2cu_find_rcb_by_psm (psm)) == NULL)
{
- L2CAP_TRACE_WARNING1 ("L2CAP - no RCB for L2CA_conn_req, PSM: %d", psm);
+ L2CAP_TRACE_WARNING ("L2CAP - no RCB for L2CA_conn_req, PSM: %d", psm);
return (0);
}
- if ((p_lcb = l2cu_allocate_lcb (p_bd_addr, FALSE)) == NULL)
+ if ((p_lcb = l2cu_allocate_lcb (p_bd_addr, FALSE, BT_TRANSPORT_BR_EDR)) == NULL)
{
- L2CAP_TRACE_WARNING0 ("L2CAP - no LCB for L2CA_conn_req");
+ L2CAP_TRACE_WARNING ("L2CAP - no LCB for L2CA_conn_req");
return (0);
}
@@ -892,7 +901,7 @@
/* Allocate a channel control block */
if ((p_ccb = l2cu_allocate_ccb (p_lcb, 0)) == NULL)
{
- L2CAP_TRACE_WARNING0 ("L2CAP - no CCB for L2CA_conn_req");
+ L2CAP_TRACE_WARNING ("L2CAP - no CCB for L2CA_conn_req");
return (0);
}
@@ -919,7 +928,7 @@
*******************************************************************************/
BOOLEAN L2CA_SetAclPriority (BD_ADDR bd_addr, UINT8 priority)
{
- L2CAP_TRACE_API6 ("L2CA_SetAclPriority() bdaddr: %02x%02x%02x%02x%04x, priority:%d",
+ L2CAP_TRACE_API ("L2CA_SetAclPriority() bdaddr: %02x%02x%02x%02x%04x, priority:%d",
bd_addr[0], bd_addr[1], bd_addr[2],
bd_addr[3], (bd_addr[4] << 8) + bd_addr[5], priority);
@@ -942,18 +951,18 @@
tL2C_CCB *p_ccb;
BOOLEAN on_off = !data_enabled;
- L2CAP_TRACE_API2 ("L2CA_FlowControl(%d) CID: 0x%04x", on_off, cid);
+ L2CAP_TRACE_API ("L2CA_FlowControl(%d) CID: 0x%04x", on_off, cid);
/* Find the channel control block. We don't know the link it is on. */
if ((p_ccb = l2cu_find_ccb_by_cid (NULL, cid)) == NULL)
{
- L2CAP_TRACE_WARNING2 ("L2CAP - no CCB for L2CA_FlowControl, CID: 0x%04x data_enabled: %d", cid, data_enabled);
+ L2CAP_TRACE_WARNING ("L2CAP - no CCB for L2CA_FlowControl, CID: 0x%04x data_enabled: %d", cid, data_enabled);
return (FALSE);
}
if (p_ccb->peer_cfg.fcr.mode != L2CAP_FCR_ERTM_MODE)
{
- L2CAP_TRACE_EVENT1 ("L2CA_FlowControl() invalid mode:%d", p_ccb->peer_cfg.fcr.mode);
+ L2CAP_TRACE_EVENT ("L2CA_FlowControl() invalid mode:%d", p_ccb->peer_cfg.fcr.mode);
return (FALSE);
}
if (p_ccb->fcrb.local_busy != on_off)
@@ -985,12 +994,12 @@
{
tL2C_CCB *p_ccb;
- L2CAP_TRACE_API3 ("L2CA_SendTestSFrame() CID: 0x%04x Type: 0x%02x back_track: %u", cid, sup_type, back_track);
+ L2CAP_TRACE_API ("L2CA_SendTestSFrame() CID: 0x%04x Type: 0x%02x back_track: %u", cid, sup_type, back_track);
/* Find the channel control block. We don't know the link it is on. */
if ((p_ccb = l2cu_find_ccb_by_cid (NULL, cid)) == NULL)
{
- L2CAP_TRACE_WARNING1 ("L2CAP - no CCB for L2CA_SendTestSFrame, CID: %d", cid);
+ L2CAP_TRACE_WARNING ("L2CAP - no CCB for L2CA_SendTestSFrame, CID: %d", cid);
return (FALSE);
}
@@ -1018,12 +1027,12 @@
{
tL2C_CCB *p_ccb;
- L2CAP_TRACE_API2 ("L2CA_SetTxPriority() CID: 0x%04x, priority:%d", cid, priority);
+ L2CAP_TRACE_API ("L2CA_SetTxPriority() CID: 0x%04x, priority:%d", cid, priority);
/* Find the channel control block. We don't know the link it is on. */
if ((p_ccb = l2cu_find_ccb_by_cid (NULL, cid)) == NULL)
{
- L2CAP_TRACE_WARNING1 ("L2CAP - no CCB for L2CA_SetTxPriority, CID: %d", cid);
+ L2CAP_TRACE_WARNING ("L2CAP - no CCB for L2CA_SetTxPriority, CID: %d", cid);
return (FALSE);
}
@@ -1046,12 +1055,12 @@
{
tL2C_CCB *p_ccb;
- L2CAP_TRACE_API3 ("L2CA_SetChnlDataRate() CID: 0x%04x, tx:%d, rx:%d", cid, tx, rx);
+ L2CAP_TRACE_API ("L2CA_SetChnlDataRate() CID: 0x%04x, tx:%d, rx:%d", cid, tx, rx);
/* Find the channel control block. We don't know the link it is on. */
if ((p_ccb = l2cu_find_ccb_by_cid (NULL, cid)) == NULL)
{
- L2CAP_TRACE_WARNING1 ("L2CAP - no CCB for L2CA_SetChnlDataRate, CID: %d", cid);
+ L2CAP_TRACE_WARNING ("L2CAP - no CCB for L2CA_SetChnlDataRate, CID: %d", cid);
return (FALSE);
}
@@ -1118,7 +1127,7 @@
/* if L2CAP flush_to within range of HCI, set HCI flush timeout */
if (temp > HCI_MAX_AUTO_FLUSH_TOUT)
{
- L2CAP_TRACE_WARNING1("WARNING L2CA_SetFlushTimeout timeout(0x%x) is out of range", flush_tout);
+ L2CAP_TRACE_WARNING("WARNING L2CA_SetFlushTimeout timeout(0x%x) is out of range", flush_tout);
return FALSE;
}
else
@@ -1129,7 +1138,7 @@
if (memcmp (BT_BD_ANY, bd_addr, BD_ADDR_LEN))
{
- p_lcb = l2cu_find_lcb_by_bd_addr (bd_addr);
+ p_lcb = l2cu_find_lcb_by_bd_addr (bd_addr, BT_TRANSPORT_BR_EDR);
if ((p_lcb) && (p_lcb->in_use) && (p_lcb->link_state == LST_CONNECTED))
{
@@ -1137,7 +1146,7 @@
{
p_lcb->link_flush_tout = flush_tout;
- L2CAP_TRACE_API4 ("L2CA_SetFlushTimeout 0x%04x ms for bd_addr [...;%02x%02x%02x]",
+ L2CAP_TRACE_API ("L2CA_SetFlushTimeout 0x%04x ms for bd_addr [...;%02x%02x%02x]",
flush_tout, bd_addr[3], bd_addr[4], bd_addr[5]);
if (!btsnd_hcic_write_auto_flush_tout (p_lcb->handle, hci_flush_to))
@@ -1146,7 +1155,7 @@
}
else
{
- L2CAP_TRACE_WARNING3 ("WARNING L2CA_SetFlushTimeout No lcb for bd_addr [...;%02x%02x%02x]",
+ L2CAP_TRACE_WARNING ("WARNING L2CA_SetFlushTimeout No lcb for bd_addr [...;%02x%02x%02x]",
bd_addr[3], bd_addr[4], bd_addr[5]);
return (FALSE);
}
@@ -1164,7 +1173,7 @@
{
p_lcb->link_flush_tout = flush_tout;
- L2CAP_TRACE_API4 ("L2CA_SetFlushTimeout 0x%04x ms for bd_addr [...;%02x%02x%02x]",
+ L2CAP_TRACE_API ("L2CA_SetFlushTimeout 0x%04x ms for bd_addr [...;%02x%02x%02x]",
flush_tout, p_lcb->remote_bd_addr[3],
p_lcb->remote_bd_addr[4], p_lcb->remote_bd_addr[5]);
@@ -1195,15 +1204,15 @@
tL2C_LCB *p_lcb;
/* We must already have a link to the remote */
- if ((p_lcb = l2cu_find_lcb_by_bd_addr (bd_addr)) == NULL)
+ if ((p_lcb = l2cu_find_lcb_by_bd_addr (bd_addr, BT_TRANSPORT_BR_EDR)) == NULL)
{
- L2CAP_TRACE_WARNING2 ("L2CA_GetPeerFeatures() No BDA: %08x%04x",
+ L2CAP_TRACE_WARNING ("L2CA_GetPeerFeatures() No BDA: %08x%04x",
(bd_addr[0]<<24)+(bd_addr[1]<<16)+(bd_addr[2]<<8)+bd_addr[3],
(bd_addr[4]<<8)+bd_addr[5]);
return (FALSE);
}
- L2CAP_TRACE_API4 ("L2CA_GetPeerFeatures() BDA: %08x%04x ExtFea: 0x%08x Chnl_Mask[0]: 0x%02x",
+ L2CAP_TRACE_API ("L2CA_GetPeerFeatures() BDA: %08x%04x ExtFea: 0x%08x Chnl_Mask[0]: 0x%02x",
(bd_addr[0]<<24)+(bd_addr[1]<<16)+(bd_addr[2]<<8)+bd_addr[3],
(bd_addr[4]<<8)+bd_addr[5], p_lcb->peer_ext_fea, p_lcb->peer_chnl_mask[0]);
@@ -1258,11 +1267,11 @@
if (p_ccb)
{
- L2CAP_TRACE_API1 ("L2CA_GetChnlFcrMode() returns mode %d", p_ccb->peer_cfg.fcr.mode);
+ L2CAP_TRACE_API ("L2CA_GetChnlFcrMode() returns mode %d", p_ccb->peer_cfg.fcr.mode);
return (p_ccb->peer_cfg.fcr.mode);
}
- L2CAP_TRACE_API0 ("L2CA_GetChnlFcrMode() returns mode L2CAP_FCR_BASIC_MODE");
+ L2CAP_TRACE_API ("L2CA_GetChnlFcrMode() returns mode L2CAP_FCR_BASIC_MODE");
return (L2CAP_FCR_BASIC_MODE);
}
@@ -1283,7 +1292,7 @@
{
if ( (fixed_cid < L2CAP_FIRST_FIXED_CHNL) || (fixed_cid > L2CAP_LAST_FIXED_CHNL) )
{
- L2CAP_TRACE_ERROR1 ("L2CA_RegisterFixedChannel() Invalid CID: 0x%04x", fixed_cid);
+ L2CAP_TRACE_ERROR ("L2CA_RegisterFixedChannel() Invalid CID: 0x%04x", fixed_cid);
return (FALSE);
}
@@ -1307,69 +1316,93 @@
BOOLEAN L2CA_ConnectFixedChnl (UINT16 fixed_cid, BD_ADDR rem_bda)
{
tL2C_LCB *p_lcb;
-#if BLE_INCLUDED == TRUE
+ tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR;
UINT16 reason;
-#endif
- L2CAP_TRACE_API3 ("L2CA_ConnectFixedChnl() CID: 0x%04x BDA: %08x%04x", fixed_cid,
+ L2CAP_TRACE_API ("L2CA_ConnectFixedChnl() CID: 0x%04x BDA: %08x%04x", fixed_cid,
(rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], (rem_bda[4]<<8)+rem_bda[5]);
/* Check CID is valid and registered */
if ( (fixed_cid < L2CAP_FIRST_FIXED_CHNL) || (fixed_cid > L2CAP_LAST_FIXED_CHNL)
|| (l2cb.fixed_reg[fixed_cid - L2CAP_FIRST_FIXED_CHNL].pL2CA_FixedData_Cb == NULL) )
{
- L2CAP_TRACE_ERROR1 ("L2CA_ConnectFixedChnl() Invalid CID: 0x%04x", fixed_cid);
+ L2CAP_TRACE_ERROR ("L2CA_ConnectFixedChnl() Invalid CID: 0x%04x", fixed_cid);
return (FALSE);
}
/* Fail if BT is not yet up */
if (!BTM_IsDeviceUp())
{
- L2CAP_TRACE_WARNING1 ("L2CA_ConnectFixedChnl(0x%04x) - BTU not ready", fixed_cid);
+ L2CAP_TRACE_WARNING ("L2CA_ConnectFixedChnl(0x%04x) - BTU not ready", fixed_cid);
return (FALSE);
}
+#if BLE_INCLUDED == TRUE
+ if (fixed_cid >= L2CAP_ATT_CID && fixed_cid <= L2CAP_SMP_CID)
+ transport = BT_TRANSPORT_LE;
+#endif
+
/* If we already have a link to the remote, check if it supports that CID */
- if ((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda)) != NULL)
+ if ((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, transport)) != NULL)
{
if (!(p_lcb->peer_chnl_mask[0] & (1 << fixed_cid)))
{
- L2CAP_TRACE_EVENT3 ("L2CA_ConnectFixedChnl() CID: 0x%04x BDA: %08x%04x not supported", fixed_cid,
- (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], (rem_bda[4]<<8)+rem_bda[5]);
+ L2CAP_TRACE_EVENT ("L2CA_ConnectFixedChnl() CID:0x%04x BDA: %08x%04x not supported",
+ fixed_cid,(rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3],
+ (rem_bda[4]<<8)+rem_bda[5]);
return (FALSE);
}
/* Get a CCB and link the lcb to it */
- if (!l2cu_initialize_fixed_ccb (p_lcb, fixed_cid, &l2cb.fixed_reg[fixed_cid - L2CAP_FIRST_FIXED_CHNL].fixed_chnl_opts))
+ if (!l2cu_initialize_fixed_ccb (p_lcb, fixed_cid,
+ &l2cb.fixed_reg[fixed_cid - L2CAP_FIRST_FIXED_CHNL].fixed_chnl_opts))
{
- L2CAP_TRACE_WARNING1 ("L2CA_ConnectFixedChnl(0x%04x) - LCB but no CCB", fixed_cid);
+ L2CAP_TRACE_WARNING ("L2CA_ConnectFixedChnl(0x%04x) - LCB but no CCB", fixed_cid);
return (FALSE);
}
+
+ /* racing with disconnecting, queue the connection request */
+ if (p_lcb->link_state == LST_DISCONNECTING)
+ {
+ L2CAP_TRACE_DEBUG ("L2CAP API - link disconnecting: RETRY LATER");
+ /* Save ccb so it can be started after disconnect is finished */
+ p_lcb->p_pending_ccb = p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL];
+ return (TRUE);
+ }
+
#if BLE_INCLUDED == TRUE
- reason = (p_lcb->is_ble_link) ? 1: 0;
- (*l2cb.fixed_reg[fixed_cid - L2CAP_FIRST_FIXED_CHNL].pL2CA_FixedConn_Cb)(p_lcb->remote_bd_addr, TRUE, reason);
+ (*l2cb.fixed_reg[fixed_cid - L2CAP_FIRST_FIXED_CHNL].pL2CA_FixedConn_Cb)
+ (p_lcb->remote_bd_addr, TRUE, 0, p_lcb->transport);
#else
- (*l2cb.fixed_reg[fixed_cid - L2CAP_FIRST_FIXED_CHNL].pL2CA_FixedConn_Cb)(p_lcb->remote_bd_addr, TRUE, 0);
+ (*l2cb.fixed_reg[fixed_cid - L2CAP_FIRST_FIXED_CHNL].pL2CA_FixedConn_Cb)
+ (p_lcb->remote_bd_addr, TRUE, 0, BT_TRANSPORT_BR_EDR);
#endif
return (TRUE);
}
/* No link. Get an LCB and start link establishment */
- if ((p_lcb = l2cu_allocate_lcb (rem_bda, FALSE)) == NULL)
+ if ((p_lcb = l2cu_allocate_lcb (rem_bda, FALSE, transport)) == NULL)
{
- L2CAP_TRACE_WARNING1 ("L2CA_ConnectFixedChnl(0x%04x) - no LCB", fixed_cid);
+ L2CAP_TRACE_WARNING ("L2CA_ConnectFixedChnl(0x%04x) - no LCB", fixed_cid);
return (FALSE);
}
/* Get a CCB and link the lcb to it */
- if (!l2cu_initialize_fixed_ccb (p_lcb, fixed_cid, &l2cb.fixed_reg[fixed_cid - L2CAP_FIRST_FIXED_CHNL].fixed_chnl_opts))
+ if (!l2cu_initialize_fixed_ccb (p_lcb, fixed_cid,
+ &l2cb.fixed_reg[fixed_cid - L2CAP_FIRST_FIXED_CHNL].fixed_chnl_opts))
{
p_lcb->disc_reason = L2CAP_CONN_NO_RESOURCES;
- L2CAP_TRACE_WARNING1 ("L2CA_ConnectFixedChnl(0x%04x) - no CCB", fixed_cid);
+ L2CAP_TRACE_WARNING ("L2CA_ConnectFixedChnl(0x%04x) - no CCB", fixed_cid);
l2cu_release_lcb (p_lcb);
return (FALSE);
}
- return (l2cu_create_conn(p_lcb));
+ if (!l2cu_create_conn(p_lcb, transport))
+ {
+ L2CAP_TRACE_WARNING ("L2CA_ConnectFixedChnl create_conn failed");
+ l2cu_release_lcb (p_lcb);
+ return (FALSE);
+ }
+ return (TRUE);
}
/*******************************************************************************
@@ -1389,35 +1422,47 @@
UINT16 L2CA_SendFixedChnlData (UINT16 fixed_cid, BD_ADDR rem_bda, BT_HDR *p_buf)
{
tL2C_LCB *p_lcb;
+ tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR;
- L2CAP_TRACE_API3 ("L2CA_SendFixedChnlData() CID: 0x%04x BDA: %08x%04x", fixed_cid,
+ L2CAP_TRACE_API ("L2CA_SendFixedChnlData() CID: 0x%04x BDA: %08x%04x", fixed_cid,
(rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], (rem_bda[4]<<8)+rem_bda[5]);
+#if BLE_INCLUDED == TRUE
+ if (fixed_cid >= L2CAP_ATT_CID && fixed_cid <= L2CAP_SMP_CID)
+ transport = BT_TRANSPORT_LE;
+#endif
+
/* Check CID is valid and registered */
if ( (fixed_cid < L2CAP_FIRST_FIXED_CHNL) || (fixed_cid > L2CAP_LAST_FIXED_CHNL)
|| (l2cb.fixed_reg[fixed_cid - L2CAP_FIRST_FIXED_CHNL].pL2CA_FixedData_Cb == NULL) )
{
- L2CAP_TRACE_ERROR1 ("L2CA_SendFixedChnlData() Invalid CID: 0x%04x", fixed_cid);
+ L2CAP_TRACE_ERROR ("L2CA_SendFixedChnlData() Invalid CID: 0x%04x", fixed_cid);
+ GKI_freebuf (p_buf);
return (L2CAP_DW_FAILED);
}
/* Fail if BT is not yet up */
if (!BTM_IsDeviceUp())
{
- L2CAP_TRACE_WARNING1 ("L2CA_SendFixedChnlData(0x%04x) - BTU not ready", fixed_cid);
+ L2CAP_TRACE_WARNING ("L2CA_SendFixedChnlData(0x%04x) - BTU not ready", fixed_cid);
+ GKI_freebuf (p_buf);
return (L2CAP_DW_FAILED);
}
/* We need to have a link up */
- if ((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda)) == NULL)
+ if ((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, transport)) == NULL ||
+ /* if link is disconnecting, also report data sending failure */
+ p_lcb->link_state == LST_DISCONNECTING)
{
- L2CAP_TRACE_WARNING1 ("L2CA_SendFixedChnlData(0x%04x) - no LCB", fixed_cid);
+ L2CAP_TRACE_WARNING ("L2CA_SendFixedChnlData(0x%04x) - no LCB", fixed_cid);
+ GKI_freebuf (p_buf);
return (L2CAP_DW_FAILED);
}
if ((p_lcb->peer_chnl_mask[0] & (1 << fixed_cid)) == 0)
{
- L2CAP_TRACE_WARNING1 ("L2CA_SendFixedChnlData() - peer does not support fixed chnl: 0x%04x", fixed_cid);
+ L2CAP_TRACE_WARNING ("L2CA_SendFixedChnlData() - peer does not support fixed chnl: 0x%04x", fixed_cid);
+ GKI_freebuf (p_buf);
return (L2CAP_DW_FAILED);
}
@@ -1428,11 +1473,23 @@
{
if (!l2cu_initialize_fixed_ccb (p_lcb, fixed_cid, &l2cb.fixed_reg[fixed_cid - L2CAP_FIRST_FIXED_CHNL].fixed_chnl_opts))
{
- L2CAP_TRACE_WARNING1 ("L2CA_SendFixedChnlData() - no CCB for chnl: 0x%4x", fixed_cid);
+ L2CAP_TRACE_WARNING ("L2CA_SendFixedChnlData() - no CCB for chnl: 0x%4x", fixed_cid);
+ GKI_freebuf (p_buf);
return (L2CAP_DW_FAILED);
}
}
+ /* If already congested, do not accept any more packets */
+ if (p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL]->cong_sent)
+ {
+ L2CAP_TRACE_ERROR ("L2CAP - CID: 0x%04x cannot send, already congested \
+ xmit_hold_q.count: %u buff_quota: %u", fixed_cid,
+ p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL]->xmit_hold_q.count,
+ p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL]->buff_quota);
+ GKI_freebuf (p_buf);
+ return (L2CAP_DW_FAILED);
+ }
+
l2c_enqueue_peer_data (p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL], p_buf);
l2c_link_check_send_pkts (p_lcb, NULL, NULL);
@@ -1443,6 +1500,9 @@
l2cu_no_dynamic_ccbs (p_lcb);
}
+ if (p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL]->cong_sent)
+ return (L2CAP_DW_CONGESTED);
+
return (L2CAP_DW_SUCCESS);
}
@@ -1463,25 +1523,32 @@
{
tL2C_LCB *p_lcb;
tL2C_CCB *p_ccb;
+ tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR;
/* Check CID is valid and registered */
if ( (fixed_cid < L2CAP_FIRST_FIXED_CHNL) || (fixed_cid > L2CAP_LAST_FIXED_CHNL)
|| (l2cb.fixed_reg[fixed_cid - L2CAP_FIRST_FIXED_CHNL].pL2CA_FixedData_Cb == NULL) )
{
- L2CAP_TRACE_ERROR1 ("L2CA_RemoveFixedChnl() Invalid CID: 0x%04x", fixed_cid);
+ L2CAP_TRACE_ERROR ("L2CA_RemoveFixedChnl() Invalid CID: 0x%04x", fixed_cid);
return (FALSE);
}
+#if BLE_INCLUDED == TRUE
+ if (fixed_cid >= L2CAP_ATT_CID && fixed_cid <= L2CAP_SMP_CID)
+ transport = BT_TRANSPORT_LE;
+#endif
+
/* Is a fixed channel connected to the remote BDA ?*/
- p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda);
+ p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, transport);
+
if ( ((p_lcb) == NULL) || (!p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL]) )
{
- L2CAP_TRACE_WARNING3 ("L2CA_RemoveFixedChnl() CID: 0x%04x BDA: %08x%04x not connected", fixed_cid,
+ L2CAP_TRACE_WARNING ("L2CA_RemoveFixedChnl() CID: 0x%04x BDA: %08x%04x not connected", fixed_cid,
(rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], (rem_bda[4]<<8)+rem_bda[5]);
return (FALSE);
}
- L2CAP_TRACE_API3 ("L2CA_RemoveFixedChnl() CID: 0x%04x BDA: %08x%04x", fixed_cid,
+ L2CAP_TRACE_API ("L2CA_RemoveFixedChnl() CID: 0x%04x BDA: %08x%04x", fixed_cid,
(rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], (rem_bda[4]<<8)+rem_bda[5]);
/* Release the CCB, starting an inactivity timeout on the LCB if no other CCBs exist */
@@ -1491,7 +1558,14 @@
p_lcb->disc_reason = HCI_ERR_CONN_CAUSE_LOCAL_HOST;
#if BLE_INCLUDED == TRUE
- if (fixed_cid == L2CAP_ATT_CID && !p_lcb->ccb_queue.p_first_ccb)
+ /* retain the link for a few more seconds after SMP pairing is done, since Android
+ platformalways do service discovery after pairing complete. This way would avoid
+ the link down (pairing is complete) and an immediate reconnection for service
+ discovery. Some devices do not do auto advertising when link is dropped, thus fail
+ the second connection and service discovery.
+ BEFORE :if ((fixed_cid == L2CAP_ATT_CID || fixed_cid == L2CAP_SMP_CID)
+ && !p_lcb->ccb_queue.p_first_ccb)*/
+ if ((fixed_cid == L2CAP_ATT_CID ) && !p_lcb->ccb_queue.p_first_ccb)
p_lcb->idle_timeout = 0;
#endif
@@ -1520,12 +1594,18 @@
BOOLEAN L2CA_SetFixedChannelTout (BD_ADDR rem_bda, UINT16 fixed_cid, UINT16 idle_tout)
{
tL2C_LCB *p_lcb;
+ tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR;
+
+#if BLE_INCLUDED == TRUE
+ if (fixed_cid >= L2CAP_ATT_CID && fixed_cid <= L2CAP_SMP_CID)
+ transport = BT_TRANSPORT_LE;
+#endif
/* Is a fixed channel connected to the remote BDA ?*/
- p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda);
+ p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, transport);
if ( ((p_lcb) == NULL) || (!p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL]) )
{
- L2CAP_TRACE_WARNING3 ("L2CA_SetFixedChannelTout() CID: 0x%04x BDA: %08x%04x not connected", fixed_cid,
+ L2CAP_TRACE_WARNING ("L2CA_SetFixedChannelTout() CID: 0x%04x BDA: %08x%04x not connected", fixed_cid,
(rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], (rem_bda[4]<<8)+rem_bda[5]);
return (FALSE);
}
@@ -1562,7 +1642,7 @@
{
tL2C_CCB *p_ccb;
- L2CAP_TRACE_API1 ("L2CA_GetCurrentConfig() CID: 0x%04x", lcid);
+ L2CAP_TRACE_API ("L2CA_GetCurrentConfig() CID: 0x%04x", lcid);
p_ccb = l2cu_find_ccb_by_cid(NULL, lcid);
@@ -1592,7 +1672,7 @@
}
else
{
- L2CAP_TRACE_ERROR1 ("No CCB for CID:0x%04x", lcid);
+ L2CAP_TRACE_ERROR ("No CCB for CID:0x%04x", lcid);
return FALSE;
}
}
@@ -1614,7 +1694,7 @@
tL2C_LCB *p_lcb;
/* Find the link that is associated with this remote bdaddr */
- p_lcb = l2cu_find_lcb_by_bd_addr (p_bda);
+ p_lcb = l2cu_find_lcb_by_bd_addr (p_bda, BT_TRANSPORT_BR_EDR);
/* If no link for this handle, nothing to do. */
if (!p_lcb)
@@ -1638,7 +1718,7 @@
*******************************************************************************/
UINT8 L2CA_DataWrite (UINT16 cid, BT_HDR *p_data)
{
- L2CAP_TRACE_API2 ("L2CA_DataWrite() CID: 0x%04x Len: %d", cid, p_data->len);
+ L2CAP_TRACE_API ("L2CA_DataWrite() CID: 0x%04x Len: %d", cid, p_data->len);
return l2c_data_write (cid, p_data, L2CAP_FLUSHABLE_CH_BASED);
}
@@ -1661,13 +1741,13 @@
/* Find the channel control block. We don't know the link it is on. */
if ((p_ccb = l2cu_find_ccb_by_cid (NULL, cid)) == NULL)
{
- L2CAP_TRACE_WARNING1 ("L2CAP - no CCB for L2CA_SetChnlFlushability, CID: %d", cid);
+ L2CAP_TRACE_WARNING ("L2CAP - no CCB for L2CA_SetChnlFlushability, CID: %d", cid);
return (FALSE);
}
p_ccb->is_flushable = is_flushable;
- L2CAP_TRACE_API2 ("L2CA_SetChnlFlushability() CID: 0x%04x is_flushable: %d", cid, is_flushable);
+ L2CAP_TRACE_API ("L2CA_SetChnlFlushability() CID: 0x%04x is_flushable: %d", cid, is_flushable);
#endif
@@ -1691,7 +1771,7 @@
*******************************************************************************/
UINT8 L2CA_DataWriteEx (UINT16 cid, BT_HDR *p_data, UINT16 flags)
{
- L2CAP_TRACE_API3 ("L2CA_DataWriteEx() CID: 0x%04x Len: %d Flags:0x%04X",
+ L2CAP_TRACE_API ("L2CA_DataWriteEx() CID: 0x%04x Len: %d Flags:0x%04X",
cid, p_data->len, flags);
return l2c_data_write (cid, p_data, flags);
}
@@ -1723,18 +1803,18 @@
if ( !p_ccb || ((p_lcb = p_ccb->p_lcb) == NULL) )
{
- L2CAP_TRACE_WARNING1 ("L2CA_FlushChannel() abnormally returning 0 CID: 0x%04x", lcid);
+ L2CAP_TRACE_WARNING ("L2CA_FlushChannel() abnormally returning 0 CID: 0x%04x", lcid);
return (0);
}
if (num_to_flush != L2CAP_FLUSH_CHANS_GET)
{
- L2CAP_TRACE_API4 ("L2CA_FlushChannel (FLUSH) CID: 0x%04x NumToFlush: %d QC: %u pFirst: 0x%08x",
+ L2CAP_TRACE_API ("L2CA_FlushChannel (FLUSH) CID: 0x%04x NumToFlush: %d QC: %u pFirst: 0x%08x",
lcid, num_to_flush, p_ccb->xmit_hold_q.count, p_ccb->xmit_hold_q.p_first);
}
else
{
- L2CAP_TRACE_API1 ("L2CA_FlushChannel (QUERY) CID: 0x%04x", lcid);
+ L2CAP_TRACE_API ("L2CA_FlushChannel (QUERY) CID: 0x%04x", lcid);
}
/* Cannot flush eRTM buffers once they have a sequence number */
@@ -1808,7 +1888,7 @@
num_left += p_ccb->xmit_hold_q.count;
/* Return the local number of buffers left for the CID */
- L2CAP_TRACE_DEBUG3 ("L2CA_FlushChannel() flushed: %u + %u, num_left: %u", num_flushed1, num_flushed2, num_left);
+ L2CAP_TRACE_DEBUG ("L2CA_FlushChannel() flushed: %u + %u, num_left: %u", num_flushed1, num_flushed2, num_left);
/* If we were congested, and now we are not, tell the app */
l2cu_check_channel_congestion (p_ccb);
diff --git a/stack/l2cap/l2c_ble.c b/stack/l2cap/l2c_ble.c
index ba0d7ec..75a2bfb 100644
--- a/stack/l2cap/l2c_ble.c
+++ b/stack/l2cap/l2c_ble.c
@@ -32,7 +32,9 @@
#include "hcimsgs.h"
#if (BLE_INCLUDED == TRUE)
+static void l2cble_start_conn_update (tL2C_LCB *p_lcb);
+#include "vendor_ble.h"
/*******************************************************************************
**
** Function L2CA_CancelBleConnectReq
@@ -51,13 +53,13 @@
/* There can be only one BLE connection request outstanding at a time */
if (btm_ble_get_conn_st() == BLE_CONN_IDLE)
{
- L2CAP_TRACE_WARNING0 ("L2CA_CancelBleConnectReq - no connection pending");
+ L2CAP_TRACE_WARNING ("L2CA_CancelBleConnectReq - no connection pending");
return(FALSE);
}
if (memcmp (rem_bda, l2cb.ble_connecting_bda, BD_ADDR_LEN))
{
- L2CAP_TRACE_WARNING4 ("L2CA_CancelBleConnectReq - different BDA Connecting: %08x%04x Cancel: %08x%04x",
+ L2CAP_TRACE_WARNING ("L2CA_CancelBleConnectReq - different BDA Connecting: %08x%04x Cancel: %08x%04x",
(l2cb.ble_connecting_bda[0]<<24)+(l2cb.ble_connecting_bda[1]<<16)+(l2cb.ble_connecting_bda[2]<<8)+l2cb.ble_connecting_bda[3],
(l2cb.ble_connecting_bda[4]<<8)+l2cb.ble_connecting_bda[5],
(rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], (rem_bda[4]<<8)+rem_bda[5]);
@@ -68,7 +70,7 @@
if (btsnd_hcic_ble_create_conn_cancel())
{
- if ((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda)) != NULL)
+ if ((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, BT_TRANSPORT_LE)) != NULL)
{
p_lcb->disc_reason = L2CAP_CONN_CANCEL;
l2cu_release_lcb (p_lcb);
@@ -84,57 +86,6 @@
/*******************************************************************************
**
-** Function L2CA_InternalBleConnUpdate
-**
-** Description update BLE connection based on status
-**
-** Parameters: lcb
-**
-** Return value: none
-**
-*******************************************************************************/
-static void L2CA_InternalBleConnUpdate (tL2C_LCB *p_lcb)
-{
- if (p_lcb->upd_status & L2C_BLE_UPDATE_PENDING) return;
-
- if (p_lcb->upd_status & L2C_BLE_CONN_UPDATE_DISABLE)
- {
- /* application requests to disable parameters update.
- If parameters are already updated, lets set them
- up to what has been requested during connection establishement */
- if (p_lcb->upd_status & L2C_BLE_NOT_DEFAULT_PARAM)
- {
- tBTM_SEC_DEV_REC *p_dev_rec = btm_find_or_alloc_dev(p_lcb->remote_bd_addr);
-
- btsnd_hcic_ble_upd_ll_conn_params(p_lcb->handle,
- (UINT16)((p_dev_rec->conn_params.min_conn_int != BTM_BLE_CONN_PARAM_UNDEF) ?
- p_dev_rec->conn_params.min_conn_int : BTM_BLE_CONN_INT_MIN_DEF),
- (UINT16)((p_dev_rec->conn_params.max_conn_int != BTM_BLE_CONN_PARAM_UNDEF) ?
- p_dev_rec->conn_params.max_conn_int : BTM_BLE_CONN_INT_MAX_DEF),
- (UINT16)((p_dev_rec->conn_params.slave_latency != BTM_BLE_CONN_PARAM_UNDEF) ?
- p_dev_rec->conn_params.slave_latency : BTM_BLE_CONN_SLAVE_LATENCY_DEF),
- (UINT16)((p_dev_rec->conn_params.supervision_tout != BTM_BLE_CONN_PARAM_UNDEF) ?
- p_dev_rec->conn_params.supervision_tout : BTM_BLE_CONN_TIMEOUT_DEF),
- 0, 0);
- p_lcb->upd_status &= ~L2C_BLE_NOT_DEFAULT_PARAM;
- p_lcb->upd_status |= (L2C_BLE_UPDATE_PENDING | L2C_BLE_NEW_CONN_PARAM);
- }
- }
- else
- {
- /* application allows to do update, if we were delaying one do it now */
- if (p_lcb->upd_status & L2C_BLE_NEW_CONN_PARAM)
- {
- btsnd_hcic_ble_upd_ll_conn_params(p_lcb->handle, p_lcb->min_interval,
- p_lcb->max_interval, p_lcb->latency, p_lcb->timeout, 0, 0);
- p_lcb->upd_status &= ~L2C_BLE_NEW_CONN_PARAM;
- p_lcb->upd_status |= (L2C_BLE_UPDATE_PENDING | L2C_BLE_NOT_DEFAULT_PARAM);
- }
- }
-}
-
-/*******************************************************************************
-**
** Function L2CA_UpdateBleConnParams
**
** Description Update BLE connection parameters.
@@ -144,41 +95,65 @@
** Return value: TRUE if update started
**
*******************************************************************************/
-BOOLEAN L2CA_UpdateBleConnParams (BD_ADDR rem_bda, UINT16 min_int, UINT16 max_int, UINT16 latency, UINT16 timeout)
+BOOLEAN L2CA_UpdateBleConnParams (BD_ADDR rem_bda, UINT16 min_int, UINT16 max_int,
+ UINT16 latency, UINT16 timeout)
{
- tL2C_LCB *p_lcb;
+ tL2C_LCB *p_lcb;
+ tACL_CONN *p_acl_cb = btm_bda_to_acl(rem_bda, BT_TRANSPORT_LE);
- /* See if we have a link control block for the remote device */
- p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda);
+ /* See if we have a link control block for the remote device */
+ p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, BT_TRANSPORT_LE);
- /* If we don't have one, create one and accept the connection. */
- if (!p_lcb)
- {
- L2CAP_TRACE_WARNING2 ("L2CA_UpdateBleConnParams - unknown BD_ADDR %08x%04x",
- (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], (rem_bda[4]<<8)+rem_bda[5]);
- return(FALSE);
- }
+ /* If we don't have one, create one and accept the connection. */
+ if (!p_lcb || !p_acl_cb)
+ {
+ L2CAP_TRACE_WARNING ("L2CA_UpdateBleConnParams - unknown BD_ADDR %08x%04x",
+ (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3],
+ (rem_bda[4]<<8)+rem_bda[5]);
+ return(FALSE);
+ }
- if (!p_lcb->is_ble_link)
- {
- L2CAP_TRACE_WARNING2 ("L2CA_UpdateBleConnParams - BD_ADDR %08x%04x not LE",
- (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], (rem_bda[4]<<8)+rem_bda[5]);
- return(FALSE);
- }
+ if (p_lcb->transport != BT_TRANSPORT_LE)
+ {
+ L2CAP_TRACE_WARNING ("L2CA_UpdateBleConnParams - BD_ADDR %08x%04x not LE",
+ (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3],
+ (rem_bda[4]<<8)+rem_bda[5]);
+ return(FALSE);
+ }
+#if (defined BLE_LLT_INCLUDED) && (BLE_LLT_INCLUDED == TRUE)
+ /* if both 4.1 compliant */
+ if ((HCI_LE_CONN_PARAM_REQ_SUPPORTED(btm_cb.devcb.local_le_features) &&
+ HCI_LE_CONN_PARAM_REQ_SUPPORTED(p_acl_cb->peer_le_features)))
+ {
+ p_lcb->min_interval = min_int;
+ p_lcb->max_interval = max_int;
+ p_lcb->latency = latency;
+ p_lcb->timeout = timeout;
+ p_lcb->conn_update_mask |= L2C_BLE_NEW_CONN_PARAM;
- if (p_lcb->link_role == HCI_ROLE_MASTER)
- {
- p_lcb->min_interval = min_int;
- p_lcb->max_interval = max_int;
- p_lcb->latency = latency;
- p_lcb->timeout = timeout;
- p_lcb->upd_status |= L2C_BLE_NEW_CONN_PARAM;
- L2CA_InternalBleConnUpdate(p_lcb);
- }
- else
- l2cu_send_peer_ble_par_req (p_lcb, min_int, max_int, latency, timeout);
+ l2cble_start_conn_update(p_lcb);
+ }
+ else
+ /* if either side does not support Connection Parameters Request
+ Link Layer Control Procedure,
+ use Link Layer Connection Update procedure */
+#endif
+ {
+ if (p_lcb->link_role == HCI_ROLE_MASTER)
+ {
+ p_lcb->min_interval = min_int;
+ p_lcb->max_interval = max_int;
+ p_lcb->latency = latency;
+ p_lcb->timeout = timeout;
+ p_lcb->conn_update_mask |= L2C_BLE_NEW_CONN_PARAM;
- return(TRUE);
+ l2cble_start_conn_update(p_lcb);
+ }
+ else
+ l2cu_send_peer_ble_par_req (p_lcb, min_int, max_int, latency, timeout);
+ }
+ return(TRUE);
+
}
@@ -198,76 +173,38 @@
tL2C_LCB *p_lcb;
/* See if we have a link control block for the remote device */
- p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda);
+ p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, BT_TRANSPORT_LE);
- /* If we don't have one, create one and accept the connection. */
if (!p_lcb)
{
- L2CAP_TRACE_WARNING2 ("L2CA_EnableUpdateBleConnParams - unknown BD_ADDR %08x%04x",
- (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], (rem_bda[4]<<8)+rem_bda[5]);
+ L2CAP_TRACE_WARNING ("L2CA_EnableUpdateBleConnParams - unknown BD_ADDR %08x%04x",
+ (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3],
+ (rem_bda[4]<<8)+rem_bda[5]);
return (FALSE);
}
- L2CAP_TRACE_API4 ("L2CA_EnableUpdateBleConnParams - BD_ADDR %08x%04x enable %d upd state %d",
- (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], (rem_bda[4]<<8)+rem_bda[5],
- enable, p_lcb->upd_status);
+ L2CAP_TRACE_API ("%s - BD_ADDR %08x%04x enable %d current upd state 0x%02x",__FUNCTION__,
+ (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3],
+ (rem_bda[4]<<8)+rem_bda[5], enable, p_lcb->conn_update_mask);
- if (!p_lcb->is_ble_link || (p_lcb->link_role != HCI_ROLE_MASTER))
+ if (p_lcb->transport != BT_TRANSPORT_LE || (p_lcb->link_role != HCI_ROLE_MASTER))
{
- L2CAP_TRACE_WARNING3 ("L2CA_EnableUpdateBleConnParams - BD_ADDR %08x%04x not LE or not master %d",
- (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], (rem_bda[4]<<8)+rem_bda[5], p_lcb->link_role);
+ L2CAP_TRACE_WARNING ("%s - BD_ADDR %08x%04x not LE or not master %d", __FUNCTION__,
+ (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3],
+ (rem_bda[4]<<8)+rem_bda[5], p_lcb->link_role);
return (FALSE);
}
if (enable)
- {
- p_lcb->upd_status &= ~L2C_BLE_CONN_UPDATE_DISABLE;
- }
+ p_lcb->conn_update_mask &= ~L2C_BLE_CONN_UPDATE_DISABLE;
else
- {
- p_lcb->upd_status |= L2C_BLE_CONN_UPDATE_DISABLE;
- }
+ p_lcb->conn_update_mask |= L2C_BLE_CONN_UPDATE_DISABLE;
- L2CA_InternalBleConnUpdate(p_lcb);
+ l2cble_start_conn_update(p_lcb);
return (TRUE);
}
-/*******************************************************************************
-**
-** Function L2CA_HandleConnUpdateEvent
-**
-** Description This function enables the connection update request from remote
-** after a successful connection update response is received.
-**
-** Returns void
-**
-*******************************************************************************/
-void L2CA_HandleConnUpdateEvent (UINT16 handle, UINT8 status)
-{
- tL2C_LCB *p_lcb;
-
- L2CAP_TRACE_DEBUG0("L2CA_HandleConnUpdateEvent");
-
- /* See if we have a link control block for the remote device */
- p_lcb = l2cu_find_lcb_by_handle(handle);
- if (!p_lcb)
- {
- L2CAP_TRACE_WARNING1("L2CA_EnableUpdateBleConnParams: Invalid handle: %d", handle);
- return;
- }
-
- p_lcb->upd_status &= ~L2C_BLE_UPDATE_PENDING;
-
- if (status != HCI_SUCCESS)
- {
- L2CAP_TRACE_WARNING1("L2CA_EnableUpdateBleConnParams: Error status: %d", status);
- }
-
- L2CA_InternalBleConnUpdate(p_lcb);
-
- L2CAP_TRACE_DEBUG1("L2CA_HandleConnUpdateEvent: upd_status=%d", p_lcb->upd_status);
-}
/*******************************************************************************
**
@@ -284,7 +221,7 @@
tL2C_LCB *p_lcb;
- if ((p_lcb = l2cu_find_lcb_by_bd_addr (bd_addr)) != NULL)
+ if ((p_lcb = l2cu_find_lcb_by_bd_addr (bd_addr, BT_TRANSPORT_LE)) != NULL)
role = p_lcb->link_role;
return role;
@@ -298,21 +235,45 @@
** Returns disconnect reason
**
*******************************************************************************/
-UINT16 L2CA_GetDisconnectReason (BD_ADDR remote_bda)
+UINT16 L2CA_GetDisconnectReason (BD_ADDR remote_bda, tBT_TRANSPORT transport)
{
tL2C_LCB *p_lcb;
UINT16 reason = 0;
- if ((p_lcb = l2cu_find_lcb_by_bd_addr (remote_bda)) != NULL)
+ if ((p_lcb = l2cu_find_lcb_by_bd_addr (remote_bda, transport)) != NULL)
reason = p_lcb->disc_reason;
- L2CAP_TRACE_DEBUG1 ("L2CA_GetDisconnectReason=%d ",reason);
+ L2CAP_TRACE_DEBUG ("L2CA_GetDisconnectReason=%d ",reason);
return reason;
}
/*******************************************************************************
**
+** Function l2cble_notify_le_connection
+**
+** Description This function notifiy the l2cap connection to the app layer
+**
+** Returns none
+**
+*******************************************************************************/
+void l2cble_notify_le_connection (BD_ADDR bda)
+{
+ tL2C_LCB *p_lcb = l2cu_find_lcb_by_bd_addr (bda, BT_TRANSPORT_LE);
+ tACL_CONN *p_acl = btm_bda_to_acl(bda, BT_TRANSPORT_LE) ;
+
+ if (p_lcb != NULL && p_acl != NULL && p_lcb->link_state != LST_CONNECTED)
+ {
+ /* update link status */
+ btm_establish_continue(p_acl);
+ /* update l2cap link status and send callback */
+ p_lcb->link_state = LST_CONNECTED;
+ l2cu_process_fixed_chnl_resp (p_lcb);
+ }
+}
+
+/*******************************************************************************
+**
** Function l2cble_scanner_conn_comp
**
** Description This function is called when an HCI Connection Complete
@@ -327,22 +288,22 @@
tL2C_LCB *p_lcb;
tBTM_SEC_DEV_REC *p_dev_rec = btm_find_or_alloc_dev (bda);
- L2CAP_TRACE_DEBUG5 ("l2cble_scanner_conn_comp: HANDLE=%d addr_type=%d conn_interval=%d slave_latency=%d supervision_tout=%d",
+ L2CAP_TRACE_DEBUG ("l2cble_scanner_conn_comp: HANDLE=%d addr_type=%d conn_interval=%d slave_latency=%d supervision_tout=%d",
handle, type, conn_interval, conn_latency, conn_timeout);
l2cb.is_ble_connecting = FALSE;
/* See if we have a link control block for the remote device */
- p_lcb = l2cu_find_lcb_by_bd_addr (bda);
+ p_lcb = l2cu_find_lcb_by_bd_addr (bda, BT_TRANSPORT_LE);
/* If we don't have one, create one. this is auto connection complete. */
if (!p_lcb)
{
- p_lcb = l2cu_allocate_lcb (bda, FALSE);
+ p_lcb = l2cu_allocate_lcb (bda, FALSE, BT_TRANSPORT_LE);
if (!p_lcb)
{
btm_sec_disconnect (handle, HCI_ERR_NO_CONNECTION);
- L2CAP_TRACE_ERROR0 ("l2cble_scanner_conn_comp - failed to allocate LCB");
+ L2CAP_TRACE_ERROR ("l2cble_scanner_conn_comp - failed to allocate LCB");
return;
}
else
@@ -350,14 +311,14 @@
if (!l2cu_initialize_fixed_ccb (p_lcb, L2CAP_ATT_CID, &l2cb.fixed_reg[L2CAP_ATT_CID - L2CAP_FIRST_FIXED_CHNL].fixed_chnl_opts))
{
btm_sec_disconnect (handle, HCI_ERR_NO_CONNECTION);
- L2CAP_TRACE_WARNING0 ("l2cble_scanner_conn_comp - LCB but no CCB");
+ L2CAP_TRACE_WARNING ("l2cble_scanner_conn_comp - LCB but no CCB");
return ;
}
}
}
else if (p_lcb->link_state != LST_CONNECTING)
{
- L2CAP_TRACE_ERROR1 ("L2CAP got BLE scanner conn_comp in bad state: %d", p_lcb->link_state);
+ L2CAP_TRACE_ERROR ("L2CAP got BLE scanner conn_comp in bad state: %d", p_lcb->link_state);
return;
}
btu_stop_timer(&p_lcb->timer_entry);
@@ -366,9 +327,8 @@
p_lcb->handle = handle;
/* Connected OK. Change state to connected, we were scanning so we are master */
- p_lcb->link_state = LST_CONNECTED;
p_lcb->link_role = HCI_ROLE_MASTER;
- p_lcb->is_ble_link = TRUE;
+ p_lcb->transport = BT_TRANSPORT_LE;
/* If there are any preferred connection parameters, set them now */
if ( (p_dev_rec->conn_params.min_conn_int >= BTM_BLE_CONN_INT_MIN ) &&
@@ -384,7 +344,7 @@
(conn_latency > p_dev_rec->conn_params.slave_latency) ||
(conn_timeout > p_dev_rec->conn_params.supervision_tout)))
{
- L2CAP_TRACE_ERROR5 ("upd_ll_conn_params: HANDLE=%d min_conn_int=%d max_conn_int=%d slave_latency=%d supervision_tout=%d",
+ L2CAP_TRACE_ERROR ("upd_ll_conn_params: HANDLE=%d min_conn_int=%d max_conn_int=%d slave_latency=%d supervision_tout=%d",
handle, p_dev_rec->conn_params.min_conn_int, p_dev_rec->conn_params.max_conn_int,
p_dev_rec->conn_params.slave_latency, p_dev_rec->conn_params.supervision_tout);
@@ -394,21 +354,14 @@
p_dev_rec->conn_params.slave_latency,
p_dev_rec->conn_params.supervision_tout,
0, 0);
- p_lcb->upd_status |= L2C_BLE_UPDATE_PENDING;
}
/* Tell BTM Acl management about the link */
- btm_acl_created (bda, NULL, p_dev_rec->sec_bd_name, handle, p_lcb->link_role, TRUE);
-
- if (p_lcb->p_echo_rsp_cb)
- {
- L2CAP_TRACE_ERROR0 ("l2cu_send_peer_echo_req");
- l2cu_send_peer_echo_req (p_lcb, NULL, 0);
- }
+ btm_acl_created (bda, NULL, p_dev_rec->sec_bd_name, handle, p_lcb->link_role, BT_TRANSPORT_LE);
p_lcb->peer_chnl_mask[0] = L2CAP_FIXED_CHNL_ATT_BIT | L2CAP_FIXED_CHNL_BLE_SIG_BIT | L2CAP_FIXED_CHNL_SMP_BIT;
- l2cu_process_fixed_chnl_resp (p_lcb);
+ btm_ble_set_conn_st(BLE_CONN_IDLE);
}
@@ -433,16 +386,16 @@
UNUSED(conn_timeout);
/* See if we have a link control block for the remote device */
- p_lcb = l2cu_find_lcb_by_bd_addr (bda);
+ p_lcb = l2cu_find_lcb_by_bd_addr (bda, BT_TRANSPORT_LE);
/* If we don't have one, create one and accept the connection. */
if (!p_lcb)
{
- p_lcb = l2cu_allocate_lcb (bda, FALSE);
+ p_lcb = l2cu_allocate_lcb (bda, FALSE, BT_TRANSPORT_LE);
if (!p_lcb)
{
btm_sec_disconnect (handle, HCI_ERR_NO_CONNECTION);
- L2CAP_TRACE_ERROR0 ("l2cble_advertiser_conn_comp - failed to allocate LCB");
+ L2CAP_TRACE_ERROR ("l2cble_advertiser_conn_comp - failed to allocate LCB");
return;
}
else
@@ -450,7 +403,7 @@
if (!l2cu_initialize_fixed_ccb (p_lcb, L2CAP_ATT_CID, &l2cb.fixed_reg[L2CAP_ATT_CID - L2CAP_FIRST_FIXED_CHNL].fixed_chnl_opts))
{
btm_sec_disconnect (handle, HCI_ERR_NO_CONNECTION);
- L2CAP_TRACE_WARNING0 ("l2cble_scanner_conn_comp - LCB but no CCB");
+ L2CAP_TRACE_WARNING ("l2cble_scanner_conn_comp - LCB but no CCB");
return ;
}
}
@@ -460,18 +413,27 @@
p_lcb->handle = handle;
/* Connected OK. Change state to connected, we were advertising, so we are slave */
- p_lcb->link_state = LST_CONNECTED;
p_lcb->link_role = HCI_ROLE_SLAVE;
- p_lcb->is_ble_link = TRUE;
+ p_lcb->transport = BT_TRANSPORT_LE;
/* Tell BTM Acl management about the link */
p_dev_rec = btm_find_or_alloc_dev (bda);
- btm_acl_created (bda, NULL, p_dev_rec->sec_bd_name, handle, p_lcb->link_role, TRUE);
+ btm_acl_created (bda, NULL, p_dev_rec->sec_bd_name, handle, p_lcb->link_role, BT_TRANSPORT_LE);
p_lcb->peer_chnl_mask[0] = L2CAP_FIXED_CHNL_ATT_BIT | L2CAP_FIXED_CHNL_BLE_SIG_BIT | L2CAP_FIXED_CHNL_SMP_BIT;
- l2cu_process_fixed_chnl_resp (p_lcb);
+ if (!HCI_LE_SLAVE_INIT_FEAT_EXC_SUPPORTED(btm_cb.devcb.local_le_features))
+ {
+ p_lcb->link_state = LST_CONNECTED;
+ l2cu_process_fixed_chnl_resp (p_lcb);
+ }
+
+ /* when adv and initiating are both active, cancel the direct connection */
+ if (l2cb.is_ble_connecting && memcmp(bda, l2cb.ble_connecting_bda, BD_ADDR_LEN) == 0)
+ {
+ L2CA_CancelBleConnectReq(bda);
+ }
}
/*******************************************************************************
@@ -496,6 +458,93 @@
l2cble_advertiser_conn_comp(handle, bda, type, conn_interval, conn_latency, conn_timeout);
}
}
+
+/*******************************************************************************
+**
+** Function l2cble_start_conn_update
+**
+** Description start BLE connection parameter update process based on status
+**
+** Parameters: lcb : l2cap link control block
+**
+** Return value: none
+**
+*******************************************************************************/
+static void l2cble_start_conn_update (tL2C_LCB *p_lcb)
+{
+ tBTM_SEC_DEV_REC *p_dev_rec = btm_find_or_alloc_dev(p_lcb->remote_bd_addr);
+
+ if (p_lcb->conn_update_mask & L2C_BLE_UPDATE_PENDING) return;
+
+ if (p_lcb->conn_update_mask & L2C_BLE_CONN_UPDATE_DISABLE)
+ {
+ /* application requests to disable parameters update.
+ If parameters are already updated, lets set them
+ up to what has been requested during connection establishement */
+ if (p_lcb->conn_update_mask & L2C_BLE_NOT_DEFAULT_PARAM)
+ {
+ btsnd_hcic_ble_upd_ll_conn_params(p_lcb->handle,
+ (UINT16)((p_dev_rec->conn_params.min_conn_int != BTM_BLE_CONN_PARAM_UNDEF) ?
+ p_dev_rec->conn_params.min_conn_int : BTM_BLE_CONN_INT_MIN_DEF),
+ (UINT16)((p_dev_rec->conn_params.max_conn_int != BTM_BLE_CONN_PARAM_UNDEF) ?
+ p_dev_rec->conn_params.max_conn_int : BTM_BLE_CONN_INT_MAX_DEF),
+ (UINT16)((p_dev_rec->conn_params.slave_latency != BTM_BLE_CONN_PARAM_UNDEF) ?
+ p_dev_rec->conn_params.slave_latency : BTM_BLE_CONN_SLAVE_LATENCY_DEF),
+ (UINT16)((p_dev_rec->conn_params.supervision_tout != BTM_BLE_CONN_PARAM_UNDEF) ?
+ p_dev_rec->conn_params.supervision_tout : BTM_BLE_CONN_TIMEOUT_DEF),
+ 0, 0);
+ p_lcb->conn_update_mask &= ~L2C_BLE_NOT_DEFAULT_PARAM;
+ p_lcb->conn_update_mask |= (L2C_BLE_UPDATE_PENDING | L2C_BLE_NEW_CONN_PARAM);
+ }
+ }
+ else
+ {
+ /* application allows to do update, if we were delaying one do it now */
+ if (p_lcb->conn_update_mask & L2C_BLE_NEW_CONN_PARAM)
+ {
+ btsnd_hcic_ble_upd_ll_conn_params(p_lcb->handle, p_lcb->min_interval,
+ p_lcb->max_interval, p_lcb->latency, p_lcb->timeout, 0, 0);
+ p_lcb->conn_update_mask &= ~L2C_BLE_NEW_CONN_PARAM;
+ p_lcb->conn_update_mask |= (L2C_BLE_UPDATE_PENDING | L2C_BLE_NOT_DEFAULT_PARAM);
+ }
+ }
+}
+
+/*******************************************************************************
+**
+** Function l2cble_process_conn_update_evt
+**
+** Description This function enables the connection update request from remote
+** after a successful connection update response is received.
+**
+** Returns void
+**
+*******************************************************************************/
+void l2cble_process_conn_update_evt (UINT16 handle, UINT8 status)
+{
+ tL2C_LCB *p_lcb;
+
+ L2CAP_TRACE_DEBUG("l2cble_process_conn_update_evt");
+
+ /* See if we have a link control block for the remote device */
+ p_lcb = l2cu_find_lcb_by_handle(handle);
+ if (!p_lcb)
+ {
+ L2CAP_TRACE_WARNING("l2cble_process_conn_update_evt: Invalid handle: %d", handle);
+ return;
+ }
+
+ p_lcb->conn_update_mask &= ~L2C_BLE_UPDATE_PENDING;
+
+ if (status != HCI_SUCCESS)
+ {
+ L2CAP_TRACE_WARNING("l2cble_process_conn_update_evt: Error status: %d", status);
+ }
+
+ l2cble_start_conn_update(p_lcb);
+
+ L2CAP_TRACE_DEBUG("l2cble_process_conn_update_evt: conn_update_mask=%d", p_lcb->conn_update_mask);
+}
/*******************************************************************************
**
** Function l2cble_process_sig_cmd
@@ -523,7 +572,7 @@
/* Check command length does not exceed packet length */
if ((p + cmd_len) > p_pkt_end)
{
- L2CAP_TRACE_WARNING3 ("L2CAP - LE - format error, pkt_len: %d cmd_len: %d code: %d", pkt_len, cmd_len, cmd_code);
+ L2CAP_TRACE_WARNING ("L2CAP - LE - format error, pkt_len: %d cmd_len: %d code: %d", pkt_len, cmd_len, cmd_code);
return;
}
@@ -561,12 +610,13 @@
l2cu_send_peer_ble_par_rsp (p_lcb, L2CAP_CFG_OK, id);
- p_lcb->min_interval = min_interval;
- p_lcb->max_interval = max_interval;
- p_lcb->latency = latency;
- p_lcb->timeout = timeout;
- p_lcb->upd_status |= L2C_BLE_NEW_CONN_PARAM;
- L2CA_InternalBleConnUpdate(p_lcb);
+ p_lcb->min_interval = min_interval;
+ p_lcb->max_interval = max_interval;
+ p_lcb->latency = latency;
+ p_lcb->timeout = timeout;
+ p_lcb->conn_update_mask |= L2C_BLE_NEW_CONN_PARAM;
+
+ l2cble_start_conn_update(p_lcb);
}
}
else
@@ -578,13 +628,12 @@
break;
default:
- L2CAP_TRACE_WARNING1 ("L2CAP - LE - unknown cmd code: %d", cmd_code);
+ L2CAP_TRACE_WARNING ("L2CAP - LE - unknown cmd code: %d", cmd_code);
l2cu_send_peer_cmd_reject (p_lcb, L2CAP_CMD_REJ_NOT_UNDERSTOOD, id, 0, 0);
return;
}
}
-
/*******************************************************************************
**
** Function l2cble_init_direct_conn
@@ -606,7 +655,7 @@
/* There can be only one BLE connection request outstanding at a time */
if (p_dev_rec == NULL)
{
- BTM_TRACE_WARNING0 ("unknown device, can not initate connection");
+ L2CAP_TRACE_WARNING ("unknown device, can not initate connection");
return(FALSE);
}
@@ -616,14 +665,28 @@
init_addr_type = p_lcb->ble_addr_type;
memcpy(init_addr, p_lcb->remote_bd_addr, BD_ADDR_LEN);
-#if BTM_BLE_PRIVACY_SPT == TRUE
- if (p_dev_rec->ble.active_addr_type == BTM_BLE_ADDR_RRA)
+#if BLE_PRIVACY_SPT == TRUE
+ /* if RPA offloading supported */
+ if (btm_ble_vendor_irk_list_load_dev(p_dev_rec))
+ btm_random_pseudo_to_public(init_addr, &init_addr_type);
+ /* otherwise, if remote is RPA enabled, use latest RPA */
+ else if (p_dev_rec->ble.active_addr_type == BTM_BLE_ADDR_RRA)
{
init_addr_type = BLE_ADDR_RANDOM;
memcpy(init_addr, p_dev_rec->ble.cur_rand_addr, BD_ADDR_LEN);
}
+ /* if privacy is on and current do not consider using reconnection address */
+ if (btm_cb.ble_ctr_cb.privacy ) /* && p_dev_rec->ble.use_reconn_addr */
+ own_addr_type = BLE_ADDR_RANDOM;
#endif
+ if (!btm_ble_topology_check(BTM_BLE_STATE_INIT))
+ {
+ l2cu_release_lcb (p_lcb);
+ L2CAP_TRACE_ERROR("initate direct connection fail, topology limitation");
+ return FALSE;
+ }
+
if (!btsnd_hcic_ble_create_ll_conn (scan_int,/* UINT16 scan_int */
scan_win, /* UINT16 scan_win */
FALSE, /* UINT8 white_list */
@@ -635,14 +698,14 @@
(UINT16) ((p_dev_rec->conn_params.max_conn_int != BTM_BLE_CONN_PARAM_UNDEF) ?
p_dev_rec->conn_params.max_conn_int : BTM_BLE_CONN_INT_MAX_DEF), /* conn_int_max */
(UINT16) ((p_dev_rec->conn_params.slave_latency != BTM_BLE_CONN_PARAM_UNDEF) ?
- p_dev_rec->conn_params.slave_latency : 0), /* UINT16 conn_latency */
+ p_dev_rec->conn_params.slave_latency : BTM_BLE_CONN_SLAVE_LATENCY_DEF), /* UINT16 conn_latency */
(UINT16) ((p_dev_rec->conn_params.supervision_tout != BTM_BLE_CONN_PARAM_UNDEF) ?
- p_dev_rec->conn_params.supervision_tout : BTM_BLE_CONN_SUP_TOUT_DEF), /* conn_timeout */
+ p_dev_rec->conn_params.supervision_tout : BTM_BLE_CONN_TIMEOUT_DEF), /* conn_timeout */
0, /* UINT16 min_len */
0)) /* UINT16 max_len */
{
l2cu_release_lcb (p_lcb);
- L2CAP_TRACE_ERROR0("initate direct connection fail, no resources");
+ L2CAP_TRACE_ERROR("initate direct connection fail, no resources");
return (FALSE);
}
else
@@ -678,7 +741,7 @@
}
else
{
- L2CAP_TRACE_WARNING1 ("L2CAP - LE - cannot start new connection at conn st: %d", conn_st);
+ L2CAP_TRACE_WARNING ("L2CAP - LE - cannot start new connection at conn st: %d", conn_st);
btm_ble_enqueue_direct_conn_req(p_lcb);
@@ -712,4 +775,170 @@
l2cb.num_lm_ble_bufs = l2cb.controller_le_xmit_window = num_lm_ble_bufs;
}
+/*******************************************************************************
+**
+** Function l2c_ble_link_adjust_allocation
+**
+** Description This function is called when a link is created or removed
+** to calculate the amount of packets each link may send to
+** the HCI without an ack coming back.
+**
+** Currently, this is a simple allocation, dividing the
+** number of Controller Packets by the number of links. In
+** the future, QOS configuration should be examined.
+**
+** Returns void
+**
+*******************************************************************************/
+void l2c_ble_link_adjust_allocation (void)
+{
+ UINT16 qq, yy, qq_remainder;
+ tL2C_LCB *p_lcb;
+ UINT16 hi_quota, low_quota;
+ UINT16 num_lowpri_links = 0;
+ UINT16 num_hipri_links = 0;
+ UINT16 controller_xmit_quota = l2cb.num_lm_ble_bufs;
+ UINT16 high_pri_link_quota = L2CAP_HIGH_PRI_MIN_XMIT_QUOTA_A;
+
+ /* If no links active, reset buffer quotas and controller buffers */
+ if (l2cb.num_ble_links_active == 0)
+ {
+ l2cb.controller_le_xmit_window = l2cb.num_lm_ble_bufs;
+ l2cb.ble_round_robin_quota = l2cb.ble_round_robin_unacked = 0;
+ return;
+ }
+
+ /* First, count the links */
+ for (yy = 0, p_lcb = &l2cb.lcb_pool[0]; yy < MAX_L2CAP_LINKS; yy++, p_lcb++)
+ {
+ if (p_lcb->in_use && p_lcb->transport == BT_TRANSPORT_LE)
+ {
+ if (p_lcb->acl_priority == L2CAP_PRIORITY_HIGH)
+ num_hipri_links++;
+ else
+ num_lowpri_links++;
+ }
+ }
+
+ /* now adjust high priority link quota */
+ low_quota = num_lowpri_links ? 1 : 0;
+ while ( (num_hipri_links * high_pri_link_quota + low_quota) > controller_xmit_quota )
+ high_pri_link_quota--;
+
+
+ /* Work out the xmit quota and buffer quota high and low priorities */
+ hi_quota = num_hipri_links * high_pri_link_quota;
+ low_quota = (hi_quota < controller_xmit_quota) ? controller_xmit_quota - hi_quota : 1;
+
+ /* Work out and save the HCI xmit quota for each low priority link */
+
+ /* If each low priority link cannot have at least one buffer */
+ if (num_lowpri_links > low_quota)
+ {
+ l2cb.ble_round_robin_quota = low_quota;
+ qq = qq_remainder = 1;
+ }
+ /* If each low priority link can have at least one buffer */
+ else if (num_lowpri_links > 0)
+ {
+ l2cb.ble_round_robin_quota = 0;
+ l2cb.ble_round_robin_unacked = 0;
+ qq = low_quota / num_lowpri_links;
+ qq_remainder = low_quota % num_lowpri_links;
+ }
+ /* If no low priority link */
+ else
+ {
+ l2cb.ble_round_robin_quota = 0;
+ l2cb.ble_round_robin_unacked = 0;
+ qq = qq_remainder = 1;
+ }
+ L2CAP_TRACE_EVENT ("l2c_ble_link_adjust_allocation num_hipri: %u num_lowpri: %u low_quota: %u round_robin_quota: %u qq: %u",
+ num_hipri_links, num_lowpri_links, low_quota,
+ l2cb.ble_round_robin_quota, qq);
+
+ /* Now, assign the quotas to each link */
+ for (yy = 0, p_lcb = &l2cb.lcb_pool[0]; yy < MAX_L2CAP_LINKS; yy++, p_lcb++)
+ {
+ if (p_lcb->in_use && p_lcb->transport == BT_TRANSPORT_LE)
+ {
+ if (p_lcb->acl_priority == L2CAP_PRIORITY_HIGH)
+ {
+ p_lcb->link_xmit_quota = high_pri_link_quota;
+ }
+ else
+ {
+ /* Safety check in case we switched to round-robin with something outstanding */
+ /* if sent_not_acked is added into round_robin_unacked then don't add it again */
+ /* l2cap keeps updating sent_not_acked for exiting from round robin */
+ if (( p_lcb->link_xmit_quota > 0 )&&( qq == 0 ))
+ l2cb.ble_round_robin_unacked += p_lcb->sent_not_acked;
+
+ p_lcb->link_xmit_quota = qq;
+ if (qq_remainder > 0)
+ {
+ p_lcb->link_xmit_quota++;
+ qq_remainder--;
+ }
+ }
+
+ L2CAP_TRACE_EVENT("l2c_ble_link_adjust_allocation LCB %d Priority: %d XmitQuota: %d",
+ yy, p_lcb->acl_priority, p_lcb->link_xmit_quota);
+
+ L2CAP_TRACE_EVENT(" SentNotAcked: %d RRUnacked: %d",
+ p_lcb->sent_not_acked, l2cb.round_robin_unacked);
+
+ /* There is a special case where we have readjusted the link quotas and */
+ /* this link may have sent anything but some other link sent packets so */
+ /* so we may need a timer to kick off this link's transmissions. */
+ if ( (p_lcb->link_state == LST_CONNECTED)
+ && (p_lcb->link_xmit_data_q.count)
+ && (p_lcb->sent_not_acked < p_lcb->link_xmit_quota) )
+ btu_start_timer (&p_lcb->timer_entry, BTU_TTYPE_L2CAP_LINK, L2CAP_LINK_FLOW_CONTROL_TOUT);
+ }
+ }
+}
+
+#if (defined BLE_LLT_INCLUDED) && (BLE_LLT_INCLUDED == TRUE)
+/*******************************************************************************
+**
+** Function l2cble_process_rc_param_request_evt
+**
+** Description process LE Remote Connection Parameter Request Event.
+**
+** Returns void
+**
+*******************************************************************************/
+void l2cble_process_rc_param_request_evt(UINT16 handle, UINT16 int_min, UINT16 int_max,
+ UINT16 latency, UINT16 timeout)
+{
+ tL2C_LCB *p_lcb = l2cu_find_lcb_by_handle (handle);
+
+ if (p_lcb != NULL)
+ {
+ p_lcb->min_interval = int_min;
+ p_lcb->max_interval = int_max;
+ p_lcb->latency = latency;
+ p_lcb->timeout = timeout;
+
+ /* if update is enabled, always accept connection parameter update */
+ if ((p_lcb->conn_update_mask & L2C_BLE_CONN_UPDATE_DISABLE) == 0)
+ {
+ btsnd_hcic_ble_rc_param_req_reply(handle, int_min, int_max, latency, timeout, 0, 0);
+ }
+ else
+ {
+ L2CAP_TRACE_EVENT ("L2CAP - LE - update currently disabled");
+ btsnd_hcic_ble_rc_param_req_neg_reply (handle,HCI_ERR_UNACCEPT_CONN_INTERVAL);
+ }
+
+ }
+ else
+ {
+ L2CAP_TRACE_WARNING("No link to update connection parameter")
+ }
+}
+#endif
+
+
#endif /* (BLE_INCLUDED == TRUE) */
diff --git a/stack/l2cap/l2c_csm.c b/stack/l2cap/l2c_csm.c
index 4e24c23..fa261b2 100644
--- a/stack/l2cap/l2c_csm.c
+++ b/stack/l2cap/l2c_csm.c
@@ -128,9 +128,9 @@
if (p_ccb->p_rcb == NULL)
{
#if (BT_TRACE_VERBOSE == TRUE)
- L2CAP_TRACE_ERROR2 ("L2CAP - LCID: 0x%04x st: CLOSED evt: %s p_rcb == NULL", p_ccb->local_cid, l2c_csm_get_event_name (event));
+ L2CAP_TRACE_ERROR ("L2CAP - LCID: 0x%04x st: CLOSED evt: %s p_rcb == NULL", p_ccb->local_cid, l2c_csm_get_event_name (event));
#else
- L2CAP_TRACE_ERROR2 ("L2CAP - LCID: 0x%04x st: CLOSED evt: 0x%04x p_rcb == NULL", p_ccb->local_cid, event);
+ L2CAP_TRACE_ERROR ("L2CAP - LCID: 0x%04x st: CLOSED evt: 0x%04x p_rcb == NULL", p_ccb->local_cid, event);
#endif
return;
}
@@ -151,15 +151,15 @@
connect_cfm = p_ccb->p_rcb->api.pL2CA_ConnectCfm_Cb;
#if (BT_TRACE_VERBOSE == TRUE)
- L2CAP_TRACE_EVENT2 ("L2CAP - LCID: 0x%04x st: CLOSED evt: %s", p_ccb->local_cid, l2c_csm_get_event_name (event));
+ L2CAP_TRACE_EVENT ("L2CAP - LCID: 0x%04x st: CLOSED evt: %s", p_ccb->local_cid, l2c_csm_get_event_name (event));
#else
- L2CAP_TRACE_EVENT1 ("L2CAP - st: CLOSED evt: %d", event);
+ L2CAP_TRACE_EVENT ("L2CAP - st: CLOSED evt: %d", event);
#endif
switch (event)
{
case L2CEVT_LP_DISCONNECT_IND: /* Link was disconnected */
- L2CAP_TRACE_API1 ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x No Conf Needed", p_ccb->local_cid);
+ L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x No Conf Needed", p_ccb->local_cid);
l2cu_release_ccb (p_ccb);
(*disconnect_ind)(local_cid, FALSE);
break;
@@ -175,7 +175,7 @@
if (p_ci->status != HCI_ERR_CONNECTION_EXISTS
|| !btm_acl_notif_conn_collision(p_ccb->p_lcb->remote_bd_addr))
{
- L2CAP_TRACE_API2 ("L2CAP - Calling ConnectCfm_Cb(), CID: 0x%04x Status: %d", p_ccb->local_cid, p_ci->status);
+ L2CAP_TRACE_API ("L2CAP - Calling ConnectCfm_Cb(), CID: 0x%04x Status: %d", p_ccb->local_cid, p_ci->status);
l2cu_release_ccb (p_ccb);
(*connect_cfm)(local_cid, p_ci->status);
}
@@ -230,7 +230,7 @@
break;
case L2CEVT_SEC_COMP_NEG: /* something is really bad with security */
- L2CAP_TRACE_API2 ("L2CAP - Calling ConnectCfm_Cb(), CID: 0x%04x Status: %d", p_ccb->local_cid, L2CAP_CONN_TIMEOUT);
+ L2CAP_TRACE_API ("L2CAP - Calling ConnectCfm_Cb(), CID: 0x%04x Status: %d", p_ccb->local_cid, L2CAP_CONN_TIMEOUT);
l2cu_release_ccb (p_ccb);
(*connect_cfm)(local_cid, L2CAP_CONN_SECURITY_BLOCK);
break;
@@ -270,7 +270,7 @@
break;
case L2CEVT_TIMEOUT:
- L2CAP_TRACE_API2 ("L2CAP - Calling ConnectCfm_Cb(), CID: 0x%04x Status: %d", p_ccb->local_cid, L2CAP_CONN_TIMEOUT);
+ L2CAP_TRACE_API ("L2CAP - Calling ConnectCfm_Cb(), CID: 0x%04x Status: %d", p_ccb->local_cid, L2CAP_CONN_TIMEOUT);
l2cu_release_ccb (p_ccb);
(*connect_cfm)(local_cid, L2CAP_CONN_TIMEOUT);
break;
@@ -304,9 +304,9 @@
UINT16 local_cid = p_ccb->local_cid;
#if (BT_TRACE_VERBOSE == TRUE)
- L2CAP_TRACE_EVENT2 ("L2CAP - LCID: 0x%04x st: ORIG_W4_SEC_COMP evt: %s", p_ccb->local_cid, l2c_csm_get_event_name (event));
+ L2CAP_TRACE_EVENT ("L2CAP - LCID: 0x%04x st: ORIG_W4_SEC_COMP evt: %s", p_ccb->local_cid, l2c_csm_get_event_name (event));
#else
- L2CAP_TRACE_EVENT1 ("L2CAP - st: ORIG_W4_SEC_COMP evt: %d", event);
+ L2CAP_TRACE_EVENT ("L2CAP - st: ORIG_W4_SEC_COMP evt: %d", event);
#endif
#if (L2CAP_UCD_INCLUDED == TRUE)
@@ -324,7 +324,7 @@
switch (event)
{
case L2CEVT_LP_DISCONNECT_IND: /* Link was disconnected */
- L2CAP_TRACE_API1 ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x No Conf Needed", p_ccb->local_cid);
+ L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x No Conf Needed", p_ccb->local_cid);
l2cu_release_ccb (p_ccb);
(*disconnect_ind)(local_cid, FALSE);
break;
@@ -355,7 +355,7 @@
break;
case L2CEVT_SEC_COMP_NEG:
- L2CAP_TRACE_API2 ("L2CAP - Calling ConnectCfm_Cb(), CID: 0x%04x Status: %d", p_ccb->local_cid, HCI_ERR_AUTH_FAILURE);
+ L2CAP_TRACE_API ("L2CAP - Calling ConnectCfm_Cb(), CID: 0x%04x Status: %d", p_ccb->local_cid, HCI_ERR_AUTH_FAILURE);
/* If last channel immediately disconnect the ACL for better security.
Also prevents a race condition between BTM and L2CAP */
@@ -396,9 +396,9 @@
static void l2c_csm_term_w4_sec_comp (tL2C_CCB *p_ccb, UINT16 event, void *p_data)
{
#if (BT_TRACE_VERBOSE == TRUE)
- L2CAP_TRACE_EVENT2 ("L2CAP - LCID: 0x%04x st: TERM_W4_SEC_COMP evt: %s", p_ccb->local_cid, l2c_csm_get_event_name (event));
+ L2CAP_TRACE_EVENT ("L2CAP - LCID: 0x%04x st: TERM_W4_SEC_COMP evt: %s", p_ccb->local_cid, l2c_csm_get_event_name (event));
#else
- L2CAP_TRACE_EVENT1 ("L2CAP - st: TERM_W4_SEC_COMP evt: %d", event);
+ L2CAP_TRACE_EVENT ("L2CAP - st: TERM_W4_SEC_COMP evt: %d", event);
#endif
#if (L2CAP_UCD_INCLUDED == TRUE)
@@ -430,7 +430,7 @@
{
/* Don't need to get info from peer or already retrieved so continue */
btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_CONNECT_TOUT);
- L2CAP_TRACE_API1 ("L2CAP - Calling Connect_Ind_Cb(), CID: 0x%04x", p_ccb->local_cid);
+ L2CAP_TRACE_API ("L2CAP - Calling Connect_Ind_Cb(), CID: 0x%04x", p_ccb->local_cid);
(*p_ccb->p_rcb->api.pL2CA_ConnectInd_Cb) (p_ccb->p_lcb->remote_bd_addr, p_ccb->local_cid,
p_ccb->p_rcb->psm, p_ccb->remote_id);
@@ -486,7 +486,7 @@
/* SM4 related. */
if (!btsnd_hcic_disconnect (p_ccb->p_lcb->handle, HCI_ERR_AUTH_FAILURE))
{
- L2CAP_TRACE_API1 ("L2CAP - Calling btsnd_hcic_disconnect for handle %i failed", p_ccb->p_lcb->handle);
+ L2CAP_TRACE_API ("L2CAP - Calling btsnd_hcic_disconnect for handle %i failed", p_ccb->p_lcb->handle);
btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, 1);
}
break;
@@ -517,9 +517,9 @@
UINT16 local_cid = p_ccb->local_cid;
#if (BT_TRACE_VERBOSE == TRUE)
- L2CAP_TRACE_EVENT2 ("L2CAP - LCID: 0x%04x st: W4_L2CAP_CON_RSP evt: %s", p_ccb->local_cid, l2c_csm_get_event_name (event));
+ L2CAP_TRACE_EVENT ("L2CAP - LCID: 0x%04x st: W4_L2CAP_CON_RSP evt: %s", p_ccb->local_cid, l2c_csm_get_event_name (event));
#else
- L2CAP_TRACE_EVENT1 ("L2CAP - st: W4_L2CAP_CON_RSP evt: %d", event);
+ L2CAP_TRACE_EVENT ("L2CAP - st: W4_L2CAP_CON_RSP evt: %d", event);
#endif
switch (event)
@@ -530,7 +530,7 @@
p_ccb->chnl_state = CST_CLOSED;
if ((p_ccb->flags & CCB_FLAG_NO_RETRY) || !p_data || (*((UINT8 *)p_data) != HCI_ERR_PEER_USER))
{
- L2CAP_TRACE_API1 ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x No Conf Needed",
+ L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x No Conf Needed",
p_ccb->local_cid);
l2cu_release_ccb (p_ccb);
(*disconnect_ind)(local_cid, FALSE);
@@ -542,7 +542,7 @@
p_ccb->remote_cid = p_ci->remote_cid;
p_ccb->chnl_state = CST_CONFIG;
btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_CFG_TIMEOUT);
- L2CAP_TRACE_API1 ("L2CAP - Calling Connect_Cfm_Cb(), CID: 0x%04x, Success", p_ccb->local_cid);
+ L2CAP_TRACE_API ("L2CAP - Calling Connect_Cfm_Cb(), CID: 0x%04x, Success", p_ccb->local_cid);
(*p_ccb->p_rcb->api.pL2CA_ConnectCfm_Cb)(local_cid, L2CAP_CONN_OK);
break;
@@ -552,19 +552,19 @@
btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_CONNECT_TOUT_EXT);
if (p_ccb->p_rcb->api.pL2CA_ConnectPnd_Cb)
{
- L2CAP_TRACE_API1 ("L2CAP - Calling Connect_Pnd_Cb(), CID: 0x%04x", p_ccb->local_cid);
+ L2CAP_TRACE_API ("L2CAP - Calling Connect_Pnd_Cb(), CID: 0x%04x", p_ccb->local_cid);
(*p_ccb->p_rcb->api.pL2CA_ConnectPnd_Cb)(p_ccb->local_cid);
}
break;
case L2CEVT_L2CAP_CONNECT_RSP_NEG: /* Peer rejected connection */
- L2CAP_TRACE_API2 ("L2CAP - Calling Connect_Cfm_Cb(), CID: 0x%04x, Failure Code: %d", p_ccb->local_cid, p_ci->l2cap_result);
+ L2CAP_TRACE_API ("L2CAP - Calling Connect_Cfm_Cb(), CID: 0x%04x, Failure Code: %d", p_ccb->local_cid, p_ci->l2cap_result);
l2cu_release_ccb (p_ccb);
(*connect_cfm)(local_cid, p_ci->l2cap_result);
break;
case L2CEVT_TIMEOUT:
- L2CAP_TRACE_API1 ("L2CAP - Calling Connect_Cfm_Cb(), CID: 0x%04x, Timeout", p_ccb->local_cid);
+ L2CAP_TRACE_API ("L2CAP - Calling Connect_Cfm_Cb(), CID: 0x%04x, Timeout", p_ccb->local_cid);
l2cu_release_ccb (p_ccb);
(*connect_cfm)(local_cid, L2CAP_CONN_TIMEOUT);
break;
@@ -621,15 +621,15 @@
UINT16 local_cid = p_ccb->local_cid;
#if (BT_TRACE_VERBOSE == TRUE)
- L2CAP_TRACE_EVENT2 ("L2CAP - LCID: 0x%04x st: W4_L2CA_CON_RSP evt: %s", p_ccb->local_cid, l2c_csm_get_event_name (event));
+ L2CAP_TRACE_EVENT ("L2CAP - LCID: 0x%04x st: W4_L2CA_CON_RSP evt: %s", p_ccb->local_cid, l2c_csm_get_event_name (event));
#else
- L2CAP_TRACE_EVENT1 ("L2CAP - st: W4_L2CA_CON_RSP evt: %d", event);
+ L2CAP_TRACE_EVENT ("L2CAP - st: W4_L2CA_CON_RSP evt: %d", event);
#endif
switch (event)
{
case L2CEVT_LP_DISCONNECT_IND: /* Link was disconnected */
- L2CAP_TRACE_API1 ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x No Conf Needed", p_ccb->local_cid);
+ L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x No Conf Needed", p_ccb->local_cid);
l2cu_release_ccb (p_ccb);
(*disconnect_ind)(local_cid, FALSE);
break;
@@ -660,7 +660,7 @@
case L2CEVT_TIMEOUT:
l2cu_send_peer_connect_rsp (p_ccb, L2CAP_CONN_NO_PSM, 0);
- L2CAP_TRACE_API1 ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x No Conf Needed", p_ccb->local_cid);
+ L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x No Conf Needed", p_ccb->local_cid);
l2cu_release_ccb (p_ccb);
(*disconnect_ind)(local_cid, FALSE);
break;
@@ -679,7 +679,7 @@
case L2CEVT_L2CAP_INFO_RSP:
/* We have feature info, so now give the upper layer connect IND */
btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_CONNECT_TOUT);
- L2CAP_TRACE_API1 ("L2CAP - Calling Connect_Ind_Cb(), CID: 0x%04x", p_ccb->local_cid);
+ L2CAP_TRACE_API ("L2CAP - Calling Connect_Ind_Cb(), CID: 0x%04x", p_ccb->local_cid);
(*p_ccb->p_rcb->api.pL2CA_ConnectInd_Cb) (p_ccb->p_lcb->remote_bd_addr,
p_ccb->local_cid,
@@ -708,15 +708,15 @@
UINT8 cfg_result;
#if (BT_TRACE_VERBOSE == TRUE)
- L2CAP_TRACE_EVENT2 ("L2CAP - LCID: 0x%04x st: CONFIG evt: %s", p_ccb->local_cid, l2c_csm_get_event_name (event));
+ L2CAP_TRACE_EVENT ("L2CAP - LCID: 0x%04x st: CONFIG evt: %s", p_ccb->local_cid, l2c_csm_get_event_name (event));
#else
- L2CAP_TRACE_EVENT1 ("L2CAP - st: CONFIG evt: %d", event);
+ L2CAP_TRACE_EVENT ("L2CAP - st: CONFIG evt: %d", event);
#endif
switch (event)
{
case L2CEVT_LP_DISCONNECT_IND: /* Link was disconnected */
- L2CAP_TRACE_API1 ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x No Conf Needed", p_ccb->local_cid);
+ L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x No Conf Needed", p_ccb->local_cid);
l2cu_release_ccb (p_ccb);
(*disconnect_ind)(local_cid, FALSE);
break;
@@ -725,19 +725,19 @@
if ((cfg_result = l2cu_process_peer_cfg_req (p_ccb, p_cfg)) == L2CAP_PEER_CFG_OK)
{
- L2CAP_TRACE_EVENT2 ("L2CAP - Calling Config_Req_Cb(), CID: 0x%04x, C-bit %d",
+ L2CAP_TRACE_EVENT ("L2CAP - Calling Config_Req_Cb(), CID: 0x%04x, C-bit %d",
p_ccb->local_cid, (p_cfg->flags & L2CAP_CFG_FLAGS_MASK_CONT));
(*p_ccb->p_rcb->api.pL2CA_ConfigInd_Cb)(p_ccb->local_cid, p_cfg);
}
else if (cfg_result == L2CAP_PEER_CFG_DISCONNECT)
{
/* Disconnect if channels are incompatible */
- L2CAP_TRACE_EVENT0 ("L2CAP - incompatible configurations disconnect");
+ L2CAP_TRACE_EVENT ("L2CAP - incompatible configurations disconnect");
l2cu_disconnect_chnl (p_ccb);
}
else /* Return error to peer so he can renegotiate if possible */
{
- L2CAP_TRACE_EVENT0 ("L2CAP - incompatible configurations trying reconfig");
+ L2CAP_TRACE_EVENT ("L2CAP - incompatible configurations trying reconfig");
l2cu_send_peer_config_rsp (p_ccb, p_cfg);
}
break;
@@ -760,7 +760,7 @@
if (p_ccb->our_cfg.fcr.mode != p_ccb->peer_cfg.fcr.mode)
{
l2cu_send_peer_disc_req (p_ccb);
- L2CAP_TRACE_WARNING1 ("L2CAP - Calling Disconnect_Ind_Cb(Incompatible CFG), CID: 0x%04x No Conf Needed", p_ccb->local_cid);
+ L2CAP_TRACE_WARNING ("L2CAP - Calling Disconnect_Ind_Cb(Incompatible CFG), CID: 0x%04x No Conf Needed", p_ccb->local_cid);
l2cu_release_ccb (p_ccb);
(*disconnect_ind)(local_cid, FALSE);
break;
@@ -796,7 +796,7 @@
}
}
- L2CAP_TRACE_API1 ("L2CAP - Calling Config_Rsp_Cb(), CID: 0x%04x", p_ccb->local_cid);
+ L2CAP_TRACE_API ("L2CAP - Calling Config_Rsp_Cb(), CID: 0x%04x", p_ccb->local_cid);
(*p_ccb->p_rcb->api.pL2CA_ConfigCfm_Cb)(p_ccb->local_cid, p_cfg);
break;
@@ -807,7 +807,7 @@
/* If failure was channel mode try to renegotiate */
if (l2c_fcr_renegotiate_chan(p_ccb, p_cfg) == FALSE)
{
- L2CAP_TRACE_API2 ("L2CAP - Calling Config_Rsp_Cb(), CID: 0x%04x, Failure: %d", p_ccb->local_cid, p_cfg->result);
+ L2CAP_TRACE_API ("L2CAP - Calling Config_Rsp_Cb(), CID: 0x%04x, Failure: %d", p_ccb->local_cid, p_cfg->result);
(*p_ccb->p_rcb->api.pL2CA_ConfigCfm_Cb)(p_ccb->local_cid, p_cfg);
}
break;
@@ -815,7 +815,7 @@
case L2CEVT_L2CAP_DISCONNECT_REQ: /* Peer disconnected request */
btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_DISCONNECT_TOUT);
p_ccb->chnl_state = CST_W4_L2CA_DISCONNECT_RSP;
- L2CAP_TRACE_API1 ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x Conf Needed", p_ccb->local_cid);
+ L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x Conf Needed", p_ccb->local_cid);
(*p_ccb->p_rcb->api.pL2CA_DisconnectInd_Cb)(p_ccb->local_cid, TRUE);
break;
@@ -849,7 +849,7 @@
if (p_ccb->our_cfg.fcr.mode != p_ccb->peer_cfg.fcr.mode)
{
l2cu_send_peer_disc_req (p_ccb);
- L2CAP_TRACE_WARNING1 ("L2CAP - Calling Disconnect_Ind_Cb(Incompatible CFG), CID: 0x%04x No Conf Needed", p_ccb->local_cid);
+ L2CAP_TRACE_WARNING ("L2CAP - Calling Disconnect_Ind_Cb(Incompatible CFG), CID: 0x%04x No Conf Needed", p_ccb->local_cid);
l2cu_release_ccb (p_ccb);
(*disconnect_ind)(local_cid, FALSE);
break;
@@ -890,7 +890,7 @@
break;
case L2CEVT_L2CAP_DATA: /* Peer data packet rcvd */
- L2CAP_TRACE_API1 ("L2CAP - Calling DataInd_Cb(), CID: 0x%04x", p_ccb->local_cid);
+ L2CAP_TRACE_API ("L2CAP - Calling DataInd_Cb(), CID: 0x%04x", p_ccb->local_cid);
#if (L2CAP_NUM_FIXED_CHNLS > 0)
if (p_ccb->local_cid >= L2CAP_FIRST_FIXED_CHNL &&
p_ccb->local_cid <= L2CAP_LAST_FIXED_CHNL)
@@ -917,7 +917,7 @@
case L2CEVT_TIMEOUT:
l2cu_send_peer_disc_req (p_ccb);
- L2CAP_TRACE_API1 ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x No Conf Needed", p_ccb->local_cid);
+ L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x No Conf Needed", p_ccb->local_cid);
l2cu_release_ccb (p_ccb);
(*disconnect_ind)(local_cid, FALSE);
break;
@@ -944,9 +944,9 @@
UINT8 cfg_result;
#if (BT_TRACE_VERBOSE == TRUE)
- L2CAP_TRACE_EVENT2 ("L2CAP - LCID: 0x%04x st: OPEN evt: %s", p_ccb->local_cid, l2c_csm_get_event_name (event));
+ L2CAP_TRACE_EVENT ("L2CAP - LCID: 0x%04x st: OPEN evt: %s", p_ccb->local_cid, l2c_csm_get_event_name (event));
#else
- L2CAP_TRACE_EVENT1 ("L2CAP - st: OPEN evt: %d", event);
+ L2CAP_TRACE_EVENT ("L2CAP - st: OPEN evt: %d", event);
#endif
#if (L2CAP_UCD_INCLUDED == TRUE)
@@ -964,7 +964,7 @@
switch (event)
{
case L2CEVT_LP_DISCONNECT_IND: /* Link was disconnected */
- L2CAP_TRACE_API1 ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x No Conf Needed", p_ccb->local_cid);
+ L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x No Conf Needed", p_ccb->local_cid);
l2cu_release_ccb (p_ccb);
if (p_ccb->p_rcb)
(*p_ccb->p_rcb->api.pL2CA_DisconnectInd_Cb)(local_cid, FALSE);
@@ -1015,6 +1015,7 @@
#if BTM_PWR_MGR_INCLUDED == TRUE
{
tBTM_PM_PWR_MD settings;
+ memset((void*)&settings, 0, sizeof(settings));
settings.mode = BTM_PM_MD_ACTIVE;
BTM_SetPowerMode (BTM_PM_SET_ONLY_ID, p_ccb->p_lcb->remote_bd_addr, &settings);
}
@@ -1025,7 +1026,7 @@
p_ccb->chnl_state = CST_W4_L2CA_DISCONNECT_RSP;
btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_DISCONNECT_TOUT);
- L2CAP_TRACE_API1 ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x Conf Needed", p_ccb->local_cid);
+ L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x Conf Needed", p_ccb->local_cid);
(*p_ccb->p_rcb->api.pL2CA_DisconnectInd_Cb)(p_ccb->local_cid, TRUE);
break;
@@ -1038,6 +1039,7 @@
#if BTM_PWR_MGR_INCLUDED == TRUE
{
tBTM_PM_PWR_MD settings;
+ memset((void*)&settings, 0, sizeof(settings));
settings.mode = BTM_PM_MD_ACTIVE;
BTM_SetPowerMode (BTM_PM_SET_ONLY_ID, p_ccb->p_lcb->remote_bd_addr, &settings);
}
@@ -1092,9 +1094,9 @@
UINT16 local_cid = p_ccb->local_cid;
#if (BT_TRACE_VERBOSE == TRUE)
- L2CAP_TRACE_EVENT2 ("L2CAP - LCID: 0x%04x st: W4_L2CAP_DISC_RSP evt: %s", p_ccb->local_cid, l2c_csm_get_event_name (event));
+ L2CAP_TRACE_EVENT ("L2CAP - LCID: 0x%04x st: W4_L2CAP_DISC_RSP evt: %s", p_ccb->local_cid, l2c_csm_get_event_name (event));
#else
- L2CAP_TRACE_EVENT1 ("L2CAP - st: W4_L2CAP_DISC_RSP evt: %d", event);
+ L2CAP_TRACE_EVENT ("L2CAP - st: W4_L2CAP_DISC_RSP evt: %d", event);
#endif
switch (event)
@@ -1103,7 +1105,7 @@
l2cu_release_ccb (p_ccb);
if (disconnect_cfm)
{
- L2CAP_TRACE_API1 ("L2CAP - Calling DisconnectCfm_Cb(), CID: 0x%04x", local_cid);
+ L2CAP_TRACE_API ("L2CAP - Calling DisconnectCfm_Cb(), CID: 0x%04x", local_cid);
(*disconnect_cfm)(local_cid, L2CAP_DISC_OK);
}
break;
@@ -1113,7 +1115,7 @@
l2cu_release_ccb (p_ccb);
if (disconnect_cfm)
{
- L2CAP_TRACE_API1 ("L2CAP - Calling DisconnectCfm_Cb(), CID: 0x%04x", local_cid);
+ L2CAP_TRACE_API ("L2CAP - Calling DisconnectCfm_Cb(), CID: 0x%04x", local_cid);
(*disconnect_cfm)(local_cid, L2CAP_DISC_OK);
}
break;
@@ -1123,7 +1125,7 @@
l2cu_release_ccb (p_ccb);
if (disconnect_cfm)
{
- L2CAP_TRACE_API1 ("L2CAP - Calling DisconnectCfm_Cb(), CID: 0x%04x", local_cid);
+ L2CAP_TRACE_API ("L2CAP - Calling DisconnectCfm_Cb(), CID: 0x%04x", local_cid);
(*disconnect_cfm)(local_cid, L2CAP_DISC_TIMEOUT);
}
break;
@@ -1152,22 +1154,22 @@
UINT16 local_cid = p_ccb->local_cid;
#if (BT_TRACE_VERBOSE == TRUE)
- L2CAP_TRACE_EVENT2 ("L2CAP - LCID: 0x%04x st: W4_L2CA_DISC_RSP evt: %s", p_ccb->local_cid, l2c_csm_get_event_name (event));
+ L2CAP_TRACE_EVENT ("L2CAP - LCID: 0x%04x st: W4_L2CA_DISC_RSP evt: %s", p_ccb->local_cid, l2c_csm_get_event_name (event));
#else
- L2CAP_TRACE_EVENT1 ("L2CAP - st: W4_L2CA_DISC_RSP evt: %d", event);
+ L2CAP_TRACE_EVENT ("L2CAP - st: W4_L2CA_DISC_RSP evt: %d", event);
#endif
switch (event)
{
case L2CEVT_LP_DISCONNECT_IND: /* Link was disconnected */
- L2CAP_TRACE_API1 ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x No Conf Needed", p_ccb->local_cid);
+ L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x No Conf Needed", p_ccb->local_cid);
l2cu_release_ccb (p_ccb);
(*disconnect_ind)(local_cid, FALSE);
break;
case L2CEVT_TIMEOUT:
l2cu_send_peer_disc_rsp (p_ccb->p_lcb, p_ccb->remote_id, p_ccb->local_cid, p_ccb->remote_cid);
- L2CAP_TRACE_API1 ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x No Conf Needed", p_ccb->local_cid);
+ L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x No Conf Needed", p_ccb->local_cid);
l2cu_release_ccb (p_ccb);
(*disconnect_ind)(local_cid, FALSE);
break;
diff --git a/stack/l2cap/l2c_fcr.c b/stack/l2cap/l2c_fcr.c
index 9685f77..6e12607 100644
--- a/stack/l2cap/l2c_fcr.c
+++ b/stack/l2cap/l2c_fcr.c
@@ -186,7 +186,7 @@
tout = (UINT32)p_ccb->our_cfg.fcr.rtrans_tout;
}
/*
- L2CAP_TRACE_DEBUG4 ("l2c_fcr_start_timer Tout: %u Already Running: %u wait_ack: %u ack_q_count: %u",
+ L2CAP_TRACE_DEBUG ("l2c_fcr_start_timer Tout: %u Already Running: %u wait_ack: %u ack_q_count: %u",
tout, p_ccb->timer_entry.in_use, p_ccb->fcrb.wait_ack, p_ccb->fcrb.waiting_for_ack_q.count);
*/
/* Only start a timer that was not started */
@@ -208,7 +208,7 @@
if (p_ccb->fcrb.mon_retrans_timer.in_use)
{
/*
- L2CAP_TRACE_DEBUG2 ("l2c_fcr_stop_timer wait_ack: %u ack_q_count: %u",
+ L2CAP_TRACE_DEBUG ("l2c_fcr_stop_timer wait_ack: %u ack_q_count: %u",
p_ccb->fcrb.wait_ack, p_ccb->fcrb.waiting_for_ack_q.count);
*/
btu_stop_quick_timer (&p_ccb->fcrb.mon_retrans_timer);
@@ -254,14 +254,14 @@
UINT32 throughput_avg, ack_delay_avg, ack_q_count_avg;
dur = GKI_OS_TICKS_TO_MS(dur);
- BT_TRACE_2(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC,
+ BT_TRACE(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC,
"--- L2CAP ERTM Stats for CID: 0x%04x Duration: %08ums", p_ccb->local_cid, dur);
- BT_TRACE_4(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC,
+ BT_TRACE(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC,
"Retransmissions:%08u Times Flow Controlled:%08u Retrans Touts:%08u Ack Touts:%08u",
p_ccb->fcrb.pkts_retransmitted, p_ccb->fcrb.xmit_window_closed, p_ccb->fcrb.retrans_touts, p_ccb->fcrb.xmit_ack_touts);
- BT_TRACE_1(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC,
+ BT_TRACE(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC,
"Times there is less than 2 packets in controller when flow controlled:%08u", p_ccb->fcrb.controller_idle);
- BT_TRACE_2(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC,
+ BT_TRACE(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC,
"max_held_acks:%08u, in_cfg.fcr.tx_win_sz:%08u", p_ccb->fcrb.max_held_acks, p_ccb->peer_cfg.fcr.tx_win_sz );
if (p_str)
{
@@ -270,14 +270,14 @@
(dur >= 10 ? (p_ccb->fcrb.ertm_byte_counts[0] * 100) / (dur / 10) : 0),
p_ccb->fcrb.s_frames_sent[0], p_ccb->fcrb.s_frames_sent[1], p_ccb->fcrb.s_frames_sent[2], p_ccb->fcrb.s_frames_sent[3]);
- BT_TRACE_1(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC, "%s", p_str);
+ BT_TRACE(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC, "%s", p_str);
sprintf(p_str, "Rcvd Pkts:%08u Bytes:%10u(%06u/sec) RR:%08u REJ:%08u RNR:%08u SREJ:%08u",
p_ccb->fcrb.ertm_pkt_counts[1], p_ccb->fcrb.ertm_byte_counts[1],
(dur >= 10 ? (p_ccb->fcrb.ertm_byte_counts[1] * 100) / (dur / 10) : 0),
p_ccb->fcrb.s_frames_rcvd[0], p_ccb->fcrb.s_frames_rcvd[1], p_ccb->fcrb.s_frames_rcvd[2], p_ccb->fcrb.s_frames_rcvd[3]);
- BT_TRACE_1(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC, "%s", p_str);
+ BT_TRACE(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC, "%s", p_str);
throughput_avg = 0;
ack_delay_avg = 0;
@@ -287,7 +287,7 @@
{
if (i == p_ccb->fcrb.ack_delay_avg_index )
{
- BT_TRACE_1(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC,
+ BT_TRACE(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC,
"[%02u] collecting data ...", i );
continue;
}
@@ -297,7 +297,7 @@
p_ccb->fcrb.ack_delay_avg[i], p_ccb->fcrb.ack_delay_min[i], p_ccb->fcrb.ack_delay_max[i],
p_ccb->fcrb.ack_q_count_avg[i], p_ccb->fcrb.ack_q_count_min[i], p_ccb->fcrb.ack_q_count_max[i] );
- BT_TRACE_1(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC, "%s", p_str);
+ BT_TRACE(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC, "%s", p_str);
throughput_avg += p_ccb->fcrb.throughput[i];
ack_delay_avg += p_ccb->fcrb.ack_delay_avg[i];
@@ -308,14 +308,14 @@
ack_delay_avg /= (L2CAP_ERTM_STATS_NUM_AVG - 1);
ack_q_count_avg /= (L2CAP_ERTM_STATS_NUM_AVG - 1);
- BT_TRACE_3(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC,
+ BT_TRACE(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC,
"throughput_avg: %8u (kbytes/sec), ack_delay_avg: %8u ms, ack_q_count_avg: %8u",
throughput_avg, ack_delay_avg, ack_q_count_avg );
GKI_freebuf(p_str);
}
- BT_TRACE_0(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC,
+ BT_TRACE(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC,
"---");
}
#endif
@@ -340,7 +340,7 @@
/* If using the common pool, should be at least 10% free. */
if ( (pool == HCI_ACL_POOL_ID) && (GKI_poolutilization (pool) > 90) )
{
- L2CAP_TRACE_ERROR1 ("L2CAP - failed to clone buffer on HCI_ACL_POOL_ID Utilization: %u", GKI_poolutilization(pool));
+ L2CAP_TRACE_ERROR ("L2CAP - failed to clone buffer on HCI_ACL_POOL_ID Utilization: %u", GKI_poolutilization(pool));
return (NULL);
}
@@ -351,7 +351,7 @@
/* Make sure buffer fits into buffer pool */
if ((no_of_bytes + sizeof(BT_HDR) + new_offset) > pool_buf_size)
{
- L2CAP_TRACE_ERROR5("##### l2c_fcr_clone_buf (NumBytes %d) -> Exceeds poolsize %d [bytes %d + BT_HDR %d + offset %d]",
+ L2CAP_TRACE_ERROR("##### l2c_fcr_clone_buf (NumBytes %d) -> Exceeds poolsize %d [bytes %d + BT_HDR %d + offset %d]",
(no_of_bytes + sizeof(BT_HDR) + new_offset),
pool_buf_size, no_of_bytes, sizeof(BT_HDR),
new_offset);
@@ -369,7 +369,7 @@
}
else
{
- L2CAP_TRACE_ERROR2 ("L2CAP - failed to clone buffer, Pool: %u Count: %u", pool, GKI_poolfreecount(pool));
+ L2CAP_TRACE_ERROR ("L2CAP - failed to clone buffer, Pool: %u Count: %u", pool, GKI_poolfreecount(pool));
}
return (p_buf2);
@@ -485,7 +485,7 @@
#if BT_TRACE_VERBOSE == TRUE
if (is_retransmission)
{
- L2CAP_TRACE_EVENT6 ("L2CAP eRTM ReTx I-frame CID: 0x%04x Len: %u SAR: %s TxSeq: %u ReqSeq: %u F: %u",
+ L2CAP_TRACE_EVENT ("L2CAP eRTM ReTx I-frame CID: 0x%04x Len: %u SAR: %s TxSeq: %u ReqSeq: %u F: %u",
p_ccb->local_cid, p_buf->len,
SAR_types[(ctrl_word & L2CAP_FCR_SAR_BITS) >> L2CAP_FCR_SAR_BITS_SHIFT],
(ctrl_word & L2CAP_FCR_TX_SEQ_BITS) >> L2CAP_FCR_TX_SEQ_BITS_SHIFT,
@@ -494,7 +494,7 @@
}
else
{
- L2CAP_TRACE_EVENT6 ("L2CAP eRTM Tx I-frame CID: 0x%04x Len: %u SAR: %-12s TxSeq: %u ReqSeq: %u F: %u",
+ L2CAP_TRACE_EVENT ("L2CAP eRTM Tx I-frame CID: 0x%04x Len: %u SAR: %-12s TxSeq: %u ReqSeq: %u F: %u",
p_ccb->local_cid, p_buf->len,
SAR_types[(ctrl_word & L2CAP_FCR_SAR_BITS) >> L2CAP_FCR_SAR_BITS_SHIFT],
(ctrl_word & L2CAP_FCR_TX_SEQ_BITS) >> L2CAP_FCR_TX_SEQ_BITS_SHIFT,
@@ -590,23 +590,23 @@
if ((((ctrl_word & L2CAP_FCR_SUP_BITS) >> L2CAP_FCR_SUP_SHIFT) == 1)
|| (((ctrl_word & L2CAP_FCR_SUP_BITS) >> L2CAP_FCR_SUP_SHIFT) == 3))
{
- L2CAP_TRACE_WARNING6 ("L2CAP eRTM Tx S-frame CID: 0x%04x ctrlword: 0x%04x Type: %s ReqSeq: %u P: %u F: %u",
+ L2CAP_TRACE_WARNING ("L2CAP eRTM Tx S-frame CID: 0x%04x ctrlword: 0x%04x Type: %s ReqSeq: %u P: %u F: %u",
p_ccb->local_cid, ctrl_word,
SUP_types[(ctrl_word & L2CAP_FCR_SUP_BITS) >> L2CAP_FCR_SUP_SHIFT],
(ctrl_word & L2CAP_FCR_REQ_SEQ_BITS) >> L2CAP_FCR_REQ_SEQ_BITS_SHIFT,
(ctrl_word & L2CAP_FCR_P_BIT) >> L2CAP_FCR_P_BIT_SHIFT,
(ctrl_word & L2CAP_FCR_F_BIT) >> L2CAP_FCR_F_BIT_SHIFT);
- L2CAP_TRACE_WARNING1 (" Buf Len: %u", p_buf->len);
+ L2CAP_TRACE_WARNING (" Buf Len: %u", p_buf->len);
}
else
{
- L2CAP_TRACE_EVENT6 ("L2CAP eRTM Tx S-frame CID: 0x%04x ctrlword: 0x%04x Type: %s ReqSeq: %u P: %u F: %u",
+ L2CAP_TRACE_EVENT ("L2CAP eRTM Tx S-frame CID: 0x%04x ctrlword: 0x%04x Type: %s ReqSeq: %u P: %u F: %u",
p_ccb->local_cid, ctrl_word,
SUP_types[(ctrl_word & L2CAP_FCR_SUP_BITS) >> L2CAP_FCR_SUP_SHIFT],
(ctrl_word & L2CAP_FCR_REQ_SEQ_BITS) >> L2CAP_FCR_REQ_SEQ_BITS_SHIFT,
(ctrl_word & L2CAP_FCR_P_BIT) >> L2CAP_FCR_P_BIT_SHIFT,
(ctrl_word & L2CAP_FCR_F_BIT) >> L2CAP_FCR_F_BIT_SHIFT);
- L2CAP_TRACE_EVENT1 (" Buf Len: %u", p_buf->len);
+ L2CAP_TRACE_EVENT (" Buf Len: %u", p_buf->len);
}
#endif /* BT_TRACE_VERBOSE */
@@ -619,7 +619,7 @@
}
else
{
- L2CAP_TRACE_ERROR2 ("l2c_fcr_send_S_frame(No Resources) cid 0x%04x, Type: 0x%4x",
+ L2CAP_TRACE_ERROR ("l2c_fcr_send_S_frame(No Resources) cid 0x%04x, Type: 0x%4x",
p_ccb->local_cid, function_code);
}
}
@@ -648,7 +648,7 @@
if (p_buf->len < min_pdu_len)
{
- L2CAP_TRACE_WARNING2 ("Rx L2CAP PDU: CID: 0x%04x Len too short: %u", p_ccb->local_cid, p_buf->len);
+ L2CAP_TRACE_WARNING ("Rx L2CAP PDU: CID: 0x%04x Len too short: %u", p_ccb->local_cid, p_buf->len);
GKI_freebuf (p_buf);
return;
}
@@ -670,7 +670,7 @@
|| (((ctrl_word & L2CAP_FCR_SUP_BITS) >> L2CAP_FCR_SUP_SHIFT) == 3))
{
/* REJ or SREJ */
- L2CAP_TRACE_WARNING6 ("L2CAP eRTM Rx S-frame: cid: 0x%04x Len: %u Type: %s ReqSeq: %u P: %u F: %u",
+ L2CAP_TRACE_WARNING ("L2CAP eRTM Rx S-frame: cid: 0x%04x Len: %u Type: %s ReqSeq: %u P: %u F: %u",
p_ccb->local_cid, p_buf->len,
SUP_types[(ctrl_word & L2CAP_FCR_SUP_BITS) >> L2CAP_FCR_SUP_SHIFT],
(ctrl_word & L2CAP_FCR_REQ_SEQ_BITS) >> L2CAP_FCR_REQ_SEQ_BITS_SHIFT,
@@ -679,7 +679,7 @@
}
else
{
- L2CAP_TRACE_EVENT6 ("L2CAP eRTM Rx S-frame: cid: 0x%04x Len: %u Type: %s ReqSeq: %u P: %u F: %u",
+ L2CAP_TRACE_EVENT ("L2CAP eRTM Rx S-frame: cid: 0x%04x Len: %u Type: %s ReqSeq: %u P: %u F: %u",
p_ccb->local_cid, p_buf->len,
SUP_types[(ctrl_word & L2CAP_FCR_SUP_BITS) >> L2CAP_FCR_SUP_SHIFT],
(ctrl_word & L2CAP_FCR_REQ_SEQ_BITS) >> L2CAP_FCR_REQ_SEQ_BITS_SHIFT,
@@ -689,7 +689,7 @@
}
else
{
- L2CAP_TRACE_EVENT6 ("L2CAP eRTM Rx I-frame: cid: 0x%04x Len: %u SAR: %-12s TxSeq: %u ReqSeq: %u F: %u",
+ L2CAP_TRACE_EVENT ("L2CAP eRTM Rx I-frame: cid: 0x%04x Len: %u SAR: %-12s TxSeq: %u ReqSeq: %u F: %u",
p_ccb->local_cid, p_buf->len,
SAR_types[(ctrl_word & L2CAP_FCR_SAR_BITS) >> L2CAP_FCR_SAR_BITS_SHIFT],
(ctrl_word & L2CAP_FCR_TX_SEQ_BITS) >> L2CAP_FCR_TX_SEQ_BITS_SHIFT,
@@ -697,7 +697,7 @@
(ctrl_word & L2CAP_FCR_F_BIT) >> L2CAP_FCR_F_BIT_SHIFT);
}
- L2CAP_TRACE_EVENT6 (" eRTM Rx Nxt_tx_seq %u, Lst_rx_ack %u, Nxt_seq_exp %u, Lst_ack_snt %u, wt_q.cnt %u, tries %u",
+ L2CAP_TRACE_EVENT (" eRTM Rx Nxt_tx_seq %u, Lst_rx_ack %u, Nxt_seq_exp %u, Lst_ack_snt %u, wt_q.cnt %u, tries %u",
p_ccb->fcrb.next_tx_seq, p_ccb->fcrb.last_rx_ack, p_ccb->fcrb.next_seq_expected,
p_ccb->fcrb.last_ack_sent, p_ccb->fcrb.waiting_for_ack_q.count, p_ccb->fcrb.num_tries);
@@ -723,7 +723,7 @@
if (l2c_fcr_rx_get_fcs(p_buf) != fcs)
{
- L2CAP_TRACE_WARNING1 ("Rx L2CAP PDU: CID: 0x%04x BAD FCS", p_ccb->local_cid);
+ L2CAP_TRACE_WARNING ("Rx L2CAP PDU: CID: 0x%04x BAD FCS", p_ccb->local_cid);
GKI_freebuf(p_buf);
return;
}
@@ -812,7 +812,7 @@
STREAM_TO_UINT16 (ctrl_word, p);
- L2CAP_TRACE_DEBUG3 ("l2c_fcr_proc_pdu() CID: 0x%04x Process Buffer from SREJ_Hold_Q TxSeq: %u Expected_Seq: %u",
+ L2CAP_TRACE_DEBUG ("l2c_fcr_proc_pdu() CID: 0x%04x Process Buffer from SREJ_Hold_Q TxSeq: %u Expected_Seq: %u",
p_ccb->local_cid, (ctrl_word & L2CAP_FCR_TX_SEQ_BITS) >> L2CAP_FCR_TX_SEQ_BITS_SHIFT,
p_ccb->fcrb.next_seq_expected);
@@ -838,7 +838,7 @@
l2c_fcr_send_S_frame (p_ccb, L2CAP_FCR_SUP_RR, 0);
else
{
- L2CAP_TRACE_DEBUG6 ("l2c_fcr_proc_pdu() not sending RR CID: 0x%04x local_busy:%d rej_sent:%d srej_sent:%d Expected_Seq:%u Last_Ack:%u",
+ L2CAP_TRACE_DEBUG ("l2c_fcr_proc_pdu() not sending RR CID: 0x%04x local_busy:%d rej_sent:%d srej_sent:%d Expected_Seq:%u Last_Ack:%u",
p_ccb->local_cid, p_ccb->fcrb.local_busy, p_ccb->fcrb.rej_sent, p_ccb->fcrb.srej_sent, p_ccb->fcrb.next_seq_expected,
p_ccb->fcrb.last_ack_sent);
}
@@ -864,7 +864,7 @@
*******************************************************************************/
void l2c_fcr_proc_tout (tL2C_CCB *p_ccb)
{
- L2CAP_TRACE_DEBUG5 ("l2c_fcr_proc_tout: CID: 0x%04x num_tries: %u (max: %u) wait_ack: %u ack_q_count: %u",
+ L2CAP_TRACE_DEBUG ("l2c_fcr_proc_tout: CID: 0x%04x num_tries: %u (max: %u) wait_ack: %u ack_q_count: %u",
p_ccb->local_cid, p_ccb->fcrb.num_tries, p_ccb->peer_cfg.fcr.max_transmit,
p_ccb->fcrb.wait_ack, p_ccb->fcrb.waiting_for_ack_q.count);
@@ -900,7 +900,7 @@
*******************************************************************************/
void l2c_fcr_proc_ack_tout (tL2C_CCB *p_ccb)
{
- L2CAP_TRACE_DEBUG5 ("l2c_fcr_proc_ack_tout: CID: 0x%04x State: %u Wack:%u Rq:%d Acked:%d", p_ccb->local_cid,
+ L2CAP_TRACE_DEBUG ("l2c_fcr_proc_ack_tout: CID: 0x%04x State: %u Wack:%u Rq:%d Acked:%d", p_ccb->local_cid,
p_ccb->chnl_state, p_ccb->fcrb.wait_ack, p_ccb->fcrb.next_seq_expected, p_ccb->fcrb.last_ack_sent);
if ( (p_ccb->chnl_state == CST_OPEN) && (!p_ccb->fcrb.wait_ack)
@@ -954,7 +954,7 @@
if (num_bufs_acked > p_fcrb->waiting_for_ack_q.count)
{
/* The channel is closed if ReqSeq is not in range */
- L2CAP_TRACE_WARNING4 ("L2CAP eRTM Frame BAD Req_Seq - ctrl_word: 0x%04x req_seq 0x%02x last_rx_ack: 0x%02x QCount: %u",
+ L2CAP_TRACE_WARNING ("L2CAP eRTM Frame BAD Req_Seq - ctrl_word: 0x%04x req_seq 0x%02x last_rx_ack: 0x%02x QCount: %u",
ctrl_word, req_seq, p_fcrb->last_rx_ack, p_fcrb->waiting_for_ack_q.count);
l2cu_disconnect_chnl (p_ccb);
@@ -962,7 +962,7 @@
}
/*
- L2CAP_TRACE_DEBUG3 ("L2CAP process_reqseq 0x%02x last_rx_ack: 0x%02x QCount: %u",
+ L2CAP_TRACE_DEBUG ("L2CAP process_reqseq 0x%02x last_rx_ack: 0x%02x QCount: %u",
req_seq, p_fcrb->last_rx_ack, p_fcrb->waiting_for_ack_q.count);
*/
p_fcrb->last_rx_ack = req_seq;
@@ -1028,10 +1028,10 @@
if (p_buf->len != 0)
{
- L2CAP_TRACE_WARNING1 ("Incorrect S-frame Length (%d)", p_buf->len);
+ L2CAP_TRACE_WARNING ("Incorrect S-frame Length (%d)", p_buf->len);
}
- L2CAP_TRACE_DEBUG2 ("process_s_frame ctrl_word 0x%04x fcrb_remote_busy:%d", ctrl_word, p_fcrb->remote_busy);
+ L2CAP_TRACE_DEBUG ("process_s_frame ctrl_word 0x%04x fcrb_remote_busy:%d", ctrl_word, p_fcrb->remote_busy);
#if (L2CAP_ERTM_STATS == TRUE)
p_ccb->fcrb.s_frames_rcvd[s_frame_type]++;
@@ -1086,7 +1086,7 @@
}
else
{
- L2CAP_TRACE_DEBUG0 ("process_s_frame hit_max_retries");
+ L2CAP_TRACE_DEBUG ("process_s_frame hit_max_retries");
}
GKI_freebuf (p_buf);
@@ -1128,7 +1128,7 @@
/* If we have flow controlled the peer, ignore any bad I-frames from him */
if ( (tx_seq != p_fcrb->next_seq_expected) && (p_fcrb->local_busy) )
{
- L2CAP_TRACE_WARNING1 ("Dropping bad I-Frame since we flowed off, tx_seq:%u", tx_seq);
+ L2CAP_TRACE_WARNING ("Dropping bad I-Frame since we flowed off, tx_seq:%u", tx_seq);
l2c_fcr_send_S_frame (p_ccb, L2CAP_FCR_SUP_RNR, 0);
GKI_freebuf(p_buf);
return;
@@ -1138,7 +1138,7 @@
/* received buffer now before we update any sequence numbers */
if (GKI_poolfreecount (p_ccb->ertm_info.user_rx_pool_id) == 0)
{
- L2CAP_TRACE_WARNING4 ("L2CAP CID: 0x%04x Dropping I-Frame seq: %u User RX Pool: %u (Size: %u) has no free buffers!!",
+ L2CAP_TRACE_WARNING ("L2CAP CID: 0x%04x Dropping I-Frame seq: %u User RX Pool: %u (Size: %u) has no free buffers!!",
p_ccb->local_cid, tx_seq, p_ccb->ertm_info.user_rx_pool_id,
GKI_poolcount (p_ccb->ertm_info.user_rx_pool_id));
GKI_freebuf(p_buf);
@@ -1154,12 +1154,12 @@
if (num_lost >= p_ccb->our_cfg.fcr.tx_win_sz)
{
/* Duplicate - simply drop it */
- L2CAP_TRACE_WARNING2 ("process_i_frame() Dropping Duplicate Frame tx_seq:%u ExpectedTxSeq %u", tx_seq, p_fcrb->next_seq_expected);
+ L2CAP_TRACE_WARNING ("process_i_frame() Dropping Duplicate Frame tx_seq:%u ExpectedTxSeq %u", tx_seq, p_fcrb->next_seq_expected);
GKI_freebuf(p_buf);
}
else
{
- L2CAP_TRACE_WARNING6 ("process_i_frame() CID: 0x%04x Lost: %u tx_seq:%u ExpTxSeq %u Rej: %u SRej: %u",
+ L2CAP_TRACE_WARNING ("process_i_frame() CID: 0x%04x Lost: %u tx_seq:%u ExpTxSeq %u Rej: %u SRej: %u",
p_ccb->local_cid, num_lost, tx_seq, p_fcrb->next_seq_expected, p_fcrb->rej_sent, p_fcrb->srej_sent);
if (p_fcrb->srej_sent)
@@ -1188,7 +1188,7 @@
p_buf->offset += L2CAP_FCR_OVERHEAD;
p_buf->len -= L2CAP_FCR_OVERHEAD;
}
- L2CAP_TRACE_DEBUG4 ("process_i_frame() Lost: %u tx_seq:%u ExpTxSeq %u Rej: %u SRej1",
+ L2CAP_TRACE_DEBUG ("process_i_frame() Lost: %u tx_seq:%u ExpTxSeq %u Rej: %u SRej1",
num_lost, tx_seq, p_fcrb->next_seq_expected, p_fcrb->rej_sent);
p_buf->layer_specific = tx_seq;
@@ -1196,7 +1196,7 @@
}
else
{
- L2CAP_TRACE_WARNING4 ("process_i_frame() CID: 0x%04x frame dropped in Srej Sent next_srej:%u hold_q.count:%u win_sz:%u",
+ L2CAP_TRACE_WARNING ("process_i_frame() CID: 0x%04x frame dropped in Srej Sent next_srej:%u hold_q.count:%u win_sz:%u",
p_ccb->local_cid, next_srej, p_fcrb->srej_rcv_hold_q.count, p_ccb->our_cfg.fcr.tx_win_sz);
p_fcrb->rej_after_srej = TRUE;
@@ -1205,7 +1205,7 @@
}
else if (p_fcrb->rej_sent)
{
- L2CAP_TRACE_WARNING5 ("process_i_frame() CID: 0x%04x Lost: %u tx_seq:%u ExpTxSeq %u Rej: 1 SRej: %u",
+ L2CAP_TRACE_WARNING ("process_i_frame() CID: 0x%04x Lost: %u tx_seq:%u ExpTxSeq %u Rej: 1 SRej: %u",
p_ccb->local_cid, num_lost, tx_seq, p_fcrb->next_seq_expected, p_fcrb->srej_sent);
/* If REJ sent, just drop the frame */
@@ -1213,7 +1213,7 @@
}
else
{
- L2CAP_TRACE_DEBUG4 ("process_i_frame() CID: 0x%04x tx_seq:%u ExpTxSeq %u Rej: %u",
+ L2CAP_TRACE_DEBUG ("process_i_frame() CID: 0x%04x tx_seq:%u ExpTxSeq %u Rej: %u",
p_ccb->local_cid, tx_seq, p_fcrb->next_seq_expected, p_fcrb->rej_sent);
/* If only one lost, we will send SREJ, otherwise we will send REJ */
@@ -1227,7 +1227,7 @@
{
if (p_fcrb->srej_rcv_hold_q.count != 0)
{
- L2CAP_TRACE_ERROR3 ("process_i_frame() CID: 0x%04x sending SREJ tx_seq:%d hold_q.count:%u",
+ L2CAP_TRACE_ERROR ("process_i_frame() CID: 0x%04x sending SREJ tx_seq:%d hold_q.count:%u",
p_ccb->local_cid, tx_seq, p_fcrb->srej_rcv_hold_q.count);
}
p_buf->layer_specific = tx_seq;
@@ -1251,7 +1251,7 @@
/* If any SAR problem in eRTM mode, spec says disconnect. */
if (!do_sar_reassembly (p_ccb, p_buf, ctrl_word))
{
- L2CAP_TRACE_WARNING1 ("process_i_frame() CID: 0x%04x reassembly failed", p_ccb->local_cid);
+ L2CAP_TRACE_WARNING ("process_i_frame() CID: 0x%04x reassembly failed", p_ccb->local_cid);
l2cu_disconnect_chnl (p_ccb);
return;
}
@@ -1314,7 +1314,7 @@
if (l2c_fcr_rx_get_fcs(p_buf) != fcs)
{
- L2CAP_TRACE_WARNING1 ("Rx L2CAP PDU: CID: 0x%04x BAD FCS", p_ccb->local_cid);
+ L2CAP_TRACE_WARNING ("Rx L2CAP PDU: CID: 0x%04x BAD FCS", p_ccb->local_cid);
GKI_freebuf(p_buf);
return;
}
@@ -1331,13 +1331,13 @@
/* Make sure it is an I-frame */
if (ctrl_word & L2CAP_FCR_S_FRAME_BIT)
{
- L2CAP_TRACE_WARNING2 ("Rx L2CAP PDU: CID: 0x%04x BAD S-frame in streaming mode ctrl_word: 0x%04x", p_ccb->local_cid, ctrl_word);
+ L2CAP_TRACE_WARNING ("Rx L2CAP PDU: CID: 0x%04x BAD S-frame in streaming mode ctrl_word: 0x%04x", p_ccb->local_cid, ctrl_word);
GKI_freebuf (p_buf);
return;
}
#if BT_TRACE_VERBOSE == TRUE
- L2CAP_TRACE_EVENT6 ("L2CAP eRTM Rx I-frame: cid: 0x%04x Len: %u SAR: %-12s TxSeq: %u ReqSeq: %u F: %u",
+ L2CAP_TRACE_EVENT ("L2CAP eRTM Rx I-frame: cid: 0x%04x Len: %u SAR: %-12s TxSeq: %u ReqSeq: %u F: %u",
p_ccb->local_cid, p_buf->len,
SAR_types[(ctrl_word & L2CAP_FCR_SAR_BITS) >> L2CAP_FCR_SAR_BITS_SHIFT],
(ctrl_word & L2CAP_FCR_TX_SEQ_BITS) >> L2CAP_FCR_TX_SEQ_BITS_SHIFT,
@@ -1351,7 +1351,7 @@
/* Check if tx-sequence is the expected one */
if (tx_seq != p_ccb->fcrb.next_seq_expected)
{
- L2CAP_TRACE_WARNING4 ("Rx L2CAP PDU: CID: 0x%04x Lost frames Exp: %u Got: %u p_rx_sdu: 0x%08x",
+ L2CAP_TRACE_WARNING ("Rx L2CAP PDU: CID: 0x%04x Lost frames Exp: %u Got: %u p_rx_sdu: 0x%08x",
p_ccb->local_cid, p_ccb->fcrb.next_seq_expected, tx_seq, p_ccb->fcrb.p_rx_sdu);
/* Lost one or more packets, so flush the SAR queue */
@@ -1397,7 +1397,7 @@
{
if (p_fcrb->p_rx_sdu != NULL)
{
- L2CAP_TRACE_WARNING2 ("SAR - got unexpected unsegmented or start SDU Expected len: %u Got so far: %u",
+ L2CAP_TRACE_WARNING ("SAR - got unexpected unsegmented or start SDU Expected len: %u Got so far: %u",
p_fcrb->rx_sdu_len, p_fcrb->p_rx_sdu->len);
packet_ok = FALSE;
@@ -1405,7 +1405,7 @@
/* Check the length of the packet */
if ( (sar_type == L2CAP_FCR_START_SDU) && (p_buf->len < L2CAP_SDU_LEN_OVERHEAD) )
{
- L2CAP_TRACE_WARNING1 ("SAR start packet too short: %u", p_buf->len);
+ L2CAP_TRACE_WARNING ("SAR start packet too short: %u", p_buf->len);
packet_ok = FALSE;
}
}
@@ -1413,7 +1413,7 @@
{
if (p_fcrb->p_rx_sdu == NULL)
{
- L2CAP_TRACE_WARNING0 ("SAR - got unexpected cont or end SDU");
+ L2CAP_TRACE_WARNING ("SAR - got unexpected cont or end SDU");
packet_ok = FALSE;
}
}
@@ -1432,12 +1432,12 @@
if (p_fcrb->rx_sdu_len > p_ccb->max_rx_mtu)
{
- L2CAP_TRACE_WARNING2 ("SAR - SDU len: %u larger than MTU: %u", p_fcrb->rx_sdu_len, p_fcrb->rx_sdu_len);
+ L2CAP_TRACE_WARNING ("SAR - SDU len: %u larger than MTU: %u", p_fcrb->rx_sdu_len, p_fcrb->rx_sdu_len);
packet_ok = FALSE;
}
else if ((p_fcrb->p_rx_sdu = (BT_HDR *)GKI_getpoolbuf (p_ccb->ertm_info.user_rx_pool_id)) == NULL)
{
- L2CAP_TRACE_ERROR1 ("SAR - no buffer for SDU start user_rx_pool_id:%d", p_ccb->ertm_info.user_rx_pool_id);
+ L2CAP_TRACE_ERROR ("SAR - no buffer for SDU start user_rx_pool_id:%d", p_ccb->ertm_info.user_rx_pool_id);
packet_ok = FALSE;
}
else
@@ -1451,13 +1451,13 @@
{
if ((p_fcrb->p_rx_sdu->len + p_buf->len) > p_fcrb->rx_sdu_len)
{
- L2CAP_TRACE_ERROR4 ("SAR - SDU len exceeded Type: %u Lengths: %u %u %u",
+ L2CAP_TRACE_ERROR ("SAR - SDU len exceeded Type: %u Lengths: %u %u %u",
sar_type, p_fcrb->p_rx_sdu->len, p_buf->len, p_fcrb->rx_sdu_len);
packet_ok = FALSE;
}
else if ( (sar_type == L2CAP_FCR_END_SDU) && ((p_fcrb->p_rx_sdu->len + p_buf->len) != p_fcrb->rx_sdu_len) )
{
- L2CAP_TRACE_WARNING3 ("SAR - SDU end rcvd but SDU incomplete: %u %u %u",
+ L2CAP_TRACE_WARNING ("SAR - SDU end rcvd but SDU incomplete: %u %u %u",
p_fcrb->p_rx_sdu->len, p_buf->len, p_fcrb->rx_sdu_len);
packet_ok = FALSE;
}
@@ -1521,7 +1521,7 @@
&& (p_ccb->peer_cfg.fcr.max_transmit != 0)
&& (p_ccb->fcrb.num_tries >= p_ccb->peer_cfg.fcr.max_transmit) )
{
- L2CAP_TRACE_EVENT5 ("Max Tries Exceeded: (last_acq: %d CID: 0x%04x num_tries: %u (max: %u) ack_q_count: %u",
+ L2CAP_TRACE_EVENT ("Max Tries Exceeded: (last_acq: %d CID: 0x%04x num_tries: %u (max: %u) ack_q_count: %u",
p_ccb->fcrb.last_rx_ack, p_ccb->local_cid, p_ccb->fcrb.num_tries, p_ccb->peer_cfg.fcr.max_transmit,
p_ccb->fcrb.waiting_for_ack_q.count);
@@ -1543,7 +1543,7 @@
buf_seq = (ctrl_word & L2CAP_FCR_TX_SEQ_BITS) >> L2CAP_FCR_TX_SEQ_BITS_SHIFT;
- L2CAP_TRACE_DEBUG2 ("retransmit_i_frames() cur seq: %u looking for: %u", buf_seq, tx_seq);
+ L2CAP_TRACE_DEBUG ("retransmit_i_frames() cur seq: %u looking for: %u", buf_seq, tx_seq);
if (tx_seq == buf_seq)
break;
@@ -1551,7 +1551,7 @@
if (!p_buf)
{
- L2CAP_TRACE_ERROR2 ("retransmit_i_frames() UNKNOWN seq: %u q_count: %u", tx_seq, p_ccb->fcrb.waiting_for_ack_q.count);
+ L2CAP_TRACE_ERROR ("retransmit_i_frames() UNKNOWN seq: %u q_count: %u", tx_seq, p_ccb->fcrb.waiting_for_ack_q.count);
return (TRUE);
}
}
@@ -1699,7 +1699,7 @@
}
else /* Should never happen if the application has configured buffers correctly */
{
- L2CAP_TRACE_ERROR1 ("L2CAP - cannot get buffer, for segmentation, pool: %u", p_ccb->ertm_info.fcr_tx_pool_id);
+ L2CAP_TRACE_ERROR ("L2CAP - cannot get buffer, for segmentation, pool: %u", p_ccb->ertm_info.fcr_tx_pool_id);
return (NULL);
}
}
@@ -1760,7 +1760,7 @@
if (!p_wack)
{
- L2CAP_TRACE_ERROR3 ("L2CAP - no buffer for xmit cloning, CID: 0x%04x Pool: %u Count: %u",
+ L2CAP_TRACE_ERROR ("L2CAP - no buffer for xmit cloning, CID: 0x%04x Pool: %u Count: %u",
p_ccb->local_cid, p_ccb->ertm_info.fcr_tx_pool_id, GKI_poolfreecount(p_ccb->ertm_info.fcr_tx_pool_id));
/* We will not save the FCS in case we reconfigure and change options */
@@ -1840,7 +1840,7 @@
/* At least one type needs to be set (Basic, ERTM, STM) to continue */
if (!p_ccb->ertm_info.allowed_modes)
{
- L2CAP_TRACE_WARNING0 ("L2CAP - Peer does not support our desired channel types");
+ L2CAP_TRACE_WARNING ("L2CAP - Peer does not support our desired channel types");
}
return (p_ccb->ertm_info.allowed_modes);
@@ -1862,7 +1862,7 @@
if (p_fcr->mode != p_ccb->ertm_info.preferred_mode)
{
- L2CAP_TRACE_WARNING2 ("l2c_fcr_adj_our_req_options - preferred_mode (%d), does not match mode (%d)",
+ L2CAP_TRACE_WARNING ("l2c_fcr_adj_our_req_options - preferred_mode (%d), does not match mode (%d)",
p_ccb->ertm_info.preferred_mode, p_fcr->mode);
/* The preferred mode is passed in through tL2CAP_ERTM_INFO, so override this one */
@@ -1874,7 +1874,7 @@
{
if (p_cfg->fcr_present && p_fcr->mode != L2CAP_FCR_BASIC_MODE)
{
- L2CAP_TRACE_WARNING1 ("l2c_fcr_adj_our_req_options (mode %d): ERROR: No FCR options set using BASIC mode", p_fcr->mode);
+ L2CAP_TRACE_WARNING ("l2c_fcr_adj_our_req_options (mode %d): ERROR: No FCR options set using BASIC mode", p_fcr->mode);
}
p_fcr->mode = L2CAP_FCR_BASIC_MODE;
}
@@ -1909,14 +1909,14 @@
/* If peer does not support STREAMING, try ERTM */
if (p_fcr->mode == L2CAP_FCR_STREAM_MODE && !(p_ccb->ertm_info.allowed_modes & L2CAP_FCR_CHAN_OPT_STREAM))
{
- L2CAP_TRACE_DEBUG0 ("L2C CFG: mode is STREAM, but peer does not support; Try ERTM");
+ L2CAP_TRACE_DEBUG ("L2C CFG: mode is STREAM, but peer does not support; Try ERTM");
p_fcr->mode = L2CAP_FCR_ERTM_MODE;
}
/* If peer does not support ERTM, try BASIC (will support this if made it here in the code) */
if (p_fcr->mode == L2CAP_FCR_ERTM_MODE && !(p_ccb->ertm_info.allowed_modes & L2CAP_FCR_CHAN_OPT_ERTM))
{
- L2CAP_TRACE_DEBUG0 ("L2C CFG: mode is ERTM, but peer does not support; Try BASIC");
+ L2CAP_TRACE_DEBUG ("L2C CFG: mode is ERTM, but peer does not support; Try BASIC");
p_fcr->mode = L2CAP_FCR_BASIC_MODE;
}
}
@@ -1926,7 +1926,7 @@
/* MTU must be smaller than buffer size */
if ( (p_cfg->mtu_present) && (p_cfg->mtu > p_ccb->max_rx_mtu) )
{
- L2CAP_TRACE_WARNING2 ("L2CAP - MTU: %u larger than buf size: %u", p_cfg->mtu, p_ccb->max_rx_mtu);
+ L2CAP_TRACE_WARNING ("L2CAP - MTU: %u larger than buf size: %u", p_cfg->mtu, p_ccb->max_rx_mtu);
return (FALSE);
}
@@ -1938,7 +1938,7 @@
/* MPS must be less than MTU */
else if (p_fcr->mps > p_ccb->max_rx_mtu)
{
- L2CAP_TRACE_WARNING2 ("L2CAP - MPS %u invalid MTU: %u", p_fcr->mps, p_ccb->max_rx_mtu);
+ L2CAP_TRACE_WARNING ("L2CAP - MPS %u invalid MTU: %u", p_fcr->mps, p_ccb->max_rx_mtu);
return (FALSE);
}
@@ -1994,7 +1994,7 @@
p_ccb->our_cfg.fcr.rtrans_tout = 0;
}
- L2CAP_TRACE_DEBUG2 ("l2c_fcr_adj_monitor_retran_timeout: mon_tout:%d, rtrans_tout:%d",
+ L2CAP_TRACE_DEBUG ("l2c_fcr_adj_monitor_retran_timeout: mon_tout:%d, rtrans_tout:%d",
p_ccb->our_cfg.fcr.mon_tout, p_ccb->our_cfg.fcr.rtrans_tout);
}
}
@@ -2024,7 +2024,7 @@
/* Note: peer is not guaranteed to obey our adjustment */
if (p_ccb->peer_cfg.fcr.tx_win_sz > p_ccb->our_cfg.fcr.tx_win_sz)
{
- L2CAP_TRACE_DEBUG3 ("%s: adjusting requested tx_win_sz from %i to %i", __FUNCTION__, p_ccb->peer_cfg.fcr.tx_win_sz, p_ccb->our_cfg.fcr.tx_win_sz);
+ L2CAP_TRACE_DEBUG ("%s: adjusting requested tx_win_sz from %i to %i", __FUNCTION__, p_ccb->peer_cfg.fcr.tx_win_sz, p_ccb->our_cfg.fcr.tx_win_sz);
p_ccb->peer_cfg.fcr.tx_win_sz = p_ccb->our_cfg.fcr.tx_win_sz;
}
// btla-specific --
@@ -2070,7 +2070,7 @@
if ((--p_ccb->fcr_cfg_tries) == 0)
{
p_cfg->result = L2CAP_CFG_FAILED_NO_REASON;
- L2CAP_TRACE_WARNING0 ("l2c_fcr_renegotiate_chan (Max retries exceeded)");
+ L2CAP_TRACE_WARNING ("l2c_fcr_renegotiate_chan (Max retries exceeded)");
}
can_renegotiate = FALSE;
@@ -2083,7 +2083,7 @@
/* Peer wants ERTM and we support it */
if ( (peer_mode == L2CAP_FCR_ERTM_MODE) && (p_ccb->ertm_info.allowed_modes & L2CAP_FCR_CHAN_OPT_ERTM) )
{
- L2CAP_TRACE_DEBUG0 ("l2c_fcr_renegotiate_chan(Trying ERTM)");
+ L2CAP_TRACE_DEBUG ("l2c_fcr_renegotiate_chan(Trying ERTM)");
p_ccb->our_cfg.fcr.mode = L2CAP_FCR_ERTM_MODE;
can_renegotiate = TRUE;
}
@@ -2094,7 +2094,7 @@
/* We can try basic for any other peer mode if we support it */
if (p_ccb->ertm_info.allowed_modes & L2CAP_FCR_CHAN_OPT_BASIC)
{
- L2CAP_TRACE_DEBUG0 ("l2c_fcr_renegotiate_chan(Trying Basic)");
+ L2CAP_TRACE_DEBUG ("l2c_fcr_renegotiate_chan(Trying Basic)");
can_renegotiate = TRUE;
p_ccb->our_cfg.fcr.mode = L2CAP_FCR_BASIC_MODE;
}
@@ -2118,7 +2118,7 @@
/* Basic Mode uses ACL Data Pool, make sure the MTU fits */
if ( (p_cfg->mtu_present) && (p_cfg->mtu > L2CAP_MTU_SIZE) )
{
- L2CAP_TRACE_WARNING1 ("L2CAP - adjust MTU: %u too large", p_cfg->mtu);
+ L2CAP_TRACE_WARNING ("L2CAP - adjust MTU: %u too large", p_cfg->mtu);
p_cfg->mtu = L2CAP_MTU_SIZE;
}
}
@@ -2134,7 +2134,7 @@
/* Disconnect if the channels do not match */
if (p_ccb->our_cfg.fcr.mode != peer_mode)
{
- L2CAP_TRACE_WARNING2 ("L2C CFG: Channels incompatible (local %d, peer %d)",
+ L2CAP_TRACE_WARNING ("L2C CFG: Channels incompatible (local %d, peer %d)",
p_ccb->our_cfg.fcr.mode, peer_mode);
l2cu_disconnect_chnl (p_ccb);
}
@@ -2161,7 +2161,7 @@
p_ccb->p_lcb->w4_info_rsp = FALSE; /* Handles T61x SonyEricsson Bug in Info Request */
- L2CAP_TRACE_EVENT5 ("l2c_fcr_process_peer_cfg_req() CFG fcr_present:%d fcr.mode:%d CCB FCR mode:%d preferred: %u allowed:%u",
+ L2CAP_TRACE_EVENT ("l2c_fcr_process_peer_cfg_req() CFG fcr_present:%d fcr.mode:%d CCB FCR mode:%d preferred: %u allowed:%u",
p_cfg->fcr_present, p_cfg->fcr.mode, p_ccb->our_cfg.fcr.mode, p_ccb->ertm_info.preferred_mode,
p_ccb->ertm_info.allowed_modes);
@@ -2240,13 +2240,13 @@
/* Ensure the MPS is not bigger than our retransmission buffer */
if (p_cfg->fcr.mps > max_retrans_size)
{
- L2CAP_TRACE_DEBUG2("CFG: Overriding MPS to %d (orig %d)", max_retrans_size, p_cfg->fcr.mps);
+ L2CAP_TRACE_DEBUG("CFG: Overriding MPS to %d (orig %d)", max_retrans_size, p_cfg->fcr.mps);
p_cfg->fcr.mps = max_retrans_size;
p_ccb->out_cfg_fcr_present = TRUE;
}
- if (p_cfg->fcr.mode == L2CAP_FCR_ERTM_MODE)
+ if (p_cfg->fcr.mode == L2CAP_FCR_ERTM_MODE || p_cfg->fcr.mode == L2CAP_FCR_STREAM_MODE)
{
/* Always respond with FCR ERTM parameters */
p_ccb->out_cfg_fcr_present = TRUE;
@@ -2314,7 +2314,7 @@
p_cfg = &p_ccb->fcrb.test_cb.cfg;
#if 0
- L2CAP_TRACE_DEBUG4 ("testcfg: type: %d, freq: %d (NRM-0, RDM-1), is_rx: %d, count: %d",
+ L2CAP_TRACE_DEBUG ("testcfg: type: %d, freq: %d (NRM-0, RDM-1), is_rx: %d, count: %d",
p_cfg->type, p_cfg->freq, p_cfg->is_rx, p_cfg->count);
#endif
/* If not time to corrupt get out */
@@ -2382,14 +2382,14 @@
/* Lastly, just drop packet if FCS is not being used or if Tx */
if (!is_rx || p_ccb->bypass_fcs == L2CAP_BYPASS_FCS)
{
- L2CAP_TRACE_ERROR6 ("-=-=-=-=-=-=-=- Dropping %s packet (0x%04x) tc: %u Buf Len: %u xx: %u count: %d",
+ L2CAP_TRACE_ERROR ("-=-=-=-=-=-=-=- Dropping %s packet (0x%04x) tc: %u Buf Len: %u xx: %u count: %d",
buf, (UINT32)p_buf, tc, p_buf->len, xx, p_cfg->count);
GKI_freebuf(p_buf);
return TRUE;
}
else
{
- L2CAP_TRACE_ERROR6 ("-=-=-=-=-=-=-=- Corrupting %s packet (0x%04x) tc: %u Buf Len: %u xx: %u count: %d",
+ L2CAP_TRACE_ERROR ("-=-=-=-=-=-=-=- Corrupting %s packet (0x%04x) tc: %u Buf Len: %u xx: %u count: %d",
buf, (UINT32)p_buf, tc, p_buf->len, xx, p_cfg->count);
}
@@ -2451,7 +2451,7 @@
{
if (type == L2CAP_FCR_TTYPE_GET_CID)
{
- L2CAP_TRACE_API1 ("L2CA_SetupErtmTest (GET_CID): cid = 0x%04x", cid);
+ L2CAP_TRACE_API ("L2CA_SetupErtmTest (GET_CID): cid = 0x%04x", cid);
}
return (cid);
}
@@ -2463,7 +2463,7 @@
{
if (p_test_cb->cfg.in_use)
{
- L2CAP_TRACE_ERROR1 ("L2CA_SetupErtmTest (OFF): cid 0x%04x", cid);
+ L2CAP_TRACE_ERROR ("L2CA_SetupErtmTest (OFF): cid 0x%04x", cid);
}
p_test_cb->cfg.in_use = FALSE;
p_test_cb->cfg.count = 0;
@@ -2475,11 +2475,11 @@
/* count must be positive unless random is used */
if (!count && freq != L2CAP_FCR_FREQ_RANDOM)
{
- L2CAP_TRACE_ERROR1 ("L2CA_SetupErtmTest (FAIL): Count = 0, freq = %d", freq);
+ L2CAP_TRACE_ERROR ("L2CA_SetupErtmTest (FAIL): Count = 0, freq = %d", freq);
return (cid);
}
- L2CAP_TRACE_ERROR5 ("L2CA_SetupErtmTest (START): cid 0x%04x, type %d, is_rx %d, freq %d, count %d",
+ L2CAP_TRACE_ERROR ("L2CA_SetupErtmTest (START): cid 0x%04x, type %d, is_rx %d, freq %d, count %d",
cid, type, is_rx, freq, count);
p_test_cb->cfg.in_use = TRUE;
@@ -2490,7 +2490,7 @@
}
else /* Test already in progress so ignore */
{
- L2CAP_TRACE_ERROR5 ("L2CA_SetupErtmTest (ignoring): cid 0x%04x, type %d, is_rx %d, freq %d, count %d",
+ L2CAP_TRACE_ERROR ("L2CA_SetupErtmTest (ignoring): cid 0x%04x, type %d, is_rx %d, freq %d, count %d",
cid, type, is_rx, freq, count);
}
@@ -2527,7 +2527,7 @@
}
else
{
- L2CAP_TRACE_ERROR2 ("L2CA_SendPolledSFrame(ERROR): sup_type %u, p_ccb 0x%07x",
+ L2CAP_TRACE_ERROR ("L2CA_SendPolledSFrame(ERROR): sup_type %u, p_ccb 0x%07x",
sup_type, (UINT32)p_ccb);
}
}
@@ -2548,7 +2548,7 @@
{
if (p_ccb->fcrb.test_cb.cfm.skip_sframe_count > 0)
{
- L2CAP_TRACE_ERROR1 ("l2c_bypass_sframe_packet (count %d)",
+ L2CAP_TRACE_ERROR ("l2c_bypass_sframe_packet (count %d)",
p_ccb->fcrb.test_cb.cfm.skip_sframe_count);
if (--p_ccb->fcrb.test_cb.cfm.skip_sframe_count == 0)
@@ -2586,7 +2586,7 @@
if (!p_ccb)
{
- L2CAP_TRACE_WARNING1 ("L2CA_BypassSFrame(ERROR): no p_ccb (0x%07x)", (UINT32)p_ccb);
+ L2CAP_TRACE_WARNING ("L2CA_BypassSFrame(ERROR): no p_ccb (0x%07x)", (UINT32)p_ccb);
return;
}
@@ -2600,7 +2600,7 @@
}
else
{
- L2CAP_TRACE_WARNING0 ("L2CA_BypassSFrame(ERROR): already in use (ignoring...)");
+ L2CAP_TRACE_WARNING ("L2CA_BypassSFrame(ERROR): already in use (ignoring...)");
}
}
@@ -2690,7 +2690,7 @@
p_ccb->fcrb.ack_delay_avg[index], p_ccb->fcrb.ack_delay_min[index], p_ccb->fcrb.ack_delay_max[index],
p_ccb->fcrb.ack_q_count_avg[index], p_ccb->fcrb.ack_q_count_min[index], p_ccb->fcrb.ack_q_count_max[index] );
- BT_TRACE_1(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC, "%s", str);
+ BT_TRACE(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC, "%s", str);
index = (index + 1) % L2CAP_ERTM_STATS_NUM_AVG;
p_ccb->fcrb.ack_delay_avg_index = index;
diff --git a/stack/l2cap/l2c_int.h b/stack/l2cap/l2c_int.h
index 72d5544..b1d0c46 100644
--- a/stack/l2cap/l2c_int.h
+++ b/stack/l2cap/l2c_int.h
@@ -52,6 +52,7 @@
#define L2CAP_WAIT_UNPARK_TOUT 2 /* 2 seconds */
#define L2CAP_LINK_INFO_RESP_TOUT 2 /* 2 seconds */
#define L2CAP_BLE_LINK_CONNECT_TOUT 30 /* 30 seconds */
+#define L2CAP_BLE_CONN_PARAM_UPD_TOUT 30 /* 30 seconds */
/* quick timer uses millisecond unit */
#define L2CAP_DEFAULT_RETRANS_TOUT 2000 /* 2000 milliseconds */
@@ -393,6 +394,7 @@
UINT8 link_role; /* Master or slave */
UINT8 id;
+ UINT8 cur_echo_id; /* Current id value for echo request */
tL2CA_ECHO_RSP_CB *p_echo_rsp_cb; /* Echo response callback */
UINT16 idle_timeout; /* Idle timeout */
BOOLEAN is_bonding; /* True - link active only for bonding */
@@ -431,15 +433,15 @@
UINT16 disc_reason;
#endif
+ tBT_TRANSPORT transport;
#if (BLE_INCLUDED == TRUE)
- BOOLEAN is_ble_link;
tBLE_ADDR_TYPE ble_addr_type;
#define L2C_BLE_CONN_UPDATE_DISABLE 0x1 /* disable update connection parameters */
#define L2C_BLE_NEW_CONN_PARAM 0x2 /* new connection parameter to be set */
#define L2C_BLE_UPDATE_PENDING 0x4 /* waiting for connection update finished */
#define L2C_BLE_NOT_DEFAULT_PARAM 0x8 /* not using default connection parameters */
- UINT8 upd_status;
+ UINT8 conn_update_mask;
UINT16 min_interval; /* parameters as requested by peripheral */
UINT16 max_interval;
@@ -503,10 +505,14 @@
#endif
#if (BLE_INCLUDED == TRUE)
+ UINT16 num_ble_links_active; /* Number of LE links active */
BOOLEAN is_ble_connecting;
BD_ADDR ble_connecting_bda;
UINT16 controller_le_xmit_window; /* Total ACL window for all links */
UINT16 num_lm_ble_bufs; /* # of ACL buffers on controller */
+ UINT16 ble_round_robin_quota; /* Round-robin link quota */
+ UINT16 ble_round_robin_unacked; /* Round-robin unacked */
+ BOOLEAN ble_check_round_robin; /* Do a round robin check */
#endif
tL2CA_ECHO_DATA_CB *p_echo_data_cb; /* Echo data callback */
@@ -578,14 +584,14 @@
/* Functions provided by l2c_utils.c
************************************
*/
-extern tL2C_LCB *l2cu_allocate_lcb (BD_ADDR p_bd_addr, BOOLEAN is_bonding);
+extern tL2C_LCB *l2cu_allocate_lcb (BD_ADDR p_bd_addr, BOOLEAN is_bonding, tBT_TRANSPORT transport);
extern BOOLEAN l2cu_start_post_bond_timer (UINT16 handle);
extern void l2cu_release_lcb (tL2C_LCB *p_lcb);
-extern tL2C_LCB *l2cu_find_lcb_by_bd_addr (BD_ADDR p_bd_addr);
+extern tL2C_LCB *l2cu_find_lcb_by_bd_addr (BD_ADDR p_bd_addr, tBT_TRANSPORT transport);
extern tL2C_LCB *l2cu_find_lcb_by_handle (UINT16 handle);
extern void l2cu_update_lcb_4_bonding (BD_ADDR p_bd_addr, BOOLEAN is_bonding);
-extern UINT8 l2cu_get_conn_role (BD_ADDR bd_addr);
+extern UINT8 l2cu_get_conn_role (tL2C_LCB *p_this_lcb);
extern BOOLEAN l2cu_set_acl_priority (BD_ADDR bd_addr, UINT8 priority, BOOLEAN reset_after_rs);
extern void l2cu_enqueue_ccb (tL2C_CCB *p_ccb);
@@ -597,6 +603,7 @@
extern tL2C_CCB *l2cu_find_ccb_by_cid (tL2C_LCB *p_lcb, UINT16 local_cid);
extern tL2C_CCB *l2cu_find_ccb_by_remote_cid (tL2C_LCB *p_lcb, UINT16 remote_cid);
extern void l2cu_adj_id (tL2C_LCB *p_lcb, UINT8 adj_mask);
+extern BOOLEAN l2c_is_cmd_rejected (UINT8 cmd_code, UINT8 id, tL2C_LCB *p_lcb);
extern void l2cu_send_peer_cmd_reject (tL2C_LCB *p_lcb, UINT16 reason,
UINT8 rem_id,UINT16 p1, UINT16 p2);
@@ -676,7 +683,7 @@
extern tL2C_LCB *l2cu_find_lcb_by_state (tL2C_LINK_STATE state);
extern BOOLEAN l2cu_lcb_disconnecting (void);
-extern BOOLEAN l2cu_create_conn (tL2C_LCB *p_lcb);
+extern BOOLEAN l2cu_create_conn (tL2C_LCB *p_lcb, tBT_TRANSPORT transport);
extern BOOLEAN l2cu_create_conn_after_switch (tL2C_LCB *p_lcb);
extern BT_HDR *l2cu_get_next_buffer_to_send (tL2C_LCB *p_lcb);
extern void l2cu_resubmit_pending_sec_req (BD_ADDR p_bda);
@@ -699,7 +706,7 @@
extern void l2c_link_processs_num_bufs (UINT16 num_lm_acl_bufs);
extern UINT8 l2c_link_pkts_rcvd (UINT16 *num_pkts, UINT16 *handles);
extern void l2c_link_role_changed (BD_ADDR bd_addr, UINT8 new_role, UINT8 hci_status);
-extern void l2c_link_sec_comp (BD_ADDR p_bda, void *p_ref_data, UINT8 status);
+extern void l2c_link_sec_comp (BD_ADDR p_bda, tBT_TRANSPORT trasnport, void *p_ref_data, UINT8 status);
extern void l2c_link_segments_xmitted (BT_HDR *p_msg);
extern void l2c_pin_code_request (BD_ADDR bd_addr);
extern void l2c_link_adjust_chnl_allocation (void);
@@ -762,8 +769,16 @@
extern void l2cble_conn_comp (UINT16 handle, UINT8 role, BD_ADDR bda, tBLE_ADDR_TYPE type,
UINT16 conn_interval, UINT16 conn_latency, UINT16 conn_timeout);
extern BOOLEAN l2cble_init_direct_conn (tL2C_LCB *p_lcb);
+extern void l2cble_notify_le_connection (BD_ADDR bda);
+extern void l2c_ble_link_adjust_allocation (void);
+extern void l2cble_process_conn_update_evt (UINT16 handle, UINT8 status);
+#if (defined BLE_LLT_INCLUDED) && (BLE_LLT_INCLUDED == TRUE)
+extern void l2cble_process_rc_param_request_evt(UINT16 handle, UINT16 int_min, UINT16 int_max,
+ UINT16 latency, UINT16 timeout);
#endif
+#endif
+extern void l2cu_process_fixed_disc_cback (tL2C_LCB *p_lcb);
#ifdef __cplusplus
}
diff --git a/stack/l2cap/l2c_link.c b/stack/l2cap/l2c_link.c
index fd38ca2..5ee5faa 100644
--- a/stack/l2cap/l2c_link.c
+++ b/stack/l2cap/l2c_link.c
@@ -65,16 +65,16 @@
BOOLEAN no_links;
/* See if we have a link control block for the remote device */
- p_lcb = l2cu_find_lcb_by_bd_addr (bd_addr);
+ p_lcb = l2cu_find_lcb_by_bd_addr (bd_addr, BT_TRANSPORT_BR_EDR);
/* If we don't have one, create one and accept the connection. */
if (!p_lcb)
{
- p_lcb = l2cu_allocate_lcb (bd_addr, FALSE);
+ p_lcb = l2cu_allocate_lcb (bd_addr, FALSE, BT_TRANSPORT_BR_EDR);
if (!p_lcb)
{
btsnd_hcic_reject_conn (bd_addr, HCI_ERR_HOST_REJECT_RESOURCES);
- L2CAP_TRACE_ERROR0 ("L2CAP failed to allocate LCB");
+ L2CAP_TRACE_ERROR ("L2CAP failed to allocate LCB");
return FALSE;
}
@@ -99,7 +99,7 @@
if (!btm_dev_support_switch (bd_addr))
p_lcb->link_role = HCI_ROLE_SLAVE;
else
- p_lcb->link_role = l2cu_get_conn_role(bd_addr);
+ p_lcb->link_role = l2cu_get_conn_role(p_lcb);
}
/* Tell the other side we accept the connection */
@@ -120,7 +120,7 @@
if (!btm_dev_support_switch (bd_addr))
p_lcb->link_role = HCI_ROLE_SLAVE;
else
- p_lcb->link_role = l2cu_get_conn_role(bd_addr);
+ p_lcb->link_role = l2cu_get_conn_role(p_lcb);
btsnd_hcic_accept_conn (bd_addr, p_lcb->link_role);
@@ -134,7 +134,7 @@
}
else
{
- L2CAP_TRACE_ERROR1("L2CAP got conn_req while connected (state:%d). Reject it",
+ L2CAP_TRACE_ERROR("L2CAP got conn_req while connected (state:%d). Reject it",
p_lcb->link_state);
/* Reject the connection with ACL Connection Already exist reason */
btsnd_hcic_reject_conn (bd_addr, HCI_ERR_CONNECTION_EXISTS);
@@ -168,18 +168,18 @@
memcpy (ci.bd_addr, p_bda, BD_ADDR_LEN);
/* See if we have a link control block for the remote device */
- p_lcb = l2cu_find_lcb_by_bd_addr (ci.bd_addr);
+ p_lcb = l2cu_find_lcb_by_bd_addr (ci.bd_addr, BT_TRANSPORT_BR_EDR);
/* If we don't have one, this is an error */
if (!p_lcb)
{
- L2CAP_TRACE_WARNING0 ("L2CAP got conn_comp for unknown BD_ADDR");
+ L2CAP_TRACE_WARNING ("L2CAP got conn_comp for unknown BD_ADDR");
return (FALSE);
}
if (p_lcb->link_state != LST_CONNECTING)
{
- L2CAP_TRACE_ERROR2 ("L2CAP got conn_comp in bad state: %d status: 0x%d", p_lcb->link_state, status);
+ L2CAP_TRACE_ERROR ("L2CAP got conn_comp in bad state: %d status: 0x%d", p_lcb->link_state, status);
if (status != HCI_SUCCESS)
l2c_link_hci_disc_comp (p_lcb->handle, status);
@@ -202,9 +202,9 @@
if ((p_dev_info = btm_find_dev (p_bda)) != NULL)
btm_acl_created (ci.bd_addr, p_dev_info->dev_class,
p_dev_info->sec_bd_name, handle,
- p_lcb->link_role, FALSE);
+ p_lcb->link_role, BT_TRANSPORT_BR_EDR);
else
- btm_acl_created (ci.bd_addr, NULL, NULL, handle, p_lcb->link_role, FALSE);
+ btm_acl_created (ci.bd_addr, NULL, NULL, handle, p_lcb->link_role, BT_TRANSPORT_BR_EDR);
BTM_SetLinkSuperTout (ci.bd_addr, btm_cb.btm_def_link_super_tout);
@@ -272,7 +272,7 @@
}
else
{
- l2cu_create_conn(p_lcb);
+ l2cu_create_conn(p_lcb, BT_TRANSPORT_BR_EDR);
}
}
}
@@ -290,7 +290,7 @@
** Returns void
**
*******************************************************************************/
-void l2c_link_sec_comp (BD_ADDR p_bda, void *p_ref_data, UINT8 status)
+void l2c_link_sec_comp (BD_ADDR p_bda, tBT_TRANSPORT transport, void *p_ref_data, UINT8 status)
{
tL2C_CONN_INFO ci;
tL2C_LCB *p_lcb;
@@ -298,7 +298,9 @@
tL2C_CCB *p_next_ccb;
UINT8 event;
- L2CAP_TRACE_DEBUG2 ("l2c_link_sec_comp: %d, 0x%x", status, p_ref_data);
+ UNUSED(transport);
+
+ L2CAP_TRACE_DEBUG ("l2c_link_sec_comp: %d, 0x%x", status, p_ref_data);
if (status == BTM_SUCCESS_NO_SECURITY)
status = BTM_SUCCESS;
@@ -307,12 +309,12 @@
ci.status = status;
memcpy (ci.bd_addr, p_bda, BD_ADDR_LEN);
- p_lcb = l2cu_find_lcb_by_bd_addr (p_bda);
+ p_lcb = l2cu_find_lcb_by_bd_addr (p_bda, BT_TRANSPORT_BR_EDR);
/* If we don't have one, this is an error */
if (!p_lcb)
{
- L2CAP_TRACE_WARNING0 ("L2CAP got sec_comp for unknown BD_ADDR");
+ L2CAP_TRACE_WARNING ("L2CAP got sec_comp for unknown BD_ADDR");
return;
}
@@ -326,7 +328,7 @@
switch(status)
{
case BTM_SUCCESS:
- L2CAP_TRACE_DEBUG1 ("ccb timer ticks: %u", p_ccb->timer_entry.ticks);
+ L2CAP_TRACE_DEBUG ("ccb timer ticks: %u", p_ccb->timer_entry.ticks);
event = L2CEVT_SEC_COMP;
break;
@@ -361,6 +363,7 @@
tL2C_CCB *p_ccb;
BOOLEAN status = TRUE;
BOOLEAN lcb_is_free = TRUE;
+ tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR;
/* See if we have a link control block for the connection */
p_lcb = l2cu_find_lcb_by_handle (handle);
@@ -401,35 +404,55 @@
p_ccb = pn;
}
-#if BTM_SCO_INCLUDED == TRUE
- /* Tell SCO management to drop any SCOs on this ACL */
- btm_sco_acl_removed (p_lcb->remote_bd_addr);
+#if (BTM_SCO_INCLUDED == TRUE)
+#if (BLE_INCLUDED == TRUE)
+ if (p_lcb->transport == BT_TRANSPORT_BR_EDR)
+#endif
+ /* Tell SCO management to drop any SCOs on this ACL */
+ btm_sco_acl_removed (p_lcb->remote_bd_addr);
#endif
/* If waiting for disconnect and reconnect is pending start the reconnect now
race condition where layer above issued connect request on link that was
disconnecting
*/
- if (p_lcb->ccb_queue.p_first_ccb != NULL)
+ if (p_lcb->ccb_queue.p_first_ccb != NULL || p_lcb->p_pending_ccb)
{
-#if (L2CAP_NUM_FIXED_CHNLS > 0)
- /* If we are going to re-use the LCB without dropping it, release all fixed channels here */
- int xx;
-
- for (xx = 0; xx < L2CAP_NUM_FIXED_CHNLS; xx++)
+ L2CAP_TRACE_DEBUG("l2c_link_hci_disc_comp: Restarting pending ACL request");
+#if BLE_INCLUDED == TRUE
+ /* for LE link, always drop and re-open to ensure to get LE remote feature */
+ if (p_lcb->transport == BT_TRANSPORT_LE)
{
- if (p_lcb->p_fixed_ccbs[xx])
- {
- (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(p_lcb->remote_bd_addr, FALSE, p_lcb->disc_reason);
+ l2cu_release_lcb (p_lcb);
+ p_lcb->in_use = TRUE;
+ transport = BT_TRANSPORT_LE;
+ }
+ else
+#endif
+ {
+ #if (L2CAP_NUM_FIXED_CHNLS > 0)
+ /* If we are going to re-use the LCB without dropping it, release all fixed channels
+ here */
+ int xx;
+ for (xx = 0; xx < L2CAP_NUM_FIXED_CHNLS; xx++)
+ {
+ if (p_lcb->p_fixed_ccbs[xx] && p_lcb->p_fixed_ccbs[xx] != p_lcb->p_pending_ccb)
+ {
+#if BLE_INCLUDED == TRUE
+ (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(p_lcb->remote_bd_addr, FALSE,
+ p_lcb->disc_reason, p_lcb->transport);
+#else
+ (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(p_lcb->remote_bd_addr, FALSE,
+ p_lcb->disc_reason, BT_TRANSPORT_BR_EDR);
+#endif
l2cu_release_ccb (p_lcb->p_fixed_ccbs[xx]);
p_lcb->p_fixed_ccbs[xx] = NULL;
- }
- }
+ }
+ }
#endif
- L2CAP_TRACE_DEBUG0("l2c_link_hci_disc_comp: Restarting pending ACL request");
-
- if (l2cu_create_conn(p_lcb))
+ }
+ if (l2cu_create_conn(p_lcb, transport))
lcb_is_free = FALSE; /* still using this lcb */
}
@@ -444,7 +467,7 @@
if (lcb_is_free && ((p_lcb = l2cu_find_lcb_by_state(LST_CONNECT_HOLDING)) != NULL))
{
/* we found one-- create a connection */
- l2cu_create_conn(p_lcb);
+ l2cu_create_conn(p_lcb, BT_TRANSPORT_BR_EDR);
}
return status;
@@ -500,7 +523,7 @@
UINT16 timeout;
tBTM_STATUS rc;
- L2CAP_TRACE_EVENT3 ("L2CAP - l2c_link_timeout() link state %d first CCB %p is_bonding:%d",
+ L2CAP_TRACE_EVENT ("L2CAP - l2c_link_timeout() link state %d first CCB %p is_bonding:%d",
p_lcb->link_state, p_lcb->ccb_queue.p_first_ccb, p_lcb->is_bonding);
/* If link was connecting or disconnecting, clear all channels and drop the LCB */
@@ -545,7 +568,7 @@
(*p_cb) (L2CAP_PING_RESULT_NO_RESP);
- L2CAP_TRACE_WARNING0 ("L2CAP - ping timeout");
+ L2CAP_TRACE_WARNING ("L2CAP - ping timeout");
/* For all channels, send a disconnect indication event through */
/* their FSMs. The CCBs should remove themselves from the LCB */
@@ -576,6 +599,7 @@
}
else if (rc == BTM_SUCCESS)
{
+ l2cu_process_fixed_disc_cback(p_lcb);
/* BTM SEC will make sure that link is release (probably after pairing is done) */
p_lcb->link_state = LST_DISCONNECTING;
timeout = 0xFFFF;
@@ -588,6 +612,7 @@
else if ((p_lcb->is_bonding)
&& (btsnd_hcic_disconnect (p_lcb->handle, HCI_ERR_PEER_USER)))
{
+ l2cu_process_fixed_disc_cback(p_lcb);
p_lcb->link_state = LST_DISCONNECTING;
timeout = L2CAP_LINK_DISCONNECT_TOUT;
}
@@ -718,7 +743,7 @@
if (num_lowpri_links > low_quota)
{
l2cb.round_robin_quota = low_quota;
- qq = qq_remainder = 0;
+ qq = qq_remainder = 1;
}
/* If each low priority link can have at least one buffer */
else if (num_lowpri_links > 0)
@@ -733,10 +758,10 @@
{
l2cb.round_robin_quota = 0;
l2cb.round_robin_unacked = 0;
- qq = qq_remainder = 0;
+ qq = qq_remainder = 1;
}
- L2CAP_TRACE_EVENT5 ("l2c_link_adjust_allocation num_hipri: %u num_lowpri: %u low_quota: %u round_robin_quota: %u qq: %u",
+ L2CAP_TRACE_EVENT ("l2c_link_adjust_allocation num_hipri: %u num_lowpri: %u low_quota: %u round_robin_quota: %u qq: %u",
num_hipri_links, num_lowpri_links, low_quota,
l2cb.round_robin_quota, qq);
@@ -768,10 +793,10 @@
#if L2CAP_HOST_FLOW_CTRL
p_lcb->link_ack_thresh = L2CAP_HOST_FC_ACL_BUFS / l2cb.num_links_active;
#endif
- L2CAP_TRACE_EVENT3 ("l2c_link_adjust_allocation LCB %d Priority: %d XmitQuota: %d",
+ L2CAP_TRACE_EVENT ("l2c_link_adjust_allocation LCB %d Priority: %d XmitQuota: %d",
yy, p_lcb->acl_priority, p_lcb->link_xmit_quota);
- L2CAP_TRACE_EVENT2 (" SentNotAcked: %d RRUnacked: %d",
+ L2CAP_TRACE_EVENT (" SentNotAcked: %d RRUnacked: %d",
p_lcb->sent_not_acked, l2cb.round_robin_unacked);
/* There is a special case where we have readjusted the link quotas and */
@@ -809,7 +834,7 @@
UINT16 quota_per_weighted_chnls[GKI_NUM_TOTAL_BUF_POOLS];
UINT16 reserved_buff[GKI_NUM_TOTAL_BUF_POOLS];
- L2CAP_TRACE_DEBUG0 ("l2c_link_adjust_chnl_allocation");
+ L2CAP_TRACE_DEBUG ("l2c_link_adjust_chnl_allocation");
/* initialize variables */
for (xx = 0; xx < GKI_NUM_TOTAL_BUF_POOLS; xx++ )
@@ -863,7 +888,7 @@
else
quota_per_weighted_chnls[xx] = 1;
- L2CAP_TRACE_DEBUG5 ("POOL ID:%d, GKI_poolcount = %d, reserved_buff = %d, weighted_chnls = %d, quota_per_weighted_chnls = %d",
+ L2CAP_TRACE_DEBUG ("POOL ID:%d, GKI_poolcount = %d, reserved_buff = %d, weighted_chnls = %d, quota_per_weighted_chnls = %d",
xx, GKI_poolcount(xx), reserved_buff[xx], weighted_chnls[xx], quota_per_weighted_chnls[xx] );
}
else
@@ -883,7 +908,7 @@
{
p_ccb->buff_quota = quota_per_weighted_chnls[p_ccb->ertm_info.user_tx_pool_id] * p_ccb->tx_data_rate;
- L2CAP_TRACE_EVENT6 ("CID:0x%04x FCR Mode:%u UserTxPool:%u Priority:%u TxDataRate:%u Quota:%u",
+ L2CAP_TRACE_EVENT ("CID:0x%04x FCR Mode:%u UserTxPool:%u Priority:%u TxDataRate:%u Quota:%u",
p_ccb->local_cid, p_ccb->peer_cfg.fcr.mode, p_ccb->ertm_info.user_tx_pool_id,
p_ccb->ccb_priority, p_ccb->tx_data_rate, p_ccb->buff_quota);
@@ -892,7 +917,7 @@
{
p_ccb->buff_quota = quota_per_weighted_chnls[HCI_ACL_POOL_ID] * p_ccb->tx_data_rate;
- L2CAP_TRACE_EVENT4 ("CID:0x%04x Priority:%u TxDataRate:%u Quota:%u",
+ L2CAP_TRACE_EVENT ("CID:0x%04x Priority:%u TxDataRate:%u Quota:%u",
p_ccb->local_cid,
p_ccb->ccb_priority, p_ccb->tx_data_rate, p_ccb->buff_quota);
}
@@ -977,7 +1002,7 @@
if (bd_addr)
{
/* If here came form hci role change event */
- p_lcb = l2cu_find_lcb_by_bd_addr (bd_addr);
+ p_lcb = l2cu_find_lcb_by_bd_addr (bd_addr, BT_TRANSPORT_BR_EDR);
if (p_lcb)
{
p_lcb->link_role = new_role;
@@ -1013,7 +1038,7 @@
*******************************************************************************/
void l2c_pin_code_request (BD_ADDR bd_addr)
{
- tL2C_LCB *p_lcb = l2cu_find_lcb_by_bd_addr (bd_addr);
+ tL2C_LCB *p_lcb = l2cu_find_lcb_by_bd_addr (bd_addr, BT_TRANSPORT_BR_EDR);
if ( (p_lcb) && (!p_lcb->ccb_queue.p_first_ccb) )
{
@@ -1063,7 +1088,7 @@
{
if ( mode == BTM_PM_STS_PENDING )
{
- L2CAP_TRACE_DEBUG1 ("LCB(0x%x) is in PM pending state", p_lcb->handle);
+ L2CAP_TRACE_DEBUG ("LCB(0x%x) is in PM pending state", p_lcb->handle);
return TRUE;
}
@@ -1104,7 +1129,14 @@
GKI_enqueue (&p_lcb->link_xmit_data_q, p_buf);
if (p_lcb->link_xmit_quota == 0)
- l2cb.check_round_robin = TRUE;
+ {
+#if BLE_INCLUDED == TRUE
+ if (p_lcb->transport == BT_TRANSPORT_LE)
+ l2cb.ble_check_round_robin = TRUE;
+ else
+#endif
+ l2cb.check_round_robin = TRUE;
+ }
}
/* If this is called from uncongested callback context break recursive calling.
@@ -1129,11 +1161,11 @@
/* If controller window is full, nothing to do */
if ( (l2cb.controller_xmit_window == 0
#if (BLE_INCLUDED == TRUE)
- && !p_lcb->is_ble_link
+ && (p_lcb->transport == BT_TRANSPORT_BR_EDR)
#endif
)
#if (BLE_INCLUDED == TRUE)
- || (p_lcb->is_ble_link && l2cb.controller_le_xmit_window == 0 )
+ || (p_lcb->transport == BT_TRANSPORT_LE && l2cb.controller_le_xmit_window == 0 )
#endif
|| (l2cb.round_robin_unacked >= l2cb.round_robin_quota) )
break;
@@ -1167,16 +1199,20 @@
}
/* If we finished without using up our quota, no need for a safety check */
-#if (BLE_INCLUDED == TRUE)
- if ( ((l2cb.controller_xmit_window > 0 && !p_lcb->is_ble_link) ||
- (l2cb.controller_le_xmit_window > 0 && p_lcb->is_ble_link))
- && (l2cb.round_robin_unacked < l2cb.round_robin_quota) )
-#else
if ( (l2cb.controller_xmit_window > 0)
- && (l2cb.round_robin_unacked < l2cb.round_robin_quota) )
-
+ && (l2cb.round_robin_unacked < l2cb.round_robin_quota)
+#if (BLE_INCLUDED == TRUE)
+ && (p_lcb->transport == BT_TRANSPORT_BR_EDR)
#endif
+ )
l2cb.check_round_robin = FALSE;
+
+#if (BLE_INCLUDED == TRUE)
+ if ( (l2cb.controller_le_xmit_window > 0)
+ && (l2cb.ble_round_robin_unacked < l2cb.ble_round_robin_quota)
+ && (p_lcb->transport == BT_TRANSPORT_LE))
+ l2cb.ble_check_round_robin = FALSE;
+#endif
}
else /* if this is not round-robin service */
{
@@ -1188,8 +1224,8 @@
/* See if we can send anything from the link queue */
#if (BLE_INCLUDED == TRUE)
- while ( ((l2cb.controller_xmit_window != 0 && !p_lcb->is_ble_link) ||
- (l2cb.controller_le_xmit_window != 0 && p_lcb->is_ble_link))
+ while ( ((l2cb.controller_xmit_window != 0 && (p_lcb->transport == BT_TRANSPORT_BR_EDR)) ||
+ (l2cb.controller_le_xmit_window != 0 && (p_lcb->transport == BT_TRANSPORT_LE)))
&& (p_lcb->sent_not_acked < p_lcb->link_xmit_quota))
#else
while ( (l2cb.controller_xmit_window != 0)
@@ -1207,8 +1243,8 @@
{
/* See if we can send anything for any channel */
#if (BLE_INCLUDED == TRUE)
- while ( ((l2cb.controller_xmit_window != 0 && !p_lcb->is_ble_link) ||
- (l2cb.controller_le_xmit_window != 0 && p_lcb->is_ble_link))
+ while ( ((l2cb.controller_xmit_window != 0 && (p_lcb->transport == BT_TRANSPORT_BR_EDR)) ||
+ (l2cb.controller_le_xmit_window != 0 && (p_lcb->transport == BT_TRANSPORT_LE)))
&& (p_lcb->sent_not_acked < p_lcb->link_xmit_quota))
#else
while ((l2cb.controller_xmit_window != 0) && (p_lcb->sent_not_acked < p_lcb->link_xmit_quota))
@@ -1245,21 +1281,29 @@
UINT16 num_segs;
UINT16 xmit_window, acl_data_size;
+ if ((p_buf->len <= btu_cb.hcit_acl_pkt_size
#if (BLE_INCLUDED == TRUE)
- if ((!p_lcb->is_ble_link && (p_buf->len <= btu_cb.hcit_acl_pkt_size)) ||
- (p_lcb->is_ble_link && (p_buf->len <= btu_cb.hcit_ble_acl_pkt_size)))
+ && (p_lcb->transport == BT_TRANSPORT_BR_EDR)) ||
+ ((p_lcb->transport == BT_TRANSPORT_LE) && (p_buf->len <= btu_cb.hcit_ble_acl_pkt_size))
#else
- if (p_buf->len <= btu_cb.hcit_acl_pkt_size)
+ )
#endif
+ )
{
if (p_lcb->link_xmit_quota == 0)
- l2cb.round_robin_unacked++;
-
+ {
+#if (BLE_INCLUDED == TRUE)
+ if (p_lcb->transport == BT_TRANSPORT_LE)
+ l2cb.ble_round_robin_unacked++;
+ else
+#endif
+ l2cb.round_robin_unacked++;
+ }
p_lcb->sent_not_acked++;
p_buf->layer_specific = 0;
#if (BLE_INCLUDED == TRUE)
- if (p_lcb->is_ble_link)
+ if (p_lcb->transport == BT_TRANSPORT_LE)
{
l2cb.controller_le_xmit_window--;
L2C_LINK_SEND_BLE_ACL_DATA (p_buf);
@@ -1274,7 +1318,7 @@
else
{
#if BLE_INCLUDED == TRUE
- if (p_lcb->is_ble_link)
+ if (p_lcb->transport == BT_TRANSPORT_LE)
{
acl_data_size = btu_cb.hcit_ble_acl_data_size;
xmit_window = l2cb.controller_le_xmit_window;
@@ -1313,21 +1357,24 @@
p_buf->layer_specific = num_segs;
#if BLE_INCLUDED == TRUE
- if (p_lcb->is_ble_link)
+ if (p_lcb->transport == BT_TRANSPORT_LE)
{
l2cb.controller_le_xmit_window -= num_segs;
-
+ if (p_lcb->link_xmit_quota == 0)
+ l2cb.ble_round_robin_unacked += num_segs;
}
else
#endif
- l2cb.controller_xmit_window -= num_segs;
+ {
+ l2cb.controller_xmit_window -= num_segs;
- if (p_lcb->link_xmit_quota == 0)
- l2cb.round_robin_unacked += num_segs;
+ if (p_lcb->link_xmit_quota == 0)
+ l2cb.round_robin_unacked += num_segs;
+ }
p_lcb->sent_not_acked += num_segs;
#if BLE_INCLUDED == TRUE
- if (p_lcb->is_ble_link)
+ if (p_lcb->transport == BT_TRANSPORT_LE)
{
L2C_LINK_SEND_BLE_ACL_DATA(p_buf);
}
@@ -1340,18 +1387,18 @@
#if (L2CAP_HCI_FLOW_CONTROL_DEBUG == TRUE)
#if (BLE_INCLUDED == TRUE)
- if (p_lcb->is_ble_link)
+ if (p_lcb->transport == BT_TRANSPORT_LE)
{
- L2CAP_TRACE_DEBUG6 ("TotalWin=%d,Hndl=0x%x,Quota=%d,Unack=%d,RRQuota=%d,RRUnack=%d",
+ L2CAP_TRACE_DEBUG ("TotalWin=%d,Hndl=0x%x,Quota=%d,Unack=%d,RRQuota=%d,RRUnack=%d",
l2cb.controller_le_xmit_window,
p_lcb->handle,
p_lcb->link_xmit_quota, p_lcb->sent_not_acked,
- l2cb.round_robin_quota, l2cb.round_robin_unacked);
+ l2cb.ble_round_robin_quota, l2cb.ble_round_robin_unacked);
}
else
#endif
{
- L2CAP_TRACE_DEBUG6 ("TotalWin=%d,Hndl=0x%x,Quota=%d,Unack=%d,RRQuota=%d,RRUnack=%d",
+ L2CAP_TRACE_DEBUG ("TotalWin=%d,Hndl=0x%x,Quota=%d,Unack=%d,RRQuota=%d,RRUnack=%d",
l2cb.controller_xmit_window,
p_lcb->handle,
p_lcb->link_xmit_quota, p_lcb->sent_not_acked,
@@ -1393,18 +1440,16 @@
/* Originally designed for [3DSG] */
if((p_lcb != NULL) && (p_lcb->p_nocp_cb))
{
- L2CAP_TRACE_DEBUG0 ("L2CAP - calling NoCP callback");
+ L2CAP_TRACE_DEBUG ("L2CAP - calling NoCP callback");
(*p_lcb->p_nocp_cb)(p_lcb->remote_bd_addr);
}
if (p_lcb)
{
#if (BLE_INCLUDED == TRUE)
- if (p_lcb->is_ble_link)
- {
- l2cb.controller_le_xmit_window += num_sent;
- }
- else
+ if (p_lcb && (p_lcb->transport == BT_TRANSPORT_LE))
+ l2cb.controller_le_xmit_window += num_sent;
+ else
#endif
{
/* Maintain the total window to the controller */
@@ -1413,11 +1458,24 @@
/* If doing round-robin, adjust communal counts */
if (p_lcb->link_xmit_quota == 0)
{
- /* Don't go negative */
- if (l2cb.round_robin_unacked > num_sent)
- l2cb.round_robin_unacked -= num_sent;
+#if BLE_INCLUDED == TRUE
+ if (p_lcb->transport == BT_TRANSPORT_LE)
+ {
+ /* Don't go negative */
+ if (l2cb.ble_round_robin_unacked > num_sent)
+ l2cb.ble_round_robin_unacked -= num_sent;
+ else
+ l2cb.ble_round_robin_unacked = 0;
+ }
else
- l2cb.round_robin_unacked = 0;
+#endif
+ {
+ /* Don't go negative */
+ if (l2cb.round_robin_unacked > num_sent)
+ l2cb.round_robin_unacked -= num_sent;
+ else
+ l2cb.round_robin_unacked = 0;
+ }
}
/* Don't go negative */
@@ -1435,23 +1493,32 @@
{
l2c_link_check_send_pkts (NULL, NULL, NULL);
}
+#if BLE_INCLUDED == TRUE
+ if ((p_lcb->transport == BT_TRANSPORT_LE)
+ && (p_lcb->acl_priority == L2CAP_PRIORITY_HIGH)
+ && ((l2cb.ble_check_round_robin)
+ && (l2cb.ble_round_robin_unacked < l2cb.ble_round_robin_quota)))
+ {
+ l2c_link_check_send_pkts (NULL, NULL, NULL);
+ }
+#endif
}
#if (L2CAP_HCI_FLOW_CONTROL_DEBUG == TRUE)
if (p_lcb)
{
#if (BLE_INCLUDED == TRUE)
- if (p_lcb->is_ble_link)
+ if (p_lcb->transport == BT_TRANSPORT_LE)
{
- L2CAP_TRACE_DEBUG5 ("TotalWin=%d,LinkUnack(0x%x)=%d,RRCheck=%d,RRUnack=%d",
+ L2CAP_TRACE_DEBUG ("TotalWin=%d,LinkUnack(0x%x)=%d,RRCheck=%d,RRUnack=%d",
l2cb.controller_le_xmit_window,
p_lcb->handle, p_lcb->sent_not_acked,
- l2cb.check_round_robin, l2cb.round_robin_unacked);
+ l2cb.ble_check_round_robin, l2cb.ble_round_robin_unacked);
}
else
#endif
{
- L2CAP_TRACE_DEBUG5 ("TotalWin=%d,LinkUnack(0x%x)=%d,RRCheck=%d,RRUnack=%d",
+ L2CAP_TRACE_DEBUG ("TotalWin=%d,LinkUnack(0x%x)=%d,RRCheck=%d,RRUnack=%d",
l2cb.controller_xmit_window,
p_lcb->handle, p_lcb->sent_not_acked,
l2cb.check_round_robin, l2cb.round_robin_unacked);
@@ -1461,13 +1528,13 @@
else
{
#if (BLE_INCLUDED == TRUE)
- L2CAP_TRACE_DEBUG5 ("TotalWin=%d LE_Win: %d, Handle=0x%x, RRCheck=%d, RRUnack=%d",
+ L2CAP_TRACE_DEBUG ("TotalWin=%d LE_Win: %d, Handle=0x%x, RRCheck=%d, RRUnack=%d",
l2cb.controller_xmit_window,
l2cb.controller_le_xmit_window,
handle,
- l2cb.check_round_robin, l2cb.round_robin_unacked);
+ l2cb.ble_check_round_robin, l2cb.ble_round_robin_unacked);
#else
- L2CAP_TRACE_DEBUG4 ("TotalWin=%d Handle=0x%x RRCheck=%d RRUnack=%d",
+ L2CAP_TRACE_DEBUG ("TotalWin=%d Handle=0x%x RRCheck=%d RRUnack=%d",
l2cb.controller_xmit_window,
handle,
l2cb.check_round_robin, l2cb.round_robin_unacked);
@@ -1543,7 +1610,7 @@
/* a packet, it is incomplete. Drop it. */
if (p_lcb->p_hcit_rcv_acl)
{
- L2CAP_TRACE_WARNING0 ("L2CAP - dropping incomplete pkt");
+ L2CAP_TRACE_WARNING ("L2CAP - dropping incomplete pkt");
GKI_freebuf (p_lcb->p_hcit_rcv_acl);
p_lcb->p_hcit_rcv_acl = NULL;
}
@@ -1600,7 +1667,7 @@
else
{
/* Packet too long. Drop the base packet */
- L2CAP_TRACE_WARNING3 ("L2CAP - dropping too long pkt BufLen: %d total_len: %d hci_len: %d",
+ L2CAP_TRACE_WARNING ("L2CAP - dropping too long pkt BufLen: %d total_len: %d hci_len: %d",
p_lcb->p_hcit_rcv_acl->len, total_len, hci_len);
GKI_freebuf (p_lcb->p_hcit_rcv_acl);
@@ -1687,7 +1754,7 @@
/* Find the LCB based on the handle */
if ((p_lcb = l2cu_find_lcb_by_handle (handle)) == NULL)
{
- L2CAP_TRACE_WARNING1 ("L2CAP - rcvd segment complete, unknown handle: %d", handle);
+ L2CAP_TRACE_WARNING ("L2CAP - rcvd segment complete, unknown handle: %d", handle);
GKI_freebuf (p_msg);
return;
}
diff --git a/stack/l2cap/l2c_main.c b/stack/l2cap/l2c_main.c
index 49dd811..5f17e91 100644
--- a/stack/l2cap/l2c_main.c
+++ b/stack/l2cap/l2c_main.c
@@ -67,7 +67,7 @@
/* Ensure we have enough space in the buffer for the L2CAP and HCI headers */
if (p_buf->offset < L2CAP_BCST_MIN_OFFSET)
{
- L2CAP_TRACE_ERROR1 ("L2CAP - cannot send buffer, offset: %d", p_buf->offset);
+ L2CAP_TRACE_ERROR ("L2CAP - cannot send buffer, offset: %d", p_buf->offset);
GKI_freebuf (p_buf);
return;
}
@@ -150,7 +150,7 @@
if ((p_msg->layer_specific == 0) && (rcv_cid == L2CAP_SIGNALLING_CID)
&& (cmd_code == L2CAP_CMD_INFO_REQ || cmd_code == L2CAP_CMD_CONN_REQ))
{
- L2CAP_TRACE_WARNING5 ("L2CAP - holding ACL for unknown handle:%d ls:%d cid:%d opcode:%d cur count:%d",
+ L2CAP_TRACE_WARNING ("L2CAP - holding ACL for unknown handle:%d ls:%d cid:%d opcode:%d cur count:%d",
handle, p_msg->layer_specific, rcv_cid, cmd_code,
l2cb.rcv_hold_q.count);
p_msg->layer_specific = 2;
@@ -163,7 +163,7 @@
}
else
{
- L2CAP_TRACE_ERROR5 ("L2CAP - rcvd ACL for unknown handle:%d ls:%d cid:%d opcode:%d cur count:%d",
+ L2CAP_TRACE_ERROR ("L2CAP - rcvd ACL for unknown handle:%d ls:%d cid:%d opcode:%d cur count:%d",
handle, p_msg->layer_specific, rcv_cid, cmd_code, l2cb.rcv_hold_q.count);
}
GKI_freebuf (p_msg);
@@ -172,7 +172,7 @@
}
else
{
- L2CAP_TRACE_WARNING1 ("L2CAP - expected pkt start or complete, got: %d", pkt_type);
+ L2CAP_TRACE_WARNING ("L2CAP - expected pkt start or complete, got: %d", pkt_type);
GKI_freebuf (p_msg);
return;
}
@@ -196,7 +196,7 @@
{
if ((p_ccb = l2cu_find_ccb_by_cid (p_lcb, rcv_cid)) == NULL)
{
- L2CAP_TRACE_WARNING1 ("L2CAP - unknown CID: 0x%04x", rcv_cid);
+ L2CAP_TRACE_WARNING ("L2CAP - unknown CID: 0x%04x", rcv_cid);
GKI_freebuf (p_msg);
return;
}
@@ -209,14 +209,14 @@
}
else
{
- L2CAP_TRACE_WARNING0 ("L2CAP - got incorrect hci header" );
+ L2CAP_TRACE_WARNING ("L2CAP - got incorrect hci header" );
GKI_freebuf (p_msg);
return;
}
if (l2cap_len != p_msg->len)
{
- L2CAP_TRACE_WARNING2 ("L2CAP - bad length in pkt. Exp: %d Act: %d",
+ L2CAP_TRACE_WARNING ("L2CAP - bad length in pkt. Exp: %d Act: %d",
l2cap_len, p_msg->len);
GKI_freebuf (p_msg);
@@ -233,7 +233,7 @@
{
/* process_connectionless_data (p_lcb); */
STREAM_TO_UINT16 (psm, p);
- L2CAP_TRACE_DEBUG1( "GOT CONNECTIONLESS DATA PSM:%d", psm ) ;
+ L2CAP_TRACE_DEBUG( "GOT CONNECTIONLESS DATA PSM:%d", psm ) ;
#if (TCS_BCST_SETUP_INCLUDED == TRUE && TCS_INCLUDED == TRUE)
if (psm == TCS_PSM_INTERCOM || psm == TCS_PSM_CORDLESS)
{
@@ -267,8 +267,12 @@
(l2cb.fixed_reg[rcv_cid - L2CAP_FIRST_FIXED_CHNL].pL2CA_FixedData_Cb != NULL) )
{
/* If no CCB for this channel, allocate one */
- if (l2cu_initialize_fixed_ccb (p_lcb, rcv_cid, &l2cb.fixed_reg[rcv_cid - L2CAP_FIRST_FIXED_CHNL].fixed_chnl_opts))
+ if (p_lcb && l2cu_initialize_fixed_ccb (p_lcb, rcv_cid,
+ &l2cb.fixed_reg[rcv_cid - L2CAP_FIRST_FIXED_CHNL].fixed_chnl_opts))
{
+#if(defined BLE_INCLUDED && (BLE_INCLUDED == TRUE))
+ l2cble_notify_le_connection(p_lcb->remote_bd_addr);
+#endif
p_ccb = p_lcb->p_fixed_ccbs[rcv_cid - L2CAP_FIRST_FIXED_CHNL];
if (p_ccb->peer_cfg.fcr.mode != L2CAP_FCR_BASIC_MODE)
@@ -320,17 +324,29 @@
tL2CAP_CFG_INFO cfg_info;
UINT16 rej_reason, rej_mtu, lcid, rcid, info_type;
tL2C_CCB *p_ccb;
- tL2C_RCB *p_rcb;
- BOOLEAN cfg_rej;
+ tL2C_RCB *p_rcb, *p_rcb2;
+ BOOLEAN cfg_rej, pkt_size_rej = FALSE;
UINT16 cfg_rej_len, cmd_len;
UINT16 result;
tL2C_CONN_INFO ci;
#if (defined BLE_INCLUDED && BLE_INCLUDED == TRUE)
/* if l2cap command received in CID 1 on top of an LE link, ignore this command */
- if (p_lcb->is_ble_link)
+ if (p_lcb->transport == BT_TRANSPORT_LE)
return;
#endif
+
+ /* Reject the packet if it exceeds the default Signalling Channel MTU */
+ if (pkt_len > L2CAP_DEFAULT_MTU)
+ {
+ /* Core Spec requires a single response to the first command found in a multi-command
+ ** L2cap packet. If only responses in the packet, then it will be ignored.
+ ** Here we simply mark the bad packet and decide which cmd ID to reject later
+ */
+ pkt_size_rej = TRUE;
+ L2CAP_TRACE_ERROR ("L2CAP SIG MTU Pkt Len Exceeded (672) -> pkt_len: %d", pkt_len);
+ }
+
p_next_cmd = p;
p_pkt_end = p + pkt_len;
@@ -350,11 +366,23 @@
/* Check command length does not exceed packet length */
if ((p_next_cmd = p + cmd_len) > p_pkt_end)
{
- L2CAP_TRACE_WARNING3 ("Command len bad pkt_len: %d cmd_len: %d code: %d",
+ L2CAP_TRACE_WARNING ("Command len bad pkt_len: %d cmd_len: %d code: %d",
pkt_len, cmd_len, cmd_code);
break;
}
+ L2CAP_TRACE_DEBUG ("cmd_code: %d, id:%d, cmd_len:%d", cmd_code, id, cmd_len);
+
+ /* Bad L2CAP packet length, look or cmd to reject */
+ if (pkt_size_rej)
+ {
+ /* If command found rejected it and we're done, otherwise keep looking */
+ if (l2c_is_cmd_rejected(cmd_code, id, p_lcb))
+ return;
+ else
+ continue; /* Look for next cmd/response in current packet */
+ }
+
switch (cmd_code)
{
case L2CAP_CMD_REJECT:
@@ -365,14 +393,14 @@
/* What to do with the MTU reject ? We have negotiated an MTU. For now */
/* we will ignore it and let a higher protocol timeout take care of it */
- L2CAP_TRACE_WARNING2 ("L2CAP - MTU rej Handle: %d MTU: %d", p_lcb->handle, rej_mtu);
+ L2CAP_TRACE_WARNING ("L2CAP - MTU rej Handle: %d MTU: %d", p_lcb->handle, rej_mtu);
}
if (rej_reason == L2CAP_CMD_REJ_INVALID_CID)
{
STREAM_TO_UINT16 (rcid, p);
STREAM_TO_UINT16 (lcid, p);
- L2CAP_TRACE_WARNING2 ("L2CAP - rej with CID invalid, LCID: 0x%04x RCID: 0x%04x", lcid, rcid);
+ L2CAP_TRACE_WARNING ("L2CAP - rej with CID invalid, LCID: 0x%04x RCID: 0x%04x", lcid, rcid);
/* Remote CID invalid. Treat as a disconnect */
if (((p_ccb = l2cu_find_ccb_by_cid (p_lcb, lcid)) != NULL)
@@ -405,7 +433,7 @@
STREAM_TO_UINT16 (rcid, p);
if ((p_rcb = l2cu_find_rcb_by_psm (con_info.psm)) == NULL)
{
- L2CAP_TRACE_WARNING1 ("L2CAP - rcvd conn req for unknown PSM: %d", con_info.psm);
+ L2CAP_TRACE_WARNING ("L2CAP - rcvd conn req for unknown PSM: %d", con_info.psm);
l2cu_reject_connection (p_lcb, rcid, id, L2CAP_CONN_NO_PSM);
break;
}
@@ -413,14 +441,14 @@
{
if (!p_rcb->api.pL2CA_ConnectInd_Cb)
{
- L2CAP_TRACE_WARNING1 ("L2CAP - rcvd conn req for outgoing-only connection PSM: %d", con_info.psm);
+ L2CAP_TRACE_WARNING ("L2CAP - rcvd conn req for outgoing-only connection PSM: %d", con_info.psm);
l2cu_reject_connection (p_lcb, rcid, id, L2CAP_CONN_NO_PSM);
break;
}
}
if ((p_ccb = l2cu_allocate_ccb (p_lcb, 0)) == NULL)
{
- L2CAP_TRACE_ERROR0 ("L2CAP - unable to allocate CCB");
+ L2CAP_TRACE_ERROR ("L2CAP - unable to allocate CCB");
l2cu_reject_connection (p_lcb, rcid, id, L2CAP_CONN_NO_RESOURCES);
break;
}
@@ -439,13 +467,13 @@
if ((p_ccb = l2cu_find_ccb_by_cid (p_lcb, lcid)) == NULL)
{
- L2CAP_TRACE_WARNING2 ("L2CAP - no CCB for conn rsp, LCID: %d RCID: %d",
+ L2CAP_TRACE_WARNING ("L2CAP - no CCB for conn rsp, LCID: %d RCID: %d",
lcid, con_info.remote_cid);
break;
}
if (p_ccb->local_id != id)
{
- L2CAP_TRACE_WARNING2 ("L2CAP - con rsp - bad ID. Exp: %d Got: %d",
+ L2CAP_TRACE_WARNING ("L2CAP - con rsp - bad ID. Exp: %d Got: %d",
p_ccb->local_id, id);
break;
}
@@ -633,7 +661,7 @@
{
if (p_ccb->local_id != id)
{
- L2CAP_TRACE_WARNING2 ("L2CAP - cfg rsp - bad ID. Exp: %d Got: %d",
+ L2CAP_TRACE_WARNING ("L2CAP - cfg rsp - bad ID. Exp: %d Got: %d",
p_ccb->local_id, id);
break;
}
@@ -644,7 +672,7 @@
}
else
{
- L2CAP_TRACE_WARNING1 ("L2CAP - rcvd cfg rsp for unknown CID: 0x%04x", lcid);
+ L2CAP_TRACE_WARNING ("L2CAP - rcvd cfg rsp for unknown CID: 0x%04x", lcid);
}
break;
@@ -762,7 +790,7 @@
break;
default:
- L2CAP_TRACE_WARNING1 ("L2CAP - bad cmd code: %d", cmd_code);
+ L2CAP_TRACE_WARNING ("L2CAP - bad cmd code: %d", cmd_code);
l2cu_send_peer_cmd_reject (p_lcb, L2CAP_CMD_REJ_NOT_UNDERSTOOD, id, 0, 0);
return;
}
@@ -791,11 +819,11 @@
if (!timed_out)
{
btu_stop_timer(&l2cb.rcv_hold_tle);
- L2CAP_TRACE_WARNING0("L2CAP HOLD CONTINUE");
+ L2CAP_TRACE_WARNING("L2CAP HOLD CONTINUE");
}
else
{
- L2CAP_TRACE_WARNING0("L2CAP HOLD TIMEOUT");
+ L2CAP_TRACE_WARNING("L2CAP HOLD TIMEOUT");
}
/* Update the timeouts in the hold queue */
@@ -910,7 +938,6 @@
case BTU_TTYPE_L2CAP_INFO:
l2c_info_timeout((tL2C_LCB *)p_tle->param);
break;
-
}
}
@@ -932,7 +959,7 @@
/* Find the channel control block. We don't know the link it is on. */
if ((p_ccb = l2cu_find_ccb_by_cid (NULL, cid)) == NULL)
{
- L2CAP_TRACE_WARNING1 ("L2CAP - no CCB for L2CA_DataWrite, CID: %d", cid);
+ L2CAP_TRACE_WARNING ("L2CAP - no CCB for L2CA_DataWrite, CID: %d", cid);
GKI_freebuf (p_data);
return (L2CAP_DW_FAILED);
}
@@ -941,7 +968,7 @@
bigger than mtu size of peer is a violation of protocol */
if (p_data->len > p_ccb->peer_cfg.mtu)
{
- L2CAP_TRACE_WARNING1 ("L2CAP - CID: 0x%04x cannot send message bigger than peer's mtu size", cid);
+ L2CAP_TRACE_WARNING ("L2CAP - CID: 0x%04x cannot send message bigger than peer's mtu size", cid);
GKI_freebuf (p_data);
return (L2CAP_DW_FAILED);
}
@@ -953,7 +980,7 @@
/* If already congested, do not accept any more packets */
if (p_ccb->cong_sent)
{
- L2CAP_TRACE_ERROR3 ("L2CAP - CID: 0x%04x cannot send, already congested xmit_hold_q.count: %u buff_quota: %u",
+ L2CAP_TRACE_ERROR ("L2CAP - CID: 0x%04x cannot send, already congested xmit_hold_q.count: %u buff_quota: %u",
p_ccb->local_cid, p_ccb->xmit_hold_q.count, p_ccb->buff_quota);
GKI_freebuf (p_data);
diff --git a/stack/l2cap/l2c_ucd.c b/stack/l2cap/l2c_ucd.c
index 4dfc804..2e5f00e 100644
--- a/stack/l2cap/l2c_ucd.c
+++ b/stack/l2cap/l2c_ucd.c
@@ -53,7 +53,7 @@
tL2C_RCB *p_rcb = &l2cb.rcb_pool[0];
UINT16 xx;
- L2CAP_TRACE_DEBUG0 ("L2CAP - l2c_ucd_discover_cback");
+ L2CAP_TRACE_DEBUG ("L2CAP - l2c_ucd_discover_cback");
for (xx = 0; xx < MAX_L2CAP_CLIENTS; xx++, p_rcb++)
{
@@ -93,7 +93,7 @@
UINT16 psm;
tL2C_RCB *p_rcb;
- L2CAP_TRACE_DEBUG0 ("L2CAP - l2c_ucd_data_ind_cback");
+ L2CAP_TRACE_DEBUG ("L2CAP - l2c_ucd_data_ind_cback");
p = (UINT8 *)(p_buf + 1) + p_buf->offset;
STREAM_TO_UINT16(psm, p)
@@ -103,7 +103,7 @@
if ((p_rcb = l2cu_find_rcb_by_psm (psm)) == NULL)
{
- L2CAP_TRACE_ERROR1 ("L2CAP - no RCB for l2c_ucd_data_ind_cback, PSM: 0x%04x", psm);
+ L2CAP_TRACE_ERROR ("L2CAP - no RCB for l2c_ucd_data_ind_cback, PSM: 0x%04x", psm);
GKI_freebuf (p_buf);
}
else
@@ -126,7 +126,7 @@
tL2C_RCB *p_rcb = &l2cb.rcb_pool[0];
UINT16 xx;
- L2CAP_TRACE_DEBUG0 ("L2CAP - l2c_ucd_congestion_status_cback");
+ L2CAP_TRACE_DEBUG ("L2CAP - l2c_ucd_congestion_status_cback");
for (xx = 0; xx < MAX_L2CAP_CLIENTS; xx++, p_rcb++)
{
@@ -135,7 +135,7 @@
{
if ( p_rcb->ucd.cb_info.pL2CA_UCD_Congestion_Status_Cb )
{
- L2CAP_TRACE_DEBUG4 ("L2CAP - Calling UCDCongestionStatus_Cb (%d), PSM=0x%04x, BDA: %08x%04x,",
+ L2CAP_TRACE_DEBUG ("L2CAP - Calling UCDCongestionStatus_Cb (%d), PSM=0x%04x, BDA: %08x%04x,",
is_congested, p_rcb->psm,
(rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3],
(rem_bda[4]<<8)+rem_bda[5]);
@@ -203,18 +203,18 @@
{
tL2C_RCB *p_rcb;
- L2CAP_TRACE_API1 ("L2CA_UcdRegister() PSM: 0x%04x", psm);
+ L2CAP_TRACE_API ("L2CA_UcdRegister() PSM: 0x%04x", psm);
if ((!p_cb_info->pL2CA_UCD_Discover_Cb)
|| (!p_cb_info->pL2CA_UCD_Data_Cb))
{
- L2CAP_TRACE_ERROR1 ("L2CAP - no callback registering PSM(0x%04x) on UCD", psm);
+ L2CAP_TRACE_ERROR ("L2CAP - no callback registering PSM(0x%04x) on UCD", psm);
return (FALSE);
}
if ((p_rcb = l2cu_find_rcb_by_psm (psm)) == NULL)
{
- L2CAP_TRACE_ERROR1 ("L2CAP - no RCB for L2CA_UcdRegister, PSM: 0x%04x", psm);
+ L2CAP_TRACE_ERROR ("L2CAP - no RCB for L2CA_UcdRegister, PSM: 0x%04x", psm);
return (FALSE);
}
@@ -226,7 +226,7 @@
{
if ((p_rcb = l2cu_allocate_rcb (L2C_UCD_RCB_ID)) == NULL)
{
- L2CAP_TRACE_ERROR0 ("L2CAP - no RCB available for L2CA_UcdRegister");
+ L2CAP_TRACE_ERROR ("L2CAP - no RCB available for L2CA_UcdRegister");
return (FALSE);
}
else
@@ -268,11 +268,11 @@
tL2C_RCB *p_rcb;
UINT16 xx;
- L2CAP_TRACE_API1 ("L2CA_UcdDeregister() PSM: 0x%04x", psm);
+ L2CAP_TRACE_API ("L2CA_UcdDeregister() PSM: 0x%04x", psm);
if ((p_rcb = l2cu_find_rcb_by_psm (psm)) == NULL)
{
- L2CAP_TRACE_ERROR1 ("L2CAP - no RCB for L2CA_UcdDeregister, PSM: 0x%04x", psm);
+ L2CAP_TRACE_ERROR ("L2CAP - no RCB for L2CA_UcdDeregister, PSM: 0x%04x", psm);
return (FALSE);
}
@@ -329,7 +329,7 @@
tL2C_CCB *p_ccb;
tL2C_RCB *p_rcb;
- L2CAP_TRACE_API4 ("L2CA_UcdDiscover() PSM: 0x%04x BDA: %08x%04x, InfoType=0x%02x", psm,
+ L2CAP_TRACE_API ("L2CA_UcdDiscover() PSM: 0x%04x BDA: %08x%04x, InfoType=0x%02x", psm,
(rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3],
(rem_bda[4]<<8)+rem_bda[5], info_type);
@@ -337,13 +337,13 @@
if (((p_rcb = l2cu_find_rcb_by_psm (psm)) == NULL)
||( p_rcb->ucd.state == L2C_UCD_STATE_UNUSED ))
{
- L2CAP_TRACE_WARNING1 ("L2CAP - no RCB for L2CA_UcdDiscover, PSM: 0x%04x", psm);
+ L2CAP_TRACE_WARNING ("L2CAP - no RCB for L2CA_UcdDiscover, PSM: 0x%04x", psm);
return (FALSE);
}
/* First, see if we already have a link to the remote */
/* then find the channel control block for UCD. */
- if (((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda)) == NULL)
+ if (((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, BT_TRANSPORT_BR_EDR)) == NULL)
||((p_ccb = l2cu_find_ccb_by_cid (p_lcb, L2CAP_CONNECTIONLESS_CID)) == NULL))
{
if ( l2c_ucd_connect (rem_bda) == FALSE )
@@ -396,7 +396,7 @@
tL2C_RCB *p_rcb;
UINT8 *p;
- L2CAP_TRACE_API3 ("L2CA_UcdDataWrite() PSM: 0x%04x BDA: %08x%04x", psm,
+ L2CAP_TRACE_API ("L2CA_UcdDataWrite() PSM: 0x%04x BDA: %08x%04x", psm,
(rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3],
(rem_bda[4]<<8)+rem_bda[5]);
@@ -404,14 +404,14 @@
if (((p_rcb = l2cu_find_rcb_by_psm (psm)) == NULL)
||( p_rcb->ucd.state == L2C_UCD_STATE_UNUSED ))
{
- L2CAP_TRACE_WARNING1 ("L2CAP - no RCB for L2CA_UcdDataWrite, PSM: 0x%04x", psm);
+ L2CAP_TRACE_WARNING ("L2CAP - no RCB for L2CA_UcdDataWrite, PSM: 0x%04x", psm);
GKI_freebuf (p_buf);
return (L2CAP_DW_FAILED);
}
/* First, see if we already have a link to the remote */
/* then find the channel control block for UCD */
- if (((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda)) == NULL)
+ if (((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, BT_TRANSPORT_BR_EDR)) == NULL)
||((p_ccb = l2cu_find_ccb_by_cid (p_lcb, L2CAP_CONNECTIONLESS_CID)) == NULL))
{
if ( l2c_ucd_connect (rem_bda) == FALSE )
@@ -421,7 +421,7 @@
}
/* If we still don't have lcb and ccb after connect attempt, then can't proceed */
- if (((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda)) == NULL)
+ if (((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, BT_TRANSPORT_BR_EDR)) == NULL)
|| ((p_ccb = l2cu_find_ccb_by_cid (p_lcb, L2CAP_CONNECTIONLESS_CID)) == NULL))
{
GKI_freebuf (p_buf);
@@ -439,7 +439,7 @@
/* UCD MTU check */
if ((p_lcb->ucd_mtu) && (p_buf->len > p_lcb->ucd_mtu))
{
- L2CAP_TRACE_WARNING1 ("L2CAP - Handle: 0x%04x UCD bigger than peer's UCD mtu size cannot be sent", p_lcb->handle);
+ L2CAP_TRACE_WARNING ("L2CAP - Handle: 0x%04x UCD bigger than peer's UCD mtu size cannot be sent", p_lcb->handle);
GKI_freebuf (p_buf);
return (L2CAP_DW_FAILED);
}
@@ -447,7 +447,7 @@
/* If already congested, do not accept any more packets */
if (p_ccb->cong_sent)
{
- L2CAP_TRACE_ERROR3 ("L2CAP - Handle: 0x%04x UCD cannot be sent, already congested count: %u buff_quota: %u",
+ L2CAP_TRACE_ERROR ("L2CAP - Handle: 0x%04x UCD cannot be sent, already congested count: %u buff_quota: %u",
p_lcb->handle,
(p_ccb->xmit_hold_q.count + p_lcb->ucd_out_sec_pending_q.count),
p_ccb->buff_quota);
@@ -484,16 +484,16 @@
tL2C_LCB *p_lcb;
tL2C_CCB *p_ccb;
- L2CAP_TRACE_API3 ("L2CA_UcdSetIdleTimeout() Timeout: 0x%04x BDA: %08x%04x", timeout,
+ L2CAP_TRACE_API ("L2CA_UcdSetIdleTimeout() Timeout: 0x%04x BDA: %08x%04x", timeout,
(rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3],
(rem_bda[4]<<8)+rem_bda[5]);
/* First, see if we already have a link to the remote */
/* then find the channel control block. */
- if (((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda)) == NULL)
+ if (((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, BT_TRANSPORT_BR_EDR)) == NULL)
||((p_ccb = l2cu_find_ccb_by_cid (p_lcb, L2CAP_CONNECTIONLESS_CID)) == NULL))
{
- L2CAP_TRACE_WARNING0 ("L2CAP - no UCD channel");
+ L2CAP_TRACE_WARNING ("L2CAP - no UCD channel");
return (FALSE);
}
else
@@ -517,20 +517,20 @@
tL2C_LCB *p_lcb;
tL2C_CCB *p_ccb;
- L2CAP_TRACE_API3 ("L2CA_UCDSetTxPriority() priority: 0x%02x BDA: %08x%04x", priority,
+ L2CAP_TRACE_API ("L2CA_UCDSetTxPriority() priority: 0x%02x BDA: %08x%04x", priority,
(rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3],
(rem_bda[4]<<8)+rem_bda[5]);
- if ((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda)) == NULL)
+ if ((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, BT_TRANSPORT_BR_EDR)) == NULL)
{
- L2CAP_TRACE_WARNING0 ("L2CAP - no LCB for L2CA_UCDSetTxPriority");
+ L2CAP_TRACE_WARNING ("L2CAP - no LCB for L2CA_UCDSetTxPriority");
return (FALSE);
}
/* Find the channel control block */
if ((p_ccb = l2cu_find_ccb_by_cid (p_lcb, L2CAP_CONNECTIONLESS_CID)) == NULL)
{
- L2CAP_TRACE_WARNING0 ("L2CAP - no CCB for L2CA_UCDSetTxPriority");
+ L2CAP_TRACE_WARNING ("L2CAP - no CCB for L2CA_UCDSetTxPriority");
return (FALSE);
}
@@ -557,25 +557,25 @@
tL2C_CCB *p_ccb;
tL2C_RCB *p_rcb;
- L2CAP_TRACE_DEBUG2 ("l2c_ucd_connect() BDA: %08x%04x",
+ L2CAP_TRACE_DEBUG ("l2c_ucd_connect() BDA: %08x%04x",
(rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3],
(rem_bda[4]<<8)+rem_bda[5]);
/* Fail if we have not established communications with the controller */
if (!BTM_IsDeviceUp())
{
- L2CAP_TRACE_WARNING0 ("l2c_ucd_connect - BTU not ready");
+ L2CAP_TRACE_WARNING ("l2c_ucd_connect - BTU not ready");
return (FALSE);
}
/* First, see if we already have a link to the remote */
- if ((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda)) == NULL)
+ if ((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, BT_TRANSPORT_BR_EDR)) == NULL)
{
/* No link. Get an LCB and start link establishment */
- if ( ((p_lcb = l2cu_allocate_lcb (rem_bda, FALSE)) == NULL)
- || (l2cu_create_conn(p_lcb) == FALSE) )
+ if ( ((p_lcb = l2cu_allocate_lcb (rem_bda, FALSE, BT_TRANSPORT_BR_EDR)) == NULL)
+ || (l2cu_create_conn(p_lcb, BT_TRANSPORT_BR_EDR) == FALSE) )
{
- L2CAP_TRACE_WARNING0 ("L2CAP - conn not started l2c_ucd_connect");
+ L2CAP_TRACE_WARNING ("L2CAP - conn not started l2c_ucd_connect");
return (FALSE);
}
}
@@ -583,7 +583,7 @@
{
if (!(p_lcb->peer_ext_fea & L2CAP_EXTFEA_UCD_RECEPTION))
{
- L2CAP_TRACE_WARNING0 ("L2CAP - UCD is not supported by peer, l2c_ucd_connect");
+ L2CAP_TRACE_WARNING ("L2CAP - UCD is not supported by peer, l2c_ucd_connect");
return (FALSE);
}
}
@@ -594,7 +594,7 @@
/* Allocate a channel control block */
if ((p_ccb = l2cu_allocate_ccb (p_lcb, 0)) == NULL)
{
- L2CAP_TRACE_WARNING0 ("L2CAP - no CCB for l2c_ucd_connect");
+ L2CAP_TRACE_WARNING ("L2CAP - no CCB for l2c_ucd_connect");
return (FALSE);
}
else
@@ -611,7 +611,7 @@
if ((p_rcb = l2cu_find_rcb_by_psm (L2C_UCD_RCB_ID)) == NULL)
{
- L2CAP_TRACE_WARNING0 ("L2CAP - no UCD registered, l2c_ucd_connect");
+ L2CAP_TRACE_WARNING ("L2CAP - no UCD registered, l2c_ucd_connect");
return (FALSE);
}
/* Save UCD registration info */
@@ -664,7 +664,7 @@
if (p_ccb == NULL)
{
- L2CAP_TRACE_ERROR0 ("L2CAP - NULL p_ccb in l2c_ucd_check_pending_info_req");
+ L2CAP_TRACE_ERROR ("L2CAP - NULL p_ccb in l2c_ucd_check_pending_info_req");
return (FALSE);
}
@@ -680,7 +680,7 @@
{
if (!(p_ccb->p_lcb->peer_ext_fea & L2CAP_EXTFEA_UCD_RECEPTION))
{
- L2CAP_TRACE_WARNING0 ("L2CAP - UCD is not supported by peer, l2c_ucd_check_pending_info_req");
+ L2CAP_TRACE_WARNING ("L2CAP - UCD is not supported by peer, l2c_ucd_check_pending_info_req");
l2c_ucd_delete_sec_pending_q(p_ccb->p_lcb);
l2cu_release_ccb (p_ccb);
@@ -914,7 +914,7 @@
/* Allocate a channel control block */
if ((p_ccb = l2cu_allocate_ccb (p_lcb, 0)) == NULL)
{
- L2CAP_TRACE_WARNING0 ("L2CAP - no CCB for UCD reception");
+ L2CAP_TRACE_WARNING ("L2CAP - no CCB for UCD reception");
GKI_freebuf (p_msg);
return TRUE;
}
diff --git a/stack/l2cap/l2c_utils.c b/stack/l2cap/l2c_utils.c
index 05d5e5d..77849ac 100644
--- a/stack/l2cap/l2c_utils.c
+++ b/stack/l2cap/l2c_utils.c
@@ -37,6 +37,7 @@
#include "btm_int.h"
#include "hcidefs.h"
#include "bd.h"
+#include "bt_utils.h"
/*******************************************************************************
**
@@ -47,7 +48,7 @@
** Returns LCB address or NULL if none found
**
*******************************************************************************/
-tL2C_LCB *l2cu_allocate_lcb (BD_ADDR p_bd_addr, BOOLEAN is_bonding)
+tL2C_LCB *l2cu_allocate_lcb (BD_ADDR p_bd_addr, BOOLEAN is_bonding, tBT_TRANSPORT transport)
{
int xx;
tL2C_LCB *p_lcb = &l2cb.lcb_pool[0];
@@ -69,10 +70,20 @@
p_lcb->idle_timeout = l2cb.idle_timeout;
p_lcb->id = 1; /* spec does not allow '0' */
p_lcb->is_bonding = is_bonding;
+#if (BLE_INCLUDED == TRUE)
+ p_lcb->transport = transport;
- l2cb.num_links_active++;
-
- l2c_link_adjust_allocation();
+ if (transport == BT_TRANSPORT_LE)
+ {
+ l2cb.num_ble_links_active++;
+ l2c_ble_link_adjust_allocation();
+ }
+ else
+#endif
+ {
+ l2cb.num_links_active++;
+ l2c_link_adjust_allocation();
+ }
return (p_lcb);
}
}
@@ -93,11 +104,11 @@
*******************************************************************************/
void l2cu_update_lcb_4_bonding (BD_ADDR p_bd_addr, BOOLEAN is_bonding)
{
- tL2C_LCB *p_lcb = l2cu_find_lcb_by_bd_addr (p_bd_addr);
+ tL2C_LCB *p_lcb = l2cu_find_lcb_by_bd_addr (p_bd_addr, BT_TRANSPORT_BR_EDR);
if (p_lcb)
{
- L2CAP_TRACE_DEBUG3 ("l2cu_update_lcb_4_bonding BDA: %08x%04x is_bonding: %d",
+ L2CAP_TRACE_DEBUG ("l2cu_update_lcb_4_bonding BDA: %08x%04x is_bonding: %d",
(p_bd_addr[0]<<24)+(p_bd_addr[1]<<16)+(p_bd_addr[2]<<8)+p_bd_addr[3],
(p_bd_addr[4]<<8)+p_bd_addr[5], is_bonding);
p_lcb->is_bonding = is_bonding;
@@ -133,14 +144,17 @@
}
#if BTM_SCO_INCLUDED == TRUE
- /* Release all SCO links */
- btm_remove_sco_links(p_lcb->remote_bd_addr);
+#if (BLE_INCLUDED == TRUE)
+ if (p_lcb->transport == BT_TRANSPORT_BR_EDR)
+#endif
+ /* Release all SCO links */
+ btm_remove_sco_links(p_lcb->remote_bd_addr);
#endif
if (p_lcb->sent_not_acked > 0)
{
#if (BLE_INCLUDED == TRUE)
- if (p_lcb->is_ble_link)
+ if (p_lcb->transport == BT_TRANSPORT_LE)
{
l2cb.controller_le_xmit_window += p_lcb->sent_not_acked;
if (l2cb.controller_le_xmit_window > l2cb.num_lm_ble_bufs)
@@ -160,7 +174,6 @@
}
#if (BLE_INCLUDED == TRUE)
- p_lcb->is_ble_link = FALSE;
l2cb.is_ble_connecting = FALSE;
#endif
@@ -174,11 +187,11 @@
{
l2cu_release_ccb (p_lcb->p_fixed_ccbs[xx]);
p_lcb->p_fixed_ccbs[xx] = NULL;
- (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(p_lcb->remote_bd_addr, FALSE, p_lcb->disc_reason);
+ (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(p_lcb->remote_bd_addr, FALSE, p_lcb->disc_reason, p_lcb->transport);
}
else if ( (p_lcb->peer_chnl_mask[0] & (1 << (xx + L2CAP_FIRST_FIXED_CHNL)))
&& (l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb != NULL) )
- (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(p_lcb->remote_bd_addr, FALSE, p_lcb->disc_reason);
+ (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(p_lcb->remote_bd_addr, FALSE, p_lcb->disc_reason, p_lcb->transport);
}
}
#endif
@@ -191,8 +204,11 @@
/* Tell BTM Acl management the link was removed */
if ((p_lcb->link_state == LST_CONNECTED) || (p_lcb->link_state == LST_DISCONNECTING))
- btm_acl_removed (p_lcb->remote_bd_addr);
-
+#if (BLE_INCLUDED == TRUE)
+ btm_acl_removed (p_lcb->remote_bd_addr, p_lcb->transport);
+#else
+ btm_acl_removed (p_lcb->remote_bd_addr, BT_TRANSPORT_BR_EDR);
+#endif
/* Release any held buffers */
while (p_lcb->link_xmit_data_q.p_first)
GKI_freebuf (GKI_dequeue (&p_lcb->link_xmit_data_q));
@@ -202,11 +218,23 @@
l2c_ucd_delete_sec_pending_q(p_lcb);
#endif
+#if BLE_INCLUDED == TRUE
/* Re-adjust flow control windows make sure it does not go negative */
- if (l2cb.num_links_active >= 1)
- l2cb.num_links_active--;
+ if (p_lcb->transport == BT_TRANSPORT_LE)
+ {
+ if (l2cb.num_ble_links_active >= 1)
+ l2cb.num_ble_links_active--;
- l2c_link_adjust_allocation();
+ l2c_ble_link_adjust_allocation();
+ }
+ else
+#endif
+ {
+ if (l2cb.num_links_active >= 1)
+ l2cb.num_links_active--;
+
+ l2c_link_adjust_allocation();
+ }
/* Check for ping outstanding */
if (p_lcb->p_echo_rsp_cb)
@@ -231,14 +259,18 @@
** Returns pointer to matched LCB, or NULL if no match
**
*******************************************************************************/
-tL2C_LCB *l2cu_find_lcb_by_bd_addr (BD_ADDR p_bd_addr)
+tL2C_LCB *l2cu_find_lcb_by_bd_addr (BD_ADDR p_bd_addr, tBT_TRANSPORT transport)
{
int xx;
tL2C_LCB *p_lcb = &l2cb.lcb_pool[0];
for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p_lcb++)
{
- if ((p_lcb->in_use) && (!memcmp (p_lcb->remote_bd_addr, p_bd_addr, BD_ADDR_LEN)))
+ if ((p_lcb->in_use) &&
+#if BLE_INCLUDED == TRUE
+ p_lcb->transport == transport &&
+#endif
+ (!memcmp (p_lcb->remote_bd_addr, p_bd_addr, BD_ADDR_LEN)))
{
return (p_lcb);
}
@@ -253,8 +285,6 @@
** Function l2cu_get_conn_role
**
** Description Determine the desired role (master or slave) of a link.
-** If it is the previous connected remote device, use the same
-** role as previous used role.
** If already got a slave link, this one must be a master. If
** already got at least 1 link where we are the master, make this
** also a master.
@@ -262,22 +292,46 @@
** Returns HCI_ROLE_MASTER or HCI_ROLE_SLAVE
**
*******************************************************************************/
-UINT8 l2cu_get_conn_role (BD_ADDR bd_addr)
+UINT8 l2cu_get_conn_role (tL2C_LCB *p_this_lcb)
{
- UINT8 i;
- for (i = 0; i < BTM_ROLE_DEVICE_NUM; i++) {
- if ((btm_cb.previous_connected_role[i] != BTM_ROLE_UNDEFINED) &&
- (!bdcmp(bd_addr, btm_cb.previous_connected_remote_addr[i]))) {
- L2CAP_TRACE_WARNING1 ("l2cu_get_conn_role %d",
- btm_cb.previous_connected_role[i]);
- return btm_cb.previous_connected_role[i];
- }
- }
return l2cb.desire_role;
}
/*******************************************************************************
**
+** Function l2c_is_cmd_rejected
+**
+** Description Checks if cmd_code is command or response
+** If a command it will be rejected per spec.
+** This function is used when a illegal packet length is detected
+**
+** Returns BOOLEAN - TRUE if cmd_code is a command and it is rejected,
+** FALSE if response code. (command not rejected)
+**
+*******************************************************************************/
+BOOLEAN l2c_is_cmd_rejected (UINT8 cmd_code, UINT8 id, tL2C_LCB *p_lcb)
+{
+ switch(cmd_code)
+ {
+ case L2CAP_CMD_CONN_REQ:
+ case L2CAP_CMD_CONFIG_REQ:
+ case L2CAP_CMD_DISC_REQ:
+ case L2CAP_CMD_ECHO_REQ:
+ case L2CAP_CMD_INFO_REQ:
+ case L2CAP_CMD_AMP_CONN_REQ:
+ case L2CAP_CMD_AMP_MOVE_REQ:
+ case L2CAP_CMD_BLE_UPDATE_REQ:
+ l2cu_send_peer_cmd_reject (p_lcb, L2CAP_CMD_REJ_MTU_EXCEEDED, id, L2CAP_DEFAULT_MTU, 0);
+ L2CAP_TRACE_WARNING ("Dumping first Command (%d)", cmd_code);
+ return TRUE;
+
+ default: /* Otherwise a response */
+ return FALSE;
+ }
+}
+
+/*******************************************************************************
+**
** Function l2cu_build_header
**
** Description Builds the L2CAP command packet header
@@ -292,7 +346,7 @@
if (!p_buf)
{
- L2CAP_TRACE_ERROR0 ("l2cu_build_header - no buffer");
+ L2CAP_TRACE_ERROR ("l2cu_build_header - no buffer");
return (NULL);
}
@@ -301,17 +355,26 @@
p = (UINT8 *)(p_buf + 1) + L2CAP_SEND_CMD_OFFSET;
/* Put in HCI header - handle + pkt boundary */
-#if (L2CAP_NON_FLUSHABLE_PB_INCLUDED == TRUE)
- UINT16_TO_STREAM (p, p_lcb->handle | l2cb.non_flushable_pbf);
-#else
- UINT16_TO_STREAM (p, (p_lcb->handle | (L2CAP_PKT_START << L2CAP_PKT_TYPE_SHIFT)));
+#if (BLE_INCLUDED == TRUE)
+ if (p_lcb->transport == BT_TRANSPORT_LE)
+ {
+ UINT16_TO_STREAM (p, (p_lcb->handle | (L2CAP_PKT_START_NON_FLUSHABLE << L2CAP_PKT_TYPE_SHIFT)));
+ }
+ else
#endif
+ {
+#if (L2CAP_NON_FLUSHABLE_PB_INCLUDED == TRUE)
+ UINT16_TO_STREAM (p, p_lcb->handle | l2cb.non_flushable_pbf);
+#else
+ UINT16_TO_STREAM (p, (p_lcb->handle | (L2CAP_PKT_START << L2CAP_PKT_TYPE_SHIFT)));
+#endif
+ }
UINT16_TO_STREAM (p, len + L2CAP_PKT_OVERHEAD + L2CAP_CMD_OVERHEAD);
UINT16_TO_STREAM (p, len + L2CAP_CMD_OVERHEAD);
#if (BLE_INCLUDED == TRUE)
- if (p_lcb->is_ble_link)
+ if (p_lcb->transport == BT_TRANSPORT_LE)
{
UINT16_TO_STREAM (p, L2CAP_BLE_SIGNALLING_CID);
}
@@ -374,7 +437,7 @@
if ((p_buf = l2cu_build_header (p_lcb, (UINT16) (L2CAP_CMD_REJECT_LEN + param_len), L2CAP_CMD_REJECT, rem_id)) == NULL )
{
- L2CAP_TRACE_WARNING0 ("L2CAP - no buffer cmd_rej");
+ L2CAP_TRACE_WARNING ("L2CAP - no buffer cmd_rej");
return;
}
@@ -417,7 +480,7 @@
if ((p_buf = l2cu_build_header (p_ccb->p_lcb, L2CAP_CONN_REQ_LEN, L2CAP_CMD_CONN_REQ,
p_ccb->local_id)) == NULL)
{
- L2CAP_TRACE_WARNING0 ("L2CAP - no buffer for conn_req");
+ L2CAP_TRACE_WARNING ("L2CAP - no buffer for conn_req");
return;
}
@@ -457,7 +520,7 @@
if ((p_buf=l2cu_build_header(p_ccb->p_lcb, L2CAP_CONN_RSP_LEN, L2CAP_CMD_CONN_RSP, p_ccb->remote_id)) == NULL)
{
- L2CAP_TRACE_WARNING0 ("L2CAP - no buffer for conn_rsp");
+ L2CAP_TRACE_WARNING ("L2CAP - no buffer for conn_rsp");
return;
}
@@ -491,7 +554,7 @@
if ((p_buf = l2cu_build_header(p_lcb, L2CAP_CONN_RSP_LEN, L2CAP_CMD_CONN_RSP, rem_id)) == NULL )
{
- L2CAP_TRACE_WARNING0 ("L2CAP - no buffer for conn_req");
+ L2CAP_TRACE_WARNING ("L2CAP - no buffer for conn_req");
return;
}
@@ -543,7 +606,7 @@
if ((p_buf = l2cu_build_header (p_ccb->p_lcb, (UINT16) (L2CAP_CONFIG_REQ_LEN + cfg_len),
L2CAP_CMD_CONFIG_REQ, p_ccb->local_id)) == NULL )
{
- L2CAP_TRACE_WARNING0 ("L2CAP - no buffer for conn_req");
+ L2CAP_TRACE_WARNING ("L2CAP - no buffer for conn_req");
return;
}
@@ -643,7 +706,7 @@
if ((p_buf = l2cu_build_header (p_ccb->p_lcb, (UINT16)(L2CAP_CONFIG_RSP_LEN + cfg_len),
L2CAP_CMD_CONFIG_RSP, p_ccb->remote_id)) == NULL )
{
- L2CAP_TRACE_WARNING0 ("L2CAP - no buffer for conn_req");
+ L2CAP_TRACE_WARNING ("L2CAP - no buffer for conn_req");
return;
}
@@ -717,14 +780,27 @@
*******************************************************************************/
void l2cu_send_peer_config_rej (tL2C_CCB *p_ccb, UINT8 *p_data, UINT16 data_len, UINT16 rej_len)
{
- BT_HDR *p_buf = (BT_HDR *)GKI_getpoolbuf (L2CAP_CMD_POOL_ID);
- UINT16 len, cfg_len;
+ BT_HDR *p_buf;
+ UINT16 len, cfg_len, buf_space, len1;
UINT8 *p, *p_hci_len, *p_data_end;
UINT8 cfg_code;
+ L2CAP_TRACE_DEBUG("l2cu_send_peer_config_rej: data_len=%d, rej_len=%d", data_len, rej_len);
+
+
+ len = BT_HDR_SIZE + HCI_DATA_PREAMBLE_SIZE + L2CAP_PKT_OVERHEAD + L2CAP_CMD_OVERHEAD + L2CAP_CONFIG_RSP_LEN;
+ len1 = 0xFFFF - len;
+ if (rej_len > len1)
+ {
+ L2CAP_TRACE_ERROR ("L2CAP - cfg_rej pkt size exceeds buffer design max limit.");
+ return;
+ }
+
+ p_buf = (BT_HDR *)GKI_getbuf (len + rej_len);
+
if (!p_buf)
{
- L2CAP_TRACE_ERROR0 ("L2CAP - no buffer for cfg_rej");
+ L2CAP_TRACE_ERROR ("L2CAP - no buffer for cfg_rej");
return;
}
@@ -761,6 +837,8 @@
UINT16_TO_STREAM (p, 0); /* Flags = 0 (no continuation) */
UINT16_TO_STREAM (p, L2CAP_CFG_UNKNOWN_OPTIONS);
+ buf_space = rej_len;
+
/* Now, put the rejected options */
p_data_end = p_data + data_len;
while (p_data < p_data_end)
@@ -784,8 +862,18 @@
{
if ((cfg_code & 0x80) == 0)
{
- memcpy(p, p_data, cfg_len + L2CAP_CFG_OPTION_OVERHEAD);
- p += cfg_len + L2CAP_CFG_OPTION_OVERHEAD;
+ if (buf_space >= (cfg_len + L2CAP_CFG_OPTION_OVERHEAD))
+ {
+ memcpy(p, p_data, cfg_len + L2CAP_CFG_OPTION_OVERHEAD);
+ p += cfg_len + L2CAP_CFG_OPTION_OVERHEAD;
+ buf_space -= (cfg_len + L2CAP_CFG_OPTION_OVERHEAD);
+ }
+ else
+ {
+ L2CAP_TRACE_WARNING("L2CAP - cfg_rej exceeds allocated buffer");
+ p_data = p_data_end; /* force loop exit */
+ break;
+ }
}
p_data += cfg_len + L2CAP_CFG_OPTION_OVERHEAD;
}
@@ -803,6 +891,9 @@
p_buf->len = len + 4;
+ L2CAP_TRACE_DEBUG ("L2CAP - cfg_rej pkt hci_len=%d, l2cap_len=%d",
+ len, (L2CAP_CMD_OVERHEAD+L2CAP_CONFIG_RSP_LEN+rej_len));
+
l2c_link_check_send_pkts (p_ccb->p_lcb, NULL, p_buf);
}
@@ -829,7 +920,7 @@
if ((p_buf = l2cu_build_header(p_ccb->p_lcb, L2CAP_DISC_REQ_LEN, L2CAP_CMD_DISC_REQ, p_ccb->local_id)) == NULL)
{
- L2CAP_TRACE_WARNING0 ("L2CAP - no buffer for disc_req");
+ L2CAP_TRACE_WARNING ("L2CAP - no buffer for disc_req");
return;
}
@@ -877,7 +968,7 @@
if ((p_buf=l2cu_build_header(p_lcb, L2CAP_DISC_RSP_LEN, L2CAP_CMD_DISC_RSP, remote_id)) == NULL)
{
- L2CAP_TRACE_WARNING0 ("L2CAP - no buffer for disc_rsp");
+ L2CAP_TRACE_WARNING ("L2CAP - no buffer for disc_rsp");
return;
}
@@ -911,7 +1002,7 @@
if ((p_buf = l2cu_build_header(p_lcb, (UINT16) (L2CAP_ECHO_REQ_LEN + data_len), L2CAP_CMD_ECHO_REQ, p_lcb->id)) == NULL)
{
- L2CAP_TRACE_WARNING0 ("L2CAP - no buffer for echo_req");
+ L2CAP_TRACE_WARNING ("L2CAP - no buffer for echo_req");
return;
}
@@ -941,6 +1032,21 @@
BT_HDR *p_buf;
UINT8 *p;
UINT16 maxlen;
+ /* Filter out duplicate IDs or if available buffers are low (intruder checking) */
+ if (!id || id == p_lcb->cur_echo_id)
+ {
+ /* Dump this request since it is illegal */
+ L2CAP_TRACE_WARNING ("L2CAP ignoring duplicate echo request (%d)", id);
+ return;
+ }
+ else
+ p_lcb->cur_echo_id = id;
+ /* Don't respond if we more than 10% of our buffers are used */
+ if (GKI_poolutilization (L2CAP_CMD_POOL_ID) > 10)
+ {
+ L2CAP_TRACE_WARNING ("L2CAP gki pool used up to more than 10%%, ignore echo response");
+ return;
+ }
/* Don't return data if it does not fit in ACL and L2CAP MTU */
maxlen = (GKI_get_pool_bufsize(L2CAP_CMD_POOL_ID) > btu_cb.hcit_acl_pkt_size) ?
@@ -953,7 +1059,7 @@
if ((p_buf = l2cu_build_header (p_lcb, (UINT16)(L2CAP_ECHO_RSP_LEN + data_len), L2CAP_CMD_ECHO_RSP, id)) == NULL)
{
- L2CAP_TRACE_WARNING0 ("L2CAP - no buffer for echo_rsp");
+ L2CAP_TRACE_WARNING ("L2CAP - no buffer for echo_rsp");
return;
}
@@ -988,11 +1094,11 @@
if ((p_buf = l2cu_build_header(p_lcb, 2, L2CAP_CMD_INFO_REQ, p_lcb->id)) == NULL)
{
- L2CAP_TRACE_WARNING0 ("L2CAP - no buffer for info_req");
+ L2CAP_TRACE_WARNING ("L2CAP - no buffer for info_req");
return;
}
- L2CAP_TRACE_EVENT1 ("l2cu_send_peer_info_req: type 0x%04x", info_type);
+ L2CAP_TRACE_EVENT ("l2cu_send_peer_info_req: type 0x%04x", info_type);
p = (UINT8 *)(p_buf + 1) + L2CAP_SEND_CMD_OFFSET+HCI_DATA_PREAMBLE_SIZE +
L2CAP_PKT_OVERHEAD + L2CAP_CMD_OVERHEAD;
@@ -1048,7 +1154,7 @@
if ((p_buf = l2cu_build_header(p_lcb, len, L2CAP_CMD_INFO_RSP, remote_id)) == NULL)
{
- L2CAP_TRACE_WARNING0 ("L2CAP - no buffer for info_rsp");
+ L2CAP_TRACE_WARNING ("L2CAP - no buffer for info_rsp");
return;
}
@@ -1069,7 +1175,7 @@
{
UINT16_TO_STREAM (p, L2CAP_INFO_RESP_RESULT_SUCCESS);
#if (BLE_INCLUDED == TRUE)
- if (p_lcb->is_ble_link)
+ if (p_lcb->transport == BT_TRANSPORT_LE)
{
/* optional data are not added for now */
UINT32_TO_STREAM (p, L2CAP_BLE_EXTFEA_MASK);
@@ -1143,12 +1249,12 @@
if ( (!p_ccb->in_use) || (p_q == NULL) )
{
- L2CAP_TRACE_ERROR3 ("l2cu_enqueue_ccb CID: 0x%04x ERROR in_use: %u p_lcb: 0x%08x",
+ L2CAP_TRACE_ERROR ("l2cu_enqueue_ccb CID: 0x%04x ERROR in_use: %u p_lcb: 0x%08x",
p_ccb->local_cid, p_ccb->in_use, p_ccb->p_lcb);
return;
}
- L2CAP_TRACE_DEBUG2 ("l2cu_enqueue_ccb CID: 0x%04x priority: %d",
+ L2CAP_TRACE_DEBUG ("l2cu_enqueue_ccb CID: 0x%04x priority: %d",
p_ccb->local_cid, p_ccb->ccb_priority);
/* If the queue is empty, we go at the front */
@@ -1227,7 +1333,7 @@
{
tL2C_CCB_Q *p_q = NULL;
- L2CAP_TRACE_DEBUG1 ("l2cu_dequeue_ccb CID: 0x%04x", p_ccb->local_cid);
+ L2CAP_TRACE_DEBUG ("l2cu_dequeue_ccb CID: 0x%04x", p_ccb->local_cid);
/* Find out which queue the channel is on
*/
@@ -1236,7 +1342,7 @@
if ( (!p_ccb->in_use) || (p_q == NULL) || (p_q->p_first_ccb == NULL) )
{
- L2CAP_TRACE_ERROR5 ("l2cu_dequeue_ccb CID: 0x%04x ERROR in_use: %u p_lcb: 0x%08x p_q: 0x%08x p_q->p_first_ccb: 0x%08x",
+ L2CAP_TRACE_ERROR ("l2cu_dequeue_ccb CID: 0x%04x ERROR in_use: %u p_lcb: 0x%08x p_q: 0x%08x p_q->p_first_ccb: 0x%08x",
p_ccb->local_cid, p_ccb->in_use, p_ccb->p_lcb, p_q, p_q ? p_q->p_first_ccb : 0);
return;
}
@@ -1314,7 +1420,7 @@
/* If CCB is not the only guy on the queue */
if ( (p_ccb->p_next_ccb != NULL) || (p_ccb->p_prev_ccb != NULL) )
{
- L2CAP_TRACE_DEBUG0 ("Update CCB list in logical link");
+ L2CAP_TRACE_DEBUG ("Update CCB list in logical link");
/* Remove CCB from queue and re-queue it at new priority */
l2cu_dequeue_ccb (p_ccb);
@@ -1358,7 +1464,7 @@
tL2C_CCB *p_ccb;
tL2C_CCB *p_prev;
- L2CAP_TRACE_DEBUG1 ("l2cu_allocate_ccb: cid 0x%04x", cid);
+ L2CAP_TRACE_DEBUG ("l2cu_allocate_ccb: cid 0x%04x", cid);
if (!l2cb.p_free_ccb_first)
return (NULL);
@@ -1393,7 +1499,7 @@
}
if (p_prev == NULL)
{
- L2CAP_TRACE_ERROR1 ("l2cu_allocate_ccb: could not find CCB for CID 0x%04x in the free list", cid);
+ L2CAP_TRACE_ERROR ("l2cu_allocate_ccb: could not find CCB for CID 0x%04x in the free list", cid);
return NULL;
}
}
@@ -1473,7 +1579,7 @@
p_ccb->config_done = 0;
else
{
- L2CAP_TRACE_DEBUG2 ("l2cu_allocate_ccb: cid 0x%04x config_done:0x%x", cid, p_ccb->config_done);
+ L2CAP_TRACE_DEBUG ("l2cu_allocate_ccb: cid 0x%04x config_done:0x%x", cid, p_ccb->config_done);
}
p_ccb->chnl_state = CST_CLOSED;
@@ -1563,7 +1669,7 @@
tL2C_LCB *p_lcb = p_ccb->p_lcb;
tL2C_RCB *p_rcb = p_ccb->p_rcb;
- L2CAP_TRACE_DEBUG2 ("l2cu_release_ccb: cid 0x%04x in_use: %u", p_ccb->local_cid, p_ccb->in_use);
+ L2CAP_TRACE_DEBUG ("l2cu_release_ccb: cid 0x%04x in_use: %u", p_ccb->local_cid, p_ccb->in_use);
/* If already released, could be race condition */
if (!p_ccb->in_use)
@@ -1728,7 +1834,7 @@
{
tL2CA_DISCONNECT_IND_CB *p_disc_cb = p_ccb->p_rcb->api.pL2CA_DisconnectInd_Cb;
- L2CAP_TRACE_WARNING1 ("L2CAP - disconnect_chnl CID: 0x%04x", local_cid);
+ L2CAP_TRACE_WARNING ("L2CAP - disconnect_chnl CID: 0x%04x", local_cid);
l2cu_send_peer_disc_req (p_ccb);
@@ -1739,7 +1845,7 @@
else
{
/* failure on the AMP channel, probably need to disconnect ACL */
- L2CAP_TRACE_ERROR1 ("L2CAP - disconnect_chnl CID: 0x%04x Ignored", local_cid);
+ L2CAP_TRACE_ERROR ("L2CAP - disconnect_chnl CID: 0x%04x Ignored", local_cid);
}
}
@@ -1943,7 +2049,7 @@
else
p_ccb->fcrb.max_held_acks = p_ccb->our_cfg.fcr.tx_win_sz / 3;
- L2CAP_TRACE_DEBUG3 ("l2cu_process_peer_cfg_rsp(): peer tx_win_sz: %d, our tx_win_sz: %d, max_held_acks: %d",
+ L2CAP_TRACE_DEBUG ("l2cu_process_peer_cfg_rsp(): peer tx_win_sz: %d, our tx_win_sz: %d, max_held_acks: %d",
p_cfg->fcr.tx_win_sz, p_ccb->our_cfg.fcr.tx_win_sz, p_ccb->fcrb.max_held_acks);
}
}
@@ -2104,7 +2210,7 @@
** Returns TRUE if successful, FALSE if gki get buffer fails.
**
*******************************************************************************/
-BOOLEAN l2cu_create_conn (tL2C_LCB *p_lcb)
+BOOLEAN l2cu_create_conn (tL2C_LCB *p_lcb, tBT_TRANSPORT transport)
{
int xx;
tL2C_LCB *p_lcb_cur = &l2cb.lcb_pool[0];
@@ -2116,15 +2222,16 @@
tBT_DEVICE_TYPE dev_type;
tBLE_ADDR_TYPE addr_type;
+
BTM_ReadDevInfo(p_lcb->remote_bd_addr, &dev_type, &addr_type);
- if (dev_type == BT_DEVICE_TYPE_BLE)
+ if (transport == BT_TRANSPORT_LE)
{
if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
return FALSE;
p_lcb->ble_addr_type = addr_type;
- p_lcb->is_ble_link = TRUE;
+ p_lcb->transport = BT_TRANSPORT_LE;
return (l2cble_create_conn(p_lcb));
}
@@ -2148,13 +2255,13 @@
/* Check if there is any SCO Active on this BD Address */
is_sco_active = btm_is_sco_active_by_bdaddr(p_lcb_cur->remote_bd_addr);
- L2CAP_TRACE_API1 ("l2cu_create_conn - btm_is_sco_active_by_bdaddr() is_sco_active = %s", \
+ L2CAP_TRACE_API ("l2cu_create_conn - btm_is_sco_active_by_bdaddr() is_sco_active = %s", \
(is_sco_active == TRUE) ? "TRUE":"FALSE");
if (is_sco_active == TRUE)
continue; /* No Master Slave switch not allowed when SCO Active */
#endif
-
+ /*4_1_TODO check if btm_cb.devcb.local_features to be used instead */
if (HCI_SWITCH_SUPPORTED(BTM_ReadLocalFeatures()))
{
/* mark this lcb waiting for switch to be completed and
@@ -2227,7 +2334,7 @@
p_features = BTM_ReadLocalFeatures();
- L2CAP_TRACE_DEBUG4 ("l2cu_create_conn_after_switch :%d num_acl:%d no_hi: %d is_bonding:%d",
+ L2CAP_TRACE_DEBUG ("l2cu_create_conn_after_switch :%d num_acl:%d no_hi: %d is_bonding:%d",
l2cb.disallow_switch, num_acl, no_hi_prio_chs, p_lcb->is_bonding);
/* FW team says that we can participant in 4 piconets
* typically 3 piconet + 1 for scanning.
@@ -2271,14 +2378,16 @@
#endif
if (!btsnd_hcic_create_conn (p_lcb->remote_bd_addr,
- HCI_PKT_TYPES_MASK_DM1 + HCI_PKT_TYPES_MASK_DH1,
+ ( HCI_PKT_TYPES_MASK_DM1 | HCI_PKT_TYPES_MASK_DH1
+ | HCI_PKT_TYPES_MASK_DM3 | HCI_PKT_TYPES_MASK_DH3
+ | HCI_PKT_TYPES_MASK_DM5 | HCI_PKT_TYPES_MASK_DH5 ),
page_scan_rep_mode,
page_scan_mode,
clock_offset,
allow_switch))
{
- L2CAP_TRACE_ERROR0 ("L2CAP - no buffer for l2cu_create_conn");
+ L2CAP_TRACE_ERROR ("L2CAP - no buffer for l2cu_create_conn");
l2cu_release_lcb (p_lcb);
return (FALSE);
}
@@ -2391,12 +2500,12 @@
UINT8 command[HCI_BRCM_ACL_PRIORITY_PARAM_SIZE];
UINT8 vs_param;
- APPL_TRACE_EVENT1("SET ACL PRIORITY %d", priority);
+ APPL_TRACE_EVENT("SET ACL PRIORITY %d", priority);
/* Find the link control block for the acl channel */
- if ((p_lcb = l2cu_find_lcb_by_bd_addr(bd_addr)) == NULL)
+ if ((p_lcb = l2cu_find_lcb_by_bd_addr(bd_addr, BT_TRANSPORT_BR_EDR)) == NULL)
{
- L2CAP_TRACE_WARNING0 ("L2CAP - no LCB for L2CA_SetAclPriority");
+ L2CAP_TRACE_WARNING ("L2CAP - no LCB for L2CA_SetAclPriority");
return (FALSE);
}
@@ -2463,12 +2572,12 @@
tL2C_CCB *p_next_ccb;
int xx;
- L2CAP_TRACE_DEBUG1 ("l2cu_resubmit_pending_sec_req p_bda: 0x%08x", p_bda);
+ L2CAP_TRACE_DEBUG ("l2cu_resubmit_pending_sec_req p_bda: 0x%08x", p_bda);
/* If we are called with a BDA, only resubmit for that BDA */
if (p_bda)
{
- p_lcb = l2cu_find_lcb_by_bd_addr (p_bda);
+ p_lcb = l2cu_find_lcb_by_bd_addr (p_bda, BT_TRANSPORT_BR_EDR);
/* If we don't have one, this is an error */
if (p_lcb)
@@ -2482,7 +2591,7 @@
}
else
{
- L2CAP_TRACE_WARNING0 ("l2cu_resubmit_pending_sec_req - unknown BD_ADDR");
+ L2CAP_TRACE_WARNING ("l2cu_resubmit_pending_sec_req - unknown BD_ADDR");
}
}
else
@@ -2539,7 +2648,7 @@
if (packet_size <= (L2CAP_PKT_OVERHEAD + L2CAP_FCR_OVERHEAD + L2CAP_SDU_LEN_OVERHEAD + L2CAP_FCS_LEN))
{
/* something is very wrong */
- L2CAP_TRACE_ERROR2 ("l2cu_adjust_out_mps bad packet size: %u will use MPS: %u", packet_size, p_ccb->peer_cfg.fcr.mps);
+ L2CAP_TRACE_ERROR ("l2cu_adjust_out_mps bad packet size: %u will use MPS: %u", packet_size, p_ccb->peer_cfg.fcr.mps);
p_ccb->tx_mps = p_ccb->peer_cfg.fcr.mps;
}
else
@@ -2559,7 +2668,7 @@
else
p_ccb->tx_mps = p_ccb->peer_cfg.fcr.mps;
- L2CAP_TRACE_DEBUG3 ("l2cu_adjust_out_mps use %d Based on peer_cfg.fcr.mps: %u packet_size: %u",
+ L2CAP_TRACE_DEBUG ("l2cu_adjust_out_mps use %d Based on peer_cfg.fcr.mps: %u packet_size: %u",
p_ccb->tx_mps, p_ccb->peer_cfg.fcr.mps, packet_size);
}
}
@@ -2658,16 +2767,18 @@
if (timeout == 0)
{
- L2CAP_TRACE_DEBUG0 ("l2cu_no_dynamic_ccbs() IDLE timer 0, disconnecting link");
+ L2CAP_TRACE_DEBUG ("l2cu_no_dynamic_ccbs() IDLE timer 0, disconnecting link");
rc = btm_sec_disconnect (p_lcb->handle, HCI_ERR_PEER_USER);
if (rc == BTM_CMD_STARTED)
{
+ l2cu_process_fixed_disc_cback(p_lcb);
p_lcb->link_state = LST_DISCONNECTING;
timeout = L2CAP_LINK_DISCONNECT_TOUT;
}
else if (rc == BTM_SUCCESS)
{
+ l2cu_process_fixed_disc_cback(p_lcb);
/* BTM SEC will make sure that link is release (probably after pairing is done) */
p_lcb->link_state = LST_DISCONNECTING;
timeout = 0xFFFF;
@@ -2675,6 +2786,7 @@
else if ( (p_lcb->is_bonding)
&& (btsnd_hcic_disconnect (p_lcb->handle, HCI_ERR_PEER_USER)) )
{
+ l2cu_process_fixed_disc_cback(p_lcb);
p_lcb->link_state = LST_DISCONNECTING;
timeout = L2CAP_LINK_DISCONNECT_TOUT;
}
@@ -2687,7 +2799,7 @@
if (timeout != 0xFFFF)
{
- L2CAP_TRACE_DEBUG1 ("l2cu_no_dynamic_ccbs() starting IDLE timeout: %d", timeout);
+ L2CAP_TRACE_DEBUG ("l2cu_no_dynamic_ccbs() starting IDLE timeout: %d", timeout);
btu_start_timer (&p_lcb->timer_entry, BTU_TTYPE_L2CAP_LINK, timeout);
}
else
@@ -2709,27 +2821,43 @@
void l2cu_process_fixed_chnl_resp (tL2C_LCB *p_lcb)
{
int xx;
-#if BLE_INCLUDED == TRUE
- UINT16 reason = (p_lcb->is_ble_link ) ? 1 : 0;
-#else
- UINT16 reason =0;
+#if (BLE_INCLUDED == TRUE)
+ /* always exclude LE fixed channel on BR/EDR fix channel capability */
+ if (p_lcb->transport == BT_TRANSPORT_BR_EDR)
+ p_lcb->peer_chnl_mask[0] &= ~(L2CAP_FIXED_CHNL_ATT_BIT| \
+ L2CAP_FIXED_CHNL_BLE_SIG_BIT| \
+ L2CAP_FIXED_CHNL_SMP_BIT);
#endif
/* Tell all registered fixed channels about the connection */
for (xx = 0; xx < L2CAP_NUM_FIXED_CHNLS; xx++)
{
+#if BLE_INCLUDED == TRUE
+ /* skip sending LE fix channel callbacks on BR/EDR links */
+ if (p_lcb->transport == BT_TRANSPORT_BR_EDR &&
+ xx + L2CAP_FIRST_FIXED_CHNL >= L2CAP_ATT_CID &&
+ xx + L2CAP_FIRST_FIXED_CHNL <= L2CAP_SMP_CID)
+ continue;
+#endif
if (l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb != NULL)
{
if (p_lcb->peer_chnl_mask[0] & (1 << (xx + L2CAP_FIRST_FIXED_CHNL)))
{
if (p_lcb->p_fixed_ccbs[xx])
p_lcb->p_fixed_ccbs[xx]->chnl_state = CST_OPEN;
-
- (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(p_lcb->remote_bd_addr, TRUE, reason);
+#if BLE_INCLUDED == TRUE
+ (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(p_lcb->remote_bd_addr, TRUE, 0, p_lcb->transport);
+#else
+ (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(p_lcb->remote_bd_addr, TRUE, 0, BT_TRANSPORT_BR_EDR);
+#endif
}
else
{
- (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(p_lcb->remote_bd_addr, FALSE, p_lcb->disc_reason);
+#if BLE_INCLUDED == TRUE
+ (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(p_lcb->remote_bd_addr, FALSE, p_lcb->disc_reason, p_lcb->transport);
+#else
+ (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(p_lcb->remote_bd_addr, FALSE, p_lcb->disc_reason, BT_TRANSPORT_BR_EDR);
+#endif
if (p_lcb->p_fixed_ccbs[xx])
{
@@ -2742,6 +2870,48 @@
}
#endif
+
+/*******************************************************************************
+**
+** Function l2cu_process_fixed_disc_cback
+**
+** Description send l2cap fixed channel disconnection callback to application
+**
+**
+** Returns void
+**
+*******************************************************************************/
+void l2cu_process_fixed_disc_cback (tL2C_LCB *p_lcb)
+{
+#if (L2CAP_NUM_FIXED_CHNLS > 0)
+ int xx;
+
+ for (xx = 0; xx < L2CAP_NUM_FIXED_CHNLS; xx++)
+ {
+ if (p_lcb->p_fixed_ccbs[xx])
+ {
+ if (p_lcb->p_fixed_ccbs[xx] != p_lcb->p_pending_ccb)
+ {
+ l2cu_release_ccb (p_lcb->p_fixed_ccbs[xx]);
+ p_lcb->p_fixed_ccbs[xx] = NULL;
+#if BLE_INCLUDED == TRUE
+ (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(p_lcb->remote_bd_addr, FALSE, p_lcb->disc_reason, p_lcb->transport);
+#else
+ (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(p_lcb->remote_bd_addr, FALSE, p_lcb->disc_reason, BT_TRANSPORT_BR_EDR);
+#endif
+ }
+ }
+ else if ( (p_lcb->peer_chnl_mask[0] & (1 << (xx + L2CAP_FIRST_FIXED_CHNL)))
+ && (l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb != NULL) )
+#if BLE_INCLUDED == TRUE
+ (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(p_lcb->remote_bd_addr, FALSE, p_lcb->disc_reason, p_lcb->transport);
+#else
+ (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(p_lcb->remote_bd_addr, FALSE, p_lcb->disc_reason, BT_TRANSPORT_BR_EDR);
+#endif
+ }
+#endif
+}
+
#if (BLE_INCLUDED == TRUE)
/*******************************************************************************
**
@@ -2764,7 +2934,7 @@
if ((p_buf = l2cu_build_header (p_lcb, L2CAP_CMD_BLE_UPD_REQ_LEN, L2CAP_CMD_BLE_UPDATE_REQ, p_lcb->id)) == NULL )
{
- L2CAP_TRACE_WARNING0 ("l2cu_send_peer_ble_par_req - no buffer");
+ L2CAP_TRACE_WARNING ("l2cu_send_peer_ble_par_req - no buffer");
return;
}
@@ -2796,7 +2966,7 @@
if ((p_buf = l2cu_build_header (p_lcb, L2CAP_CMD_BLE_UPD_RSP_LEN, L2CAP_CMD_BLE_UPDATE_RSP, rem_id)) == NULL )
{
- L2CAP_TRACE_WARNING0 ("l2cu_send_peer_ble_par_rsp - no buffer");
+ L2CAP_TRACE_WARNING ("l2cu_send_peer_ble_par_rsp - no buffer");
return;
}
@@ -2933,11 +3103,11 @@
if (!p_ccb)
{
- L2CAP_TRACE_ERROR1("p_serve_ccb is NULL, rr_pri=%d", p_lcb->rr_pri);
+ L2CAP_TRACE_ERROR("p_serve_ccb is NULL, rr_pri=%d", p_lcb->rr_pri);
return NULL;
}
- L2CAP_TRACE_DEBUG3("RR scan pri=%d, lcid=0x%04x, q_cout=%d",
+ L2CAP_TRACE_DEBUG("RR scan pri=%d, lcid=0x%04x, q_cout=%d",
p_ccb->ccb_priority, p_ccb->local_cid, p_ccb->xmit_hold_q.count );
/* store the next serving channel */
@@ -3001,7 +3171,7 @@
if (p_serve_ccb)
{
- L2CAP_TRACE_DEBUG3("RR service pri=%d, quota=%d, lcid=0x%04x",
+ L2CAP_TRACE_DEBUG("RR service pri=%d, quota=%d, lcid=0x%04x",
p_serve_ccb->ccb_priority,
p_lcb->rr_serv[p_serve_ccb->ccb_priority].quota,
p_serve_ccb->local_cid );
@@ -3105,6 +3275,7 @@
if ((p_buf = l2c_fcr_get_next_xmit_sdu_seg(p_ccb, 0)) != NULL)
{
+ l2cu_check_channel_congestion (p_ccb);
l2cu_set_acl_hci_header (p_buf, p_ccb);
return (p_buf);
}
@@ -3116,9 +3287,10 @@
p_buf = (BT_HDR *)GKI_dequeue (&p_ccb->xmit_hold_q);
if(NULL == p_buf)
{
- L2CAP_TRACE_ERROR0("l2cu_get_buffer_to_send: No data to be sent");
+ L2CAP_TRACE_ERROR("l2cu_get_buffer_to_send: No data to be sent");
return (NULL);
}
+ l2cu_check_channel_congestion (p_ccb);
l2cu_set_acl_hci_header (p_buf, p_ccb);
return (p_buf);
}
@@ -3147,7 +3319,7 @@
p_buf = (BT_HDR *)GKI_dequeue (&p_ccb->xmit_hold_q);
if(NULL == p_buf)
{
- L2CAP_TRACE_ERROR0("l2cu_get_buffer_to_send() #2: No data to be sent");
+ L2CAP_TRACE_ERROR("l2cu_get_buffer_to_send() #2: No data to be sent");
return (NULL);
}
}
@@ -3179,22 +3351,11 @@
/* Set the pointer to the beginning of the data minus 4 bytes for the packet header */
p = (UINT8 *)(p_buf + 1) + p_buf->offset - HCI_DATA_PREAMBLE_SIZE;
-#if (L2CAP_NON_FLUSHABLE_PB_INCLUDED == TRUE)
- if ( (((p_buf->layer_specific & L2CAP_FLUSHABLE_MASK) == L2CAP_FLUSHABLE_CH_BASED) && (p_ccb->is_flushable))
- || ((p_buf->layer_specific & L2CAP_FLUSHABLE_MASK) == L2CAP_FLUSHABLE_PKT) )
- {
- UINT16_TO_STREAM (p, p_ccb->p_lcb->handle | (L2CAP_PKT_START << L2CAP_PKT_TYPE_SHIFT));
- }
- else
- {
- UINT16_TO_STREAM (p, p_ccb->p_lcb->handle | l2cb.non_flushable_pbf);
- }
-#else
- UINT16_TO_STREAM (p, p_ccb->p_lcb->handle | (L2CAP_PKT_START << L2CAP_PKT_TYPE_SHIFT));
-#endif
#if (BLE_INCLUDED == TRUE)
- if (p_ccb->p_lcb->is_ble_link)
+ if (p_ccb->p_lcb->transport == BT_TRANSPORT_LE)
{
+ UINT16_TO_STREAM (p, p_ccb->p_lcb->handle | (L2CAP_PKT_START_NON_FLUSHABLE << L2CAP_PKT_TYPE_SHIFT));
+
/* The HCI transport will segment the buffers. */
if (p_buf->len > btu_cb.hcit_ble_acl_data_size)
{
@@ -3208,6 +3369,19 @@
else
#endif
{
+#if (L2CAP_NON_FLUSHABLE_PB_INCLUDED == TRUE)
+ if ( (((p_buf->layer_specific & L2CAP_FLUSHABLE_MASK) == L2CAP_FLUSHABLE_CH_BASED) && (p_ccb->is_flushable))
+ || ((p_buf->layer_specific & L2CAP_FLUSHABLE_MASK) == L2CAP_FLUSHABLE_PKT) )
+ {
+ UINT16_TO_STREAM (p, p_ccb->p_lcb->handle | (L2CAP_PKT_START << L2CAP_PKT_TYPE_SHIFT));
+ }
+ else
+ {
+ UINT16_TO_STREAM (p, p_ccb->p_lcb->handle | l2cb.non_flushable_pbf);
+ }
+#else
+ UINT16_TO_STREAM (p, p_ccb->p_lcb->handle | (L2CAP_PKT_START << L2CAP_PKT_TYPE_SHIFT));
+#endif
/* The HCI transport will segment the buffers. */
if (p_buf->len > btu_cb.hcit_acl_data_size)
@@ -3246,7 +3420,7 @@
/* If the CCB queue limit is subject to a quota, check for congestion */
/* if this channel has outgoing traffic */
- if ((p_ccb->p_rcb)&&(p_ccb->buff_quota != 0))
+ if (p_ccb->buff_quota != 0)
{
/* If this channel was congested */
if ( p_ccb->cong_sent )
@@ -3255,9 +3429,9 @@
if (q_count <= (p_ccb->buff_quota / 2))
{
p_ccb->cong_sent = FALSE;
- if (p_ccb->p_rcb->api.pL2CA_CongestionStatus_Cb)
+ if (p_ccb->p_rcb && p_ccb->p_rcb->api.pL2CA_CongestionStatus_Cb)
{
- L2CAP_TRACE_DEBUG3 ("L2CAP - Calling CongestionStatus_Cb (FALSE), CID: 0x%04x xmit_hold_q.count: %u buff_quota: %u",
+ L2CAP_TRACE_DEBUG ("L2CAP - Calling CongestionStatus_Cb (FALSE), CID: 0x%04x xmit_hold_q.count: %u buff_quota: %u",
p_ccb->local_cid, q_count, p_ccb->buff_quota);
/* Prevent recursive calling */
@@ -3266,17 +3440,32 @@
l2cb.is_cong_cback_context = FALSE;
}
#if (L2CAP_UCD_INCLUDED == TRUE)
- else if ( p_ccb->local_cid == L2CAP_CONNECTIONLESS_CID )
+ else if ( p_ccb->p_rcb && p_ccb->local_cid == L2CAP_CONNECTIONLESS_CID )
{
if ( p_ccb->p_rcb->ucd.cb_info.pL2CA_UCD_Congestion_Status_Cb )
{
- L2CAP_TRACE_DEBUG3 ("L2CAP - Calling UCD CongestionStatus_Cb (FALSE), SecPendingQ:%u,XmitQ:%u,Quota:%u",
+ L2CAP_TRACE_DEBUG ("L2CAP - Calling UCD CongestionStatus_Cb (FALSE), SecPendingQ:%u,XmitQ:%u,Quota:%u",
p_ccb->p_lcb->ucd_out_sec_pending_q.count,
p_ccb->xmit_hold_q.count, p_ccb->buff_quota);
p_ccb->p_rcb->ucd.cb_info.pL2CA_UCD_Congestion_Status_Cb( p_ccb->p_lcb->remote_bd_addr, FALSE );
}
}
#endif
+#if (L2CAP_NUM_FIXED_CHNLS > 0)
+ else
+ {
+ UINT8 xx;
+ for (xx = 0; xx < L2CAP_NUM_FIXED_CHNLS; xx ++)
+ {
+ if (p_ccb->p_lcb->p_fixed_ccbs[xx] == p_ccb)
+ {
+ if (l2cb.fixed_reg[xx].pL2CA_FixedCong_Cb != NULL)
+ (* l2cb.fixed_reg[xx].pL2CA_FixedCong_Cb)(p_ccb->p_lcb->remote_bd_addr, FALSE);
+ break;
+ }
+ }
+ }
+#endif
}
}
else
@@ -3285,25 +3474,40 @@
if (q_count > p_ccb->buff_quota)
{
p_ccb->cong_sent = TRUE;
- if (p_ccb->p_rcb->api.pL2CA_CongestionStatus_Cb)
+ if (p_ccb->p_rcb && p_ccb->p_rcb->api.pL2CA_CongestionStatus_Cb)
{
- L2CAP_TRACE_DEBUG3 ("L2CAP - Calling CongestionStatus_Cb (TRUE),CID:0x%04x,XmitQ:%u,Quota:%u",
+ L2CAP_TRACE_DEBUG ("L2CAP - Calling CongestionStatus_Cb (TRUE),CID:0x%04x,XmitQ:%u,Quota:%u",
p_ccb->local_cid, q_count, p_ccb->buff_quota);
(*p_ccb->p_rcb->api.pL2CA_CongestionStatus_Cb)(p_ccb->local_cid, TRUE);
}
#if (L2CAP_UCD_INCLUDED == TRUE)
- else if ( p_ccb->local_cid == L2CAP_CONNECTIONLESS_CID )
+ else if ( p_ccb->p_rcb && p_ccb->local_cid == L2CAP_CONNECTIONLESS_CID )
{
if ( p_ccb->p_rcb->ucd.cb_info.pL2CA_UCD_Congestion_Status_Cb )
{
- L2CAP_TRACE_DEBUG3 ("L2CAP - Calling UCD CongestionStatus_Cb (TRUE), SecPendingQ:%u,XmitQ:%u,Quota:%u",
+ L2CAP_TRACE_DEBUG ("L2CAP - Calling UCD CongestionStatus_Cb (TRUE), SecPendingQ:%u,XmitQ:%u,Quota:%u",
p_ccb->p_lcb->ucd_out_sec_pending_q.count,
p_ccb->xmit_hold_q.count, p_ccb->buff_quota);
p_ccb->p_rcb->ucd.cb_info.pL2CA_UCD_Congestion_Status_Cb( p_ccb->p_lcb->remote_bd_addr, TRUE );
}
}
#endif
+#if (L2CAP_NUM_FIXED_CHNLS > 0)
+ else
+ {
+ UINT8 xx;
+ for (xx = 0; xx < L2CAP_NUM_FIXED_CHNLS; xx ++)
+ {
+ if (p_ccb->p_lcb->p_fixed_ccbs[xx] == p_ccb)
+ {
+ if (l2cb.fixed_reg[xx].pL2CA_FixedCong_Cb != NULL)
+ (* l2cb.fixed_reg[xx].pL2CA_FixedCong_Cb)(p_ccb->p_lcb->remote_bd_addr, TRUE);
+ break;
+ }
+ }
+ }
+#endif
}
}
}
diff --git a/stack/mcap/mca_api.c b/stack/mcap/mca_api.c
index 1792f8c..2a2ff8c 100644
--- a/stack/mcap/mca_api.c
+++ b/stack/mcap/mca_api.c
@@ -128,7 +128,7 @@
WC_ASSERT(p_reg != NULL );
WC_ASSERT(p_cback != NULL );
- MCA_TRACE_API2 ("MCA_Register: ctrl_psm:0x%x, data_psm:0x%x", p_reg->ctrl_psm, p_reg->data_psm);
+ MCA_TRACE_API ("MCA_Register: ctrl_psm:0x%x, data_psm:0x%x", p_reg->ctrl_psm, p_reg->data_psm);
if ( (p_rcb = mca_rcb_alloc (p_reg)) != NULL)
{
@@ -136,7 +136,7 @@
{
if (L2C_INVALID_PSM(p_reg->ctrl_psm) || L2C_INVALID_PSM(p_reg->data_psm))
{
- MCA_TRACE_ERROR0 ("INVALID_PSM");
+ MCA_TRACE_ERROR ("INVALID_PSM");
return 0;
}
@@ -161,7 +161,7 @@
}
else
{
- MCA_TRACE_ERROR0 ("Failed to register to L2CAP");
+ MCA_TRACE_ERROR ("Failed to register to L2CAP");
return 0;
}
}
@@ -190,7 +190,7 @@
{
tMCA_RCB *p_rcb = mca_rcb_by_handle(handle);
- MCA_TRACE_API1 ("MCA_Deregister: %d", handle);
+ MCA_TRACE_API ("MCA_Deregister: %d", handle);
if (p_rcb && p_rcb->reg.ctrl_psm)
{
L2CA_Deregister(p_rcb->reg.ctrl_psm);
@@ -225,12 +225,12 @@
WC_ASSERT(p_cs != NULL );
WC_ASSERT(p_cs->p_data_cback != NULL );
- MCA_TRACE_API1 ("MCA_CreateDep: %d", handle);
+ MCA_TRACE_API ("MCA_CreateDep: %d", handle);
if (p_rcb)
{
if (p_cs->max_mdl > MCA_NUM_MDLS)
{
- MCA_TRACE_ERROR1 ("max_mdl: %d is too big", p_cs->max_mdl );
+ MCA_TRACE_ERROR ("max_mdl: %d is too big", p_cs->max_mdl );
result = MCA_BAD_PARAMS;
}
else
@@ -240,7 +240,7 @@
{
if (p_depcs->p_data_cback)
{
- MCA_TRACE_ERROR0 ("Already has ECHO MDEP");
+ MCA_TRACE_ERROR ("Already has ECHO MDEP");
return MCA_NO_RESOURCES;
}
memcpy (p_depcs, p_cs, sizeof (tMCA_CS));
@@ -292,7 +292,7 @@
int i, max;
tMCA_CS *p_depcs;
- MCA_TRACE_API2 ("MCA_DeleteDep: %d dep:%d", handle, dep);
+ MCA_TRACE_API ("MCA_DeleteDep: %d dep:%d", handle, dep);
if (p_rcb)
{
if (dep < MCA_NUM_DEPS && p_rcb->dep[dep].p_data_cback)
@@ -339,12 +339,12 @@
tMCA_CCB *p_ccb;
tMCA_TC_TBL *p_tbl;
- MCA_TRACE_API2 ("MCA_ConnectReq: %d psm:0x%x", handle, ctrl_psm);
+ MCA_TRACE_API ("MCA_ConnectReq: %d psm:0x%x", handle, ctrl_psm);
if ((p_ccb = mca_ccb_by_bd(handle, bd_addr)) == NULL)
p_ccb = mca_ccb_alloc(handle, bd_addr);
else
{
- MCA_TRACE_ERROR0 ("control channel already exists");
+ MCA_TRACE_ERROR ("control channel already exists");
return MCA_BUSY;
}
@@ -393,7 +393,7 @@
tMCA_RESULT result = MCA_BAD_HANDLE;
tMCA_CCB *p_ccb = mca_ccb_by_hdl(mcl);
- MCA_TRACE_API1 ("MCA_DisconnectReq: %d ", mcl);
+ MCA_TRACE_API ("MCA_DisconnectReq: %d ", mcl);
if (p_ccb)
{
result = MCA_SUCCESS;
@@ -429,24 +429,24 @@
tMCA_CCB_MSG *p_evt_data;
tMCA_DCB *p_dcb;
- MCA_TRACE_API4 ("MCA_CreateMdl: %d dep=%d mdl_id=%d peer_dep_id=%d", mcl, dep, mdl_id, peer_dep_id);
+ MCA_TRACE_API ("MCA_CreateMdl: %d dep=%d mdl_id=%d peer_dep_id=%d", mcl, dep, mdl_id, peer_dep_id);
if (p_ccb)
{
if (p_ccb->p_tx_req || p_ccb->p_rx_msg || p_ccb->cong)
{
- MCA_TRACE_ERROR0 ("pending req");
+ MCA_TRACE_ERROR ("pending req");
return MCA_BUSY;
}
if ((peer_dep_id > MCA_MAX_MDEP_ID) || (!MCA_IS_VALID_MDL_ID(mdl_id)))
{
- MCA_TRACE_ERROR2 ("bad peer dep id:%d or bad mdl id: %d ", peer_dep_id, mdl_id);
+ MCA_TRACE_ERROR ("bad peer dep id:%d or bad mdl id: %d ", peer_dep_id, mdl_id);
return MCA_BAD_PARAMS;
}
if (mca_ccb_uses_mdl_id(p_ccb, mdl_id))
{
- MCA_TRACE_ERROR1 ("mdl id: %d is used in the control link", mdl_id);
+ MCA_TRACE_ERROR ("mdl id: %d is used in the control link", mdl_id);
return MCA_BAD_MDL_ID;
}
@@ -507,13 +507,13 @@
tMCA_CCB_MSG evt_data;
tMCA_DCB *p_dcb;
- MCA_TRACE_API5 ("MCA_CreateMdlRsp: %d dep=%d mdl_id=%d cfg=%d rsp_code=%d", mcl, dep, mdl_id, cfg, rsp_code);
+ MCA_TRACE_API ("MCA_CreateMdlRsp: %d dep=%d mdl_id=%d cfg=%d rsp_code=%d", mcl, dep, mdl_id, cfg, rsp_code);
WC_ASSERT(p_chnl_cfg != NULL );
if (p_ccb)
{
if (p_ccb->cong)
{
- MCA_TRACE_ERROR0 ("congested");
+ MCA_TRACE_ERROR ("congested");
return MCA_BUSY;
}
if (p_ccb->p_rx_msg && (p_ccb->p_rx_msg->mdep_id == dep )
@@ -548,7 +548,7 @@
}
else
{
- MCA_TRACE_ERROR0 ("The given MCL is not expecting a MCA_CreateMdlRsp with the given parameters" );
+ MCA_TRACE_ERROR ("The given MCL is not expecting a MCA_CreateMdlRsp with the given parameters" );
result = MCA_BAD_PARAMS;
}
}
@@ -571,7 +571,7 @@
tMCA_RESULT result = MCA_BAD_HANDLE;
tMCA_DCB *p_dcb = mca_dcb_by_hdl(mdl);
- MCA_TRACE_API1 ("MCA_CloseReq: %d ", mdl);
+ MCA_TRACE_API ("MCA_CloseReq: %d ", mdl);
if (p_dcb)
{
result = MCA_SUCCESS;
@@ -604,25 +604,25 @@
tMCA_CCB_MSG *p_evt_data;
tMCA_DCB *p_dcb;
- MCA_TRACE_API1 ("MCA_ReconnectMdl: %d ", mcl);
+ MCA_TRACE_API ("MCA_ReconnectMdl: %d ", mcl);
WC_ASSERT(p_chnl_cfg != NULL );
if (p_ccb)
{
if (p_ccb->p_tx_req || p_ccb->p_rx_msg || p_ccb->cong)
{
- MCA_TRACE_ERROR0 ("pending req");
+ MCA_TRACE_ERROR ("pending req");
return MCA_BUSY;
}
if (!MCA_IS_VALID_MDL_ID(mdl_id))
{
- MCA_TRACE_ERROR1 ("bad mdl id: %d ", mdl_id);
+ MCA_TRACE_ERROR ("bad mdl id: %d ", mdl_id);
return MCA_BAD_PARAMS;
}
if (mca_ccb_uses_mdl_id(p_ccb, mdl_id))
{
- MCA_TRACE_ERROR1 ("mdl id: %d is used in the control link", mdl_id);
+ MCA_TRACE_ERROR ("mdl id: %d is used in the control link", mdl_id);
return MCA_BAD_MDL_ID;
}
@@ -673,13 +673,13 @@
tMCA_CCB_MSG evt_data;
tMCA_DCB *p_dcb;
- MCA_TRACE_API1 ("MCA_ReconnectMdlRsp: %d ", mcl);
+ MCA_TRACE_API ("MCA_ReconnectMdlRsp: %d ", mcl);
WC_ASSERT(p_chnl_cfg != NULL );
if (p_ccb)
{
if (p_ccb->cong)
{
- MCA_TRACE_ERROR0 ("congested");
+ MCA_TRACE_ERROR ("congested");
return MCA_BUSY;
}
if (p_ccb->p_rx_msg && (p_ccb->p_rx_msg->mdl_id == mdl_id) &&
@@ -698,7 +698,7 @@
}
else
{
- MCA_TRACE_ERROR0 ("Out of MDL for this MDEP");
+ MCA_TRACE_ERROR ("Out of MDL for this MDEP");
rsp_code = MCA_RSP_MDEP_BUSY;
result = MCA_NO_RESOURCES;
}
@@ -711,7 +711,7 @@
}
else
{
- MCA_TRACE_ERROR0 ("The given MCL is not expecting a MCA_ReconnectMdlRsp with the given parameters" );
+ MCA_TRACE_ERROR ("The given MCL is not expecting a MCA_ReconnectMdlRsp with the given parameters" );
result = MCA_BAD_PARAMS;
}
}
@@ -738,7 +738,7 @@
tMCA_DCB *p_dcb;
tMCA_TC_TBL *p_tbl;
- MCA_TRACE_API1 ("MCA_DataChnlCfg: %d ", mcl);
+ MCA_TRACE_API ("MCA_DataChnlCfg: %d ", mcl);
WC_ASSERT(p_chnl_cfg != NULL );
if (p_ccb)
{
@@ -746,7 +746,7 @@
if ((p_ccb->p_tx_req == NULL) || (p_ccb->status != MCA_CCB_STAT_PENDING) ||
((p_dcb = mca_dcb_by_hdl(p_ccb->p_tx_req->dcb_idx)) == NULL))
{
- MCA_TRACE_ERROR1 ("The given MCL is not expecting this API:%d", p_ccb->status);
+ MCA_TRACE_ERROR ("The given MCL is not expecting this API:%d", p_ccb->status);
return result;
}
@@ -785,7 +785,7 @@
tMCA_CCB_MSG *p_evt_data;
tMCA_DCB *p_dcb;
- MCA_TRACE_API1 ("MCA_Abort: %d", mcl);
+ MCA_TRACE_API ("MCA_Abort: %d", mcl);
if (p_ccb)
{
result = MCA_NO_RESOURCES;
@@ -793,13 +793,13 @@
if ((p_ccb->p_tx_req == NULL) || (p_ccb->status != MCA_CCB_STAT_PENDING) ||
((p_dcb = mca_dcb_by_hdl(p_ccb->p_tx_req->dcb_idx)) == NULL))
{
- MCA_TRACE_ERROR1 ("The given MCL is not expecting this API:%d", p_ccb->status);
+ MCA_TRACE_ERROR ("The given MCL is not expecting this API:%d", p_ccb->status);
return result;
}
if (p_ccb->cong)
{
- MCA_TRACE_ERROR0 ("congested");
+ MCA_TRACE_ERROR ("congested");
return MCA_BUSY;
}
@@ -834,17 +834,17 @@
tMCA_CCB *p_ccb = mca_ccb_by_hdl(mcl);
tMCA_CCB_MSG *p_evt_data;
- MCA_TRACE_API1 ("MCA_Delete: %d ", mcl);
+ MCA_TRACE_API ("MCA_Delete: %d ", mcl);
if (p_ccb)
{
if (p_ccb->cong)
{
- MCA_TRACE_ERROR0 ("congested");
+ MCA_TRACE_ERROR ("congested");
return MCA_BUSY;
}
if (!MCA_IS_VALID_MDL_ID(mdl_id) && (mdl_id != MCA_ALL_MDL_ID))
{
- MCA_TRACE_ERROR1 ("bad mdl id: %d ", mdl_id);
+ MCA_TRACE_ERROR ("bad mdl id: %d ", mdl_id);
return MCA_BAD_PARAMS;
}
p_evt_data = (tMCA_CCB_MSG *)GKI_getbuf (sizeof(tMCA_CCB_MSG));
@@ -886,7 +886,7 @@
tMCA_DCB *p_dcb = mca_dcb_by_hdl(mdl);
tMCA_DCB_EVT evt_data;
- MCA_TRACE_API1 ("MCA_WriteReq: %d ", mdl);
+ MCA_TRACE_API ("MCA_WriteReq: %d ", mdl);
if (p_dcb)
{
if (p_dcb->cong)
@@ -917,7 +917,7 @@
UINT16 lcid = 0;
tMCA_DCB *p_dcb = mca_dcb_by_hdl(mdl);
- MCA_TRACE_API1 ("MCA_GetL2CapChannel: %d ", mdl);
+ MCA_TRACE_API ("MCA_GetL2CapChannel: %d ", mdl);
if (p_dcb)
lcid = p_dcb->lcid;
return lcid;
diff --git a/stack/mcap/mca_cact.c b/stack/mcap/mca_cact.c
index 16a8cec..bab3c76 100644
--- a/stack/mcap/mca_cact.c
+++ b/stack/mcap/mca_cact.c
@@ -101,7 +101,7 @@
BOOLEAN is_abort = FALSE;
tMCA_DCB *p_dcb;
- MCA_TRACE_DEBUG2 ("mca_ccb_snd_req cong=%d req=%d", p_ccb->cong, p_msg->op_code);
+ MCA_TRACE_DEBUG ("mca_ccb_snd_req cong=%d req=%d", p_ccb->cong, p_msg->op_code);
/* check for abort request */
if ((p_ccb->status == MCA_CCB_STAT_PENDING) && (p_msg->op_code == MCA_OP_MDL_ABORT_REQ))
{
@@ -144,7 +144,7 @@
}
else
{
- MCA_TRACE_WARNING0 ("dropping api req");
+ MCA_TRACE_WARNING ("dropping api req");
GKI_freebuf (p_data);
}
}
@@ -167,7 +167,7 @@
BOOLEAN chk_mdl = FALSE;
tMCA_DCB *p_dcb;
- MCA_TRACE_DEBUG2 ("mca_ccb_snd_rsp cong=%d req=%d", p_ccb->cong, p_msg->op_code);
+ MCA_TRACE_DEBUG ("mca_ccb_snd_rsp cong=%d req=%d", p_ccb->cong, p_msg->op_code);
/* assume that API functions verified the parameters */
p_pkt = (BT_HDR *)GKI_getbuf (MCA_CTRL_MTU);
if (p_pkt)
@@ -232,7 +232,7 @@
*******************************************************************************/
void mca_ccb_cong(tMCA_CCB *p_ccb, tMCA_CCB_EVT *p_data)
{
- MCA_TRACE_DEBUG2 ("mca_ccb_cong cong=%d/%d", p_ccb->cong, p_data->llcong);
+ MCA_TRACE_DEBUG ("mca_ccb_cong cong=%d/%d", p_ccb->cong, p_data->llcong);
p_ccb->cong = p_data->llcong;
if (!p_ccb->cong)
{
@@ -270,17 +270,17 @@
BOOLEAN check_req = FALSE;
UINT8 reject_opcode;
- MCA_TRACE_DEBUG1 ("mca_ccb_hdl_req status:%d", p_ccb->status);
+ MCA_TRACE_DEBUG ("mca_ccb_hdl_req status:%d", p_ccb->status);
p_rx_msg = (tMCA_CCB_MSG *)p_pkt;
p = (UINT8 *)(p_pkt + 1) + p_pkt->offset;
evt_data.hdr.op_code = *p++;
BE_STREAM_TO_UINT16 (evt_data.hdr.mdl_id, p);
reject_opcode = evt_data.hdr.op_code+1;
- MCA_TRACE_DEBUG1 ("received mdl id: %d ", evt_data.hdr.mdl_id);
+ MCA_TRACE_DEBUG ("received mdl id: %d ", evt_data.hdr.mdl_id);
if (p_ccb->status == MCA_CCB_STAT_PENDING)
{
- MCA_TRACE_DEBUG0 ("received req inpending state");
+ MCA_TRACE_DEBUG ("received req inpending state");
/* allow abort in pending state */
if ((p_ccb->status == MCA_CCB_STAT_PENDING) && (evt_data.hdr.op_code == MCA_OP_MDL_ABORT_REQ))
{
@@ -299,17 +299,17 @@
}
else if (p_ccb->p_rx_msg)
{
- MCA_TRACE_DEBUG0 ("still handling prev req");
+ MCA_TRACE_DEBUG ("still handling prev req");
/* still holding previous message, reject this new one ?? */
}
else if (p_ccb->p_tx_req)
{
- MCA_TRACE_DEBUG1 ("still waiting for a response ctrl_vpsm:0x%x", p_ccb->ctrl_vpsm);
+ MCA_TRACE_DEBUG ("still waiting for a response ctrl_vpsm:0x%x", p_ccb->ctrl_vpsm);
/* sent a request; waiting for response */
if (p_ccb->ctrl_vpsm == 0)
{
- MCA_TRACE_DEBUG0 ("local is ACP. accept the cmd from INT");
+ MCA_TRACE_DEBUG ("local is ACP. accept the cmd from INT");
/* local is acceptor, need to handle the request */
check_req = TRUE;
reject_code = MCA_RSP_SUCCESS;
@@ -366,12 +366,12 @@
p_rx_msg->mdep_id = evt_data.create_ind.dep_id;
if (!mca_is_valid_dep_id(p_ccb->p_rcb, p_rx_msg->mdep_id))
{
- MCA_TRACE_ERROR0 ("not a valid local mdep id");
+ MCA_TRACE_ERROR ("not a valid local mdep id");
reject_code = MCA_RSP_BAD_MDEP;
}
else if (mca_ccb_uses_mdl_id(p_ccb, evt_data.hdr.mdl_id))
{
- MCA_TRACE_DEBUG0 ("the mdl_id is currently used in the CL(create)");
+ MCA_TRACE_DEBUG ("the mdl_id is currently used in the CL(create)");
mca_dcb_close_by_mdl_id(p_ccb, evt_data.hdr.mdl_id);
}
else
@@ -379,7 +379,7 @@
/* check if this dep still have MDL available */
if (mca_dep_free_mdl(p_ccb, evt_data.create_ind.dep_id) == 0)
{
- MCA_TRACE_ERROR0 ("the mdep is currently using max_mdl");
+ MCA_TRACE_ERROR ("the mdep is currently using max_mdl");
reject_code = MCA_RSP_MDEP_BUSY;
}
}
@@ -388,7 +388,7 @@
case MCA_OP_MDL_RECONNECT_REQ:
if (mca_ccb_uses_mdl_id(p_ccb, evt_data.hdr.mdl_id))
{
- MCA_TRACE_ERROR0 ("the mdl_id is currently used in the CL(reconn)");
+ MCA_TRACE_ERROR ("the mdl_id is currently used in the CL(reconn)");
reject_code = MCA_RSP_MDL_BUSY;
}
break;
@@ -494,7 +494,7 @@
{
if (evt_data.hdr.mdl_id != p_dcb->mdl_id)
{
- MCA_TRACE_ERROR2 ("peer's mdl_id=%d != our mdl_id=%d", evt_data.hdr.mdl_id, p_dcb->mdl_id);
+ MCA_TRACE_ERROR ("peer's mdl_id=%d != our mdl_id=%d", evt_data.hdr.mdl_id, p_dcb->mdl_id);
/* change the response code to be an error */
if (evt_data.rsp.rsp_code == MCA_RSP_SUCCESS)
{
@@ -544,7 +544,7 @@
else
{
/* not expecting any response. drop it */
- MCA_TRACE_WARNING0 ("dropping received rsp (not expecting a response)");
+ MCA_TRACE_WARNING ("dropping received rsp (not expecting a response)");
}
GKI_freebuf (p_data);
}
diff --git a/stack/mcap/mca_csm.c b/stack/mcap/mca_csm.c
index af43bef..0077f35 100644
--- a/stack/mcap/mca_csm.c
+++ b/stack/mcap/mca_csm.c
@@ -190,9 +190,9 @@
UINT8 action;
#if (BT_TRACE_VERBOSE == TRUE)
- MCA_TRACE_EVENT3("CCB ccb=%d event=%s state=%s", mca_ccb_to_hdl(p_ccb), mca_ccb_evt_str[event], mca_ccb_st_str[p_ccb->state]);
+ MCA_TRACE_EVENT("CCB ccb=%d event=%s state=%s", mca_ccb_to_hdl(p_ccb), mca_ccb_evt_str[event], mca_ccb_st_str[p_ccb->state]);
#else
- MCA_TRACE_EVENT3("CCB ccb=%d event=%d state=%d", mca_ccb_to_hdl(p_ccb), event, p_ccb->state);
+ MCA_TRACE_EVENT("CCB ccb=%d event=%d state=%d", mca_ccb_to_hdl(p_ccb), event, p_ccb->state);
#endif
/* look up the state table for the current state */
@@ -260,7 +260,7 @@
tMCA_CCB *p_ccb_tmp;
int i;
- MCA_TRACE_DEBUG1("mca_ccb_alloc handle:0x%x", handle);
+ MCA_TRACE_DEBUG("mca_ccb_alloc handle:0x%x", handle);
if (p_rcb)
{
i = handle-1;
@@ -295,7 +295,7 @@
{
tMCA_CTRL evt_data;
- MCA_TRACE_DEBUG1("mca_ccb_dealloc ctrl_vpsm:0x%x", p_ccb->ctrl_vpsm);
+ MCA_TRACE_DEBUG("mca_ccb_dealloc ctrl_vpsm:0x%x", p_ccb->ctrl_vpsm);
mca_dcb_close_by_mdl_id (p_ccb, MCA_ALL_MDL_ID);
if (p_ccb->ctrl_vpsm)
{
diff --git a/stack/mcap/mca_dsm.c b/stack/mcap/mca_dsm.c
index 255b5d4..8b57a69 100644
--- a/stack/mcap/mca_dsm.c
+++ b/stack/mcap/mca_dsm.c
@@ -142,9 +142,9 @@
if (p_dcb == NULL)
return;
#if (BT_TRACE_VERBOSE == TRUE)
- MCA_TRACE_EVENT3("DCB dcb=%d event=%s state=%s", mca_dcb_to_hdl(p_dcb), mca_dcb_evt_str[event], mca_dcb_st_str[p_dcb->state]);
+ MCA_TRACE_EVENT("DCB dcb=%d event=%s state=%s", mca_dcb_to_hdl(p_dcb), mca_dcb_evt_str[event], mca_dcb_st_str[p_dcb->state]);
#else
- MCA_TRACE_EVENT3("DCB dcb=%d event=%d state=%d", mca_dcb_to_hdl(p_dcb), event, p_dcb->state);
+ MCA_TRACE_EVENT("DCB dcb=%d event=%d state=%d", mca_dcb_to_hdl(p_dcb), event, p_dcb->state);
#endif
/* look up the state table for the current state */
@@ -238,7 +238,7 @@
else
{
max = 0;
- MCA_TRACE_WARNING0("Invalid Dep ID");
+ MCA_TRACE_WARNING("Invalid Dep ID");
}
left = max - count;
return left;
@@ -259,7 +259,7 @@
UINT8 event = MCA_CLOSE_IND_EVT;
tMCA_CTRL evt_data;
- MCA_TRACE_DEBUG0("mca_dcb_dealloc");
+ MCA_TRACE_DEBUG("mca_dcb_dealloc");
mca_free_buf ((void **)&p_dcb->p_data);
if (p_data)
{
@@ -325,7 +325,7 @@
tMCA_DCB *p_dcb;
int i;
- MCA_TRACE_DEBUG1("mca_dcb_close_by_mdl_id mdl_id=%d", mdl_id);
+ MCA_TRACE_DEBUG("mca_dcb_close_by_mdl_id mdl_id=%d", mdl_id);
i = mca_ccb_to_hdl(p_ccb)-1;
p_dcb = &mca_cb.dcb[i*MCA_NUM_MDLS];
for (i=0; i<MCA_NUM_MDLS; i++, p_dcb++)
diff --git a/stack/mcap/mca_l2c.c b/stack/mcap/mca_l2c.c
index bc6fe09..fdd9d09 100644
--- a/stack/mcap/mca_l2c.c
+++ b/stack/mcap/mca_l2c.c
@@ -70,17 +70,19 @@
** Returns void
**
*******************************************************************************/
-static void mca_sec_check_complete_term (BD_ADDR bd_addr, void *p_ref_data, UINT8 res)
+static void mca_sec_check_complete_term (BD_ADDR bd_addr, tBT_TRANSPORT transport, void *p_ref_data, UINT8 res)
{
tMCA_TC_TBL *p_tbl = (tMCA_TC_TBL *)p_ref_data;
tL2CAP_CFG_INFO cfg;
tL2CAP_ERTM_INFO ertm_info;
- MCA_TRACE_DEBUG1("mca_sec_check_complete_term res: %d", res);
+ UNUSED(transport);
+
+ MCA_TRACE_DEBUG("mca_sec_check_complete_term res: %d", res);
if ( res == BTM_SUCCESS )
{
- MCA_TRACE_DEBUG2 ("lcid:x%x id:x%x", p_tbl->lcid, p_tbl->id);
+ MCA_TRACE_DEBUG ("lcid:x%x id:x%x", p_tbl->lcid, p_tbl->id);
/* Set the FCR options: control channel mandates ERTM */
ertm_info.preferred_mode = mca_l2c_fcr_opts_def.mode;
ertm_info.allowed_modes = L2CAP_FCR_CHAN_OPT_ERTM;
@@ -115,13 +117,14 @@
** Returns void
**
*******************************************************************************/
-static void mca_sec_check_complete_orig (BD_ADDR bd_addr, void *p_ref_data, UINT8 res)
+static void mca_sec_check_complete_orig (BD_ADDR bd_addr, tBT_TRANSPORT transport, void *p_ref_data, UINT8 res)
{
tMCA_TC_TBL *p_tbl = (tMCA_TC_TBL *)p_ref_data;
tL2CAP_CFG_INFO cfg;
UNUSED(bd_addr);
+ UNUSED(transport);
- MCA_TRACE_DEBUG1("mca_sec_check_complete_orig res: %d", res);
+ MCA_TRACE_DEBUG("mca_sec_check_complete_orig res: %d", res);
if ( res == BTM_SUCCESS )
{
@@ -157,7 +160,7 @@
tL2CAP_ERTM_INFO ertm_info, *p_ertm_info = NULL;
tL2CAP_CFG_INFO cfg;
- MCA_TRACE_EVENT3 ("mca_l2c_cconn_ind_cback: lcid:x%x psm:x%x id:x%x", lcid, psm, id);
+ MCA_TRACE_EVENT ("mca_l2c_cconn_ind_cback: lcid:x%x psm:x%x id:x%x", lcid, psm, id);
/* do we already have a control channel for this peer? */
if ((p_ccb = mca_ccb_by_bd(handle, bd_addr)) == NULL)
@@ -234,7 +237,7 @@
tL2CAP_ERTM_INFO *p_ertm_info = NULL, ertm_info;
const tMCA_CHNL_CFG *p_chnl_cfg;
- MCA_TRACE_EVENT2 ("mca_l2c_dconn_ind_cback: lcid:x%x psm:x%x ", lcid, psm);
+ MCA_TRACE_EVENT ("mca_l2c_dconn_ind_cback: lcid:x%x psm:x%x ", lcid, psm);
if (((p_ccb = mca_ccb_by_bd(handle, bd_addr)) != NULL) && /* find the CCB */
(p_ccb->status == MCA_CCB_STAT_PENDING) && /* this CCB is expecting a MDL */
@@ -296,12 +299,12 @@
tL2CAP_CFG_INFO cfg;
tMCA_CCB *p_ccb;
- MCA_TRACE_DEBUG2("mca_l2c_connect_cfm_cback lcid: x%x, result: %d",
+ MCA_TRACE_DEBUG("mca_l2c_connect_cfm_cback lcid: x%x, result: %d",
lcid, result);
/* look up info for this channel */
if ((p_tbl = mca_tc_tbl_by_lcid(lcid)) != NULL)
{
- MCA_TRACE_DEBUG2("p_tbl state: %d, tcid: %d", p_tbl->state, p_tbl->tcid);
+ MCA_TRACE_DEBUG("p_tbl state: %d, tcid: %d", p_tbl->state, p_tbl->tcid);
/* if in correct state */
if (p_tbl->state == MCA_TC_ST_CONN)
{
@@ -423,7 +426,7 @@
{
p_tbl->peer_mtu = L2CAP_DEFAULT_MTU;
}
- MCA_TRACE_DEBUG3("peer_mtu: %d, lcid: x%x mtu_present:%d",p_tbl->peer_mtu, lcid, p_cfg->mtu_present);
+ MCA_TRACE_DEBUG("peer_mtu: %d, lcid: x%x mtu_present:%d",p_tbl->peer_mtu, lcid, p_cfg->mtu_present);
/* send L2CAP configure response */
memset(p_cfg, 0, sizeof(tL2CAP_CFG_INFO));
@@ -460,7 +463,7 @@
tMCA_TC_TBL *p_tbl;
UINT16 reason = L2CAP_DISC_TIMEOUT;
- MCA_TRACE_DEBUG2("mca_l2c_disconnect_ind_cback lcid: %d, ack_needed: %d",
+ MCA_TRACE_DEBUG("mca_l2c_disconnect_ind_cback lcid: %d, ack_needed: %d",
lcid, ack_needed);
/* look up info for this channel */
if ((p_tbl = mca_tc_tbl_by_lcid(lcid)) != NULL)
@@ -492,7 +495,7 @@
{
tMCA_TC_TBL *p_tbl;
- MCA_TRACE_DEBUG2("mca_l2c_disconnect_cfm_cback lcid: x%x, result: %d",
+ MCA_TRACE_DEBUG("mca_l2c_disconnect_cfm_cback lcid: x%x, result: %d",
lcid, result);
/* look up info for this channel */
if ((p_tbl = mca_tc_tbl_by_lcid(lcid)) != NULL)
diff --git a/stack/mcap/mca_main.c b/stack/mcap/mca_main.c
index d09319d..60b99d9 100644
--- a/stack/mcap/mca_main.c
+++ b/stack/mcap/mca_main.c
@@ -145,7 +145,7 @@
p_tbl->state = MCA_TC_ST_IDLE;
p_tbl->lcid = p_ccb->lcid;
mca_cb.tc.lcid_tbl[p_ccb->lcid - L2CAP_BASE_APPL_CID] = i;
- MCA_TRACE_DEBUG1("mca_tc_tbl_calloc cb_idx: %d", p_tbl->cb_idx);
+ MCA_TRACE_DEBUG("mca_tc_tbl_calloc cb_idx: %d", p_tbl->cb_idx);
return p_tbl;
}
@@ -186,7 +186,7 @@
p_tbl->state = MCA_TC_ST_IDLE;
p_tbl->lcid = p_dcb->lcid;
mca_cb.tc.lcid_tbl[p_dcb->lcid - L2CAP_BASE_APPL_CID] = i;
- MCA_TRACE_DEBUG2("mca_tc_tbl_dalloc tcid: %d, cb_idx: %d", p_tbl->tcid, p_tbl->cb_idx);
+ MCA_TRACE_DEBUG("mca_tc_tbl_dalloc tcid: %d, cb_idx: %d", p_tbl->tcid, p_tbl->cb_idx);
return p_tbl;
}
@@ -303,7 +303,7 @@
close.reason = reason;
close.lcid = p_tbl->lcid;
- MCA_TRACE_DEBUG3("mca_tc_close_ind tcid: %d, cb_idx:%d, old: %d",
+ MCA_TRACE_DEBUG("mca_tc_close_ind tcid: %d, cb_idx:%d, old: %d",
p_tbl->tcid, p_tbl->cb_idx, p_tbl->state);
/* Check if the transport channel is in use */
@@ -352,7 +352,7 @@
tMCA_DCB *p_dcb;
tMCA_OPEN open;
- MCA_TRACE_DEBUG2("mca_tc_open_ind tcid: %d, cb_idx: %d", p_tbl->tcid, p_tbl->cb_idx);
+ MCA_TRACE_DEBUG("mca_tc_open_ind tcid: %d, cb_idx: %d", p_tbl->tcid, p_tbl->cb_idx);
p_tbl->state = MCA_TC_ST_OPEN;
open.peer_mtu = p_tbl->peer_mtu;
@@ -406,7 +406,7 @@
tMCA_CCB *p_ccb;
tMCA_DCB *p_dcb;
- MCA_TRACE_DEBUG2("mca_tc_cong_ind tcid: %d, cb_idx: %d", p_tbl->tcid, p_tbl->cb_idx);
+ MCA_TRACE_DEBUG("mca_tc_cong_ind tcid: %d, cb_idx: %d", p_tbl->tcid, p_tbl->cb_idx);
/* if control channel, notify ccb of congestion */
if (p_tbl->tcid == MCA_CTRL_TCID)
{
@@ -445,7 +445,7 @@
UINT8 *p;
UINT8 rej_rsp_code = MCA_RSP_SUCCESS;
- MCA_TRACE_DEBUG2("mca_tc_data_ind tcid: %d, cb_idx: %d", p_tbl->tcid, p_tbl->cb_idx);
+ MCA_TRACE_DEBUG("mca_tc_data_ind tcid: %d, cb_idx: %d", p_tbl->tcid, p_tbl->cb_idx);
/* if control channel, handle control message */
@@ -463,19 +463,19 @@
{
if (p_buf->len != mca_std_msg_len[*p])
{
- MCA_TRACE_ERROR3 ("opcode: %d required len:%d, got len:%d", *p, mca_std_msg_len[*p], p_buf->len);
+ MCA_TRACE_ERROR ("opcode: %d required len:%d, got len:%d", *p, mca_std_msg_len[*p], p_buf->len);
rej_rsp_code = MCA_RSP_BAD_PARAM;
}
}
else if ((*p >= MCA_FIRST_SYNC_OP) && (*p <= MCA_LAST_SYNC_OP))
{
- MCA_TRACE_ERROR2 ("unsupported SYNC opcode: %d len:%d", *p, p_buf->len);
+ MCA_TRACE_ERROR ("unsupported SYNC opcode: %d len:%d", *p, p_buf->len);
/* reject unsupported request */
rej_rsp_code = MCA_RSP_NO_SUPPORT;
}
else
{
- MCA_TRACE_ERROR2 ("bad opcode: %d len:%d", *p, p_buf->len);
+ MCA_TRACE_ERROR ("bad opcode: %d len:%d", *p, p_buf->len);
/* reject unsupported request */
rej_rsp_code = MCA_RSP_BAD_OPCODE;
}
@@ -563,7 +563,7 @@
if (done)
{
memset (p_rcb, 0, sizeof(tMCA_RCB));
- MCA_TRACE_DEBUG1("Reset MCA_RCB index=%d",handle);
+ MCA_TRACE_DEBUG("Reset MCA_RCB index=%d",handle);
}
}
}
diff --git a/stack/pan/pan_api.c b/stack/pan/pan_api.c
index d08e527..6ba97b2 100644
--- a/stack/pan/pan_api.c
+++ b/stack/pan/pan_api.c
@@ -147,14 +147,14 @@
if ((!(role & (PAN_ROLE_CLIENT | PAN_ROLE_GN_SERVER | PAN_ROLE_NAP_SERVER))) &&
role != PAN_ROLE_INACTIVE)
{
- PAN_TRACE_ERROR1 ("PAN role %d is invalid", role);
+ PAN_TRACE_ERROR ("PAN role %d is invalid", role);
return PAN_FAILURE;
}
/* If the current active role is same as the role being set do nothing */
if (pan_cb.role == role)
{
- PAN_TRACE_EVENT1 ("PAN role already was set to: %d", role);
+ PAN_TRACE_EVENT ("PAN role already was set to: %d", role);
return PAN_SUCCESS;
}
@@ -164,7 +164,7 @@
p_sec = sec_mask;
/* Register all the roles with SDP */
- PAN_TRACE_API1 ("PAN_SetRole() called with role 0x%x", role);
+ PAN_TRACE_API ("PAN_SetRole() called with role 0x%x", role);
#if (defined (PAN_SUPPORTS_ROLE_NAP) && PAN_SUPPORTS_ROLE_NAP == TRUE)
/* Check the service name */
if ((p_nap_name == NULL) || (*p_nap_name == 0))
@@ -265,7 +265,7 @@
pan_close_all_connections ();
pan_cb.role = role;
- PAN_TRACE_EVENT1 ("PAN role set to: %d", role);
+ PAN_TRACE_EVENT ("PAN role set to: %d", role);
return PAN_SUCCESS;
}
@@ -311,7 +311,7 @@
/* Check if PAN is active or not */
if (!(pan_cb.role & src_role))
{
- PAN_TRACE_ERROR1 ("PAN is not active for the role %d", src_role);
+ PAN_TRACE_ERROR ("PAN is not active for the role %d", src_role);
return PAN_FAILURE;
}
@@ -319,7 +319,7 @@
if ((src_role != PAN_ROLE_CLIENT && src_role != PAN_ROLE_GN_SERVER && src_role != PAN_ROLE_NAP_SERVER) ||
(dst_role != PAN_ROLE_CLIENT && dst_role != PAN_ROLE_GN_SERVER && dst_role != PAN_ROLE_NAP_SERVER))
{
- PAN_TRACE_ERROR2 ("Either source %d or destination role %d is invalid", src_role, dst_role);
+ PAN_TRACE_ERROR ("Either source %d or destination role %d is invalid", src_role, dst_role);
return PAN_FAILURE;
}
@@ -336,7 +336,7 @@
** because if there is already a connection we cannot accept
** another connection in PANU role
*/
- PAN_TRACE_ERROR0 ("Cannot make PANU connections when there are more than one connection");
+ PAN_TRACE_ERROR ("Cannot make PANU connections when there are more than one connection");
return PAN_INVALID_SRC_ROLE;
}
@@ -363,7 +363,7 @@
{
if (pan_cb.num_conns && pan_cb.active_role == PAN_ROLE_CLIENT && !pcb)
{
- PAN_TRACE_ERROR0 ("Device already have a connection in PANU role");
+ PAN_TRACE_ERROR ("Device already have a connection in PANU role");
return PAN_INVALID_SRC_ROLE;
}
@@ -383,7 +383,7 @@
/* The role combination is not valid */
else
{
- PAN_TRACE_ERROR2 ("Source %d and Destination roles %d are not valid combination",
+ PAN_TRACE_ERROR ("Source %d and Destination roles %d are not valid combination",
src_role, dst_role);
return PAN_FAILURE;
}
@@ -393,12 +393,12 @@
pcb = pan_allocate_pcb (rem_bda, BNEP_INVALID_HANDLE);
if (!pcb)
{
- PAN_TRACE_ERROR0 ("PAN Connection failed because of no resources");
+ PAN_TRACE_ERROR ("PAN Connection failed because of no resources");
return PAN_NO_RESOURCES;
}
BTM_SetOutService(rem_bda, BTM_SEC_SERVICE_BNEP_PANU, mx_chan_id);
- PAN_TRACE_API6 ("PAN_Connect() for BD Addr %x.%x.%x.%x.%x.%x",
+ PAN_TRACE_API ("PAN_Connect() for BD Addr %x.%x.%x.%x.%x.%x",
rem_bda[0], rem_bda[1], rem_bda[2], rem_bda[3], rem_bda[4], rem_bda[5]);
if (pcb->con_state == PAN_STATE_IDLE)
{
@@ -429,7 +429,7 @@
return result;
}
- PAN_TRACE_DEBUG1 ("PAN_Connect() current active role set to %d", src_role);
+ PAN_TRACE_DEBUG ("PAN_Connect() current active role set to %d", src_role);
pan_cb.prv_active_role = pan_cb.active_role;
pan_cb.active_role = src_role;
*handle = pcb->handle;
@@ -461,7 +461,7 @@
pcb = pan_get_pcb_by_handle (handle);
if(!pcb)
{
- PAN_TRACE_ERROR1 ("PAN connection not found for the handle %d", handle);
+ PAN_TRACE_ERROR ("PAN connection not found for the handle %d", handle);
return PAN_FAILURE;
}
@@ -476,11 +476,11 @@
if (result != BNEP_SUCCESS)
{
- PAN_TRACE_EVENT0 ("Error in closing PAN connection");
+ PAN_TRACE_EVENT ("Error in closing PAN connection");
return PAN_FAILURE;
}
- PAN_TRACE_EVENT0 ("PAN connection closed");
+ PAN_TRACE_EVENT ("PAN connection closed");
return PAN_SUCCESS;
}
@@ -512,7 +512,7 @@
BT_HDR *buffer;
if (pan_cb.role == PAN_ROLE_INACTIVE || !pan_cb.num_conns) {
- PAN_TRACE_ERROR1("%s PAN is not active, data write failed.", __func__);
+ PAN_TRACE_ERROR("%s PAN is not active, data write failed.", __func__);
return PAN_FAILURE;
}
@@ -531,7 +531,7 @@
buffer = (BT_HDR *)GKI_getpoolbuf(PAN_POOL_ID);
if (!buffer) {
- PAN_TRACE_ERROR1("%s unable to acquire buffer from pool.", __func__);
+ PAN_TRACE_ERROR("%s unable to acquire buffer from pool.", __func__);
return PAN_NO_RESOURCES;
}
@@ -574,7 +574,7 @@
if (pan_cb.role == PAN_ROLE_INACTIVE || (!(pan_cb.num_conns)))
{
- PAN_TRACE_ERROR0 ("PAN is not active Data write failed");
+ PAN_TRACE_ERROR ("PAN is not active Data write failed");
GKI_freebuf (p_buf);
return PAN_FAILURE;
}
@@ -604,7 +604,7 @@
if (i == MAX_PAN_CONNS)
{
- PAN_TRACE_ERROR0 ("PAN Don't have any user connections");
+ PAN_TRACE_ERROR ("PAN Don't have any user connections");
GKI_freebuf (p_buf);
return PAN_FAILURE;
}
@@ -612,16 +612,16 @@
result = BNEP_WriteBuf (pan_cb.pcb[i].handle, dst, p_buf, protocol, src, ext);
if (result == BNEP_IGNORE_CMD)
{
- PAN_TRACE_DEBUG0 ("PAN ignored data write for PANU connection");
+ PAN_TRACE_DEBUG ("PAN ignored data write for PANU connection");
return result;
}
else if (result != BNEP_SUCCESS)
{
- PAN_TRACE_ERROR0 ("PAN failed to write data for the PANU connection");
+ PAN_TRACE_ERROR ("PAN failed to write data for the PANU connection");
return result;
}
- PAN_TRACE_DEBUG0 ("PAN successfully wrote data for the PANU connection");
+ PAN_TRACE_DEBUG ("PAN successfully wrote data for the PANU connection");
return PAN_SUCCESS;
}
@@ -629,14 +629,14 @@
pcb = pan_get_pcb_by_handle (handle);
if (!pcb)
{
- PAN_TRACE_ERROR0 ("PAN Buf write for wrong handle");
+ PAN_TRACE_ERROR ("PAN Buf write for wrong handle");
GKI_freebuf (p_buf);
return PAN_FAILURE;
}
if (pcb->con_state != PAN_STATE_CONNECTED)
{
- PAN_TRACE_ERROR0 ("PAN Buf write when conn is not active");
+ PAN_TRACE_ERROR ("PAN Buf write when conn is not active");
GKI_freebuf (p_buf);
return PAN_FAILURE;
}
@@ -644,16 +644,16 @@
result = BNEP_WriteBuf (pcb->handle, dst, p_buf, protocol, src, ext);
if (result == BNEP_IGNORE_CMD)
{
- PAN_TRACE_DEBUG0 ("PAN ignored data buf write to PANU");
+ PAN_TRACE_DEBUG ("PAN ignored data buf write to PANU");
return result;
}
else if (result != BNEP_SUCCESS)
{
- PAN_TRACE_ERROR0 ("PAN failed to send data buf to the PANU");
+ PAN_TRACE_ERROR ("PAN failed to send data buf to the PANU");
return result;
}
- PAN_TRACE_DEBUG0 ("PAN successfully sent data buf to the PANU");
+ PAN_TRACE_DEBUG ("PAN successfully sent data buf to the PANU");
return PAN_SUCCESS;
}
@@ -687,18 +687,18 @@
pcb = pan_get_pcb_by_handle (handle);
if(!pcb)
{
- PAN_TRACE_ERROR1 ("PAN connection not found for the handle %d", handle);
+ PAN_TRACE_ERROR ("PAN connection not found for the handle %d", handle);
return PAN_FAILURE;
}
result = BNEP_SetProtocolFilters (pcb->handle, num_filters, p_start_array, p_end_array);
if (result != BNEP_SUCCESS)
{
- PAN_TRACE_ERROR1 ("PAN failed to set protocol filters for handle %d", handle);
+ PAN_TRACE_ERROR ("PAN failed to set protocol filters for handle %d", handle);
return result;
}
- PAN_TRACE_API1 ("PAN successfully sent protocol filters for handle %d", handle);
+ PAN_TRACE_API ("PAN successfully sent protocol filters for handle %d", handle);
return PAN_SUCCESS;
#else
return PAN_FAILURE;
@@ -736,7 +736,7 @@
pcb = pan_get_pcb_by_handle (handle);
if(!pcb)
{
- PAN_TRACE_ERROR1 ("PAN connection not found for the handle %d", handle);
+ PAN_TRACE_ERROR ("PAN connection not found for the handle %d", handle);
return PAN_FAILURE;
}
@@ -744,11 +744,11 @@
num_mcast_filters, p_start_array, p_end_array);
if (result != BNEP_SUCCESS)
{
- PAN_TRACE_ERROR1 ("PAN failed to set multicast filters for handle %d", handle);
+ PAN_TRACE_ERROR ("PAN failed to set multicast filters for handle %d", handle);
return result;
}
- PAN_TRACE_API1 ("PAN successfully sent multicast filters for handle %d", handle);
+ PAN_TRACE_API ("PAN successfully sent multicast filters for handle %d", handle);
return PAN_SUCCESS;
#else
return PAN_FAILURE;
diff --git a/stack/pan/pan_main.c b/stack/pan/pan_main.c
index bfaced6..8306df3 100644
--- a/stack/pan/pan_main.c
+++ b/stack/pan/pan_main.c
@@ -141,7 +141,7 @@
if (wrong_uuid)
{
- PAN_TRACE_ERROR0 ("PAN Connection failed because of wrong remote UUID ");
+ PAN_TRACE_ERROR ("PAN Connection failed because of wrong remote UUID ");
BNEP_ConnectResp (handle, BNEP_CONN_FAILED_SRC_UUID);
return;
}
@@ -175,17 +175,17 @@
if (wrong_uuid)
{
- PAN_TRACE_ERROR0 ("PAN Connection failed because of wrong local UUID ");
+ PAN_TRACE_ERROR ("PAN Connection failed because of wrong local UUID ");
BNEP_ConnectResp (handle, BNEP_CONN_FAILED_DST_UUID);
return;
}
- PAN_TRACE_EVENT5 ("pan_conn_ind_cb - for handle %d, current role %d, dst uuid 0x%x, src uuid 0x%x, role change %s",
+ PAN_TRACE_EVENT ("pan_conn_ind_cb - for handle %d, current role %d, dst uuid 0x%x, src uuid 0x%x, role change %s",
handle, pan_cb.role, local_uuid->uu.uuid16, remote_uuid->uu.uuid16, is_role_change?"YES":"NO");
/* The acceptable UUID size is only 2 */
if (remote_uuid->len != 2)
{
- PAN_TRACE_ERROR1 ("PAN Connection failed because of wrong UUID size %d", remote_uuid->len);
+ PAN_TRACE_ERROR ("PAN Connection failed because of wrong UUID size %d", remote_uuid->len);
BNEP_ConnectResp (handle, BNEP_CONN_FAILED_UUID_SIZE);
return;
}
@@ -196,7 +196,7 @@
remote_uuid->uu.uuid16 != UUID_SERVCLASS_NAP &&
remote_uuid->uu.uuid16 != UUID_SERVCLASS_GN)
{
- PAN_TRACE_ERROR1 ("Src UUID 0x%x is not valid", remote_uuid->uu.uuid16);
+ PAN_TRACE_ERROR ("Src UUID 0x%x is not valid", remote_uuid->uu.uuid16);
BNEP_ConnectResp (handle, BNEP_CONN_FAILED_SRC_UUID);
return;
}
@@ -206,7 +206,7 @@
local_uuid->uu.uuid16 != UUID_SERVCLASS_NAP &&
local_uuid->uu.uuid16 != UUID_SERVCLASS_GN)
{
- PAN_TRACE_ERROR1 ("Dst UUID 0x%x is not valid", remote_uuid->uu.uuid16);
+ PAN_TRACE_ERROR ("Dst UUID 0x%x is not valid", remote_uuid->uu.uuid16);
BNEP_ConnectResp (handle, BNEP_CONN_FAILED_DST_UUID);
return;
}
@@ -219,7 +219,7 @@
((!(pan_cb.role & UUID_SERVCLASS_NAP))
&& local_uuid->uu.uuid16 == UUID_SERVCLASS_NAP))
{
- PAN_TRACE_ERROR1 ("PAN Connection failed because of unsupported destination UUID 0x%x", local_uuid->uu.uuid16);
+ PAN_TRACE_ERROR ("PAN Connection failed because of unsupported destination UUID 0x%x", local_uuid->uu.uuid16);
BNEP_ConnectResp (handle, BNEP_CONN_FAILED_DST_UUID);
return;
}
@@ -243,7 +243,7 @@
/* There are connections other than this one
** so we cann't accept PANU role. Reject
*/
- PAN_TRACE_ERROR0 ("Dst UUID should be either GN or NAP only because there are other connections");
+ PAN_TRACE_ERROR ("Dst UUID should be either GN or NAP only because there are other connections");
BNEP_ConnectResp (handle, BNEP_CONN_FAILED_DST_UUID);
return;
}
@@ -251,7 +251,7 @@
/* If it is already in connected state check for bridging status */
if (pcb->con_state == PAN_STATE_CONNECTED)
{
- PAN_TRACE_EVENT2 ("PAN Role changing New Src 0x%x Dst 0x%x",
+ PAN_TRACE_EVENT ("PAN Role changing New Src 0x%x Dst 0x%x",
remote_uuid->uu.uuid16, local_uuid->uu.uuid16);
pcb->prv_src_uuid = pcb->src_uuid;
@@ -282,23 +282,23 @@
(local_uuid->uu.uuid16 == UUID_SERVCLASS_PANU ||
pan_cb.active_role == PAN_ROLE_CLIENT))
{
- PAN_TRACE_ERROR0 ("PAN already have a connection and can't be user");
+ PAN_TRACE_ERROR ("PAN already have a connection and can't be user");
BNEP_ConnectResp (handle, BNEP_CONN_FAILED_DST_UUID);
return;
}
}
/* This is a new connection */
- PAN_TRACE_DEBUG1 ("New connection indication for handle %d", handle);
+ PAN_TRACE_DEBUG ("New connection indication for handle %d", handle);
pcb = pan_allocate_pcb (p_bda, handle);
if (!pcb)
{
- PAN_TRACE_ERROR0 ("PAN no control block for new connection");
+ PAN_TRACE_ERROR ("PAN no control block for new connection");
BNEP_ConnectResp (handle, BNEP_CONN_FAILED);
return;
}
- PAN_TRACE_EVENT1 ("PAN connection destination UUID is 0x%x", local_uuid->uu.uuid16);
+ PAN_TRACE_EVENT ("PAN connection destination UUID is 0x%x", local_uuid->uu.uuid16);
/* Set the latest active PAN role */
pan_cb.active_role = req_role;
pcb->src_uuid = local_uuid->uu.uuid16;
@@ -336,11 +336,11 @@
UINT8 peer_role;
UNUSED(rem_bda);
- PAN_TRACE_EVENT2 ("pan_connect_state_cb - for handle %d, result %d", handle, result);
+ PAN_TRACE_EVENT ("pan_connect_state_cb - for handle %d, result %d", handle, result);
pcb = pan_get_pcb_by_handle (handle);
if (!pcb)
{
- PAN_TRACE_ERROR1 ("PAN State change indication for wrong handle %d", handle);
+ PAN_TRACE_ERROR ("PAN State change indication for wrong handle %d", handle);
return;
}
@@ -356,7 +356,7 @@
(pcb->con_flags & PAN_FLAGS_CONN_COMPLETED))
{
/* restore the original values */
- PAN_TRACE_EVENT0 ("restoring the connection state to active");
+ PAN_TRACE_EVENT ("restoring the connection state to active");
pcb->con_state = PAN_STATE_CONNECTED;
pcb->con_flags &= (~PAN_FLAGS_CONN_COMPLETED);
@@ -406,7 +406,7 @@
/* Create bridge if the destination role is NAP */
if (pan_cb.pan_bridge_req_cb && pcb->src_uuid == UUID_SERVCLASS_NAP)
{
- PAN_TRACE_EVENT0 ("PAN requesting for bridge");
+ PAN_TRACE_EVENT ("PAN requesting for bridge");
(*pan_cb.pan_bridge_req_cb) (pcb->rem_bda, TRUE);
}
}
@@ -455,17 +455,17 @@
** send it to the host system
*/
- PAN_TRACE_EVENT1 ("pan_data_ind_cb - for handle %d", handle);
+ PAN_TRACE_EVENT ("pan_data_ind_cb - for handle %d", handle);
pcb = pan_get_pcb_by_handle (handle);
if (!pcb)
{
- PAN_TRACE_ERROR1 ("PAN Data indication for wrong handle %d", handle);
+ PAN_TRACE_ERROR ("PAN Data indication for wrong handle %d", handle);
return;
}
if (pcb->con_state != PAN_STATE_CONNECTED)
{
- PAN_TRACE_ERROR2 ("PAN Data indication in wrong state %d for handle %d",
+ PAN_TRACE_ERROR ("PAN Data indication in wrong state %d for handle %d",
pcb->con_state, handle);
return;
}
@@ -473,7 +473,7 @@
/* Check if it is broadcast packet */
if (dst[0] & 0x01)
{
- PAN_TRACE_DEBUG2 ("PAN received broadcast packet on handle %d, src uuid 0x%x",
+ PAN_TRACE_DEBUG ("PAN received broadcast packet on handle %d, src uuid 0x%x",
handle, pcb->src_uuid);
for (i=0; i<MAX_PAN_CONNS; i++)
{
@@ -554,14 +554,14 @@
pcb = pan_get_pcb_by_handle (handle);
if (!pcb)
{
- PAN_TRACE_ERROR1 ("PAN Data buffer indication for wrong handle %d", handle);
+ PAN_TRACE_ERROR ("PAN Data buffer indication for wrong handle %d", handle);
GKI_freebuf (p_buf);
return;
}
if (pcb->con_state != PAN_STATE_CONNECTED)
{
- PAN_TRACE_ERROR2 ("PAN Data indication in wrong state %d for handle %d",
+ PAN_TRACE_ERROR ("PAN Data indication in wrong state %d for handle %d",
pcb->con_state, handle);
GKI_freebuf (p_buf);
return;
@@ -570,7 +570,7 @@
p_data = (UINT8 *)(p_buf + 1) + p_buf->offset;
len = p_buf->len;
- PAN_TRACE_EVENT4 ("pan_data_buf_ind_cb - for handle %d, protocol 0x%x, length %d, ext %d",
+ PAN_TRACE_EVENT ("pan_data_buf_ind_cb - for handle %d, protocol 0x%x, length %d, ext %d",
handle, protocol, len, ext);
if (pcb->src_uuid == UUID_SERVCLASS_NAP)
@@ -583,7 +583,7 @@
{
if (dst[0] & 0x01)
{
- PAN_TRACE_DEBUG2 ("PAN received broadcast packet on handle %d, src uuid 0x%x",
+ PAN_TRACE_DEBUG ("PAN received broadcast packet on handle %d, src uuid 0x%x",
handle, pcb->src_uuid);
for (i=0; i<MAX_PAN_CONNS; i++)
{
@@ -610,10 +610,10 @@
dst_pcb = pan_get_pcb_by_addr (dst);
if (dst_pcb)
{
- PAN_TRACE_EVENT0 ("pan_data_buf_ind_cb - destination PANU found and sending the data");
+ PAN_TRACE_EVENT ("pan_data_buf_ind_cb - destination PANU found and sending the data");
result = BNEP_WriteBuf (dst_pcb->handle, dst, p_buf, protocol, src, ext);
if (result != BNEP_SUCCESS && result != BNEP_IGNORE_CMD)
- PAN_TRACE_ERROR1 ("Failed to write data for PAN connection handle %d", dst_pcb->handle);
+ PAN_TRACE_ERROR ("Failed to write data for PAN connection handle %d", dst_pcb->handle);
return;
}
}
@@ -682,7 +682,7 @@
UINT8 *p_filters)
{
#if (defined (BNEP_SUPPORTS_PROT_FILTERS) && BNEP_SUPPORTS_PROT_FILTERS == TRUE)
- PAN_TRACE_EVENT4 ("pan_proto_filt_ind_cb - called for handle %d with ind %d, result %d, num %d",
+ PAN_TRACE_EVENT ("pan_proto_filt_ind_cb - called for handle %d with ind %d, result %d, num %d",
handle, indication, result, num_filters);
if (pan_cb.pan_pfilt_ind_cb)
@@ -720,7 +720,7 @@
UINT8 *p_filters)
{
#if (defined (BNEP_SUPPORTS_MULTI_FILTERS) && BNEP_SUPPORTS_MULTI_FILTERS == TRUE)
- PAN_TRACE_EVENT4 ("pan_mcast_filt_ind_cb - called for handle %d with ind %d, result %d, num %d",
+ PAN_TRACE_EVENT ("pan_mcast_filt_ind_cb - called for handle %d with ind %d, result %d, num %d",
handle, indication, result, num_filters);
if (pan_cb.pan_mfilt_ind_cb)
diff --git a/stack/pan/pan_utils.c b/stack/pan/pan_utils.c
index 9ebbb75..7a550fa 100644
--- a/stack/pan/pan_utils.c
+++ b/stack/pan/pan_utils.c
@@ -71,7 +71,7 @@
if (sdp_handle == 0)
{
- PAN_TRACE_ERROR0 ("PAN_SetRole - could not create SDP record");
+ PAN_TRACE_ERROR ("PAN_SetRole - could not create SDP record");
return 0;
}
@@ -133,7 +133,7 @@
|| (!BTM_SetSecurityLevel (FALSE, p_name, BTM_SEC_SERVICE_BNEP_NAP,
sec_mask, BT_PSM_BNEP, BTM_SEC_PROTO_BNEP, UUID_SERVCLASS_NAP)))
{
- PAN_TRACE_ERROR0 ("PAN Security Registration failed for PANU");
+ PAN_TRACE_ERROR ("PAN Security Registration failed for PANU");
}
}
#endif
@@ -145,7 +145,7 @@
|| (!BTM_SetSecurityLevel (FALSE, p_name, BTM_SEC_SERVICE_BNEP_GN,
sec_mask, BT_PSM_BNEP, BTM_SEC_PROTO_BNEP, UUID_SERVCLASS_GN)))
{
- PAN_TRACE_ERROR0 ("PAN Security Registration failed for GN");
+ PAN_TRACE_ERROR ("PAN Security Registration failed for GN");
}
}
#endif
@@ -157,7 +157,7 @@
|| (!BTM_SetSecurityLevel (FALSE, p_name, BTM_SEC_SERVICE_BNEP_PANU,
sec_mask, BT_PSM_BNEP, BTM_SEC_PROTO_BNEP, UUID_SERVCLASS_PANU)))
{
- PAN_TRACE_ERROR0 ("PAN Security Registration failed for PANU");
+ PAN_TRACE_ERROR ("PAN Security Registration failed for PANU");
}
}
#endif
@@ -332,7 +332,7 @@
char buff[200];
tPAN_CONN *p_pcb;
- PAN_TRACE_DEBUG3 ("PAN role %x, active role %d, num_conns %d",
+ PAN_TRACE_DEBUG ("PAN role %x, active role %d, num_conns %d",
pan_cb.role, pan_cb.active_role, pan_cb.num_conns);
for (i = 0, p_pcb = pan_cb.pcb; i < MAX_PAN_CONNS; i++, p_pcb++)
@@ -342,7 +342,7 @@
p_pcb->rem_bda[0], p_pcb->rem_bda[1], p_pcb->rem_bda[2],
p_pcb->rem_bda[3], p_pcb->rem_bda[4], p_pcb->rem_bda[5]);
- PAN_TRACE_DEBUG0 (buff);
+ PAN_TRACE_DEBUG (buff);
}
#endif
}
diff --git a/stack/rfcomm/port_api.c b/stack/rfcomm/port_api.c
index 9ea1fca..3643088 100644
--- a/stack/rfcomm/port_api.c
+++ b/stack/rfcomm/port_api.c
@@ -84,7 +84,7 @@
tRFC_MCB *p_mcb = port_find_mcb (bd_addr);
UINT16 rfcomm_mtu;
- RFCOMM_TRACE_API6 ("RFCOMM_CreateConnection() BDA: %02x-%02x-%02x-%02x-%02x-%02x",
+ RFCOMM_TRACE_API ("RFCOMM_CreateConnection() BDA: %02x-%02x-%02x-%02x-%02x-%02x",
bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]);
*p_handle = 0;
@@ -92,7 +92,7 @@
if (( scn == 0 )||(scn >= PORT_MAX_RFC_PORTS ))
{
/* Server Channel Number(SCN) should be in range 1...30 */
- RFCOMM_TRACE_ERROR0 ("RFCOMM_CreateConnection - invalid SCN");
+ RFCOMM_TRACE_ERROR ("RFCOMM_CreateConnection - invalid SCN");
return (PORT_INVALID_SCN);
}
@@ -102,7 +102,7 @@
dlci = (scn << 1) + 1;
else
dlci = (scn << 1);
- RFCOMM_TRACE_API5("RFCOMM_CreateConnection(): scn:%d, dlci:%d, is_server:%d mtu:%d, p_mcb:%p",
+ RFCOMM_TRACE_API("RFCOMM_CreateConnection(): scn:%d, dlci:%d, is_server:%d mtu:%d, p_mcb:%p",
scn, dlci, is_server, mtu, p_mcb);
/* For the server side always allocate a new port. On the client side */
@@ -112,7 +112,7 @@
/* if existing port is also a client port */
if (p_port->is_server == FALSE)
{
- RFCOMM_TRACE_ERROR3 ("RFCOMM_CreateConnection - already opened state:%d, RFC state:%d, MCB state:%d",
+ RFCOMM_TRACE_ERROR ("RFCOMM_CreateConnection - already opened state:%d, RFC state:%d, MCB state:%d",
p_port->state, p_port->rfc.state, p_port->rfc.p_mcb ? p_port->rfc.p_mcb->state : 0);
return (PORT_ALREADY_OPENED);
}
@@ -120,10 +120,10 @@
if ((p_port = port_allocate_port (dlci, bd_addr)) == NULL)
{
- RFCOMM_TRACE_WARNING0 ("RFCOMM_CreateConnection - no resources");
+ RFCOMM_TRACE_WARNING ("RFCOMM_CreateConnection - no resources");
return (PORT_NO_RESOURCES);
}
- RFCOMM_TRACE_API6("RFCOMM_CreateConnection(): scn:%d, dlci:%d, is_server:%d mtu:%d, p_mcb:%p, p_port:%p",
+ RFCOMM_TRACE_API("RFCOMM_CreateConnection(): scn:%d, dlci:%d, is_server:%d mtu:%d, p_mcb:%p, p_port:%p",
scn, dlci, is_server, mtu, p_mcb, p_port);
p_port->default_signal_state = (PORT_DTRDSR_ON | PORT_CTSRTS_ON | PORT_DCD_ON);
@@ -145,7 +145,7 @@
break;
}
- RFCOMM_TRACE_EVENT2 ("RFCOMM_CreateConnection dlci:%d signal state:0x%x", dlci, p_port->default_signal_state);
+ RFCOMM_TRACE_EVENT ("RFCOMM_CreateConnection dlci:%d signal state:0x%x", dlci, p_port->default_signal_state);
*p_handle = p_port->inx;
@@ -209,19 +209,19 @@
{
tPORT *p_port;
- RFCOMM_TRACE_API1 ("RFCOMM_RemoveConnection() handle:%d", handle);
+ RFCOMM_TRACE_API ("RFCOMM_RemoveConnection() handle:%d", handle);
/* Check if handle is valid to avoid crashing */
if ((handle == 0) || (handle > MAX_RFC_PORTS))
{
- RFCOMM_TRACE_ERROR1 ("RFCOMM_RemoveConnection() BAD handle:%d", handle);
+ RFCOMM_TRACE_ERROR ("RFCOMM_RemoveConnection() BAD handle:%d", handle);
return (PORT_BAD_HANDLE);
}
p_port = &rfc_cb.port.port[handle - 1];
if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED))
{
- RFCOMM_TRACE_EVENT1 ("RFCOMM_RemoveConnection() Not opened:%d", handle);
+ RFCOMM_TRACE_EVENT ("RFCOMM_RemoveConnection() Not opened:%d", handle);
return (PORT_SUCCESS);
}
@@ -245,12 +245,12 @@
{
tPORT *p_port;
- RFCOMM_TRACE_API1 ("RFCOMM_RemoveServer() handle:%d", handle);
+ RFCOMM_TRACE_API ("RFCOMM_RemoveServer() handle:%d", handle);
/* Check if handle is valid to avoid crashing */
if ((handle == 0) || (handle > MAX_RFC_PORTS))
{
- RFCOMM_TRACE_ERROR1 ("RFCOMM_RemoveServer() BAD handle:%d", handle);
+ RFCOMM_TRACE_ERROR ("RFCOMM_RemoveServer() BAD handle:%d", handle);
return (PORT_BAD_HANDLE);
}
p_port = &rfc_cb.port.port[handle - 1];
@@ -260,7 +260,7 @@
if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED))
{
- RFCOMM_TRACE_EVENT1 ("RFCOMM_RemoveServer() Not opened:%d", handle);
+ RFCOMM_TRACE_EVENT ("RFCOMM_RemoveServer() Not opened:%d", handle);
return (PORT_SUCCESS);
}
@@ -305,7 +305,7 @@
return (PORT_NOT_OPENED);
}
- RFCOMM_TRACE_API1 ("PORT_SetEventCallback() handle:%d", port_handle);
+ RFCOMM_TRACE_API ("PORT_SetEventCallback() handle:%d", port_handle);
p_port->p_callback = p_port_cb;
@@ -353,7 +353,7 @@
{
tPORT *p_port;
- RFCOMM_TRACE_API2 ("PORT_SetDataCallback() handle:%d cb 0x%x", port_handle, p_port_cb);
+ RFCOMM_TRACE_API ("PORT_SetDataCallback() handle:%d cb 0x%x", port_handle, p_port_cb);
/* Check if handle is valid to avoid crashing */
if ((port_handle == 0) || (port_handle > MAX_RFC_PORTS))
@@ -389,7 +389,7 @@
{
tPORT *p_port;
- RFCOMM_TRACE_API2 ("PORT_SetDataCOCallback() handle:%d cb 0x%x", port_handle, p_port_cb);
+ RFCOMM_TRACE_API ("PORT_SetDataCOCallback() handle:%d cb 0x%x", port_handle, p_port_cb);
/* Check if handle is valid to avoid crashing */
if ((port_handle == 0) || (port_handle > MAX_RFC_PORTS))
@@ -425,7 +425,7 @@
{
tPORT *p_port;
- RFCOMM_TRACE_API2 ("PORT_SetEventMask() handle:%d mask:0x%x", port_handle, mask);
+ RFCOMM_TRACE_API ("PORT_SetEventMask() handle:%d mask:0x%x", port_handle, mask);
/* Check if handle is valid to avoid crashing */
if ((port_handle == 0) || (port_handle > MAX_RFC_PORTS))
@@ -462,7 +462,7 @@
{
tPORT *p_port;
- RFCOMM_TRACE_API1 ("PORT_CheckConnection() handle:%d", handle);
+ RFCOMM_TRACE_API ("PORT_CheckConnection() handle:%d", handle);
/* Check if handle is valid to avoid crashing */
if ((handle == 0) || (handle > MAX_RFC_PORTS))
@@ -565,7 +565,7 @@
tPORT *p_port;
UINT8 baud_rate;
- RFCOMM_TRACE_API1 ("PORT_SetState() handle:%d", handle);
+ RFCOMM_TRACE_API ("PORT_SetState() handle:%d", handle);
/* Check if handle is valid to avoid crashing */
if ((handle == 0) || (handle > MAX_RFC_PORTS))
@@ -585,7 +585,7 @@
return (PORT_LINE_ERR);
}
- RFCOMM_TRACE_API2 ("PORT_SetState() handle:%d FC_TYPE:0x%x", handle,
+ RFCOMM_TRACE_API ("PORT_SetState() handle:%d FC_TYPE:0x%x", handle,
p_settings->fc_type);
baud_rate = p_port->user_port_pars.baud_rate;
@@ -613,7 +613,7 @@
{
tPORT *p_port;
- RFCOMM_TRACE_API1 ("PORT_GetRxQueueCnt() handle:%d", handle);
+ RFCOMM_TRACE_API ("PORT_GetRxQueueCnt() handle:%d", handle);
/* Check if handle is valid to avoid crashing */
if ((handle == 0) || (handle > MAX_RFC_PORTS))
@@ -635,7 +635,7 @@
*p_rx_queue_count = p_port->rx.queue_size;
- RFCOMM_TRACE_API2 ("PORT_GetRxQueueCnt() p_rx_queue_count:%d, p_port->rx.queue.count = %d",
+ RFCOMM_TRACE_API ("PORT_GetRxQueueCnt() p_rx_queue_count:%d, p_port->rx.queue.count = %d",
*p_rx_queue_count, p_port->rx.queue_size);
return (PORT_SUCCESS);
@@ -657,7 +657,7 @@
{
tPORT *p_port;
- RFCOMM_TRACE_API1 ("PORT_GetState() handle:%d", handle);
+ RFCOMM_TRACE_API ("PORT_GetState() handle:%d", handle);
/* Check if handle is valid to avoid crashing */
if ((handle == 0) || (handle > MAX_RFC_PORTS))
@@ -698,7 +698,7 @@
tPORT *p_port;
UINT8 old_modem_signal;
- RFCOMM_TRACE_API2 ("PORT_Control() handle:%d signal:0x%x", handle, signal);
+ RFCOMM_TRACE_API ("PORT_Control() handle:%d signal:0x%x", handle, signal);
/* Check if handle is valid to avoid crashing */
if ((handle == 0) || (handle > MAX_RFC_PORTS))
@@ -758,7 +758,7 @@
port_start_control (p_port);
- RFCOMM_TRACE_EVENT4 ("PORT_Control DTR_DSR : %d, RTS_CTS : %d, RI : %d, DCD : %d",
+ RFCOMM_TRACE_EVENT ("PORT_Control DTR_DSR : %d, RTS_CTS : %d, RI : %d, DCD : %d",
((p_port->local_ctrl.modem_signal & MODEM_SIGNAL_DTRDSR) ? 1 : 0),
((p_port->local_ctrl.modem_signal & MODEM_SIGNAL_RTSCTS) ? 1 : 0),
((p_port->local_ctrl.modem_signal & MODEM_SIGNAL_RI) ? 1 : 0),
@@ -786,7 +786,7 @@
BOOLEAN old_fc;
UINT32 events;
- RFCOMM_TRACE_API2 ("PORT_FlowControl() handle:%d enable: %d", handle, enable);
+ RFCOMM_TRACE_API ("PORT_FlowControl() handle:%d enable: %d", handle, enable);
/* Check if handle is valid to avoid crashing */
if ((handle == 0) || (handle > MAX_RFC_PORTS))
@@ -865,7 +865,7 @@
BOOLEAN old_fc;
UINT32 events;
- RFCOMM_TRACE_API2 ("PORT_FlowControl() handle:%d enable: %d", handle, enable);
+ RFCOMM_TRACE_API ("PORT_FlowControl() handle:%d enable: %d", handle, enable);
/* Check if handle is valid to avoid crashing */
if ((handle == 0) || (handle > MAX_RFC_PORTS))
@@ -957,7 +957,7 @@
*p_signal = p_port->peer_ctrl.modem_signal;
- RFCOMM_TRACE_API2 ("PORT_GetModemStatus() handle:%d signal:%x", handle, *p_signal);
+ RFCOMM_TRACE_API ("PORT_GetModemStatus() handle:%d signal:%x", handle, *p_signal);
return (PORT_SUCCESS);
}
@@ -983,7 +983,7 @@
{
tPORT *p_port;
- RFCOMM_TRACE_API1 ("PORT_ClearError() handle:%d", handle);
+ RFCOMM_TRACE_API ("PORT_ClearError() handle:%d", handle);
if ((handle == 0) || (handle > MAX_RFC_PORTS))
{
@@ -1022,7 +1022,7 @@
{
tPORT *p_port;
- RFCOMM_TRACE_API2 ("PORT_SendError() handle:%d errors:0x%x", handle, errors);
+ RFCOMM_TRACE_API ("PORT_SendError() handle:%d errors:0x%x", handle, errors);
if ((handle == 0) || (handle > MAX_RFC_PORTS))
{
@@ -1061,7 +1061,7 @@
{
tPORT *p_port;
- /* RFCOMM_TRACE_API1 ("PORT_GetQueueStatus() handle:%d", handle); */
+ /* RFCOMM_TRACE_API ("PORT_GetQueueStatus() handle:%d", handle); */
if ((handle == 0) || (handle > MAX_RFC_PORTS))
{
@@ -1113,7 +1113,7 @@
UINT16 count;
UINT32 events;
- RFCOMM_TRACE_API2 ("PORT_Purge() handle:%d flags:0x%x", handle, purge_flags);
+ RFCOMM_TRACE_API ("PORT_Purge() handle:%d flags:0x%x", handle, purge_flags);
/* Check if handle is valid to avoid crashing */
if ((handle == 0) || (handle > MAX_RFC_PORTS))
@@ -1190,7 +1190,7 @@
BT_HDR *p_buf;
UINT16 count;
- RFCOMM_TRACE_API2 ("PORT_ReadData() handle:%d max_len:%d", handle, max_len);
+ RFCOMM_TRACE_API ("PORT_ReadData() handle:%d max_len:%d", handle, max_len);
/* Initialize this in case of an error */
*p_len = 0;
@@ -1264,11 +1264,11 @@
if (*p_len == 1)
{
- RFCOMM_TRACE_EVENT3 ("PORT_ReadData queue:%d returned:%d %x", p_port->rx.queue_size, *p_len, (p_data[0]));
+ RFCOMM_TRACE_EVENT ("PORT_ReadData queue:%d returned:%d %x", p_port->rx.queue_size, *p_len, (p_data[0]));
}
else
{
- RFCOMM_TRACE_EVENT2 ("PORT_ReadData queue:%d returned:%d", p_port->rx.queue_size, *p_len);
+ RFCOMM_TRACE_EVENT ("PORT_ReadData queue:%d returned:%d", p_port->rx.queue_size, *p_len);
}
/* If rfcomm suspended traffic from the peer based on the rx_queue_size */
@@ -1295,7 +1295,7 @@
tPORT *p_port;
BT_HDR *p_buf;
- RFCOMM_TRACE_API1 ("PORT_Read() handle:%d", handle);
+ RFCOMM_TRACE_API ("PORT_Read() handle:%d", handle);
/* Check if handle is valid to avoid crashing */
if ((handle == 0) || (handle > MAX_RFC_PORTS))
@@ -1370,7 +1370,7 @@
if ((p_port->tx.queue_size > PORT_TX_CRITICAL_WM)
|| (p_port->tx.queue.count > PORT_TX_BUF_CRITICAL_WM))
{
- RFCOMM_TRACE_WARNING1 ("PORT_Write: Queue size: %d",
+ RFCOMM_TRACE_WARNING ("PORT_Write: Queue size: %d",
p_port->tx.queue_size);
GKI_freebuf (p_buf);
@@ -1381,7 +1381,7 @@
return (PORT_TX_FULL);
}
- RFCOMM_TRACE_EVENT4 ("PORT_Write : Data is enqued. flow disabled %d peer_ready %d state %d ctrl_state %x",
+ RFCOMM_TRACE_EVENT ("PORT_Write : Data is enqued. flow disabled %d peer_ready %d state %d ctrl_state %x",
p_port->tx.peer_fc,
(p_port->rfc.p_mcb && p_port->rfc.p_mcb->peer_ready),
p_port->rfc.state,
@@ -1394,7 +1394,7 @@
}
else
{
- RFCOMM_TRACE_EVENT0 ("PORT_Write : Data is being sent");
+ RFCOMM_TRACE_EVENT ("PORT_Write : Data is being sent");
RFCOMM_DataReq (p_port->rfc.p_mcb, p_port->dlci, p_buf);
return (PORT_SUCCESS);
@@ -1418,7 +1418,7 @@
UINT32 event = 0;
int rc;
- RFCOMM_TRACE_API1 ("PORT_Write() handle:%d", handle);
+ RFCOMM_TRACE_API ("PORT_Write() handle:%d", handle);
/* Check if handle is valid to avoid crashing */
if ((handle == 0) || (handle > MAX_RFC_PORTS))
@@ -1437,7 +1437,7 @@
if (p_port->line_status)
{
- RFCOMM_TRACE_WARNING1 ("PORT_Write: Data dropped line_status:0x%x",
+ RFCOMM_TRACE_WARNING ("PORT_Write: Data dropped line_status:0x%x",
p_port->line_status);
GKI_freebuf (p_buf);
return (PORT_LINE_ERR);
@@ -1486,7 +1486,7 @@
int rc = 0;
UINT16 length;
- RFCOMM_TRACE_API1 ("PORT_WriteDataCO() handle:%d", handle);
+ RFCOMM_TRACE_API ("PORT_WriteDataCO() handle:%d", handle);
int written;
*p_len = 0;
@@ -1499,13 +1499,13 @@
if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED))
{
- RFCOMM_TRACE_WARNING1 ("PORT_WriteDataByFd() no port state:%d", p_port->state);
+ RFCOMM_TRACE_WARNING ("PORT_WriteDataByFd() no port state:%d", p_port->state);
return (PORT_NOT_OPENED);
}
if (!p_port->peer_mtu)
{
- RFCOMM_TRACE_ERROR1 ("PORT_WriteDataByFd() peer_mtu:%d", p_port->peer_mtu);
+ RFCOMM_TRACE_ERROR ("PORT_WriteDataByFd() peer_mtu:%d", p_port->peer_mtu);
return (PORT_UNKNOWN_ERROR);
}
int available = 0;
@@ -1513,7 +1513,7 @@
if(p_port->p_data_co_callback(handle, (UINT8*)&available, sizeof(available),
DATA_CO_CALLBACK_TYPE_OUTGOING_SIZE) == FALSE)
{
- RFCOMM_TRACE_ERROR1("p_data_co_callback DATA_CO_CALLBACK_TYPE_INCOMING_SIZE failed, available:%d", available);
+ RFCOMM_TRACE_ERROR("p_data_co_callback DATA_CO_CALLBACK_TYPE_INCOMING_SIZE failed, available:%d", available);
return (PORT_UNKNOWN_ERROR);
}
if(available == 0)
@@ -1561,7 +1561,13 @@
/* if we're over buffer high water mark, we're done */
if ((p_port->tx.queue_size > PORT_TX_HIGH_WM)
|| (p_port->tx.queue.count > PORT_TX_BUF_HIGH_WM))
+ {
+ port_flow_control_user(p_port);
+ event |= PORT_EV_FC;
+ debug("tx queue is full,tx.queue_size:%d,tx.queue.count:%d,available:%d",
+ p_port->tx.queue_size, p_port->tx.queue.count, available);
break;
+ }
/* continue with rfcomm data write */
p_buf = (BT_HDR *)GKI_getpoolbuf (RFCOMM_DATA_POOL_ID);
@@ -1588,7 +1594,7 @@
}
- RFCOMM_TRACE_EVENT1 ("PORT_WriteData %d bytes", length);
+ RFCOMM_TRACE_EVENT ("PORT_WriteData %d bytes", length);
rc = port_write (p_port, p_buf);
@@ -1640,7 +1646,7 @@
int rc = 0;
UINT16 length;
- RFCOMM_TRACE_API1 ("PORT_WriteData() max_len:%d", max_len);
+ RFCOMM_TRACE_API ("PORT_WriteData() max_len:%d", max_len);
*p_len = 0;
@@ -1653,13 +1659,13 @@
if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED))
{
- RFCOMM_TRACE_WARNING1 ("PORT_WriteData() no port state:%d", p_port->state);
+ RFCOMM_TRACE_WARNING ("PORT_WriteData() no port state:%d", p_port->state);
return (PORT_NOT_OPENED);
}
if (!max_len || !p_port->peer_mtu)
{
- RFCOMM_TRACE_ERROR1 ("PORT_WriteData() peer_mtu:%d", p_port->peer_mtu);
+ RFCOMM_TRACE_ERROR ("PORT_WriteData() peer_mtu:%d", p_port->peer_mtu);
return (PORT_UNKNOWN_ERROR);
}
@@ -1712,7 +1718,7 @@
memcpy ((UINT8 *)(p_buf + 1) + p_buf->offset, p_data, length);
- RFCOMM_TRACE_EVENT1 ("PORT_WriteData %d bytes", length);
+ RFCOMM_TRACE_EVENT ("PORT_WriteData %d bytes", length);
rc = port_write (p_port, p_buf);
@@ -1760,7 +1766,7 @@
BT_HDR *p_buf;
tPORT *p_port;
- RFCOMM_TRACE_API1 ("PORT_Test() len:%d", len);
+ RFCOMM_TRACE_API ("PORT_Test() len:%d", len);
if ((handle == 0) || (handle > MAX_RFC_PORTS))
{
diff --git a/stack/rfcomm/port_rfc.c b/stack/rfcomm/port_rfc.c
index 003cbb5..5704c01 100644
--- a/stack/rfcomm/port_rfc.c
+++ b/stack/rfcomm/port_rfc.c
@@ -56,12 +56,12 @@
{
tRFC_MCB *p_mcb;
- RFCOMM_TRACE_EVENT1 ("port_open_continue, p_port:%p", p_port);
+ RFCOMM_TRACE_EVENT ("port_open_continue, p_port:%p", p_port);
/* Check if multiplexer channel has already been established */
if ((p_mcb = rfc_alloc_multiplexer_channel (p_port->bd_addr, TRUE)) == NULL)
{
- RFCOMM_TRACE_WARNING0 ("port_open_continue no mx channel");
+ RFCOMM_TRACE_WARNING ("port_open_continue no mx channel");
port_release_port (p_port);
return (PORT_NO_RESOURCES);
}
@@ -89,7 +89,7 @@
{
/* MX state machine ignores RFC_MX_EVENT_START_REQ in these states */
/* When it enters RFC_MX_STATE_CONNECTED, it will check any openning ports */
- RFCOMM_TRACE_DEBUG1 ("port_open_continue: mx state(%d) mx channel is openning", p_mcb->state);
+ RFCOMM_TRACE_DEBUG ("port_open_continue: mx state(%d) mx channel is openning", p_mcb->state);
}
return (PORT_SUCCESS);
}
@@ -203,7 +203,7 @@
int i;
BOOLEAN no_ports_up = TRUE;
- RFCOMM_TRACE_EVENT1 ("PORT_StartCnf result:%d", result);
+ RFCOMM_TRACE_EVENT ("PORT_StartCnf result:%d", result);
p_port = &rfc_cb.port.port[0];
for (i = 0; i < MAX_RFC_PORTS; i++, p_port++)
@@ -216,7 +216,7 @@
RFCOMM_ParNegReq (p_mcb, p_port->dlci, p_port->mtu);
else
{
- RFCOMM_TRACE_WARNING1 ("PORT_StartCnf failed result:%d", result);
+ RFCOMM_TRACE_WARNING ("PORT_StartCnf failed result:%d", result);
/* Warning: result is also set to 4 when l2cap connection
fails due to l2cap connect cnf (no_resources) */
@@ -264,7 +264,7 @@
tPORT *p_port;
int i;
- RFCOMM_TRACE_EVENT0 ("PORT_StartInd");
+ RFCOMM_TRACE_EVENT ("PORT_StartInd");
p_port = &rfc_cb.port.port[0];
for (i = 0; i < MAX_RFC_PORTS; i++, p_port++)
@@ -272,7 +272,7 @@
if ((p_port->rfc.p_mcb == NULL)
|| (p_port->rfc.p_mcb == p_mcb))
{
- RFCOMM_TRACE_DEBUG1("PORT_StartInd, RFCOMM_StartRsp RFCOMM_SUCCESS: p_mcb:%p", p_mcb);
+ RFCOMM_TRACE_DEBUG("PORT_StartInd, RFCOMM_StartRsp RFCOMM_SUCCESS: p_mcb:%p", p_mcb);
RFCOMM_StartRsp (p_mcb, RFCOMM_SUCCESS);
return;
}
@@ -297,7 +297,7 @@
UINT8 our_cl;
UINT8 our_k;
- RFCOMM_TRACE_EVENT2 ("PORT_ParNegInd dlci:%d mtu:%d", dlci, mtu);
+ RFCOMM_TRACE_EVENT ("PORT_ParNegInd dlci:%d mtu:%d", dlci, mtu);
if (!p_port)
{
@@ -310,7 +310,7 @@
/* check if this is the last port open, some headsets have
problem, they don't disconnect if we send DM */
rfc_check_mcb_active( p_mcb );
- RFCOMM_TRACE_EVENT0( "PORT_ParNegInd: port not found" );
+ RFCOMM_TRACE_EVENT( "PORT_ParNegInd: port not found" );
return;
}
p_mcb->port_inx[dlci] = p_port->inx;
@@ -386,7 +386,7 @@
{
tPORT *p_port = port_find_mcb_dlci_port (p_mcb, dlci);
- RFCOMM_TRACE_EVENT4 ("PORT_ParNegCnf dlci:%d mtu:%d cl: %d k: %d", dlci, mtu, cl, k);
+ RFCOMM_TRACE_EVENT ("PORT_ParNegCnf dlci:%d mtu:%d cl: %d k: %d", dlci, mtu, cl, k);
if (!p_port)
return;
@@ -447,8 +447,8 @@
{
tPORT *p_port = port_find_mcb_dlci_port (p_mcb, dlci);
- RFCOMM_TRACE_DEBUG4 ("PORT_DlcEstablishInd p_mcb:%p, dlci:%d mtu:%di, p_port:%p", p_mcb, dlci, mtu, p_port);
- RFCOMM_TRACE_DEBUG6 ("PORT_DlcEstablishInd p_mcb addr:%02x:%02x:%02x:%02x:%02x:%02x",
+ RFCOMM_TRACE_DEBUG ("PORT_DlcEstablishInd p_mcb:%p, dlci:%d mtu:%di, p_port:%p", p_mcb, dlci, mtu, p_port);
+ RFCOMM_TRACE_DEBUG ("PORT_DlcEstablishInd p_mcb addr:%02x:%02x:%02x:%02x:%02x:%02x",
p_mcb->bd_addr[0], p_mcb->bd_addr[1], p_mcb->bd_addr[2],
p_mcb->bd_addr[3], p_mcb->bd_addr[4], p_mcb->bd_addr[5]);
@@ -499,7 +499,7 @@
{
tPORT *p_port = port_find_mcb_dlci_port (p_mcb, dlci);
- RFCOMM_TRACE_EVENT3 ("PORT_DlcEstablishCnf dlci:%d mtu:%d result:%d", dlci, mtu, result);
+ RFCOMM_TRACE_EVENT ("PORT_DlcEstablishCnf dlci:%d mtu:%d result:%d", dlci, mtu, result);
if (!p_port)
return;
@@ -551,7 +551,7 @@
{
tPORT *p_port = port_find_mcb_dlci_port (p_mcb, dlci);
- RFCOMM_TRACE_EVENT0 ("PORT_PortNegInd");
+ RFCOMM_TRACE_EVENT ("PORT_PortNegInd");
if (!p_port)
{
@@ -584,11 +584,11 @@
tPORT *p_port = port_find_mcb_dlci_port (p_mcb, dlci);
UNUSED(p_pars);
- RFCOMM_TRACE_EVENT0 ("PORT_PortNegCnf");
+ RFCOMM_TRACE_EVENT ("PORT_PortNegCnf");
if (!p_port)
{
- RFCOMM_TRACE_WARNING0 ("PORT_PortNegCnf no port");
+ RFCOMM_TRACE_WARNING ("PORT_PortNegCnf no port");
return;
}
/* Port negotiation failed. Drop the connection */
@@ -608,7 +608,7 @@
}
else
{
- RFCOMM_TRACE_WARNING0 ("PORT_PortNegCnf Control Already sent");
+ RFCOMM_TRACE_WARNING ("PORT_PortNegCnf Control Already sent");
}
}
@@ -627,7 +627,7 @@
UINT32 event;
UINT8 old_signals;
- RFCOMM_TRACE_EVENT0 ("PORT_ControlInd");
+ RFCOMM_TRACE_EVENT ("PORT_ControlInd");
if (!p_port)
return;
@@ -663,7 +663,7 @@
if (event && p_port->p_callback)
(p_port->p_callback)(event, p_port->inx);
- RFCOMM_TRACE_EVENT4 ("PORT_ControlInd DTR_DSR : %d, RTS_CTS : %d, RI : %d, DCD : %d",
+ RFCOMM_TRACE_EVENT ("PORT_ControlInd DTR_DSR : %d, RTS_CTS : %d, RI : %d, DCD : %d",
((p_port->peer_ctrl.modem_signal & MODEM_SIGNAL_DTRDSR) ? 1 : 0),
((p_port->peer_ctrl.modem_signal & MODEM_SIGNAL_RTSCTS) ? 1 : 0),
((p_port->peer_ctrl.modem_signal & MODEM_SIGNAL_RI) ? 1 : 0),
@@ -686,7 +686,7 @@
UINT32 event = 0;
UNUSED(p_pars);
- RFCOMM_TRACE_EVENT0 ("PORT_ControlCnf");
+ RFCOMM_TRACE_EVENT ("PORT_ControlCnf");
if (!p_port)
return;
@@ -723,7 +723,7 @@
tPORT *p_port = port_find_mcb_dlci_port (p_mcb, dlci);
UINT32 event = 0;
- RFCOMM_TRACE_EVENT0 ("PORT_LineStatusInd");
+ RFCOMM_TRACE_EVENT ("PORT_LineStatusInd");
if (!p_port)
return;
@@ -756,7 +756,7 @@
{
tPORT *p_port = port_find_mcb_dlci_port (p_mcb, dlci);
- RFCOMM_TRACE_EVENT0 ("PORT_DlcReleaseInd");
+ RFCOMM_TRACE_EVENT ("PORT_DlcReleaseInd");
if (!p_port)
return;
@@ -778,7 +778,7 @@
tPORT *p_port;
int i;
- RFCOMM_TRACE_EVENT0 ("PORT_CloseInd");
+ RFCOMM_TRACE_EVENT ("PORT_CloseInd");
p_port = &rfc_cb.port.port[0];
for (i = 0; i < MAX_RFC_PORTS; i++, p_port++)
@@ -804,7 +804,7 @@
tPORT *p_port;
int i;
- RFCOMM_TRACE_EVENT0 ("Port_TimeOutCloseMux");
+ RFCOMM_TRACE_EVENT ("Port_TimeOutCloseMux");
p_port = &rfc_cb.port.port[0];
for (i = 0; i < MAX_RFC_PORTS; i++, p_port++)
@@ -833,7 +833,7 @@
UINT8 *p;
int i;
- RFCOMM_TRACE_EVENT4("PORT_DataInd with data length %d, p_mcb:%p,p_port:%p,dlci:%d",
+ RFCOMM_TRACE_EVENT("PORT_DataInd with data length %d, p_mcb:%p,p_port:%p,dlci:%d",
p_buf->len, p_mcb, p_port, dlci);
if (!p_port)
{
@@ -851,7 +851,7 @@
//GKI_freebuf (p_buf);
return;
}
- else RFCOMM_TRACE_ERROR1("PORT_DataInd, p_port:%p, p_data_co_callback is null", p_port);
+ else RFCOMM_TRACE_ERROR("PORT_DataInd, p_port:%p, p_data_co_callback is null", p_port);
/* If client registered callback we can just deliver receive data */
if (p_port->p_data_callback)
{
@@ -867,7 +867,7 @@
if ((p_port->rx.queue_size + p_buf->len > PORT_RX_CRITICAL_WM)
|| (p_port->rx.queue.count + 1 > p_port->rx_buf_critical))
{
- RFCOMM_TRACE_EVENT0 ("PORT_DataInd. Buffer over run. Dropping the buffer");
+ RFCOMM_TRACE_EVENT ("PORT_DataInd. Buffer over run. Dropping the buffer");
GKI_freebuf (p_buf);
RFCOMM_LineStatusReq (p_mcb, dlci, LINE_STATUS_OVERRUN);
@@ -932,7 +932,7 @@
UINT32 events = 0;
int i;
- RFCOMM_TRACE_EVENT1 ("PORT_FlowInd fc:%d", enable_data);
+ RFCOMM_TRACE_EVENT ("PORT_FlowInd fc:%d", enable_data);
if (dlci == 0)
{
@@ -1006,7 +1006,7 @@
PORT_SCHEDULE_UNLOCK;
- RFCOMM_TRACE_DEBUG1 ("Sending RFCOMM_DataReq tx.queue_size=%d", p_port->tx.queue_size);
+ RFCOMM_TRACE_DEBUG ("Sending RFCOMM_DataReq tx.queue_size=%d", p_port->tx.queue_size);
RFCOMM_DataReq (p_port->rfc.p_mcb, p_port->dlci, p_buf);
@@ -1050,7 +1050,7 @@
if ((p_port->state == PORT_STATE_OPENING) && (p_port->is_server))
{
/* The servr side has not been informed that connection is up, ignore */
- RFCOMM_TRACE_EVENT0 ("port_rfc_closed in OPENING state ignored");
+ RFCOMM_TRACE_EVENT ("port_rfc_closed in OPENING state ignored");
rfc_port_timer_stop (p_port);
p_port->rfc.state = RFC_STATE_CLOSED;
@@ -1085,7 +1085,7 @@
if(p_port->ev_mask & PORT_EV_CONNECT_ERR)
events |= PORT_EV_CONNECT_ERR;
}
- RFCOMM_TRACE_EVENT2 ("port_rfc_closed state:%d sending events:%x", p_port->state, events);
+ RFCOMM_TRACE_EVENT ("port_rfc_closed state:%d sending events:%x", p_port->state, events);
if ((p_port->p_callback != NULL) && events)
p_port->p_callback (events, p_port->inx);
diff --git a/stack/rfcomm/port_utils.c b/stack/rfcomm/port_utils.c
index 0f7c03b..642ddb8 100644
--- a/stack/rfcomm/port_utils.c
+++ b/stack/rfcomm/port_utils.c
@@ -85,8 +85,8 @@
port_set_defaults (p_port);
rfc_cb.rfc.last_port = yy;
- RFCOMM_TRACE_DEBUG3("rfc_cb.port.port[%d]:%p allocated, last_port:%d", yy, p_port, rfc_cb.rfc.last_port);
- RFCOMM_TRACE_DEBUG6("port_allocate_port:bd_addr:%02x:%02x:%02x:%02x:%02x:%02x",
+ RFCOMM_TRACE_DEBUG("rfc_cb.port.port[%d]:%p allocated, last_port:%d", yy, p_port, rfc_cb.rfc.last_port);
+ RFCOMM_TRACE_DEBUG("port_allocate_port:bd_addr:%02x:%02x:%02x:%02x:%02x:%02x",
bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]);
return (p_port);
}
@@ -152,7 +152,7 @@
if (packet_size == 0)
{
/* something is very wrong */
- RFCOMM_TRACE_WARNING0 ("port_select_mtu bad packet size");
+ RFCOMM_TRACE_WARNING ("port_select_mtu bad packet size");
p_port->mtu = RFCOMM_DEFAULT_MTU;
}
else
@@ -168,18 +168,18 @@
if ((L2CAP_MTU_SIZE + L2CAP_PKT_OVERHEAD) >= packet_size)
{
p_port->mtu = ((L2CAP_MTU_SIZE + L2CAP_PKT_OVERHEAD) / packet_size * packet_size) - RFCOMM_DATA_OVERHEAD - L2CAP_PKT_OVERHEAD;
- RFCOMM_TRACE_DEBUG1 ("port_select_mtu selected %d based on connection speed", p_port->mtu);
+ RFCOMM_TRACE_DEBUG ("port_select_mtu selected %d based on connection speed", p_port->mtu);
}
else
{
p_port->mtu = L2CAP_MTU_SIZE - RFCOMM_DATA_OVERHEAD;
- RFCOMM_TRACE_DEBUG1 ("port_select_mtu selected %d based on l2cap PDU size", p_port->mtu);
+ RFCOMM_TRACE_DEBUG ("port_select_mtu selected %d based on l2cap PDU size", p_port->mtu);
}
}
}
else
{
- RFCOMM_TRACE_DEBUG1 ("port_select_mtu application selected %d", p_port->mtu);
+ RFCOMM_TRACE_DEBUG ("port_select_mtu application selected %d", p_port->mtu);
}
p_port->credit_rx_max = (PORT_RX_HIGH_WM / p_port->mtu);
if( p_port->credit_rx_max > PORT_RX_BUF_HIGH_WM )
@@ -190,7 +190,7 @@
p_port->rx_buf_critical = (PORT_RX_CRITICAL_WM / p_port->mtu);
if( p_port->rx_buf_critical > PORT_RX_BUF_CRITICAL_WM )
p_port->rx_buf_critical = PORT_RX_BUF_CRITICAL_WM;
- RFCOMM_TRACE_DEBUG3 ("port_select_mtu credit_rx_max %d, credit_rx_low %d, rx_buf_critical %d",
+ RFCOMM_TRACE_DEBUG ("port_select_mtu credit_rx_max %d, credit_rx_low %d, rx_buf_critical %d",
p_port->credit_rx_max, p_port->credit_rx_low, p_port->rx_buf_critical);
}
@@ -212,7 +212,7 @@
tPORT_STATE user_port_pars;
PORT_SCHEDULE_LOCK;
- RFCOMM_TRACE_DEBUG1("port_release_port, p_port:%p", p_port);
+ RFCOMM_TRACE_DEBUG("port_release_port, p_port:%p", p_port);
while ((p_buf = (BT_HDR *)GKI_dequeue (&p_port->rx.queue)) != NULL)
GKI_freebuf (p_buf);
@@ -229,7 +229,7 @@
if (p_port->rfc.state == RFC_STATE_CLOSED)
{
- RFCOMM_TRACE_DEBUG0 ("rfc_port_closed DONE");
+ RFCOMM_TRACE_DEBUG ("rfc_port_closed DONE");
if (p_port->rfc.p_mcb)
{
p_port->rfc.p_mcb->port_inx[p_port->dlci] = 0;
@@ -238,10 +238,10 @@
rfc_check_mcb_active (p_port->rfc.p_mcb);
}
rfc_port_timer_stop (p_port);
- RFCOMM_TRACE_DEBUG1 ("port_release_port:p_port->keep_port_handle:%d", p_port->keep_port_handle);
+ RFCOMM_TRACE_DEBUG ("port_release_port:p_port->keep_port_handle:%d", p_port->keep_port_handle);
if( p_port->keep_port_handle )
{
- RFCOMM_TRACE_DEBUG1 ("port_release_port:Initialize handle:%d", p_port->inx);
+ RFCOMM_TRACE_DEBUG ("port_release_port:Initialize handle:%d", p_port->inx);
/* save event mask and callback */
mask = p_port->ev_mask;
p_port_cb = p_port->p_callback;
@@ -264,7 +264,7 @@
}
else
{
- RFCOMM_TRACE_DEBUG1 ("port_release_port:Clean-up handle:%d", p_port->inx);
+ RFCOMM_TRACE_DEBUG ("port_release_port:Clean-up handle:%d", p_port->inx);
memset (p_port, 0, sizeof (tPORT));
}
}
@@ -289,14 +289,14 @@
&& !memcmp (rfc_cb.port.rfc_mcb[i].bd_addr, bd_addr, BD_ADDR_LEN))
{
/* Multiplexer channel found do not change anything */
- RFCOMM_TRACE_DEBUG6("port_find_mcb: found bd_addr:%02x:%02x:%02x:%02x:%02x:%02x",
+ RFCOMM_TRACE_DEBUG("port_find_mcb: found bd_addr:%02x:%02x:%02x:%02x:%02x:%02x",
bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]);
- RFCOMM_TRACE_DEBUG3("port_find_mcb: rfc_cb.port.rfc_mcb:index:%d, %p, lcid:%d",
+ RFCOMM_TRACE_DEBUG("port_find_mcb: rfc_cb.port.rfc_mcb:index:%d, %p, lcid:%d",
i, &rfc_cb.port.rfc_mcb[i], rfc_cb.port.rfc_mcb[i].lcid);
return (&rfc_cb.port.rfc_mcb[i]);
}
}
- RFCOMM_TRACE_DEBUG6("port_find_mcb: not found, bd_addr:%02x:%02x:%02x:%02x:%02x:%02x",
+ RFCOMM_TRACE_DEBUG("port_find_mcb: not found, bd_addr:%02x:%02x:%02x:%02x:%02x:%02x",
bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]);
return (NULL);
}
@@ -327,7 +327,7 @@
inx = p_mcb->port_inx[dlci];
if (inx == 0)
{
- RFCOMM_TRACE_DEBUG2("port_find_mcb_dlci_port: p_mcb:%p, port_inx[dlci:%d] is 0", p_mcb, dlci);
+ RFCOMM_TRACE_DEBUG("port_find_mcb_dlci_port: p_mcb:%p, port_inx[dlci:%d] is 0", p_mcb, dlci);
return (NULL);
}
else
@@ -576,7 +576,7 @@
|| (p_port->rx.queue.count > PORT_RX_BUF_HIGH_WM))
&& !p_port->rx.peer_fc)
{
- RFCOMM_TRACE_EVENT0 ("PORT_DataInd Data reached HW. Sending FC set.");
+ RFCOMM_TRACE_EVENT ("PORT_DataInd Data reached HW. Sending FC set.");
p_port->rx.peer_fc = TRUE;
RFCOMM_FlowReq (p_port->rfc.p_mcb, p_port->dlci, FALSE);
diff --git a/stack/rfcomm/rfc_int.h b/stack/rfcomm/rfc_int.h
index 83a63e3..302a8af 100644
--- a/stack/rfcomm/rfc_int.h
+++ b/stack/rfcomm/rfc_int.h
@@ -315,7 +315,7 @@
extern void rfc_save_lcid_mcb (tRFC_MCB *p_rfc_mcb, UINT16 lcid);
extern void rfc_check_mcb_active (tRFC_MCB *p_mcb);
extern void rfc_port_closed (tPORT *p_port);
-extern void rfc_sec_check_complete (BD_ADDR bd_addr, void *p_ref_data, UINT8 res);
+extern void rfc_sec_check_complete (BD_ADDR bd_addr, tBT_TRANSPORT transport,void *p_ref_data, UINT8 res);
extern void rfc_inc_credit (tPORT *p_port, UINT8 credit);
extern void rfc_dec_credit (tPORT *p_port);
extern void rfc_check_send_cmd(tRFC_MCB *p_mcb, BT_HDR *p_buf);
diff --git a/stack/rfcomm/rfc_l2cap_if.c b/stack/rfcomm/rfc_l2cap_if.c
index 9137a66..5889257 100644
--- a/stack/rfcomm/rfc_l2cap_if.c
+++ b/stack/rfcomm/rfc_l2cap_if.c
@@ -101,7 +101,7 @@
/* wait random timeout (2 - 12) to resolve collision */
/* if peer gives up then local device rejects incoming connection and continues as initiator */
/* if timeout, local device disconnects outgoing connection and continues as acceptor */
- RFCOMM_TRACE_DEBUG2 ("RFCOMM_ConnectInd start timer for collision, initiator's LCID(0x%x), acceptor's LCID(0x%x)",
+ RFCOMM_TRACE_DEBUG ("RFCOMM_ConnectInd start timer for collision, initiator's LCID(0x%x), acceptor's LCID(0x%x)",
p_mcb->lcid, p_mcb->pending_lcid);
rfc_timer_start(p_mcb, (UINT16)(GKI_get_tick_count()%10 + 2));
@@ -146,7 +146,7 @@
if (!p_mcb)
{
- RFCOMM_TRACE_ERROR1 ("RFCOMM_ConnectCnf LCID:0x%x", lcid);
+ RFCOMM_TRACE_ERROR ("RFCOMM_ConnectCnf LCID:0x%x", lcid);
return;
}
@@ -158,7 +158,7 @@
UINT16 i;
UINT8 idx;
- RFCOMM_TRACE_DEBUG1 ("RFCOMM_ConnectCnf retry as acceptor on pending LCID(0x%x)", p_mcb->pending_lcid);
+ RFCOMM_TRACE_DEBUG ("RFCOMM_ConnectCnf retry as acceptor on pending LCID(0x%x)", p_mcb->pending_lcid);
/* remove mcb from mapping table */
rfc_save_lcid_mcb (NULL, p_mcb->lcid);
@@ -178,7 +178,7 @@
p_mcb->port_inx[i] = 0;
p_mcb->port_inx[i+1] = idx;
rfc_cb.port.port[idx - 1].dlci += 1;
- RFCOMM_TRACE_DEBUG2 ("RFCOMM MX - DLCI:%d -> %d", i, rfc_cb.port.port[idx - 1].dlci);
+ RFCOMM_TRACE_DEBUG ("RFCOMM MX - DLCI:%d -> %d", i, rfc_cb.port.port[idx - 1].dlci);
}
}
@@ -187,7 +187,7 @@
}
else
{
- RFCOMM_TRACE_DEBUG1 ("RFCOMM_ConnectCnf peer gave up pending LCID(0x%x)", p_mcb->pending_lcid);
+ RFCOMM_TRACE_DEBUG ("RFCOMM_ConnectCnf peer gave up pending LCID(0x%x)", p_mcb->pending_lcid);
/* Peer gave up his connection request, make sure cleaning up L2CAP channel */
L2CA_ConnectRsp (p_mcb->bd_addr, p_mcb->pending_id, p_mcb->pending_lcid, L2CAP_CONN_NO_RESOURCES, 0);
@@ -218,7 +218,7 @@
if (!p_mcb)
{
- RFCOMM_TRACE_ERROR1 ("RFCOMM_ConfigInd LCID:0x%x", lcid);
+ RFCOMM_TRACE_ERROR ("RFCOMM_ConfigInd LCID:0x%x", lcid);
return;
}
@@ -241,7 +241,7 @@
if (!p_mcb)
{
- RFCOMM_TRACE_ERROR1 ("RFCOMM_ConfigCnf no MCB LCID:0x%x", lcid);
+ RFCOMM_TRACE_ERROR ("RFCOMM_ConfigCnf no MCB LCID:0x%x", lcid);
return;
}
@@ -282,7 +282,7 @@
if (!p_mcb)
{
- RFCOMM_TRACE_WARNING1 ("RFCOMM_DisconnectInd LCID:0x%x", lcid);
+ RFCOMM_TRACE_WARNING ("RFCOMM_DisconnectInd LCID:0x%x", lcid);
return;
}
@@ -309,7 +309,7 @@
if (!p_mcb)
{
- RFCOMM_TRACE_WARNING1 ("RFCOMM_BufDataInd LCID:0x%x", lcid);
+ RFCOMM_TRACE_WARNING ("RFCOMM_BufDataInd LCID:0x%x", lcid);
GKI_freebuf (p_buf);
return;
}
@@ -392,12 +392,12 @@
if (!p_mcb)
{
- RFCOMM_TRACE_ERROR1 ("RFCOMM_CongestionStatusInd dropped LCID:0x%x", lcid);
+ RFCOMM_TRACE_ERROR ("RFCOMM_CongestionStatusInd dropped LCID:0x%x", lcid);
return;
}
else
{
- RFCOMM_TRACE_EVENT1 ("RFCOMM_CongestionStatusInd LCID:0x%x", lcid);
+ RFCOMM_TRACE_EVENT ("RFCOMM_CongestionStatusInd LCID:0x%x", lcid);
}
rfc_process_l2cap_congestion (p_mcb, is_congested);
}
@@ -415,7 +415,7 @@
if (lcid - L2CAP_BASE_APPL_CID >= MAX_L2CAP_CHANNELS)
{
- RFCOMM_TRACE_ERROR1 ("rfc_find_lcid_mcb LCID:0x%x", lcid);
+ RFCOMM_TRACE_ERROR ("rfc_find_lcid_mcb LCID:0x%x", lcid);
return (NULL);
}
else
@@ -424,7 +424,7 @@
{
if (p_mcb->lcid != lcid)
{
- RFCOMM_TRACE_WARNING2 ("rfc_find_lcid_mcb LCID reused LCID:0x%x current:0x%x", lcid, p_mcb->lcid);
+ RFCOMM_TRACE_WARNING ("rfc_find_lcid_mcb LCID reused LCID:0x%x current:0x%x", lcid, p_mcb->lcid);
return (NULL);
}
}
diff --git a/stack/rfcomm/rfc_mx_fsm.c b/stack/rfcomm/rfc_mx_fsm.c
index 6d8bb06..a7ffca5 100644
--- a/stack/rfcomm/rfc_mx_fsm.c
+++ b/stack/rfcomm/rfc_mx_fsm.c
@@ -113,7 +113,7 @@
*******************************************************************************/
void rfc_mx_sm_state_idle (tRFC_MCB *p_mcb, UINT16 event, void *p_data)
{
- RFCOMM_TRACE_EVENT1 ("rfc_mx_sm_state_idle - evt:%d", event);
+ RFCOMM_TRACE_EVENT ("rfc_mx_sm_state_idle - evt:%d", event);
switch (event)
{
case RFC_MX_EVENT_START_REQ:
@@ -136,7 +136,7 @@
case RFC_MX_EVENT_CONN_CNF:
case RFC_MX_EVENT_CONF_IND:
case RFC_MX_EVENT_CONF_CNF:
- RFCOMM_TRACE_ERROR2 ("Mx error state %d event %d", p_mcb->state, event);
+ RFCOMM_TRACE_ERROR ("Mx error state %d event %d", p_mcb->state, event);
return;
case RFC_MX_EVENT_CONN_IND:
@@ -164,7 +164,7 @@
rfc_send_dm (p_mcb, RFCOMM_MX_DLCI, FALSE);
return;
}
- RFCOMM_TRACE_EVENT2 ("RFCOMM MX ignored - evt:%d in state:%d", event, p_mcb->state);
+ RFCOMM_TRACE_EVENT ("RFCOMM MX ignored - evt:%d in state:%d", event, p_mcb->state);
}
@@ -180,11 +180,11 @@
*******************************************************************************/
void rfc_mx_sm_state_wait_conn_cnf (tRFC_MCB *p_mcb, UINT16 event, void *p_data)
{
- RFCOMM_TRACE_EVENT1 ("rfc_mx_sm_state_wait_conn_cnf - evt:%d", event);
+ RFCOMM_TRACE_EVENT ("rfc_mx_sm_state_wait_conn_cnf - evt:%d", event);
switch (event)
{
case RFC_MX_EVENT_START_REQ:
- RFCOMM_TRACE_ERROR2 ("Mx error state %d event %d", p_mcb->state, event);
+ RFCOMM_TRACE_ERROR ("Mx error state %d event %d", p_mcb->state, event);
return;
/* There is some new timing so that Config Ind comes before security is completed
@@ -220,7 +220,7 @@
UINT16 i;
UINT8 idx;
- RFCOMM_TRACE_DEBUG2 ("RFCOMM MX retry as acceptor in collision case - evt:%d in state:%d", event, p_mcb->state);
+ RFCOMM_TRACE_DEBUG ("RFCOMM MX retry as acceptor in collision case - evt:%d in state:%d", event, p_mcb->state);
rfc_save_lcid_mcb (NULL, p_mcb->lcid);
p_mcb->lcid = p_mcb->pending_lcid;
@@ -236,7 +236,7 @@
p_mcb->port_inx[i] = 0;
p_mcb->port_inx[i+1] = idx;
rfc_cb.port.port[idx - 1].dlci += 1;
- RFCOMM_TRACE_DEBUG2 ("RFCOMM MX - DLCI:%d -> %d", i, rfc_cb.port.port[idx - 1].dlci);
+ RFCOMM_TRACE_DEBUG ("RFCOMM MX - DLCI:%d -> %d", i, rfc_cb.port.port[idx - 1].dlci);
}
}
@@ -248,7 +248,7 @@
}
return;
}
- RFCOMM_TRACE_EVENT2 ("RFCOMM MX ignored - evt:%d in state:%d", event, p_mcb->state);
+ RFCOMM_TRACE_EVENT ("RFCOMM MX ignored - evt:%d in state:%d", event, p_mcb->state);
}
@@ -264,13 +264,13 @@
*******************************************************************************/
void rfc_mx_sm_state_configure (tRFC_MCB *p_mcb, UINT16 event, void *p_data)
{
- RFCOMM_TRACE_EVENT1 ("rfc_mx_sm_state_configure - evt:%d", event);
+ RFCOMM_TRACE_EVENT ("rfc_mx_sm_state_configure - evt:%d", event);
switch (event)
{
case RFC_MX_EVENT_START_REQ:
case RFC_MX_EVENT_CONN_CNF:
- RFCOMM_TRACE_ERROR2 ("Mx error state %d event %d", p_mcb->state, event);
+ RFCOMM_TRACE_ERROR ("Mx error state %d event %d", p_mcb->state, event);
return;
case RFC_MX_EVENT_CONF_IND:
@@ -293,7 +293,7 @@
PORT_StartCnf (p_mcb, RFCOMM_ERROR);
return;
}
- RFCOMM_TRACE_EVENT2 ("RFCOMM MX ignored - evt:%d in state:%d", event, p_mcb->state);
+ RFCOMM_TRACE_EVENT ("RFCOMM MX ignored - evt:%d in state:%d", event, p_mcb->state);
}
@@ -311,12 +311,12 @@
{
UNUSED(p_data);
- RFCOMM_TRACE_EVENT1 ("rfc_mx_sm_sabme_wait_ua - evt:%d", event);
+ RFCOMM_TRACE_EVENT ("rfc_mx_sm_sabme_wait_ua - evt:%d", event);
switch (event)
{
case RFC_MX_EVENT_START_REQ:
case RFC_MX_EVENT_CONN_CNF:
- RFCOMM_TRACE_ERROR2 ("Mx error state %d event %d", p_mcb->state, event);
+ RFCOMM_TRACE_ERROR ("Mx error state %d event %d", p_mcb->state, event);
return;
/* workaround: we don't support reconfig */
@@ -357,7 +357,7 @@
PORT_StartCnf (p_mcb, RFCOMM_ERROR);
return;
}
- RFCOMM_TRACE_EVENT2 ("RFCOMM MX ignored - evt:%d in state:%d", event, p_mcb->state);
+ RFCOMM_TRACE_EVENT ("RFCOMM MX ignored - evt:%d in state:%d", event, p_mcb->state);
}
/*******************************************************************************
@@ -372,7 +372,7 @@
*******************************************************************************/
void rfc_mx_sm_state_wait_sabme (tRFC_MCB *p_mcb, UINT16 event, void *p_data)
{
- RFCOMM_TRACE_EVENT1 ("rfc_mx_sm_state_wait_sabme - evt:%d", event);
+ RFCOMM_TRACE_EVENT ("rfc_mx_sm_state_wait_sabme - evt:%d", event);
switch (event)
{
case RFC_MX_EVENT_DISC_IND:
@@ -423,7 +423,7 @@
PORT_CloseInd (p_mcb);
return;
}
- RFCOMM_TRACE_EVENT2 ("RFCOMM MX ignored - evt:%d in state:%d", event, p_mcb->state);
+ RFCOMM_TRACE_EVENT ("RFCOMM MX ignored - evt:%d in state:%d", event, p_mcb->state);
}
@@ -441,7 +441,7 @@
{
UNUSED(p_data);
- RFCOMM_TRACE_EVENT1 ("rfc_mx_sm_state_connected - evt:%d", event);
+ RFCOMM_TRACE_EVENT ("rfc_mx_sm_state_connected - evt:%d", event);
switch (event)
{
@@ -469,7 +469,7 @@
PORT_CloseInd (p_mcb);
return;
}
- RFCOMM_TRACE_EVENT2 ("RFCOMM MX ignored - evt:%d in state:%d", event, p_mcb->state);
+ RFCOMM_TRACE_EVENT ("RFCOMM MX ignored - evt:%d in state:%d", event, p_mcb->state);
}
@@ -487,7 +487,7 @@
{
BT_HDR *p_buf;
- RFCOMM_TRACE_EVENT1 ("rfc_mx_sm_state_disc_wait_ua - evt:%d", event);
+ RFCOMM_TRACE_EVENT ("rfc_mx_sm_state_disc_wait_ua - evt:%d", event);
switch (event)
{
case RFC_EVENT_UA:
@@ -547,7 +547,7 @@
case RFC_MX_EVENT_QOS_VIOLATION_IND:
break;
}
- RFCOMM_TRACE_EVENT2 ("RFCOMM MX ignored - evt:%d in state:%d", event, p_mcb->state);
+ RFCOMM_TRACE_EVENT ("RFCOMM MX ignored - evt:%d in state:%d", event, p_mcb->state);
}
@@ -563,7 +563,7 @@
{
tL2CAP_CFG_INFO cfg;
- RFCOMM_TRACE_EVENT0 ("rfc_mx_send_config_req");
+ RFCOMM_TRACE_EVENT ("rfc_mx_send_config_req");
memset (&cfg, 0, sizeof (tL2CAP_CFG_INFO));
@@ -594,7 +594,7 @@
*******************************************************************************/
static void rfc_mx_conf_cnf (tRFC_MCB *p_mcb, tL2CAP_CFG_INFO *p_cfg)
{
- RFCOMM_TRACE_EVENT2 ("rfc_mx_conf_cnf p_cfg:%08x res:%d ", p_cfg, (p_cfg) ? p_cfg->result : 0);
+ RFCOMM_TRACE_EVENT ("rfc_mx_conf_cnf p_cfg:%08x res:%d ", p_cfg, (p_cfg) ? p_cfg->result : 0);
if (p_cfg->result != L2CAP_CFG_OK)
{
diff --git a/stack/rfcomm/rfc_port_fsm.c b/stack/rfcomm/rfc_port_fsm.c
index e519a98..a998b6e 100644
--- a/stack/rfcomm/rfc_port_fsm.c
+++ b/stack/rfcomm/rfc_port_fsm.c
@@ -62,7 +62,7 @@
{
if (!p_port)
{
- RFCOMM_TRACE_WARNING1 ("NULL port event %d", event);
+ RFCOMM_TRACE_WARNING ("NULL port event %d", event);
return;
}
@@ -156,11 +156,11 @@
case RFC_EVENT_TIMEOUT:
Port_TimeOutCloseMux( p_port->rfc.p_mcb ) ;
- RFCOMM_TRACE_ERROR2 ("Port error state %d event %d", p_port->rfc.state, event);
+ RFCOMM_TRACE_ERROR ("Port error state %d event %d", p_port->rfc.state, event);
return;
}
- RFCOMM_TRACE_WARNING1 ("Port state closed Event ignored %d", event);
+ RFCOMM_TRACE_WARNING ("Port state closed Event ignored %d", event);
return;
}
@@ -180,7 +180,7 @@
{
case RFC_EVENT_OPEN:
case RFC_EVENT_ESTABLISH_RSP:
- RFCOMM_TRACE_ERROR2 ("Port error state %d event %d", p_port->rfc.state, event);
+ RFCOMM_TRACE_ERROR ("Port error state %d event %d", p_port->rfc.state, event);
return;
case RFC_EVENT_CLOSE:
@@ -230,7 +230,7 @@
PORT_DlcEstablishCnf (p_port->rfc.p_mcb, p_port->dlci, p_port->rfc.p_mcb->peer_l2cap_mtu, RFCOMM_ERROR);
return;
}
- RFCOMM_TRACE_WARNING1 ("Port state sabme_wait_ua Event ignored %d", event);
+ RFCOMM_TRACE_WARNING ("Port state sabme_wait_ua Event ignored %d", event);
}
@@ -270,7 +270,7 @@
case RFC_EVENT_OPEN:
case RFC_EVENT_CLOSE:
- RFCOMM_TRACE_ERROR2 ("Port error state %d event %d", p_port->rfc.state, event);
+ RFCOMM_TRACE_ERROR ("Port error state %d event %d", p_port->rfc.state, event);
return;
case RFC_EVENT_CLEAR:
@@ -279,7 +279,7 @@
return;
case RFC_EVENT_DATA:
- RFCOMM_TRACE_ERROR0 ("Port error state Term Wait Sec event Data");
+ RFCOMM_TRACE_ERROR ("Port error state Term Wait Sec event Data");
GKI_freebuf (p_data);
return;
@@ -312,7 +312,7 @@
}
return;
}
- RFCOMM_TRACE_WARNING1 ("Port state term_wait_sec_check Event ignored %d", event);
+ RFCOMM_TRACE_WARNING ("Port state term_wait_sec_check Event ignored %d", event);
}
@@ -346,7 +346,7 @@
case RFC_EVENT_OPEN:
case RFC_EVENT_SABME: /* Peer should not use the same dlci */
- RFCOMM_TRACE_ERROR2 ("Port error state %d event %d", p_port->rfc.state, event);
+ RFCOMM_TRACE_ERROR ("Port error state %d event %d", p_port->rfc.state, event);
return;
case RFC_EVENT_CLOSE:
@@ -355,7 +355,7 @@
return;
case RFC_EVENT_DATA:
- RFCOMM_TRACE_ERROR0 ("Port error state Orig Wait Sec event Data");
+ RFCOMM_TRACE_ERROR ("Port error state Orig Wait Sec event Data");
GKI_freebuf (p_data);
return;
@@ -363,7 +363,7 @@
GKI_freebuf (p_data);
return;
}
- RFCOMM_TRACE_WARNING1 ("Port state orig_wait_sec_check Event ignored %d", event);
+ RFCOMM_TRACE_WARNING ("Port state orig_wait_sec_check Event ignored %d", event);
}
@@ -382,7 +382,7 @@
switch (event)
{
case RFC_EVENT_OPEN:
- RFCOMM_TRACE_ERROR2 ("Port error state %d event %d", p_port->rfc.state, event);
+ RFCOMM_TRACE_ERROR ("Port error state %d event %d", p_port->rfc.state, event);
return;
case RFC_EVENT_CLOSE:
@@ -434,7 +434,7 @@
if(p_port->rx.queue.count)
{
/* give a chance to upper stack to close port properly */
- RFCOMM_TRACE_DEBUG0("port queue is not empty");
+ RFCOMM_TRACE_DEBUG("port queue is not empty");
rfc_port_timer_start (p_port, RFC_DISC_TIMEOUT);
}
else
@@ -447,10 +447,10 @@
case RFC_EVENT_TIMEOUT:
Port_TimeOutCloseMux( p_port->rfc.p_mcb ) ;
- RFCOMM_TRACE_ERROR2 ("Port error state %d event %d", p_port->rfc.state, event);
+ RFCOMM_TRACE_ERROR ("Port error state %d event %d", p_port->rfc.state, event);
return;
}
- RFCOMM_TRACE_WARNING1 ("Port state opened Event ignored %d", event);
+ RFCOMM_TRACE_WARNING ("Port state opened Event ignored %d", event);
}
@@ -470,7 +470,7 @@
{
case RFC_EVENT_OPEN:
case RFC_EVENT_ESTABLISH_RSP:
- RFCOMM_TRACE_ERROR2 ("Port error state %d event %d", p_port->rfc.state, event);
+ RFCOMM_TRACE_ERROR ("Port error state %d event %d", p_port->rfc.state, event);
return;
case RFC_EVENT_CLEAR:
@@ -507,7 +507,7 @@
return;
}
- RFCOMM_TRACE_WARNING1 ("Port state disc_wait_ua Event ignored %d", event);
+ RFCOMM_TRACE_WARNING ("Port state disc_wait_ua Event ignored %d", event);
}
@@ -548,7 +548,7 @@
else
{
rfc_send_dm(p_mcb, dlci, FALSE);
- RFCOMM_TRACE_WARNING0("***** MX PN while disconnecting *****");
+ RFCOMM_TRACE_WARNING("***** MX PN while disconnecting *****");
}
return;
diff --git a/stack/rfcomm/rfc_ts_frames.c b/stack/rfcomm/rfc_ts_frames.c
index 4690200..6b15831 100644
--- a/stack/rfcomm/rfc_ts_frames.c
+++ b/stack/rfcomm/rfc_ts_frames.c
@@ -576,14 +576,14 @@
if (p_buf->len < RFCOMM_CTRL_FRAME_LEN)
{
- RFCOMM_TRACE_ERROR1 ("Bad Length1: %d", p_buf->len);
+ RFCOMM_TRACE_ERROR ("Bad Length1: %d", p_buf->len);
return (RFC_EVENT_BAD_FRAME);
}
RFCOMM_PARSE_CTRL_FIELD (ead, p_frame->cr, p_frame->dlci, p_data);
if( !ead )
{
- RFCOMM_TRACE_ERROR0 ("Bad Address(EA must be 1)");
+ RFCOMM_TRACE_ERROR ("Bad Address(EA must be 1)");
return (RFC_EVENT_BAD_FRAME);
}
RFCOMM_PARSE_TYPE_FIELD (p_frame->type, p_frame->pf, p_data);
@@ -605,7 +605,7 @@
if (p_buf->len != len)
{
- RFCOMM_TRACE_ERROR2 ("Bad Length2 %d %d", p_buf->len, len);
+ RFCOMM_TRACE_ERROR ("Bad Length2 %d %d", p_buf->len, len);
return (RFC_EVENT_BAD_FRAME);
}
@@ -622,7 +622,7 @@
|| !p_frame->pf || len || !RFCOMM_VALID_DLCI (p_frame->dlci)
|| !rfc_check_fcs (RFCOMM_CTRL_FRAME_LEN, p_start, fcs))
{
- RFCOMM_TRACE_ERROR0 ("Bad SABME");
+ RFCOMM_TRACE_ERROR ("Bad SABME");
return (RFC_EVENT_BAD_FRAME);
}
else
@@ -633,7 +633,7 @@
|| !p_frame->pf || len || !RFCOMM_VALID_DLCI (p_frame->dlci)
|| !rfc_check_fcs (RFCOMM_CTRL_FRAME_LEN, p_start, fcs))
{
- RFCOMM_TRACE_ERROR0 ("Bad UA");
+ RFCOMM_TRACE_ERROR ("Bad UA");
return (RFC_EVENT_BAD_FRAME);
}
else
@@ -644,7 +644,7 @@
|| len || !RFCOMM_VALID_DLCI(p_frame->dlci)
|| !rfc_check_fcs (RFCOMM_CTRL_FRAME_LEN, p_start, fcs))
{
- RFCOMM_TRACE_ERROR0 ("Bad DM");
+ RFCOMM_TRACE_ERROR ("Bad DM");
return (RFC_EVENT_BAD_FRAME);
}
else
@@ -655,7 +655,7 @@
|| !p_frame->pf || len || !RFCOMM_VALID_DLCI(p_frame->dlci)
|| !rfc_check_fcs (RFCOMM_CTRL_FRAME_LEN, p_start, fcs))
{
- RFCOMM_TRACE_ERROR0 ("Bad DISC");
+ RFCOMM_TRACE_ERROR ("Bad DISC");
return (RFC_EVENT_BAD_FRAME);
}
else
@@ -664,18 +664,18 @@
case RFCOMM_UIH:
if (!RFCOMM_VALID_DLCI(p_frame->dlci))
{
- RFCOMM_TRACE_ERROR0 ("Bad UIH - invalid DLCI");
+ RFCOMM_TRACE_ERROR ("Bad UIH - invalid DLCI");
return (RFC_EVENT_BAD_FRAME);
}
else if (!rfc_check_fcs (2, p_start, fcs))
{
- RFCOMM_TRACE_ERROR0 ("Bad UIH - FCS");
+ RFCOMM_TRACE_ERROR ("Bad UIH - FCS");
return (RFC_EVENT_BAD_FRAME);
}
else if (RFCOMM_FRAME_IS_RSP(p_mcb->is_initiator, p_frame->cr))
{
/* we assume that this is ok to allow bad implementations to work */
- RFCOMM_TRACE_ERROR0 ("Bad UIH - response");
+ RFCOMM_TRACE_ERROR ("Bad UIH - response");
return (RFC_EVENT_UIH);
}
else
@@ -708,7 +708,7 @@
if (!p_rx_frame->ea || !length)
{
- RFCOMM_TRACE_ERROR2 ("Illegal MX Frame ea:%d len:%d", p_rx_frame->ea, length);
+ RFCOMM_TRACE_ERROR ("Illegal MX Frame ea:%d len:%d", p_rx_frame->ea, length);
GKI_freebuf (p_buf);
return;
}
@@ -730,7 +730,7 @@
if (mx_len != length)
{
- RFCOMM_TRACE_ERROR0 ("Bad MX frame");
+ RFCOMM_TRACE_ERROR ("Bad MX frame");
GKI_freebuf (p_buf);
return;
}
@@ -756,7 +756,7 @@
|| (p_rx_frame->u.pn.mtu < RFCOMM_MIN_MTU)
|| (p_rx_frame->u.pn.mtu > RFCOMM_MAX_MTU))
{
- RFCOMM_TRACE_ERROR0 ("Bad PN frame");
+ RFCOMM_TRACE_ERROR ("Bad PN frame");
break;
}
@@ -808,7 +808,7 @@
if (!ea || !cr || !p_rx_frame->dlci
|| !RFCOMM_VALID_DLCI (p_rx_frame->dlci))
{
- RFCOMM_TRACE_ERROR0 ("Bad MSC frame");
+ RFCOMM_TRACE_ERROR ("Bad MSC frame");
break;
}
@@ -853,7 +853,7 @@
if (!ea || !cr || !p_rx_frame->dlci
|| !RFCOMM_VALID_DLCI (p_rx_frame->dlci))
{
- RFCOMM_TRACE_ERROR0 ("Bad RPN frame");
+ RFCOMM_TRACE_ERROR ("Bad RPN frame");
break;
}
@@ -890,7 +890,7 @@
if (!ea || !cr || !p_rx_frame->dlci
|| !RFCOMM_VALID_DLCI (p_rx_frame->dlci))
{
- RFCOMM_TRACE_ERROR0 ("Bad RPN frame");
+ RFCOMM_TRACE_ERROR ("Bad RPN frame");
break;
}
diff --git a/stack/rfcomm/rfc_utils.c b/stack/rfcomm/rfc_utils.c
index d2b02fc..e2cff28 100644
--- a/stack/rfcomm/rfc_utils.c
+++ b/stack/rfcomm/rfc_utils.c
@@ -134,15 +134,15 @@
{
int i, j;
tRFC_MCB *p_mcb = NULL;
- RFCOMM_TRACE_DEBUG6("rfc_alloc_multiplexer_channel: bd_addr:%02x:%02x:%02x:%02x:%02x:%02x",
+ RFCOMM_TRACE_DEBUG("rfc_alloc_multiplexer_channel: bd_addr:%02x:%02x:%02x:%02x:%02x:%02x",
bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]);
- RFCOMM_TRACE_DEBUG1("rfc_alloc_multiplexer_channel:is_initiator:%d", is_initiator);
+ RFCOMM_TRACE_DEBUG("rfc_alloc_multiplexer_channel:is_initiator:%d", is_initiator);
for (i = 0; i < MAX_BD_CONNECTIONS; i++)
{
- RFCOMM_TRACE_DEBUG2("rfc_alloc_multiplexer_channel rfc_cb.port.rfc_mcb[%d].state:%d",
+ RFCOMM_TRACE_DEBUG("rfc_alloc_multiplexer_channel rfc_cb.port.rfc_mcb[%d].state:%d",
i, rfc_cb.port.rfc_mcb[i].state);
- RFCOMM_TRACE_DEBUG6("(rfc_cb.port.rfc_mcb[i].bd_addr:%02x:%02x:%02x:%02x:%02x:%02x",
+ RFCOMM_TRACE_DEBUG("(rfc_cb.port.rfc_mcb[i].bd_addr:%02x:%02x:%02x:%02x:%02x:%02x",
rfc_cb.port.rfc_mcb[i].bd_addr[0], rfc_cb.port.rfc_mcb[i].bd_addr[1],
rfc_cb.port.rfc_mcb[i].bd_addr[2], rfc_cb.port.rfc_mcb[i].bd_addr[3],
rfc_cb.port.rfc_mcb[i].bd_addr[4], rfc_cb.port.rfc_mcb[i].bd_addr[5]);
@@ -154,7 +154,7 @@
/* If there was an inactivity timer running stop it now */
if (rfc_cb.port.rfc_mcb[i].state == RFC_MX_STATE_CONNECTED)
rfc_timer_stop (&rfc_cb.port.rfc_mcb[i]);
- RFCOMM_TRACE_DEBUG3("rfc_alloc_multiplexer_channel:is_initiator:%d, found, state:%d, p_mcb:%p",
+ RFCOMM_TRACE_DEBUG("rfc_alloc_multiplexer_channel:is_initiator:%d, found, state:%d, p_mcb:%p",
is_initiator, rfc_cb.port.rfc_mcb[i].state, &rfc_cb.port.rfc_mcb[i]);
return (&rfc_cb.port.rfc_mcb[i]);
}
@@ -172,7 +172,7 @@
/* New multiplexer control block */
memset (p_mcb, 0, sizeof (tRFC_MCB));
memcpy (p_mcb->bd_addr, bd_addr, BD_ADDR_LEN);
- RFCOMM_TRACE_DEBUG3("rfc_alloc_multiplexer_channel:is_initiator:%d, create new p_mcb:%p, index:%d",
+ RFCOMM_TRACE_DEBUG("rfc_alloc_multiplexer_channel:is_initiator:%d, create new p_mcb:%p, index:%d",
is_initiator, &rfc_cb.port.rfc_mcb[j], j);
GKI_init_q(&p_mcb->cmd_q);
@@ -222,7 +222,7 @@
{
TIMER_LIST_ENT *p_tle = &p_mcb->tle;
- RFCOMM_TRACE_EVENT1 ("rfc_timer_start - timeout:%d", timeout);
+ RFCOMM_TRACE_EVENT ("rfc_timer_start - timeout:%d", timeout);
p_tle->param = (UINT32)p_mcb;
@@ -239,7 +239,7 @@
*******************************************************************************/
void rfc_timer_stop (tRFC_MCB *p_mcb)
{
- RFCOMM_TRACE_EVENT0 ("rfc_timer_stop");
+ RFCOMM_TRACE_EVENT ("rfc_timer_stop");
btu_stop_timer (&p_mcb->tle);
}
@@ -256,7 +256,7 @@
{
TIMER_LIST_ENT *p_tle = &p_port->rfc.tle;
- RFCOMM_TRACE_EVENT1 ("rfc_port_timer_start - timeout:%d", timeout);
+ RFCOMM_TRACE_EVENT ("rfc_port_timer_start - timeout:%d", timeout);
p_tle->param = (UINT32)p_port;
@@ -273,7 +273,7 @@
*******************************************************************************/
void rfc_port_timer_stop (tPORT *p_port)
{
- RFCOMM_TRACE_EVENT0 ("rfc_port_timer_stop");
+ RFCOMM_TRACE_EVENT ("rfc_port_timer_stop");
btu_stop_timer (&p_port->rfc.tle);
}
@@ -350,10 +350,11 @@
** Returns void
**
*******************************************************************************/
-void rfc_sec_check_complete (BD_ADDR bd_addr, void *p_ref_data, UINT8 res)
+void rfc_sec_check_complete (BD_ADDR bd_addr, tBT_TRANSPORT transport, void *p_ref_data, UINT8 res)
{
tPORT *p_port = (tPORT *)p_ref_data;
UNUSED(bd_addr);
+ UNUSED(transport);
/* Verify that PORT is still waiting for Security to complete */
if (!p_port->in_use
@@ -380,7 +381,7 @@
{
tRFC_MCB *p_mcb = p_port->rfc.p_mcb;
- RFCOMM_TRACE_DEBUG0 ("rfc_port_closed");
+ RFCOMM_TRACE_DEBUG ("rfc_port_closed");
rfc_port_timer_stop (p_port);
@@ -416,7 +417,7 @@
{
p_port->credit_tx += credit;
- RFCOMM_TRACE_EVENT1 ("rfc_inc_credit:%d", p_port->credit_tx);
+ RFCOMM_TRACE_EVENT ("rfc_inc_credit:%d", p_port->credit_tx);
if (p_port->tx.peer_fc == TRUE)
PORT_FlowInd(p_port->rfc.p_mcb, p_port->dlci, TRUE);
diff --git a/stack/sdp/sdp_api.c b/stack/sdp/sdp_api.c
index af35cc8..9b3628c 100644
--- a/stack/sdp/sdp_api.c
+++ b/stack/sdp/sdp_api.c
@@ -79,7 +79,7 @@
if (p_db == NULL || (sizeof (tSDP_DISCOVERY_DB) > len) ||
num_attr > SDP_MAX_ATTR_FILTERS || num_uuid > SDP_MAX_UUID_FILTERS)
{
- SDP_TRACE_ERROR4("SDP_InitDiscoveryDb Illegal param: p_db 0x%x, len %d, num_uuid %d, num_attr %d",
+ SDP_TRACE_ERROR("SDP_InitDiscoveryDb Illegal param: p_db 0x%x, len %d, num_uuid %d, num_attr %d",
(UINT32)p_db, len, num_uuid, num_attr);
return(FALSE);
@@ -513,12 +513,13 @@
if ((SDP_DISC_ATTR_TYPE(p_sattr->attr_len_type) == UUID_DESC_TYPE)
&& (SDP_DISC_ATTR_LEN(p_sattr->attr_len_type) == 2) ) {
- SDP_TRACE_DEBUG2("SDP_FindServiceInDb - p_sattr value = 0x%x serviceuuid = 0x%x\r\n", p_sattr->attr_value.v.u16, service_uuid);
+ SDP_TRACE_DEBUG("SDP_FindServiceInDb - p_sattr value = 0x%x serviceuuid = 0x%x\r\n",
+ p_sattr->attr_value.v.u16, service_uuid);
if(service_uuid == UUID_SERVCLASS_HDP_PROFILE)
{
if( (p_sattr->attr_value.v.u16==UUID_SERVCLASS_HDP_SOURCE) || ( p_sattr->attr_value.v.u16==UUID_SERVCLASS_HDP_SINK))
{
- SDP_TRACE_DEBUG0("SDP_FindServiceInDb found HDP source or sink\n" );
+ SDP_TRACE_DEBUG("SDP_FindServiceInDb found HDP source or sink\n" );
return (p_rec);
}
}
@@ -686,14 +687,14 @@
if (SDP_DISC_ATTR_TYPE(p_sattr->attr_len_type) == UUID_DESC_TYPE)
{
- SDP_TRACE_DEBUG1("uuid len=%d ", p_uuid->len);
+ SDP_TRACE_DEBUG("uuid len=%d ", p_uuid->len);
if (p_uuid->len == 2)
{
- SDP_TRACE_DEBUG1("uuid=0x%x \n", p_uuid->uu.uuid16);
+ SDP_TRACE_DEBUG("uuid=0x%x \n", p_uuid->uu.uuid16);
}
else
{
- SDP_TRACE_DEBUG0("\n");
+ SDP_TRACE_DEBUG("\n");
}
if (sdpu_compare_uuid_with_attr (p_uuid, p_sattr))
@@ -747,7 +748,7 @@
/* Now, see if the entry contains the layer we are interested in */
for (p_sattr = p_attr->attr_value.v.p_sub_attr; p_sattr; p_sattr = p_sattr->p_next_attr)
{
- /* SDP_TRACE_DEBUG3 ("SDP - p_sattr 0x%x, layer_uuid:0x%x, u16:0x%x####",
+ /* SDP_TRACE_DEBUG ("SDP - p_sattr 0x%x, layer_uuid:0x%x, u16:0x%x####",
p_sattr, layer_uuid, p_sattr->attr_value.v.u16); */
if ((SDP_DISC_ATTR_TYPE(p_sattr->attr_len_type) == UUID_DESC_TYPE)
diff --git a/stack/sdp/sdp_db.c b/stack/sdp/sdp_db.c
index 318a8cc..322e27d 100644
--- a/stack/sdp/sdp_db.c
+++ b/stack/sdp/sdp_db.c
@@ -300,7 +300,7 @@
p_db->record[p_db->num_records].record_handle = handle;
p_db->num_records++;
- SDP_TRACE_DEBUG1("SDP_CreateRecord ok, num_records:%d", p_db->num_records);
+ SDP_TRACE_DEBUG("SDP_CreateRecord ok, num_records:%d", p_db->num_records);
/* Add the first attribute (the handle) automatically */
UINT32_TO_BE_FIELD (buf, handle);
SDP_AddAttribute (handle, ATTR_ID_SERVICE_RECORD_HDL, UINT_DESC_TYPE,
@@ -308,7 +308,7 @@
return (p_db->record[p_db->num_records - 1].record_handle);
}
- else SDP_TRACE_ERROR1("SDP_CreateRecord fail, exceed maximum records:%d", SDP_MAX_RECORDS);
+ else SDP_TRACE_ERROR("SDP_CreateRecord fail, exceed maximum records:%d", SDP_MAX_RECORDS);
#endif
return (0);
}
@@ -363,7 +363,7 @@
sdp_cb.server_db.num_records--;
- SDP_TRACE_DEBUG1("SDP_DeleteRecord ok, num_records:%d", sdp_cb.server_db.num_records);
+ SDP_TRACE_DEBUG("SDP_DeleteRecord ok, num_records:%d", sdp_cb.server_db.num_records);
/* if we're deleting the primary DI record, clear the */
/* value in the control block */
if( sdp_cb.server_db.di_primary_handle == handle )
@@ -420,17 +420,17 @@
{
sprintf((char *)&num_array[i*2],"%02X",(UINT8)(p_val[i]));
}
- SDP_TRACE_DEBUG6("SDP_AddAttribute: handle:%X, id:%04X, type:%d, len:%d, p_val:%p, *p_val:%s",
+ SDP_TRACE_DEBUG("SDP_AddAttribute: handle:%X, id:%04X, type:%d, len:%d, p_val:%p, *p_val:%s",
handle,attr_id,attr_type,attr_len,p_val,num_array);
}
else if (attr_type == BOOLEAN_DESC_TYPE)
{
- SDP_TRACE_DEBUG6("SDP_AddAttribute: handle:%X, id:%04X, type:%d, len:%d, p_val:%p, *p_val:%d",
+ SDP_TRACE_DEBUG("SDP_AddAttribute: handle:%X, id:%04X, type:%d, len:%d, p_val:%p, *p_val:%d",
handle,attr_id,attr_type,attr_len,p_val,*p_val);
}
else
{
- SDP_TRACE_DEBUG6("SDP_AddAttribute: handle:%X, id:%04X, type:%d, len:%d, p_val:%p, *p_val:%s",
+ SDP_TRACE_DEBUG("SDP_AddAttribute: handle:%X, id:%04X, type:%d, len:%d, p_val:%p, *p_val:%s",
handle,attr_id,attr_type,attr_len,p_val,p_val);
}
}
@@ -478,7 +478,7 @@
/* do truncate only for text string type descriptor */
if (attr_type == TEXT_STR_DESC_TYPE)
{
- SDP_TRACE_WARNING2("SDP_AddAttribute: attr_len:%d too long. truncate to (%d)",
+ SDP_TRACE_WARNING("SDP_AddAttribute: attr_len:%d too long. truncate to (%d)",
attr_len, SDP_MAX_PAD_LEN - p_rec->free_pad_ptr );
attr_len = SDP_MAX_PAD_LEN - p_rec->free_pad_ptr;
@@ -499,7 +499,7 @@
else if ((attr_len == 0 && p_attr->len != 0) || /* if truncate to 0 length, simply don't add */
p_val == 0)
{
- SDP_TRACE_ERROR2("SDP_AddAttribute fail, length exceed maximum: ID %d: attr_len:%d ",
+ SDP_TRACE_ERROR("SDP_AddAttribute fail, length exceed maximum: ID %d: attr_len:%d ",
attr_id, attr_len );
p_attr->id = p_attr->type = p_attr->len = 0;
return (FALSE);
@@ -545,7 +545,7 @@
if ((p_buff = (UINT8 *) GKI_getbuf(sizeof(UINT8) * SDP_MAX_ATTR_LEN * 2)) == NULL)
{
- SDP_TRACE_ERROR0("SDP_AddSequence cannot get a buffer!");
+ SDP_TRACE_ERROR("SDP_AddSequence cannot get a buffer!");
return (FALSE);
}
p = p_buff;
@@ -586,12 +586,12 @@
if(p_head == p_buff)
{
/* the first element exceed the max length */
- SDP_TRACE_ERROR0 ("SDP_AddSequence - too long(attribute is not added)!!");
+ SDP_TRACE_ERROR ("SDP_AddSequence - too long(attribute is not added)!!");
GKI_freebuf(p_buff);
return FALSE;
}
else
- SDP_TRACE_ERROR2 ("SDP_AddSequence - too long, add %d elements of %d", xx, num_elem);
+ SDP_TRACE_ERROR ("SDP_AddSequence - too long, add %d elements of %d", xx, num_elem);
break;
}
}
@@ -628,7 +628,7 @@
if ((p_buff = (UINT8 *) GKI_getbuf(sizeof(UINT8) * SDP_MAX_ATTR_LEN * 2)) == NULL)
{
- SDP_TRACE_ERROR0("SDP_AddUuidSequence cannot get a buffer!");
+ SDP_TRACE_ERROR("SDP_AddUuidSequence cannot get a buffer!");
return (FALSE);
}
p = p_buff;
@@ -641,7 +641,7 @@
if((p - p_buff) > max_len)
{
- SDP_TRACE_WARNING2 ("SDP_AddUuidSequence - too long, add %d uuids of %d", xx, num_uuids);
+ SDP_TRACE_WARNING ("SDP_AddUuidSequence - too long, add %d uuids of %d", xx, num_uuids);
break;
}
}
@@ -676,7 +676,7 @@
if ((p_buff = (UINT8 *) GKI_getbuf(sizeof(UINT8) * SDP_MAX_ATTR_LEN * 2)) == NULL)
{
- SDP_TRACE_ERROR0("SDP_AddProtocolList cannot get a buffer!");
+ SDP_TRACE_ERROR("SDP_AddProtocolList cannot get a buffer!");
return (FALSE);
}
@@ -715,7 +715,7 @@
if ((p_buff = (UINT8 *) GKI_getbuf(sizeof(UINT8) * SDP_MAX_ATTR_LEN * 2)) == NULL)
{
- SDP_TRACE_ERROR0("SDP_AddAdditionProtoLists cannot get a buffer!");
+ SDP_TRACE_ERROR("SDP_AddAdditionProtoLists cannot get a buffer!");
return (FALSE);
}
p = p_buff;
@@ -764,7 +764,7 @@
if ((p_buff = (UINT8 *) GKI_getbuf(sizeof(UINT8) * SDP_MAX_ATTR_LEN)) == NULL)
{
- SDP_TRACE_ERROR0("SDP_AddProfileDescriptorList cannot get a buffer!");
+ SDP_TRACE_ERROR("SDP_AddProfileDescriptorList cannot get a buffer!");
return (FALSE);
}
p = p_buff+2;
@@ -813,7 +813,7 @@
if ((p_buff = (UINT8 *) GKI_getbuf(sizeof(UINT8) * SDP_MAX_ATTR_LEN)) == NULL)
{
- SDP_TRACE_ERROR0("SDP_AddLanguageBaseAttrIDList cannot get a buffer!");
+ SDP_TRACE_ERROR("SDP_AddLanguageBaseAttrIDList cannot get a buffer!");
return (FALSE);
}
p = p_buff;
@@ -862,7 +862,7 @@
if ((p_buff = (UINT8 *) GKI_getbuf(sizeof(UINT8) * SDP_MAX_ATTR_LEN * 2)) == NULL)
{
- SDP_TRACE_ERROR0("SDP_AddServiceClassIdList cannot get a buffer!");
+ SDP_TRACE_ERROR("SDP_AddServiceClassIdList cannot get a buffer!");
return (FALSE);
}
p = p_buff;
@@ -908,7 +908,7 @@
{
tSDP_ATTRIBUTE *p_attr = &p_rec->attribute[0];
- SDP_TRACE_API2("Deleting attr_id 0x%04x for handle 0x%x", attr_id, handle);
+ SDP_TRACE_API("Deleting attr_id 0x%04x for handle 0x%x", attr_id, handle);
/* Found it. Now, find the attribute */
for (xx = 0; xx < p_rec->num_attributes; xx++, p_attr++)
{
diff --git a/stack/sdp/sdp_discovery.c b/stack/sdp/sdp_discovery.c
index 4f1db1b..3fca831 100644
--- a/stack/sdp/sdp_discovery.c
+++ b/stack/sdp/sdp_discovery.c
@@ -171,7 +171,7 @@
p_cmd->len = (UINT16)(p - p_start);
#if (SDP_DEBUG_RAW == TRUE)
- SDP_TRACE_WARNING2("sdp_snd_service_search_req cont_len :%d disc_state:%d",cont_len, p_ccb->disc_state);
+ SDP_TRACE_WARNING("sdp_snd_service_search_req cont_len :%d disc_state:%d",cont_len, p_ccb->disc_state);
#endif
@@ -245,7 +245,7 @@
BOOLEAN invalid_pdu = TRUE;
#if (SDP_DEBUG_RAW == TRUE)
- SDP_TRACE_WARNING1("sdp_disc_server_rsp disc_state:%d", p_ccb->disc_state);
+ SDP_TRACE_WARNING("sdp_disc_server_rsp disc_state:%d", p_ccb->disc_state);
#endif
/* stop inactivity timer when we receive a response */
@@ -302,7 +302,7 @@
if (invalid_pdu)
{
- SDP_TRACE_WARNING2 ("SDP - Unexp. PDU: %d in state: %d", rsp_pdu, p_ccb->disc_state);
+ SDP_TRACE_WARNING ("SDP - Unexp. PDU: %d in state: %d", rsp_pdu, p_ccb->disc_state);
sdp_disconnect (p_ccb, SDP_GENERIC_ERROR);
}
}
@@ -332,7 +332,7 @@
p_ccb->num_handles += cur_handles;
if (p_ccb->num_handles == 0)
{
- SDP_TRACE_WARNING0 ("SDP - Rcvd ServiceSearchRsp, no matches");
+ SDP_TRACE_WARNING ("SDP - Rcvd ServiceSearchRsp, no matches");
sdp_disconnect (p_ccb, SDP_NO_RECS_MATCH);
return;
}
@@ -395,7 +395,7 @@
{
sprintf((char *)&num_array[i*2],"%02X",(UINT8)(p_ccb->rsp_list[i]));
}
- SDP_TRACE_WARNING1("result :%s",num_array);
+ SDP_TRACE_WARNING("result :%s",num_array);
#endif
if(p_ccb->p_db->raw_data)
@@ -414,7 +414,7 @@
cpy_len = list_len;
}
#if (SDP_DEBUG_RAW == TRUE)
- SDP_TRACE_WARNING4("list_len :%d cpy_len:%d raw_size:%d raw_used:%d",
+ SDP_TRACE_WARNING("list_len :%d cpy_len:%d raw_size:%d raw_used:%d",
list_len, cpy_len, p_ccb->p_db->raw_size, p_ccb->p_db->raw_used);
#endif
memcpy (&p_ccb->p_db->raw_data[p_ccb->p_db->raw_used], p, cpy_len);
@@ -440,14 +440,14 @@
BOOLEAN cont_request_needed = FALSE;
#if (SDP_DEBUG_RAW == TRUE)
- SDP_TRACE_WARNING2("process_service_attr_rsp raw inc:%d",
+ SDP_TRACE_WARNING("process_service_attr_rsp raw inc:%d",
SDP_RAW_DATA_INCLUDED);
#endif
/* If p_reply is NULL, we were called after the records handles were read */
if (p_reply)
{
#if (SDP_DEBUG_RAW == TRUE)
- SDP_TRACE_WARNING4("ID & len: 0x%02x-%02x-%02x-%02x",
+ SDP_TRACE_WARNING("ID & len: 0x%02x-%02x-%02x-%02x",
p_reply[0], p_reply[1], p_reply[2], p_reply[3]);
#endif
/* Skip transaction ID and length */
@@ -455,7 +455,7 @@
BE_STREAM_TO_UINT16 (list_byte_count, p_reply);
#if (SDP_DEBUG_RAW == TRUE)
- SDP_TRACE_WARNING1("list_byte_count:%d", list_byte_count);
+ SDP_TRACE_WARNING("list_byte_count:%d", list_byte_count);
#endif
/* Copy the response to the scratchpad. First, a safety check on the length */
@@ -466,7 +466,7 @@
}
#if (SDP_DEBUG_RAW == TRUE)
- SDP_TRACE_WARNING2("list_len: %d, list_byte_count: %d",
+ SDP_TRACE_WARNING("list_len: %d, list_byte_count: %d",
p_ccb->list_len, list_byte_count);
#endif
if (p_ccb->rsp_list == NULL)
@@ -474,7 +474,7 @@
p_ccb->rsp_list = (UINT8 *)GKI_getbuf (SDP_MAX_LIST_BYTE_COUNT);
if (p_ccb->rsp_list == NULL)
{
- SDP_TRACE_ERROR0 ("SDP - no gki buf to save rsp");
+ SDP_TRACE_ERROR ("SDP - no gki buf to save rsp");
sdp_disconnect (p_ccb, SDP_NO_RESOURCES);
return;
}
@@ -483,10 +483,10 @@
p_ccb->list_len += list_byte_count;
p_reply += list_byte_count;
#if (SDP_DEBUG_RAW == TRUE)
- SDP_TRACE_WARNING1("list_len: %d(attr_rsp)", p_ccb->list_len);
+ SDP_TRACE_WARNING("list_len: %d(attr_rsp)", p_ccb->list_len);
/* Check if we need to request a continuation */
- SDP_TRACE_WARNING2("*p_reply:%d(%d)", *p_reply, SDP_MAX_CONTINUATION_LEN);
+ SDP_TRACE_WARNING("*p_reply:%d(%d)", *p_reply, SDP_MAX_CONTINUATION_LEN);
#endif
if (*p_reply)
{
@@ -501,7 +501,7 @@
{
#if (SDP_RAW_DATA_INCLUDED == TRUE)
- SDP_TRACE_WARNING0("process_service_attr_rsp");
+ SDP_TRACE_WARNING("process_service_attr_rsp");
sdp_copy_raw_data (p_ccb, FALSE);
#endif
@@ -600,13 +600,13 @@
BOOLEAN cont_request_needed = FALSE;
#if (SDP_DEBUG_RAW == TRUE)
- SDP_TRACE_WARNING1("process_service_search_attr_rsp");
+ SDP_TRACE_WARNING("process_service_search_attr_rsp");
#endif
/* If p_reply is NULL, we were called for the initial read */
if (p_reply)
{
#if (SDP_DEBUG_RAW == TRUE)
- SDP_TRACE_WARNING4("ID & len: 0x%02x-%02x-%02x-%02x",
+ SDP_TRACE_WARNING("ID & len: 0x%02x-%02x-%02x-%02x",
p_reply[0], p_reply[1], p_reply[2], p_reply[3]);
#endif
/* Skip transaction ID and length */
@@ -614,7 +614,7 @@
BE_STREAM_TO_UINT16 (lists_byte_count, p_reply);
#if (SDP_DEBUG_RAW == TRUE)
- SDP_TRACE_WARNING1("lists_byte_count:%d", lists_byte_count);
+ SDP_TRACE_WARNING("lists_byte_count:%d", lists_byte_count);
#endif
/* Copy the response to the scratchpad. First, a safety check on the length */
@@ -625,7 +625,7 @@
}
#if (SDP_DEBUG_RAW == TRUE)
- SDP_TRACE_WARNING2("list_len: %d, list_byte_count: %d",
+ SDP_TRACE_WARNING("list_len: %d, list_byte_count: %d",
p_ccb->list_len, lists_byte_count);
#endif
if (p_ccb->rsp_list == NULL)
@@ -633,7 +633,7 @@
p_ccb->rsp_list = (UINT8 *)GKI_getbuf (SDP_MAX_LIST_BYTE_COUNT);
if (p_ccb->rsp_list == NULL)
{
- SDP_TRACE_ERROR0 ("SDP - no gki buf to save rsp");
+ SDP_TRACE_ERROR ("SDP - no gki buf to save rsp");
sdp_disconnect (p_ccb, SDP_NO_RESOURCES);
return;
}
@@ -642,10 +642,10 @@
p_ccb->list_len += lists_byte_count;
p_reply += lists_byte_count;
#if (SDP_DEBUG_RAW == TRUE)
- SDP_TRACE_WARNING1("list_len: %d(search_attr_rsp)", p_ccb->list_len);
+ SDP_TRACE_WARNING("list_len: %d(search_attr_rsp)", p_ccb->list_len);
/* Check if we need to request a continuation */
- SDP_TRACE_WARNING2("*p_reply:%d(%d)", *p_reply, SDP_MAX_CONTINUATION_LEN);
+ SDP_TRACE_WARNING("*p_reply:%d(%d)", *p_reply, SDP_MAX_CONTINUATION_LEN);
#endif
if (*p_reply)
{
@@ -660,7 +660,7 @@
}
#if (SDP_DEBUG_RAW == TRUE)
- SDP_TRACE_WARNING1("cont_request_needed:%d", cont_request_needed);
+ SDP_TRACE_WARNING("cont_request_needed:%d", cont_request_needed);
#endif
/* If continuation request (or first time request) */
if ((cont_request_needed) || (!p_reply))
@@ -733,7 +733,7 @@
/*******************************************************************/
#if (SDP_RAW_DATA_INCLUDED == TRUE)
- SDP_TRACE_WARNING0("process_service_search_attr_rsp");
+ SDP_TRACE_WARNING("process_service_search_attr_rsp");
sdp_copy_raw_data (p_ccb, TRUE);
#endif
@@ -744,7 +744,7 @@
if ((type >> 3) != DATA_ELE_SEQ_DESC_TYPE)
{
- SDP_TRACE_WARNING1 ("SDP - Wrong type: 0x%02x in attr_rsp", type);
+ SDP_TRACE_WARNING ("SDP - Wrong type: 0x%02x in attr_rsp", type);
return;
}
p = sdpu_get_len_from_type (p, type, &seq_len);
@@ -792,14 +792,14 @@
if ((type >> 3) != DATA_ELE_SEQ_DESC_TYPE)
{
- SDP_TRACE_WARNING1 ("SDP - Wrong type: 0x%02x in attr_rsp", type);
+ SDP_TRACE_WARNING ("SDP - Wrong type: 0x%02x in attr_rsp", type);
return (NULL);
}
p = sdpu_get_len_from_type (p, type, &seq_len);
if ((p + seq_len) > p_msg_end)
{
- SDP_TRACE_WARNING1 ("SDP - Bad len in attr_rsp %d", seq_len);
+ SDP_TRACE_WARNING ("SDP - Bad len in attr_rsp %d", seq_len);
return (NULL);
}
@@ -807,7 +807,7 @@
p_rec = add_record (p_ccb->p_db, p_ccb->device_address);
if (!p_rec)
{
- SDP_TRACE_WARNING0 ("SDP - DB full add_record");
+ SDP_TRACE_WARNING ("SDP - DB full add_record");
return (NULL);
}
@@ -820,7 +820,7 @@
p = sdpu_get_len_from_type (p, type, &attr_len);
if (((type >> 3) != UINT_DESC_TYPE) || (attr_len != 2))
{
- SDP_TRACE_WARNING2 ("SDP - Bad type: 0x%02x or len: %d in attr_rsp", type, attr_len);
+ SDP_TRACE_WARNING ("SDP - Bad type: 0x%02x or len: %d in attr_rsp", type, attr_len);
return (NULL);
}
BE_STREAM_TO_UINT16 (attr_id, p);
@@ -830,7 +830,7 @@
if (!p)
{
- SDP_TRACE_WARNING0 ("SDP - DB full add_attr");
+ SDP_TRACE_WARNING ("SDP - DB full add_attr");
return (NULL);
}
}
@@ -947,10 +947,10 @@
p_end = p + attr_len;
total_len = 0;
- /* SDP_TRACE_DEBUG1 ("SDP - attr nest level:%d(list)", nest_level); */
+ /* SDP_TRACE_DEBUG ("SDP - attr nest level:%d(list)", nest_level); */
if (nest_level >= MAX_NEST_LEVELS)
{
- SDP_TRACE_ERROR0 ("SDP - attr nesting too deep");
+ SDP_TRACE_ERROR ("SDP - attr nesting too deep");
return (p_end);
}
@@ -1027,7 +1027,7 @@
}
break;
default:
- SDP_TRACE_WARNING1 ("SDP - bad len in UUID attr: %d", attr_len);
+ SDP_TRACE_WARNING ("SDP - bad len in UUID attr: %d", attr_len);
return (p + attr_len);
}
break;
@@ -1040,15 +1040,15 @@
p_end = p + attr_len;
total_len = 0;
- /* SDP_TRACE_DEBUG1 ("SDP - attr nest level:%d", nest_level); */
+ /* SDP_TRACE_DEBUG ("SDP - attr nest level:%d", nest_level); */
if (nest_level >= MAX_NEST_LEVELS)
{
- SDP_TRACE_ERROR0 ("SDP - attr nesting too deep");
+ SDP_TRACE_ERROR ("SDP - attr nesting too deep");
return (p_end);
}
if(is_additional_list != 0 || attr_id == ATTR_ID_ADDITION_PROTO_DESC_LISTS)
nest_level |= SDP_ADDITIONAL_LIST_MASK;
- /* SDP_TRACE_DEBUG1 ("SDP - attr nest level:0x%x(finish)", nest_level); */
+ /* SDP_TRACE_DEBUG ("SDP - attr nest level:0x%x(finish)", nest_level); */
while (p < p_end)
{
@@ -1072,7 +1072,7 @@
p_attr->attr_value.v.u8 = *p++;
break;
default:
- SDP_TRACE_WARNING1 ("SDP - bad len in boolean attr: %d", attr_len);
+ SDP_TRACE_WARNING ("SDP - bad len in boolean attr: %d", attr_len);
return (p + attr_len);
}
break;
@@ -1104,20 +1104,20 @@
if (!p_parent_attr->attr_value.v.p_sub_attr)
{
p_parent_attr->attr_value.v.p_sub_attr = p_attr;
- /* SDP_TRACE_DEBUG4 ("parent:0x%x(id:%d), ch:0x%x(id:%d)",
+ /* SDP_TRACE_DEBUG ("parent:0x%x(id:%d), ch:0x%x(id:%d)",
p_parent_attr, p_parent_attr->attr_id, p_attr, p_attr->attr_id); */
}
else
{
tSDP_DISC_ATTR *p_attr1 = p_parent_attr->attr_value.v.p_sub_attr;
- /* SDP_TRACE_DEBUG4 ("parent:0x%x(id:%d), ch1:0x%x(id:%d)",
+ /* SDP_TRACE_DEBUG ("parent:0x%x(id:%d), ch1:0x%x(id:%d)",
p_parent_attr, p_parent_attr->attr_id, p_attr1, p_attr1->attr_id); */
while (p_attr1->p_next_attr)
p_attr1 = p_attr1->p_next_attr;
p_attr1->p_next_attr = p_attr;
- /* SDP_TRACE_DEBUG2 ("new ch:0x%x(id:%d)", p_attr, p_attr->attr_id); */
+ /* SDP_TRACE_DEBUG ("new ch:0x%x(id:%d)", p_attr, p_attr->attr_id); */
}
}
diff --git a/stack/sdp/sdp_main.c b/stack/sdp/sdp_main.c
index d43c634..1e0c22a 100644
--- a/stack/sdp/sdp_main.c
+++ b/stack/sdp/sdp_main.c
@@ -97,7 +97,7 @@
if (!BTM_SetSecurityLevel (FALSE, SDP_SERVICE_NAME, BTM_SEC_SERVICE_SDP_SERVER,
SDP_SECURITY_LEVEL, SDP_PSM, 0, 0))
{
- SDP_TRACE_ERROR0 ("Security Registration Server failed");
+ SDP_TRACE_ERROR ("Security Registration Server failed");
return;
}
#endif
@@ -107,7 +107,7 @@
if (!BTM_SetSecurityLevel (TRUE, SDP_SERVICE_NAME, BTM_SEC_SERVICE_SDP_SERVER,
SDP_SECURITY_LEVEL, SDP_PSM, 0, 0))
{
- SDP_TRACE_ERROR0 ("Security Registration for Client failed");
+ SDP_TRACE_ERROR ("Security Registration for Client failed");
return;
}
#endif
@@ -133,7 +133,7 @@
/* Now, register with L2CAP */
if (!L2CA_Register (SDP_PSM, &sdp_cb.reg_info))
{
- SDP_TRACE_ERROR0 ("SDP Registration failed");
+ SDP_TRACE_ERROR ("SDP Registration failed");
}
}
@@ -193,7 +193,7 @@
if (cfg.fcr_present)
{
- SDP_TRACE_DEBUG6("sdp_connect_ind: mode %u, txwinsz %u, max_trans %u, rtrans_tout %u, mon_tout %u, mps %u",
+ SDP_TRACE_DEBUG("sdp_connect_ind: mode %u, txwinsz %u, max_trans %u, rtrans_tout %u, mon_tout %u, mps %u",
cfg.fcr.mode, cfg.fcr.tx_win_sz, cfg.fcr.max_transmit,
cfg.fcr.rtrans_tout,cfg.fcr.mon_tout, cfg.fcr.mps);
}
@@ -208,7 +208,7 @@
}
}
- SDP_TRACE_EVENT1 ("SDP - Rcvd L2CAP conn ind, sent config req, CID 0x%x", p_ccb->connection_id);
+ SDP_TRACE_EVENT ("SDP - Rcvd L2CAP conn ind, sent config req, CID 0x%x", p_ccb->connection_id);
#else /* No server */
/* Reject the connection */
L2CA_ConnectRsp (bd_addr, l2cap_id, l2cap_cid, L2CAP_CONN_NO_PSM, 0);
@@ -235,7 +235,7 @@
/* Find CCB based on CID */
if ((p_ccb = sdpu_find_ccb_by_cid (l2cap_cid)) == NULL)
{
- SDP_TRACE_WARNING1 ("SDP - Rcvd conn cnf for unknown CID 0x%x", l2cap_cid);
+ SDP_TRACE_WARNING ("SDP - Rcvd conn cnf for unknown CID 0x%x", l2cap_cid);
return;
}
@@ -249,7 +249,7 @@
if (cfg.fcr_present)
{
- SDP_TRACE_DEBUG6("sdp_connect_cfm: mode %u, txwinsz %u, max_trans %u, rtrans_tout %u, mon_tout %u, mps %u",
+ SDP_TRACE_DEBUG("sdp_connect_cfm: mode %u, txwinsz %u, max_trans %u, rtrans_tout %u, mon_tout %u, mps %u",
cfg.fcr.mode, cfg.fcr.tx_win_sz, cfg.fcr.max_transmit,
cfg.fcr.rtrans_tout,cfg.fcr.mon_tout, cfg.fcr.mps);
}
@@ -263,11 +263,11 @@
L2CA_ConfigReq (l2cap_cid, &cfg);
}
- SDP_TRACE_EVENT1 ("SDP - got conn cnf, sent cfg req, CID: 0x%x", p_ccb->connection_id);
+ SDP_TRACE_EVENT ("SDP - got conn cnf, sent cfg req, CID: 0x%x", p_ccb->connection_id);
}
else
{
- SDP_TRACE_WARNING2 ("SDP - Rcvd conn cnf with error: 0x%x CID 0x%x", result, p_ccb->connection_id);
+ SDP_TRACE_WARNING ("SDP - Rcvd conn cnf with error: 0x%x CID 0x%x", result, p_ccb->connection_id);
/* Tell the user if he has a callback */
if (p_ccb->p_cb || p_ccb->p_cb2)
@@ -312,7 +312,7 @@
/* Find CCB based on CID */
if ((p_ccb = sdpu_find_ccb_by_cid (l2cap_cid)) == NULL)
{
- SDP_TRACE_WARNING1 ("SDP - Rcvd L2CAP cfg ind, unknown CID: 0x%x", l2cap_cid);
+ SDP_TRACE_WARNING ("SDP - Rcvd L2CAP cfg ind, unknown CID: 0x%x", l2cap_cid);
return;
}
@@ -346,7 +346,7 @@
{
p_cfg->fcr.tx_win_sz = sdp_cb.l2cap_my_cfg.fcr.tx_win_sz;
p_cfg->result = L2CAP_CFG_UNACCEPTABLE_PARAMS;
- SDP_TRACE_DEBUG0("sdp_config_ind(CONFIG) -> Please try again with SMALLER TX WINDOW");
+ SDP_TRACE_DEBUG("sdp_config_ind(CONFIG) -> Please try again with SMALLER TX WINDOW");
}
/* Reject if locally we want basic and they don't */
@@ -355,12 +355,12 @@
/* Ask for a new setup */
p_cfg->fcr.mode = L2CAP_FCR_BASIC_MODE;
p_cfg->result = L2CAP_CFG_UNACCEPTABLE_PARAMS;
- SDP_TRACE_DEBUG0("sdp_config_ind(CONFIG) -> Please try again with BASIC mode");
+ SDP_TRACE_DEBUG("sdp_config_ind(CONFIG) -> Please try again with BASIC mode");
}
/* Remain in configure state and give the peer our desired configuration */
if (p_cfg->result != L2CAP_CFG_OK)
{
- SDP_TRACE_WARNING1 ("SDP - Rcvd cfg ind, Unacceptable Parameters sent cfg cfm, CID: 0x%x", l2cap_cid);
+ SDP_TRACE_WARNING ("SDP - Rcvd cfg ind, Unacceptable Parameters sent cfg cfm, CID: 0x%x", l2cap_cid);
L2CA_ConfigRsp (l2cap_cid, p_cfg);
return;
}
@@ -371,7 +371,7 @@
L2CA_ConfigRsp (l2cap_cid, p_cfg);
- SDP_TRACE_EVENT1 ("SDP - Rcvd cfg ind, sent cfg cfm, CID: 0x%x", l2cap_cid);
+ SDP_TRACE_EVENT ("SDP - Rcvd cfg ind, sent cfg cfm, CID: 0x%x", l2cap_cid);
p_ccb->con_flags |= SDP_FLAGS_HIS_CFG_DONE;
@@ -403,12 +403,12 @@
{
tCONN_CB *p_ccb;
- SDP_TRACE_EVENT2 ("SDP - Rcvd cfg cfm, CID: 0x%x Result: %d", l2cap_cid, p_cfg->result);
+ SDP_TRACE_EVENT ("SDP - Rcvd cfg cfm, CID: 0x%x Result: %d", l2cap_cid, p_cfg->result);
/* Find CCB based on CID */
if ((p_ccb = sdpu_find_ccb_by_cid (l2cap_cid)) == NULL)
{
- SDP_TRACE_WARNING1 ("SDP - Rcvd L2CAP cfg ind, unknown CID: 0x%x", l2cap_cid);
+ SDP_TRACE_WARNING ("SDP - Rcvd L2CAP cfg ind, unknown CID: 0x%x", l2cap_cid);
return;
}
@@ -464,14 +464,14 @@
/* Find CCB based on CID */
if ((p_ccb = sdpu_find_ccb_by_cid (l2cap_cid)) == NULL)
{
- SDP_TRACE_WARNING1 ("SDP - Rcvd L2CAP disc, unknown CID: 0x%x", l2cap_cid);
+ SDP_TRACE_WARNING ("SDP - Rcvd L2CAP disc, unknown CID: 0x%x", l2cap_cid);
return;
}
if (ack_needed)
L2CA_DisconnectRsp (l2cap_cid);
- SDP_TRACE_EVENT1 ("SDP - Rcvd L2CAP disc, CID: 0x%x", l2cap_cid);
+ SDP_TRACE_EVENT ("SDP - Rcvd L2CAP disc, CID: 0x%x", l2cap_cid);
#if SDP_CLIENT_ENABLED == TRUE
/* Tell the user if he has a callback */
if (p_ccb->p_cb)
@@ -516,13 +516,13 @@
}
else
{
- SDP_TRACE_WARNING2 ("SDP - Ignored L2CAP data while in state: %d, CID: 0x%x",
+ SDP_TRACE_WARNING ("SDP - Ignored L2CAP data while in state: %d, CID: 0x%x",
p_ccb->con_state, l2cap_cid);
}
}
else
{
- SDP_TRACE_WARNING1 ("SDP - Rcvd L2CAP data, unknown CID: 0x%x", l2cap_cid);
+ SDP_TRACE_WARNING ("SDP - Rcvd L2CAP data, unknown CID: 0x%x", l2cap_cid);
}
GKI_freebuf (p_msg);
@@ -548,11 +548,11 @@
/* Allocate a new CCB. Return if none available. */
if ((p_ccb = sdpu_allocate_ccb()) == NULL)
{
- SDP_TRACE_WARNING0 ("SDP - no spare CCB for orig");
+ SDP_TRACE_WARNING ("SDP - no spare CCB for orig");
return (NULL);
}
- SDP_TRACE_EVENT0 ("SDP - Originate started");
+ SDP_TRACE_EVENT ("SDP - Originate started");
/* We are the originator of this connection */
p_ccb->con_flags |= SDP_FLAGS_IS_ORIG;
@@ -580,7 +580,7 @@
}
else
{
- SDP_TRACE_WARNING0 ("SDP - Originate failed");
+ SDP_TRACE_WARNING ("SDP - Originate failed");
sdpu_release_ccb (p_ccb);
return (NULL);
}
@@ -624,7 +624,7 @@
p_ccb->cur_handle = 0;
- SDP_TRACE_EVENT1 ("SDP - looking for for more, CID: 0x%x",
+ SDP_TRACE_EVENT ("SDP - looking for for more, CID: 0x%x",
p_ccb->connection_id);
sdp_disc_connected (p_ccb);
@@ -637,7 +637,7 @@
#endif
- SDP_TRACE_EVENT1 ("SDP - disconnect CID: 0x%x", p_ccb->connection_id);
+ SDP_TRACE_EVENT ("SDP - disconnect CID: 0x%x", p_ccb->connection_id);
/* Check if we have a connection ID */
if (p_ccb->connection_id != 0)
@@ -678,11 +678,11 @@
/* Find CCB based on CID */
if ((p_ccb = sdpu_find_ccb_by_cid (l2cap_cid)) == NULL)
{
- SDP_TRACE_WARNING1 ("SDP - Rcvd L2CAP disc cfm, unknown CID: 0x%x", l2cap_cid);
+ SDP_TRACE_WARNING ("SDP - Rcvd L2CAP disc cfm, unknown CID: 0x%x", l2cap_cid);
return;
}
- SDP_TRACE_EVENT1 ("SDP - Rcvd L2CAP disc cfm, CID: 0x%x", l2cap_cid);
+ SDP_TRACE_EVENT ("SDP - Rcvd L2CAP disc cfm, CID: 0x%x", l2cap_cid);
/* Tell the user if he has a callback */
if (p_ccb->p_cb)
@@ -708,7 +708,7 @@
*******************************************************************************/
void sdp_conn_timeout (tCONN_CB*p_ccb)
{
- SDP_TRACE_EVENT2 ("SDP - CCB timeout in state: %d CID: 0x%x",
+ SDP_TRACE_EVENT ("SDP - CCB timeout in state: %d CID: 0x%x",
p_ccb->con_state, p_ccb->connection_id);
L2CA_DisconnectReq (p_ccb->connection_id);
diff --git a/stack/sdp/sdp_server.c b/stack/sdp/sdp_server.c
index 5d11cb4..de42097 100644
--- a/stack/sdp/sdp_server.c
+++ b/stack/sdp/sdp_server.c
@@ -97,6 +97,10 @@
#define SDP_TEXT_BAD_CONT_INX NULL
#endif
+#ifndef SDP_TEXT_BAD_MAX_RECORDS_LIST
+#define SDP_TEXT_BAD_MAX_RECORDS_LIST NULL
+#endif
+
/*******************************************************************************
**
** Function sdp_server_handle_client_req
@@ -148,7 +152,7 @@
default:
sdpu_build_n_send_error (p_ccb, trans_num, SDP_INVALID_REQ_SYNTAX, SDP_TEXT_BAD_PDU);
- SDP_TRACE_WARNING1 ("SDP - server got unknown PDU: 0x%x", pdu_id);
+ SDP_TRACE_WARNING ("SDP - server got unknown PDU: 0x%x", pdu_id);
break;
}
}
@@ -194,6 +198,14 @@
if (max_replies > SDP_MAX_RECORDS)
max_replies = SDP_MAX_RECORDS;
+
+ if ((!p_req) || (p_req > p_req_end))
+ {
+ sdpu_build_n_send_error (p_ccb, trans_num, SDP_INVALID_REQ_SYNTAX, SDP_TEXT_BAD_MAX_RECORDS_LIST);
+ return;
+ }
+
+
/* Get a list of handles that match the UUIDs given to us */
for (num_rsp_handles = 0; num_rsp_handles < max_replies; )
{
@@ -245,7 +257,7 @@
/* Get a buffer to use to build the response */
if ((p_buf = (BT_HDR *)GKI_getpoolbuf (SDP_POOL_ID)) == NULL)
{
- SDP_TRACE_ERROR0 ("SDP - no buf for search rsp");
+ SDP_TRACE_ERROR ("SDP - no buf for search rsp");
return;
}
p_buf->offset = L2CAP_MIN_OFFSET;
@@ -263,7 +275,7 @@
UINT16_TO_BE_STREAM (p_rsp, num_rsp_handles);
UINT16_TO_BE_STREAM (p_rsp, cur_handles);
-/* SDP_TRACE_DEBUG5("SDP Service Rsp: tothdl %d, curhdlr %d, start %d, end %d, cont %d",
+/* SDP_TRACE_DEBUG("SDP Service Rsp: tothdl %d, curhdlr %d, start %d, end %d, cont %d",
num_rsp_handles, cur_handles, cont_offset,
cont_offset + cur_handles-1, is_cont); */
for (xx = cont_offset; xx < cont_offset + cur_handles; xx++)
@@ -380,12 +392,18 @@
else
{
/* Get a scratch buffer to store response */
- if (!p_ccb->rsp_list)
+ if (!p_ccb->rsp_list || (GKI_get_buf_size(p_ccb->rsp_list) < max_list_len))
{
+ /* Free and reallocate if the earlier allocated buffer is small */
+ if (p_ccb->rsp_list)
+ {
+ GKI_freebuf (p_ccb->rsp_list);
+ }
+
p_ccb->rsp_list = (UINT8 *)GKI_getbuf (max_list_len);
if (p_ccb->rsp_list == NULL)
{
- SDP_TRACE_ERROR0 ("SDP - no scratch buf for search rsp");
+ SDP_TRACE_ERROR ("SDP - no scratch buf for search rsp");
return;
}
}
@@ -434,7 +452,7 @@
{
if (attr_len >= SDP_MAX_ATTR_LEN)
{
- SDP_TRACE_ERROR2("SDP attr too big: max_list_len=%d,attr_len=%d", max_list_len, attr_len);
+ SDP_TRACE_ERROR("SDP attr too big: max_list_len=%d,attr_len=%d", max_list_len, attr_len);
sdpu_build_n_send_error (p_ccb, trans_num, SDP_NO_RESOURCES, NULL);
return;
}
@@ -493,7 +511,7 @@
/* Get a buffer to use to build the response */
if ((p_buf = (BT_HDR *)GKI_getpoolbuf (SDP_POOL_ID)) == NULL)
{
- SDP_TRACE_ERROR0 ("SDP - no buf for search rsp");
+ SDP_TRACE_ERROR ("SDP - no buf for search rsp");
return;
}
p_buf->offset = L2CAP_MIN_OFFSET;
@@ -624,12 +642,18 @@
else
{
/* Get a scratch buffer to store response */
- if (!p_ccb->rsp_list)
+ if (!p_ccb->rsp_list || (GKI_get_buf_size(p_ccb->rsp_list) < max_list_len))
{
+ /* Free and reallocate if the earlier allocated buffer is small */
+ if (p_ccb->rsp_list)
+ {
+ GKI_freebuf (p_ccb->rsp_list);
+ }
+
p_ccb->rsp_list = (UINT8 *)GKI_getbuf (max_list_len);
if (p_ccb->rsp_list == NULL)
{
- SDP_TRACE_ERROR0 ("SDP - no scratch buf for search rsp");
+ SDP_TRACE_ERROR ("SDP - no scratch buf for search rsp");
return;
}
}
@@ -702,7 +726,7 @@
{
if (attr_len >= SDP_MAX_ATTR_LEN)
{
- SDP_TRACE_ERROR2("SDP attr too big: max_list_len=%d,attr_len=%d", max_list_len, attr_len);
+ SDP_TRACE_ERROR("SDP attr too big: max_list_len=%d,attr_len=%d", max_list_len, attr_len);
sdpu_build_n_send_error (p_ccb, trans_num, SDP_NO_RESOURCES, NULL);
return;
}
@@ -789,7 +813,7 @@
/* Get a buffer to use to build the response */
if ((p_buf = (BT_HDR *)GKI_getpoolbuf (SDP_POOL_ID)) == NULL)
{
- SDP_TRACE_ERROR0 ("SDP - no buf for search rsp");
+ SDP_TRACE_ERROR ("SDP - no buf for search rsp");
return;
}
p_buf->offset = L2CAP_MIN_OFFSET;
diff --git a/stack/sdp/sdp_utils.c b/stack/sdp/sdp_utils.c
index 842e757..7cc9404 100644
--- a/stack/sdp/sdp_utils.c
+++ b/stack/sdp/sdp_utils.c
@@ -156,7 +156,7 @@
/* Free the response buffer */
if (p_ccb->rsp_list)
{
- SDP_TRACE_DEBUG0("releasing SDP rsp_list");
+ SDP_TRACE_DEBUG("releasing SDP rsp_list");
GKI_freebuf(p_ccb->rsp_list);
p_ccb->rsp_list = NULL;
@@ -317,13 +317,13 @@
BT_HDR *p_buf;
- SDP_TRACE_WARNING2 ("SDP - sdpu_build_n_send_error code: 0x%x CID: 0x%x",
+ SDP_TRACE_WARNING ("SDP - sdpu_build_n_send_error code: 0x%x CID: 0x%x",
error_code, p_ccb->connection_id);
/* Get a buffer to use to build and send the packet to L2CAP */
if ((p_buf = (BT_HDR *)GKI_getpoolbuf (SDP_POOL_ID)) == NULL)
{
- SDP_TRACE_ERROR0 ("SDP - no buf for err msg");
+ SDP_TRACE_ERROR ("SDP - no buf for err msg");
return;
}
p_buf->offset = L2CAP_MIN_OFFSET;
@@ -1006,7 +1006,7 @@
if ((p_attr_buff = (UINT8 *) GKI_getbuf(sizeof(UINT8) * SDP_MAX_ATTR_LEN )) == NULL)
{
- SDP_TRACE_ERROR0("sdpu_build_partial_attrib_entry cannot get a buffer!");
+ SDP_TRACE_ERROR("sdpu_build_partial_attrib_entry cannot get a buffer!");
return NULL;
}
p_tmp_attr = p_attr_buff;
diff --git a/stack/smp/aes.c b/stack/smp/aes.c
index 65cddf5..d2e86cd 100644
--- a/stack/smp/aes.c
+++ b/stack/smp/aes.c
@@ -510,6 +510,7 @@
keylen = 24;
break;
case 32:
+ /* case 256: length in bits (256 = 8*32) */
keylen = 32;
break;
default:
diff --git a/stack/smp/smp_act.c b/stack/smp/smp_act.c
index 47cd2c9..6568316 100644
--- a/stack/smp/smp_act.c
+++ b/stack/smp/smp_act.c
@@ -26,6 +26,7 @@
#include "l2c_api.h"
#include "smp_int.h"
+#define MAX_KEY_DISTRIBUTION_TYPES 3
const UINT8 smp_association_table[2][SMP_IO_CAP_MAX][SMP_IO_CAP_MAX] =
{
@@ -57,8 +58,8 @@
*******************************************************************************/
static void smp_update_key_mask (tSMP_CB *p_cb, UINT8 key_type, BOOLEAN recv)
{
- SMP_TRACE_DEBUG0 ("smp_update_key_mask ");
- SMP_TRACE_DEBUG4("before update role=%d recv=%d loc_i_key = %02x, loc_r_key = %02x", p_cb->role, recv, p_cb->loc_i_key, p_cb->loc_r_key);
+ SMP_TRACE_DEBUG ("smp_update_key_mask ");
+ SMP_TRACE_DEBUG("before update role=%d recv=%d loc_i_key = %02x, loc_r_key = %02x", p_cb->role, recv, p_cb->loc_i_key, p_cb->loc_r_key);
if (p_cb->role == HCI_ROLE_SLAVE)
{
if (recv)
@@ -74,7 +75,7 @@
p_cb->loc_i_key &= ~key_type;
}
- SMP_TRACE_DEBUG2("updated loc_i_key = %02x, loc_r_key = %02x", p_cb->loc_i_key, p_cb->loc_r_key);
+ SMP_TRACE_DEBUG("updated loc_i_key = %02x, loc_r_key = %02x", p_cb->loc_i_key, p_cb->loc_r_key);
}
/*******************************************************************************
** Function smp_io_cap_req
@@ -86,7 +87,7 @@
tSMP_STATUS callback_rc;
UNUSED(p_data);
- SMP_TRACE_DEBUG1 ("smp_send_app_cback p_cb->cb_evt=%d", p_cb->cb_evt );
+ SMP_TRACE_DEBUG ("smp_send_app_cback p_cb->cb_evt=%d", p_cb->cb_evt );
if (p_cb->p_callback && p_cb->cb_evt != 0)
{
if (p_cb->cb_evt == SMP_IO_CAP_REQ_EVT)
@@ -98,28 +99,22 @@
cb_data.io_req.init_keys = p_cb->loc_i_key ;
cb_data.io_req.resp_keys = p_cb->loc_r_key ;
- SMP_TRACE_WARNING1( "io_cap = %d",cb_data.io_req.io_cap);
+ SMP_TRACE_WARNING( "io_cap = %d",cb_data.io_req.io_cap);
}
callback_rc = (*p_cb->p_callback)(p_cb->cb_evt, p_cb->pairing_bda, &cb_data);
- SMP_TRACE_DEBUG2 ("callback_rc=%d p_cb->cb_evt=%d",callback_rc, p_cb->cb_evt );
+ SMP_TRACE_DEBUG ("callback_rc=%d p_cb->cb_evt=%d",callback_rc, p_cb->cb_evt );
if (callback_rc == SMP_SUCCESS && p_cb->cb_evt == SMP_IO_CAP_REQ_EVT)
{
p_cb->loc_auth_req = cb_data.io_req.auth_req;
p_cb->loc_io_caps = cb_data.io_req.io_cap;
-#if (defined(BLE_PERIPHERAL_DISPLAYONLY) && (BLE_PERIPHERAL_DISPLAYONLY == TRUE))
- if (p_cb->role == HCI_ROLE_SLAVE)
- {
- p_cb->loc_io_caps = SMP_IO_CAP_OUT;
- }
-#endif
p_cb->loc_oob_flag = cb_data.io_req.oob_data;
p_cb->loc_enc_size = cb_data.io_req.max_key_size;
p_cb->loc_i_key = cb_data.io_req.init_keys;
p_cb->loc_r_key = cb_data.io_req.resp_keys;
- SMP_TRACE_WARNING2( "new io_cap = %d p_cb->loc_enc_size = %d",p_cb->loc_io_caps, p_cb->loc_enc_size);
+ SMP_TRACE_WARNING( "new io_cap = %d p_cb->loc_enc_size = %d",p_cb->loc_io_caps, p_cb->loc_enc_size);
smp_sm_event(p_cb, SMP_IO_RSP_EVT, NULL);
}
@@ -130,7 +125,7 @@
p_cb->discard_sec_req = FALSE;
smp_sm_event(p_cb, SMP_DISCARD_SEC_REQ_EVT, NULL);
}
- SMP_TRACE_DEBUG0 ("smp_send_app_cback return");
+ SMP_TRACE_DEBUG ("smp_send_app_cback return");
}
/*******************************************************************************
** Function smp_send_pair_fail
@@ -141,7 +136,7 @@
p_cb->status = *(UINT8 *)p_data;
p_cb->failure = *(UINT8 *)p_data;
- SMP_TRACE_DEBUG2 ("smp_send_pair_fail status=%d failure=%d ",p_cb->status, p_cb->failure);
+ SMP_TRACE_DEBUG ("smp_send_pair_fail status=%d failure=%d ",p_cb->status, p_cb->failure);
if (p_cb->status <= SMP_REPEATED_ATTEMPTS && p_cb->status != SMP_SUCCESS)
{
@@ -158,14 +153,18 @@
tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (p_cb->pairing_bda);
UNUSED(p_data);
- SMP_TRACE_DEBUG0 ("smp_send_pair_req ");
+ SMP_TRACE_DEBUG ("smp_send_pair_req ");
#if BLE_INCLUDED == TRUE
/* Disable L2CAP connection parameter updates while bonding since
some peripherals are not able to revert to fast connection parameters
during the start of service discovery. Connection paramter updates
get enabled again once service discovery completes. */
- L2CA_EnableUpdateBleConnParams(p_cb->pairing_bda, FALSE);
+ if (L2CA_EnableUpdateBleConnParams(p_cb->pairing_bda, FALSE) == FALSE)
+ {
+ SMP_TRACE_ERROR ("smp pair failed...!");
+ return;
+ }
#endif
/* erase all keys when master sends pairing req*/
@@ -183,7 +182,7 @@
{
UNUSED(p_data);
- SMP_TRACE_DEBUG0 ("smp_send_pair_rsp ");
+ SMP_TRACE_DEBUG ("smp_send_pair_rsp ");
p_cb->loc_i_key &= p_cb->peer_i_key;
p_cb->loc_r_key &= p_cb->peer_r_key;
@@ -202,7 +201,7 @@
{
UNUSED(p_data);
- SMP_TRACE_DEBUG0 ("smp_send_confirm ");
+ SMP_TRACE_DEBUG ("smp_send_confirm ");
smp_send_cmd(SMP_OPCODE_CONFIRM, p_cb);
}
/*******************************************************************************
@@ -213,12 +212,12 @@
{
UNUSED(p_data);
- SMP_TRACE_DEBUG0 ("smp_send_init ");
+ SMP_TRACE_DEBUG ("smp_send_init ");
#if SMP_CONFORMANCE_TESTING == TRUE
if (p_cb->enable_test_rand_val)
{
- SMP_TRACE_DEBUG0 ("Use rand value from script");
+ SMP_TRACE_DEBUG ("Use rand value from script");
memcpy(p_cb->rand, p_cb->test_rand, BT_OCTET16_LEN);
}
#endif
@@ -234,7 +233,7 @@
tBTM_LE_LENC_KEYS le_key;
UNUSED(p_data);
- SMP_TRACE_DEBUG1 ("smp_send_enc_info p_cb->loc_enc_size = %d", p_cb->loc_enc_size);
+ SMP_TRACE_DEBUG ("smp_send_enc_info p_cb->loc_enc_size = %d", p_cb->loc_enc_size);
smp_update_key_mask (p_cb, SMP_SEC_KEY_TYPE_ENC, FALSE);
smp_send_cmd(SMP_OPCODE_ENCRYPT_INFO, p_cb);
@@ -246,7 +245,7 @@
le_key.sec_level = p_cb->sec_level;
btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_LENC, (tBTM_LE_KEY_VALUE *)&le_key, TRUE);
- SMP_TRACE_WARNING0( "smp_send_enc_info");
+ SMP_TRACE_WARNING( "smp_send_enc_info");
smp_key_distribution(p_cb, NULL);
}
@@ -258,13 +257,13 @@
{
UNUSED(p_data);
- SMP_TRACE_DEBUG0 ("smp_send_id_info ");
+ SMP_TRACE_DEBUG ("smp_send_id_info ");
smp_update_key_mask (p_cb, SMP_SEC_KEY_TYPE_ID, FALSE);
smp_send_cmd(SMP_OPCODE_IDENTITY_INFO, p_cb);
smp_send_cmd(SMP_OPCODE_ID_ADDR, p_cb);
- SMP_TRACE_WARNING0( "smp_send_id_info");
+ SMP_TRACE_WARNING( "smp_send_id_info");
smp_key_distribution(p_cb, NULL);
}
@@ -277,7 +276,7 @@
tBTM_LE_KEY_VALUE key;
UNUSED(p_data);
- SMP_TRACE_DEBUG0 ("smp_send_csrk_info ");
+ SMP_TRACE_DEBUG ("smp_send_csrk_info ");
smp_update_key_mask (p_cb, SMP_SEC_KEY_TYPE_CSRK, FALSE);
if (smp_send_cmd(SMP_OPCODE_SIGN_INFO, p_cb))
@@ -297,7 +296,7 @@
*******************************************************************************/
void smp_send_ltk_reply(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
{
- SMP_TRACE_DEBUG0 ("smp_send_ltk_reply ");
+ SMP_TRACE_DEBUG ("smp_send_ltk_reply ");
/* send stk as LTK response */
btm_ble_ltk_request_reply(p_cb->pairing_bda, TRUE, p_data->key.p_data);
}
@@ -311,27 +310,30 @@
tBTM_BLE_SEC_REQ_ACT sec_req_act;
- SMP_TRACE_DEBUG1 ("smp_proc_sec_req auth_req=0x%x",auth_req);
+ SMP_TRACE_DEBUG ("smp_proc_sec_req auth_req=0x%x",auth_req);
p_cb->cb_evt = 0;
btm_ble_link_sec_check(p_cb->pairing_bda, auth_req, &sec_req_act);
- SMP_TRACE_DEBUG1 ("smp_proc_sec_req sec_req_act=0x%x",sec_req_act);
+ SMP_TRACE_DEBUG ("smp_proc_sec_req sec_req_act=0x%x",sec_req_act);
switch (sec_req_act)
{
case BTM_BLE_SEC_REQ_ACT_ENCRYPT:
- SMP_TRACE_DEBUG0 ("smp_proc_sec_req BTM_BLE_SEC_REQ_ACT_ENCRYPT");
+ SMP_TRACE_DEBUG ("smp_proc_sec_req BTM_BLE_SEC_REQ_ACT_ENCRYPT");
smp_sm_event(p_cb, SMP_ENC_REQ_EVT, NULL);
break;
case BTM_BLE_SEC_REQ_ACT_PAIR:
/* initialize local i/r key to be default keys */
- SMP_TRACE_DEBUG0 ("smp_proc_sec_req BTM_BLE_SEC_REQ_ACT_PAIR");
+ SMP_TRACE_DEBUG ("smp_proc_sec_req BTM_BLE_SEC_REQ_ACT_PAIR");
p_cb->peer_auth_req = auth_req;
p_cb->loc_r_key = p_cb->loc_i_key = SMP_SEC_DEFAULT_KEY ;
p_cb->cb_evt = SMP_SEC_REQUEST_EVT;
+ btu_stop_timer (&p_cb->rsp_timer_ent);
+ btu_start_timer (&p_cb->rsp_timer_ent, BTU_TTYPE_SMP_PAIRING_CMD,
+ SMP_WAIT_FOR_RSP_TOUT);
break;
case BTM_BLE_SEC_REQ_ACT_DISCARD:
@@ -350,7 +352,7 @@
void smp_proc_sec_grant(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
{
UINT8 res= *(UINT8 *)p_data;
- SMP_TRACE_DEBUG0 ("smp_proc_sec_grant ");
+ SMP_TRACE_DEBUG ("smp_proc_sec_grant ");
if (res != SMP_SUCCESS)
{
smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, p_data);
@@ -367,7 +369,7 @@
*******************************************************************************/
void smp_proc_pair_fail(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
{
- SMP_TRACE_DEBUG0 ("smp_proc_pair_fail ");
+ SMP_TRACE_DEBUG ("smp_proc_pair_fail ");
p_cb->status = *(UINT8 *)p_data;
}
/*******************************************************************************
@@ -380,7 +382,7 @@
UINT8 reason = SMP_ENC_KEY_SIZE;
tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (p_cb->pairing_bda);
- SMP_TRACE_DEBUG0 ("smp_proc_pair_cmd ");
+ SMP_TRACE_DEBUG ("smp_proc_pair_cmd ");
/* erase all keys if it is slave proc pairing req*/
if (p_dev_rec && (p_cb->role == HCI_ROLE_SLAVE))
btm_sec_clear_ble_keys(p_dev_rec);
@@ -397,7 +399,7 @@
#if SMP_CONFORMANCE_TESTING == TRUE
if (p_cb->enable_test_pair_fail)
{
- SMP_TRACE_DEBUG0 ("Forced pair fair");
+ SMP_TRACE_DEBUG ("Forced pair fair");
if (p_cb->peer_enc_size < SMP_MIN_ENC_KEY_SIZE)
{
smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
@@ -439,7 +441,7 @@
{
UINT8 *p = (UINT8 *)p_data;
- SMP_TRACE_DEBUG0 ("smp_proc_confirm ");
+ SMP_TRACE_DEBUG ("smp_proc_confirm ");
if (p != NULL)
{
/* save the SConfirm for comparison later */
@@ -456,7 +458,7 @@
void smp_proc_init(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
{
UINT8 *p = (UINT8 *)p_data;
- SMP_TRACE_DEBUG0 ("smp_proc_init ");
+ SMP_TRACE_DEBUG ("smp_proc_init ");
/* save the SRand for comparison */
STREAM_TO_ARRAY(p_cb->rrand, p, BT_OCTET16_LEN);
@@ -469,7 +471,7 @@
{
UINT8 *p = (UINT8 *)p_data;
- SMP_TRACE_DEBUG0 ("smp_proc_enc_info ");
+ SMP_TRACE_DEBUG ("smp_proc_enc_info ");
STREAM_TO_ARRAY(p_cb->ltk, p, BT_OCTET16_LEN);
smp_key_distribution(p_cb, NULL);
@@ -483,7 +485,7 @@
UINT8 *p = (UINT8 *)p_data;
tBTM_LE_PENC_KEYS le_key;
- SMP_TRACE_DEBUG0 (" smp_proc_master_id");
+ SMP_TRACE_DEBUG (" smp_proc_master_id");
smp_update_key_mask (p_cb, SMP_SEC_KEY_TYPE_ENC, TRUE);
STREAM_TO_UINT16(le_key.ediv, p);
@@ -505,7 +507,7 @@
{
UINT8 *p = (UINT8 *)p_data;
- SMP_TRACE_DEBUG0 ("smp_proc_id_info ");
+ SMP_TRACE_DEBUG ("smp_proc_id_info ");
STREAM_TO_ARRAY (p_cb->tk, p, BT_OCTET16_LEN); /* reuse TK for IRK */
smp_key_distribution(p_cb, NULL);
@@ -519,7 +521,7 @@
UINT8 *p = (UINT8 *)p_data;
tBTM_LE_PID_KEYS pid_key;
- SMP_TRACE_DEBUG0 ("smp_proc_id_addr ");
+ SMP_TRACE_DEBUG ("smp_proc_id_addr ");
smp_update_key_mask (p_cb, SMP_SEC_KEY_TYPE_ID, TRUE);
STREAM_TO_UINT8(pid_key.addr_type, p);
@@ -539,7 +541,7 @@
{
tBTM_LE_PCSRK_KEYS le_key;
- SMP_TRACE_DEBUG0 ("smp_proc_srk_info ");
+ SMP_TRACE_DEBUG ("smp_proc_srk_info ");
smp_update_key_mask (p_cb, SMP_SEC_KEY_TYPE_CSRK, TRUE);
/* save CSRK to security record */
@@ -559,7 +561,7 @@
{
UINT8 reason;
- SMP_TRACE_DEBUG0 ("smp_proc_compare ");
+ SMP_TRACE_DEBUG ("smp_proc_compare ");
if (
#if SMP_CONFORMANCE_TESTING == TRUE
p_cb->skip_test_compare_check ||
@@ -596,7 +598,7 @@
{
UINT8 key_type = p_data->key.key_type;
- SMP_TRACE_DEBUG0 ("smp_proc_sl_keysmp_proc_sl_key ");
+ SMP_TRACE_DEBUG ("smp_proc_sl_keysmp_proc_sl_key ");
if (key_type == SMP_KEY_TYPE_TK)
{
smp_generate_confirm(p_cb, NULL);
@@ -616,16 +618,16 @@
*******************************************************************************/
void smp_start_enc(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
{
- BOOLEAN cmd;
+ tBTM_STATUS cmd;
UINT8 reason = SMP_ENC_FAIL;
- SMP_TRACE_DEBUG0 ("smp_start_enc ");
+ SMP_TRACE_DEBUG ("smp_start_enc ");
if (p_data != NULL)
cmd = btm_ble_start_encrypt(p_cb->pairing_bda, TRUE, p_data->key.p_data);
else
cmd = btm_ble_start_encrypt(p_cb->pairing_bda, FALSE, NULL);
- if (!cmd)
+ if (cmd != BTM_CMD_STARTED && cmd != BTM_BUSY)
smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
}
@@ -638,8 +640,9 @@
{
UNUSED(p_data);
- SMP_TRACE_DEBUG0 ("smp_proc_discard ");
- smp_reset_control_value(p_cb);
+ SMP_TRACE_DEBUG ("smp_proc_discard ");
+ if (!(p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD))
+ smp_reset_control_value(p_cb);
}
/*******************************************************************************
** Function smp_proc_release_delay
@@ -649,7 +652,7 @@
{
UNUSED(p_data);
- SMP_TRACE_DEBUG0 ("smp_proc_release_delay ");
+ SMP_TRACE_DEBUG ("smp_proc_release_delay ");
btu_stop_timer (&p_cb->rsp_timer_ent);
btu_start_timer (&p_cb->rsp_timer_ent, BTU_TTYPE_SMP_PAIRING_CMD,
SMP_WAIT_FOR_REL_DELAY_TOUT);
@@ -663,7 +666,7 @@
{
UNUSED(p_data);
- SMP_TRACE_DEBUG0 ("smp_proc_release_delay_tout ");
+ SMP_TRACE_DEBUG ("smp_proc_release_delay_tout ");
btu_stop_timer (&p_cb->rsp_timer_ent);
smp_proc_pairing_cmpl(p_cb);
}
@@ -678,7 +681,7 @@
UINT8 enc_enable = *(UINT8 *)p_data;
UINT8 reason = enc_enable ? SMP_SUCCESS : SMP_ENC_FAIL;
- SMP_TRACE_DEBUG0 ("smp_enc_cmpl ");
+ SMP_TRACE_DEBUG ("smp_enc_cmpl ");
smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
}
@@ -692,7 +695,7 @@
UINT8 enc_enable = *(UINT8 *)p_data;
UINT8 reason = enc_enable ? SMP_SUCCESS : SMP_ENC_FAIL;
- SMP_TRACE_DEBUG3 ("smp_check_auth_req enc_enable=%d i_keys=0x%x r_keys=0x%x (i-initiator r-responder)",
+ SMP_TRACE_DEBUG ("smp_check_auth_req enc_enable=%d i_keys=0x%x r_keys=0x%x (i-initiator r-responder)",
enc_enable, p_cb->loc_i_key, p_cb->loc_r_key);
if (enc_enable == 1)
{
@@ -728,14 +731,14 @@
UINT8 key_to_dist = (p_cb->role == HCI_ROLE_SLAVE) ? p_cb->loc_r_key : p_cb->loc_i_key;
UINT8 i = 0;
- SMP_TRACE_DEBUG1 ("smp_key_pick_key key_to_dist=0x%x", key_to_dist);
- while (i < 3)
+ SMP_TRACE_DEBUG ("smp_key_pick_key key_to_dist=0x%x", key_to_dist);
+ while (i < MAX_KEY_DISTRIBUTION_TYPES)
{
- SMP_TRACE_DEBUG2("key to send = %02x, i = %d", key_to_dist, i);
+ SMP_TRACE_DEBUG("key to send = %02x, i = %d", key_to_dist, i);
if (key_to_dist & (1 << i))
{
- SMP_TRACE_DEBUG1 ("smp_distribute_act[%d]", i);
+ SMP_TRACE_DEBUG ("smp_distribute_act[%d]", i);
(* smp_distribute_act[i])(p_cb, p_data);
break;
}
@@ -749,7 +752,7 @@
void smp_key_distribution(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
{
UINT8 reason = SMP_SUCCESS;
- SMP_TRACE_DEBUG3 ("smp_key_distribution role=%d (0-master) r_keys=0x%x i_keys=0x%x",
+ SMP_TRACE_DEBUG ("smp_key_distribution role=%d (0-master) r_keys=0x%x i_keys=0x%x",
p_cb->role, p_cb->loc_r_key, p_cb->loc_i_key);
if (p_cb->role == HCI_ROLE_SLAVE||
@@ -780,7 +783,7 @@
tSMP_INT_DATA *p = NULL;
UNUSED(p_data);
- SMP_TRACE_DEBUG3 ("smp_decide_asso_model p_cb->peer_io_caps = %d p_cb->loc_io_caps = %d \
+ SMP_TRACE_DEBUG ("smp_decide_asso_model p_cb->peer_io_caps = %d p_cb->loc_io_caps = %d \
p_cb->peer_auth_req = %02x",
p_cb->peer_io_caps, p_cb->loc_io_caps, p_cb->peer_auth_req);
@@ -806,13 +809,13 @@
}
}
- SMP_TRACE_DEBUG1("Association Model = %d", model);
+ SMP_TRACE_DEBUG("Association Model = %d", model);
if (model == SMP_MODEL_OOB)
{
- SMP_TRACE_ERROR0("Association Model = SMP_MODEL_OOB");
+ SMP_TRACE_ERROR("Association Model = SMP_MODEL_OOB");
p_cb->sec_level = SMP_SEC_AUTHENTICATED;
- SMP_TRACE_EVENT1 ("p_cb->sec_level =%d (SMP_SEC_AUTHENTICATED) ", p_cb->sec_level );
+ SMP_TRACE_EVENT ("p_cb->sec_level =%d (SMP_SEC_AUTHENTICATED) ", p_cb->sec_level );
p_cb->cb_evt = SMP_OOB_REQ_EVT;
int_evt = SMP_TK_REQ_EVT;
@@ -820,7 +823,7 @@
else if (model == SMP_MODEL_PASSKEY)
{
p_cb->sec_level = SMP_SEC_AUTHENTICATED;
- SMP_TRACE_EVENT1 ("p_cb->sec_level =%d (SMP_SEC_AUTHENTICATED) ", p_cb->sec_level );
+ SMP_TRACE_EVENT ("p_cb->sec_level =%d (SMP_SEC_AUTHENTICATED) ", p_cb->sec_level );
p_cb->cb_evt = SMP_PASSKEY_REQ_EVT;
int_evt = SMP_TK_REQ_EVT;
@@ -829,7 +832,7 @@
{
p_cb->sec_level = SMP_SEC_AUTHENTICATED;
- SMP_TRACE_DEBUG0("Need to generate Passkey");
+ SMP_TRACE_DEBUG("Need to generate Passkey");
/* generate passkey and notify application */
smp_generate_passkey(p_cb, NULL);
}
@@ -839,7 +842,7 @@
((p_cb->peer_auth_req & SMP_AUTH_YN_BIT) != 0) &&
((p_cb->loc_auth_req & SMP_AUTH_YN_BIT) == 0))
{
- SMP_TRACE_ERROR0("IO capability does not meet authentication requirement");
+ SMP_TRACE_ERROR("IO capability does not meet authentication requirement");
failure = SMP_PAIR_AUTH_FAIL;
p = (tSMP_INT_DATA *)&failure;
int_evt = SMP_AUTH_CMPL_EVT;
@@ -847,7 +850,7 @@
else
{
p_cb->sec_level = SMP_SEC_UNAUTHENTICATE;
- SMP_TRACE_EVENT1 ("p_cb->sec_level =%d (SMP_SEC_UNAUTHENTICATE) ", p_cb->sec_level );
+ SMP_TRACE_EVENT ("p_cb->sec_level =%d (SMP_SEC_UNAUTHENTICATE) ", p_cb->sec_level );
key.key_type = SMP_KEY_TYPE_TK;
key.p_data = p_cb->tk;
@@ -860,12 +863,12 @@
}
else if (model == SMP_MODEL_MAX)
{
- SMP_TRACE_ERROR0("Association Model = SMP_MODEL_MAX (failed)");
+ SMP_TRACE_ERROR("Association Model = SMP_MODEL_MAX (failed)");
p = (tSMP_INT_DATA *)&failure;
int_evt = SMP_AUTH_CMPL_EVT;
}
- SMP_TRACE_EVENT1 ("sec_level=%d ", p_cb->sec_level );
+ SMP_TRACE_EVENT ("sec_level=%d ", p_cb->sec_level );
if (int_evt)
smp_sm_event(p_cb, int_evt, p);
}
@@ -878,7 +881,7 @@
{
UNUSED(p_data);
- SMP_TRACE_DEBUG0 ("smp_proc_io_rsp ");
+ SMP_TRACE_DEBUG ("smp_proc_io_rsp ");
if (p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD)
{
smp_set_state(SMP_ST_SEC_REQ_PENDING);
@@ -897,7 +900,7 @@
void smp_pairing_cmpl(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
{
- SMP_TRACE_DEBUG0 ("smp_pairing_cmpl ");
+ SMP_TRACE_DEBUG ("smp_pairing_cmpl ");
if ((p_cb->status == SMP_SUCCESS) ||
(p_cb->status <= SMP_REPEATED_ATTEMPTS && p_cb->status != SMP_SUCCESS))
@@ -920,7 +923,7 @@
{
UNUSED(p_data);
- SMP_TRACE_DEBUG0 ("smp_pair_terminate ");
+ SMP_TRACE_DEBUG ("smp_pair_terminate ");
p_cb->status = SMP_CONN_TOUT;
@@ -934,7 +937,7 @@
*******************************************************************************/
void smp_delay_terminate(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
{
- SMP_TRACE_DEBUG0 ("smp_delay_terminate ");
+ SMP_TRACE_DEBUG ("smp_delay_terminate ");
btu_stop_timer (&p_cb->rsp_timer_ent);
@@ -955,11 +958,23 @@
UNUSED(p_data);
if (p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD)
{
- SMP_TRACE_DEBUG0("Pairing terminated at IDLE state.");
+ SMP_TRACE_DEBUG("Pairing terminated at IDLE state.");
p_cb->status = SMP_FAIL;
smp_proc_pairing_cmpl(p_cb);
}
}
+
+/*******************************************************************************
+** Function smp_fast_conn_param
+** Description apply default connection parameter for pairing process
+*******************************************************************************/
+void smp_fast_conn_param(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
+{
+ /* disable connection parameter update */
+ (void)L2CA_EnableUpdateBleConnParams(p_cb->pairing_bda, FALSE);
+}
+
+
/*******************************************************************************
**
** Function smp_link_encrypted
@@ -976,7 +991,7 @@
{
tSMP_CB *p_cb = &smp_cb;
- SMP_TRACE_DEBUG1 ("smp_link_encrypted encr_enable=%d",encr_enable);
+ SMP_TRACE_DEBUG ("smp_link_encrypted encr_enable=%d",encr_enable);
if (memcmp(&smp_cb.pairing_bda[0], bda, BD_ADDR_LEN) == 0)
{
@@ -1003,7 +1018,7 @@
*******************************************************************************/
BOOLEAN smp_proc_ltk_request(BD_ADDR bda)
{
- SMP_TRACE_DEBUG1 ("smp_proc_ltk_request state = %d", smp_cb.state);
+ SMP_TRACE_DEBUG ("smp_proc_ltk_request state = %d", smp_cb.state);
if ( smp_cb.state == SMP_ST_ENC_PENDING &&
!memcmp(bda, smp_cb.pairing_bda, BD_ADDR_LEN))
{
diff --git a/stack/smp/smp_api.c b/stack/smp/smp_api.c
index 64644da..85d1054 100644
--- a/stack/smp/smp_api.c
+++ b/stack/smp/smp_api.c
@@ -49,7 +49,7 @@
void SMP_Init(void)
{
- SMP_TRACE_EVENT0 ("SMP_Init");
+ SMP_TRACE_EVENT ("SMP_Init");
memset(&smp_cb, 0, sizeof(tSMP_CB));
#if defined(SMP_INITIAL_TRACE_LEVEL)
@@ -102,11 +102,11 @@
*******************************************************************************/
BOOLEAN SMP_Register (tSMP_CALLBACK *p_cback)
{
- SMP_TRACE_EVENT1 ("SMP_Register state=%d", smp_cb.state);
+ SMP_TRACE_EVENT ("SMP_Register state=%d", smp_cb.state);
if (smp_cb.p_callback != NULL)
{
- SMP_TRACE_ERROR0 ("SMP_Register: duplicate registration, overwrite it");
+ SMP_TRACE_ERROR ("SMP_Register: duplicate registration, overwrite it");
}
smp_cb.p_callback = p_cback;
@@ -131,7 +131,7 @@
tSMP_CB *p_cb = &smp_cb;
UINT8 status = SMP_PAIR_INTERNAL_ERR;
- BTM_TRACE_EVENT2 ("SMP_Pair state=%d flag=0x%x ", p_cb->state, p_cb->flags);
+ BTM_TRACE_EVENT ("SMP_Pair state=%d flag=0x%x ", p_cb->state, p_cb->flags);
if (p_cb->state != SMP_ST_IDLE || p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD)
{
/* pending security on going, reject this one */
@@ -145,7 +145,7 @@
if (!L2CA_ConnectFixedChnl (L2CAP_SMP_CID, bd_addr))
{
- SMP_TRACE_ERROR0("SMP_Pair: L2C connect fixed channel failed.");
+ SMP_TRACE_ERROR("SMP_Pair: L2C connect fixed channel failed.");
smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status);
return status;
}
@@ -172,12 +172,12 @@
UINT8 err_code = SMP_PAIR_FAIL_UNKNOWN;
BOOLEAN status = FALSE;
- BTM_TRACE_EVENT2 ("SMP_CancelPair state=%d flag=0x%x ", p_cb->state, p_cb->flags);
+ BTM_TRACE_EVENT ("SMP_CancelPair state=%d flag=0x%x ", p_cb->state, p_cb->flags);
if ( (p_cb->state != SMP_ST_IDLE) &&
(!memcmp (p_cb->pairing_bda, bd_addr, BD_ADDR_LEN)) )
{
p_cb->is_pair_cancel = TRUE;
- SMP_TRACE_DEBUG0("Cancel Pairing: set fail reason Unknown");
+ SMP_TRACE_DEBUG("Cancel Pairing: set fail reason Unknown");
smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &err_code);
status = TRUE;
}
@@ -199,7 +199,7 @@
*******************************************************************************/
void SMP_SecurityGrant(BD_ADDR bd_addr, UINT8 res)
{
- SMP_TRACE_EVENT0 ("SMP_SecurityGrant ");
+ SMP_TRACE_EVENT ("SMP_SecurityGrant ");
if (smp_cb.state != SMP_ST_WAIT_APP_RSP ||
smp_cb.cb_evt != SMP_SEC_REQUEST_EVT ||
memcmp (smp_cb.pairing_bda, bd_addr, BD_ADDR_LEN))
@@ -230,32 +230,32 @@
UINT8 failure = SMP_PASSKEY_ENTRY_FAIL;
tBTM_SEC_DEV_REC *p_dev_rec;
- SMP_TRACE_EVENT2 ("SMP_PasskeyReply: Key: %d Result:%d",
+ SMP_TRACE_EVENT ("SMP_PasskeyReply: Key: %d Result:%d",
passkey, res);
/* If timeout already expired or has been canceled, ignore the reply */
if (p_cb->cb_evt != SMP_PASSKEY_REQ_EVT)
{
- SMP_TRACE_WARNING1 ("SMP_PasskeyReply() - Wrong State: %d", p_cb->state);
+ SMP_TRACE_WARNING ("SMP_PasskeyReply() - Wrong State: %d", p_cb->state);
return;
}
if (memcmp (bd_addr, p_cb->pairing_bda, BD_ADDR_LEN) != 0)
{
- SMP_TRACE_ERROR0 ("SMP_PasskeyReply() - Wrong BD Addr");
+ SMP_TRACE_ERROR ("SMP_PasskeyReply() - Wrong BD Addr");
return;
}
if ((p_dev_rec = btm_find_dev (bd_addr)) == NULL)
{
- SMP_TRACE_ERROR0 ("SMP_PasskeyReply() - no dev CB");
+ SMP_TRACE_ERROR ("SMP_PasskeyReply() - no dev CB");
return;
}
if (passkey > BTM_MAX_PASSKEY_VAL || res != SMP_SUCCESS)
{
- SMP_TRACE_WARNING1 ("SMP_PasskeyReply() - Wrong key len: %d or passkey entry fail", passkey);
+ SMP_TRACE_WARNING ("SMP_PasskeyReply() - Wrong key len: %d or passkey entry fail", passkey);
/* send pairing failure */
smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &failure);
@@ -287,7 +287,7 @@
tSMP_KEY key;
UNUSED(bd_addr);
- SMP_TRACE_EVENT2 ("SMP_OobDataReply State: %d res:%d",
+ SMP_TRACE_EVENT ("SMP_OobDataReply State: %d res:%d",
smp_cb.state, res);
/* If timeout already expired or has been canceled, ignore the reply */
diff --git a/stack/smp/smp_cmac.c b/stack/smp/smp_cmac.c
index 44e776e..138c6f1 100644
--- a/stack/smp/smp_cmac.c
+++ b/stack/smp/smp_cmac.c
@@ -53,11 +53,11 @@
UINT8 *p = (UINT8 *)x;
UINT8 i;
- SMP_TRACE_WARNING1("%s(MSB ~ LSB) = ", key_name);
+ SMP_TRACE_WARNING("%s(MSB ~ LSB) = ", key_name);
for (i = 0; i < 4; i ++)
{
- SMP_TRACE_WARNING4("%02x %02x %02x %02x",
+ SMP_TRACE_WARNING("%02x %02x %02x %02x",
p[BT_OCTET16_LEN - i*4 -1], p[BT_OCTET16_LEN - i*4 -2],
p[BT_OCTET16_LEN - i*4 -3], p[BT_OCTET16_LEN - i*4 -4]);
}
@@ -95,7 +95,7 @@
static void leftshift_onebit(UINT8 *input, UINT8 *output)
{
UINT8 i, overflow = 0 , next_overflow = 0;
- SMP_TRACE_EVENT0 ("leftshift_onebit ");
+ SMP_TRACE_EVENT ("leftshift_onebit ");
/* input[0] is LSB */
for ( i = 0; i < BT_OCTET16_LEN ; i ++ )
{
@@ -139,7 +139,7 @@
UINT8 x[16] = {0};
UINT8 *p_mac;
- SMP_TRACE_EVENT0 ("cmac_aes_k_calculate ");
+ SMP_TRACE_EVENT ("cmac_aes_k_calculate ");
while (i <= cmac_cb.round)
{
@@ -160,10 +160,10 @@
p_mac = output.param_buf + (BT_OCTET16_LEN - tlen);
memcpy(p_signature, p_mac, tlen);
- SMP_TRACE_DEBUG2("tlen = %d p_mac = %d", tlen, p_mac);
- SMP_TRACE_DEBUG4("p_mac[0] = 0x%02x p_mac[1] = 0x%02x p_mac[2] = 0x%02x p_mac[3] = 0x%02x",
+ SMP_TRACE_DEBUG("tlen = %d p_mac = %d", tlen, p_mac);
+ SMP_TRACE_DEBUG("p_mac[0] = 0x%02x p_mac[1] = 0x%02x p_mac[2] = 0x%02x p_mac[3] = 0x%02x",
*p_mac, *(p_mac + 1), *(p_mac + 2), *(p_mac + 3));
- SMP_TRACE_DEBUG4("p_mac[4] = 0x%02x p_mac[5] = 0x%02x p_mac[6] = 0x%02x p_mac[7] = 0x%02x",
+ SMP_TRACE_DEBUG("p_mac[4] = 0x%02x p_mac[5] = 0x%02x p_mac[6] = 0x%02x p_mac[7] = 0x%02x",
*(p_mac + 4), *(p_mac + 5), *(p_mac + 6), *(p_mac + 7));
return TRUE;
@@ -187,11 +187,11 @@
// UINT8 x[16] = {0};
BOOLEAN flag;
- SMP_TRACE_EVENT0 ("cmac_prepare_last_block ");
+ SMP_TRACE_EVENT ("cmac_prepare_last_block ");
/* last block is a complete block set flag to 1 */
flag = ((cmac_cb.len % BT_OCTET16_LEN) == 0 && cmac_cb.len != 0) ? TRUE : FALSE;
- SMP_TRACE_WARNING2("flag = %d round = %d", flag, cmac_cb.round);
+ SMP_TRACE_WARNING("flag = %d round = %d", flag, cmac_cb.round);
if ( flag )
{ /* last block is complete block */
@@ -217,7 +217,7 @@
{
UINT8 k1[BT_OCTET16_LEN], k2[BT_OCTET16_LEN];
UINT8 *pp = p->param_buf;
- SMP_TRACE_EVENT0 ("cmac_subkey_cont ");
+ SMP_TRACE_EVENT ("cmac_subkey_cont ");
print128(pp, (const UINT8 *)"K1 before shift");
/* If MSB(L) = 0, then K1 = L << 1 */
@@ -265,7 +265,7 @@
BT_OCTET16 z = {0};
BOOLEAN ret = TRUE;
tSMP_ENC output;
- SMP_TRACE_EVENT0 (" cmac_generate_subkey");
+ SMP_TRACE_EVENT (" cmac_generate_subkey");
if (SMP_Encrypt(key, BT_OCTET16_LEN, z, BT_OCTET16_LEN, &output))
{
@@ -298,12 +298,12 @@
UINT16 n = (length + BT_OCTET16_LEN - 1) / BT_OCTET16_LEN; /* n is number of rounds */
BOOLEAN ret = FALSE;
- SMP_TRACE_EVENT0 ("AES_CMAC ");
+ SMP_TRACE_EVENT ("AES_CMAC ");
if (n == 0) n = 1;
len = n * BT_OCTET16_LEN;
- SMP_TRACE_WARNING1("AES128_CMAC started, allocate buffer size = %d", len);
+ SMP_TRACE_WARNING("AES128_CMAC started, allocate buffer size = %d", len);
/* allocate a memory space of multiple of 16 bytes to hold text */
if ((cmac_cb.text = (UINT8 *)GKI_getbuf(len)) != NULL)
{
@@ -332,7 +332,7 @@
else
{
ret = FALSE;
- SMP_TRACE_ERROR0("No resources");
+ SMP_TRACE_ERROR("No resources");
}
return ret;
@@ -341,13 +341,13 @@
#if 0 /* testing code, sample data from spec */
void test_cmac_cback(UINT8 *p_mac, UINT16 tlen)
{
- SMP_TRACE_EVENT0 ("test_cmac_cback ");
- SMP_TRACE_ERROR0("test_cmac_cback");
+ SMP_TRACE_EVENT ("test_cmac_cback ");
+ SMP_TRACE_ERROR("test_cmac_cback");
}
void test_cmac(void)
{
- SMP_TRACE_EVENT0 ("test_cmac ");
+ SMP_TRACE_EVENT ("test_cmac ");
UINT8 M[64] = {
0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a,
@@ -378,7 +378,7 @@
memset(&cmac_cb, 0, sizeof(tCMAC_CB));
- SMP_TRACE_WARNING1("\n Example 1: len = %d\n", len);
+ SMP_TRACE_WARNING("\n Example 1: len = %d\n", len);
AES_CMAC(key, M, len, 128, test_cmac_cback, 0);
diff --git a/stack/smp/smp_int.h b/stack/smp/smp_int.h
index 51cdbb3..70c09a5 100644
--- a/stack/smp/smp_int.h
+++ b/stack/smp/smp_int.h
@@ -202,6 +202,8 @@
BD_ADDR local_bda;
BOOLEAN is_pair_cancel;
BOOLEAN discard_sec_req;
+ UINT8 rcvd_cmd_code;
+ UINT8 rcvd_cmd_len;
#if SMP_CONFORMANCE_TESTING == TRUE
BOOLEAN enable_test_confirm_val;
BT_OCTET16 test_confirm;
@@ -288,6 +290,8 @@
extern void smp_proc_srk_info(tSMP_CB *p_cb, tSMP_INT_DATA *p_data);
extern void smp_generate_csrk(tSMP_CB *p_cb, tSMP_INT_DATA *p_data);
extern void smp_delay_terminate(tSMP_CB *p_cb, tSMP_INT_DATA *p_data);
+extern void smp_fast_conn_param(tSMP_CB *p_cb, tSMP_INT_DATA *p_data);
+
/* smp_l2c */
extern void smp_l2cap_if_init (void);
@@ -314,6 +318,7 @@
/* smp main util */
extern void smp_set_state(tSMP_STATE state);
extern tSMP_STATE smp_get_state(void);
+extern void smp_reject_unexp_pair_req(BD_ADDR bd_addr);
#endif /* SMP_INT_H */
diff --git a/stack/smp/smp_keys.c b/stack/smp/smp_keys.c
index 49612a5..891d7f8 100644
--- a/stack/smp/smp_keys.c
+++ b/stack/smp/smp_keys.c
@@ -81,7 +81,7 @@
{
x += sprintf ((char *)&p_buf[x], "%02x ", p[i]);
}
- SMP_TRACE_WARNING2("%s(LSB ~ MSB) = %s", key_name, p_buf);
+ SMP_TRACE_WARNING("%s(LSB ~ MSB) = %s", key_name, p_buf);
}
#else
#define smp_debug_print_nbyte_little_endian(p, key_name, len)
@@ -107,16 +107,16 @@
UINT8 *p_rev_key = NULL; /* input key in big endilan format */
UINT8 *p_rev_output = NULL; /* encrypted output in big endilan format */
- SMP_TRACE_DEBUG0 ("smp_encrypt_data");
+ SMP_TRACE_DEBUG ("smp_encrypt_data");
if ( (p_out == NULL ) || (key_len != SMP_ENCRYT_KEY_SIZE) )
{
- BTM_TRACE_ERROR0 ("smp_encrypt_data Failed");
+ BTM_TRACE_ERROR ("smp_encrypt_data Failed");
return(FALSE);
}
if ((p_start = (UINT8 *)GKI_getbuf((SMP_ENCRYT_DATA_SIZE*4))) == NULL)
{
- BTM_TRACE_ERROR0 ("smp_encrypt_data Failed unable to allocate buffer");
+ BTM_TRACE_ERROR ("smp_encrypt_data Failed unable to allocate buffer");
return(FALSE);
}
@@ -164,7 +164,7 @@
{
UNUSED(p_data);
- SMP_TRACE_DEBUG0 ("smp_generate_passkey");
+ SMP_TRACE_DEBUG ("smp_generate_passkey");
p_cb->rand_enc_proc = SMP_GEN_TK;
/* generate MRand or SRand */
@@ -187,14 +187,14 @@
UINT32 passkey; /* 19655 test number; */
UINT8 *pp = p->param_buf;
- SMP_TRACE_DEBUG0 ("smp_proc_passkey ");
+ SMP_TRACE_DEBUG ("smp_proc_passkey ");
STREAM_TO_UINT32(passkey, pp);
passkey &= ~SMP_PASSKEY_MASK;
/* truncate by maximum value */
while (passkey > BTM_MAX_PASSKEY_VAL)
passkey >>= 1;
- SMP_TRACE_ERROR1("Passkey generated = %d", passkey);
+ SMP_TRACE_ERROR("Passkey generated = %d", passkey);
/* save the TK */
memset(p_cb->tk, 0, BT_OCTET16_LEN);
@@ -231,7 +231,7 @@
tSMP_STATUS status = SMP_PAIR_FAIL_UNKNOWN;
UNUSED(p_data);
- SMP_TRACE_DEBUG0 ("smp_generate_stk ");
+ SMP_TRACE_DEBUG ("smp_generate_stk ");
memset(p, 0, BT_OCTET16_LEN);
if (p_cb->role == HCI_ROLE_MASTER)
@@ -248,7 +248,7 @@
/* generate STK = Etk(rand|rrand)*/
if (!SMP_Encrypt( p_cb->tk, BT_OCTET16_LEN, ptext, BT_OCTET16_LEN, &output))
{
- SMP_TRACE_ERROR0("smp_generate_stk failed");
+ SMP_TRACE_ERROR("smp_generate_stk failed");
smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status);
}
else
@@ -272,7 +272,7 @@
{
UNUSED(p_data);
- SMP_TRACE_DEBUG0 ("smp_generate_confirm");
+ SMP_TRACE_DEBUG ("smp_generate_confirm");
p_cb->rand_enc_proc = SMP_GEN_SRAND_MRAND;
/* generate MRand or SRand */
if (!btsnd_hcic_ble_rand((void *)smp_rand_back))
@@ -292,7 +292,7 @@
{
UNUSED(p_data);
- SMP_TRACE_DEBUG0 ("smp_genenrate_rand_cont ");
+ SMP_TRACE_DEBUG ("smp_genenrate_rand_cont ");
p_cb->rand_enc_proc = SMP_GEN_SRAND_MRAND_CONT;
/* generate 64 MSB of MRand or SRand */
@@ -315,7 +315,7 @@
BOOLEAN div_status;
UNUSED(p_data);
- SMP_TRACE_DEBUG0 ("smp_generate_ltk ");
+ SMP_TRACE_DEBUG ("smp_generate_ltk ");
div_status = btm_get_local_div(p_cb->pairing_bda, &p_cb->div);
@@ -325,7 +325,7 @@
}
else
{
- SMP_TRACE_DEBUG0 ("Generate DIV for LTK");
+ SMP_TRACE_DEBUG ("Generate DIV for LTK");
p_cb->rand_enc_proc = SMP_GEN_DIV_LTK;
/* generate MRand or SRand */
if (!btsnd_hcic_ble_rand((void *)smp_rand_back))
@@ -354,7 +354,7 @@
tSMP_STATUS status = SMP_PAIR_FAIL_UNKNOWN;
UNUSED(p_data);
- SMP_TRACE_DEBUG1 ("smp_compute_csrk div=%x", p_cb->div);
+ SMP_TRACE_DEBUG ("smp_compute_csrk div=%x", p_cb->div);
BTM_GetDeviceEncRoot(er);
/* CSRK = d1(ER, DIV, 1) */
UINT16_TO_STREAM(p, p_cb->div);
@@ -362,7 +362,7 @@
if (!SMP_Encrypt(er, BT_OCTET16_LEN, buffer, 4, &output))
{
- SMP_TRACE_ERROR0("smp_generate_csrk failed");
+ SMP_TRACE_ERROR("smp_generate_csrk failed");
smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status);
}
else
@@ -388,7 +388,7 @@
BOOLEAN div_status;
UNUSED(p_data);
- SMP_TRACE_DEBUG0 ("smp_generate_csrk");
+ SMP_TRACE_DEBUG ("smp_generate_csrk");
div_status = btm_get_local_div(p_cb->pairing_bda, &p_cb->div);
if (div_status)
@@ -397,7 +397,7 @@
}
else
{
- SMP_TRACE_DEBUG0 ("Generate DIV for CSRK");
+ SMP_TRACE_DEBUG ("Generate DIV for CSRK");
p_cb->rand_enc_proc = SMP_GEN_DIV_CSRK;
if (!btsnd_hcic_ble_rand((void *)smp_rand_back))
smp_rand_back(NULL);
@@ -413,7 +413,7 @@
{
UINT8 *p = *p_data;
- SMP_TRACE_DEBUG0 ("smp_concatenate_local ");
+ SMP_TRACE_DEBUG ("smp_concatenate_local ");
UINT8_TO_STREAM(p, op_code);
UINT8_TO_STREAM(p, p_cb->loc_io_caps);
UINT8_TO_STREAM(p, p_cb->loc_oob_flag);
@@ -432,7 +432,7 @@
{
UINT8 *p = *p_data;
- SMP_TRACE_DEBUG0 ("smp_concatenate_peer ");
+ SMP_TRACE_DEBUG ("smp_concatenate_peer ");
UINT8_TO_STREAM(p, op_code);
UINT8_TO_STREAM(p, p_cb->peer_io_caps);
UINT8_TO_STREAM(p, p_cb->peer_oob_flag);
@@ -459,11 +459,11 @@
tBLE_ADDR_TYPE addr_type = 0;
BD_ADDR remote_bda;
- SMP_TRACE_DEBUG0 ("smp_gen_p1_4_confirm");
+ SMP_TRACE_DEBUG ("smp_gen_p1_4_confirm");
if (!BTM_ReadRemoteConnectionAddr(p_cb->pairing_bda, remote_bda, &addr_type))
{
- SMP_TRACE_ERROR0("can not generate confirm for unknown device");
+ SMP_TRACE_ERROR("can not generate confirm for unknown device");
return;
}
@@ -492,7 +492,7 @@
smp_concatenate_local(p_cb, &p, SMP_OPCODE_PAIRING_RSP);
}
#if SMP_DEBUG == TRUE
- SMP_TRACE_DEBUG0("p1 = pres || preq || rat' || iat'");
+ SMP_TRACE_DEBUG("p1 = pres || preq || rat' || iat'");
smp_debug_print_nbyte_little_endian ((UINT8 *)p1, (const UINT8 *)"P1", 16);
#endif
}
@@ -514,11 +514,11 @@
if (!BTM_ReadRemoteConnectionAddr(p_cb->pairing_bda, remote_bda, &addr_type))
{
- SMP_TRACE_ERROR0("can not generate confirm p2 for unknown device");
+ SMP_TRACE_ERROR("can not generate confirm p2 for unknown device");
return;
}
- SMP_TRACE_DEBUG0 ("smp_gen_p2_4_confirm");
+ SMP_TRACE_DEBUG ("smp_gen_p2_4_confirm");
memset(p, 0, sizeof(BT_OCTET16));
@@ -537,7 +537,7 @@
BDADDR_TO_STREAM(p, remote_bda);
}
#if SMP_DEBUG == TRUE
- SMP_TRACE_DEBUG0("p2 = padding || ia || ra");
+ SMP_TRACE_DEBUG("p2 = padding || ia || ra");
smp_debug_print_nbyte_little_endian(p2, (const UINT8 *)"p2", 16);
#endif
}
@@ -557,7 +557,7 @@
tSMP_STATUS status = SMP_PAIR_FAIL_UNKNOWN;
UNUSED(bda);
- SMP_TRACE_DEBUG0 ("smp_calculate_comfirm ");
+ SMP_TRACE_DEBUG ("smp_calculate_comfirm ");
/* generate p1 = pres || preq || rat' || iat' */
smp_gen_p1_4_confirm(p_cb, p1);
@@ -569,7 +569,7 @@
/* calculate e(k, r XOR p1), where k = TK */
if (!SMP_Encrypt(p_cb->tk, BT_OCTET16_LEN, p1, BT_OCTET16_LEN, &output))
{
- SMP_TRACE_ERROR0("smp_generate_csrk failed");
+ SMP_TRACE_ERROR("smp_generate_csrk failed");
smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status);
}
else
@@ -593,9 +593,9 @@
tSMP_ENC output;
tSMP_STATUS status = SMP_PAIR_FAIL_UNKNOWN;
- SMP_TRACE_DEBUG0 ("smp_calculate_comfirm_cont ");
+ SMP_TRACE_DEBUG ("smp_calculate_comfirm_cont ");
#if SMP_DEBUG == TRUE
- SMP_TRACE_DEBUG0("Confirm step 1 p1' = e(k, r XOR p1) Generated");
+ SMP_TRACE_DEBUG("Confirm step 1 p1' = e(k, r XOR p1) Generated");
smp_debug_print_nbyte_little_endian (p->param_buf, (const UINT8 *)"C1", 16);
#endif
@@ -608,7 +608,7 @@
/* calculate: Confirm = E(k, p1' XOR p2) */
if (!SMP_Encrypt(p_cb->tk, BT_OCTET16_LEN, p2, BT_OCTET16_LEN, &output))
{
- SMP_TRACE_ERROR0("smp_calculate_comfirm_cont failed");
+ SMP_TRACE_ERROR("smp_calculate_comfirm_cont failed");
smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status);
}
else
@@ -639,7 +639,7 @@
{
UNUSED(p_data);
- SMP_TRACE_DEBUG0 ("smp_genenrate_confirm ");
+ SMP_TRACE_DEBUG ("smp_genenrate_confirm ");
p_cb->rand_enc_proc = SMP_GEN_CONFIRM;
smp_debug_print_nbyte_little_endian ((UINT8 *)p_cb->rand, (const UINT8 *)"local rand", 16);
@@ -661,7 +661,7 @@
{
UNUSED(p_data);
- SMP_TRACE_DEBUG0 ("smp_generate_compare ");
+ SMP_TRACE_DEBUG ("smp_generate_compare ");
p_cb->rand_enc_proc = SMP_GEN_COMPARE;
smp_debug_print_nbyte_little_endian ((UINT8 *)p_cb->rrand, (const UINT8 *)"peer rand", 16);
@@ -682,11 +682,11 @@
{
tSMP_KEY key;
- SMP_TRACE_DEBUG0 ("smp_process_confirm ");
+ SMP_TRACE_DEBUG ("smp_process_confirm ");
#if SMP_CONFORMANCE_TESTING == TRUE
if (p_cb->enable_test_confirm_val)
{
- BTM_TRACE_DEBUG0 ("Use confirm value from script");
+ BTM_TRACE_DEBUG ("Use confirm value from script");
memcpy(p_cb->confirm, p_cb->test_confirm, BT_OCTET16_LEN);
}
else
@@ -697,7 +697,7 @@
#if (SMP_DEBUG == TRUE)
- SMP_TRACE_DEBUG0("Confirm Generated");
+ SMP_TRACE_DEBUG("Confirm Generated");
smp_debug_print_nbyte_little_endian ((UINT8 *)p_cb->confirm, (const UINT8 *)"Confirm", 16);
#endif
@@ -720,9 +720,9 @@
{
tSMP_KEY key;
- SMP_TRACE_DEBUG0 ("smp_process_compare ");
+ SMP_TRACE_DEBUG ("smp_process_compare ");
#if (SMP_DEBUG == TRUE)
- SMP_TRACE_DEBUG0("Compare Generated");
+ SMP_TRACE_DEBUG("Compare Generated");
smp_debug_print_nbyte_little_endian (p->param_buf, (const UINT8 *)"Compare", 16);
#endif
key.key_type = SMP_KEY_TYPE_CMP;
@@ -745,9 +745,9 @@
{
tSMP_KEY key;
- SMP_TRACE_DEBUG0 ("smp_process_stk ");
+ SMP_TRACE_DEBUG ("smp_process_stk ");
#if (SMP_DEBUG == TRUE)
- SMP_TRACE_ERROR0("STK Generated");
+ SMP_TRACE_ERROR("STK Generated");
#endif
smp_mask_enc_key(p_cb->loc_enc_size, p->param_buf);
@@ -773,14 +773,14 @@
tSMP_STATUS status = SMP_PAIR_FAIL_UNKNOWN;
UNUSED(p_data);
- SMP_TRACE_DEBUG0 ("smp_genenrate_ltk_cont ");
+ SMP_TRACE_DEBUG ("smp_genenrate_ltk_cont ");
BTM_GetDeviceEncRoot(er);
/* LTK = d1(ER, DIV, 0)= e(ER, DIV)*/
if (!SMP_Encrypt(er, BT_OCTET16_LEN, (UINT8 *)&p_cb->div,
sizeof(UINT16), &output))
{
- SMP_TRACE_ERROR0("smp_genenrate_ltk_cont failed");
+ SMP_TRACE_ERROR("smp_genenrate_ltk_cont failed");
smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status);
}
else
@@ -809,13 +809,13 @@
tSMP_STATUS status = SMP_PAIR_FAIL_UNKNOWN;
UNUSED(p);
- SMP_TRACE_DEBUG0 ("smp_generate_y ");
+ SMP_TRACE_DEBUG ("smp_generate_y ");
BTM_GetDeviceDHK(dhk);
if (!SMP_Encrypt(dhk, BT_OCTET16_LEN, p_cb->enc_rand,
BT_OCTET8_LEN, &output))
{
- SMP_TRACE_ERROR0("smp_generate_y failed");
+ SMP_TRACE_ERROR("smp_generate_y failed");
smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status);
}
else
@@ -839,7 +839,7 @@
/* generate EDIV and rand now */
/* generate random vector */
- SMP_TRACE_DEBUG0 ("smp_generate_rand_vector ");
+ SMP_TRACE_DEBUG ("smp_generate_rand_vector ");
p_cb->rand_enc_proc = SMP_GEN_RAND_V;
if (!btsnd_hcic_ble_rand((void *)smp_rand_back))
smp_rand_back(NULL);
@@ -860,13 +860,13 @@
UINT8 *pp= p->param_buf;
UINT16 y;
- SMP_TRACE_DEBUG0 ("smp_process_ediv ");
+ SMP_TRACE_DEBUG ("smp_process_ediv ");
STREAM_TO_UINT16(y, pp);
/* EDIV = Y xor DIV */
p_cb->ediv = p_cb->div ^ y;
/* send LTK ready */
- SMP_TRACE_ERROR0("LTK ready");
+ SMP_TRACE_ERROR("LTK ready");
key.key_type = SMP_KEY_TYPE_LTK;
key.p_data = p->param_buf;
@@ -890,7 +890,7 @@
UINT8 failure = SMP_PAIR_FAIL_UNKNOWN;
UINT8 state = p_cb->rand_enc_proc & ~0x80;
- SMP_TRACE_DEBUG1 ("smp_rand_back state=0x%x", state);
+ SMP_TRACE_DEBUG ("smp_rand_back state=0x%x", state);
if (p && p->status == HCI_SUCCESS)
{
switch (state)
@@ -930,7 +930,7 @@
return;
}
- SMP_TRACE_ERROR1("smp_rand_back Key generation failed: (%d)", p_cb->rand_enc_proc);
+ SMP_TRACE_ERROR("smp_rand_back Key generation failed: (%d)", p_cb->rand_enc_proc);
smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &failure);
diff --git a/stack/smp/smp_l2c.c b/stack/smp/smp_l2c.c
index 54b78b4..63c851c 100644
--- a/stack/smp/smp_l2c.c
+++ b/stack/smp/smp_l2c.c
@@ -34,7 +34,7 @@
-static void smp_connect_cback (BD_ADDR bd_addr, BOOLEAN connected, UINT16 reason);
+static void smp_connect_cback (BD_ADDR bd_addr, BOOLEAN connected, UINT16 reason, tBT_TRANSPORT transport);
static void smp_data_ind (BD_ADDR bd_addr, BT_HDR *p_buf);
/*******************************************************************************
@@ -48,7 +48,7 @@
void smp_l2cap_if_init (void)
{
tL2CAP_FIXED_CHNL_REG fixed_reg;
- SMP_TRACE_EVENT0 ("SMDBG l2c smp_l2cap_if_init");
+ SMP_TRACE_EVENT ("SMDBG l2c smp_l2cap_if_init");
fixed_reg.fixed_chnl_opts.mode = L2CAP_FCR_BASIC_MODE;
fixed_reg.fixed_chnl_opts.max_transmit = 0;
fixed_reg.fixed_chnl_opts.rtrans_tout = 0;
@@ -58,6 +58,7 @@
fixed_reg.pL2CA_FixedConn_Cb = smp_connect_cback;
fixed_reg.pL2CA_FixedData_Cb = smp_data_ind;
+ fixed_reg.pL2CA_FixedCong_Cb = NULL; /* do not handle congestion on this channel */
fixed_reg.default_idle_tout = 60; /* set 60 seconds timeout, 0xffff default idle timeout */
/* Now, register with L2CAP */
@@ -73,16 +74,23 @@
** connected (conn = TRUE)/disconnected (conn = FALSE).
**
*******************************************************************************/
-static void smp_connect_cback (BD_ADDR bd_addr, BOOLEAN connected, UINT16 reason)
+static void smp_connect_cback (BD_ADDR bd_addr, BOOLEAN connected, UINT16 reason,
+ tBT_TRANSPORT transport)
{
tSMP_CB *p_cb = &smp_cb;
tSMP_INT_DATA int_data;
- SMP_TRACE_EVENT0 ("SMDBG l2c smp_connect_cback ");
+ SMP_TRACE_EVENT ("SMDBG l2c smp_connect_cback ");
+
+ if (transport == BT_TRANSPORT_BR_EDR)
+ {
+ SMP_TRACE_ERROR ("smp_connect_cback : Wrong transport");
+ return;
+ }
if (memcmp(bd_addr, p_cb->pairing_bda, BD_ADDR_LEN) == 0)
{
- SMP_TRACE_EVENT3 ("smp_connect_cback() for pairing BDA: %08x%04x Event: %s",
+ SMP_TRACE_EVENT ("smp_connect_cback() for pairing BDA: %08x%04x Event: %s",
(bd_addr[0]<<24)+(bd_addr[1]<<16)+(bd_addr[2]<<8) + bd_addr[3],
(bd_addr[4]<<8)+bd_addr[5], (connected) ? "connected" : "disconnected");
@@ -126,12 +134,19 @@
tSMP_CB *p_cb = &smp_cb;
UINT8 *p = (UINT8 *)(p_buf + 1) + p_buf->offset;
UINT8 cmd ;
- SMP_TRACE_EVENT0 ("SMDBG l2c smp_data_ind");
+ SMP_TRACE_EVENT ("SMDBG l2c smp_data_ind");
- SMP_TRACE_EVENT0 ("Got smp_data_ind");
+ SMP_TRACE_EVENT ("Got smp_data_ind");
STREAM_TO_UINT8(cmd, p);
+ /* sanity check */
+ if ((SMP_OPCODE_MAX <= cmd) || (cmd == 0))
+ {
+ SMP_TRACE_WARNING( "Ignore received command with RESERVED code 0x%02x", cmd);
+ GKI_freebuf (p_buf);
+ return;
+ }
/* reject the pairing request if there is an on-going SMP pairing */
if (SMP_OPCODE_PAIRING_REQ == cmd || SMP_OPCODE_SEC_REQ == cmd)
@@ -143,14 +158,23 @@
}
else if (memcmp(&bd_addr[0], p_cb->pairing_bda, BD_ADDR_LEN))
{
- p_cb->failure = SMP_PAIR_NOT_SUPPORT;
- smp_send_cmd(SMP_OPCODE_PAIRING_FAILED, p_cb);
+ GKI_freebuf (p_buf);
+ smp_reject_unexp_pair_req(bd_addr);
+ return;
}
+ /* else, out of state pairing request/security request received, passed into SM */
}
if (memcmp(&bd_addr[0], p_cb->pairing_bda, BD_ADDR_LEN) == 0)
{
- btu_stop_timer (&p_cb->rsp_timer_ent);
+ if (p_cb->state != SMP_ST_RELEASE_DELAY)
+ {
+ btu_stop_timer (&p_cb->rsp_timer_ent);
+ btu_start_timer (&p_cb->rsp_timer_ent, BTU_TTYPE_SMP_PAIRING_CMD,
+ SMP_WAIT_FOR_RSP_TOUT);
+ }
+ p_cb->rcvd_cmd_code = cmd;
+ p_cb->rcvd_cmd_len = (UINT8) p_buf->len;
smp_sm_event(p_cb, cmd, p);
}
diff --git a/stack/smp/smp_main.c b/stack/smp/smp_main.c
index f8e450c..aee15da 100644
--- a/stack/smp/smp_main.c
+++ b/stack/smp/smp_main.c
@@ -114,6 +114,8 @@
SMP_PROC_REL_DELAY,
SMP_PROC_REL_DELAY_TOUT,
SMP_DELAY_TERMINATE,
+ SMP_IDLE_TERMINATE,
+ SMP_FAST_CONN_PARAM,
SMP_SM_NO_ACTION
};
@@ -156,6 +158,8 @@
smp_proc_release_delay,
smp_proc_release_delay_tout,
smp_delay_terminate,
+ smp_idle_terminate,
+ smp_fast_conn_param
};
/************ SMP Master FSM State/Event Indirection Table **************/
static const UINT8 smp_ma_entry_map[][SMP_ST_MAX] =
@@ -176,7 +180,7 @@
/* KEY_READY */{ 0, 3, 0, 3, 1, 0, 2, 1, 6, 0 },
/* ENC_CMPL */{ 0, 0, 0, 0, 0, 0, 0, 2, 0, 0 },
/* L2C_CONN */{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
-/* L2C_DISC */{ 0x83, 0x83, 0, 0x83, 0x83,0x83, 0x83,0x83, 0x83, 3 },
+/* L2C_DISC */{ 3, 0x83, 0, 0x83, 0x83,0x83, 0x83,0x83, 0x83, 3 },
/* IO_RSP */{ 0, 2, 0, 0, 0, 0, 0, 0, 0, 0 },
/* SEC_GRANT */{ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
/* TK_REQ */{ 0, 0, 0, 2, 0, 0, 0, 0, 0, 0 },
@@ -198,15 +202,16 @@
static const UINT8 smp_ma_idle_table[][SMP_SM_NUM_COLS] = {
/* Event Action Next State */
/* L2C_CONN */ {SMP_SEND_APP_CBACK, SMP_SM_NO_ACTION, SMP_ST_WAIT_APP_RSP},
-/* SEC_REQ */ {SMP_PROC_SEC_REQ, SMP_SEND_APP_CBACK, SMP_ST_WAIT_APP_RSP}
+/* SEC_REQ */ {SMP_PROC_SEC_REQ, SMP_SEND_APP_CBACK, SMP_ST_WAIT_APP_RSP},
+/* L2C_DISC */ {SMP_IDLE_TERMINATE, SMP_SM_NO_ACTION, SMP_ST_IDLE}
};
static const UINT8 smp_ma_wait_app_rsp_table[][SMP_SM_NUM_COLS] = {
/* Event Action Next State */
/* SEC_GRANT */ { SMP_PROC_SEC_GRANT, SMP_SEND_APP_CBACK, SMP_ST_WAIT_APP_RSP},
-/* IO_RSP */ { SMP_SEND_PAIR_REQ, SMP_SM_NO_ACTION, SMP_ST_PAIR_REQ_RSP},
+/* IO_RSP */ { SMP_SEND_PAIR_REQ, SMP_FAST_CONN_PARAM, SMP_ST_PAIR_REQ_RSP},
/* KEY_READY */ { SMP_GENERATE_CONFIRM, SMP_SM_NO_ACTION, SMP_ST_WAIT_CONFIRM},/* TK ready */
-/* ENC_REQ */ { SMP_START_ENC, SMP_SM_NO_ACTION, SMP_ST_ENC_PENDING},/* start enc mode setup */
+/* ENC_REQ */ { SMP_START_ENC, SMP_FAST_CONN_PARAM, SMP_ST_ENC_PENDING},/* start enc mode setup */
/* DISCARD_SEC_REQ */ { SMP_PROC_DISCARD, SMP_SM_NO_ACTION, SMP_ST_IDLE}
};
@@ -390,14 +395,14 @@
{
if (state < SMP_ST_MAX)
{
- SMP_TRACE_DEBUG4( "State change: %s(%d) ==> %s(%d)",
+ SMP_TRACE_DEBUG( "State change: %s(%d) ==> %s(%d)",
smp_get_state_name(smp_cb.state), smp_cb.state,
smp_get_state_name(state), state );
smp_cb.state = state;
}
else
{
- SMP_TRACE_DEBUG1("smp_set_state invalid state =%d", state );
+ SMP_TRACE_DEBUG("smp_set_state invalid state =%d", state );
}
}
@@ -433,14 +438,14 @@
UINT8 action, entry, i;
tSMP_ENTRY_TBL entry_table = smp_entry_table[p_cb->role];
- SMP_TRACE_EVENT0("main smp_sm_event");
+ SMP_TRACE_EVENT("main smp_sm_event");
if (curr_state >= SMP_ST_MAX)
{
- SMP_TRACE_DEBUG1( "Invalid state: %d", curr_state) ;
+ SMP_TRACE_DEBUG( "Invalid state: %d", curr_state) ;
return;
}
- SMP_TRACE_DEBUG5( "SMP Role: %s State: [%s (%d)], Event: [%s (%d)]",\
+ SMP_TRACE_DEBUG( "SMP Role: %s State: [%s (%d)], Event: [%s (%d)]",\
(p_cb->role == 0x01) ?"Slave" : "Master", smp_get_state_name( p_cb->state),
p_cb->state, smp_get_event_name(event), event) ;
@@ -460,7 +465,7 @@
}
else
{
- SMP_TRACE_DEBUG4( "Ignore event [%s (%d)] in state [%s (%d)]",
+ SMP_TRACE_DEBUG( "Ignore event [%s (%d)] in state [%s (%d)]",
smp_get_event_name(event), event, smp_get_state_name(curr_state), curr_state);
return;
}
@@ -485,7 +490,7 @@
break;
}
}
- SMP_TRACE_DEBUG1( "result state = %s", smp_get_state_name( p_cb->state ) ) ;
+ SMP_TRACE_DEBUG( "result state = %s", smp_get_state_name( p_cb->state ) ) ;
}
diff --git a/stack/smp/smp_utils.c b/stack/smp/smp_utils.c
index dac0cc0..21d93f8 100644
--- a/stack/smp/smp_utils.c
+++ b/stack/smp/smp_utils.c
@@ -87,11 +87,11 @@
{
UINT16 l2cap_ret;
- SMP_TRACE_EVENT0("smp_send_msg_to_L2CAP");
+ SMP_TRACE_EVENT("smp_send_msg_to_L2CAP");
if ((l2cap_ret = L2CA_SendFixedChnlData (L2CAP_SMP_CID, rem_bda, p_toL2CAP)) == L2CAP_DW_FAILED)
{
- SMP_TRACE_ERROR1("SMP failed to pass msg:0x%0x to L2CAP",
+ SMP_TRACE_ERROR("SMP failed to pass msg:0x%0x to L2CAP",
*((UINT8 *)(p_toL2CAP + 1) + p_toL2CAP->offset));
GKI_freebuf(p_toL2CAP);
return FALSE;
@@ -113,7 +113,7 @@
BT_HDR *p_buf;
BOOLEAN sent = FALSE;
UINT8 failure = SMP_PAIR_INTERNAL_ERR;
- SMP_TRACE_EVENT1("smp_send_cmd on l2cap cmd_code=0x%x", cmd_code);
+ SMP_TRACE_EVENT("smp_send_cmd on l2cap cmd_code=0x%x", cmd_code);
if ( cmd_code < SMP_OPCODE_MAX &&
smp_cmd_build_act[cmd_code] != NULL)
{
@@ -154,7 +154,7 @@
UINT8 failure = SMP_RSP_TIMEOUT;
UNUSED(p_tle);
- SMP_TRACE_EVENT1("smp_rsp_timeout state:%d", p_cb->state);
+ SMP_TRACE_EVENT("smp_rsp_timeout state:%d", p_cb->state);
if (smp_get_state() == SMP_ST_RELEASE_DELAY)
{
@@ -177,7 +177,7 @@
{
BT_HDR *p_buf = NULL ;
UINT8 *p;
- SMP_TRACE_EVENT0("smp_build_pairing_cmd");
+ SMP_TRACE_EVENT("smp_build_pairing_cmd");
if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_PAIRING_REQ_SIZE + L2CAP_MIN_OFFSET)) != NULL)
{
p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
@@ -211,7 +211,7 @@
UINT8 *p;
UNUSED(cmd_code);
- SMP_TRACE_EVENT0("smp_build_confirm_cmd");
+ SMP_TRACE_EVENT("smp_build_confirm_cmd");
if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_CONFIRM_CMD_SIZE + L2CAP_MIN_OFFSET)) != NULL)
{
p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
@@ -238,7 +238,7 @@
UINT8 *p;
UNUSED(cmd_code);
- SMP_TRACE_EVENT0("smp_build_rand_cmd");
+ SMP_TRACE_EVENT("smp_build_rand_cmd");
if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_INIT_CMD_SIZE + L2CAP_MIN_OFFSET)) != NULL)
{
p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
@@ -265,7 +265,7 @@
UINT8 *p;
UNUSED(cmd_code);
- SMP_TRACE_EVENT0("smp_build_encrypt_info_cmd");
+ SMP_TRACE_EVENT("smp_build_encrypt_info_cmd");
if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_ENC_INFO_SIZE + L2CAP_MIN_OFFSET)) != NULL)
{
p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
@@ -292,7 +292,7 @@
UINT8 *p;
UNUSED(cmd_code);
- SMP_TRACE_EVENT0("smp_build_master_id_cmd ");
+ SMP_TRACE_EVENT("smp_build_master_id_cmd ");
if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_MASTER_ID_SIZE + L2CAP_MIN_OFFSET)) != NULL)
{
p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
@@ -322,7 +322,7 @@
UNUSED(cmd_code);
UNUSED(p_cb);
- SMP_TRACE_EVENT0("smp_build_identity_info_cmd");
+ SMP_TRACE_EVENT("smp_build_identity_info_cmd");
if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_ID_INFO_SIZE + L2CAP_MIN_OFFSET)) != NULL)
{
p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
@@ -353,7 +353,7 @@
UNUSED(cmd_code);
UNUSED(p_cb);
- SMP_TRACE_EVENT0("smp_build_id_addr_cmd");
+ SMP_TRACE_EVENT("smp_build_id_addr_cmd");
if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_ID_ADDR_SIZE + L2CAP_MIN_OFFSET)) != NULL)
{
p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
@@ -383,7 +383,7 @@
UINT8 *p;
UNUSED(cmd_code);
- SMP_TRACE_EVENT0("smp_build_signing_info_cmd");
+ SMP_TRACE_EVENT("smp_build_signing_info_cmd");
if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_SIGN_INFO_SIZE + L2CAP_MIN_OFFSET)) != NULL)
{
p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
@@ -410,7 +410,7 @@
UINT8 *p;
UNUSED(cmd_code);
- SMP_TRACE_EVENT0("smp_build_pairing_fail");
+ SMP_TRACE_EVENT("smp_build_pairing_fail");
if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_PAIR_FAIL_SIZE + L2CAP_MIN_OFFSET)) != NULL)
{
p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
@@ -437,7 +437,7 @@
UINT8 *p;
UNUSED(cmd_code);
- SMP_TRACE_EVENT0("smp_build_security_request");
+ SMP_TRACE_EVENT("smp_build_security_request");
if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + 2 + L2CAP_MIN_OFFSET)) != NULL)
{
@@ -449,7 +449,7 @@
p_buf->offset = L2CAP_MIN_OFFSET;
p_buf->len = 2;
- SMP_TRACE_EVENT2("opcode=%d auth_req=0x%x",SMP_OPCODE_SEC_REQ, p_cb->loc_auth_req );
+ SMP_TRACE_EVENT("opcode=%d auth_req=0x%x",SMP_OPCODE_SEC_REQ, p_cb->loc_auth_req );
}
return p_buf;
@@ -471,7 +471,7 @@
{
UINT8 *p = tk;
tSMP_KEY key;
- SMP_TRACE_EVENT0("smp_convert_string_to_tk");
+ SMP_TRACE_EVENT("smp_convert_string_to_tk");
UINT32_TO_STREAM(p, passkey);
key.key_type = SMP_KEY_TYPE_TK;
@@ -493,7 +493,7 @@
*******************************************************************************/
void smp_mask_enc_key(UINT8 loc_enc_size, UINT8 * p_data)
{
- SMP_TRACE_EVENT0("smp_mask_enc_key");
+ SMP_TRACE_EVENT("smp_mask_enc_key");
if (loc_enc_size < BT_OCTET16_LEN)
{
for (; loc_enc_size < BT_OCTET16_LEN; loc_enc_size ++)
@@ -515,7 +515,7 @@
{
UINT8 i, *aa = a, *bb = b;
- SMP_TRACE_EVENT0("smp_xor_128");
+ SMP_TRACE_EVENT("smp_xor_128");
for (i = 0; i < BT_OCTET16_LEN; i++)
{
aa[i] = aa[i] ^ bb[i];
@@ -537,7 +537,7 @@
tSMP_CALLBACK *p_callback = p_cb->p_callback;
UINT8 trace_level = p_cb->trace_level;
- SMP_TRACE_EVENT0("smp_cb_cleanup");
+ SMP_TRACE_EVENT("smp_cb_cleanup");
memset(p_cb, 0, sizeof(tSMP_CB));
p_cb->p_callback = p_callback;
p_cb->trace_level = trace_level;
@@ -555,18 +555,18 @@
*******************************************************************************/
void smp_reset_control_value(tSMP_CB *p_cb)
{
- SMP_TRACE_EVENT0("smp_reset_control_value");
+ SMP_TRACE_EVENT("smp_reset_control_value");
btu_stop_timer (&p_cb->rsp_timer_ent);
#if SMP_CONFORMANCE_TESTING == TRUE
- SMP_TRACE_EVENT1("smp_cb.remove_fixed_channel_disable=%d", smp_cb.remove_fixed_channel_disable);
+ SMP_TRACE_EVENT("smp_cb.remove_fixed_channel_disable=%d", smp_cb.remove_fixed_channel_disable);
if (!smp_cb.remove_fixed_channel_disable)
{
L2CA_RemoveFixedChnl (L2CAP_SMP_CID, p_cb->pairing_bda);
}
else
{
- SMP_TRACE_EVENT0("disable the removal of the fixed channel");
+ SMP_TRACE_EVENT("disable the removal of the fixed channel");
}
@@ -592,7 +592,7 @@
{
tSMP_EVT_DATA evt_data = {0};
- SMP_TRACE_DEBUG0 ("smp_proc_pairing_cmpl ");
+ SMP_TRACE_DEBUG ("smp_proc_pairing_cmpl ");
evt_data.cmplt.reason = p_cb->status;
@@ -605,7 +605,7 @@
evt_data.cmplt.is_pair_cancel = TRUE;
- SMP_TRACE_DEBUG2 ("send SMP_COMPLT_EVT reason=0x%0x sec_level=0x%0x",
+ SMP_TRACE_DEBUG ("send SMP_COMPLT_EVT reason=0x%0x sec_level=0x%0x",
evt_data.cmplt.reason,
evt_data.cmplt.sec_level );
if (p_cb->p_callback)
@@ -621,6 +621,35 @@
smp_reset_control_value(p_cb);
}
+/*******************************************************************************
+**
+** Function smp_reject_unexp_pair_req
+**
+** Description send pairing failure to an unexpected pairing request during
+** an active pairing process.
+**
+** Returns void
+**
+*******************************************************************************/
+void smp_reject_unexp_pair_req(BD_ADDR bd_addr)
+{
+ BT_HDR *p_buf;
+ UINT8 *p;
+
+ if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_PAIR_FAIL_SIZE + L2CAP_MIN_OFFSET)) != NULL)
+ {
+ p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
+
+ UINT8_TO_STREAM (p, SMP_OPCODE_PAIRING_FAILED);
+ UINT8_TO_STREAM (p, SMP_PAIR_NOT_SUPPORT);
+
+ p_buf->offset = L2CAP_MIN_OFFSET;
+ p_buf->len = SMP_PAIR_FAIL_SIZE;
+
+ smp_send_msg_to_L2CAP(bd_addr, p_buf);
+ }
+}
+
#if SMP_CONFORMANCE_TESTING == TRUE
/*******************************************************************************
**
@@ -633,7 +662,7 @@
*******************************************************************************/
void smp_set_test_confirm_value(BOOLEAN enable, UINT8 *p_c_val)
{
- SMP_TRACE_DEBUG1("smp_set_test_confirm_value enable=%d", enable);
+ SMP_TRACE_DEBUG("smp_set_test_confirm_value enable=%d", enable);
smp_cb.enable_test_confirm_val = enable;
memcpy(smp_cb.test_confirm, p_c_val, BT_OCTET16_LEN);
}
@@ -650,7 +679,7 @@
*******************************************************************************/
void smp_set_test_rand_value(BOOLEAN enable, UINT8 *p_c_val)
{
- SMP_TRACE_DEBUG1("smp_set_test_rand_value enable=%d", enable);
+ SMP_TRACE_DEBUG("smp_set_test_rand_value enable=%d", enable);
smp_cb.enable_test_rand_val = enable;
memcpy(smp_cb.test_rand, p_c_val, BT_OCTET16_LEN);
}
@@ -667,7 +696,7 @@
*******************************************************************************/
void smp_set_test_pair_fail_status (BOOLEAN enable, UINT8 status)
{
- SMP_TRACE_DEBUG1("smp_set_test_confirm_value enable=%d", enable);
+ SMP_TRACE_DEBUG("smp_set_test_confirm_value enable=%d", enable);
smp_cb.enable_test_pair_fail = enable;
smp_cb.pair_fail_status = status;
}
@@ -683,7 +712,7 @@
*******************************************************************************/
void smp_remove_fixed_channel_disable (BOOLEAN disable)
{
- SMP_TRACE_DEBUG1("smp_remove_fixed_channel_disable disable =%d", disable);
+ SMP_TRACE_DEBUG("smp_remove_fixed_channel_disable disable =%d", disable);
smp_cb.remove_fixed_channel_disable = disable;
}
/*******************************************************************************
@@ -697,7 +726,7 @@
*******************************************************************************/
void smp_skip_compare_check(BOOLEAN enable)
{
- SMP_TRACE_DEBUG1("smp_skip_compare_check enable=%d", enable);
+ SMP_TRACE_DEBUG("smp_skip_compare_check enable=%d", enable);
smp_cb.skip_test_compare_check = enable;
}
diff --git a/stack/srvc/srvc_battery.c b/stack/srvc/srvc_battery.c
index 0606fd2..90632df 100644
--- a/stack/srvc/srvc_battery.c
+++ b/stack/srvc/srvc_battery.c
@@ -205,7 +205,7 @@
if (battery_cb.inst_id == BA_MAX_INT_NUM)
{
- GATT_TRACE_ERROR0("MAX battery service has been reached");
+ GATT_TRACE_ERROR("MAX battery service has been reached");
return 0;
}
@@ -219,7 +219,7 @@
if (srvc_hdl == 0)
{
- GATT_TRACE_ERROR0("Can not create service, Battery_Instantiate() failed!");
+ GATT_TRACE_ERROR("Can not create service, Battery_Instantiate() failed!");
return 0;
}
@@ -240,7 +240,7 @@
BATTER_LEVEL_PERM,
prop)) == 0)
{
- GATT_TRACE_ERROR0("Can not add Battery Level, Battery_Instantiate() failed!");
+ GATT_TRACE_ERROR("Can not add Battery Level, Battery_Instantiate() failed!");
status = GATT_ERROR;
}
else
@@ -253,7 +253,7 @@
&uuid);
if (p_inst->clt_cfg_hdl == 0)
{
- GATT_TRACE_ERROR0("Add battery level client notification FAILED!");
+ GATT_TRACE_ERROR("Add battery level client notification FAILED!");
}
}
/* need presentation format descriptor? */
@@ -265,7 +265,7 @@
&uuid))
== 0)
{
- GATT_TRACE_ERROR0("Add battery level presentation format descriptor FAILED!");
+ GATT_TRACE_ERROR("Add battery level presentation format descriptor FAILED!");
}
}
@@ -278,7 +278,7 @@
&uuid))
== 0)
{
- GATT_TRACE_ERROR0("Add battery level report reference descriptor FAILED!");
+ GATT_TRACE_ERROR("Add battery level report reference descriptor FAILED!");
}
}
diff --git a/stack/srvc/srvc_dis.c b/stack/srvc/srvc_dis.c
index 90b4acd..e292212 100644
--- a/stack/srvc/srvc_dis.c
+++ b/stack/srvc/srvc_dis.c
@@ -25,8 +25,6 @@
#if BLE_INCLUDED == TRUE
-#define DIS_UUID_TO_ATTR_MASK(x) (UINT16)(1 << ((x) - GATT_UUID_SYSTEM_ID))
-
#define DIS_MAX_NUM_INC_SVR 0
#define DIS_MAX_CHAR_NUM 9
#define DIS_MAX_ATTR_NUM (DIS_MAX_CHAR_NUM * 2 + DIS_MAX_NUM_INC_SVR + 1)
@@ -57,6 +55,34 @@
};
tDIS_CB dis_cb;
+
+static tDIS_ATTR_MASK dis_uuid_to_attr(UINT16 uuid)
+{
+ switch (uuid)
+ {
+ case GATT_UUID_SYSTEM_ID:
+ return DIS_ATTR_SYS_ID_BIT;
+ case GATT_UUID_MODEL_NUMBER_STR:
+ return DIS_ATTR_MODEL_NUM_BIT;
+ case GATT_UUID_SERIAL_NUMBER_STR:
+ return DIS_ATTR_SERIAL_NUM_BIT;
+ case GATT_UUID_FW_VERSION_STR:
+ return DIS_ATTR_FW_NUM_BIT;
+ case GATT_UUID_HW_VERSION_STR:
+ return DIS_ATTR_HW_NUM_BIT;
+ case GATT_UUID_SW_VERSION_STR:
+ return DIS_ATTR_SW_NUM_BIT;
+ case GATT_UUID_MANU_NAME:
+ return DIS_ATTR_MANU_NAME_BIT;
+ case GATT_UUID_IEEE_DATA:
+ return DIS_ATTR_IEEE_DATA_BIT;
+ case GATT_UUID_PNP_ID:
+ return DIS_ATTR_PNP_ID_BIT;
+ default:
+ return 0;
+ };
+}
+
/*******************************************************************************
** dis_valid_handle_range
**
@@ -136,7 +162,7 @@
p_value->len -= offset;
pp += offset;
ARRAY_TO_STREAM(p, pp, p_value->len);
- GATT_TRACE_EVENT1("GATT_UUID_MANU_NAME len=0x%04x", p_value->len);
+ GATT_TRACE_EVENT("GATT_UUID_MANU_NAME len=0x%04x", p_value->len);
}
break;
@@ -181,8 +207,8 @@
if (dis_cb.p_read_dis_cback && p_clcb)
{
- GATT_TRACE_ERROR1("dis_gatt_c_read_dis_value_cmpl: attr_mask = 0x%04x", p_clcb->dis_value.attr_mask);
- GATT_TRACE_EVENT0("calling p_read_dis_cbackd");
+ GATT_TRACE_ERROR("dis_gatt_c_read_dis_value_cmpl: attr_mask = 0x%04x", p_clcb->dis_value.attr_mask);
+ GATT_TRACE_EVENT("calling p_read_dis_cbackd");
(*dis_cb.p_read_dis_cback)(p_clcb->bda, &p_clcb->dis_value);
dis_cb.p_read_dis_cback=NULL;
@@ -212,17 +238,18 @@
while (dis_cb.dis_read_uuid_idx < DIS_MAX_CHAR_NUM)
{
- param.service.uuid.uu.uuid16 = dis_attr_uuid[dis_cb.dis_read_uuid_idx];
+ if (dis_uuid_to_attr(dis_attr_uuid[dis_cb.dis_read_uuid_idx]) &
+ dis_cb.request_mask)
+ {
+ param.service.uuid.uu.uuid16 = dis_attr_uuid[dis_cb.dis_read_uuid_idx];
- if (GATTC_Read(conn_id, GATT_READ_BY_TYPE, ¶m) == GATT_SUCCESS)
- {
- return(TRUE);
+ if (GATTC_Read(conn_id, GATT_READ_BY_TYPE, ¶m) == GATT_SUCCESS)
+ return TRUE;
+
+ GATT_TRACE_ERROR ("Read DISInfo: 0x%04x GATT_Read Failed", param.service.uuid.uu.uuid16);
}
- else
- {
- GATT_TRACE_ERROR1 ("Read DISInfo: 0x%04x GATT_Read Failed", param.service.uuid.uu.uuid16);
- dis_cb.dis_read_uuid_idx ++;
- }
+
+ dis_cb.dis_read_uuid_idx++;
}
dis_gatt_c_read_dis_value_cmpl(conn_id);
@@ -246,7 +273,7 @@
UINT8 *pp = NULL, *p_str;
UINT16 conn_id = p_clcb->conn_id;
- GATT_TRACE_EVENT3 ("dis_c_cmpl_cback() - op_code: 0x%02x status: 0x%02x \
+ GATT_TRACE_EVENT ("dis_c_cmpl_cback() - op_code: 0x%02x status: 0x%02x \
read_type: 0x%04x", op, status, read_type);
if (op != GATTC_OPTYPE_READ)
@@ -259,7 +286,7 @@
switch (read_type)
{
case GATT_UUID_SYSTEM_ID:
- GATT_TRACE_EVENT0 ("DIS_ATTR_SYS_ID_BIT");
+ GATT_TRACE_EVENT ("DIS_ATTR_SYS_ID_BIT");
if (p_data->att_value.len == DIS_SYSTEM_ID_SIZE)
{
p_clcb->dis_value.attr_mask |= DIS_ATTR_SYS_ID_BIT;
@@ -291,9 +318,10 @@
GKI_freebuf(p_str);
if ((p_str = (UINT8 *)GKI_getbuf((UINT16)(p_data->att_value.len + 1))) != NULL)
{
- memset(p_str, 0, p_data->att_value.len + 1);
- p_clcb->dis_value.attr_mask |= DIS_UUID_TO_ATTR_MASK (read_type);
+ p_clcb->dis_value.attr_mask |= dis_uuid_to_attr(read_type);
memcpy(p_str, p_data->att_value.value, p_data->att_value.len);
+ p_str[p_data->att_value.len] = 0;
+ p_clcb->dis_value.data_string[read_type - GATT_UUID_MODEL_NUMBER_STR] = p_str;
}
break;
@@ -314,7 +342,7 @@
**
** Function DIS_SrInit
**
-** Description Initializa the Device Information Service Server.
+** Description Initialize the Device Information Service Server.
**
*******************************************************************************/
tDIS_STATUS DIS_SrInit (tDIS_ATTR_MASK dis_attr_mask)
@@ -326,7 +354,7 @@
if (dis_cb.enabled)
{
- GATT_TRACE_ERROR0("DIS already initalized");
+ GATT_TRACE_ERROR("DIS already initalized");
return DIS_SUCCESS;
}
@@ -336,7 +364,7 @@
if (dis_cb.service_handle == 0)
{
- GATT_TRACE_ERROR0("Can not create service, DIS_Init failed!");
+ GATT_TRACE_ERROR("Can not create service, DIS_Init failed!");
return GATT_ERROR;
}
dis_cb.max_handle = dis_cb.service_handle + DIS_MAX_ATTR_NUM;
@@ -347,7 +375,7 @@
*/
uuid.uu.uuid16 = p_db_attr->uuid = dis_attr_uuid[i];
p_db_attr->handle = GATTS_AddCharacteristic(dis_cb.service_handle, &uuid, GATT_PERM_READ, GATT_CHAR_PROP_BIT_READ);
- GATT_TRACE_DEBUG2 ("DIS_SrInit: handle of new attribute 0x%04 = x%d", uuid.uu.uuid16, p_db_attr->handle );
+ GATT_TRACE_DEBUG ("DIS_SrInit: handle of new attribute 0x%04 = x%d", uuid.uu.uuid16, p_db_attr->handle );
p_db_attr ++;
i ++;
dis_attr_mask >>= 1;
@@ -393,15 +421,16 @@
if (dis_attr_bit & (UINT16)(1 << i))
{
if (dis_cb.dis_value.data_string[i - 1] != NULL)
- GKI_freebuf(dis_cb.dis_value.data_string[i]);
+ GKI_freebuf(dis_cb.dis_value.data_string[i - 1]);
/* coverity[OVERRUN-STATIC] False-positive : when i = 8, (1 << i) == DIS_ATTR_PNP_ID_BIT, and it will never come down here
CID 49902: Out-of-bounds read (OVERRUN_STATIC)
Overrunning static array "dis_cb.dis_value.data_string", with 7 elements, at position 7 with index variable "i".
*/
if ((dis_cb.dis_value.data_string[i - 1] = (UINT8 *)GKI_getbuf((UINT16)(p_info->data_str.len + 1))) != NULL)
{
- memset(dis_cb.dis_value.data_string[i - 1], 0, p_info->data_str.len + 1); /* make sure null terminate */
+
memcpy(dis_cb.dis_value.data_string[i - 1], p_info->data_str.p_data, p_info->data_str.len);
+ dis_cb.dis_value.data_string[i - 1][p_info->data_str.len] = 0; /* make sure null terminate */
st = DIS_SUCCESS;
}
else
@@ -423,10 +452,13 @@
** Returns void
**
*******************************************************************************/
-BOOLEAN DIS_ReadDISInfo(BD_ADDR peer_bda, tDIS_READ_CBACK *p_cback)
+BOOLEAN DIS_ReadDISInfo(BD_ADDR peer_bda, tDIS_READ_CBACK *p_cback, tDIS_ATTR_MASK mask)
{
UINT16 conn_id;
+ /* Initialize the DIS client if it hasn't been initialized already. */
+ srvc_eng_init();
+
/* For now we only handle one at a time */
if (dis_cb.dis_read_uuid_idx != 0xff)
return(FALSE);
@@ -438,19 +470,21 @@
/* Mark currently active operation */
dis_cb.dis_read_uuid_idx = 0;
- GATT_TRACE_EVENT3 ("DIS_ReadDISInfo() - BDA: %08x%04x cl_read_uuid: 0x%04x",
+ dis_cb.request_mask = mask;
+
+ GATT_TRACE_EVENT ("DIS_ReadDISInfo() - BDA: %08x%04x cl_read_uuid: 0x%04x",
(peer_bda[0]<<24)+(peer_bda[1]<<16)+(peer_bda[2]<<8)+peer_bda[3],
(peer_bda[4]<<8)+peer_bda[5], dis_attr_uuid[dis_cb.dis_read_uuid_idx]);
- GATT_GetConnIdIfConnected(srvc_eng_cb.gatt_if, peer_bda, &conn_id);
+ GATT_GetConnIdIfConnected(srvc_eng_cb.gatt_if, peer_bda, &conn_id, BT_TRANSPORT_LE);
/* need to enhance it as multiple service is needed */
srvc_eng_request_channel(peer_bda, SRVC_ID_DIS);
if (conn_id == GATT_INVALID_CONN_ID)
{
- return GATT_Connect(srvc_eng_cb.gatt_if, peer_bda, TRUE);
+ return GATT_Connect(srvc_eng_cb.gatt_if, peer_bda, TRUE, BT_TRANSPORT_LE);
}
return dis_gatt_c_read_dis_req(conn_id);
diff --git a/stack/srvc/srvc_dis_int.h b/stack/srvc/srvc_dis_int.h
index f818063..f9f4dcd 100644
--- a/stack/srvc/srvc_dis_int.h
+++ b/stack/srvc/srvc_dis_int.h
@@ -50,6 +50,8 @@
BOOLEAN enabled;
UINT8 dis_read_uuid_idx;
+
+ tDIS_ATTR_MASK request_mask;
}tDIS_CB;
diff --git a/stack/srvc/srvc_eng.c b/stack/srvc/srvc_eng.c
index 4598738..39299c5 100644
--- a/stack/srvc/srvc_eng.c
+++ b/stack/srvc/srvc_eng.c
@@ -29,8 +29,11 @@
//#endif
#include "srvc_battery_int.h"
+#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
+
static void srvc_eng_s_request_cback (UINT16 conn_id, UINT32 trans_id, UINT8 op_code, tGATTS_DATA *p_data);
-static void srvc_eng_connect_cback (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id, BOOLEAN connected, tGATT_DISCONN_REASON reason);
+static void srvc_eng_connect_cback (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id, BOOLEAN connected,
+ tGATT_DISCONN_REASON reason, tBT_TRANSPORT transport);
static void srvc_eng_c_cmpl_cback (UINT16 conn_id, tGATTC_OPTYPE op, tGATT_STATUS status, tGATT_CL_COMPLETE *p_data);
static tGATT_CBACK srvc_gatt_cback =
@@ -40,6 +43,7 @@
NULL,
NULL,
srvc_eng_s_request_cback,
+ NULL,
NULL
} ;
/* type for action functions */
@@ -183,7 +187,7 @@
**
** Description The function deallocates a GATT profile connection link control block
**
-** Returns NTrue the deallocation is successful
+** Returns True the deallocation is successful
**
*******************************************************************************/
BOOLEAN srvc_eng_clcb_dealloc (UINT16 conn_id)
@@ -195,6 +199,12 @@
{
if (p_clcb->in_use && p_clcb->connected && (p_clcb->conn_id == conn_id))
{
+ unsigned j;
+ for (j = 0; j < ARRAY_SIZE(p_clcb->dis_value.data_string); j++) {
+ if (p_clcb->dis_value.data_string[j]) {
+ GKI_freebuf(p_clcb->dis_value.data_string[j]);
+ }
+ }
memset(p_clcb, 0, sizeof(tSRVC_CLCB));
return TRUE;
}
@@ -263,7 +273,7 @@
UINT8 act = SRVC_ACT_IGNORE;
UINT8 clcb_idx = srvc_eng_find_clcb_idx_by_conn_id(conn_id);
- GATT_TRACE_EVENT1("srvc_eng_s_request_cback : recv type (0x%02x)", type);
+ GATT_TRACE_EVENT("srvc_eng_s_request_cback : recv type (0x%02x)", type);
memset(&rsp_msg, 0, sizeof(tGATTS_RSP));
@@ -282,15 +292,15 @@
break;
case GATTS_REQ_TYPE_WRITE_EXEC:
- GATT_TRACE_EVENT0("Ignore GATT_REQ_EXEC_WRITE/WRITE_CMD" );
+ GATT_TRACE_EVENT("Ignore GATT_REQ_EXEC_WRITE/WRITE_CMD" );
break;
case GATTS_REQ_TYPE_MTU:
- GATT_TRACE_EVENT1("Get MTU exchange new mtu size: %d", p_data->mtu);
+ GATT_TRACE_EVENT("Get MTU exchange new mtu size: %d", p_data->mtu);
break;
default:
- GATT_TRACE_EVENT1("Unknown/unexpected LE GAP ATT request: 0x%02x", type);
+ GATT_TRACE_EVENT("Unknown/unexpected LE GAP ATT request: 0x%02x", type);
break;
}
@@ -317,11 +327,11 @@
{
tSRVC_CLCB *p_clcb = srvc_eng_find_clcb_by_conn_id(conn_id);
- GATT_TRACE_EVENT2 ("srvc_eng_c_cmpl_cback() - op_code: 0x%02x status: 0x%02x ", op, status);
+ GATT_TRACE_EVENT ("srvc_eng_c_cmpl_cback() - op_code: 0x%02x status: 0x%02x ", op, status);
if (p_clcb == NULL)
{
- GATT_TRACE_ERROR0("srvc_eng_c_cmpl_cback received for unknown connection");
+ GATT_TRACE_ERROR("srvc_eng_c_cmpl_cback received for unknown connection");
return;
}
@@ -341,11 +351,12 @@
**
*******************************************************************************/
static void srvc_eng_connect_cback (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id,
- BOOLEAN connected, tGATT_DISCONN_REASON reason)
+ BOOLEAN connected, tGATT_DISCONN_REASON reason, tBT_TRANSPORT transport)
{
UNUSED(gatt_if);
+ UNUSED (transport);
- GATT_TRACE_EVENT5 ("srvc_eng_connect_cback: from %08x%04x connected:%d conn_id=%d reason = 0x%04x",
+ GATT_TRACE_EVENT ("srvc_eng_connect_cback: from %08x%04x connected:%d conn_id=%d reason = 0x%04x",
(bda[0]<<24)+(bda[1]<<16)+(bda[2]<<8)+bda[3],
(bda[4]<<8)+bda[5], connected, conn_id, reason);
@@ -353,7 +364,7 @@
{
if (srvc_eng_clcb_alloc(conn_id, bda) == NULL)
{
- GATT_TRACE_ERROR0 ("srvc_eng_connect_cback: no_resource");
+ GATT_TRACE_ERROR ("srvc_eng_connect_cback: no_resource");
return;
}
}
@@ -400,11 +411,16 @@
{
tSRVC_CLCB *p_clcb = srvc_eng_find_clcb_by_conn_id(conn_id);
+ if (p_clcb == NULL)
+ {
+ GATT_TRACE_ERROR("%s: invalid connection id %d", __FUNCTION__, conn_id);
+ return;
+ }
+
p_clcb->cur_srvc_id = SRVC_ID_NONE;
/* check pending request */
- //if (p_clcb->pend_req == NULL)
- GATT_Disconnect(p_clcb->conn_id);
+ GATT_Disconnect(p_clcb->conn_id);
}
/*******************************************************************************
**
@@ -419,7 +435,7 @@
if (srvc_eng_cb.enabled)
{
- GATT_TRACE_ERROR0("DIS already initalized");
+ GATT_TRACE_ERROR("DIS already initalized");
}
else
{
@@ -429,7 +445,7 @@
srvc_eng_cb.gatt_if = GATT_Register(&app_uuid, &srvc_gatt_cback);
GATT_StartIf(srvc_eng_cb.gatt_if);
- GATT_TRACE_DEBUG1 ("Srvc_Init: gatt_if=%d ", srvc_eng_cb.gatt_if);
+ GATT_TRACE_DEBUG ("Srvc_Init: gatt_if=%d ", srvc_eng_cb.gatt_if);
srvc_eng_cb.enabled = TRUE;
//#if DIS_INCLUDED == TRUE
diff --git a/test/Android.mk b/test/Android.mk
index 3c3cb61..5053e7d 100644
--- a/test/Android.mk
+++ b/test/Android.mk
@@ -1,3 +1 @@
-ifneq ($(TARGET_SIMULATOR),true)
- include $(call all-subdir-makefiles)
-endif
+include $(call all-subdir-makefiles)
diff --git a/test/bluedroidtest/Android.mk b/test/bluedroidtest/Android.mk
index 0c6693a..8196546 100644
--- a/test/bluedroidtest/Android.mk
+++ b/test/bluedroidtest/Android.mk
@@ -22,18 +22,21 @@
bluedroidtest.c
LOCAL_C_INCLUDES :=
+LOCAL_CFLAGS := -Wno-unused-parameter
+
+LOCAL_CFLAGS += -std=c99
+
+LOCAL_CFLAGS += -std=c99
LOCAL_MODULE_TAGS := eng
LOCAL_MODULE:= bdt
-LOCAL_LDLIBS += -lpthread -ldl -llog -lreadline
-LIBS_c += -lreadline
-
LOCAL_SHARED_LIBRARIES += libcutils \
libutils \
libhardware \
libhardware_legacy
-include $(BUILD_EXECUTABLE)
+LOCAL_MULTILIB := 32
+include $(BUILD_EXECUTABLE)
diff --git a/test/bluedroidtest/bluedroidtest.c b/test/bluedroidtest/bluedroidtest.c
index 2b517df..ac727d8 100644
--- a/test/bluedroidtest/bluedroidtest.c
+++ b/test/bluedroidtest/bluedroidtest.c
@@ -58,6 +58,8 @@
#define CASE_RETURN_STR(const) case const: return #const;
+#define UNUSED __attribute__((unused))
+
/************************************************************************************
** Local type definitions
************************************************************************************/
@@ -199,7 +201,7 @@
if (n%16 == 1) {
/* store address for this line */
snprintf(addrstr, sizeof(addrstr), "%.4x",
- ((unsigned int)p-(unsigned int)data) );
+ (unsigned int)((uintptr_t)p-(uintptr_t)data) );
}
c = *p;
@@ -469,7 +471,7 @@
}
}
-static void dut_mode_recv(uint16_t opcode, uint8_t *buf, uint8_t len)
+static void dut_mode_recv(uint16_t UNUSED opcode, uint8_t UNUSED *buf, uint8_t UNUSED len)
{
bdt_log("DUT MODE RECV : NOT IMPLEMENTED");
}
@@ -482,28 +484,72 @@
static bt_callbacks_t bt_callbacks = {
sizeof(bt_callbacks_t),
adapter_state_changed,
- NULL, /*adapter_properties_cb */
+ NULL, /* adapter_properties_cb */
NULL, /* remote_device_properties_cb */
NULL, /* device_found_cb */
NULL, /* discovery_state_changed_cb */
NULL, /* pin_request_cb */
NULL, /* ssp_request_cb */
- NULL, /*bond_state_changed_cb */
+ NULL, /* bond_state_changed_cb */
NULL, /* acl_state_changed_cb */
NULL, /* thread_evt_cb */
- dut_mode_recv, /*dut_mode_recv_cb */
-// NULL, /*authorize_request_cb */
+ dut_mode_recv, /* dut_mode_recv_cb */
#if BLE_INCLUDED == TRUE
- le_test_mode /* le_test_mode_cb */
+ le_test_mode, /* le_test_mode_cb */
#else
- NULL
+ NULL, /* le_test_mode_cb */
#endif
+ NULL /* energy_info_cb */
+};
+
+static bool set_wake_alarm(uint64_t delay_millis, bool should_wake, alarm_cb cb, void *data) {
+ static timer_t timer;
+ static bool timer_created;
+
+ if (!timer_created) {
+ struct sigevent sigevent;
+ memset(&sigevent, 0, sizeof(sigevent));
+ sigevent.sigev_notify = SIGEV_THREAD;
+ sigevent.sigev_notify_function = (void (*)(union sigval))cb;
+ sigevent.sigev_value.sival_ptr = data;
+ timer_create(CLOCK_MONOTONIC, &sigevent, &timer);
+ timer_created = true;
+ }
+
+ struct itimerspec new_value;
+ new_value.it_value.tv_sec = delay_millis / 1000;
+ new_value.it_value.tv_nsec = (delay_millis % 1000) * 1000 * 1000;
+ new_value.it_interval.tv_sec = 0;
+ new_value.it_interval.tv_nsec = 0;
+ timer_settime(timer, 0, &new_value, NULL);
+
+ return true;
+}
+
+static int acquire_wake_lock(const char *lock_name) {
+ return BT_STATUS_SUCCESS;
+}
+
+static int release_wake_lock(const char *lock_name) {
+ return BT_STATUS_SUCCESS;
+}
+
+static bt_os_callouts_t callouts = {
+ sizeof(bt_os_callouts_t),
+ set_wake_alarm,
+ acquire_wake_lock,
+ release_wake_lock,
};
void bdt_init(void)
{
bdt_log("INIT BT ");
status = sBtInterface->init(&bt_callbacks);
+
+ if (status == BT_STATUS_SUCCESS) {
+ status = sBtInterface->set_os_callouts(&callouts);
+ }
+
check_return_status(status);
}
@@ -611,7 +657,7 @@
** Console commands
*******************************************************************************/
-void do_help(char *p)
+void do_help(char UNUSED *p)
{
int i = 0;
int max = 0;
@@ -626,7 +672,7 @@
}
}
-void do_quit(char *p)
+void do_quit(char UNUSED *p)
{
bdt_shutdown();
}
@@ -639,17 +685,17 @@
*
*/
-void do_init(char *p)
+void do_init(char UNUSED *p)
{
bdt_init();
}
-void do_enable(char *p)
+void do_enable(char UNUSED *p)
{
bdt_enable();
}
-void do_disable(char *p)
+void do_disable(char UNUSED *p)
{
bdt_disable();
}
@@ -663,7 +709,7 @@
bdt_le_test_mode(p);
}
-void do_cleanup(char *p)
+void do_cleanup(char UNUSED *p)
{
bdt_cleanup();
}
@@ -731,7 +777,7 @@
do_help(NULL);
}
-int main (int argc, char * argv[])
+int main (int UNUSED argc, char UNUSED *argv[])
{
int opt;
char cmd[128];
diff --git a/test/suite/Android.mk b/test/suite/Android.mk
new file mode 100644
index 0000000..2f45180
--- /dev/null
+++ b/test/suite/Android.mk
@@ -0,0 +1,43 @@
+#
+# Copyright (C) 2014 Google, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE := bdtest
+
+LOCAL_SRC_FILES := \
+ cases/adapter.c \
+ cases/cases.c \
+ cases/pan.c \
+ support/adapter.c \
+ support/callbacks.c \
+ support/hal.c \
+ support/pan.c \
+ support/property.c \
+ main.c
+
+LOCAL_SHARED_LIBRARIES += \
+ libhardware \
+ libhardware_legacy
+
+LOCAL_CFLAGS += -std=c99 -Wall -Wno-unused-parameter -Wno-missing-field-initializers -Werror
+
+LOCAL_MULTILIB := 32
+
+include $(BUILD_EXECUTABLE)
diff --git a/test/suite/base.h b/test/suite/base.h
new file mode 100644
index 0000000..2d51af8
--- /dev/null
+++ b/test/suite/base.h
@@ -0,0 +1,36 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 Google, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+#pragma once
+
+#include <stdio.h>
+#include <stdbool.h>
+#include <string.h>
+
+#include <hardware/bluetooth.h>
+#include <hardware/bt_pan.h>
+#include <hardware/hardware.h>
+
+#ifndef ARRAY_SIZE
+# define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
+#endif
+
+#define TASSERT(c, ...) if (!(c)) { fprintf(stderr, "%s:%d: ", __func__, __LINE__); fprintf(stderr, __VA_ARGS__); fprintf(stderr, "\n"); return false; }
+
+extern const bt_interface_t *bt_interface;
+extern bt_bdaddr_t bt_remote_bdaddr;
diff --git a/test/suite/cases/adapter.c b/test/suite/cases/adapter.c
new file mode 100644
index 0000000..492d8f4
--- /dev/null
+++ b/test/suite/cases/adapter.c
@@ -0,0 +1,96 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 Google, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+#include "base.h"
+#include "support/adapter.h"
+#include "support/callbacks.h"
+#include "support/property.h"
+
+bool adapter_enable_disable() {
+ int error;
+
+ CALL_AND_WAIT(error = bt_interface->enable(), adapter_state_changed);
+ TASSERT(error == BT_STATUS_SUCCESS, "Error enabling Bluetooth: %d", error);
+ TASSERT(adapter_get_state() == BT_STATE_ON, "Adapter did not turn on.");
+
+ CALL_AND_WAIT(error = bt_interface->disable(), adapter_state_changed);
+ TASSERT(error == BT_STATUS_SUCCESS, "Error disabling Bluetooth: %d", error);
+ TASSERT(adapter_get_state() == BT_STATE_OFF, "Adapter did not turn off.");
+
+ return true;
+}
+
+bool adapter_repeated_enable_disable() {
+ for (int i = 0; i < 10; ++i) {
+ if (!adapter_enable_disable()) {
+ return false;
+ }
+ }
+ return true;
+}
+
+bool adapter_set_name() {
+ int error;
+ bt_property_t *name = property_new_name("set_name");
+
+ CALL_AND_WAIT(error = bt_interface->set_adapter_property(name), adapter_properties);
+ TASSERT(error == BT_STATUS_SUCCESS, "Error setting device name.");
+ TASSERT(adapter_get_property_count() == 1, "Expected 1 adapter property change, found %d instead.", adapter_get_property_count());
+ TASSERT(adapter_get_property(BT_PROPERTY_BDNAME), "The Bluetooth name property did not change.");
+ TASSERT(property_equals(adapter_get_property(BT_PROPERTY_BDNAME), name), "Bluetooth name '%s' does not match test value", property_extract_name(adapter_get_property(BT_PROPERTY_BDNAME)));
+
+ property_free(name);
+
+ return true;
+}
+
+bool adapter_get_name() {
+ int error;
+ bt_property_t *name = property_new_name("get_name");
+
+ CALL_AND_WAIT(bt_interface->set_adapter_property(name), adapter_properties);
+ CALL_AND_WAIT(error = bt_interface->get_adapter_property(BT_PROPERTY_BDNAME), adapter_properties);
+ TASSERT(error == BT_STATUS_SUCCESS, "Error getting device name.");
+ TASSERT(adapter_get_property_count() == 1, "Expected 1 adapter property change, found %d instead.", adapter_get_property_count());
+ TASSERT(adapter_get_property(BT_PROPERTY_BDNAME), "The Bluetooth name property did not change.");
+ TASSERT(property_equals(adapter_get_property(BT_PROPERTY_BDNAME), name), "Bluetooth name '%s' does not match test value", property_extract_name(adapter_get_property(BT_PROPERTY_BDNAME)));
+
+ property_free(name);
+ return true;
+}
+
+bool adapter_start_discovery() {
+ int error;
+
+ CALL_AND_WAIT(error = bt_interface->start_discovery(), discovery_state_changed);
+ TASSERT(error == BT_STATUS_SUCCESS, "Error calling start_discovery: %d", error);
+ TASSERT(adapter_get_discovery_state() == BT_DISCOVERY_STARTED, "Unable to start discovery.");
+
+ return true;
+}
+
+bool adapter_cancel_discovery() {
+ int error;
+
+ CALL_AND_WAIT(bt_interface->start_discovery(), discovery_state_changed);
+ CALL_AND_WAIT(error = bt_interface->cancel_discovery(), discovery_state_changed);
+ TASSERT(error == BT_STATUS_SUCCESS, "Error calling cancel_discovery: %d", error);
+ TASSERT(adapter_get_discovery_state() == BT_DISCOVERY_STOPPED, "Unable to stop discovery.");
+
+ return true;
+}
diff --git a/test/suite/cases/cases.c b/test/suite/cases/cases.c
new file mode 100644
index 0000000..20d941f
--- /dev/null
+++ b/test/suite/cases/cases.c
@@ -0,0 +1,53 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 Google, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+#include "base.h"
+#include "cases/cases.h"
+
+TEST_CASE_DECL(adapter_enable_disable);
+TEST_CASE_DECL(adapter_repeated_enable_disable);
+TEST_CASE_DECL(adapter_set_name);
+TEST_CASE_DECL(adapter_get_name);
+TEST_CASE_DECL(adapter_start_discovery);
+TEST_CASE_DECL(adapter_cancel_discovery);
+
+TEST_CASE_DECL(pan_enable);
+TEST_CASE_DECL(pan_connect);
+TEST_CASE_DECL(pan_disconnect);
+TEST_CASE_DECL(pan_quick_reconnect);
+
+// These are run with the Bluetooth adapter disabled.
+const test_case_t sanity_suite[] = {
+ TEST_CASE(adapter_enable_disable),
+ TEST_CASE(adapter_repeated_enable_disable),
+};
+
+// The normal test suite is run with the adapter enabled.
+const test_case_t test_suite[] = {
+ TEST_CASE(adapter_set_name),
+ TEST_CASE(adapter_get_name),
+ TEST_CASE(adapter_start_discovery),
+ TEST_CASE(adapter_cancel_discovery),
+
+ TEST_CASE(pan_enable),
+ TEST_CASE(pan_connect),
+ TEST_CASE(pan_disconnect),
+};
+
+const size_t sanity_suite_size = ARRAY_SIZE(sanity_suite);
+const size_t test_suite_size = ARRAY_SIZE(test_suite);
diff --git a/main/bte_version.c b/test/suite/cases/cases.h
similarity index 65%
copy from main/bte_version.c
copy to test/suite/cases/cases.h
index 826f31b..b20950b 100644
--- a/main/bte_version.c
+++ b/test/suite/cases/cases.h
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 2001-2012 Broadcom Corporation
+ * Copyright (C) 2014 Google, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,8 +16,19 @@
*
******************************************************************************/
-#include "bt_types.h"
+#pragma once
-const UINT8 bte_version_string[] = "BCM1200_PI_10.3.20.52";
-const UINT8 btif_version_string[] = "BDROID-PLUS-420-10_00.10";
+#include "base.h"
+#define TEST_CASE_DECL(x) bool x()
+#define TEST_CASE(x) { x, #x }
+
+typedef struct {
+ bool (*function)();
+ const char *function_name;
+} test_case_t;
+
+extern const test_case_t test_suite[];
+extern const test_case_t sanity_suite[];
+extern const size_t test_suite_size;
+extern const size_t sanity_suite_size;
diff --git a/test/suite/cases/pan.c b/test/suite/cases/pan.c
new file mode 100644
index 0000000..b903b90
--- /dev/null
+++ b/test/suite/cases/pan.c
@@ -0,0 +1,84 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 Google, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+#include "base.h"
+#include "support/callbacks.h"
+#include "support/pan.h"
+
+static const int local_role = BTPAN_ROLE_PANU;
+static const int remote_role = BTPAN_ROLE_PANNAP;
+
+bool pan_enable() {
+ int error;
+
+ // PAN is enabled by default, wait for the first control state change
+ // with default parameters set. We don't want to verify the result since
+ // the implementation could have set any parameters.
+ WAIT(pan_control_state_changed);
+
+ // Call enable explicitly and verify that the parameters match what we just set.
+ CALL_AND_WAIT(error = pan_interface->enable(local_role), pan_control_state_changed);
+ TASSERT(error == BT_STATUS_SUCCESS, "Error enabling PAN: %d", error);
+ TASSERT(pan_get_control_state() == BTPAN_STATE_ENABLED, "Control state is disabled.");
+ TASSERT(pan_get_local_role() == local_role, "Unexpected local role: %d", pan_get_local_role());
+ TASSERT(pan_get_error() == BT_STATUS_SUCCESS, "Error in control callback: %d", pan_get_error());
+
+ return true;
+}
+
+bool pan_connect() {
+ int error;
+
+ if (!pan_enable()) {
+ return false;
+ }
+
+ CALL_AND_WAIT(error = pan_interface->connect(&bt_remote_bdaddr, local_role, remote_role), pan_connection_state_changed);
+ TASSERT(error == BT_STATUS_SUCCESS, "Error connecting to remote host: %d", error);
+ TASSERT(pan_get_error() == BT_STATUS_SUCCESS, "Error connecting to BT device: %d", pan_get_error());
+ TASSERT(pan_get_connection_state() == BTPAN_STATE_CONNECTING, "Invalid PAN state after connect: %d", pan_get_connection_state());
+ TASSERT(pan_get_local_role() == local_role, "Incorrect local role: %d", pan_get_local_role());
+ TASSERT(pan_get_remote_role() == remote_role, "Incorrect remote role: %d", pan_get_remote_role());
+
+ WAIT(pan_connection_state_changed);
+ TASSERT(pan_get_error() == BT_STATUS_SUCCESS, "Error connecting to BT device: %d", pan_get_error());
+ TASSERT(pan_get_connection_state() == BTPAN_STATE_CONNECTED, "Invalid PAN state after connect: %d", pan_get_connection_state());
+ TASSERT(pan_get_local_role() == local_role, "Incorrect local role: %d", pan_get_local_role());
+ TASSERT(pan_get_remote_role() == remote_role, "Incorrect remote role: %d", pan_get_remote_role());
+
+ return true;
+}
+
+bool pan_disconnect() {
+ int error;
+
+ if (!pan_connect()) {
+ return false;
+ }
+
+ CALL_AND_WAIT(error = pan_interface->disconnect(&bt_remote_bdaddr), pan_connection_state_changed);
+ TASSERT(error == BT_STATUS_SUCCESS, "Error disconnecting from remote host: %d", error);
+ TASSERT(pan_get_error() == BT_STATUS_SUCCESS, "Error disconnecting from BT device: %d", pan_get_error());
+ TASSERT(pan_get_connection_state() == BTPAN_STATE_DISCONNECTING, "Invalid PAN state after disconnect: %d", pan_get_connection_state());
+
+ WAIT(pan_connection_state_changed);
+ TASSERT(pan_get_error() == BT_STATUS_SUCCESS, "Error disconnecting from BT device: %d", pan_get_error());
+ TASSERT(pan_get_connection_state() == BTPAN_STATE_DISCONNECTED, "Invalid PAN state after disconnect: %d", pan_get_connection_state());
+
+ return true;
+}
diff --git a/test/suite/main.c b/test/suite/main.c
new file mode 100644
index 0000000..7a3af5b
--- /dev/null
+++ b/test/suite/main.c
@@ -0,0 +1,114 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 Google, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+#include "base.h"
+#include "cases/cases.h"
+#include "support/callbacks.h"
+#include "support/hal.h"
+#include "support/pan.h"
+
+#define GRAY "\x1b[0;37m"
+#define GREEN "\x1b[0;32m"
+#define RED "\x1b[0;31m"
+
+const bt_interface_t *bt_interface;
+bt_bdaddr_t bt_remote_bdaddr;
+
+static bool parse_bdaddr(const char *str, bt_bdaddr_t *addr) {
+ if (!addr) {
+ return false;
+ }
+
+ int v[6];
+ if (sscanf(str, "%02x:%02x:%02x:%02x:%02x:%02x", &v[0], &v[1], &v[2], &v[3], &v[4], &v[5]) != 6) {
+ return false;
+ }
+
+ for (int i = 0; i < 6; ++i) {
+ addr->address[i] = (uint8_t)v[i];
+ }
+
+ return true;
+}
+
+int main(int argc, char **argv) {
+ if (argc < 2 || !parse_bdaddr(argv[1], &bt_remote_bdaddr)) {
+ printf("Usage: %s <bdaddr>\n", argv[0]);
+ return -1;
+ }
+
+ if (!hal_open(callbacks_get_adapter_struct())) {
+ printf("Unable to open Bluetooth HAL.\n");
+ return 1;
+ }
+
+ if (!pan_init()) {
+ printf("Unable to initialize PAN.\n");
+ return 2;
+ }
+
+ int pass = 0;
+ int fail = 0;
+ int case_num = 0;
+
+ // Run through the sanity suite.
+ for (size_t i = 0; i < sanity_suite_size; ++i) {
+ callbacks_init();
+ if (sanity_suite[i].function()) {
+ printf("[%4d] %-64s [%sPASS%s]\n", ++case_num, sanity_suite[i].function_name, GREEN, GRAY);
+ ++pass;
+ } else {
+ printf("[%4d] %-64s [%sFAIL%s]\n", ++case_num, sanity_suite[i].function_name, RED, GRAY);
+ ++fail;
+ }
+ callbacks_cleanup();
+ }
+
+ // If there was a failure in the sanity suite, don't bother running the rest of the tests.
+ if (fail) {
+ printf("\n%sSanity suite failed with %d errors.%s\n", RED, fail, GRAY);
+ hal_close();
+ return 0;
+ }
+
+ // Run the full test suite.
+ for (size_t i = 0; i < test_suite_size; ++i) {
+ callbacks_init();
+ CALL_AND_WAIT(bt_interface->enable(), adapter_state_changed);
+ if (test_suite[i].function()) {
+ printf("[%4d] %-64s [%sPASS%s]\n", ++case_num, test_suite[i].function_name, GREEN, GRAY);
+ ++pass;
+ } else {
+ printf("[%4d] %-64s [%sFAIL%s]\n", ++case_num, test_suite[i].function_name, RED, GRAY);
+ ++fail;
+ }
+ CALL_AND_WAIT(bt_interface->disable(), adapter_state_changed);
+ callbacks_cleanup();
+ }
+
+ printf("\n");
+
+ if (fail) {
+ printf("%d/%d tests failed. See above for failed test cases.\n", fail, test_suite_size);
+ } else {
+ printf("All tests passed!\n");
+ }
+
+ hal_close();
+ return 0;
+}
diff --git a/test/suite/support/adapter.c b/test/suite/support/adapter.c
new file mode 100644
index 0000000..0a78253
--- /dev/null
+++ b/test/suite/support/adapter.c
@@ -0,0 +1,72 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 Google, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+#include "base.h"
+#include "support/adapter.h"
+#include "support/callbacks.h"
+#include "support/property.h"
+
+static bt_state_t state;
+static int property_count = 0;
+static bt_property_t *properties = NULL;
+static bt_discovery_state_t discovery_state;
+
+bt_state_t adapter_get_state() {
+ return state;
+}
+
+int adapter_get_property_count() {
+ return property_count;
+}
+
+bt_property_t *adapter_get_property(bt_property_type_t type) {
+ for (int i = 0; i < property_count; ++i) {
+ if (properties[i].type == type) {
+ return &properties[i];
+ }
+ }
+
+ return NULL;
+}
+
+bt_discovery_state_t adapter_get_discovery_state() {
+ return discovery_state;
+}
+
+// callback
+void adapter_state_changed(bt_state_t new_state) {
+ state = new_state;
+ CALLBACK_RET();
+}
+
+// callback
+void adapter_properties(bt_status_t status,
+ int num_properties,
+ bt_property_t *new_properties) {
+ property_free_array(properties, property_count);
+ properties = property_copy_array(new_properties, num_properties);
+ property_count = num_properties;
+
+ CALLBACK_RET();
+}
+
+// callback
+void discovery_state_changed(bt_discovery_state_t state) {
+ discovery_state = state;
+ CALLBACK_RET();
+}
diff --git a/main/bte_version.c b/test/suite/support/adapter.h
similarity index 74%
copy from main/bte_version.c
copy to test/suite/support/adapter.h
index 826f31b..0f5883f 100644
--- a/main/bte_version.c
+++ b/test/suite/support/adapter.h
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 2001-2012 Broadcom Corporation
+ * Copyright (C) 2014 Google, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,8 +16,11 @@
*
******************************************************************************/
-#include "bt_types.h"
+#pragma once
-const UINT8 bte_version_string[] = "BCM1200_PI_10.3.20.52";
-const UINT8 btif_version_string[] = "BDROID-PLUS-420-10_00.10";
+#include "base.h"
+bt_state_t adapter_get_state();
+int adapter_get_property_count();
+bt_property_t *adapter_get_property(bt_property_type_t type);
+bt_discovery_state_t adapter_get_discovery_state();
diff --git a/test/suite/support/callbacks.c b/test/suite/support/callbacks.c
new file mode 100644
index 0000000..08a69a5
--- /dev/null
+++ b/test/suite/support/callbacks.c
@@ -0,0 +1,115 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 Google, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+#include "base.h"
+#include "support/callbacks.h"
+
+void adapter_state_changed(bt_state_t state);
+void adapter_properties(bt_status_t status,
+ int num_properties,
+ bt_property_t *properties);
+void discovery_state_changed(bt_discovery_state_t state);
+
+void pan_control_state_changed(btpan_control_state_t state, int local_role, bt_status_t error, const char *ifname);
+void pan_connection_state_changed(btpan_connection_state_t state, bt_status_t error, const bt_bdaddr_t *bd_addr, int local_role, int remote_role);
+
+static void remote_device_properties(bt_status_t status,
+ bt_bdaddr_t *bd_addr,
+ int num_properties,
+ bt_property_t *properties) {
+ CALLBACK_RET();
+}
+
+static void thread_evt(bt_cb_thread_evt evt) {
+ CALLBACK_RET();
+}
+
+static struct {
+ const char *name;
+ sem_t semaphore;
+} callback_data[] = {
+ // Adapter callbacks
+ { "adapter_state_changed" },
+ { "adapter_properties" },
+ { "remote_device_properties" },
+ {},
+ { "discovery_state_changed" },
+ {},
+ {},
+ {},
+ {},
+ { "thread_evt" },
+ {},
+ {},
+
+ // PAN callbacks
+ { "pan_control_state_changed" },
+ { "pan_connection_state_changed" },
+};
+
+static bt_callbacks_t bt_callbacks = {
+ sizeof(bt_callbacks_t),
+ adapter_state_changed, // adapter_state_changed_callback
+ adapter_properties, // adapter_properties_callback
+ remote_device_properties, // remote_device_properties_callback
+ NULL, // device_found_callback
+ discovery_state_changed, // discovery_state_changed_callback
+ NULL, // pin_request_callback
+ NULL, // ssp_request_callback
+ NULL, // bond_state_changed_callback
+ NULL, // acl_state_changed_callback
+ thread_evt, // callback_thread_event
+ NULL, // dut_mode_recv_callback
+ NULL, // le_test_mode_callback
+ NULL,
+};
+
+static btpan_callbacks_t pan_callbacks = {
+ sizeof(btpan_callbacks_t),
+ pan_control_state_changed, // btpan_control_state_callback
+ pan_connection_state_changed, // btpan_connection_state_callback
+};
+
+void callbacks_init() {
+ for (size_t i = 0; i < ARRAY_SIZE(callback_data); ++i) {
+ sem_init(&callback_data[i].semaphore, 0, 0);
+ }
+}
+
+void callbacks_cleanup() {
+ for (size_t i = 0; i < ARRAY_SIZE(callback_data); ++i) {
+ sem_destroy(&callback_data[i].semaphore);
+ }
+}
+
+bt_callbacks_t *callbacks_get_adapter_struct() {
+ return &bt_callbacks;
+}
+
+btpan_callbacks_t *callbacks_get_pan_struct() {
+ return &pan_callbacks;
+}
+
+sem_t *callbacks_get_semaphore(const char *name) {
+ for (size_t i = 0; i < ARRAY_SIZE(callback_data); ++i) {
+ if (callback_data[i].name && !strcmp(name, callback_data[i].name)) {
+ return &callback_data[i].semaphore;
+ }
+ }
+ return NULL;
+}
diff --git a/test/suite/support/callbacks.h b/test/suite/support/callbacks.h
new file mode 100644
index 0000000..102e13f
--- /dev/null
+++ b/test/suite/support/callbacks.h
@@ -0,0 +1,52 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 Google, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+#pragma once
+
+#include "base.h"
+
+#include <semaphore.h>
+
+#define WAIT(callback) \
+ do { \
+ sem_t *semaphore = callbacks_get_semaphore(#callback); \
+ sem_wait(semaphore); \
+ } while (0)
+
+#define CALL_AND_WAIT(expression, callback) \
+ do { \
+ sem_t *semaphore = callbacks_get_semaphore(#callback); \
+ while (!sem_trywait(semaphore)); \
+ expression; \
+ sem_wait(semaphore); \
+ } while(0)
+
+// To be called from every exit point of the callback. This macro
+// takes 0 or 1 arguments, the return value of the callback.
+#define CALLBACK_RET(...) do { \
+ sem_t *semaphore = callbacks_get_semaphore(__func__); \
+ sem_post(semaphore); \
+ return __VA_ARGS__; \
+ } while (0)
+
+void callbacks_init();
+void callbacks_cleanup();
+
+bt_callbacks_t *callbacks_get_adapter_struct();
+btpan_callbacks_t *callbacks_get_pan_struct();
+sem_t *callbacks_get_semaphore(const char *name);
diff --git a/test/suite/support/hal.c b/test/suite/support/hal.c
new file mode 100644
index 0000000..ff4952c
--- /dev/null
+++ b/test/suite/support/hal.c
@@ -0,0 +1,104 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 Google, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+#include <signal.h>
+#include <time.h>
+
+#include "base.h"
+#include "support/hal.h"
+
+static bool set_wake_alarm(uint64_t delay_millis, bool should_wake, alarm_cb cb, void *data);
+static int acquire_wake_lock(const char *lock_name);
+static int release_wake_lock(const char *lock_name);
+
+static const bluetooth_device_t *bt_device;
+
+static bt_os_callouts_t callouts = {
+ sizeof(bt_os_callouts_t),
+ set_wake_alarm,
+ acquire_wake_lock,
+ release_wake_lock,
+};
+
+bool hal_open(bt_callbacks_t *callbacks) {
+ hw_module_t *module;
+ if (hw_get_module(BT_STACK_MODULE_ID, (hw_module_t const **)&module)) {
+ return false;
+ }
+
+ hw_device_t *device;
+ if (module->methods->open(module, BT_STACK_MODULE_ID, &device)) {
+ return false;
+ }
+
+ bt_device = (bluetooth_device_t *)device;
+ bt_interface = bt_device->get_bluetooth_interface();
+ if (!bt_interface) {
+ bt_device->common.close((hw_device_t *)&bt_device->common);
+ bt_device = NULL;
+ return false;
+ }
+
+ bool success = (bt_interface->init(callbacks) == BT_STATUS_SUCCESS);
+ success = success && (bt_interface->set_os_callouts(&callouts) == BT_STATUS_SUCCESS);
+ return success;
+}
+
+void hal_close() {
+ if (bt_interface) {
+ bt_interface->cleanup();
+ bt_interface = NULL;
+ }
+
+ if (bt_device) {
+ bt_device->common.close((hw_device_t *)&bt_device->common);
+ bt_device = NULL;
+ }
+}
+
+static bool set_wake_alarm(uint64_t delay_millis, bool should_wake, alarm_cb cb, void *data) {
+ static timer_t timer;
+ static bool timer_created;
+
+ if (!timer_created) {
+ struct sigevent sigevent;
+ memset(&sigevent, 0, sizeof(sigevent));
+ sigevent.sigev_notify = SIGEV_THREAD;
+ sigevent.sigev_notify_function = (void (*)(union sigval))cb;
+ sigevent.sigev_value.sival_ptr = data;
+ timer_create(CLOCK_MONOTONIC, &sigevent, &timer);
+ timer_created = true;
+ }
+
+ struct itimerspec new_value;
+ new_value.it_value.tv_sec = delay_millis / 1000;
+ new_value.it_value.tv_nsec = (delay_millis % 1000) * 1000 * 1000;
+ new_value.it_interval.tv_sec = 0;
+ new_value.it_interval.tv_nsec = 0;
+ timer_settime(timer, 0, &new_value, NULL);
+
+ return true;
+}
+
+static int acquire_wake_lock(const char *lock_name) {
+ return BT_STATUS_SUCCESS;
+}
+
+static int release_wake_lock(const char *lock_name) {
+ return BT_STATUS_SUCCESS;
+}
diff --git a/main/bte_version.c b/test/suite/support/hal.h
similarity index 78%
rename from main/bte_version.c
rename to test/suite/support/hal.h
index 826f31b..11fa9f9 100644
--- a/main/bte_version.c
+++ b/test/suite/support/hal.h
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 2001-2012 Broadcom Corporation
+ * Copyright (C) 2014 Google, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,8 +16,9 @@
*
******************************************************************************/
-#include "bt_types.h"
+#pragma once
-const UINT8 bte_version_string[] = "BCM1200_PI_10.3.20.52";
-const UINT8 btif_version_string[] = "BDROID-PLUS-420-10_00.10";
+#include "base.h"
+bool hal_open(bt_callbacks_t *callbacks);
+void hal_close();
diff --git a/test/suite/support/pan.c b/test/suite/support/pan.c
new file mode 100644
index 0000000..df4c516
--- /dev/null
+++ b/test/suite/support/pan.c
@@ -0,0 +1,76 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 Google, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+#include "base.h"
+#include "support/callbacks.h"
+#include "support/pan.h"
+
+const btpan_interface_t *pan_interface;
+
+static btpan_control_state_t pan_control_state;
+static btpan_connection_state_t pan_connection_state;
+static int pan_local_role;
+static int pan_remote_role;
+static bt_status_t pan_error;
+static char *pan_ifname;
+
+bool pan_init() {
+ pan_interface = bt_interface->get_profile_interface(BT_PROFILE_PAN_ID);
+ return pan_interface->init(callbacks_get_pan_struct()) == BT_STATUS_SUCCESS;
+}
+
+btpan_control_state_t pan_get_control_state() {
+ return pan_control_state;
+}
+
+btpan_connection_state_t pan_get_connection_state() {
+ return pan_connection_state;
+}
+
+int pan_get_local_role() {
+ return pan_local_role;
+}
+
+int pan_get_remote_role() {
+ return pan_remote_role;
+}
+
+bt_status_t pan_get_error() {
+ return pan_error;
+}
+
+// callback
+void pan_control_state_changed(btpan_control_state_t state, bt_status_t error, int local_role, const char *ifname) {
+ free(pan_ifname);
+
+ pan_control_state = state;
+ pan_local_role = local_role;
+ pan_error = error;
+ pan_ifname = strdup(ifname);
+
+ CALLBACK_RET();
+}
+
+// callback
+void pan_connection_state_changed(btpan_connection_state_t state, bt_status_t error, const bt_bdaddr_t *bd_addr, int local_role, int remote_role) {
+ pan_connection_state = state;
+ pan_error = error;
+ pan_local_role = local_role;
+ pan_remote_role = remote_role;
+ CALLBACK_RET();
+}
diff --git a/main/bte_version.c b/test/suite/support/pan.h
similarity index 69%
copy from main/bte_version.c
copy to test/suite/support/pan.h
index 826f31b..f43eb24 100644
--- a/main/bte_version.c
+++ b/test/suite/support/pan.h
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 2001-2012 Broadcom Corporation
+ * Copyright (C) 2014 Google, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,8 +16,16 @@
*
******************************************************************************/
-#include "bt_types.h"
+#pragma once
-const UINT8 bte_version_string[] = "BCM1200_PI_10.3.20.52";
-const UINT8 btif_version_string[] = "BDROID-PLUS-420-10_00.10";
+#include "base.h"
+extern const btpan_interface_t *pan_interface;
+
+bool pan_init();
+
+btpan_control_state_t pan_get_control_state();
+btpan_connection_state_t pan_get_connection_state();
+int pan_get_local_role();
+int pan_get_remote_role();
+bt_status_t pan_get_error();
diff --git a/test/suite/support/property.c b/test/suite/support/property.c
new file mode 100644
index 0000000..ea2c5c4
--- /dev/null
+++ b/test/suite/support/property.c
@@ -0,0 +1,113 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 Google, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+#include "base.h"
+#include "support/property.h"
+
+bt_property_t *property_copy_array(const bt_property_t *properties, size_t count) {
+ bt_property_t *clone = calloc(sizeof(bt_property_t), count);
+ if (!clone) {
+ return NULL;
+ }
+
+ memcpy(&clone[0], &properties[0], sizeof(bt_property_t) * count);
+ for (size_t i = 0; i < count; ++i) {
+ clone[i].val = calloc(clone[i].len, 1);
+ memcpy(clone[i].val, properties[i].val, clone[i].len);
+ }
+
+ return clone;
+}
+
+bt_property_t *property_new_name(const char *name) {
+ bt_bdname_t *bdname = calloc(sizeof(bt_bdname_t), 1);
+ bt_property_t *property = calloc(sizeof(bt_property_t), 1);
+
+ property->type = BT_PROPERTY_BDNAME;
+ property->val = bdname;
+ property->len = sizeof(bt_bdname_t);
+
+ strlcpy((char *)bdname->name, name, sizeof(bdname->name));
+
+ return property;
+}
+
+bt_property_t *property_new_discovery_timeout(uint32_t timeout) {
+ uint32_t *val = malloc(sizeof(uint32_t));
+ bt_property_t *property = malloc(sizeof(bt_property_t));
+
+ property->type = BT_PROPERTY_ADAPTER_DISCOVERY_TIMEOUT;
+ property->val = val;
+ property->len = sizeof(uint32_t);
+
+ *val = timeout;
+
+ return property;
+}
+
+// Warning: not thread safe.
+const char *property_extract_name(const bt_property_t *property) {
+ static char name[250] = { 0 };
+ if (!property || property->type != BT_PROPERTY_BDNAME || !property->val) {
+ return NULL;
+ }
+
+ strncpy(name, (const char *)((bt_bdname_t *)property->val)->name, property->len);
+ name[sizeof(name) - 1] = '\0';
+
+ return name;
+}
+
+bool property_equals(const bt_property_t *p1, const bt_property_t *p2) {
+ // Two null properties are not the same. May need to revisit that
+ // decision when we have a test case that exercises that condition.
+ if (!p1 || !p2 || p1->type != p2->type) {
+ return false;
+ }
+
+ // Although the Bluetooth name is a 249-byte array, the implementation
+ // treats it like a variable-length array with its size specified in the
+ // property's `len` field. We special-case the equivalence of BDNAME
+ // types here by truncating the larger, zero-padded name to its string
+ // length and comparing against the shorter name.
+ //
+ // Note: it may be the case that both strings are zero-padded but that
+ // hasn't come up yet so this implementation doesn't handle it.
+ if (p1->type == BT_PROPERTY_BDNAME && p1->len != p2->len) {
+ const bt_property_t *shorter = p1, *longer = p2;
+ if (p1->len > p2->len) {
+ shorter = p2;
+ longer = p1;
+ }
+ return strlen((const char *)longer->val) == (size_t)shorter->len && !memcmp(longer->val, shorter->val, shorter->len);
+ }
+
+ return p1->len == p2->len && !memcmp(p1->val, p2->val, p1->len);
+}
+
+void property_free(bt_property_t *property) {
+ property_free_array(property, 1);
+}
+
+void property_free_array(bt_property_t *properties, size_t count) {
+ for (size_t i = 0; i < count; ++i) {
+ free(properties[i].val);
+ }
+
+ free(properties);
+}
diff --git a/test/suite/support/property.h b/test/suite/support/property.h
new file mode 100644
index 0000000..a8b77c7
--- /dev/null
+++ b/test/suite/support/property.h
@@ -0,0 +1,32 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2014 Google, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+#pragma once
+
+#include "base.h"
+
+bt_property_t *property_copy_array(const bt_property_t *properties, size_t count);
+bt_property_t *property_new_name(const char *name);
+bt_property_t *property_new_discovery_timeout(uint32_t timeout);
+
+const char *property_extract_name(const bt_property_t *property);
+
+bool property_equals(const bt_property_t *p1, const bt_property_t *p2);
+
+void property_free(bt_property_t *property);
+void property_free_array(bt_property_t *properties, size_t count);
diff --git a/udrv/ulinux/uipc.c b/udrv/ulinux/uipc.c
index 795f615..b9caa1b 100644
--- a/udrv/ulinux/uipc.c
+++ b/udrv/ulinux/uipc.c
@@ -64,8 +64,8 @@
#define UIPC_DISCONNECTED (-1)
-#define UIPC_LOCK() /*BTIF_TRACE_EVENT1(" %s lock", __FUNCTION__);*/ pthread_mutex_lock(&uipc_main.mutex);
-#define UIPC_UNLOCK() /*BTIF_TRACE_EVENT1("%s unlock", __FUNCTION__);*/ pthread_mutex_unlock(&uipc_main.mutex);
+#define UIPC_LOCK() /*BTIF_TRACE_EVENT(" %s lock", __FUNCTION__);*/ pthread_mutex_lock(&uipc_main.mutex);
+#define UIPC_UNLOCK() /*BTIF_TRACE_EVENT("%s unlock", __FUNCTION__);*/ pthread_mutex_unlock(&uipc_main.mutex);
#define SAFE_FD_ISSET(fd, set) (((fd) == -1) ? FALSE : FD_ISSET((fd), (set)))
@@ -140,49 +140,6 @@
}
/*****************************************************************************
-**
-** Function
-**
-** Description
-**
-** Returns
-**
-*******************************************************************************/
-
-static void uipc_wait(tUIPC_CH_ID ch_id, tUIPC_EVENT wait_event_flags)
-{
- int ret;
- tUIPC_CHAN *p = &uipc_main.ch[ch_id];
-
- //BTIF_TRACE_EVENT2("WAIT UIPC CH %d EVT %x BEGIN", ch_id, wait_event_flags);
- pthread_mutex_lock(&p->cond_mutex);
- p->cond_flags |= wait_event_flags;
- ret = pthread_cond_wait(&p->cond, &p->cond_mutex);
- pthread_mutex_unlock(&p->cond_mutex);
- //BTIF_TRACE_EVENT2("WAIT UIPC CH %d EVT %x DONE", ch_id, wait_event_flags);
-}
-
-static void uipc_signal(tUIPC_CH_ID ch_id, tUIPC_EVENT event)
-{
- int ret;
- tUIPC_CHAN *p = &uipc_main.ch[ch_id];
-
- //BTIF_TRACE_EVENT2("SIGNAL UIPC CH %d EVT %x BEGIN", ch_id, dump_uipc_event(event));
- pthread_mutex_lock(&p->cond_mutex);
-
- if (event & p->cond_flags)
- {
- //BTIF_TRACE_EVENT0("UNBLOCK");
- ret = pthread_cond_signal(&p->cond);
- p->cond_flags = 0;
- }
-
- pthread_mutex_unlock(&p->cond_mutex);
-}
-
-
-
-/*****************************************************************************
** socket helper functions
*****************************************************************************/
@@ -190,23 +147,23 @@
{
int s = socket(AF_LOCAL, SOCK_STREAM, 0);
- BTIF_TRACE_EVENT1("create_server_socket %s", name);
+ BTIF_TRACE_EVENT("create_server_socket %s", name);
if(socket_local_server_bind(s, name, ANDROID_SOCKET_NAMESPACE_ABSTRACT) < 0)
{
- BTIF_TRACE_EVENT1("socket failed to create (%s)", strerror(errno));
+ BTIF_TRACE_EVENT("socket failed to create (%s)", strerror(errno));
close(s);
return -1;
}
if(listen(s, 5) < 0)
{
- BTIF_TRACE_EVENT1("listen failed", strerror(errno));
+ BTIF_TRACE_EVENT("listen failed", strerror(errno));
close(s);
return -1;
}
- BTIF_TRACE_EVENT1("created socket fd %d", s);
+ BTIF_TRACE_EVENT("created socket fd %d", s);
return s;
}
@@ -215,9 +172,9 @@
struct sockaddr_un remote;
struct pollfd pfd;
int fd;
- int len = sizeof(struct sockaddr_un);
+ socklen_t len = sizeof(struct sockaddr_un);
- BTIF_TRACE_EVENT1("accept fd %d", sfd);
+ BTIF_TRACE_EVENT("accept fd %d", sfd);
/* make sure there is data to process */
pfd.fd = sfd;
@@ -225,19 +182,19 @@
if (poll(&pfd, 1, 0) == 0)
{
- BTIF_TRACE_EVENT0("accept poll timeout");
+ BTIF_TRACE_EVENT("accept poll timeout");
return -1;
}
- //BTIF_TRACE_EVENT1("poll revents 0x%x", pfd.revents);
+ //BTIF_TRACE_EVENT("poll revents 0x%x", pfd.revents);
if ((fd = accept(sfd, (struct sockaddr *)&remote, &len)) == -1)
{
- BTIF_TRACE_ERROR1("sock accept failed (%s)", strerror(errno));
+ BTIF_TRACE_ERROR("sock accept failed (%s)", strerror(errno));
return -1;
}
- //BTIF_TRACE_EVENT1("new fd %d", fd);
+ //BTIF_TRACE_EVENT("new fd %d", fd);
return fd;
}
@@ -254,7 +211,7 @@
const pthread_mutexattr_t attr = PTHREAD_MUTEX_RECURSIVE;
pthread_mutex_init(&uipc_main.mutex, &attr);
- BTIF_TRACE_EVENT0("### uipc_main_init ###");
+ BTIF_TRACE_EVENT("### uipc_main_init ###");
/* setup interrupt socket pair */
if (socketpair(AF_UNIX, SOCK_STREAM, 0, uipc_main.signal_fds) < 0)
@@ -283,7 +240,7 @@
{
int i;
- BTIF_TRACE_EVENT0("uipc_main_cleanup");
+ BTIF_TRACE_EVENT("uipc_main_cleanup");
close(uipc_main.signal_fds[0]);
close(uipc_main.signal_fds[1]);
@@ -302,7 +259,7 @@
for (i=0; i<UIPC_CH_NUM; i++)
{
- //BTIF_TRACE_EVENT2("CHECK TASK FLAGS %x %x", uipc_main.ch[i].task_evt_flags, UIPC_TASK_FLAG_DISCONNECT_CHAN);
+ //BTIF_TRACE_EVENT("CHECK TASK FLAGS %x %x", uipc_main.ch[i].task_evt_flags, UIPC_TASK_FLAG_DISCONNECT_CHAN);
if (uipc_main.ch[i].task_evt_flags & UIPC_TASK_FLAG_DISCONNECT_CHAN)
{
uipc_main.ch[i].task_evt_flags &= ~UIPC_TASK_FLAG_DISCONNECT_CHAN;
@@ -320,28 +277,28 @@
if (ch_id >= UIPC_CH_NUM)
return -1;
- //BTIF_TRACE_EVENT2("CHECK SRVFD %d (ch %d)", uipc_main.ch[ch_id].srvfd, ch_id);
+ //BTIF_TRACE_EVENT("CHECK SRVFD %d (ch %d)", uipc_main.ch[ch_id].srvfd, ch_id);
if (SAFE_FD_ISSET(uipc_main.ch[ch_id].srvfd, &uipc_main.read_set))
{
- BTIF_TRACE_EVENT1("INCOMING CONNECTION ON CH %d", ch_id);
+ BTIF_TRACE_EVENT("INCOMING CONNECTION ON CH %d", ch_id);
uipc_main.ch[ch_id].fd = accept_server_socket(uipc_main.ch[ch_id].srvfd);
- BTIF_TRACE_EVENT1("NEW FD %d", uipc_main.ch[ch_id].fd);
+ BTIF_TRACE_EVENT("NEW FD %d", uipc_main.ch[ch_id].fd);
if ((uipc_main.ch[ch_id].fd > 0) && uipc_main.ch[ch_id].cback)
{
/* if we have a callback we should add this fd to the active set
and notify user with callback event */
- BTIF_TRACE_EVENT1("ADD FD %d TO ACTIVE SET", uipc_main.ch[ch_id].fd);
+ BTIF_TRACE_EVENT("ADD FD %d TO ACTIVE SET", uipc_main.ch[ch_id].fd);
FD_SET(uipc_main.ch[ch_id].fd, &uipc_main.active_set);
uipc_main.max_fd = MAX(uipc_main.max_fd, uipc_main.ch[ch_id].fd);
}
if (uipc_main.ch[ch_id].fd < 0)
{
- BTIF_TRACE_ERROR2("FAILED TO ACCEPT CH %d (%s)", ch_id, strerror(errno));
+ BTIF_TRACE_ERROR("FAILED TO ACCEPT CH %d (%s)", ch_id, strerror(errno));
return -1;
}
@@ -349,11 +306,11 @@
uipc_main.ch[ch_id].cback(ch_id, UIPC_OPEN_EVT);
}
- //BTIF_TRACE_EVENT2("CHECK FD %d (ch %d)", uipc_main.ch[ch_id].fd, ch_id);
+ //BTIF_TRACE_EVENT("CHECK FD %d (ch %d)", uipc_main.ch[ch_id].fd, ch_id);
if (SAFE_FD_ISSET(uipc_main.ch[ch_id].fd, &uipc_main.read_set))
{
- //BTIF_TRACE_EVENT1("INCOMING DATA ON CH %d", ch_id);
+ //BTIF_TRACE_EVENT("INCOMING DATA ON CH %d", ch_id);
if (uipc_main.ch[ch_id].cback)
uipc_main.ch[ch_id].cback(ch_id, UIPC_RX_DATA_READY_EVT);
@@ -366,7 +323,7 @@
if (SAFE_FD_ISSET(uipc_main.signal_fds[0], &uipc_main.read_set))
{
char sig_recv = 0;
- //BTIF_TRACE_EVENT0("UIPC INTERRUPT");
+ //BTIF_TRACE_EVENT("UIPC INTERRUPT");
recv(uipc_main.signal_fds[0], &sig_recv, sizeof(sig_recv), MSG_WAITALL);
}
}
@@ -374,7 +331,7 @@
static inline void uipc_wakeup_locked(void)
{
char sig_on = 1;
- BTIF_TRACE_EVENT0("UIPC SEND WAKE UP");
+ BTIF_TRACE_EVENT("UIPC SEND WAKE UP");
send(uipc_main.signal_fds[1], &sig_on, sizeof(sig_on), 0);
}
@@ -382,7 +339,7 @@
{
int fd;
- BTIF_TRACE_EVENT1("SETUP CHANNEL SERVER %d", ch_id);
+ BTIF_TRACE_EVENT("SETUP CHANNEL SERVER %d", ch_id);
if (ch_id >= UIPC_CH_NUM)
return -1;
@@ -393,12 +350,12 @@
if (fd < 0)
{
- BTIF_TRACE_ERROR2("failed to setup %s", name, strerror(errno));
+ BTIF_TRACE_ERROR("failed to setup %s", name, strerror(errno));
UIPC_UNLOCK();
return -1;
}
- BTIF_TRACE_EVENT1("ADD SERVER FD TO ACTIVE SET %d", fd);
+ BTIF_TRACE_EVENT("ADD SERVER FD TO ACTIVE SET %d", fd);
FD_SET(fd, &uipc_main.active_set);
uipc_main.max_fd = MAX(uipc_main.max_fd, fd);
@@ -429,14 +386,14 @@
while (1)
{
ret = poll(&pfd, 1, 1);
- BTIF_TRACE_EVENT3("uipc_flush_ch_locked polling : fd %d, rxev %x, ret %d", pfd.fd, pfd.revents, ret);
+ BTIF_TRACE_EVENT("uipc_flush_ch_locked polling : fd %d, rxev %x, ret %d", pfd.fd, pfd.revents, ret);
if (pfd.revents & (POLLERR|POLLHUP))
return;
if (ret <= 0)
{
- BTIF_TRACE_EVENT1("uipc_flush_ch_locked : error (%d)", ret);
+ BTIF_TRACE_EVENT("uipc_flush_ch_locked : error (%d)", ret);
return;
}
read(pfd.fd, &buf, 1);
@@ -466,14 +423,14 @@
{
int wakeup = 0;
- BTIF_TRACE_EVENT1("CLOSE CHANNEL %d", ch_id);
+ BTIF_TRACE_EVENT("CLOSE CHANNEL %d", ch_id);
if (ch_id >= UIPC_CH_NUM)
return -1;
if (uipc_main.ch[ch_id].srvfd != UIPC_DISCONNECTED)
{
- BTIF_TRACE_EVENT1("CLOSE SERVER (FD %d)", uipc_main.ch[ch_id].srvfd);
+ BTIF_TRACE_EVENT("CLOSE SERVER (FD %d)", uipc_main.ch[ch_id].srvfd);
close(uipc_main.ch[ch_id].srvfd);
FD_CLR(uipc_main.ch[ch_id].srvfd, &uipc_main.active_set);
uipc_main.ch[ch_id].srvfd = UIPC_DISCONNECTED;
@@ -482,7 +439,7 @@
if (uipc_main.ch[ch_id].fd != UIPC_DISCONNECTED)
{
- BTIF_TRACE_EVENT1("CLOSE CONNECTION (FD %d)", uipc_main.ch[ch_id].fd);
+ BTIF_TRACE_EVENT("CLOSE CONNECTION (FD %d)", uipc_main.ch[ch_id].fd);
close(uipc_main.ch[ch_id].fd);
FD_CLR(uipc_main.ch[ch_id].fd, &uipc_main.active_set);
uipc_main.ch[ch_id].fd = UIPC_DISCONNECTED;
@@ -505,7 +462,7 @@
{
if (uipc_main.ch[ch_id].srvfd == UIPC_DISCONNECTED)
{
- BTIF_TRACE_EVENT1("CHANNEL %d ALREADY CLOSED", ch_id);
+ BTIF_TRACE_EVENT("CHANNEL %d ALREADY CLOSED", ch_id);
return;
}
@@ -523,6 +480,8 @@
prctl(PR_SET_NAME, (unsigned long)"uipc-main", 0, 0, 0);
+ raise_priority_a2dp(TASK_UIPC_READ);
+
while (uipc_main.running)
{
uipc_main.read_set = uipc_main.active_set;
@@ -531,12 +490,12 @@
if (result == 0)
{
- BTIF_TRACE_EVENT0("select timeout");
+ BTIF_TRACE_EVENT("select timeout");
continue;
}
else if (result < 0)
{
- BTIF_TRACE_EVENT1("select failed %s", strerror(errno));
+ BTIF_TRACE_EVENT("select failed %s", strerror(errno));
continue;
}
@@ -561,13 +520,13 @@
UIPC_UNLOCK();
}
- BTIF_TRACE_EVENT0("UIPC READ THREAD EXITING");
+ BTIF_TRACE_EVENT("UIPC READ THREAD EXITING");
uipc_main_cleanup();
uipc_main.tid = 0;
- BTIF_TRACE_EVENT0("UIPC READ THREAD DONE");
+ BTIF_TRACE_EVENT("UIPC READ THREAD DONE");
}
@@ -577,7 +536,7 @@
if (pthread_create(&uipc_main.tid, (const pthread_attr_t *) NULL, (void*)uipc_read_task, NULL) < 0)
{
- BTIF_TRACE_ERROR1("uipc_thread_create pthread_create failed:%d", errno);
+ BTIF_TRACE_ERROR("uipc_thread_create pthread_create failed:%d", errno);
return -1;
}
@@ -612,7 +571,7 @@
{
UNUSED(p_data);
- BTIF_TRACE_DEBUG0("UIPC_Init");
+ BTIF_TRACE_DEBUG("UIPC_Init");
memset(&uipc_main, 0, sizeof(tUIPC_MAIN));
@@ -632,7 +591,7 @@
*******************************************************************************/
UDRV_API BOOLEAN UIPC_Open(tUIPC_CH_ID ch_id, tUIPC_RCV_CBACK *p_cback)
{
- BTIF_TRACE_DEBUG2("UIPC_Open : ch_id %d, p_cback %x", ch_id, p_cback);
+ BTIF_TRACE_DEBUG("UIPC_Open : ch_id %d, p_cback %x", ch_id, p_cback);
UIPC_LOCK();
@@ -644,7 +603,7 @@
if (uipc_main.ch[ch_id].srvfd != UIPC_DISCONNECTED)
{
- BTIF_TRACE_EVENT1("CHANNEL %d ALREADY OPEN", ch_id);
+ BTIF_TRACE_EVENT("CHANNEL %d ALREADY OPEN", ch_id);
UIPC_UNLOCK();
return 0;
}
@@ -677,7 +636,7 @@
UDRV_API void UIPC_Close(tUIPC_CH_ID ch_id)
{
- BTIF_TRACE_DEBUG1("UIPC_Close : ch_id %d", ch_id);
+ BTIF_TRACE_DEBUG("UIPC_Close : ch_id %d", ch_id);
/* special case handling uipc shutdown */
if (ch_id != UIPC_CH_ID_ALL)
@@ -688,9 +647,9 @@
}
else
{
- BTIF_TRACE_DEBUG0("UIPC_Close : waiting for shutdown to complete");
+ BTIF_TRACE_DEBUG("UIPC_Close : waiting for shutdown to complete");
uipc_stop_main_server_thread();
- BTIF_TRACE_DEBUG0("UIPC_Close : shutdown complete");
+ BTIF_TRACE_DEBUG("UIPC_Close : shutdown complete");
}
}
@@ -708,7 +667,7 @@
{
UNUSED(p_msg);
- BTIF_TRACE_DEBUG1("UIPC_SendBuf : ch_id %d NOT IMPLEMENTED", ch_id);
+ BTIF_TRACE_DEBUG("UIPC_SendBuf : ch_id %d NOT IMPLEMENTED", ch_id);
UIPC_LOCK();
@@ -734,13 +693,13 @@
int n;
UNUSED(msg_evt);
- BTIF_TRACE_DEBUG2("UIPC_Send : ch_id:%d %d bytes", ch_id, msglen);
+ BTIF_TRACE_DEBUG("UIPC_Send : ch_id:%d %d bytes", ch_id, msglen);
UIPC_LOCK();
if (write(uipc_main.ch[ch_id].fd, p_buf, msglen) < 0)
{
- BTIF_TRACE_ERROR1("failed to write (%s)", strerror(errno));
+ BTIF_TRACE_ERROR("failed to write (%s)", strerror(errno));
}
UIPC_UNLOCK();
@@ -761,7 +720,7 @@
{
UNUSED(p_msg);
- BTIF_TRACE_DEBUG1("UIPC_ReadBuf : ch_id:%d NOT IMPLEMENTED", ch_id);
+ BTIF_TRACE_DEBUG("UIPC_ReadBuf : ch_id:%d NOT IMPLEMENTED", ch_id);
UIPC_LOCK();
UIPC_UNLOCK();
@@ -787,17 +746,17 @@
if (ch_id >= UIPC_CH_NUM)
{
- BTIF_TRACE_ERROR1("UIPC_Read : invalid ch id %d", ch_id);
+ BTIF_TRACE_ERROR("UIPC_Read : invalid ch id %d", ch_id);
return 0;
}
if (fd == UIPC_DISCONNECTED)
{
- BTIF_TRACE_ERROR1("UIPC_Read : channel %d closed", ch_id);
+ BTIF_TRACE_ERROR("UIPC_Read : channel %d closed", ch_id);
return 0;
}
- //BTIF_TRACE_DEBUG4("UIPC_Read : ch_id %d, len %d, fd %d, polltmo %d", ch_id, len,
+ //BTIF_TRACE_DEBUG("UIPC_Read : ch_id %d, len %d, fd %d, polltmo %d", ch_id, len,
// fd, uipc_main.ch[ch_id].read_poll_tmo_ms);
while (n_read < (int)len)
@@ -809,15 +768,15 @@
a read for more than poll timeout */
if (poll(&pfd, 1, uipc_main.ch[ch_id].read_poll_tmo_ms) == 0)
{
- BTIF_TRACE_EVENT1("poll timeout (%d ms)", uipc_main.ch[ch_id].read_poll_tmo_ms);
+ BTIF_TRACE_EVENT("poll timeout (%d ms)", uipc_main.ch[ch_id].read_poll_tmo_ms);
break;
}
- //BTIF_TRACE_EVENT1("poll revents %x", pfd.revents);
+ //BTIF_TRACE_EVENT("poll revents %x", pfd.revents);
if (pfd.revents & (POLLHUP|POLLNVAL) )
{
- BTIF_TRACE_EVENT0("poll : channel detached remotely");
+ BTIF_TRACE_EVENT("poll : channel detached remotely");
UIPC_LOCK();
uipc_close_locked(ch_id);
UIPC_UNLOCK();
@@ -826,11 +785,11 @@
n = recv(fd, p_buf+n_read, len-n_read, 0);
- //BTIF_TRACE_EVENT1("read %d bytes", n);
+ //BTIF_TRACE_EVENT("read %d bytes", n);
if (n == 0)
{
- BTIF_TRACE_EVENT0("UIPC_Read : channel detached remotely");
+ BTIF_TRACE_EVENT("UIPC_Read : channel detached remotely");
UIPC_LOCK();
uipc_close_locked(ch_id);
UIPC_UNLOCK();
@@ -839,7 +798,7 @@
if (n < 0)
{
- BTIF_TRACE_EVENT1("UIPC_Read : read failed (%s)", strerror(errno));
+ BTIF_TRACE_EVENT("UIPC_Read : read failed (%s)", strerror(errno));
return 0;
}
@@ -862,7 +821,7 @@
UDRV_API extern BOOLEAN UIPC_Ioctl(tUIPC_CH_ID ch_id, UINT32 request, void *param)
{
- BTIF_TRACE_DEBUG2("#### UIPC_Ioctl : ch_id %d, request %d ####", ch_id, request);
+ BTIF_TRACE_DEBUG("#### UIPC_Ioctl : ch_id %d, request %d ####", ch_id, request);
UIPC_LOCK();
@@ -873,7 +832,7 @@
break;
case UIPC_REG_CBACK:
- //BTIF_TRACE_EVENT3("register callback ch %d srvfd %d, fd %d", ch_id, uipc_main.ch[ch_id].srvfd, uipc_main.ch[ch_id].fd);
+ //BTIF_TRACE_EVENT("register callback ch %d srvfd %d, fd %d", ch_id, uipc_main.ch[ch_id].srvfd, uipc_main.ch[ch_id].fd);
uipc_main.ch[ch_id].cback = (tUIPC_RCV_CBACK*)param;
break;
@@ -891,12 +850,12 @@
break;
case UIPC_SET_READ_POLL_TMO:
- uipc_main.ch[ch_id].read_poll_tmo_ms = (int)param;
- BTIF_TRACE_EVENT2("UIPC_SET_READ_POLL_TMO : CH %d, TMO %d ms", ch_id, uipc_main.ch[ch_id].read_poll_tmo_ms );
+ uipc_main.ch[ch_id].read_poll_tmo_ms = (intptr_t)param;
+ BTIF_TRACE_EVENT("UIPC_SET_READ_POLL_TMO : CH %d, TMO %d ms", ch_id, uipc_main.ch[ch_id].read_poll_tmo_ms );
break;
default:
- BTIF_TRACE_EVENT1("UIPC_Ioctl : request not handled (%d)", request);
+ BTIF_TRACE_EVENT("UIPC_Ioctl : request not handled (%d)", request);
break;
}
diff --git a/utils/Android.mk b/utils/Android.mk
index c74cd2d..fb337bb 100644
--- a/utils/Android.mk
+++ b/utils/Android.mk
@@ -1,20 +1,20 @@
-LOCAL_PATH:= $(call my-dir)
+LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
-LOCAL_C_INCLUDES:= $(LOCAL_PATH)/include \
- $(LOCAL_PATH)/../gki/ulinux \
- $(bdroid_C_INCLUDES)
+LOCAL_C_INCLUDES := \
+ $(LOCAL_PATH)/include \
+ $(LOCAL_PATH)/../gki/ulinux \
+ $(bdroid_C_INCLUDES)
-LOCAL_CFLAGS += -Werror $(bdroid_CFLAGS)
+LOCAL_CFLAGS += $(bdroid_CFLAGS) -std=c99
-LOCAL_PRELINK_MODULE:=false
-LOCAL_SRC_FILES:= \
- ./src/bt_utils.c
+LOCAL_PRELINK_MODULE :=false
+LOCAL_SRC_FILES := \
+ ./src/bt_utils.c
LOCAL_MODULE := libbt-utils
LOCAL_MODULE_TAGS := optional
-LOCAL_SHARED_LIBRARIES := libcutils liblog libc
-LOCAL_MODULE_CLASS := SHARED_LIBRARIES
+LOCAL_MODULE_CLASS := STATIC_LIBRARIES
-include $(BUILD_SHARED_LIBRARY)
+include $(BUILD_STATIC_LIBRARY)
diff --git a/utils/include/bt_utils.h b/utils/include/bt_utils.h
index d601f2e..f2bd2ed 100644
--- a/utils/include/bt_utils.h
+++ b/utils/include/bt_utils.h
@@ -29,6 +29,8 @@
TASK_HIGH_BTU,
TASK_HIGH_HCI_WORKER,
TASK_HIGH_USERIAL_READ,
+ TASK_UIPC_READ,
+ TASK_JAVA_ALARM,
TASK_HIGH_MAX
} tHIGH_PRIORITY_TASK;
@@ -39,7 +41,6 @@
void bt_utils_init();
void bt_utils_cleanup();
void raise_priority_a2dp(tHIGH_PRIORITY_TASK high_task);
-
+void adjust_priority_a2dp(int start);
#define UNUSED(x) (void)(x)
-
#endif /* BT_UTILS_H */
diff --git a/utils/src/bt_utils.c b/utils/src/bt_utils.c
index aeb9292..ab618b0 100644
--- a/utils/src/bt_utils.c
+++ b/utils/src/bt_utils.c
@@ -50,6 +50,8 @@
static BOOLEAN g_DoSchedulingGroup[TASK_HIGH_MAX];
static pthread_mutex_t gIdxLock;
static int g_TaskIdx;
+static int g_TaskIDs[TASK_HIGH_MAX];
+#define INVALID_TASK_ID (-1)
/*****************************************************************************
**
@@ -67,6 +69,7 @@
for(i = 0; i < TASK_HIGH_MAX; i++) {
g_DoSchedulingGroupOnce[i] = PTHREAD_ONCE_INIT;
g_DoSchedulingGroup[i] = TRUE;
+ g_TaskIDs[i] = INVALID_TASK_ID;
}
pthread_mutexattr_init(&lock_attr);
pthread_mutex_init(&gIdxLock, &lock_attr);
@@ -117,6 +120,7 @@
void raise_priority_a2dp(tHIGH_PRIORITY_TASK high_task) {
int rc = 0;
int tid = gettid();
+ int priority = ANDROID_PRIORITY_AUDIO;
pthread_mutex_lock(&gIdxLock);
g_TaskIdx = high_task;
@@ -124,16 +128,52 @@
pthread_once(&g_DoSchedulingGroupOnce[g_TaskIdx], check_do_scheduling_group);
if (g_DoSchedulingGroup[g_TaskIdx]) {
// set_sched_policy does not support tid == 0
- rc = set_sched_policy(tid, SP_FOREGROUND);
+ rc = set_sched_policy(tid, SP_AUDIO_SYS);
}
+ g_TaskIDs[high_task] = tid;
pthread_mutex_unlock(&gIdxLock);
if (rc) {
ALOGW("failed to change sched policy, tid %d, err: %d", tid, errno);
}
- if (setpriority(PRIO_PROCESS, tid, ANDROID_PRIORITY_AUDIO) < 0) {
- ALOGW("failed to change priority tid: %d to %d", tid, ANDROID_PRIORITY_AUDIO);
+ // always use urgent priority for HCI worker thread until we can adjust
+ // its prio individually. All other threads can be dynamically adjusted voa
+ // adjust_priority_a2dp()
+
+ if (high_task == TASK_HIGH_HCI_WORKER)
+ priority = ANDROID_PRIORITY_URGENT_AUDIO;
+
+ if (setpriority(PRIO_PROCESS, tid, priority) < 0) {
+ ALOGW("failed to change priority tid: %d to %d", tid, priority);
}
}
+/*****************************************************************************
+**
+** Function adjust_priority_a2dp
+**
+** Description increase the a2dp consumer task priority temporarily when start
+** audio playing, to avoid overflow the audio packet queue, restore
+** the a2dp consumer task priority when stop audio playing.
+**
+** Returns void
+**
+*******************************************************************************/
+void adjust_priority_a2dp(int start) {
+ int priority = start ? ANDROID_PRIORITY_URGENT_AUDIO : ANDROID_PRIORITY_AUDIO;
+ int tid;
+ int i;
+
+ for (i = 0; i < TASK_HIGH_MAX; i++)
+ {
+ tid = g_TaskIDs[i];
+ if (tid != INVALID_TASK_ID)
+ {
+ if (setpriority(PRIO_PROCESS, tid, priority) < 0)
+ {
+ ALOGW("failed to change priority tid: %d to %d", tid, priority);
+ }
+ }
+ }
+}
diff --git a/vnd/ble/vendor_ble.c b/vnd/ble/vendor_ble.c
new file mode 100644
index 0000000..61d6780
--- /dev/null
+++ b/vnd/ble/vendor_ble.c
@@ -0,0 +1,757 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2003-2014 Broadcom Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+/*****************************************************************************
+**
+** Name: vendor_ble.c
+**
+** Description: This file contains vendor specific feature for BLE
+**
+******************************************************************************/
+#include <string.h>
+#include "bt_target.h"
+
+#if (BLE_INCLUDED == TRUE)
+#include "bt_types.h"
+#include "hcimsgs.h"
+#include "btu.h"
+#include "vendor_ble.h"
+#include "vendor_hcidefs.h"
+#include "gatt_int.h"
+
+/*** This needs to be moved to a VSC control block eventually per coding conventions ***/
+#if VENDOR_DYNAMIC_MEMORY == FALSE
+tBTM_BLE_VENDOR_CB btm_ble_vendor_cb;
+#endif
+
+static const BD_ADDR na_bda= {0};
+
+/*******************************************************************************
+** Resolve Address Using IRK List functions
+*******************************************************************************/
+
+
+/*******************************************************************************
+**
+** Function btm_ble_vendor_enq_irk_pending
+**
+** Description add target address into IRK pending operation queue
+**
+** Parameters target_bda: target device address
+** add_entry: TRUE for add entry, FALSE for remove entry
+**
+** Returns void
+**
+*******************************************************************************/
+void btm_ble_vendor_enq_irk_pending(BD_ADDR target_bda, BD_ADDR psuedo_bda, UINT8 to_add)
+{
+#if BLE_PRIVACY_SPT == TRUE
+ tBTM_BLE_IRK_Q *p_q = &btm_ble_vendor_cb.irk_pend_q;
+
+ memcpy(p_q->irk_q[p_q->q_next], target_bda, BD_ADDR_LEN);
+ memcpy(p_q->irk_q_random_pseudo[p_q->q_next], psuedo_bda, BD_ADDR_LEN);
+ p_q->irk_q_action[p_q->q_next] = to_add;
+
+ p_q->q_next ++;
+ p_q->q_next %= btm_cb.cmn_ble_vsc_cb.max_irk_list_sz;
+#endif
+ return ;
+}
+/*******************************************************************************
+**
+** Function btm_ble_vendor_find_irk_pending_entry
+**
+** Description check to see if the action is in pending list
+**
+** Parameters TRUE: action pending;
+** FALSE: new action
+**
+** Returns void
+**
+*******************************************************************************/
+BOOLEAN btm_ble_vendor_find_irk_pending_entry(BD_ADDR psuedo_addr, UINT8 action)
+{
+#if BLE_PRIVACY_SPT == TRUE
+ tBTM_BLE_IRK_Q *p_q = &btm_ble_vendor_cb.irk_pend_q;
+ UINT8 i;
+
+ for (i = p_q->q_pending; i != p_q->q_next; )
+ {
+ if (memcmp(p_q->irk_q_random_pseudo[i], psuedo_addr, BD_ADDR_LEN) == 0 &&
+ action == p_q->irk_q_action[i])
+ return TRUE;
+
+ i ++;
+ i %= btm_cb.cmn_ble_vsc_cb.max_irk_list_sz;
+ }
+#endif
+ return FALSE;
+}
+/*******************************************************************************
+**
+** Function btm_ble_vendor_deq_irk_pending
+**
+** Description add target address into IRK pending operation queue
+**
+** Parameters target_bda: target device address
+** add_entry: TRUE for add entry, FALSE for remove entry
+**
+** Returns void
+**
+*******************************************************************************/
+BOOLEAN btm_ble_vendor_deq_irk_pending(BD_ADDR target_bda, BD_ADDR psuedo_addr)
+{
+#if BLE_PRIVACY_SPT == TRUE
+ tBTM_BLE_IRK_Q *p_q = &btm_ble_vendor_cb.irk_pend_q;
+
+ if (p_q->q_next != p_q->q_pending)
+ {
+ memcpy(target_bda, p_q->irk_q[p_q->q_pending], BD_ADDR_LEN);
+ memcpy(psuedo_addr, p_q->irk_q_random_pseudo[p_q->q_pending], BD_ADDR_LEN);
+
+ p_q->q_pending ++;
+ p_q->q_pending %= btm_cb.cmn_ble_vsc_cb.max_irk_list_sz;
+
+ return TRUE;
+ }
+#endif
+ return FALSE;
+
+}
+/*******************************************************************************
+**
+** Function btm_ble_vendor_find_irk_entry
+**
+** Description find IRK entry in local host IRK list by static address
+**
+** Returns IRK list entry pointer
+**
+*******************************************************************************/
+tBTM_BLE_IRK_ENTRY * btm_ble_vendor_find_irk_entry(BD_ADDR target_bda)
+{
+#if BLE_PRIVACY_SPT == TRUE
+ tBTM_BLE_IRK_ENTRY *p_irk_entry = &btm_ble_vendor_cb.irk_list[0];
+ UINT8 i;
+
+ for (i = 0; i < btm_cb.cmn_ble_vsc_cb.max_irk_list_sz; i ++, p_irk_entry++)
+ {
+ if (p_irk_entry->in_use && memcmp(p_irk_entry->bd_addr, target_bda, BD_ADDR_LEN) == 0)
+ {
+ return p_irk_entry ;
+ }
+ }
+#endif
+ return NULL;
+}
+/*******************************************************************************
+**
+** Function btm_ble_vendor_find_irk_entry_by_psuedo_addr
+**
+** Description find IRK entry in local host IRK list by psuedo address
+**
+** Returns IRK list entry pointer
+**
+*******************************************************************************/
+tBTM_BLE_IRK_ENTRY * btm_ble_vendor_find_irk_entry_by_psuedo_addr (BD_ADDR psuedo_bda)
+{
+#if BLE_PRIVACY_SPT == TRUE
+ tBTM_BLE_IRK_ENTRY *p_irk_entry = &btm_ble_vendor_cb.irk_list[0];
+ UINT8 i;
+
+ if(p_irk_entry == NULL)
+ return NULL;
+
+ for (i = 0; i < btm_cb.cmn_ble_vsc_cb.max_irk_list_sz; i ++, p_irk_entry++)
+ {
+ if (p_irk_entry->in_use && memcmp(p_irk_entry->psuedo_bda, psuedo_bda, BD_ADDR_LEN) == 0)
+ {
+ return p_irk_entry ;
+ }
+ }
+#endif
+ return NULL;
+}
+/*******************************************************************************
+**
+** Function btm_ble_vendor_alloc_irk_entry
+**
+** Description allocate IRK entry in local host IRK list
+**
+** Returns IRK list index
+**
+*******************************************************************************/
+UINT8 btm_ble_vendor_alloc_irk_entry(BD_ADDR target_bda, BD_ADDR pseudo_bda)
+{
+#if BLE_PRIVACY_SPT == TRUE
+ tBTM_BLE_IRK_ENTRY *p_irk_entry = &btm_ble_vendor_cb.irk_list[0];
+ UINT8 i;
+
+ for (i = 0; i < btm_cb.cmn_ble_vsc_cb.max_irk_list_sz; i ++, p_irk_entry++)
+ {
+ if (!p_irk_entry->in_use)
+ {
+ memcpy(p_irk_entry->bd_addr, target_bda, BD_ADDR_LEN);
+ memcpy(p_irk_entry->psuedo_bda, pseudo_bda, BD_ADDR_LEN);
+
+ p_irk_entry->index = i;
+ p_irk_entry->in_use = TRUE;
+
+ return i;
+ }
+ }
+#endif
+ return BTM_CS_IRK_LIST_INVALID;
+}
+
+/*******************************************************************************
+**
+** Function btm_ble_vendor_update_irk_list
+**
+** Description update IRK entry in local host IRK list
+**
+** Returns void
+**
+*******************************************************************************/
+void btm_ble_vendor_update_irk_list(BD_ADDR target_bda, BD_ADDR pseudo_bda, BOOLEAN add)
+{
+#if BLE_PRIVACY_SPT == TRUE
+ tBTM_BLE_IRK_ENTRY *p_irk_entry = btm_ble_vendor_find_irk_entry(target_bda);
+ UINT8 i;
+
+ if (add)
+ {
+ if (p_irk_entry == NULL)
+ {
+ if ((i = btm_ble_vendor_alloc_irk_entry(target_bda, pseudo_bda)) == BTM_CS_IRK_LIST_INVALID)
+ {
+ BTM_TRACE_ERROR("max IRK capacity reached");
+ }
+ }
+ else
+ {
+ BTM_TRACE_WARNING(" IRK already in queue");
+ }
+ }
+ else
+ {
+ if (p_irk_entry != NULL)
+ {
+ memset(p_irk_entry, 0, sizeof(tBTM_BLE_IRK_ENTRY));
+ }
+ else
+ {
+ BTM_TRACE_ERROR("No IRK exist in list, can not remove");
+ }
+ }
+#endif
+ return ;
+}
+/*******************************************************************************
+**
+** Function btm_ble_vendor_irk_vsc_op_cmpl
+**
+** Description IRK operation VSC complete handler
+**
+** Parameters
+**
+** Returns void
+**
+*******************************************************************************/
+void btm_ble_vendor_irk_vsc_op_cmpl (tBTM_VSC_CMPL *p_params)
+{
+ UINT8 status;
+ UINT8 *p = p_params->p_param_buf, op_subcode;
+ UINT16 evt_len = p_params->param_len;
+ UINT8 i;
+ tBTM_BLE_VENDOR_CB *p_cb = &btm_ble_vendor_cb;
+ BD_ADDR target_bda, pseudo_bda, rra;
+
+
+ STREAM_TO_UINT8(status, p);
+
+ evt_len--;
+
+ op_subcode = *p ++;
+ BTM_TRACE_DEBUG("btm_ble_vendor_irk_vsc_op_cmpl op_subcode = %d", op_subcode);
+ if (evt_len < 1)
+ {
+ BTM_TRACE_ERROR("cannot interpret IRK VSC cmpl callback");
+ return;
+ }
+
+ if (BTM_BLE_META_IRK_ENABLE == op_subcode)
+ {
+ BTM_TRACE_DEBUG("IRK enable: %d, %d", status, op_subcode);
+ return;
+ }
+ else
+ if (op_subcode == BTM_BLE_META_CLEAR_IRK_LIST)
+ {
+ if (status == HCI_SUCCESS)
+ {
+ STREAM_TO_UINT8(p_cb->irk_avail_size, p);
+ p_cb->irk_list_size = 0;
+
+ BTM_TRACE_DEBUG("p_cb->irk_list_size = %d", p_cb->irk_avail_size);
+
+ for (i = 0; i < btm_cb.cmn_ble_vsc_cb.max_irk_list_sz; i ++)
+ memset(&p_cb->irk_list[i], 0, sizeof(tBTM_BLE_IRK_ENTRY));
+ }
+ }
+ else if (op_subcode == BTM_BLE_META_ADD_IRK_ENTRY)
+ {
+ if (!btm_ble_vendor_deq_irk_pending(target_bda, pseudo_bda))
+ {
+ BTM_TRACE_ERROR("no pending IRK operation");
+ return;
+ }
+
+ if (status == HCI_SUCCESS)
+ {
+ STREAM_TO_UINT8(p_cb->irk_avail_size, p);
+ btm_ble_vendor_update_irk_list(target_bda, pseudo_bda, TRUE);
+ }
+ else if (status == 0x07) /* BT_ERROR_CODE_MEMORY_CAPACITY_EXCEEDED */
+ {
+ p_cb->irk_avail_size = 0;
+ BTM_TRACE_ERROR("IRK Full ");
+ }
+ else
+ {
+ /* give the credit back if invalid parameter failed the operation */
+ p_cb->irk_list_size ++;
+ }
+ }
+ else if (op_subcode == BTM_BLE_META_REMOVE_IRK_ENTRY)
+ {
+ if (!btm_ble_vendor_deq_irk_pending(target_bda, pseudo_bda))
+ {
+ BTM_TRACE_ERROR("no pending IRK operation");
+ return;
+ }
+ if (status == HCI_SUCCESS)
+ {
+ STREAM_TO_UINT8(p_cb->irk_avail_size, p);
+ btm_ble_vendor_update_irk_list(target_bda, pseudo_bda, FALSE);
+ }
+ else
+ {
+ /* give the credit back if invalid parameter failed the operation */
+ if (p_cb->irk_avail_size > 0)
+ p_cb->irk_list_size --;
+ }
+
+ }
+ else if (op_subcode == BTM_BLE_META_READ_IRK_ENTRY)
+ {
+ if (status == HCI_SUCCESS)
+ {
+ //STREAM_TO_UINT8(index, p);
+ p += (1 + 16 + 1); /* skip index, IRK value, address type */
+ STREAM_TO_BDADDR(target_bda, p);
+ STREAM_TO_BDADDR(rra, p);
+ btm_ble_refresh_rra(target_bda, rra);
+ }
+ }
+
+}
+/*******************************************************************************
+**
+** Function btm_ble_remove_irk_entry
+**
+** Description This function to remove an IRK entry from the list
+**
+** Parameters ble_addr_type: address type
+** ble_addr: LE adddress
+**
+** Returns status
+**
+*******************************************************************************/
+tBTM_STATUS btm_ble_remove_irk_entry(tBTM_SEC_DEV_REC *p_dev_rec)
+{
+#if BLE_PRIVACY_SPT == TRUE
+ UINT8 param[20], *p;
+ tBTM_STATUS st;
+ tBTM_BLE_VENDOR_CB *p_cb = &btm_ble_vendor_cb;
+
+ if (btm_cb.cmn_ble_vsc_cb.max_irk_list_sz == 0)
+ return BTM_MODE_UNSUPPORTED;
+
+ p = param;
+ memset(param, 0, 20);
+
+ UINT8_TO_STREAM(p, BTM_BLE_META_REMOVE_IRK_ENTRY);
+ UINT8_TO_STREAM(p, p_dev_rec->ble.static_addr_type);
+ BDADDR_TO_STREAM(p, p_dev_rec->ble.static_addr);
+
+ if ((st = BTM_VendorSpecificCommand (HCI_VENDOR_BLE_RPA_VSC,
+ BTM_BLE_META_REMOVE_IRK_LEN,
+ param,
+ btm_ble_vendor_irk_vsc_op_cmpl))
+ != BTM_NO_RESOURCES)
+ {
+ btm_ble_vendor_enq_irk_pending(p_dev_rec->ble.static_addr, p_dev_rec->bd_addr, FALSE);
+ p_cb->irk_list_size --;
+ }
+
+ return st;
+#endif
+ return BTM_MODE_UNSUPPORTED;
+}
+/*******************************************************************************
+**
+** Function btm_ble_vendor_clear_irk_list
+**
+** Description This function clears the IRK entry list
+**
+** Parameters None.
+**
+** Returns status
+**
+*******************************************************************************/
+tBTM_STATUS btm_ble_vendor_clear_irk_list(void)
+{
+#if BLE_PRIVACY_SPT == TRUE
+ UINT8 param[20], *p;
+ tBTM_STATUS st;
+
+ if (btm_cb.cmn_ble_vsc_cb.max_irk_list_sz == 0)
+ return BTM_MODE_UNSUPPORTED;
+
+ p = param;
+ memset(param, 0, 20);
+
+ UINT8_TO_STREAM(p, BTM_BLE_META_CLEAR_IRK_LIST);
+
+ st = BTM_VendorSpecificCommand (HCI_VENDOR_BLE_RPA_VSC,
+ BTM_BLE_META_CLEAR_IRK_LEN,
+ param,
+ btm_ble_vendor_irk_vsc_op_cmpl);
+
+ return st;
+#endif
+ return BTM_MODE_UNSUPPORTED;
+}
+/*******************************************************************************
+**
+** Function btm_ble_read_irk_entry
+**
+** Description This function read an IRK entry by index
+**
+** Parameters entry index.
+**
+** Returns status
+**
+*******************************************************************************/
+tBTM_STATUS btm_ble_read_irk_entry(BD_ADDR target_bda)
+{
+#if BLE_PRIVACY_SPT == TRUE
+ UINT8 param[20], *p;
+ tBTM_STATUS st = BTM_UNKNOWN_ADDR;
+ tBTM_BLE_IRK_ENTRY *p_entry;
+
+ if (btm_cb.cmn_ble_vsc_cb.max_irk_list_sz == 0)
+ return BTM_MODE_UNSUPPORTED;
+
+ if ((p_entry = btm_ble_vendor_find_irk_entry(target_bda)) == NULL)
+ return st;
+
+ p = param;
+ memset(param, 0, 20);
+
+ UINT8_TO_STREAM(p, BTM_BLE_META_READ_IRK_ENTRY);
+ UINT8_TO_STREAM(p, p_entry->index);
+
+ st = BTM_VendorSpecificCommand (HCI_VENDOR_BLE_RPA_VSC,
+ BTM_BLE_META_READ_IRK_LEN,
+ param,
+ btm_ble_vendor_irk_vsc_op_cmpl);
+
+ return st;
+#endif
+ return BTM_MODE_UNSUPPORTED;
+}
+
+
+/*******************************************************************************
+**
+** Function btm_ble_vendor_enable_irk_list_known_dev
+**
+** Description This function add all known device with random address into
+** IRK list.
+**
+** Parameters enable: enable IRK list with known device, or disable it
+**
+** Returns status
+**
+*******************************************************************************/
+void btm_ble_vendor_irk_list_known_dev(BOOLEAN enable)
+{
+#if BLE_PRIVACY_SPT == TRUE
+ UINT8 i;
+ UINT8 count = 0;
+ tBTM_SEC_DEV_REC *p_dev_rec = &btm_cb.sec_dev_rec[0];
+
+ if (btm_cb.cmn_ble_vsc_cb.max_irk_list_sz == 0)
+ return;
+
+ /* add all known device with random address into IRK list */
+ for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i ++, p_dev_rec ++)
+ {
+ if (p_dev_rec->sec_flags & BTM_SEC_IN_USE)
+ {
+ if (btm_ble_vendor_irk_list_load_dev(p_dev_rec))
+ count ++;
+ }
+ }
+
+ if ((count > 0 && enable) || !enable)
+ btm_ble_vendor_enable_irk_feature(enable);
+#endif
+ return ;
+}
+/*******************************************************************************
+**
+** Function btm_ble_vendor_irk_list_load_dev
+**
+** Description This function add a device which is using RPA into white list
+**
+** Parameters
+**
+** Returns status
+**
+*******************************************************************************/
+BOOLEAN btm_ble_vendor_irk_list_load_dev(tBTM_SEC_DEV_REC *p_dev_rec)
+{
+#if BLE_PRIVACY_SPT == TRUE
+ UINT8 param[40], *p;
+ tBTM_BLE_VENDOR_CB *p_cb = &btm_ble_vendor_cb;
+ BOOLEAN rt = FALSE;
+ tBTM_BLE_IRK_ENTRY *p_irk_entry = NULL;
+ BTM_TRACE_DEBUG ("btm_ble_vendor_irk_list_load_dev:max_irk_size=%d", p_cb->irk_avail_size);
+ memset(param, 0, 40);
+
+ if (btm_cb.cmn_ble_vsc_cb.max_irk_list_sz == 0)
+ return FALSE;
+
+ if (p_dev_rec != NULL && /* RPA is being used and PID is known */
+ (p_dev_rec->ble.key_type & BTM_LE_KEY_PID) != 0)
+ {
+
+ if ((p_irk_entry = btm_ble_vendor_find_irk_entry_by_psuedo_addr(p_dev_rec->bd_addr)) == NULL &&
+ btm_ble_vendor_find_irk_pending_entry(p_dev_rec->bd_addr, TRUE) == FALSE)
+ {
+
+ if (p_cb->irk_avail_size > 0)
+ {
+ p = param;
+
+ UINT8_TO_STREAM(p, BTM_BLE_META_ADD_IRK_ENTRY);
+ ARRAY_TO_STREAM(p, p_dev_rec->ble.keys.irk, BT_OCTET16_LEN);
+ UINT8_TO_STREAM(p, p_dev_rec->ble.static_addr_type);
+ BDADDR_TO_STREAM(p,p_dev_rec->ble.static_addr);
+
+ if (BTM_VendorSpecificCommand (HCI_VENDOR_BLE_RPA_VSC,
+ BTM_BLE_META_ADD_IRK_LEN,
+ param,
+ btm_ble_vendor_irk_vsc_op_cmpl)
+ != BTM_NO_RESOURCES)
+ {
+ btm_ble_vendor_enq_irk_pending(p_dev_rec->ble.static_addr, p_dev_rec->bd_addr, TRUE);
+ p_cb->irk_list_size ++;
+ rt = TRUE;
+
+ btm_ble_vendor_enable_irk_feature(TRUE);
+ }
+ }
+ }
+ else
+ {
+ BTM_TRACE_ERROR("Device already in IRK list");
+ rt = TRUE;
+ }
+ }
+ else
+ {
+ BTM_TRACE_DEBUG("Device not a RPA enabled device");
+ }
+ return rt;
+#endif
+ return FALSE;
+}
+/*******************************************************************************
+**
+** Function btm_ble_vendor_irk_list_remove_dev
+**
+** Description This function remove the device from IRK list
+**
+** Parameters
+**
+** Returns status
+**
+*******************************************************************************/
+void btm_ble_vendor_irk_list_remove_dev(tBTM_SEC_DEV_REC *p_dev_rec)
+{
+#if BLE_PRIVACY_SPT == TRUE
+ tBTM_BLE_VENDOR_CB *p_cs_cb = &btm_ble_vendor_cb;
+ tBTM_BLE_IRK_ENTRY *p_irk_entry;
+
+ if (btm_cb.cmn_ble_vsc_cb.max_irk_list_sz == 0)
+ return;
+
+ if ((p_irk_entry = btm_ble_vendor_find_irk_entry_by_psuedo_addr(p_dev_rec->bd_addr)) != NULL &&
+ btm_ble_vendor_find_irk_pending_entry(p_dev_rec->bd_addr, FALSE) == FALSE)
+ {
+ btm_ble_remove_irk_entry(p_dev_rec);
+ }
+ else
+ {
+ BTM_TRACE_ERROR("Device not in IRK list");
+ }
+
+ if (p_cs_cb->irk_list_size == 0)
+ btm_ble_vendor_enable_irk_feature(FALSE);
+#endif
+}
+/*******************************************************************************
+**
+** Function btm_ble_vendor_disable_irk_list
+**
+** Description disable LE resolve address feature
+**
+** Parameters
+**
+** Returns status
+**
+*******************************************************************************/
+void btm_ble_vendor_disable_irk_list(void)
+{
+#if BLE_PRIVACY_SPT == TRUE
+ btm_ble_vendor_enable_irk_feature(FALSE);
+#endif
+}
+
+/*******************************************************************************
+**
+** Function btm_ble_vendor_enable_irk_feature
+**
+** Description This function is called to enable or disable the RRA
+** offloading feature.
+**
+** Parameters enable: enable or disable the RRA offloading feature
+**
+** Returns BTM_SUCCESS if successful
+**
+*******************************************************************************/
+tBTM_STATUS btm_ble_vendor_enable_irk_feature(BOOLEAN enable)
+{
+#if BLE_PRIVACY_SPT == TRUE
+ UINT8 param[20], *p;
+ tBTM_STATUS st = BTM_WRONG_MODE;
+ tBTM_BLE_PF_COUNT *p_bda_filter;
+
+ if (btm_cb.cmn_ble_vsc_cb.max_irk_list_sz == 0)
+ return BTM_MODE_UNSUPPORTED;
+
+ if (btm_ble_vendor_cb.enable != enable)
+ {
+ p = param;
+ memset(param, 0, 20);
+
+ /* select feature based on control block settings */
+ UINT8_TO_STREAM(p, BTM_BLE_META_IRK_ENABLE);
+ UINT8_TO_STREAM(p, enable ? 0x01 : 0x00);
+
+ st = BTM_VendorSpecificCommand (HCI_VENDOR_BLE_RPA_VSC, BTM_BLE_IRK_ENABLE_LEN,
+ param, btm_ble_vendor_irk_vsc_op_cmpl);
+
+ btm_ble_vendor_cb.enable = enable;
+ }
+
+ return st;
+#endif
+ return BTM_MODE_UNSUPPORTED;
+}
+
+
+/*******************************************************************************
+**
+** Function btm_ble_vendor_init
+**
+** Description Initialize customer specific feature information in host stack
+**
+** Parameters Max IRK list size
+** Max filter supported
+**
+** Returns void
+**
+*******************************************************************************/
+void btm_ble_vendor_init(UINT8 max_irk_list_sz)
+{
+ memset(&btm_ble_vendor_cb, 0, sizeof(tBTM_BLE_VENDOR_CB));
+
+#if BLE_PRIVACY_SPT == TRUE
+ if (max_irk_list_sz > 0)
+ {
+ btm_ble_vendor_cb.irk_list = (tBTM_BLE_IRK_ENTRY*)GKI_getbuf (sizeof (tBTM_BLE_IRK_ENTRY)
+ * max_irk_list_sz);
+ btm_ble_vendor_cb.irk_pend_q.irk_q = (BD_ADDR*) GKI_getbuf (sizeof (BD_ADDR) *
+ max_irk_list_sz);
+ btm_ble_vendor_cb.irk_pend_q.irk_q_random_pseudo = (BD_ADDR*)GKI_getbuf (sizeof (BD_ADDR) *
+ max_irk_list_sz);
+ btm_ble_vendor_cb.irk_pend_q.irk_q_action = (UINT8*) GKI_getbuf (max_irk_list_sz);
+ }
+
+ btm_ble_vendor_cb.irk_avail_size = max_irk_list_sz;
+
+ if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
+ return;
+#endif
+}
+
+/*******************************************************************************
+**
+** Function btm_ble_vendor_cleanup
+**
+** Description Cleanup VSC specific dynamic memory
+**
+** Parameters
+**
+** Returns void
+**
+*******************************************************************************/
+void btm_ble_vendor_cleanup(void)
+{
+#if BLE_PRIVACY_SPT == TRUE
+ if (btm_ble_vendor_cb.irk_list)
+ GKI_freebuf(btm_ble_vendor_cb.irk_list);
+
+ if (btm_ble_vendor_cb.irk_pend_q.irk_q)
+ GKI_freebuf(btm_ble_vendor_cb.irk_pend_q.irk_q);
+
+ if (btm_ble_vendor_cb.irk_pend_q.irk_q_random_pseudo)
+ GKI_freebuf(btm_ble_vendor_cb.irk_pend_q.irk_q_random_pseudo);
+
+ if (btm_ble_vendor_cb.irk_pend_q.irk_q_action)
+ GKI_freebuf(btm_ble_vendor_cb.irk_pend_q.irk_q_action);
+#endif
+ memset(&btm_ble_vendor_cb, 0, sizeof(tBTM_BLE_VENDOR_CB));
+}
+
+#endif
+
diff --git a/vnd/ble/vendor_hcidefs.h b/vnd/ble/vendor_hcidefs.h
new file mode 100644
index 0000000..b5e770b
--- /dev/null
+++ b/vnd/ble/vendor_hcidefs.h
@@ -0,0 +1,54 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2003-2014 Broadcom Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+/*****************************************************************************
+**
+** Name vendor_hcidefs.h
+**
+** Function This file contains Broadcom Specific Host Controller Interface
+** definitions.
+**
+******************************************************************************/
+
+#ifndef VENDOR_HCIDEFS_H
+#define VENDOR_HCIDEFS_H
+
+/*****************************************************************************
+** Private address resolution VSC
+******************************************************************************/
+
+/* VSC */
+#define HCI_VENDOR_BLE_RPA_VSC (0x0155 | HCI_GRP_VENDOR_SPECIFIC)
+
+/* Sub codes */
+#define HCI_VENDOR_BLE_RPA_ENABLE 0x01
+#define HCI_VENDOR_BLE_RPA_ADD_IRK 0x02
+#define HCI_VENDOR_BLE_RPA_REMOVE_IRK 0x03
+#define HCI_VENDOR_BLE_RPA_CLEAR_IRK 0x04
+#define HCI_VENDOR_BLE_RPA_READ_IRK 0x05
+
+
+/*****************************************************************************
+** Advertising data payload filter VSC
+******************************************************************************/
+
+/* VSC */
+#define HCI_VENDOR_BLE_PCF_VSC (0x0157 | HCI_GRP_VENDOR_SPECIFIC)
+
+#endif
+
diff --git a/vnd/include/vendor_api.h b/vnd/include/vendor_api.h
new file mode 100644
index 0000000..12519cd
--- /dev/null
+++ b/vnd/include/vendor_api.h
@@ -0,0 +1,50 @@
+/****************************************************************************
+**
+** Name: vendor_api.h
+**
+** Description: Vendor specific BTE API function external definitions.
+**
+** Copyright (c) 2009-2011, BROADCOM Inc., All Rights Reserved.
+** Broadcom Bluetooth Core. Proprietary and confidential.
+**
+******************************************************************************/
+#ifndef VENDOR_API_H
+#define VENDOR_API_H
+
+#include "bt_types.h"
+#include "btm_api.h"
+
+/****************************************************************************
+** Resolvable private address offload VSC specific definitions
+******************************************************************************/
+
+enum
+{
+ BTM_BLE_PRIVACY_ENABLE,
+ BTM_BLE_PRIVACY_DISABLE
+};
+
+
+/****************************************************************************
+** Advertising packet filter VSC specific definitions
+******************************************************************************/
+
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*****************************************************************************
+** VENDOR SPECIFIC BLE FEATURE FUNCTIONS
+******************************************************************************/
+#if BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE
+
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/vnd/include/vendor_ble.h b/vnd/include/vendor_ble.h
new file mode 100644
index 0000000..6207c84
--- /dev/null
+++ b/vnd/include/vendor_ble.h
@@ -0,0 +1,132 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2003-2014 Broadcom Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+/*****************************************************************************
+**
+** Name: vendor_ble.h
+**
+** Description: This file contains vendor specific feature header
+** for BLE
+******************************************************************************/
+#ifndef VENDOR_BLE_H
+#define VENDOR_BLE_H
+
+#include "btm_int.h"
+#include "btm_ble_api.h"
+#include "vendor_api.h"
+
+/* RPA offload VSC specifics */
+#define BTM_BLE_META_IRK_ENABLE 0x01
+#define BTM_BLE_META_ADD_IRK_ENTRY 0x02
+#define BTM_BLE_META_REMOVE_IRK_ENTRY 0x03
+#define BTM_BLE_META_CLEAR_IRK_LIST 0x04
+#define BTM_BLE_META_READ_IRK_ENTRY 0x05
+#define BTM_BLE_META_CS_RESOLVE_ADDR 0x00000001
+#define BTM_BLE_IRK_ENABLE_LEN 2
+
+/* BLE meta vsc header: 1 bytes of sub_code, 1 byte of PCF action */
+#define BTM_BLE_META_HDR_LENGTH 3
+#define BTM_BLE_PF_FEAT_SEL_LEN 18
+#define BTM_BLE_PCF_ENABLE_LEN 2
+#define BTM_BLE_META_ADDR_LEN 7
+#define BTM_BLE_META_UUID_LEN 40
+#define BTM_BLE_META_ADD_IRK_LEN 24
+#define BTM_BLE_META_REMOVE_IRK_LEN 8
+#define BTM_BLE_META_CLEAR_IRK_LEN 1
+#define BTM_BLE_META_READ_IRK_LEN 2
+#define BTM_BLE_META_ADD_WL_ATTR_LEN 9
+
+#define BTM_BLE_PF_SELECT_NONE 0
+#define BTM_BLE_PF_ADDR_FILTER_BIT BTM_BLE_PF_BIT_TO_MASK(BTM_BLE_PF_ADDR_FILTER)
+#define BTM_BLE_PF_SRVC_DATA_BIT BTM_BLE_PF_BIT_TO_MASK(BTM_BLE_PF_SRVC_DATA)
+#define BTM_BLE_PF_SRVC_UUID_BIT BTM_BLE_PF_BIT_TO_MASK(BTM_BLE_PF_SRVC_UUID)
+#define BTM_BLE_PF_SRVC_SOL_UUID_BIT BTM_BLE_PF_BIT_TO_MASK(BTM_BLE_PF_SRVC_SOL_UUID)
+#define BTM_BLE_PF_LOCAL_NAME_BIT BTM_BLE_PF_BIT_TO_MASK(BTM_BLE_PF_LOCAL_NAME)
+#define BTM_BLE_PF_MANU_DATA_BIT BTM_BLE_PF_BIT_TO_MASK(BTM_BLE_PF_MANU_DATA)
+#define BTM_BLE_PF_SRVC_DATA_PATTERN_BIT BTM_BLE_PF_BIT_TO_MASK(BTM_BLE_PF_SRVC_DATA_PATTERN)
+typedef UINT8 tBTM_BLE_PF_SEL_MASK;
+
+#define BTM_BLE_MAX_FILTER_COUNTER (BTM_BLE_MAX_ADDR_FILTER + 1) /* per device filter + one generic filter indexed by 0 */
+
+#define BTM_CS_IRK_LIST_INVALID 0xff
+
+typedef struct
+{
+ BOOLEAN in_use;
+ BD_ADDR bd_addr; /* must be the address used in controller */
+ BD_ADDR psuedo_bda; /* the random pseudo address */
+ UINT8 index;
+}tBTM_BLE_IRK_ENTRY;
+
+
+typedef struct
+{
+ BD_ADDR *irk_q;
+ BD_ADDR *irk_q_random_pseudo;
+ UINT8 *irk_q_action;
+ UINT8 q_next;
+ UINT8 q_pending;
+} tBTM_BLE_IRK_Q;
+
+/* control block for BLE customer specific feature */
+typedef struct
+{
+ BOOLEAN enable;
+
+ UINT8 op_type;
+ tBLE_BD_ADDR cur_filter_target;
+
+ UINT8 irk_list_size;
+ UINT8 irk_avail_size;
+ tBTM_BLE_IRK_ENTRY *irk_list;
+ tBTM_BLE_IRK_Q irk_pend_q;
+ UINT8 max_filter_supported;
+ tBTM_BLE_PF_CMPL_CBACK *p_scan_pf_cback;
+}tBTM_BLE_VENDOR_CB;
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#if VENDOR_DYNAMIC_MEMORY == FALSE
+BTM_API extern tBTM_BLE_VENDOR_CB btm_ble_vendor_cb;
+#else
+BTM_API extern tBTM_BLE_VENDOR_CB *btm_ble_vendor_ptr;
+#define btm_ble_vendor_cb (*btm_ble_vendor_ptr)
+#endif
+
+extern void btm_ble_vendor_irk_list_known_dev(BOOLEAN enable);
+extern tBTM_STATUS btm_ble_read_irk_entry(BD_ADDR target_bda);
+extern void btm_ble_vendor_disable_irk_list(void);
+extern BOOLEAN btm_ble_vendor_irk_list_load_dev(tBTM_SEC_DEV_REC *p_dev_rec);
+extern void btm_ble_vendor_irk_list_remove_dev(tBTM_SEC_DEV_REC *p_dev_rec);
+extern tBTM_STATUS btm_ble_enable_vendor_feature (BOOLEAN enable, UINT32 feature_bit);
+
+extern void btm_ble_vendor_init(UINT8 max_irk_list_sz);
+extern void btm_ble_vendor_cleanup(void);
+extern BOOLEAN btm_ble_vendor_write_device_wl_attribute (tBLE_ADDR_TYPE addr_type, BD_ADDR bd_addr, UINT8 attribute);
+extern tBTM_STATUS btm_ble_vendor_enable_irk_feature(BOOLEAN enable);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+