diff --git a/src/adapter.c b/src/adapter.c
index f139166..536edb1 100644
--- a/src/adapter.c
+++ b/src/adapter.c
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)
{
}
if (mgmt_powered(adapter->current_settings))
- mgmt_stop_discovery(adapter->dev_id, adapter->discov_type);
+ mgmt_stop_discovery(adapter);
else
discovery_cleanup(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;
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;
}
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));
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;
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,
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);
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
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
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;
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");
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;
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);
}
}
-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
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);