From: Luiz Augusto von Dentz <luiz.von.dentz@xxxxxxxxx> This implements AutoConnect filter option in SetFilterPolicy method according to its documentation. --- src/adapter.c | 42 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 37 insertions(+), 5 deletions(-) diff --git a/src/adapter.c b/src/adapter.c index fd425e6d2fe4..328a6baa54d7 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -214,6 +214,7 @@ struct discovery_filter { GSList *uuids; bool duplicate; bool discoverable; + bool auto_connect; }; struct discovery_client { @@ -2697,6 +2698,21 @@ static bool parse_pattern(DBusMessageIter *value, return true; } +static bool parse_auto_connect(DBusMessageIter *value, + struct discovery_filter *filter) +{ + dbus_bool_t connect; + + if (dbus_message_iter_get_arg_type(value) != DBUS_TYPE_BOOLEAN) + return false; + + dbus_message_iter_get_basic(value, &connect); + + filter->auto_connect = connect; + + return true; +} + struct filter_parser { const char *name; bool (*func)(DBusMessageIter *iter, struct discovery_filter *filter); @@ -2708,6 +2724,7 @@ struct filter_parser { { "DuplicateData", parse_duplicate_data }, { "Discoverable", parse_discoverable }, { "Pattern", parse_pattern }, + { "AutoConnect", parse_auto_connect }, { } }; @@ -7212,7 +7229,7 @@ static void filter_duplicate_data(void *data, void *user_data) static bool device_is_discoverable(struct btd_adapter *adapter, struct eir_data *eir, const char *addr, - uint8_t bdaddr_type) + uint8_t bdaddr_type, bool *auto_connect) { GSList *l; bool discoverable; @@ -7242,15 +7259,21 @@ static bool device_is_discoverable(struct btd_adapter *adapter, discoverable = false; pattern_len = strlen(filter->pattern); - if (!pattern_len) + if (!pattern_len) { + *auto_connect = filter->auto_connect; return true; + } - if (!strncmp(filter->pattern, addr, pattern_len)) + if (!strncmp(filter->pattern, addr, pattern_len)) { + *auto_connect = filter->auto_connect; return true; + } if (eir->name && !strncmp(filter->pattern, eir->name, - pattern_len)) + pattern_len)) { + *auto_connect = filter->auto_connect; return true; + } } return discoverable; @@ -7274,6 +7297,7 @@ void btd_adapter_device_found(struct btd_adapter *adapter, bool name_resolve_failed; bool scan_rsp; bool duplicate = false; + bool auto_connect = false; struct queue *matched_monitors = NULL; confirm = (flags & MGMT_DEV_FOUND_CONFIRM_NAME); @@ -7310,7 +7334,7 @@ void btd_adapter_device_found(struct btd_adapter *adapter, ba2str(bdaddr, addr); discoverable = device_is_discoverable(adapter, &eir_data, addr, - bdaddr_type); + bdaddr_type, &auto_connect); dev = btd_adapter_find_device(adapter, bdaddr, bdaddr_type); if (!dev) { @@ -7483,6 +7507,14 @@ connect_le: if (adapter->connect_le) return; + /* If device has a pattern match and it also set auto-connect then + * attempt to connect. + */ + if (auto_connect) { + device_connect_le(dev); + return; + } + /* * If kernel background scan is used then the kernel is * responsible for connecting. -- 2.49.0