Bluetooth: Send control open and close only when cookie is present
authorMarcel Holtmann <marcel@holtmann.org>
Tue, 30 Aug 2016 03:00:36 +0000 (05:00 +0200)
committerMarcel Holtmann <marcel@holtmann.org>
Mon, 19 Sep 2016 18:19:34 +0000 (20:19 +0200)
Only when the cookie has been assigned, then send the open and close
monitor messages. Also if the socket is bound to a device, then include
the index into the message.

Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
net/bluetooth/hci_sock.c

index a4227c777d168cb60105d67517703600208e8b03..0deca758fd9e73e16342e059376929f91fd1dd47 100644 (file)
@@ -483,6 +483,10 @@ static struct sk_buff *create_monitor_ctrl_open(struct sock *sk)
        u8 ver[3];
        u32 flags;
 
+       /* No message needed when cookie is not present */
+       if (!hci_pi(sk)->cookie)
+               return NULL;
+
        skb = bt_skb_alloc(14 + TASK_COMM_LEN , GFP_ATOMIC);
        if (!skb)
                return NULL;
@@ -501,7 +505,10 @@ static struct sk_buff *create_monitor_ctrl_open(struct sock *sk)
 
        hdr = (void *)skb_push(skb, HCI_MON_HDR_SIZE);
        hdr->opcode = cpu_to_le16(HCI_MON_CTRL_OPEN);
-       hdr->index = cpu_to_le16(HCI_DEV_NONE);
+       if (hci_pi(sk)->hdev)
+               hdr->index = cpu_to_le16(hci_pi(sk)->hdev->id);
+       else
+               hdr->index = cpu_to_le16(HCI_DEV_NONE);
        hdr->len = cpu_to_le16(skb->len - HCI_MON_HDR_SIZE);
 
        return skb;
@@ -512,6 +519,10 @@ static struct sk_buff *create_monitor_ctrl_close(struct sock *sk)
        struct hci_mon_hdr *hdr;
        struct sk_buff *skb;
 
+       /* No message needed when cookie is not present */
+       if (!hci_pi(sk)->cookie)
+               return NULL;
+
        skb = bt_skb_alloc(4, GFP_ATOMIC);
        if (!skb)
                return NULL;
@@ -522,7 +533,10 @@ static struct sk_buff *create_monitor_ctrl_close(struct sock *sk)
 
        hdr = (void *)skb_push(skb, HCI_MON_HDR_SIZE);
        hdr->opcode = cpu_to_le16(HCI_MON_CTRL_CLOSE);
-       hdr->index = cpu_to_le16(HCI_DEV_NONE);
+       if (hci_pi(sk)->hdev)
+               hdr->index = cpu_to_le16(hci_pi(sk)->hdev->id);
+       else
+               hdr->index = cpu_to_le16(HCI_DEV_NONE);
        hdr->len = cpu_to_le16(skb->len - HCI_MON_HDR_SIZE);
 
        return skb;