All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andrei Emeltchenko <Andrei.Emeltchenko.news@gmail.com>
To: linux-bluetooth@vger.kernel.org
Subject: [PATCHv2 5/9] android/health: Add channel connect
Date: Fri, 27 Jun 2014 10:39:59 +0300	[thread overview]
Message-ID: <1403854803-28850-5-git-send-email-Andrei.Emeltchenko.news@gmail.com> (raw)
In-Reply-To: <1403854803-28850-1-git-send-email-Andrei.Emeltchenko.news@gmail.com>

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


  parent reply	other threads:[~2014-06-27  7:39 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
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   ` Andrei Emeltchenko [this message]
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

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1403854803-28850-5-git-send-email-Andrei.Emeltchenko.news@gmail.com \
    --to=andrei.emeltchenko.news@gmail.com \
    --cc=linux-bluetooth@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.