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: Marcel Holtmann <marcel@holtmann.org> Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
This commit is contained in:
parent
9bc63ca090
commit
6c566dd5a1
@ -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 {
|
|||||||
} __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)
|
|||||||
{
|
{
|
||||||
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;
|
||||||
|
|
||||||
@ -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)
|
|||||||
|
|
||||||
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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user