Bluetooth: Send index information updates to monitor channel
authorMarcel Holtmann <marcel@holtmann.org>
Wed, 7 Oct 2015 13:32:13 +0000 (15:32 +0200)
committerJohan Hedberg <johan.hedberg@intel.com>
Thu, 8 Oct 2015 06:48:34 +0000 (09:48 +0300)
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: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
include/net/bluetooth/hci_mon.h
net/bluetooth/hci_sock.c

index 37e4283d1d6841256247e29627f28ebf0c1bf012..842bb754a0789c94057089e45956f491d3412906 100644 (file)
@@ -41,6 +41,7 @@ struct hci_mon_hdr {
 #define HCI_MON_SCO_RX_PKT     7
 #define HCI_MON_OPEN_INDEX     8
 #define HCI_MON_CLOSE_INDEX    9
+#define HCI_MON_INDEX_INFO     10
 
 struct hci_mon_new_index {
        __u8            type;
@@ -50,4 +51,10 @@ struct hci_mon_new_index {
 } __packed;
 #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 */
index 64ebe84989d1cea6b72bf252efd0f0637b5b7b7a..9bf30db89d894456c0eb7a3b4199d98ce5ce0cf2 100644 (file)
@@ -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_new_index *ni;
+       struct hci_mon_index_info *ii;
        struct sk_buff *skb;
        __le16 opcode;
 
@@ -312,7 +313,7 @@ static struct sk_buff *create_monitor_event(struct hci_dev *hdev, int event)
                if (!skb)
                        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->bus = hdev->bus;
                bacpy(&ni->bdaddr, &hdev->bdaddr);
@@ -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);
                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:
                skb = bt_skb_alloc(0, GFP_ATOMIC);
                if (!skb)
@@ -384,6 +397,16 @@ static void send_monitor_replay(struct sock *sk)
 
                if (sock_queue_rcv_skb(sk, 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);