diff options
Diffstat (limited to 'net/bluetooth/hci_sock.c')
-rw-r--r-- | net/bluetooth/hci_sock.c | 33 |
1 files changed, 28 insertions, 5 deletions
diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c index 80d25c150a65..115f149362ba 100644 --- a/net/bluetooth/hci_sock.c +++ b/net/bluetooth/hci_sock.c | |||
@@ -35,13 +35,32 @@ static atomic_t monitor_promisc = ATOMIC_INIT(0); | |||
35 | 35 | ||
36 | /* ----- HCI socket interface ----- */ | 36 | /* ----- HCI socket interface ----- */ |
37 | 37 | ||
38 | /* Socket info */ | ||
39 | #define hci_pi(sk) ((struct hci_pinfo *) sk) | ||
40 | |||
41 | struct hci_pinfo { | ||
42 | struct bt_sock bt; | ||
43 | struct hci_dev *hdev; | ||
44 | struct hci_filter filter; | ||
45 | __u32 cmsg_mask; | ||
46 | unsigned short channel; | ||
47 | }; | ||
48 | |||
38 | static inline int hci_test_bit(int nr, void *addr) | 49 | static inline int hci_test_bit(int nr, void *addr) |
39 | { | 50 | { |
40 | return *((__u32 *) addr + (nr >> 5)) & ((__u32) 1 << (nr & 31)); | 51 | return *((__u32 *) addr + (nr >> 5)) & ((__u32) 1 << (nr & 31)); |
41 | } | 52 | } |
42 | 53 | ||
43 | /* Security filter */ | 54 | /* Security filter */ |
44 | static struct hci_sec_filter hci_sec_filter = { | 55 | #define HCI_SFLT_MAX_OGF 5 |
56 | |||
57 | struct hci_sec_filter { | ||
58 | __u32 type_mask; | ||
59 | __u32 event_mask[2]; | ||
60 | __u32 ocf_mask[HCI_SFLT_MAX_OGF + 1][4]; | ||
61 | }; | ||
62 | |||
63 | static const struct hci_sec_filter hci_sec_filter = { | ||
45 | /* Packet types */ | 64 | /* Packet types */ |
46 | 0x10, | 65 | 0x10, |
47 | /* Events */ | 66 | /* Events */ |
@@ -481,7 +500,7 @@ static int hci_sock_blacklist_add(struct hci_dev *hdev, void __user *arg) | |||
481 | 500 | ||
482 | hci_dev_lock(hdev); | 501 | hci_dev_lock(hdev); |
483 | 502 | ||
484 | err = hci_blacklist_add(hdev, &bdaddr, BDADDR_BREDR); | 503 | err = hci_bdaddr_list_add(&hdev->blacklist, &bdaddr, BDADDR_BREDR); |
485 | 504 | ||
486 | hci_dev_unlock(hdev); | 505 | hci_dev_unlock(hdev); |
487 | 506 | ||
@@ -498,7 +517,7 @@ static int hci_sock_blacklist_del(struct hci_dev *hdev, void __user *arg) | |||
498 | 517 | ||
499 | hci_dev_lock(hdev); | 518 | hci_dev_lock(hdev); |
500 | 519 | ||
501 | err = hci_blacklist_del(hdev, &bdaddr, BDADDR_BREDR); | 520 | err = hci_bdaddr_list_del(&hdev->blacklist, &bdaddr, BDADDR_BREDR); |
502 | 521 | ||
503 | hci_dev_unlock(hdev); | 522 | hci_dev_unlock(hdev); |
504 | 523 | ||
@@ -517,6 +536,9 @@ static int hci_sock_bound_ioctl(struct sock *sk, unsigned int cmd, | |||
517 | if (test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) | 536 | if (test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) |
518 | return -EBUSY; | 537 | return -EBUSY; |
519 | 538 | ||
539 | if (test_bit(HCI_UNCONFIGURED, &hdev->dev_flags)) | ||
540 | return -EOPNOTSUPP; | ||
541 | |||
520 | if (hdev->dev_type != HCI_BREDR) | 542 | if (hdev->dev_type != HCI_BREDR) |
521 | return -EOPNOTSUPP; | 543 | return -EOPNOTSUPP; |
522 | 544 | ||
@@ -690,7 +712,8 @@ static int hci_sock_bind(struct socket *sock, struct sockaddr *addr, | |||
690 | 712 | ||
691 | if (test_bit(HCI_UP, &hdev->flags) || | 713 | if (test_bit(HCI_UP, &hdev->flags) || |
692 | test_bit(HCI_INIT, &hdev->flags) || | 714 | test_bit(HCI_INIT, &hdev->flags) || |
693 | test_bit(HCI_SETUP, &hdev->dev_flags)) { | 715 | test_bit(HCI_SETUP, &hdev->dev_flags) || |
716 | test_bit(HCI_CONFIG, &hdev->dev_flags)) { | ||
694 | err = -EBUSY; | 717 | err = -EBUSY; |
695 | hci_dev_put(hdev); | 718 | hci_dev_put(hdev); |
696 | goto done; | 719 | goto done; |
@@ -960,7 +983,7 @@ static int hci_sock_sendmsg(struct kiocb *iocb, struct socket *sock, | |||
960 | goto drop; | 983 | goto drop; |
961 | } | 984 | } |
962 | 985 | ||
963 | if (test_bit(HCI_RAW, &hdev->flags) || (ogf == 0x3f)) { | 986 | if (ogf == 0x3f) { |
964 | skb_queue_tail(&hdev->raw_q, skb); | 987 | skb_queue_tail(&hdev->raw_q, skb); |
965 | queue_work(hdev->workqueue, &hdev->tx_work); | 988 | queue_work(hdev->workqueue, &hdev->tx_work); |
966 | } else { | 989 | } else { |