netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>,
	Marcel Holtmann <marcel@holtmann.org>,
	Sasha Levin <sashal@kernel.org>,
	linux-bluetooth@vger.kernel.org, netdev@vger.kernel.org
Subject: [PATCH AUTOSEL 5.13 089/219] Bluetooth: Fix not generating RPA when required
Date: Thu,  9 Sep 2021 07:44:25 -0400	[thread overview]
Message-ID: <20210909114635.143983-89-sashal@kernel.org> (raw)
In-Reply-To: <20210909114635.143983-1-sashal@kernel.org>

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

[ Upstream commit c45074d68a9b1e893d86520af71fab37693c3d7e ]

Code was checking if random_addr and hdev->rpa match without first
checking if the RPA has not been set (BDADDR_ANY), furthermore it was
clearing HCI_RPA_EXPIRED before the command completes and the RPA is
actually programmed which in case of failure would leave the expired
RPA still set.

Since advertising instance have a similar problem the clearing of
HCI_RPA_EXPIRED has been moved to hci_event.c after checking the random
address is in fact the hdev->rap and then proceed to set the expire
timeout.

Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 include/net/bluetooth/hci_core.h |  4 ++
 net/bluetooth/hci_event.c        | 32 +++++++++----
 net/bluetooth/hci_request.c      | 81 ++++++++++++++------------------
 3 files changed, 61 insertions(+), 56 deletions(-)

diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
index 34a92d5ed12b..22a60291f203 100644
--- a/include/net/bluetooth/hci_core.h
+++ b/include/net/bluetooth/hci_core.h
@@ -1411,6 +1411,10 @@ void hci_conn_del_sysfs(struct hci_conn *conn);
 				!hci_dev_test_flag(dev, HCI_AUTO_OFF))
 #define bredr_sc_enabled(dev)  (lmp_sc_capable(dev) && \
 				hci_dev_test_flag(dev, HCI_SC_ENABLED))
+#define rpa_valid(dev)         (bacmp(&dev->rpa, BDADDR_ANY) && \
+				!hci_dev_test_flag(dev, HCI_RPA_EXPIRED))
+#define adv_rpa_valid(adv)     (bacmp(&adv->random_addr, BDADDR_ANY) && \
+				!adv->rpa_expired)
 
 #define scan_1m(dev) (((dev)->le_tx_def_phys & HCI_LE_SET_PHY_1M) || \
 		      ((dev)->le_rx_def_phys & HCI_LE_SET_PHY_1M))
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
index c5de24372971..c30682c90fc5 100644
--- a/net/bluetooth/hci_event.c
+++ b/net/bluetooth/hci_event.c
@@ -40,6 +40,8 @@
 #define ZERO_KEY "\x00\x00\x00\x00\x00\x00\x00\x00" \
 		 "\x00\x00\x00\x00\x00\x00\x00\x00"
 
+#define secs_to_jiffies(_secs) msecs_to_jiffies((_secs) * 1000)
+
 /* Handle HCI Event packets */
 
 static void hci_cc_inquiry_cancel(struct hci_dev *hdev, struct sk_buff *skb,
@@ -1171,6 +1173,12 @@ static void hci_cc_le_set_random_addr(struct hci_dev *hdev, struct sk_buff *skb)
 
 	bacpy(&hdev->random_addr, sent);
 
+	if (!bacmp(&hdev->rpa, sent)) {
+		hci_dev_clear_flag(hdev, HCI_RPA_EXPIRED);
+		queue_delayed_work(hdev->workqueue, &hdev->rpa_expired,
+				   secs_to_jiffies(hdev->rpa_timeout));
+	}
+
 	hci_dev_unlock(hdev);
 }
 
@@ -1201,24 +1209,30 @@ static void hci_cc_le_set_adv_set_random_addr(struct hci_dev *hdev,
 {
 	__u8 status = *((__u8 *) skb->data);
 	struct hci_cp_le_set_adv_set_rand_addr *cp;
-	struct adv_info *adv_instance;
+	struct adv_info *adv;
 
 	if (status)
 		return;
 
 	cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_ADV_SET_RAND_ADDR);
-	if (!cp)
+	/* Update only in case the adv instance since handle 0x00 shall be using
+	 * HCI_OP_LE_SET_RANDOM_ADDR since that allows both extended and
+	 * non-extended adverting.
+	 */
+	if (!cp || !cp->handle)
 		return;
 
 	hci_dev_lock(hdev);
 
-	if (!cp->handle) {
-		/* Store in hdev for instance 0 (Set adv and Directed advs) */
-		bacpy(&hdev->random_addr, &cp->bdaddr);
-	} else {
-		adv_instance = hci_find_adv_instance(hdev, cp->handle);
-		if (adv_instance)
-			bacpy(&adv_instance->random_addr, &cp->bdaddr);
+	adv = hci_find_adv_instance(hdev, cp->handle);
+	if (adv) {
+		bacpy(&adv->random_addr, &cp->bdaddr);
+		if (!bacmp(&hdev->rpa, &cp->bdaddr)) {
+			adv->rpa_expired = false;
+			queue_delayed_work(hdev->workqueue,
+					   &adv->rpa_expired_cb,
+					   secs_to_jiffies(hdev->rpa_timeout));
+		}
 	}
 
 	hci_dev_unlock(hdev);
diff --git a/net/bluetooth/hci_request.c b/net/bluetooth/hci_request.c
index b069f640394d..477519ab63b8 100644
--- a/net/bluetooth/hci_request.c
+++ b/net/bluetooth/hci_request.c
@@ -2053,8 +2053,6 @@ int hci_get_random_address(struct hci_dev *hdev, bool require_privacy,
 	 * current RPA has expired then generate a new one.
 	 */
 	if (use_rpa) {
-		int to;
-
 		/* If Controller supports LL Privacy use own address type is
 		 * 0x03
 		 */
@@ -2065,14 +2063,10 @@ int hci_get_random_address(struct hci_dev *hdev, bool require_privacy,
 			*own_addr_type = ADDR_LE_DEV_RANDOM;
 
 		if (adv_instance) {
-			if (!adv_instance->rpa_expired &&
-			    !bacmp(&adv_instance->random_addr, &hdev->rpa))
+			if (adv_rpa_valid(adv_instance))
 				return 0;
-
-			adv_instance->rpa_expired = false;
 		} else {
-			if (!hci_dev_test_and_clear_flag(hdev, HCI_RPA_EXPIRED) &&
-			    !bacmp(&hdev->random_addr, &hdev->rpa))
+			if (rpa_valid(hdev))
 				return 0;
 		}
 
@@ -2084,14 +2078,6 @@ int hci_get_random_address(struct hci_dev *hdev, bool require_privacy,
 
 		bacpy(rand_addr, &hdev->rpa);
 
-		to = msecs_to_jiffies(hdev->rpa_timeout * 1000);
-		if (adv_instance)
-			queue_delayed_work(hdev->workqueue,
-					   &adv_instance->rpa_expired_cb, to);
-		else
-			queue_delayed_work(hdev->workqueue,
-					   &hdev->rpa_expired, to);
-
 		return 0;
 	}
 
@@ -2134,6 +2120,30 @@ void __hci_req_clear_ext_adv_sets(struct hci_request *req)
 	hci_req_add(req, HCI_OP_LE_CLEAR_ADV_SETS, 0, NULL);
 }
 
+static void set_random_addr(struct hci_request *req, bdaddr_t *rpa)
+{
+	struct hci_dev *hdev = req->hdev;
+
+	/* If we're advertising or initiating an LE connection we can't
+	 * go ahead and change the random address at this time. This is
+	 * because the eventual initiator address used for the
+	 * subsequently created connection will be undefined (some
+	 * controllers use the new address and others the one we had
+	 * when the operation started).
+	 *
+	 * In this kind of scenario skip the update and let the random
+	 * address be updated at the next cycle.
+	 */
+	if (hci_dev_test_flag(hdev, HCI_LE_ADV) ||
+	    hci_lookup_le_connect(hdev)) {
+		bt_dev_dbg(hdev, "Deferring random address update");
+		hci_dev_set_flag(hdev, HCI_RPA_EXPIRED);
+		return;
+	}
+
+	hci_req_add(req, HCI_OP_LE_SET_RANDOM_ADDR, 6, rpa);
+}
+
 int __hci_req_setup_ext_adv_instance(struct hci_request *req, u8 instance)
 {
 	struct hci_cp_le_set_ext_adv_params cp;
@@ -2236,6 +2246,13 @@ int __hci_req_setup_ext_adv_instance(struct hci_request *req, u8 instance)
 		} else {
 			if (!bacmp(&random_addr, &hdev->random_addr))
 				return 0;
+			/* Instance 0x00 doesn't have an adv_info, instead it
+			 * uses hdev->random_addr to track its address so
+			 * whenever it needs to be updated this also set the
+			 * random address since hdev->random_addr is shared with
+			 * scan state machine.
+			 */
+			set_random_addr(req, &random_addr);
 		}
 
 		memset(&cp, 0, sizeof(cp));
@@ -2493,30 +2510,6 @@ void hci_req_clear_adv_instance(struct hci_dev *hdev, struct sock *sk,
 						false);
 }
 
-static void set_random_addr(struct hci_request *req, bdaddr_t *rpa)
-{
-	struct hci_dev *hdev = req->hdev;
-
-	/* If we're advertising or initiating an LE connection we can't
-	 * go ahead and change the random address at this time. This is
-	 * because the eventual initiator address used for the
-	 * subsequently created connection will be undefined (some
-	 * controllers use the new address and others the one we had
-	 * when the operation started).
-	 *
-	 * In this kind of scenario skip the update and let the random
-	 * address be updated at the next cycle.
-	 */
-	if (hci_dev_test_flag(hdev, HCI_LE_ADV) ||
-	    hci_lookup_le_connect(hdev)) {
-		bt_dev_dbg(hdev, "Deferring random address update");
-		hci_dev_set_flag(hdev, HCI_RPA_EXPIRED);
-		return;
-	}
-
-	hci_req_add(req, HCI_OP_LE_SET_RANDOM_ADDR, 6, rpa);
-}
-
 int hci_update_random_address(struct hci_request *req, bool require_privacy,
 			      bool use_rpa, u8 *own_addr_type)
 {
@@ -2528,8 +2521,6 @@ int hci_update_random_address(struct hci_request *req, bool require_privacy,
 	 * the current RPA in use, then generate a new one.
 	 */
 	if (use_rpa) {
-		int to;
-
 		/* If Controller supports LL Privacy use own address type is
 		 * 0x03
 		 */
@@ -2539,8 +2530,7 @@ int hci_update_random_address(struct hci_request *req, bool require_privacy,
 		else
 			*own_addr_type = ADDR_LE_DEV_RANDOM;
 
-		if (!hci_dev_test_and_clear_flag(hdev, HCI_RPA_EXPIRED) &&
-		    !bacmp(&hdev->random_addr, &hdev->rpa))
+		if (rpa_valid(hdev))
 			return 0;
 
 		err = smp_generate_rpa(hdev, hdev->irk, &hdev->rpa);
@@ -2551,9 +2541,6 @@ int hci_update_random_address(struct hci_request *req, bool require_privacy,
 
 		set_random_addr(req, &hdev->rpa);
 
-		to = msecs_to_jiffies(hdev->rpa_timeout * 1000);
-		queue_delayed_work(hdev->workqueue, &hdev->rpa_expired, to);
-
 		return 0;
 	}
 
-- 
2.30.2


  parent reply	other threads:[~2021-09-09 12:12 UTC|newest]

Thread overview: 64+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20210909114635.143983-1-sashal@kernel.org>
2021-09-09 11:43 ` [PATCH AUTOSEL 5.13 011/219] libbpf: Fix reuse of pinned map on older kernel Sasha Levin
2021-09-09 11:43 ` [PATCH AUTOSEL 5.13 016/219] tipc: keep the skb in rcv queue until the whole data is read Sasha Levin
2021-09-09 11:43 ` [PATCH AUTOSEL 5.13 017/219] net: phy: Fix data type in DP83822 dp8382x_disable_wol() Sasha Levin
2021-09-09 11:43 ` [PATCH AUTOSEL 5.13 019/219] iavf: do not override the adapter state in the watchdog task Sasha Levin
2021-09-09 11:43 ` [PATCH AUTOSEL 5.13 020/219] iavf: fix locking of critical sections Sasha Levin
2021-09-09 11:43 ` [PATCH AUTOSEL 5.13 024/219] netlink: Deal with ESRCH error in nlmsg_notify() Sasha Levin
2021-09-09 11:43 ` [PATCH AUTOSEL 5.13 025/219] net: ipa: fix IPA v4.11 interconnect data Sasha Levin
2021-09-09 11:43 ` [PATCH AUTOSEL 5.13 031/219] igc: Check if num of q_vectors is smaller than max before array access Sasha Levin
2021-09-09 11:43 ` [PATCH AUTOSEL 5.13 049/219] nfp: fix return statement in nfp_net_parse_meta() Sasha Levin
2021-09-09 11:43 ` [PATCH AUTOSEL 5.13 052/219] ethtool: improve compat ioctl handling Sasha Levin
2021-09-09 11:43 ` [PATCH AUTOSEL 5.13 055/219] bpf/tests: Fix copy-and-paste error in double word test Sasha Levin
2021-09-09 11:43 ` [PATCH AUTOSEL 5.13 056/219] bpf/tests: Do not PASS tests without actually testing the result Sasha Levin
2021-09-09 11:43 ` [PATCH AUTOSEL 5.13 062/219] net: ipa: fix ipa_cmd_table_valid() Sasha Levin
2021-09-09 11:43 ` [PATCH AUTOSEL 5.13 063/219] ipv4: ip_output.c: Fix out-of-bounds warning in ip_copy_addrs() Sasha Levin
2021-09-09 11:44 ` [PATCH AUTOSEL 5.13 064/219] flow_dissector: Fix out-of-bounds warnings Sasha Levin
2021-09-09 11:44 ` [PATCH AUTOSEL 5.13 072/219] samples: bpf: Fix tracex7 error raised on the missing argument Sasha Levin
2021-09-09 11:44 ` [PATCH AUTOSEL 5.13 073/219] libbpf: Fix race when pinning maps in parallel Sasha Levin
2021-09-09 11:44 ` [PATCH AUTOSEL 5.13 077/219] Bluetooth: skip invalid hci_sync_conn_complete_evt Sasha Levin
2021-09-09 11:44 ` [PATCH AUTOSEL 5.13 082/219] netfilter: nft_compat: use nfnetlink_unicast() Sasha Levin
2021-09-09 11:44 ` [PATCH AUTOSEL 5.13 083/219] bonding: 3ad: fix the concurrency between __bond_release_one() and bond_3ad_state_machine_handler() Sasha Levin
2021-09-09 11:44 ` [PATCH AUTOSEL 5.13 087/219] bpf: Fix off-by-one in tail call count limiting Sasha Levin
2021-09-09 11:44 ` Sasha Levin [this message]
2021-09-09 11:44 ` [PATCH AUTOSEL 5.13 090/219] dpaa2-switch: do not enable the DPSW at probe time Sasha Levin
2021-09-09 11:44 ` [PATCH AUTOSEL 5.13 100/219] net: ipa: fix IPA v4.9 interconnects Sasha Levin
2021-09-09 11:44 ` [PATCH AUTOSEL 5.13 111/219] net: ethernet: stmmac: Do not use unreachable() in ipq806x_gmac_probe() Sasha Levin
2021-09-09 11:44 ` [PATCH AUTOSEL 5.13 120/219] selftests/bpf: Fix xdp_tx.c prog section name Sasha Levin
2021-09-09 11:44 ` [PATCH AUTOSEL 5.13 123/219] Bluetooth: schedule SCO timeouts with delayed_work Sasha Levin
2021-09-09 11:45 ` [PATCH AUTOSEL 5.13 124/219] Bluetooth: avoid circular locks in sco_sock_connect Sasha Levin
2021-09-09 11:45 ` [PATCH AUTOSEL 5.13 128/219] net/mlx5: Fix variable type to match 64bit Sasha Levin
2021-09-09 11:45 ` [PATCH AUTOSEL 5.13 131/219] mac80211: Fix monitor MTU limit so that A-MSDUs get through Sasha Levin
2021-09-09 11:45 ` [PATCH AUTOSEL 5.13 142/219] Bluetooth: Fix handling of LE Enhanced Connection Complete Sasha Levin
2021-09-09 11:45 ` [PATCH AUTOSEL 5.13 146/219] tcp: enable data-less, empty-cookie SYN with TFO_SERVER_COOKIE_NOT_REQD Sasha Levin
2021-09-09 11:45 ` [PATCH AUTOSEL 5.13 148/219] rpc: fix gss_svc_init cleanup on failure Sasha Levin
2021-09-09 11:45 ` [PATCH AUTOSEL 5.13 149/219] iavf: use mutexes for locking of critical sections Sasha Levin
2021-09-09 11:45 ` [PATCH AUTOSEL 5.13 150/219] selftests/bpf: Correctly display subtest skip status Sasha Levin
2021-09-09 11:45 ` [PATCH AUTOSEL 5.13 151/219] selftests/bpf: Fix flaky send_signal test Sasha Levin
2021-09-09 11:45 ` [PATCH AUTOSEL 5.13 154/219] selftests: nci: Fix the code for next nlattr offset Sasha Levin
2021-09-09 11:45 ` [PATCH AUTOSEL 5.13 155/219] selftests: nci: Fix the wrong condition Sasha Levin
2021-09-09 11:45 ` [PATCH AUTOSEL 5.13 156/219] net: Fix offloading indirect devices dependency on qdisc order creation Sasha Levin
2021-09-09 11:45 ` [PATCH AUTOSEL 5.13 163/219] rtl8xxxu: Fix the handling of TX A-MPDU aggregation Sasha Levin
2021-09-09 11:45 ` [PATCH AUTOSEL 5.13 164/219] rtw88: use read_poll_timeout instead of fixed sleep Sasha Levin
2021-09-09 11:45 ` [PATCH AUTOSEL 5.13 165/219] rtw88: wow: build wow function only if CONFIG_PM is on Sasha Levin
2021-09-09 11:45 ` [PATCH AUTOSEL 5.13 166/219] rtw88: wow: fix size access error of probe request Sasha Levin
2021-09-09 11:45 ` [PATCH AUTOSEL 5.13 167/219] octeontx2-pf: Fix NIX1_RX interface backpressure Sasha Levin
2021-09-09 11:46 ` [PATCH AUTOSEL 5.13 184/219] mptcp: fix ADD_ADDR and RM_ADDR maybe flush addr_signal each other Sasha Levin
2021-09-09 11:46 ` [PATCH AUTOSEL 5.13 185/219] selftests/bpf: Enlarge select() timeout for test_maps Sasha Levin
2021-09-09 11:46 ` [PATCH AUTOSEL 5.13 201/219] iwlwifi: pcie: free RBs during configure Sasha Levin
2021-09-09 11:46 ` [PATCH AUTOSEL 5.13 202/219] iwlwifi: mvm: Do not use full SSIDs in 6GHz scan Sasha Levin
2021-09-09 11:46 ` [PATCH AUTOSEL 5.13 203/219] iwlwifi: mvm: fix a memory leak in iwl_mvm_mac_ctxt_beacon_changed Sasha Levin
2021-09-09 11:46 ` [PATCH AUTOSEL 5.13 204/219] iwlwifi: mvm: avoid static queue number aliasing Sasha Levin
2021-09-09 11:46 ` [PATCH AUTOSEL 5.13 205/219] iwlwifi: mvm: Fix umac scan request probe parameters Sasha Levin
2021-09-09 11:46 ` [PATCH AUTOSEL 5.13 206/219] iwlwifi: mvm: fix access to BSS elements Sasha Levin
2021-09-09 11:46 ` [PATCH AUTOSEL 5.13 207/219] iwlwifi: fw: correctly limit to monitor dump Sasha Levin
2021-09-09 11:46 ` [PATCH AUTOSEL 5.13 208/219] iwlwifi: mvm: Fix scan channel flags settings Sasha Levin
2021-09-09 11:46 ` [PATCH AUTOSEL 5.13 209/219] net/mlx5: DR, fix a potential use-after-free bug Sasha Levin
2021-09-09 11:46 ` [PATCH AUTOSEL 5.13 210/219] net/mlx5: DR, Enable QP retransmission Sasha Levin
2021-09-09 11:46 ` [PATCH AUTOSEL 5.13 212/219] selftests/bpf: Fix potential unreleased lock Sasha Levin
2021-09-09 11:46 ` [PATCH AUTOSEL 5.13 213/219] wcn36xx: Fix missing frame timestamp for beacon/probe-resp Sasha Levin
2021-09-09 11:46 ` [PATCH AUTOSEL 5.13 214/219] ath9k: fix OOB read ar9300_eeprom_restore_internal Sasha Levin
2021-09-09 11:46 ` [PATCH AUTOSEL 5.13 215/219] ath9k: fix sleeping in atomic context Sasha Levin
2021-09-09 11:46 ` [PATCH AUTOSEL 5.13 216/219] net: fix NULL pointer reference in cipso_v4_doi_free Sasha Levin
2021-09-09 11:46 ` [PATCH AUTOSEL 5.13 217/219] fix array-index-out-of-bounds in taprio_change Sasha Levin
2021-09-09 11:46 ` [PATCH AUTOSEL 5.13 218/219] net: w5100: check return value after calling platform_get_resource() Sasha Levin
2021-09-09 11:46 ` [PATCH AUTOSEL 5.13 219/219] net: hns3: clean up a type mismatch warning Sasha Levin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210909114635.143983-89-sashal@kernel.org \
    --to=sashal@kernel.org \
    --cc=linux-bluetooth@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=luiz.von.dentz@intel.com \
    --cc=marcel@holtmann.org \
    --cc=netdev@vger.kernel.org \
    --cc=stable@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).