linux-bluetooth.vger.kernel.org archive mirror
 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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).