From patchwork Thu Nov 11 11:53:50 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Archie Pusaka X-Patchwork-Id: 518265 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 931DFC433EF for ; Thu, 11 Nov 2021 11:54:09 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 68FC16124C for ; Thu, 11 Nov 2021 11:54:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233183AbhKKL45 (ORCPT ); Thu, 11 Nov 2021 06:56:57 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48970 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233171AbhKKL44 (ORCPT ); Thu, 11 Nov 2021 06:56:56 -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 72080C0613F5 for ; Thu, 11 Nov 2021 03:54:07 -0800 (PST) Received: by mail-yb1-xb4a.google.com with SMTP id t24-20020a252d18000000b005c225ae9e16so8948389ybt.15 for ; Thu, 11 Nov 2021 03:54:07 -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=Hgd5YNG4upTVksFs9U+r5jmVvwpkkXvR39uZVhLasCA=; b=tO7a86t4tu8YX1hGLaS/0nJv74RPnfRHZF+/h2hcjoHeneujABR4wmNeYqch4pJql8 znCEQCBD4j8tjp0tJVDUi9kXFkFDS/psPsUfEG+v+DHSfu9svjWQeMSmwrW9Qq1V1qr3 0X3BHiFTD6jrUEDtkLOwJYOCT77RITOlXNcAmkLstAPy4jQeAUPaGT2YdRk/euKYwYMn 4jDn9nExCgWzke6XHz9KqhQVg+Q6ZtQNK155Ws4Xg4wvxMESLj6xwtDrZ0xjq4F9Uy+8 QBEepNGU27gCiiCetzm4Sw+FHtUKe3PYH6tG0Bxw4wcuL3f8oE38OkPW2uJN+n0P2uoB UCng== 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=Hgd5YNG4upTVksFs9U+r5jmVvwpkkXvR39uZVhLasCA=; b=Cd+ikOGGZg58bo9itGsstDeEjMlDVmalpeMIHhMTp/FTaMG0wGO1RtJ8SURAfBdJ87 IbY3Sr/qO6JqEmzo+KiTSZpjAYvM50W66AnNtI1P3tCnZiSAQAjA33QRbkfyjZv/KJYg wKr8g15qZsr7NS6F9WiHO12WP9wscxWbSFwQwBYkwWzmhxfSoCJEjSLkzm6u8XsipUQv I3WOdm4fNomPF9/b7pbybHKtaGOYIiV7lSVYp7m47zJOfj1dW2fyKOXuVf/tbzhhFT/R JAedMHAWfL4Y0LeGX45quXzQzmk6/IzcUO096G/EtBhPCSeGW3cfwRpYQEkTxZwwzGY0 4Z3w== X-Gm-Message-State: AOAM531nPl8tz4/cBQSdY0ptWKIP3t4osXrXNzfzV0sM7tTGbX7iIcTO 8bKmzjx81hNwHfuTogChXvnj00+gHSw26FIcIAA/yJ1PNckQ/wpBJ0ZAq00hP+6XPhvL4bIBPRe vk/5pvHKhPYPdLPLhYwmt/r3dMBqRCDsUU8J/xC6Z90dIVLmAMEC4EvxE9pyekKfmFfqrXQxJgq Up X-Google-Smtp-Source: ABdhPJwbEdHA/SYjwH5ny9OeUCta03+SBhoyRu7ZFXJb/kosZsNn3+InlZemiUIZc39h0lnyTHgmhh6CPO6W X-Received: from apusaka-p920.tpe.corp.google.com ([2401:fa00:1:10:b87e:3eb:e17e:1273]) (user=apusaka job=sendgmr) by 2002:a05:6902:150b:: with SMTP id q11mr7798659ybu.386.1636631646640; Thu, 11 Nov 2021 03:54:06 -0800 (PST) Date: Thu, 11 Nov 2021 19:53:50 +0800 Message-Id: <20211111195320.1.Id7366eb14b6f48173fcbf17846ace59479179c7c@changeid> Mime-Version: 1.0 X-Mailer: git-send-email 2.34.0.rc0.344.g81b53c2807-goog Subject: [PATCH 1/3] Bluetooth: Send device found event on name resolve failure From: Archie Pusaka To: linux-bluetooth , Luiz Augusto von Dentz , Marcel Holtmann Cc: CrosBT Upstreaming , Archie Pusaka , Miao-chen Chou , "David S. Miller" , Jakub Kicinski , Johan Hedberg , linux-kernel@vger.kernel.org, netdev@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org From: Archie Pusaka Introducing CONFIRM_NAME_FAILED flag that will be sent together with device found event on name resolve failure. This will provide the userspace with an information so it can decide not to resolve the name for these devices in the future. Signed-off-by: Archie Pusaka 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 userspace change. Thanks, Archie include/net/bluetooth/mgmt.h | 1 + net/bluetooth/hci_event.c | 11 ++++------- net/bluetooth/mgmt.c | 11 ++++++++--- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/include/net/bluetooth/mgmt.h b/include/net/bluetooth/mgmt.h index 23a0524061b7..113438f295bf 100644 --- a/include/net/bluetooth/mgmt.h +++ b/include/net/bluetooth/mgmt.h @@ -940,6 +940,7 @@ struct mgmt_ev_auth_failed { #define MGMT_DEV_FOUND_LEGACY_PAIRING 0x02 #define MGMT_DEV_FOUND_NOT_CONNECTABLE 0x04 #define MGMT_DEV_FOUND_INITIATED_CONN 0x08 +#define MGMT_DEV_FOUND_CONFIRM_NAME_FAILED 0x10 #define MGMT_EV_DEVICE_FOUND 0x0012 struct mgmt_ev_device_found { diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index d4b75a6cfeee..2de3080659f9 100644 --- a/net/bluetooth/hci_event.c +++ b/net/bluetooth/hci_event.c @@ -2175,13 +2175,10 @@ static void hci_check_pending_name(struct hci_dev *hdev, struct hci_conn *conn, return; list_del(&e->list); - if (name) { - e->name_state = NAME_KNOWN; - mgmt_remote_name(hdev, bdaddr, ACL_LINK, 0x00, - e->data.rssi, name, name_len); - } else { - e->name_state = NAME_NOT_KNOWN; - } + + e->name_state = name ? NAME_KNOWN : NAME_NOT_KNOWN; + mgmt_remote_name(hdev, bdaddr, ACL_LINK, 0x00, e->data.rssi, + name, name_len); if (hci_resolve_next_name(hdev)) return; diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c index 06384d761928..c1d6fbc19207 100644 --- a/net/bluetooth/mgmt.c +++ b/net/bluetooth/mgmt.c @@ -9615,7 +9615,8 @@ void mgmt_remote_name(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type, { struct mgmt_ev_device_found *ev; char buf[sizeof(*ev) + HCI_MAX_NAME_LENGTH + 2]; - u16 eir_len; + u16 eir_len = 0; + u32 flags = 0; ev = (struct mgmt_ev_device_found *) buf; @@ -9625,10 +9626,14 @@ void mgmt_remote_name(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type, ev->addr.type = link_to_bdaddr(link_type, addr_type); ev->rssi = rssi; - eir_len = eir_append_data(ev->eir, 0, EIR_NAME_COMPLETE, name, - name_len); + if (name) + eir_len = eir_append_data(ev->eir, 0, EIR_NAME_COMPLETE, name, + name_len); + else + flags |= MGMT_DEV_FOUND_CONFIRM_NAME_FAILED; ev->eir_len = cpu_to_le16(eir_len); + ev->flags = cpu_to_le32(flags); mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev, sizeof(*ev) + eir_len, NULL); } From patchwork Thu Nov 11 11:54:53 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Archie Pusaka X-Patchwork-Id: 518263 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 8C4A8C433F5 for ; Thu, 11 Nov 2021 11:55:13 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 67AEF6124C for ; Thu, 11 Nov 2021 11:55:13 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233245AbhKKL6B (ORCPT ); Thu, 11 Nov 2021 06:58:01 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49298 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233315AbhKKL57 (ORCPT ); Thu, 11 Nov 2021 06:57:59 -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 25E0AC061766 for ; Thu, 11 Nov 2021 03:55:10 -0800 (PST) Received: by mail-yb1-xb4a.google.com with SMTP id v20-20020a25fc14000000b005c2109e5ad1so8848573ybd.9 for ; Thu, 11 Nov 2021 03:55:10 -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=9WP+pDgjCCoJy9/bLFKkqPqZ8WB0dJl7RMRcW4E1w7Q=; b=FgpAYglVMGsOPJMGkXgLHHRwKHCTLQpDJsIEA6AdGThtD96ch2tq0sVeTCJU+J6p48 SZvUCOvLk9qNdodw90VwifkaRBAlchLml9fnZ6kVcYydDaD2nFy/vbZ0TpXe7W5M8dzt PhsdYxrotFq/OYrGWqDc7b//mGLJiznXFmE3+6EJZoSJzr9Mh0kimOeYOdVzM8lEWdo/ ki3c2aODhla58W+w3omfFHxnqcYYXc/JkLpRNsmxpJx2akJFsCSIyvje/SR/Na8UpK0d H2x/XIZVMHJxDtTcn/osepjTdS0EI8uxikhIgyZNhKbTP5CI1QXxQwuQXShN9RMfCY84 eb/Q== 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=9WP+pDgjCCoJy9/bLFKkqPqZ8WB0dJl7RMRcW4E1w7Q=; b=N2S+vOIZUnnWwp/xI0KDXwiZziUjWBvIexeXucxBc6Qsb02rpO+q2vdqQWckQ2wDbQ kg6NHDAdsAO7qHjck0Rn64X6hxahQGvEVTT6k1gYWf4y0z/mGtF2xLVryyw9hbFM2cHQ DBZUpEJOvlAOItyw3zBqrZG6k2GBvLJMT+sBhdUJ92VW/5fmHEaJlIxjE0CJaYWdcKye UAKhhV54a9z9kcMhbgWsQT0I0DLuvwDvjOt8fEmr3mp8pPlDUpjApX0BHXF9LxcYY8Hn 8nEV0aSjb9Upe+Z5FaPQCx+pm3eEiF0HCAGD5lGqfP5GS3DP6J1GUh8IbYpJgtEy6fX+ uqAQ== X-Gm-Message-State: AOAM531VbZruCKH3qsCIxF5sD9TNKFNdQyS79R5E9zbL/hTVN8dgsrD3 cbkI4MGh4XdKM8OrKazeueGrS7otofZiEIJxcrn5VURbeSGXrPqIzL8wMC6BVExHO9PASOnWbkp 06LoZB6FGvaQ+UW8m4/xVuSCiP7CLazpdIItqZKfvqqjKlcJg8oMgZNLHaDw6xTkyliHdDWyn5I h1 X-Google-Smtp-Source: ABdhPJwnmc0HF115/GltUFyuvP2120iMqZn+brP/Qj8ZFhJM8FOSuxZoL9FrFkGsjZ4Z1hHjJPOxTV4PFFWa X-Received: from apusaka-p920.tpe.corp.google.com ([2401:fa00:1:10:b87e:3eb:e17e:1273]) (user=apusaka job=sendgmr) by 2002:a25:f443:: with SMTP id p3mr7686044ybe.162.1636631709311; Thu, 11 Nov 2021 03:55:09 -0800 (PST) Date: Thu, 11 Nov 2021 19:54:53 +0800 In-Reply-To: <20211111195423.Bluez.1.I9fc087b25433a9347b2d8c8ff7a25fadf448ef49@changeid> Message-Id: <20211111195423.Bluez.2.I08d192861aa6b2025fbc575a7e0caffaa6170ed5@changeid> Mime-Version: 1.0 References: <20211111195423.Bluez.1.I9fc087b25433a9347b2d8c8ff7a25fadf448ef49@changeid> X-Mailer: git-send-email 2.34.0.rc0.344.g81b53c2807-goog Subject: [Bluez PATCH 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 --- 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) From patchwork Thu Nov 11 11:53:52 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Archie Pusaka X-Patchwork-Id: 518264 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 1DBB2C433F5 for ; Thu, 11 Nov 2021 11:54:25 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 0711261215 for ; Thu, 11 Nov 2021 11:54:25 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233258AbhKKL5M (ORCPT ); Thu, 11 Nov 2021 06:57:12 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49048 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233264AbhKKL5K (ORCPT ); Thu, 11 Nov 2021 06:57:10 -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 AA7A5C0613F5 for ; Thu, 11 Nov 2021 03:54:21 -0800 (PST) Received: by mail-yb1-xb49.google.com with SMTP id m78-20020a252651000000b005c1f44d3c7bso8835718ybm.22 for ; Thu, 11 Nov 2021 03:54:21 -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=4kL0X2JVV0XjaUHDlSkh7aIxrPJS+P1TxygnVknNAZg=; b=Q+/jtBb//RU4wXxTAhXSVm2orlgn4RWfwrSjrQlNKVkWGlTrLvz9MJ96wWDFx/4DBn 8nfP/26EVLTEEXNF8fgtFKprei22rUtMhyowsZU4vLDFEfAgkwHFa23Nw46oD+VMrfaV 8ukt0PyOqV2V1gbFykDZm4V9iSer4Wi5lYigGnsxqn/lzGnBZ0Hdi8LP8vK7RK4LSm0l KWkjCr3vQ0hbfr8MJLEmYVYxuSi8r39LtkxTGoVlchAjYi+XbN0SGszIDnqsO1/a+LDv nw/SdPnQ7l/LOSQ71L93BdLvyi1CSMfHQQZxya7I6X7olgrs2syvV6EnhCIixiUkTpDR ASMg== 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=4kL0X2JVV0XjaUHDlSkh7aIxrPJS+P1TxygnVknNAZg=; b=6O3WSaccB1ubMu8Dsfitc3eDYX3QX1vDw9nzgOTrDLbIGsIojBK5spYVhbwvZht6B4 So9eFahc3uIKvJrb/23/U5WoI3X48N9VgXuQYavyUW45X9IZJCr26/A2iNmFnQD5RqgI PClUWub8yq9SC4EUwY0rRqVNKWVW/dEL1bu+/f6ucwiUx/9v/VJWZTctDP2fvYOcn1mE /qcOmPfvY68xqVIhVHpaaSBp1eBSh7gVjYCdOguhy1t6xNdDCb+qC8NTYOjJ0HpCXsLo w0ouKRDlR3Ito/2znNHZk3R5zbHep9AYo5Bg05sAcwWHAnkI8D8I+rhiJpvWwdOpTSBi G8SQ== X-Gm-Message-State: AOAM533jKzRQYBX42i0HVldSxCpEbHpVJLdFH0XnNY4k7Qx/fUYX4wwI N+/4spsb/suPZBB2an8xpMeyHDrcFsZjU/jXtd/ZfkDGWKEvG7wu50UitAeVgzrx4tgZUycrmdV B+JEJad8ncMY6tHfKWWxQ5F5oRU9XTMIC5hNJ/+8N028TclqOZvFzEYXELFsoHHyvgKbQDiqTbP TG X-Google-Smtp-Source: ABdhPJypRDIh4yurXN82mQRqslDI7fpio42+fj+0QjBuTXIyRZ/XgO7FeGopIjdipnZupcHi2ly03+HNzBey X-Received: from apusaka-p920.tpe.corp.google.com ([2401:fa00:1:10:b87e:3eb:e17e:1273]) (user=apusaka job=sendgmr) by 2002:a05:6902:1205:: with SMTP id s5mr8240471ybu.71.1636631660862; Thu, 11 Nov 2021 03:54:20 -0800 (PST) Date: Thu, 11 Nov 2021 19:53:52 +0800 In-Reply-To: <20211111195320.1.Id7366eb14b6f48173fcbf17846ace59479179c7c@changeid> Message-Id: <20211111195320.3.I35b7f3a496f834de6b43a32f94b6160cb1467c94@changeid> Mime-Version: 1.0 References: <20211111195320.1.Id7366eb14b6f48173fcbf17846ace59479179c7c@changeid> X-Mailer: git-send-email 2.34.0.rc0.344.g81b53c2807-goog Subject: [PATCH 3/3] Bluetooth: Limit duration of Remote Name Resolve From: Archie Pusaka To: linux-bluetooth , Luiz Augusto von Dentz , Marcel Holtmann Cc: CrosBT Upstreaming , Archie Pusaka , Miao-chen Chou , "David S. Miller" , Jakub Kicinski , Johan Hedberg , linux-kernel@vger.kernel.org, netdev@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org From: Archie Pusaka When doing remote name request, we cannot scan. In the normal case it's OK since we can expect it to finish within a short amount of time. However, there is a possibility to scan lots of devices that (1) requires Remote Name Resolve (2) is unresponsive to Remote Name Resolve When this happens, we are stuck to do Remote Name Resolve until all is done before continue scanning. This patch adds a time limit to stop us spending too long on remote name request. Signed-off-by: Archie Pusaka Reviewed-by: Miao-chen Chou --- include/net/bluetooth/hci_core.h | 3 +++ net/bluetooth/hci_event.c | 7 +++++++ 2 files changed, 10 insertions(+) diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h index eb08dd502f2a..941cfbb024d1 100644 --- a/include/net/bluetooth/hci_core.h +++ b/include/net/bluetooth/hci_core.h @@ -89,6 +89,7 @@ struct discovery_state { u8 (*uuids)[16]; unsigned long scan_start; unsigned long scan_duration; + unsigned long name_resolve_timeout; }; #define SUSPEND_NOTIFIER_TIMEOUT msecs_to_jiffies(2000) /* 2 seconds */ @@ -1763,6 +1764,8 @@ void hci_mgmt_chan_unregister(struct hci_mgmt_chan *c); #define DISCOV_LE_FAST_ADV_INT_MIN 0x00A0 /* 100 msec */ #define DISCOV_LE_FAST_ADV_INT_MAX 0x00F0 /* 150 msec */ +#define NAME_RESOLVE_DURATION msecs_to_jiffies(10240) /* msec */ + void mgmt_fill_version_info(void *ver); int mgmt_new_settings(struct hci_dev *hdev); void mgmt_index_added(struct hci_dev *hdev); diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index 2de3080659f9..6180ab0e8b8d 100644 --- a/net/bluetooth/hci_event.c +++ b/net/bluetooth/hci_event.c @@ -2129,6 +2129,12 @@ static bool hci_resolve_next_name(struct hci_dev *hdev) if (list_empty(&discov->resolve)) return false; + /* We should stop if we already spent too much time resolving names. */ + if (time_after(jiffies, discov->name_resolve_timeout)) { + bt_dev_dbg(hdev, "Name resolve takes too long, stopping."); + return false; + } + e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY, NAME_NEEDED); if (!e) return false; @@ -2716,6 +2722,7 @@ static void hci_inquiry_complete_evt(struct hci_dev *hdev, struct sk_buff *skb) if (e && hci_resolve_name(hdev, e) == 0) { e->name_state = NAME_PENDING; hci_discovery_set_state(hdev, DISCOVERY_RESOLVING); + discov->name_resolve_timeout = jiffies + NAME_RESOLVE_DURATION; } else { /* When BR/EDR inquiry is active and no LE scanning is in * progress, then change discovery state to indicate completion.