mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-09 14:43:16 +00:00
Bluetooth: Fix updating Identity Address in L2CAP channels
When we receive a remote identity address during SMP key distribution we should ensure that any associated L2CAP channel instances get their address information correspondingly updated (so that e.g. doing getpeername on associated sockets returns the correct address). This patch adds a new L2CAP core function l2cap_conn_update_id_addr() which is used to iterate through all L2CAP channels associated with a connection and update their address information. Signed-off-by: Johan Hedberg <johan.hedberg@intel.com> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
This commit is contained in:
parent
68d6f6ded5
commit
387a33e304
@ -881,6 +881,7 @@ int l2cap_ertm_init(struct l2cap_chan *chan);
|
||||
void l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan);
|
||||
void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan);
|
||||
void l2cap_chan_del(struct l2cap_chan *chan, int err);
|
||||
void l2cap_conn_update_id_addr(struct hci_conn *hcon);
|
||||
void l2cap_send_conn_req(struct l2cap_chan *chan);
|
||||
void l2cap_move_start(struct l2cap_chan *chan);
|
||||
void l2cap_logical_cfm(struct l2cap_chan *chan, struct hci_chan *hchan,
|
||||
|
@ -609,6 +609,23 @@ void l2cap_chan_del(struct l2cap_chan *chan, int err)
|
||||
return;
|
||||
}
|
||||
|
||||
void l2cap_conn_update_id_addr(struct hci_conn *hcon)
|
||||
{
|
||||
struct l2cap_conn *conn = hcon->l2cap_data;
|
||||
struct l2cap_chan *chan;
|
||||
|
||||
mutex_lock(&conn->chan_lock);
|
||||
|
||||
list_for_each_entry(chan, &conn->chan_l, list) {
|
||||
l2cap_chan_lock(chan);
|
||||
bacpy(&chan->dst, &hcon->dst);
|
||||
chan->dst_type = bdaddr_type(hcon, hcon->dst_type);
|
||||
l2cap_chan_unlock(chan);
|
||||
}
|
||||
|
||||
mutex_unlock(&conn->chan_lock);
|
||||
}
|
||||
|
||||
static void l2cap_chan_le_connect_reject(struct l2cap_chan *chan)
|
||||
{
|
||||
struct l2cap_conn *conn = chan->conn;
|
||||
|
@ -991,6 +991,8 @@ static int smp_cmd_ident_addr_info(struct l2cap_conn *conn,
|
||||
bacpy(&hcon->dst, &smp->id_addr);
|
||||
hcon->dst_type = smp->id_addr_type;
|
||||
|
||||
l2cap_conn_update_id_addr(hcon);
|
||||
|
||||
smp_distribute_keys(conn, 1);
|
||||
|
||||
return 0;
|
||||
|
Loading…
x
Reference in New Issue
Block a user