@@ -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.
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com> This implements AutoConnect filter option in SetFilterPolicy method according to its documentation. --- src/adapter.c | 42 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 37 insertions(+), 5 deletions(-)