All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/5] Fix issue when setting limited discoverable mode
@ 2010-10-28  8:00 Luiz Augusto von Dentz
  2010-10-28  8:00 ` [PATCH 2/5] Fix not waiting mode change when setting powered property Luiz Augusto von Dentz
                   ` (4 more replies)
  0 siblings, 5 replies; 8+ messages in thread
From: Luiz Augusto von Dentz @ 2010-10-28  8:00 UTC (permalink / raw)
  To: linux-bluetooth

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

When setting limited discoverable mode it will always switch to
discoverable on adapter_mode_changed which doesn't match the pending mode
requested.
---
 src/adapter.c |    5 +++--
 1 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/src/adapter.c b/src/adapter.c
index 4a9f34e..98d96e2 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -3225,9 +3225,10 @@ void adapter_mode_changed(struct btd_adapter *adapter, uint8_t scan_mode)
 					DBUS_TYPE_BOOLEAN, &pairable);
 
 	if (discoverable && adapter->pairable && adapter->discov_timeout > 0 &&
-						adapter->discov_timeout <= 60)
+						adapter->discov_timeout <= 60) {
+		adapter->mode = MODE_LIMITED;
 		adapter_set_limited_discoverable(adapter, TRUE);
-	else if (!discoverable)
+	} else if (!discoverable)
 		adapter_set_limited_discoverable(adapter, FALSE);
 
 	emit_property_changed(connection, path,
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 2/5] Fix not waiting mode change when setting powered property
  2010-10-28  8:00 [PATCH 1/5] Fix issue when setting limited discoverable mode Luiz Augusto von Dentz
@ 2010-10-28  8:00 ` Luiz Augusto von Dentz
  2010-10-28 18:28   ` Johan Hedberg
  2010-10-28  8:00 ` [PATCH 3/5] Fix setting Discoverable when adapter is down Luiz Augusto von Dentz
                   ` (3 subsequent siblings)
  4 siblings, 1 reply; 8+ messages in thread
From: Luiz Augusto von Dentz @ 2010-10-28  8:00 UTC (permalink / raw)
  To: linux-bluetooth

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

This may cause errors if the user application immediately set another
mode.
---
 src/adapter.c |   84 +++++++++++++++++++++++++++++---------------------------
 1 files changed, 43 insertions(+), 41 deletions(-)

diff --git a/src/adapter.c b/src/adapter.c
index 98d96e2..f4fc3c1 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -604,11 +604,11 @@ static DBusMessage *set_powered(DBusConnection *conn, DBusMessage *msg,
 	if (mode == adapter->mode)
 		return dbus_message_new_method_return(msg);
 
-	err = set_mode(adapter, mode, NULL);
+	err = set_mode(adapter, mode, msg);
 	if (err < 0)
 		return failed_strerror(msg, -err);
 
-	return dbus_message_new_method_return(msg);
+	return NULL;
 }
 
 static DBusMessage *set_discoverable(DBusConnection *conn, DBusMessage *msg,
@@ -2570,6 +2570,45 @@ static void unload_drivers(struct btd_adapter *adapter)
 	}
 }
 
+static void set_mode_complete(struct btd_adapter *adapter)
+{
+	struct session_req *pending;
+	const char *modestr;
+	int err;
+
+	if (adapter->pending_mode == NULL)
+		return;
+
+	pending = adapter->pending_mode;
+	adapter->pending_mode = NULL;
+
+	err = (pending->mode != adapter->mode) ? -EINVAL : 0;
+
+	if (pending->msg != NULL) {
+		DBusMessage *msg = pending->msg;
+		DBusMessage *reply;
+
+		if (err < 0)
+			reply = failed_strerror(msg, -err);
+		else
+			reply = g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
+
+		g_dbus_send_message(connection, reply);
+	}
+
+	modestr = mode2str(adapter->mode);
+
+	DBG("%s", modestr);
+
+	/* Only store if the mode matches the pending */
+	if (err == 0)
+		write_device_mode(&adapter->bdaddr, modestr);
+	else
+		error("unable to set mode: %s", mode2str(pending->mode));
+
+	session_unref(pending);
+}
+
 int adapter_stop(struct btd_adapter *adapter)
 {
 	gboolean powered, discoverable, pairable;
@@ -2628,6 +2667,8 @@ int adapter_stop(struct btd_adapter *adapter)
 
 	info("Adapter %s has been disabled", adapter->path);
 
+	set_mode_complete(adapter);
+
 	return 0;
 }
 
@@ -3137,45 +3178,6 @@ int adapter_remove_found_device(struct btd_adapter *adapter, bdaddr_t *bdaddr)
 	return 0;
 }
 
-static void set_mode_complete(struct btd_adapter *adapter)
-{
-	struct session_req *pending;
-	const char *modestr;
-	int err;
-
-	if (adapter->pending_mode == NULL)
-		return;
-
-	pending = adapter->pending_mode;
-	adapter->pending_mode = NULL;
-
-	err = (pending->mode != adapter->mode) ? -EINVAL : 0;
-
-	if (pending->msg != NULL) {
-		DBusMessage *msg = pending->msg;
-		DBusMessage *reply;
-
-		if (err < 0)
-			reply = failed_strerror(msg, -err);
-		else
-			reply = g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
-
-		g_dbus_send_message(connection, reply);
-	}
-
-	modestr = mode2str(adapter->mode);
-
-	DBG("%s", modestr);
-
-	/* Only store if the mode matches the pending */
-	if (err == 0)
-		write_device_mode(&adapter->bdaddr, modestr);
-	else
-		error("unable to set mode: %s", mode2str(pending->mode));
-
-	session_unref(pending);
-}
-
 void adapter_mode_changed(struct btd_adapter *adapter, uint8_t scan_mode)
 {
 	const gchar *path = adapter_get_path(adapter);
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 3/5] Fix setting Discoverable when adapter is down
  2010-10-28  8:00 [PATCH 1/5] Fix issue when setting limited discoverable mode Luiz Augusto von Dentz
  2010-10-28  8:00 ` [PATCH 2/5] Fix not waiting mode change when setting powered property Luiz Augusto von Dentz
@ 2010-10-28  8:00 ` Luiz Augusto von Dentz
  2010-10-28 19:00   ` Johan Hedberg
  2010-10-28  8:00 ` [PATCH 4/5] Fix not replying when mode is limited discoverable or discoverable Luiz Augusto von Dentz
                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 8+ messages in thread
From: Luiz Augusto von Dentz @ 2010-10-28  8:00 UTC (permalink / raw)
  To: linux-bluetooth

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

This cause an error because adapter_up will load the mode from storage
ignoring pending mode which cause modes to mismatch.

To fix this behavior now when attempting to change mode we first store
the new mode and wait DEVUP to complete set the mode stored.
---
 src/adapter.c |   19 +++++++++++--------
 1 files changed, 11 insertions(+), 8 deletions(-)

diff --git a/src/adapter.c b/src/adapter.c
index f4fc3c1..e5f7730 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -533,6 +533,7 @@ static int set_mode(struct btd_adapter *adapter, uint8_t new_mode,
 			DBusMessage *msg)
 {
 	int err;
+	const char *modestr;
 
 	if (adapter->pending_mode != NULL)
 		return -EALREADY;
@@ -541,6 +542,8 @@ static int set_mode(struct btd_adapter *adapter, uint8_t new_mode,
 		err = adapter_ops->set_powered(adapter->dev_id, TRUE);
 		if (err < 0)
 			return err;
+
+		goto done;
 	}
 
 	if (adapter->up && new_mode == MODE_OFF) {
@@ -576,18 +579,18 @@ static int set_mode(struct btd_adapter *adapter, uint8_t new_mode,
 	}
 
 done:
-	DBG("%s", mode2str(new_mode));
+	modestr = mode2str(new_mode);
+	write_device_mode(&adapter->bdaddr, modestr);
+
+	DBG("%s", modestr);
 
 	if (msg != NULL)
 		/* Wait for mode change to reply */
 		adapter->pending_mode = create_session(adapter, connection,
 							msg, new_mode, NULL);
-	else {
+	else
 		/* Nothing to reply just write the new mode */
-		const char *modestr = mode2str(new_mode);
 		adapter->mode = new_mode;
-		write_device_mode(&adapter->bdaddr, modestr);
-	}
 
 	return 0;
 }
@@ -2600,11 +2603,11 @@ static void set_mode_complete(struct btd_adapter *adapter)
 
 	DBG("%s", modestr);
 
-	/* Only store if the mode matches the pending */
-	if (err == 0)
+	/* restore if the mode doesn't matches the pending */
+	if (err != 0) {
 		write_device_mode(&adapter->bdaddr, modestr);
-	else
 		error("unable to set mode: %s", mode2str(pending->mode));
+	}
 
 	session_unref(pending);
 }
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 4/5] Fix not replying when mode is limited discoverable or discoverable
  2010-10-28  8:00 [PATCH 1/5] Fix issue when setting limited discoverable mode Luiz Augusto von Dentz
  2010-10-28  8:00 ` [PATCH 2/5] Fix not waiting mode change when setting powered property Luiz Augusto von Dentz
  2010-10-28  8:00 ` [PATCH 3/5] Fix setting Discoverable when adapter is down Luiz Augusto von Dentz
@ 2010-10-28  8:00 ` Luiz Augusto von Dentz
  2010-10-28  8:00 ` [PATCH 5/5] Fix not being able to set discoverable when discoverable timeout is set Luiz Augusto von Dentz
  2010-10-28 18:24 ` [PATCH 1/5] Fix issue when setting limited discoverable mode Johan Hedberg
  4 siblings, 0 replies; 8+ messages in thread
From: Luiz Augusto von Dentz @ 2010-10-28  8:00 UTC (permalink / raw)
  To: linux-bluetooth

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

When changing from/to limited discoverable or discoverable it won't
change the scan mode thus causing set_mode_complete to not be called.
---
 src/adapter.c |   49 +++++++++++++++++++++++++++++++++----------------
 1 files changed, 33 insertions(+), 16 deletions(-)

diff --git a/src/adapter.c b/src/adapter.c
index e5f7730..b5e73b7 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -584,25 +584,41 @@ done:
 
 	DBG("%s", modestr);
 
-	if (msg != NULL)
-		/* Wait for mode change to reply */
-		adapter->pending_mode = create_session(adapter, connection,
-							msg, new_mode, NULL);
-	else
+	if (msg != NULL) {
+		/* Limited to Discoverable and vice-versa doesn't cause any
+		   change to scan mode */
+		if (g_str_equal(modestr, mode2str(adapter->mode)) == TRUE) {
+			DBusMessage *reply;
+
+			reply = g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
+
+			g_dbus_send_message(connection, reply);
+		} else
+			/* Wait for mode change to reply */
+			adapter->pending_mode = create_session(adapter,
+								connection,
+								msg, new_mode,
+								NULL);
+	} else
 		/* Nothing to reply just write the new mode */
 		adapter->mode = new_mode;
 
 	return 0;
 }
 
-static DBusMessage *set_powered(DBusConnection *conn, DBusMessage *msg,
-				gboolean powered, void *data)
+static DBusMessage *set_discoverable(DBusConnection *conn, DBusMessage *msg,
+				gboolean discoverable, void *data)
 {
 	struct btd_adapter *adapter = data;
 	uint8_t mode;
 	int err;
 
-	mode = powered ? get_mode(&adapter->bdaddr, "on") : MODE_OFF;
+	mode = discoverable ? MODE_DISCOVERABLE : MODE_CONNECTABLE;
+
+	if (mode == MODE_DISCOVERABLE && adapter->pairable &&
+					adapter->discov_timeout > 0 &&
+					adapter->discov_timeout <= 60)
+		mode = MODE_LIMITED;
 
 	if (mode == adapter->mode)
 		return dbus_message_new_method_return(msg);
@@ -614,19 +630,20 @@ static DBusMessage *set_powered(DBusConnection *conn, DBusMessage *msg,
 	return NULL;
 }
 
-static DBusMessage *set_discoverable(DBusConnection *conn, DBusMessage *msg,
-				gboolean discoverable, void *data)
+static DBusMessage *set_powered(DBusConnection *conn, DBusMessage *msg,
+				gboolean powered, void *data)
 {
 	struct btd_adapter *adapter = data;
 	uint8_t mode;
 	int err;
 
-	mode = discoverable ? MODE_DISCOVERABLE : MODE_CONNECTABLE;
+	if (powered) {
+		mode = get_mode(&adapter->bdaddr, "on");
+		return set_discoverable(conn, msg, mode == MODE_DISCOVERABLE,
+									data);
+	}
 
-	if (mode == MODE_DISCOVERABLE && adapter->pairable &&
-					adapter->discov_timeout > 0 &&
-					adapter->discov_timeout <= 60)
-		mode = MODE_LIMITED;
+	mode = MODE_OFF;
 
 	if (mode == adapter->mode)
 		return dbus_message_new_method_return(msg);
@@ -635,7 +652,7 @@ static DBusMessage *set_discoverable(DBusConnection *conn, DBusMessage *msg,
 	if (err < 0)
 		return failed_strerror(msg, -err);
 
-	return 0;
+	return NULL;
 }
 
 static DBusMessage *set_pairable(DBusConnection *conn, DBusMessage *msg,
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 5/5] Fix not being able to set discoverable when discoverable timeout is set
  2010-10-28  8:00 [PATCH 1/5] Fix issue when setting limited discoverable mode Luiz Augusto von Dentz
                   ` (2 preceding siblings ...)
  2010-10-28  8:00 ` [PATCH 4/5] Fix not replying when mode is limited discoverable or discoverable Luiz Augusto von Dentz
@ 2010-10-28  8:00 ` Luiz Augusto von Dentz
  2010-10-28 18:24 ` [PATCH 1/5] Fix issue when setting limited discoverable mode Johan Hedberg
  4 siblings, 0 replies; 8+ messages in thread
From: Luiz Augusto von Dentz @ 2010-10-28  8:00 UTC (permalink / raw)
  To: linux-bluetooth

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

Since setting Discoverable property now has the ability to turn on the
adapter if off we should no longer ignore discoverable mode if a timeout
is set.
---
 src/adapter.c |   51 +++++++++++++++++++++++++++++----------------------
 1 files changed, 29 insertions(+), 22 deletions(-)

diff --git a/src/adapter.c b/src/adapter.c
index b5e73b7..19fe5a8 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -529,6 +529,32 @@ static struct session_req *create_session(struct btd_adapter *adapter,
 	return session_ref(req);
 }
 
+static int adapter_set_mode(struct btd_adapter *adapter, uint8_t mode)
+{
+	int err;
+
+	if (mode == MODE_CONNECTABLE)
+		err = adapter_ops->set_connectable(adapter->dev_id);
+	else
+		err = adapter_ops->set_discoverable(adapter->dev_id);
+
+	if (err < 0)
+		return err;
+
+	if (mode == MODE_CONNECTABLE)
+		return 0;
+
+	adapter_remove_discov_timeout(adapter);
+
+	if (adapter->discov_timeout)
+		adapter_set_discov_timeout(adapter, adapter->discov_timeout);
+
+	if (mode != MODE_LIMITED && adapter->mode == MODE_LIMITED)
+		adapter_set_limited_discoverable(adapter, FALSE);
+
+	return 0;
+}
+
 static int set_mode(struct btd_adapter *adapter, uint8_t new_mode,
 			DBusMessage *msg)
 {
@@ -559,25 +585,11 @@ static int set_mode(struct btd_adapter *adapter, uint8_t new_mode,
 	if (new_mode == adapter->mode)
 		return 0;
 
-	if (new_mode == MODE_CONNECTABLE)
-		err = adapter_ops->set_connectable(adapter->dev_id);
-	else
-		err = adapter_ops->set_discoverable(adapter->dev_id);
+	err = adapter_set_mode(adapter, new_mode);
 
 	if (err < 0)
 		return err;
 
-	if (new_mode > MODE_CONNECTABLE) {
-		adapter_remove_discov_timeout(adapter);
-
-		if (adapter->discov_timeout)
-			adapter_set_discov_timeout(adapter,
-						adapter->discov_timeout);
-
-		if (new_mode != MODE_LIMITED && adapter->mode == MODE_LIMITED)
-			adapter_set_limited_discoverable(adapter, FALSE);
-	}
-
 done:
 	modestr = mode2str(new_mode);
 	write_device_mode(&adapter->bdaddr, modestr);
@@ -2429,18 +2441,13 @@ static int adapter_up(struct btd_adapter *adapter, const char *mode)
 		write_device_mode(&adapter->bdaddr, onmode);
 
 		return adapter_up(adapter, onmode);
-	} else if (!g_str_equal(mode, "connectable") &&
-			adapter->discov_timeout == 0) {
-		/* Set discoverable only if timeout is 0 */
+	} else if (!g_str_equal(mode, "connectable")) {
 		adapter->mode = MODE_DISCOVERABLE;
 		scan_mode = SCAN_PAGE | SCAN_INQUIRY;
 	}
 
 proceed:
-	if (scan_mode == SCAN_PAGE)
-		err = adapter_ops->set_connectable(adapter->dev_id);
-	else
-		err = adapter_ops->set_discoverable(adapter->dev_id);
+	err = adapter_set_mode(adapter, adapter->mode);
 
 	if (err < 0)
 		return err;
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH 1/5] Fix issue when setting limited discoverable mode
  2010-10-28  8:00 [PATCH 1/5] Fix issue when setting limited discoverable mode Luiz Augusto von Dentz
                   ` (3 preceding siblings ...)
  2010-10-28  8:00 ` [PATCH 5/5] Fix not being able to set discoverable when discoverable timeout is set Luiz Augusto von Dentz
@ 2010-10-28 18:24 ` Johan Hedberg
  4 siblings, 0 replies; 8+ messages in thread
From: Johan Hedberg @ 2010-10-28 18:24 UTC (permalink / raw)
  To: Luiz Augusto von Dentz; +Cc: linux-bluetooth

Hi Luiz,

On Thu, Oct 28, 2010, Luiz Augusto von Dentz wrote:
>  	if (discoverable && adapter->pairable && adapter->discov_timeout > 0 &&
> -						adapter->discov_timeout <= 60)
> +						adapter->discov_timeout <= 60) {
> +		adapter->mode = MODE_LIMITED;
>  		adapter_set_limited_discoverable(adapter, TRUE);

Wouldn't it make more sense to do the fix to adapter->mode inside the
adapter_set_limited_discoverable function?

Johan

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 2/5] Fix not waiting mode change when setting powered property
  2010-10-28  8:00 ` [PATCH 2/5] Fix not waiting mode change when setting powered property Luiz Augusto von Dentz
@ 2010-10-28 18:28   ` Johan Hedberg
  0 siblings, 0 replies; 8+ messages in thread
From: Johan Hedberg @ 2010-10-28 18:28 UTC (permalink / raw)
  To: Luiz Augusto von Dentz; +Cc: linux-bluetooth

Hi Luiz,

On Thu, Oct 28, 2010, Luiz Augusto von Dentz wrote:
> From: Luiz Augusto von Dentz <luiz.dentz-von@nokia.com>
> 
> This may cause errors if the user application immediately set another
> mode.
> ---
>  src/adapter.c |   84 +++++++++++++++++++++++++++++---------------------------
>  1 files changed, 43 insertions(+), 41 deletions(-)

This patch has been pushed upstream. Thanks.

Johan

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 3/5] Fix setting Discoverable when adapter is down
  2010-10-28  8:00 ` [PATCH 3/5] Fix setting Discoverable when adapter is down Luiz Augusto von Dentz
@ 2010-10-28 19:00   ` Johan Hedberg
  0 siblings, 0 replies; 8+ messages in thread
From: Johan Hedberg @ 2010-10-28 19:00 UTC (permalink / raw)
  To: Luiz Augusto von Dentz; +Cc: linux-bluetooth

Hi Luiz,

On Thu, Oct 28, 2010, Luiz Augusto von Dentz wrote:
> From: Luiz Augusto von Dentz <luiz.dentz-von@nokia.com>
> 
> This cause an error because adapter_up will load the mode from storage
> ignoring pending mode which cause modes to mismatch.
> 
> To fix this behavior now when attempting to change mode we first store
> the new mode and wait DEVUP to complete set the mode stored.
> ---
>  src/adapter.c |   19 +++++++++++--------
>  1 files changed, 11 insertions(+), 8 deletions(-)

Patches 3/5, 4/5 and 5/5 have also been pushed upstream. Thanks.

Johan

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2010-10-28 19:00 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-10-28  8:00 [PATCH 1/5] Fix issue when setting limited discoverable mode Luiz Augusto von Dentz
2010-10-28  8:00 ` [PATCH 2/5] Fix not waiting mode change when setting powered property Luiz Augusto von Dentz
2010-10-28 18:28   ` Johan Hedberg
2010-10-28  8:00 ` [PATCH 3/5] Fix setting Discoverable when adapter is down Luiz Augusto von Dentz
2010-10-28 19:00   ` Johan Hedberg
2010-10-28  8:00 ` [PATCH 4/5] Fix not replying when mode is limited discoverable or discoverable Luiz Augusto von Dentz
2010-10-28  8:00 ` [PATCH 5/5] Fix not being able to set discoverable when discoverable timeout is set Luiz Augusto von Dentz
2010-10-28 18:24 ` [PATCH 1/5] Fix issue when setting limited discoverable mode Johan Hedberg

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.