Add an API to set the link timeout.
Change-Id: I5abd8fc37e20a7916e84e624f883c7a1987b0587
diff --git a/src/adapter.c b/src/adapter.c
index 9e9bacd..bb2f320 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -1735,7 +1735,6 @@
ERROR_INTERFACE ".Failed",
"Failed to register sdp record");
- printf("npelly new handle %X\n", record->handle);
reply = dbus_message_new_method_return(msg);
dbus_message_append_args(reply,
DBUS_TYPE_UINT32, &record->handle,
@@ -1763,6 +1762,49 @@
return dbus_message_new_method_return(msg);
}
+static DBusMessage *set_link_timeout(DBusConnection *conn,
+ DBusMessage *msg, void *data)
+{
+ struct btd_adapter *adapter = data;
+ struct btd_device *device;
+ const char *path;
+ GSList *l;
+ uint32_t num_slots;
+ int dd, err;
+
+ if (!dbus_message_get_args(msg, NULL,
+ DBUS_TYPE_OBJECT_PATH, &path,
+ DBUS_TYPE_UINT32, &num_slots,
+ DBUS_TYPE_INVALID))
+ return invalid_args(msg);
+
+ l = g_slist_find_custom(adapter->devices,
+ path, (GCompareFunc) device_path_cmp);
+ if (!l)
+ return g_dbus_create_error(msg,
+ ERROR_INTERFACE ".DoesNotExist",
+ "Device does not exist");
+ device = l->data;
+ dd = hci_open_dev(adapter->dev_id);
+
+ if (dd < 0) {
+ err = -errno;
+ goto fail;
+ }
+
+ err = hci_write_link_supervision_timeout(dd,
+ htobs(device_get_handle(device)), htobs(num_slots), 1000);
+ hci_close_dev(dd);
+
+ if (err < 0) {
+ err = -errno;
+ goto fail;
+ }
+ return dbus_message_new_method_return(msg);
+fail:
+ return failed_strerror(msg, errno);
+}
+
static GDBusMethodTable adapter_methods[] = {
{ "GetProperties", "", "a{sv}",get_properties },
{ "SetProperty", "sv", "", set_property,
@@ -1788,6 +1830,7 @@
{ "UnregisterAgent", "o", "", unregister_agent },
{ "AddRfcommServiceRecord", "sttq", "u", add_rfcomm_service_record },
{ "RemoveServiceRecord", "u", "", remove_service_record },
+ { "SetLinkTimeout", "ou", "", set_link_timeout },
{ }
};
diff --git a/src/device.c b/src/device.c
index 2aaf5b8..5328db9 100644
--- a/src/device.c
+++ b/src/device.c
@@ -857,6 +857,11 @@
return (handle == device->handle);
}
+uint16_t device_get_handle(struct btd_device *device)
+{
+ return device->handle;
+}
+
guint device_add_disconnect_watch(struct btd_device *device,
disconnect_watch watch, void *user_data,
GDestroyNotify destroy)
diff --git a/src/device.h b/src/device.h
index 7f297c1..c6677dc 100644
--- a/src/device.h
+++ b/src/device.h
@@ -80,6 +80,7 @@
void device_set_renewed_key(struct btd_device *device, gboolean renewed);
void device_add_connection(struct btd_device *device, DBusConnection *conn,
uint16_t handle);
+uint16_t device_get_handle(struct btd_device *device);
void device_remove_connection(struct btd_device *device, DBusConnection *conn,
uint16_t handle);
gboolean device_has_connection(struct btd_device *device, uint16_t handle);