Bluetooth: Fix LE SMP channel source address and source address type
authorMarcel Holtmann <marcel@holtmann.org>
Wed, 14 Jan 2015 23:43:09 +0000 (15:43 -0800)
committerJohan Hedberg <johan.hedberg@intel.com>
Thu, 15 Jan 2015 10:54:30 +0000 (12:54 +0200)
The source address and source address type of the LE SMP channel can
either be the public address of the controller or the static random
address configured by the host.

Right now the public address is used for the LE SMP channel and
obviously that is not correct if the controller operates with the
configured static random address.

Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
net/bluetooth/smp.c

index 04e49f8f09826346f2b37be8d5044f329310ed93..3e4de935f667ae3228f1d54a686498bd5623ac4c 100644 (file)
@@ -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;