linux-bluetooth.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Luiz Augusto von Dentz <luiz.dentz@gmail.com>
To: linux-bluetooth@vger.kernel.org
Subject: [PATCH obexd 8/9] gobex: fix sending Connection ID header in all requests
Date: Thu, 10 Nov 2011 16:43:57 +0200	[thread overview]
Message-ID: <1320936238-28360-8-git-send-email-luiz.dentz@gmail.com> (raw)
In-Reply-To: <1320936238-28360-1-git-send-email-luiz.dentz@gmail.com>

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

According to both OBEX and GOEP specs Connection ID should only be
included in the first packet of a request.
---
 client/transfer.c      |    7 +++----
 gobex/gobex-transfer.c |   17 ++++++++++-------
 gobex/gobex.c          |   31 +++++++++++++++++++++----------
 gobex/gobex.h          |    6 +++---
 unit/test-gobex.c      |    6 +++---
 5 files changed, 40 insertions(+), 27 deletions(-)

diff --git a/client/transfer.c b/client/transfer.c
index b6994d1..d6d3e0d 100644
--- a/client/transfer.c
+++ b/client/transfer.c
@@ -375,9 +375,8 @@ static void get_buf_xfer_progress(GObex *obex, GError *err, GObexPacket *rsp,
 
 	req = g_obex_packet_new(G_OBEX_OP_GET, TRUE, G_OBEX_HDR_INVALID);
 
-	transfer->xfer = g_obex_send_req(obex, req, -1, get_buf_xfer_progress,
-							transfer, &err);
-
+	transfer->xfer = g_obex_send_req(obex, req, transfer->xfer, -1,
+				get_buf_xfer_progress, transfer, &err);
 	if (callback)
 		callback->func(transfer, transfer->transferred, err,
 							callback->data);
@@ -539,7 +538,7 @@ int obc_transfer_get(struct obc_transfer *transfer, transfer_callback_t func,
 						transfer->params->size);
 
 	if (rsp_cb)
-		transfer->xfer = g_obex_send_req(obex, req, -1, rsp_cb,
+		transfer->xfer = g_obex_send_req(obex, req, 0, -1, rsp_cb,
 							transfer, &err);
 	else
 		transfer->xfer = g_obex_get_req_pkt(obex, req, data_cb,
diff --git a/gobex/gobex-transfer.c b/gobex/gobex-transfer.c
index 6d2f7af..80e4781 100644
--- a/gobex/gobex-transfer.c
+++ b/gobex/gobex-transfer.c
@@ -121,7 +121,7 @@ static gssize put_get_data(void *buf, gsize len, gpointer user_data)
 		return ret;
 
 	req = g_obex_packet_new(G_OBEX_OP_ABORT, TRUE, G_OBEX_HDR_INVALID);
-	transfer->req_id = g_obex_send_req(transfer->obex, req, -1,
+	transfer->req_id = g_obex_send_req(transfer->obex, req, 0, -1,
 						transfer_abort_response,
 						transfer, &err);
 	if (err != NULL) {
@@ -161,9 +161,11 @@ static void transfer_response(GObex *obex, GError *err, GObexPacket *rsp,
 	struct transfer *transfer = user_data;
 	GObexPacket *req;
 	gboolean rspcode, final;
+	guint id;
 
 	g_obex_debug(G_OBEX_DEBUG_TRANSFER, "transfer %u", transfer->id);
 
+	id = transfer->req_id;
 	transfer->req_id = 0;
 
 	if (err != NULL) {
@@ -198,8 +200,9 @@ static void transfer_response(GObex *obex, GError *err, GObexPacket *rsp,
 							G_OBEX_HDR_INVALID);
 	}
 
-	transfer->req_id = g_obex_send_req(obex, req, -1, transfer_response,
-							transfer, &err);
+	transfer->req_id = g_obex_send_req(obex, req, id, -1,
+						transfer_response, transfer,
+						&err);
 failed:
 	if (err != NULL) {
 		g_obex_debug(G_OBEX_DEBUG_ERROR, "%s", err->message);
@@ -245,7 +248,7 @@ guint g_obex_put_req_pkt(GObex *obex, GObexPacket *req,
 
 	g_obex_packet_add_body(req, put_get_data, transfer);
 
-	transfer->req_id = g_obex_send_req(obex, req, FIRST_PACKET_TIMEOUT,
+	transfer->req_id = g_obex_send_req(obex, req, 0, FIRST_PACKET_TIMEOUT,
 					transfer_response, transfer, err);
 	if (transfer->req_id == 0) {
 		transfer_free(transfer);
@@ -277,7 +280,7 @@ guint g_obex_put_req(GObex *obex, GObexDataProducer data_func,
 
 	g_obex_packet_add_body(req, put_get_data, transfer);
 
-	transfer->req_id = g_obex_send_req(obex, req, FIRST_PACKET_TIMEOUT,
+	transfer->req_id = g_obex_send_req(obex, req, 0, FIRST_PACKET_TIMEOUT,
 					transfer_response, transfer, err);
 	if (transfer->req_id == 0) {
 		transfer_free(transfer);
@@ -426,7 +429,7 @@ guint g_obex_get_req_pkt(GObex *obex, GObexPacket *req,
 	transfer = transfer_new(obex, G_OBEX_OP_GET, complete_func, user_data);
 	transfer->data_consumer = data_func;
 
-	transfer->req_id = g_obex_send_req(obex, req, FIRST_PACKET_TIMEOUT,
+	transfer->req_id = g_obex_send_req(obex, req, 0, FIRST_PACKET_TIMEOUT,
 					transfer_response, transfer, err);
 	if (transfer->req_id == 0) {
 		transfer_free(transfer);
@@ -456,7 +459,7 @@ guint g_obex_get_req(GObex *obex, GObexDataConsumer data_func,
 							first_hdr_id, args);
 	va_end(args);
 
-	transfer->req_id = g_obex_send_req(obex, req, FIRST_PACKET_TIMEOUT,
+	transfer->req_id = g_obex_send_req(obex, req, 0, FIRST_PACKET_TIMEOUT,
 					transfer_response, transfer, err);
 	if (transfer->req_id == 0) {
 		transfer_free(transfer);
diff --git a/gobex/gobex.c b/gobex/gobex.c
index b0f3716..62d36da 100644
--- a/gobex/gobex.c
+++ b/gobex/gobex.c
@@ -397,19 +397,30 @@ gboolean g_obex_send(GObex *obex, GObexPacket *pkt, GError **err)
 	return ret;
 }
 
-guint g_obex_send_req(GObex *obex, GObexPacket *req, gint timeout,
-			GObexResponseFunc func, gpointer user_data,
-			GError **err)
+guint g_obex_send_req(GObex *obex, GObexPacket *req, guint req_id,
+			gint timeout, GObexResponseFunc func,
+			gpointer user_data, GError **err)
 {
 	GObexHeader *connid;
 	struct pending_pkt *p;
 	static guint id = 1;
 
-	g_obex_debug(G_OBEX_DEBUG_COMMAND, "conn %u", obex->conn_id);
+	g_obex_debug(G_OBEX_DEBUG_COMMAND, "conn %u req_id %u", obex->conn_id,
+								req_id);
 
 	if (obex->conn_id == CONNID_INVALID)
 		goto create_pending;
 
+	if (obex->pending_req && obex->pending_req->id == req_id)
+		goto create_pending;
+
+	if (req_id != 0) {
+		g_set_error(err, G_OBEX_ERROR, G_OBEX_ERROR_INVALID_ARGS,
+				"Invalid arguments");
+		g_obex_debug(G_OBEX_DEBUG_ERROR, "%s", (*err)->message);
+		return 0;
+	}
+
 	connid = g_obex_packet_get_header(req, G_OBEX_HDR_CONNECTION);
 	if (connid != NULL)
 		goto create_pending;
@@ -1076,7 +1087,7 @@ guint g_obex_connect(GObex *obex, GObexResponseFunc func, gpointer user_data,
 	init_connect_data(obex, &data);
 	g_obex_packet_set_data(req, &data, sizeof(data), G_OBEX_DATA_COPY);
 
-	return g_obex_send_req(obex, req, -1, func, user_data, err);
+	return g_obex_send_req(obex, req, 0, -1, func, user_data, err);
 }
 
 guint g_obex_setpath(GObex *obex, const char *path, GObexResponseFunc func,
@@ -1102,7 +1113,7 @@ guint g_obex_setpath(GObex *obex, const char *path, GObexResponseFunc func,
 
 	g_obex_packet_set_data(req, &data, sizeof(data), G_OBEX_DATA_COPY);
 
-	return g_obex_send_req(obex, req, -1, func, user_data, err);
+	return g_obex_send_req(obex, req, 0, -1, func, user_data, err);
 }
 
 guint g_obex_mkdir(GObex *obex, const char *path, GObexResponseFunc func,
@@ -1119,7 +1130,7 @@ guint g_obex_mkdir(GObex *obex, const char *path, GObexResponseFunc func,
 	memset(&data, 0, sizeof(data));
 	g_obex_packet_set_data(req, &data, sizeof(data), G_OBEX_DATA_COPY);
 
-	return g_obex_send_req(obex, req, -1, func, user_data, err);
+	return g_obex_send_req(obex, req, 0, -1, func, user_data, err);
 }
 
 guint g_obex_delete(GObex *obex, const char *name, GObexResponseFunc func,
@@ -1132,7 +1143,7 @@ guint g_obex_delete(GObex *obex, const char *name, GObexResponseFunc func,
 	req = g_obex_packet_new(G_OBEX_OP_PUT, TRUE, G_OBEX_HDR_NAME, name,
 							G_OBEX_HDR_INVALID);
 
-	return g_obex_send_req(obex, req, -1, func, user_data, err);
+	return g_obex_send_req(obex, req, 0, -1, func, user_data, err);
 }
 
 guint g_obex_copy(GObex *obex, const char *name, const char *dest,
@@ -1149,7 +1160,7 @@ guint g_obex_copy(GObex *obex, const char *name, const char *dest,
 					G_OBEX_HDR_DESTNAME, dest,
 					G_OBEX_HDR_INVALID);
 
-	return g_obex_send_req(obex, req, -1, func, user_data, err);
+	return g_obex_send_req(obex, req, 0, -1, func, user_data, err);
 }
 
 guint g_obex_move(GObex *obex, const char *name, const char *dest,
@@ -1166,5 +1177,5 @@ guint g_obex_move(GObex *obex, const char *name, const char *dest,
 					G_OBEX_HDR_DESTNAME, dest,
 					G_OBEX_HDR_INVALID);
 
-	return g_obex_send_req(obex, req, -1, func, user_data, err);
+	return g_obex_send_req(obex, req, 0, -1, func, user_data, err);
 }
diff --git a/gobex/gobex.h b/gobex/gobex.h
index 1b20333..9c45817 100644
--- a/gobex/gobex.h
+++ b/gobex/gobex.h
@@ -43,9 +43,9 @@ typedef void (*GObexResponseFunc) (GObex *obex, GError *err, GObexPacket *rsp,
 
 gboolean g_obex_send(GObex *obex, GObexPacket *pkt, GError **err);
 
-guint g_obex_send_req(GObex *obex, GObexPacket *req, gint timeout,
-			GObexResponseFunc func, gpointer user_data,
-			GError **err);
+guint g_obex_send_req(GObex *obex, GObexPacket *req, guint req_id,
+			gint timeout, GObexResponseFunc func,
+			gpointer user_data, GError **err);
 gboolean g_obex_cancel_req(GObex *obex, guint req_id,
 						gboolean remove_callback);
 
diff --git a/unit/test-gobex.c b/unit/test-gobex.c
index 62443db..1e31fe8 100644
--- a/unit/test-gobex.c
+++ b/unit/test-gobex.c
@@ -231,7 +231,7 @@ static void send_req(GObexPacket *req, GObexResponseFunc rsp_func,
 
 	create_endpoints(&obex, &io, transport_type);
 
-	g_obex_send_req(obex, req, req_timeout, rsp_func, &gerr, &gerr);
+	g_obex_send_req(obex, req, 0, req_timeout, rsp_func, &gerr, &gerr);
 	g_assert_no_error(gerr);
 
 	cond = G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_NVAL;
@@ -340,7 +340,7 @@ static void test_cancel_req_immediate(void)
 	r.err = NULL;
 
 	req = g_obex_packet_new(G_OBEX_OP_PUT, TRUE, G_OBEX_HDR_INVALID);
-	r.id = g_obex_send_req(r.obex, req, -1, req_done, &r, &r.err);
+	r.id = g_obex_send_req(r.obex, req, 0, -1, req_done, &r, &r.err);
 	g_assert_no_error(r.err);
 	g_assert(r.id != 0);
 
@@ -421,7 +421,7 @@ static void test_cancel_req_delay(int transport_type)
 	r.err = NULL;
 
 	req = g_obex_packet_new(G_OBEX_OP_PUT, TRUE, G_OBEX_HDR_INVALID);
-	r.id = g_obex_send_req(r.obex, req, -1, req_done, &r, &r.err);
+	r.id = g_obex_send_req(r.obex, req, 0, -1, req_done, &r, &r.err);
 	g_assert_no_error(r.err);
 	g_assert(r.id != 0);
 
-- 
1.7.6.4


  parent reply	other threads:[~2011-11-10 14:43 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-11-10 14:43 [PATCH obexd 1/9] gobex: add unit test for CONNECT request Luiz Augusto von Dentz
2011-11-10 14:43 ` [PATCH obexd 2/9] gobex: add unit test for CONNECT response Luiz Augusto von Dentz
2011-11-10 14:43 ` [PATCH obexd 3/9] gobex: add unit test for CONNECT followed by GET request Luiz Augusto von Dentz
2011-11-10 15:02   ` Hendrik Sattler
2011-11-11  9:00     ` Luiz Augusto von Dentz
2011-11-10 14:43 ` [PATCH obexd 4/9] gobex: add unit test for CONNECT followed by GET response Luiz Augusto von Dentz
2011-11-10 14:43 ` [PATCH obexd 5/9] gobex: add unit test for CONNECT followed by PUT request Luiz Augusto von Dentz
2011-11-10 14:43 ` [PATCH obexd 6/9] gobex: add unit test for CONNECT followed by PUT response Luiz Augusto von Dentz
2011-11-10 15:25   ` Hendrik Sattler
2011-11-11  9:04     ` Luiz Augusto von Dentz
2011-11-10 14:43 ` [PATCH obexd 7/9] gobex: fix checking connection id for ABORT Luiz Augusto von Dentz
2011-11-10 14:43 ` Luiz Augusto von Dentz [this message]
2011-11-10 14:43 ` [PATCH obexd 9/9] gobex: make connection id check less strict Luiz Augusto von Dentz
2011-11-10 15:08 ` [PATCH obexd 1/9] gobex: add unit test for CONNECT request Hendrik Sattler
2011-11-11  9:00   ` Luiz Augusto von Dentz

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=1320936238-28360-8-git-send-email-luiz.dentz@gmail.com \
    --to=luiz.dentz@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).