Skip to content

Commit

Permalink
[Bluetooth] Use a more unique bus name for connections
Browse files Browse the repository at this point in the history
When attaching Bluetooth low-level connections to the bus, the bus name
is constructed from the remote address since at that time the connection
handle is not assigned yet. This has worked so far, but also caused a
lot of troubles. It is better to postpone the creation of the sysfs
entry to the time when the connection actually has been established
and then use its connection handle as unique identifier.

This also fixes the case where two different adapters try to connect
to the same remote device.

Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
  • Loading branch information
Marcel Holtmann committed Jul 14, 2008
1 parent 43cbeee commit 7d0db0a
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 9 deletions.
8 changes: 5 additions & 3 deletions net/bluetooth/hci_conn.c
Original file line number Diff line number Diff line change
Expand Up @@ -245,8 +245,6 @@ struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst)
if (hdev->notify)
hdev->notify(hdev, HCI_NOTIFY_CONN_ADD);

hci_conn_add_sysfs(conn);

tasklet_enable(&hdev->tx_task);

return conn;
Expand Down Expand Up @@ -278,12 +276,14 @@ int hci_conn_del(struct hci_conn *conn)
}

tasklet_disable(&hdev->tx_task);

hci_conn_hash_del(hdev, conn);
if (hdev->notify)
hdev->notify(hdev, HCI_NOTIFY_CONN_DEL);

tasklet_enable(&hdev->tx_task);

skb_queue_purge(&conn->data_q);
hci_conn_del_sysfs(conn);

return 0;
}
Expand Down Expand Up @@ -532,6 +532,8 @@ void hci_conn_hash_flush(struct hci_dev *hdev)

c->state = BT_CLOSED;

hci_conn_del_sysfs(c);

hci_proto_disconn_ind(c, 0x16);
hci_conn_del(c);
}
Expand Down
7 changes: 7 additions & 0 deletions net/bluetooth/hci_event.c
Original file line number Diff line number Diff line change
Expand Up @@ -874,6 +874,8 @@ static inline void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *s
} else
conn->state = BT_CONNECTED;

hci_conn_add_sysfs(conn);

if (test_bit(HCI_AUTH, &hdev->flags))
conn->link_mode |= HCI_LM_AUTH;

Expand Down Expand Up @@ -1011,6 +1013,9 @@ static inline void hci_disconn_complete_evt(struct hci_dev *hdev, struct sk_buff
conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
if (conn) {
conn->state = BT_CLOSED;

hci_conn_del_sysfs(conn);

hci_proto_disconn_ind(conn, ev->reason);
hci_conn_del(conn);
}
Expand Down Expand Up @@ -1643,6 +1648,8 @@ static inline void hci_sync_conn_complete_evt(struct hci_dev *hdev, struct sk_bu
if (!ev->status) {
conn->handle = __le16_to_cpu(ev->handle);
conn->state = BT_CONNECTED;

hci_conn_add_sysfs(conn);
} else
conn->state = BT_CLOSED;

Expand Down
8 changes: 2 additions & 6 deletions net/bluetooth/hci_sysfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -311,7 +311,6 @@ static void add_conn(struct work_struct *work)
void hci_conn_add_sysfs(struct hci_conn *conn)
{
struct hci_dev *hdev = conn->hdev;
bdaddr_t *ba = &conn->dst;

BT_DBG("conn %p", conn);

Expand All @@ -320,11 +319,8 @@ void hci_conn_add_sysfs(struct hci_conn *conn)

conn->dev.release = bt_release;

snprintf(conn->dev.bus_id, BUS_ID_SIZE,
"%s%2.2X%2.2X%2.2X%2.2X%2.2X%2.2X",
conn->type == ACL_LINK ? "acl" : "sco",
ba->b[5], ba->b[4], ba->b[3],
ba->b[2], ba->b[1], ba->b[0]);
snprintf(conn->dev.bus_id, BUS_ID_SIZE, "%s:%d",
hdev->name, conn->handle);

dev_set_drvdata(&conn->dev, conn);

Expand Down

0 comments on commit 7d0db0a

Please sign in to comment.