Commit 6c566dd5 authored by Marcel Holtmann's avatar Marcel Holtmann Committed by Johan Hedberg

Bluetooth: Send index information updates to monitor channel

The Bluetooth public device address might change during controller setup
and it makes it a lot simpler for monitoring tools if they just get told
what the new address is. In addition include the manufacturer / company
information of the controller. That allows for easy vendor specific HCI
command and event handling.
Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
Signed-off-by: default avatarJohan Hedberg <johan.hedberg@intel.com>
parent 9bc63ca0
...@@ -41,6 +41,7 @@ struct hci_mon_hdr { ...@@ -41,6 +41,7 @@ struct hci_mon_hdr {
#define HCI_MON_SCO_RX_PKT 7 #define HCI_MON_SCO_RX_PKT 7
#define HCI_MON_OPEN_INDEX 8 #define HCI_MON_OPEN_INDEX 8
#define HCI_MON_CLOSE_INDEX 9 #define HCI_MON_CLOSE_INDEX 9
#define HCI_MON_INDEX_INFO 10
struct hci_mon_new_index { struct hci_mon_new_index {
__u8 type; __u8 type;
...@@ -50,4 +51,10 @@ struct hci_mon_new_index { ...@@ -50,4 +51,10 @@ struct hci_mon_new_index {
} __packed; } __packed;
#define HCI_MON_NEW_INDEX_SIZE 16 #define HCI_MON_NEW_INDEX_SIZE 16
struct hci_mon_index_info {
bdaddr_t bdaddr;
__le16 manufacturer;
} __packed;
#define HCI_MON_INDEX_INFO_SIZE 8
#endif /* __HCI_MON_H */ #endif /* __HCI_MON_H */
...@@ -303,6 +303,7 @@ static struct sk_buff *create_monitor_event(struct hci_dev *hdev, int event) ...@@ -303,6 +303,7 @@ static struct sk_buff *create_monitor_event(struct hci_dev *hdev, int event)
{ {
struct hci_mon_hdr *hdr; struct hci_mon_hdr *hdr;
struct hci_mon_new_index *ni; struct hci_mon_new_index *ni;
struct hci_mon_index_info *ii;
struct sk_buff *skb; struct sk_buff *skb;
__le16 opcode; __le16 opcode;
...@@ -312,7 +313,7 @@ static struct sk_buff *create_monitor_event(struct hci_dev *hdev, int event) ...@@ -312,7 +313,7 @@ static struct sk_buff *create_monitor_event(struct hci_dev *hdev, int event)
if (!skb) if (!skb)
return NULL; return NULL;
ni = (void *) skb_put(skb, HCI_MON_NEW_INDEX_SIZE); ni = (void *)skb_put(skb, HCI_MON_NEW_INDEX_SIZE);
ni->type = hdev->dev_type; ni->type = hdev->dev_type;
ni->bus = hdev->bus; ni->bus = hdev->bus;
bacpy(&ni->bdaddr, &hdev->bdaddr); bacpy(&ni->bdaddr, &hdev->bdaddr);
...@@ -329,6 +330,18 @@ static struct sk_buff *create_monitor_event(struct hci_dev *hdev, int event) ...@@ -329,6 +330,18 @@ static struct sk_buff *create_monitor_event(struct hci_dev *hdev, int event)
opcode = cpu_to_le16(HCI_MON_DEL_INDEX); opcode = cpu_to_le16(HCI_MON_DEL_INDEX);
break; break;
case HCI_DEV_UP:
skb = bt_skb_alloc(HCI_MON_INDEX_INFO_SIZE, GFP_ATOMIC);
if (!skb)
return NULL;
ii = (void *)skb_put(skb, HCI_MON_INDEX_INFO_SIZE);
bacpy(&ii->bdaddr, &hdev->bdaddr);
ii->manufacturer = cpu_to_le16(hdev->manufacturer);
opcode = cpu_to_le16(HCI_MON_INDEX_INFO);
break;
case HCI_DEV_OPEN: case HCI_DEV_OPEN:
skb = bt_skb_alloc(0, GFP_ATOMIC); skb = bt_skb_alloc(0, GFP_ATOMIC);
if (!skb) if (!skb)
...@@ -384,6 +397,16 @@ static void send_monitor_replay(struct sock *sk) ...@@ -384,6 +397,16 @@ static void send_monitor_replay(struct sock *sk)
if (sock_queue_rcv_skb(sk, skb)) if (sock_queue_rcv_skb(sk, skb))
kfree_skb(skb); kfree_skb(skb);
if (!test_bit(HCI_UP, &hdev->flags))
continue;
skb = create_monitor_event(hdev, HCI_DEV_UP);
if (!skb)
continue;
if (sock_queue_rcv_skb(sk, skb))
kfree_skb(skb);
} }
read_unlock(&hci_dev_list_lock); read_unlock(&hci_dev_list_lock);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment