summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2023-03-29 13:27:05 -0700
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2023-03-29 16:25:18 -0700
commit2b022fa5297a56875f06c2b5612258cd99dcbe74 (patch)
treedcf706df4eafa0175a476fa0524366cee8547d31
parentca07d198f9c7d289e95091c30ed15bff2106a7db (diff)
downloadbluez-2b022fa5297a56875f06c2b5612258cd99dcbe74.tar.gz
device: Fix not setting initiator flag when auto-connecting
If the device is marked as auto-connect the kernel may initiate the connection spontaneously causing new connections to not have set the state->initiator flag properly.
-rw-r--r--src/device.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/src/device.c b/src/device.c
index f31f2a097..b43ced8b5 100644
--- a/src/device.c
+++ b/src/device.c
@@ -312,9 +312,16 @@ static struct bearer_state *get_state(struct btd_device *dev,
bool btd_device_is_initiator(struct btd_device *dev)
{
- if (dev->le_state.connected)
+ if (dev->le_state.connected) {
+ /* Mark as initiator if not set yet and auto-connect flag is
+ * set and LTK key is for a peripheral.
+ */
+ if (!dev->le_state.initiator && dev->auto_connect &&
+ dev->ltk && !dev->ltk->central)
+ dev->le_state.initiator = true;
+
return dev->le_state.initiator;
- if (dev->bredr_state.connected)
+ } else if (dev->bredr_state.connected)
return dev->bredr_state.initiator;
return dev->att_io ? true : false;