* [PATCH 42/60] Move assignment of data channel configuration
From: Jose Antonio Santos Cadenas @ 2010-07-22 8:56 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Jose Antonio Santos Cadenas
In-Reply-To: <1279789001-4587-23-git-send-email-santoscadenas@gmail.com>
---
mcap/mcap.c | 5 ++---
1 files changed, 2 insertions(+), 3 deletions(-)
diff --git a/mcap/mcap.c b/mcap/mcap.c
index 1d33452..ff6766d 100644
--- a/mcap/mcap.c
+++ b/mcap/mcap.c
@@ -955,8 +955,6 @@ static void process_md_create_mdl_req(struct mcap_mcl *mcl, uint8_t *cmd,
return;
}
- cfga = conf = req->conf;
-
mdl = get_mdl(mcl, mdl_id);
if (mdl && mdl->state == MDL_WAITING) {
/* A remote petition is also triying to connect this mdl_id
@@ -964,7 +962,9 @@ static void process_md_create_mdl_req(struct mcap_mcl *mcl, uint8_t *cmd,
send4B_cmd(mcl, MCAP_MD_CREATE_MDL_RSP, MCAP_MDL_BUSY, mdl_id);
return;
}
+
/* Callback to upper layer */
+ cfga = conf = req->conf;
rsp = mcl->cb->mdl_conn_req(mcl, mdep_id, mdl_id, &conf,
mcl->cb->user_data);
if (mcl->state == MCL_IDLE) {
@@ -985,7 +985,6 @@ static void process_md_create_mdl_req(struct mcap_mcl *mcl, uint8_t *cmd,
return;
}
-
if (!mdl) {
mdl = g_malloc0(sizeof(struct mcap_mdl));
mdl->mcl = mcl;
--
1.6.3.3
^ permalink raw reply related
* [PATCH 41/60] Solve a bug when both sides request a creation of data channel with the same mdlid
From: Jose Antonio Santos Cadenas @ 2010-07-22 8:56 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Jose Antonio Santos Cadenas
In-Reply-To: <1279789001-4587-22-git-send-email-santoscadenas@gmail.com>
---
mcap/mcap.c | 10 +++++++++-
1 files changed, 9 insertions(+), 1 deletions(-)
diff --git a/mcap/mcap.c b/mcap/mcap.c
index 64e76b5..1d33452 100644
--- a/mcap/mcap.c
+++ b/mcap/mcap.c
@@ -956,6 +956,14 @@ static void process_md_create_mdl_req(struct mcap_mcl *mcl, uint8_t *cmd,
}
cfga = conf = req->conf;
+
+ mdl = get_mdl(mcl, mdl_id);
+ if (mdl && mdl->state == MDL_WAITING) {
+ /* A remote petition is also triying to connect this mdl_id
+ * so the petition is rejected by the moment */
+ send4B_cmd(mcl, MCAP_MD_CREATE_MDL_RSP, MCAP_MDL_BUSY, mdl_id);
+ return;
+ }
/* Callback to upper layer */
rsp = mcl->cb->mdl_conn_req(mcl, mdep_id, mdl_id, &conf,
mcl->cb->user_data);
@@ -977,7 +985,7 @@ static void process_md_create_mdl_req(struct mcap_mcl *mcl, uint8_t *cmd,
return;
}
- mdl = get_mdl(mcl, mdl_id);
+
if (!mdl) {
mdl = g_malloc0(sizeof(struct mcap_mdl));
mdl->mcl = mcl;
--
1.6.3.3
^ permalink raw reply related
* [PATCH 40/60] Fix memory leak when double deletion happens and response code isn't SUCCESS
From: Jose Antonio Santos Cadenas @ 2010-07-22 8:56 UTC (permalink / raw)
To: linux-bluetooth; +Cc: José Antonio Santos-Cadenas
In-Reply-To: <1279789001-4587-21-git-send-email-santoscadenas@gmail.com>
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 1233 bytes --]
From: José Antonio Santos-Cadenas <santoscadenas@gmail.com>
---
mcap/mcap.c | 9 +++++++--
1 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/mcap/mcap.c b/mcap/mcap.c
index 51f0d87..64e76b5 100644
--- a/mcap/mcap.c
+++ b/mcap/mcap.c
@@ -1132,7 +1132,7 @@ static void process_md_delete_mdl_req(struct mcap_mcl *mcl, uint8_t *cmd,
notify = TRUE;
if (mdl->state == MDL_DELETING) {
/* Remote deviced requests deleting an MDL that upper profile
- * tries to delete, MDL will be freed when reply arrives. */
+ * is trying to delete, MDL will be freed when reply arrives. */
mdl->mcl->cb->mdl_deleted(mdl, mdl->mcl->cb->user_data);
} else
mcap_delete_mdl(mdl, ¬ify);
@@ -1410,9 +1410,14 @@ static gboolean process_md_delete_mdl_rsp(struct mcap_mcl *mcl, uint8_t *cmd,
(rsp->rc == MCAP_INVALID_MDL)) {
/* Mdl does not exist in remote side */
goto del_mdl;
- } else {
+ } else if (g_slist_find(mdl->mcl->mdls, mdl)){
/* this mdl couldn't be deleted */
restore_mdl(mdl, NULL);
+ } else {
+ /* MDL deleted request was sent by remote side while an
+ * outgoing request for delete it was pending */
+ shutdown_mdl(mdl);
+ g_free(mdl);
}
goto end;
}
--
1.6.3.3
^ permalink raw reply related
* [PATCH 39/60] Fix double memory free on simultaneus deletion of MDLs
From: Jose Antonio Santos Cadenas @ 2010-07-22 8:56 UTC (permalink / raw)
To: linux-bluetooth; +Cc: José Antonio Santos-Cadenas
In-Reply-To: <1279789001-4587-20-git-send-email-santoscadenas@gmail.com>
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 823 bytes --]
From: José Antonio Santos-Cadenas <santoscadenas@gmail.com>
---
mcap/mcap.c | 7 ++++++-
1 files changed, 6 insertions(+), 1 deletions(-)
diff --git a/mcap/mcap.c b/mcap/mcap.c
index d268bf6..51f0d87 100644
--- a/mcap/mcap.c
+++ b/mcap/mcap.c
@@ -1130,7 +1130,12 @@ static void process_md_delete_mdl_req(struct mcap_mcl *mcl, uint8_t *cmd,
mcl->mdls = g_slist_remove(mcl->mdls, mdl);
update_mcl_state(mcl);
notify = TRUE;
- mcap_delete_mdl(mdl, ¬ify);
+ if (mdl->state == MDL_DELETING) {
+ /* Remote deviced requests deleting an MDL that upper profile
+ * tries to delete, MDL will be freed when reply arrives. */
+ mdl->mcl->cb->mdl_deleted(mdl, mdl->mcl->cb->user_data);
+ } else
+ mcap_delete_mdl(mdl, ¬ify);
resp:
send4B_cmd(mcl, MCAP_MD_DELETE_MDL_RSP, MCAP_SUCCESS, mdlid);
}
--
1.6.3.3
^ permalink raw reply related
* [PATCH 38/60] Don't delete aborted MDLS
From: Jose Antonio Santos Cadenas @ 2010-07-22 8:56 UTC (permalink / raw)
To: linux-bluetooth; +Cc: José Antonio Santos-Cadenas
In-Reply-To: <1279789001-4587-19-git-send-email-santoscadenas@gmail.com>
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 1637 bytes --]
From: José Antonio Santos-Cadenas <santoscadenas@gmail.com>
When a request for abort MDL creation fails we shouldn't delete the
MDL because it may be used for future reconnections.
---
mcap/mcap.c | 14 ++++++--------
1 files changed, 6 insertions(+), 8 deletions(-)
diff --git a/mcap/mcap.c b/mcap/mcap.c
index 87aa233..d268bf6 100644
--- a/mcap/mcap.c
+++ b/mcap/mcap.c
@@ -1042,7 +1042,7 @@ static void process_md_abort_mdl_req(struct mcap_mcl *mcl, uint8_t *cmd,
{
mcap_md_req *req;
GSList *l;
- struct mcap_mdl *mdl, *del;
+ struct mcap_mdl *mdl, *abrt;
uint16_t mdl_id;
if (len != sizeof(mcap_md_req)) {
@@ -1057,7 +1057,7 @@ static void process_md_abort_mdl_req(struct mcap_mcl *mcl, uint8_t *cmd,
for (l = mcl->mdls; l; l = l->next) {
mdl = l->data;
if ((mdl_id == mdl->mdlid) && (mdl->state == MDL_WAITING)) {
- del = mdl;
+ abrt = mdl;
if (mcl->state != MCL_CONNECTED)
break;
continue;
@@ -1065,20 +1065,18 @@ static void process_md_abort_mdl_req(struct mcap_mcl *mcl, uint8_t *cmd,
if ((mdl->state == MDL_CONNECTED) && (mcl->state != MCL_ACTIVE))
mcl->state = MCL_ACTIVE;
- if ((del) && (mcl->state == MCL_ACTIVE))
+ if ((abrt) && (mcl->state == MCL_ACTIVE))
break;
}
- if (!del) {
+ if (!abrt) {
send4B_cmd(mcl, MCAP_MD_ABORT_MDL_RSP, MCAP_INVALID_MDL,
mdl_id);
return;
}
- mcl->cb->mdl_aborted(del, mcl->cb->user_data);
-
- mcl->mdls = g_slist_remove(mcl->mdls, del);
- g_free(del);
+ mcl->cb->mdl_aborted(abrt, mcl->cb->user_data);
+ abrt->state = MDL_CLOSED;
send4B_cmd(mcl, MCAP_MD_ABORT_MDL_RSP, MCAP_SUCCESS, mdl_id);
}
--
1.6.3.3
^ permalink raw reply related
* [PATCH 37/60] Remove MDL when delete operation fails with INVALID_MDL response code
From: Jose Antonio Santos Cadenas @ 2010-07-22 8:56 UTC (permalink / raw)
To: linux-bluetooth; +Cc: José Antonio Santos-Cadenas
In-Reply-To: <1279789001-4587-18-git-send-email-santoscadenas@gmail.com>
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 1673 bytes --]
From: José Antonio Santos-Cadenas <santoscadenas@gmail.com>
---
mcap/mcap.c | 23 ++++++++++++++++-------
1 files changed, 16 insertions(+), 7 deletions(-)
diff --git a/mcap/mcap.c b/mcap/mcap.c
index 63058d1..87aa233 100644
--- a/mcap/mcap.c
+++ b/mcap/mcap.c
@@ -1385,6 +1385,7 @@ static gboolean process_md_delete_mdl_rsp(struct mcap_mcl *mcl, uint8_t *cmd,
gpointer user_data = del->user_data;
mcap_md_req *cmdlast = (mcap_md_req *) mcl->lcmd;
uint16_t mdlid = ntohs(cmdlast->mdl);
+ mcap4B_rsp *rsp = (mcap4B_rsp *)cmd;
GError *gerr = NULL;
gboolean close = FALSE;
gboolean notify = FALSE;
@@ -1397,14 +1398,20 @@ static gboolean process_md_delete_mdl_rsp(struct mcap_mcl *mcl, uint8_t *cmd,
g_free(mcl->lcmd);
mcl->lcmd = NULL;
mcl->req = MCL_AVAILABLE;
+
if (gerr) {
- if (mdl)
- restore_mdl(mdl, NULL);
- else
+ if (!mdl) {
+ /* Deletion of all mdls failed */
g_slist_foreach(mcl->mdls, restore_mdl, NULL);
- deleted_cb(gerr, user_data);
- g_error_free(gerr);
- return close;
+ } else if ((len >= MIN_RSP_LEN) &&
+ (rsp->rc == MCAP_INVALID_MDL)) {
+ /* Mdl does not exist in remote side */
+ goto del_mdl;
+ } else {
+ /* this mdl couldn't be deleted */
+ restore_mdl(mdl, NULL);
+ }
+ goto end;
}
if (mdlid == MCAP_ALL_MDLIDS) {
@@ -1414,12 +1421,14 @@ static gboolean process_md_delete_mdl_rsp(struct mcap_mcl *mcl, uint8_t *cmd,
mcl->state = MCL_CONNECTED;
goto end;
}
-
+del_mdl:
mcl->mdls = g_slist_remove(mcl->mdls, mdl);
update_mcl_state(mcl);
mcap_delete_mdl(mdl, ¬ify);
end:
deleted_cb(gerr, user_data);
+ if (gerr)
+ g_error_free(gerr);
return close;
}
--
1.6.3.3
^ permalink raw reply related
* [PATCH 36/60] Set MDL to closed when abort operation takes place
From: Jose Antonio Santos Cadenas @ 2010-07-22 8:56 UTC (permalink / raw)
To: linux-bluetooth; +Cc: José Antonio Santos-Cadenas
In-Reply-To: <1279789001-4587-17-git-send-email-santoscadenas@gmail.com>
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 533 bytes --]
From: José Antonio Santos-Cadenas <santoscadenas@gmail.com>
---
mcap/mcap.c | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/mcap/mcap.c b/mcap/mcap.c
index f408cbf..63058d1 100644
--- a/mcap/mcap.c
+++ b/mcap/mcap.c
@@ -1349,6 +1349,7 @@ static gboolean process_md_abort_mdl_rsp(struct mcap_mcl *mcl,
mcl->req = MCL_AVAILABLE;
abrt_cb(gerr, user_data);
+ shutdown_mdl(mdl);
if ((len >= MIN_RSP_LEN) && (rsp->rc == MCAP_INVALID_MDL)) {
mcl->mdls = g_slist_remove(mcl->mdls, mdl);
--
1.6.3.3
^ permalink raw reply related
* [PATCH 35/60] Remove magic number to check commands of 5 Bytes
From: Jose Antonio Santos Cadenas @ 2010-07-22 8:56 UTC (permalink / raw)
To: linux-bluetooth; +Cc: José Antonio Santos-Cadenas
In-Reply-To: <1279789001-4587-16-git-send-email-santoscadenas@gmail.com>
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 520 bytes --]
From: José Antonio Santos-Cadenas <santoscadenas@gmail.com>
---
mcap/mcap.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/mcap/mcap.c b/mcap/mcap.c
index d3c92dc..f408cbf 100644
--- a/mcap/mcap.c
+++ b/mcap/mcap.c
@@ -1262,7 +1262,7 @@ static gboolean process_md_create_mdl_rsp(struct mcap_mcl *mcl,
if (gerr)
goto fail;
- if (len < 5) {
+ if (len < sizeof(mcap5B_rsp)) {
g_set_error(&gerr, MCAP_ERROR, MCAP_ERROR_FAILED,
"Protocol error");
close = TRUE;
--
1.6.3.3
^ permalink raw reply related
* [PATCH 34/60] Add macro to get minimum command length for respones
From: Jose Antonio Santos Cadenas @ 2010-07-22 8:56 UTC (permalink / raw)
To: linux-bluetooth; +Cc: José Antonio Santos-Cadenas
In-Reply-To: <1279789001-4587-15-git-send-email-santoscadenas@gmail.com>
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 1209 bytes --]
From: José Antonio Santos-Cadenas <santoscadenas@gmail.com>
Minimum length responses are provided using a new macro to avoid using
magic numbers in source code.
---
mcap/mcap.c | 5 +++--
1 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/mcap/mcap.c b/mcap/mcap.c
index 6031bd4..d3c92dc 100644
--- a/mcap/mcap.c
+++ b/mcap/mcap.c
@@ -35,6 +35,7 @@
#define RESPONSE_TIMER 2 /* seconds */
#define MAX_CACHED 10 /* 10 devices */
+#define MIN_RSP_LEN 4 /* 4 Bytes */
#define MCAP_ERROR g_quark_from_static_string("mcap-error-quark")
@@ -1191,7 +1192,7 @@ static gboolean check_err_rsp(struct mcap_mcl *mcl, uint8_t *cmd,
char *msg;
/* Check if the response matches with the last request */
- if ((rlen < 4) || ((mcl->lcmd[0] + 1) != cmd[0])) {
+ if ((rlen < MIN_RSP_LEN) || ((mcl->lcmd[0] + 1) != cmd[0])) {
msg = "Protocol error";
close = TRUE;
goto fail;
@@ -1349,7 +1350,7 @@ static gboolean process_md_abort_mdl_rsp(struct mcap_mcl *mcl,
abrt_cb(gerr, user_data);
- if ((len >= 4) && (rsp->rc == MCAP_INVALID_MDL)) {
+ if ((len >= MIN_RSP_LEN) && (rsp->rc == MCAP_INVALID_MDL)) {
mcl->mdls = g_slist_remove(mcl->mdls, mdl);
g_free(mdl);
}
--
1.6.3.3
^ permalink raw reply related
* [PATCH 33/60] Change error messagge
From: Jose Antonio Santos Cadenas @ 2010-07-22 8:56 UTC (permalink / raw)
To: linux-bluetooth; +Cc: José Antonio Santos-Cadenas
In-Reply-To: <1279789001-4587-14-git-send-email-santoscadenas@gmail.com>
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 601 bytes --]
From: José Antonio Santos-Cadenas <santoscadenas@gmail.com>
---
mcap/mcap.c | 3 +--
1 files changed, 1 insertions(+), 2 deletions(-)
diff --git a/mcap/mcap.c b/mcap/mcap.c
index 73abb90..6031bd4 100644
--- a/mcap/mcap.c
+++ b/mcap/mcap.c
@@ -1207,8 +1207,7 @@ static gboolean check_err_rsp(struct mcap_mcl *mcl, uint8_t *cmd,
smdl = ntohs(cmdlast->mdl);
rmdl = ntohs(rsp->mdl);
if (rmdl != smdl) {
- msg = "MDLID %d received doesn't match with MDLID %d sent",
- rmdl, smdl;
+ msg = "MDLID received doesn't match with MDLID sent";
close = TRUE;
goto fail;
}
--
1.6.3.3
^ permalink raw reply related
* [PATCH 32/60] Fix MCL transitions when responses are not success
From: Jose Antonio Santos Cadenas @ 2010-07-22 8:56 UTC (permalink / raw)
To: linux-bluetooth; +Cc: José Antonio Santos-Cadenas
In-Reply-To: <1279789001-4587-13-git-send-email-santoscadenas@gmail.com>
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 1571 bytes --]
From: José Antonio Santos-Cadenas <santoscadenas@gmail.com>
---
mcap/mcap.c | 18 ++++++++++--------
1 files changed, 10 insertions(+), 8 deletions(-)
diff --git a/mcap/mcap.c b/mcap/mcap.c
index d20b3d5..73abb90 100644
--- a/mcap/mcap.c
+++ b/mcap/mcap.c
@@ -1315,6 +1315,7 @@ static gboolean process_md_reconnect_mdl_rsp(struct mcap_mcl *mcl,
g_error_free(gerr);
shutdown_mdl(mdl);
+ update_mcl_state(mcl);
if (rsp->rc != MCAP_INVALID_MDL)
return close;
@@ -1323,7 +1324,6 @@ static gboolean process_md_reconnect_mdl_rsp(struct mcap_mcl *mcl,
mcl->mdls = g_slist_remove(mcl->mdls, mdl);
mcl->cb->mdl_deleted(mdl, mcl->cb->user_data);
g_free(mdl);
- update_mcl_state(mcl);
return close;
}
@@ -1335,6 +1335,7 @@ static gboolean process_md_abort_mdl_rsp(struct mcap_mcl *mcl,
mcap_mdl_del_cb abrt_cb = abrt->cb.del;
gpointer user_data = abrt->user_data;
struct mcap_mdl *mdl = abrt->mdl;
+ mcap4B_rsp *rsp = (mcap4B_rsp *)cmd;
GError *gerr = NULL;
gboolean close = FALSE;
@@ -1347,16 +1348,17 @@ static gboolean process_md_abort_mdl_rsp(struct mcap_mcl *mcl,
mcl->lcmd = NULL;
mcl->req = MCL_AVAILABLE;
- if (gerr) {
- abrt_cb(gerr, user_data);
- g_error_free(gerr);
- return close;
+ abrt_cb(gerr, user_data);
+
+ if ((len >= 4) && (rsp->rc == MCAP_INVALID_MDL)) {
+ mcl->mdls = g_slist_remove(mcl->mdls, mdl);
+ g_free(mdl);
}
- mcl->mdls = g_slist_remove(mcl->mdls, mdl);
- g_free(mdl);
+ if (!gerr)
+ g_error_free(gerr);
+
update_mcl_state(mcl);
- abrt_cb(gerr, user_data);
return close;
}
--
1.6.3.3
^ permalink raw reply related
* [PATCH 31/60] Fix MCAP bug processing responses
From: Jose Antonio Santos Cadenas @ 2010-07-22 8:56 UTC (permalink / raw)
To: linux-bluetooth; +Cc: José Antonio Santos-Cadenas
In-Reply-To: <1279789001-4587-12-git-send-email-santoscadenas@gmail.com>
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 7367 bytes --]
From: José Antonio Santos-Cadenas <santoscadenas@gmail.com>
---
mcap/mcap.c | 138 +++++++++++++++++++++-------------------------------------
1 files changed, 50 insertions(+), 88 deletions(-)
diff --git a/mcap/mcap.c b/mcap/mcap.c
index 34fd43b..d20b3d5 100644
--- a/mcap/mcap.c
+++ b/mcap/mcap.c
@@ -1180,31 +1180,59 @@ static void proc_req_active(struct mcap_mcl *mcl, uint8_t *cmd, uint32_t len)
}
/* Function used to process replies */
-static gboolean check_err_rsp(uint16_t rmdl, uint16_t smdl, uint8_t rc,
+static gboolean check_err_rsp(struct mcap_mcl *mcl, uint8_t *cmd,
uint32_t rlen, uint32_t len, GError **gerr)
{
+ mcap_md_req *cmdlast = (mcap_md_req *) mcl->lcmd;
+ gint err = MCAP_ERROR_FAILED;
gboolean close = FALSE;
+ uint16_t rmdl, smdl;
+ mcap4B_rsp *rsp;
char *msg;
- gint err = MCAP_ERROR_FAILED;
+ /* Check if the response matches with the last request */
+ if ((rlen < 4) || ((mcl->lcmd[0] + 1) != cmd[0])) {
+ msg = "Protocol error";
+ close = TRUE;
+ goto fail;
+ }
+
+ if (rlen < len) {
+ msg = "Protocol error";
+ close = TRUE;
+ goto fail;
+ }
+
+ rsp = (mcap4B_rsp *)cmd;
+ smdl = ntohs(cmdlast->mdl);
+ rmdl = ntohs(rsp->mdl);
if (rmdl != smdl) {
- msg = "MDLID received doesn't match with MDLID sent";
+ msg = "MDLID %d received doesn't match with MDLID %d sent",
+ rmdl, smdl;
close = TRUE;
goto fail;
}
- if ((rc != MCAP_SUCCESS) && (rc <= MCAP_CONFIGURATION_REJECTED)) {
- msg = error2str(rc);
- err = rc;
+ if (rsp->rc == MCAP_REQUEST_NOT_SUPPORTED) {
+ msg = "Remote does not support opcodes";
+ mcl->ctrl &= ~MCAP_CTRL_STD_OP;
goto fail;
}
- if (rlen < len) {
- msg = "Protocol error";
+ if (rsp->rc == MCAP_UNSPECIFIED_ERROR) {
+ msg = "Unspecified error";
close = TRUE;
goto fail;
}
+
+ if (rsp->rc != MCAP_SUCCESS) {
+ msg = error2str(rsp->rc);
+ err = rsp->rc;
+ goto fail;
+ }
+
return FALSE;
+
fail:
g_set_error(gerr, MCAP_ERROR, err, "%s", msg);
return close;
@@ -1213,27 +1241,23 @@ fail:
static gboolean process_md_create_mdl_rsp(struct mcap_mcl *mcl,
uint8_t *cmd, uint32_t len)
{
+ mcap_md_create_mdl_req *cmdlast = (mcap_md_create_mdl_req *)mcl->lcmd;
struct mcap_mdl_op_cb *conn = mcl->priv_data;
- struct mcap_mdl *mdl = conn->mdl;
mcap_mdl_operation_conf_cb connect_cb = conn->cb.op_conf;
gpointer user_data = conn->user_data;
- uint16_t mdlid;
- mcap5B_rsp *rsp = (mcap5B_rsp *) cmd;
- mcap_md_create_mdl_req *cmdlast;
- GError *gerr = NULL;
+ struct mcap_mdl *mdl = conn->mdl;
+ uint8_t conf = cmdlast->conf;
gboolean close = FALSE;
+ GError *gerr = NULL;
+ mcap5B_rsp *rsp;
g_free(mcl->priv_data);
mcl->priv_data = NULL;
- cmdlast = (mcap_md_create_mdl_req *) mcl->lcmd;
- mdlid = ntohs(cmdlast->mdl);
- rsp->mdl = ntohs(rsp->mdl);
-
+ close = check_err_rsp(mcl, cmd, len, sizeof(mcap4B_rsp), &gerr);
g_free(mcl->lcmd);
mcl->lcmd = NULL;
mcl->req = MCL_AVAILABLE;
- close = check_err_rsp(rsp->mdl, mdlid, rsp->rc, 0, 0, &gerr);
if (gerr)
goto fail;
@@ -1245,8 +1269,9 @@ static gboolean process_md_create_mdl_rsp(struct mcap_mcl *mcl,
goto fail;
}
+ rsp = (mcap5B_rsp *)cmd;
/* Check if preferences changed */
- if ((cmdlast->conf != 0x00) && (rsp->param != cmdlast->conf)) {
+ if ((conf != 0x00) && (rsp->param != conf)) {
g_set_error(&gerr, MCAP_ERROR, MCAP_ERROR_FAILED,
"Configuration changed");
close = TRUE;
@@ -1268,22 +1293,17 @@ static gboolean process_md_reconnect_mdl_rsp(struct mcap_mcl *mcl,
uint8_t *cmd, uint32_t len)
{
struct mcap_mdl_op_cb *reconn = mcl->priv_data;
- struct mcap_mdl *mdl = reconn->mdl;
mcap_mdl_operation_cb reconn_cb = reconn->cb.op;
gpointer user_data = reconn->user_data;
- mcap4B_rsp *rsp = (mcap4B_rsp *) cmd;
- mcap_md_req *cmdlast = (mcap_md_req *) mcl->lcmd;
- uint16_t mdlid = ntohs(cmdlast->mdl);
+ struct mcap_mdl *mdl = reconn->mdl;
+ mcap4B_rsp *rsp = (mcap4B_rsp *)cmd;
GError *gerr = NULL;
gboolean close = FALSE;
g_free(mcl->priv_data);
mcl->priv_data = NULL;
- rsp->mdl = ntohs(rsp->mdl);
-
- close = check_err_rsp(rsp->mdl, mdlid, rsp->rc, len,
- sizeof(mcap4B_rsp), &gerr);
+ close = check_err_rsp(mcl, cmd, len, sizeof(mcap4B_rsp), &gerr);
g_free(mcl->lcmd);
mcl->lcmd = NULL;
@@ -1312,22 +1332,17 @@ static gboolean process_md_abort_mdl_rsp(struct mcap_mcl *mcl,
uint8_t *cmd, uint32_t len)
{
struct mcap_mdl_op_cb *abrt = mcl->priv_data;
- struct mcap_mdl *mdl = abrt->mdl;
mcap_mdl_del_cb abrt_cb = abrt->cb.del;
gpointer user_data = abrt->user_data;
- mcap4B_rsp *rsp = (mcap4B_rsp *) cmd;
- mcap_md_req *cmdlast = (mcap_md_req *) mcl->lcmd;
- uint16_t mdlid = ntohs(cmdlast->mdl);
+ struct mcap_mdl *mdl = abrt->mdl;
GError *gerr = NULL;
gboolean close = FALSE;
g_free(mcl->priv_data);
mcl->priv_data = NULL;
- rsp->mdl = ntohs(rsp->mdl);
+ close = check_err_rsp(mcl, cmd, len, sizeof(mcap4B_rsp), &gerr);
- close = check_err_rsp(rsp->mdl, mdlid, rsp->rc, len,
- sizeof(mcap4B_rsp), &gerr);
g_free(mcl->lcmd);
mcl->lcmd = NULL;
mcl->req = MCL_AVAILABLE;
@@ -1365,7 +1380,6 @@ static gboolean process_md_delete_mdl_rsp(struct mcap_mcl *mcl, uint8_t *cmd,
struct mcap_mdl *mdl = del->mdl;
mcap_mdl_del_cb deleted_cb = del->cb.del;
gpointer user_data = del->user_data;
- mcap4B_rsp *rsp = (mcap4B_rsp *) cmd;
mcap_md_req *cmdlast = (mcap_md_req *) mcl->lcmd;
uint16_t mdlid = ntohs(cmdlast->mdl);
GError *gerr = NULL;
@@ -1375,10 +1389,7 @@ static gboolean process_md_delete_mdl_rsp(struct mcap_mcl *mcl, uint8_t *cmd,
g_free(mcl->priv_data);
mcl->priv_data = NULL;
- rsp->mdl = ntohs(rsp->mdl);
-
- close = check_err_rsp(rsp->mdl, mdlid, rsp->rc, len,
- sizeof(mcap4B_rsp), &gerr);
+ close = check_err_rsp(mcl, cmd, len, sizeof(mcap4B_rsp), &gerr);
g_free(mcl->lcmd);
mcl->lcmd = NULL;
@@ -1409,60 +1420,11 @@ end:
return close;
}
-static gboolean check_rsp(struct mcap_mcl *mcl, uint8_t *cmd, uint32_t len)
-{
- mcap4B_rsp *rsp;
- GError *gerr = NULL;
-
- rsp = (mcap4B_rsp *)cmd;
- /* 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;
-
- if (rsp->rc == MCAP_REQUEST_NOT_SUPPORTED) {
- DBG("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)
{
gboolean close;
RELEASE_TIMER(mcl);
- if (!check_rsp(mcl, cmd, len))
- return;
-
switch (cmd[0]) {
case MCAP_ERROR_RSP:
error("MCAP_ERROR_RSP received");
--
1.6.3.3
^ permalink raw reply related
* [PATCH 30/60] Fix missed state transition in MCAP on reconnections
From: Jose Antonio Santos Cadenas @ 2010-07-22 8:56 UTC (permalink / raw)
To: linux-bluetooth; +Cc: José Antonio Santos-Cadenas
In-Reply-To: <1279789001-4587-11-git-send-email-santoscadenas@gmail.com>
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 581 bytes --]
From: José Antonio Santos-Cadenas <santoscadenas@gmail.com>
MCL should transite to properly state when a reconnect_mdl_req is
not SUCCESS.
---
mcap/mcap.c | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/mcap/mcap.c b/mcap/mcap.c
index 1dfe083..34fd43b 100644
--- a/mcap/mcap.c
+++ b/mcap/mcap.c
@@ -1303,6 +1303,7 @@ static gboolean process_md_reconnect_mdl_rsp(struct mcap_mcl *mcl,
mcl->mdls = g_slist_remove(mcl->mdls, mdl);
mcl->cb->mdl_deleted(mdl, mcl->cb->user_data);
g_free(mdl);
+ update_mcl_state(mcl);
return close;
}
--
1.6.3.3
^ permalink raw reply related
* [PATCH 29/60] Fix missed state transition in MCAP
From: Jose Antonio Santos Cadenas @ 2010-07-22 8:56 UTC (permalink / raw)
To: linux-bluetooth; +Cc: José Antonio Santos-Cadenas
In-Reply-To: <1279789001-4587-10-git-send-email-santoscadenas@gmail.com>
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 489 bytes --]
From: José Antonio Santos-Cadenas <santoscadenas@gmail.com>
MCL should transite to properly state when a create_mdl_req is
not SUCCESS
---
mcap/mcap.c | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/mcap/mcap.c b/mcap/mcap.c
index cf92368..1dfe083 100644
--- a/mcap/mcap.c
+++ b/mcap/mcap.c
@@ -1260,6 +1260,7 @@ fail:
mcl->mdls = g_slist_remove(mcl->mdls, mdl);
g_free(mdl);
g_error_free(gerr);
+ update_mcl_state(mcl);
return close;
}
--
1.6.3.3
^ permalink raw reply related
* [PATCH 28/60] Solve a non initialized memory segmentation fault
From: Jose Antonio Santos Cadenas @ 2010-07-22 8:56 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Jose Antonio Santos Cadenas
In-Reply-To: <1279789001-4587-9-git-send-email-santoscadenas@gmail.com>
---
mcap/mcap.c | 3 +--
1 files changed, 1 insertions(+), 2 deletions(-)
diff --git a/mcap/mcap.c b/mcap/mcap.c
index 7098a8d..cf92368 100644
--- a/mcap/mcap.c
+++ b/mcap/mcap.c
@@ -1412,6 +1412,7 @@ static gboolean check_rsp(struct mcap_mcl *mcl, uint8_t *cmd, uint32_t len)
mcap4B_rsp *rsp;
GError *gerr = NULL;
+ rsp = (mcap4B_rsp *)cmd;
/* Check if the response matches with the last request */
if ((cmd[0] != MCAP_ERROR_RSP) && ((mcl->lcmd[0] + 1) != cmd[0]))
goto close_mcl;
@@ -1419,8 +1420,6 @@ static gboolean check_rsp(struct mcap_mcl *mcl, uint8_t *cmd, uint32_t len)
if (len < 4)
goto close_mcl;
- rsp = (mcap4B_rsp *)cmd;
-
if (rsp->rc == MCAP_REQUEST_NOT_SUPPORTED) {
DBG("Remote does not support opcodes");
g_set_error(&gerr, MCAP_ERROR, MCAP_ERROR_REQUEST_NOT_SUPPORTED,
--
1.6.3.3
^ permalink raw reply related
* [PATCH 27/60] Fix wrong response code rejecting reconnections
From: Jose Antonio Santos Cadenas @ 2010-07-22 8:56 UTC (permalink / raw)
To: linux-bluetooth; +Cc: José Antonio Santos-Cadenas
In-Reply-To: <1279789001-4587-8-git-send-email-santoscadenas@gmail.com>
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 533 bytes --]
From: José Antonio Santos-Cadenas <santoscadenas@gmail.com>
---
mcap/mcap.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/mcap/mcap.c b/mcap/mcap.c
index 43b215b..7098a8d 100644
--- a/mcap/mcap.c
+++ b/mcap/mcap.c
@@ -1024,7 +1024,7 @@ static void process_md_reconnect_mdl_req(struct mcap_mcl *mcl, uint8_t *cmd,
return;
if (rsp != MCAP_SUCCESS) {
- send4B_cmd(mcl, MCAP_MD_CREATE_MDL_RSP, rsp, mdl_id);
+ send4B_cmd(mcl, MCAP_MD_RECONNECT_MDL_RSP, rsp, mdl_id);
return;
}
--
1.6.3.3
^ permalink raw reply related
* [PATCH 26/60] Free memory when a unref operation happens over a cached MCL
From: Jose Antonio Santos Cadenas @ 2010-07-22 8:56 UTC (permalink / raw)
To: linux-bluetooth; +Cc: José Antonio Santos-Cadenas
In-Reply-To: <1279789001-4587-7-git-send-email-santoscadenas@gmail.com>
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 939 bytes --]
From: José Antonio Santos-Cadenas <santoscadenas@gmail.com>
MCAP should free memory in cached MCL list if an unref operation
happens over a cached MCL and only MCAP has a local copy of it.
MCL is removed from cached list and memory resources are freed.
---
mcap/mcap.c | 9 +++++++++
1 files changed, 9 insertions(+), 0 deletions(-)
diff --git a/mcap/mcap.c b/mcap/mcap.c
index a32511e..43b215b 100644
--- a/mcap/mcap.c
+++ b/mcap/mcap.c
@@ -779,6 +779,15 @@ void mcap_mcl_unref(struct mcap_mcl *mcl)
DBG("mcap_mcl_unref(%p): ref=%d", mcl, mcl->ref);
+ if ((mcl->ctrl & MCAP_CTRL_CACHED) && (mcl->ref < 2)) {
+ /* Free space in cache memory due any other profile has a local
+ * copy of current MCL stored in cache */
+ DBG("Remove from cache (%p): ref=%d", mcl, mcl->ref);
+ mcl->ms->cached = g_slist_remove(mcl->ms->cached, mcl);
+ mcap_mcl_release(mcl);
+ return;
+ }
+
if (mcl->ref > 0)
return;
--
1.6.3.3
^ permalink raw reply related
* [PATCH 25/60] Initial support for clock synchronization protocol
From: Jose Antonio Santos Cadenas @ 2010-07-22 8:56 UTC (permalink / raw)
To: linux-bluetooth; +Cc: José Antonio Santos-Cadenas
In-Reply-To: <1279789001-4587-6-git-send-email-santoscadenas@gmail.com>
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 3727 bytes --]
From: José Antonio Santos-Cadenas <santoscadenas@gmail.com>
---
Makefile.am | 4 +-
mcap/mcap.c | 3 +-
mcap/mcap_sync.c | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 88 insertions(+), 4 deletions(-)
create mode 100644 mcap/mcap_sync.c
diff --git a/Makefile.am b/Makefile.am
index d1e6b0e..87c79a5 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -170,8 +170,8 @@ builtin_sources += plugins/service.c
endif
if MCAP
-mcap_sources += mcap/mcap_internal.h \
- mcap/mcap_lib.h \
+mcap_sources += mcap/mcap_internal.h \
+ mcap/mcap_lib.h mcap/mcap_sync.c \
mcap/mcap.h mcap/mcap.c
endif
diff --git a/mcap/mcap.c b/mcap/mcap.c
index b70545a..a32511e 100644
--- a/mcap/mcap.c
+++ b/mcap/mcap.c
@@ -1510,8 +1510,7 @@ static void proc_cmd(struct mcap_mcl *mcl, uint8_t *cmd, uint32_t len)
{
if ((cmd[0] >= MCAP_MD_SYNC_CAP_REQ) &&
(cmd[0] <= MCAP_MD_SYNC_INFO_IND)) {
- send4B_cmd(mcl, cmd[0], MCAP_REQUEST_NOT_SUPPORTED,
- MCAP_MDLID_RESERVED);
+ proc_sync_cmd(mcl, cmd, len);
return;
}
diff --git a/mcap/mcap_sync.c b/mcap/mcap_sync.c
new file mode 100644
index 0000000..76f1377
--- /dev/null
+++ b/mcap/mcap_sync.c
@@ -0,0 +1,85 @@
+/*
+ *
+ * MCAP for BlueZ - Bluetooth protocol stack for Linux
+ *
+ * Copyright (C) 2010 GSyC/LibreSoft, Universidad Rey Juan Carlos.
+ *
+ * Authors:
+ * Santiago Carot-Nemesio <sancane at gmail.com>
+ * Jose Antonio Santos-Cadenas <santoscadenas at gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#include <stdint.h>
+#include <netinet/in.h>
+
+#include "log.h"
+
+#include "mcap.h"
+#include "mcap_lib.h"
+#include "mcap_internal.h"
+
+static int send_unsupported_req(struct mcap_mcl *mcl, uint8_t oc)
+{
+ uint8_t *rsp;
+ mcap4B_rsp *rsp_err;
+ int sent;
+
+
+ rsp = g_malloc0(sizeof(mcap4B_rsp));
+
+ rsp_err = (mcap4B_rsp *)rsp;
+ rsp_err->op = oc;
+ rsp_err->rc = MCAP_REQUEST_NOT_SUPPORTED;
+ rsp_err->mdl = htons (MCAP_MDLID_RESERVED);
+
+ sent = mcap_send_data(g_io_channel_unix_get_fd(mcl->cc),
+ rsp,
+ sizeof(mcap4B_rsp));
+ g_free(rsp);
+ return sent;
+}
+
+void proc_sync_cmd(struct mcap_mcl *mcl, uint8_t *cmd, uint32_t len)
+{
+ switch (cmd[0]) {
+ case MCAP_MD_SYNC_CAP_REQ:
+ DBG("TODO: received MCAP_MD_SYNC_CAP_REQ: %d",
+ MCAP_MD_SYNC_CAP_REQ);
+ /* Not implemented yet. Reply with unsupported request */
+ send_unsupported_req(mcl, cmd[0]);
+ break;
+ case MCAP_MD_SYNC_CAP_RSP:
+ DBG("TODO: received MCAP_MD_SYNC_CAP_RSP: %d",
+ MCAP_MD_SYNC_CAP_RSP);
+ break;
+ case MCAP_MD_SYNC_SET_REQ:
+ DBG("TODO: received MCAP_MD_SYNC_SET_REQ: %d",
+ MCAP_MD_SYNC_SET_REQ);
+ /* Not implemented yet. Reply with unsupported request */
+ send_unsupported_req(mcl, cmd[0]);
+ break;
+ case MCAP_MD_SYNC_SET_RSP:
+ DBG("TODO: received MCAP_MD_SYNC_SET_RSP: %d",
+ MCAP_MD_SYNC_SET_RSP);
+ break;
+ case MCAP_MD_SYNC_INFO_IND:
+ DBG("TODO: received MCAP_MD_SYNC_INFO_IND :%d",
+ MCAP_MD_SYNC_INFO_IND);
+ break;
+ }
+}
--
1.6.3.3
^ permalink raw reply related
* [PATCH 24/60] Enable connection of Data Channel with remote MCAP instances
From: Jose Antonio Santos Cadenas @ 2010-07-22 8:56 UTC (permalink / raw)
To: linux-bluetooth; +Cc: José Antonio Santos-Cadenas
In-Reply-To: <1279789001-4587-5-git-send-email-santoscadenas@gmail.com>
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 2117 bytes --]
From: José Antonio Santos-Cadenas <santoscadenas@gmail.com>
---
mcap/mcap.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 60 insertions(+), 0 deletions(-)
diff --git a/mcap/mcap.c b/mcap/mcap.c
index 61d6621..b70545a 100644
--- a/mcap/mcap.c
+++ b/mcap/mcap.c
@@ -1558,6 +1558,66 @@ static gboolean mdl_event_cb(GIOChannel *chan, GIOCondition cond, gpointer data)
return FALSE;
}
+static void mcap_connect_mdl_cb(GIOChannel *chan, GError *conn_err,
+ gpointer data)
+{
+ struct mcap_mdl_op_cb *con = data;
+ struct mcap_mdl *mdl = con->mdl;
+ mcap_mdl_operation_cb cb = con->cb.op;
+ gpointer user_data = con->user_data;
+
+ g_free(con);
+ DBG("mdl connect callback");
+
+ if (conn_err) {
+ DBG("ERROR: mdl connect callback");
+ mdl->state = MDL_CLOSED;
+ g_io_channel_unref(mdl->dc);
+ mdl->dc = NULL;
+ cb(mdl, conn_err, user_data);
+ return;
+ }
+
+ mdl->state = MDL_CONNECTED;
+ mdl->wid = g_io_add_watch(mdl->dc, G_IO_ERR | G_IO_HUP | G_IO_NVAL,
+ (GIOFunc) mdl_event_cb, mdl);
+
+ cb(mdl, conn_err, user_data);
+}
+
+void mcap_mdl_connect(struct mcap_mdl *mdl, BtIOType BtType, uint16_t dcpsm,
+ GError **err, mcap_mdl_operation_cb connect_cb, gpointer user_data)
+{
+ struct mcap_mdl_op_cb *con;
+
+ if (mdl->state != MDL_WAITING) {
+ g_set_error(err, MCAP_ERROR, MCAP_ERROR_INVALID_MDL,
+ "%s", error2str(MCAP_INVALID_MDL));
+ return;
+ }
+
+ con = g_new0(struct mcap_mdl_op_cb, 1);
+ con->mdl = mdl;
+ con->cb.op = connect_cb;
+ con->user_data = user_data;
+
+ /* TODO: Check if BtIOType is ERTM or Streaming before continue */
+
+ mdl->dc = bt_io_connect(BtType, mcap_connect_mdl_cb, con,
+ NULL, err,
+ BT_IO_OPT_SOURCE_BDADDR, &mdl->mcl->ms->src,
+ BT_IO_OPT_DEST_BDADDR, &mdl->mcl->addr,
+ BT_IO_OPT_PSM, dcpsm,
+ BT_IO_OPT_MTU, MCAP_DC_MTU,
+ BT_IO_OPT_SEC_LEVEL, mdl->mcl->ms->sec,
+ BT_IO_OPT_INVALID);
+ if (*err) {
+ DBG("MDL Connection error");
+ mdl->state = MDL_CLOSED;
+ g_free(con);
+ }
+}
+
static gboolean mcl_control_cb(GIOChannel *chan, GIOCondition cond,
gpointer data)
{
--
1.6.3.3
^ permalink raw reply related
* [PATCH 23/60] Process md_delete_mdl_rsp
From: Jose Antonio Santos Cadenas @ 2010-07-22 8:56 UTC (permalink / raw)
To: linux-bluetooth; +Cc: José Antonio Santos-Cadenas
In-Reply-To: <1279789001-4587-4-git-send-email-santoscadenas@gmail.com>
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 2101 bytes --]
From: José Antonio Santos-Cadenas <santoscadenas@gmail.com>
---
mcap/mcap.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 59 insertions(+), 1 deletions(-)
diff --git a/mcap/mcap.c b/mcap/mcap.c
index e0f3fec..61d6621 100644
--- a/mcap/mcap.c
+++ b/mcap/mcap.c
@@ -1334,10 +1334,68 @@ static gboolean process_md_abort_mdl_rsp(struct mcap_mcl *mcl,
return close;
}
+static void restore_mdl(gpointer elem, gpointer data)
+{
+ struct mcap_mdl *mdl = elem;
+
+ if (mdl->state == MDL_DELETING) {
+ if (mdl->dc)
+ mdl->state = MDL_CONNECTED;
+ else
+ mdl->state = MDL_CLOSED;
+ } else if (mdl->state == MDL_CLOSED)
+ mdl->mcl->cb->mdl_closed(mdl, mdl->mcl->cb->user_data);
+}
+
static gboolean process_md_delete_mdl_rsp(struct mcap_mcl *mcl, uint8_t *cmd,
uint32_t len)
{
- return FALSE;
+ struct mcap_mdl_op_cb *del = mcl->priv_data;
+ struct mcap_mdl *mdl = del->mdl;
+ mcap_mdl_del_cb deleted_cb = del->cb.del;
+ gpointer user_data = del->user_data;
+ mcap4B_rsp *rsp = (mcap4B_rsp *) cmd;
+ mcap_md_req *cmdlast = (mcap_md_req *) mcl->lcmd;
+ uint16_t mdlid = ntohs(cmdlast->mdl);
+ GError *gerr = NULL;
+ gboolean close = FALSE;
+ gboolean notify = FALSE;
+
+ g_free(mcl->priv_data);
+ mcl->priv_data = NULL;
+
+ rsp->mdl = ntohs(rsp->mdl);
+
+ close = check_err_rsp(rsp->mdl, mdlid, rsp->rc, len,
+ sizeof(mcap4B_rsp), &gerr);
+
+ g_free(mcl->lcmd);
+ mcl->lcmd = NULL;
+ mcl->req = MCL_AVAILABLE;
+ if (gerr) {
+ if (mdl)
+ restore_mdl(mdl, NULL);
+ else
+ g_slist_foreach(mcl->mdls, restore_mdl, NULL);
+ deleted_cb(gerr, user_data);
+ g_error_free(gerr);
+ return close;
+ }
+
+ if (mdlid == MCAP_ALL_MDLIDS) {
+ g_slist_foreach(mcl->mdls, mcap_delete_mdl, ¬ify);
+ g_slist_free(mcl->mdls);
+ mcl->mdls = NULL;
+ mcl->state = MCL_CONNECTED;
+ goto end;
+ }
+
+ mcl->mdls = g_slist_remove(mcl->mdls, mdl);
+ update_mcl_state(mcl);
+ mcap_delete_mdl(mdl, ¬ify);
+end:
+ deleted_cb(gerr, user_data);
+ return close;
}
static gboolean check_rsp(struct mcap_mcl *mcl, uint8_t *cmd, uint32_t len)
--
1.6.3.3
^ permalink raw reply related
* [PATCH 22/60] Process md_abort_mdl_rsp
From: Jose Antonio Santos Cadenas @ 2010-07-22 8:56 UTC (permalink / raw)
To: linux-bluetooth; +Cc: José Antonio Santos-Cadenas
In-Reply-To: <1279789001-4587-3-git-send-email-santoscadenas@gmail.com>
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 1396 bytes --]
From: José Antonio Santos-Cadenas <santoscadenas@gmail.com>
---
mcap/mcap.c | 33 ++++++++++++++++++++++++++++++++-
1 files changed, 32 insertions(+), 1 deletions(-)
diff --git a/mcap/mcap.c b/mcap/mcap.c
index b1498ca..e0f3fec 100644
--- a/mcap/mcap.c
+++ b/mcap/mcap.c
@@ -1300,7 +1300,38 @@ static gboolean process_md_reconnect_mdl_rsp(struct mcap_mcl *mcl,
static gboolean process_md_abort_mdl_rsp(struct mcap_mcl *mcl,
uint8_t *cmd, uint32_t len)
{
- return FALSE;
+ struct mcap_mdl_op_cb *abrt = mcl->priv_data;
+ struct mcap_mdl *mdl = abrt->mdl;
+ mcap_mdl_del_cb abrt_cb = abrt->cb.del;
+ gpointer user_data = abrt->user_data;
+ mcap4B_rsp *rsp = (mcap4B_rsp *) cmd;
+ mcap_md_req *cmdlast = (mcap_md_req *) mcl->lcmd;
+ uint16_t mdlid = ntohs(cmdlast->mdl);
+ GError *gerr = NULL;
+ gboolean close = FALSE;
+
+ g_free(mcl->priv_data);
+ mcl->priv_data = NULL;
+
+ rsp->mdl = ntohs(rsp->mdl);
+
+ close = check_err_rsp(rsp->mdl, mdlid, rsp->rc, len,
+ sizeof(mcap4B_rsp), &gerr);
+ g_free(mcl->lcmd);
+ mcl->lcmd = NULL;
+ mcl->req = MCL_AVAILABLE;
+
+ if (gerr) {
+ abrt_cb(gerr, user_data);
+ g_error_free(gerr);
+ return close;
+ }
+
+ mcl->mdls = g_slist_remove(mcl->mdls, mdl);
+ g_free(mdl);
+ update_mcl_state(mcl);
+ abrt_cb(gerr, user_data);
+ return close;
}
static gboolean process_md_delete_mdl_rsp(struct mcap_mcl *mcl, uint8_t *cmd,
--
1.6.3.3
^ permalink raw reply related
* [PATCH 21/60] Process md_reconnect_mdl_rsp
From: Jose Antonio Santos Cadenas @ 2010-07-22 8:56 UTC (permalink / raw)
To: linux-bluetooth; +Cc: José Antonio Santos-Cadenas
In-Reply-To: <1279789001-4587-2-git-send-email-santoscadenas@gmail.com>
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 1450 bytes --]
From: José Antonio Santos-Cadenas <santoscadenas@gmail.com>
---
mcap/mcap.c | 39 ++++++++++++++++++++++++++++++++++++++-
1 files changed, 38 insertions(+), 1 deletions(-)
diff --git a/mcap/mcap.c b/mcap/mcap.c
index aa9f1a3..b1498ca 100644
--- a/mcap/mcap.c
+++ b/mcap/mcap.c
@@ -1257,7 +1257,44 @@ fail:
static gboolean process_md_reconnect_mdl_rsp(struct mcap_mcl *mcl,
uint8_t *cmd, uint32_t len)
{
- return FALSE;
+ struct mcap_mdl_op_cb *reconn = mcl->priv_data;
+ struct mcap_mdl *mdl = reconn->mdl;
+ mcap_mdl_operation_cb reconn_cb = reconn->cb.op;
+ gpointer user_data = reconn->user_data;
+ mcap4B_rsp *rsp = (mcap4B_rsp *) cmd;
+ mcap_md_req *cmdlast = (mcap_md_req *) mcl->lcmd;
+ uint16_t mdlid = ntohs(cmdlast->mdl);
+ GError *gerr = NULL;
+ gboolean close = FALSE;
+
+ g_free(mcl->priv_data);
+ mcl->priv_data = NULL;
+
+ rsp->mdl = ntohs(rsp->mdl);
+
+ close = check_err_rsp(rsp->mdl, mdlid, rsp->rc, len,
+ sizeof(mcap4B_rsp), &gerr);
+
+ g_free(mcl->lcmd);
+ mcl->lcmd = NULL;
+ mcl->req = MCL_AVAILABLE;
+
+ reconn_cb(mdl, gerr, user_data);
+ if (!gerr)
+ return close;
+
+ g_error_free(gerr);
+ shutdown_mdl(mdl);
+
+ if (rsp->rc != MCAP_INVALID_MDL)
+ return close;
+
+ /* Remove cached mdlid */
+ mcl->mdls = g_slist_remove(mcl->mdls, mdl);
+ mcl->cb->mdl_deleted(mdl, mcl->cb->user_data);
+ g_free(mdl);
+
+ return close;
}
static gboolean process_md_abort_mdl_rsp(struct mcap_mcl *mcl,
--
1.6.3.3
^ permalink raw reply related
* [PATCH 20/60] Process md_create_mdl_rsp
From: Jose Antonio Santos Cadenas @ 2010-07-22 8:56 UTC (permalink / raw)
To: linux-bluetooth; +Cc: José Antonio Santos-Cadenas
In-Reply-To: <1279789001-4587-1-git-send-email-santoscadenas@gmail.com>
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 2501 bytes --]
From: José Antonio Santos-Cadenas <santoscadenas@gmail.com>
---
mcap/mcap.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 79 insertions(+), 1 deletions(-)
diff --git a/mcap/mcap.c b/mcap/mcap.c
index c775501..aa9f1a3 100644
--- a/mcap/mcap.c
+++ b/mcap/mcap.c
@@ -1170,10 +1170,88 @@ static void proc_req_active(struct mcap_mcl *mcl, uint8_t *cmd, uint32_t len)
}
}
+/* Function used to process replies */
+static gboolean check_err_rsp(uint16_t rmdl, uint16_t smdl, uint8_t rc,
+ uint32_t rlen, uint32_t len, GError **gerr)
+{
+ gboolean close = FALSE;
+ char *msg;
+ gint err = MCAP_ERROR_FAILED;
+
+ if (rmdl != smdl) {
+ msg = "MDLID received doesn't match with MDLID sent";
+ close = TRUE;
+ goto fail;
+ }
+
+ if ((rc != MCAP_SUCCESS) && (rc <= MCAP_CONFIGURATION_REJECTED)) {
+ msg = error2str(rc);
+ err = rc;
+ goto fail;
+ }
+
+ if (rlen < len) {
+ msg = "Protocol error";
+ close = TRUE;
+ goto fail;
+ }
+ return FALSE;
+fail:
+ g_set_error(gerr, MCAP_ERROR, err, "%s", msg);
+ return close;
+}
+
static gboolean process_md_create_mdl_rsp(struct mcap_mcl *mcl,
uint8_t *cmd, uint32_t len)
{
- return FALSE;
+ struct mcap_mdl_op_cb *conn = mcl->priv_data;
+ struct mcap_mdl *mdl = conn->mdl;
+ mcap_mdl_operation_conf_cb connect_cb = conn->cb.op_conf;
+ gpointer user_data = conn->user_data;
+ uint16_t mdlid;
+ mcap5B_rsp *rsp = (mcap5B_rsp *) cmd;
+ mcap_md_create_mdl_req *cmdlast;
+ GError *gerr = NULL;
+ gboolean close = FALSE;
+
+ g_free(mcl->priv_data);
+ mcl->priv_data = NULL;
+
+ cmdlast = (mcap_md_create_mdl_req *) mcl->lcmd;
+ mdlid = ntohs(cmdlast->mdl);
+ rsp->mdl = ntohs(rsp->mdl);
+
+ g_free(mcl->lcmd);
+ mcl->lcmd = NULL;
+ mcl->req = MCL_AVAILABLE;
+ close = check_err_rsp(rsp->mdl, mdlid, rsp->rc, 0, 0, &gerr);
+
+ if (gerr)
+ goto fail;
+
+ if (len < 5) {
+ g_set_error(&gerr, MCAP_ERROR, MCAP_ERROR_FAILED,
+ "Protocol error");
+ close = TRUE;
+ goto fail;
+ }
+
+ /* Check if preferences changed */
+ if ((cmdlast->conf != 0x00) && (rsp->param != cmdlast->conf)) {
+ g_set_error(&gerr, MCAP_ERROR, MCAP_ERROR_FAILED,
+ "Configuration changed");
+ close = TRUE;
+ goto fail;
+ }
+
+ connect_cb(mdl, rsp->param, gerr, user_data);
+ return close;
+fail:
+ connect_cb(NULL, 0, gerr, user_data);
+ mcl->mdls = g_slist_remove(mcl->mdls, mdl);
+ g_free(mdl);
+ g_error_free(gerr);
+ return close;
}
static gboolean process_md_reconnect_mdl_rsp(struct mcap_mcl *mcl,
--
1.6.3.3
^ permalink raw reply related
* [PATCH 19/60] Process response to std. op. codes
From: Jose Antonio Santos Cadenas @ 2010-07-22 8:56 UTC (permalink / raw)
To: linux-bluetooth; +Cc: José Antonio Santos-Cadenas
In-Reply-To: <1279788733-2324-19-git-send-email-sancane@gmail.com>
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 3878 bytes --]
From: José Antonio Santos-Cadenas <santoscadenas@gmail.com>
---
mcap/mcap.c | 141 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 140 insertions(+), 1 deletions(-)
diff --git a/mcap/mcap.c b/mcap/mcap.c
index 6f6e08a..c775501 100644
--- a/mcap/mcap.c
+++ b/mcap/mcap.c
@@ -1170,9 +1170,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) {
+ DBG("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:
+ DBG("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)
@@ -1631,3 +1734,39 @@ 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
^ permalink raw reply related
* [PATCH 18/60] Implement function to send md_abort_mdl_req
From: Santiago Carot-Nemesio @ 2010-07-22 8:52 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Santiago Carot-Nemesio
In-Reply-To: <1279788733-2324-18-git-send-email-sancane@gmail.com>
---
mcap/mcap.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 48 insertions(+), 0 deletions(-)
diff --git a/mcap/mcap.c b/mcap/mcap.c
index 5419d54..6f6e08a 100644
--- a/mcap/mcap.c
+++ b/mcap/mcap.c
@@ -519,6 +519,38 @@ void mcap_req_mdl_deletion(struct mcap_mdl *mdl, GError **err,
g_free(con);
}
+void mcap_mdl_abort(struct mcap_mdl *mdl, GError **err,
+ mcap_mdl_del_cb abort_cb, gpointer user_data)
+{
+ struct mcap_mdl_op_cb *con;
+ struct mcap_mcl *mcl = mdl->mcl;
+ uint8_t *cmd;
+
+ if (mdl->state != MDL_WAITING) {
+ g_set_error(err, MCAP_ERROR, MCAP_ERROR_FAILED,
+ "Mdl in invalid state");
+ return;
+ }
+
+ con = g_new0(struct mcap_mdl_op_cb, 1);
+ cmd = create_req(MCAP_MD_ABORT_MDL_REQ, mdl->mdlid);
+ mcap_send_std_opcode(mcl, cmd, sizeof(mcap_md_req), err);
+ if (*err) {
+ g_free(con);
+ g_free(cmd);
+ return;
+ }
+
+ con->mdl = mdl;
+ con->cb.del = abort_cb;
+ con->user_data = user_data;
+
+ mcl->priv_data = con;
+
+ mcl->tid = g_timeout_add_seconds(RESPONSE_TIMER, wait_response_timer,
+ mcl);
+}
+
static void update_mcl_state(struct mcap_mcl *mcl)
{
GSList *l;
@@ -554,6 +586,22 @@ static struct mcap_mcl *find_mcl(GSList *list, const bdaddr_t *addr)
return NULL;
}
+int mcap_mdl_get_fd(struct mcap_mdl *mdl)
+{
+ if ((!mdl) || (mdl->state != MDL_CONNECTED))
+ return -1;
+
+ return g_io_channel_unix_get_fd(mdl->dc);
+}
+
+uint16_t mcap_mdl_get_mdlid(struct mcap_mdl *mdl)
+{
+ if (!mdl)
+ return MCAP_MDLID_RESERVED;
+
+ return mdl->mdlid;
+}
+
static void shutdown_mdl(struct mcap_mdl *mdl)
{
mdl->state = MDL_CLOSED;
--
1.6.3.3
^ permalink raw reply related
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox