Message ID | 20220602151456.v2.1.I9f2f4ef058af96a5ad610a90c6938ed17a7d103f@changeid (mailing list archive) |
---|---|
State | Superseded |
Commit | 5a4e1528d8405e207bdc2c9db0b9952b70ca1e4c |
Headers | show |
Series | [v2] Bluetooth: clear the temporary linkkey in hci_conn_cleanup | expand |
Hi Alain, > If a hardware error occurs and the connections are flushed without a > disconnection_complete event being signaled, the temporary linkkeys are > not flushed. > > This change ensures that any outstanding flushable linkkeys are flushed > when the connection are flushed from the hash table. > > Signed-off-by: Alain Michaud <alainm@chromium.org> > > --- > > Changes in v2: > -Address Feedback from Luiz > > net/bluetooth/hci_conn.c | 3 +++ > net/bluetooth/hci_event.c | 4 ++-- > 2 files changed, 5 insertions(+), 2 deletions(-) > > diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c > index 352d7d612128..5911ca0c5239 100644 > --- a/net/bluetooth/hci_conn.c > +++ b/net/bluetooth/hci_conn.c > @@ -118,6 +118,9 @@ static void hci_conn_cleanup(struct hci_conn *conn) > if (test_bit(HCI_CONN_PARAM_REMOVAL_PEND, &conn->flags)) > hci_conn_params_del(conn->hdev, &conn->dst, conn->dst_type); > > + if (test_and_clear_bit(HCI_CONN_FLUSH_KEY, &conn->flags)) > + hci_remove_link_key(hdev, &conn->dst); > + > hci_chan_list_flush(conn); > > hci_conn_hash_del(hdev, conn); > diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c > index 6b83f9b0082c..b67fdd1ad8da 100644 > --- a/net/bluetooth/hci_event.c > +++ b/net/bluetooth/hci_event.c > @@ -2729,7 +2729,7 @@ static void hci_cs_disconnect(struct hci_dev *hdev, u8 status) > mgmt_conn = test_and_clear_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags); > > if (conn->type == ACL_LINK) { > - if (test_bit(HCI_CONN_FLUSH_KEY, &conn->flags)) > + if (test_and_clear_bit(HCI_CONN_FLUSH_KEY, &conn->flags)) > hci_remove_link_key(hdev, &conn->dst); > } > > @@ -3372,7 +3372,7 @@ static void hci_disconn_complete_evt(struct hci_dev *hdev, void *data, > reason, mgmt_connected); > > if (conn->type == ACL_LINK) { > - if (test_bit(HCI_CONN_FLUSH_KEY, &conn->flags)) > + if (test_and_clear_bit(HCI_CONN_FLUSH_KEY, &conn->flags)) > hci_remove_link_key(hdev, &conn->dst); do you mind splitting this into two patches. The test_and_clear_bit() change is obviously correct, but it is fix that is not described in the commit message. Or if you think that it makes sense to keep this together, please add a paragraph about it in the commit message. Regards Marcel
Hello: This patch was applied to bluetooth/bluetooth-next.git (master) by Marcel Holtmann <marcel@holtmann.org>: On Thu, 2 Jun 2022 15:15:03 +0000 you wrote: > From: Alain Michaud <alainm@chromium.org> > > If a hardware error occurs and the connections are flushed without a > disconnection_complete event being signaled, the temporary linkkeys are > not flushed. > > This change ensures that any outstanding flushable linkkeys are flushed > when the connection are flushed from the hash table. > > [...] Here is the summary with links: - [v2] Bluetooth: clear the temporary linkkey in hci_conn_cleanup https://git.kernel.org/bluetooth/bluetooth-next/c/5a4e1528d840 You are awesome, thank you!
diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c index 352d7d612128..5911ca0c5239 100644 --- a/net/bluetooth/hci_conn.c +++ b/net/bluetooth/hci_conn.c @@ -118,6 +118,9 @@ static void hci_conn_cleanup(struct hci_conn *conn) if (test_bit(HCI_CONN_PARAM_REMOVAL_PEND, &conn->flags)) hci_conn_params_del(conn->hdev, &conn->dst, conn->dst_type); + if (test_and_clear_bit(HCI_CONN_FLUSH_KEY, &conn->flags)) + hci_remove_link_key(hdev, &conn->dst); + hci_chan_list_flush(conn); hci_conn_hash_del(hdev, conn); diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index 6b83f9b0082c..b67fdd1ad8da 100644 --- a/net/bluetooth/hci_event.c +++ b/net/bluetooth/hci_event.c @@ -2729,7 +2729,7 @@ static void hci_cs_disconnect(struct hci_dev *hdev, u8 status) mgmt_conn = test_and_clear_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags); if (conn->type == ACL_LINK) { - if (test_bit(HCI_CONN_FLUSH_KEY, &conn->flags)) + if (test_and_clear_bit(HCI_CONN_FLUSH_KEY, &conn->flags)) hci_remove_link_key(hdev, &conn->dst); } @@ -3372,7 +3372,7 @@ static void hci_disconn_complete_evt(struct hci_dev *hdev, void *data, reason, mgmt_connected); if (conn->type == ACL_LINK) { - if (test_bit(HCI_CONN_FLUSH_KEY, &conn->flags)) + if (test_and_clear_bit(HCI_CONN_FLUSH_KEY, &conn->flags)) hci_remove_link_key(hdev, &conn->dst); hci_req_update_scan(hdev);