From patchwork Mon Nov 15 09:27:43 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Archie Pusaka X-Patchwork-Id: 518247 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 mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E824AC433F5 for ; Mon, 15 Nov 2021 09:28:41 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id C6CCC63217 for ; Mon, 15 Nov 2021 09:28:41 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237215AbhKOJbZ (ORCPT ); Mon, 15 Nov 2021 04:31:25 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42826 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237664AbhKOJas (ORCPT ); Mon, 15 Nov 2021 04:30:48 -0500 Received: from mail-yb1-xb4a.google.com (mail-yb1-xb4a.google.com [IPv6:2607:f8b0:4864:20::b4a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id ACE65C061200 for ; Mon, 15 Nov 2021 01:27:52 -0800 (PST) Received: by mail-yb1-xb4a.google.com with SMTP id y125-20020a25dc83000000b005c2326bf744so25665416ybe.21 for ; Mon, 15 Nov 2021 01:27:52 -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=91ciOFySGyuDGp8+cPG7rlk0H4CMpJHZ5FAL6tr2C1s=; b=Y35CzcjzdMgeCNFg4DGIZNjJMbr7YERqHFdAiW7+6y4VUVeDRYH64l/A2w2cpb09Uc C0VcUuzlNokXBOq/rz5vvVqfW/MD+ShqfTZNx9viVFgZj296MyDQfT4epKIbnoaBCeOI kIv9L00hQcQFcZ30CkwiTkDLdXAIaD3XX1bYJdI5g3M8C10PIE2sMOONfcWyqawn6Wx6 o6wQ1iulShJbCa94/jYp4qb9HstGIZS38/mMVMincqCC61mT3exhIcgJG65ki35bYot0 pb0QQzeBHSm/MhTMxJVzDxX7olto1tJs9jQmMWLL0qVzGnG0XH6GY6fPbDvOM68PyLxT h3tw== 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=91ciOFySGyuDGp8+cPG7rlk0H4CMpJHZ5FAL6tr2C1s=; b=vtWI9SShJKIiDewdoimSno9NMv6VMAzgz7cbCPS0MqsHiXduyt/8rLIWnXsq2Lyr7M ejgPXwTNZWd8scCxgB/D52576tjPbq9SHNFJ1qqf7OUZIdJ4PqsZz09dsJClLLu5PWw8 NuRRDVSuk2bFCf6xBEFsx824y0UcKIXwxC43RwsqoLLmnfCQjjluYka8L9UteaQN1jXi 5k5MrDvGc0r2LIBRsDG9I8e2ACiOxjFDubKna+/+fUgLBbW85sRrU1IXMmk905y23+G2 U2EYCwBZkrj9jac59fkf+zO2tCn04ukzMRWhooGO6PZqTpCToUBsBd3Lzt4ZifcFTJwF 86mQ== X-Gm-Message-State: AOAM530ojmfpQ+IBNmRRGa1DkF7an6abNaoxQu5Kp2xbGJ0yhdRkEjy5 njjA0ntqzN/uzWk5CuZrAGtYKjRYg/TvrpbmoJKMueu70WQlNqA7iFfzzx1sMAEqFrTkzF1DJre SyniGUcKY+LVv28Mzrwx7S2A15PjfD5/AoTHdz+YzeQDdRKWte9pU3uXZ52dGaGm5ZgO//BX9D8 /7 X-Google-Smtp-Source: ABdhPJwzfweH5+ht2lUZJdIirIF9gXts1R1zy9+rO72d9XSCrCQEuIbTG+vOzZcS16RSk6lDNjC0JVdb0+ES X-Received: from apusaka-p920.tpe.corp.google.com ([2401:fa00:1:10:5c8f:7191:e5ca:14fb]) (user=apusaka job=sendgmr) by 2002:a25:ac0b:: with SMTP id w11mr39004308ybi.163.1636968471932; Mon, 15 Nov 2021 01:27:51 -0800 (PST) Date: Mon, 15 Nov 2021 17:27:43 +0800 Message-Id: <20211115172714.Bluez.v3.1.I9fc087b25433a9347b2d8c8ff7a25fadf448ef49@changeid> Mime-Version: 1.0 X-Mailer: git-send-email 2.34.0.rc1.387.gb447b232ab-goog Subject: [Bluez PATCH v3 1/3] Listen and process remote name resolving failure 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 When Remote Name Resolve ends with failure, record this occurrence and prevent remote name resolving for the same device for some time. Increase the time duration for subsequent failures. --- 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 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. lib/mgmt.h | 1 + src/adapter.c | 15 +++++++++++++-- src/device.c | 23 +++++++++++++++++++++++ src/device.h | 2 ++ 4 files changed, 39 insertions(+), 2 deletions(-) diff --git a/lib/mgmt.h b/lib/mgmt.h index 0d1678f01d..d860b27401 100644 --- a/lib/mgmt.h +++ b/lib/mgmt.h @@ -856,6 +856,7 @@ struct mgmt_ev_auth_failed { #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 { diff --git a/src/adapter.c b/src/adapter.c index d0d38621b8..6100448b5f 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -6989,6 +6989,7 @@ static void update_found_devices(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) { struct btd_device *dev; @@ -7081,6 +7082,9 @@ static void update_found_devices(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 @@ -7151,7 +7155,10 @@ static void update_found_devices(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_name_resolve_allowed(dev))) confirm_name(adapter, bdaddr, bdaddr_type, name_known); adapter->discovery_found = g_slist_prepend(adapter->discovery_found, @@ -7201,6 +7208,8 @@ static void device_found_callback(uint16_t index, uint16_t length, uint32_t flags; bool confirm_name; bool legacy; + bool not_connectable; + bool name_resolve_failed; char addr[18]; if (length < sizeof(*ev)) { @@ -7230,10 +7239,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); update_found_devices(adapter, &ev->addr.bdaddr, ev->addr.type, ev->rssi, confirm_name, legacy, - flags & MGMT_DEV_FOUND_NOT_CONNECTABLE, + not_connectable, name_resolve_failed, eir, eir_len); } diff --git a/src/device.c b/src/device.c index fdc2d50a47..699faeba3b 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 120 /* seconds */ + static DBusConnection *dbus_conn = NULL; static unsigned service_state_cb_id; @@ -272,6 +274,9 @@ struct btd_device { GIOChannel *att_io; guint store_id; + + time_t name_resolve_earliest_allow_time; + uint8_t name_resolve_fail_count; }; static const uint16_t uuid_list[] = { @@ -4361,6 +4366,24 @@ bool device_name_known(struct btd_device *device) return device->name[0] != '\0'; } +bool device_name_resolve_allowed(struct btd_device *device) +{ + return time(NULL) >= device->name_resolve_earliest_allow_time; +} + +void device_name_resolve_fail(struct btd_device *device) +{ + if (!device) + return; + + /* Punish this device by not allowing name resolve for some time. + * increase punishment time for subsequent failures. + */ + device->name_resolve_fail_count++; + device->name_resolve_earliest_allow_time = time(NULL) + + NAME_RESOLVE_RETRY_DELAY * device->name_resolve_fail_count; +} + 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 5f615cb4b6..76d79855f8 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_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 Mon Nov 15 09:27:44 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Archie Pusaka X-Patchwork-Id: 518248 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 mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7C3F6C433F5 for ; Mon, 15 Nov 2021 09:28:30 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 55DA661C14 for ; Mon, 15 Nov 2021 09:28:30 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237629AbhKOJbV (ORCPT ); Mon, 15 Nov 2021 04:31:21 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42896 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237514AbhKOJbF (ORCPT ); Mon, 15 Nov 2021 04:31:05 -0500 Received: from mail-yb1-xb49.google.com (mail-yb1-xb49.google.com [IPv6:2607:f8b0:4864:20::b49]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C6454C061207 for ; Mon, 15 Nov 2021 01:27:57 -0800 (PST) Received: by mail-yb1-xb49.google.com with SMTP id d9-20020a251d09000000b005c208092922so25991017ybd.20 for ; Mon, 15 Nov 2021 01:27:57 -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=jbHbixo7emzfL/F0ImZygG8UOnWaD9volVJgAu+usN8=; b=cba20LELA7InlrKsG3RSF7gvUIy4UBQ0yRkXsHAA4g3iw0vJLLg46zEhqzaCa1A5zv Oa/ntd7rMnOCFABnaEJzHxDstB3xwdKQI6nZurZw1itzMX5cgZ6eqtZEM3C18w+mFELO V0Su4rd4RtQ80CUQO2MWSRfLc7rMaTk9KAHmnB951UAbqXjQqLW16wEV845IQom6GUos TCr/QQR+xZXKvNmYTgKHheSuGmevUM6o6gfjTe69dQ42WEDV1Jw8D6EaS3UVRX9OuFmD PIkCSicS6mtrsfnU55DtAz7TXRcjdCV7s4z9A7i4+Py2rXHJZprOO8rkuBbJ3ijbgBnl L8Wg== 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=jbHbixo7emzfL/F0ImZygG8UOnWaD9volVJgAu+usN8=; b=K82/Gf90ccYt2L+ddydXGoYGPt31InY17iee8sbqDt4UBpRO9q1xx8NdVXeFlojT3S lQUe7rYAz9i1MM/cvBO1xwiZ19NW9JAqjFd1grvxaYvpBimj93AZr74ZsarolYjeUzzJ 3LVdFIJWFgZL0t+W+8YuMQOW6v3yW4jU6G8cDgrj/ELpUYE8S5MX2c0FcPyUC9qMQv2I c9dTdg5TWGo2wzCcmdG0C5ZCmzP9uB+pgGMaUC5fpnk3QDVbZrD3XE/CNtKuxrufze0h ZPaX01abw4Uy9APgnkW7WU8QW/zADLwn2MU0LPL0N9ylNlakOz7bIjEoePho1g7rrDPx RupA== X-Gm-Message-State: AOAM531ALe6knrwfuHcE6laDRcwzW7s6Nvb7PJGHlVMNj8jNsV0DSWVR Lyft28t6kz6ZWDZHkI40Rj6gug+NSy3tMr7JvPZCApYYqRPolcw7FALFiVkid5wdy8Z0+YdhTzr O/bqO0VnOg354KgR/tPDf2H1t+9JOWpbuJTTQEShlO49DH9pEJnRdN/owifgYLbpGH4eKls4+2Y xN X-Google-Smtp-Source: ABdhPJwC7ko/qQeGBrRkSAlP9NUBYJfBLatfK4nbV0ToWnuglHB4NidzcuEfT80BoYcc7CRPRzbFwprhPeTE X-Received: from apusaka-p920.tpe.corp.google.com ([2401:fa00:1:10:5c8f:7191:e5ca:14fb]) (user=apusaka job=sendgmr) by 2002:a25:4146:: with SMTP id o67mr41871295yba.378.1636968477042; Mon, 15 Nov 2021 01:27:57 -0800 (PST) Date: Mon, 15 Nov 2021 17:27:44 +0800 In-Reply-To: <20211115172714.Bluez.v3.1.I9fc087b25433a9347b2d8c8ff7a25fadf448ef49@changeid> Message-Id: <20211115172714.Bluez.v3.2.I08d192861aa6b2025fbc575a7e0caffaa6170ed5@changeid> Mime-Version: 1.0 References: <20211115172714.Bluez.v3.1.I9fc087b25433a9347b2d8c8ff7a25fadf448ef49@changeid> X-Mailer: git-send-email 2.34.0.rc1.387.gb447b232ab-goog Subject: [Bluez PATCH v3 2/3] 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 , Sonny Sasaka , 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: Sonny Sasaka Reviewed-by: Miao-chen Chou --- (no changes since v1) src/device.c | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 94 insertions(+), 2 deletions(-) diff --git a/src/device.c b/src/device.c index 699faeba3b..fa6e3abc37 100644 --- a/src/device.c +++ b/src/device.c @@ -568,6 +568,63 @@ 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_attempts(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 earliest_allowed; + unsigned int num_failures; + + 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); + } + + earliest_allowed = (uint64_t) dev->name_resolve_earliest_allow_time; + num_failures = dev->name_resolve_fail_count; + + data_old = g_key_file_to_data(key_file, &length_old, NULL); + + g_key_file_set_uint64(key_file, "NameResolve", "EarliestAllowed", + earliest_allowed); + g_key_file_set_integer(key_file, "NameResolve", "NumFailures", + num_failures); + + 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; @@ -3277,6 +3334,36 @@ failed: return str; } +static void load_cached_name_resolve_attempts(struct btd_device *device, + const char *local, const char *peer) +{ + char filename[PATH_MAX]; + GKeyFile *key_file; + uint64_t earliest_allowed; + unsigned int num_failures; + + 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; + + earliest_allowed = g_key_file_get_uint64(key_file, "NameResolve", + "EarliestAllowed", NULL); + num_failures = g_key_file_get_uint64(key_file, "NameResolve", + "NumFailures", NULL); + + device->name_resolve_earliest_allow_time = earliest_allowed; + device->name_resolve_fail_count = (uint8_t) num_failures; + +failed: + g_key_file_free(key_file); +} + static struct csrk_info *load_csrk(GKeyFile *key_file, const char *group) { struct csrk_info *csrk; @@ -4284,6 +4371,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); @@ -4299,13 +4387,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_attempts(device, storage_dir, dst); + return device; } @@ -4382,6 +4472,8 @@ void device_name_resolve_fail(struct btd_device *device) device->name_resolve_fail_count++; device->name_resolve_earliest_allow_time = time(NULL) + NAME_RESOLVE_RETRY_DELAY * device->name_resolve_fail_count; + + device_store_cached_name_resolve_attempts(device); } void device_set_class(struct btd_device *device, uint32_t class)