[PATCHv3 2/2] android/gatt: Add DEVICE_CONNECTING state

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This will allow us to determine if we can scan for other devices to
connect or postpone it until previous connection is handled.
---
 android/gatt.c | 27 ++++++++++++++++-----------
 1 file changed, 16 insertions(+), 11 deletions(-)

diff --git a/android/gatt.c b/android/gatt.c
index 8c5b7e8..1d971fb 100644
--- a/android/gatt.c
+++ b/android/gatt.c
@@ -58,13 +58,15 @@ typedef enum {
 	DEVICE_DISCONNECTED = 0,
 	DEVICE_CONNECT_INIT,		/* connection procedure initiated */
 	DEVICE_CONNECT_READY,		/* dev found during LE scan */
-	DEVICE_CONNECTED,		/* connection has been established */
+	DEVICE_CONNECTING,		/* io connection triggered */
+	DEVICE_CONNECTED,		/* io connection has been established */
 } gatt_device_state_t;
 
 static const char const *device_state_str[] = {
 	"DISCONNECTED",
 	"CONNECT INIT",
 	"CONNECT READY",
+	"CONNECTING",
 	"CONNECTED",
 };
 
@@ -953,7 +955,7 @@ static void connect_cb(GIOChannel *io, GError *gerr, gpointer user_data)
 	uint32_t status;
 	GAttrib *attrib;
 
-	if (dev->state != DEVICE_CONNECT_READY) {
+	if (dev->state != DEVICE_CONNECTING) {
 		error("gatt: Device not in a connecting state!?");
 		g_io_channel_shutdown(io, TRUE, NULL);
 		return;
@@ -993,7 +995,7 @@ reply:
 	device_unref(dev);
 
 	/* Check if we should restart scan */
-	if (scanning)
+	if (scanning || find_device_by_state(DEVICE_CONNECT_INIT))
 		bt_le_discovery_start(le_device_found_handler);
 
 	/* FIXME: What to do if discovery won't start here. */
@@ -1040,6 +1042,7 @@ static int connect_le(struct gatt_device *dev)
 
 	/* Keep this, so we can cancel the connection */
 	dev->att_io = io;
+	device_set_state(dev, DEVICE_CONNECTING);
 
 	return 0;
 }
@@ -1092,7 +1095,7 @@ reply:
 									status);
 }
 
-static int connect_next_dev(void)
+static void connect_pending_devices(void)
 {
 	struct gatt_device *dev;
 
@@ -1100,18 +1103,18 @@ static int connect_next_dev(void)
 
 	dev = find_device_by_state(DEVICE_CONNECT_READY);
 	if (!dev)
-		return -ENODEV;
+		return;
 
-	return connect_le(dev);
+	/* In case of problem with socket we should retry. */
+	if (connect_le(dev) == -EIO)
+		bt_le_discovery_start(le_device_found_handler);
 }
 
 static void bt_le_discovery_stop_cb(void)
 {
 	DBG("");
 
-	/* Check now if there is any device ready to connect */
-	if (connect_next_dev() < 0)
-		bt_le_discovery_start(le_device_found_handler);
+	connect_pending_devices();
 }
 
 static struct gatt_device *create_device(const bdaddr_t *addr)
@@ -1201,14 +1204,16 @@ static bool trigger_connection(struct connection *connection)
 		device_set_state(connection->device, DEVICE_CONNECT_INIT);
 		break;
 	case DEVICE_CONNECTED:
+	case DEVICE_CONNECTING:
 		send_client_connect_notify(connection, GATT_SUCCESS);
 		break;
 	default:
 		break;
 	}
 
-	/* after state change trigger discovering */
-	if (!scanning && (connection->device->state == DEVICE_CONNECT_INIT))
+	/* after state change - trigger discovering (if ACL is not creating) */
+	if (!scanning && (connection->device->state == DEVICE_CONNECT_INIT) &&
+				!find_device_by_state(DEVICE_CONNECTING))
 		if (!bt_le_discovery_start(le_device_found_handler)) {
 			error("gatt: Could not start scan");
 
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux