return err;
}
+int adapter_resolve_names(struct btd_adapter *adapter)
+{
+ remote_name_req_cp cp;
+ struct remote_dev_info *dev, match;
+ int dd, err;
+
+ memset(&match, 0, sizeof(struct remote_dev_info));
+ bacpy(&match.bdaddr, BDADDR_ANY);
+ match.name_status = NAME_REQUIRED;
+
+ dev = adapter_search_found_devices(adapter, &match);
+ if (!dev)
+ return -ENODATA;
+
+ dd = hci_open_dev(adapter->dev_id);
+ if (dd < 0)
+ return -errno;
+
+ /* send at least one request or return failed if the list is empty */
+ do {
+ /* flag to indicate the current remote name requested */
+ dev->name_status = NAME_REQUESTED;
+
+ memset(&cp, 0, sizeof(cp));
+ bacpy(&cp.bdaddr, &dev->bdaddr);
+ cp.pscan_rep_mode = 0x02;
+
+ err = hci_send_cmd(dd, OGF_LINK_CTL, OCF_REMOTE_NAME_REQ,
+ REMOTE_NAME_REQ_CP_SIZE, &cp);
+
+ if (!err)
+ break;
+
+ error("Unable to send HCI remote name req: %s (%d)",
+ strerror(errno), errno);
+
+ /* if failed, request the next element */
+ /* remove the element from the list */
+ adapter_remove_found_device(adapter, &dev->bdaddr);
+
+ /* get the next element */
+ dev = adapter_search_found_devices(adapter, &match);
+ } while (dev);
+
+ hci_close_dev(dd);
+
+ if (err < 0)
+ err = -errno;
+
+ return err;
+}
+
static const char *mode2str(uint8_t mode)
{
switch(mode) {
int pending_remote_name_cancel(struct btd_adapter *adapter);
+int adapter_resolve_names(struct btd_adapter *adapter);
+
void clear_found_devices_list(struct btd_adapter *adapter);
struct btd_adapter *adapter_create(DBusConnection *conn, int id,
device_simple_pairing_complete(device, status);
}
-int found_device_req_name(struct btd_adapter *adapter)
-{
- struct hci_request rq;
- evt_cmd_status rp;
- remote_name_req_cp cp;
- struct remote_dev_info *dev, match;
- int dd, req_sent = 0;
- uint16_t dev_id = adapter_get_dev_id(adapter);
-
- memset(&match, 0, sizeof(struct remote_dev_info));
- bacpy(&match.bdaddr, BDADDR_ANY);
- match.name_status = NAME_REQUIRED;
-
- dev = adapter_search_found_devices(adapter, &match);
- if (!dev)
- return -ENODATA;
-
- dd = hci_open_dev(dev_id);
- if (dd < 0)
- return -errno;
-
- memset(&rq, 0, sizeof(rq));
- rq.ogf = OGF_LINK_CTL;
- rq.ocf = OCF_REMOTE_NAME_REQ;
- rq.cparam = &cp;
- rq.clen = REMOTE_NAME_REQ_CP_SIZE;
- rq.rparam = &rp;
- rq.rlen = EVT_CMD_STATUS_SIZE;
- rq.event = EVT_CMD_STATUS;
-
- /* send at least one request or return failed if the list is empty */
- do {
- /* flag to indicate the current remote name requested */
- dev->name_status = NAME_REQUESTED;
-
- memset(&rp, 0, sizeof(rp));
- memset(&cp, 0, sizeof(cp));
- bacpy(&cp.bdaddr, &dev->bdaddr);
- cp.pscan_rep_mode = 0x02;
-
- if (hci_send_req(dd, &rq, HCI_REQ_TIMEOUT) < 0)
- error("Unable to send HCI remote name req: %s (%d)",
- strerror(errno), errno);
-
- if (!rp.status) {
- req_sent = 1;
- break;
- }
-
- error("Remote name request failed with status 0x%02x",
- rp.status);
-
- /* if failed, request the next element */
- /* remove the element from the list */
- adapter_remove_found_device(adapter, &dev->bdaddr);
-
- /* get the next element */
- dev = adapter_search_found_devices(adapter, &match);
- } while (dev);
-
- hci_close_dev(dd);
-
- if (!req_sent)
- return -ENODATA;
-
- return 0;
-}
-
static char *extract_eir_name(uint8_t *data, uint8_t *type)
{
if (!data || !type)
adapter_remove_found_device(adapter, peer);
/* check if there is more devices to request names */
- if (found_device_req_name(adapter) == 0)
+ if (adapter_resolve_names(adapter) == 0)
return;
state = adapter_get_state(adapter);
*/
int hcid_dbus_request_pin(int dev, bdaddr_t *sba, struct hci_conn_info *ci);
-int found_device_req_name(struct btd_adapter *adapter);
void hcid_dbus_inquiry_result(bdaddr_t *local, bdaddr_t *peer, uint32_t class, int8_t rssi, uint8_t *data);
void hcid_dbus_remote_class(bdaddr_t *local, bdaddr_t *peer, uint32_t class);
void hcid_dbus_remote_name(bdaddr_t *local, bdaddr_t *peer, uint8_t status, char *name);
return;
}
- if (found_device_req_name(adapter) == 0)
+ if (adapter_resolve_names(adapter) == 0)
return;
state = adapter_get_state(adapter);