diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2014-06-30 18:40:25 +0200 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2014-06-30 18:40:25 +0200 |
commit | e9d55bcbbef30ed3e2cf3e5a7e74d0749346926e (patch) | |
tree | effa182f0382e2acc07f18586ae7b83fb793d850 | |
parent | 1c7fa0811994c209e26d51d099a7bed7e09a6e04 (diff) | |
download | bluez-e9d55bcbbef30ed3e2cf3e5a7e74d0749346926e.tar.gz |
core: Add separate functions for auto-connect kernel devices
-rw-r--r-- | src/adapter.c | 62 | ||||
-rw-r--r-- | src/adapter.h | 4 | ||||
-rw-r--r-- | src/device.c | 5 |
3 files changed, 54 insertions, 17 deletions
diff --git a/src/adapter.c b/src/adapter.c index 215f38ecb..30d24c332 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -3105,23 +3105,8 @@ void adapter_connect_list_remove(struct btd_adapter *adapter, DBG("%s removed from %s's connect_list", device_get_path(device), adapter->system_name); - if (kernel_bg_scan) { - struct mgmt_cp_remove_device cp; - const bdaddr_t *bdaddr; - uint8_t bdaddr_type; - - bdaddr = device_get_address(device); - bdaddr_type = btd_device_get_bdaddr_type(device); - - memset(&cp, 0, sizeof(cp)); - bacpy(&cp.addr.bdaddr, bdaddr); - cp.addr.type = bdaddr_type; - - if (mgmt_send(adapter->mgmt, MGMT_OP_REMOVE_DEVICE, - adapter->dev_id, sizeof(cp), &cp, - NULL, NULL, NULL) > 0) - return; - } + if (kernel_bg_scan) + return; if (!adapter->connect_list) { stop_passive_scanning(adapter); @@ -3134,6 +3119,49 @@ void adapter_connect_list_remove(struct btd_adapter *adapter, trigger_passive_scanning(adapter); } +void adapter_auto_connect_add(struct btd_adapter *adapter, + struct btd_device *device) +{ + struct mgmt_cp_add_device cp; + const bdaddr_t *bdaddr; + uint8_t bdaddr_type; + + if (!kernel_bg_scan) + return; + + bdaddr = device_get_address(device); + bdaddr_type = btd_device_get_bdaddr_type(device); + + memset(&cp, 0, sizeof(cp)); + bacpy(&cp.addr.bdaddr, bdaddr); + cp.addr.type = bdaddr_type; + cp.action = 0x01; + + mgmt_send(adapter->mgmt, MGMT_OP_ADD_DEVICE, + adapter->dev_id, sizeof(cp), &cp, NULL, NULL, NULL); +} + +void adapter_auto_connect_remove(struct btd_adapter *adapter, + struct btd_device *device) +{ + struct mgmt_cp_remove_device cp; + const bdaddr_t *bdaddr; + uint8_t bdaddr_type; + + if (!kernel_bg_scan) + return; + + bdaddr = device_get_address(device); + bdaddr_type = btd_device_get_bdaddr_type(device); + + memset(&cp, 0, sizeof(cp)); + bacpy(&cp.addr.bdaddr, bdaddr); + cp.addr.type = bdaddr_type; + + mgmt_send(adapter->mgmt, MGMT_OP_REMOVE_DEVICE, + adapter->dev_id, sizeof(cp), &cp, NULL, NULL, NULL); +} + static void adapter_start(struct btd_adapter *adapter) { g_dbus_emit_property_changed(dbus_conn, adapter->path, diff --git a/src/adapter.h b/src/adapter.h index f88c33918..a214cf989 100644 --- a/src/adapter.h +++ b/src/adapter.h @@ -199,6 +199,10 @@ int adapter_connect_list_add(struct btd_adapter *adapter, struct btd_device *device); void adapter_connect_list_remove(struct btd_adapter *adapter, struct btd_device *device); +void adapter_auto_connect_add(struct btd_adapter *adapter, + struct btd_device *device); +void adapter_auto_connect_remove(struct btd_adapter *adapter, + struct btd_device *device); void btd_adapter_set_oob_handler(struct btd_adapter *adapter, struct oob_handler *handler); diff --git a/src/device.c b/src/device.c index 9de5e2f7e..23eb8aad6 100644 --- a/src/device.c +++ b/src/device.c @@ -4049,11 +4049,15 @@ static void device_set_auto_connect(struct btd_device *device, gboolean enable) DBG("%s auto connect: %d", addr, enable); + if (device->auto_connect == enable) + return; + device->auto_connect = enable; /* Disabling auto connect */ if (enable == FALSE) { adapter_connect_list_remove(device->adapter, device); + adapter_auto_connect_remove(device->adapter, device); return; } @@ -4064,6 +4068,7 @@ static void device_set_auto_connect(struct btd_device *device, gboolean enable) /* Enabling auto connect */ adapter_connect_list_add(device->adapter, device); + adapter_auto_connect_add(device->adapter, device); } static gboolean start_discovery(gpointer user_data) |