Diff between 8b62e8716358aef02af0fd89c12f7e60c398e8af and d4ed8789c1802ef5404d31d841ead3302580ef93

Changed Files

File Additions Deletions Status
src/adapter.c +70 -6 modified
src/adapter.h +0 -2 modified
src/mgmt.c +2 -90 modified
src/mgmt.h +0 -3 modified

Full Patch

diff --git a/src/adapter.c b/src/adapter.c
index f139166..536edb1 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -642,6 +642,20 @@ static void discovery_cleanup(struct btd_adapter *adapter)
 	g_free(discovery);
 }
 
+static int mgmt_stop_discovery(struct btd_adapter *adapter)
+{
+	struct mgmt_cp_stop_discovery cp;
+
+	cp.type = adapter->discov_type;
+
+	if (mgmt_send(adapter->mgmt, MGMT_OP_STOP_DISCOVERY,
+				adapter->dev_id, sizeof(cp), &cp,
+				NULL, NULL, NULL) > 0)
+		return 0;
+
+	return -EIO;
+}
+
 /* Called when a session gets removed or the adapter is stopped */
 static void stop_discovery(struct btd_adapter *adapter)
 {
@@ -659,7 +673,7 @@ static void stop_discovery(struct btd_adapter *adapter)
 	}
 
 	if (mgmt_powered(adapter->current_settings))
-		mgmt_stop_discovery(adapter->dev_id, adapter->discov_type);
+		mgmt_stop_discovery(adapter);
 	else
 		discovery_cleanup(adapter);
 }
@@ -1222,6 +1236,51 @@ sdp_list_t *btd_adapter_get_services(struct btd_adapter *adapter)
 	return adapter->services;
 }
 
+static void adapter_set_discovering(struct btd_adapter *adapter,
+						gboolean discovering);
+
+static void discovering_callback(uint16_t index, uint16_t length,
+					const void *param, void *user_data)
+{
+	const struct mgmt_ev_discovering *ev = param;
+	struct btd_adapter *adapter = user_data;
+
+	if (length < sizeof(*ev)) {
+		error("Too small discovering event");
+		return;
+	}
+
+	DBG("hci%u type %u discovering %u", index,
+					ev->type, ev->discovering);
+
+	adapter_set_discovering(adapter, ev->discovering);
+}
+
+static void start_discovery_complete(uint8_t status, uint16_t length,
+					const void *param, void *user_data)
+{
+	struct btd_adapter *adapter = user_data;
+
+	DBG("%s (0x%02x)", mgmt_errstr(status), status);
+
+	if (status != MGMT_STATUS_SUCCESS)
+		adapter_set_discovering(adapter, FALSE);
+}
+
+static int mgmt_start_discovery(struct btd_adapter *adapter)
+{
+	struct mgmt_cp_start_discovery cp;
+
+	cp.type = adapter->discov_type;
+
+	if (mgmt_send(adapter->mgmt, MGMT_OP_START_DISCOVERY,
+				adapter->dev_id, sizeof(cp), &cp,
+				start_discovery_complete, adapter, NULL) > 0)
+		return 0;
+
+	return -EIO;
+}
+
 static gboolean discovery_cb(gpointer user_data)
 {
 	struct btd_adapter *adapter = user_data;
@@ -1238,7 +1297,7 @@ static gboolean discovery_cb(gpointer user_data)
 				g_slist_length(adapter->disc_sessions) != 1)
 		hci_set_bit(BDADDR_BREDR, &adapter->discov_type);
 
-	mgmt_start_discovery(adapter->dev_id, adapter->discov_type);
+	mgmt_start_discovery(adapter);
 
 	return FALSE;
 }
@@ -1276,7 +1335,7 @@ static DBusMessage *adapter_start_discovery(DBusConnection *conn,
 		hci_set_bit(BDADDR_LE_RANDOM, &adapter->discov_type);
 	}
 
-	err = mgmt_start_discovery(adapter->dev_id, adapter->discov_type);
+	err = mgmt_start_discovery(adapter);
 	if (err < 0)
 		return btd_error_failed(msg, strerror(-err));
 
@@ -3367,7 +3426,7 @@ static gboolean adapter_remove_temp(gpointer data)
 	return FALSE;
 }
 
-void adapter_set_discovering(struct btd_adapter *adapter,
+static void adapter_set_discovering(struct btd_adapter *adapter,
 						gboolean discovering)
 {
 	guint connect_list_len;
@@ -3425,7 +3484,7 @@ static void suspend_discovery(struct btd_adapter *adapter)
 		g_source_remove(adapter->discov_id);
 		adapter->discov_id = 0;
 	} else
-		mgmt_stop_discovery(adapter->dev_id, adapter->discov_type);
+		mgmt_stop_discovery(adapter);
 }
 
 static gboolean clean_connecting_state(GIOChannel *io, GIOCondition cond,
@@ -3946,7 +4005,7 @@ void adapter_bonding_complete(struct btd_adapter *adapter,
 
 	if (adapter->discov_suspended) {
 		adapter->discov_suspended = FALSE;
-		mgmt_start_discovery(adapter->dev_id, adapter->discov_type);
+		mgmt_start_discovery(adapter);
 	}
 
 	check_oob_bonding_complete(adapter, bdaddr, status);
@@ -4204,6 +4263,11 @@ static void read_info_complete(uint8_t status, uint16_t length,
 						local_name_changed_callback,
 						adapter, NULL);
 
+	mgmt_register(adapter->mgmt, MGMT_EV_DISCOVERING,
+						adapter->dev_id,
+						discovering_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/adapter.h b/src/adapter.h
index d134a57..8f0276b 100644
--- a/src/adapter.h
+++ b/src/adapter.h
@@ -96,8 +96,6 @@ void adapter_remove_device(struct btd_adapter *adapter,
 						struct btd_device *device,
 						gboolean remove_storage);
 
-void adapter_set_discovering(struct btd_adapter *adapter,
-						gboolean discovering);
 const char *adapter_get_path(struct btd_adapter *adapter);
 const bdaddr_t *adapter_get_address(struct btd_adapter *adapter);
 void adapter_update_found_devices(struct btd_adapter *adapter,
diff --git a/src/mgmt.c b/src/mgmt.c
index bd19709..d5088b2 100644
--- a/src/mgmt.c
+++ b/src/mgmt.c
@@ -613,29 +613,6 @@ static void read_local_oob_data_complete(uint16_t index, void *buf, size_t len)
 							rp->randomizer);
 }
 
-static void start_discovery_complete(uint16_t index, uint8_t status,
-						     void *buf, size_t len)
-{
-	uint8_t *type = buf;
-	struct btd_adapter *adapter;
-
-	if (len != sizeof(*type)) {
-		error("start_discovery_complete event size mismatch "
-					"(%zu != %zu)", len, sizeof(*type));
-		return;
-	}
-
-	DBG("hci%u type %u status %u", index, *type, status);
-
-	if (!status)
-		return;
-
-	adapter = adapter_find_by_id(index);
-	if (adapter)
-		/* Start discovery failed, inform upper layers. */
-		adapter_set_discovering(adapter, FALSE);
-}
-
 static void read_local_oob_data_failed(uint16_t index)
 {
 	struct btd_adapter *adapter;
@@ -755,7 +732,7 @@ static void mgmt_cmd_complete(uint16_t index, void *buf, size_t len)
 		DBG("set_fast_connectable complete");
 		break;
 	case MGMT_OP_START_DISCOVERY:
-		start_discovery_complete(index, ev->status, ev->data, len);
+		DBG("start_discovery complete");
 		break;
 	case MGMT_OP_STOP_DISCOVERY:
 		DBG("stop_discovery complete");
@@ -858,26 +835,6 @@ static void mgmt_device_found(uint16_t index, void *buf, size_t len)
 					eir, eir_len);
 }
 
-static void mgmt_discovering(uint16_t index, void *buf, size_t len)
-{
-	struct mgmt_ev_discovering *ev = buf;
-	struct btd_adapter *adapter;
-
-	if (len < sizeof(*ev)) {
-		error("Too small discovering event");
-		return;
-	}
-
-	DBG("Controller %u type %u discovering %u", index,
-					ev->type, ev->discovering);
-
-	adapter = adapter_find_by_id(index);
-	if (!adapter)
-		return;
-
-	adapter_set_discovering(adapter, ev->discovering);
-}
-
 static void mgmt_device_blocked(uint16_t index, void *buf, size_t len)
 {
 	struct btd_adapter *adapter;
@@ -1131,7 +1088,7 @@ static gboolean mgmt_event(GIOChannel *channel, GIOCondition cond,
 		mgmt_device_found(index, buf + MGMT_HDR_SIZE, len);
 		break;
 	case MGMT_EV_DISCOVERING:
-		mgmt_discovering(index, buf + MGMT_HDR_SIZE, len);
+		DBG("discovering event");
 		break;
 	case MGMT_EV_DEVICE_BLOCKED:
 		mgmt_device_blocked(index, buf + MGMT_HDR_SIZE, len);
@@ -1216,51 +1173,6 @@ void mgmt_cleanup(void)
 	}
 }
 
-int mgmt_start_discovery(int index, uint8_t type)
-{
-	char buf[MGMT_HDR_SIZE + sizeof(struct mgmt_cp_start_discovery)];
-	struct mgmt_hdr *hdr = (void *) buf;
-	struct mgmt_cp_start_discovery *cp = (void *) &buf[sizeof(*hdr)];
-
-	DBG("index %d", index);
-
-	memset(buf, 0, sizeof(buf));
-	hdr->opcode = htobs(MGMT_OP_START_DISCOVERY);
-	hdr->len = htobs(sizeof(*cp));
-	hdr->index = htobs(index);
-
-	cp->type = type;
-
-	if (write(mgmt_sock, buf, sizeof(buf)) < 0) {
-		int err = -errno;
-		error("failed to write to MGMT socket: %s", strerror(-err));
-		return err;
-	}
-
-	return 0;
-}
-
-int mgmt_stop_discovery(int index, uint8_t type)
-{
-	char buf[MGMT_HDR_SIZE + sizeof(struct mgmt_cp_start_discovery)];
-	struct mgmt_hdr *hdr = (void *) buf;
-	struct mgmt_cp_start_discovery *cp = (void *) &buf[sizeof(*hdr)];
-
-	DBG("index %d", index);
-
-	memset(buf, 0, sizeof(buf));
-	hdr->opcode = htobs(MGMT_OP_STOP_DISCOVERY);
-	hdr->len = htobs(sizeof(*cp));
-	hdr->index = htobs(index);
-
-	cp->type = type;
-
-	if (write(mgmt_sock, buf, sizeof(buf)) < 0)
-		return -errno;
-
-	return 0;
-}
-
 int mgmt_block_device(int index, const bdaddr_t *bdaddr, uint8_t bdaddr_type)
 {
 	char buf[MGMT_HDR_SIZE + sizeof(struct mgmt_cp_block_device)];
diff --git a/src/mgmt.h b/src/mgmt.h
index 07fcd13..c7829ba 100644
--- a/src/mgmt.h
+++ b/src/mgmt.h
@@ -25,9 +25,6 @@
 int mgmt_setup(void);
 void mgmt_cleanup(void);
 
-int mgmt_start_discovery(int index, uint8_t type);
-int mgmt_stop_discovery(int index, uint8_t type);
-
 int mgmt_block_device(int index, const bdaddr_t *bdaddr, uint8_t bdaddr_type);
 int mgmt_unblock_device(int index, const bdaddr_t *bdaddr, uint8_t bdaddr_type);