Diff between 2f2a3ede0ed2275718a271caf0ddc89c70737ba1 and 1f6337025a1d53e11ff5429311e8dad7f3bbd3d3

Changed Files

File Additions Deletions Status
src/adapter.c +55 -0 modified
src/mgmt.c +1 -47 modified

Full Patch

diff --git a/src/adapter.c b/src/adapter.c
index d596e48..db32c7b 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -4264,6 +4264,56 @@ static void disconnected_callback(uint16_t index, uint16_t length,
 	dev_disconnected(adapter, &ev->addr, reason);
 }
 
+static void connected_callback(uint16_t index, uint16_t length,
+					const void *param, void *user_data)
+{
+	const struct mgmt_ev_device_connected *ev = param;
+	struct btd_adapter *adapter = user_data;
+	struct btd_device *device;
+	struct eir_data eir_data;
+	uint16_t eir_len;
+	char addr[18];
+
+	if (length < sizeof(*ev)) {
+		error("Too small device connected event");
+		return;
+	}
+
+	eir_len = btohs(ev->eir_len);
+	if (length < sizeof(*ev) + eir_len) {
+		error("Too small device connected event");
+		return;
+	}
+
+	ba2str(&ev->addr.bdaddr, addr);
+
+	DBG("hci%u device %s connected eir_len %u", index, addr, eir_len);
+
+	device = adapter_get_device(adapter, addr, ev->addr.type);
+	if (!device) {
+		error("Unable to get device object for %s", addr);
+		return;
+	}
+
+	memset(&eir_data, 0, sizeof(eir_data));
+	if (eir_len > 0)
+		eir_parse(&eir_data, ev->eir, eir_len);
+
+	if (eir_data.class != 0)
+		device_set_class(device, eir_data.class);
+
+	adapter_add_connection(adapter, device);
+
+	if (eir_data.name != NULL) {
+		const bdaddr_t *bdaddr = adapter_get_address(adapter);
+		adapter_store_cached_name(bdaddr, &ev->addr.bdaddr,
+								eir_data.name);
+		device_set_name(device, eir_data.name);
+	}
+
+	eir_data_free(&eir_data);
+}
+
 static void read_info_complete(uint8_t status, uint16_t length,
 					const void *param, void *user_data)
 {
@@ -4343,6 +4393,11 @@ static void read_info_complete(uint8_t status, uint16_t length,
 						disconnected_callback,
 						adapter, NULL);
 
+	mgmt_register(adapter->mgmt, MGMT_EV_DEVICE_CONNECTED,
+						adapter->dev_id,
+						connected_callback,
+						adapter, NULL);
+
 	set_dev_class(adapter, adapter->major_class, adapter->minor_class);
 
 	set_name(adapter, btd_adapter_get_name(adapter));
diff --git a/src/mgmt.c b/src/mgmt.c
index 10f21d1..30bf4e3 100644
--- a/src/mgmt.c
+++ b/src/mgmt.c
@@ -178,52 +178,6 @@ static void mgmt_new_link_key(uint16_t index, void *buf, size_t len)
 	bonding_complete(index, &ev->key.addr, 0);
 }
 
-static void mgmt_device_connected(uint16_t index, void *buf, size_t len)
-{
-	struct mgmt_ev_device_connected *ev = buf;
-	struct eir_data eir_data;
-	struct btd_adapter *adapter;
-	struct btd_device *device;
-	uint16_t eir_len;
-	char addr[18];
-
-	if (len < sizeof(*ev)) {
-		error("Too small device_connected event");
-		return;
-	}
-
-	eir_len = bt_get_le16(&ev->eir_len);
-	if (len < sizeof(*ev) + eir_len) {
-		error("Too small device_connected event");
-		return;
-	}
-
-	ba2str(&ev->addr.bdaddr, addr);
-
-	DBG("hci%u device %s connected eir_len %u", index, addr, eir_len);
-
-	if (!get_adapter_and_device(index, &ev->addr, &adapter, &device, true))
-		return;
-
-	memset(&eir_data, 0, sizeof(eir_data));
-	if (eir_len > 0)
-		eir_parse(&eir_data, ev->eir, eir_len);
-
-	if (eir_data.class != 0)
-		device_set_class(device, eir_data.class);
-
-	adapter_add_connection(adapter, device);
-
-	if (eir_data.name != NULL) {
-		const bdaddr_t *bdaddr = adapter_get_address(adapter);
-		adapter_store_cached_name(bdaddr, &ev->addr.bdaddr,
-								eir_data.name);
-		device_set_name(device, eir_data.name);
-	}
-
-	eir_data_free(&eir_data);
-}
-
 static void mgmt_connect_failed(uint16_t index, void *buf, size_t len)
 {
 	struct mgmt_ev_connect_failed *ev = buf;
@@ -1006,7 +960,7 @@ static gboolean mgmt_event(GIOChannel *channel, GIOCondition cond,
 		mgmt_new_link_key(index, buf + MGMT_HDR_SIZE, len);
 		break;
 	case MGMT_EV_DEVICE_CONNECTED:
-		mgmt_device_connected(index, buf + MGMT_HDR_SIZE, len);
+		DBG("device_connected event");
 		break;
 	case MGMT_EV_DEVICE_DISCONNECTED:
 		DBG("device_disconnected event");