All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/9] android/health: Add error check when creating app
@ 2014-06-26 12:04 Andrei Emeltchenko
  2014-06-26 12:04 ` [PATCH 2/9] android/health: Add handling MDL connection request Andrei Emeltchenko
                   ` (9 more replies)
  0 siblings, 10 replies; 42+ messages in thread
From: Andrei Emeltchenko @ 2014-06-26 12:04 UTC (permalink / raw)
  To: linux-bluetooth

From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>

---
 android/health.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/android/health.c b/android/health.c
index 42c9a6e..de67475 100644
--- a/android/health.c
+++ b/android/health.c
@@ -820,6 +820,8 @@ static void bt_health_register_app(const void *buf, uint16_t len)
 
 	app = create_health_app(app_name, provider, srv_name, srv_descr,
 							cmd->num_of_mdep);
+	if (!app)
+		goto fail;
 
 	if (!queue_push_tail(apps, app))
 		goto fail;
@@ -830,7 +832,9 @@ static void bt_health_register_app(const void *buf, uint16_t len)
 	return;
 
 fail:
-	free_health_app(app);
+	if (app)
+		free_health_app(app);
+
 	ipc_send_rsp(hal_ipc, HAL_SERVICE_ID_HEALTH, HAL_OP_HEALTH_MDEP,
 							HAL_STATUS_FAILED);
 }
-- 
1.8.3.2


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* [PATCH 2/9] android/health: Add handling MDL connection request
  2014-06-26 12:04 [PATCH 1/9] android/health: Add error check when creating app Andrei Emeltchenko
@ 2014-06-26 12:04 ` Andrei Emeltchenko
  2014-06-26 14:13   ` Szymon Janc
  2014-06-26 12:04 ` [PATCH 3/9] android/health: Fix wrong callback return type Andrei Emeltchenko
                   ` (8 subsequent siblings)
  9 siblings, 1 reply; 42+ messages in thread
From: Andrei Emeltchenko @ 2014-06-26 12:04 UTC (permalink / raw)
  To: linux-bluetooth

From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>

---
 android/health.c | 33 ++++++++++++++++++++++++++++++++-
 1 file changed, 32 insertions(+), 1 deletion(-)

diff --git a/android/health.c b/android/health.c
index de67475..dd2e5af 100644
--- a/android/health.c
+++ b/android/health.c
@@ -1101,7 +1101,38 @@ static void mcap_mdl_aborted_cb(struct mcap_mdl *mdl, void *data)
 static void mcap_mdl_conn_req_cb(struct mcap_mcl *mcl, uint8_t mdepid,
 				uint16_t mdlid, uint8_t *conf, void *data)
 {
-	DBG("Not Implemeneted");
+	GError *gerr = NULL;
+
+	DBG("Data channel request: mdepid %u mdlid %u", mdepid, mdlid);
+
+	/* TODO: find / create device */
+
+	if (mdepid == HDP_MDEP_ECHO) {
+		switch (*conf) {
+		case HDP_NO_PREFERENCE_DC:
+			*conf = HDP_RELIABLE_DC;
+		case HDP_RELIABLE_DC:
+			break;
+		case HDP_STREAMING_DC:
+			return MCAP_CONFIGURATION_REJECTED;
+		default:
+			/* Special case defined in HDP spec 3.4. When an invalid
+			* configuration is received we shall close the MCL when
+			* we are still processing the callback. */
+			/* TODO close device */
+			return MCAP_CONFIGURATION_REJECTED; /* not processed */
+		}
+
+		if (!mcap_set_data_chan_mode(mcap, L2CAP_MODE_ERTM, &gerr)) {
+			error("Error: %s", gerr->message);
+			g_error_free(gerr);
+			return MCAP_MDL_BUSY;
+		}
+
+		/* TODO: Create channel */
+
+		return MCAP_SUCCESS;
+	}
 }
 
 static void mcap_mdl_reconn_req_cb(struct mcap_mdl *mdl, void *data)
-- 
1.8.3.2


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* [PATCH 3/9] android/health: Fix wrong callback return type
  2014-06-26 12:04 [PATCH 1/9] android/health: Add error check when creating app Andrei Emeltchenko
  2014-06-26 12:04 ` [PATCH 2/9] android/health: Add handling MDL connection request Andrei Emeltchenko
@ 2014-06-26 12:04 ` Andrei Emeltchenko
  2014-06-26 14:35   ` Szymon Janc
  2014-06-26 12:04 ` [PATCH 4/9] android/health: Refactor channel creation Andrei Emeltchenko
                   ` (7 subsequent siblings)
  9 siblings, 1 reply; 42+ messages in thread
From: Andrei Emeltchenko @ 2014-06-26 12:04 UTC (permalink / raw)
  To: linux-bluetooth

From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>

---
 android/health.c | 8 ++++++--
 android/health.h | 8 ++++++++
 2 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/android/health.c b/android/health.c
index dd2e5af..3cb2016 100644
--- a/android/health.c
+++ b/android/health.c
@@ -1098,7 +1098,7 @@ static void mcap_mdl_aborted_cb(struct mcap_mdl *mdl, void *data)
 	DBG("Not Implemeneted");
 }
 
-static void mcap_mdl_conn_req_cb(struct mcap_mcl *mcl, uint8_t mdepid,
+static uint8_t mcap_mdl_conn_req_cb(struct mcap_mcl *mcl, uint8_t mdepid,
 				uint16_t mdlid, uint8_t *conf, void *data)
 {
 	GError *gerr = NULL;
@@ -1133,11 +1133,15 @@ static void mcap_mdl_conn_req_cb(struct mcap_mcl *mcl, uint8_t mdepid,
 
 		return MCAP_SUCCESS;
 	}
+
+	return MCAP_SUCCESS;
 }
 
-static void mcap_mdl_reconn_req_cb(struct mcap_mdl *mdl, void *data)
+static uint8_t mcap_mdl_reconn_req_cb(struct mcap_mdl *mdl, void *data)
 {
 	DBG("Not Implemeneted");
+
+	return MCAP_SUCCESS;
 }
 
 static void connect_mdl_cb(struct mcap_mdl *mdl, GError *gerr, gpointer data)
diff --git a/android/health.h b/android/health.h
index 0b32fd3..ab7d478 100644
--- a/android/health.h
+++ b/android/health.h
@@ -21,5 +21,13 @@
  *
  */
 
+#define HDP_MDEP_ECHO		0x00
+#define HDP_MDEP_INITIAL	0x01
+#define HDP_MDEP_FINAL		0x7F
+
+#define HDP_NO_PREFERENCE_DC	0x00
+#define HDP_RELIABLE_DC		0x01
+#define HDP_STREAMING_DC	0x02
+
 bool bt_health_register(struct ipc *ipc, const bdaddr_t *addr, uint8_t mode);
 void bt_health_unregister(void);
-- 
1.8.3.2


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* [PATCH 4/9] android/health: Refactor channel creation
  2014-06-26 12:04 [PATCH 1/9] android/health: Add error check when creating app Andrei Emeltchenko
  2014-06-26 12:04 ` [PATCH 2/9] android/health: Add handling MDL connection request Andrei Emeltchenko
  2014-06-26 12:04 ` [PATCH 3/9] android/health: Fix wrong callback return type Andrei Emeltchenko
@ 2014-06-26 12:04 ` Andrei Emeltchenko
  2014-06-26 12:04 ` [PATCH 5/9] android/health: Add channel connect Andrei Emeltchenko
                   ` (6 subsequent siblings)
  9 siblings, 0 replies; 42+ messages in thread
From: Andrei Emeltchenko @ 2014-06-26 12:04 UTC (permalink / raw)
  To: linux-bluetooth

From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>

Avoid using app_id when we shall use app structure itself. Otherwise we
end up with unnecessary searches for app and problems for incoming
connections.
---
 android/health.c | 43 ++++++++++++++++++++++---------------------
 1 file changed, 22 insertions(+), 21 deletions(-)

diff --git a/android/health.c b/android/health.c
index 3cb2016..8f91cf1 100644
--- a/android/health.c
+++ b/android/health.c
@@ -1477,43 +1477,37 @@ static struct health_device *create_device(struct health_app *app,
 	return dev;
 }
 
-static struct health_device *get_device(uint16_t app_id, const uint8_t *addr)
+static struct health_app *get_app(uint16_t app_id)
+{
+	return queue_find(apps, match_app_by_id, INT_TO_PTR(app_id));
+}
+
+static struct health_device *get_device(struct health_app *app,
+							const uint8_t *addr)
 {
-	struct health_app *app;
 	struct health_device *dev;
 	bdaddr_t bdaddr;
 
-	app = queue_find(apps, match_app_by_id, INT_TO_PTR(app_id));
-	if (!app)
-		return NULL;
-
 	android2bdaddr(addr, &bdaddr);
 	dev = queue_find(app->devices, match_dev_by_addr, &bdaddr);
 	if (dev)
 		return dev;
 
-	dev = create_device(app, addr);
-	if (dev)
-		dev->app_id = app_id;
-
-	return dev;
+	return create_device(app, addr);
 }
 
-static struct health_channel *create_channel(uint16_t app_id,
+static struct health_channel *create_channel(struct health_app *app,
 						uint8_t mdep_index,
 						struct health_device *dev)
 {
-	struct health_app *app;
 	struct mdep_cfg *mdep;
 	struct health_channel *channel;
 	uint8_t index;
 	static unsigned int channel_id = 1;
 
-	if (!dev)
-		return NULL;
+	DBG("mdep %u", mdep_index);
 
-	app = queue_find(apps, match_app_by_id, INT_TO_PTR(app_id));
-	if (!app)
+	if (!dev || !app)
 		return NULL;
 
 	index = mdep_index + 1;
@@ -1539,7 +1533,7 @@ static struct health_channel *create_channel(uint16_t app_id,
 	return channel;
 }
 
-static struct health_channel *get_channel(uint16_t app_id,
+static struct health_channel *get_channel(struct health_app *app,
 						uint8_t mdep_index,
 						struct health_device *dev)
 {
@@ -1555,7 +1549,7 @@ static struct health_channel *get_channel(uint16_t app_id,
 	if (channel)
 		return channel;
 
-	return create_channel(app_id, mdep_index, dev);
+	return create_channel(app, mdep_index, dev);
 }
 
 static void bt_health_connect_channel(const void *buf, uint16_t len)
@@ -1564,14 +1558,21 @@ static void bt_health_connect_channel(const void *buf, uint16_t len)
 	struct hal_rsp_health_connect_channel rsp;
 	struct health_device *dev = NULL;
 	struct health_channel *channel = NULL;
+	struct health_app *app;
 
 	DBG("");
 
-	dev = get_device(cmd->app_id, cmd->bdaddr);
+	app = get_app(cmd->app_id);
+	if (!app)
+		goto fail;
+
+	dev = get_device(app, cmd->bdaddr);
 	if (!dev)
 		goto fail;
 
-	channel = get_channel(cmd->app_id, cmd->mdep_index, dev);
+	dev->app_id = cmd->app_id;
+
+	channel = get_channel(app, cmd->mdep_index, dev);
 	if (!channel)
 		goto fail;
 
-- 
1.8.3.2


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* [PATCH 5/9] android/health: Add channel connect
  2014-06-26 12:04 [PATCH 1/9] android/health: Add error check when creating app Andrei Emeltchenko
                   ` (2 preceding siblings ...)
  2014-06-26 12:04 ` [PATCH 4/9] android/health: Refactor channel creation Andrei Emeltchenko
@ 2014-06-26 12:04 ` Andrei Emeltchenko
  2014-06-26 12:04 ` [PATCH 6/9] android/health: Assign channel to user_data Andrei Emeltchenko
                   ` (5 subsequent siblings)
  9 siblings, 0 replies; 42+ messages in thread
From: Andrei Emeltchenko @ 2014-06-26 12:04 UTC (permalink / raw)
  To: linux-bluetooth

From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>

Connect channel on incoming connection callback
---
 android/health.c | 190 ++++++++++++++++++++++++++++++++-----------------------
 1 file changed, 111 insertions(+), 79 deletions(-)

diff --git a/android/health.c b/android/health.c
index 8f91cf1..7624790 100644
--- a/android/health.c
+++ b/android/health.c
@@ -1098,14 +1098,125 @@ static void mcap_mdl_aborted_cb(struct mcap_mdl *mdl, void *data)
 	DBG("Not Implemeneted");
 }
 
+static struct health_device *create_device(struct health_app *app,
+							const uint8_t *addr)
+{
+	struct health_device *dev;
+
+	if (!app)
+		return NULL;
+
+	/* create device and push it to devices queue */
+	dev = new0(struct health_device, 1);
+	if (!dev)
+		return NULL;
+
+	android2bdaddr(addr, &dev->dst);
+	dev->channels = queue_new();
+	if (!dev->channels) {
+		free_health_device(dev);
+		return NULL;
+	}
+
+	if (!queue_push_tail(app->devices, dev)) {
+		free_health_device(dev);
+		return NULL;
+	}
+
+	return dev;
+}
+
+static struct health_device *get_device(struct health_app *app,
+							const uint8_t *addr)
+{
+	struct health_device *dev;
+	bdaddr_t bdaddr;
+
+	android2bdaddr(addr, &bdaddr);
+	dev = queue_find(app->devices, match_dev_by_addr, &bdaddr);
+	if (dev)
+		return dev;
+
+	return create_device(app, addr);
+}
+
+static struct health_channel *create_channel(struct health_app *app,
+						uint8_t mdep_index,
+						struct health_device *dev)
+{
+	struct mdep_cfg *mdep;
+	struct health_channel *channel;
+	uint8_t index;
+	static unsigned int channel_id = 1;
+
+	DBG("mdep %u", mdep_index);
+
+	if (!dev || !app)
+		return NULL;
+
+	index = mdep_index + 1;
+	mdep = queue_find(app->mdeps, match_mdep_by_id, INT_TO_PTR(index));
+	if (!mdep)
+		return NULL;
+
+	/* create channel and push it to device */
+	channel = new0(struct health_channel, 1);
+	if (!channel)
+		return NULL;
+
+	channel->mdep_id = mdep->id;
+	channel->type = mdep->channel_type;
+	channel->id = channel_id++;
+	channel->dev = dev;
+
+	if (!queue_push_tail(dev->channels, channel)) {
+		free_health_channel(channel);
+		return NULL;
+	}
+
+	return channel;
+}
+
+static struct health_channel *connect_channel(struct mcap_mcl *mcl,
+								uint8_t mdepid)
+{
+	struct health_app *app;
+	struct health_device *device;
+	struct health_channel *channel = NULL;
+	bdaddr_t addr;
+
+	mcap_mcl_get_addr(mcl, &addr);
+
+	/* TODO: Search app for mdepid */
+
+	if (mdepid == HDP_MDEP_ECHO) {
+		/* For echo service take last app */
+		app = queue_peek_tail(apps);
+		if (!app)
+			return NULL;
+
+		device = get_device(app, (uint8_t *) &addr);
+		if (!device)
+			return NULL;
+
+		channel = create_channel(app, mdepid, device);
+	}
+
+	return channel;
+}
+
 static uint8_t mcap_mdl_conn_req_cb(struct mcap_mcl *mcl, uint8_t mdepid,
 				uint16_t mdlid, uint8_t *conf, void *data)
 {
 	GError *gerr = NULL;
+	struct health_channel *channel;
 
 	DBG("Data channel request: mdepid %u mdlid %u", mdepid, mdlid);
 
 	/* TODO: find / create device */
+	channel = connect_channel(mcl, mdepid);
+	if (!channel)
+		return MCAP_MDL_BUSY;
 
 	if (mdepid == HDP_MDEP_ECHO) {
 		switch (*conf) {
@@ -1449,90 +1560,11 @@ static int connect_mcl(struct health_channel *channel)
 						search_cb, channel, NULL, 0);
 }
 
-static struct health_device *create_device(struct health_app *app,
-							const uint8_t *addr)
-{
-	struct health_device *dev;
-
-	if (!app)
-		return NULL;
-
-	/* create device and push it to devices queue */
-	dev = new0(struct health_device, 1);
-	if (!dev)
-		return NULL;
-
-	android2bdaddr(addr, &dev->dst);
-	dev->channels = queue_new();
-	if (!dev->channels) {
-		free_health_device(dev);
-		return NULL;
-	}
-
-	if (!queue_push_tail(app->devices, dev)) {
-		free_health_device(dev);
-		return NULL;
-	}
-
-	return dev;
-}
-
 static struct health_app *get_app(uint16_t app_id)
 {
 	return queue_find(apps, match_app_by_id, INT_TO_PTR(app_id));
 }
 
-static struct health_device *get_device(struct health_app *app,
-							const uint8_t *addr)
-{
-	struct health_device *dev;
-	bdaddr_t bdaddr;
-
-	android2bdaddr(addr, &bdaddr);
-	dev = queue_find(app->devices, match_dev_by_addr, &bdaddr);
-	if (dev)
-		return dev;
-
-	return create_device(app, addr);
-}
-
-static struct health_channel *create_channel(struct health_app *app,
-						uint8_t mdep_index,
-						struct health_device *dev)
-{
-	struct mdep_cfg *mdep;
-	struct health_channel *channel;
-	uint8_t index;
-	static unsigned int channel_id = 1;
-
-	DBG("mdep %u", mdep_index);
-
-	if (!dev || !app)
-		return NULL;
-
-	index = mdep_index + 1;
-	mdep = queue_find(app->mdeps, match_mdep_by_id, INT_TO_PTR(index));
-	if (!mdep)
-		return NULL;
-
-	/* create channel and push it to device */
-	channel = new0(struct health_channel, 1);
-	if (!channel)
-		return NULL;
-
-	channel->mdep_id = mdep->id;
-	channel->type = mdep->channel_type;
-	channel->id = channel_id++;
-	channel->dev = dev;
-
-	if (!queue_push_tail(dev->channels, channel)) {
-		free_health_channel(channel);
-		return NULL;
-	}
-
-	return channel;
-}
-
 static struct health_channel *get_channel(struct health_app *app,
 						uint8_t mdep_index,
 						struct health_device *dev)
-- 
1.8.3.2


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* [PATCH 6/9] android/health: Assign channel to user_data
  2014-06-26 12:04 [PATCH 1/9] android/health: Add error check when creating app Andrei Emeltchenko
                   ` (3 preceding siblings ...)
  2014-06-26 12:04 ` [PATCH 5/9] android/health: Add channel connect Andrei Emeltchenko
@ 2014-06-26 12:04 ` Andrei Emeltchenko
  2014-06-26 12:04 ` [PATCH 7/9] android/health: Create mdep for ECHO channel Andrei Emeltchenko
                   ` (4 subsequent siblings)
  9 siblings, 0 replies; 42+ messages in thread
From: Andrei Emeltchenko @ 2014-06-26 12:04 UTC (permalink / raw)
  To: linux-bluetooth

From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>

Assign channel for incoming connections when it is created.
---
 android/health.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/android/health.c b/android/health.c
index 7624790..6998913 100644
--- a/android/health.c
+++ b/android/health.c
@@ -1202,6 +1202,9 @@ static struct health_channel *connect_channel(struct mcap_mcl *mcl,
 		channel = create_channel(app, mdepid, device);
 	}
 
+	/* Device is created here */
+	mcl->cb->user_data = channel;
+
 	return channel;
 }
 
-- 
1.8.3.2


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* [PATCH 7/9] android/health: Create mdep for ECHO channel
  2014-06-26 12:04 [PATCH 1/9] android/health: Add error check when creating app Andrei Emeltchenko
                   ` (4 preceding siblings ...)
  2014-06-26 12:04 ` [PATCH 6/9] android/health: Assign channel to user_data Andrei Emeltchenko
@ 2014-06-26 12:04 ` Andrei Emeltchenko
  2014-06-26 12:04 ` [PATCH 8/9] android/health: Add handling for ECHO service Andrei Emeltchenko
                   ` (3 subsequent siblings)
  9 siblings, 0 replies; 42+ messages in thread
From: Andrei Emeltchenko @ 2014-06-26 12:04 UTC (permalink / raw)
  To: linux-bluetooth

From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>

---
 android/health.c | 22 +++++++++++++++++-----
 1 file changed, 17 insertions(+), 5 deletions(-)

diff --git a/android/health.c b/android/health.c
index 6998913..a12933b 100644
--- a/android/health.c
+++ b/android/health.c
@@ -1146,7 +1146,6 @@ static struct health_channel *create_channel(struct health_app *app,
 {
 	struct mdep_cfg *mdep;
 	struct health_channel *channel;
-	uint8_t index;
 	static unsigned int channel_id = 1;
 
 	DBG("mdep %u", mdep_index);
@@ -1154,10 +1153,23 @@ static struct health_channel *create_channel(struct health_app *app,
 	if (!dev || !app)
 		return NULL;
 
-	index = mdep_index + 1;
-	mdep = queue_find(app->mdeps, match_mdep_by_id, INT_TO_PTR(index));
-	if (!mdep)
-		return NULL;
+	mdep = queue_find(app->mdeps, match_mdep_by_id, INT_TO_PTR(mdep_index));
+	if (!mdep) {
+		if (mdep_index == HDP_MDEP_ECHO) {
+			mdep = new0(struct mdep_cfg, 1);
+			if (!mdep)
+				return NULL;
+
+			/* Leave other configuration zeroes */
+			mdep->id = HDP_MDEP_ECHO;
+
+			if (!queue_push_tail(app->mdeps, mdep)) {
+				free_mdep_cfg(mdep);
+				return NULL;
+			}
+		} else
+			return NULL;
+	}
 
 	/* create channel and push it to device */
 	channel = new0(struct health_channel, 1);
-- 
1.8.3.2


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* [PATCH 8/9] android/health: Add handling for ECHO service
  2014-06-26 12:04 [PATCH 1/9] android/health: Add error check when creating app Andrei Emeltchenko
                   ` (5 preceding siblings ...)
  2014-06-26 12:04 ` [PATCH 7/9] android/health: Create mdep for ECHO channel Andrei Emeltchenko
@ 2014-06-26 12:04 ` Andrei Emeltchenko
  2014-06-26 12:04 ` [PATCH 9/9] android/health: Improve debug Andrei Emeltchenko
                   ` (2 subsequent siblings)
  9 siblings, 0 replies; 42+ messages in thread
From: Andrei Emeltchenko @ 2014-06-26 12:04 UTC (permalink / raw)
  To: linux-bluetooth

From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>

Reply received buffer back for ECHO service.
---
 android/health.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 62 insertions(+), 1 deletion(-)

diff --git a/android/health.c b/android/health.c
index a12933b..2d52197 100644
--- a/android/health.c
+++ b/android/health.c
@@ -1054,9 +1054,70 @@ static int get_dcpsm(sdp_list_t *recs, uint16_t *dcpsm)
 	return -1;
 }
 
+static int send_echo_data(int sock, const void *buf, uint32_t size)
+{
+	const uint8_t *buf_b = buf;
+	uint32_t sent = 0;
+
+	while (sent < size) {
+		int n = write(sock, buf_b + sent, size - sent);
+		if (n < 0)
+			return -1;
+		sent += n;
+	}
+
+	return 0;
+}
+
+static gboolean serve_echo(GIOChannel *io, GIOCondition cond, gpointer data)
+{
+	struct health_channel *channel = data;
+	uint8_t buf[MCAP_DC_MTU];
+	int fd, len;
+
+	DBG("channel %p", channel);
+
+	if (cond & (G_IO_ERR | G_IO_HUP | G_IO_NVAL)) {
+		DBG("Error condition on channel");
+		return FALSE;
+	}
+
+	fd = g_io_channel_unix_get_fd(io);
+
+	len = read(fd, buf, sizeof(buf));
+	if (len < 0)
+		goto fail;
+
+	if (send_echo_data(fd, buf, len)  >= 0)
+		return TRUE;
+
+fail:
+	free_health_device(channel->dev);
+	return FALSE;
+}
+
 static void mcap_mdl_connected_cb(struct mcap_mdl *mdl, void *data)
 {
-	DBG("Not Implemeneted");
+	struct health_channel *channel = data;
+
+	if (!channel->mdl)
+		channel->mdl = mcap_mdl_ref(mdl);
+
+	DBG("Data channel connected: mdl %p channel %p", mdl, channel);
+
+	if (channel->mdep_id == HDP_MDEP_ECHO) {
+		GIOChannel *io;
+		int fd;
+
+		fd = mcap_mdl_get_fd(channel->mdl);
+		if (fd < 0)
+			return;
+
+		io = g_io_channel_unix_new(fd);
+		g_io_add_watch(io, G_IO_ERR | G_IO_HUP | G_IO_NVAL | G_IO_IN,
+							serve_echo, channel);
+		g_io_channel_unref(io);
+	}
 }
 
 static void mcap_mdl_closed_cb(struct mcap_mdl *mdl, void *data)
-- 
1.8.3.2


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* [PATCH 9/9] android/health: Improve debug
  2014-06-26 12:04 [PATCH 1/9] android/health: Add error check when creating app Andrei Emeltchenko
                   ` (6 preceding siblings ...)
  2014-06-26 12:04 ` [PATCH 8/9] android/health: Add handling for ECHO service Andrei Emeltchenko
@ 2014-06-26 12:04 ` Andrei Emeltchenko
  2014-06-27  7:39 ` [PATCHv2 1/9] android/health: Add error check when creating app Andrei Emeltchenko
  2014-06-27  7:59 ` [PATCH] android/pts: Update HDP test results Andrei Emeltchenko
  9 siblings, 0 replies; 42+ messages in thread
From: Andrei Emeltchenko @ 2014-06-26 12:04 UTC (permalink / raw)
  To: linux-bluetooth

From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>

---
 android/health.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/android/health.c b/android/health.c
index 2d52197..a12970d 100644
--- a/android/health.c
+++ b/android/health.c
@@ -160,6 +160,8 @@ static void free_health_channel(void *data)
 {
 	struct health_channel *channel = data;
 
+	DBG("channel %p", channel);
+
 	if (!channel)
 		return;
 
@@ -1137,12 +1139,13 @@ static void mcap_mdl_deleted_cb(struct mcap_mdl *mdl, void *data)
 	struct health_channel *channel = data;
 	struct health_device *dev;
 
-	DBG("");
-
 	if (!channel)
 		return;
 
 	dev = channel->dev;
+
+	DBG("device %p channel %p mdl %p", dev, channel, mdl);
+
 	/* mdl == NULL means, delete all mdls */
 	if (!mdl) {
 		queue_foreach(dev->channels, notify_channel, NULL);
@@ -1258,6 +1261,8 @@ static struct health_channel *connect_channel(struct mcap_mcl *mcl,
 	struct health_channel *channel = NULL;
 	bdaddr_t addr;
 
+	DBG("mcl %p mdepid %u", mcl, mdepid);
+
 	mcap_mcl_get_addr(mcl, &addr);
 
 	/* TODO: Search app for mdepid */
-- 
1.8.3.2


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* Re: [PATCH 2/9] android/health: Add handling MDL connection request
  2014-06-26 12:04 ` [PATCH 2/9] android/health: Add handling MDL connection request Andrei Emeltchenko
@ 2014-06-26 14:13   ` Szymon Janc
  0 siblings, 0 replies; 42+ messages in thread
From: Szymon Janc @ 2014-06-26 14:13 UTC (permalink / raw)
  To: Andrei Emeltchenko; +Cc: linux-bluetooth

Hi Andrei,

On Thursday 26 of June 2014 15:04:18 Andrei Emeltchenko wrote:
> From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
> 
> ---
>  android/health.c | 33 ++++++++++++++++++++++++++++++++-
>  1 file changed, 32 insertions(+), 1 deletion(-)
> 
> diff --git a/android/health.c b/android/health.c
> index de67475..dd2e5af 100644
> --- a/android/health.c
> +++ b/android/health.c
> @@ -1101,7 +1101,38 @@ static void mcap_mdl_aborted_cb(struct mcap_mdl *mdl, void *data)
>  static void mcap_mdl_conn_req_cb(struct mcap_mcl *mcl, uint8_t mdepid,
>  				uint16_t mdlid, uint8_t *conf, void *data)
>  {
> -	DBG("Not Implemeneted");
> +	GError *gerr = NULL;
> +
> +	DBG("Data channel request: mdepid %u mdlid %u", mdepid, mdlid);
> +
> +	/* TODO: find / create device */
> +
> +	if (mdepid == HDP_MDEP_ECHO) {
> +		switch (*conf) {
> +		case HDP_NO_PREFERENCE_DC:
> +			*conf = HDP_RELIABLE_DC;
> +		case HDP_RELIABLE_DC:
> +			break;
> +		case HDP_STREAMING_DC:
> +			return MCAP_CONFIGURATION_REJECTED;

Does this compile? mcap_mdl_conn_req_cb() is returning void.

> +		default:
> +			/* Special case defined in HDP spec 3.4. When an invalid
> +			* configuration is received we shall close the MCL when
> +			* we are still processing the callback. */

Comment style is not correct.

> +			/* TODO close device */
> +			return MCAP_CONFIGURATION_REJECTED; /* not processed */
> +		}
> +
> +		if (!mcap_set_data_chan_mode(mcap, L2CAP_MODE_ERTM, &gerr)) {
> +			error("Error: %s", gerr->message);
> +			g_error_free(gerr);
> +			return MCAP_MDL_BUSY;
> +		}
> +
> +		/* TODO: Create channel */
> +
> +		return MCAP_SUCCESS;
> +	}
>  }
>  
>  static void mcap_mdl_reconn_req_cb(struct mcap_mdl *mdl, void *data)
> 

-- 
Best regards, 
Szymon Janc

^ permalink raw reply	[flat|nested] 42+ messages in thread

* Re: [PATCH 3/9] android/health: Fix wrong callback return type
  2014-06-26 12:04 ` [PATCH 3/9] android/health: Fix wrong callback return type Andrei Emeltchenko
@ 2014-06-26 14:35   ` Szymon Janc
  0 siblings, 0 replies; 42+ messages in thread
From: Szymon Janc @ 2014-06-26 14:35 UTC (permalink / raw)
  To: Andrei Emeltchenko; +Cc: linux-bluetooth

Hi Andrei,

On Thursday 26 of June 2014 15:04:19 Andrei Emeltchenko wrote:
> From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
> 
> ---
>  android/health.c | 8 ++++++--
>  android/health.h | 8 ++++++++
>  2 files changed, 14 insertions(+), 2 deletions(-)
> 
> diff --git a/android/health.c b/android/health.c
> index dd2e5af..3cb2016 100644
> --- a/android/health.c
> +++ b/android/health.c
> @@ -1098,7 +1098,7 @@ static void mcap_mdl_aborted_cb(struct mcap_mdl *mdl, void *data)
>  	DBG("Not Implemeneted");
>  }
>  
> -static void mcap_mdl_conn_req_cb(struct mcap_mcl *mcl, uint8_t mdepid,
> +static uint8_t mcap_mdl_conn_req_cb(struct mcap_mcl *mcl, uint8_t mdepid,
>  				uint16_t mdlid, uint8_t *conf, void *data)
>  {
>  	GError *gerr = NULL;
> @@ -1133,11 +1133,15 @@ static void mcap_mdl_conn_req_cb(struct mcap_mcl *mcl, uint8_t mdepid,
>  
>  		return MCAP_SUCCESS;
>  	}
> +
> +	return MCAP_SUCCESS;
>  }
>  
> -static void mcap_mdl_reconn_req_cb(struct mcap_mdl *mdl, void *data)
> +static uint8_t mcap_mdl_reconn_req_cb(struct mcap_mdl *mdl, void *data)
>  {
>  	DBG("Not Implemeneted");
> +
> +	return MCAP_SUCCESS;
>  }
>  
>  static void connect_mdl_cb(struct mcap_mdl *mdl, GError *gerr, gpointer data)
> diff --git a/android/health.h b/android/health.h
> index 0b32fd3..ab7d478 100644
> --- a/android/health.h
> +++ b/android/health.h
> @@ -21,5 +21,13 @@
>   *
>   */
>  
> +#define HDP_MDEP_ECHO		0x00
> +#define HDP_MDEP_INITIAL	0x01
> +#define HDP_MDEP_FINAL		0x7F
> +
> +#define HDP_NO_PREFERENCE_DC	0x00
> +#define HDP_RELIABLE_DC		0x01
> +#define HDP_STREAMING_DC	0x02
> +
>  bool bt_health_register(struct ipc *ipc, const bdaddr_t *addr, uint8_t mode);
>  void bt_health_unregister(void);
> 

This should go before Patch 2, to avoid build errors.

-- 
Best regards, 
Szymon Janc

^ permalink raw reply	[flat|nested] 42+ messages in thread

* [PATCHv2 1/9] android/health: Add error check when creating app
  2014-06-26 12:04 [PATCH 1/9] android/health: Add error check when creating app Andrei Emeltchenko
                   ` (7 preceding siblings ...)
  2014-06-26 12:04 ` [PATCH 9/9] android/health: Improve debug Andrei Emeltchenko
@ 2014-06-27  7:39 ` Andrei Emeltchenko
  2014-06-27  7:39   ` [PATCHv2 2/9] android/health: Fix wrong callback return type Andrei Emeltchenko
                     ` (7 more replies)
  2014-06-27  7:59 ` [PATCH] android/pts: Update HDP test results Andrei Emeltchenko
  9 siblings, 8 replies; 42+ messages in thread
From: Andrei Emeltchenko @ 2014-06-27  7:39 UTC (permalink / raw)
  To: linux-bluetooth

From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>

---
 android/health.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/android/health.c b/android/health.c
index 42c9a6e..de67475 100644
--- a/android/health.c
+++ b/android/health.c
@@ -820,6 +820,8 @@ static void bt_health_register_app(const void *buf, uint16_t len)
 
 	app = create_health_app(app_name, provider, srv_name, srv_descr,
 							cmd->num_of_mdep);
+	if (!app)
+		goto fail;
 
 	if (!queue_push_tail(apps, app))
 		goto fail;
@@ -830,7 +832,9 @@ static void bt_health_register_app(const void *buf, uint16_t len)
 	return;
 
 fail:
-	free_health_app(app);
+	if (app)
+		free_health_app(app);
+
 	ipc_send_rsp(hal_ipc, HAL_SERVICE_ID_HEALTH, HAL_OP_HEALTH_MDEP,
 							HAL_STATUS_FAILED);
 }
-- 
1.8.3.2


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* [PATCHv2 2/9] android/health: Fix wrong callback return type
  2014-06-27  7:39 ` [PATCHv2 1/9] android/health: Add error check when creating app Andrei Emeltchenko
@ 2014-06-27  7:39   ` Andrei Emeltchenko
  2014-06-27  7:39   ` [PATCHv2 3/9] android/health: Add handling MDL connection request Andrei Emeltchenko
                     ` (6 subsequent siblings)
  7 siblings, 0 replies; 42+ messages in thread
From: Andrei Emeltchenko @ 2014-06-27  7:39 UTC (permalink / raw)
  To: linux-bluetooth

From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>

---
 android/health.c | 8 ++++++--
 android/health.h | 8 ++++++++
 2 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/android/health.c b/android/health.c
index de67475..140afee 100644
--- a/android/health.c
+++ b/android/health.c
@@ -1098,15 +1098,19 @@ static void mcap_mdl_aborted_cb(struct mcap_mdl *mdl, void *data)
 	DBG("Not Implemeneted");
 }
 
-static void mcap_mdl_conn_req_cb(struct mcap_mcl *mcl, uint8_t mdepid,
+static uint8_t mcap_mdl_conn_req_cb(struct mcap_mcl *mcl, uint8_t mdepid,
 				uint16_t mdlid, uint8_t *conf, void *data)
 {
 	DBG("Not Implemeneted");
+
+	return MCAP_SUCCESS;
 }
 
-static void mcap_mdl_reconn_req_cb(struct mcap_mdl *mdl, void *data)
+static uint8_t mcap_mdl_reconn_req_cb(struct mcap_mdl *mdl, void *data)
 {
 	DBG("Not Implemeneted");
+
+	return MCAP_SUCCESS;
 }
 
 static void connect_mdl_cb(struct mcap_mdl *mdl, GError *gerr, gpointer data)
diff --git a/android/health.h b/android/health.h
index 0b32fd3..ab7d478 100644
--- a/android/health.h
+++ b/android/health.h
@@ -21,5 +21,13 @@
  *
  */
 
+#define HDP_MDEP_ECHO		0x00
+#define HDP_MDEP_INITIAL	0x01
+#define HDP_MDEP_FINAL		0x7F
+
+#define HDP_NO_PREFERENCE_DC	0x00
+#define HDP_RELIABLE_DC		0x01
+#define HDP_STREAMING_DC	0x02
+
 bool bt_health_register(struct ipc *ipc, const bdaddr_t *addr, uint8_t mode);
 void bt_health_unregister(void);
-- 
1.8.3.2


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* [PATCHv2 3/9] android/health: Add handling MDL connection request
  2014-06-27  7:39 ` [PATCHv2 1/9] android/health: Add error check when creating app Andrei Emeltchenko
  2014-06-27  7:39   ` [PATCHv2 2/9] android/health: Fix wrong callback return type Andrei Emeltchenko
@ 2014-06-27  7:39   ` Andrei Emeltchenko
  2014-06-27  7:39   ` [PATCHv2 4/9] android/health: Refactor channel creation Andrei Emeltchenko
                     ` (5 subsequent siblings)
  7 siblings, 0 replies; 42+ messages in thread
From: Andrei Emeltchenko @ 2014-06-27  7:39 UTC (permalink / raw)
  To: linux-bluetooth

From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>

---
 android/health.c | 33 ++++++++++++++++++++++++++++++++-
 1 file changed, 32 insertions(+), 1 deletion(-)

diff --git a/android/health.c b/android/health.c
index 140afee..3cb2016 100644
--- a/android/health.c
+++ b/android/health.c
@@ -1101,7 +1101,38 @@ static void mcap_mdl_aborted_cb(struct mcap_mdl *mdl, void *data)
 static uint8_t mcap_mdl_conn_req_cb(struct mcap_mcl *mcl, uint8_t mdepid,
 				uint16_t mdlid, uint8_t *conf, void *data)
 {
-	DBG("Not Implemeneted");
+	GError *gerr = NULL;
+
+	DBG("Data channel request: mdepid %u mdlid %u", mdepid, mdlid);
+
+	/* TODO: find / create device */
+
+	if (mdepid == HDP_MDEP_ECHO) {
+		switch (*conf) {
+		case HDP_NO_PREFERENCE_DC:
+			*conf = HDP_RELIABLE_DC;
+		case HDP_RELIABLE_DC:
+			break;
+		case HDP_STREAMING_DC:
+			return MCAP_CONFIGURATION_REJECTED;
+		default:
+			/* Special case defined in HDP spec 3.4. When an invalid
+			* configuration is received we shall close the MCL when
+			* we are still processing the callback. */
+			/* TODO close device */
+			return MCAP_CONFIGURATION_REJECTED; /* not processed */
+		}
+
+		if (!mcap_set_data_chan_mode(mcap, L2CAP_MODE_ERTM, &gerr)) {
+			error("Error: %s", gerr->message);
+			g_error_free(gerr);
+			return MCAP_MDL_BUSY;
+		}
+
+		/* TODO: Create channel */
+
+		return MCAP_SUCCESS;
+	}
 
 	return MCAP_SUCCESS;
 }
-- 
1.8.3.2


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* [PATCHv2 4/9] android/health: Refactor channel creation
  2014-06-27  7:39 ` [PATCHv2 1/9] android/health: Add error check when creating app Andrei Emeltchenko
  2014-06-27  7:39   ` [PATCHv2 2/9] android/health: Fix wrong callback return type Andrei Emeltchenko
  2014-06-27  7:39   ` [PATCHv2 3/9] android/health: Add handling MDL connection request Andrei Emeltchenko
@ 2014-06-27  7:39   ` Andrei Emeltchenko
  2014-06-27  7:39   ` [PATCHv2 5/9] android/health: Add channel connect Andrei Emeltchenko
                     ` (4 subsequent siblings)
  7 siblings, 0 replies; 42+ messages in thread
From: Andrei Emeltchenko @ 2014-06-27  7:39 UTC (permalink / raw)
  To: linux-bluetooth

From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>

Avoid using app_id when we shall use app structure itself. Otherwise we
end up with unnecessary searches for app and problems for incoming
connections.
---
 android/health.c | 43 ++++++++++++++++++++++---------------------
 1 file changed, 22 insertions(+), 21 deletions(-)

diff --git a/android/health.c b/android/health.c
index 3cb2016..d664324 100644
--- a/android/health.c
+++ b/android/health.c
@@ -1477,43 +1477,37 @@ static struct health_device *create_device(struct health_app *app,
 	return dev;
 }
 
-static struct health_device *get_device(uint16_t app_id, const uint8_t *addr)
+static struct health_app *get_app(uint16_t app_id)
+{
+	return queue_find(apps, match_app_by_id, INT_TO_PTR(app_id));
+}
+
+static struct health_device *get_device(struct health_app *app,
+							const uint8_t *addr)
 {
-	struct health_app *app;
 	struct health_device *dev;
 	bdaddr_t bdaddr;
 
-	app = queue_find(apps, match_app_by_id, INT_TO_PTR(app_id));
-	if (!app)
-		return NULL;
-
 	android2bdaddr(addr, &bdaddr);
 	dev = queue_find(app->devices, match_dev_by_addr, &bdaddr);
 	if (dev)
 		return dev;
 
-	dev = create_device(app, addr);
-	if (dev)
-		dev->app_id = app_id;
-
-	return dev;
+	return create_device(app, addr);
 }
 
-static struct health_channel *create_channel(uint16_t app_id,
+static struct health_channel *create_channel(struct health_app *app,
 						uint8_t mdep_index,
 						struct health_device *dev)
 {
-	struct health_app *app;
 	struct mdep_cfg *mdep;
 	struct health_channel *channel;
 	uint8_t index;
 	static unsigned int channel_id = 1;
 
-	if (!dev)
-		return NULL;
+	DBG("mdep %u", mdep_index);
 
-	app = queue_find(apps, match_app_by_id, INT_TO_PTR(app_id));
-	if (!app)
+	if (!dev || !app)
 		return NULL;
 
 	index = mdep_index + 1;
@@ -1539,7 +1533,7 @@ static struct health_channel *create_channel(uint16_t app_id,
 	return channel;
 }
 
-static struct health_channel *get_channel(uint16_t app_id,
+static struct health_channel *get_channel(struct health_app *app,
 						uint8_t mdep_index,
 						struct health_device *dev)
 {
@@ -1555,7 +1549,7 @@ static struct health_channel *get_channel(uint16_t app_id,
 	if (channel)
 		return channel;
 
-	return create_channel(app_id, mdep_index, dev);
+	return create_channel(app, index, dev);
 }
 
 static void bt_health_connect_channel(const void *buf, uint16_t len)
@@ -1564,14 +1558,21 @@ static void bt_health_connect_channel(const void *buf, uint16_t len)
 	struct hal_rsp_health_connect_channel rsp;
 	struct health_device *dev = NULL;
 	struct health_channel *channel = NULL;
+	struct health_app *app;
 
 	DBG("");
 
-	dev = get_device(cmd->app_id, cmd->bdaddr);
+	app = get_app(cmd->app_id);
+	if (!app)
+		goto fail;
+
+	dev = get_device(app, cmd->bdaddr);
 	if (!dev)
 		goto fail;
 
-	channel = get_channel(cmd->app_id, cmd->mdep_index, dev);
+	dev->app_id = cmd->app_id;
+
+	channel = get_channel(app, cmd->mdep_index, dev);
 	if (!channel)
 		goto fail;
 
-- 
1.8.3.2


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* [PATCHv2 5/9] android/health: Add channel connect
  2014-06-27  7:39 ` [PATCHv2 1/9] android/health: Add error check when creating app Andrei Emeltchenko
                     ` (2 preceding siblings ...)
  2014-06-27  7:39   ` [PATCHv2 4/9] android/health: Refactor channel creation Andrei Emeltchenko
@ 2014-06-27  7:39   ` Andrei Emeltchenko
  2014-06-27  7:40   ` [PATCHv2 6/9] android/health: Assign channel to user_data Andrei Emeltchenko
                     ` (3 subsequent siblings)
  7 siblings, 0 replies; 42+ messages in thread
From: Andrei Emeltchenko @ 2014-06-27  7:39 UTC (permalink / raw)
  To: linux-bluetooth

From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>

Connect channel on incoming connection callback
---
 android/health.c | 190 ++++++++++++++++++++++++++++++++-----------------------
 1 file changed, 111 insertions(+), 79 deletions(-)

diff --git a/android/health.c b/android/health.c
index d664324..ff2c663 100644
--- a/android/health.c
+++ b/android/health.c
@@ -1098,14 +1098,125 @@ static void mcap_mdl_aborted_cb(struct mcap_mdl *mdl, void *data)
 	DBG("Not Implemeneted");
 }
 
+static struct health_device *create_device(struct health_app *app,
+							const uint8_t *addr)
+{
+	struct health_device *dev;
+
+	if (!app)
+		return NULL;
+
+	/* create device and push it to devices queue */
+	dev = new0(struct health_device, 1);
+	if (!dev)
+		return NULL;
+
+	android2bdaddr(addr, &dev->dst);
+	dev->channels = queue_new();
+	if (!dev->channels) {
+		free_health_device(dev);
+		return NULL;
+	}
+
+	if (!queue_push_tail(app->devices, dev)) {
+		free_health_device(dev);
+		return NULL;
+	}
+
+	return dev;
+}
+
+static struct health_device *get_device(struct health_app *app,
+							const uint8_t *addr)
+{
+	struct health_device *dev;
+	bdaddr_t bdaddr;
+
+	android2bdaddr(addr, &bdaddr);
+	dev = queue_find(app->devices, match_dev_by_addr, &bdaddr);
+	if (dev)
+		return dev;
+
+	return create_device(app, addr);
+}
+
+static struct health_channel *create_channel(struct health_app *app,
+						uint8_t mdep_index,
+						struct health_device *dev)
+{
+	struct mdep_cfg *mdep;
+	struct health_channel *channel;
+	uint8_t index;
+	static unsigned int channel_id = 1;
+
+	DBG("mdep %u", mdep_index);
+
+	if (!dev || !app)
+		return NULL;
+
+	index = mdep_index + 1;
+	mdep = queue_find(app->mdeps, match_mdep_by_id, INT_TO_PTR(index));
+	if (!mdep)
+		return NULL;
+
+	/* create channel and push it to device */
+	channel = new0(struct health_channel, 1);
+	if (!channel)
+		return NULL;
+
+	channel->mdep_id = mdep->id;
+	channel->type = mdep->channel_type;
+	channel->id = channel_id++;
+	channel->dev = dev;
+
+	if (!queue_push_tail(dev->channels, channel)) {
+		free_health_channel(channel);
+		return NULL;
+	}
+
+	return channel;
+}
+
+static struct health_channel *connect_channel(struct mcap_mcl *mcl,
+								uint8_t mdepid)
+{
+	struct health_app *app;
+	struct health_device *device;
+	struct health_channel *channel = NULL;
+	bdaddr_t addr;
+
+	mcap_mcl_get_addr(mcl, &addr);
+
+	/* TODO: Search app for mdepid */
+
+	if (mdepid == HDP_MDEP_ECHO) {
+		/* For echo service take last app */
+		app = queue_peek_tail(apps);
+		if (!app)
+			return NULL;
+
+		device = get_device(app, (uint8_t *) &addr);
+		if (!device)
+			return NULL;
+
+		channel = create_channel(app, mdepid, device);
+	}
+
+	return channel;
+}
+
 static uint8_t mcap_mdl_conn_req_cb(struct mcap_mcl *mcl, uint8_t mdepid,
 				uint16_t mdlid, uint8_t *conf, void *data)
 {
 	GError *gerr = NULL;
+	struct health_channel *channel;
 
 	DBG("Data channel request: mdepid %u mdlid %u", mdepid, mdlid);
 
 	/* TODO: find / create device */
+	channel = connect_channel(mcl, mdepid);
+	if (!channel)
+		return MCAP_MDL_BUSY;
 
 	if (mdepid == HDP_MDEP_ECHO) {
 		switch (*conf) {
@@ -1449,90 +1560,11 @@ static int connect_mcl(struct health_channel *channel)
 						search_cb, channel, NULL, 0);
 }
 
-static struct health_device *create_device(struct health_app *app,
-							const uint8_t *addr)
-{
-	struct health_device *dev;
-
-	if (!app)
-		return NULL;
-
-	/* create device and push it to devices queue */
-	dev = new0(struct health_device, 1);
-	if (!dev)
-		return NULL;
-
-	android2bdaddr(addr, &dev->dst);
-	dev->channels = queue_new();
-	if (!dev->channels) {
-		free_health_device(dev);
-		return NULL;
-	}
-
-	if (!queue_push_tail(app->devices, dev)) {
-		free_health_device(dev);
-		return NULL;
-	}
-
-	return dev;
-}
-
 static struct health_app *get_app(uint16_t app_id)
 {
 	return queue_find(apps, match_app_by_id, INT_TO_PTR(app_id));
 }
 
-static struct health_device *get_device(struct health_app *app,
-							const uint8_t *addr)
-{
-	struct health_device *dev;
-	bdaddr_t bdaddr;
-
-	android2bdaddr(addr, &bdaddr);
-	dev = queue_find(app->devices, match_dev_by_addr, &bdaddr);
-	if (dev)
-		return dev;
-
-	return create_device(app, addr);
-}
-
-static struct health_channel *create_channel(struct health_app *app,
-						uint8_t mdep_index,
-						struct health_device *dev)
-{
-	struct mdep_cfg *mdep;
-	struct health_channel *channel;
-	uint8_t index;
-	static unsigned int channel_id = 1;
-
-	DBG("mdep %u", mdep_index);
-
-	if (!dev || !app)
-		return NULL;
-
-	index = mdep_index + 1;
-	mdep = queue_find(app->mdeps, match_mdep_by_id, INT_TO_PTR(index));
-	if (!mdep)
-		return NULL;
-
-	/* create channel and push it to device */
-	channel = new0(struct health_channel, 1);
-	if (!channel)
-		return NULL;
-
-	channel->mdep_id = mdep->id;
-	channel->type = mdep->channel_type;
-	channel->id = channel_id++;
-	channel->dev = dev;
-
-	if (!queue_push_tail(dev->channels, channel)) {
-		free_health_channel(channel);
-		return NULL;
-	}
-
-	return channel;
-}
-
 static struct health_channel *get_channel(struct health_app *app,
 						uint8_t mdep_index,
 						struct health_device *dev)
-- 
1.8.3.2


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* [PATCHv2 6/9] android/health: Assign channel to user_data
  2014-06-27  7:39 ` [PATCHv2 1/9] android/health: Add error check when creating app Andrei Emeltchenko
                     ` (3 preceding siblings ...)
  2014-06-27  7:39   ` [PATCHv2 5/9] android/health: Add channel connect Andrei Emeltchenko
@ 2014-06-27  7:40   ` Andrei Emeltchenko
  2014-06-27  7:40   ` [PATCHv2 7/9] android/health: Create mdep for ECHO channel Andrei Emeltchenko
                     ` (2 subsequent siblings)
  7 siblings, 0 replies; 42+ messages in thread
From: Andrei Emeltchenko @ 2014-06-27  7:40 UTC (permalink / raw)
  To: linux-bluetooth

From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>

Assign channel for incoming connections when it is created.
---
 android/health.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/android/health.c b/android/health.c
index ff2c663..d9731fd 100644
--- a/android/health.c
+++ b/android/health.c
@@ -1202,6 +1202,9 @@ static struct health_channel *connect_channel(struct mcap_mcl *mcl,
 		channel = create_channel(app, mdepid, device);
 	}
 
+	/* Device is created here */
+	mcl->cb->user_data = channel;
+
 	return channel;
 }
 
-- 
1.8.3.2


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* [PATCHv2 7/9] android/health: Create mdep for ECHO channel
  2014-06-27  7:39 ` [PATCHv2 1/9] android/health: Add error check when creating app Andrei Emeltchenko
                     ` (4 preceding siblings ...)
  2014-06-27  7:40   ` [PATCHv2 6/9] android/health: Assign channel to user_data Andrei Emeltchenko
@ 2014-06-27  7:40   ` Andrei Emeltchenko
  2014-06-27  7:40   ` [PATCHv2 8/9] android/health: Add handling for ECHO service Andrei Emeltchenko
  2014-06-27  7:40   ` [PATCHv2 9/9] android/health: Improve debug Andrei Emeltchenko
  7 siblings, 0 replies; 42+ messages in thread
From: Andrei Emeltchenko @ 2014-06-27  7:40 UTC (permalink / raw)
  To: linux-bluetooth

From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>

---
 android/health.c | 22 +++++++++++++++++-----
 1 file changed, 17 insertions(+), 5 deletions(-)

diff --git a/android/health.c b/android/health.c
index d9731fd..4f15f93 100644
--- a/android/health.c
+++ b/android/health.c
@@ -1146,7 +1146,6 @@ static struct health_channel *create_channel(struct health_app *app,
 {
 	struct mdep_cfg *mdep;
 	struct health_channel *channel;
-	uint8_t index;
 	static unsigned int channel_id = 1;
 
 	DBG("mdep %u", mdep_index);
@@ -1154,10 +1153,23 @@ static struct health_channel *create_channel(struct health_app *app,
 	if (!dev || !app)
 		return NULL;
 
-	index = mdep_index + 1;
-	mdep = queue_find(app->mdeps, match_mdep_by_id, INT_TO_PTR(index));
-	if (!mdep)
-		return NULL;
+	mdep = queue_find(app->mdeps, match_mdep_by_id, INT_TO_PTR(mdep_index));
+	if (!mdep) {
+		if (mdep_index == HDP_MDEP_ECHO) {
+			mdep = new0(struct mdep_cfg, 1);
+			if (!mdep)
+				return NULL;
+
+			/* Leave other configuration zeroes */
+			mdep->id = HDP_MDEP_ECHO;
+
+			if (!queue_push_tail(app->mdeps, mdep)) {
+				free_mdep_cfg(mdep);
+				return NULL;
+			}
+		} else
+			return NULL;
+	}
 
 	/* create channel and push it to device */
 	channel = new0(struct health_channel, 1);
-- 
1.8.3.2


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* [PATCHv2 8/9] android/health: Add handling for ECHO service
  2014-06-27  7:39 ` [PATCHv2 1/9] android/health: Add error check when creating app Andrei Emeltchenko
                     ` (5 preceding siblings ...)
  2014-06-27  7:40   ` [PATCHv2 7/9] android/health: Create mdep for ECHO channel Andrei Emeltchenko
@ 2014-06-27  7:40   ` Andrei Emeltchenko
  2014-06-27  7:40   ` [PATCHv2 9/9] android/health: Improve debug Andrei Emeltchenko
  7 siblings, 0 replies; 42+ messages in thread
From: Andrei Emeltchenko @ 2014-06-27  7:40 UTC (permalink / raw)
  To: linux-bluetooth

From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>

Reply received buffer back for ECHO service.
---
 android/health.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 62 insertions(+), 1 deletion(-)

diff --git a/android/health.c b/android/health.c
index 4f15f93..9631d9e 100644
--- a/android/health.c
+++ b/android/health.c
@@ -1054,9 +1054,70 @@ static int get_dcpsm(sdp_list_t *recs, uint16_t *dcpsm)
 	return -1;
 }
 
+static int send_echo_data(int sock, const void *buf, uint32_t size)
+{
+	const uint8_t *buf_b = buf;
+	uint32_t sent = 0;
+
+	while (sent < size) {
+		int n = write(sock, buf_b + sent, size - sent);
+		if (n < 0)
+			return -1;
+		sent += n;
+	}
+
+	return 0;
+}
+
+static gboolean serve_echo(GIOChannel *io, GIOCondition cond, gpointer data)
+{
+	struct health_channel *channel = data;
+	uint8_t buf[MCAP_DC_MTU];
+	int fd, len;
+
+	DBG("channel %p", channel);
+
+	if (cond & (G_IO_ERR | G_IO_HUP | G_IO_NVAL)) {
+		DBG("Error condition on channel");
+		return FALSE;
+	}
+
+	fd = g_io_channel_unix_get_fd(io);
+
+	len = read(fd, buf, sizeof(buf));
+	if (len < 0)
+		goto fail;
+
+	if (send_echo_data(fd, buf, len)  >= 0)
+		return TRUE;
+
+fail:
+	free_health_device(channel->dev);
+	return FALSE;
+}
+
 static void mcap_mdl_connected_cb(struct mcap_mdl *mdl, void *data)
 {
-	DBG("Not Implemeneted");
+	struct health_channel *channel = data;
+
+	if (!channel->mdl)
+		channel->mdl = mcap_mdl_ref(mdl);
+
+	DBG("Data channel connected: mdl %p channel %p", mdl, channel);
+
+	if (channel->mdep_id == HDP_MDEP_ECHO) {
+		GIOChannel *io;
+		int fd;
+
+		fd = mcap_mdl_get_fd(channel->mdl);
+		if (fd < 0)
+			return;
+
+		io = g_io_channel_unix_new(fd);
+		g_io_add_watch(io, G_IO_ERR | G_IO_HUP | G_IO_NVAL | G_IO_IN,
+							serve_echo, channel);
+		g_io_channel_unref(io);
+	}
 }
 
 static void mcap_mdl_closed_cb(struct mcap_mdl *mdl, void *data)
-- 
1.8.3.2


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* [PATCHv2 9/9] android/health: Improve debug
  2014-06-27  7:39 ` [PATCHv2 1/9] android/health: Add error check when creating app Andrei Emeltchenko
                     ` (6 preceding siblings ...)
  2014-06-27  7:40   ` [PATCHv2 8/9] android/health: Add handling for ECHO service Andrei Emeltchenko
@ 2014-06-27  7:40   ` Andrei Emeltchenko
  7 siblings, 0 replies; 42+ messages in thread
From: Andrei Emeltchenko @ 2014-06-27  7:40 UTC (permalink / raw)
  To: linux-bluetooth

From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>

---
 android/health.c | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/android/health.c b/android/health.c
index 9631d9e..093bdea 100644
--- a/android/health.c
+++ b/android/health.c
@@ -160,6 +160,8 @@ static void free_health_channel(void *data)
 {
 	struct health_channel *channel = data;
 
+	DBG("channel %p", channel);
+
 	if (!channel)
 		return;
 
@@ -1137,12 +1139,13 @@ static void mcap_mdl_deleted_cb(struct mcap_mdl *mdl, void *data)
 	struct health_channel *channel = data;
 	struct health_device *dev;
 
-	DBG("");
-
 	if (!channel)
 		return;
 
 	dev = channel->dev;
+
+	DBG("device %p channel %p mdl %p", dev, channel, mdl);
+
 	/* mdl == NULL means, delete all mdls */
 	if (!mdl) {
 		queue_foreach(dev->channels, notify_channel, NULL);
@@ -1258,6 +1261,8 @@ static struct health_channel *connect_channel(struct mcap_mcl *mcl,
 	struct health_channel *channel = NULL;
 	bdaddr_t addr;
 
+	DBG("mcl %p mdepid %u", mcl, mdepid);
+
 	mcap_mcl_get_addr(mcl, &addr);
 
 	/* TODO: Search app for mdepid */
@@ -1500,7 +1505,7 @@ static void get_mdep_cb(sdp_list_t *recs, int err, gpointer user_data)
 
 	if (!get_mdep_from_rec(recs->data, mdep->role, mdep->data_type,
 								&mdep_id)) {
-		error("health: no matching MDEP found");
+		error("health: no matching MDEP: %u", channel->mdep_id);
 		goto fail;
 	}
 
-- 
1.8.3.2


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* [PATCH] android/pts: Update HDP test results
  2014-06-26 12:04 [PATCH 1/9] android/health: Add error check when creating app Andrei Emeltchenko
                   ` (8 preceding siblings ...)
  2014-06-27  7:39 ` [PATCHv2 1/9] android/health: Add error check when creating app Andrei Emeltchenko
@ 2014-06-27  7:59 ` Andrei Emeltchenko
  2014-06-27 11:24   ` [PATCHv3 01/12] android/health: Add error check when creating app Andrei Emeltchenko
  9 siblings, 1 reply; 42+ messages in thread
From: Andrei Emeltchenko @ 2014-06-27  7:59 UTC (permalink / raw)
  To: linux-bluetooth

From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>

Mark ECHO server tests passed.
---
 android/pts-hdp.txt | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/android/pts-hdp.txt b/android/pts-hdp.txt
index 99aa2d6..459e2f1 100644
--- a/android/pts-hdp.txt
+++ b/android/pts-hdp.txt
@@ -105,7 +105,11 @@ TC_SRC_HCT_BV_05_C	N/A
 TC_SRC_HCT_BV_06_C	INC
 TC_SRC_HCT_BV_07_C	INC
 TC_SRC_DE_BV_01_I	INC
-TC_SRC_DE_BV_02_I	INC
+TC_SRC_DE_BV_02_I	PASS	haltest:
+				hl register_application bluez-android Bluez
+				bluez-hdp health-device-profile 1
+				BTHL_MDEP_ROLE_SOURCE 4100
+				BTHL_CHANNEL_TYPE_RELIABLE pulse-oximeter
 TC_SRC_DEP_BV_01_I	INC
 TC_SRC_DEP_BV_02_I	N/A
 TC_SNK_CON_BV_01_I	PASS	haltest:
@@ -195,7 +199,11 @@ TC_SNK_HCT_BV_05_C	N/A
 TC_SNK_HCT_BV_06_C	INC
 TC_SNK_HCT_BV_07_C	INC
 TC_SNK_DE_BV_01_I	N/A
-TC_SNK_DE_BV_02_I	INC
+TC_SNK_DE_BV_02_I	PASS	haltest:
+				hl register_application bluez-android Bluez
+				bluez-hdp health-device-profile 1
+				BTHL_MDEP_ROLE_SINK 4100
+				BTHL_CHANNEL_TYPE_RELIABLE pulse-oximeter
 TC_SNK_DEP_BV_03_I	INC
 TC_SNK_DEP_BV_04_I	INC
 -------------------------------------------------------------------------------
-- 
1.8.3.2


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* [PATCHv3 01/12] android/health: Add error check when creating app
  2014-06-27  7:59 ` [PATCH] android/pts: Update HDP test results Andrei Emeltchenko
@ 2014-06-27 11:24   ` Andrei Emeltchenko
  2014-06-27 11:24     ` [PATCHv3 02/12] android/health: Fix wrong callback return type Andrei Emeltchenko
                       ` (11 more replies)
  0 siblings, 12 replies; 42+ messages in thread
From: Andrei Emeltchenko @ 2014-06-27 11:24 UTC (permalink / raw)
  To: linux-bluetooth

From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>

---
 android/health.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/android/health.c b/android/health.c
index 42c9a6e..de67475 100644
--- a/android/health.c
+++ b/android/health.c
@@ -820,6 +820,8 @@ static void bt_health_register_app(const void *buf, uint16_t len)
 
 	app = create_health_app(app_name, provider, srv_name, srv_descr,
 							cmd->num_of_mdep);
+	if (!app)
+		goto fail;
 
 	if (!queue_push_tail(apps, app))
 		goto fail;
@@ -830,7 +832,9 @@ static void bt_health_register_app(const void *buf, uint16_t len)
 	return;
 
 fail:
-	free_health_app(app);
+	if (app)
+		free_health_app(app);
+
 	ipc_send_rsp(hal_ipc, HAL_SERVICE_ID_HEALTH, HAL_OP_HEALTH_MDEP,
 							HAL_STATUS_FAILED);
 }
-- 
1.8.3.2


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* [PATCHv3 02/12] android/health: Fix wrong callback return type
  2014-06-27 11:24   ` [PATCHv3 01/12] android/health: Add error check when creating app Andrei Emeltchenko
@ 2014-06-27 11:24     ` Andrei Emeltchenko
  2014-06-27 14:11       ` Szymon Janc
  2014-06-27 11:24     ` [PATCHv3 03/12] android/health: Add HDP definitions Andrei Emeltchenko
                       ` (10 subsequent siblings)
  11 siblings, 1 reply; 42+ messages in thread
From: Andrei Emeltchenko @ 2014-06-27 11:24 UTC (permalink / raw)
  To: linux-bluetooth

From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>

---
 android/health.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/android/health.c b/android/health.c
index de67475..140afee 100644
--- a/android/health.c
+++ b/android/health.c
@@ -1098,15 +1098,19 @@ static void mcap_mdl_aborted_cb(struct mcap_mdl *mdl, void *data)
 	DBG("Not Implemeneted");
 }
 
-static void mcap_mdl_conn_req_cb(struct mcap_mcl *mcl, uint8_t mdepid,
+static uint8_t mcap_mdl_conn_req_cb(struct mcap_mcl *mcl, uint8_t mdepid,
 				uint16_t mdlid, uint8_t *conf, void *data)
 {
 	DBG("Not Implemeneted");
+
+	return MCAP_SUCCESS;
 }
 
-static void mcap_mdl_reconn_req_cb(struct mcap_mdl *mdl, void *data)
+static uint8_t mcap_mdl_reconn_req_cb(struct mcap_mdl *mdl, void *data)
 {
 	DBG("Not Implemeneted");
+
+	return MCAP_SUCCESS;
 }
 
 static void connect_mdl_cb(struct mcap_mdl *mdl, GError *gerr, gpointer data)
-- 
1.8.3.2


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* [PATCHv3 03/12] android/health: Add HDP definitions
  2014-06-27 11:24   ` [PATCHv3 01/12] android/health: Add error check when creating app Andrei Emeltchenko
  2014-06-27 11:24     ` [PATCHv3 02/12] android/health: Fix wrong callback return type Andrei Emeltchenko
@ 2014-06-27 11:24     ` Andrei Emeltchenko
  2014-06-27 13:41       ` Szymon Janc
  2014-06-27 11:24     ` [PATCHv3 04/12] android/health: Add handling MDL connection request Andrei Emeltchenko
                       ` (9 subsequent siblings)
  11 siblings, 1 reply; 42+ messages in thread
From: Andrei Emeltchenko @ 2014-06-27 11:24 UTC (permalink / raw)
  To: linux-bluetooth

From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>

---
 android/health.h | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/android/health.h b/android/health.h
index 0b32fd3..ab7d478 100644
--- a/android/health.h
+++ b/android/health.h
@@ -21,5 +21,13 @@
  *
  */
 
+#define HDP_MDEP_ECHO		0x00
+#define HDP_MDEP_INITIAL	0x01
+#define HDP_MDEP_FINAL		0x7F
+
+#define HDP_NO_PREFERENCE_DC	0x00
+#define HDP_RELIABLE_DC		0x01
+#define HDP_STREAMING_DC	0x02
+
 bool bt_health_register(struct ipc *ipc, const bdaddr_t *addr, uint8_t mode);
 void bt_health_unregister(void);
-- 
1.8.3.2


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* [PATCHv3 04/12] android/health: Add handling MDL connection request
  2014-06-27 11:24   ` [PATCHv3 01/12] android/health: Add error check when creating app Andrei Emeltchenko
  2014-06-27 11:24     ` [PATCHv3 02/12] android/health: Fix wrong callback return type Andrei Emeltchenko
  2014-06-27 11:24     ` [PATCHv3 03/12] android/health: Add HDP definitions Andrei Emeltchenko
@ 2014-06-27 11:24     ` Andrei Emeltchenko
  2014-06-27 11:24     ` [PATCHv3 05/12] android/health: Refactor channel creation Andrei Emeltchenko
                       ` (8 subsequent siblings)
  11 siblings, 0 replies; 42+ messages in thread
From: Andrei Emeltchenko @ 2014-06-27 11:24 UTC (permalink / raw)
  To: linux-bluetooth

From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>

---
 android/health.c | 33 ++++++++++++++++++++++++++++++++-
 1 file changed, 32 insertions(+), 1 deletion(-)

diff --git a/android/health.c b/android/health.c
index 140afee..3cb2016 100644
--- a/android/health.c
+++ b/android/health.c
@@ -1101,7 +1101,38 @@ static void mcap_mdl_aborted_cb(struct mcap_mdl *mdl, void *data)
 static uint8_t mcap_mdl_conn_req_cb(struct mcap_mcl *mcl, uint8_t mdepid,
 				uint16_t mdlid, uint8_t *conf, void *data)
 {
-	DBG("Not Implemeneted");
+	GError *gerr = NULL;
+
+	DBG("Data channel request: mdepid %u mdlid %u", mdepid, mdlid);
+
+	/* TODO: find / create device */
+
+	if (mdepid == HDP_MDEP_ECHO) {
+		switch (*conf) {
+		case HDP_NO_PREFERENCE_DC:
+			*conf = HDP_RELIABLE_DC;
+		case HDP_RELIABLE_DC:
+			break;
+		case HDP_STREAMING_DC:
+			return MCAP_CONFIGURATION_REJECTED;
+		default:
+			/* Special case defined in HDP spec 3.4. When an invalid
+			* configuration is received we shall close the MCL when
+			* we are still processing the callback. */
+			/* TODO close device */
+			return MCAP_CONFIGURATION_REJECTED; /* not processed */
+		}
+
+		if (!mcap_set_data_chan_mode(mcap, L2CAP_MODE_ERTM, &gerr)) {
+			error("Error: %s", gerr->message);
+			g_error_free(gerr);
+			return MCAP_MDL_BUSY;
+		}
+
+		/* TODO: Create channel */
+
+		return MCAP_SUCCESS;
+	}
 
 	return MCAP_SUCCESS;
 }
-- 
1.8.3.2


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* [PATCHv3 05/12] android/health: Refactor channel creation
  2014-06-27 11:24   ` [PATCHv3 01/12] android/health: Add error check when creating app Andrei Emeltchenko
                       ` (2 preceding siblings ...)
  2014-06-27 11:24     ` [PATCHv3 04/12] android/health: Add handling MDL connection request Andrei Emeltchenko
@ 2014-06-27 11:24     ` Andrei Emeltchenko
  2014-06-27 13:54       ` Szymon Janc
  2014-06-27 11:24     ` [PATCHv3 06/12] android/health: Add channel connect Andrei Emeltchenko
                       ` (7 subsequent siblings)
  11 siblings, 1 reply; 42+ messages in thread
From: Andrei Emeltchenko @ 2014-06-27 11:24 UTC (permalink / raw)
  To: linux-bluetooth

From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>

Avoid using app_id when we shall use app structure itself. Otherwise we
end up with unnecessary searches for app and problems for incoming
connections.
---
 android/health.c | 43 ++++++++++++++++++++++---------------------
 1 file changed, 22 insertions(+), 21 deletions(-)

diff --git a/android/health.c b/android/health.c
index 3cb2016..d664324 100644
--- a/android/health.c
+++ b/android/health.c
@@ -1477,43 +1477,37 @@ static struct health_device *create_device(struct health_app *app,
 	return dev;
 }
 
-static struct health_device *get_device(uint16_t app_id, const uint8_t *addr)
+static struct health_app *get_app(uint16_t app_id)
+{
+	return queue_find(apps, match_app_by_id, INT_TO_PTR(app_id));
+}
+
+static struct health_device *get_device(struct health_app *app,
+							const uint8_t *addr)
 {
-	struct health_app *app;
 	struct health_device *dev;
 	bdaddr_t bdaddr;
 
-	app = queue_find(apps, match_app_by_id, INT_TO_PTR(app_id));
-	if (!app)
-		return NULL;
-
 	android2bdaddr(addr, &bdaddr);
 	dev = queue_find(app->devices, match_dev_by_addr, &bdaddr);
 	if (dev)
 		return dev;
 
-	dev = create_device(app, addr);
-	if (dev)
-		dev->app_id = app_id;
-
-	return dev;
+	return create_device(app, addr);
 }
 
-static struct health_channel *create_channel(uint16_t app_id,
+static struct health_channel *create_channel(struct health_app *app,
 						uint8_t mdep_index,
 						struct health_device *dev)
 {
-	struct health_app *app;
 	struct mdep_cfg *mdep;
 	struct health_channel *channel;
 	uint8_t index;
 	static unsigned int channel_id = 1;
 
-	if (!dev)
-		return NULL;
+	DBG("mdep %u", mdep_index);
 
-	app = queue_find(apps, match_app_by_id, INT_TO_PTR(app_id));
-	if (!app)
+	if (!dev || !app)
 		return NULL;
 
 	index = mdep_index + 1;
@@ -1539,7 +1533,7 @@ static struct health_channel *create_channel(uint16_t app_id,
 	return channel;
 }
 
-static struct health_channel *get_channel(uint16_t app_id,
+static struct health_channel *get_channel(struct health_app *app,
 						uint8_t mdep_index,
 						struct health_device *dev)
 {
@@ -1555,7 +1549,7 @@ static struct health_channel *get_channel(uint16_t app_id,
 	if (channel)
 		return channel;
 
-	return create_channel(app_id, mdep_index, dev);
+	return create_channel(app, index, dev);
 }
 
 static void bt_health_connect_channel(const void *buf, uint16_t len)
@@ -1564,14 +1558,21 @@ static void bt_health_connect_channel(const void *buf, uint16_t len)
 	struct hal_rsp_health_connect_channel rsp;
 	struct health_device *dev = NULL;
 	struct health_channel *channel = NULL;
+	struct health_app *app;
 
 	DBG("");
 
-	dev = get_device(cmd->app_id, cmd->bdaddr);
+	app = get_app(cmd->app_id);
+	if (!app)
+		goto fail;
+
+	dev = get_device(app, cmd->bdaddr);
 	if (!dev)
 		goto fail;
 
-	channel = get_channel(cmd->app_id, cmd->mdep_index, dev);
+	dev->app_id = cmd->app_id;
+
+	channel = get_channel(app, cmd->mdep_index, dev);
 	if (!channel)
 		goto fail;
 
-- 
1.8.3.2


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* [PATCHv3 06/12] android/health: Add channel connect
  2014-06-27 11:24   ` [PATCHv3 01/12] android/health: Add error check when creating app Andrei Emeltchenko
                       ` (3 preceding siblings ...)
  2014-06-27 11:24     ` [PATCHv3 05/12] android/health: Refactor channel creation Andrei Emeltchenko
@ 2014-06-27 11:24     ` Andrei Emeltchenko
  2014-06-27 11:24     ` [PATCHv3 07/12] android/health: Assign channel to user_data Andrei Emeltchenko
                       ` (6 subsequent siblings)
  11 siblings, 0 replies; 42+ messages in thread
From: Andrei Emeltchenko @ 2014-06-27 11:24 UTC (permalink / raw)
  To: linux-bluetooth

From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>

Connect channel on incoming connection callback
---
 android/health.c | 190 ++++++++++++++++++++++++++++++++-----------------------
 1 file changed, 111 insertions(+), 79 deletions(-)

diff --git a/android/health.c b/android/health.c
index d664324..ff2c663 100644
--- a/android/health.c
+++ b/android/health.c
@@ -1098,14 +1098,125 @@ static void mcap_mdl_aborted_cb(struct mcap_mdl *mdl, void *data)
 	DBG("Not Implemeneted");
 }
 
+static struct health_device *create_device(struct health_app *app,
+							const uint8_t *addr)
+{
+	struct health_device *dev;
+
+	if (!app)
+		return NULL;
+
+	/* create device and push it to devices queue */
+	dev = new0(struct health_device, 1);
+	if (!dev)
+		return NULL;
+
+	android2bdaddr(addr, &dev->dst);
+	dev->channels = queue_new();
+	if (!dev->channels) {
+		free_health_device(dev);
+		return NULL;
+	}
+
+	if (!queue_push_tail(app->devices, dev)) {
+		free_health_device(dev);
+		return NULL;
+	}
+
+	return dev;
+}
+
+static struct health_device *get_device(struct health_app *app,
+							const uint8_t *addr)
+{
+	struct health_device *dev;
+	bdaddr_t bdaddr;
+
+	android2bdaddr(addr, &bdaddr);
+	dev = queue_find(app->devices, match_dev_by_addr, &bdaddr);
+	if (dev)
+		return dev;
+
+	return create_device(app, addr);
+}
+
+static struct health_channel *create_channel(struct health_app *app,
+						uint8_t mdep_index,
+						struct health_device *dev)
+{
+	struct mdep_cfg *mdep;
+	struct health_channel *channel;
+	uint8_t index;
+	static unsigned int channel_id = 1;
+
+	DBG("mdep %u", mdep_index);
+
+	if (!dev || !app)
+		return NULL;
+
+	index = mdep_index + 1;
+	mdep = queue_find(app->mdeps, match_mdep_by_id, INT_TO_PTR(index));
+	if (!mdep)
+		return NULL;
+
+	/* create channel and push it to device */
+	channel = new0(struct health_channel, 1);
+	if (!channel)
+		return NULL;
+
+	channel->mdep_id = mdep->id;
+	channel->type = mdep->channel_type;
+	channel->id = channel_id++;
+	channel->dev = dev;
+
+	if (!queue_push_tail(dev->channels, channel)) {
+		free_health_channel(channel);
+		return NULL;
+	}
+
+	return channel;
+}
+
+static struct health_channel *connect_channel(struct mcap_mcl *mcl,
+								uint8_t mdepid)
+{
+	struct health_app *app;
+	struct health_device *device;
+	struct health_channel *channel = NULL;
+	bdaddr_t addr;
+
+	mcap_mcl_get_addr(mcl, &addr);
+
+	/* TODO: Search app for mdepid */
+
+	if (mdepid == HDP_MDEP_ECHO) {
+		/* For echo service take last app */
+		app = queue_peek_tail(apps);
+		if (!app)
+			return NULL;
+
+		device = get_device(app, (uint8_t *) &addr);
+		if (!device)
+			return NULL;
+
+		channel = create_channel(app, mdepid, device);
+	}
+
+	return channel;
+}
+
 static uint8_t mcap_mdl_conn_req_cb(struct mcap_mcl *mcl, uint8_t mdepid,
 				uint16_t mdlid, uint8_t *conf, void *data)
 {
 	GError *gerr = NULL;
+	struct health_channel *channel;
 
 	DBG("Data channel request: mdepid %u mdlid %u", mdepid, mdlid);
 
 	/* TODO: find / create device */
+	channel = connect_channel(mcl, mdepid);
+	if (!channel)
+		return MCAP_MDL_BUSY;
 
 	if (mdepid == HDP_MDEP_ECHO) {
 		switch (*conf) {
@@ -1449,90 +1560,11 @@ static int connect_mcl(struct health_channel *channel)
 						search_cb, channel, NULL, 0);
 }
 
-static struct health_device *create_device(struct health_app *app,
-							const uint8_t *addr)
-{
-	struct health_device *dev;
-
-	if (!app)
-		return NULL;
-
-	/* create device and push it to devices queue */
-	dev = new0(struct health_device, 1);
-	if (!dev)
-		return NULL;
-
-	android2bdaddr(addr, &dev->dst);
-	dev->channels = queue_new();
-	if (!dev->channels) {
-		free_health_device(dev);
-		return NULL;
-	}
-
-	if (!queue_push_tail(app->devices, dev)) {
-		free_health_device(dev);
-		return NULL;
-	}
-
-	return dev;
-}
-
 static struct health_app *get_app(uint16_t app_id)
 {
 	return queue_find(apps, match_app_by_id, INT_TO_PTR(app_id));
 }
 
-static struct health_device *get_device(struct health_app *app,
-							const uint8_t *addr)
-{
-	struct health_device *dev;
-	bdaddr_t bdaddr;
-
-	android2bdaddr(addr, &bdaddr);
-	dev = queue_find(app->devices, match_dev_by_addr, &bdaddr);
-	if (dev)
-		return dev;
-
-	return create_device(app, addr);
-}
-
-static struct health_channel *create_channel(struct health_app *app,
-						uint8_t mdep_index,
-						struct health_device *dev)
-{
-	struct mdep_cfg *mdep;
-	struct health_channel *channel;
-	uint8_t index;
-	static unsigned int channel_id = 1;
-
-	DBG("mdep %u", mdep_index);
-
-	if (!dev || !app)
-		return NULL;
-
-	index = mdep_index + 1;
-	mdep = queue_find(app->mdeps, match_mdep_by_id, INT_TO_PTR(index));
-	if (!mdep)
-		return NULL;
-
-	/* create channel and push it to device */
-	channel = new0(struct health_channel, 1);
-	if (!channel)
-		return NULL;
-
-	channel->mdep_id = mdep->id;
-	channel->type = mdep->channel_type;
-	channel->id = channel_id++;
-	channel->dev = dev;
-
-	if (!queue_push_tail(dev->channels, channel)) {
-		free_health_channel(channel);
-		return NULL;
-	}
-
-	return channel;
-}
-
 static struct health_channel *get_channel(struct health_app *app,
 						uint8_t mdep_index,
 						struct health_device *dev)
-- 
1.8.3.2


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* [PATCHv3 07/12] android/health: Assign channel to user_data
  2014-06-27 11:24   ` [PATCHv3 01/12] android/health: Add error check when creating app Andrei Emeltchenko
                       ` (4 preceding siblings ...)
  2014-06-27 11:24     ` [PATCHv3 06/12] android/health: Add channel connect Andrei Emeltchenko
@ 2014-06-27 11:24     ` Andrei Emeltchenko
  2014-06-27 11:24     ` [PATCHv3 08/12] android/health: Create mdep for ECHO channel Andrei Emeltchenko
                       ` (5 subsequent siblings)
  11 siblings, 0 replies; 42+ messages in thread
From: Andrei Emeltchenko @ 2014-06-27 11:24 UTC (permalink / raw)
  To: linux-bluetooth

From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>

Assign channel for incoming connections when it is created.
---
 android/health.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/android/health.c b/android/health.c
index ff2c663..d9731fd 100644
--- a/android/health.c
+++ b/android/health.c
@@ -1202,6 +1202,9 @@ static struct health_channel *connect_channel(struct mcap_mcl *mcl,
 		channel = create_channel(app, mdepid, device);
 	}
 
+	/* Device is created here */
+	mcl->cb->user_data = channel;
+
 	return channel;
 }
 
-- 
1.8.3.2


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* [PATCHv3 08/12] android/health: Create mdep for ECHO channel
  2014-06-27 11:24   ` [PATCHv3 01/12] android/health: Add error check when creating app Andrei Emeltchenko
                       ` (5 preceding siblings ...)
  2014-06-27 11:24     ` [PATCHv3 07/12] android/health: Assign channel to user_data Andrei Emeltchenko
@ 2014-06-27 11:24     ` Andrei Emeltchenko
  2014-06-27 11:25     ` [PATCHv3 09/12] android/health: Add handling for ECHO service Andrei Emeltchenko
                       ` (4 subsequent siblings)
  11 siblings, 0 replies; 42+ messages in thread
From: Andrei Emeltchenko @ 2014-06-27 11:24 UTC (permalink / raw)
  To: linux-bluetooth

From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>

---
 android/health.c | 22 +++++++++++++++++-----
 1 file changed, 17 insertions(+), 5 deletions(-)

diff --git a/android/health.c b/android/health.c
index d9731fd..4f15f93 100644
--- a/android/health.c
+++ b/android/health.c
@@ -1146,7 +1146,6 @@ static struct health_channel *create_channel(struct health_app *app,
 {
 	struct mdep_cfg *mdep;
 	struct health_channel *channel;
-	uint8_t index;
 	static unsigned int channel_id = 1;
 
 	DBG("mdep %u", mdep_index);
@@ -1154,10 +1153,23 @@ static struct health_channel *create_channel(struct health_app *app,
 	if (!dev || !app)
 		return NULL;
 
-	index = mdep_index + 1;
-	mdep = queue_find(app->mdeps, match_mdep_by_id, INT_TO_PTR(index));
-	if (!mdep)
-		return NULL;
+	mdep = queue_find(app->mdeps, match_mdep_by_id, INT_TO_PTR(mdep_index));
+	if (!mdep) {
+		if (mdep_index == HDP_MDEP_ECHO) {
+			mdep = new0(struct mdep_cfg, 1);
+			if (!mdep)
+				return NULL;
+
+			/* Leave other configuration zeroes */
+			mdep->id = HDP_MDEP_ECHO;
+
+			if (!queue_push_tail(app->mdeps, mdep)) {
+				free_mdep_cfg(mdep);
+				return NULL;
+			}
+		} else
+			return NULL;
+	}
 
 	/* create channel and push it to device */
 	channel = new0(struct health_channel, 1);
-- 
1.8.3.2


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* [PATCHv3 09/12] android/health: Add handling for ECHO service
  2014-06-27 11:24   ` [PATCHv3 01/12] android/health: Add error check when creating app Andrei Emeltchenko
                       ` (6 preceding siblings ...)
  2014-06-27 11:24     ` [PATCHv3 08/12] android/health: Create mdep for ECHO channel Andrei Emeltchenko
@ 2014-06-27 11:25     ` Andrei Emeltchenko
  2014-06-27 14:09       ` Szymon Janc
  2014-06-27 11:25     ` [PATCHv3 10/12] android/health: Improve debug Andrei Emeltchenko
                       ` (3 subsequent siblings)
  11 siblings, 1 reply; 42+ messages in thread
From: Andrei Emeltchenko @ 2014-06-27 11:25 UTC (permalink / raw)
  To: linux-bluetooth

From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>

Reply received buffer back for ECHO service.
---
 android/health.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 62 insertions(+), 1 deletion(-)

diff --git a/android/health.c b/android/health.c
index 4f15f93..9631d9e 100644
--- a/android/health.c
+++ b/android/health.c
@@ -1054,9 +1054,70 @@ static int get_dcpsm(sdp_list_t *recs, uint16_t *dcpsm)
 	return -1;
 }
 
+static int send_echo_data(int sock, const void *buf, uint32_t size)
+{
+	const uint8_t *buf_b = buf;
+	uint32_t sent = 0;
+
+	while (sent < size) {
+		int n = write(sock, buf_b + sent, size - sent);
+		if (n < 0)
+			return -1;
+		sent += n;
+	}
+
+	return 0;
+}
+
+static gboolean serve_echo(GIOChannel *io, GIOCondition cond, gpointer data)
+{
+	struct health_channel *channel = data;
+	uint8_t buf[MCAP_DC_MTU];
+	int fd, len;
+
+	DBG("channel %p", channel);
+
+	if (cond & (G_IO_ERR | G_IO_HUP | G_IO_NVAL)) {
+		DBG("Error condition on channel");
+		return FALSE;
+	}
+
+	fd = g_io_channel_unix_get_fd(io);
+
+	len = read(fd, buf, sizeof(buf));
+	if (len < 0)
+		goto fail;
+
+	if (send_echo_data(fd, buf, len)  >= 0)
+		return TRUE;
+
+fail:
+	free_health_device(channel->dev);
+	return FALSE;
+}
+
 static void mcap_mdl_connected_cb(struct mcap_mdl *mdl, void *data)
 {
-	DBG("Not Implemeneted");
+	struct health_channel *channel = data;
+
+	if (!channel->mdl)
+		channel->mdl = mcap_mdl_ref(mdl);
+
+	DBG("Data channel connected: mdl %p channel %p", mdl, channel);
+
+	if (channel->mdep_id == HDP_MDEP_ECHO) {
+		GIOChannel *io;
+		int fd;
+
+		fd = mcap_mdl_get_fd(channel->mdl);
+		if (fd < 0)
+			return;
+
+		io = g_io_channel_unix_new(fd);
+		g_io_add_watch(io, G_IO_ERR | G_IO_HUP | G_IO_NVAL | G_IO_IN,
+							serve_echo, channel);
+		g_io_channel_unref(io);
+	}
 }
 
 static void mcap_mdl_closed_cb(struct mcap_mdl *mdl, void *data)
-- 
1.8.3.2


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* [PATCHv3 10/12] android/health: Improve debug
  2014-06-27 11:24   ` [PATCHv3 01/12] android/health: Add error check when creating app Andrei Emeltchenko
                       ` (7 preceding siblings ...)
  2014-06-27 11:25     ` [PATCHv3 09/12] android/health: Add handling for ECHO service Andrei Emeltchenko
@ 2014-06-27 11:25     ` Andrei Emeltchenko
  2014-06-27 11:25     ` [PATCHv3 11/12] android/mcap: Fix using uninitialised value Andrei Emeltchenko
                       ` (2 subsequent siblings)
  11 siblings, 0 replies; 42+ messages in thread
From: Andrei Emeltchenko @ 2014-06-27 11:25 UTC (permalink / raw)
  To: linux-bluetooth

From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>

---
 android/health.c | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/android/health.c b/android/health.c
index 9631d9e..093bdea 100644
--- a/android/health.c
+++ b/android/health.c
@@ -160,6 +160,8 @@ static void free_health_channel(void *data)
 {
 	struct health_channel *channel = data;
 
+	DBG("channel %p", channel);
+
 	if (!channel)
 		return;
 
@@ -1137,12 +1139,13 @@ static void mcap_mdl_deleted_cb(struct mcap_mdl *mdl, void *data)
 	struct health_channel *channel = data;
 	struct health_device *dev;
 
-	DBG("");
-
 	if (!channel)
 		return;
 
 	dev = channel->dev;
+
+	DBG("device %p channel %p mdl %p", dev, channel, mdl);
+
 	/* mdl == NULL means, delete all mdls */
 	if (!mdl) {
 		queue_foreach(dev->channels, notify_channel, NULL);
@@ -1258,6 +1261,8 @@ static struct health_channel *connect_channel(struct mcap_mcl *mcl,
 	struct health_channel *channel = NULL;
 	bdaddr_t addr;
 
+	DBG("mcl %p mdepid %u", mcl, mdepid);
+
 	mcap_mcl_get_addr(mcl, &addr);
 
 	/* TODO: Search app for mdepid */
@@ -1500,7 +1505,7 @@ static void get_mdep_cb(sdp_list_t *recs, int err, gpointer user_data)
 
 	if (!get_mdep_from_rec(recs->data, mdep->role, mdep->data_type,
 								&mdep_id)) {
-		error("health: no matching MDEP found");
+		error("health: no matching MDEP: %u", channel->mdep_id);
 		goto fail;
 	}
 
-- 
1.8.3.2


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* [PATCHv3 11/12] android/mcap: Fix using uninitialised value
  2014-06-27 11:24   ` [PATCHv3 01/12] android/health: Add error check when creating app Andrei Emeltchenko
                       ` (8 preceding siblings ...)
  2014-06-27 11:25     ` [PATCHv3 10/12] android/health: Improve debug Andrei Emeltchenko
@ 2014-06-27 11:25     ` Andrei Emeltchenko
  2014-06-27 14:11       ` Szymon Janc
  2014-06-27 11:25     ` [PATCHv3 12/12] android/pts: Update HDP test results Andrei Emeltchenko
  2014-06-27 13:38     ` [PATCHv3 01/12] android/health: Add error check when creating app Szymon Janc
  11 siblings, 1 reply; 42+ messages in thread
From: Andrei Emeltchenko @ 2014-06-27 11:25 UTC (permalink / raw)
  To: linux-bluetooth

From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>

Fixes clang warning:
...
android/mcap-lib.c:2366:20: warning: The left operand of '*' is a
garbage value
        return tv->tv_sec * 1000000ll + tv->tv_nsec / 1000ll;
               ~~~~~~~~~~ ^
1 warning generated.
...
---
 android/mcap-lib.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/android/mcap-lib.c b/android/mcap-lib.c
index 256abe1..79f6ce2 100644
--- a/android/mcap-lib.c
+++ b/android/mcap-lib.c
@@ -2454,7 +2454,8 @@ uint64_t mcap_get_timestamp(struct mcap_mcl *mcl,
 	if (given_time)
 		now = *given_time;
 	else
-		clock_gettime(CLK, &now);
+		if (clock_gettime(CLK, &now) < 0)
+			return MCAP_TMSTAMP_DONTSET;
 
 	tmstamp = time_us(&now) - time_us(&mcl->csp->base_time)
 		+ mcl->csp->base_tmstamp;
-- 
1.8.3.2


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* [PATCHv3 12/12] android/pts: Update HDP test results
  2014-06-27 11:24   ` [PATCHv3 01/12] android/health: Add error check when creating app Andrei Emeltchenko
                       ` (9 preceding siblings ...)
  2014-06-27 11:25     ` [PATCHv3 11/12] android/mcap: Fix using uninitialised value Andrei Emeltchenko
@ 2014-06-27 11:25     ` Andrei Emeltchenko
  2014-06-27 13:38     ` [PATCHv3 01/12] android/health: Add error check when creating app Szymon Janc
  11 siblings, 0 replies; 42+ messages in thread
From: Andrei Emeltchenko @ 2014-06-27 11:25 UTC (permalink / raw)
  To: linux-bluetooth

From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>

Mark ECHO server tests passed.
---
 android/pts-hdp.txt | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/android/pts-hdp.txt b/android/pts-hdp.txt
index 99aa2d6..f2b1528 100644
--- a/android/pts-hdp.txt
+++ b/android/pts-hdp.txt
@@ -1,7 +1,7 @@
 PTS test results for HDP
 
 PTS version: 5.1
-Tested: 17-June-2014
+Tested: 27-June-2014
 Android version: 4.4.2
 
 Results:
@@ -105,7 +105,11 @@ TC_SRC_HCT_BV_05_C	N/A
 TC_SRC_HCT_BV_06_C	INC
 TC_SRC_HCT_BV_07_C	INC
 TC_SRC_DE_BV_01_I	INC
-TC_SRC_DE_BV_02_I	INC
+TC_SRC_DE_BV_02_I	PASS	haltest:
+				hl register_application bluez-android Bluez
+				bluez-hdp health-device-profile 1
+				BTHL_MDEP_ROLE_SOURCE 4100
+				BTHL_CHANNEL_TYPE_RELIABLE pulse-oximeter
 TC_SRC_DEP_BV_01_I	INC
 TC_SRC_DEP_BV_02_I	N/A
 TC_SNK_CON_BV_01_I	PASS	haltest:
@@ -195,7 +199,11 @@ TC_SNK_HCT_BV_05_C	N/A
 TC_SNK_HCT_BV_06_C	INC
 TC_SNK_HCT_BV_07_C	INC
 TC_SNK_DE_BV_01_I	N/A
-TC_SNK_DE_BV_02_I	INC
+TC_SNK_DE_BV_02_I	PASS	haltest:
+				hl register_application bluez-android Bluez
+				bluez-hdp health-device-profile 1
+				BTHL_MDEP_ROLE_SINK 4100
+				BTHL_CHANNEL_TYPE_RELIABLE pulse-oximeter
 TC_SNK_DEP_BV_03_I	INC
 TC_SNK_DEP_BV_04_I	INC
 -------------------------------------------------------------------------------
-- 
1.8.3.2


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* Re: [PATCHv3 01/12] android/health: Add error check when creating app
  2014-06-27 11:24   ` [PATCHv3 01/12] android/health: Add error check when creating app Andrei Emeltchenko
                       ` (10 preceding siblings ...)
  2014-06-27 11:25     ` [PATCHv3 12/12] android/pts: Update HDP test results Andrei Emeltchenko
@ 2014-06-27 13:38     ` Szymon Janc
  11 siblings, 0 replies; 42+ messages in thread
From: Szymon Janc @ 2014-06-27 13:38 UTC (permalink / raw)
  To: Andrei Emeltchenko; +Cc: linux-bluetooth

Hi Andrei,

On Friday 27 of June 2014 14:24:52 Andrei Emeltchenko wrote:
> From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
> 
> ---
>  android/health.c | 6 +++++-
>  1 file changed, 5 insertions(+), 1 deletion(-)
> 
> diff --git a/android/health.c b/android/health.c
> index 42c9a6e..de67475 100644
> --- a/android/health.c
> +++ b/android/health.c
> @@ -820,6 +820,8 @@ static void bt_health_register_app(const void *buf, uint16_t len)
>  
>  	app = create_health_app(app_name, provider, srv_name, srv_descr,
>  							cmd->num_of_mdep);
> +	if (!app)
> +		goto fail;
>  
>  	if (!queue_push_tail(apps, app))
>  		goto fail;
> @@ -830,7 +832,9 @@ static void bt_health_register_app(const void *buf, uint16_t len)
>  	return;
>  
>  fail:
> -	free_health_app(app);
> +	if (app)
> +		free_health_app(app);
> +

This is not needed. free_health_app() already checks for NULL.

>  	ipc_send_rsp(hal_ipc, HAL_SERVICE_ID_HEALTH, HAL_OP_HEALTH_MDEP,
>  							HAL_STATUS_FAILED);
>  }
> 

-- 
Best regards, 
Szymon Janc

^ permalink raw reply	[flat|nested] 42+ messages in thread

* Re: [PATCHv3 03/12] android/health: Add HDP definitions
  2014-06-27 11:24     ` [PATCHv3 03/12] android/health: Add HDP definitions Andrei Emeltchenko
@ 2014-06-27 13:41       ` Szymon Janc
  0 siblings, 0 replies; 42+ messages in thread
From: Szymon Janc @ 2014-06-27 13:41 UTC (permalink / raw)
  To: Andrei Emeltchenko; +Cc: linux-bluetooth

Hi Andrei,

On Friday 27 of June 2014 14:24:54 Andrei Emeltchenko wrote:
> From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
> 
> ---
>  android/health.h | 8 ++++++++
>  1 file changed, 8 insertions(+)
> 
> diff --git a/android/health.h b/android/health.h
> index 0b32fd3..ab7d478 100644
> --- a/android/health.h
> +++ b/android/health.h
> @@ -21,5 +21,13 @@
>   *
>   */
>  
> +#define HDP_MDEP_ECHO		0x00
> +#define HDP_MDEP_INITIAL	0x01
> +#define HDP_MDEP_FINAL		0x7F
> +
> +#define HDP_NO_PREFERENCE_DC	0x00
> +#define HDP_RELIABLE_DC		0x01
> +#define HDP_STREAMING_DC	0x02

Are those going to be used outside of health.c ?
Also last three are already defined in health.c.

> +
>  bool bt_health_register(struct ipc *ipc, const bdaddr_t *addr, uint8_t mode);
>  void bt_health_unregister(void);
> 

-- 
Best regards, 
Szymon Janc

^ permalink raw reply	[flat|nested] 42+ messages in thread

* Re: [PATCHv3 05/12] android/health: Refactor channel creation
  2014-06-27 11:24     ` [PATCHv3 05/12] android/health: Refactor channel creation Andrei Emeltchenko
@ 2014-06-27 13:54       ` Szymon Janc
  2014-06-27 14:10         ` Andrei Emeltchenko
  0 siblings, 1 reply; 42+ messages in thread
From: Szymon Janc @ 2014-06-27 13:54 UTC (permalink / raw)
  To: Andrei Emeltchenko; +Cc: linux-bluetooth

Hi Andrei,

On Friday 27 of June 2014 14:24:56 Andrei Emeltchenko wrote:
> From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
> 
> Avoid using app_id when we shall use app structure itself. Otherwise we
> end up with unnecessary searches for app and problems for incoming
> connections.
> ---
>  android/health.c | 43 ++++++++++++++++++++++---------------------
>  1 file changed, 22 insertions(+), 21 deletions(-)
> 
> diff --git a/android/health.c b/android/health.c
> index 3cb2016..d664324 100644
> --- a/android/health.c
> +++ b/android/health.c
> @@ -1477,43 +1477,37 @@ static struct health_device *create_device(struct health_app *app,
>  	return dev;
>  }
>  
> -static struct health_device *get_device(uint16_t app_id, const uint8_t *addr)
> +static struct health_app *get_app(uint16_t app_id)
> +{
> +	return queue_find(apps, match_app_by_id, INT_TO_PTR(app_id));
> +}
> +
> +static struct health_device *get_device(struct health_app *app,
> +							const uint8_t *addr)
>  {
> -	struct health_app *app;
>  	struct health_device *dev;
>  	bdaddr_t bdaddr;
>  
> -	app = queue_find(apps, match_app_by_id, INT_TO_PTR(app_id));
> -	if (!app)
> -		return NULL;
> -
>  	android2bdaddr(addr, &bdaddr);
>  	dev = queue_find(app->devices, match_dev_by_addr, &bdaddr);
>  	if (dev)
>  		return dev;
>  
> -	dev = create_device(app, addr);
> -	if (dev)
> -		dev->app_id = app_id;
> -
> -	return dev;
> +	return create_device(app, addr);
>  }
>  
> -static struct health_channel *create_channel(uint16_t app_id,
> +static struct health_channel *create_channel(struct health_app *app,
>  						uint8_t mdep_index,
>  						struct health_device *dev)
>  {
> -	struct health_app *app;
>  	struct mdep_cfg *mdep;
>  	struct health_channel *channel;
>  	uint8_t index;
>  	static unsigned int channel_id = 1;
>  
> -	if (!dev)
> -		return NULL;
> +	DBG("mdep %u", mdep_index);
>  
> -	app = queue_find(apps, match_app_by_id, INT_TO_PTR(app_id));
> -	if (!app)
> +	if (!dev || !app)
>  		return NULL;
>  
>  	index = mdep_index + 1;
> @@ -1539,7 +1533,7 @@ static struct health_channel *create_channel(uint16_t app_id,
>  	return channel;
>  }
>  
> -static struct health_channel *get_channel(uint16_t app_id,
> +static struct health_channel *get_channel(struct health_app *app,
>  						uint8_t mdep_index,
>  						struct health_device *dev)
>  {
> @@ -1555,7 +1549,7 @@ static struct health_channel *get_channel(uint16_t app_id,
>  	if (channel)
>  		return channel;
>  
> -	return create_channel(app_id, mdep_index, dev);
> +	return create_channel(app, index, dev);
>  }
>  
>  static void bt_health_connect_channel(const void *buf, uint16_t len)
> @@ -1564,14 +1558,21 @@ static void bt_health_connect_channel(const void *buf, uint16_t len)
>  	struct hal_rsp_health_connect_channel rsp;
>  	struct health_device *dev = NULL;
>  	struct health_channel *channel = NULL;
> +	struct health_app *app;
>  
>  	DBG("");
>  
> -	dev = get_device(cmd->app_id, cmd->bdaddr);
> +	app = get_app(cmd->app_id);
> +	if (!app)
> +		goto fail;
> +
> +	dev = get_device(app, cmd->bdaddr);
>  	if (!dev)
>  		goto fail;
>  
> -	channel = get_channel(cmd->app_id, cmd->mdep_index, dev);
> +	dev->app_id = cmd->app_id;

Isn't device already having this set?

> +
> +	channel = get_channel(app, cmd->mdep_index, dev);
>  	if (!channel)
>  		goto fail;
>  
> 

-- 
Best regards, 
Szymon Janc

^ permalink raw reply	[flat|nested] 42+ messages in thread

* Re: [PATCHv3 09/12] android/health: Add handling for ECHO service
  2014-06-27 11:25     ` [PATCHv3 09/12] android/health: Add handling for ECHO service Andrei Emeltchenko
@ 2014-06-27 14:09       ` Szymon Janc
  2014-06-27 14:26         ` Andrei Emeltchenko
  0 siblings, 1 reply; 42+ messages in thread
From: Szymon Janc @ 2014-06-27 14:09 UTC (permalink / raw)
  To: Andrei Emeltchenko; +Cc: linux-bluetooth

Hi Andrei,

On Friday 27 of June 2014 14:25:00 Andrei Emeltchenko wrote:
> From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
> 
> Reply received buffer back for ECHO service.
> ---
>  android/health.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 62 insertions(+), 1 deletion(-)
> 
> diff --git a/android/health.c b/android/health.c
> index 4f15f93..9631d9e 100644
> --- a/android/health.c
> +++ b/android/health.c
> @@ -1054,9 +1054,70 @@ static int get_dcpsm(sdp_list_t *recs, uint16_t *dcpsm)
>  	return -1;
>  }
>  
> +static int send_echo_data(int sock, const void *buf, uint32_t size)
> +{
> +	const uint8_t *buf_b = buf;
> +	uint32_t sent = 0;
> +
> +	while (sent < size) {
> +		int n = write(sock, buf_b + sent, size - sent);
> +		if (n < 0)
> +			return -1;
> +		sent += n;
> +	}
> +
> +	return 0;
> +}
> +
> +static gboolean serve_echo(GIOChannel *io, GIOCondition cond, gpointer data)
> +{
> +	struct health_channel *channel = data;
> +	uint8_t buf[MCAP_DC_MTU];
> +	int fd, len;
> +
> +	DBG("channel %p", channel);
> +
> +	if (cond & (G_IO_ERR | G_IO_HUP | G_IO_NVAL)) {
> +		DBG("Error condition on channel");
> +		return FALSE;
> +	}
> +
> +	fd = g_io_channel_unix_get_fd(io);
> +
> +	len = read(fd, buf, sizeof(buf));
> +	if (len < 0)
> +		goto fail;
> +
> +	if (send_echo_data(fd, buf, len)  >= 0)
> +		return TRUE;

Shouldn't initiator send only one single data packet in echo test function?

> +
> +fail:
> +	free_health_device(channel->dev);

Wouldn't that leave dangling pointer in channel? Also, why is this free here?

> +	return FALSE;
> +}
> +
>  static void mcap_mdl_connected_cb(struct mcap_mdl *mdl, void *data)
>  {
> -	DBG("Not Implemeneted");
> +	struct health_channel *channel = data;
> +
> +	if (!channel->mdl)
> +		channel->mdl = mcap_mdl_ref(mdl);
> +
> +	DBG("Data channel connected: mdl %p channel %p", mdl, channel);
> +
> +	if (channel->mdep_id == HDP_MDEP_ECHO) {
> +		GIOChannel *io;
> +		int fd;
> +
> +		fd = mcap_mdl_get_fd(channel->mdl);
> +		if (fd < 0)
> +			return;
> +
> +		io = g_io_channel_unix_new(fd);
> +		g_io_add_watch(io, G_IO_ERR | G_IO_HUP | G_IO_NVAL | G_IO_IN,
> +							serve_echo, channel);
> +		g_io_channel_unref(io);
> +	}
>  }
>  
>  static void mcap_mdl_closed_cb(struct mcap_mdl *mdl, void *data)
> 

-- 
Best regards, 
Szymon Janc

^ permalink raw reply	[flat|nested] 42+ messages in thread

* Re: [PATCHv3 05/12] android/health: Refactor channel creation
  2014-06-27 13:54       ` Szymon Janc
@ 2014-06-27 14:10         ` Andrei Emeltchenko
  2014-06-27 14:36           ` Szymon Janc
  0 siblings, 1 reply; 42+ messages in thread
From: Andrei Emeltchenko @ 2014-06-27 14:10 UTC (permalink / raw)
  To: Szymon Janc; +Cc: linux-bluetooth

Hi Szymon,

On Fri, Jun 27, 2014 at 03:54:20PM +0200, Szymon Janc wrote:
> Hi Andrei,
> 
> On Friday 27 of June 2014 14:24:56 Andrei Emeltchenko wrote:
> > From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
> > 
> > Avoid using app_id when we shall use app structure itself. Otherwise we
> > end up with unnecessary searches for app and problems for incoming
> > connections.
> > ---
> >  android/health.c | 43 ++++++++++++++++++++++---------------------
> >  1 file changed, 22 insertions(+), 21 deletions(-)
> > 
> > diff --git a/android/health.c b/android/health.c
> > index 3cb2016..d664324 100644
> > --- a/android/health.c
> > +++ b/android/health.c
> > @@ -1477,43 +1477,37 @@ static struct health_device *create_device(struct health_app *app,
> >  	return dev;
> >  }
> >  
> > -static struct health_device *get_device(uint16_t app_id, const uint8_t *addr)
> > +static struct health_app *get_app(uint16_t app_id)
> > +{
> > +	return queue_find(apps, match_app_by_id, INT_TO_PTR(app_id));
> > +}
> > +
> > +static struct health_device *get_device(struct health_app *app,
> > +							const uint8_t *addr)
> >  {
> > -	struct health_app *app;
> >  	struct health_device *dev;
> >  	bdaddr_t bdaddr;
> >  
> > -	app = queue_find(apps, match_app_by_id, INT_TO_PTR(app_id));
> > -	if (!app)
> > -		return NULL;
> > -
> >  	android2bdaddr(addr, &bdaddr);
> >  	dev = queue_find(app->devices, match_dev_by_addr, &bdaddr);
> >  	if (dev)
> >  		return dev;
> >  
> > -	dev = create_device(app, addr);
> > -	if (dev)
> > -		dev->app_id = app_id;
> > -
> > -	return dev;
> > +	return create_device(app, addr);
> >  }
> >  
> > -static struct health_channel *create_channel(uint16_t app_id,
> > +static struct health_channel *create_channel(struct health_app *app,
> >  						uint8_t mdep_index,
> >  						struct health_device *dev)
> >  {
> > -	struct health_app *app;
> >  	struct mdep_cfg *mdep;
> >  	struct health_channel *channel;
> >  	uint8_t index;
> >  	static unsigned int channel_id = 1;
> >  
> > -	if (!dev)
> > -		return NULL;
> > +	DBG("mdep %u", mdep_index);
> >  
> > -	app = queue_find(apps, match_app_by_id, INT_TO_PTR(app_id));
> > -	if (!app)
> > +	if (!dev || !app)
> >  		return NULL;
> >  
> >  	index = mdep_index + 1;
> > @@ -1539,7 +1533,7 @@ static struct health_channel *create_channel(uint16_t app_id,
> >  	return channel;
> >  }
> >  
> > -static struct health_channel *get_channel(uint16_t app_id,
> > +static struct health_channel *get_channel(struct health_app *app,
> >  						uint8_t mdep_index,
> >  						struct health_device *dev)
> >  {
> > @@ -1555,7 +1549,7 @@ static struct health_channel *get_channel(uint16_t app_id,
> >  	if (channel)
> >  		return channel;
> >  
> > -	return create_channel(app_id, mdep_index, dev);
> > +	return create_channel(app, index, dev);
> >  }
> >  
> >  static void bt_health_connect_channel(const void *buf, uint16_t len)
> > @@ -1564,14 +1558,21 @@ static void bt_health_connect_channel(const void *buf, uint16_t len)
> >  	struct hal_rsp_health_connect_channel rsp;
> >  	struct health_device *dev = NULL;
> >  	struct health_channel *channel = NULL;
> > +	struct health_app *app;
> >  
> >  	DBG("");
> >  
> > -	dev = get_device(cmd->app_id, cmd->bdaddr);
> > +	app = get_app(cmd->app_id);
> > +	if (!app)
> > +		goto fail;
> > +
> > +	dev = get_device(app, cmd->bdaddr);
> >  	if (!dev)
> >  		goto fail;
> >  
> > -	channel = get_channel(cmd->app_id, cmd->mdep_index, dev);
> > +	dev->app_id = cmd->app_id;
> 
> Isn't device already having this set?

This one is just refactoring, so I leave all logic.

Best regards 
Andrei Emeltchenko 


^ permalink raw reply	[flat|nested] 42+ messages in thread

* Re: [PATCHv3 02/12] android/health: Fix wrong callback return type
  2014-06-27 11:24     ` [PATCHv3 02/12] android/health: Fix wrong callback return type Andrei Emeltchenko
@ 2014-06-27 14:11       ` Szymon Janc
  0 siblings, 0 replies; 42+ messages in thread
From: Szymon Janc @ 2014-06-27 14:11 UTC (permalink / raw)
  To: Andrei Emeltchenko; +Cc: linux-bluetooth

Hi Andrei,

On Friday 27 of June 2014 14:24:53 Andrei Emeltchenko wrote:
> From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
> 
> ---
>  android/health.c | 8 ++++++--
>  1 file changed, 6 insertions(+), 2 deletions(-)
> 
> diff --git a/android/health.c b/android/health.c
> index de67475..140afee 100644
> --- a/android/health.c
> +++ b/android/health.c
> @@ -1098,15 +1098,19 @@ static void mcap_mdl_aborted_cb(struct mcap_mdl *mdl, void *data)
>  	DBG("Not Implemeneted");
>  }
>  
> -static void mcap_mdl_conn_req_cb(struct mcap_mcl *mcl, uint8_t mdepid,
> +static uint8_t mcap_mdl_conn_req_cb(struct mcap_mcl *mcl, uint8_t mdepid,
>  				uint16_t mdlid, uint8_t *conf, void *data)
>  {
>  	DBG("Not Implemeneted");
> +
> +	return MCAP_SUCCESS;
>  }
>  
> -static void mcap_mdl_reconn_req_cb(struct mcap_mdl *mdl, void *data)
> +static uint8_t mcap_mdl_reconn_req_cb(struct mcap_mdl *mdl, void *data)
>  {
>  	DBG("Not Implemeneted");
> +
> +	return MCAP_SUCCESS;
>  }
>  
>  static void connect_mdl_cb(struct mcap_mdl *mdl, GError *gerr, gpointer data)

This patch is now applied. Thanks. 

-- 
Best regards, 
Szymon Janc

^ permalink raw reply	[flat|nested] 42+ messages in thread

* Re: [PATCHv3 11/12] android/mcap: Fix using uninitialised value
  2014-06-27 11:25     ` [PATCHv3 11/12] android/mcap: Fix using uninitialised value Andrei Emeltchenko
@ 2014-06-27 14:11       ` Szymon Janc
  0 siblings, 0 replies; 42+ messages in thread
From: Szymon Janc @ 2014-06-27 14:11 UTC (permalink / raw)
  To: Andrei Emeltchenko; +Cc: linux-bluetooth

Hi Andrei,

On Friday 27 of June 2014 14:25:02 Andrei Emeltchenko wrote:
> From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
> 
> Fixes clang warning:
> ...
> android/mcap-lib.c:2366:20: warning: The left operand of '*' is a
> garbage value
>         return tv->tv_sec * 1000000ll + tv->tv_nsec / 1000ll;
>                ~~~~~~~~~~ ^
> 1 warning generated.
> ...
> ---
>  android/mcap-lib.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/android/mcap-lib.c b/android/mcap-lib.c
> index 256abe1..79f6ce2 100644
> --- a/android/mcap-lib.c
> +++ b/android/mcap-lib.c
> @@ -2454,7 +2454,8 @@ uint64_t mcap_get_timestamp(struct mcap_mcl *mcl,
>  	if (given_time)
>  		now = *given_time;
>  	else
> -		clock_gettime(CLK, &now);
> +		if (clock_gettime(CLK, &now) < 0)
> +			return MCAP_TMSTAMP_DONTSET;
>  
>  	tmstamp = time_us(&now) - time_us(&mcl->csp->base_time)
>  		+ mcl->csp->base_tmstamp;
> 

Patch applied. Thanks.

-- 
Best regards, 
Szymon Janc

^ permalink raw reply	[flat|nested] 42+ messages in thread

* Re: [PATCHv3 09/12] android/health: Add handling for ECHO service
  2014-06-27 14:09       ` Szymon Janc
@ 2014-06-27 14:26         ` Andrei Emeltchenko
  0 siblings, 0 replies; 42+ messages in thread
From: Andrei Emeltchenko @ 2014-06-27 14:26 UTC (permalink / raw)
  To: Szymon Janc; +Cc: linux-bluetooth

Hi Szymon,

On Fri, Jun 27, 2014 at 04:09:18PM +0200, Szymon Janc wrote:
> Hi Andrei,
> 
> On Friday 27 of June 2014 14:25:00 Andrei Emeltchenko wrote:
> > From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
> > 
> > Reply received buffer back for ECHO service.
> > ---
> >  android/health.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-
> >  1 file changed, 62 insertions(+), 1 deletion(-)
> > 
> > diff --git a/android/health.c b/android/health.c
> > index 4f15f93..9631d9e 100644
> > --- a/android/health.c
> > +++ b/android/health.c
> > @@ -1054,9 +1054,70 @@ static int get_dcpsm(sdp_list_t *recs, uint16_t *dcpsm)
> >  	return -1;
> >  }
> >  
> > +static int send_echo_data(int sock, const void *buf, uint32_t size)
> > +{
> > +	const uint8_t *buf_b = buf;
> > +	uint32_t sent = 0;
> > +
> > +	while (sent < size) {
> > +		int n = write(sock, buf_b + sent, size - sent);
> > +		if (n < 0)
> > +			return -1;
> > +		sent += n;
> > +	}
> > +
> > +	return 0;
> > +}
> > +
> > +static gboolean serve_echo(GIOChannel *io, GIOCondition cond, gpointer data)
> > +{
> > +	struct health_channel *channel = data;
> > +	uint8_t buf[MCAP_DC_MTU];
> > +	int fd, len;
> > +
> > +	DBG("channel %p", channel);
> > +
> > +	if (cond & (G_IO_ERR | G_IO_HUP | G_IO_NVAL)) {
> > +		DBG("Error condition on channel");
> > +		return FALSE;
> > +	}
> > +
> > +	fd = g_io_channel_unix_get_fd(io);
> > +
> > +	len = read(fd, buf, sizeof(buf));
> > +	if (len < 0)
> > +		goto fail;
> > +
> > +	if (send_echo_data(fd, buf, len)  >= 0)
> > +		return TRUE;
> 
> Shouldn't initiator send only one single data packet in echo test function?
> 

yes you are right here.

> > +
> > +fail:
> > +	free_health_device(channel->dev);
> 
> Wouldn't that leave dangling pointer in channel? Also, why is this free here?
> 

I will rework this patch.

Best regards 
Andrei Emeltchenko 

^ permalink raw reply	[flat|nested] 42+ messages in thread

* Re: [PATCHv3 05/12] android/health: Refactor channel creation
  2014-06-27 14:10         ` Andrei Emeltchenko
@ 2014-06-27 14:36           ` Szymon Janc
  0 siblings, 0 replies; 42+ messages in thread
From: Szymon Janc @ 2014-06-27 14:36 UTC (permalink / raw)
  To: Andrei Emeltchenko; +Cc: linux-bluetooth

Hi Andrei,

On Friday 27 of June 2014 17:10:05 Andrei Emeltchenko wrote:
> Hi Szymon,
> 
> On Fri, Jun 27, 2014 at 03:54:20PM +0200, Szymon Janc wrote:
> > Hi Andrei,
> > 
> > On Friday 27 of June 2014 14:24:56 Andrei Emeltchenko wrote:
> > > From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
> > > 
> > > Avoid using app_id when we shall use app structure itself. Otherwise we
> > > end up with unnecessary searches for app and problems for incoming
> > > connections.
> > > ---
> > >  android/health.c | 43 ++++++++++++++++++++++---------------------
> > >  1 file changed, 22 insertions(+), 21 deletions(-)
> > > 
> > > diff --git a/android/health.c b/android/health.c
> > > index 3cb2016..d664324 100644
> > > --- a/android/health.c
> > > +++ b/android/health.c
> > > @@ -1477,43 +1477,37 @@ static struct health_device *create_device(struct health_app *app,
> > >  	return dev;
> > >  }
> > >  
> > > -static struct health_device *get_device(uint16_t app_id, const uint8_t *addr)
> > > +static struct health_app *get_app(uint16_t app_id)
> > > +{
> > > +	return queue_find(apps, match_app_by_id, INT_TO_PTR(app_id));
> > > +}
> > > +
> > > +static struct health_device *get_device(struct health_app *app,
> > > +							const uint8_t *addr)
> > >  {
> > > -	struct health_app *app;
> > >  	struct health_device *dev;
> > >  	bdaddr_t bdaddr;
> > >  
> > > -	app = queue_find(apps, match_app_by_id, INT_TO_PTR(app_id));
> > > -	if (!app)
> > > -		return NULL;
> > > -
> > >  	android2bdaddr(addr, &bdaddr);
> > >  	dev = queue_find(app->devices, match_dev_by_addr, &bdaddr);
> > >  	if (dev)
> > >  		return dev;
> > >  
> > > -	dev = create_device(app, addr);
> > > -	if (dev)
> > > -		dev->app_id = app_id;
> > > -
> > > -	return dev;
> > > +	return create_device(app, addr);
> > >  }
> > >  
> > > -static struct health_channel *create_channel(uint16_t app_id,
> > > +static struct health_channel *create_channel(struct health_app *app,
> > >  						uint8_t mdep_index,
> > >  						struct health_device *dev)
> > >  {
> > > -	struct health_app *app;
> > >  	struct mdep_cfg *mdep;
> > >  	struct health_channel *channel;
> > >  	uint8_t index;
> > >  	static unsigned int channel_id = 1;
> > >  
> > > -	if (!dev)
> > > -		return NULL;
> > > +	DBG("mdep %u", mdep_index);
> > >  
> > > -	app = queue_find(apps, match_app_by_id, INT_TO_PTR(app_id));
> > > -	if (!app)
> > > +	if (!dev || !app)
> > >  		return NULL;
> > >  
> > >  	index = mdep_index + 1;
> > > @@ -1539,7 +1533,7 @@ static struct health_channel *create_channel(uint16_t app_id,
> > >  	return channel;
> > >  }
> > >  
> > > -static struct health_channel *get_channel(uint16_t app_id,
> > > +static struct health_channel *get_channel(struct health_app *app,
> > >  						uint8_t mdep_index,
> > >  						struct health_device *dev)
> > >  {
> > > @@ -1555,7 +1549,7 @@ static struct health_channel *get_channel(uint16_t app_id,
> > >  	if (channel)
> > >  		return channel;
> > >  
> > > -	return create_channel(app_id, mdep_index, dev);
> > > +	return create_channel(app, index, dev);
> > >  }
> > >  
> > >  static void bt_health_connect_channel(const void *buf, uint16_t len)
> > > @@ -1564,14 +1558,21 @@ static void bt_health_connect_channel(const void *buf, uint16_t len)
> > >  	struct hal_rsp_health_connect_channel rsp;
> > >  	struct health_device *dev = NULL;
> > >  	struct health_channel *channel = NULL;
> > > +	struct health_app *app;
> > >  
> > >  	DBG("");
> > >  
> > > -	dev = get_device(cmd->app_id, cmd->bdaddr);
> > > +	app = get_app(cmd->app_id);
> > > +	if (!app)
> > > +		goto fail;
> > > +
> > > +	dev = get_device(app, cmd->bdaddr);
> > >  	if (!dev)
> > >  		goto fail;
> > >  
> > > -	channel = get_channel(cmd->app_id, cmd->mdep_index, dev);
> > > +	dev->app_id = cmd->app_id;
> > 
> > Isn't device already having this set?
> 
> This one is just refactoring, so I leave all logic.

OK, but then while you do refactor why not clean this up?
I find it a bit strange that moving dev->app_id assignment outside
of get_device() (which already takes app as parameter) is suppose to
make code better.

-- 
Best regards, 
Szymon Janc

^ permalink raw reply	[flat|nested] 42+ messages in thread

end of thread, other threads:[~2014-06-27 14:36 UTC | newest]

Thread overview: 42+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-06-26 12:04 [PATCH 1/9] android/health: Add error check when creating app Andrei Emeltchenko
2014-06-26 12:04 ` [PATCH 2/9] android/health: Add handling MDL connection request Andrei Emeltchenko
2014-06-26 14:13   ` Szymon Janc
2014-06-26 12:04 ` [PATCH 3/9] android/health: Fix wrong callback return type Andrei Emeltchenko
2014-06-26 14:35   ` Szymon Janc
2014-06-26 12:04 ` [PATCH 4/9] android/health: Refactor channel creation Andrei Emeltchenko
2014-06-26 12:04 ` [PATCH 5/9] android/health: Add channel connect Andrei Emeltchenko
2014-06-26 12:04 ` [PATCH 6/9] android/health: Assign channel to user_data Andrei Emeltchenko
2014-06-26 12:04 ` [PATCH 7/9] android/health: Create mdep for ECHO channel Andrei Emeltchenko
2014-06-26 12:04 ` [PATCH 8/9] android/health: Add handling for ECHO service Andrei Emeltchenko
2014-06-26 12:04 ` [PATCH 9/9] android/health: Improve debug Andrei Emeltchenko
2014-06-27  7:39 ` [PATCHv2 1/9] android/health: Add error check when creating app Andrei Emeltchenko
2014-06-27  7:39   ` [PATCHv2 2/9] android/health: Fix wrong callback return type Andrei Emeltchenko
2014-06-27  7:39   ` [PATCHv2 3/9] android/health: Add handling MDL connection request Andrei Emeltchenko
2014-06-27  7:39   ` [PATCHv2 4/9] android/health: Refactor channel creation Andrei Emeltchenko
2014-06-27  7:39   ` [PATCHv2 5/9] android/health: Add channel connect Andrei Emeltchenko
2014-06-27  7:40   ` [PATCHv2 6/9] android/health: Assign channel to user_data Andrei Emeltchenko
2014-06-27  7:40   ` [PATCHv2 7/9] android/health: Create mdep for ECHO channel Andrei Emeltchenko
2014-06-27  7:40   ` [PATCHv2 8/9] android/health: Add handling for ECHO service Andrei Emeltchenko
2014-06-27  7:40   ` [PATCHv2 9/9] android/health: Improve debug Andrei Emeltchenko
2014-06-27  7:59 ` [PATCH] android/pts: Update HDP test results Andrei Emeltchenko
2014-06-27 11:24   ` [PATCHv3 01/12] android/health: Add error check when creating app Andrei Emeltchenko
2014-06-27 11:24     ` [PATCHv3 02/12] android/health: Fix wrong callback return type Andrei Emeltchenko
2014-06-27 14:11       ` Szymon Janc
2014-06-27 11:24     ` [PATCHv3 03/12] android/health: Add HDP definitions Andrei Emeltchenko
2014-06-27 13:41       ` Szymon Janc
2014-06-27 11:24     ` [PATCHv3 04/12] android/health: Add handling MDL connection request Andrei Emeltchenko
2014-06-27 11:24     ` [PATCHv3 05/12] android/health: Refactor channel creation Andrei Emeltchenko
2014-06-27 13:54       ` Szymon Janc
2014-06-27 14:10         ` Andrei Emeltchenko
2014-06-27 14:36           ` Szymon Janc
2014-06-27 11:24     ` [PATCHv3 06/12] android/health: Add channel connect Andrei Emeltchenko
2014-06-27 11:24     ` [PATCHv3 07/12] android/health: Assign channel to user_data Andrei Emeltchenko
2014-06-27 11:24     ` [PATCHv3 08/12] android/health: Create mdep for ECHO channel Andrei Emeltchenko
2014-06-27 11:25     ` [PATCHv3 09/12] android/health: Add handling for ECHO service Andrei Emeltchenko
2014-06-27 14:09       ` Szymon Janc
2014-06-27 14:26         ` Andrei Emeltchenko
2014-06-27 11:25     ` [PATCHv3 10/12] android/health: Improve debug Andrei Emeltchenko
2014-06-27 11:25     ` [PATCHv3 11/12] android/mcap: Fix using uninitialised value Andrei Emeltchenko
2014-06-27 14:11       ` Szymon Janc
2014-06-27 11:25     ` [PATCHv3 12/12] android/pts: Update HDP test results Andrei Emeltchenko
2014-06-27 13:38     ` [PATCHv3 01/12] android/health: Add error check when creating app Szymon Janc

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.