From d4ed8789c1802ef5404d31d841ead3302580ef93 Mon Sep 17 00:00:00 2001 From: Johan Hedberg Date: Sun, 6 Jan 2013 15:04:39 +0200 Subject: [PATCH] core: Move mgmt discovery handling into adapter code --- src/adapter.c | 76 ++++++++++++++++++++++++++++++++++++++---- src/adapter.h | 2 -- src/mgmt.c | 92 ++------------------------------------------------- src/mgmt.h | 3 -- 4 files changed, 72 insertions(+), 101 deletions(-) diff --git a/src/adapter.c b/src/adapter.c index f13916669..536edb106 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 d134a5751..8f0276bc8 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 bd1970978..d5088b2fe 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 07fcd1340..c7829baa3 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); -- 2.47.3