|
@@ -329,6 +329,22 @@ 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_OPEN:
|
|
|
+ skb = bt_skb_alloc(0, GFP_ATOMIC);
|
|
|
+ if (!skb)
|
|
|
+ return NULL;
|
|
|
+
|
|
|
+ opcode = cpu_to_le16(HCI_MON_OPEN_INDEX);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case HCI_DEV_CLOSE:
|
|
|
+ skb = bt_skb_alloc(0, GFP_ATOMIC);
|
|
|
+ if (!skb)
|
|
|
+ return NULL;
|
|
|
+
|
|
|
+ opcode = cpu_to_le16(HCI_MON_CLOSE_INDEX);
|
|
|
+ break;
|
|
|
+
|
|
|
default:
|
|
|
return NULL;
|
|
|
}
|
|
@@ -358,6 +374,16 @@ static void send_monitor_replay(struct sock *sk)
|
|
|
|
|
|
if (sock_queue_rcv_skb(sk, skb))
|
|
|
kfree_skb(skb);
|
|
|
+
|
|
|
+ if (!test_bit(HCI_RUNNING, &hdev->flags))
|
|
|
+ continue;
|
|
|
+
|
|
|
+ skb = create_monitor_event(hdev, HCI_DEV_OPEN);
|
|
|
+ if (!skb)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ if (sock_queue_rcv_skb(sk, skb))
|
|
|
+ kfree_skb(skb);
|
|
|
}
|
|
|
|
|
|
read_unlock(&hci_dev_list_lock);
|