|
@@ -2950,11 +2950,30 @@ create_chan:
|
|
|
|
|
|
l2cap_chan_set_defaults(chan);
|
|
|
|
|
|
- bacpy(&chan->src, &hdev->bdaddr);
|
|
|
- if (cid == L2CAP_CID_SMP)
|
|
|
- chan->src_type = BDADDR_LE_PUBLIC;
|
|
|
- else
|
|
|
+ if (cid == L2CAP_CID_SMP) {
|
|
|
+ /* If usage of static address is forced or if the devices
|
|
|
+ * does not have a public address, then listen on the static
|
|
|
+ * address.
|
|
|
+ *
|
|
|
+ * In case BR/EDR has been disabled on a dual-mode controller
|
|
|
+ * and a static address has been configued, then listen on
|
|
|
+ * the static address instead.
|
|
|
+ */
|
|
|
+ if (test_bit(HCI_FORCE_STATIC_ADDR, &hdev->dbg_flags) ||
|
|
|
+ !bacmp(&hdev->bdaddr, BDADDR_ANY) ||
|
|
|
+ (!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags) &&
|
|
|
+ bacmp(&hdev->static_addr, BDADDR_ANY))) {
|
|
|
+ bacpy(&chan->src, &hdev->static_addr);
|
|
|
+ chan->src_type = BDADDR_LE_RANDOM;
|
|
|
+ } else {
|
|
|
+ bacpy(&chan->src, &hdev->bdaddr);
|
|
|
+ chan->src_type = BDADDR_LE_PUBLIC;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ bacpy(&chan->src, &hdev->bdaddr);
|
|
|
chan->src_type = BDADDR_BREDR;
|
|
|
+ }
|
|
|
+
|
|
|
chan->state = BT_LISTEN;
|
|
|
chan->mode = L2CAP_MODE_BASIC;
|
|
|
chan->imtu = L2CAP_DEFAULT_MTU;
|