|
|
@@ -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);
|