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);  /* ----- 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 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 */ @@ -481,7 +500,7 @@ static int hci_sock_blacklist_add(struct hci_dev *hdev, void __user *arg)  	hci_dev_lock(hdev); -	err = hci_blacklist_add(hdev, &bdaddr, BDADDR_BREDR); +	err = hci_bdaddr_list_add(&hdev->blacklist, &bdaddr, BDADDR_BREDR);  	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); -	err = hci_blacklist_del(hdev, &bdaddr, BDADDR_BREDR); +	err = hci_bdaddr_list_del(&hdev->blacklist, &bdaddr, BDADDR_BREDR);  	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_UNCONFIGURED, &hdev->dev_flags)) +		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) || -		    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; @@ -960,7 +983,7 @@ static int hci_sock_sendmsg(struct kiocb *iocb, struct socket *sock,  			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 {  |