Skip to content

Commit

Permalink
Bluetooth: Fix LE SMP channel source address and source address type
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Marcel Holtmann authored and Johan Hedberg committed Jan 15, 2015
1 parent 111e4bc commit 157029b
Showing 1 changed file with 23 additions and 4 deletions.
27 changes: 23 additions & 4 deletions net/bluetooth/smp.c
Original file line number Diff line number Diff line change
Expand Up @@ -2950,11 +2950,30 @@ static struct l2cap_chan *smp_add_cid(struct hci_dev *hdev, u16 cid)

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;
Expand Down

0 comments on commit 157029b

Please sign in to comment.