linux-bluetooth.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Santiago Carot-Nemesio <sancane@gmail.com>
To: linux-bluetooth@vger.kernel.org
Cc: Santiago Carot-Nemesio <sancane@gmail.com>
Subject: [PATCH 19/25] Process response to std. op. codes
Date: Fri, 14 May 2010 12:19:46 +0200	[thread overview]
Message-ID: <1273832392-18654-19-git-send-email-sancane@gmail.com> (raw)
In-Reply-To: <1273832392-18654-18-git-send-email-sancane@gmail.com>

---
 mcap/mcap.c |  140 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 139 insertions(+), 1 deletions(-)

diff --git a/mcap/mcap.c b/mcap/mcap.c
index b0cf651..efc512a 100644
--- a/mcap/mcap.c
+++ b/mcap/mcap.c
@@ -1171,9 +1171,112 @@ static void proc_req_active(struct mcap_mcl *mcl, uint8_t *cmd, uint32_t len)
 	}
 }
 
+static gboolean process_md_create_mdl_rsp(struct mcap_mcl *mcl,
+						uint8_t *cmd, uint32_t len)
+{
+	return FALSE;
+}
+
+static gboolean process_md_reconnect_mdl_rsp(struct mcap_mcl *mcl,
+						uint8_t *cmd, uint32_t len)
+{
+	return FALSE;
+}
+
+static gboolean process_md_abort_mdl_rsp(struct mcap_mcl *mcl,
+						uint8_t *cmd, uint32_t len)
+{
+	return FALSE;
+}
+
+static gboolean process_md_delete_mdl_rsp(struct mcap_mcl *mcl, uint8_t *cmd,
+								uint32_t len)
+{
+	return FALSE;
+}
+
+static gboolean check_rsp(struct mcap_mcl *mcl, uint8_t *cmd, uint32_t len)
+{
+	mcap4B_rsp *rsp;
+	GError *gerr = NULL;
+
+	/* Check if the response matches with the last request */
+	if ((cmd[0] != MCAP_ERROR_RSP) && ((mcl->lcmd[0] + 1) != cmd[0]))
+		goto close_mcl;
+
+	if (len < 4)
+		goto close_mcl;
+
+	rsp = (mcap4B_rsp *)cmd;
+
+	if (rsp->rc == MCAP_REQUEST_NOT_SUPPORTED) {
+		debug("Remote does not support opcodes");
+		g_set_error(&gerr, MCAP_ERROR, MCAP_ERROR_REQUEST_NOT_SUPPORTED,
+						"%s", error2str(rsp->rc));
+		mcap_notify_error(mcl, gerr);
+		g_error_free(gerr);
+
+		g_free(mcl->lcmd);
+		mcl->lcmd = NULL;
+		mcl->ctrl &= ~MCAP_CTRL_STD_OP;
+		mcl->req = MCL_AVAILABLE;
+		update_mcl_state(mcl);
+		return FALSE;
+	}
+
+	if (rsp->rc == MCAP_UNSPECIFIED_ERROR)
+		goto close_mcl;
+
+	return TRUE;
+close_mcl:
+	if (rsp->rc == MCAP_UNSPECIFIED_ERROR)
+		g_set_error(&gerr, MCAP_ERROR, MCAP_ERROR_UNSPECIFIED_ERROR,
+						"%s", error2str(rsp->rc));
+	else
+		g_set_error(&gerr, MCAP_ERROR, MCAP_ERROR_FAILED,
+						"Protocol error");
+	mcap_notify_error(mcl, gerr);
+	g_error_free(gerr);
+	mcl->ms->mcl_disconnected_cb(mcl, mcl->ms->user_data);
+	mcap_cache_mcl(mcl);
+	return FALSE;
+}
+
 static void proc_response(struct mcap_mcl *mcl, uint8_t *cmd, uint32_t len)
 {
-	/* TODO */
+	gboolean close;
+	RELEASE_TIMER(mcl);
+
+	if (!check_rsp(mcl, cmd, len))
+		return;
+
+	switch (cmd[0]) {
+	case MCAP_ERROR_RSP:
+		error("MCAP_ERROR_RSP received");
+		close = TRUE;
+		break;
+	case MCAP_MD_CREATE_MDL_RSP:
+		close = process_md_create_mdl_rsp(mcl, cmd, len);
+		break;
+	case MCAP_MD_RECONNECT_MDL_RSP:
+		close = process_md_reconnect_mdl_rsp(mcl, cmd, len);
+		break;
+	case MCAP_MD_ABORT_MDL_RSP:
+		close = process_md_abort_mdl_rsp(mcl, cmd, len);
+		break;
+	case MCAP_MD_DELETE_MDL_RSP:
+		close = process_md_delete_mdl_rsp(mcl, cmd, len);
+		break;
+	default:
+		debug("Unknown cmd response received (op code = %d)",cmd[0]);
+		close = TRUE;
+		break;
+	}
+
+	if (close) {
+		mcl->ms->mcl_disconnected_cb(mcl, mcl->ms->user_data);
+		mcap_cache_mcl(mcl);
+	}
 }
 
 static void rsend_req(struct mcap_mcl *mcl)
@@ -1632,3 +1735,38 @@ void mcap_release_instance(struct mcap_instance *ms)
 	g_free(ms);
 }
 
+uint16_t mcap_get_ctrl_psm(struct mcap_instance *ms, GError **err)
+{
+	uint16_t lpsm;
+
+	if (!(ms && ms->ccio)) {
+		g_set_error(err, MCAP_ERROR, MCAP_ERROR_INVALID_ARGS,
+			"Invalid MCAP instance");
+		return 0;
+	}
+
+	bt_io_get(ms->ccio, BT_IO_L2CAP, err,
+			BT_IO_OPT_PSM, &lpsm,
+			BT_IO_OPT_INVALID);
+	if (*err)
+		return 0;
+	return lpsm;
+}
+
+uint16_t mcap_get_data_psm(struct mcap_instance *ms, GError **err)
+{
+	uint16_t lpsm;
+
+	if (!(ms && ms->dcio)) {
+		g_set_error(err, MCAP_ERROR, MCAP_ERROR_INVALID_ARGS,
+			"Invalid MCAP instance");
+		return 0;
+	}
+
+	bt_io_get(ms->dcio, BT_IO_L2CAP, err,
+			BT_IO_OPT_PSM, &lpsm,
+			BT_IO_OPT_INVALID);
+	if (*err)
+		return 0;
+	return lpsm;
+}
-- 
1.6.3.3


  reply	other threads:[~2010-05-14 10:19 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-05-14 10:19 [PATCH 01/25] Initial support for MCAP Santiago Carot-Nemesio
2010-05-14 10:19 ` [PATCH 02/25] Initial work to create MCAP instances Santiago Carot-Nemesio
2010-05-14 10:19   ` [PATCH 03/25] Initial work to process incomming connection of MCLs Santiago Carot-Nemesio
2010-05-14 10:19     ` [PATCH 04/25] Process events over Control Channels Santiago Carot-Nemesio
2010-05-14 10:19       ` [PATCH 05/25] Save and restore state of MCLs Santiago Carot-Nemesio
2010-05-14 10:19         ` [PATCH 06/25] Release MCAP instances Santiago Carot-Nemesio
2010-05-14 10:19           ` [PATCH 07/25] Process md_create_mdl_req in CONNECTED state Santiago Carot-Nemesio
2010-05-14 10:19             ` [PATCH 08/25] Process md_reconnect_mdl_req " Santiago Carot-Nemesio
2010-05-14 10:19               ` [PATCH 09/25] Process md_delete_mdl_req " Santiago Carot-Nemesio
2010-05-14 10:19                 ` [PATCH 10/25] Process md_abort_mdl_req in PENDING state Santiago Carot-Nemesio
2010-05-14 10:19                   ` [PATCH 11/25] Process commands in ACTIVE state Santiago Carot-Nemesio
2010-05-14 10:19                     ` [PATCH 12/25] Managing connection of Data Channels Santiago Carot-Nemesio
2010-05-14 10:19                       ` [PATCH 13/25] Enable connect operation to a remote MCAP instances Santiago Carot-Nemesio
2010-05-14 10:19                         ` [PATCH 14/25] Implement set callbacks operation over MCLs Santiago Carot-Nemesio
2010-05-14 10:19                           ` [PATCH 15/25] Implement function to send md_create_mdl_req Santiago Carot-Nemesio
2010-05-14 10:19                             ` [PATCH 16/25] Implement function to send md_reconnect_mdl_req Santiago Carot-Nemesio
2010-05-14 10:19                               ` [PATCH 17/25] Implement function to send md_delete_mdl_req Santiago Carot-Nemesio
2010-05-14 10:19                                 ` [PATCH 18/25] Implement function to send md_abort_mdl_req Santiago Carot-Nemesio
2010-05-14 10:19                                   ` Santiago Carot-Nemesio [this message]
2010-05-14 10:19                                     ` [PATCH 20/25] Process md_create_mdl_rsp Santiago Carot-Nemesio
2010-05-14 10:19                                       ` [PATCH 21/25] Process md_reconnect_mdl_rsp Santiago Carot-Nemesio
2010-05-14 10:19                                         ` [PATCH 22/25] Process md_abort_mdl_rsp Santiago Carot-Nemesio
2010-05-14 10:19                                           ` [PATCH 23/25] Process md_delete_mdl_rsp Santiago Carot-Nemesio
2010-05-14 10:19                                             ` [PATCH 24/25] Enable connection of Data Channel with remote MCAP instances Santiago Carot-Nemesio
2010-05-14 10:19                                               ` [PATCH 25/25] Initial support for clock synchronization protocol Santiago Carot-Nemesio

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=1273832392-18654-19-git-send-email-sancane@gmail.com \
    --to=sancane@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 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).