device: Fix not setting initiator flag when auto-connecting
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Wed, 29 Mar 2023 20:27:05 +0000 (13:27 -0700)
committerAyush Garg <ayush.garg@samsung.com>
Fri, 5 Jan 2024 10:41:34 +0000 (16:11 +0530)
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.

src/device.c

index e81d457..0222bbd 100644 (file)
@@ -474,9 +474,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;