From patchwork Thu Nov 25 07:06:23 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Archie Pusaka X-Patchwork-Id: 518207 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 65E93C433F5 for ; Thu, 25 Nov 2021 07:08:36 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1353010AbhKYHLq (ORCPT ); Thu, 25 Nov 2021 02:11:46 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46246 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1346039AbhKYHJp (ORCPT ); Thu, 25 Nov 2021 02:09:45 -0500 Received: from mail-qk1-x74a.google.com (mail-qk1-x74a.google.com [IPv6:2607:f8b0:4864:20::74a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6580BC0613D7 for ; Wed, 24 Nov 2021 23:06:34 -0800 (PST) Received: by mail-qk1-x74a.google.com with SMTP id bs14-20020a05620a470e00b0046b1e29f53cso4612036qkb.0 for ; Wed, 24 Nov 2021 23:06:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:message-id:mime-version:subject:from:to:cc; bh=xJEfcnM1gsdMRr8HvPxnxusNwcyfFwFCIfrv7825c8A=; b=b9sIUxSaDzS7aUvUKFlRjzWMx5Mc/pDyLThD08JjxtUok8dOj24husYmtiFKyevewl 8D22WSrmMjCWLU4v0U/MtHwsALa5uhL8VIXcmKcC058KsYv/IOoyvyVVxX0ujYyntrZs s4wf2Mnm0LxSnrZ8huHRVHYD60Z37p/ViaJGx34pKlZxipu2ZWI7ngVXD0oji45Raw5B v6CPuj/Y9t7Yp4AFQERY0P9QQfSSBMhlLTNor0nqjAiX7h/WTPwEnoV/rn5CbdBkpEnp tnUOtO02L8vldhBbyA2zn9WLVekLoJqcXAmraEkYyGjL/nfYjJsE3SrlQqw/HY/WafyU SL5g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:message-id:mime-version:subject:from:to:cc; bh=xJEfcnM1gsdMRr8HvPxnxusNwcyfFwFCIfrv7825c8A=; b=N9X4tqoNRQF04jSji/DoSHxT9n6Ob81y6koW5GFdAVRrszJZPnv4U/tRAUCXWt1gxj E5kSv5eh7Lpsi7SPjn2rtRV6xs8YsWnYUW4wZ4R0KyQT7CA51uJ1A+aIxvpWsnxEZgqZ UNvY4jPz3XrxK0NpZgfAs5yXQCNJyA9VCTNerPaoBTXwb3zzFdWwgOSkZZCBSHzqvz+s IfFLdsYDOSDbBN/6klfbt2dynxQVo5i8lAHBS4akUx1FUzuI+8XbsPMbVk4Pn5Epr3LK ZPvoU1idS0iVV+L7ke++Iw7gNYJyueSel/iXwCDt6ilAQVgFXQyFZ4XlS3akxPW2f7BT dIVA== X-Gm-Message-State: AOAM531Apwh6YWgSmDulL9BYaPrZVdNmNqMBqSE117nDt0hVaWFBgqo/ sG18lNW3kxxagvz/WGGyYGZZDY7ko06ftcLyHXj1BiPKVTrhE5hcx4CgbLsI7LZf/nbPms0F/Hm dWVhvJV6qryQFkrzJQ4Qoi+XmP56uik6dWQEbuhR5rvI8WEeRBjcNC9LIT9isO2ZDb0LA+xHQqe DR X-Google-Smtp-Source: ABdhPJwQzmyhxiG/c3ymbfBSttQQEZwfkazhTphTZYWEnFMm+FBKt6Wh3arvqOV7s4Am0Io47SjU765HIrxP X-Received: from apusaka-p920.tpe.corp.google.com ([2401:fa00:1:10:a5d9:6769:9abb:6b2]) (user=apusaka job=sendgmr) by 2002:a25:ac24:: with SMTP id w36mr4178435ybi.118.1637823993535; Wed, 24 Nov 2021 23:06:33 -0800 (PST) Date: Thu, 25 Nov 2021 15:06:23 +0800 Message-Id: <20211125150558.Bluez.v4.1.I78857808e0b20c6e4dd934b174d3f1106fe3402d@changeid> Mime-Version: 1.0 X-Mailer: git-send-email 2.34.0.rc2.393.gf8c9666880-goog Subject: [Bluez PATCH v4 1/5] mgmt: Add NAME_REQUEST_FAILED flag for device_found event From: Archie Pusaka To: linux-bluetooth , Luiz Augusto von Dentz , Marcel Holtmann Cc: CrosBT Upstreaming , Archie Pusaka , Miao-chen Chou Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org From: Archie Pusaka Report failure when resolving remote name to userspace. This is useful so the userspace can make an informed decision when to retry name resolving procedure. Reviewed-by: Miao-chen Chou --- Hi maintainers, This is the patch series for remote name request as was discussed here. https://patchwork.kernel.org/project/bluetooth/patch/20211028191805.1.I35b7f3a496f834de6b43a32f94b6160cb1467c94@changeid/ Please also review the corresponding kernel space change. Changes in v4: * New in this version, separated from the other patch. lib/mgmt.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/mgmt.h b/lib/mgmt.h index 9f34b7f28b..922a24367f 100644 --- a/lib/mgmt.h +++ b/lib/mgmt.h @@ -854,9 +854,10 @@ struct mgmt_ev_auth_failed { uint8_t status; } __packed; -#define MGMT_DEV_FOUND_CONFIRM_NAME 0x01 -#define MGMT_DEV_FOUND_LEGACY_PAIRING 0x02 -#define MGMT_DEV_FOUND_NOT_CONNECTABLE 0x04 +#define MGMT_DEV_FOUND_CONFIRM_NAME 0x01 +#define MGMT_DEV_FOUND_LEGACY_PAIRING 0x02 +#define MGMT_DEV_FOUND_NOT_CONNECTABLE 0x04 +#define MGMT_DEV_FOUND_NAME_REQUEST_FAILED 0x10 #define MGMT_EV_DEVICE_FOUND 0x0012 struct mgmt_ev_device_found { From patchwork Thu Nov 25 07:06:24 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Archie Pusaka X-Patchwork-Id: 516958 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id B1D5EC433EF for ; Thu, 25 Nov 2021 07:08:47 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1353482AbhKYHL5 (ORCPT ); Thu, 25 Nov 2021 02:11:57 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45408 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1346698AbhKYHJ4 (ORCPT ); Thu, 25 Nov 2021 02:09:56 -0500 Received: from mail-qk1-x749.google.com (mail-qk1-x749.google.com [IPv6:2607:f8b0:4864:20::749]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E2AAFC0613DD for ; Wed, 24 Nov 2021 23:06:39 -0800 (PST) Received: by mail-qk1-x749.google.com with SMTP id bp17-20020a05620a459100b0045e893f2ed8so5320875qkb.11 for ; Wed, 24 Nov 2021 23:06:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=SdCX7U5RfV227kEctgivJbJaXCmsb3Y16woIC7AjaLs=; b=Iq42RY6SkaiieVkrtqmXzMEh0f6lQZWepdNaMCCfhM57q8ttu8xcrl9PhWB2PI+bZJ mct38bGEswnd4RqfqZkcAuMncKrcA9TjLMswwxaqwHf9QDs/2tGoil3Rr/9bsgBRyp24 MCzbgcnFnqnfPJyV5u5nbdX6wb/FmJkdkCOtAK2loHqKKqT5MYO2bCo/zBe/A7FrjdG1 p2rmJemKbIXRinl07+UCjKnd0zq+5Whmc8pvtQr3XkWdQ/Vd/C7nNdCfFolCp64wnxt/ NNz2UkDxn/dMFpMuVm2w1cIDmejsO4QmVtRK9/uxzXkJJn6mzN9G+B+9p5nIyQnPyOqT ts7g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=SdCX7U5RfV227kEctgivJbJaXCmsb3Y16woIC7AjaLs=; b=dBLS3EFphZFJvGuKjcFTXMF6SJ2y3uuTJ1hNDYWN2rVjPWbFI7pImzHkrirbiSZtk0 gkj50tUJPNrp1wz5mU9ZJPKeGIKV4GSUwXY52L4tyX2MgkvdAUc1df6IxrSNh1twd2JN 1SB7LtlGG9OvL0FSoe/fRhrOWm9rqMmLLTugNXLaTyUp14U9p36CNBJEn1sDcOuA/ueo ZHCeG8UtOsP0pnfdmMWMJ8hThkufdCRgxo+MFBrt6vSi+2SRuGmUlOdNHNvfUZbtdAWV TQoPv/mUfUmrSyaUjKfkj9CrHQAOIbT/k1UUPTsYEIhISY1CxrMTE3ory0TVdThwVuHE RQog== X-Gm-Message-State: AOAM530PTtZ8KONsBqt2MzGCA6Y96UH/za/3yLm8l20s+dq738O8RtB5 jGBd6U2v6efVRwRo2zH0wWHSmYPsLDlFTe7hSSHJ7lH/3NszfS5avDHWfzRfkn8x8E29fWrljCr PZ3UxGy5XZhFEAEajB8i9IxWuRsZvO3mKOuSA3h2Y9qyImtzmHx+18rVx2lyE3h9sSG5wvLgF3v ti X-Google-Smtp-Source: ABdhPJwYd3S1tQd0Koy0pEkRDXv9EkXoRv82km+Ov6/XzvppLMfn6t8B76nhDhsqOGSJjEMO36XOeenU4JFa X-Received: from apusaka-p920.tpe.corp.google.com ([2401:fa00:1:10:a5d9:6769:9abb:6b2]) (user=apusaka job=sendgmr) by 2002:a5b:802:: with SMTP id x2mr4190008ybp.164.1637823999013; Wed, 24 Nov 2021 23:06:39 -0800 (PST) Date: Thu, 25 Nov 2021 15:06:24 +0800 In-Reply-To: <20211125150558.Bluez.v4.1.I78857808e0b20c6e4dd934b174d3f1106fe3402d@changeid> Message-Id: <20211125150558.Bluez.v4.2.I9fc087b25433a9347b2d8c8ff7a25fadf448ef49@changeid> Mime-Version: 1.0 References: <20211125150558.Bluez.v4.1.I78857808e0b20c6e4dd934b174d3f1106fe3402d@changeid> X-Mailer: git-send-email 2.34.0.rc2.393.gf8c9666880-goog Subject: [Bluez PATCH v4 2/5] Listen and process remote name resolving failure From: Archie Pusaka To: linux-bluetooth , Luiz Augusto von Dentz , Marcel Holtmann Cc: CrosBT Upstreaming , Archie Pusaka , Miao-chen Chou Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org From: Archie Pusaka When Remote Name Resolve ends with failure, record this occurrence and prevent remote name resolving for the same device for some time. Reviewed-by: Miao-chen Chou --- Changes in v4: * Use CLOCK_MONOTONIC for timekeeping. * Constant waiting time between retries instead of increasing. * Fix conflict merge with adv_monitor.c Changes in v3: * Rename MGMT const to align with the doc. Changes in v2: * Stay silent instead of sending MGMT_OP_CONFIRM_NAME with DONT_CARE flag. src/adapter.c | 16 +++++++++++++--- src/adapter.h | 1 + src/adv_monitor.c | 7 +++++-- src/device.c | 27 +++++++++++++++++++++++++++ src/device.h | 2 ++ 5 files changed, 48 insertions(+), 5 deletions(-) diff --git a/src/adapter.c b/src/adapter.c index 98616f17d2..c49f42cfbb 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -6979,6 +6979,7 @@ void btd_adapter_update_found_device(struct btd_adapter *adapter, uint8_t bdaddr_type, int8_t rssi, bool confirm, bool legacy, bool not_connectable, + bool name_resolve_failed, const uint8_t *data, uint8_t data_len, bool monitoring) { @@ -7076,6 +7077,9 @@ void btd_adapter_update_found_device(struct btd_adapter *adapter, device_set_legacy(dev, legacy); + if (name_resolve_failed) + device_name_resolve_fail(dev); + if (adapter->filtered_discovery) device_set_rssi_with_delta(dev, rssi, 0); else @@ -7146,7 +7150,10 @@ void btd_adapter_update_found_device(struct btd_adapter *adapter, if (g_slist_find(adapter->discovery_found, dev)) return; - if (confirm) + /* If name is unknown but it's not allowed to resolve, don't send + * MGMT_OP_CONFIRM_NAME. + */ + if (confirm && (name_known || device_is_name_resolve_allowed(dev))) confirm_name(adapter, bdaddr, bdaddr_type, name_known); adapter->discovery_found = g_slist_prepend(adapter->discovery_found, @@ -7196,8 +7203,9 @@ static void device_found_callback(uint16_t index, uint16_t length, uint32_t flags; bool confirm_name; bool legacy; - char addr[18]; bool not_connectable; + bool name_resolve_failed; + char addr[18]; if (length < sizeof(*ev)) { btd_error(adapter->dev_id, @@ -7227,10 +7235,12 @@ static void device_found_callback(uint16_t index, uint16_t length, confirm_name = (flags & MGMT_DEV_FOUND_CONFIRM_NAME); legacy = (flags & MGMT_DEV_FOUND_LEGACY_PAIRING); not_connectable = (flags & MGMT_DEV_FOUND_NOT_CONNECTABLE); + name_resolve_failed = (flags & MGMT_DEV_FOUND_NAME_REQUEST_FAILED); btd_adapter_update_found_device(adapter, &ev->addr.bdaddr, ev->addr.type, ev->rssi, confirm_name, - legacy, not_connectable, eir, eir_len, + legacy, not_connectable, + name_resolve_failed, eir, eir_len, false); } diff --git a/src/adapter.h b/src/adapter.h index 2815d4613f..35deb1d117 100644 --- a/src/adapter.h +++ b/src/adapter.h @@ -92,6 +92,7 @@ void btd_adapter_update_found_device(struct btd_adapter *adapter, uint8_t bdaddr_type, int8_t rssi, bool confirm, bool legacy, bool not_connectable, + bool name_resolve_failed, const uint8_t *data, uint8_t data_len, bool monitored); diff --git a/src/adv_monitor.c b/src/adv_monitor.c index bf7f2bed3b..602830e30b 100644 --- a/src/adv_monitor.c +++ b/src/adv_monitor.c @@ -1585,8 +1585,9 @@ static void adv_monitor_device_found_callback(uint16_t index, uint16_t length, uint32_t flags; bool confirm_name; bool legacy; - char addr[18]; bool not_connectable; + bool name_resolve_failed; + char addr[18]; if (length < sizeof(*ev)) { btd_error(adapter_id, @@ -1613,10 +1614,12 @@ static void adv_monitor_device_found_callback(uint16_t index, uint16_t length, confirm_name = (flags & MGMT_DEV_FOUND_CONFIRM_NAME); legacy = (flags & MGMT_DEV_FOUND_LEGACY_PAIRING); not_connectable = (flags & MGMT_DEV_FOUND_NOT_CONNECTABLE); + name_resolve_failed = (flags & MGMT_DEV_FOUND_NAME_REQUEST_FAILED); btd_adapter_update_found_device(adapter, &ev->addr.bdaddr, ev->addr.type, ev->rssi, confirm_name, - legacy, not_connectable, ad_data, + legacy, not_connectable, + name_resolve_failed, ad_data, ad_data_len, true); if (handle) { diff --git a/src/device.c b/src/device.c index 6b398bd396..a83cb61f8c 100644 --- a/src/device.c +++ b/src/device.c @@ -79,6 +79,8 @@ #define GATT_INCLUDE_UUID_STR "2802" #define GATT_CHARAC_UUID_STR "2803" +#define NAME_RESOLVE_RETRY_DELAY 300 /* seconds */ + static DBusConnection *dbus_conn = NULL; static unsigned service_state_cb_id; @@ -272,6 +274,8 @@ struct btd_device { GIOChannel *att_io; guint store_id; + + time_t name_resolve_failed_time; }; static const uint16_t uuid_list[] = { @@ -4389,6 +4393,29 @@ bool device_name_known(struct btd_device *device) return device->name[0] != '\0'; } +bool device_is_name_resolve_allowed(struct btd_device *device) +{ + struct timespec now; + + if (!device) + return false; + + clock_gettime(CLOCK_MONOTONIC, &now); + return now.tv_sec >= device->name_resolve_failed_time + + NAME_RESOLVE_RETRY_DELAY; +} + +void device_name_resolve_fail(struct btd_device *device) +{ + struct timespec now; + + if (!device) + return; + + clock_gettime(CLOCK_MONOTONIC, &now); + device->name_resolve_failed_time = now.tv_sec; +} + void device_set_class(struct btd_device *device, uint32_t class) { if (device->class == class) diff --git a/src/device.h b/src/device.h index b37a0a3d21..071576d6b3 100644 --- a/src/device.h +++ b/src/device.h @@ -25,6 +25,8 @@ void btd_device_device_set_name(struct btd_device *device, const char *name); void device_store_cached_name(struct btd_device *dev, const char *name); void device_get_name(struct btd_device *device, char *name, size_t len); bool device_name_known(struct btd_device *device); +bool device_is_name_resolve_allowed(struct btd_device *device); +void device_name_resolve_fail(struct btd_device *device); void device_set_class(struct btd_device *device, uint32_t class); void device_update_addr(struct btd_device *device, const bdaddr_t *bdaddr, uint8_t bdaddr_type); From patchwork Thu Nov 25 07:06:25 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Archie Pusaka X-Patchwork-Id: 518206 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 44806C433FE for ; Thu, 25 Nov 2021 07:08:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1353483AbhKYHL6 (ORCPT ); Thu, 25 Nov 2021 02:11:58 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46290 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1348674AbhKYHJ5 (ORCPT ); Thu, 25 Nov 2021 02:09:57 -0500 Received: from mail-qt1-x849.google.com (mail-qt1-x849.google.com [IPv6:2607:f8b0:4864:20::849]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 48C7AC0613E0 for ; Wed, 24 Nov 2021 23:06:45 -0800 (PST) Received: by mail-qt1-x849.google.com with SMTP id h8-20020a05622a170800b002acc8656e05so5187092qtk.7 for ; Wed, 24 Nov 2021 23:06:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=JVVmti1TF4GHlNN4453/y/m8aUQmdPpZK7g3QRcNjfg=; b=RRLbabke3uOltGkI4HXHdBLLDD/J3v3jKSIMitbT7iojTmSQEIQyle6U6uYNwW5PKp OygKWk8XZii+9KRwnO7W5MLI8JggPM7GFWk0py4fbT6wzLOgWLSFDQhCRLhgbfIjME8n CS9Ado2tT/Yt1pzMZtFMCetjtUa+eYYcwSpXnPieP9W+LXeeT/j4bVV+qBe6Wj4x0/b1 poNit4M+d5KZWEF8NlwURFBCtidQozMYzue+MYLuPVkf+RJjCi057+ZfhSsZqNzylWR6 rJVBf5M9D/wLwOT0HJTvJ/XtfD+bLl5m4nsQz88KBysGkBOUp26htniHWXrmEiUaL8rR jpPQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=JVVmti1TF4GHlNN4453/y/m8aUQmdPpZK7g3QRcNjfg=; b=2ACeqhVmif1aJDMLL82521w09eOhZOxe2VDX95nYYWnyjBByjqcE5dMcVFT1+dQIZn FINCOOp92di6pZe0AR0ZF1qGwPqe3pg82ds7rMqqcZFtA1prHXq5YY//tpgvqvzI9rLH Fqa+MkWLD6R3Zuz4yiuv4XrGtQu5/+TpFpS0z23+ibAnNf0ZcJHc0MmqPOZu7EjsBK7F VXWc1A4U2otWdA17ftqEMLkl79OdK+qW/wq8NJkF+9ltmBOxWjwm0uSjgKg1tFU7K6NB sQztLbY07Wyk6XhampFyy03aVZIT+8Gp/5J/LcMO63IbQPKtJVPcBAi2HK0nMaKUpi1S L94Q== X-Gm-Message-State: AOAM532RRAP3r6QXbocXXgUFGF0HwGCjSQ98cK0VszH+FUtWBprmDHVe 1VJI89cRLCIhrcj6w/IIBUI94L5qCk1LM5C+BAXmrPEjRNuwTsLGttmGPRZB8qic9UKte4awj7o zdgQL/txbe4Gwseul5SxpCR6mmsLS+1gQ5mXtbQ7xihYQ4jgcV1fVBx0koxrnpKLGZOw15+Djv8 AH X-Google-Smtp-Source: ABdhPJxQKLePo8y6Qsv6mGMYHVmmrIZjJjPlrvxuIJUac40AzF9UhGoberfIpp3vpqc+N+niQXUJYiXuGDc+ X-Received: from apusaka-p920.tpe.corp.google.com ([2401:fa00:1:10:a5d9:6769:9abb:6b2]) (user=apusaka job=sendgmr) by 2002:a25:b911:: with SMTP id x17mr3955460ybj.247.1637824004438; Wed, 24 Nov 2021 23:06:44 -0800 (PST) Date: Thu, 25 Nov 2021 15:06:25 +0800 In-Reply-To: <20211125150558.Bluez.v4.1.I78857808e0b20c6e4dd934b174d3f1106fe3402d@changeid> Message-Id: <20211125150558.Bluez.v4.3.I08d192861aa6b2025fbc575a7e0caffaa6170ed5@changeid> Mime-Version: 1.0 References: <20211125150558.Bluez.v4.1.I78857808e0b20c6e4dd934b174d3f1106fe3402d@changeid> X-Mailer: git-send-email 2.34.0.rc2.393.gf8c9666880-goog Subject: [Bluez PATCH v4 3/5] device: Save remote name request attempts into cache file From: Archie Pusaka To: linux-bluetooth , Luiz Augusto von Dentz , Marcel Holtmann Cc: CrosBT Upstreaming , Archie Pusaka , Miao-chen Chou Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org From: Archie Pusaka Since a peer device is potentially removed if not discovered for more than 30 seconds, we would lost the remote name request activity when the device is rediscovered. This could end up with a remote name request much sooner than we intend it to be. Therefore, put the RNR record into a cache file, so we can recover it when the peer device is rediscovered. Reviewed-by: Miao-chen Chou --- Changes in v4: * Modify cache to support changes in previous patch src/device.c | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 91 insertions(+), 3 deletions(-) diff --git a/src/device.c b/src/device.c index a83cb61f8c..44450b1132 100644 --- a/src/device.c +++ b/src/device.c @@ -567,6 +567,59 @@ void device_store_cached_name(struct btd_device *dev, const char *name) g_key_file_free(key_file); } +static void device_store_cached_name_resolve(struct btd_device *dev) +{ + char filename[PATH_MAX]; + char d_addr[18]; + GKeyFile *key_file; + GError *gerr = NULL; + char *data; + char *data_old; + gsize length = 0; + gsize length_old = 0; + uint64_t failed_time; + + if (device_address_is_private(dev)) { + DBG("Can't store name resolve for private addressed device %s", + dev->path); + return; + } + + ba2str(&dev->bdaddr, d_addr); + snprintf(filename, PATH_MAX, STORAGEDIR "/%s/cache/%s", + btd_adapter_get_storage_dir(dev->adapter), d_addr); + create_file(filename, 0600); + + key_file = g_key_file_new(); + if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) { + error("Unable to load key file from %s: (%s)", filename, + gerr->message); + g_error_free(gerr); + } + + failed_time = (uint64_t) dev->name_resolve_failed_time; + + data_old = g_key_file_to_data(key_file, &length_old, NULL); + + g_key_file_set_uint64(key_file, "NameResolving", "FailedTime", + failed_time); + + data = g_key_file_to_data(key_file, &length, NULL); + + if ((length != length_old) || (memcmp(data, data_old, length))) { + if (!g_file_set_contents(filename, data, length, &gerr)) { + error("Unable set contents for %s: (%s)", filename, + gerr->message); + g_error_free(gerr); + } + } + + g_free(data); + g_free(data_old); + + g_key_file_free(key_file); +} + static void browse_request_free(struct browse_req *req) { struct btd_device *device = req->device; @@ -3304,6 +3357,32 @@ failed: return str; } +static void load_cached_name_resolve(struct btd_device *device, + const char *local, const char *peer) +{ + char filename[PATH_MAX]; + GKeyFile *key_file; + uint64_t failed_time; + + if (device_address_is_private(device)) + return; + + snprintf(filename, PATH_MAX, STORAGEDIR "/%s/cache/%s", local, peer); + + key_file = g_key_file_new(); + + if (!g_key_file_load_from_file(key_file, filename, 0, NULL)) + goto failed; + + failed_time = g_key_file_get_uint64(key_file, "NameResolving", + "FailedTime", NULL); + + device->name_resolve_failed_time = failed_time; + +failed: + g_key_file_free(key_file); +} + static struct csrk_info *load_csrk(GKeyFile *key_file, const char *group) { struct csrk_info *csrk; @@ -4311,6 +4390,7 @@ struct btd_device *device_create(struct btd_adapter *adapter, struct btd_device *device; char dst[18]; char *str; + const char *storage_dir; ba2str(bdaddr, dst); DBG("dst %s", dst); @@ -4326,13 +4406,15 @@ struct btd_device *device_create(struct btd_adapter *adapter, else device->le = true; - str = load_cached_name(device, btd_adapter_get_storage_dir(adapter), - dst); + storage_dir = btd_adapter_get_storage_dir(adapter); + str = load_cached_name(device, storage_dir, dst); if (str) { strcpy(device->name, str); g_free(str); } + load_cached_name_resolve(device, storage_dir, dst); + return device; } @@ -4401,7 +4483,12 @@ bool device_is_name_resolve_allowed(struct btd_device *device) return false; clock_gettime(CLOCK_MONOTONIC, &now); - return now.tv_sec >= device->name_resolve_failed_time + + + /* If now < failed_time, it means the clock has somehow turned back, + * possibly because of system restart. Allow name request in this case. + */ + return now.tv_sec < device->name_resolve_failed_time || + now.tv_sec >= device->name_resolve_failed_time + NAME_RESOLVE_RETRY_DELAY; } @@ -4414,6 +4501,7 @@ void device_name_resolve_fail(struct btd_device *device) clock_gettime(CLOCK_MONOTONIC, &now); device->name_resolve_failed_time = now.tv_sec; + device_store_cached_name_resolve(device); } void device_set_class(struct btd_device *device, uint32_t class) From patchwork Thu Nov 25 07:06:26 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Archie Pusaka X-Patchwork-Id: 516957 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0F953C433F5 for ; Thu, 25 Nov 2021 07:08:54 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1353067AbhKYHME (ORCPT ); Thu, 25 Nov 2021 02:12:04 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45860 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1353110AbhKYHKD (ORCPT ); Thu, 25 Nov 2021 02:10:03 -0500 Received: from mail-qt1-x849.google.com (mail-qt1-x849.google.com [IPv6:2607:f8b0:4864:20::849]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5E8BFC0613E1 for ; Wed, 24 Nov 2021 23:06:51 -0800 (PST) Received: by mail-qt1-x849.google.com with SMTP id s6-20020a05622a018600b002b2d93b9c73so5186099qtw.9 for ; Wed, 24 Nov 2021 23:06:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=1JmPv41Z91ArBPDE/8zSxUM+kn7GRxB8GbDn4MVqK9I=; b=ckKDwxCAHL6iEO781TGHX9QR6KGRLAKqWAsOwzRV4TVwRClzjhgOuh+gFvk5dqnKx6 wIfZDfuq8Sh+whE8qD5ycCNS3HoCm2YBz0MV5UDV1n6IkzDhkcTZGXTHqn1z7P8KYLFe ugNvcXKQ7cH5HEVMw+mJOo40g0Lx1Rd2/ZoGdWZV3lj64X/HMbJ1tEyhpY4NyzI4JWy1 eROL/GUrT62CGknISDAD8DKb9mHhVc6ZE3J1qRT0BNnPdQCDRP+B5fq9YsFsatAk8iV0 AiPcTPfjsd8AvjCSgjfEXKvi7Pu1gQ0wLCenwW7B4HS5avGShTnomiedT/cnNh/B6sZK grjw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=1JmPv41Z91ArBPDE/8zSxUM+kn7GRxB8GbDn4MVqK9I=; b=MSeHDHYTvmKD8oVHRTeJdmkhZQmb4CKJtSGLdc3AQdHNs8UyBeR2nCgb42SihNHU4Y y4MHNZYCrvaZrnF7cYDKN89+ku6IzGVpz9zKA4GBmfnlaJoiJUUmFedtLEzNmH+U8I0B ofdXmAA5EJgKadDGaEETyALgeE7uEJgMNcAQ/hsJ6ge5HlFNW88TDf2IwGvg1ItyDhwl JCd3dDy5g3LrqvqJbEceGZLapxii70jUmtG8SBPxQhImMuByc6TfXjuLv1f6whwJAHxU GwfTa/f4iy0NQlTRF8stCHBN0bY9Ns4bISYTZtmVaOHcvi/gmXDrOvkImoaqmo6I71cA JXLw== X-Gm-Message-State: AOAM532Z86jFPE1DdIcQAsKyGxCVC8pXtBg+rniL00otVPnrYu7gbkfF YVwfeGD0JoWyfkepCJR6lVQ1Ei1RBle58YT6PO2VbJvbMGk27NCcciGbs8AsAQTOGvC0dRXpETU q4e4yPsdBa4lsvbcXYq6hunmeYY6KN1ruKB6Jptmv1ZA2H9b4T1yVD/jyBCKF19WB2v/wpFihK6 QY X-Google-Smtp-Source: ABdhPJxDGLEc9gkieENdvQUV6ZIi89Lcd1wOTKhbCE7ayxYvIn1FsutSHeiOVtfA4uh8UUspFZrgJetF4iD7 X-Received: from apusaka-p920.tpe.corp.google.com ([2401:fa00:1:10:a5d9:6769:9abb:6b2]) (user=apusaka job=sendgmr) by 2002:a5b:783:: with SMTP id b3mr3784586ybq.328.1637824010485; Wed, 24 Nov 2021 23:06:50 -0800 (PST) Date: Thu, 25 Nov 2021 15:06:26 +0800 In-Reply-To: <20211125150558.Bluez.v4.1.I78857808e0b20c6e4dd934b174d3f1106fe3402d@changeid> Message-Id: <20211125150558.Bluez.v4.4.Ia861c62203f9201b657a6e81f7612c5db415ac2c@changeid> Mime-Version: 1.0 References: <20211125150558.Bluez.v4.1.I78857808e0b20c6e4dd934b174d3f1106fe3402d@changeid> X-Mailer: git-send-email 2.34.0.rc2.393.gf8c9666880-goog Subject: [Bluez PATCH v4 4/5] main: add configurable RemoteNameRequestRetryDelay parameter From: Archie Pusaka To: linux-bluetooth , Luiz Augusto von Dentz , Marcel Holtmann Cc: CrosBT Upstreaming , Archie Pusaka , Miao-chen Chou Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org From: Archie Pusaka This specifies how long will the userspace ignore a peer with an unknown name after a failed remote name resolving procedure. The peer device can still be connected, this only prevents the remote name resolving procedure retry. Reviewed-by: Miao-chen Chou --- Changes in v4: * New in this version. src/btd.h | 1 + src/device.c | 4 +--- src/main.c | 19 ++++++++++++++++--- src/main.conf | 5 +++++ 4 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/btd.h b/src/btd.h index ff9f082f19..a805a40d7d 100644 --- a/src/btd.h +++ b/src/btd.h @@ -104,6 +104,7 @@ struct btd_opts { uint32_t tmpto; uint8_t privacy; bool device_privacy; + uint32_t name_request_retry_delay; struct btd_defaults defaults; diff --git a/src/device.c b/src/device.c index 44450b1132..0e2612825b 100644 --- a/src/device.c +++ b/src/device.c @@ -79,8 +79,6 @@ #define GATT_INCLUDE_UUID_STR "2802" #define GATT_CHARAC_UUID_STR "2803" -#define NAME_RESOLVE_RETRY_DELAY 300 /* seconds */ - static DBusConnection *dbus_conn = NULL; static unsigned service_state_cb_id; @@ -4489,7 +4487,7 @@ bool device_is_name_resolve_allowed(struct btd_device *device) */ return now.tv_sec < device->name_resolve_failed_time || now.tv_sec >= device->name_resolve_failed_time + - NAME_RESOLVE_RETRY_DELAY; + btd_opts.name_request_retry_delay; } void device_name_resolve_fail(struct btd_device *device) diff --git a/src/main.c b/src/main.c index 3adcdc1087..8cc2dfca61 100644 --- a/src/main.c +++ b/src/main.c @@ -55,9 +55,10 @@ #define BLUEZ_NAME "org.bluez" -#define DEFAULT_PAIRABLE_TIMEOUT 0 /* disabled */ -#define DEFAULT_DISCOVERABLE_TIMEOUT 180 /* 3 minutes */ -#define DEFAULT_TEMPORARY_TIMEOUT 30 /* 30 seconds */ +#define DEFAULT_PAIRABLE_TIMEOUT 0 /* disabled */ +#define DEFAULT_DISCOVERABLE_TIMEOUT 180 /* 3 minutes */ +#define DEFAULT_TEMPORARY_TIMEOUT 30 /* 30 seconds */ +#define DEFAULT_NAME_REQUEST_RETRY_DELAY 300 /* 5 minutes */ #define SHUTDOWN_GRACE_SECONDS 10 @@ -82,6 +83,7 @@ static const char *supported_options[] = { "JustWorksRepairing", "TemporaryTimeout", "Experimental", + "RemoteNameRequestRetryDelay", NULL }; @@ -816,6 +818,16 @@ static void parse_config(GKeyFile *config) g_strfreev(strlist); } + val = g_key_file_get_integer(config, "General", + "RemoteNameRequestRetryDelay", &err); + if (err) { + DBG("%s", err->message); + g_clear_error(&err); + } else { + DBG("RemoteNameRequestRetryDelay=%d", val); + btd_opts.name_request_retry_delay = val; + } + str = g_key_file_get_string(config, "GATT", "Cache", &err); if (err) { DBG("%s", err->message); @@ -927,6 +939,7 @@ static void init_defaults(void) btd_opts.name_resolv = TRUE; btd_opts.debug_keys = FALSE; btd_opts.refresh_discovery = TRUE; + btd_opts.name_request_retry_delay = DEFAULT_NAME_REQUEST_RETRY_DELAY; btd_opts.defaults.num_entries = 0; btd_opts.defaults.br.page_scan_type = 0xFFFF; diff --git a/src/main.conf b/src/main.conf index 0c41d77420..49b9e67550 100644 --- a/src/main.conf +++ b/src/main.conf @@ -119,6 +119,11 @@ # Defaults to false. #Experimental = false +# The duration to avoid retrying to resolve a peer's name, if the previous +# try failed. +# The value is in seconds. Default is 300, i.e. 5 minutes. +#RemoteNameRequestRetryDelay = 300 + [BR] # The following values are used to load default adapter parameters for BR/EDR. # BlueZ loads the values into the kernel before the adapter is powered if the From patchwork Thu Nov 25 07:06:27 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Archie Pusaka X-Patchwork-Id: 518205 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id D1951C433EF for ; Thu, 25 Nov 2021 07:08:57 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1353140AbhKYHMI (ORCPT ); Thu, 25 Nov 2021 02:12:08 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46342 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1353171AbhKYHKH (ORCPT ); Thu, 25 Nov 2021 02:10:07 -0500 Received: from mail-qk1-x74a.google.com (mail-qk1-x74a.google.com [IPv6:2607:f8b0:4864:20::74a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9AE37C061756 for ; Wed, 24 Nov 2021 23:06:56 -0800 (PST) Received: by mail-qk1-x74a.google.com with SMTP id az44-20020a05620a172c00b0046a828b4684so5301050qkb.22 for ; Wed, 24 Nov 2021 23:06:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=INm7pXDA0xyOS7X6mzWYKK1ZwjPVf1vUklVBZrsNc+k=; b=R82DHbFP06+V5YN3Esyqr6BcOyWB/UIEfyijXnz1vHpDKH3byYfRrHaEf6Ec2AzIeO CmoFr0HiLSOHWFkDBUmuXH8AU5WdXVGG7vJUXwadQVskF76nnpVTPDkfNaSPPMmSWBZ1 qKrlo/l4hfn6cTk/4B6iZbSYxZKz3WkukO91GGzPBNmX6pWexcxufuOlmKZnk3bU7Oip GVW9igHfoFzyg4jR7BsrS0eNBa1X1dDCno3XKySMSBURS1zdra5JWqvARNM0pJBKcvUv H3o7lssoPuk/Wtlbhyt1yBy23VFgGjmrJHH9ctaEMnVFWX5pKI+xH3NM24We8mOzyhtb YE4A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=INm7pXDA0xyOS7X6mzWYKK1ZwjPVf1vUklVBZrsNc+k=; b=joULibcu9MIpSu5Sh4sX+5QIyKB1OL9L7sNDQ962tP/rLEUKIkcE70i9uwHfN5KQlv cVy4Y3b14nNYudTA8g08aDus5RLCbbsGy1sYCqCG2eQjsDjoMsR3H4dQBYP6Jr/t5I+I 76OTUbv1PgRS03YJqMRt9aCyGMLQTL2BPqZeGjwnP2+6TpEZhoNNUZ/rkRwU6NGsUKCa j5MjEXY753Fqe6rzMkmeDqqpwBwo8F7gdrMTRWaJL1dK9UkKgz1pJrMROQhHMEQOalwo 7kMit+nO2bfY5vgacSiM67NXgEVS6GyIQ53U1xZv5SJ5tERLSFUdcl9q8+192feqoIkJ JMOw== X-Gm-Message-State: AOAM533tOxtezPqeRDSeq2b2wBVnnzyO8eKBmVqivh6bcsJoso26OVVY 58Pjn/2/t/jwej658z0yJ1g28WHirzvR/UfhW4uRHtRmOKCUy0bIv4jmRXM2zaoso8b7dhkDqf+ ytK94SZhbAsc30etL5JRvc9zOP3DWcbcnbPTHX0pc8OxetvGhcwm8FhomnTIDseJWSu7FxPg1XR WT X-Google-Smtp-Source: ABdhPJzTt3iUw9VBzajdS/omoIZ67rTg8S70JKJs38eoSuBxkexh9H5QuJjcBX2ErdeSM0lQ5uAgkOI4EyLw X-Received: from apusaka-p920.tpe.corp.google.com ([2401:fa00:1:10:a5d9:6769:9abb:6b2]) (user=apusaka job=sendgmr) by 2002:a25:cccf:: with SMTP id l198mr4048148ybf.238.1637824015751; Wed, 24 Nov 2021 23:06:55 -0800 (PST) Date: Thu, 25 Nov 2021 15:06:27 +0800 In-Reply-To: <20211125150558.Bluez.v4.1.I78857808e0b20c6e4dd934b174d3f1106fe3402d@changeid> Message-Id: <20211125150558.Bluez.v4.5.I29367ca288fc8f4fcc3b4063425b791501c6534c@changeid> Mime-Version: 1.0 References: <20211125150558.Bluez.v4.1.I78857808e0b20c6e4dd934b174d3f1106fe3402d@changeid> X-Mailer: git-send-email 2.34.0.rc2.393.gf8c9666880-goog Subject: [Bluez PATCH v4 5/5] doc: Add Name Request Fail flag in device found event From: Archie Pusaka To: linux-bluetooth , Luiz Augusto von Dentz , Marcel Holtmann Cc: CrosBT Upstreaming , Archie Pusaka Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org From: Archie Pusaka Userspace should use this new flag to decide whether to do the remote name resolving or not. --- Changes in v4: * Add information about NameResolving cache Changes in v3: * Update the flag name to be more inlined with the spec. Changes in v2: * Update docs to reflect not sending DONT_CARE flag behavior. doc/mgmt-api.txt | 7 +++++++ doc/settings-storage.txt | 11 ++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/doc/mgmt-api.txt b/doc/mgmt-api.txt index 1ab513eb17..ebe56afa44 100644 --- a/doc/mgmt-api.txt +++ b/doc/mgmt-api.txt @@ -4090,6 +4090,7 @@ Device Connected Event 1 Legacy Pairing 2 Reserved (not in use) 3 Initiated Connection + 4 Reserved (not in use) Device Disconnected Event @@ -4264,6 +4265,7 @@ Device Found Event 1 Legacy Pairing 2 Not Connectable 3 Reserved (not in use) + 4 Name Request Failed For the RSSI field a value of 127 indicates that the RSSI is not available. That can happen with Bluetooth 1.1 and earlier @@ -4286,6 +4288,11 @@ Device Found Event accept any connections. This can be indicated by Low Energy devices that are in broadcaster role. + The Name Request Failed flag indicates that name resolving + procedure has ended with failure for this device. The user space + should use this information to determine when is a good time to + retry the name resolving procedure. + Discovering Event ================= diff --git a/doc/settings-storage.txt b/doc/settings-storage.txt index 3c637c3521..26584f2015 100644 --- a/doc/settings-storage.txt +++ b/doc/settings-storage.txt @@ -179,7 +179,7 @@ Cache directory file format ============================ Each file, named by remote device address, may includes multiple groups -(General, ServiceRecords, Attributes, Endpoints). +(General, ServiceRecords, Attributes, Endpoints, NameResolving). In ServiceRecords, SDP records are stored using their handle as key (hexadecimal format). @@ -193,6 +193,9 @@ In "Endpoints" group A2DP remote endpoints are stored using the seid as key an entry which key is set to "LastUsed" which represented the last endpoint used. +In "NameResolving", information regarding remote name resolving are stored to +prevent wasting time resolving name for unresponsive devices. + [General] group contains: Name String Remote device friendly name @@ -247,6 +250,12 @@ Sample Attributes section: local and remote seids as hexadecimal encoded string. +[NameResolving] group contains: + + FailedTime Integer The last time we failed to complete name + resolving procedure, measured from an + arbitrary, fixed point in the past. + Info file format ================