projects
/
firefly-linux-kernel-4.4.55.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge tag 'drm-intel-next-2014-09-01' of git://anongit.freedesktop.org/drm-intel...
[firefly-linux-kernel-4.4.55.git]
/
net
/
bluetooth
/
hci_sock.c
diff --git
a/net/bluetooth/hci_sock.c
b/net/bluetooth/hci_sock.c
index 80d25c150a653b57977c5b56c227908e20f4fa32..115f149362ba84d4b24b0cb217b49de3a5cf03bb 100644
(file)
--- a/
net/bluetooth/hci_sock.c
+++ b/
net/bluetooth/hci_sock.c
@@
-35,13
+35,32
@@
static atomic_t monitor_promisc = ATOMIC_INIT(0);
/* ----- HCI socket interface ----- */
/* ----- HCI socket interface ----- */
+/* Socket info */
+#define hci_pi(sk) ((struct hci_pinfo *) sk)
+
+struct hci_pinfo {
+ struct bt_sock bt;
+ struct hci_dev *hdev;
+ struct hci_filter filter;
+ __u32 cmsg_mask;
+ unsigned short channel;
+};
+
static inline int hci_test_bit(int nr, void *addr)
{
return *((__u32 *) addr + (nr >> 5)) & ((__u32) 1 << (nr & 31));
}
/* Security filter */
static inline int hci_test_bit(int nr, void *addr)
{
return *((__u32 *) addr + (nr >> 5)) & ((__u32) 1 << (nr & 31));
}
/* Security filter */
-static struct hci_sec_filter hci_sec_filter = {
+#define HCI_SFLT_MAX_OGF 5
+
+struct hci_sec_filter {
+ __u32 type_mask;
+ __u32 event_mask[2];
+ __u32 ocf_mask[HCI_SFLT_MAX_OGF + 1][4];
+};
+
+static const struct hci_sec_filter hci_sec_filter = {
/* Packet types */
0x10,
/* Events */
/* Packet types */
0x10,
/* Events */
@@
-481,7
+500,7
@@
static int hci_sock_blacklist_add(struct hci_dev *hdev, void __user *arg)
hci_dev_lock(hdev);
hci_dev_lock(hdev);
- err = hci_b
lacklist_add(hdev
, &bdaddr, BDADDR_BREDR);
+ err = hci_b
daddr_list_add(&hdev->blacklist
, &bdaddr, BDADDR_BREDR);
hci_dev_unlock(hdev);
hci_dev_unlock(hdev);
@@
-498,7
+517,7
@@
static int hci_sock_blacklist_del(struct hci_dev *hdev, void __user *arg)
hci_dev_lock(hdev);
hci_dev_lock(hdev);
- err = hci_b
lacklist_del(hdev
, &bdaddr, BDADDR_BREDR);
+ err = hci_b
daddr_list_del(&hdev->blacklist
, &bdaddr, BDADDR_BREDR);
hci_dev_unlock(hdev);
hci_dev_unlock(hdev);
@@
-517,6
+536,9
@@
static int hci_sock_bound_ioctl(struct sock *sk, unsigned int cmd,
if (test_bit(HCI_USER_CHANNEL, &hdev->dev_flags))
return -EBUSY;
if (test_bit(HCI_USER_CHANNEL, &hdev->dev_flags))
return -EBUSY;
+ if (test_bit(HCI_UNCONFIGURED, &hdev->dev_flags))
+ return -EOPNOTSUPP;
+
if (hdev->dev_type != HCI_BREDR)
return -EOPNOTSUPP;
if (hdev->dev_type != HCI_BREDR)
return -EOPNOTSUPP;
@@
-690,7
+712,8
@@
static int hci_sock_bind(struct socket *sock, struct sockaddr *addr,
if (test_bit(HCI_UP, &hdev->flags) ||
test_bit(HCI_INIT, &hdev->flags) ||
if (test_bit(HCI_UP, &hdev->flags) ||
test_bit(HCI_INIT, &hdev->flags) ||
- test_bit(HCI_SETUP, &hdev->dev_flags)) {
+ test_bit(HCI_SETUP, &hdev->dev_flags) ||
+ test_bit(HCI_CONFIG, &hdev->dev_flags)) {
err = -EBUSY;
hci_dev_put(hdev);
goto done;
err = -EBUSY;
hci_dev_put(hdev);
goto done;
@@
-960,7
+983,7
@@
static int hci_sock_sendmsg(struct kiocb *iocb, struct socket *sock,
goto drop;
}
goto drop;
}
- if (
test_bit(HCI_RAW, &hdev->flags) || (ogf == 0x3f)
) {
+ if (
ogf == 0x3f
) {
skb_queue_tail(&hdev->raw_q, skb);
queue_work(hdev->workqueue, &hdev->tx_work);
} else {
skb_queue_tail(&hdev->raw_q, skb);
queue_work(hdev->workqueue, &hdev->tx_work);
} else {