From ee33a0705e529b66d9e8fc85381bc2efa0e43457 Mon Sep 17 00:00:00 2001 From: Johan Hedberg Date: Tue, 23 Sep 2008 23:22:31 -0700 Subject: Use a common timeout for hci commands --- src/adapter.c | 42 +++++++++++++++++++++++------------------- src/dbus-hci.c | 25 +++++++++++++------------ src/hcid.h | 3 +++ 3 files changed, 39 insertions(+), 31 deletions(-) diff --git a/src/adapter.c b/src/adapter.c index 94171eb7..0f21f2a1 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -353,7 +353,8 @@ int pending_remote_name_cancel(struct btd_adapter *adapter) dev = l->data; - if (hci_read_remote_name_cancel(dd, &dev->bdaddr, 1000) < 0) { + if (hci_read_remote_name_cancel(dd, &dev->bdaddr, + HCI_REQ_TIMEOUT) < 0) { error("Remote name cancel failed: %s(%d)", strerror(errno), errno); err = -errno; } @@ -560,7 +561,7 @@ static DBusMessage *set_mode(DBusConnection *conn, DBusMessage *msg, rq.rlen = sizeof(status); rq.event = EVT_CMD_COMPLETE; - if (hci_send_req(dd, &rq, 1000) < 0) { + if (hci_send_req(dd, &rq, HCI_REQ_TIMEOUT) < 0) { err = errno; error("Sending write scan enable command failed: %s (%d)", strerror(errno), errno); @@ -839,7 +840,8 @@ static void update_ext_inquiry_response(int dd, struct hci_dev *dev) if (dev->ssp_mode > 0) create_ext_inquiry_response((char *) dev->name, data); - if (hci_write_ext_inquiry_response(dd, fec, data, 2000) < 0) + if (hci_write_ext_inquiry_response(dd, fec, data, + HCI_REQ_TIMEOUT) < 0) error("Can't write extended inquiry response: %s (%d)", strerror(errno), errno); } @@ -862,7 +864,7 @@ static int adapter_set_name(struct btd_adapter *adapter, const char *name) return -err; } - if (hci_write_local_name(dd, name, 5000) < 0) { + if (hci_write_local_name(dd, name, HCI_REQ_TIMEOUT) < 0) { err = errno; error("Can't write name for hci%d: %s (%d)", adapter->dev_id, strerror(err), err); @@ -998,7 +1000,7 @@ static DBusMessage *remove_bonding(DBusConnection *conn, DBusMessage *msg, } /* Delete the link key from the Bluetooth chip */ - hci_delete_stored_link_key(dev, &dst, 0, 1000); + hci_delete_stored_link_key(dev, &dst, 0, HCI_REQ_TIMEOUT); /* find the connection */ l = g_slist_find_custom(adapter->active_conn, &dst, @@ -1007,7 +1009,8 @@ static DBusMessage *remove_bonding(DBusConnection *conn, DBusMessage *msg, struct active_conn_info *con = l->data; /* Send the HCI disconnect command */ if ((hci_disconnect(dev, htobs(con->handle), - HCI_OE_USER_ENDED_CONNECTION, 500) < 0) + HCI_OE_USER_ENDED_CONNECTION, + HCI_REQ_TIMEOUT) < 0) && msg){ int err = errno; error("Disconnect failed"); @@ -1199,7 +1202,7 @@ static gboolean create_bonding_conn_complete(GIOChannel *io, GIOCondition cond, rq.rlen = EVT_CMD_STATUS_SIZE; rq.event = EVT_CMD_STATUS; - if (hci_send_req(dd, &rq, 500) < 0) { + if (hci_send_req(dd, &rq, HCI_REQ_TIMEOUT) < 0) { error("Unable to send HCI request: %s (%d)", strerror(errno), errno); error_failed_errno(adapter->bonding->conn, adapter->bonding->msg, @@ -1396,7 +1399,7 @@ int start_inquiry(struct btd_adapter *adapter) rq.rlen = EVT_CMD_STATUS_SIZE; rq.event = EVT_CMD_STATUS; - if (hci_send_req(dd, &rq, 500) < 0) { + if (hci_send_req(dd, &rq, HCI_REQ_TIMEOUT) < 0) { err = errno; error("Unable to start inquiry: %s (%d)", strerror(err), err); @@ -1447,7 +1450,7 @@ static int start_periodic_inquiry(struct btd_adapter *adapter) rq.rlen = sizeof(status); rq.event = EVT_CMD_COMPLETE; - if (hci_send_req(dd, &rq, 1000) < 0) { + if (hci_send_req(dd, &rq, HCI_REQ_TIMEOUT) < 0) { err = errno; error("Unable to start periodic inquiry: %s (%d)", strerror(err), err); @@ -2125,7 +2128,7 @@ static int adapter_read_bdaddr(uint16_t dev_id, bdaddr_t *bdaddr) return -err; } - if (hci_read_bd_addr(dd, bdaddr, 2000) < 0) { + if (hci_read_bd_addr(dd, bdaddr, HCI_REQ_TIMEOUT) < 0) { err = errno; error("Can't read address for hci%d: %s (%d)", dev_id, strerror(err), err); @@ -2180,7 +2183,7 @@ static int adapter_setup(struct btd_adapter *adapter, int dd) if (read_local_name(&adapter->bdaddr, name) == 0) { memcpy(dev->name, name, 248); - hci_write_local_name(dd, name, 5000); + hci_write_local_name(dd, name, HCI_REQ_TIMEOUT); } update_ext_inquiry_response(dd, dev); @@ -2189,7 +2192,7 @@ static int adapter_setup(struct btd_adapter *adapter, int dd) if (inqmode < 1) return 0; - if (hci_write_inquiry_mode(dd, inqmode, 2000) < 0) { + if (hci_write_inquiry_mode(dd, inqmode, HCI_REQ_TIMEOUT) < 0) { err = errno; error("Can't write inquiry mode for %s: %s (%d)", adapter->path, strerror(err), err); @@ -2439,7 +2442,7 @@ int adapter_start(struct btd_adapter *adapter) return -err; } - if (hci_read_local_version(dd, &ver, 1000) < 0) { + if (hci_read_local_version(dd, &ver, HCI_REQ_TIMEOUT) < 0) { err = errno; error("Can't read version info for %s: %s (%d)", adapter->path, strerror(err), err); @@ -2452,7 +2455,7 @@ int adapter_start(struct btd_adapter *adapter) dev->lmp_subver = ver.lmp_subver; dev->manufacturer = ver.manufacturer; - if (hci_read_local_features(dd, features, 1000) < 0) { + if (hci_read_local_features(dd, features, HCI_REQ_TIMEOUT) < 0) { err = errno; error("Can't read features for %s: %s (%d)", adapter->path, strerror(err), err); @@ -2462,7 +2465,7 @@ int adapter_start(struct btd_adapter *adapter) memcpy(dev->features, features, 8); - if (hci_read_class_of_dev(dd, dev->class, 1000) < 0) { + if (hci_read_class_of_dev(dd, dev->class, HCI_REQ_TIMEOUT) < 0) { err = errno; error("Can't read class of adapter on %s: %s (%d)", adapter->path, strerror(err), err); @@ -2470,7 +2473,7 @@ int adapter_start(struct btd_adapter *adapter) return -err; } - if (hci_read_local_name(dd, sizeof(name), name, 2000) < 0) { + if (hci_read_local_name(dd, sizeof(name), name, HCI_REQ_TIMEOUT) < 0) { err = errno; error("Can't read local name on %s: %s (%d)", adapter->path, strerror(err), err); @@ -2484,9 +2487,10 @@ int adapter_start(struct btd_adapter *adapter) goto setup; if (ioctl(dd, HCIGETAUTHINFO, NULL) < 0 && errno != EINVAL) - hci_write_simple_pairing_mode(dd, 0x01, 2000); + hci_write_simple_pairing_mode(dd, 0x01, HCI_REQ_TIMEOUT); - if (hci_read_simple_pairing_mode(dd, &dev->ssp_mode, 1000) < 0) { + if (hci_read_simple_pairing_mode(dd, &dev->ssp_mode, + HCI_REQ_TIMEOUT) < 0) { err = errno; error("Can't read simple pairing mode on %s: %s (%d)", adapter->path, strerror(err), err); @@ -2797,7 +2801,7 @@ static gboolean discov_timeout_handler(void *data) rq.rlen = sizeof(status); rq.event = EVT_CMD_COMPLETE; - if (hci_send_req(dd, &rq, 1000) < 0) { + if (hci_send_req(dd, &rq, HCI_REQ_TIMEOUT) < 0) { error("Sending write scan enable command to hci%d failed: %s (%d)", dev_id, strerror(errno), errno); goto failed; diff --git a/src/dbus-hci.c b/src/dbus-hci.c index 44700127..007f0936 100644 --- a/src/dbus-hci.c +++ b/src/dbus-hci.c @@ -656,7 +656,7 @@ static int found_device_req_name(struct btd_adapter *adapter) bacpy(&cp.bdaddr, &dev->bdaddr); cp.pscan_rep_mode = 0x02; - if (hci_send_req(dd, &rq, 500) < 0) + if (hci_send_req(dd, &rq, HCI_REQ_TIMEOUT) < 0) error("Unable to send the HCI remote name request: %s (%d)", strerror(errno), errno); @@ -1160,7 +1160,7 @@ int set_limited_discoverable(int dd, const uint8_t *cls, gboolean limited) * 1: giac * 2: giac + liac */ - if (hci_write_current_iac_lap(dd, num, lap, 1000) < 0) { + if (hci_write_current_iac_lap(dd, num, lap, HCI_REQ_TIMEOUT) < 0) { err = errno; error("Can't write current IAC LAP: %s(%d)", strerror(err), err); @@ -1179,7 +1179,7 @@ int set_limited_discoverable(int dd, const uint8_t *cls, gboolean limited) dev_class = (cls[2] << 16) | ((cls[1] & 0xdf) << 8) | cls[0]; } - if (hci_write_class_of_dev(dd, dev_class, 1000) < 0) { + if (hci_write_class_of_dev(dd, dev_class, HCI_REQ_TIMEOUT) < 0) { err = errno; error("Can't write class of device: %s (%d)", strerror(err), err); @@ -1199,7 +1199,7 @@ int set_service_classes(int dd, const uint8_t *cls, uint8_t value) dev_class = (value << 16) | (cls[1] << 8) | cls[0]; - if (hci_write_class_of_dev(dd, dev_class, 1000) < 0) { + if (hci_write_class_of_dev(dd, dev_class, HCI_REQ_TIMEOUT) < 0) { err = errno; error("Can't write class of device: %s (%d)", strerror(err), err); @@ -1239,7 +1239,7 @@ void hcid_dbus_setname_complete(bdaddr_t *local) rq.rlen = READ_LOCAL_NAME_RP_SIZE; rq.event = EVT_CMD_COMPLETE; - if (hci_send_req(dd, &rq, 1000) < 0) { + if (hci_send_req(dd, &rq, HCI_REQ_TIMEOUT) < 0) { error("Sending getting name command failed: %s (%d)", strerror(errno), errno); rp.name[0] = '\0'; @@ -1285,7 +1285,7 @@ void hcid_dbus_setscan_enable_complete(bdaddr_t *local) rq.rlen = READ_SCAN_ENABLE_RP_SIZE; rq.event = EVT_CMD_COMPLETE; - if (hci_send_req(dd, &rq, 1000) < 0) { + if (hci_send_req(dd, &rq, HCI_REQ_TIMEOUT) < 0) { error("Sending read scan enable command failed: %s (%d)", strerror(errno), errno); goto failed; @@ -1328,7 +1328,7 @@ void hcid_dbus_write_class_complete(bdaddr_t *local) return; } - if (hci_read_class_of_dev(dd, cls, 1000) < 0) { + if (hci_read_class_of_dev(dd, cls, HCI_REQ_TIMEOUT) < 0) { error("Can't read class of device on hci%d: %s (%d)", dev_id, strerror(errno), errno); hci_close_dev(dd); @@ -1364,7 +1364,8 @@ void hcid_dbus_write_simple_pairing_mode_complete(bdaddr_t *local) return; } - if (hci_read_simple_pairing_mode(dd, &mode, 1000) < 0) { + if (hci_read_simple_pairing_mode(dd, &mode, + HCI_REQ_TIMEOUT) < 0) { error("Can't read class of adapter on %s: %s(%d)", path, strerror(errno), errno); hci_close_dev(dd); @@ -1533,13 +1534,13 @@ int cancel_discovery(struct btd_adapter *adapter) dev = adapter_search_found_devices(adapter, &match); if (dev) { - if (remote_name_cancel(dd, &dev->bdaddr, 1000) < 0) { + if (remote_name_cancel(dd, &dev->bdaddr, HCI_REQ_TIMEOUT) < 0) { error("Read remote name cancel failed: %s, (%d)", strerror(errno), errno); err = -errno; } } else { - if (inquiry_cancel(dd, 1000) < 0) { + if (inquiry_cancel(dd, HCI_REQ_TIMEOUT) < 0) { error("Inquiry cancel failed:%s (%d)", strerror(errno), errno); err = -errno; @@ -1591,7 +1592,7 @@ int cancel_periodic_discovery(struct btd_adapter *adapter) dev = adapter_search_found_devices(adapter, &match); if (dev) { - if (remote_name_cancel(dd, &dev->bdaddr, 1000) < 0) { + if (remote_name_cancel(dd, &dev->bdaddr, HCI_REQ_TIMEOUT) < 0) { error("Read remote name cancel failed: %s, (%d)", strerror(errno), errno); err = -errno; @@ -1600,7 +1601,7 @@ int cancel_periodic_discovery(struct btd_adapter *adapter) /* ovewrite err if necessary: stop periodic inquiry has higher * priority */ - if (periodic_inquiry_exit(dd, 1000) < 0) { + if (periodic_inquiry_exit(dd, HCI_REQ_TIMEOUT) < 0) { error("Periodic Inquiry exit failed:%s (%d)", strerror(errno), errno); err = -errno; diff --git a/src/hcid.h b/src/hcid.h index 687481c3..fc8b446f 100644 --- a/src/hcid.h +++ b/src/hcid.h @@ -45,6 +45,9 @@ #define HCID_OFFMODE_DEVDOWN 0 #define HCID_OFFMODE_NOSCAN 1 +/* Timeout for hci_send_req (milliseconds) */ +#define HCI_REQ_TIMEOUT 5000 + struct main_opts { char host_name[40]; unsigned long flags; -- cgit