Linux bluetooth development
 help / color / mirror / Atom feed
* [PATCH v4 07/11] unit/test-hfp: Provide test_handler function via struct data
From: Lukasz Rymanowski @ 2014-10-09 23:50 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Lukasz Rymanowski
In-Reply-To: <1412898611-12199-1-git-send-email-lukasz.rymanowski@tieto.com>

This patch allows us to use user defined test handler depends on needs.
Will use it in following patches which implements tests for HFP HF.
---
 unit/test-hfp.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/unit/test-hfp.c b/unit/test-hfp.c
index a8801b0..4b3473b 100644
--- a/unit/test-hfp.c
+++ b/unit/test-hfp.c
@@ -52,6 +52,7 @@ struct test_data {
 	char *test_name;
 	struct test_pdu *pdu_list;
 	hfp_result_func_t result_func;
+	GIOFunc test_handler;
 };
 
 #define data(args...) ((const unsigned char[]) { args })
@@ -95,6 +96,7 @@ struct test_data {
 		data.result_func = result_function;			\
 		memcpy(data.pdu_list, pdus, sizeof(pdus));		\
 		g_test_add_data_func(name, &data, function);		\
+		data.test_handler = test_handler;			\
 	} while (0)
 
 static void context_quit(struct context *context)
@@ -158,6 +160,7 @@ static struct context *create_context(gconstpointer data)
 	struct context *context = g_new0(struct context, 1);
 	GIOChannel *channel;
 	int err, sv[2];
+	const struct test_data *d = data;
 
 	context->main_loop = g_main_loop_new(NULL, FALSE);
 	g_assert(context->main_loop);
@@ -173,7 +176,8 @@ static struct context *create_context(gconstpointer data)
 
 	context->watch_id = g_io_add_watch(channel,
 				G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_NVAL,
-				test_handler, context);
+				d->test_handler, context);
+
 	g_assert(context->watch_id > 0);
 
 	g_io_channel_unref(channel);
-- 
1.8.4


^ permalink raw reply related

* [PATCH v4 06/11] shared/hfp: Add send AT command API for HFP HF
From: Lukasz Rymanowski @ 2014-10-09 23:50 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Lukasz Rymanowski
In-Reply-To: <1412898611-12199-1-git-send-email-lukasz.rymanowski@tieto.com>

This patch adds handling send and response of AT command.
Note that we always wait for AT command response before sending next
command, however user can fill hfp_hf with more than one command.
All the commands are queued and send one by one.
---
 src/shared/hfp.c | 175 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/shared/hfp.h |   8 +++
 2 files changed, 183 insertions(+)

diff --git a/src/shared/hfp.c b/src/shared/hfp.c
index 5179092..8bebe97 100644
--- a/src/shared/hfp.c
+++ b/src/shared/hfp.c
@@ -70,6 +70,9 @@ struct hfp_hf {
 	struct ringbuf *read_buf;
 	struct ringbuf *write_buf;
 
+	bool writer_active;
+	struct queue *cmd_queue;
+
 	struct queue *event_handlers;
 
 	hfp_debug_func_t debug_callback;
@@ -101,6 +104,14 @@ struct hfp_hf_result {
 	unsigned int offset;
 };
 
+struct cmd_response {
+	char *prefix;
+	hfp_response_func_t resp_cb;
+	struct hfp_hf_result *response;
+	char *resp_data;
+	void *user_data;
+};
+
 struct event_handler {
 	char *prefix;
 	void *user_data;
@@ -868,17 +879,103 @@ static void destroy_event_handler(void *data)
 	free(handler);
 }
 
+static bool hf_can_write_data(struct io *io, void *user_data)
+{
+	struct hfp_hf *hfp = user_data;
+	ssize_t bytes_written;
+
+	bytes_written = ringbuf_write(hfp->write_buf, hfp->fd);
+	if (bytes_written < 0)
+		return false;
+
+	if (ringbuf_len(hfp->write_buf) > 0)
+		return true;
+
+	return false;
+}
+
+static void hf_write_watch_destroy(void *user_data)
+{
+	struct hfp_hf *hfp = user_data;
+
+	hfp->writer_active = false;
+}
+
 static void hf_skip_whitespace(struct hfp_hf_result *result)
 {
 	while (result->data[result->offset] == ' ')
 		result->offset++;
 }
 
+static bool is_response(const char *prefix, enum hfp_result *result)
+{
+	if (strcmp(prefix, "OK") == 0) {
+		*result = HFP_RESULT_OK;
+		return true;
+	}
+
+	if (strcmp(prefix, "ERROR") == 0) {
+		*result = HFP_RESULT_ERROR;
+		return true;
+	}
+
+	if (strcmp(prefix, "NO CARRIER") == 0) {
+		*result = HFP_RESULT_NO_CARRIER;
+		return true;
+	}
+
+	if (strcmp(prefix, "CONNECT") == 0) {
+		*result = HFP_RESULT_CONNECT;
+		return true;
+	}
+
+	if (strcmp(prefix, "NO ANSWER") == 0) {
+		*result = HFP_RESULT_NO_ANSWER;
+		return true;
+	}
+
+	if (strcmp(prefix, "DELAYED") == 0) {
+		*result = HFP_RESULT_DELAYED;
+		return true;
+	}
+
+	if (strcmp(prefix, "BLACKLISTED") == 0) {
+		*result = HFP_RESULT_BLACKLISTED;
+		return true;
+	}
+
+	return false;
+}
+
+static void hf_wakeup_writer(struct hfp_hf *hfp)
+{
+	if (hfp->writer_active)
+		return;
+
+	if (!ringbuf_len(hfp->write_buf))
+		return;
+
+	if (!io_set_write_handler(hfp->io, hf_can_write_data,
+					hfp, hf_write_watch_destroy))
+		return;
+
+	hfp->writer_active = true;
+}
+
+static void destroy_cmd_response(void *data)
+{
+	struct cmd_response *cmd = data;
+
+	free(cmd->prefix);
+	free(cmd);
+}
+
 static void hf_call_prefix_handler(struct hfp_hf *hfp, const char *data)
 {
 	struct event_handler *handler;
 	const char *separators = ";:\0";
 	struct hfp_hf_result result_data;
+	enum hfp_result result;
 	char lookup_prefix[18];
 	uint8_t pref_len = 0;
 	const char *prefix;
@@ -904,6 +1001,22 @@ static void hf_call_prefix_handler(struct hfp_hf *hfp, const char *data)
 	lookup_prefix[pref_len] = '\0';
 	result_data.offset += pref_len + 1;
 
+	if (is_response(lookup_prefix, &result)) {
+		struct cmd_response *cmd;
+
+		cmd = queue_peek_head(hfp->cmd_queue);
+		if (!cmd)
+			return;
+
+		cmd->resp_cb(cmd->prefix, result, cmd->user_data);
+
+		queue_remove(hfp->cmd_queue, cmd);
+		destroy_cmd_response(cmd);
+
+		hf_wakeup_writer(hfp);
+		return;
+	}
+
 	handler = queue_find(hfp->event_handlers, match_handler_event_prefix,
 								lookup_prefix);
 	if (!handler)
@@ -1032,6 +1145,18 @@ struct hfp_hf *hfp_hf_new(int fd)
 		return NULL;
 	}
 
+	hfp->cmd_queue = queue_new();
+	if (!hfp->cmd_queue) {
+		io_destroy(hfp->io);
+		ringbuf_free(hfp->write_buf);
+		ringbuf_free(hfp->read_buf);
+		queue_destroy(hfp->event_handlers, NULL);
+		free(hfp);
+		return NULL;
+	}
+
+	hfp->writer_active = false;
+
 	if (!io_set_read_handler(hfp->io, hf_can_read_data, hfp,
 							read_watch_destroy)) {
 		queue_destroy(hfp->event_handlers,
@@ -1083,6 +1208,9 @@ void hfp_hf_unref(struct hfp_hf *hfp)
 	queue_destroy(hfp->event_handlers, destroy_event_handler);
 	hfp->event_handlers = NULL;
 
+	queue_destroy(hfp->cmd_queue, destroy_cmd_response);
+	hfp->cmd_queue = NULL;
+
 	if (!hfp->in_disconnect) {
 		free(hfp);
 		return;
@@ -1142,6 +1270,53 @@ bool hfp_hf_set_close_on_unref(struct hfp_hf *hfp, bool do_close)
 	return true;
 }
 
+bool hfp_hf_send_command(struct hfp_hf *hfp, hfp_response_func_t resp_cb,
+				void *user_data, const char *format, ...)
+{
+	va_list ap;
+	char *fmt;
+	int len;
+	const char *separators = ";?=\0";
+	uint8_t prefix_len;
+	struct cmd_response *cmd;
+
+	if (!hfp || !format || !resp_cb)
+		return false;
+
+	if (asprintf(&fmt, "%s\r", format) < 0)
+		return false;
+
+	cmd = new0(struct cmd_response, 1);
+	if (!cmd)
+		return false;
+
+	va_start(ap, format);
+	len = ringbuf_vprintf(hfp->write_buf, fmt, ap);
+	va_end(ap);
+
+	free(fmt);
+
+	if (len < 0) {
+		free(cmd);
+		return false;
+	}
+
+	prefix_len = strcspn(format, separators);
+	cmd->prefix = strndup(format, prefix_len);
+	cmd->resp_cb = resp_cb;
+	cmd->user_data = user_data;
+
+	if (!queue_push_tail(hfp->cmd_queue, cmd)) {
+		ringbuf_drain(hfp->write_buf, len);
+		free(cmd);
+		return false;
+	}
+
+	hf_wakeup_writer(hfp);
+
+	return true;
+}
+
 bool hfp_hf_register(struct hfp_hf *hfp, hfp_hf_result_func_t callback,
 						const char *prefix,
 						void *user_data,
diff --git a/src/shared/hfp.h b/src/shared/hfp.h
index 85037b1..5ee3017 100644
--- a/src/shared/hfp.h
+++ b/src/shared/hfp.h
@@ -32,6 +32,8 @@ enum hfp_result {
 	HFP_RESULT_NO_DIALTONE	= 6,
 	HFP_RESULT_BUSY		= 7,
 	HFP_RESULT_NO_ANSWER	= 8,
+	HFP_RESULT_DELAYED	= 9,
+	HFP_RESULT_BLACKLISTED	= 10,
 };
 
 enum hfp_error {
@@ -83,6 +85,10 @@ typedef void (*hfp_command_func_t)(const char *command, void *user_data);
 
 typedef void (*hfp_disconnect_func_t)(void *user_data);
 
+typedef void (*hfp_response_func_t)(const char *prefix,
+							enum hfp_result result,
+							void *user_data);
+
 struct hfp_gw;
 struct hfp_hf;
 
@@ -146,3 +152,5 @@ bool hfp_hf_register(struct hfp_hf *hfp, hfp_hf_result_func_t callback,
 					const char *prefix, void *user_data,
 					hfp_destroy_func_t destroy);
 bool hfp_hf_unregister(struct hfp_hf *hfp, const char *prefix);
+bool hfp_hf_send_command(struct hfp_hf *hfp, hfp_response_func_t resp_cb,
+				void *user_data, const char *format, ...);
-- 
1.8.4


^ permalink raw reply related

* [PATCH v4 05/11] shared/hfp: Add HFP HF parser
From: Lukasz Rymanowski @ 2014-10-09 23:50 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Lukasz Rymanowski
In-Reply-To: <1412898611-12199-1-git-send-email-lukasz.rymanowski@tieto.com>

This patch adds parser for AT responses and unsolicited results.
---
 src/shared/hfp.c | 129 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 129 insertions(+)

diff --git a/src/shared/hfp.c b/src/shared/hfp.c
index b1cf08e..5179092 100644
--- a/src/shared/hfp.c
+++ b/src/shared/hfp.c
@@ -868,6 +868,126 @@ static void destroy_event_handler(void *data)
 	free(handler);
 }
 
+static void hf_skip_whitespace(struct hfp_hf_result *result)
+{
+	while (result->data[result->offset] == ' ')
+		result->offset++;
+}
+
+static void hf_call_prefix_handler(struct hfp_hf *hfp, const char *data)
+{
+	struct event_handler *handler;
+	const char *separators = ";:\0";
+	struct hfp_hf_result result_data;
+	char lookup_prefix[18];
+	uint8_t pref_len = 0;
+	const char *prefix;
+	int i;
+
+	result_data.offset = 0;
+	result_data.data = data;
+
+	hf_skip_whitespace(&result_data);
+
+	if (strlen(data + result_data.offset) < 2)
+		return;
+
+	prefix = data + result_data.offset;
+
+	pref_len = strcspn(prefix, separators);
+	if (pref_len > 17 || pref_len < 2)
+		return;
+
+	for (i = 0; i < pref_len; i++)
+		lookup_prefix[i] = toupper(prefix[i]);
+
+	lookup_prefix[pref_len] = '\0';
+	result_data.offset += pref_len + 1;
+
+	handler = queue_find(hfp->event_handlers, match_handler_event_prefix,
+								lookup_prefix);
+	if (!handler)
+		return;
+
+	handler->callback(&result_data, handler->user_data);
+}
+
+static char *find_cr_lf(char *str, size_t len)
+{
+	char *ptr;
+	int count;
+	int offset;
+
+	offset = 0;
+
+	ptr = memchr(str, '\r', len);
+	while (ptr) {
+		/*
+		 * Check if there is more data after '\r'. If so check for
+		 * '\n'
+		 */
+		count = ptr-str;
+		if ((count < (int) (len - 1)) && *(ptr + 1) == '\n')
+			return ptr;
+
+		/* There is only '\r'? Let's try to find next one */
+		offset += count + 1;
+
+		if (offset >= (int)len)
+			return NULL;
+
+		ptr = memchr(str + offset, '\r', len - offset);
+	}
+
+	return NULL;
+}
+
+static void hf_process_input(struct hfp_hf *hfp)
+{
+	char *str, *ptr;
+	size_t len, count, offset;
+
+	str = ringbuf_peek(hfp->read_buf, 0, &len);
+	if (!str)
+		return;
+
+	offset = 0;
+
+	ptr = find_cr_lf(str, len);
+	while (ptr) {
+		count = ptr - (str + offset);
+		if (count == 0) {
+			/* 2 is for <cr><lf> */
+			offset += 2;
+		} else {
+			*ptr = '\0';
+			hf_call_prefix_handler(hfp, str + offset);
+			offset += count + 2;
+		}
+
+		if (offset >= len)
+			break;
+
+		ptr = find_cr_lf(str + offset, len - offset);
+	}
+
+	ringbuf_drain(hfp->read_buf, offset < len ? offset : len);
+}
+
+static bool hf_can_read_data(struct io *io, void *user_data)
+{
+	struct hfp_hf *hfp = user_data;
+	ssize_t bytes_read;
+
+	bytes_read = ringbuf_read(hfp->read_buf, hfp->fd);
+	if (bytes_read < 0)
+		return false;
+
+	hf_process_input(hfp);
+
+	return true;
+}
+
 struct hfp_hf *hfp_hf_new(int fd)
 {
 	struct hfp_hf *hfp;
@@ -912,6 +1032,15 @@ struct hfp_hf *hfp_hf_new(int fd)
 		return NULL;
 	}
 
+	if (!io_set_read_handler(hfp->io, hf_can_read_data, hfp,
+							read_watch_destroy)) {
+		queue_destroy(hfp->event_handlers,
+						destroy_event_handler);
+		io_destroy(hfp->io);
+		ringbuf_free(hfp->write_buf);
+		ringbuf_free(hfp->read_buf);
+	}
+
 	return hfp_hf_ref(hfp);
 }
 
-- 
1.8.4


^ permalink raw reply related

* [PATCH v4 04/11] shared/hfp: Add register/unregister event for HFP HF
From: Lukasz Rymanowski @ 2014-10-09 23:50 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Lukasz Rymanowski
In-Reply-To: <1412898611-12199-1-git-send-email-lukasz.rymanowski@tieto.com>

This patch adds API which allows to register/unregister for unsolicited
responses.
---
 src/shared/hfp.c | 108 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/shared/hfp.h |   8 +++++
 2 files changed, 116 insertions(+)

diff --git a/src/shared/hfp.c b/src/shared/hfp.c
index b7855ed..b1cf08e 100644
--- a/src/shared/hfp.c
+++ b/src/shared/hfp.c
@@ -70,6 +70,8 @@ struct hfp_hf {
 	struct ringbuf *read_buf;
 	struct ringbuf *write_buf;
 
+	struct queue *event_handlers;
+
 	hfp_debug_func_t debug_callback;
 	hfp_destroy_func_t debug_destroy;
 	void *debug_data;
@@ -94,6 +96,18 @@ struct hfp_gw_result {
 	unsigned int offset;
 };
 
+struct hfp_hf_result {
+	const char *data;
+	unsigned int offset;
+};
+
+struct event_handler {
+	char *prefix;
+	void *user_data;
+	hfp_destroy_func_t destroy;
+	hfp_hf_result_func_t callback;
+};
+
 static void destroy_cmd_handler(void *data)
 {
 	struct cmd_handler *handler = data;
@@ -828,6 +842,32 @@ bool hfp_gw_disconnect(struct hfp_gw *hfp)
 	return io_shutdown(hfp->io);
 }
 
+static bool match_handler_event_prefix(const void *a, const void *b)
+{
+	const struct event_handler *handler = a;
+	const char *prefix = b;
+
+	if (strlen(handler->prefix) != strlen(prefix))
+		return false;
+
+	if (memcmp(handler->prefix, prefix, strlen(prefix)))
+		return false;
+
+	return true;
+}
+
+static void destroy_event_handler(void *data)
+{
+	struct event_handler *handler = data;
+
+	if (handler->destroy)
+		handler->destroy(handler->user_data);
+
+	free(handler->prefix);
+
+	free(handler);
+}
+
 struct hfp_hf *hfp_hf_new(int fd)
 {
 	struct hfp_hf *hfp;
@@ -863,6 +903,15 @@ struct hfp_hf *hfp_hf_new(int fd)
 		return NULL;
 	}
 
+	hfp->event_handlers = queue_new();
+	if (!hfp->event_handlers) {
+		io_destroy(hfp->io);
+		ringbuf_free(hfp->write_buf);
+		ringbuf_free(hfp->read_buf);
+		free(hfp);
+		return NULL;
+	}
+
 	return hfp_hf_ref(hfp);
 }
 
@@ -902,6 +951,9 @@ void hfp_hf_unref(struct hfp_hf *hfp)
 	ringbuf_free(hfp->write_buf);
 	hfp->write_buf = NULL;
 
+	queue_destroy(hfp->event_handlers, destroy_event_handler);
+	hfp->event_handlers = NULL;
+
 	if (!hfp->in_disconnect) {
 		free(hfp);
 		return;
@@ -961,6 +1013,62 @@ bool hfp_hf_set_close_on_unref(struct hfp_hf *hfp, bool do_close)
 	return true;
 }
 
+bool hfp_hf_register(struct hfp_hf *hfp, hfp_hf_result_func_t callback,
+						const char *prefix,
+						void *user_data,
+						hfp_destroy_func_t destroy)
+{
+	struct event_handler *handler;
+
+	if (!callback)
+		return false;
+
+	handler = new0(struct event_handler, 1);
+	if (!handler)
+		return false;
+
+	handler->callback = callback;
+	handler->user_data = user_data;
+
+	handler->prefix = strdup(prefix);
+	if (!handler->prefix) {
+		free(handler);
+		return false;
+	}
+
+	if (queue_find(hfp->event_handlers, match_handler_event_prefix,
+							handler->prefix)) {
+		destroy_event_handler(handler);
+		return false;
+	}
+
+	handler->destroy = destroy;
+
+	return queue_push_tail(hfp->event_handlers, handler);
+}
+
+bool hfp_hf_unregister(struct hfp_hf *hfp, const char *prefix)
+{
+	struct cmd_handler *handler;
+	char *lookup_prefix;
+
+	lookup_prefix = strdup(prefix);
+	if (!lookup_prefix)
+		return false;
+
+	handler = queue_remove_if(hfp->event_handlers,
+						match_handler_event_prefix,
+						lookup_prefix);
+	free(lookup_prefix);
+
+	if (!handler)
+		return false;
+
+	destroy_event_handler(handler);
+
+	return true;
+}
+
 static void hf_disconnect_watch_destroy(void *user_data)
 {
 	struct hfp_hf *hfp = user_data;
diff --git a/src/shared/hfp.h b/src/shared/hfp.h
index a9a169b..85037b1 100644
--- a/src/shared/hfp.h
+++ b/src/shared/hfp.h
@@ -68,10 +68,14 @@ enum hfp_gw_cmd_type {
 };
 
 struct hfp_gw_result;
+struct hfp_hf_result;
 
 typedef void (*hfp_result_func_t)(struct hfp_gw_result *result,
 				enum hfp_gw_cmd_type type, void *user_data);
 
+typedef void (*hfp_hf_result_func_t)(struct hfp_hf_result *result,
+							void *user_data);
+
 typedef void (*hfp_destroy_func_t)(void *user_data);
 typedef void (*hfp_debug_func_t)(const char *str, void *user_data);
 
@@ -138,3 +142,7 @@ bool hfp_hf_set_disconnect_handler(struct hfp_hf *hfp,
 					void *user_data,
 					hfp_destroy_func_t destroy);
 bool hfp_hf_disconnect(struct hfp_hf *hfp);
+bool hfp_hf_register(struct hfp_hf *hfp, hfp_hf_result_func_t callback,
+					const char *prefix, void *user_data,
+					hfp_destroy_func_t destroy);
+bool hfp_hf_unregister(struct hfp_hf *hfp, const char *prefix);
-- 
1.8.4


^ permalink raw reply related

* [PATCH v4 03/11] shared/hfp: Add set disconnect handler and disconnect API to HFP HF
From: Lukasz Rymanowski @ 2014-10-09 23:50 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Lukasz Rymanowski
In-Reply-To: <1412898611-12199-1-git-send-email-lukasz.rymanowski@tieto.com>

---
 src/shared/hfp.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/shared/hfp.h |  5 +++++
 2 files changed, 68 insertions(+)

diff --git a/src/shared/hfp.c b/src/shared/hfp.c
index ad2daa2..b7855ed 100644
--- a/src/shared/hfp.c
+++ b/src/shared/hfp.c
@@ -74,6 +74,10 @@ struct hfp_hf {
 	hfp_destroy_func_t debug_destroy;
 	void *debug_data;
 
+	hfp_disconnect_func_t disconnect_callback;
+	hfp_destroy_func_t disconnect_destroy;
+	void *disconnect_data;
+
 	bool in_disconnect;
 	bool destroyed;
 };
@@ -956,3 +960,62 @@ bool hfp_hf_set_close_on_unref(struct hfp_hf *hfp, bool do_close)
 
 	return true;
 }
+
+static void hf_disconnect_watch_destroy(void *user_data)
+{
+	struct hfp_hf *hfp = user_data;
+
+	if (hfp->disconnect_destroy)
+		hfp->disconnect_destroy(hfp->disconnect_data);
+
+	if (hfp->destroyed)
+		free(hfp);
+}
+
+static bool hf_io_disconnected(struct io *io, void *user_data)
+{
+	struct hfp_hf *hfp = user_data;
+
+	hfp->in_disconnect = true;
+
+	if (hfp->disconnect_callback)
+		hfp->disconnect_callback(hfp->disconnect_data);
+
+	hfp->in_disconnect = false;
+
+	return false;
+}
+
+bool hfp_hf_set_disconnect_handler(struct hfp_hf *hfp,
+						hfp_disconnect_func_t callback,
+						void *user_data,
+						hfp_destroy_func_t destroy)
+{
+	if (!hfp)
+		return false;
+
+	if (hfp->disconnect_destroy)
+		hfp->disconnect_destroy(hfp->disconnect_data);
+
+	if (!io_set_disconnect_handler(hfp->io, hf_io_disconnected, hfp,
+						hf_disconnect_watch_destroy)) {
+		hfp->disconnect_callback = NULL;
+		hfp->disconnect_destroy = NULL;
+		hfp->disconnect_data = NULL;
+		return false;
+	}
+
+	hfp->disconnect_callback = callback;
+	hfp->disconnect_destroy = destroy;
+	hfp->disconnect_data = user_data;
+
+	return true;
+}
+
+bool hfp_hf_disconnect(struct hfp_hf *hfp)
+{
+	if (!hfp)
+		return false;
+
+	return io_shutdown(hfp->io);
+}
diff --git a/src/shared/hfp.h b/src/shared/hfp.h
index ae67ac2..a9a169b 100644
--- a/src/shared/hfp.h
+++ b/src/shared/hfp.h
@@ -133,3 +133,8 @@ void hfp_hf_unref(struct hfp_hf *hfp);
 bool hfp_hf_set_debug(struct hfp_hf *hfp, hfp_debug_func_t callback,
 				void *user_data, hfp_destroy_func_t destroy);
 bool hfp_hf_set_close_on_unref(struct hfp_hf *hfp, bool do_close);
+bool hfp_hf_set_disconnect_handler(struct hfp_hf *hfp,
+					hfp_disconnect_func_t callback,
+					void *user_data,
+					hfp_destroy_func_t destroy);
+bool hfp_hf_disconnect(struct hfp_hf *hfp);
-- 
1.8.4


^ permalink raw reply related

* [PATCH v4 02/11] shared/hfp: Add set_debug and close_on_unref API for HFP HF
From: Lukasz Rymanowski @ 2014-10-09 23:50 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Lukasz Rymanowski
In-Reply-To: <1412898611-12199-1-git-send-email-lukasz.rymanowski@tieto.com>

---
 src/shared/hfp.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/shared/hfp.h |  3 +++
 2 files changed, 60 insertions(+)

diff --git a/src/shared/hfp.c b/src/shared/hfp.c
index dbd049a..ad2daa2 100644
--- a/src/shared/hfp.c
+++ b/src/shared/hfp.c
@@ -70,6 +70,10 @@ struct hfp_hf {
 	struct ringbuf *read_buf;
 	struct ringbuf *write_buf;
 
+	hfp_debug_func_t debug_callback;
+	hfp_destroy_func_t debug_destroy;
+	void *debug_data;
+
 	bool in_disconnect;
 	bool destroyed;
 };
@@ -886,6 +890,8 @@ void hfp_hf_unref(struct hfp_hf *hfp)
 	if (hfp->close_on_unref)
 		close(hfp->fd);
 
+	hfp_hf_set_debug(hfp, NULL, NULL, NULL);
+
 	ringbuf_free(hfp->read_buf);
 	hfp->read_buf = NULL;
 
@@ -899,3 +905,54 @@ void hfp_hf_unref(struct hfp_hf *hfp)
 
 	hfp->destroyed = true;
 }
+
+static void hf_read_tracing(const void *buf, size_t count,
+							void *user_data)
+{
+	struct hfp_hf *hfp = user_data;
+
+	util_hexdump('>', buf, count, hfp->debug_callback, hfp->debug_data);
+}
+
+static void hf_write_tracing(const void *buf, size_t count,
+							void *user_data)
+{
+	struct hfp_hf *hfp = user_data;
+
+	util_hexdump('<', buf, count, hfp->debug_callback, hfp->debug_data);
+}
+
+bool hfp_hf_set_debug(struct hfp_hf *hfp, hfp_debug_func_t callback,
+				void *user_data, hfp_destroy_func_t destroy)
+{
+	if (!hfp)
+		return false;
+
+	if (hfp->debug_destroy)
+		hfp->debug_destroy(hfp->debug_data);
+
+	hfp->debug_callback = callback;
+	hfp->debug_destroy = destroy;
+	hfp->debug_data = user_data;
+
+	if (hfp->debug_callback) {
+		ringbuf_set_input_tracing(hfp->read_buf, hf_read_tracing, hfp);
+		ringbuf_set_input_tracing(hfp->write_buf, hf_write_tracing,
+									hfp);
+	} else {
+		ringbuf_set_input_tracing(hfp->read_buf, NULL, NULL);
+		ringbuf_set_input_tracing(hfp->write_buf, NULL, NULL);
+	}
+
+	return true;
+}
+
+bool hfp_hf_set_close_on_unref(struct hfp_hf *hfp, bool do_close)
+{
+	if (!hfp)
+		return false;
+
+	hfp->close_on_unref = do_close;
+
+	return true;
+}
diff --git a/src/shared/hfp.h b/src/shared/hfp.h
index 50d9c4b..ae67ac2 100644
--- a/src/shared/hfp.h
+++ b/src/shared/hfp.h
@@ -130,3 +130,6 @@ bool hfp_gw_result_has_next(struct hfp_gw_result *result);
 struct hfp_hf *hfp_hf_new(int fd);
 struct hfp_hf *hfp_hf_ref(struct hfp_hf *hfp);
 void hfp_hf_unref(struct hfp_hf *hfp);
+bool hfp_hf_set_debug(struct hfp_hf *hfp, hfp_debug_func_t callback,
+				void *user_data, hfp_destroy_func_t destroy);
+bool hfp_hf_set_close_on_unref(struct hfp_hf *hfp, bool do_close);
-- 
1.8.4


^ permalink raw reply related

* [PATCH v4 01/11] shared/hfp: Add support for HFP HF
From: Lukasz Rymanowski @ 2014-10-09 23:50 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Lukasz Rymanowski
In-Reply-To: <1412898611-12199-1-git-send-email-lukasz.rymanowski@tieto.com>

This patch add struct hfp_hf plus fuctions to create an instance ref and
unref. This code based on existing hfp_gw
---
 src/shared/hfp.c | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/shared/hfp.h |  6 ++++
 2 files changed, 98 insertions(+)

diff --git a/src/shared/hfp.c b/src/shared/hfp.c
index efc981f..dbd049a 100644
--- a/src/shared/hfp.c
+++ b/src/shared/hfp.c
@@ -62,6 +62,18 @@ struct hfp_gw {
 	bool destroyed;
 };
 
+struct hfp_hf {
+	int ref_count;
+	int fd;
+	bool close_on_unref;
+	struct io *io;
+	struct ringbuf *read_buf;
+	struct ringbuf *write_buf;
+
+	bool in_disconnect;
+	bool destroyed;
+};
+
 struct cmd_handler {
 	char *prefix;
 	void *user_data;
@@ -807,3 +819,83 @@ bool hfp_gw_disconnect(struct hfp_gw *hfp)
 
 	return io_shutdown(hfp->io);
 }
+
+struct hfp_hf *hfp_hf_new(int fd)
+{
+	struct hfp_hf *hfp;
+
+	if (fd < 0)
+		return NULL;
+
+	hfp = new0(struct hfp_hf, 1);
+	if (!hfp)
+		return NULL;
+
+	hfp->fd = fd;
+	hfp->close_on_unref = false;
+
+	hfp->read_buf = ringbuf_new(4096);
+	if (!hfp->read_buf) {
+		free(hfp);
+		return NULL;
+	}
+
+	hfp->write_buf = ringbuf_new(4096);
+	if (!hfp->write_buf) {
+		ringbuf_free(hfp->read_buf);
+		free(hfp);
+		return NULL;
+	}
+
+	hfp->io = io_new(fd);
+	if (!hfp->io) {
+		ringbuf_free(hfp->write_buf);
+		ringbuf_free(hfp->read_buf);
+		free(hfp);
+		return NULL;
+	}
+
+	return hfp_hf_ref(hfp);
+}
+
+struct hfp_hf *hfp_hf_ref(struct hfp_hf *hfp)
+{
+	if (!hfp)
+		return NULL;
+
+	__sync_fetch_and_add(&hfp->ref_count, 1);
+
+	return hfp;
+}
+
+void hfp_hf_unref(struct hfp_hf *hfp)
+{
+	if (!hfp)
+		return;
+
+	if (__sync_sub_and_fetch(&hfp->ref_count, 1))
+		return;
+
+	io_set_write_handler(hfp->io, NULL, NULL, NULL);
+	io_set_read_handler(hfp->io, NULL, NULL, NULL);
+	io_set_disconnect_handler(hfp->io, NULL, NULL, NULL);
+
+	io_destroy(hfp->io);
+	hfp->io = NULL;
+
+	if (hfp->close_on_unref)
+		close(hfp->fd);
+
+	ringbuf_free(hfp->read_buf);
+	hfp->read_buf = NULL;
+
+	ringbuf_free(hfp->write_buf);
+	hfp->write_buf = NULL;
+
+	if (!hfp->in_disconnect) {
+		free(hfp);
+		return;
+	}
+
+	hfp->destroyed = true;
+}
diff --git a/src/shared/hfp.h b/src/shared/hfp.h
index 743db65..50d9c4b 100644
--- a/src/shared/hfp.h
+++ b/src/shared/hfp.h
@@ -76,9 +76,11 @@ typedef void (*hfp_destroy_func_t)(void *user_data);
 typedef void (*hfp_debug_func_t)(const char *str, void *user_data);
 
 typedef void (*hfp_command_func_t)(const char *command, void *user_data);
+
 typedef void (*hfp_disconnect_func_t)(void *user_data);
 
 struct hfp_gw;
+struct hfp_hf;
 
 struct hfp_gw *hfp_gw_new(int fd);
 
@@ -124,3 +126,7 @@ bool hfp_gw_result_get_string(struct hfp_gw_result *result, char *buf,
 bool hfp_gw_result_get_unquoted_string(struct hfp_gw_result *result, char *buf,
 								uint8_t len);
 bool hfp_gw_result_has_next(struct hfp_gw_result *result);
+
+struct hfp_hf *hfp_hf_new(int fd);
+struct hfp_hf *hfp_hf_ref(struct hfp_hf *hfp);
+void hfp_hf_unref(struct hfp_hf *hfp);
-- 
1.8.4


^ permalink raw reply related

* [PATCH v4 00/11] shared/hfp: Add support for HFP HF
From: Lukasz Rymanowski @ 2014-10-09 23:50 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Lukasz Rymanowski

Following patches extends hfp API with HFP HF functionality.
HFP HF parser has been added and unit test for it.

To consider: how strict we should be when it comes to parsing
AT responses. For example, at the moment, command +CCLC:<cr><lf>
will be recognized as +CCLC: eventhough correct response format
should be <cr><lf>+CCLC:<cr><lf>

Note: As discussed on IRC I did not try to generalize code.

v2:
* minor self review fixes
* response callback on send command, contains now result (OK/ERROR) and
data from unsolicited response if available.

v3:
* Fix some memory leaks found on self review

v4:
* Fallback to approach from v1 in context of response callback for AT command.
Bassically, if AT+X has +X and OK response, response callback contains only OK or
ERROR code (including CME which will be added in following patches). To get +X
response, user need to use hfp_hf_register() API. It is done mostly to keep hfp.c
simple. With this approach we do not have to cache all +X in hfp.c before calling
response callback.

Lukasz Rymanowski (11):
  shared/hfp: Add support for HFP HF
  shared/hfp: Add set_debug and close_on_unref API for HFP HF
  shared/hfp: Add set disconnect handler and disconnect API to HFP HF
  shared/hfp: Add register/unregister event for HFP HF
  shared/hfp: Add HFP HF parser
  shared/hfp: Add send AT command API for HFP HF
  unit/test-hfp: Provide test_handler function via struct data
  unit/test-hfp: Add init test for HFP HF
  unit/test-hfp: Add send command tests for HFP HF
  unit/test-hfp: Add tests for unsolicited results for HFP HF
  unit/test-hfp: Add some robustness tests for HFP HF

 src/shared/hfp.c | 624 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/shared/hfp.h |  30 +++
 unit/test-hfp.c  | 285 +++++++++++++++++++++++--
 3 files changed, 920 insertions(+), 19 deletions(-)

-- 
1.8.4


^ permalink raw reply

* Re: linux-firmware: Add firmware patch for Intel Bluetooth 7265 ROM-spin(D0)
From: Kyle McMartin @ 2014-10-09 16:00 UTC (permalink / raw)
  To: Tedd Ho-Jeong An; +Cc: linux-firmware, Kyle McMartin, linux-bluetooth
In-Reply-To: <20141009085609.519dbbaa@tedd-ubuntu-vm2>

On Thu, Oct 09, 2014 at 08:56:09AM -0700, Tedd Ho-Jeong An wrote:
> From: Tedd Ho-Jeong An <tedd.an@intel.com>
> Date: Thu, 9 Oct 2014 08:16:05 -0700
> 
> This patch adds new firmware patch for
> - Intel Wireless 7265 Bluetooth ROM-spin SKU, also known as StP D0
> 
> This patch was submitted but reverted due to patch issue.
> The original patch's commit id: 935b5557b1485d839748b40f5721539b54d429e1
> 
> Signed-off-by: Tedd Ho-Jeong An <tedd.an@intel.com>

this one worked without a hitch. :)

thanks! --kyle

> ---
>  WHENCE                                   |   2 ++
>  intel/ibt-hw-37.8.10-fw-1.10.3.11.e.bseq | Bin 0 -> 8441 bytes
>  2 files changed, 2 insertions(+)
>  create mode 100755 intel/ibt-hw-37.8.10-fw-1.10.3.11.e.bseq
> 
> diff --git a/WHENCE b/WHENCE
> index 3b5f078..b77516d 100644
> --- a/WHENCE
> +++ b/WHENCE
> @@ -2405,6 +2405,8 @@ File: intel/ibt-hw-37.8.bseq
>  Version: 1339_02.00
>  File: intel/ibt-hw-37.8.10-fw-1.10.2.27.d.bseq
>  Version: STP2_C0_1339_02_patch_31.1
> +File: intel/ibt-hw-37.8.10-fw-1.10.3.11.e.bseq
> +Version: STP2_D0_1417_04_patch_04.1
>  
>  Licence: Redistributable. See LICENCE.ibt_firmware for details
>  
> diff --git a/intel/ibt-hw-37.8.10-fw-1.10.3.11.e.bseq b/intel/ibt-hw-37.8.10-fw-1.10.3.11.e.bseq
> new file mode 100755
> index 0000000000000000000000000000000000000000..95a32a96d863a19726fa0d6faad5b0917cb6adcb
> GIT binary patch
> literal 8441
> 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
> F_-~X>mv8_8
> 
> literal 0
> HcmV?d00001
> 
> -- 
> 1.9.1
> 
> 

^ permalink raw reply

* linux-firmware: Add firmware patch for Intel Bluetooth 7265 ROM-spin(D0)
From: Tedd Ho-Jeong An @ 2014-10-09 15:56 UTC (permalink / raw)
  To: linux-firmware, Kyle McMartin; +Cc: linux-bluetooth, tedd.an

From: Tedd Ho-Jeong An <tedd.an@intel.com>
Date: Thu, 9 Oct 2014 08:16:05 -0700

This patch adds new firmware patch for
- Intel Wireless 7265 Bluetooth ROM-spin SKU, also known as StP D0

This patch was submitted but reverted due to patch issue.
The original patch's commit id: 935b5557b1485d839748b40f5721539b54d429e1

Signed-off-by: Tedd Ho-Jeong An <tedd.an@intel.com>
---
 WHENCE                                   |   2 ++
 intel/ibt-hw-37.8.10-fw-1.10.3.11.e.bseq | Bin 0 -> 8441 bytes
 2 files changed, 2 insertions(+)
 create mode 100755 intel/ibt-hw-37.8.10-fw-1.10.3.11.e.bseq

diff --git a/WHENCE b/WHENCE
index 3b5f078..b77516d 100644
--- a/WHENCE
+++ b/WHENCE
@@ -2405,6 +2405,8 @@ File: intel/ibt-hw-37.8.bseq
 Version: 1339_02.00
 File: intel/ibt-hw-37.8.10-fw-1.10.2.27.d.bseq
 Version: STP2_C0_1339_02_patch_31.1
+File: intel/ibt-hw-37.8.10-fw-1.10.3.11.e.bseq
+Version: STP2_D0_1417_04_patch_04.1
 
 Licence: Redistributable. See LICENCE.ibt_firmware for details
 
diff --git a/intel/ibt-hw-37.8.10-fw-1.10.3.11.e.bseq b/intel/ibt-hw-37.8.10-fw-1.10.3.11.e.bseq
new file mode 100755
index 0000000000000000000000000000000000000000..95a32a96d863a19726fa0d6faad5b0917cb6adcb
GIT binary patch
literal 8441
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
F_-~X>mv8_8

literal 0
HcmV?d00001

-- 
1.9.1


^ permalink raw reply related

* [PATCH] android/pts: RFCOMM PTS 5.3 update
From: Sebastian Chlad @ 2014-10-09 15:15 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Sebastian Chlad

PTS tests results for RFCOMM on PTS 5.3.
PICS' and PIXITs checked against PTS 5.3.
---
 android/pics-rfcomm.txt  |  2 +-
 android/pixit-rfcomm.txt |  2 +-
 android/pts-rfcomm.txt   | 22 ++++++++--------------
 3 files changed, 10 insertions(+), 16 deletions(-)

diff --git a/android/pics-rfcomm.txt b/android/pics-rfcomm.txt
index 9dfb32e..c970363 100644
--- a/android/pics-rfcomm.txt
+++ b/android/pics-rfcomm.txt
@@ -1,6 +1,6 @@
 RFCOMM PICS for the PTS tool.
 
-PTS version: 5.2
+PTS version: 5.3
 
 * - different than PTS defaults
 # - not yet implemented/supported
diff --git a/android/pixit-rfcomm.txt b/android/pixit-rfcomm.txt
index 07810d2..187f3b4 100644
--- a/android/pixit-rfcomm.txt
+++ b/android/pixit-rfcomm.txt
@@ -1,6 +1,6 @@
 RFCOMM PIXIT for the PTS tool.
 
-PTS version: 5.2
+PTS version: 5.3
 
 * - different than PTS defaults
 & - should be set to IUT Bluetooth address
diff --git a/android/pts-rfcomm.txt b/android/pts-rfcomm.txt
index 9bfc7a2..d869ee0 100644
--- a/android/pts-rfcomm.txt
+++ b/android/pts-rfcomm.txt
@@ -1,7 +1,7 @@
 PTS test results for RFCOMM
 
-PTS version: 5.2
-Tested: 17-July-2014
+PTS version: 5.3
+Tested: 08-October-2014
 Android version: 4.4.4
 
 Results:
@@ -17,29 +17,23 @@ Test Name		Result	Notes
 TC_RFC_BV_01_C		PASS	rctest -n -P 1 <btaddr>
 TC_RFC_BV_02_C		PASS	rctest -r -P 1
 TC_RFC_BV_03_C		PASS	rctest -r -P 1
-TC_RFC_BV_04_C		FAIL	PTS issue #12421
-				PTS issue #12414
-				NOTE: DISC on DLC is expected; IUT disconnects
-					rfcomm session (close)
+TC_RFC_BV_04_C		PASS	NOTE: use ets provided in PTS issue #12414
 TC_RFC_BV_05_C		PASS	rctest -n -P 4 <btaddr>
 				Note: test requires IUT to connect on the given
 				channel. sdptool browse <btaddr> to check the
 				channel.
 TC_RFC_BV_06_C		PASS	rctest -r -P 1
 TC_RFC_BV_07_C		PASS	rctest -r -P 1
-TC_RFC_BV_08_C		INC	PTS issue #12397
-				NOTE: Incorrect frame type sent in response to
-					the DISC command
+TC_RFC_BV_08_C		PASS	rctest -r -P 1
+				Note: use ets provided in PTS issue #12397
 TC_RFC_BV_11_C		PASS	rctest -r -P 1
-TC_RFC_BV_13_C		FAIL	PTS issue #12397
-				NOTE: IUT sent the correct frame type (UIH)
-				but the parameters did not match the
-				requirements
+TC_RFC_BV_13_C		PASS	rctest -r -P 1
+				Note: use ets provided in PTS issue #12397
 TC_RFC_BV_14_C		N/A
 TC_RFC_BV_15_C		PASS	rctest -r -P 1
 TC_RFC_BV_17_C		PASS	rctest -d -P 1
 TC_RFC_BV_19_C		PASS
 TC_RFC_BV_21_C		INC	PTS issue #12421
 TC_RFC_BV_22_C		INC	PTS issue #12421
-TC_RFC_BV_25_C		INC	PTS issue #12421
+TC_RFC_BV_25_C		INC	PTS issue #12621
 -------------------------------------------------------------------------------
-- 
1.8.5.3


^ permalink raw reply related

* Re: [PATCH] Bluetooth: Defer connection-parameter removal when unpairing without disconnecting
From: Alfonso Acosta @ 2014-10-09 14:39 UTC (permalink / raw)
  To: Alfonso Acosta, BlueZ development
In-Reply-To: <20141009141430.GA31807@t440s.P-661HNU-F1>

Hi Johan,

>> +
>> +     if (test_and_clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags))
>> +             hci_conn_params_del(conn->hdev, &conn->dst, conn->dst_type);
>>  }
>>
>>  /* Enter sniff mode */
>> @@ -544,6 +547,9 @@ int hci_conn_del(struct hci_conn *conn)
>>
>>       hci_conn_del_sysfs(conn);
>>
>> +     if (test_and_clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags))
>> +             hci_conn_params_del(conn->hdev, &conn->dst, conn->dst_type);
> I suppose the above two test_and_clear_bit() calls should be operating
> on HCI_CONN_PARAM_REMOVAL_PEND and not HCI_CONN_MODE_CHANGE_PEND?

Darn. Yes, my bad.


>> @@ -2700,6 +2700,7 @@ static int unpair_device(struct sock *sk, struct hci_dev *hdev, void *data,
>>       struct hci_cp_disconnect dc;
>>       struct pending_cmd *cmd;
>>       struct hci_conn *conn;
>> +     struct hci_conn *le_conn = NULL;
>
> I don't think you need to initialize this here since it's
> unconditionally set in the first LE addr type branch and only touched
> again in the second LE branch. Actually do you even need this second
> variable if you simply assign to conn when you look up the LE
> connection?

I did it to silence an unitialized-variable warning from gcc  (at least
the 4.8 version I am using is not good enough to conclude that the
variable is initialized).

>> @@ -2752,8 +2763,7 @@ static int unpair_device(struct sock *sk, struct hci_dev *hdev, void *data,
>>                       conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK,
>>                                                      &cp->addr.bdaddr);
>>               else
>> -                     conn = hci_conn_hash_lookup_ba(hdev, LE_LINK,
>> -                                                    &cp->addr.bdaddr);
>> +                     conn = le_conn;
>
> Here you could then simply remove the "else" branch with a comment that
> the conn is already looked up for LE addresses earlier in the function.
> Not sure if that makes the code harder to follow though...

My intention was precisely to make it easier to follow by showing that
LE was being taken care of with an explicit assignment.

Buy yeah, I can simply remove le_conn altogether and add a comment instead.

Note that removing the else branch will also cause an
uninitialized-variable compiler warning on conn.

I could use uninitialized_var() instead of using NULL, I simply
decided against it after reading http://lwn.net/Articles/529954/

-- 
Alfonso Acosta

Embedded Systems Engineer at Spotify
Birger Jarlsgatan 61, Stockholm, Sweden
http://www.spotify.com

^ permalink raw reply

* Re: btusb_intr_complete returns -EPIPE
From: Alan Stern @ 2014-10-09 14:31 UTC (permalink / raw)
  To: Naveen Kumar Parna
  Cc: Oliver Neukum, linux-bluetooth@vger.kernel.org, linux-usb, acho
In-Reply-To: <CAG0bkvJDLP2tgnzu7H_ZCRCnZwkw1zUd1uqWwoDkmrU_FLts7w@mail.gmail.com>

On Thu, 9 Oct 2014, Naveen Kumar Parna wrote:

> Hi Oliver & Alan,
> 
> 
> 
> Thanks for your inputs.
> 
> 
> 
> I enabled the dynamic debugging for USB HC driver. Please correct me
> if I am wrong.

Debugging the kernel (or doing anything else to the kernel, for that
matter) won't solve the problem if it is caused by a buggy hub.

Alan Stern


^ permalink raw reply

* Re: [PATCH] Bluetooth: Defer connection-parameter removal when unpairing without disconnecting
From: Johan Hedberg @ 2014-10-09 14:14 UTC (permalink / raw)
  To: Alfonso Acosta; +Cc: linux-bluetooth
In-Reply-To: <1412859828-6224-1-git-send-email-fons@spotify.com>

Hi Alfonso,

On Thu, Oct 09, 2014, Alfonso Acosta wrote:
> --- a/include/net/bluetooth/hci_core.h
> +++ b/include/net/bluetooth/hci_core.h
> @@ -555,6 +555,7 @@ enum {
>  	HCI_CONN_STK_ENCRYPT,
>  	HCI_CONN_AUTH_INITIATOR,
>  	HCI_CONN_DROP,
> +	HCI_CONN_PARAM_REMOVAL_PEND,
>  };
>  
>  static inline bool hci_conn_ssp_enabled(struct hci_conn *conn)
> diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c
> index b9517bd..d106f29 100644
> --- a/net/bluetooth/hci_conn.c
> +++ b/net/bluetooth/hci_conn.c
> @@ -356,6 +356,9 @@ static void hci_conn_timeout(struct work_struct *work)
>  		conn->state = BT_CLOSED;
>  		break;
>  	}
> +
> +	if (test_and_clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags))
> +		hci_conn_params_del(conn->hdev, &conn->dst, conn->dst_type);
>  }
>  
>  /* Enter sniff mode */
> @@ -544,6 +547,9 @@ int hci_conn_del(struct hci_conn *conn)
>  
>  	hci_conn_del_sysfs(conn);
>  
> +	if (test_and_clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags))
> +		hci_conn_params_del(conn->hdev, &conn->dst, conn->dst_type);

I suppose the above two test_and_clear_bit() calls should be operating
on HCI_CONN_PARAM_REMOVAL_PEND and not HCI_CONN_MODE_CHANGE_PEND?

Johan


>  	hci_dev_put(hdev);
>  
>  	hci_conn_put(conn);
> diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
> index 3fd88b0..0f2c0e9 100644
> --- a/net/bluetooth/mgmt.c
> +++ b/net/bluetooth/mgmt.c
> @@ -2700,6 +2700,7 @@ static int unpair_device(struct sock *sk, struct hci_dev *hdev, void *data,
>  	struct hci_cp_disconnect dc;
>  	struct pending_cmd *cmd;
>  	struct hci_conn *conn;
> +	struct hci_conn *le_conn = NULL;

I don't think you need to initialize this here since it's
unconditionally set in the first LE addr type branch and only touched
again in the second LE branch. Actually do you even need this second
variable if you simply assign to conn when you look up the LE
connection?

> @@ -2752,8 +2763,7 @@ static int unpair_device(struct sock *sk, struct hci_dev *hdev, void *data,
>  			conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK,
>  						       &cp->addr.bdaddr);
>  		else
> -			conn = hci_conn_hash_lookup_ba(hdev, LE_LINK,
> -						       &cp->addr.bdaddr);
> +			conn = le_conn;

Here you could then simply remove the "else" branch with a comment that
the conn is already looked up for LE addresses earlier in the function.
Not sure if that makes the code harder to follow though...

Johan

^ permalink raw reply

* Re: [PATCH] Bluetooth: Defer connection-parameter removal when unpairing without disconnecting
From: Alfonso Acosta @ 2014-10-09 13:26 UTC (permalink / raw)
  To: BlueZ development
In-Reply-To: <1412859828-6224-1-git-send-email-fons@spotify.com>

Hi,

As an alternative to this patch, I am thinking that it may be worth
considering two other options:

1. Adding an additional repairing operation: MGMT_OP_REPAIR_DEVICE.
Making the repairing semantics explicit  would allow us to keep the connection
parameters even if we choose to disconnect when unpairing.  On the
other hand, one could argue that it clutters the API with an extra
operation which is the composite of two already existing operations.

2. Make MGMT_OP_PAIR_DEVICE behave like the repairing operation in (1)
if the device was already paired. If I recall properly, Johan suggested
this on IRC.

Comments?

Thanks,

Fons

On Thu, Oct 9, 2014 at 3:03 PM, Alfonso Acosta <fons@spotify.com> wrote:
> Systematically removing the LE connection parameters and autoconnect
> action is inconvenient for rebonding without disconnecting from
> userland (i.e. unpairing followed by repairing without
> disconnecting). The parameters will be lost after unparing and
> userland needs to take care of book-keeping them and re-adding them.
>
> This patch allows userland to forget about parameter management when
> rebonding without disconnecting. It defers clearing the connection
> parameters when unparing without disconnecting, giving a chance of
> keeping the parameters if a repairing happens before the connection is
> closed.
>
> Signed-off-by: Alfonso Acosta <fons@spotify.com>
> ---
>  include/net/bluetooth/hci_core.h |  1 +
>  net/bluetooth/hci_conn.c         |  6 ++++++
>  net/bluetooth/mgmt.c             | 16 +++++++++++++---
>  3 files changed, 20 insertions(+), 3 deletions(-)
>
> diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
> index 07ddeed62..b8685a7 100644
> --- a/include/net/bluetooth/hci_core.h
> +++ b/include/net/bluetooth/hci_core.h
> @@ -555,6 +555,7 @@ enum {
>         HCI_CONN_STK_ENCRYPT,
>         HCI_CONN_AUTH_INITIATOR,
>         HCI_CONN_DROP,
> +       HCI_CONN_PARAM_REMOVAL_PEND,
>  };
>
>  static inline bool hci_conn_ssp_enabled(struct hci_conn *conn)
> diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c
> index b9517bd..d106f29 100644
> --- a/net/bluetooth/hci_conn.c
> +++ b/net/bluetooth/hci_conn.c
> @@ -356,6 +356,9 @@ static void hci_conn_timeout(struct work_struct *work)
>                 conn->state = BT_CLOSED;
>                 break;
>         }
> +
> +       if (test_and_clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags))
> +               hci_conn_params_del(conn->hdev, &conn->dst, conn->dst_type);
>  }
>
>  /* Enter sniff mode */
> @@ -544,6 +547,9 @@ int hci_conn_del(struct hci_conn *conn)
>
>         hci_conn_del_sysfs(conn);
>
> +       if (test_and_clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags))
> +               hci_conn_params_del(conn->hdev, &conn->dst, conn->dst_type);
> +
>         hci_dev_put(hdev);
>
>         hci_conn_put(conn);
> diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
> index 3fd88b0..0f2c0e9 100644
> --- a/net/bluetooth/mgmt.c
> +++ b/net/bluetooth/mgmt.c
> @@ -2700,6 +2700,7 @@ static int unpair_device(struct sock *sk, struct hci_dev *hdev, void *data,
>         struct hci_cp_disconnect dc;
>         struct pending_cmd *cmd;
>         struct hci_conn *conn;
> +       struct hci_conn *le_conn = NULL;
>         int err;
>
>         memset(&rp, 0, sizeof(rp));
> @@ -2736,7 +2737,17 @@ static int unpair_device(struct sock *sk, struct hci_dev *hdev, void *data,
>
>                 hci_remove_irk(hdev, &cp->addr.bdaddr, addr_type);
>
> -               hci_conn_params_del(hdev, &cp->addr.bdaddr, addr_type);
> +               le_conn = hci_conn_hash_lookup_ba(hdev, LE_LINK,
> +                                                 &cp->addr.bdaddr);
> +
> +               /* If the BLE connection is being used, defer clearing up
> +                * the connection parameters until closing to give a
> +                * chance of keeping them if a repairing happens.
> +                */
> +               if (le_conn && !cp->disconnect)
> +                       set_bit(HCI_CONN_PARAM_REMOVAL_PEND, &le_conn->flags);
> +               else
> +                       hci_conn_params_del(hdev, &cp->addr.bdaddr, addr_type);
>
>                 err = hci_remove_ltk(hdev, &cp->addr.bdaddr, addr_type);
>         }
> @@ -2752,8 +2763,7 @@ static int unpair_device(struct sock *sk, struct hci_dev *hdev, void *data,
>                         conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK,
>                                                        &cp->addr.bdaddr);
>                 else
> -                       conn = hci_conn_hash_lookup_ba(hdev, LE_LINK,
> -                                                      &cp->addr.bdaddr);
> +                       conn = le_conn;
>         } else {
>                 conn = NULL;
>         }
> --
> 1.9.1
>



-- 
Alfonso Acosta

Embedded Systems Engineer at Spotify
Birger Jarlsgatan 61, Stockholm, Sweden
http://www.spotify.com

^ permalink raw reply

* [PATCH] Bluetooth: Defer connection-parameter removal when unpairing without disconnecting
From: Alfonso Acosta @ 2014-10-09 13:03 UTC (permalink / raw)
  To: linux-bluetooth

Systematically removing the LE connection parameters and autoconnect
action is inconvenient for rebonding without disconnecting from
userland (i.e. unpairing followed by repairing without
disconnecting). The parameters will be lost after unparing and
userland needs to take care of book-keeping them and re-adding them.

This patch allows userland to forget about parameter management when
rebonding without disconnecting. It defers clearing the connection
parameters when unparing without disconnecting, giving a chance of
keeping the parameters if a repairing happens before the connection is
closed.

Signed-off-by: Alfonso Acosta <fons@spotify.com>
---
 include/net/bluetooth/hci_core.h |  1 +
 net/bluetooth/hci_conn.c         |  6 ++++++
 net/bluetooth/mgmt.c             | 16 +++++++++++++---
 3 files changed, 20 insertions(+), 3 deletions(-)

diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
index 07ddeed62..b8685a7 100644
--- a/include/net/bluetooth/hci_core.h
+++ b/include/net/bluetooth/hci_core.h
@@ -555,6 +555,7 @@ enum {
 	HCI_CONN_STK_ENCRYPT,
 	HCI_CONN_AUTH_INITIATOR,
 	HCI_CONN_DROP,
+	HCI_CONN_PARAM_REMOVAL_PEND,
 };
 
 static inline bool hci_conn_ssp_enabled(struct hci_conn *conn)
diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c
index b9517bd..d106f29 100644
--- a/net/bluetooth/hci_conn.c
+++ b/net/bluetooth/hci_conn.c
@@ -356,6 +356,9 @@ static void hci_conn_timeout(struct work_struct *work)
 		conn->state = BT_CLOSED;
 		break;
 	}
+
+	if (test_and_clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags))
+		hci_conn_params_del(conn->hdev, &conn->dst, conn->dst_type);
 }
 
 /* Enter sniff mode */
@@ -544,6 +547,9 @@ int hci_conn_del(struct hci_conn *conn)
 
 	hci_conn_del_sysfs(conn);
 
+	if (test_and_clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags))
+		hci_conn_params_del(conn->hdev, &conn->dst, conn->dst_type);
+
 	hci_dev_put(hdev);
 
 	hci_conn_put(conn);
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
index 3fd88b0..0f2c0e9 100644
--- a/net/bluetooth/mgmt.c
+++ b/net/bluetooth/mgmt.c
@@ -2700,6 +2700,7 @@ static int unpair_device(struct sock *sk, struct hci_dev *hdev, void *data,
 	struct hci_cp_disconnect dc;
 	struct pending_cmd *cmd;
 	struct hci_conn *conn;
+	struct hci_conn *le_conn = NULL;
 	int err;
 
 	memset(&rp, 0, sizeof(rp));
@@ -2736,7 +2737,17 @@ static int unpair_device(struct sock *sk, struct hci_dev *hdev, void *data,
 
 		hci_remove_irk(hdev, &cp->addr.bdaddr, addr_type);
 
-		hci_conn_params_del(hdev, &cp->addr.bdaddr, addr_type);
+		le_conn = hci_conn_hash_lookup_ba(hdev, LE_LINK,
+						  &cp->addr.bdaddr);
+
+		/* If the BLE connection is being used, defer clearing up
+		 * the connection parameters until closing to give a
+		 * chance of keeping them if a repairing happens.
+		 */
+		if (le_conn && !cp->disconnect)
+			set_bit(HCI_CONN_PARAM_REMOVAL_PEND, &le_conn->flags);
+		else
+			hci_conn_params_del(hdev, &cp->addr.bdaddr, addr_type);
 
 		err = hci_remove_ltk(hdev, &cp->addr.bdaddr, addr_type);
 	}
@@ -2752,8 +2763,7 @@ static int unpair_device(struct sock *sk, struct hci_dev *hdev, void *data,
 			conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK,
 						       &cp->addr.bdaddr);
 		else
-			conn = hci_conn_hash_lookup_ba(hdev, LE_LINK,
-						       &cp->addr.bdaddr);
+			conn = le_conn;
 	} else {
 		conn = NULL;
 	}
-- 
1.9.1


^ permalink raw reply related

* RE: [PATCH] Monitor: Fix indentation for AVRCP PASS THROUGH commands
From: Vikrampal @ 2014-10-09 12:59 UTC (permalink / raw)
  To: 'Luiz Augusto von Dentz'
  Cc: linux-bluetooth, 'Dmitry Kasatkin', cpgs
In-Reply-To: <CABBYNZJ-SdhX2S6_BPoPYe2qyavnpqhWAYgKmPi4qAABsrMw2g@mail.gmail.com>

Hi Luiz,

> -----Original Message-----
> From: Luiz Augusto von Dentz [mailto:luiz.dentz@gmail.com]
> Sent: Thursday, October 09, 2014 5:29 PM
> To: Vikrampal Yadav
> Cc: linux-bluetooth@vger.kernel.org; Dmitry Kasatkin; cpgs@samsung.com
> Subject: Re: [PATCH] Monitor: Fix indentation for AVRCP PASS THROUGH
> commands
> 
> Hi Vikram,
> 
> On Thu, Oct 9, 2014 at 2:57 PM, Vikrampal Yadav
> <vikram.pal@samsung.com> wrote:
> > Intendation for AVRCP PASS THROUGH commands' decoding fixed.
> 
> Please use lower case at the beginning e.g. monitor:
> 
> > ---
> >  monitor/avctp.c | 4 ++--
> >  1 file changed, 2 insertions(+), 2 deletions(-)
> >
> > diff --git a/monitor/avctp.c b/monitor/avctp.c index a4e34c5..4abd18f
> > 100644
> > --- a/monitor/avctp.c
> > +++ b/monitor/avctp.c
> > @@ -686,13 +686,13 @@ static bool avrcp_passthrough_packet(struct
> avctp_frame *avctp_frame,
> >         if (!l2cap_frame_get_u8(frame, &op))
> >                 return false;
> >
> > -       print_field("%*cOperation: 0x%02x (%s %s)", (indent - 2), ' ', op,
> > +       print_field("%*cOperation: 0x%02x (%s %s)", (indent - 8), ' ',
> > + op,
> >                                 op2str(op), op & 0x80 ? "Released" :
> > "Pressed");
> >
> >         if (!l2cap_frame_get_u8(frame, &len))
> >                 return false;
> >
> > -       print_field("%*cLength: 0x%02x", (indent - 2), ' ', len);
> > +       print_field("%*cLength: 0x%02x", (indent - 8), ' ', len);
> >
> >         packet_hexdump(frame->data, frame->size);
> >         return true;
> > --
> > 1.9.1
> 
> 
> Could you please start adding the output of the btmon to the description
> once you add new parsers like this that way we can spot more easily
> formatting bugs such as this.
> 
> 
> 
> --
> Luiz Augusto von Dentz

Sure!

Regards,
Vikram


^ permalink raw reply

* Re: [PATCH] bnep: Add extra debug information for bnep_up
From: Szymon Janc @ 2014-10-09 12:48 UTC (permalink / raw)
  To: Andrei Emeltchenko; +Cc: linux-bluetooth
In-Reply-To: <3300021.NoEnUzGqr8@uw000953>

On Thursday 09 of October 2014 13:30:44 Szymon Janc wrote:
> Hi Andrei,
> 
> On Thursday 09 of October 2014 13:17:43 Andrei Emeltchenko wrote:
> > From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
> > 
> > Adding extra debug information helps to investigate failing cases
> > ---
> >  profiles/network/bnep.c | 3 ++-
> >  1 file changed, 2 insertions(+), 1 deletion(-)
> > 
> > diff --git a/profiles/network/bnep.c b/profiles/network/bnep.c
> > index 136709d..a6b8728 100644
> > --- a/profiles/network/bnep.c
> > +++ b/profiles/network/bnep.c
> > @@ -210,7 +210,8 @@ static int bnep_if_up(const char *devname)
> >  	close(sk);
> >  
> >  	if (err < 0) {
> > -		error("Could not bring up %s", devname);
> > +		error("Could not bring up %s: %s(%d)", devname, strerror(errno),
> > +									errno);
> >  		return err;
> >  	}
> 
> You should use -err no errno here. Errno might be already overwritten by call
> to close().

Well, not exactly, errno should be also stored to err before calling close().

-- 
Best regards, 
Szymon Janc

^ permalink raw reply

* [PATCH 10/10] android/client: Add completion for mce method
From: Grzegorz Kolodziejczyk @ 2014-10-09 12:45 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Aleksander Drewnicki
In-Reply-To: <1412858714-2845-1-git-send-email-grzegorz.kolodziejczyk@tieto.com>

From: Aleksander Drewnicki <ext.aleksander.drewnicki@tieto.com>

This patch adds completion functions to mce method.
---
 android/client/if-mce.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/android/client/if-mce.c b/android/client/if-mce.c
index 76c9f73..5f101e0 100644
--- a/android/client/if-mce.c
+++ b/android/client/if-mce.c
@@ -54,6 +54,15 @@ static void init_p(int argc, const char **argv)
 	EXEC(if_mce->init, &mce_cbacks);
 }
 
+static void get_remote_mas_instances_c(int argc, const char **argv,
+					enum_func *enum_func, void **user)
+{
+	if (argc == 3) {
+		*user = NULL;
+		*enum_func = enum_devices;
+	}
+}
+
 /* search for MAS instances on remote device */
 
 static void get_remote_mas_instances_p(int argc, const char **argv)
@@ -68,7 +77,7 @@ static void get_remote_mas_instances_p(int argc, const char **argv)
 
 static struct method methods[] = {
 	STD_METHOD(init),
-	STD_METHODH(get_remote_mas_instances, "<addr>"),
+	STD_METHODCH(get_remote_mas_instances, "<addr>"),
 	END_METHOD
 };
 
-- 
1.9.3


^ permalink raw reply related

* [PATCH 09/10] android/client: Add code for mce method
From: Grzegorz Kolodziejczyk @ 2014-10-09 12:45 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Aleksander Drewnicki
In-Reply-To: <1412858714-2845-1-git-send-email-grzegorz.kolodziejczyk@tieto.com>

From: Aleksander Drewnicki <ext.aleksander.drewnicki@tieto.com>

This patch adds implementation of mce method to haltest.
---
 android/client/if-mce.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/android/client/if-mce.c b/android/client/if-mce.c
index c671fb2..76c9f73 100644
--- a/android/client/if-mce.c
+++ b/android/client/if-mce.c
@@ -58,6 +58,12 @@ static void init_p(int argc, const char **argv)
 
 static void get_remote_mas_instances_p(int argc, const char **argv)
 {
+	bt_bdaddr_t addr;
+
+	RETURN_IF_NULL(if_mce);
+	VERIFY_ADDR_ARG(2, &addr);
+
+	EXEC(if_mce->get_remote_mas_instances, &addr);
 }
 
 static struct method methods[] = {
-- 
1.9.3


^ permalink raw reply related

* [PATCH 08/10] android/client: Add code for mce callback
From: Grzegorz Kolodziejczyk @ 2014-10-09 12:45 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Aleksander Drewnicki
In-Reply-To: <1412858714-2845-1-git-send-email-grzegorz.kolodziejczyk@tieto.com>

From: Aleksander Drewnicki <ext.aleksander.drewnicki@tieto.com>

This adds implementation for mce callback.
---
 android/client/if-mce.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/android/client/if-mce.c b/android/client/if-mce.c
index f9ff5f1..c671fb2 100644
--- a/android/client/if-mce.c
+++ b/android/client/if-mce.c
@@ -28,6 +28,16 @@ static void btmce_remote_mas_instances_cb(bt_status_t status,
 						int num_instances,
 						btmce_mas_instance_t *instances)
 {
+	int i;
+
+	haltest_info("%s: status=%s bd_addr=%s num_instance=%d\n", __func__,
+				bt_status_t2str(status), bdaddr2str(bd_addr),
+				num_instances);
+
+	for (i = 0; i < num_instances; i++)
+		haltest_info("id=%d scn=%d msg_types=%d name=%s\n",
+				instances[i].id, instances[i].scn,
+				instances[i].msg_types, instances[i].p_name);
 }
 
 static btmce_callbacks_t mce_cbacks = {
-- 
1.9.3


^ permalink raw reply related

* [PATCH 07/10] android/client: Add skeleton for mce calls
From: Grzegorz Kolodziejczyk @ 2014-10-09 12:45 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Aleksander Drewnicki
In-Reply-To: <1412858714-2845-1-git-send-email-grzegorz.kolodziejczyk@tieto.com>

From: Aleksander Drewnicki <ext.aleksander.drewnicki@tieto.com>

This patch adds skeleton for all methods of mce along with
all callbacks.
---
 android/Android.mk       |  4 +++-
 android/Makefile.am      |  1 +
 android/client/haltest.c |  2 ++
 android/client/if-bt.c   |  3 +++
 android/client/if-main.h |  3 +++
 android/client/if-mce.c  | 62 ++++++++++++++++++++++++++++++++++++++++++++++++
 6 files changed, 74 insertions(+), 1 deletion(-)
 create mode 100644 android/client/if-mce.c

diff --git a/android/Android.mk b/android/Android.mk
index a9e5d4b..aefe41c 100644
--- a/android/Android.mk
+++ b/android/Android.mk
@@ -184,7 +184,9 @@ LOCAL_SRC_FILES := \
 	bluez/android/hal-utils.c \
 
 ifeq ($(BLUEZ_EXTENSIONS), true)
-LOCAL_SRC_FILES += bluez/android/client/if-hf-client.c
+LOCAL_SRC_FILES += \
+	bluez/android/client/if-hf-client.c \
+	bluez/android/client/if-mce.c
 endif
 
 LOCAL_C_INCLUDES += \
diff --git a/android/Makefile.am b/android/Makefile.am
index 9279bbd..b3eb1c5 100644
--- a/android/Makefile.am
+++ b/android/Makefile.am
@@ -125,6 +125,7 @@ android_haltest_SOURCES = android/client/haltest.c \
 				android/client/if-sock.c \
 				android/client/if-audio.c \
 				android/client/if-sco.c \
+				android/client/if-mce.c \
 				android/hardware/hardware.c \
 				android/hal-utils.h android/hal-utils.c
 android_haltest_CFLAGS = $(AM_CFLAGS) -I$(srcdir)/android \
diff --git a/android/client/haltest.c b/android/client/haltest.c
index 5e1633d..781e45c 100644
--- a/android/client/haltest.c
+++ b/android/client/haltest.c
@@ -50,6 +50,7 @@ const struct interface *interfaces[] = {
 	&sock_if,
 #ifdef BLUEZ_EXTENSIONS
 	&hf_client_if,
+	&mce_if,
 #endif
 	NULL
 };
@@ -397,6 +398,7 @@ static void init(void)
 		BT_PROFILE_SOCKETS_ID,
 #ifdef BLUEZ_EXTENSIONS
 		BT_PROFILE_HANDSFREE_CLIENT_ID,
+		BT_PROFILE_MAP_CLIENT_ID,
 #endif
 	};
 	const struct method *m;
diff --git a/android/client/if-bt.c b/android/client/if-bt.c
index 8f98ef3..2d7ac79 100644
--- a/android/client/if-bt.c
+++ b/android/client/if-bt.c
@@ -736,6 +736,7 @@ static void get_profile_interface_c(int argc, const char **argv,
 		BT_PROFILE_AV_RC_ID,
 #ifdef BLUEZ_EXTENSIONS
 		BT_PROFILE_HANDSFREE_CLIENT_ID,
+		BT_PROFILE_MAP_CLIENT_ID,
 #endif
 		NULL
 	};
@@ -778,6 +779,8 @@ static void get_profile_interface_p(int argc, const char **argv)
 #ifdef BLUEZ_EXTENSIONS
 	else if (strcmp(BT_PROFILE_HANDSFREE_CLIENT_ID, id) == 0)
 		pif = (const void **) &if_hf_client;
+	else if (strcmp(BT_PROFILE_MAP_CLIENT_ID, id) == 0)
+		pif = (const void **) &if_mce;
 #endif
 	else
 		haltest_error("%s is not correct for get_profile_interface\n",
diff --git a/android/client/if-main.h b/android/client/if-main.h
index 8aac3e3..cb5f558 100644
--- a/android/client/if-main.h
+++ b/android/client/if-main.h
@@ -39,6 +39,7 @@
 
 #ifdef BLUEZ_EXTENSIONS
 #include <hardware/bt_hf_client.h>
+#include <hardware/bt_mce.h>
 #endif
 
 #include <hardware/bt_rc.h>
@@ -63,6 +64,7 @@ extern const btgatt_server_interface_t *if_gatt_server;
 extern const btgatt_client_interface_t *if_gatt_client;
 #ifdef BLUEZ_EXTENSIONS
 extern const bthf_client_interface_t *if_hf_client;
+extern const btmce_interface_t *if_mce;
 #endif
 
 /*
@@ -89,6 +91,7 @@ extern const struct interface hh_if;
 extern const struct interface hl_if;
 #ifdef BLUEZ_EXTENSIONS
 extern const struct interface hf_client_if;
+extern const struct interface mce_if;
 #endif
 
 /* Interfaces that will show up in tool (first part of command line) */
diff --git a/android/client/if-mce.c b/android/client/if-mce.c
new file mode 100644
index 0000000..f9ff5f1
--- /dev/null
+++ b/android/client/if-mce.c
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2014 Intel 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 "if-main.h"
+#include "../hal-utils.h"
+
+const btmce_interface_t *if_mce = NULL;
+
+/*
+ *  Callback for get_remote_mas_instances
+ */
+static void btmce_remote_mas_instances_cb(bt_status_t status,
+						bt_bdaddr_t *bd_addr,
+						int num_instances,
+						btmce_mas_instance_t *instances)
+{
+}
+
+static btmce_callbacks_t mce_cbacks = {
+	.size = sizeof(mce_cbacks),
+	.remote_mas_instances_cb = btmce_remote_mas_instances_cb,
+};
+
+/* init */
+
+static void init_p(int argc, const char **argv)
+{
+	RETURN_IF_NULL(if_mce);
+
+	EXEC(if_mce->init, &mce_cbacks);
+}
+
+/* search for MAS instances on remote device */
+
+static void get_remote_mas_instances_p(int argc, const char **argv)
+{
+}
+
+static struct method methods[] = {
+	STD_METHOD(init),
+	STD_METHODH(get_remote_mas_instances, "<addr>"),
+	END_METHOD
+};
+
+const struct interface mce_if = {
+	.name = "mce",
+	.methods = methods
+};
-- 
1.9.3


^ permalink raw reply related

* [PATCH 06/10] android/ipc-tester: Add cases for MAP client msg size
From: Grzegorz Kolodziejczyk @ 2014-10-09 12:45 UTC (permalink / raw)
  To: linux-bluetooth
In-Reply-To: <1412858714-2845-1-git-send-email-grzegorz.kolodziejczyk@tieto.com>

Add cases testing message size verification for MAP client opcodes.
---
 android/ipc-tester.c | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/android/ipc-tester.c b/android/ipc-tester.c
index 7dd25e8..357dda9 100644
--- a/android/ipc-tester.c
+++ b/android/ipc-tester.c
@@ -1486,5 +1486,19 @@ int main(int argc, char *argv[])
 			HAL_SERVICE_ID_BLUETOOTH,
 			HAL_SERVICE_ID_HANDSFREE_CLIENT);
 
+	/* check for valid data size for MAP CLIENT */
+	test_datasize_valid("MAP CLIENT Get instances+",
+				HAL_SERVICE_ID_MAP_CLIENT,
+				HAL_OP_MAP_CLIENT_GET_INSTANCES,
+				sizeof(struct hal_cmd_map_client_get_instances),
+				1, HAL_SERVICE_ID_BLUETOOTH,
+				HAL_SERVICE_ID_MAP_CLIENT);
+	test_datasize_valid("MAP CLIENT Get instances-",
+				HAL_SERVICE_ID_MAP_CLIENT,
+				HAL_OP_MAP_CLIENT_GET_INSTANCES,
+				sizeof(struct hal_cmd_map_client_get_instances),
+				-1, HAL_SERVICE_ID_BLUETOOTH,
+				HAL_SERVICE_ID_MAP_CLIENT);
+
 	return tester_run();
 }
-- 
1.9.3


^ permalink raw reply related

* [PATCH 05/10] android/ipc-tester: Add case for MAP client service opcode boundries
From: Grzegorz Kolodziejczyk @ 2014-10-09 12:45 UTC (permalink / raw)
  To: linux-bluetooth
In-Reply-To: <1412858714-2845-1-git-send-email-grzegorz.kolodziejczyk@tieto.com>

This patch adds test sending out of range opcode for service.
---
 android/ipc-tester.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/android/ipc-tester.c b/android/ipc-tester.c
index 161777d..7dd25e8 100644
--- a/android/ipc-tester.c
+++ b/android/ipc-tester.c
@@ -940,6 +940,10 @@ int main(int argc, char *argv[])
 			HAL_SERVICE_ID_BLUETOOTH,
 			HAL_SERVICE_ID_HANDSFREE_CLIENT);
 
+	test_opcode_valid("MAP_CLIENT", HAL_SERVICE_ID_MAP_CLIENT, 0x01, 0,
+						HAL_SERVICE_ID_BLUETOOTH,
+						HAL_SERVICE_ID_MAP_CLIENT);
+
 	/* check for valid data size */
 	test_datasize_valid("CORE Register+", HAL_SERVICE_ID_CORE,
 			HAL_OP_REGISTER_MODULE,
-- 
1.9.3


^ permalink raw reply related

* [PATCH 04/10] android/ipc-tester: Add missing service opcode boundries test cases
From: Grzegorz Kolodziejczyk @ 2014-10-09 12:45 UTC (permalink / raw)
  To: linux-bluetooth
In-Reply-To: <1412858714-2845-1-git-send-email-grzegorz.kolodziejczyk@tieto.com>

This patch adds tests sending out of range opcode for each service.
---
 android/ipc-tester.c | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/android/ipc-tester.c b/android/ipc-tester.c
index ea71c8d..161777d 100644
--- a/android/ipc-tester.c
+++ b/android/ipc-tester.c
@@ -919,9 +919,23 @@ int main(int argc, char *argv[])
 	test_opcode_valid("PAN", HAL_SERVICE_ID_PAN, 0x05, 0,
 			HAL_SERVICE_ID_BLUETOOTH, HAL_SERVICE_ID_PAN);
 
+	test_opcode_valid("HANDSFREE", HAL_SERVICE_ID_HANDSFREE, 0x0f, 0,
+						HAL_SERVICE_ID_BLUETOOTH,
+						HAL_SERVICE_ID_HANDSFREE);
+
 	test_opcode_valid("A2DP", HAL_SERVICE_ID_A2DP, 0x03, 0,
 			HAL_SERVICE_ID_BLUETOOTH, HAL_SERVICE_ID_A2DP);
 
+	test_opcode_valid("HEALTH", HAL_SERVICE_ID_HEALTH, 0x06, 0,
+						HAL_SERVICE_ID_BLUETOOTH,
+						HAL_SERVICE_ID_HEALTH);
+
+	test_opcode_valid("AVRCP", HAL_SERVICE_ID_AVRCP, 0x0b, 0,
+				HAL_SERVICE_ID_BLUETOOTH, HAL_SERVICE_ID_AVRCP);
+
+	test_opcode_valid("GATT", HAL_SERVICE_ID_GATT, 0x24, 0,
+				HAL_SERVICE_ID_BLUETOOTH, HAL_SERVICE_ID_GATT);
+
 	test_opcode_valid("HF_CLIENT", HAL_SERVICE_ID_HANDSFREE_CLIENT, 0x10, 0,
 			HAL_SERVICE_ID_BLUETOOTH,
 			HAL_SERVICE_ID_HANDSFREE_CLIENT);
-- 
1.9.3


^ permalink raw reply related


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox