Hi Johan, > 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@xxxxxxxxx> > --- > include/net/bluetooth/l2cap.h | 1 + > net/bluetooth/l2cap_core.c | 17 +++++++++++++++++ > net/bluetooth/smp.c | 2 ++ > 3 files changed, 20 insertions(+) > > diff --git a/include/net/bluetooth/l2cap.h b/include/net/bluetooth/l2cap.h > index 13bec91785f4..4abdcb220e3a 100644 > --- a/include/net/bluetooth/l2cap.h > +++ b/include/net/bluetooth/l2cap.h > @@ -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, > diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c > index 6e6b3a9c8e6d..d25fefcc0bb5 100644 > --- a/net/bluetooth/l2cap_core.c > +++ b/net/bluetooth/l2cap_core.c > @@ -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 = hcon->dst_type; this should use bdaddr_type(conn->hcon, conn->hcon->dst_type); Remember that the L2CAP address type matches the mgmt one. While on hci_dev and hci_conn level we have the one from HCI specification. > + 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; > diff --git a/net/bluetooth/smp.c b/net/bluetooth/smp.c > index 4d14ccc7b330..faf04bd4263a 100644 > --- a/net/bluetooth/smp.c > +++ b/net/bluetooth/smp.c > @@ -976,6 +976,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; Regards Marcel -- To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html